/* No existing player. Add a new one. */
const id = this.next_player_id;
- const player = new Player(id, session.id, session.nickname, connection);
+ let nickname = session.nickname;
+ if (nickname === "")
+ nickname = "Guest";
+ const nickname_orig = nickname;
+
+ /* Ensure we don't have a name collision with a previous player. */
+ let unique_suffix = 1;
+ while (this.players.find(player => player.name === nickname))
+ {
+ nickname = `${nickname_orig}${unique_suffix.toString().padStart(2, '0')}`;
+ unique_suffix++;
+ }
+
+ const player = new Player(id, session.id, nickname, connection);
/* Broadcast before adding player to list (to avoid announcing the
* new player to itself). */
router.get('/', (request, response) => {
const game = request.game;
- if (! request.session.nickname)
- response.render('choose-nickname.html', { game_name: game.meta.name });
- else
+ if (! request.session.nickname) {
+ response.render('choose-nickname.html', {
+ game_name: game.meta.name,
+ options: game.meta.options
+ });
+ } else {
response.render(`${game.meta.identifier}-game.html`);
+ }
});
router.put('/player', (request, response) => {
}
function set_nickname(form) {
- const nickname = form.nickname.value;
+ let nickname = form.nickname.value;
+ if (nickname === "")
+ nickname = "Guest";
var request = new XMLHttpRequest();
request.addEventListener("loadend", () => set_nickname_loadend());
<!-- The return false prevents the page from being reloaded -->
<form id="nickname-form" onsubmit="set_nickname(this); return false">
<div class="form-field large">
- <label for="nickname">Nickname</label>
- <input type="text" id="nickname" required>
+ <label for="nickname">Your name or nickname</label>
+ <input type="text" id="nickname"
+ {% if options.allow_guest %}
+ placeholder="Guest"
+ {% else %}
+ required
+ {% endif %}
+ >
</div>
<div class="form-field large">
TicTacToe.meta = {
name: "Tic Tac Toe",
- identifier: "tictactoe"
+ identifier: "tictactoe",
+ options: {
+ allow_guest: true
+ }
};
exports.Game = TicTacToe;