- 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
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
- 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
- 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
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
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
- 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 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
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
- 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
- Add new image assets for Gold Rush slot game (bandit, dynamite, pickaxe, saloon, sheriff, wagon)
- Add new image assets for Sugar Spin slot game (bear, berry, cane, chocolate, jelly, lollipop, mint, rainbow)
- Add cabinet and card artwork for all slot games (Liberty Belle, Fruit Frenzy,Lucky Sevens,Sugar Spin)
- Update slots-artwork.json with paths for all new and existing slot assets
- Modernize Mastermind tutorial language with casual/colloquial tone
Add sprite images and UI elements for the dragons-hoard slot game:
- Symbol sprites (dragon, gem, knight, castle, chest)
- Cabinet and card background images
- Update slots-artwork.json with image paths for all symbols
This completes the visual asset integration for the dragons-hoard game theme.
- Replace turn.kept running sum with priorKept + selectionScore model so the
banked total always reflects all set-aside dice in the current cycle, enabling
higher N-of-a-kind bonuses when extending sets.
- Update bestScoring and hasScoring to consider setAsideDice; use brute-force
subset search (feasible for ≤6 dice) instead of greedy strategy for correctness.
- Add breakdownScoring helper to decompose a combined dice set into labeled groups.
- Add updateExplainPanel showing "Prior rolls", scoring groups, and total with
"(need 500)" note when off-board requirement isn't met; format scores >999 as K,DDD.
- Refactor selectionScore/selectionValid to score the combined set (setAsideDice + selection).
- Use bestScoring(rolled, setAsideDice) in onScoreAll and AI for optimal picks.
- Fix scratch paper preview to use priorKept + selectionScore consistently.
- Add hot dice handling: carry cycle score into priorKept and reset setAsideDice.
- Slots: guard card artwork loading to avoid errors when texture is missing; adjust bulb positions accordingly.
- Add new slot machine themes: Pharaoh's Fortune and Abyssal Treasures
- 10 symbols each with corresponding PNG assets
- Cabinet artwork for both themes
- Update slots-artwork.json with image paths for all new symbols
- Reformat registerGame calls in registry.js for consistency
- Update slots iconFrame from 54 to 63
Adds complete artwork and configuration for two new slot machine themes,
bringing the total registered games to 63.
- Add new "Colored" playfield type that generates textures from JSON-defined color schemes
- Create colored-playfields.json with 10 curated color themes (Midnight Aurora, Sunset Horizon, etc.)
- Add dropdown selector in OpponentSelectScene to choose between color schemes
- Generate colored playfield textures dynamically using canvas gradients at game start
- Display theme preview in playfield selection UI with CSS gradient rendering
- Integrate colored playfield loading and default application alongside existing playfields
- Add TIME_BONUS constants (flame: 10s, star: 10s, hyper: 15s, mult: 5s)
- Display "+X Seconds Added!" banner when special gems are triggered
- Apply accumulated time bonuses at the end of each cascade phase
- Cap time at BLITZ_SECONDS maximum
- Add 5 new shift artwork images and update shift-artwork.json
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
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
- 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
- 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 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
- Introduce Balam (spriteIndex 16) and Steve (spriteIndex 17) as new opponents
- Include full speech configurations (intro, happy, upset, pick) for both characters
- Add 12 new MP3 speech files for Jerry (intro, happy, upset, pick)
- Update opponents.json to include Jerry's speech configuration
- Fix HoldemLogic to exclude folded players from seat order calculation
- Add new `pick` audio clips for each opponent in `opponents.json` and corresponding MP3 files
- Implement a spectrum visualizer overlay for opponent portraits that activates during pick speech playback
- Integrate `SpeechQueue` to handle opponent pick audio with start/stop callbacks for the visualizer
- Add `setMenuMusicVolume` utility and adjust menu music volume during opponent selection
- Prevent speech/visualizer triggers during initial scene load and game start sequences
- Add 22 new MP3 speech files for characters Jeff and Fireball
- Update public/data/opponents.json to include speech arrays for both characters
- Each character now has intro, happy, and upset speech categories with 2-5 variations
- Add speech assets and configuration for Brad and Mario
- Update opponents.json with new speech arrays for intro, happy, and upset states
- Prevent discarding cards while cards are staged in Phase 10
- Add visual feedback (_shakeStagingButtons) when staging rules are violated
- Add _hasStagedCards helper to check staging group state
- Move staged cards back to hand if user attempts to discard during staging
- Introduce a canvas-based audio visualizer overlay on opponent portraits that activates during speech playback
- Update `SpeechQueue` to support `onStart` and `onEnd` callbacks for hooking into audio events
- Modify `Portrait` to trigger the visualizer with emotion-specific colors (blue for intro, green for happy, red for upset)
- Add `speech` metadata to `opponents.json` for Ethel and Bernie, defining available intro/happy/upset audio clips
- Ensure proper cleanup of visualizer state and resources on portrait destruction
- Implement `SpeechQueue` to manage opponent dialogue clips
- Add `speech` configuration to opponent data (Cy-Bro, Victor, Croc) with intro, happy, and upset states
- Trigger random speech clips in `Portrait.js` based on emotion and a 60% probability
- Play intro speech clips when opponent portraits are created
- Update `MusicPlayer` volume to 0.15 and clean up formatting/whitespace
- Sort player's hand by suit and value for consistent layout
- Implement drag-to-sort functionality for the local hand with visual feedback (slot indicators, card displacement, play zone highlighting)
- Refactor pass confirmation to include multi-phase animation: outgoing cards fly to target, incoming cards animate in from source, flip to reveal, and settle into sorted positions
- Add background to hearts broken indicator for better visibility
- Update card interaction handlers to support both click and drag events
- Introduce `MusicPlayer` class for in-game music with shuffle, skip, and mute controls
- Add `MenuMusic` utility for background music in menu scenes
- Load music tracks and metadata via `music.json`
- Implement drag-and-drop for SkipBo cards with visual feedback
- Add card flight animations for Phase 10 AI actions and player draws
- Update Phase 10 AI turn timing and reduce delays for smoother gameplay