- 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
- 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.
- 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.
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.
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.
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.
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.
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`).
- 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.
- 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
- 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
- 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.
- 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.
- 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
- 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)
- 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.
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
- 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
- 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)
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.
- 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.
- 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.
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.
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.
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.
- 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
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.
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.
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.
- 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.
- 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
- 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
Introduces Master of Vega, a turn-based 4X strategy game built on MOO1 rules with MOO2 conveniences. The implementation features a fully headless, deterministic engine (VegaLogic) with zero Phaser dependencies, enabling complete Node-based verification (809 checks) and reproducible galaxy generation via mulberry32 RNG.
Key features:
- Preset ship hulls with an auto-refitting Mark system and provably monotonic knapsack loadouts.
- Tactical grid combat with banked damage resolution to eliminate first-strike bias.
- Galactic Council diplomacy, stalemate-breaking, and invasion forecasting.
- Drop-in artwork compatibility with procedural stand-ins for all spritesheets.
- Hireable leaders (admin/captain) and colony building queues.
Architecture splits cleanly into headless modules (GalaxyGen, Logic, AI, Combat, Diplomacy, Ships, Leaders) and a render tier (StarMap, SystemView, CombatView, Screens, Nebula, Art, Fx). A comprehensive build plan documents 19 architectural traps discovered and resolved during development.
Registers the game in the registry, asset manifest, preload scene, and soundtrack service. Includes tools/verifyMasterOfVega.js for automated rule validation, art verification, economy balancing, and AI self-play soaking.
Introduce 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.
- 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
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
Add `air` and `fortification` armor classes to enable more nuanced
balance. Aircraft now use `air` class instead of light/medium, and
defensive turrets use `fortification` instead of `structure`, allowing
weapons to specialize against planes and defenses without affecting
other targets.
- Add armor classes to all 12 weapons with appropriate multipliers
- Adjust weapon stats (sniperrifle, rocketpod, shoulderrocket)
- Reduce HP on several combat units for balance
- Reclassify aircraft and defensive turrets to new armor classes
- 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
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
- 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
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.