Add shared multiplayer gear puzzle (Chamber of Motion)

Players open a no-login link and see live cursors and dragged gear
pieces synced in real time, backed by a small Workerman WebSocket
relay (src/Command/PuzzleRelayCommand.php) run alongside symfony
serve - no Docker/Mercure hub needed. The board renders the wall
artwork with a spare-gears tray, and a "Reset puzzle" button (visible
only to logged-in users, verified server-side via a signed token) lets
the DM wipe the shared state for everyone.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Frank
2026-09-12 13:24:42 +02:00
co-authored by Claude Sonnet 5
parent 40dc30f950
commit 2ccbf4ca67
21 changed files with 3293 additions and 2394 deletions
+11
View File
@@ -59,3 +59,14 @@ MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
###> symfony/mailer ###
MAILER_DSN=null://null
###< symfony/mailer ###
# Puzzle relay (src/Command/PuzzleRelayCommand.php): a small WebSocket server,
# run separately with `symfony console app:puzzle-relay` (or `php bin/console
# app:puzzle-relay`) alongside symfony serve, that syncs cursors and dragged
# pieces across the shared puzzle screens. No Symfony/Mercure component covers
# this (Mercure needs its own hub process/container); Workerman gives us a
# plain-PHP WebSocket server instead.
# PUZZLE_RELAY_LISTEN is the address the relay process binds to.
PUZZLE_RELAY_LISTEN=0.0.0.0:8091
# PUZZLE_RELAY_PUBLIC_URL is the address browsers connect to.
PUZZLE_RELAY_PUBLIC_URL=ws://127.0.0.1:8091