Trigger
- GameUI: scene3d.celebrate() now fires from the master case, _onLevelUp,
and _onFinish (finish fires three staggered bursts at 0/0.6/1.2 s)
- Scene3D + main.js stub expose celebrate() so the call is safe even when
the 3D scene failed to init
LakeLife.celebrate() — the spectacle
- Spawns 50 one-shot CelebrationFish staggered over 2.5 s; each is a small
Three.js mesh (body + tail + fin), random colour from a 14-shade rainbow
palette, random scale 0.7-1.4×; v_y ≈ 5.5-9.5 m/s so peak heights run
≈ 1.5-4.6 m under G=9.8; auto-disposes (geometry + material) on landing
- Resident fish also launchSoon() with a +2.0-4.0 m/s boost so the
existing pool joins in
- Every frog forceHop()s — each picks its own pad target with a small
random delay so they stagger naturally
- Five CelebrationBursts spread across the 2 s window so the rainbow
particles keep raining the entire time the fish are airborne
JumpingFish.launchSoon(delay, boostVy)
- Sets cooldown to delay and queues …
Per-user backend word sync, sea wavelets, and pond surface life
Persistence
- Store.js: IndexedDB + localStorage mirror + in-memory last-resort fallback;
per-user namespacing keyed by lowercased email; auto-migrate guest progress
on first login (one-shot, flagged in localStorage); idb transaction errors
no longer permanently disable the IDB connection
- Backend sync: new POST/GET /api/me/words on the Node server with a
user_words SQLite table (email, w, status, streak, ok, bad, seen, stars).
Store.js debounces uploads (~1.2 s) and pulls remote-merged-into-local
before loadProgress so the same account picks up on any browser/device
- Vite proxy /api → :7860 so backend sync actually runs in dev mode (was
silently failing same-origin before, which is why incognito never saw
saved progress)
- GameUI: visible bottom-right "Saved" toast on every Store.onSave, top-right
Report Problem button with diagnostic dump + wa.me link, dismissable
"Recently fixed" card under it
Water
- Replace single-axis sin/cos vertex waves with 5-layer multi…
Initial commit: ECHO 3D vocab game with Node+SQLite backend, admin dashboard, Docker deploy