UNPKG

dotup-ts-node-skills-game

Version:
99 lines (97 loc) 3.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Enumerations_1 = require("../Constants/Enumerations"); class PlayerTurnOrder { constructor(model, turnOrderMode = Enumerations_1.TurnOrderMode.Clockwise) { this.model = model; if (turnOrderMode !== Enumerations_1.TurnOrderMode.ClockwisePlayer) { throw new Error('wrong TurnOrderMode'); } } reset() { this.model.CurrentGameState = Enumerations_1.GameState.None; this.model.CurrentPlayerName = undefined; this.model.CurrentRound = 0; this.model.Players.forEach(player => { player.currentRound = 0; player.score = 0; }); } // cancelGame(): void { // this.model.CurrentGameState = GameState.Completed; // } getCurrentPlayer() { return this.model.Players.find(item => item.name === this.model.CurrentPlayerName); } peekNextPlayer() { const nextIndex = this.getNextClockwiseIndex(); if (this.isGameCompleted()) { return undefined; } else { return this.model.Players[nextIndex]; } } getNextPlayer() { if (this.model.CurrentPlayerName === undefined || this.model.CurrentPlayerName === '') { return this.changePlayer(0); } else { return this.changePlayer(this.getNextClockwiseIndex()); } } addScore(value) { const current = this.getCurrentPlayer(); if (current === undefined) { throw new Error('no current player'); } current.score += value; } isGameCompleted() { if (this.allPassedCurrentRound()) { // All rounds played? if (this.model.CurrentRound >= this.model.RoundsToPlay) { // this.model.CurrentGameState = GameState.Completed; return true; } else { // Next round return false; } } else { return false; } } changePlayer(nextIndex) { // Update game rounds if (this.allPassedCurrentRound()) { // All rounds played? if (this.model.CurrentRound >= this.model.RoundsToPlay) { // this.model.CurrentGameState = GameState.Completed; return undefined; } else { // Next round this.model.CurrentRound += 1; } } // Game is on, return next player const nextPlayer = this.model.Players[nextIndex]; // Update Player nextPlayer.currentRound = this.model.CurrentRound; // Update round this.model.CurrentPlayerName = nextPlayer.name; // this.model.CurrentGameState = GameState.Playing; } allPassedCurrentRound() { return this.model.Players.every(player => player.currentRound === this.model.CurrentRound); } getNextClockwiseIndex() { const arr = this.model.Players.map(i => i.name); const indexOfCurrentPlayer = arr.indexOf(this.model.CurrentPlayerName); return indexOfCurrentPlayer >= arr.length - 1 ? 0 : indexOfCurrentPlayer + 1; } } exports.PlayerTurnOrder = PlayerTurnOrder; //# sourceMappingURL=PlayerTurnOrder.js.map