Commit Graph

264 Commits

Author SHA1 Message Date
Brian Fertig 72f44178b0 feat(mastervega): add Colonies screen for empire-wide colony management
Introduce VegaColoniesScreen.js, a spreadsheet-style screen that displays
and manages all of the player's colonies at once, grouped by star and
sorted by population. Features include:

- JIT-loaded advisor video panel (one 1:1 muted loop per species, falling
  back to the species portrait when no clip is recorded)
- Retro terminal with typing animation, scanlines, and glitch effects
  that displays advisorColonyReport commentary for the selected colony
- Inline Colony Focus and Allocation Focus pills with dropdown pickers
  showing the advisor's live recommendation outlined in yellow
- Population transfer (arm-and-target idiom matching fleet orders)
- Manage button delegating to the existing single-colony flyout

Refactor VegaColonyView.js to use shared applyColonyFocus and
applyAllocationFocus setters from VegaLogic.js so both the flyout and
inline pills apply identical side effects. Add empireColoniesByStar
grouping helper for the spreadsheet view. Wire a "Colonies" entry into
the Empire dropdown menu in MasterOfVegaGame.js. Add advisorVideos
entries to mastervega-artwork.json with JIT-loading helpers in VegaArt.js.
Update verifyMasterOfVega.js to validate the new assets, lazy-loading
behavior, and all new logic functions.
2026-08-11 20:10:40 -06:00
Brian Fertig f150737004 Button Changes 2026-08-10 23:06:42 -06:00
Brian Fertig 167fdd6e3f refactor: replace scanline with diagonal shimmer and add orbiting border lights to VegaButton
- Replace horizontal scanline sweep with an occasional diagonal shimmer effect
  that crosses the button face at a 22° angle with a 1.5s pause between passes
- Add three white border lights that slowly orbit the button's stroke outline
  (~3.6s per full revolution), drawn above all other layers
- Reduce corner brackets from all four corners to upper-right and lower-left
  only, matching the chamfered panel's 45° cuts
- Extract reusable perimeter utilities (_computePerimeter, _perimeterPoint)
  cached once at construction to avoid per-frame arc-length recomputation
- Wire shimmer and border lights into hover enter/exit and destroy lifecycle
2026-08-10 21:43:34 -06:00
Brian Fertig 4c3b17610a refactor(mastervega): consolidate HUD buttons into Empire dropdown and fix ghost button styling
- Replace four separate HUD buttons (Research, Diplomacy, Council, Leaders)
  with a single "Empire" dropdown button, freeing HUD space for future
  buttons like "Colonies"
- Add toggleEmpireMenu/openEmpireMenu/closeEmpireMenu with a popover panel
  containing the four options, click-outside-to-dismiss, and ▸/▾ indicator
  on the button label
- Fix ghost button glow washout by introducing GHOST_ALPHA (0.85) constant
  and using it instead of hardcoded 0.3 alpha for ghost button backgrounds
- Change ghost button hover text color from glow color to textDark for
  consistent readability
- Remove unused glowHex from SCHEMES config
2026-08-10 21:30:15 -06:00
Brian Fertig e1b5ae7277 refactor(mastervega): cyberpunk button skin, fleet mix, orbit-aware targeting, and diplomacy guards
- Add VegaButton.js: a Master of Vega-local cyberpunk button with chamfered
  panels, neon glow, scanline sweep, and corner-bracket hover animations.
  Supports cyan/magenta/red/green schemes.

- Swap Button imports across 12 Vega modules to use VegaButton.js and add
  scheme options (green for accept, red for reject/war, magenta for actions).

- Fix multi-colony targeting in VegaLogic.js: introduce targetColonyAt() to
  resolve the correct colony by orbit when multiple exist at a star. Update
  bombard(), invasionForecast(), and invade() to accept an optional orbit
  parameter. Add immediate scene.log() feedback in VegaSystemView.js.

- Implement weighted 4:3:2:1 fleet mix (frigate:destroyer:cruiser:battleship)
  in pickFleet(), replacing the old equal-count-per-hull diversity logic.

- Add BASELINE_WEAPON fallback in VegaShips.js so warships with zero weapon
  tech still deal damage instead of silently doing nothing.

- Guard VegaDiplomacy.js proposeOrOffer calls with canNegotiate to prevent
  diplomacy-incapable species (e.g., Lithox) from queuing peace offers the
  human can never answer.

