prantlf/mau-mau

View on GitHub
src/node/console/ConsolePrompt.js

Summary

Maintainability
A
2 hrs
Test Coverage
import Prompt from '../../engine/game/Prompt';
import Ranks from '../../engine/cards/Ranks';
import Suits from '../../engine/cards/Suits';
import inquirer from 'inquirer';
import i18n from '../../engine/misc/i18n';

class ConsolePrompt extends Prompt {

  chooseCard(player) {
    return chooseCard.call(this, player);
  }

}

function chooseCard(player) {
  return new Promise((resolve, reject) => {
    var playableCards = this.game.rules.pickPlayableCards(player.hand),
        otherCards = player.hand
            .pickCards(function (card) {
              return playableCards.indexOf(card) < 0;
            })
            .map(function (card) {
              return new inquirer.Separator(
                  i18n.translate('Hold $[1]', card));
            }),
        cardChoices = playableCards.map(function (card) {
          return {
            name: i18n.translate('Play $[1]', card),
            value: card
          };
        }),
        topCard = this.game.playingStack.peekAtTopCard(),
        chosenSuit = topCard.rank === Ranks.queen &&
                     this.game.rules.chosenSuit ?
                     i18n.translate(' and chooses $[1]',
                         i18n.translate(this.game.rules.chosenSuit)) :
                     '';
    this.game.activePlayers.forEach(player => {
      console.log('  ' + i18n.translate('$[1] holds $[2] cards',
              player, player.hand.cardCount));
    });
    console.log('  ' + i18n.translate('$[1] is on playing stack', topCard) +
                chosenSuit);
    console.log('  ------------------------------');
    if (playableCards.length && otherCards.length) {
      cardChoices.unshift(new inquirer.Separator());
    }
    inquirer.prompt([{
      name: 'chosenCard',
      type: 'list',
      message: i18n.translate(
          '$[1], choose a card to play or draw a new one', player),
      choices: otherCards.concat(
          cardChoices,
          new inquirer.Separator(), {
            name: i18n.translate('Draw new card'),
            value: null
          })
    }]).then(answer => {
      if (answer.chosenCard) {
        var chosenCard = answer.chosenCard;
        if (chosenCard.rank === Ranks.queen && player.hand.cardCount > 1) {
          chooseSuit.call(this).then(function () {
            resolve(chosenCard);
          });
        } else {
          resolve(chosenCard);
        }
      } else {
        reject();
      }
    });
  });
}

function chooseSuit() {
  return inquirer.prompt([{
    name: 'chosenSuit',
    type: 'list',
    message: i18n.translate('Choose a suit'),
    choices: [{
      name: i18n.translate(Suits.hearts),
      value: Suits.hearts
    }, {
      name: i18n.translate(Suits.bells),
      value: Suits.bells
    }, {
      name: i18n.translate(Suits.acorns),
      value: Suits.acorns
    }, {
      name: i18n.translate(Suits.leaves),
      value: Suits.leaves
    }]
  }]).then(answer => {
    this.game.rules.chosenSuit = answer.chosenSuit;
  });
}

export default ConsolePrompt;