The template's bots move once the player's request is answered: a slow bot no longer holds up the reply to the move it is answering

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CCLa2PaEeCj8njQZSWGqHx
This commit is contained in:
Eric WagonerandClaude Fable 5.1 committed 2026-10-26 17:32:23 -04:00
1 parent dcd2293b42
commit 62cb00be33
2 files changed
+39 -9

No files matched your search

+23 -4
View File
@@ -351,8 +351,28 @@ export class Rooms<State, Input> {
if (room.seats.length < this.game.minSeats) throw new RoomError(`The game needs at least ${this.game.minSeats} players.`, 409);
this.commit(room, { t: 'start', seed: newSeed(), rules: this.game.currentRules, ...(Object.keys(room.rankings).length ? { rankings: { ...room.rankings } } : {}) });
// A game whose first move belongs to a bot must not wait for a human who is not owed a move.
this.driveBots(room);
this.botsSpeak(room, 'phase');
this.botsAfterAnswering(room);
}
/**
* The bots' moves, once the request that made them due has been answered.
* A bot that thinks for a second or two would otherwise hold up the reply
* to the person whose move it is answering, so their own move would seem
* to hang and the bot's to come at once. The table is told as each move
* lands, the same as any other.
*/
private botsAfterAnswering(room: Room<State>): void {
setImmediate(() => {
// A room forgotten and loaded again drives itself; this one is no longer the table.
if (this.rooms.get(room.id) !== room) return;
try {
this.driveBots(room);
this.botsSpeak(room, 'phase');
} catch (e) {
// Nothing is waiting on this callback: an error here would take the process down, so it is logged and the table left as it stands.
console.error(`${room.id}: the bots could not move: ${e instanceof Error ? e.stack ?? e.message : String(e)}`);
}
});
}
/**
@@ -538,8 +558,7 @@ export class Rooms<State, Input> {
}
}
this.commit(room, { t: 'turn', at: Date.now(), inputs });
this.driveBots(room);
this.botsSpeak(room, 'phase');
this.botsAfterAnswering(room);
}
/**