- Update verifyMasterOfVega.js with comprehensive tests for all new behavior.
2026-08-10 19:37:57 -06:00
Brian Fertig c105ebd23c feat(mastervega): promote V2 combat engine with performance, formation, and UI overhauls
- Promote VegaCombatV2 to the official combat engine.
- Performance: manual sqrt replaces Math.hypot, spatial grid collision avoidance, and per-side ship cap (100) with largest-remainder proportional sampling. Overflow fleets resolve via V1's cheap aggregate math.
- Combat: replace uniform grid placement with formation-aware layouts (Power Pressure, Speed Swarm) using per-ship avoidRadius. Add lead-pursuit targeting to fix gap-closing issues. Add centering force to keep battles on-screen.
- UI: add commander roster with procedural static for wiped types, move building icons below text, add direct war/peace toggle for diplomacy-incapable species.
- Test/Docs: add verifier checks for pursuit, formations, centering, spatial grid correctness, and 790-ship battle performance. Document design traps and fixes.
2026-08-09 22:15:27 -06:00
Brian Fertig bfaee613c9 feat(mastervega): retune frigate/destroyer agility, fix battleship braking, add V2 damage multiplier and species beams
- Hulls: frigate turnRateBase 150→340, brakeSeconds 11→1.0 (X-wing agility);
  destroyer turnRateBase 100→230, brakeSeconds 2.8→1.35 (midpoint leaning frigate).
- Fix battleship (and all slow hulls) no longer holding position: added
  anticipatory retrograde pre-turning in computeShipMove, comparing
  worstTurnTime vs timeToRange so the nose begins flipping before braking
  range, with urgency-blended facing to avoid "running away" appearance.
  (Was accidentally crutched by strong avoidAccel collision avoidance.)
- Fix parked ships coasting indefinitely: velocity now starts from 0 when
  hasTask is false instead of carrying residual velocity forever.
- V2 damageMultiplier (2.8): scales weapon raw output before shield
  mitigation, V2-only, doesn't touch live engine balance. Shortens battle
  duration meaningfully across test scenarios.
- V2 maxDurationSeconds (240) and disengageFraction (0.9): decoupled from
  shared rules.combat.maxRounds. Counterintuitively, the old disengage
  timer was an implicit duration cap; extending it let genuine fights play
  out while damageMultiplier handles the shortening.
- Species-colored beams: VegaCombatViewV2.js now renders beams in a
  vibrant, saturation-boosted version of the firing ship's species color,
  memoized. Missiles keep fixed orange.
- Mirror-match bias tolerance widened 0.25→0.30 (expected variance cost
  of lower TTK from higher damage multiplier).
- Frigate stationary-target check inverted: now asserts it CAN hold
  position (alongside battleship/cruiser/destroyer). Added agility ordering
  data-integrity checks on hulls block.
2026-08-09 16:02:02 -06:00
Brian Fertig 07efb69b38 feat: real linear momentum with size-scaled brake authority
Implement continuous velocity vectors (vx/vy) replacing the old
kinematic position clamp. Each hull gets brakeSeconds-derived
linearAccel so stopping distance naturally falls under or over beamRange,
producing battleship hold-position vs frigate strafe-run behaviour
without hull-specific tactic branches.

Key mechanics:
- Thrust magnitude scaled by facing alignment (cos of angle to task
  direction), honouring "turn and engage thrusters" without locking
  thrust to facing (which caused battleships to never stop).
- GOLDEN_ANGLE-spaced approach points fan out ships sharing a target.
- avoidAccel (60) is a gentle, hull-independent collision avoidance
  budget — ships can overlap when objectives require it.
- Target avoidance uses reduced radius (0.35×) so engagement isn't
  fought by personal-space calculations.

Data: add brakeSeconds to all hulls, avoidAccel to combatV2 constants.
Verifier: rewrite turn-rate check to time-to-range metric, add hold-vs-
strafe gradient and max-delta-speed checks, relax cloak/singularity to
"doesn't hurt" invariant.
2026-08-09 14:04:02 -06:00
Brian Fertig 77e27e2a8e feat(mastervega): add V2 per-ship combat prototype with continuous-time simulation
Introduce `VegaCombatV2.js`, a parallel headless combat engine that simulates
individual ships (not stack aggregates) in continuous time rather than discrete
rounds. Ships have per-hull `sizeScale`, `sizeSpeedMult`, and `turnRateBase`
fields; every entity tracks its own cooldown, position, facing, and angular
momentum. Damage and movement are banked per-tick to preserve fairness.

Accompanying files:
- `VegaCombatViewV2.js` — zoomable/pannable Phaser view with parallax starfield
- `VegaCombatCamera.js` — cursor-anchored zoom + drag-to-pan (listener cleanup
  on destroy to avoid stacking across battles)
- `VegaFormations.js` — formation strategy plumbing (chosen per side, not yet
  read by movement/targeting)
- Hull-specific destroy audio cues and vega buildings art

Wired behind `?movsim`'s Live/V2 toggle in `VegaCombatSim.js` — the live engine
and all real player battles are untouched.

Also fixes several latent bugs discovered during the rewrite:
- Trap 26: simultaneous wipe-out now checks draw before single-side wins
- Trap 27: movement is banked (two-phase) like damage
- Trap 28: weighted-random targeting tames chaotic nearest-neighbour sensitivity
- Trap 29: fleet gap clamped to 85% world width to prevent starvation
- Trap 30: `RANGE_EPS` tolerance prevents steering-induced standoffs

