ScribblaZ Runbook
Use the normal Funday play route to exercise the same Svelte entry point and authoritative Nakama match that players use.
| Field | Value |
|---|---|
| Play route | https://funday.gg/play/scribblaz |
| Client entry | games/scribblaz/src/ScribblaZGame.svelte |
| Match handler | games/scribblaz/server/match_handler.ts |
| Runtime | scribblaz_ts_match, 5 Hz |
| Active player range | 2–12 |
Docs: Hub · Architecture · Game design · Opcodes · Verification · Nakama Multiplayer · Games Catalog
Open the game
- Open https://funday.gg/play/scribblaz.
- Confirm that the mounted client is
src/ScribblaZGame.svelte, the manifest’s configuredentryPoint(funday-plugin.json:3-45). - Create or join a lobby. The host needs at least two connected, ready players before
REQUEST_STARTcan begin a match (server/match_handler.ts:451-457,:1034-1041).
Stored-match rejoin
On funday:match-joined, the root stores scribblaz_matchId, assigns the controller’s match ID, and sends REQUEST_SYNC with the local canvas event count (ScribblaZGame.svelte:431-436). On mount, it reads scribblaz_matchId; if there is no initial match ID, it asks the platform to join that stored match and begins a 3-second watchdog (:520-540). Socket reconnect also requests the same resync (:456-464).
To manually check existing behavior, join a real match, reload the tab, and confirm a joined/state event returns the client to that match. The source-visible current-cycle watchdog removes an unconfirmed stored ID, enters solo free draw, and restores the saved drawing (ScribblaZGame.svelte:506-518); do not record a bogus-ID fallback as verified until it is exercised in a browser. The underlying solo fallback enters drawing with no countdown (ScribblaZController.svelte.ts:319-335).
Word-pick reconnect
- Use two active players and start a match.
- Make one player the drawer; wait for the three word choices.
- Reload or reconnect the drawer before choosing.
- Confirm the drawer sends
REQUEST_SYNCwith{ lastStrokeIndex }after reconnect. - Confirm the server answers a drawer in
word_pickwithGAME_STATE, settings, and the original opaque IDs plus plaintext options (server/match_handler.ts:1060-1077). - Choose an option and confirm
ROUND_STARTmoves the match todrawing.
The re-send branch is visible in the current handler. Treat the end-to-end “picker remains visible” interaction as pending until this exercise is captured.
Low-player lobby reset
- Start a two-player match and reach
drawing. - Disconnect the non-drawer.
- Expect one system chat message:
Not enough players — returning to lobby. - Confirm the phase becomes
waiting, readiness resets, and the remaining host can ready/start again with another player.
The server code contains this quorum branch before the drawer-disconnect end-round path (server/match_handler.ts:933-954). Its real-match proof remains pending.
Private save, publish, and gallery
On ROUND_END, the root’s current source privately saves the drawer’s structured canvas events with { word, drawerName, lines, isPublic: false } (ScribblaZGame.svelte:178-187). The server RPC writes public drawings to the system gallery owner and scribblaz_get_gallery lists that owner (server/rpc.ts:3-69).
The explicit Publish action and Public Gallery overlay are current-cycle presentation work. Verify them as follows:
- Finish a round as the drawer and inspect the private save request for
isPublic: false. - Select Publish once; inspect one public save request with
isPublic: true. - Open Public Gallery; verify loading, empty, error/retry, and populated states.
- Verify thumbnail keyboard activation with Enter and Space.
Do not claim this UI flow as production-verified until it passes in the play route.
Source-only checks
Use Opcodes to compare wire payloads with the match handler. Use Verification to mark manual evidence, rather than treating source presence as live-service proof.