]> git.cworth.org Git - empires-server/commitdiff
game: Store players in both an array _and_ a session-indexed object
authorCarl Worth <cworth@cworth.org>
Fri, 5 Jun 2020 23:15:47 +0000 (16:15 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 5 Jun 2020 23:15:47 +0000 (16:15 -0700)
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.

game.js
lmno.js

diff --git a/game.js b/game.js
index 60a22a633ee23e028b0fc94e9ffc9de345d6fe87..72c3c7f16fd1c8fd0b24b96935ad588228cdfbf0 100644 (file)
--- 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 baa96f82a5469d66ccd51916005182e4361e0c74..c254046ecb7ae7054a7a4f0b617acd96f46c936a 100644 (file)
--- 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) {