See `docs/mastervega-build-plan.md` for full design notes.
2026-08-09 12:36:01 -06:00
Brian Fertig 3dee8a251a feat(masterofvega): add combat SFX, cloak/singularity mechanics, and sound staggering
Move vega audio files into assets/fx/vega/ subdirectory and register them via
assetManifest.js. Add weapon and missile sound cues banded by ship Mark, with
staggered playback in VegaCombatView to prevent audio clipping during barrages.

Wire up two previously inert tech effects in combat:
- Stealth Field (cloaked): applies a flat accuracy malus via cloakEvasion rule.
- Black Hole Generator (singularity): adds passive shield pierce via
  singularityShieldPierce rule on every weapon fired by the design.
Update tech descriptions, ship detail display, and designFor() to reflect
these effects. Fix a bug where singularity was never copied into the design
object.

Add vega-endturn cue to End Turn / Next Round buttons (no-op when busy),
remove hardcoded audio loads from PreloadScene, and add verification tests
that isolate each flag with A/B battle comparisons.
2026-08-09 07:57:41 -06:00
Brian Fertig 016f91349a Add Master of Vega combat simulator (`?movsim`)
Introduces VegaCombatSim, a standalone dev tool for tuning and
testing VegaCombat. It allows configuring attacker/defender fleets
(or fleet vs planet), watching animated battles on the real tactical
screen, and running batch trials for win-rate statistics. Both paths
use the exact same VegaCombat stepper as the live game.

Also fixes a transport unit amount default (1 → 0) in
VegaColonyView and corrects a music file reference in the JSON
data file.
2026-08-09 00:01:15 -06:00
Brian Fertig 6a24ccd137 feat(mastervega): add advisor recommendation system with lazy diplomacy music loading
Introduce an advisor recommendation system that suggests colony focus
(improvement, research, fleet, growth, trade, defense) and allocation
slider presets (growth, production, military, research, default) for
each colony. Recommendations are computed by pure heuristics that
consider population levels, factory utilization, empire-wide fleet
strength, war status, and building availability.

UI changes:
- Colony Focus and Allocation Focus flyouts display "YOUR ADVISORS
  RECOMMEND" banners with explanatory text and pulsing arrow indicators
  pointing at the recommended row.
- Selecting a recommendation arms quiet-period tracking (15 turns) so
  advisors don't nag immediately after the player makes a choice.
- `checkAdvisorRecommendations` fires once-a-turn `advisorRecommendation`
  events when current settings diverge from live recommendations. Events
  use dedup markers (`focusNotifiedValue`, `allocNotifiedKey`) that clear
  on match, ensuring a persisting mismatch doesn't repeat every turn but
  a later divergence is reported fresh.
- Turn report screen gains an "Advisor Recommendation" event type with a
  "View Colony" shortcut button.

Performance change:
- Stop eager-loading `diplomacy.bySpecies` music tracks in
  `assetManifest.js`. A playthrough may contact only a handful of the
  nine species, so pre-fetching all nine at room entry wastes bandwidth.
  `VegaMusic`'s own `new Audio()` at `setDiplomacy()` time is the actual
  fetch — this manifest was only ever a race to get there first.

Logic changes:
- Extract shared building-ID lists and a `firstEligibleBuildingId` helper
  to eliminate duplication between auto-queue pickers and the recommendation
  heuristics.
- Add `advisor` tracking object to every colony (with migration in
  `deserialize`).
2026-08-08 22:07:51 -06:00
Brian Fertig b061f8eab5 feat(masterofvega): add Colony Focus autopilot and diplomacy audio
- Introduce Colony Focus: a per-colony autopilot that auto-queues one
  building/ship per turn when the queue is empty. Supports seven modes
  (manual, improvement, research, fleet, growth, trade, defense) with
  cost-aware affordability checks matching AI behaviour.
- Add Allocation Focus: one-time slider presets (default, research,
  growth, production, military) that bulk-overwrite channel allocations.
- Refactor colony view flyout into a shared drawer supporting queue,
  colony focus, and allocation focus modes with in-place swapping.
- Replace "Built here" text with hoverable building icon row and
  tooltips on the colony screen.
- Add per-species audience music tracks and diplomacy music ducking when
  seeking/planning an audience.
- Add sound effects for star selection, zoom in/out, and colony view
  opening.
- Back-fill `focus: 'manual'` on old saves for forwards compatibility.
- Add verification tests exercising each focus mode in isolation.
2026-08-08 19:34:12 -06:00
Brian Fertig 8cb6988ded feat(mastervega): add 10-slot save/load system, game menu, and sound effects
- Implement 10 manual save slots with metadata (turn, year, empire, species, date)
- Add ☰ game menu button with Save, Load, Return to Main Menu, and Quit to Arcade
- Replace generic sounds with 7 custom Vega sound effects (select, build, close,
  newturn, unit, view, warp)
