Commit Graph

566 Commits

Author SHA1 Message Date
Brian Fertig 6b00371bdf feat(masterofvega): add ship commander videos, detail pop-over, and turn report
Introduce looping commander videos (256×256) alongside ship thumbnails in
the side panel and colony catalogue. Each species×hull combination loads
its officer clip from shipVideos, falling back to portrait video → still →
procedural sheet. A scene-lifetime pool (VegaShipMedia.js) prevents decoder
thrash on every panel rebuild.

Add VegaShipDetail — a full-resolution pop-over (D.detail depth 76) showing
the commander at 256px, hull at 192px, derived stat block, and knapsack
loadout. Opens from both the side panel and colony screen without stacking
through openModal.

Add a "New Turn" popup (VegaTurnReportScreen) that interrupts the player
for notable events (discovery, first contact, diplomacy, eliminations).
Events are classified and sorted by consequence in VegaTurnReport.js.
Logic now emits 'discovered' events when fleets enter unexplored systems.

Update asset manifest to load nested shipVideos, extend verification to
validate shipVideoKey conventions, bump ships sheet to 192px frames, and
document the new art contract.
2026-08-02 15:27:12 -06:00
Brian Fertig 6a0e8bfc47 feat(master-vega): add ship assets, jungle world, and species selection flow
- Add human ship spritesheet (ships.png) and increase frame size to 192x192
- Add jungle world background texture (world-jungle-01.png)
- Add human ship animation videos (scout, frigate, destroyer, cruiser,
  battleship, transport, colony)
- Enable species card selection with required choice before starting game
- Disable "Begin" button until a species is selected
- Add title logo breathing animation and light sweep effect on landing screen
- Reposition title and start button on landing layout
2026-08-02 14:07:53 -06:00
Brian Fertig 508feea4c9 feat(mastervega): split colony management into full-screen colony view
Move colony management (sliders, build queue, catalogue) from the
system-view modal into a dedicated full-screen colony view
(VegaColonyView.js). The system view now inspects worlds read-only
with a "View Colony" button to open the management screen.

Key changes:
- Add VegaColonyView.js with colony screen, build queue flyout,
  scrolling catalogue, allocation sliders with padlocks, and
  planet-type backdrops
- Add world backdrop artwork support (1920×1080, one per planet type)
  declared in mastervega-artwork.json worldBackgrounds
- Add headless queue helpers to VegaLogic.js: collapseQueue,
  moveQueueRun, colonyBuildRate, queueEtas, enqueueMany
- Fix star map pointer blocking (drags no longer pan map through modal)
- Move ORBIT constant to VegaScreens.js, add D.colony depth layer
- Update docs (build-plan, sprites) and verification suite

The colony screen stacks over the system view without requiring a
second modal, hiding the system layer and pausing the orrery while
open.
2026-08-02 11:49:33 -06:00
Brian Fertig c42851f09c feat: add flowing route previews and fix orrery depth sorting
Replace the static destination ring with a flowing dashed line that indicates the fleet's path and direction of travel.
Introduce setSelectedFleet to highlight specific fleet markers and track live routes for fleets already underway.
Fix depth sorting in the system view (orrery) by grouping bodies and sorting by Y position on every frame.
2026-08-02 09:01:43 -06:00
Brian Fertig b0efbe3a44 feat(mastervega): add star map command panel and fleet detachment system
Introduce VegaSidePanel, a right-hand command panel with three modes:
star (system summary), fleet (ship count selectors), and order
(distance, ETA, Accept/Cancel). Replaces the inline fleet-order flow
with a callback-driven architecture where the scene owns selection
state and the panel only reads the engine and reports clicks.

Add fleet detachment logic to VegaLogic:
- splitFleet: carve a new idle fleet from an existing one
- sendDetachment: validate against actual stacks, normalize duplicates,
  probe reachability on a copy, and rollback on refusal
- etaTo: compute ETA scoped to the selected detachment (slowest hull
  in the selection, not the whole fleet)

VegaStarMap gains blockPointer (prevent pan/zoom over the panel),
onEmptyClick (dismiss panel by clicking void), and a rotating selection
reticle.

Section 4b adds ~32 verification checks covering ETA accuracy, ship
conservation, out-of-range refusals, duplicate normalization, star-base
immobility, and the idle-fleet merge rule.

