]> git.cworth.org Git - empires-server/commitdiff
game: Index players directly by session ID
authorCarl Worth <cworth@cworth.org>
Fri, 5 Jun 2020 13:57:04 +0000 (06:57 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 5 Jun 2020 14:46:37 +0000 (07:46 -0700)
Previously we were just storing the players in an unordered array, and
doing an O(n) walk through the array to find a player with a session
ID that matched the ID of interest.

Instead, we now index directly with the session ID which is already
guaranteed yo be unique and is convenient in JavaScript where we can
use the session ID as a property name, and even use a convenient
subscript syntax for that.

With this change we don't even need to store the session_id property
on the player since it is now not used at all.

game.js

diff --git a/game.js b/game.js
index de77148aa3ed58888930d4b872da8e0c92a28644..8a0e0834c0a48587e24e6ff3d4589224b87a2a3b 100644 (file)
--- a/game.js
+++ b/game.js
@@ -1,9 +1,8 @@
 /* A single player can have multiple connections, (think, multiple
  * browser windows with a common session cookie). */
 class Player {
-  constructor(id, session_id, name, connection) {
+  constructor(id, name, connection) {
     this.id = id;
-    this.session_id = session_id;
     this.name = name;
     this.connections = [connection];
     this.team = "";
@@ -73,38 +72,27 @@ class Game {
 
   add_player(session, connection) {
     /* First see if we already have a player object for this session. */
-    const existing_index = this.players.findIndex(
-      player => player.session_id === session.id);
-    if (existing_index >= 0) {
-      const player = this.players[existing_index];
-      player.add_connection(connection);
-      return player;
+    const existing = this.players[session.id];
+    if (existing) {
+      existing.add_connection(connection);
+      return existing;
     }
 
     /* No existing player. Add a new one. */
     const id = this.next_player_id;
-    const player = new Player(id, session.id, session.nickname, connection);
+    const player = new Player(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.push(player);
+    this.players[session.id] = player;
     this.next_player_id++;
 
     return player;
   }
 
-  find_player(session) {
-    const existing_index = this.players.findIndex(
-      player => player.session_id === session.id);
-    if (existing_index >= 0)
-      return this.players[existing_index];
-
-    return null;
-  }
-
   /* Drop a connection object from a player, and if it's the last one,
    * then drop that player from the game's list of players. */
   remove_player_connection(player, connection) {
@@ -118,7 +106,8 @@ class Game {
 
   /* Send a string to all players */
   broadcast_string(str) {
-    this.players.forEach(player => player.send(str + '\n'));
+    for (let [session_id, player] of Object.entries(this.players))
+      player.send(str + '\n');
   }
 
   /* Send an event to all players.
@@ -166,7 +155,7 @@ class Game {
   }
 
   handle_player(request, response) {
-    const player = this.find_player(request.session);
+    const player = this.players[request.session.id];
     const name = request.body.name;
     const team = request.body.team;
     var updated = false;