@runox-game/game-engine
Version:
RunoX game engine
184 lines (183 loc) • 11.3 kB
JavaScript
"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;