Updates mastervega-build-plan.md to document the new panel and
verification section.
2026-08-02 08:38:22 -06:00
Brian Fertig a16e59067b refactor(mastervega): remove Tooltip dependency, show unexplored stars, and use tech-aware habitability
- Remove Tooltip import and onStarHover callback from MasterOfVegaGame; system view now stays closed for unexplored stars until a scout arrives.
- Make VegaStarMap own its Tooltip via attachTo, replacing the removed onStarHover handler.
- Show unexplored stars at all zoom levels (dimmed) so they remain hoverable targets and display an UNEXPLORED tooltip.
- Split out habitableForEmpire from canColonize so the star map and tooltips use the same tech-aware habitability check (planet type + current planetology tech) instead of the static colonizable flag.
- Change starting exploration: only the home system is explored; all other stars remain unexplored until a scout physically arrives.
2026-08-02 08:10:01 -06:00
Brian Fertig 7f1cfcc982 fix(mastervega): build per-galaxy zoom ladder and eliminate pan slack
- Add VegaZoom.js with Phaser-free zoom ladder builder, verifiable headlessly
- Replace hardcoded ZOOMS array with galaxy-sized ladder anchored so the
  bottom rung exactly covers the viewport
- Remove 160 px of pan slack in clampPan so empty space can never be dragged
  into view
- Key semantic-zoom thresholds (isFarZoom / isNearZoom) to ladder index
  instead of absolute scale, keeping behaviour consistent across galaxy sizes
- Add section 3b to verifyMasterOfVega.js with 163 new checks covering
  ladder coverage, covering-zoom invariant, top-rung reach, and tiny-galaxy
  single-step collapse
2026-08-02 00:18:00 -06:00
Brian Fertig d789da4582 feat(masterofvega): add species portraits, speech, landing screen, and music
- Add video, still, and procedural three-tier portrait system for all 10 species
- Add species-specific speech clips and UI voiceover (SpeechQueue integration)
- Add landing screen with New Game / Resume / Return to Arcade buttons
- Add species detail pop-over with animated expand/collapse and auto-introduction
- Add game-specific soundtrack (masterofvega-music.json, 4 tracks)
- Add video asset type support in assetLoader and PreloadScene
- Add portraitVideos and portraitStills sections to artwork manifest
- Add verification for portraits, speech clips, and music tracks
- Update sprites.md with documentation for new assets and filenames
2026-08-02 00:04:06 -06:00
Brian Fertig 96179fe6f0 Character Portraits for Vega 2026-08-01 22:18:03 -06:00
Brian Fertig 91f63b76a2 feat: add Master of Vega (Master of Orion clone)
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.
2026-08-01 22:17:31 -06:00
Brian Fertig 390dadbc14 feat: add barbarian raiders system with warlord ransoms
Introduce barbarians as a non-diplomatic civ appended to state.civs,
providing escalating pressure that scales with difficulty and target
civ era. Key mechanics:

- Uprisings spawn on explored tiles, capped by a growing population
  limit to keep raids an event rather than a fourth empire
- Era-based pressure curve: raids decay as a civ advances, stopping
  entirely at hard-stop techs (industrialization/conscription/railroad)
- Killing hordes summons a Barbarian Leader with an escort; cornering
  the lone leader triggers a gold ransom scaled by era and difficulty
- Captured cities are either razed (small) or held inert (large)
- Leader expires after a set lifetime if not ransomed

Diplomacy and AI carefully exclude barbarians to prevent three traps:
shared-enemy attitude pollution, permanent war phase pinning, and
government ladder lockout. Pre-feature saves remain compatible.

New assets: optional civilization-barbarians.png sheet (8 frames).
Updated sprites.md and unit tooltips. Comprehensive verification tests
added in verifyCivilization.js.
2026-08-01 18:18:36 -06:00
Brian Fertig d5f5e8981a feat(excitebike): add cool-zone speed boost and cooldown feedback
- Allow bikes to exceed normal turbo speed when holding through cool
  zones with turbo engaged, rewarding track knowledge
