X-Git-Url: https://git.cworth.org/git?p=empires-server;a=blobdiff_plain;f=empires.js;h=839f5f8be8dc56460b4c6165d4378d99de56f095;hp=f95bba9f48da600bb68ae46aec66e436ff4fed6b;hb=HEAD;hpb=ea14cbbefb26afd558aff8329d92f1a7b9442bac diff --git a/empires.js b/empires.js index f95bba9..839f5f8 100644 --- a/empires.js +++ b/empires.js @@ -1,11 +1,7 @@ const express = require("express"); const Game = require("./game.js"); -const engine_name = "empires"; - -const router = express.Router(); - -const GameState = { +const GamePhase = { JOIN: 1, REVEAL: 2, CAPTURE: 3, @@ -34,17 +30,14 @@ function shuffle(a) { } class Empires extends Game { - constructor() { - super(engine_name); + constructor(id) { + super(id); this._spectators = []; this.next_spectator_id = 1; this._players = []; this.next_player_id = 1; this.characters_to_reveal = null; - this.state = GameState.JOIN; - - /* Send a comment to every connected client every 15 seconds. */ - setInterval(() => {this.broadcast_string(":");}, 15000); + this.phase = GamePhase.JOIN; } add_spectator(name, session_id) { @@ -72,7 +65,7 @@ class Empires extends Game { this.broadcast_event("spectator-leave", `{"id": ${id}}`); } - add_player(name, character) { + register_player(name, character) { const new_player = {id: this.next_player_id, name: name, character: character, @@ -85,6 +78,8 @@ class Empires extends Game { want. */ const player_data = JSON.stringify((({id, name}) => ({id, name}))(new_player)); this.broadcast_event("player-join", player_data); + + return new_player; } remove_player(id) { @@ -99,15 +94,15 @@ class Empires extends Game { this.characters_to_reveal = null; this.next_player_id = 1; - this.change_state(GameState.JOIN); + this.change_phase(GamePhase.JOIN); this.broadcast_event("spectators", "{}"); this.broadcast_event("players", "{}"); } reveal_next() { - /* Don't try to reveal anything if we aren't in the reveal state. */ - if (this.state != GameState.REVEAL) { + /* Don't try to reveal anything if we aren't in the reveal phase. */ + if (this.phase != GamePhase.REVEAL) { clearInterval(this.reveal_interval); return; } @@ -124,7 +119,7 @@ class Empires extends Game { } reveal() { - this.change_state(GameState.REVEAL); + this.change_phase(GamePhase.REVEAL); if (this.characters_to_reveal === null) { this.characters_to_reveal = []; @@ -141,7 +136,7 @@ class Empires extends Game { } start() { - this.change_state(GameState.CAPTURE); + this.change_phase(GamePhase.CAPTURE); } capture(captor_id, captee_id) { @@ -181,37 +176,44 @@ class Empires extends Game { })); } - get players() { + /* The base class recently acquired Game.players which works like + * Empires.spectators, (and meanwhile the Empires._players + * functionality could perhaps be reworked into + * Game.players[].team). Until we do that rework, lets use + * .registered_players as the getter for the Empires-specific + * ._players property to avoid mixing it up with the distinct + * Game.players property. */ + get registered_players() { return this._players.map(player => ({id: player.id, name: player.name })); } - game_state_event_data(old_state, new_state) { - var old_state_name; - if (old_state) - old_state_name = GameState.properties[old_state].name; + game_phase_event_data(old_phase, new_phase) { + var old_phase_name; + if (old_phase) + old_phase_name = GamePhase.properties[old_phase].name; else - old_state_name = "none"; - const new_state_name = GameState.properties[new_state].name; + old_phase_name = "none"; + const new_phase_name = GamePhase.properties[new_phase].name; - return `{"old_state":"${old_state_name}","new_state":"${new_state_name}"}`; + return `{"old_phase":"${old_phase_name}","new_phase":"${new_phase_name}"}`; } - /* Inform clients about a state change. */ - broadcast_state_change() { - const event_data = this.game_state_event_data(this.old_state, this.state); - this.broadcast_event("game-state", event_data); + /* Inform clients about a phase change. */ + broadcast_phase_change() { + const event_data = this.game_phase_event_data(this.old_phase, this.phase); + this.broadcast_event("game-phase", event_data); } - /* Change game state and broadcast the change to all clients. */ - change_state(state) { + /* Change game phase and broadcast the change to all clients. */ + change_phase(phase) { /* Do nothing if there is no actual change happening. */ - if (state === this.state) + if (phase === this.phase) return; - this.old_state = this.state; - this.state = state; + this.old_phase = this.phase; + this.phase = phase; - this.broadcast_state_change(); + this.broadcast_phase_change(); } handle_events(request, response) { @@ -227,32 +229,28 @@ class Empires extends Game { } if (this._players.length > 0) { - const players_json = JSON.stringify(this.players); + const players_json = JSON.stringify(this.registered_players); const players_data = `event: players\ndata: ${players_json}\n\n`; response.write(players_data); } - /* And we need to inform the client of the current game state. + /* And we need to inform the client of the current game phase. * - * In fact, we need to cycle through each state transition from the + * In fact, we need to cycle through each phase transition from the * beginning so the client can see each. */ - var old_state = null; - for (var state = GameState.JOIN; state <= this.state; state++) { - var event_data = this.game_state_event_data(old_state, state); - response.write("event: game-state\n" + "data: " + event_data + "\n\n"); - old_state = state; + var old_phase = null; + for (var phase = GamePhase.JOIN; phase <= this.phase; phase++) { + var event_data = this.game_phase_event_data(old_phase, phase); + response.write("event: game-phase\n" + "data: " + event_data + "\n\n"); + old_phase = phase; } } } -router.get('/', (request, response) => { - if (! request.session.nickname) - response.render('choose-nickname.html', { game_name: "Empires" }); - else - response.render('empires-game.html'); -}); +Empires.router = express.Router(); +const router = Empires.router; router.post('/spectator', (request, response) => { const game = request.game; @@ -280,8 +278,8 @@ router.post('/register', (request, response) => { if (request.body.name) name = request.body.name; - game.add_player(name, request.body.character); - response.send(); + const player = game.register_player(name, request.body.character); + response.send(JSON.stringify(player.id)); }); router.post('/deregister/:id', (request, response) => { @@ -343,14 +341,12 @@ router.get('/spectators', (request, response) => { router.get('/players', (request, response) => { const game = request.game; - response.send(game.players); + response.send(game.registered_players); }); -router.get('/events', (request, response) => { - const game = request.game; - game.handle_events(request, response); -}); +Empires.meta = { + name: "Empires", + identifier: "empires" +}; -exports.router = router; -exports.name = engine_name; exports.Game = Empires;