Commit Graph

623 Commits

Author SHA1 Message Date
Brian Fertig 045327d38a feat(totalannihilation): add Megatank unit with multi-barrel weapons and rebalance combat
- Introduce Megatank: medium commander with Twin 150mm Cannon and Side Rocket Pods
- Implement multi-barrel weapon system (barrels + barrelSpacing) in TALogic and TARules
- Lower DEFENCE_MIN_SKILL from 4 to 3; make first Laser Tower proactive, not reactive
- Rebalance unit triangle: Tank now counters Rocket Tank; rockets weak vs vehicle armour
- Re-seed campaign missions m05 (67890) and m06 (80808) with updated maps and briefings
- Skirmish default theme uses rules default (tropics) instead of hardcoded grasslands
- Add intro video before main menu
- Update sprite docs and verification tests for new balance
2026-08-16 13:42:54 -06:00
Brian Fertig 09a62f12cc feat(mastervega): add morale bonus system and espionage restraint diplomacy
- Add morale bonus from buildings (e.g., Holo Simulator): flat +N% to total
  colony production, uniformly boosting construction, defense, industry,
  ecology, and research
- Add espionage restraint (offDrift): setting Intelligence to 'off' toward
  an empire with neutral-or-better opinion drifts their attitude upward by
  1/turn, giving a way to improve relations without gifting (gated on not
  being at war and their opinion of you being >= 0)
- Display morale bonus in colony view when applicable
- Reduce planetShotDamageMult from 10 to 6
- Add verification tests for both new mechanics
2026-08-16 08:12:16 -06:00
Brian Fertig 46a2979555 fix: starbases cannot attack alone; AI targets correct colony at contested stars
- Starbases no longer count toward attacker power in holdsOrbit(), invade(),
  resolveCombats(), pendingBattlesFor(), and prepareBattleAt(). A starbase
  never leaves its home system, so it must never alone enable orbital
  superiority or pick fights with neighbouring hostile colonies (Brian, 2026-08-15).

- VegaAI manageFleets 2a/2b now uses targetColonyAt() instead of colonyAt()
  to resolve the colony it is actually at war with. At multi-colony stars
  this fixes the bug where an idle fleet sitting on a hostile undefended
  colony would silently check a different (not-at-war) colony sharing the
  star and never bombard/invade (Brian, 2026-08-15).

- Add test suite 5f (starbases cannot attack alone) and 5g (AI bombard/invade
  at contested multi-colony stars).
2026-08-15 10:54:16 -06:00
Brian Fertig 9e463164d9 increase planet shot damage multiplier from 1 to 10
Bumps the planetShotDamageMult config value in mastervega-rules.json
to significantly increase damage dealt during planetary bombardment
or planet defense scenarios.
2026-08-15 09:39:51 -06:00
Brian Fertig 033912bc73 feat: redesign planetary defense as ammo model with range gating
- defenseHp is now a pure per-battle ammo gauge (one full-strength
  shot per planetDefensePerShot points, remainder as fractional shot)
  instead of in-battle damage tracking; no longer written back after
  battle outcome
- Planet now has a real range limit (planetRange, 1200) — previously
  the only entity with no range check at all
- Per-shot damage scales with the defending empire's best known weapon
  tech (weaponAvgDmg) instead of a flat HP-proportion curve
- defenseHp is only wiped to 0 when the planet is actually DESTROYED,
  fixing the bug where a defeated planet could be re-attacked multiple
  times in one turn with full strength each time
- Added combat config: planetDefensePerShot (5), planetShotDamageMult (1)
- Added combatV2 config: planetRange (1200)
- Comprehensive tests for range gating, shot formula, ammo exhaustion,
  multi-battle-same-turn fix, and tech-scaled damage
2026-08-15 09:20:43 -06:00
Brian Fertig d920d8e476 feat(combat): freeze colony defense regen and defensive builds while under siege
Add siegeFreezesDefense mechanic (default true) that stops a colony's
passive defenseHp trickle and blocks defensive building completion at the
front of the build queue while a hostile warship fleet is present.

This fixes the recurring "Under Attack" notification loop reported by Brian
where defenseHp would regenerate each turn, re-arming the pendingBattlesFor
gate and triggering fresh popup notices for an already-beaten colony.

Also adds an AI dispatch throttle in manageFleets: idle fleets no longer
open redundant attack orders against colonies the empire already holds orbit
over with defenseHp beaten to 0. Excluded fleets fall through to rally logic
and naturally join the existing siege or find a fresh front.

