From: Carl Worth Date: Fri, 5 Jun 2020 23:15:47 +0000 (-0700) Subject: game: Store players in both an array _and_ a session-indexed object X-Git-Url: https://git.cworth.org/git?p=empires-server;a=commitdiff_plain;h=756dc24a56a1da12d01025d7ebdef88ac7ea3471 game: Store players in both an array _and_ a session-indexed object We originally wrote the code storing palyers in an array, and then we changed to using an object (indexed by session ID) for convenience in looking up players by the session ID value. Here, we add the array back so that we can access players either way: 1. Indexing into players_by_session to lookup a player by session ID 2. Iterating over players when we want to access players in order The second usage, (in order), will be convenient for a subsequent commit where we assign teams out to players in the order that they joined the game. --- diff --git a/game.js b/game.js index 60a22a6..72c3c7f 100644 --- a/game.js +++ b/game.js @@ -1,8 +1,9 @@ /* A single player can have multiple connections, (think, multiple * browser windows with a common session cookie). */ class Player { - constructor(id, name, connection) { + constructor(id, session_id, name, connection) { this.id = id; + this.session_id = session_id; this.name = name; this.connections = [connection]; this.team = ""; @@ -43,6 +44,7 @@ class Game { constructor(id) { this.id = id; this.players = []; + this.players_by_session = {}; this.next_player_id = 1; this.teams = []; this.state = { @@ -97,7 +99,7 @@ class Game { add_player(session, connection) { /* First see if we already have a player object for this session. */ - const existing = this.players[session.id]; + const existing = this.players_by_session[session.id]; if (existing) { existing.add_connection(connection); return existing; @@ -105,14 +107,15 @@ class Game { /* No existing player. Add a new one. */ const id = this.next_player_id; - const player = new Player(id, session.nickname, connection); + const player = new Player(id, session.id, session.nickname, connection); /* Broadcast before adding player to list (to avoid announcing the * new player to itself). */ const player_data = JSON.stringify({ id: player.id, name: player.name }); this.broadcast_event("player-enter", player_data); - this.players[session.id] = player; + this.players.push(player); + this.players_by_session[session.id] = player; this.next_player_id++; return player; @@ -125,14 +128,14 @@ class Game { if (remaining === 0) { const player_data = JSON.stringify({ id: player.id }); this.players.filter(p => p !== player); + delete this.players_by_session[player.session_id]; this.broadcast_event("player-exit", player_data); } } /* Send a string to all players */ broadcast_string(str) { - for (let [session_id, player] of Object.entries(this.players)) - player.send(str + '\n'); + this.players.forEach(player => player.send(str + '\n')); } /* Send an event to all players. @@ -180,7 +183,7 @@ class Game { } handle_player(request, response) { - const player = this.players[request.session.id]; + const player = this.players_by_session[request.session.id]; const name = request.body.name; const team = request.body.team; var updated = false; diff --git a/lmno.js b/lmno.js index baa96f8..c254046 100644 --- a/lmno.js +++ b/lmno.js @@ -314,7 +314,7 @@ for (let key in engines) { router.post('/move', (request, response) => { const game = request.game; const move = request.body.move; - const player = game.players[request.session.id]; + const player = game.players_by_session[request.session.id]; /* Reject move if there is no player for this session. */ if (! player) {