]> git.cworth.org Git - empires-server/commitdiff
Switch team property from being a string to being an object
authorCarl Worth <cworth@cworth.org>
Fri, 5 Jun 2020 23:55:55 +0000 (16:55 -0700)
committerCarl Worth <cworth@cworth.org>
Sat, 6 Jun 2020 00:07:03 +0000 (17:07 -0700)
This should be cleaner as it avoids a bunch of bare string literals
all around the place that happen to match. Now, the player's team
property is a pointer into the game's array of teams. And for the case
when a player is not on a team, the game file maintains a "no_game"
sentinel object (with an empty-string name).

game.js
tictactoe.js

diff --git a/game.js b/game.js
index 34a0d13b4168868a4ed6e55d275c2139b0774dbc..b43a75c42a36fd69212b75a29aa9f140ea153d1f 100644 (file)
--- a/game.js
+++ b/game.js
@@ -1,3 +1,5 @@
+const no_team = { name: "" };
+
 /* A single player can have multiple connections, (think, multiple
  * browser windows with a common session cookie). */
 class Player {
@@ -6,7 +8,7 @@ class Player {
     this.session_id = session_id;
     this.name = name;
     this.connections = [connection];
-    this.team = "";
+    this.team = no_team;
   }
 
   add_connection(connection) {
@@ -34,7 +36,7 @@ class Player {
     return JSON.stringify({
       id: this.id,
       name: this.name,
-      team: this.team
+      team: this.team.name
     });
   }
 }
@@ -48,7 +50,7 @@ class Game {
     this.next_player_id = 1;
     this.teams = [];
     this.state = {
-      team_to_play: ""
+      team_to_play: no_team
     };
     this.first_move = true;
 
@@ -94,7 +96,7 @@ class Game {
       }
 
       /* Cannot move if you are not on a team. */
-      if (player.team === "")
+      if (player.team === no_team)
       {
         return { legal: false,
                  message: "You must be on a team to take a turn" };
@@ -115,7 +117,7 @@ class Game {
    * Return true if assignment made, false otherwise. */
   assign_player_to_team_perhaps(player, team)
   {
-    if (player.team !== "")
+    if (player.team !== no_team)
       return false;
 
     player.team = team;
@@ -138,7 +140,7 @@ class Game {
 
       /* Yes, start at 1 to skip teams[0] which we just assigned. */
       for (let i = 1; i < this.teams.length; i++) {
-        const other = this.players.find(p => p !== player && p.team === "");
+        const other = this.players.find(p => (p !== player) && (p.team === no_team));
         if (!other)
           return;
         this.assign_player_to_team_perhaps(other, this.teams[i]);
@@ -239,7 +241,7 @@ class Game {
   handle_player(request, response) {
     const player = this.players_by_session[request.session.id];
     const name = request.body.name;
-    const team = request.body.team;
+    const team_name = request.body.team;
     var updated = false;
     if (! player) {
       response.sendStatus(404);
@@ -257,12 +259,18 @@ class Game {
       updated = true;
     }
 
-    if (team !== null && (player.team !== team) &&
-        (team === "" || this.teams.includes(team)))
+    if (team_name !== null && (player.team.name !== team_name))
     {
-      player.team = team;
-
-      updated = true;
+      if (team_name === "") {
+        player.team = no_team;
+        updated = true;
+      } else {
+        const index = this.teams.findIndex(t => t.name === team_name);
+        if (index >= 0) {
+          player.team = this.teams[index];
+          updated = true;
+        }
+      }
     }
 
     if (updated)
index 98564799c438e57460c96a1a1feaac243cd11318..476821eec57039d5735fab0b8f4f021f5d8c5cad 100644 (file)
@@ -4,12 +4,20 @@ const Game = require("./game.js");
 class TicTacToe extends Game {
   constructor(id) {
     super(id);
+    this.teams = [
+      {
+        id: 0,
+        name: "X"
+      },
+      {
+        id: 1,
+        name: "O"
+      }];
     this.state = {
       moves: [],
       board: Array(9).fill(""),
-      team_to_play: "X",
+      team_to_play: this.teams[0],
     };
-    this.teams = ["X", "O"];
   }
 
   /* Returns true if move was legal and added, false otherwise. */
@@ -33,10 +41,10 @@ class TicTacToe extends Game {
     state.board[square] = state.team_to_play;
     state.moves.push(square);
 
-    if (state.team_to_play === "X")
-      state.team_to_play = "O";
+    if (state.team_to_play.id === 0)
+      state.team_to_play = this.teams[1];
     else
-      state.team_to_play = "X";
+      state.team_to_play = this.teams[0];
 
     return { legal: true };
   }