Games: cross-device sync + overlap colour-blend
Two game polish items:
- Word Search: overlapping cells now multiply-blend the crossing words' colours
(deepening to a darker shade with readable text) instead of the newest colour
stomping the rest — matches the new interlocking grids.
- Cross-device game-state sync (signed-in): per-puzzle progress + stats now
follow you between devices. New game_state table; server-side merge on every
save so two devices converge regardless of push order, tailored per game:
* Word Search → UNION of finds (monotonic; can't un-find), earliest start,
best completion time.
* Word → furthest-progress wins (terminal beats in-progress; more guesses
beats fewer) — picks one device's game whole, never splices guesses.
Stats (streak/distribution/best) derived server-side from the synced states,
so they're consistent instead of per-device counters. Endpoints GET/PUT
/api/games/state + GET /api/games/stats (signed-in; size-capped). Frontend is
local-first: games paint instantly from localStorage, then reconcile in the
background; both game components push debounced on each move and adopt the
merge. Conflict handling unit-tested + an API two-device convergence test.
235→ tests + 11 vitest green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -300,6 +300,16 @@ CREATE TABLE IF NOT EXISTS daily_puzzles (
|
||||
UNIQUE (puzzle_date, game, variant)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS game_state (
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
game TEXT NOT NULL, -- 'word' | 'wordsearch'
|
||||
variant TEXT NOT NULL, -- '5'|'6' | 'small'|'med'|'large'
|
||||
puzzle_date TEXT NOT NULL,
|
||||
state_json TEXT NOT NULL, -- per-puzzle progress; merged server-side on save
|
||||
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (user_id, game, variant, puzzle_date)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS user_follows (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
|
||||
Reference in New Issue
Block a user