New helpers: isDefensiveBuildingId, isHostileWarshipFleet, hasHostileWarshipFleet
— shared across processColony, pendingBattlesFor, and VegaAI to ensure a
single definition of "under active siege".

Includes tests (sections 5d, 5e) covering regen freeze, build queue freeze,
siegeFreezesDefense=false toggle, and AI throttle.
2026-08-15 08:00:40 -06:00
Brian Fertig 869f041b39 feat(master-vega): overhaul bombard/invasion UX, consequences, and battle logic
- **Visual Feedback**: Introduce VegaBombardScreen.js — a two-stage popup for
  bombard/invasion results featuring JIT-loaded videos (per planet type or
  invading species) and animated stat bars showing population, factory, and
  building losses.
- **Expanded Consequences**: Factory and building destruction now scale with
  the population kill ratio. On colony wipeout, weapon Mark gates planetary
  ruin/ruination (toxic/radiated/dead/asteroids) via a weighted probability table.
- **AI & Tactics**: Ursaal now queue troop transports alongside warships for
  invasion fleets. Added `bombardHoldFireChance` trait (0–1) to let species
  defer bombing when invasion troops are staged, preserving intact colonies
  without creating fortress-world stalemates.
- **Battle Logic Fixes**: Correct `prepareBattleAt` and `pendingBattlesFor` to
  properly handle stars with multiple colonies, ignore transport-only fleets,
  and suppress pending battles when planetary defenses are depleted.
- **UI/Reporting**: Wire player-initiated and AI-initiated attacks into the
  new popup queue. Add `bombard` and `invasionFailed` to notable turn report
  events with detailed outcome descriptions.
- **Testing & Tooling**: Add comprehensive verification tests for planet
  destruction distribution, building damage rates, hold-fire chances, and
  battle edge cases. Expose `window.game` for devtools debugging.
2026-08-14 23:17:31 -06:00
Brian Fertig 3bad628968 fix(mastervega): balance planetary defense and improve AI attack logic
- Replace flat planetDefenseBase (20) with proportional planetDefenseScale
  (0.06), so colony defense damage scales purely with current defenseHp.
  A near-depleted colony now barely scratches attackers, while a fully
  tech'd one still tops out ~110 damage — fixing "attacked with the
  strength of a much-better-defended planet" (Brian, 2026-08-14).

- Add AI war memory: track consecutive losses per enemy and escalate
  attackMultiplier up to 3x so repeated losing attacks stop dribbling
  small fleets. A win resets the streak. Prevents permanent phoney wars
  where both sides build to equal strength and nothing moves.

- Show "Under Attack" notice (one-button, no formation picker) when AI
  attacks the player, since formation choice is meaningless for defense.

- Add planetary beam fire SFX for combat view.

- Add event `seq` cursor for war memory to survive event list trimming.

- Full test coverage for planet damage formula and AI escalation behavior.
2026-08-14 14:24:22 -06:00
Brian Fertig 2b1fe96bf6 Changes to battle system so the player can view battles initiated by the other side. 2026-08-14 12:17:14 -06:00
Brian Fertig 52b9f2b29f Small Updates 2026-08-14 12:00:26 -06:00
Brian Fertig cba84dc0b8 Updated Battle Scanner 2026-08-14 11:19:30 -06:00
Brian Fertig c8e22a51a5 feat(mastervega): add Galactic Expansion/Expansion advisor focuses and fleet urgency system
- Add "Galactic Expansion" colony focus and "Expansion" allocation focus
  for early-game land grab phase (one colony ship per discovered open world,
  then 2 frigate escorts per colony ship)
- Introduce fleetUrgency() — sliding-scale fleet recommendation based on the
  coldest contacted relationship, throttled pre-contact to avoid premature
  militarization
- Hide Council menu button until the Council has actually convened (lastResult)
- Add tooltip to disabled population send button explaining why it's off
- Rename "Production" allocation preset to "Industrial Buildout"
- Expand Colony Improvement recommendation to fire when factories are well
  below cap, not just near cap
- Add comprehensive tests for all new logic paths
2026-08-14 10:55:38 -06:00
Brian Fertig 5ce7fc2367 feat(mastervega): contact-gate relationsRows and expand alert suppression to tech
- relationsRows now filters out empires the human hasn't contacted, matching
  the existing contact-gating behavior of rankingRows (Brian, 2026-08-14)
