- Add player sprite sheets for warrior and rogue classes (300x300, 3 frames: idle/attack/hit)
- Update artwork.json with playerSheets configuration
- Replace placeholder player graphic with sprite-based rendering in combat
- Add warrior lunge attack animation that rushes toward enemies during strikes
- Add hit frame animation when player takes damage from enemy attacks
- Scale up enemy sprites and UI elements for better visibility
- Update PreloadScene to load player sprite sheets
- Curve the targeting arrow upward (150px control point) for smoother visual guidance
- Compute arrowhead angle from the last Bezier segment instead of direct card-to-cursor line
- Refactor arrow drawing variables for clarity and reuse
- Add figure-8 idle sway animation for enemy sprites in combat
- Implement multi-hit card support with individual hit animations
- Add buff/debuff spawn animations that fly from character to status circle
- Add shadow rendering to map edges and nodes for visual depth
- Enable self-targeting card selection with player hitbox
- Add input lock during node transitions to prevent double-clicks
- Move cost orb to bottom-right corner of cards
- Reposition UI elements (back button, relics, potions, status text)
- Add status effect suppression to prevent overlapping animations
- Add quick mode to health loss animation for multi-hit cards
- Add setupMultiHitCard() logic for deferred damage application
- Update creature sprite sheet and add PSD source file
Implement a complete Slay-the-Spire inspired game with:
- **Core engine** (`SpireClimbLogic.js`): Turn-based combat state machine,
seeded RNG, map generation, enemy AI, relic hooks, and a headless verifier
(`verifySpireClimb.js`) that auto-plays 1,000+ combats across both classes.
- **Game scene** (`SpireClimbGame.js`): Phaser UI for class select, branching
map, animated combat (card fly-in, health-bar drain, enemy lunge/buff FX),
rewards, shop, events, and treasure nodes.
- **Content** (`SpireClimbData.js`): Two classes (Warrior, Rogue), 30+ cards
with upgrades, relics, potions, 10 enemies/elites/bosses, events, and map
tuning.
- **Art pipeline**: Procedural rendering by default with drop-in sprite sheets
(`spireclimb-creatures.png`, `spireclimb-cards.png`) wired through
`spireclimb-artwork.json`. Includes a Node script to regenerate the creature
spritesheet and a full art spec (`sprites.md`).
Implement a complete Slay-the-Spire inspired game with:
- **Core engine** (`SpireClimbLogic.js`): Turn-based combat state machine,
seeded RNG, map generation, enemy AI, relic hooks, and a headless verifier
(`verifySpireClimb.js`) that auto-plays 1,000+ combats across both classes.
- **Game scene** (`SpireClimbGame.js`): Phaser UI for class select, branching
map, animated combat (card fly-in, health-bar drain, enemy lunge/buff FX),
rewards, shop, events, and treasure nodes.
- **Content** (`SpireClimbData.js`): Two classes (Warrior, Rogue), 30+ cards
with upgrades, relics, potions, 10 enemies/elites/bosses, events, and map
tuning.
- **Art pipeline**: Procedural rendering by default with drop-in sprite sheets
(`spireclimb-creatures.png`, `spireclimb-cards.png`) wired through
`spireclimb-artwork.json`. Includes a Node script to regenerate the creature
spritesheet and a full art spec (`sprites.md`).
- Add portraitHappy/portraitUpset helpers to react to game events
- Track army snapshotted counts on attack phase entry
- Trigger upset emotion when a player loses >8 armies in a turn
- Show happy emotion on continent capture or defeating 5+ defender armies
- Show happy on successful card trades (human and AI)
- Enable opponent portrait intros in Risk
- Remove deprecated setPortraitThinking method
feat(paigow): widen card spread in comparison modal
- Add MODAL_CARD_SPREAD constant (55px) for clearer card visibility
- Use modal spread in slotX calculation for comparison display
- Move Next Round button up 200px for better centering
feat(opponents): add Jerry conversation audio references
- Add "convo" array to Jerry's opponent entry
- Reference maurice and mario conversation audio files
- Animate player's split cards back to seat with split layout on submit
- Replace showComparisons with step-by-step modal comparison overlay
- Modal shows dealer cards, then each player's cards sequentially
- Display high/low hand arrows (red=dealer wins, green=player wins)
- Show verdict text (WIN/PUSH/LOSE) with sound effects and emotions
- Animate cards and result text back to seat between players
- Clear drag highlights when hiding hand-set panel
- Swap chips/cards depth values in z-ordering constant
Add a smooth tween animation when opening the hand-setting panel,
transitioning the 7 dealt cards from their seat positions to the
panel's source area instead of snapping them into place. This
improves the visual flow between the dealing and setting phases.
- Implement complete Pai Gow Poker game using Phaser with drag-and-drop
hand-setting panel for splitting 7 cards into 5-card high and 2-card low
- Add pure logic module (PaiGowPokerLogic.js) with full hand evaluation
supporting Joker substitution, 9 hand ranks including Five Aces, foul
detection, house way splitting, and commission-based resolution
- Add AI bet sizing module (PaiGowPokerAI.js) for opponent betting
- Register game in server registry (casino category, 1-6 players)
- Register scene in main.js and GameRoomScene slug dispatch
- Add comprehensive test suite (verifyPaiGowPoker.js) covering deck,
evaluation, comparison, foul detection, house way, state management,
chip math (wins/losses/pushes/fouls/copy rule), and AI betting
- Update StrategoGame to trigger portrait emotions on piece captures
- Update game-icons sprite sheet
- AI portraits now play 'happy' or 'upset' animations based on score magnitude
- Adjust scorecard vertical positioning (SC_TOP: 60 → 110)
- Mute vibrant accent colors across all colored playfield schemes for better visual consistency
Introduce runtime-generated canvas textures for colored playfields, allowing
players to select from predefined base/accent color combinations via a UI
dropdown. The selected scheme is persisted to localStorage and the dropdown
is shown/hidden contextually based on the active playfield type. Includes
proper DOM cleanup when clearing layers.
- Add customizable playfield backgrounds with localStorage persistence
- Display multiplier labels on gold (1.5x) and diamond (2x) tiles
- Replace simple fade-in refill with Bejeweled-style falling tile animations
- Swap SUBMIT and CLEAR button positions for better UX
- Add new opponents (Gerome, Fireball, Natasha) with voice lines and convo files
- Reduce conversation interval from 60-300s to 20-200s
- Enable DEBUG_CONVOS for development
Introduce Bookwork, a single-player word puzzle game where players
battle opponents by forming words from a 5×5 letter grid. Features:
- 20 levels with unique opponents, escalating difficulty, and special
tile drops (fire, poison) via AI-driven attack system
- Grid mechanics: adjacent tile selection, word validation, damage
calculation with gold/diamond multipliers, and fire tile self-damage
- Progression system with HP milestones, potion unlock, and server-
persisted level completion
- Polished battle UI with animated word submission, fireworks, HP bars,
portrait system, and victory/defeat overlays
- Full test suite (verifyBookwork.js) covering grid generation, damage
formulas, refill logic, AI probabilities, and level data validation
- Replace generic sci-fi sounds with gem-themed audio (match, chain, drop, big drop)
- Add context-aware match sounds based on special gems (hyper, flame) and match size
- Improve Yatzi dice roll with bezier curve trajectories, rotation, and bounce
- Restructure dice rendering to use containers for consistent transforms
- Add new gem sound assets and SFX constants
- Replace generic sci-fi sounds with gem-themed audio (match, chain, drop, big drop)
- Add context-aware match sounds based on special gems (hyper, flame) and match size
- Improve Yatzi dice roll with bezier curve trajectories, rotation, and bounce
- Restructure dice rendering to use containers for consistent transforms
- Add new gem sound assets and SFX constants
Genius Square:
- Best-of-3 match mode with round tracking and score pips
- Inter-round overlay with "Next Round" button
- Match-end overlay with Play Again / Menu options
- Round display showing "ROUND X OF 3" at top
Wordle:
- 3-2-1-GO countdown before AI starts
- Adjusted AI delay timings (slower across all skill levels)
- Added victory/round win sound feedback
- Changed tile flip sound to UI_ACTIVATE
Audio:
- New countdown tick and go sound effects
- 3 new music tracks (Bryan Adams, The Midnight, Khruangbin)
Boggle:
- Minor button position adjustment
Enhance Genius Square and Katamino with:
- Smooth piece rotation and flip animations (scale + rotate tweens)
- Pulsing outline glow on ghost piece preview
- New UI sound effects: pick, activate, flip, place, chime
- Music player support in both games
- Win chime with delayed overlay for better feedback
- Move Reset/Leave buttons to bottom in Katamino
Implement Katamino, a 5×N grid tiling puzzle using the 12 standard
pentominoes. Players select a grid width (3-12) and solve puzzles by
placing all chosen pieces to fill the board.
Key features:
- Three-screen flow: penta select → set select → play
- Scrollable puzzle card grid with completion progress tracking
- Piece rotation (R), flip (F), and lift-to-reposition
- Pre-generated puzzle bank (katamino.json) with all valid tilings
- Offline generator script (genKatamino.js) using backtracking solver
- Progress saved to localStorage per puzzle
- Registration in server registry and scene dispatchers
Implement Genius Square, a 6x6 grid puzzle game where players place 9
polyomino pieces to fill the board around randomly placed blockers.
Key features:
- Pure JS game logic (GeniusSquareLogic.js) with backtracking solver
- AI opponent with 5 skill levels using pre-computed solutions
- Phaser-based UI with piece tray, grid rendering, and animations
- Dice-based blocker placement using zone partitioning for balanced boards
- Orientation support: rotate (R), flip (F), and piece lifting
- Win/loss overlay with play again and menu options
- Register game in server registry and scene dispatchers
- Replace Righteous font with JqkasWild for craps title, puck, and number labels
- Refactor zone label rendering into dedicated methods for cleaner code
- Add payout information display on craps number boxes (6→SIX, 9→NINE)
- Redesign Field zone with styled number circles (accent for 2/12)
- Update Don't Pass/Don't Come zones with bar text and red accent borders
- Add common words trie for Ghost AI to target on skill ≤3
- Make lower-skill Ghost AI play more human-like by preferring common word continuations
- Fallback to off-dictionary play when no common word path available
Replace the single global priority buttons (focus treasure, regroup, defend)
with per-player direction assignments accessible via clickable pills on each
player's HUD. Each player can now be directed to: Auto, focus a specific
treasure (Earth/Wind/Fire/Ocean), Regroup, or Defend Temples.
- Remove old priority toggle buttons and renderPriorities()
- Add direction pills on partner HUDs and portrait panels
- Implement dropdown menu for selecting directions
- Convert direction choices to priority objects for AI execution
- Increase chat panel height to accommodate new layout
- Add click consumption guard on trade modal trigger
- Redesign roundabout rendering with concentric rings (outer border, road
surface, inner border, central island) for clearer visual distinction
- Increase ROUNDABOUT_CAP from 2 to 4 to allow more cars simultaneously
- Add stuck detection (stuckMs) with FORCE_ADVANCE_MS (6s) timeout to
prevent cars from remaining permanently blocked
- Implement "don't block the box" logic: cars won't enter bare junctions
if their exit cell is occupied, reducing gridlock
- Add stop-at-road mode to A*: snap to nearest road cell on approach
instead of routing along the road to the cursor, producing clean T-
and L-junctions without diagonal shortcuts from unexpected angles
- Tighten diagonal suppression rule: block diagonals when EITHER
orthogonal intermediary is a road (previously required BOTH),
preventing spurious diagonal shortcuts at T-junctions that would
cause perpendicular approaches to fan out to three connections
- Refactor A* path reconstruction into shared helper and add early
termination to avoid post-search state scanning
- Replace drag-to-draw mode with click-and-drag path drawing
- Add A* pathfinding for drawing roads between points
- Support drawing roads along passable terrain (land without obstacles)
- Add visual preview of planned path with cost-based color coding
- Update UI hints to reflect new interaction model
- Cancel drawing with ESC without changing tool state
- Add jello-items spritesheet for wall and spike decorations
- Replace solid-color floor with checkerboard pattern using new palette
- Add pulsing animation to target squares
- Implement animated beacon rings around targets on level start
- Redesign walls and spikes to use sprite frames instead of drawn graphics
- Adjust UI text positioning in MahjongMatch, Zuma, and Shift games
- Reposition Shift game buttons to bottom-right corner with consistent sizing
- Load jello-items spritesheet in PreloadScene
- Introduce animated eye pupils that periodically shift direction per monster
- Replace single monster graphics with per-blob containers for independent squash-and-stretch pulse animations
- Add 4 new sound effects: squish, squash, woosh, jello-monsters
- Update move animations with woosh sound, merge with squash jiggle, and victory with jello-monsters fanfare
- Adjust HUD positioning for moves and stars text
- Refactor nudgeInvalid to work with per-blob container system
- Add 4 new 8-bit sound effects (select, activate, action, move) to SFX system
- Wire 8-bit sounds to Risk attack, fortify, and movement animations
- Add visual impact markers for hits and misses in Battleship
- Fix Battleship portrait texture key reference
- Improve ship drag hit area with geometric rectangle
- Add phase guard and tween cancellation on ship drag start
- Add visual card stack in side panel with clickable modal to view/trade cards
- Redesign cards modal with chip-style selection and trade/dismiss buttons
- Add animated phase announcements (Reinforce/Attack/Fortify) that slide from map to panel
- Introduce static portraits for attacker/defender in battle scene with avatar support
- Enhance move modal with optional +/-10 buttons for large army ranges
- Improve fortify flow with animation and proper busy state handling
- Add 3 new music tracks to game soundtrack
- Adjust UI font sizes, spacing, and button positioning throughout
- Deduplicate phase announcements using _lastAnnouncedPhase tracking
- Add animated attack arrows with quadratic bezier curves from attacker to defender
- Implement battle modal that zooms from battlefield to center, shows animated dice rolling, and resolves pair-by-pair with colored arrows
- Add conquest animation with straight-line arrow and floating +/- army count text
- Store attacker/defender seat info in lastBattle for proper color theming
- Add Min/Max quick-select buttons to army deployment modal
- Ensure busy state is held during conquest animations to prevent input conflicts
- Redesign Risk panel layout with player portraits, colored rings, and
inline name/stats display (territories, armies)
- Add active player gold ring highlight on portrait
- Support custom playfield background images with fallback color
- Refactor button/hint positioning for cleaner control rendering
- Add defaultOpponents configuration to game registry
- Default Risk to 3 opponents on seat selection
- Update game-icons asset files
Implement the classic Risk board game with full game logic, AI players
with adjustable skill levels (1-5), and Phaser-based rendering.
New files:
- RiskData.js: map data, adjacency graph, continent bonuses, card deck
- RiskLogic.js: pure game engine (reinforce, attack, fortify phases)
- RiskAI.js: heuristic AI with 5 skill tiers and configurable behavior
- RiskGame.js: Phaser scene with combat animations and UI
- tutorial.md: in-game tutorial ("A Field Manual by General Ironside")
- verifyRisk.js: headless fixture and self-play verification script
Integrates with existing game framework via registry, game room dispatch,
and preload scene. Includes board image and updated pawn sprites.
Adjust the popup dialog dimensions in MonopolyGame.js to improve content visibility and spacing. Increases maximum height from 620px to 800px and bottom padding from 20px to 48px.
Implement a fully playable Gin Rummy game with Phaser-based UI,
pure logic engine, and heuristic AI (skill levels 1-5).
Features:
- Complete Gin Rummy rules: draw, discard, knock, gin, layoff, scoring
- Meld detection with optimal deadwood minimization
- 2-4 player support with AI opponents
- Drag-to-reorder hand, visual meld highlights, turn indicators
- Round and game-over overlays with score tracking
- Headless verification script with unit tests and self-play simulation
Files added:
- public/src/games/ginrummy/GinRummyData.js (card helpers, layout, constants)
- public/src/games/ginrummy/GinRummyLogic.js (deterministic game engine)
- public/src/games/ginrummy/GinRummyAI.js (AI decision making)
- public/src/games/ginrummy/GinRummyGame.js (Phaser scene)
- server/scripts/verifyGinRummy.js (headless test harness)
Also updates game-icons/opponents assets and registers the game
in the server registry and game room scene dispatcher.
- Implement drag-and-drop rack reordering with animated slot indicator
showing where a tile will be inserted
- Preserve manual rack ordering across turn resets and draw actions
- Support dynamic table layout with proper margins for side opponents
- Reposition player portraits, buttons, and UI elements for 3-4 player
configurations
- Add point value labels below valid committed sets containing staged
tiles
- Scale up tiles slightly when picked up for drag feedback
Fix hitbox misalignment where Phaser's Container displayOrigin already
centers bounds, causing manual Rectangle offsets to double-shift.
feat: add Rummikub game with AI, immutable engine, and solver
- Implement full Rummikub gameplay: drag & drop, sets/runs, jokers,
table manipulation, opening meld rule, and scoring
- Add immutable game engine (RummikubLogic) following existing patterns
- Add rules solver (RummikubSolver) for set validation and AI planning
- Implement 5-level heuristic AI (RummikubAI) with configurable delay
- Register game in registry and routing, include tutorial markdown
- Add headless verification script (fixture tests + AI self-play)
- Add sprite images, speech audio, and animation videos for Nadia and
The Smasher opponents
- Update opponents.json with new character definitions and speech cues
- Fix 2048 UI: reposition buttons and add Leave button
- Implement complete 2048 game with Phaser.js scene and game logic
- Add customizable theme picker with multiple color schemes
- Include smooth tile slide, merge, and spawn animations
- Add sound effects (scifi-plink, scifi-plonk) and particle effects
- Track best score in localStorage
- Register game in server registry with icon frame 67
- Update Wordle name to "Wordle Race"
- Allow spell chaining within a turn (Puzzle Quest rule): casting a spell
no longer ends your turn, enabling multiple casts per turn followed by a
gem swap to pass play.
- Add procedural spell-icon textures (shield, swords, bolt, flame, meteor,
thorn, poison, dagger, banner, leaf) for visual spell feedback.
- Implement combat animations: skull-match convergence strike, spell damage
fly-in, spell heal burst with particle ring, HP bar flash, and floating
damage/heal numbers.
- Refactor HP and mana updates into separate `updateHpBar` and `updateManaBar`
methods so mana reacts immediately while HP drains at animation climax.
- Defer stun application until the caster's turn actually ends.
- Update tutorial and verification tests to match the new turn-passing rules.
Introduce Dot Link, a Flow-Free-style single-player puzzle game where players connect matching colored dots to fill the grid. Includes:
- Pure JS puzzle engine with deterministic board generation, DFS solver, and win validation (`DotLinkLogic.js`)
- Phaser 3 UI scene featuring a cyberpunk/synthwave theme, level select, daily runs, hint system, and smooth path-drawing mechanics
- Deterministic bank of 100 hand-tuned puzzles (`dotlink.json`)
- Node scripts for puzzle generation and verification
- Full integration into the app's preload, routing, and game registry
- Implement full game logic, scoring, and UI scenes for Cribbage and Canasta
- Add heuristic AI opponents with 5 skill levels and reaction delays for both games
- Cribbage: race-to-121 track, pegging, crib scoring, and cut mechanics
- Canasta: 108-card shoe, partnership melding, canastas, frozen/blocked piles, and go-out rules
- Include headless verification scripts (fixture + self-play tests) for both games
- Register new games in server registry and update scene routing
- Add tutorial markdown files and update game icon assets
- Add new tutorials for Labyrinth and Mexican Train with unique character voices
- Redesign Battleship and Mahjong tutorials with narrative themes and assets
- Implement AI-initiated trade proposals and counter-offer system in Monopoly
- Add AI-to-AI trading with rate-limited proposals and mutual benefit validation
- Enable tutorial flags for Labyrinth and Mexican Train in game registry
- Add new character assets and tutorial videos
- Add sprite images for Liberty Belle slot game (bell, diamond, heart, horseshoe, spade, star)
- Add sprite images for Fruit Frenzy slot game (bell, cherry, lemon, melon, orange, plum)
- Update slots-artwork.json to reference the new image assets