- Add HP text readout to battle animations showing 1-10 scale HP
(matching Advance Wars' classic HP display), with smooth tweening
- Extract cursor drawing into procedural texture, keeping it independent
of the UI sheet
- Add advancewars-ui.png sprite sheet and update artwork config
- Assign battle sounds to each unit type (gunfire, tank, cannon, missile, etc.)
and play the appropriate sound on attack/counterattack in battle animations
- Add per-unit-type movement sounds (march for infantry/mech, engine-fast,
engine-heavy) that loop during move animations and stop cleanly on completion
- Play jump sound during capture animation hops and activation sound on capture
- Play explosion sound when units are defeated in combat or crash
- Lighten unit tint relative to buildings so units remain visually distinct
when standing on captured buildings
- Add new audio assets: battle sounds, march, 8bit-jump, and update battle-tank
Introduce a new battle background spritesheet (advancewars-battlebg) that
displays context-appropriate backdrops behind each fighter during battle
cut-ins. The backdrop is selected based on the terrain/building type the
fighter is standing on (city, base, airport, port, plain, wood, mountain,
sea, reef, shoal, river, bridge, road, hq).
- Add battleBgSheet to artwork.json and asset manifest
- Implement playBattleAnim() backdrop system with terrain lookup
- Provide procedural fallback matching the real sheet's frame map for
art-free playability
- Mirror defender backdrops to match mirrored defender sprites
- Document the 14-frame sheet spec in sprites.md (256×256 cells, 5 cols)
Introduce a breathing pulse effect (red fill + white border) for attack
target tiles to draw the player's eye when in "must pick a target" fire
mode. The previous static tint is preserved for the indirect-range preview
shown while a unit is merely selected.
- showAttackTiles now accepts optional { pulse: true } parameter
- Added tween-based animation with Sine.easeInOut breathing effect
- Properly clean up pulse tween in destroy() and clearOverlays()
- Updated AdvanceWarsGame to pass pulse: true when showing targets
Introduce a cinematic capture animation when a unit captures a property:
a small window shows the capturing unit hopping atop the building, which
then squishes down to reflect remaining capture points (or pops back up
in the new owner's color if the capture completes).
- Add AdvanceWarsCaptureAnim.js with the full cut-in animation sequence
- Display remaining capture-points as a strength number on partially-
captured buildings, tinted toward the owner's color
- Add `before` field to capturing events so the animation knows the
starting HP
- Support partial unit sync so units are revealed action-by-action
during turn replay instead of snapping to end-of-turn positions
- Add depth bias so units always render above buildings on the same tile
- Add new unit sprite sheet (advancewars-units.png/psd)
- Slow down all battle animations for better readability:
- Attack, flash, death, and delay timings increased
- Unit movement animation duration increased (70→180ms)
- Explosion animation slowed down
- Post-turn wait time increased (140→300ms)
- Merge props and units into shared Y-sorted "actors" depth band
- Buildings and units now sort correctly by screen row
- Move/attack overlays remain below actors for proper decal rendering
Implement a full Advance Wars clone with campaign (20 missions) and
War Room skirmish mode. Includes:
- Headless game engine (AdvanceWarsLogic) with complete AW1 rules:
terrain movement, combat, capture, production, transports, fuel,
fog of war, CO powers, and multiple objective types
- AI opponent (skill 1-5, aggression/capture tuning) with BFS
pathfinding, threat evaluation, production counter-tables, and
fog trap awareness
- Canvas-rendered map view with procedural stand-ins that can be
replaced by drop-in painted spritesheets (no code changes)
- 11 playable COs with unique day-to-day modifiers and powers
(Hyper Repair, Lightning Strike, Tsunami, Meteor Strike, etc.)
- Campaign briefings with typewriter text and opponent portraits
- Comprehensive headless verification suite (rules, combat formula,
pathfinding, economy, capture, fog, CO powers, soak tests)
- New assets: terrain/building sheets, adventure music tracks,
game icon frame 86
- Refactor SpireClimb and SWDBG to use the shared soundtrack service
Introduce game-specific music overrides using the soundtrack service.
Adds arcadedark and hacker music packs, and wires them to Balatro,
Colorado Defense, Tempest, Mastermind, Hexsweeper, Dot Link, and 2048.
Games now lazy-load their soundtrack assets on entry instead of sharing
a single generic music cache.
- Introduce soundtrack override system allowing games to define custom music
- Add Nintendo-themed soundtrack for Super Kart (2 tracks with metadata)
- Make main menu track configurable via data/music.json instead of hardcoded
- Add MusicPlayer volume parameter for per-soundtrack volume control
- Lazy-load per-game audio assets via assetManifest on game entry
- Add SPACE/X keyboard shortcuts to advance Super Kart menus
- Play kart-spinner SFX when player picks up an item in Super Kart
- Increase speech queue volume to 1.0
- Add Super Kart icons artwork and additional music assets
- VictoryCamDirector: cinematic post-race camera system with shuffled
shot types (chase, orbit, front, trackside) and hard-cut transitions;
player can press ENTER to skip.
- Engine audio: per-racer engine hum (heavy/fast/medium) with pitch
tracking based on kart speed; engine-start sound at green light.
- Star power loop sound that stops when star expires.
- Positional audio: AI kart sounds (spin, hit, flatten) scale volume
with distance from player.
- Enhanced event sounds: item-use, boost, EMP, squash, bump, coin,
star now play appropriate SFX.
- Player kart autopiloted after finishing for victory-lap vignette;
race phase waits for entire field (up to 90s safety cap).
- EMP now emits target list for per-target shrink sounds; squash
collision emits event.
- Animated race results screen with staggered row reveals.
- Animated cup standings with running point counter and position
arrows; tweens rows to new ranks.
- Podium reveal: 3rd → 2nd → 1st staggered with confetti, count-up,
and CRT pulse; winner speech plays.
- Mode7 camera now tracks height and focal length; setCamera accepts
arbitrary poses for cinematic shots.
- New audio assets: engine-start/heavy/fast/medium/rev, kart-coin,
kart-flatten, kart-thump, kart-shrink, kart-spin, kart-hit,
kart-shell, kart-star.
- Super Kart: populate missing theme image paths, increase acceleration spread,
and add a track loading panel to the editor
- Civilization: display completion notifications for spaceship parts with
direct navigation to the building city
- Profile: implement export/import via .fcg files with validation, download,
and restore flows
- UI: add multi-button modal support, improve ProfileScene layout with avatar
masking and info card, and rename Arcade category to "Video Games"
- Add Coinage (1 shield → 1 gold) and Public Works (2 shields → 1 food)
special build options for cities, with remainder carry logic in shieldBox
- Update AI to fall back to producing gold or food instead of stockpiling
redundant defenders when nothing else is available
- Fix mid-build detection to check build.type before comparing shield progress
- Add City Screen UI for special builds: display gain per turn, color-coded
rows, and tooltips
- Only apply class-switch penalty when switching between unit/building
production types
- Add verification tests for coinage payout, public works remainder carry,
and AI special build fallback
feat(superkart): fix player kart scale + add missing backdrop images
- Compute PLAYER_KART_SCALE from MODE7 parameters instead of hardcoding,
keeping player and AI karts consistent at the camera's follow distance
- Wire up previously null backdrops: volcano, scrapyard, swamp, speedway,
nightcity
- Add beach theme artwork and register paths in artwork JSON
- Implement AI rubber-banding that scales AI top speed based on gap to player
- Configure engine classes with varying rubber-band strength (Cruiser most forgiving, Turbo least)
- Balance racer stats: boost Kona top speed, reduce heavy racer accel/handling
- Update verification script to validate new rubber-banding configuration
- Add new racer spritesheets (8 angles × 64×64) for all 9 racers
- Introduce KART_ROT_FRAMES constant as single source of truth for rotation frame count
- Update SuperKartMode7.angleFrame(), SuperKartGame frame math, and procedural fallback
to derive from KART_ROT_FRAMES instead of magic numbers
- Update data/superkart-artwork.json with asset paths and 8-angle metadata
- Update sprites.md documentation to reflect 8-view-angle contract
- Add superkart-background.png image asset
- Replace solid-color rectangle background with artwork in menu views
- Add semi-transparent shade overlay for better contrast
- Remove hardcoded title and tagline text (now baked into the image)
Complete kart racing game featuring 12 procedurally generated tracks
across 3 cups, 9 unique racers with distinct stats, headless physics
simulation, and a secret track editor (?superkart-editor=1).
Core features:
- Mode 7 ground renderer with parallax horizon backdrops
- 12 hand-tuned tracks (speedway, beach, swamp, scrapyard, volcano, nightcity)
- 9-racer roster with balanced archetypes (all-rounder, drift pirate, etc.)
- Headless race simulation for deterministic AI and headless verification
- Item system (bolt, seeker, oil, turbo, overdrive, emp, coins)
- Position-weighted item roulette and rubber-banding
- AI opponents with skill-based driving and stuck-recovery
- Full track editor with live preview, validation, and export
- 275 verification checks covering schema, physics, AI soak, and determinism
Data files: data/superkart-racers.json, superkart-rules.json, superkart-artwork.json
Game data: assets/gamedata/superkart/ (cups.json + 12 track files)
Tools: genSuperKartTracks.js, verifySuperKart.js
Add audio feedback for combat events by introducing unit-specific sound
effects that play during attack animations. Each unit in civilization-rules.json
now has a battleSound property mapping to appropriate audio assets. Adds 10
new MP3 files (arrows, cannon, catapult, gunfire-classic/modern, helicopter,
missile, submarine, sword, tank) and integrates playback in CivilizationMapView's
combat lunge animation.
- Add Tempest (Atari 1981 vector arcade clone) with full simulation logic,
Phaser rendering scene, vector font, and headless verification suite
- Register Tempest in games registry, main scene list, and game room dispatch
- Add reusable Tooltip UI component for hover-based information display
- Add Civilization unit/building tooltips in city screen and map hover
(CivilizationTooltips.js with flag and effect descriptions)
- Update Civilization click handling to distinguish hover-only from real
click targets via hoverOnly data flag
- Update civilization-units and game-icons assets
- Add bottom-right status log panel with scrollable entries, word wrap,
mask clipping, and mouse wheel scrolling; cap at 60 entries
- Replace toast popups with announceStatus() for major events (war, tech,
first contact, city founded, trade routes, huts) — centered modal with
CONTINUE button that animates into the log; supports queued popups and
custom onDismiss callbacks (e.g. first contact opens diplomacy)
- Add smooth panToTile() tween for camera movement when selecting next unit,
refactored clampPan into panBounds() reused by both clamp and tween
- Add classic city sprite sheet (civilization-cities-classic.png) and
register it in artwork JSON and asset manifest
- Replace circular civ rings and selection ring with isometric ellipses
matching the 2:1 tile ratio for better depth reading
- Paint tile neighbors in ascending c+r order during repaintTileAndNeighbors
to prevent tall features from being overwritten by lower-sum neighbors
- Stop panTween on pointer down to avoid conflict with manual dragging
- Add bottom-right status log panel with scrollable entries, word wrap,
mask clipping, and mouse wheel scrolling; cap at 60 entries
- Replace toast popups with announceStatus() for major events (war, tech,
first contact, city founded, trade routes, huts) — centered modal with
CONTINUE button that animates into the log; supports queued popups and
custom onDismiss callbacks (e.g. first contact opens diplomacy)
- Add smooth panToTile() tween for camera movement when selecting next unit,
refactored clampPan into panBounds() reused by both clamp and tween
- Add classic city sprite sheet (civilization-cities-classic.png) and
register it in artwork JSON and asset manifest
- Replace circular civ rings and selection ring with isometric ellipses
matching the 2:1 tile ratio for better depth reading
- Paint tile neighbors in ascending c+r order during repaintTileAndNeighbors
to prevent tall features from being overwritten by lower-sum neighbors
- Stop panTween on pointer down to avoid conflict with manual dragging
When a city cannot complete a build (e.g., size < 2 for settlers),
shields were accumulating past the build cost, showing confusing
values like "60/40 shields" or negative turn counts.
- Cap shieldBox at buildCost each turn in processCity
- Clamp displayed shields to min(shieldBox, cost) in city screen
- Add tests verifying shield capping and stalled build completion
- Add civilization-units.png sprite sheet (64×96 frames with 32px headroom)
- Animate unit movement along paths with smooth gliding after resolving logic
- Add city founding name prompt modal with TextInput and Enter/Escape support
- Support zoom-to-mouse-position via wheel, with extended zoom levels
- Flash-pulse End Turn button when no units have remaining movement
- Fix banner rendering with setSize instead of direct width assignment
- Adjust badge positions for taller sprite frames
- Decouple city name preview (peekCityName) from cursor consumption
- Set terrainSheet path to actual image file in artwork configuration
- Update civilization-terrain.png sprite sheet
- Reposition top-right HUD buttons 100px left for better spacing
- Hide player's fortified units inside cities on the map to reduce clutter
- Add garrison strip in city screen to view/unfortify garrisoned units
- Add "move or inspect" dialog when selecting a city with a movable unit
- Refactor moveTo into reusable method for cleaner click handling
- Make confirmDialog accept custom button labels
- Add civilization-terrain.png sprite sheet for terrain rendering
- Update ship sprite frame dimensions to match actual UQM rotation assets
- Parse .ani hotspot files to correctly center tightly-cropped ship frames
- Replace CRT overlay effect with native camera shake for hit/explosion feedback
- Fix camera zoom clamping to prevent ships from going off-screen on 16:9 display
- Correct ship rotation frame mapping (UQM sheets rotate clockwise)
- Add keyboard navigation to ship picker with focus rings and sound feedback
- Support both control clusters for hotseat and single-player ship selection
- Remove unused CRT overlay import and related cleanup code
- Update asset fetcher to handle per-frame hotspot alignment from .ani files
- Register Star Control in games registry as 2-player arcade game
- Import and register StarControlGame scene
- Add starcontrol slug mapping in GameRoomScene dispatch
- Load star-control-ships.json asset data in PreloadScene
- Add dynamic ship sprite sheet loading in asset manifest
- Update README to reflect new game in Arcade/Console/PC category
- Update game icons to include Star Control icon (frame 82)
- Chain reaction explosions: player kills trigger delayed secondary blasts
that can destroy nearby missiles (bounded to one extra tier)
- Inter-wave "COLORADO DEFENDED" recap animation showing surviving cities
(+500 each) and leftover missiles (+25 each) with tallying sounds
- Dynamic wave bonus: replaced flat SCORE_WAVE_BONUS with per-surviving-city
and per-remaining-missile bonuses, emitted in waveComplete event data
- Vector-style skyline: hand-authored Rocky Mountain ridgelines with snow
caps, building presets for varied city skylines, wireframe silos/cities
- Minimal VectorFont module for the recap banner text
- Curved CRT overlay: WebGL barrel-distortion pipeline with chromatic
aberration, sheen highlight, vignette, and pulse on impacts
- Three new 8-bit SFX: explode, explode2 (chain), count (tally)
- Updated verification tests for chain reactions, wave bonus breakdown
Add character assets (sprites/videos) and sound effects for Aiko, Blackwind,
DV-8-2303, Kage, Nadia, Nicole, and Steve.
Power overhauls:
- Extreme Ball: lasts 2 shots, cascade splits into 4 balls on 2nd bounces
- Cannonball: adds Space Blast-style explosion on green peg trigger
- Beam Up: retargets to a clear-path orange peg on return
- Overclock: lasts 2 shots, grants free ball every 6 pegs, pitch-rising hum
- Laser Sweep: follow-up sweep on random orange peg after 1s delay
- Shadow Slash: follow-up slash on random orange peg after 1s delay
- Cosmic Bloom: adds small Space Blast around green peg
- Rewind: glitch effect, portal opens targeting clear orange peg, refunds on drain
Add visual effects (shockwave rings, portal animation, glitch bars, split
particles), happy reaction dedup per ball, and comprehensive verification
tests for all new mechanics.
Add character assets (sprites/videos) and sound effects for Aiko, Blackwind,
DV-8-2303, Kage, Nadia, Nicole, and Steve.
Power overhauls:
- Extreme Ball: lasts 2 shots, cascade splits into 4 balls on 2nd bounces
- Cannonball: adds Space Blast-style explosion on green peg trigger
- Beam Up: retargets to a clear-path orange peg on return
- Overclock: lasts 2 shots, grants free ball every 6 pegs, pitch-rising hum
- Laser Sweep: follow-up sweep on random orange peg after 1s delay
- Shadow Slash: follow-up slash on random orange peg after 1s delay
- Cosmic Bloom: adds small Space Blast around green peg
- Rewind: glitch effect, portal opens targeting clear orange peg, refunds on drain
Add visual effects (shockwave rings, portal animation, glitch bars, split
particles), happy reaction dedup per ball, and comprehensive verification
tests for all new mechanics.
- Replace uniform orange peg selection with weighted sampling, favoring circle pegs over brick sections (~2:1 ratio) to keep gameplay peg-centric
- Rework Body Slam (The Smasher) power to launch at 0.7× speed with reduced gravity, aligning physics with updated power documentation
- Adjust orange/green peg counts for levels 26, 27, 30, and 32 to fine-tune difficulty
- Add Maurice character assets (PNG & MP4)
- Clean up redundant portrait emotion triggers and add verification tests for weighted sampling and slam ball behavior
- Multiball now spawns 3 additional balls fanned at ±18° instead of 1 mirrored ball
- Fireball scales ball radius by 3x
- Zen Ball grants 3 stacking charges, consuming one per shot
- Reduce base launch speed to 920 and add rotateVec utility for velocity rotation
- Update verification tests to match new power behaviors
- Add opponent portrait emotional reactions in SWDBG for expensive purchases and bounty defeats
Update PEG_TINT and PEG_LIT color constants to match the dominant fills
of the peg frames in peggle-sprites.png, ensuring procedural bricks and
fallback pegs stay in scheme. Document that these constants should be
re-sampled if the spritesheet is repainted.
Expand Peggle from 5 to 25 levels (5 per friend) with unique shapes and
progressive difficulty. Each friend block (Ethel, Kona, Zanthor, Fireball,
Victor) gets distinct names, backgrounds, and level layouts.
- Redesign level select: one row per friend showing portrait, name, power,
and their 5 level tiles
- Add friend intro screens: video (or portrait fallback), bio, and power
explainer before each friend's first level
- Intros skip on replay/try-again; input hold prevents accidental cannon
launches after UI clicks
- Add intro videos for Ethel and Kona; document the video system
- Update level generator with `pentagram()` helper and 5 variants per friend
- Verify block integrity, intro markers (1,6,11,16,21), and level name uniqueness
Introduce lazy loading for game-specific artwork to reduce startup time.
Game assets are now defined in src/data/assetManifest.js and loaded on
first entry via src/services/assetLoader.js, replacing the previous
approach of loading all game art in PreloadScene.
Balatro improvements:
- Add bump/shake animation to chips and mult counters on score changes
- Animate round score flying into the left-bar readout with explosion
- Fix tween cleanup during view swaps to prevent crashes
- Add planetSheet artwork path to balatro-artwork.json
- Introduce BalatroCrtPipeline for subtle CRT effects (scanlines, grain, glitch bursts)
- Attach CRT pipeline to main camera with event-driven pulse on boss rounds and game over
- Add frameIsBlank check to detect blank/unpainted texture frames and fall back to procedural cards
- Implement roundedArtKey and addRoundedArt for rendering art with rounded corners
- Update joker, tarot, planet, spectral, deck, shop, and voucher rendering to use rounded art
- Increase font sizes across UI elements for better readability
- Add border strokes to joker cards with custom art
- Trigger CRT pulse on high multipliers (x2+) and score announcements
- Reference art image paths in balatro-artwork.json
Add m6x11.ttf and register it via @font-face in styles.css. Use it as
the primary font throughout BalatroGame.js and BalatroViews.js (with
Julius Sans One as fallback), giving the game a consistent pixel-art
aesthetic. Update PreloadScene to warm the new font alongside
YummyCupcakes.
- Add Balatro-style hover tooltips for cards, jokers, consumables, shop
items, packs, and vouchers with detailed stat information
- Add a looping energy hum that climbs in pitch with the running score
- Add visual jitter to chips/mult boxes that intensifies with the hum
- Improve scoring animation by grouping events per card/joker anchor
- Stamp joker UIDs onto events for proper animation anchoring
- Add drag distance threshold to prevent accidental joker drags