- Introduce uiClick() helper to standardize click sound across all modal screens
- Update research video paths for umbrix and rrashaa species
- Refactor button handlers in all Vega screens to use uiClick() pattern
- Save/load uses scene restart via pendingSavedState for clean HUD/map teardown
2026-08-08 17:32:11 -06:00
Brian Fertig 223c1fd191 Implement dynamic leader hiring costs and improved assignment UI
- Add scaling leader hire costs based on number of leaders already owned (costScalePerOwned: 0.5), making it progressively more expensive to hire multiple leaders and preventing cheap roster stockpiling
- Add leaderHireCost() function in VegaLogic.js to calculate scaled hire costs
- Add unassignLeader() function to allow removing leader assignments
- Update AI in VegaLeaders.js to use dynamic pricing when deciding to hire leaders
- Add research videos for ursaal, kkrix, and mekhan factions
- Enhance leader screen UI with:
  - Dynamic cost display reflecting current scaling
  - Fleet labeling showing ship composition and location
  - Assign/Reassign buttons with list picker for colonies (admins) and fleets (captains)
  - Unassign button for posted leaders
  - Better location display for assigned leaders
2026-08-08 14:10:32 -06:00
Brian Fertig b721b6221e feat(mastervega): expand diplomacy, trade, espionage, and map rendering
- Add full diplomacy subsystem: tiered gifts (BC payments with diminishing returns), trade agreements (passive BC income, coexists with treaties, cancelled on war), and espionage mission toggles (Off/Steal/Sabotage) in the Audience screen.
- Implement whole-galaxy diplomacy passes: border and fleet proximity tension, fleet intrusion tracking with escalating penalties and force-opened Audience complaints, and "enemy of my enemy" attitude triangulation.
- Update Audience screen UI with new action buttons, gift picker, intelligence toggle, and species-specific chat dialogue for all diplomacy events.
- Add research choice prompts for ambiguous tech frontier picks, surfaced before the turn report.
- Improve star map: Delaunay triangulation for controlled-space range darkness, staggered docked fleet markers, expanded pan slack to clear UI chrome, and zoom-aware colony info labels.
- Backward-compatible save serialization for new diplomacy fields.
- Add comprehensive test coverage for all new logic, chat completeness, and AI soak validation.
2026-08-08 13:44:14 -06:00
Brian Fertig d8d127f33a feat(mastervega): add research choice prompts, Delaunay-controlled-space corridors, and map UX improvements
- Introduce VegaResearchChoiceScreen for ambiguous tech selections: when
  a player completes research that opens a 2+ way choice rung, they're
  prompted before the turn report to pick their next technology.

- Add VegaDelaunay.js (Bowyer-Watson Delaunay triangulation) and use it
  in VegaStarMap to draw "controlled space" corridors/fills between the
  player's own colonized stars instead of a blanket radius.

- Improve star map UX: stagger docked fleet markers per-star, add
  PAN_SLACK so edge stars can be dragged out from under the side panel,
  and show colony info bars at mid-zooms with text only at near-zoom.

- Add `closable` option to modalShell so forced-choice screens can
  suppress the ✕ button.

- Export buildVideoPanel from VegaResearchScreen for reuse by the new
  choice screen.

- Update artwork JSON: rrashaa and cerebrai audience videos now use
  species-specific clips; add intro-human.mp3 and new video assets.

- Add tests for openResearchChoices and pendingResearchChoices filtering
  logic in verifyMasterOfVega.js.
2026-08-08 08:39:45 -06:00
Brian Fertig 582b9acfc7 feat(mastervega): add second branching pass with 20+ new alternate techs and fieldTechLevel
- Add 21 new alternate techs across all 6 fields (computers, construction,
  forcefields, planetology, propulsion, weapons), using icon frames 78-96
- Set research video paths for human and kestrelli species
- Expand tech sprite sheet from 8 to 10 rows to accommodate new frames
- Add fieldTechLevel() to VegaLogic: displays per-field level as highest
  known tier × 5 plus extra known techs below the frontier
- Display field level in research screen headers
- Add verification tests for 3-way branching rungs, fieldTechLevel calculations,
  and refine availability roll tests to measure unbranched rungs only
2026-08-07 22:28:13 -06:00
Brian Fertig 27aff33429 feat(mastervega): redesign research screen tech tree and add direct navigation
- Replace vertical "research ladder" list with a visual tech tree rendered as
  connected node badges showing prerequisites and branch structure
- Add `initialField` parameter to `openResearchScreen` to open on a specific
  category instead of always defaulting to the first one
- Add "View Research" shortcut button on turn report when a tech completes,
  jumping directly to that field
- Add Cerebrai species research video (research-cerebrai.mp4)
2026-08-07 21:49:03 -06:00
Brian Fertig 97dbe18dd2 feat(mastervega): implement MOO1-style branching tech rungs and corrected racial cost model
- Add branching tech alternatives across all six fields (computers,
  construction, forcefields, planetology, propulsion, weapons). Each
  branched tier has 2+ techs sharing the same rung; researching any one
  clears the rung while leaving siblings researchable as side-picks.

