Projektmanagement-Game/Webservice/Game.js
2021-07-12 13:18:31 +02:00

109 lines
3.1 KiB
JavaScript

const Player = require('./Player');
const Hunter = require('./Hunter');
class Game {
static MAX_PLAYERS = 4;
static MAX_POSITION = 16;
static STATUS = {
SETTING_UP: 0,
ONGOING: 1,
IS_DRAW: 2,
IS_WON: 3
}
constructor() {
this.currentStatus = Game.STATUS.SETTING_UP;
this.players = [];
this.currentPlayerIndex = 0;
this.winnerIndex = 0;
this.round = 0;
this.hunter = new Hunter();
this.playerNames = [];
}
finish_turn() {
this.update_game_status();
if (this.currentStatus !== Game.STATUS.ONGOING) return;
if (!this.players.some(player => player.isAlive === true)) return;
let roundIsOver = false;
do {
this.currentPlayerIndex++;
if (this.currentPlayerIndex >= this.players.length) {
this.currentPlayerIndex = 0;
roundIsOver = true;
}
} while (!this.players[this.currentPlayerIndex].isAlive); // skip dead players
if (roundIsOver) this.#finish_round();
}
#finish_round() {
this.round++;
if (this.players.some(player => player.position >= Game.MAX_POSITION / 2)) {
this.hunter.isAlive = true;
}
if (this.hunter.isAlive) {
this.hunter.move_by(1);
this.hunter.hunt(this.players);
}
this.update_game_status();
}
add_player(name) {
let canAddPlayer = this.players.length < Game.MAX_PLAYERS;
if (canAddPlayer) this.players.push(new Player(name));
return canAddPlayer;
}
remove_player(name) {
let index = this.get_player_index(name);
if (index !== -1) {
this.players.splice(index, 1);
if (this.currentPlayerIndex >= index) this.currentPlayerIndex--;
}
if (this.currentPlayerIndex === index) this.finish_turn(); // if current player leaves: move on to next
}
current_player_is(name) {
if (this.players[this.currentPlayerIndex] === undefined) return false;
return this.players[this.currentPlayerIndex].name === name;
}
get_player_index(name) {
return this.players.findIndex(player => player.name === name);
}
move_player(name, amount) {
let index = this.get_player_index(name);
if (index === -1) return;
this.players[index].move_by(amount);
this.update_game_status();
}
update_game_status() {
if (!this.players.some(player => player.isAlive === true)) this.currentStatus = Game.STATUS.IS_DRAW;
let index = this.players.findIndex(player => player.position >= Game.MAX_POSITION);
if (index !== -1) {
this.currentStatus = Game.STATUS.IS_WON;
this.winnerIndex = index;
}
}
getPlayerNames() {
return this.playerNames;
}
addPlayerName(playerName) {
this.playerNames.push(playerName);
}
removePlayerName(playerName) {
this.playerNames.splice(this.playerNames.indexOf(playerName), 1)
}
}
module.exports = Game;