+const no_team = { name: "" };
+
/* A single player can have multiple connections, (think, multiple
* browser windows with a common session cookie). */
class Player {
this.session_id = session_id;
this.name = name;
this.connections = [connection];
- this.team = "";
+ this.team = no_team;
}
add_connection(connection) {
return JSON.stringify({
id: this.id,
name: this.name,
- team: this.team
+ team: this.team.name
});
}
}
this.next_player_id = 1;
this.teams = [];
this.state = {
- team_to_play: ""
+ team_to_play: no_team
};
this.first_move = true;
}
/* 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" };
* 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;
/* 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]);
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);
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)
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. */
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 };
}