- Correct racial skill to affect tech COST only (Poor 125%, Average 100%,
  Good 80%, Excellent 60%), not availability. Availability is now a flat
  50% roll per tech (75% for Cerebrai/psilon analogue), with a safety
  net that no branched rung can end up with zero available options.

- Add techRungsByField data structure and rungCleared/canResearch/setResearchTarget
  logic so the research screen lets players pick among open rung alternatives
  without losing banked beakers.

- Update sprite sheet layout (+1 row, frames 66-77 for new tech icons).

- Add comprehensive verification tests for cost buckets, rung gating,
  setResearchTarget behaviour, and statistical availability rates.
2026-08-07 20:33:47 -06:00
Brian Fertig d16e699a8d Updated videos and tweaks 2026-08-07 19:52:30 -06:00
Brian Fertig c52b5c6429 feat: add colony naming system and species lore conversations
Introduce colony naming with a 50-name bank per species, shuffled
per-empire and displayed as defaults in naming prompts. Colony names
now appear across all UI layers (star map, side panel, colony view,
system view) with the astronomical designation as fallback.

Add three pure-flavor conversation topics to diplomacy: "Their People"
(neutral+), "Their Homeworld" (friendly), and "A Story" (friendly).
Each diplomacy-capable species receives unique lore-rich responses
(3 variants each) reflecting their culture, homeworld, and history.

Other changes:
- Switch ursaal videos from generic "human" assets to species-specific
- Widen diplomacy buttons to 200px; add auto-shrink for long labels
- Add ±5 population transport buttons to colony view
- Validate colonyNames (50+ entries, no duplicates)
- Enforce minimum lore variant counts in verification
2026-08-06 21:34:46 -06:00
Brian Fertig 0adb689c19 feat(mastervega): refine star map colony info, tech effects display, and turn report layout
- Add colony info layer showing per-empire colony rosters (name, orbit, pop)
  stacked up-left of colonized stars with colored bars and connector lines
- Change "Range as light" to "Explored as light": reveal only actually
  explored stars (not fuel-reachable) with smaller 1.1pc radius
- Extract VegaTechEffects.js with human-readable descriptions for all
  tech effects, replacing raw key/value dumps in turn report
- Expand building unlock rows to include building descriptions
- Reorganize ship completion rows: hull icon and commander portrait now
  display below the full-width synopsis instead of beside it
- Bump zuma level 8 config to level 21 "Sun Cove" with new path and params
2026-08-06 18:33:04 -06:00
Brian Fertig a7c3ef20e4 fix Vega game: reset fleet selection on show, offset fleet animations, add building queue UI
- Reset fleet selection when showing a new fleet so it starts at full strength
- Offset moving fleet sprites by (-26, -22) to prevent blocking star click targets
- Track newly unlocked building IDs in research completion events
- Add one-click bulk-queue buttons in turn report for newly researched buildings
  - "All Colonies" queues at every colony
  - "Colonies with positive BC" filters by net income (trade minus upkeep)
2026-08-06 16:50:28 -06:00
Brian Fertig df4c1d7b02 refactor: lazy-load audience mood clips one at a time instead of pre-warming all three
Replace the eager `ensureAudienceVideos()` warm-up (which loaded all three
mood clips per species upfront) with on-demand JIT loading — only the mood
about to be shown is fetched. This saves several megabytes per species since
most conversations never cycle through all moods.

- Remove `ensureAudienceVideos()` and its call in `openAudienceScreen()`
- Load each mood clip only when `show()` is first called for that mood
- Show a letterboxed placeholder for the very first clip until the fetch lands
- Keep whatever is already on screen while a new mood loads in the background
- Add `destroy()` guard to prevent in-flight fetches from mutating a torn-down
  container when the audience screen is closed

Also ship the dedicated Kestrelli audience clips (angry, neutral, happy) to
replace the previous human fallback videos for that species.
2026-08-05 23:08:18 -06:00
Brian Fertig 7e7956d86d feat: add population transport and audience video replay
- Add Colony Transport ('poptransport') hull, dispatched directly in transit
  from a Send Population order rather than built from the queue. Shares the
  Troop Transport's hull art and uses the colony ship's commander clip.
- Implement VegaLogic sendPopulation/deliverPopulation flow: clamped to
  maxSendablePopulation (leaves 0.5 floor), creates poptransport fleet
  immediately, auto-delivers on arrival capped at destination max pop.
- Add Send Population button and overlay picker in colony view with
  destination list, ETA display, amount dial, and MAX button.
- Log populationSent/populationDelivered events in the turn report.
- Refactor VegaAudience mood visuals to play-once-and-hold-last-frame with
  a clickable replay badge, mirroring VegaColonyIntro's video contract.
