import { Player } from "./player.js"; const WAITING = 0; const PRE_GAME = 1; const PLAYING = 2; export class Game { constructor() { this.us = null; this.players = {}; this.state = WAITING; } isWaiting() { return this.state === WAITING; } isPregame() { return this.state === PRE_GAME; } isPlaying() { return this.state === PLAYING; } incrementState() { this.state += 1; const event = new CustomEvent("gameStateUpdate", { detail: { newState: this.state }, }); document.dispatchEvent(event); } currentPlayer() { return Object.values(this.players).filter((p) => p.isPlaying)[0]; } addPlayer(id, is_us, pubkey) { let is_new = this.players[id] === undefined; if (this.isWaiting()) { this.players[id] = new Player(id, is_us, pubkey); if (is_us) { this.us = this.players[id]; } } if (is_new) { const event = new CustomEvent("addPlayer"); document.dispatchEvent(event); } return is_new; } removePlayer(id) { if (this.players[id] !== undefined) { const event = new CustomEvent("removePlayer"); document.dispatchEvent(event); delete this.players[id]; } } keepAlive(id) { if (id !== this.us.id) { this.players[id].resetTimeout(this); } } setReady(id, ready) { this.players[id].ready = ready; const event = new CustomEvent("updatePlayer"); document.dispatchEvent(event); if (this._allPlayersReady()) { this.incrementState(); } } _allPlayersReady() { for (let player of Object.values(this.players)) { if (!player.ready) { return false; } } return true; } }