Commit Graph

25 Commits

Author SHA1 Message Date
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 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 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 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 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 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 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 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 01c5957b59 Update to Vega Ship and Videos 2026-08-04 19:55:04 -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 ee7a3214fd feat: add Kestrelli faction ships and update related assets
- Add ship definitions for Kestrelli faction (scout, colonyship, transport,
  frigate, destroyer, cruiser, battleship) to artwork configuration
- Update character sprite (char-kestralli.png) and video (char-kestrelli.mp4)
- Update ships sprite sheet and PSD source file
2026-08-02 19:54:07 -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 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