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.
/* 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, session_id, name, connection) {
+ constructor(id, name, connection) {
- this.session_id = session_id;
this.name = name;
this.connections = [connection];
this.team = "";
this.name = name;
this.connections = [connection];
this.team = "";
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_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;
}
/* 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);
/* 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;
}
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) {
/* 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) {
/* Send a string to all players */
broadcast_string(str) {
/* 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.
}
/* Send an event to all players.
}
handle_player(request, response) {
}
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;
const name = request.body.name;
const team = request.body.team;
var updated = false;