- Seed human audience mood clips (angry/neutral/happy) into artwork config
  as placeholders for all diplomacy-capable species.
- Add verification tests for poptransport mechanics and video aliasing.
2026-08-05 21:11:37 -06:00
Brian Fertig 1251da186c feat(mastervega): overhaul contact system and add full-screen Audience diplomacy
- Rewrite contact detection from proximity-based (parsec-range) to
  star-scoped: empires now meet by sharing a system (colonies or fleets),
  making first-contact a visible event rather than a silent background
  check.

- Add full-screen Audience interface (VegaAudience.js) with species-specific
  mood videos (or letterboxed portrait fallbacks), a typewriter chat log,
  and contextual action buttons. Auto-opens on first contact via a queue
  system in MasterOfVegaGame.

- Add VegaChat.js with unique dialogue pools for all 9 diplomacy-capable
  species across 18+ situations (first contact, peace/alliance offers,
  war declarations, tech trades, accept/reject responses, etc.).

- Introduce held diplomacy offers: AI proposals to the human are queued
  (pendingOffers) instead of auto-resolved, with player Accept/Reject
  buttons in the Audience screen and automatic expiry after 6 turns.

- Add audienceVideos config and JIT-loading infrastructure in VegaArt.js.

- Add ship videos for kkrix and mekhan species.

- Simplify openDiplomacyScreen to a single "Seek Audience" button.

- Fix colony view to filter out 'starbase' from building display list.

- Add comprehensive verification in tools/verifyMasterOfVega.js for
  contact system, held offers, chat completeness, audience videos,
  and serialization of new state fields.

- Remove obsolete contactRange rule from mastervega-rules.json.
2026-08-05 19:59:58 -06:00
Brian Fertig d4daa990a1 feat(mastervega): add visual reports for building and ship completion
Promote buildingDone and shipDone events from ticker-only to notable
interrupting events with dedicated report rows. Each row now displays:
- A building icon or ship hull icon + commander portrait
- Clickable ship detail overlay (video/image portrait)
- "View Star System" shortcut button for quick navigation

Mirrors the existing treatment of discoveries and research completions,
giving players immediate visual feedback on production milestones.
2026-08-04 21:37:20 -06:00
Brian Fertig f9df69b09f feat(mastervega): add full-screen colony-founding vignette with on-demand video clips
Replace the turn-report "New Turn" popup row with a cinematic vignette that
plays the moment the player plants a colony: the soundtrack ducks, the world's
1920×1080 backdrop fills the screen, a 960×544 clip of this world being settled
plays in a framed window, and the founding numbers are read out underneath.

Key changes:
- Add `colonyVideos` block (15 clips, one per colonisable planet type) to
  artwork JSON; clips are fetched just-in-time via ensureColonyVideo() when a
  colony ship reaches a settleable world, keeping the set (~19 MB) out of the
  eager manifest
- Add `vega-colony-cue` audio to the eager manifest for the founding soundtrack
- Remove `colonised` from NOTABLE_TYPES and TYPE_LABEL so the event is no longer
  announced twice (once in the vignette, once in the turn report)
- Add `sourceWidth()` guard in VegaArt.js to fix a Phaser Video placeholder
  width bug exposed by the non-square 960×544 colony clips (2.5× scale issue)
- Apply `sourceWidth()` to portrait and commander video scaling paths as well
- Add depth entry `intro: 78` to VegaScreens.js for the vignette overlay
- Add section 6b to the verifier: checks manifest exclusion, key conventions,
  sourceWidth() behavior, turn-report classification, and colony stats

See build-plan trap #23 for the full sourceWidth() explanation.
2026-08-03 23:31:28 -06:00
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 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 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 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 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
Brian Fertig 9f54556ba9 feat: enhance Shift backgrounds and add commander death SFX for TA
- 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
2026-07-26 16:01:54 -06:00
Brian Fertig 6e9cc84f6a feat(gootower): replace sky drawing with background image asset
- Add gootower-bg to asset manifest
- Replace drawSky() with drawBackground() method that renders the background texture
- Display background when entering play mode
2026-07-26 15:37:31 -06:00
Brian Fertig 5b24cc3ad0 Goo Tower Levels 2026-07-26 15:23:18 -06:00
Brian Fertig cfbf1032bf feat: add Chinese soundtrack to Mahjong and Mahjong Match games
- 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)
2026-07-26 10:45:43 -06:00
Brian Fertig 386ad3efb7 feat: add Goo Tower game with physics engine, 12 levels, and editor
Implement Waves 0-3 of Goo Tower, a World of Goo-inspired physics
puzzle game. Includes:

- GooTowerLogic.js: Verlet integration with XPBD constraints, terrain
  collision, ball-ball collision, strand breaking, crawling agents,
  and 9 goo types (common, ivy, balloon, bomb, block, pokey, bit,
  skull, anchor)
