feat(games): implement chess game plugin with full UI
Some checks failed
Deploy to Production / test (push) Failing after 32s
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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user