feat(games): implement chess game plugin with full UI
Some checks failed
Deploy to Production / test (push) Failing after 32s

Add chess as the first game plugin using the existing multiplayer framework.
Server-side game logic uses chess.js with server-authoritative clock management.
Client uses react-chessboard v5 with cburnett piece set, drag-and-drop + click-to-move,
configurable time controls (bullet/blitz/rapid/classical/none), draw offers,
resignation, and timeout detection. Extends the game framework with room creation
options to support per-game configuration. Includes 57 tests covering all code paths.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
syntaxbullet
2026-04-05 16:59:26 +02:00
parent 9e95194627
commit a29bb63a1d
26 changed files with 1644 additions and 19 deletions

View File

@@ -33,7 +33,7 @@ export class RoomManager {
private cleanupTimers = new Map<string, Timer>();
readonly emitter = mitt<RoomEvents>();
createRoom(gameSlug: string, hostId: string): CreateResult {
createRoom(gameSlug: string, hostId: string, options?: Record<string, unknown>): CreateResult {
const plugin = gameRegistry.get(gameSlug);
if (!plugin) return { ok: false, error: `Unknown game type: ${gameSlug}` };
@@ -47,6 +47,7 @@ export class RoomManager {
state: null,
status: "waiting",
createdAt: Date.now(),
options,
};
this.rooms.set(id, room);
@@ -85,7 +86,7 @@ export class RoomManager {
room.players.push(playerId);
if (room.players.length >= plugin.maxPlayers) {
room.state = plugin.createInitialState(room.players);
room.state = plugin.createInitialState(room.players, room.options);
room.status = "playing";
this.scheduleCleanup(roomId, ROOM_CONFIG.PLAYING_MAX_MS);
@@ -185,7 +186,7 @@ export class RoomManager {
room.players.push(adminId);
}
room.state = plugin.createInitialState(room.players);
room.state = plugin.createInitialState(room.players, room.options);
room.status = "playing";
this.scheduleCleanup(roomId, ROOM_CONFIG.PLAYING_MAX_MS);