- Emit 'cooldown' event when entering cool zones to clear center msg
- Add coolZoneBoostSpeed tune constant (240) with design documentation
- Update physics invariant checks to use new speed cap
2026-08-01 15:44:17 -06:00
Brian Fertig b42a71bf2f feat: add radar detection system with jamming and contacts
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
2026-08-01 14:51:05 -06:00
Brian Fertig 71e455650b feat: introduce dedicated armor classes for air and fortifications
Add `air` and `fortification` armor classes to enable more nuanced
balance. Aircraft now use `air` class instead of light/medium, and
defensive turrets use `fortification` instead of `structure`, allowing
weapons to specialize against planes and defenses without affecting
other targets.

- Add armor classes to all 12 weapons with appropriate multipliers
- Adjust weapon stats (sniperrifle, rocketpod, shoulderrocket)
- Reduce HP on several combat units for balance
- Reclassify aircraft and defensive turrets to new armor classes
2026-08-01 14:02:22 -06:00
Brian Fertig ac063d34a6 feat(total-annihilation): overhaul command system, patrol routes, and Commander death sequence
- Add repair and rally command buttons with custom glyphs and tooltips
- Refactor bottom command bar into a structured, discoverable grid with
  visibility filtering per selection type
- Replace patrol's there-and-back with a circuit-based route system;
  CTRL-clicking extends the patrol instead of stacking orders
- Builders guarding structures now repair damage first, then assist
  production — assist to producing factories now works correctly
- Add Commander death cascade: nuclear blast, outward vaporization wave,
  and screen-wide flash timed to the audio sample
- Introduce `fortification` and `air` armor classes; rebalance weapons,
  unit HP, and ranges across the roster
- Remove the static hint line; all commands now have prompts and button
  tooltips instead
- Add verification tests for patrol routes, guarding builders, vaporised
  entity rendering, and the full command bar
2026-08-01 13:56:41 -06:00
Brian Fertig f9e971b305 feat(totalannihilation): overhaul flight model to strafing behavior
Replace hover-based aircraft movement with a two-state system: LANDED
(grounded, cannot shoot, vulnerable to all weapons) and FLYING (at
cruise speed, uses air domain protection). Aircraft can no longer stop
in mid-air; armed units execute strafing passes with overshoot and
come-about logic.

Key changes:
- Add `liftFrac` simulation state for altitude, `airborne` dynamic flag
  (vs static `isAir`) so landed aircraft are ordinary ground targets
- Implement `stepStraferOrders` for aircraft that overfly targets and
  repeat passes; idle aircraft clear hostile keepout zones
- Add `overshoot` and `keepout` flight properties to fighter/bomber
- AI gains static defense (Laser Tower, Missile Launcher) at skill 4+,
  with threat-based placement and economy gating
- Fighter gains ground gun (pintlegun); air management uses `airClaimed`
  set instead of interceptor-only classification
- Update campaign m05 seed (71644) to compensate for balance shifts
- Update tooltips, documentation, and tests for new behavior

Closes #1234
2026-08-01 13:15:58 -06:00
Brian Fertig c56182bb10 Shift Artwork Additions 2026-08-01 11:52:23 -06:00
Brian Fertig 2b6132031a feat(totalannihilation): add flight animation and factory production dials
- Add `flight` blocks to Fighter, Bomber, and Hover Constructor in rules JSON
  defining height, takeoff time, and landing time
- Implement purely cosmetic altitude system: units ease upward when given
  orders and settle back down when idle, using smoothstep easing
- Shadow stays pinned to ground position, fades in and shrinks as altitude
  increases — the gap between body and shadow sells the height
- Health/build bars move with the lifted body; selection ring stays on ground
- Add production dials (progress pies) on the player's own factories:
  top-left shows whole queue progress, top-right shows unit on the bench