- Expand GNN alert suppression from espionage-only to include tech breakthroughs
  via new ALERT_STORY_KINDS set, skipping ranking/relations pages for these
  one-off notifications
- Update verifyMasterOfVega tests to assert uncontacted empires are excluded
  from relationsRows while confirming names can still appear in contacted
  rows' war/trade/ally lists
2026-08-14 09:52:57 -06:00
Brian Fertig c84b668553 feat(mastervega): add allocation icons and tooltips to colony sliders
- Replace □/■ glyphs with channel-specific icons inside the lock toggle boxes
- Introduce `allocation.png` (5 frames) and register it in the artwork config
- Add hover tooltips explaining each channel's production role and MOO1-style
  overflow behavior
- Expose slider `zone` for tooltip attachment and adjust icon/layout positioning
- Update sprite documentation and include minor audio asset update
2026-08-14 09:52:36 -06:00
Brian Fertig 44868e5032 feat(mastervega): leader system, bombard cap, GNN contact-gating, population rounding
- Add leader detail pop-over (VegaLeaderDetail.js) with portrait, bio, and
  current posting bonuses displayed in fleet and colony views
- Add leader portrait click-to-zoom in the Leaders screen
- Add leader skill summary formatting (leaderSkillSummary) for readable
  bonus descriptions across UI components
- Integrate leader skills into espionage power/defense and invasion attack
  calculations in VegaLogic.js
- Cap bombard() at once per (attacker, colony) per turn via lastBombardTurn
  tracking; fixes UI double-click and AI double-bombard bugs
- Contact-gate GNN breakthrough stories and ranking charts on first contact,
  matching existing rankingRows behavior
- Round population displays throughout the UI (toFixed(1) → Math.round)
  for cleaner presentation
- Bump colony ship and transport base costs in rules data
- Add leaders.png artwork reference to mastervega-artwork.json
- Add tests for bombard cap and GNN contact-gating in verifyMasterOfVega.js
2026-08-13 23:14:42 -06:00
Brian Fertig 8f0b079fa4 feat(vega-gnn): suppress ranking/relations pages during espionage alerts
When a fresh espionage notification is pending, skip ranking metrics and
relations pages so the alert reads as a focused notification rather than
being interleaved with unrelated charts. Reopening GNN without pending
events (using history) always shows the full experience, providing an
escape hatch for players who want the charts.
2026-08-13 16:45:53 -06:00
Brian Fertig 57a8a14ade feat(mastervega): add third-party peace requests, pre-battle formation picker, and combat V2 planet fixes
- Add "peace request" diplomacy: player can ask an AI to end a war with a
  third empire, and AIs can ask the player the same. Refusing costs attitude.
  Implemented in VegaDiplomacy.js (wouldAcceptPeaceRequest/requestPeace/offerPeaceRequest),
  VegaAudience.js (Demand Peace button + war picker), and full chat lines for
  all species in VegaChat.js.

- Extract openFormationPicker to VegaScreens.js and wire it into
  MasterOfVegaGame.js so the player chooses a formation before every battle.
  AI opponents still pick silently.

- Fix Combat V2 planet positioning (fixed at worldWidth * 0.75 instead of
  formation-relative), pass typeId for real planet art, and apply the
  Planetary Shield building's shieldBonus (was hardcoded to 0).

- Add icon images to research screen tech field headers.

- Add comprehensive tests for peace requests and prepareBattleAt fixes.
2026-08-13 16:12:10 -06:00
Brian Fertig 590bca1721 feat(master-vega): add Galactic Council Session ceremony UI
Introduce a full-screen, click-advanced ceremony (VegaCouncilSession.js)
that replays runCouncil()'s result delegate-by-delegate instead of hiding
the tally behind the turn-report. Three fixed stages — Roster, Voting,
and Verdict — with a persistent 2:3 portrait anchor video, green-screen
ticker, live scoreboard with animated bars, and sting-then-loop audio.

Key changes:
- VegaLogic.js: expose per-voter `voters` breakdown and `pendingSession`
  flag so the UI can replay the session before the victory check.
- MasterOfVegaGame.js: consume `pendingSession` in `runToHumanTurn()`
  before `state.over`, ensuring a decisive council still gets its ceremony.
- VegaTurnReport.js: remove `council` from NOTABLE_TYPES (ceremony handles
  it); keep `councilRefused` as a distinct war-declaration row.
- assetManifest.js / Sounds.js: register video + sting/loop audio cues.
- VegaScreens.js: add `D.council` depth value.
- verifyMasterOfVega.js: assert voter breakdown consistency and pending
  session lifecycle.
