Introduces Master of Vega, a turn-based 4X strategy game built on MOO1 rules with MOO2 conveniences. The implementation features a fully headless, deterministic engine (VegaLogic) with zero Phaser dependencies, enabling complete Node-based verification (809 checks) and reproducible galaxy generation via mulberry32 RNG.
Key features:
- Preset ship hulls with an auto-refitting Mark system and provably monotonic knapsack loadouts.
- Tactical grid combat with banked damage resolution to eliminate first-strike bias.
- Galactic Council diplomacy, stalemate-breaking, and invasion forecasting.
- Drop-in artwork compatibility with procedural stand-ins for all spritesheets.
- Hireable leaders (admin/captain) and colony building queues.
Architecture splits cleanly into headless modules (GalaxyGen, Logic, AI, Combat, Diplomacy, Ships, Leaders) and a render tier (StarMap, SystemView, CombatView, Screens, Nebula, Art, Fx). A comprehensive build plan documents 19 architectural traps discovered and resolved during development.
Registers the game in the registry, asset manifest, preload scene, and soundtrack service. Includes tools/verifyMasterOfVega.js for automated rule validation, art verification, economy balancing, and AI self-play soaking.
Introduce a second detection layer independent of line-of-sight vision.
Radar buildings (Radar Tower, Advanced Radar) provide coverage that reveals
unit positions through fog as contacts, while Radar Jammers can blind enemy
radar within range without affecting normal sight.
Key changes:
- Add three sensor buildings: Radar Tower, Advanced Radar, Radar Jammer
- Implement computeRadar() with jamming logic and stampDisc() optimization
- Add isDetectedBy() for radar contact detection
- Draw radar contacts as green diamond blips in WorldView
- Show radar contacts as neutral green pips on minimap
- Expand build grid to 2 rows and artwork sheets to 4 rows
- Refuse repair orders on airborne units; builders stop chasing airborne targets
- Add validation for radarRange and jamRange in rules compiler
- Update sprites.md documentation and add comprehensive tests
Introduce a two-layer domain system (ground/air) that separates units into
independent simulation layers. Air units ignore the nav grid, never collide
with ground units, and can only be targeted by weapons listing "air" in their
targets. Hover units gain water-crossing ability via the move class cost table.
New content:
- Fighter (air interceptor with AA cannons)
- Bomber (ground-attack aircraft with bomb rack)
- Hover Constructor (water-crossing builder)
- Airfield (produces all three air units)
AI gains air superiority management: interceptors hunt enemy aircraft instead
of joining ground pushes, and the production mix auto-counters observed enemy
air. Ground anti-air (rocket troopers/tanks) also gain targeting weight.
Rendering adds a dedicated depth band for aircraft above all ground actors,
plus a displaced shadow sprite for altitude perception. HUD tooltips display
domain and weapon targeting information.
Validation ensures domain/moveClass agreement, requires at least one anti-air
weapon when air units exist, and excludes air classes from corridor generation.
Comprehensive test fixtures cover domain separation, collision, splash, and
order handling.
feat(zuma): redesign level 7
feat(shift): add 9 new artwork pieces
chore: remove Worms game entirely
- Goo Tower: introduce `asleep` state for pile balls. Asleep balls ignore physics/wandering and cannot be picked up until they gain a clear line of sight to an attached structure. Adds zZzZz visual, editor toggle, auto-play filtering, and logic tests.
- Goo Tower Lvl 9 & Zuma Lvl 7: completely redesigned terrain, ball/pile positions, and pipe placement.
- Shift: register 9 new artwork pieces.
- Worms: remove all source files, assets, verifier, build docs, and game wiring.
Add new shift-themed artwork images (cat-on-tiger, flying-over-the-city,
japanese-road, octo-mecha, paris-in-rain, steampunk-sky-city, tiger-warrior)
and register them in shift-artwork.json. Update game-icons.png and .psd.
Add optional background image to the worms game mode select screen.
The image is loaded via asset manifest and displayed behind UI elements.
Reposition buttons to accommodate the new background layout.
Add Worms (inspired by Worms Armageddon) as a new arcade game with:
- **Procedural terrain** — seeded Island and Cavern generation, full destruction via `carveCircle`, girder placement, ROCK immunity
- **Bespoke physics** — worm locomotion (walk, jump, backflip, ballistic flight, fall damage), projectile simulation with wind/bounce/homing, ninja rope with corner wrapping, explosion geometry with linear falloff
- **16 weapons** — Bazooka, Grenade, Cluster, Shotgun, Uzi, Fire Punch, Dynamite, Mine, Air Strike, Homing Missile, Holy Hand Grenade, Blowtorch, Girder, Teleport, Ninja Rope, Skip Go (+ Surrender)
- **Match rules engine** — 45s turns, retreat phase, sudden death with rising water, crates, mines, oil drums, chain reactions, deterministic hash-based state
- **8 themes** — Forest, Desert, Farm, Hell, Arctic, Jungle, Construction, Space with full procedural palettes and drop-in art hooks (`data/worms-artwork.json`)
- **Phaser scene** — mode select, quick match setup, camera, HUD, weapon panel, slingshot aim, 2-player hotseat
- **Headless verifier** (`tools/verifyWorms.js`) — 207 checks across terrain, physics, weapons, and match logic; deterministic through the sim
- **Wiring** — registry (iconFrame 92), main.js scene registration, slug dispatch, asset manifest resolver, preload
Also updates `level-008.json` with new solid/spike geometry, additional balls and strands, and repositioned pipe.
Remove the entire Angry Birds implementation including physics solver,
game logic, Phaser scene, level data, verification tool, and registry
wiring. Also delete the build-plan documentation.
Meanwhile, upgrade Goo Tower rendering: spikes now have faceted steel
teeth with dynamic lighting, rust speckling, and twinkling glints;
lava features layered heat gradients, animated flow streaks, and
rising bubbles. Update gootower levels 6-7 and zuma level 6.
Replace the "ride the rim" gear mechanic with instant ball destruction on
contact. Update hazardAt(), resolveTerrain(), and all related tests.
Redesign level 5 ("Watch Out") and level 6 with new terrain layouts
featuring gear hazards, updated ball/pipe/pile positions.
feat(shift): paginate artwork selection and reveal on completion
Add page navigation to artwork cards when there are more than one page,
and fade in the completed artwork over the puzzle after winning.
chore: add 9 new Shift artwork entries
- Add gear.png and pipe.png sprite assets for GooTower
- Replace procedural drawGears() with rotated sprite instances for better performance
- Replace procedural drawPipe() with sprite art and separate procedural glow overlay
- Add patchy grass strips along top-facing terrain edges with variable depth and two-tone coloring
- Add mottled dirt texture pass clipped to polygon bounds
- Introduce helper functions (hash01, topFacingEdges, pointInPoly) for texture rendering
- Update asset manifest to include new gootower images
AngryBirdsLogic.js layers the game onto the Wave 0 solver: wood/stone/ice
plus TNT with distinct density, friction and fragility; damage as a health
model with crack stages rather than instant shattering; all 8 birds with
one ability per shot; scoring, stars, win/lose, and a stepSim -> events[]
contract the scene replays as FX.
The load-bearing discovery is that damage must read approach velocity, not
the solver's accumulated normal impulse. The accumulated value carries the
static load of everything stacked above: measured 3.4e5 at the base of a
10-block stone tower, above the threshold that should shatter wood. Wiring
damage to it makes tall towers quietly crush themselves at rest, and it
reads as a level-design bug rather than a physics one. prestep now also
publishes contact.impactImpulse — the momentum needed to stop the approach,
zero at rest by construction. Resting fell to 2.4e4 against real hits of
1.9e5 to 2.7e6, and the whole material table was calibrated by measurement.
AngryBirdsGame.js maps the 2400x1080 logical level through fixed sx()/sy()
helpers at scale 0.78 rather than zooming the camera, which keeps HUD text
in plain screen coordinates. Slingshot drag, ghost trails of previous
shots, level select, star tracking and progress persistence are in. A
follow-camera is deliberately deferred to Wave 5 — it is pure presentation
and cannot be validated headlessly.
Six starter levels ship as the Poached Eggs opening. All stand unaided,
none damage themselves on load, and a greedy aim sweep clears every one.
Registered as slug angrybirds, iconFrame 92, under Video Games.
tools/verifyAngryBirds.js -> 114 checks green. Peggle (909) and Excitebike
(620) still pass; Goo Tower's 2 failures are pre-existing and unrelated.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M1wNRvLLtyfCDAET7oYouf
Playtest fixes (two reports, both bugs):
- Bad ground no longer instantly crashes: holes and obstacles only
put you down above surfaceCrashSpeed; below that you bog to a crawl
that is capped under the crash speed, always escapable
- Steep ramps (45°) no longer crash: launch lifts the bike clear of
the lip, pitch is clamped to pitchMax, and landing angle is clamped
to landGroundAngleMax so straddled cliff edges don't count as
rideable surfaces
- Harness now drives every ramp at seven speeds; no crashes allowed
Wave 5 polish:
- Scenery: infield and apron shrub rows (bush, apronBush, tuft)
transcribed from NES track maps
- Ramps given readable silhouette (packed-earth hatch, dark stroke,
lit crest, sheer-face cut)
- Gaps show infield through lane; lane dividers and cool-zone
chevrons fixed for alternating-lane contrast
- Snow and night themes retinted for visibility
- iconFrame 91 already painted
Tooling:
- Map reader masks ramp columns to avoid false mud/cool-zone detection
- All 10 track qualifyMs retuned from playtest measurements
Updated build plan and sprites docs.
Address three fidelity issues found during Brian's playtest:
- Throttle: base speed 150→175, heat now chases a target (0.5 for A, 1.0 for B)
so holding A alone settles the meter halfway without stalling.
- Turbo: overheat window extended to 6–8 seconds (heatRiseRate 1/7s), turbo speed
275→235 against 175 base (57% boost). AI rivals now use hysteresis (heatOff/
heatOn) instead of feathering around a single threshold.
- Landing: tolerance is lopsided — rear-wheel-first is safe (landCleanBack 0.45 /
landHardBack 1.20), nose-down is strict (landCleanNose 0.32 / landHardNose 0.92).
Crash rates across banks dropped from 1.3–5.9 to 0.2–3.0 per 1000px.
Other changes:
- Qualify targets: max(human × 1.06, expert × 1.12) so a perfect ride has margin.
- Fix NaN in countdown caused by renamed heatRate constant.
- Soak bands re-based; added monotonic ordering check (expert > human > steady > naive).
- Title screen now shows controls and "LAND REAR WHEEL FIRST" hint.
- All 10 track qualifyMs values retuned to new physics.
- Generate 60 levels across 5 themed tiers (Downtown, Freight Yard, Airport Apron,
Construction, Night City) with guaranteed minimal and unsolved board states
- Rewrite generator (tools/genRushHour.js) with refine() pipeline that strips
redundant vehicles and re-hardens boards, plus hill-climbing phase B
- Add comprehensive verifier (tools/verifyRushHour.js) checking solver correctness,
structural criteria, MINIMAL/UNSOLVED properties, and curriculum shape
- Implement procedural vehicle art (RushHourArt.js) with baked textures, per-theme
decals (hazard, hivis, freight, neon), and themed board surfaces
- Move level bank to assets/gamedata/rushhour/levels.json and fetch on entry
instead of preloading at boot
- Restructure level JSON with tiers, level names, par, and difficulty metrics
(decoyDensity, targetRetreats, firstMoveFanout, carsMoved)
- Update level select to display tiers with themed swatches and color-coded labels
- Show level name and theme in HUD during gameplay
- Tighten hint solver with maxStates budget to prevent main-thread stalls
- Update PreloadScene to remove rushhour.json from boot-time assets
- Reduce pushSpeed across all 20 levels to ~60% of original values in
tools/genZuma.js, making the chain advance more slowly and giving the
player more reaction time. starScores() thresholds auto-adjust downward
since they are derived from pushSpeed.
- Add per-level background art (zuma-background-1 / -2) alternated per
level via a new `background` field in each level definition; draw it in
ZumaGame.drawBackground() over the solid fallback rectangle.
- Register the two new background textures and sfx-zuma-lose in the asset
manifest.
- Add playLoseFanfare() mirroring playStartFanfare() to duck/pause music
and play the lose SFX when the chain goes over the edge (onLost).
- Add a black stroke to the "ZUMA!" win banner for readability.
- Bump music volume to 0.5 in zuma-music.json.
Introduce underground tunnel sections to Zuma levels, letting the
chain roll out of sight and back in. Tunnels are arc-length intervals
on the path; while a ball is submerged it is inert — ignored by shots,
the laser sight, and explosions — and the path itself is drawn as a
faint buried trace beneath any live section that crosses it.
Engine (ZumaLogic.js): TUNNEL constants, normalizeTunnels, isHidden,
visibilityAt, pathSpans, sampleRange, nearestS; createLevel,
syncPositions, applyPower, stepFlights, and rayHit all honour
submersion. validateLevel lints mouth placement, spacing, and the
40% max-hidden fraction.
Game (ZumaGame.js): depth layer reorg so a live path always wins an
overlap with a tunnel stone; addPortal draws the two-layer maw (stone
below the chain, mouth above it); drawPit replaces the old skull with
a broken-stone collar and vapour swirl; startPitFall rolls the lost
chain over the lip in order, shrinking marbles into the dark; the
level-start fanfare ducks the soundtrack via MusicPlayer pause/resume.
Editor (ZumaEditor.js): new Tunnels tool with click-to-place,
drag-to-slide, right-click-to-remove, ESC-to-cancel; three graphics
layers (buried path, live path, handles) matching the game's
stacking; queueGameAssets so editor Test Play has the lazy art ready.
Art: ZumaPortal.js (carved serpent-head maw, symmetric so one
texture serves both ends) and ZumaPit.js (shaft of darkening discs
read as depth, not a painted circle).
Audio: four Zuma SFX (shoot, hit, start, explode) and a three-track
soundtrack wired through data/zuma-music.json and the asset manifest;
genZuma.js gains a tunnels column (fractions of path length) and
verifyZuma.js gains a tunnel test suite.
- Replace drawn ball textures with 32-frame rolling cycle + fixed specular
highlight, so marbles visibly rotate as they travel along the path
- Switch from Phaser Containers to a Layer for proper depth-sorted rendering
- Replace hand-drawn frog with assets/images/zuma/frog.png sprite sheet
(2 frames: base disc + slotted overlay for the mouth)
- Add ZumaEditor (/?zuma-editor=1): drag/insert/delete path points, move
frog, tune parameters, test-play, export bank or single level
- Increase BALL_RADIUS 24→32, BALL_SPACING 48→64, and rebalance all tuning
constants (catchup/pullback speeds, explosion radius, frog clearance)
- Extract geometry lint (validateLevel, validateLevelParams) into ZumaLogic
so genZuma.js, verifyZuma.js, and the editor share identical rules
- Rewrite genZuma.js with a Pen class (straights + circular arcs at uniform
STEP=70px) to avoid Catmull-Rom overshoot; regenerate all 20 levels
- Update verifyZuma.js aimbot soak: 8 seeds/level, ≥80% bank clear rate,
star curve calibrated above mechanical play
- Update level data: new coordinates, adjusted quotas/speeds/colors/scores
- Add new background images (background-01.png, background-02.png)
- Add background image to Zuma title screen with solid color fallback
- Add new depth layer for background rendering (D.bg)
- Style progress text with semi-transparent background rectangle
- Reposition game buttons grid lower on screen for better visual balance
- Register zuma-menu-bg asset in manifest for lazy loading
- Add Advance Wars and Zuma image assets (background, frog sprite)
- Add custom background image for Jewel Quest menu screens
- Remove redundant title/subtitle text from Jewel Quest class and level select screens
- Reorganize Jewel Quest UI layout with improved positioning and semi-transparent text backgrounds
- Update Jewel Quest level select grid and status text positioning for better visual hierarchy
- Add background backdrop to Shift game "Choose Your Image" title for improved readability
- Add background image support for Shift game menu screens
- Remove redundant title/subtitle text in Shift difficulty select
- Add nuclear explosion SFX for Total Annihilation commander deaths
- Extend _throttledSfx to support optional volume parameter
- Add gootower-bg to asset manifest
- Replace drawSky() with drawBackground() method that renders the background texture
- Display background when entering play mode
- Register 'chinese' music override for mahjong and mahjongmatch in soundtrack config
- Preload chinese-music.json in PreloadScene
- Lazy-load Chinese music assets via asset manifest for both games
- Update game scenes to use getGameSoundtrack() with volume support
- Update mahjong match background images (01, 02)
- Add background images for Bejeweled Blitz and Peggle menu screens
- Update asset manifest with new bg-bejeweled and bg-peggle-menu textures
- Bejeweled: use new background with fallback to existing bj-bg
- Peggle: replace title/subtitle text with custom background image
- Adjust Peggle progress text position to top-right corner
Idle builder units now automatically repair damaged allied structures
and units within their build range. A priority system ensures defensive
buildings are repaired before factories and other buildings. Auto-heal
orders are marked as non-player-assigned so explicit player orders
always take precedence. Builders can re-prioritize targets on a
retargeting cadence, similar to combat target acquisition.
Includes visual asset updates for TA arm and core units/structures.
Adjusts test to isolate passive self-heal from the new auto-heal mechanic.
Introduce three new entities:
- Rocket Trooper: anti-armor infantry with shoulder-mounted guided rocket
- Constructor: unarmed tracked builder to replace lost commander build capacity
- Advanced Vehicle Plant: 4×4 factory with doubled production bays
Update AI composition weights and counter logic for the new units. Fix
byDef map to use Object.create(null) so the "constructor" key doesn't
shadow Object.prototype.constructor and silently poison gap calculations.
Add procedural art shapes for all three, register proc shapes in TARules,
update sprite frame assignments, and add core-structures assets.
- Add TA-specific sound effects (machinegun, 50cal, rocket variants, unit/vehicle loss)
- Add background artwork and update core-units sprite sheet with correct path and dimensions
- Introduce pintle gun weapon with burst fire mechanics
- Switch weapon sounds to TA-themed audio; support sound arrays for random variant picking
- Add impactSound field to projectile weapons, propagated through sim events
- Reduce unit build times and increase structure HP for better pacing
- Enable idle breathing/rotation animations on resource generators
- Replace solid-color backdrop with painted background image on main menu
- Fix camera state cleanup so menus render correctly after gameplay
Bloxorz:
- Rewrite renderer with axonometric projection, rigid 3D box rolling, and continuous face shading
- Introduce new tile types: heavy switches (standing-only), soft switches, hold pads, fragile ground, split cubes, and teleporters
- Redesign all 36 levels using hand-authored ASCII maps in the generator, organized into six progressive acts
- Add design gates to verify solvability, mechanic necessity, and difficulty progression across acts
- Improve input handling with a directional compass, WASD/arrow key resolution, and smooth teleport/fall animations
- Update tutorial to document new mechanics and tile behaviors
Total Annihilation:
- Extend unit/building sight range to cover weapon max range + 2 tiles for improved fog visibility
- Implement crossfade between wireframe and finished sprites for building construction
- Switch to full-color assets by removing army tinting, and update artwork JSON paths/sizes
- Adjust weapon stats (damage, reload times) in rules
- Update sprites documentation to reflect the new visual pipeline
- Add Bloxorz as a new logic game with tutorial support
- Register Bloxorz in games registry, main scene, and game room dispatch
- Preload bloxorz.json artwork data in PreloadScene
- Fix arm-structures artwork path and frame dimensions for Total Annihilation
- Balance Total Annihilation weapon stats:
- Increase tankgun damage (95→145)
- Decrease rocketpod damage (130→80)
- Decrease towerlaser damage but increase fire rate (62→52, 1.4→0.4s reload)
- Decrease towermissile damage but increase fire rate (175→135, 4.5→1.5s reload)
Add a complete Total Annihilation clone including:
- TotalAnnihilationGame.js: Main scene with fixed-step loop, input handling,
camera controls, selection, orders, and match lifecycle
- TAHud.js: Resource strip with flow rates, selection info, build/production
grid, minimap with fog of war, and toast notifications
- TAScreens.js: Main menu, skirmish setup, campaign list, pause menu, and
victory/defeat results
- totalannihilation-campaign.json: 6 hand-authored campaign missions with
escalating difficulty (skill 1→5)
- tools/genTACampaign.js: Campaign generator that bakes terrain from the
seeded map generator
- tools/verifyTotalAnnihilation.js: 13-section end-to-end test suite covering
rules integrity, artwork, economy, pathfinding, combat, fog of war,
map generation, serialization, AI skill ladder, and campaign winnability
- tools/lib/taStubScene.js: Minimal Phaser stub for headless testing
Engine improvements:
- TALogic.js: Swept projectile collision (no tunneling), quadratic AoE
falloff, manual weapon support (D-Gun), unrecoverable elimination, onTick
callback for AI stepping
- TAAI.js: Skill-based economy ladders, simultaneous factory+economy growth,
sticky focus-fire, home defense gating by skill, tune/profile overrides
- TANav.js: fitField dilation for unit clearance, stale fit mask invalidation
- TAWorldView.js: _addWorld for layer ordering, frame-accurate zoom anchor
math, container depth sorting every frame
- TARules.js: autoRangeOf excludes manual weapons, manual flag compilation
Art & data:
- Mayan civilization artwork added to civilization-artwork.json
- Several opponents switched to mayan citySheet
- totalannihilation-rules.json: balanced unit stats, new commanderlaser weapon,
restructured AI skill tuning, formatted JSON
- sprites.md: complete art spec for drop-in PNG sheets
- Registered in gamesRegistry, assetManifest, PreloadScene, GameRoomScene,
and soundtrack service
- Add CivilizationCityMap.js: draws the 21-tile fat cross in the city screen
with terrain, specials, city sprite, pips, borders, units, and veiled tiles
- Replace fixed 28-row build list with a scrollable window; add shield cost
and turn-estimate annotations per build choice
- Add garrison display: fortified units shown as clickable roundels
- Refactor tileYield() to accept a `notes` array that records each rule's
delta, enabling accurate tooltips that can never drift from engine math
- Extract paintTerrainDiamond() and specialColor() from CivilizationMapView
so the city map and main map share identical rendering
- Add cityCentreYield() enforcing the 1-shield/1-trade market-economy floor
- Add cityTileStatus() for consistent worked/idle/taken/offmap classification
- Add describeCityTileTooltip() with terrain title, yield breakdown, missing
improvement explanations, and status line
- Wire improvementSheet and iconSheet paths in civilization-artwork.json
- Add comprehensive verifyCivilization checks for yield notes, centre floor,
tile status, tooltips, and build list capacity
Introduce active diplomacy where rival leaders approach the player with
requests, demands, trades, and gifts rather than passively waiting.
New CivilizationDiplomacy.js module handles:
- 9 request kinds (joinWar, breakTreaty, borderUltimatum, demandGold,
demandTech, techTrade, ceasefire, peace, alliance) with initiative
tiers so urgent calls to arms aren't drowned out by filler offers
- Cooldowns per (leader, target, kind) plus a per-leader gap so a
leader can't spam different requests to bypass rate limits
- Frustration grudge (0-100) raised by refusals, decaying each turn
and dragging attitude toward hostility through the ordinary war path
- Escalation: frustrated leaders demand compensation, then renounce
treaties at breaking point, with ordinary hostility finishing the job
- Border ultimatum promises checked when pledges expire (double penalty
for broken word)
- Unprompted gold/tech gifts from leaders with high attitude
- Staleness validation so requests the world invalidated are dropped
- AI-to-AI requests resolve immediately through the same pipeline
UI changes:
- AI requests queued on state.pendingRequests, presented via audience
popup at the start of the human turn (one per turn, configurable)
- Diplomacy screen shows ACCEPT/REFUSE with consequence hints until
answered; unanswered requests lapse with half-weight penalties
- New event types: treatyRenounced, pledgeBroken/pledgeKept, aiGift
- Leader dialogue for demands, refusals, gifts, and renouncements
- Tetris Attack menu gets a title art backdrop
Data/infra:
- diplomacyRequests tuning in civilization-rules.json (thresholds,
cooldowns, attitude weights, per-request config)
- Frustration, requestCooldown, lastRequestTurn, pledges fields on
civ state — all backward-compatible with old saves
- Full verification suite covering eligibility, resolution, cooldowns,
frustration arc, serialization, and fuzz testing
- Add japanese-themed city sprite sheet (PNG + PSD) and register in artwork config
- Switch several opponents to cyberpunk or japanese city themes
- Fix hut badge stale display by including tile coordinates in hut events and
repainting affected tiles immediately via repaintFromEvents
- Replace diagonal lattice world generation with hash-based jittered grid:
* Shield grassland now uses balanced 2x2 blocks hashed per position to remove
visible screen-space banding while preserving 50% density
* Special resources placed on jittered blocks with adjacency avoidance,
eliminating clumping and barren regions
- Update sprites.md paths and status markers to reflect completed sheets
- Expand verifyCivilization checks for shield density range and special placement
quality (no adjacency, balanced windows, no screen-column alignment)
- Update Tetris Attack dialogue with control instructions and typo fixes
- Implement per-character voice clip system (match, supermatch, win, lose) that
loads lazily per round and falls back gracefully when clips are missing
- Queue voices to play after arcade cues, with intelligent interruption handling
so only one line plays at a time
- Rename ensureRoundBackgrounds to ensureRoundAssets to handle both images and audio
- Reduce background music volume from 0.8 to 0.4
- Update character sprite sheet and document voice clip structure in sprites.md
Refactor Stage Clear narrative from battling opponents to helping friends.
Update character poses: friends cheer on clears and fret during danger.
Implement multi-line intro cutscenes with step-by-step progression and random background art.
Switch dialog to randomized arrays (introLines, winLines, loseLines).
Add new sound effects for Beth and Jerry.
Update validation and documentation to match new data structure.
Add new background images for Klaxon, Steve, and Victor characters
with 5 animation states each (r1-r5).
fix(civilization): resolve hotkey capture in city naming modal
Store hotkey list in this.hotkeyList to properly clear and restore
keyboard captures when opening/closing the city name input modal.
Previously, gameplay hotkeys prevented typing in the input field.
- Implement staggered tile pop animation: face overlay flashes on each tile,
then shatters into four quadrants that fly diagonally while shrinking/fading
- Play 8-bit card sound per tile, 8-bit action/win sounds for 4+/5+ tile clears
- Adjust character speed levels in tetrisattack.json (Jerry-1, Michael-2,
Steve-2, Victor-3, Klaxon-4)
- Replace cursor movement SFX with click sound
- Update advancewars-units and tetrisattack-panels sprite sheets and PSDs
- Add sfx-click and sfx-casino-win-8bit to preload and sound registry
- Replace hard-capped difficulty curves with exponential ramp function
that continues scaling deep into endless play without plateauing
- Reduce base speeds and shot counts for more deliberate gameplay
- Increase flipper, fuseball, and pulsar speeds for more pressure
- Flipper AI now chains hops toward the claw instead of resting,
making it a true pursuer rather than a shuffler
- Change zapper to refill +1 per level instead of full reset, making
charge management meaningful
- Death no longer resets the board: only enemies within threshold t
die with the player, others remain mid-climb
- Improve enemy shot hit detection with lane distance check instead
of exact lane match
- Add advanceShots() helper for cleaner shot advancement logic
- Update verification tests for new mechanics and difficulty curves
- Add michael background sprites and update tetrisattack characters
- Update superkart icons.png and icons.psd assets
- Add renamed background-jerry-r1.png (renamed from background-jerry.png)
- Add new background frames for beth (r2-r5) and jerry (r2-r5)
Restructure Tetris Attack Stage Clear from "clear all target panels" to a
multi-stage round system with a sliding boundary line.
Gameplay changes:
- Each character now has 5 stages instead of a single match
- A CLEAR line appears after a set number of rows rise, then rides the
stack upward; the objective is to clear everything above it
- Clearing a stage advances to the next: same board, faster speed, fresh line
- Stage progress is saved to localStorage; characters unlock sequentially
- Added a stage select screen with progress squares per character
Logic changes:
- Replaced `targetsTotal` with `clearLine` tracking and `countAboveLine`
- Added `advanceStage()` to resume play on the same stack one speed level higher
- Win condition now checks `countAboveLine() === 0` instead of target count
- Removed `target` flag from panels; panels below the line are irrelevant
- Continuous speed ramp via fractional `speed` per stage
UI changes:
- Clear line drawn as a pulsing bar with "◀ CLEAR" label outside the board
- "CLEAR LINE!" announcement on appearance, "STAGE N CLEAR!" banner on win
- HUD shows stage number instead of panel count
- Game over offers "Retry Stage", "Stage Select", or "Menu"
Asset changes:
- Backgrounds renamed to `background-{hero}-r{stage}.png` (5 per character)
- Lazy-load backgrounds per round instead of preloading all 30 images
- Updated tetrisattack.json with `stagesPerRound`, `stageSpeedStep`, and
per-character `clearLineRows`
Tests:
- Rewrote stage clear soak tests for the new mechanic
- Added stage round progression, speed ramp, and board preservation tests