// Copyright 2019 Campbell Crowley. All rights reserved.
// Author: Campbell Crowley (dev@campbellcrowley.com)
const Day = require('./Day.js');
const Player = require('./Player.js');
/**
* @description The container with current game state within a guild's game.
* @memberof HungryGames
* @inner
*/
class Game {
/**
* @description Create a game with basic game information.
* @param {string} [name] The name of this game.
* @param {HungryGames~Player[]} [includedUsers] Array of user players that
* are included in this game.
* @param {HungryGames~Team[]} [teams] Array of teams that have been formed
* already.
*/
constructor(name, includedUsers, teams) {
/**
* The name of this game.
*
* @public
* @type {string}
* @default 'Hungry Games'
*/
this.name = name || 'Hungry Games';
/**
* Is the game currently in progress.
*
* @public
* @type {boolean}
* @default
*/
this.inProgress = false;
/**
* Array of all users currently in the game.
*
* @public
* @type {HungryGames~Player[]}
* @default
*/
this.includedUsers = includedUsers || [];
/**
* All teams in the game.
*
* @public
* @type {HungryGames~Team[]}
* @default []
*/
this.teams = teams || [];
/**
* Has the game ended.
*
* @public
* @type {boolean}
* @default
*/
this.ended = false;
/**
* Information about the day that was simulated.
*
* @public
* @type {HungryGames~Day}
* @default
*/
this.day = new Day();
/**
* Information about the previous day that was simulated. It is replaced by
* {@link HungryGames~Game} when a new day starts and defaults to before the
* first day.
*
* @public
* @type {?HungryGames~Day}
* @default
*/
this.prevDay = null;
/**
* Information about the next day to be simulated. Usually empty, but this
* data will replace {@link HungryGames~Game} when a new day starts.
*
* @public
* @type {HungryGames~Day}
* @default
*/
this.nextDay = new Day(0);
/**
* The number of players still alive in this game.
*
* @public
* @type {number}
*/
this.numAlive = this.includedUsers.length;
/**
* Is this game currently paused.
*
* @public
* @type {boolean}
* @default
*/
this.isPaused = true;
}
}
/**
* Create a new Game from an object. Similar to a copy constructor.
*
* @public
* @param {object} data Game like object to copy.
* @returns {HungryGames~Game} Created Game object.
*/
Game.from = function(data) {
const game = new Game(data.name, data.includedUsers);
game.inProgress = data.inProgress || false;
game.teams = data.teams || [];
game.ended = data.ended || false;
game.day = Day.from(data.day);
if (data.nextDay) game.nextDay = Day.from(data.nextDay);
if (game.nextDay.num < 0) game.nextDay.num = 0;
if (data.prevDay) game.prevDay = Day.from(data.prevDay);
if (game.day.state === 1) game.day.state = 0;
game.includedUsers = game.includedUsers.map((el) => Player.from(el));
if (!isNaN(data.numAlive)) {
game.numAlive = data.numAlive;
}
game.isPaused = data.isPaused || false;
return game;
};
module.exports = Game;