253 lines
19 KiB
JSON
253 lines
19 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": null,
|
|
"cerebrai": null,
|
|
"ssakar": null,
|
|
"lithox": null
|
|
},
|
|
|
|
"_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" }
|
|
},
|
|
|
|
"_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-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" }
|
|
},
|
|
"umbrix": {
|
|
"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" }
|
|
},
|
|
"kkrix": {
|
|
"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" }
|
|
},
|
|
"mekhan": {
|
|
"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" }
|
|
},
|
|
"rrashaa": {
|
|
"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" }
|
|
},
|
|
"cerebrai": {
|
|
"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" }
|
|
},
|
|
"ssakar": {
|
|
"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" }
|
|
}
|
|
},
|
|
|
|
"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": null,
|
|
"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": null,
|
|
"kind": "icon",
|
|
"frameWidth": 64,
|
|
"frameHeight": 64,
|
|
"cols": 8,
|
|
"rows": 2,
|
|
"_layout": "One frame per building.frame, 0-15, in rules order."
|
|
},
|
|
"techicons": {
|
|
"key": "vega-techicons",
|
|
"path": null,
|
|
"kind": "icon",
|
|
"frameWidth": 48,
|
|
"frameHeight": 48,
|
|
"cols": 10,
|
|
"rows": 7,
|
|
"_layout": "Frames 0-5 are the six tech FIELDS (techFields[].iconFrame); frames 6-65 are the individual techs (techs[].iconFrame). 66-69 spare."
|
|
}
|
|
}
|
|
}
|