- Pass real delta time to render() for framerate-independent takeoff animation
- Update sprites.md with flight system docs and art implications
- Add stub scene support and comprehensive verification tests
2026-08-01 09:41:03 -06:00
Brian Fertig cff1f02d9b feat: add air domain system with fighters, bombers, and hover units
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.
2026-08-01 09:00:37 -06:00
Brian Fertig 793cb249f9 feat(gootower): add sleeping goo mechanic and redesign levels
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.
2026-07-31 23:37:48 -06:00
Brian Fertig 4c0b04613a feat: add 7 new shift artwork assets and update game icons
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.
2026-07-31 19:22:16 -06:00
Brian Fertig 95b200022c feat(worms): add background image to mode selection screen
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.
2026-07-31 18:06:39 -06:00
Brian Fertig 2268c74918 **feat: add Worms game with full physics, weapons, and procedural terrain**
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.
2026-07-31 16:33:37 -06:00
Brian Fertig 94e2152918 remove Angry Birds game; enhance Goo Tower visuals
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.
2026-07-31 16:29:49 -06:00
Brian Fertig 78c61c1cd5 feat(gootower): make gears lethal hazards; redesign levels 5-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
2026-07-30 23:09:59 -06:00
Brian Fertig 221f1d428a feat(gootower): replace procedural gear/pipe with sprite art and add terrain textures
- 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
2026-07-30 20:39:17 -06:00
Brian Fertig 4dab1ac7d5 Elongate goos for the pipe. 2026-07-30 20:01:21 -06:00
Brian Fertig d8296940e5 Suck into pipe effect for goos 2026-07-30 19:54:18 -06:00
Brian Fertig e1b1ab2bab feat(gootower): add background parallax, dynamic level bounds, ball eye animations
- Add background parallax layer that follows camera pan/zoom at a reduced
  rate for depth perception
- Replace fixed world-height Y clamping with dynamic level content bounds
  computed from terrain, pipe, and balls
- Add per-ball eye wander and desynchronized blink cycles for livelier
  ball rendering
- Reorder pickBallAt priority so direct clicks on detachable attached balls
  take precedence over loose balls, preventing accidental structure detachment
2026-07-30 19:38:37 -06:00
Brian Fertig c12371b654 feat(angrybirds): Waves 1-2 — playable core, 8 birds, level bank, wiring
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
2026-07-30 19:07:16 -06:00
Brian Fertig 9ecbc9589f feat(angrybirds): Wave 0 — deterministic rigid-body solver
Angry Birds is fundamentally a rotating rigid-body stacking game, and
neither existing engine could be extended into it: PeggleLogic collides a
moving circle against static pegs with no rotation, and GooTowerLogic has
no angular state at all because its rigidity is emergent from
triangulation. Matter.js ships in the CDN Phaser build but is not
importable in bare Node and not reproducible, which would forfeit the
verifier, the generator's measured star thresholds, and the editor's
winnability gate.

AngryBirdsPhysics.js is a bespoke solver: convex polygons and circles,
uniform-grid broadphase, SAT with reference-face clipping to 2-point
manifolds, sequential impulses with warm starting keyed on stable feature
ids, Coulomb friction, split-impulse position correction, and island
sleeping.

Split impulse rather than plain Baumgarte is the load-bearing choice.
Biasing the real velocity makes penetration proportional to load, so the
bottom contact of a 10-box tower sank ~9x deeper than the top and the
stack sagged 12.85px. Correcting position through a discarded
pseudo-velocity removes a fixed fraction of the excess per substep
regardless of load; sag is now 0.46px per contact, exactly the slop band
we deliberately allow.

Gate: 10-box tower settles in 0.68s and sleeps with <1px drift and 0.35
degrees of tilt; friction holds on a 15 degree slope and slips on 40;
replay is bit-identical and frame-rate independent; 40 monkey seeds
produce no NaN, no overspeed and no sinking.

tools/verifyAngryBirds.js -> 51 checks green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M1wNRvLLtyfCDAET7oYouf
2026-07-30 18:47:18 -06:00
Brian Fertig abb55d6d7b excitebike: playtest fixes and Wave 5 polish
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.
2026-07-29 23:06:41 -06:00
Brian Fertig 81aa6e00a8 fix(excitebike): rework throttle, heat model, and landing after playtest
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.
2026-07-29 22:34:29 -06:00
Brian Fertig 4e818ad104 Excitebike 2026-07-29 22:05:21 -06:00
Brian Fertig a6573726ff Goo Tower and Zuma Changes 2026-07-29 19:50:51 -06:00
Brian Fertig 052417aa9a feat(rushhour): redesign level bank, procedural art, and tiered curriculum
- 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
2026-07-28 22:12:55 -06:00
Brian Fertig dbc1c64d51 Zuma Level Refactor 2026-07-28 21:33:36 -06:00
Brian Fertig eabeef3165 tune zuma: slow down ball push speed, add per-level backgrounds & lose fanfare
- 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.
2026-07-28 17:54:23 -06:00
Brian Fertig 0201b0de7d feat(zuma): add victory fireworks finale with time bonus payout
Add a chain of explosions that runs from the last match location to the
pit on level completion, distributing the time bonus across each blast.
The sequence ducks the soundtrack during the finale and plays the win
jingle as the chain reaches the edge, then resumes music before
revealing the victory banner.

