- Scale down car sprites to 70% size for better visual fit
- Offset cars to the right side of roads using perpendicular
positioning instead of centering them on the road path
- Scale down car sprites to 70% size for better visual fit
- Offset cars to the right side of roads using perpendicular
positioning instead of centering them on the road path
- Increase week duration (55s → 70s) and delay color unlocks
- Lower house/building caps (30→20, 12→8) and slow car speed (3.0→2.5)
- Increase house/building spawn intervals and slow pin accumulation
- Start with 1 color instead of 2 for a gentler learning curve
- Implement Phaser scenes and pure JS logic modules for both games
- Register games in server registry and scene routing
- Add headless verification scripts for Bejeweled and Mini Motorways logic
- Update game-icons sprite sheet
- Add DEBUG_FREE_ROADS_AND_SHIPS flag to bypass resource costs for testing
- Extend fog hex revelation to include corner-adjacent hexes, not just edge-adjacent
- Restructure button enable logic to support debug mode in UI
- Initialize hexTileFrames map in CatanGame setup
Make board edges open instead of walled — blobs that slide off the
table fall and die, faithful to the original Pudding Monsters.
- Detect edge deaths in computeSlide (deathCause: 'edge')
- Animate blobs tumbling off the board with overshoot + fade
- Show 'Overboard!' death overlay for edge falls vs 'Splat!' for spikes
- Redesign board as a floating table with open edges (drop shadow, no rim)
- Regenerate all levels with walls added to every tier (walls are the
only terrain that stops a slide, so they're required from tier 1)
- Update UI copy to explain the new slide-and-fall rules
Track each monster's original index in cell data [x, y, m] so merged blobs
retain individual colors and faces. Replace uniform blob coloring with a
multi-pass silhouette renderer that blends adjacent monster colors and draws
eyes on every cell. Add squash-and-spring wobble tweens for merge impacts
and slide movements.
Implement a complete Zuma-style puzzle game featuring:
- Pure game engine (`ZumaLogic.js`) with Catmull-Rom path animation,
segment-based chain physics, match-3 popping, and power-ups (slow,
reverse, accuracy, explosion)
- Phaser scene (`ZumaGame.js`) with procedural textures, laser sight,
and full UI (level select, overlays, scoring)
- 20 hand-designed levels across 6 path shapes (s-curve, horseshoe,
spiral, zigzag, double-loop, figure-eight) with calibrated difficulty
- Level generator (`genZuma.js`) and verification suite (`verifyZuma.js`)
for path geometry, parameter ranges, and engine correctness
- Platform integration: game registry, scene dispatch, preload asset
- Add dedicated battle background image, separate from non-battle screens
- Move felt background to render after textures are loaded
- Fix callout text z-ordering so it always renders above jewels/FX
- Play sword-hit SFX on skull matches, sword-slice on damage
- Register new audio assets and sound constants
- Register new Jewel Quest game across client and server
- Update game icons spritesheet with new frame (59)
- Fix memory leaks in Portrait components by implementing proper
cleanup with double-destruction guards and returning destroy function
- Implement pure logic engine for tile management, shanten calculation, claim resolution, and faan scoring.
- Add heuristic AI (5 skill levels) using shanten minimization, ukeire tiebreaking, and adaptive defense.
- Build Phaser UI with tile rendering, dynamic scoreboard, claim prompts, hand-end modals, and a scoring reference panel.
- Integrate into frontend routing, opponent selection, and backend registry.
- Include headless verification script for tile catalog, scoring fixtures, and AI self-play invariant checks.
- Update game icon assets and add in-game tutorial.
- Add complete Mahjong Match game (MahjongLogic.js + MahjongMatchGame.js) with pure board model and Phaser UI
- Implement 6 layouts: Garden, Crossroads, Pyramid, Butterfly, Fortress, and classic Turtle (up to 144 tiles)
- Generate guaranteed-solvable deals by simulating reverse removal of free pairs
- Add tile matching logic using half-tile coordinate system for proper layer overlap detection
- Include 38 tile face images (bamboo, circle, pinyin characters, winds, dragons, flowers, seasons)
- Add hint system, shuffle functionality, timer, best time tracking per layout
- Register game in server registry and scene dispatch tables
- Add headless verification script for face set validation and random self-play testing
- Add tutorial.md for Farkel (written by Gerome, ski-themed),
Forbidden Island (written by Balam, jaguar god), and Splendor
(written by Juliet, florist)
- Fix Holdem community card reveal: fly face-up cards with longer
delay, remove flip animation, and suppress new community cards
immediately after play action animation to prevent flash visibility
- Change deal sequence to match real blackjack rules: dealer hole card
face-down first, then player cards, dealer upcard face-up, then
second player cards
- Add renderAll() call to ensure card graphics exist before animation
- Update comments to reflect new deal order
- Replace star collection with target-square coverage for Pudding Monsters
- New 3-star medal system: min(targets covered, par-based efficiency)
- Add "Reset Progress" buttons to Pudding Monsters and Rush Hour level select
- Add reset API endpoint for puzzle progress
- Add Beth and Blackwind opponents with idle/happy/upset animations
- Update puddingmonsters.json levels with target squares instead of stars
Introduce a new single-player logic puzzle game where players flick jelly
blobs across a grid to slide and merge them into a single monster.
- PuddingMonstersLogic.js: pure slide-and-merge model with BFS solver,
no Phaser/DOM dependencies; shared by client and generator
- PuddingMonstersGame.js: Phaser scene with drag-to-flick, arrow keys,
undo/reset/hint, par tracking, star collection, death on spikes
- genPuddingMonsters.js: offline level generator using seeded RNG and
BFS solver; produces 40 levels across 5 difficulty tiers
- puddingmonsters.json: generated level data (40 levels, 5–7 grid sizes)
- Update main.js, GameRoomScene.js, PreloadScene.js, registry.js to
wire the new game into the app
- Update game-icons assets
- Register Hexsweeper game in server registry with icon frame 52
- Add HexsweeperGame import and scene configuration in main.js
- Add hexsweeper slug mapping in GameRoomScene.js
- Update game-icons sprite sheet with new icon
- Move Undo, Reset, Hint, and Levels buttons from horizontal bottom layout
to a vertical stack centered on the left side of the screen
- Calculate button positions dynamically based on total height and gap
- Improve usability by grouping controls alongside the playfield
- Split category tabs into two rows: row 1 (tabletop, cards, casino, word),
row 2 (logic) for better screen real estate
- Move title text and adjust vertical positioning to accommodate tabs
- Center row 2 tabs independently based on active categories
- Update game grid top position to 370px for proper spacing
- Update game-icons and tab-icons assets for new layout
- Register Rush Hour game in server registry (logic category, single-player)
- Add "Logic & Puzzle" tab to game menu
- Integrate RushHourGame scene in client-side main.js and GameRoomScene
- Load rushhour.json game data in PreloadScene
- Add puzzle API routes for server-side puzzle management
- Configure tab icon frame for new logic category
- Add trade logic to MonopolyLogic: isTradeable, validateTrade, applyTrade
- Properties with buildings (or in groups with buildings) cannot be traded
- Validates ownership, cash affordability, and player activity
- Handles two-way cash flows and property ownership transfers
- Add AI trade evaluation to MonopolyAI: evaluateTrade
- Scores offers based on cash delta, asset value, group control changes
- Detects set completions and control crossings (past 50%)
- Vets breaking up completed monopolies
- Applies skill-based thresholds and randomness
- Returns acceptance decision with human-readable reason
- Add trade modal UI to MonopolyGame
- Three-column layout: your properties, give/get lanes, opponent properties
- Drag-and-drop property cards into trade lanes
- Cash steppers for adding/requesting cash
- Opponent tabs to switch counterparty
- Hover cards for detailed property info
- Visual feedback: pulsing hints when offer is empty, accept/reject messages
- "Initiate Trade" button in end-turn menu
- Add realistic dice throw animation with quadratic bezier arcs
- Implement perspective scaling and spin during dice animation
- Add impact bounce effect when dice land
- Randomize dice landing positions and angles for natural appearance
- Increase player portrait size and adjust panel layout for better readability
- Improve cash display font size and spacing in player panels
- Track dice positions and angles for consistent rendering between turns
- Register Freecell game in server registry with card game configuration
- Import and configure FreecellGame in main.js and GameRoomScene
- Update game-icons sprite sheet with new icon frame for Freecell
- Fix Triominoes to dim all tiles when no legal moves are available
Add `animateDrawTile()` to tween a face-down triangle from the pool area to the drawing player's portrait over 1.2 seconds. Integrates the animation into both the human draw flow (`onPoolClick`) and the AI draw loop (`runAITurn`), ensuring visual feedback before the game state updates and the hand refreshes.
Introduce Tri-Ominoes, a triangular grid tile-placement game for 2–4 players. The implementation includes a pure rules engine (`TriominoesLogic`), triangular grid geometry and data (`TriominoesData`), a Phaser scene (`TriominoesGame`), and a heuristic AI with 5 skill levels (`TriominoesAI`).
Key features:
- Corner-matching tile placement on an equilateral triangular grid
- Scoring with pip sums, hexagon-closing bonuses, and going-out rewards
- Draw-from-pool and pass mechanics with forced pass when blocked
- Animated AI tile placement from opponent portraits
- Board panning and re-centering for large play areas
- Game-over modal with final scores and history posting
Also updates the game registry, scene dispatch, opponent select skill controls, and adds two new character portraits (beth, blackwind).
- Play sfx-monopoly-pay when rent/payment animation begins
- Play sfx-piece-click when pawn/token hop animation completes
- Load new audio asset and register in SFX constants
- Draw Chance and Community Chest card decks on the board center
- Add animated card draw with flip effect from deck position
- Add animated rent payment with money flying between players
- Integrate new Monopoly sound effects (purchase, expense, paid)
- Extract applyRent() to MonopolyLogic for cleaner state handling
- Update monopoly-cards spritesheet with new card art
- Track `fromSpace` before incrementing position for arc direction logic
- Flip Bézier control point for spaces 20–29 so pawns hop outward (away from center)
- Fixes awkward inward arc that made pieces clip through the board on the bottom edge
- Add complete Monopoly implementation with pure state engine (MonopolyLogic.js),
static data (MonopolyData.js), AI (MonopolyAI.js), and Phaser scene (MonopolyGame.js)
- Implement full game rules: property buying, auctions, building houses/hotels,
mortgages, jail, chance/community chest cards, rent calculation, bankruptcy
- Add 5-level AI with configurable greed, blunder rate, and thinking delay
- Add spritesheet loading for monopoly pawns and cards with graceful fallbacks
- Register game in registry, main.js, and game room scene dispatcher
- Add spritesheet creation guide (sprites.md) and update game-icons.png
- Animate cards flying from player's panel to center slot on play/deviate moves
- Use tweens with Cubic.easeOut for smooth card placement (1200ms)
- Refactor applyMove to handle pass as early return and compute animation destination upfront
- Extract _postMoveEvents helper for post-move event handling
- Simplify forced move flow by removing manual delay and slot position capture
- Clean up flyCard reference on scene cleanup to prevent memory leaks
- Rename game from "Yatzi" to "Zahtzee" across UI and server registry
- Move game category from tabletop to cards
- Persist last selected menu category using _lastCategory
- Update game-icons asset files
- Implement Kiitos game logic: build-a-word mechanic with forced plays,
deviations, and pass resolution when stuck
- Add 3-round progression escalating rules (4+ words, prepend, super-Kiitos
insert-anywhere, double scoring)
- Create server-side dictionary engine with prefix trie, word validation,
and skill-aware AI move selection
- Build cozy Nordic café-themed Phaser scene with drag-and-drop letter cards
- Support 1 human + up to 3 AI opponents with turn-based play
- Integrate Kiitos into game menu, room scene, and opponent selection
- Add game icon to game-icons sheet
- Implement full Stratego rules, including hidden information, combat,
and flag capture mechanics
- Add 5-level AI with heuristic evaluation, unknown enemy reasoning,
and skill-scaled blunders/lookahead
- Create setup phase allowing piece swap and shuffle before battle
- Add detailed unit reference panel with scrollable ability notes
- Implement turn-based battle animations with sci-fi sound effects
- Integrate Stratego into game menu, room scene, and opponent selection
- Add spritesheet assets (stratego-pieces.png) and game menu icon
- Register Stratego in server game registry
Refactor bank() to return bankable amount instead of mutating state,
enabling the UI layer to handle score updates and display a floating
+score animation that slides to the player's score pad. Applies to
both human and AI turns.