2026-08-13 15:16:43 -06:00
Brian Fertig b145beb28d feat(master-vega): add Galactic Council Session ceremony UI
Introduce a full-screen, click-advanced ceremony (VegaCouncilSession.js)
that replays runCouncil()'s result delegate-by-delegate instead of hiding
the tally behind the turn-report. Three fixed stages — Roster, Voting,
and Verdict — with a persistent 2:3 portrait anchor video, green-screen
ticker, live scoreboard with animated bars, and sting-then-loop audio.

Key changes:
- VegaLogic.js: expose per-voter `voters` breakdown and `pendingSession`
  flag so the UI can replay the session before the victory check.
- MasterOfVegaGame.js: consume `pendingSession` in `runToHumanTurn()`
  before `state.over`, ensuring a decisive council still gets its ceremony.
- VegaTurnReport.js: remove `council` from NOTABLE_TYPES (ceremony handles
  it); keep `councilRefused` as a distinct war-declaration row.
- assetManifest.js / Sounds.js: register video + sting/loop audio cues.
- VegaScreens.js: add `D.council` depth value.
- verifyMasterOfVega.js: assert voter breakdown consistency and pending
  session lifecycle.
2026-08-13 14:37:27 -06:00
Brian Fertig 0c6c4b8452 feat: add Galactic News Network (GNN) broadcast system
Introduce GNN, a galaxy-wide news broadcast feature that reports major
events to the player via a full-screen takeover UI with anchor desk
video, story pages, MOO1-style animated rankings, and a diplomatic
relations reference.

Key changes:
- VegaGnn.js: headless event classification, anchor copywriting, and
  ranking logic (Phaser-free, testable in Node)
- VegaGnnScreen.js: full-screen UI with looping anchor video,
  green-screen ticker terminal, story renderers (diplomacy/tech/
  territory/espionage), animated bar-chart rankings, and relations page
- HUD: new GNN button with unread bullet cue; auto-opens after turns
  when stories are pending, on-demand via button
- VegaLogic.js: new `lastColony` event (reduced to single world),
  `attacker` field on elimination events, `gnn` state with history
  buffer, export empireFleetPower for multi-empire rankings
- VegaColoniesScreen.js: export and generalize createAdvisorTerminal
  for reuse by GNN's ticker
- mastervega-rules.json: flag ~16 headline-worthy techs with
  gnnHeadline (research-sourced only, not espionage-stolen)
- Assets: eager-load GNN anchor video, sting/loop audio, and populate
  all 10 species colony advisor videos in mastervega-artwork.json
- verifyMasterOfVega.js: comprehensive 7b test section covering
  classification, consumption, describeGnnStory, anchorLine, attacker
  threading, ranking metrics, relationsRows, serialization, and AI soak
2026-08-13 12:03:08 -06:00
Brian Fertig ea70fb4e07 Intro Movie Optimization 2026-08-13 08:43:24 -06:00
Brian Fertig d63d81fb66 visualize focus misalignment and improve research recommendation logic
Highlight colony pills in warm orange-brown when their current focus
(colony or allocation) disagrees with the advisor's recommendation,
mirroring the yellow-outline signal already used in dropdowns.

Refactor recommendAllocationFocus to avoid oscillation: instead of
reading the colony's own slider (which would flip between Default
at 0.20 and Research at 0.50), check for an eligible research
building and population ≥ 3, and include the building name in the
advice message.
2026-08-12 23:28:29 -06:00
Brian Fertig e78f626406 feat(masterofvega): add studio intro video and colony focus misalignment indicators
- Add full-screen intro video (mov-intro.mp4) that plays once on fresh game
  entry, with skip prompt on first keypress and immediate skip on second
- Include intro soundtrack (intro-theme.mp3) and updated menu title image
- Skip video on Load-slot resume to avoid interrupting returning players
- Add orange highlight to Colony/Allocation Focus pills when their setting
  disagrees with the advisor's recommendation (recommendColonyFocus/
  recommendAllocationFocus)
2026-08-12 23:00:18 -06:00
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 076ec0654e Music Updates 2026-08-09 09:31:12 -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 35cc4d2446 Updates to speech and video 2026-08-07 14:03:28 -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 2f99d5ce68 **Update vega ship graphics**
Updated ship artwork in assets/images/vega/ships.psd and regenerated ships.png.
2026-08-05 23:50:03 -06:00