fertig-classic-games/data/mastervega-artwork.json

364 lines
31 KiB
JSON

{
"_readme": "Master of Vega — drop-in artwork manifest. Every sheet starts with path:null, which means VegaArt.js paints a procedural stand-in at exactly the same frame geometry. To use real art, drop the PNG in assets/images/vega/ and set its path here — no code changes. Frame layouts are documented in src/games/mastervega/sprites.md and are APPEND-ONLY.",
"_kindReadme": "kind selects the procedural painter in VegaArt.PROC_PAINTERS. Painters are keyed by kind, never by sheet name, so adding a sheet later needs no code change.",
"_portraitVideosReadme": "Species portraits are looping muted videos rather than spritesheet frames, 256x256. All ten are present. NOTE: cerebrai's file is spelled 'char-cerebai.mp4' on disk (missing the r) — the path below points at the real filename, so rename the file and this one line together if you want the spelling fixed. To add or replace one: drop the file and set its path here; nothing else changes.",
"portraitVideos": {
"human": { "key": "vega-char-human", "path": "assets/videos/vega/char-human.mp4" },
"kestrelli": { "key": "vega-char-kestrelli", "path": "assets/videos/vega/char-kestrelli.mp4" },
"ursaal": { "key": "vega-char-ursaal", "path": "assets/videos/vega/char-ursaal.mp4" },
"umbrix": { "key": "vega-char-umbrix", "path": "assets/videos/vega/char-umbrix.mp4" },
"kkrix": { "key": "vega-char-kkrix", "path": "assets/videos/vega/char-kkrix.mp4" },
"mekhan": { "key": "vega-char-mekhan", "path": "assets/videos/vega/char-mekhan.mp4" },
"rrashaa": { "key": "vega-char-rrashaa", "path": "assets/videos/vega/char-rrashaa.mp4" },
"cerebrai": { "key": "vega-char-cerebrai", "path": "assets/videos/vega/char-cerebai.mp4" },
"ssakar": { "key": "vega-char-ssakar", "path": "assets/videos/vega/char-ssakar.mp4" },
"lithox": { "key": "vega-char-lithox", "path": "assets/videos/vega/char-lithox.mp4" }
},
"_shipVideosReadme": "Per-hull SHIP COMMANDER loops — the officer flying that class — 256x256, muted, ~10s, keyed species -> hull id. These are a different thing from portraitVideos above: that is the species' leader on the diplomacy screen, this is one face per hull. A species with none recorded yet is null, and a hull with no entry inside a recorded species falls back to that species' portraitVideos clip, so the roster fills one race — or one hull — at a time with no code change. NOTE: the human colony ship's file is 'ship-human-colony.mp4' while the hull id is 'colonyship'; the path below points at the real filename, same class of mismatch as char-cerebai.mp4. There is deliberately no 'starbase' clip yet — it falls back like any other gap.",
"shipVideos": {
"human": {
"scout": { "key": "vega-ship-human-scout", "path": "assets/videos/vega/ship-human-scout.mp4" },
"colonyship": { "key": "vega-ship-human-colonyship", "path": "assets/videos/vega/ship-human-colony.mp4" },
"transport": { "key": "vega-ship-human-transport", "path": "assets/videos/vega/ship-human-transport.mp4" },
"frigate": { "key": "vega-ship-human-frigate", "path": "assets/videos/vega/ship-human-frigate.mp4" },
"destroyer": { "key": "vega-ship-human-destroyer", "path": "assets/videos/vega/ship-human-destroyer.mp4" },
"cruiser": { "key": "vega-ship-human-cruiser", "path": "assets/videos/vega/ship-human-cruiser.mp4" },
"battleship": { "key": "vega-ship-human-battleship", "path": "assets/videos/vega/ship-human-battleship.mp4" }
},
"kestrelli": {
"scout": { "key": "vega-ship-kestrelli-scout", "path": "assets/videos/vega/ship-kestrelli-scout.mp4" },
"colonyship": { "key": "vega-ship-kestrelli-colonyship", "path": "assets/videos/vega/ship-kestrelli-colony.mp4" },
"transport": { "key": "vega-ship-kestrelli-transport", "path": "assets/videos/vega/ship-kestrelli-transport.mp4" },
"frigate": { "key": "vega-ship-kestrelli-frigate", "path": "assets/videos/vega/ship-kestrelli-frigate.mp4" },
"destroyer": { "key": "vega-ship-kestrelli-destroyer", "path": "assets/videos/vega/ship-kestrelli-destroyer.mp4" },
"cruiser": { "key": "vega-ship-kestrelli-cruiser", "path": "assets/videos/vega/ship-kestrelli-cruiser.mp4" },
"battleship": { "key": "vega-ship-kestrelli-battleship", "path": "assets/videos/vega/ship-kestrelli-battleship.mp4" }
},
"ursaal": {
"scout": { "key": "vega-ship-ursaal-scout", "path": "assets/videos/vega/ship-ursaal-scout.mp4" },
"colonyship": { "key": "vega-ship-ursaal-colonyship", "path": "assets/videos/vega/ship-ursaal-colony.mp4" },
"transport": { "key": "vega-ship-ursaal-transport", "path": "assets/videos/vega/ship-ursaal-transport.mp4" },
"frigate": { "key": "vega-ship-ursaal-frigate", "path": "assets/videos/vega/ship-ursaal-frigate.mp4" },
"destroyer": { "key": "vega-ship-ursaal-destroyer", "path": "assets/videos/vega/ship-ursaal-destroyer.mp4" },
"cruiser": { "key": "vega-ship-ursaal-cruiser", "path": "assets/videos/vega/ship-ursaal-cruiser.mp4" },
"battleship": { "key": "vega-ship-ursaal-battleship", "path": "assets/videos/vega/ship-ursaal-battleship.mp4" }
},
"umbrix": {
"scout": { "key": "vega-ship-umbrix-scout", "path": "assets/videos/vega/ship-umbrix-scout.mp4" },
"colonyship": { "key": "vega-ship-umbrix-colonyship", "path": "assets/videos/vega/ship-umbrix-colony.mp4" },
"transport": { "key": "vega-ship-umbrix-transport", "path": "assets/videos/vega/ship-umbrix-transport.mp4" },
"frigate": { "key": "vega-ship-umbrix-frigate", "path": "assets/videos/vega/ship-umbrix-frigate.mp4" },
"destroyer": { "key": "vega-ship-umbrix-destroyer", "path": "assets/videos/vega/ship-umbrix-destroyer.mp4" },
"cruiser": { "key": "vega-ship-umbrix-cruiser", "path": "assets/videos/vega/ship-umbrix-cruiser.mp4" },
"battleship": { "key": "vega-ship-umbrix-battleship", "path": "assets/videos/vega/ship-umbrix-battleship.mp4" }
},
"kkrix": {
"scout": { "key": "vega-ship-kkrix-scout", "path": "assets/videos/vega/ship-kkrix-scout.mp4" },
"colonyship": { "key": "vega-ship-kkrix-colonyship", "path": "assets/videos/vega/ship-kkrix-colony.mp4" },
"transport": { "key": "vega-ship-kkrix-transport", "path": "assets/videos/vega/ship-kkrix-transport.mp4" },
"frigate": { "key": "vega-ship-kkrix-frigate", "path": "assets/videos/vega/ship-kkrix-frigate.mp4" },
"destroyer": { "key": "vega-ship-kkrix-destroyer", "path": "assets/videos/vega/ship-kkrix-destroyer.mp4" },
"cruiser": { "key": "vega-ship-kkrix-cruiser", "path": "assets/videos/vega/ship-kkrix-cruiser.mp4" },
"battleship": { "key": "vega-ship-kkrix-battleship", "path": "assets/videos/vega/ship-kkrix-battleship.mp4" }
},
"mekhan": {
"scout": { "key": "vega-ship-mekhan-scout", "path": "assets/videos/vega/ship-mekhan-scout.mp4" },
"colonyship": { "key": "vega-ship-mekhan-colonyship", "path": "assets/videos/vega/ship-mekhan-colony.mp4" },
"transport": { "key": "vega-ship-mekhan-transport", "path": "assets/videos/vega/ship-mekhan-transport.mp4" },
"frigate": { "key": "vega-ship-mekhan-frigate", "path": "assets/videos/vega/ship-mekhan-frigate.mp4" },
"destroyer": { "key": "vega-ship-mekhan-destroyer", "path": "assets/videos/vega/ship-mekhan-destroyer.mp4" },
"cruiser": { "key": "vega-ship-mekhan-cruiser", "path": "assets/videos/vega/ship-mekhan-cruiser.mp4" },
"battleship": { "key": "vega-ship-mekhan-battleship", "path": "assets/videos/vega/ship-mekhan-battleship.mp4" }
},
"rrashaa": {
"scout": { "key": "vega-ship-rrashaa-scout", "path": "assets/videos/vega/ship-rrashaa-scout.mp4" },
"colonyship": { "key": "vega-ship-rrashaa-colonyship", "path": "assets/videos/vega/ship-rrashaa-colony.mp4" },
"transport": { "key": "vega-ship-rrashaa-transport", "path": "assets/videos/vega/ship-rrashaa-transport.mp4" },
"frigate": { "key": "vega-ship-rrashaa-frigate", "path": "assets/videos/vega/ship-rrashaa-frigate.mp4" },
"destroyer": { "key": "vega-ship-rrashaa-destroyer", "path": "assets/videos/vega/ship-rrashaa-destroyer.mp4" },
"cruiser": { "key": "vega-ship-rrashaa-cruiser", "path": "assets/videos/vega/ship-rrashaa-cruiser.mp4" },
"battleship": { "key": "vega-ship-rrashaa-battleship", "path": "assets/videos/vega/ship-rrashaa-battleship.mp4" }
},
"cerebrai": {
"scout": { "key": "vega-ship-cerebrai-scout", "path": "assets/videos/vega/ship-cerebrai-scout.mp4" },
"colonyship": { "key": "vega-ship-cerebrai-colonyship", "path": "assets/videos/vega/ship-cerebrai-colony.mp4" },
"transport": { "key": "vega-ship-cerebrai-transport", "path": "assets/videos/vega/ship-cerebrai-transport.mp4" },
"frigate": { "key": "vega-ship-cerebrai-frigate", "path": "assets/videos/vega/ship-cerebrai-frigate.mp4" },
"destroyer": { "key": "vega-ship-cerebrai-destroyer", "path": "assets/videos/vega/ship-cerebrai-destroyer.mp4" },
"cruiser": { "key": "vega-ship-cerebrai-cruiser", "path": "assets/videos/vega/ship-cerebrai-cruiser.mp4" },
"battleship": { "key": "vega-ship-cerebrai-battleship", "path": "assets/videos/vega/ship-cerebrai-battleship.mp4" }
},
"ssakar": {
"scout": { "key": "vega-ship-ssakar-scout", "path": "assets/videos/vega/ship-ssakar-scout.mp4" },
"colonyship": { "key": "vega-ship-ssakar-colonyship", "path": "assets/videos/vega/ship-ssakar-colony.mp4" },
"transport": { "key": "vega-ship-ssakar-transport", "path": "assets/videos/vega/ship-ssakar-transport.mp4" },
"frigate": { "key": "vega-ship-ssakar-frigate", "path": "assets/videos/vega/ship-ssakar-frigate.mp4" },
"destroyer": { "key": "vega-ship-ssakar-destroyer", "path": "assets/videos/vega/ship-ssakar-destroyer.mp4" },
"cruiser": { "key": "vega-ship-ssakar-cruiser", "path": "assets/videos/vega/ship-ssakar-cruiser.mp4" },
"battleship": { "key": "vega-ship-ssakar-battleship", "path": "assets/videos/vega/ship-ssakar-battleship.mp4" }
},
"lithox": {
"scout": { "key": "vega-ship-lithox-scout", "path": "assets/videos/vega/ship-lithox-scout.mp4" },
"colonyship": { "key": "vega-ship-lithox-colonyship", "path": "assets/videos/vega/ship-lithox-colony.mp4" },
"transport": { "key": "vega-ship-lithox-transport", "path": "assets/videos/vega/ship-lithox-transport.mp4" },
"frigate": { "key": "vega-ship-lithox-frigate", "path": "assets/videos/vega/ship-lithox-frigate.mp4" },
"destroyer": { "key": "vega-ship-lithox-destroyer", "path": "assets/videos/vega/ship-lithox-destroyer.mp4" },
"cruiser": { "key": "vega-ship-lithox-cruiser", "path": "assets/videos/vega/ship-lithox-cruiser.mp4" },
"battleship": { "key": "vega-ship-lithox-battleship", "path": "assets/videos/vega/ship-lithox-battleship.mp4" }
}
},
"_portraitStillsReadme": "High-resolution (1024x1024) still portraits, one per species. Every species now has a video too, so these serve as the recovery path if a video fails to decode. NOTE: kestrelli's file is spelled 'char-kestralli.png' on disk — the path below points at the real filename; rename the file and this one line together if you want the spelling fixed.",
"portraitStills": {
"human": { "key": "vega-still-human", "path": "assets/images/vega/char-human.png" },
"kestrelli": { "key": "vega-still-kestrelli", "path": "assets/images/vega/char-kestralli.png" },
"ursaal": { "key": "vega-still-ursaal", "path": "assets/images/vega/char-ursaal.png" },
"umbrix": { "key": "vega-still-umbrix", "path": "assets/images/vega/char-umbrix.png" },
"kkrix": { "key": "vega-still-kkrix", "path": "assets/images/vega/char-kkrix.png" },
"mekhan": { "key": "vega-still-mekhan", "path": "assets/images/vega/char-mekhan.png" },
"rrashaa": { "key": "vega-still-rrashaa", "path": "assets/images/vega/char-rrashaa.png" },
"cerebrai": { "key": "vega-still-cerebrai", "path": "assets/images/vega/char-cerebrai.png" },
"ssakar": { "key": "vega-still-ssakar", "path": "assets/images/vega/char-ssakar.png" },
"lithox": { "key": "vega-still-lithox", "path": "assets/images/vega/char-lithox.png" }
},
"_worldBackgroundsReadme": "Full-screen 1920x1080 OPAQUE backdrops for the colony screen, one per planetType id. These are NOT the 'planets' sheet — that one holds transparent 192x192 discs for the orrery. A null path falls back to a gradient painted from planetTypes[].color, so the roster can be finished one world at a time. The '-01' suffix is a variant slot. NOTE: the gas giant's file is spelled 'world-gas-giant-01.png' with a hyphen while the rules id is 'gasgiant' — the path below points at the real filename. 'jungle' is the one colonisable type still outstanding.",
"worldBackgrounds": {
"terran": { "key": "vega-world-terran", "path": "assets/images/vega/world-terran-01.png" },
"ocean": { "key": "vega-world-ocean", "path": "assets/images/vega/world-ocean-01.png" },
"jungle": { "key": "vega-world-jungle", "path": "assets/images/vega/world-jungle-01.png" },
"steppe": { "key": "vega-world-steppe", "path": "assets/images/vega/world-steppe-01.png" },
"arid": { "key": "vega-world-arid", "path": "assets/images/vega/world-arid-01.png" },
"desert": { "key": "vega-world-desert", "path": "assets/images/vega/world-desert-01.png" },
"tundra": { "key": "vega-world-tundra", "path": "assets/images/vega/world-tundra-01.png" },
"minimal": { "key": "vega-world-minimal", "path": "assets/images/vega/world-minimal-01.png" },
"barren": { "key": "vega-world-barren", "path": "assets/images/vega/world-barren-01.png" },
"dead": { "key": "vega-world-dead", "path": "assets/images/vega/world-dead-01.png" },
"inferno": { "key": "vega-world-inferno", "path": "assets/images/vega/world-inferno-01.png" },
"toxic": { "key": "vega-world-toxic", "path": "assets/images/vega/world-toxic-01.png" },
"radiated": { "key": "vega-world-radiated", "path": "assets/images/vega/world-radiated-01.png" },
"gasgiant": { "key": "vega-world-gasgiant", "path": "assets/images/vega/world-gas-giant-01.png" },
"asteroids": { "key": "vega-world-asteroids", "path": null }
},
"_colonyVideosReadme": "Colony-founding VIGNETTE clips — 960x544, muted, ~10s, one per COLONISABLE planetType id. VegaColonyIntro.js plays one full-screen the moment the player plants a colony, over assets/music/vega/colony.mp3. Only colonisable types are listed: canColonize() rejects gasgiant and asteroids before any species trait is consulted, so a clip for those could never play. A null path — or a colonisable type missing from this block — falls back to that type's worldBackgrounds still, and then to the gradient, exactly like the colony screen, so a newly colonisable world is presentable the day it is added.",
"colonyVideos": {
"terran": { "key": "vega-colony-terran", "path": "assets/videos/vega/colony-terran.mp4" },
"ocean": { "key": "vega-colony-ocean", "path": "assets/videos/vega/colony-ocean.mp4" },
"jungle": { "key": "vega-colony-jungle", "path": "assets/videos/vega/colony-jungle.mp4" },
"steppe": { "key": "vega-colony-steppe", "path": "assets/videos/vega/colony-steppe.mp4" },
"arid": { "key": "vega-colony-arid", "path": "assets/videos/vega/colony-arid.mp4" },
"desert": { "key": "vega-colony-desert", "path": "assets/videos/vega/colony-desert.mp4" },
"tundra": { "key": "vega-colony-tundra", "path": "assets/videos/vega/colony-tundra.mp4" },
"minimal": { "key": "vega-colony-minimal", "path": "assets/videos/vega/colony-minimal.mp4" },
"barren": { "key": "vega-colony-barren", "path": "assets/videos/vega/colony-barren.mp4" },
"dead": { "key": "vega-colony-dead", "path": "assets/videos/vega/colony-dead.mp4" },
"inferno": { "key": "vega-colony-inferno", "path": "assets/videos/vega/colony-inferno.mp4" },
"toxic": { "key": "vega-colony-toxic", "path": "assets/videos/vega/colony-toxic.mp4" },
"radiated": { "key": "vega-colony-radiated", "path": "assets/videos/vega/colony-radiated.mp4" }
},
"_bombardVideosReadme": "Bombard/Invade popup clips (VegaBombardScreen.js) — 16:9, muted, looping, one per COLONISABLE planetType id (a colony can only ever exist on one of those, same set as colonyVideos above). Only a subset is recorded so far. A colonisable type missing from this block falls back to the 'terran' entry (Brian's call, 2026-08-14) rather than to a still image — there is no bombardment-appropriate still to fall back to the way colonyVideos falls back to worldBackgrounds — so the popup always has SOME footage even for an as-yet-unrecorded world type. If 'terran' itself is ever removed, the popup falls back further to no video at all (headline text only), same as colonyVideos falling all the way through to the gradient. Naming: assets/videos/vega/bombard-<typeId>.mp4.",
"bombardVideos": {
"terran": { "key": "vega-bombard-terran", "path": "assets/videos/vega/bombard-terran.mp4" },
"ocean": { "key": "vega-bombard-ocean", "path": "assets/videos/vega/bombard-ocean.mp4" },
"tundra": { "key": "vega-bombard-tundra", "path": "assets/videos/vega/bombard-tundra.mp4" },
"jungle": { "key": "vega-bombard-jungle", "path": "assets/videos/vega/bombard-jungle.mp4" },
"inferno": { "key": "vega-bombard-inferno", "path": "assets/videos/vega/bombard-inferno.mp4" },
"arid": { "key": "vega-bombard-arid", "path": "assets/videos/vega/bombard-arid.mp4" },
"desert": { "key": "vega-bombard-desert", "path": "assets/videos/vega/bombard-desert.mp4" },
"toxic": { "key": "vega-bombard-toxic", "path": "assets/videos/vega/bombard-toxic.mp4" },
"steppe": { "key": "vega-bombard-steppe", "path": "assets/videos/vega/bombard-steppe.mp4" },
"minimal": { "key": "vega-bombard-minimal", "path": "assets/videos/vega/bombard-minimal.mp4" },
"barren": { "key": "vega-bombard-barren", "path": "assets/videos/vega/bombard-barren.mp4" },
"dead": { "key": "vega-bombard-dead", "path": "assets/videos/vega/bombard-dead.mp4" },
"radiated": { "key": "vega-bombard-radiated", "path": "assets/videos/vega/bombard-radiated.mp4" }
},
"_invadeVideosReadme": "Invasion popup clips (VegaBombardScreen.js) — 16:9, muted, looping, one per SPECIES (the INVADING empire's species, not the target planet's type — landing troops is about who's doing the landing). Brian's call (2026-08-14): no per-species invasion footage exists yet, so every entry below is a PLACEHOLDER pointing at the bombard-terran clip until real footage is recorded. Swap one in the same way as every other JIT video set here: drop assets/videos/vega/invade-<speciesId>.mp4 and repoint that species' path at it — nothing else changes. A species entirely absent (or with a null path) falls back to no video at all (headline text only), same as bombardVideos falling through when even 'terran' is missing.",
"invadeVideos": {
"human": { "key": "vega-invade-human", "path": "assets/videos/vega/invade-human.mp4" },
"kestrelli": { "key": "vega-invade-kestrelli", "path": "assets/videos/vega/invade-kestrelli.mp4" },
"ursaal": { "key": "vega-invade-ursaal", "path": "assets/videos/vega/invade-ursaal.mp4" },
"umbrix": { "key": "vega-invade-umbrix", "path": "assets/videos/vega/invade-umbrix.mp4" },
"kkrix": { "key": "vega-invade-kkrix", "path": "assets/videos/vega/invade-kkrix.mp4" },
"mekhan": { "key": "vega-invade-mekhan", "path": "assets/videos/vega/invade-mekhan.mp4" },
"rrashaa": { "key": "vega-invade-rrashaa", "path": "assets/videos/vega/invade-rrashaa.mp4" },
"cerebrai": { "key": "vega-invade-cerebrai", "path": "assets/videos/vega/invade-cerebrai.mp4" },
"ssakar": { "key": "vega-invade-ssakar", "path": "assets/videos/vega/invade-ssakar.mp4" },
"lithox": { "key": "vega-invade-lithox", "path": "assets/videos/vega/invade-lithox.mp4" }
},
"_audienceVideosReadme": "Audience-screen MOOD clips for the full-screen diplomacy interface — one per diplomacy-capable species x {angry, neutral, happy}, muted, looping. Recorded at 896x576 (1.5556:1, close to but not exactly the 3:2 the VegaAudience.js frame is cut to — the clip is scaled by WIDTH only, never setDisplaySize, so it sits slightly short of the frame's full height rather than being stretched). Lithox has no entry at all: canNegotiate() is permanently false for them (traits.diplomacy <= -100), so the Audience screen never opens for that species and a clip would never play. A species entirely absent (null) or a mood missing inside a recorded species falls back to that species' portraitVideos clip (256x256, letterboxed to 3:2), then to portraitStills — same three-tier fallback convention as makeSpeciesPortrait, so the roster fills one species (or one mood) at a time with no code change. Naming: assets/videos/vega/audience-<speciesId>-<mood>.mp4.",
"audienceVideos": {
"human": {
"angry": { "key": "vega-audience-human-angry", "path": "assets/videos/vega/audience-human-angry.mp4" },
"neutral": { "key": "vega-audience-human-neutral", "path": "assets/videos/vega/audience-human-neutral.mp4" },
"happy": { "key": "vega-audience-human-happy", "path": "assets/videos/vega/audience-human-happy.mp4" }
},
"kestrelli": {
"angry": { "key": "vega-audience-kestrelli-angry", "path": "assets/videos/vega/audience-kestrelli-angry.mp4" },
"neutral": { "key": "vega-audience-kestrelli-neutral", "path": "assets/videos/vega/audience-kestrelli-neutral.mp4" },
"happy": { "key": "vega-audience-kestrelli-happy", "path": "assets/videos/vega/audience-kestrelli-happy.mp4" }
},
"ursaal": {
"angry": { "key": "vega-audience-ursaal-angry", "path": "assets/videos/vega/audience-ursaal-angry.mp4" },
"neutral": { "key": "vega-audience-ursaal-neutral", "path": "assets/videos/vega/audience-ursaal-neutral.mp4" },
"happy": { "key": "vega-audience-ursaal-happy", "path": "assets/videos/vega/audience-ursaal-happy.mp4" }
},
"umbrix": {
"angry": { "key": "vega-audience-umbrix-angry", "path": "assets/videos/vega/audience-umbrix-angry.mp4" },
"neutral": { "key": "vega-audience-umbrix-neutral", "path": "assets/videos/vega/audience-umbrix-neutral.mp4" },
"happy": { "key": "vega-audience-umbrix-happy", "path": "assets/videos/vega/audience-umbrix-happy.mp4" }
},
"kkrix": {
"angry": { "key": "vega-audience-kkrix-angry", "path": "assets/videos/vega/audience-kkrix-angry.mp4" },
"neutral": { "key": "vega-audience-kkrix-neutral", "path": "assets/videos/vega/audience-kkrix-neutral.mp4" },
"happy": { "key": "vega-audience-kkrix-happy", "path": "assets/videos/vega/audience-kkrix-happy.mp4" }
},
"mekhan": {
"angry": { "key": "vega-audience-mekhan-angry", "path": "assets/videos/vega/audience-mekhan-angry.mp4" },
"neutral": { "key": "vega-audience-mekhan-neutral", "path": "assets/videos/vega/audience-mekhan-neutral.mp4" },
"happy": { "key": "vega-audience-mekhan-happy", "path": "assets/videos/vega/audience-mekhan-happy.mp4" }
},
"rrashaa": {
"angry": { "key": "vega-audience-rrashaa-angry", "path": "assets/videos/vega/audience-rrashaa-angry.mp4" },
"neutral": { "key": "vega-audience-rrashaa-neutral", "path": "assets/videos/vega/audience-rrashaa-neutral.mp4" },
"happy": { "key": "vega-audience-rrashaa-happy", "path": "assets/videos/vega/audience-rrashaa-happy.mp4" }
},
"cerebrai": {
"angry": { "key": "vega-audience-cerebrai-angry", "path": "assets/videos/vega/audience-cerebrai-angry.mp4" },
"neutral": { "key": "vega-audience-cerebrai-neutral", "path": "assets/videos/vega/audience-cerebrai-neutral.mp4" },
"happy": { "key": "vega-audience-cerebrai-happy", "path": "assets/videos/vega/audience-cerebrai-happy.mp4" }
},
"ssakar": {
"angry": { "key": "vega-audience-ssakar-angry", "path": "assets/videos/vega/audience-ssakar-angry.mp4" },
"neutral": { "key": "vega-audience-ssakar-neutral", "path": "assets/videos/vega/audience-ssakar-neutral.mp4" },
"happy": { "key": "vega-audience-ssakar-happy", "path": "assets/videos/vega/audience-ssakar-happy.mp4" }
}
},
"_researchVideosReadme": "Research-screen ambient loops — one per species, showing that species' scientists at work, muted, looping continuously (setLoop(true), unlike the audience screen's play-once mood clips above). Recorded 2:3 (portrait). JIT-loaded like colonyVideos/audienceVideos, NOT eager via assetManifest.js — Research only ever shows the human player's own species, so there is no reason to fetch the other nine at game-room entry. A species with no clip recorded falls back to its portraitVideos clip (256x256, letterboxed to 2:3), then portraitStills — same three-tier fallback convention as makeSpeciesPortrait. Naming: assets/videos/vega/research-<speciesId>.mp4.",
"researchVideos": {
"human": { "key": "vega-research-human", "path": "assets/videos/vega/research-human.mp4" },
"kestrelli": { "key": "vega-research-kestrelli", "path": "assets/videos/vega/research-kestrelli.mp4" },
"ursaal": { "key": "vega-research-ursaal", "path": "assets/videos/vega/research-ursaal.mp4" },
"umbrix": { "key": "vega-research-umbrix", "path": "assets/videos/vega/research-umbrix.mp4" },
"kkrix": { "key": "vega-research-kkrix", "path": "assets/videos/vega/research-kkrix.mp4" },
"mekhan": { "key": "vega-research-mekhan", "path": "assets/videos/vega/research-mekhan.mp4" },
"rrashaa": { "key": "vega-research-rrashaa", "path": "assets/videos/vega/research-rrashaa.mp4" },
"cerebrai": { "key": "vega-research-cerebrai", "path": "assets/videos/vega/research-cerebrai.mp4" },
"ssakar": { "key": "vega-research-ssakar", "path": "assets/videos/vega/research-ssakar.mp4" },
"lithox": { "key": "vega-research-lithox", "path": "assets/videos/vega/research-lithox.mp4" }
},
"_advisorVideosReadme": "Colonies-screen advisor loops (VegaColoniesScreen.js) — one per species, a distinct COLONIAL ADVISOR persona, not the leader portrait (portraitVideos) and not the research scientist (researchVideos). Muted, looping continuously. Recorded 1:1 (square), like the leader portraits, not the 2:3 research clips. JIT-loaded like colonyVideos/audienceVideos/researchVideos, NOT eager via assetManifest.js — the Colonies screen only ever shows the human player's own species. A species with no clip recorded falls back to its portraitVideos clip, then portraitStills — same three-tier fallback convention as makeSpeciesPortrait. To add or replace one: drop the file and set its path here; nothing else changes. Naming: assets/videos/vega/advisor-<speciesId>.mp4.",
"advisorVideos": {
"human": { "key": "vega-advisor-human", "path": "assets/videos/vega/colad-human.mp4" },
"kestrelli": { "key": "vega-advisor-kestrelli", "path": "assets/videos/vega/colad-kestrelli.mp4" },
"ursaal": { "key": "vega-advisor-ursaal", "path": "assets/videos/vega/colad-ursaal.mp4" },
"umbrix": { "key": "vega-advisor-umbrix", "path": "assets/videos/vega/colad-umbrix.mp4" },
"kkrix": { "key": "vega-advisor-kkrix", "path": "assets/videos/vega/colad-kkrix.mp4" },
"mekhan": { "key": "vega-advisor-mekhan", "path": "assets/videos/vega/colad-mekhan.mp4" },
"rrashaa": { "key": "vega-advisor-rrashaa", "path": "assets/videos/vega/colad-rrashaa.mp4" },
"cerebrai": { "key": "vega-advisor-cerebrai", "path": "assets/videos/vega/colad-cerebrai.mp4" },
"ssakar": { "key": "vega-advisor-ssakar", "path": "assets/videos/vega/colad-ssakar.mp4" },
"lithox": { "key": "vega-advisor-lithox", "path": "assets/videos/vega/colad-lithox.mp4" }
},
"sheets": {
"ships": {
"key": "vega-ships",
"path": "assets/images/vega/ships.png",
"kind": "ship",
"frameWidth": 192,
"frameHeight": 192,
"cols": 8,
"rows": 10,
"_layout": "One row per species (species.shipFrame), one column per hull (hull.frame). Frame = shipFrame * 8 + hull.frame. Ships face UP at frame rest."
},
"planets": {
"key": "vega-planets",
"path": "assets/images/vega/planets.png",
"kind": "planet",
"frameWidth": 192,
"frameHeight": 192,
"cols": 5,
"rows": 3,
"_layout": "One frame per planetType.frame, 0-14, in the order planetTypes appears in the rules file."
},
"stars": {
"key": "vega-stars",
"path": null,
"kind": "star",
"frameWidth": 192,
"frameHeight": 192,
"cols": 3,
"rows": 3,
"_layout": "One frame per starClass, in rules order: blue, white, yellow, orange, red, brown, binary, pulsar, blackhole."
},
"portraits": {
"key": "vega-portraits",
"path": null,
"kind": "portrait",
"frameWidth": 256,
"frameHeight": 256,
"cols": 5,
"rows": 2,
"_layout": "One frame per species.portraitFrame, 0-9, in rules order."
},
"leaders": {
"key": "vega-leaders",
"path": "assets/images/vega/leaders.png",
"kind": "portrait",
"frameWidth": 160,
"frameHeight": 160,
"cols": 4,
"rows": 4,
"_layout": "One frame per leader.portraitFrame, 0-15, in rules order."
},
"buildings": {
"key": "vega-buildings",
"path": "assets/images/vega/buildings.png",
"kind": "icon",
"frameWidth": 64,
"frameHeight": 64,
"cols": 8,
"rows": 2,
"_layout": "One frame per building.frame, 0-15, in rules order."
},
"techfields": {
"key": "vega-techfields",
"path": "assets/images/vega/techfields.png",
"kind": "icon",
"frameWidth": 48,
"frameHeight": 48,
"cols": 3,
"rows": 2,
"_layout": "One frame per tech FIELD (techFields[].iconFrame), 0-5, in rules order: Computers, Construction, Force Fields, Planetology, Propulsion, Weapons. Exact fit, no spares."
},
"techicons": {
"key": "vega-techicons",
"path": null,
"kind": "icon",
"frameWidth": 48,
"frameHeight": 48,
"cols": 10,
"rows": 10,
"_layout": "One frame per individual tech (techs[].iconFrame), 0-90 — the 60 original techs plus two MOO1-branching passes added later, in rules order. Split out of the combined tech sheet so field icons and tech icons can be painted/sized independently. 91-99 spare."
},
"allocation": {
"key": "vega-allocation",
"path": "assets/images/vega/allocation.png",
"kind": "icon",
"frameWidth": 48,
"frameHeight": 48,
"cols": 5,
"rows": 1,
"_layout": "One frame per allocation channel, in CHANNELS order (VegaLogic.js): 0 ships (Construction), 1 defense (Defence), 2 industry (Industry), 3 ecology (Ecology), 4 research (Research). Shown beside each slider label on the colony screen (VegaColonyView.js)."
}
}
}