- Add swdbg-cards-art.png and swdbg-bases-art.png spritesheets
- Add corresponding PSD source files
- Update swdbg-artwork.json to reference new art assets
- Adjust card sheet frame height from 230 to 155
- Add hover-to-zoom preview popup for cards in both DungeonBoss and SWDBG games
(500ms delay, follows pointer, hides behind opponent videos)
- Add new artwork sprite sheets and update frame dimensions in JSON/config:
dungeonboss-rooms 300×200, spells 300×160, heroes 300×225, bosses 300×275
swdbg-cards-art 300×155 art window
- Introduce canonical CARD_ASPECT ratios and fitCardBox() for consistent card shapes
- Switch DungeonBoss opponent panels from dark to parchment theme
- Switch SWDBG card face from light to dark navy theme with updated accent colors
- Add setVideoVisible() to Portrait to pause videos during hover popups
- Update sprites.md documentation with new frame sizes and status
Implement two complete card games with full rule engines, AI opponents
(5 skill levels), procedural rendering, and drop-in art support.
Dungeon Boss: Boss Monster-style dungeon building game for 2-4 players.
Players build dungeons of rooms and spells to lure and defeat heroes,
harvesting souls to win. Includes 8 bosses, 31 room cards, 16 spells,
and 41 heroes with class-based baiting mechanics.
Star Wars Deckbuilder: 2-player deckbuilding game. Players build decks
from faction and neutral cards, purchase from the galaxy row, bounty hunt
enemy units, and attack bases. First to destroy 3 enemy bases wins.
Includes 90-card galaxy deck, 10 bases with abilities, and the Force
mechanic.
Both games include:
- Pure logic engines (rules-verified by headless test suites)
- Synchronous heuristic AI with skill-based decision quality
- Phaser scenes with vector-rendered procedural art
- Drop-in sprite sheet support via JSON mappings
- Tutorial documentation and art specifications
- Registration in the game registry and scene loader
Remove all server-side documentation (Express, SQLite, auth, email, uploads,
API routes, migrations, prerequisites for native bindings) and replace it
with accurate documentation for the fully static, buildless frontend:
- Quick start with any static file server
- Deployment to any CDN/object store
- 77-game catalog with categories
- Scene flow and local backend (localStorage, localApi shim)
- Word-game engines running client-side
- Project layout reflecting the no-server structure
- Adding a new game (updated for client-only flow)
- Developer tooling and data files
Reflects the migration from a Node.js/SQLite backend to a pure static site
using native ES modules and Phaser from CDN.
Unscramble 4 base words, then collect circled letters to solve a riddle
bonus answer. Includes a seeded puzzle generator (tools/genJumble.js),
a verifier (tools/verifyJumble.js), and 58 procedurally generated levels
with progressive difficulty.
Also:
- Fix Pai Gow Poker seat rendering to only draw active seats
- Reduce Pai Gow max players from 6→5, max opponents from 5→4
- Add track 19 ("Down the Line" by Journey) to music
- Add Michael opponent voice lines (terry, victor)
- Update game-icons sprite sheet
Change portrait asset keys from 'Checkers'/'Chess' to 'CheckersGame'/'ChessGame'
to match expected asset naming convention in createPlayerPortrait calls.
- Implement Azul (tile-drafting game) with full game logic, AI (5 skill levels),
spritesheet rendering, and animated wall-tiling/scoring
- Add Inês-flavored tutorial text and 96×96 tile spritesheet
- Register Azul in gamesRegistry, main.js, GameRoomScene, OpponentSelectScene,
and PreloadScene
- Add tutorial videos for Blokus and Chinese Checkers
- Update Blokus and Chinese Checkers registry entries with hasTutorial: true
- Add Klaxon (mecha) tutorial for Blokus and Kage (samurai) tutorial for
Chinese Checkers
- Fix TutorialModal close-button click fallthrough with transient shield overlay
- Add tutorial videos for Risk and Spire Climb
- Rewrite Risk tutorial with new narrator (Nadia, 4th Temporal Expeditionary Corps)
- Add new Spire Climb tutorial (narrator: automaton DV-8-2303)
- Mark Spire Climb as having a tutorial in games registry
Convert absolute root-relative paths to relative paths across all game
asset JSON configs (playfields, slots, shift, spireclimb) and tutorial
markdown files to fix path resolution.
- Change Maurice's opponent ID from "Maurice" to "maurice" for consistency
- Replace Phaser disableInteractive/setDraggable with removeInteractive for fleet locking
- Update development server port from 8000 to 3000 in start_web.sh
- 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