- Add `requiresCapital` ability gate to card definitions
- Rework TIE Fighter: constant boost → action that draws a card if you control a capital ship
- Rework Darth Vader: constant +4 attack while Force is with you (removed damage ability)
- Rework Cassian Andor: onBounty trigger forces opponent discard on galaxy row kills
- Rework Luke Skywalker: onPlay destroy enemy capital ship if Force is with you
- Centralize ability requirement checks via `abilityGatePasses()` helper
- Apply gate checks to onBounty, onPlay, and onReveal triggers
- Add Force track shift SFX (light/dark variations) with randomized playback
- Update verification tests for new card behaviors
- Scale HP and soul icon font sizes by font factor in hero cards
- Pass isHoverPreview when revealing hero cards at expanded sizes so
text scales appropriately (same logic as hover-zoom popup)
- Redesign makeSeatHeroCard to match makeHeroCard layout:
* Class-color outer border for all heroes; epic heroes get a thin
gold inner accent instead of replacing the outer border
* Top-aligned art window with class-color bar beneath it
* Center art/glyph vertically within the art window area
- Filter pendingBuild rooms from hand display to avoid duplicates with
build zone card-back placeholders
- Refactor adventure event session-end handling:
* Deduplicate resumeIdx lookup and simplify boundary logic
* Handle cascading session ends when a hero's kill/wound ends the
round, deferring remaining events to onSessionDrained callback
Introduce showAdventureImpactText() to display centered, animated text
when heroes are wounded or killed during adventure battles. Text pops in
with scale, shakes/pulses, then fades out before continuing.
- Show "Soul Captured" message when hero dies
- Show "was wounded" message on hero defeat
- Chain onDone after full animation completes for proper beat sequencing
Store pre-walk entrance snapshot and seed the entire hero row when the
adventure modal opens, rather than waiting for heroEnters events to
stream in. This fixes the issue where only a subset of heroes were
visible initially, since the engine may have already shifted heroes off
the entrance queue before events reach the UI.
- Add _advEntranceSnapshot to capture pre-mutation hero queue state
- Add seedHeroRowFromEntrance() to populate all heroes at modal open
- Fix hero row pitch (heroRowN) so it never reflows mid-session
- Refresh snapshots in react/window decision path (bypasses applyDecision)
- Use moveToStage() in playEnterStep for consistent hero positioning
Add ADV_SESSION_END_MARKERS to detect when a round or game ends as a
direct continuation of resolving a mid-walk window choice. Previously,
neither event carried a `.seat` nor was a walk-resumption type, so
ADV_RESUME_MARKERS alone couldn't detect this boundary.
Now, when events contain 'roundEnd' or 'gameOver', split them so the
modal closes before playing anything from the new round/game-over
screen, preventing narration/step queue folding into the current session.
Extend the card draw animation system to support town hero and epic reveals.
Add hero and epic configurations to DRAW_FULL_W and DECK_PILE_POS.
Update flyCardFromDeck to handle hero/epic cards and accept a configurable pause duration.
Introduce _pendingHeroRevealUids to suppress town rendering until fly-in animations complete.
Enhance heroRevealed event handling to trigger the full fly/flip/shrink sequence.
Adjust event timing delays to accommodate the longer animation.
Remove lastStep state in favor of pendingSettleStep, deferring room card
settlement until the next step advances. This allows Continue/Spells UI to
appear immediately after a room's damage animation ends, rather than waiting
for a separate return-home tween.
- Add flushPendingSettle() to defer and execute card return-to-row animations
- Extract playNextAdventureStep() from advanceAdventureStep() for clearer flow
- Auto-chain bossWound steps without opening mid-walk windows (boss wounds
are final and shouldn't pause for reactions)
- Add skipAdventurePauseMarkers() to correctly detect when event queue is
truly drained past pause markers
- Flush pending settle in driveAdventureWindowDecision() before processing
spell-window decisions
- Sync hero row for heroes entering after a live window pause
Fixes timing issues where UI state and card animations were out of sync,
and ensures heroes entering after an adventure pause get their cards shown.
Add a "Spells" button during adventure room windows allowing the human
to cast hand spells targeting the hero currently mid-crawl (not just
entrance-queued heroes). The adventure modal stays open across the cast,
narrates spell effects as banners, and correctly resumes the walk
afterward without skipping rooms.
Key changes:
- New `adventurePause` walk type and `ADV_RESUME_MARKERS` to mark the
boundary between a cast's own effects and resumed walk events
- `findHero` now locates heroes in `adv.walking.hero`
- `showPickModal`/`showReactModal` accept custom callbacks to stay
inside the adventure modal session
- `driveAdventureWindowDecision` routes window/react decisions to the
modal UI instead of closing it
- AI window/react turns are computed and revealed via a "has cast:"
overlay before applying
- `applyAdventureWindowChoice` applies choices directly to the engine,
splits events into narration vs resumed walk, and plays banners
- New event types (`roomBoosted`, `heroHurt`, `heroHealed`, `heroFeared`,
`heroTeleportMarked`, `heroesBlocked`, `soulBurned`, `handReset`)
render as banners in the narration pipeline
- Two new verification tests for mid-walk targeting and fearHero safety
- SWDBG: add animated buy sequence with funding arcs, center-screen reveal,
and face-down stow to discard/deck
- SWDBG: introduce stable row slot tracking so bought/lost cards don't shift
neighbors; add ghost cards for pending animations
- SWDBG: add end-of-turn discard animations preserving old-hand positions;
emit endTurnDiscard events from logic
- SWDBG: add deep-dive Buy/Attack buttons for actionable cards; refactor
dealCardAnimated with startAs/flipTo/keepAlive support
- SWDBG: add drawArcArrow/drawArcArrows for converging attack visuals on
bounty kills and base attacks
- Dungeon Boss: add mid-walk advRoom casting window after room events,
letting players react to damage/kills during hero crawl
- Dungeon Boss: track walking hero in publicView and entranceHeroesOf so
spells and AI heuristics can target mid-crawl heroes
- Dungeon Boss: replace pre-bait token snapshot with overlay system —
pending bait heroes stay in town with fly-in tokens; pending draw cards
show card backs until animations land
- Dungeon Boss: keep heroes in battle zone after roomHit/pass instead of
returning them immediately
- Update images, registry (defaultPlayfield), and verifier (advRoomCasts)
- Animate card draws, plays, and row refills with smooth flight transitions
and mid-flight reveal flips during initial deal
- Introduce slot helper methods for consistent card positioning across
renderers and animations
- Show opponent hand as face-down fan with visible draw/discard pile counts
- Track pending card UIDs to prevent rendering cards mid-animation
- Support game-specific default playfields via gamesRegistry
- Add guardFreshButton to prevent accidental clicks from pointer event bubbling
- Add Starscape and Fantasy playfields; set Starscape as default for Star Wars
- Add interactive deep-dive card inspector that highlights gameplay-relevant
zones (cost, attack, resources, force, HP, bounty, unique) with callout
boxes, leader lines, and tooltips on hover
- Support custom card back sprites via cardBack prop with fallback graphics
- Reorganize human area layout: center base/capitals/units on a shared
play row (y=730) and position squad readout relative to force track label
- Add draw/discard pile display in hand area with card back graphics
- Fix HP badge rendering to appear above rules text
- Adjust action button and prompt text vertical spacing
- Shorten game name from "Star Wars Deckbuilder" to "Star Wars"
Introduce a step-by-step adventure battle modal that replaces the old
fixed-delay fx when heroes walk through a dungeon. The modal shows the
hero queue and dungeon layout, then plays hero-by-hero, room-by-room
with battle animations, a play-by-play log, and Continue-gated progression.
Key changes:
- Adventure battle modal with hero/dungeon rows, battle zone, log panel,
and Continue button; handles room hits, trap kills, boss wounds, and
hero deaths with animations
- Split adventure walk events correctly across mid-walk decision pauses
using pre-mutation dungeon/hero snapshots captured in applyDecision()
- New phase wheel UI (Round Start / Build / Bait / Adventure / Round End)
with spinning animation and icons, driven by new phase events
- Replace heroToken circles with miniHeroCard portraits at entrance gates,
with shrink animation from town to gate size during heroWalks
- Support proxy dragging from hover previews and deep-dive modal
- Add renderInto() to Portrait.js for static portrait copies in the modal
- 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