- GooTowerGame.js: Phaser scene with procedural rendering, drag-and-
  drop placement, pipe collection, and win/OCD tracking
- GooTowerEditor.js: Level editor (/?gootower-editor=1) with terrain
  drawing, ball/pile placement, settle/test/export tools
- 12 hand-tuned levels across 2 chapters (teaching + sandbox)
- verifyGooTower.js: 303-check regression harness
- genGooTower.js: Level bank writer
- GooTowerAuto.js: Greedy reference player (winnability gate)
- Wiring into gamesRegistry, main.js, GameRoomScene, and PreloadScene
2026-07-26 10:22:25 -06:00
Brian Fertig cb3c152d10 feat: pudding monsters waves 1-3, mahjong match FX, background art
Pudding Monsters:
- Rewrite level bank to 75 levels across 5 named chapters with a teach →
  drill → mix curriculum progression
- Implement 8 mechanics: sleepers, ice, slime trails, hypno goos, springs,
  tunnels, buttons+bricks, powerlifters+crates
- Split scoring into stars (target coverage) and crowns (par solves)
- Introduce planFlick/applyPlan so scene animation never disagrees with
  engine state
- Add mutable board layers (state.board) with generic cloning/hashing
- Level select: chapter rows, mechanic pips, tooltips, chapter-complete panels
- Monster type rendering: green/hypno/lifter colors, sleeper shut-eyes+Z

Mahjong Match:
- Add MahjongFx.js: shatter, burst, flash, ring, floatText, recoil,
  freed-tile chimes

Bloxorz:
- Add background images for menu and levels

Infrastructure:
- docs/puddingmonsters-mechanics-plan.md: living mechanics build-out plan
- tools/verifyPuddingMonsters.js: 1295 regression checks
- genPuddingMonsters.js: curriculum generator with load-bearing gates
- Add playSoundEx() for pitched sound cues
- Update asset manifest for all three games
2026-07-26 01:27:36 -06:00
Brian Fertig 4813c17cce feat: add custom backgrounds for Bejeweled and Peggle games
- 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
2026-07-25 20:56:57 -06:00
Brian Fertig 195e88f2dc feat(totalannihilation): add auto-heal for idle builders
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.
2026-07-25 20:36:50 -06:00
Brian Fertig 39059a3551 feat(total-annihilation): add rocket trooper, constructor, and advanced vehicle plant
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.
2026-07-25 19:52:26 -06:00
Brian Fertig c835096610 feat(total-annihilation): polish visuals, audio, and game balance
- 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
2026-07-25 19:51:25 -06:00
Brian Fertig 3c053e5984 feat: add granular order queue cancellation
Introduce the ability to cancel individual queued orders, addressing the
previous limitation where `stop` only cleared the entire queue.

- Add `cancelOrder` logic with proper cleanup for unstarted BUILD orders
  (site removal, footprint unstamping, freeing builders)
- Implement queue hit-testing and visual selection highlighting in TAWorldView
- Wire up right-click cancellation, Delete/Backspace key binding, and
  click-to-highlight queue entries in the game scene
- Automatically invalidate queue selection when units die, are deselected,
  or orders are consumed

Players can now precisely manage command queues without affecting active or
completed constructions.
2026-07-25 16:16:33 -06:00
Brian Fertig b479b6a21f feat: overhaul Bloxorz rendering, mechanics, and level design; update Total Annihilation visuals
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
2026-07-25 14:50:23 -06:00
Brian Fertig 00f6dd6e19 Added fortify icon to units 2026-07-25 11:57:39 -06:00
Brian Fertig 65a6ee12ad refactor(ai): improve city placement with working radius awareness
- Add aiCitySiteScore to evaluate tiles only outside existing city radii
- Pre-compute covered tiles to avoid overlapping working ranges
- Increase search radius from 7 to 12 for finding distant good sites
- Reject sites within 3 tiles of own cities; soft penalty at 4-5 tiles
- Replace deprecated siteQuality import with new scoring logic
2026-07-25 11:27:17 -06:00
Brian Fertig 929d27e188 feat: add Bloxorz game, balance Total Annihilation weapons
- 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)
2026-07-25 10:30:30 -06:00
Brian Fertig 4e56c3bfae feat(totalannihilation): add victory conditions, new defensive towers, and combat improvements
- Introduce configurable victory modes: "commander" (default, kill enemy commander) and
  "annihilation" (fight until army can no longer produce)
- Add Laser Tower (1x1, hitscan) and Missile Launcher (2x2, guided with min-range dead zone)
  as buildable defensive structures with new towerlaser and towermissile weapons
- Units now hold at weapon range when attacking buildings instead of closing to point-blank,
  controlled by new engageHoldFraction constant (0.45)
- Replace center-to-center distance with surface distance for building targets; buildings are
  treated as rectangles with true half-extents, improving combat accuracy
