Commit History
-
feat(levels): add the countries board with the column-shuffle mechanic (#44)
Ben BlakerUnverified signature## What & why Board four — **`countries`** (`order=3`, reached after the subjects board). The judge reads which country a sentence sounds like: USA, Russia, Italy, France, India, China, Korea, England. ### New mechanic — the `shift` / column-shuffle tile The user's `[swap]` tile, named **`shift`** in code so it doesn't collide with the existing off-edge board-navigation *swap tiles*. - Shift tiles render as hand-drawn keycaps stamped with **two stacked accent ⇨ arrows** (wordless, dashed "press me" rim). - The top row is all structural: a blank `start` in the middle flanked by four shift tiles. Hopping onto one **rotates every row UNDER the top row one column to the right**; the rightmost cap of each row **wraps around to become the leftmost**, arcing up-and-over the caps that slide in beneath it. The top row never moves. - Landing on a shift tile costs one budget hop and appends no word (consistent with `wings` / every land, and routed through #42's new `settleIdle()` …3663d53 -
feat(portal): spinning-spiral teleport tiles on the animal board (#42)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureThree spinning ink-spiral portals on the animal board (board 2), each linking to the next clockwise (top→right→bottom→top). Hopping onto one shrinks the doodle into the source spiral and expands it out of the destination. "portal" is a new reserved tile word (wordless, never reaches the judge); the landing hop costs budget. Spirals spin in the render loop (mesh spin, no texture redraw). Rebased onto #41 (the wings board): #41 reserved the word "wings", which collided with the literal "wings" the layout placed at animal (3,2) — renamed that cell to "winged" so the animal board stays portal-only. Verified in-browser (Playwright): all three clockwise links walked live, spirals spinning, shrink-in/expand-out teleport, "winged" renders as a normal word, 0 console errors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>8d3ebb8 -
feat(levels): add the subjects board with the wings flight mechanic (#41)
Ben Blaker +1: Claude Opus 4.8 (1M context)Unverified signatureBoard three (subjects, order=2), reached after the animal board. The judge reads which academic subject a sentence sounds like (maths, science, philosophy, economics, literature, languages, art, music). New mechanic — wings: - `[wings]` tiles render as hand-drawn accent wing keycaps (wordless, like start/⏎). - Hopping onto one lifts the doodle into the air: it sprouts wings (new "fly" pose) and rises to cruise altitude, wings slowly flapping on their own timer (independent of the idle "boil", so they keep beating mid-hop). - The next two hops glide FREE — airborne, no word appended, no budget spent. - The third hop descends "down from the sky" and lands for real, e.g. onto a ⏎ to press submit. Wings are a clean exit: lock in the sentence you've written, then soar over the rest of the keys to the button without typing them. Flight state resets on board change, death, fresh attempt, and swap-tile transitions. Adds takeoff (soar) and wing-beat (flap) sounds. Verified locall…45107cc
-
feat(levels): modular drop-in level API + animal board
Make adding a board a one-file drop-in, and ship a second level. - levels/ package: each board is a self-contained Level (grid + its own judge spec — category, few-shot, labels), auto-discovered from its file; order/home set play order and the boot board. Replaces the single level.py. - judge is now category-agnostic: score_labels takes a Level, and judge() resolves the board from the level_id the client sends (labels/few-shot stay server-side). - engine: empty "" tiles are walkable but wordless; board build factored into buildTiles/buildTargets/loadLevel so boards swap client-side; camera reframes to board size; checked targets persist per board. - nav: hand-drawn ink arrows walk between boards — "next" unlocks after the first target is collected, "back" returns to the previous board. - animal board: 5x5, central start, four ⏎ corners, walkable blanks, ten animals to collect. 25 fast tests pass; verified both boards in-browser with the offline judge. Co-Authored-By:…4a497b2
-
feat(targets): replace single target with collect-them-all checklist (#11)
Ben Blaker +1: Claude Fable 5Unverified signatureAll four emotions now show as a checklist in the HUD. Winning a round checks off the emotion the judge picked; checks persist across rounds. The judge payload sends the still-unchecked targets, so a repeat emotion stamps "<emotion>, again." instead of a win, and the verdict bars highlight only the targets still left to collect. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>557ba69