The dwyl 370k list contains acronyms and short-form abbreviations that
appear as 3-letter "words" and confuse learners (especially Tamil-medium
students). Curated blocklist drops months, weekdays, tech acronyms,
business titles, and country codes. Real words that look like
abbreviations (may, sun, sat, wed, mar) are kept intentionally.
Fix sprite facing via UV-mirror; crane wades left-right with long pauses
mlmihjaz+1: Claude Opus 4.8
fec2039
Root cause of "fish/birds swim reversed": a THREE.Sprite ignores a negative
scale.x (its shader uses the matrix-axis length), so the scale.x facing flip in
Fish.js and Birds.js never actually mirrored anything — everything always faced
head-right, so anything moving left looked reversed. Verified with a headless
screenshot. Fix: keep scale.x positive and mirror the texture's U coords
(repeat.x=-1, offset.x=1) when travelling left.
Also:
- Crane: stand IN the shallow water (y=-0.12, z=-1.2), walk only left/right
(fixed z, no toward-camera drift), and pause 30-60s hunting before roaming
- Water-bird wake: shorter spawn interval so ripples form a continuous trail
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Crane on the surface + wade onto water; fix reversed fish; subtler bird wake
mlmihjaz+1: Claude Opus 4.8
b48241f
- Crane: drop from y=-0.45 (sunk in the ground) to y=-0.05 so its feet sit on
the surface, and extend its roam from the grassy bank out onto the near water
so it wades the shoreline instead of standing only on land
- Fish: facing flip was inverted (swam tail-first); head now leads travel
- Water-bird wake: thinner, smoother, softer ripple that expands less and fades
out — natural instead of the bold wide oval
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cranes: roam the shoreline with a walk cycle, pause and eat only when stopped
mlmihjaz+1: Claude Opus 4.8
b5fdc37
- Pull cranes in from x=±16 (off-frame) to roam within x≈±12, visible
- Each crane wanders random shoreline spots (x + slight z land/water),
strides its legs while walking, and lingers 4–11s at each spot
- Head-dip eating + crane call now fire only while stopped, never mid-walk
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add white wake ripples behind swimming water birds
mlmihjaz
e868059
Goats fade/respawn off-screen, not mid-view (exitX 26, short fade)
mlmihjaz
acc4130
Make butterflies much smaller (scale 0.45)
mlmihjaz
4fe7cd7
Add land bees+butterflies over grass flowers; flip bird facing
Uniform pond colour, remove jumping-fish arrows, fish facing, smaller bees, side flowers
mlmihjaz+1: Claude Opus 4.8
6861beb
- Water: blue-tint the sand floor, flatten the back wall to a uniform blue
and match the far backdrop, raise surface opacity so the pond reads as
one even colour instead of blue + tan/light-blue two-tone.
- LakeLife: disable idle jumping fish (read as moving arrows); shrink bees
to 0.55; move the flowering colony + bees from the UI-hidden centre to
the left foreground.
- Fish: flip sprite facing so fish swim head-first, not in reverse.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Scale lily blooms to their pad size
mlmihjaz+1: Claude Opus 4.8
5bce4c6
The bloom was a fixed size on every pad regardless of pad size. Parent
all bloom parts to one group scaled by pad size (avg 0.33 -> ~1x) so the
flower is proportional to its pad.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Tuck water-bird eyes into the head
mlmihjaz+1: Claude Opus 4.8
3c926ba
Eyes were bulging off the head; reduce the forward/side offset and size
so they sit flush on the head surface.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Give water birds eyes
mlmihjaz+1: Claude Opus 4.8
4a6a350
Add white eye + dark pupil on each side of the water-bird head; they
previously had only a beak.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Gold buttons matching speaker, professional fish texture
mlmihjaz+1: Claude Opus 4.8
86e4b9c
- CSS: ghost buttons (Show answer / Skip / Slow) now use the speaker
button's gold/amber glossy palette instead of cyan.
- Fish: redraw the sprite texture at 2x res with back-to-belly shading,
a scale pattern, body stripes, gradient finned rays, gill arc, pectoral
fin and a glossy eye so fish read as real, not kid-drawn.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Even lake color, remove shark, smaller tree tops, crane dip, grass flowers, slower waves
mlmihjaz+1: Claude Opus 4.8
044f11b
- Water: flatten surface gradient so the lake is one even colour (a strong
light->dark gradient made half look lighter); slow the wave motion and
texture scroll.
- Scene3D: disable the shark (kept the class/import).
- Forest: shrink the two upper cone puffs and pull them down so tree tips
are smaller and less tall.
- Crane: deepen the head dip so the beak reaches the water surface.
- Ground: scatter ~280 tiny yellow/red wildflowers through the grass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fix green pond, shrink waves, pin water/land seam
mlmihjaz+1: Claude Opus 4.8
ffc6336
Root cause of the green water: the 200x80 grass ground plane sat at
y=-0.01 directly under the water, so the translucent surface showed grass
through it. Moved the ground plane behind the water far edge (z=-2.5) so
only the land behind the water keeps grass; under the water you now see
the sand/blue backdrop instead of green.
Waves: amplitude cut to very small, and faded to zero at the two Z edges
so the shoreline no longer bobs as a moving light/dark line.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Water: lower wave amplitude (waves were too big); switch surface to a
professional lake-blue palette and raise opacity to 0.6 so the green
ground no longer bleeds through the transparent surface.
- LakeLife: enlarge and lift the lily bloom (taller petals on a green
calyx) so it sits above the water/wave line and is actually visible.
- Fish: shrink aquarium fish further (~0.18..0.73).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Scene polish: lily flowers, bees, water birds, waves, splash, buttons
mlmihjaz+1: Claude Opus 4.8
9dbd243
- LakeLife: replace omelet-shaped flower with pointed-petal water lily;
add bees orbiting flowered pads; add black water birds that paddle the
open water and dip to peck; round splash droplets (sprite map) instead
of squares.
- Ground: halve goat vertical bob and leg-swing amplitude.
- Scene3D: Hor+ FOV compensation on resize so the side cranes no longer
drop out of frame on narrow / zoomed-out windows.
- Water: fix waves not rendering — displace the surface along its normal
(local Z) for real vertical ripples instead of sliding verts sideways;
recompute normals; bigger amplitude; more transparent surface; brighter
and more numerous wavelet/glint texture.
- CSS: cold icy glossy 3D style for the ghost buttons.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Make aquarium fish smaller with wider random size spread
mlmihjaz+1: Claude Opus 4.8
e213b30
Old size was 0.9-1.6 (narrow, read as uniform). New size uses a power
curve, ~0.35..1.3, biased toward many small fish with occasional larger
ones so the school looks varied rather than same-sized.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fix lily-pad z-fighting and add bottom-centre flowering colony
mlmihjaz+1: Claude Opus 4.8
56aa9ab
Pads were all pinned to y=0.01, so overlapping pads in a cluster shared a
plane and z-fought (flicker on the left bank). Each pad now gets a
sub-mm incremental Y step so overlaps stay flush without flickering.
Added a 6-8 pad foreground colony centred at cx=0, cz~9.5 to fill the
empty near-camera centre, with ~half forced to flower via a new
LilyPad({ flower: true }) option.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Slow goat leg animation and make typing input glassier
mlmihjaz+1: Claude Opus 4.8
56a3eff
Goat leg swing frequency lowered 6 -> 4 (~33% slower kick) in Ground.js.
#typed background alpha reduced .35 -> .18 (.55 -> .32 on focus) so the
typing field reads as glass like the surrounding card.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fix localStorage auth fallback trapping accounts on one device
mlmihjaz+1: Claude Opus 4.8
24ea5ee
backendReachable() no longer memoizes failures, so a single cold-start
probe miss can't permanently route the session to localStorage. Added a
5s timeout on the probe.
register()/login() refuse the device-local fallback in production
(localFallbackAllowed gates it to localhost / explicit opt-in), throwing
a retry error instead of silently forking an account that breaks login
from any other device.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Inverted-triangle fish tail (point at body, base flared back)
Replaces the previous side-rotated ConeGeometry tail (which read as a
solid wedge with the point at the wrong end) with a 2D ShapeGeometry
triangle: point at (0, 0) attaches to the body, base at x=-0.24 flares
to ±0.14 vertically. DoubleSide material so the tail stays visible
when the fish rotates mid-jump.
Tail anchor pulled to x=-0.06 so the triangle's point overlaps the
body's rear instead of starting at the back edge — reads as an
attached fin, not a detached flag.
Applied to both the resident JumpingFish and the one-shot
CelebrationFish so all 56 jumping fish during a celebration share
the same silhouette.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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…
Clear leaderboard: remove fake peer seed, use backend leaderboard API