- 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
- 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
- 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 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
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).
- 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
- 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
- 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 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
- Add new Farkel dice game (2-4 players, tabletop category)
- Update Video Poker CRT screen from green phosphor to royal blue theme
- Refresh game-icons sprite sheet for new game assets
- Introduce animated intro sequence, player role intros, and deck count displays.
- Replace direct treasure giving with a new Trade Modal for swapping cards between players.
- Add smooth Phaser animations for pawn movement, shore-ups, flood/treasure card draws, and card swaps.
- Improve state management during animations using immutable cloning and peek functions (`peekFloodDraw`, `peekTreasureDraw`).
- Update role definitions with detailed descriptions and remove 'messenger' from `ROLE_KEYS`.
- Change default difficulty to 'novice'.
- Add `splendor-gems` spritesheet (6 frames, 64×64) for gem icons.
- Introduce `gemFrame` helper to map gem colors to spritesheet indices.
- Update gem rendering in player bars, card badges, and cost pips to use sprites when available.
- Add `hasGems` flag to gracefully fallback to vector circles when art is missing.
- Register new asset in PreloadScene.
- Blokus: Adjust tray coordinates and add a background panel for improved layout separation.
- Splendor: Integrate a 28-frame spritesheet for development cards, nobles, and deck backs.
- Refactor frame mapping to calculate indices dynamically based on tier and bonus color.
- Unify card rendering pipeline: draw tinted background, overlay spritesheet art (when available), then render vector overlays.
- Add hover preview panel for reserved cards.
- Document spritesheet layout and update preload scene asset comments.
- Register Splendor in server game registry with metadata
- Import and register SplendorGame in frontend main.js
- Map 'splendor' slug to SplendorGame in GameRoomScene
- Preload splendor-cards spritesheet in PreloadScene
- Update game-icons assets for the new game
- Implement visual card rendering for Forbidden Island using a new spritesheet with procedural fallback
- Register and wire up the new "Solitaire Tour" game across client, server, and preload scenes
- Update game icon and card asset bundles
- Implement core game logic, AI opponent with skill scaling, and Phaser UI
- Register game in server registry and wire into app routing
- Add card assets and sprites
- Replace `gameicons` spritesheet with `game-icons` and load it in PreloadScene
- Add `iconFrame` support to game registry and render icons next to menu buttons
- Introduce animated dock arrows in Battleship to improve ship placement UI
- Clean up arrow lifecycle management in Battleship scene
- Implement full Boggle frontend using Phaser, featuring a wooden tray UI, player word sheet, opponent cards, and an animated hourglass timer.
- Add AI scheduling system that simulates opponent word finds based on configurable skill levels and word length/rarity weighting.
- Introduce pure game logic for adjacency validation, path checking, and classic scoring with duplicate-word resolution.
- Add backend board generation and exhaustive solver using a dictionary trie, exposing `/api/words/boggle/start` for board setup.
- Register Boggle in the game registry, scene router, and opponent selection UI.
- Include tutorial assets for Parchisi.
- Add custom card texture spritesheet and render cards using sprite frames
- Prevent AI from repeatedly asking for the same rank after a failed catch
- Track and exclude previously attempted (target, rank) pairs per turn to reduce redundant moves
- Load gofish-cards assets in preload scene
- Introduce muted palette and stroke outlines for unclaimed route segments so claimed routes pop
- Refactor busy state handling to toggle dim overlay and suppress hand render flicker during animations
- Improve modal layout using right-band centering, responsive font sizing, and word wrapping
- Block input briefly after modal close to prevent accidental clicks
- Add animated tab icons to the game menu with scale transitions and pulsing glow effects
- Load new tab-icons assets in the preload scene
- Replace column-based game list with a tabbed category interface and grid layout
- Add active state management to tabs and refactor Button component for consistent visual states
- Increase Dominion AI Platinum purchase threshold from 5 to 9 coins in Colony games
- Add Ticket to Ride card assets
- Implement Hangman game scene using Phaser with a sketch/paper-style UI
- Add pure logic module for word masking, wrong guess tracking, and win/loss conditions
- Create backend `/api/words/hangman/start` endpoint with curated word pools for easy, medium, and hard difficulties
- Register game in scene manager and route dispatcher for seamless menu integration
- Add score tracking and basic game state management
- Add gold hex resource picking phase with AI support
- Implement ship building mechanics and update build costs UI
- Introduce fog tiles that reveal terrain when roads/ships are built adjacent
- Replace robber token with pirate ship graphic
- Persist random tile frames for consistent hex visuals
- Update game state machine to handle gold pick queue and phase transitions
- Adjust UI layout (card positions, build panel) to accommodate Seafarers elements
- Decouple static board geometry from game state by introducing a board registry and `geoFor(state)` accessor. All AI and logic functions now dynamically resolve topology.
- Add support for Seafarers scenarios (New Shores, Four Islands, Oceania, Fog Island) with scenario-specific setup rules and victory conditions.
- Implement ship mechanics: players build maritime routes on coastal/sea edges that count toward the longest road.
- Introduce sea, gold, and fog terrain types. Update hex rendering, AI pathfinding, and placement rules to respect land vs. water constraints.
- Add pirate token rendering and logic, plus expansion scoring hooks for bonus victory points.
- Update lobby UI to allow expansion and scenario selection, passing configuration through to the game scene.
- Refactor `CatanBoard.js` geometry generation for O(1) edge lookups and dynamic port assignment.
- Adjust Wordle AI skill profiles to lower win rates and increase blunder chances for better difficulty curve
- Center Wordle player portrait vertically with the playfield
- Add Steve's humorous tutorial for Settlers of Catan (markdown + assets)
- Update OpponentSelectScene to hide playfield options for word games and adjust scroll height
- Fix migration script to temporarily disable foreign keys to allow schema changes
- Add migration to extend games.category to include 'word'
- Register Wordle game in server registry under 'word' category
- Add `/api/words` API routes
- Update client to integrate WordleGame scene
- Adjust game menu layout to accommodate a new 'Word' category column
- Enable skill controls and game room dispatch for Wordle
- Track deck/discard pile counts during animations for real-time UI updates
- Implement animated discard pile countdown when shuffling
- Dynamically show/hide deck and discard piles based on animation state
- Replace generic card SFX with specific sounds for buying treasures, purchasing, and dealing
- Update Dominion card assets to align with new UI/audio feedback
- Implement Checkers and Chess with complete Phaser UI, pure logic modules, and alpha-beta minimax AI opponents featuring a 1-5 skill model.
- Extend opponent skill selector to support Checkers and Chess.
- Register new games in frontend routing and backend registry.
- Improve Dominion game UX: add persistent phase dials and turn arrow indicators, add confirmation prompts for ending actions/turns, and refine card animation timings.
- Update Dominion card asset files.
- Implement drag-and-drop reordering for the player's hand with a visual play drop zone.
- Add smooth, multi-phase animations for AI opponents (play, draw, cleanup, gain).
- Refactor hand rendering to preserve manual order and improve playability highlighting.
- Update card draw animations to target existing sprite coordinates directly.
- Add visual discard pile with card sprite and count badge
- Center action buttons and remove redundant Play Treasures button
- Track in-play cards for accurate animation source positions
- Refactor `setState` to handle discard, gain, and draw animations sequentially
- Add multi-phase discard animation (fly face-up, fold, unfold face-down)
- Add gain card animation to deck or discard pile
- Improve animation queue handling with `_animating` and `_pendingAnimState`
feat(dominion): add card draw animations and visual deck pile
- Implement animation system for drawing cards from deck to hand
- Add input blocking and state queuing during animations to prevent race conditions
- Replace text-only deck counter with a visual card pile and count badge
- Support face-down card rendering for animation start positions
- Ensure all human actions respect animation state
```
- Add `sfx-bingo-balls` audio asset and load it in PreloadScene
- Register `BINGO_BALLS` sound in the SFX constants
- Play the sound when the bingo ball spinning animation starts