UNPKG

@runox-game/game-engine

Version:
184 lines (183 loc) 11.3 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.PlayCardCommand = void 0; var game_command_1 = require("./game.command"); var values_model_1 = require("../models/values.model"); var command_result_1 = require("./command-result"); var after_play_card_event_1 = require("../events/after-play-card.event"); var card_model_1 = require("../models/card.model"); var game_end_event_1 = require("../events/game-end.event"); var after_take_cards_event_1 = require("../events/after-take-cards.event"); var reverse_event_1 = require("../events/reverse.event"); var skip_event_1 = require("../events/skip.event"); var log_levels_enum_1 = require("../log/log-levels.enum"); var game_direction_model_1 = require("../models/game-direction.model"); /** * Class that allows a player to play a card from his hand */ var PlayCardCommand = /** @class */ (function (_super) { __extends(PlayCardCommand, _super); /** * Class that allows a player to play a card from his hand * * @param playerId - identifier of the player who wants to play a card * @param card - card to be played * @param toPlayerId - identifier of the player who will receive the card */ function PlayCardCommand(playerId, card, toPlayerId) { var _this = _super.call(this) || this; _this.playerId = playerId; _this.card = card instanceof card_model_1.Card ? card : new card_model_1.Card(card.value, card.color, card.id); _this.toPlayerId = toPlayerId; return _this; } PlayCardCommand.prototype.execute = function (state) { var _a, _b, _c, _d, _e, _f, _g, _h; (_a = state.turn.player) === null || _a === void 0 ? void 0 : _a.hand.removeCard(this.card); state.stack.addCard(this.card); state.log(" " + ((_b = state.turn.player) === null || _b === void 0 ? void 0 : _b.name) + " juega la carta " + this.card, log_levels_enum_1.LogLevel.USER); if (((_c = state.turn.player) === null || _c === void 0 ? void 0 : _c.hand.cards.length) === 0 && state.unoYellers[(_d = state.turn.player) === null || _d === void 0 ? void 0 : _d.id]) { var score = state.playersGroup.players .filter(function (player) { var _a; return player.id !== ((_a = state.turn.player) === null || _a === void 0 ? void 0 : _a.id); }) .reduce(function (score, player) { score += player.hand.score; return score; }, 0); state.setWinner(state.turn.player, score); state.log(" " + state.turn.player + " es el ganador con score:" + score, log_levels_enum_1.LogLevel.ALL); this.events.dispatchGameEnd(new game_end_event_1.GameEndEvent(state.turn.player, score)); } this.checkForPlayersWhoShouldHaveYelledUno(state); if (((_e = state.stack.cardOnTop) === null || _e === void 0 ? void 0 : _e.value) === values_model_1.Value.PLUS_FOUR) { state.log(" La carta jugada es un +4", log_levels_enum_1.LogLevel.USER); if (!state.gameModes.dedicatePlusFour) { state.log(" Es importante el orden en que se aplica los efectos.", log_levels_enum_1.LogLevel.ALL); state.log(" Primero se aplica +4 y luego saltea turno.", log_levels_enum_1.LogLevel.ALL); // Es importante el orden en que se aplica los efectos. // Primero se aplica +4 y luego saltea turno. var newCards = state.giveCards(4, state.nextPlayerToPlay); state.log(" Es un +4, " + state.nextPlayerToPlay + " toma las cartas " + newCards.map(function (x) { return x.sprite; }), log_levels_enum_1.LogLevel.ALL); state.log(" Es un +4, " + state.nextPlayerToPlay + " toma 4 cartas", log_levels_enum_1.LogLevel.USER); this.events.dispatchAfterTakeCards(new after_take_cards_event_1.AfterTakeCardsEvent(newCards, state.nextPlayerToPlay)); state.turn.setPlayerTurn(state.nextPlayerToPlay); } else { state.log(" Se est\u00E1 jugando con +4s", log_levels_enum_1.LogLevel.USER); var toPlayer = state.playersGroup.getPlayerById(this.toPlayerId); var newCards = state.giveCards(4, toPlayer); state.log(" Es un +4, " + toPlayer + " toma 4 cartas", log_levels_enum_1.LogLevel.USER); this.events.dispatchAfterTakeCards(new after_take_cards_event_1.AfterTakeCardsEvent(newCards, toPlayer)); } } if (((_f = state.stack.cardOnTop) === null || _f === void 0 ? void 0 : _f.value) === values_model_1.Value.PLUS_TWO) { state.log(" La carta jugada es un +2", log_levels_enum_1.LogLevel.USER); state.cardsToGive += 2; var nextPlayerHasPlusTwo = state.nextPlayerToPlay.hand.hasCard(values_model_1.Value.PLUS_TWO); if (!nextPlayerHasPlusTwo) { state.log(" El siguiente jugador no tiene +2", log_levels_enum_1.LogLevel.ALL); state.log(" " + state.nextPlayerToPlay + " debe tomar 2 cartas", log_levels_enum_1.LogLevel.USER); var newCards = state.giveCards(state.cardsToGive, state.nextPlayerToPlay); this.events.dispatchAfterTakeCards(new after_take_cards_event_1.AfterTakeCardsEvent(newCards, state.nextPlayerToPlay)); state.cardsToGive = 0; state.turn.setPlayerTurn(state.nextPlayerToPlay); } } if (((_g = state.stack.cardOnTop) === null || _g === void 0 ? void 0 : _g.value) === values_model_1.Value.SKIP) { state.log(" La carta jugada es un Salto", log_levels_enum_1.LogLevel.USER); state.log(" Se saltea a " + state.nextPlayerToPlay, log_levels_enum_1.LogLevel.USER); state.turn.setPlayerTurn(state.nextPlayerToPlay); this.events.dispatchSkip(new skip_event_1.SkipEvent(state.nextPlayerToPlay)); } if (((_h = state.stack.cardOnTop) === null || _h === void 0 ? void 0 : _h.value) === values_model_1.Value.REVERSE) { state.log(" La carta jugada inverte el sentido de la vuelta", log_levels_enum_1.LogLevel.USER); state.log(" Cambia de direcci\u00F3n a " + (state.gameDirection == game_direction_model_1.GameDirection.CLOCKWISE ? game_direction_model_1.GameDirection.COUNTER_CLOCKWISE : game_direction_model_1.GameDirection.CLOCKWISE), log_levels_enum_1.LogLevel.ALL); state.changeDirection(); if (state.playersGroup.players.length === 2) { state.log(" si son dos jugadores entonces funciona como SKIP", log_levels_enum_1.LogLevel.ALL); // si son dos jugadores entonces funciona como SKIP state.log(" Se saltea a " + state.nextPlayerToPlay, log_levels_enum_1.LogLevel.USER); state.turn.setPlayerTurn(state.nextPlayerToPlay); } this.events.dispatchReverse(new reverse_event_1.ReverseEvent(state.nextPlayerToPlay)); } var player = state.playersGroup.getPlayerById(this.playerId); this.events.dispatchAfterPlayCard(new after_play_card_event_1.AfterPlayCardEvent(this.card, player)); if (this.card.isSpecialCard()) { this.events.dispatchSpecialCard(this.card); } else { this.events.dispatchCardPlayed(this.card); } }; PlayCardCommand.prototype.validate = function (state) { var _this = this; var _a, _b, _c, _d; if (!!state.winner) { return new command_result_1.CommandValidation(false, 'Runox ya terminó'); } var player = state.playersGroup.getPlayerById(this.playerId); if (!player) { return new command_result_1.CommandValidation(false, 'No ha sido posible encontrar al jugador en la partida'); } if (!state.turn.player) { return new command_result_1.CommandValidation(false, 'No hay un turno activo'); } if (player.id !== state.turn.player.id) { return new command_result_1.CommandValidation(false, 'No es el turno del jugador'); } if (!this.card) { return new command_result_1.CommandValidation(false, 'No se ha encontrado la carta de la mano del jugador'); } var playerHasSelectedCard = player.hand.cards.some(function (card) { return card.id === _this.card.id; }); if (!playerHasSelectedCard) { return new command_result_1.CommandValidation(false, 'El jugador no posee la carta seleccionada'); } if ((((_a = this.card) === null || _a === void 0 ? void 0 : _a.value) === values_model_1.Value.WILDCARD || ((_b = this.card) === null || _b === void 0 ? void 0 : _b.value) === values_model_1.Value.PLUS_FOUR) && !this.card.color) { return new command_result_1.CommandValidation(false, 'No se especifico el color de la carta'); } if (((_c = state.stack.cardOnTop) === null || _c === void 0 ? void 0 : _c.value) === values_model_1.Value.PLUS_TWO && this.card.value !== values_model_1.Value.PLUS_TWO && state.cardsToGive > 0) { return new command_result_1.CommandValidation(false, 'La carta que quiere tirar no es +2'); } if (state.stack.cardOnTop && !((_d = this.card) === null || _d === void 0 ? void 0 : _d.isPlayable(state.stack.cardOnTop))) { return new command_result_1.CommandValidation(false, 'La carta que quiere tirar no tiene el mismo color o valor que la del stack'); } if (state.gameModes.dedicatePlusFour && this.card.value === values_model_1.Value.PLUS_FOUR && !this.toPlayerId) { return new command_result_1.CommandValidation(false, 'Debe ingresar el identificador del jugador al que se le dedica el +4'); } if (state.gameModes.dedicatePlusFour && this.card.value === values_model_1.Value.PLUS_FOUR && this.toPlayerId) { var toPlayer = state.playersGroup.getPlayerById(this.toPlayerId); if (!toPlayer) { return new command_result_1.CommandValidation(false, "No se encontro el jugador con id: " + this.toPlayerId); } } return new command_result_1.CommandValidation(true); }; return PlayCardCommand; }(game_command_1.GameCommand)); exports.PlayCardCommand = PlayCardCommand;