- Buildings (towers) now freely traverse and aim in all directions regardless of art orientation
- Commander unit flagged with isCommander; victory conditions validate presence of commanders
- Update campaign missions to use destroyCommander objective; reseed m02 (old seed unwinnable
  after combat balance changes)
- Add skirmish setup UI for selecting victory conditions
- Update AI skill ladder verification thresholds to account for engage hold behavior
- Add comprehensive tests for victory conditions and defensive structures
2026-07-25 08:23:11 -06:00
Brian Fertig 4b86a85358 feat(total-annihilation): add unit/building repair system
Allow builders to repair damaged friendly units and buildings by
right-clicking them. Repair cost and duration are proportional to the
damage healed (X% HP restoration costs X% of build cost and takes X%
of build time).

Key changes:
- New 'repair' order type with validation (own units only, must be
  damaged, requires a builder)
- Separate _repairPower accumulator so repairing a damaged factory
  doesn't silently speed up its production queue
- Repair drains energy/mass through the same economy machinery as
  construction, including brownout throttling
- HUD hints guide players to right-click damaged allies to repair
- Repair order auto-clears when complete; unqueued orders interrupt it
  while queued orders wait behind it
- Visual waypoint color for repair orders
- Comprehensive test coverage in verifyTotalAnnihilation.js
2026-07-24 21:50:34 -06:00
Brian Fertig 1f4f8d1b30 fix(totalannihilation): ensure self-heal damage clock survives serialization
- Initialize lastDamagedTick to -1e9 for fresh units (finite sentinel to avoid JSON.stringify null)
- Add lastDamagedTick to serialize/deserialize so the pause timer persists across save/load
- Add comprehensive tests for self-heal behavior:
  - Rate verification (~33% max HP/min)
  - 30s pause after damage and clock restart on new hits
  - Sustained fire suppression
  - No overhealing
  - Non-selfHeal units don't regenerate
  - Damage clock survives save/load round-trip
2026-07-24 21:34:27 -06:00
Brian Fertig 23c558a5d4 feat(totalannihilation): add commander self-healing and improved build queue UX
- Add self-healing system for units with `selfHeal` definition (e.g. Commander)
  - Healing pauses for 30 seconds after taking damage to prevent out-healing fights
  - Rates converted to per-tick at load time for efficient simulation
- Improve build queue interaction: use CTRL (or Cmd) to chain multiple builds,
  release to cancel placement automatically — no need to press Esc or click again
- Track queue modifier state from DOM events for robustness across focus loss
2026-07-24 21:25:22 -06:00
Brian Fertig ddac7fcd5a feat(ta): add order queueing with CTRL and visual waypoint feedback
- Queue multiple orders per unit by holding CTRL (matching original game)
- Draw colored waypoint chains on the minimap/world for each queued order
- Display queued order count in selection detail panel
- Limit queue overlay to MAX_QUEUE_LINES to avoid clutter in large selections
- Use distinct colors per order type (move, attack, patrol, build, etc.)
- Update hint text and placement UI to mention queueing behavior
- Add verification tests for queue append/replace semantics, consumption order,
  and queued build orders
2026-07-24 20:58:08 -06:00
Brian Fertig e7da172896 feat: add Total Annihilation game with campaign, AI, and full engine
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
2026-07-24 20:57:40 -06:00
Brian Fertig ab05e2f1cd feat(civilization): add steampunk city theme and caravan diplomacy
- Add steampunk city sheet asset configuration
- Reassign Victor and other opponents to steampunk city theme
- Enable wheel scrolling on city choices list
- Allow non-combat units (e.g., caravans) to enter enemy cities
- Block movement into enemy cities when at war
2026-07-24 18:09:22 -06:00
Brian Fertig 79c18c595e feat: add notification for buildings sold due to insufficient gold
Handle 'buildingSold' events to inform players when their buildings are
automatically sold to cover upkeep costs, displaying the building name
and city where the sale occurred.
2026-07-24 16:26:57 -06:00
Brian Fertig 93b4877c2d **Update game icons assets**
Refresh game icons in both source (PSD) and exported (PNG) formats to reflect updated design.
2026-07-24 16:01:13 -06:00
Brian Fertig 94cc51b997 feat(minimotorways): dynamic scaling and starvation-safe spawning
- Replace flat caps (CAR_CAP, HOUSE_CAP, BUILDING_CAP, WEEK_ROADS) with
  per-stage values that scale over the run, preventing the week-6 growth
  plateau where the expanded map stayed empty
- Add per-color starvation guards: ensure every unlocked colour has at
  least 2 houses and 1 building, even if it means exceeding stage caps
- Allow spawnHouse/spawnBuilding to bypass caps when a colour is
  supply-starved or destination-less
- Update bridge placement to handle 1-wide rivers (orientation-ambiguous
  single-cell spans)
- Tune PIN_MS_MIN from 3500ms to 2400ms
- Extend Monte Carlo verification to 20 weeks with assertions that the
  city grows past the old week-6 plateau
2026-07-23 21:55:20 -06:00