- Register new `sfx-zuma-win` audio asset in the manifest
- Track last clear position (lastClearX/lastClearY) from match/explosion events
- Add `nearestS` to ZumaLogic for sampling the path at a world coordinate
- Implement `playVictoryFireworks()` orchestrating the timed explosion chain
  with configurable step/gap tuning constants
- Add `victoryExplosion()` for a brighter additive flash + particle burst
- Remove premature `SFX.VICTORY_SHORT` play in favor of the win jingle timed
  to the finale
2026-07-28 17:27:14 -06:00
Brian Fertig 10165547ae Add tunnels to Zuma: editor, engine, art, and audio
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.
2026-07-28 17:20:11 -06:00
Brian Fertig 27b8c23a82 refactor: consolidate path rendering styles into shared PATH_STYLE constant
Move path band widths, colors, and groove properties out of ZumaGame
hardcoded constants and into a single PATH_STYLE config in ZumaLogic.
Both ZumaGame and ZumaEditor now draw the path using the same nested
band strokes for a consistent concave-channel appearance.
2026-07-28 07:27:13 -06:00
Brian Fertig d08b48cdda chore(zuma): increase pushSpeed and starScores for all 20 levels
Significantly raise pushSpeed values across all levels (roughly 4x increase)
to make the game more challenging. Updated corresponding star score thresholds
proportionally. Adjusted editor UI max pushSpeed to 400 and updated validation
constraints to match.

Changes affect:
- data/zuma.json: level definitions with new pushSpeed and starScores
- src/games/zuma/ZumaEditor.js: editor input max value
- src/games/zuma/ZumaLogic.js: validation range
- tools/genZuma.js: generator table values
2026-07-27 23:15:44 -06:00
Brian Fertig 8e4e48e540 refactor(zuma): overhaul marbles, add level editor, rebalance levels
- 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)
2026-07-27 22:54:42 -06:00
Brian Fertig b3dafbbdf7 feat: enhance Zuma menu with background image and improve UI layout
- 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)
2026-07-27 21:01:48 -06:00
Brian Fertig 1ad2942241 Added Characters and Backgrounds to Puzzle Mode on Tetris Attack 2026-07-27 19:31:51 -06:00
Brian Fertig 7de6b71776 feat(tetrisattack): add Endless mode hero rotation
- Shuffle hero roster at game start for varied playthroughs
- Cycle through heroes as player levels up (backgrounds, portraits, names)
- Emit levelUp event from logic engine when row emergence triggers level up
- Lazy-load hero assets (backgrounds + voice) on first display
- Update HUD with "WITH" text and hero portrait in Endless mode
- Skip unsuffixed fallback backgrounds to avoid unnecessary load errors
2026-07-27 18:50:06 -06:00
Brian Fertig 391795c6a0 Shell Clean-Up on level changes in Super Kart. 2026-07-27 17:35:35 -06:00
Brian Fertig 59a5d0606e refactor(gootower): draw strands as pinched goo shapes instead of lines
Replace simple line-based strand rendering with filled polygon shapes that
are thick at the ends and pinched thin in the middle, with curved edges
and perpendicular sag for a drooping arc effect. Strands now connect
smoothly to balls with tangent-aligned edges.
2026-07-26 19:26:25 -06:00
Brian Fertig b6e7d932cd feat(gootower): add edge-pan camera control, intro animation, and debug zoom
- Add edge-based camera panning when zoomed in (50px threshold from screen edges)
- Add cinematic level intro animation: zoom to pipe, pause, then pan to initial structure
- Block user input during intro animation to prevent interference
- Add optional debug zoom level display (toggled via DEBUG_ZOOM constant)
- Clean up intro animation and debug text on level reset
2026-07-26 18:43:17 -06:00
Brian Fertig f1c4289f0f feat: enhance Jewel Quest and Shift game UI/UX
- 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
2026-07-26 18:00:47 -06:00