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.
/* A single player can have multiple connections, (think, multiple
* browser windows with a common session cookie). */
class Player {
/* 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.session_id = session_id;
this.name = name;
this.connections = [connection];
this.team = "";
this.name = name;
this.connections = [connection];
this.team = "";
constructor(id) {
this.id = id;
this.players = [];
constructor(id) {
this.id = id;
this.players = [];
+ this.players_by_session = {};
this.next_player_id = 1;
this.teams = [];
this.state = {
this.next_player_id = 1;
this.teams = [];
this.state = {
add_player(session, connection) {
/* First see if we already have a player object for this session. */
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;
if (existing) {
existing.add_connection(connection);
return existing;
/* No existing player. Add a new one. */
const id = this.next_player_id;
/* 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);
/* 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;
this.next_player_id++;
return player;
if (remaining === 0) {
const player_data = JSON.stringify({ id: player.id });
this.players.filter(p => p !== player);
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) {
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.
}
/* Send an event to all players.
}
handle_player(request, response) {
}
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;
const name = request.body.name;
const team = request.body.team;
var updated = false;
router.post('/move', (request, response) => {
const game = request.game;
const move = request.body.move;
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) {
/* Reject move if there is no player for this session. */
if (! player) {