From: Carl Worth Date: Fri, 5 Jun 2020 23:55:55 +0000 (-0700) Subject: Switch team property from being a string to being an object X-Git-Url: https://git.cworth.org/git?p=empires-server;a=commitdiff_plain;h=c381788fa303d9ca392fc4b7b25c4d55344717da Switch team property from being a string to being an object 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). --- diff --git a/game.js b/game.js index 34a0d13..b43a75c 100644 --- 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) diff --git a/tictactoe.js b/tictactoe.js index 9856479..476821e 100644 --- a/tictactoe.js +++ b/tictactoe.js @@ -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 }; }