this.state = {
bag: LetterRip.make_bag(),
player_tiles: {},
+ player_boards: {},
stuck: new Set(),
finished: false,
winner: null
response.json({ finished: false });
}
+ handle_place(request, response) {
+ const session_id = request.session.id;
+
+ if (!this.state.player_tiles[session_id]) {
+ response.sendStatus(400);
+ return;
+ }
+
+ const { tileIndex, r, c } = request.body;
+
+ if (!this.state.player_boards[session_id]) {
+ this.state.player_boards[session_id] = {};
+ }
+
+ const board = this.state.player_boards[session_id];
+
+ /* Remove this tile from any previous position. */
+ for (const key of Object.keys(board)) {
+ if (board[key].tileIndex === tileIndex) {
+ delete board[key];
+ break;
+ }
+ }
+
+ /* Place on the grid (r and c are null when returning to rack). */
+ if (r !== null && c !== null) {
+ board[r + "," + c] = { tileIndex, letter: request.body.letter,
+ isBlank: request.body.isBlank || false };
+ }
+
+ response.sendStatus(200);
+ }
+
handle_events(request, response) {
super.handle_events(request, response);
response.write(`event: tiles\ndata: ${data}\n\n`);
}
+ /* Send this player's board layout for reconnect recovery. */
+ const board = this.state.player_boards[session_id];
+ if (board && Object.keys(board).length > 0) {
+ response.write(`event: board\ndata: ${JSON.stringify(board)}\n\n`);
+ }
+
/* Send current bag count. */
response.write(`event: dealt\ndata: ${JSON.stringify({
remaining: this.state.bag.length
request.game.handle_stuck(request, response);
});
+router.post('/place', (request, response) => {
+ request.game.handle_place(request, response);
+});
+
router.post('/complete', (request, response) => {
request.game.handle_complete(request, response);
});