diff --git a/MEGAPLAN.md b/MEGAPLAN.md index 3e02e22..9b4b74f 100644 --- a/MEGAPLAN.md +++ b/MEGAPLAN.md @@ -195,6 +195,17 @@ faction, or it reads as clip-art soup. Fix the Blender camera rig once, reuse. ## 6. Known traps +Learned the hard way on 2026-07-20 (phases A–F): + +- **Smoke-test any change by launching straight into a game**: `./launch-game.sh Game.Mod=vinylgod Launch.Map=vinylgod` — `Launch.Map` accepts the map's *folder name*, no UID needed. Run ~45s, then check `~/Library/Application Support/OpenRA/Logs/` for `exception-*.log` (renamed with a timestamp on crash — absence of `exception.log` alone proves nothing). +- **The shellmap is the integration test**: it runs a bot-vs-bot match (BotA MRP vs BotB Stream, `Bot: wax` in map.yaml) behind the main menu. If a trait wiring is broken, the menu crashes within seconds. +- Chrome image collections must be **power-of-two** textures (a 48×48 png crashes the renderer). +- Every rules file must use the same case for shared top-level actors: `player:` not `Player:` — mismatched case = "duplicate values" manifest error. +- Speech notification `Sounds`/`Speech` blocks: set `DefaultVariant: .wav` (engine default is `.aud`). +- MODELBEAST `music_local` takes `prompt` (not `tags`); `tts_local` takes `text`. +- `ConquestVictoryConditions` needs `MapOptions:` on the world actor; `Health` needs `HitShape`; actors need a visibility trait (`HiddenUnderFog:`); `Selectable` already includes `Interactable` (don't add both). +- `StartingUnits.SupportActors` must be mobile units, never buildings. +- In zsh scripts: `UID` is a readonly shell variable, and an unmatched glob aborts the whole command line (`setopt nonomatch` first). - **Forgot `DOTNET_ROLL_FORWARD=LatestMajor`** → "framework 6.0.0 not found" crash. - Every actor referenced in a map/rules needs a sequences entry, even placeholders. - Trait names change between engine releases — trust `engine/mods/ra` on THIS diff --git a/assets_src/PROMPTS.md b/assets_src/PROMPTS.md index e8d6d60..82a436d 100644 --- a/assets_src/PROMPTS.md +++ b/assets_src/PROMPTS.md @@ -8,3 +8,26 @@ All images generated locally on MODELBEAST (`flux_local`) via `tools/mbgen.py`. | concepts/digger.png | 2026-07-20 | rusty junkyard forklift monster robot with crate claw carrying milk crates of black vinyl records, hot pink trim, CRT eye, 3/4 view, isometric game unit concept art, plain grey background | | concepts/pressplant.png | 2026-07-20 | industrial hydraulic vinyl record pressing plant building, steam vents, conveyor belt of fresh records, rust and hot pink, isometric RTS building concept art, plain grey background | | concepts/drmwalker.png | 2026-07-20 | glossy white faceless robot mech with single blue ring-light eye, chest is a glowing paywall screen, smooth rounded seamless design, isometric game unit concept art, plain grey background — *came out small/cute; reuse as `bufferbot`, re-prompt drmwalker with "towering, menacing, tall bipedal mech"* | +| renders/popupvan.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, small delivery truck covered in band stickers and a roof-mounted loudspeaker, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/popupshop.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, record store shack built from shipping containers with neon OPEN sign and crane arm, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/pressplant.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, industrial hydraulic vinyl record pressing plant building with steam vents and conveyor of records, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/ampstack.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, wall of stacked guitar amplifiers crackling with pink energy, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/vault.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, squat bunker with a huge round bank vault door and stacked record crates, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/merchtable.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, folding merch table under a small tent with t-shirts and records, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/garage.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, corrugated iron vehicle workshop with engine hoist and band posters, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/mastering.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, pristine acoustic-panelled recording studio grafted onto a junk tower with satellite dish, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/digger.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, forklift monster robot with crate claw carrying milk crates of vinyl records, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/spinner.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, small agile one-wheeled robot whose wheel is a spinning vinyl record with blade tonearms, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/stacktank.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, two-legged walker mech made of stacked speaker cabinets with subwoofer chest, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/basscannon.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, six-wheeled flatbed truck hauling one colossal subwoofer cannon with fold-out legs, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/djgrunt.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, small hooded robot with a portable turntable chest rig holding a razor-sharp record, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/roadie.png | 2026-07-20 | rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, four-armed robot with gaffer tape bandoliers and a flight case backpack, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/streamvan.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, autonomous white delivery van with a glowing blue play-button logo, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/streamhub.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, white monolithic server hub building with one huge blue status ring, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/datacentre.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, humming white server monolith with a single blue LED strip, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/transcoder.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, white cube building that swallows records on a conveyor, receipts coming out, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/podfarm.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, vending machine wall dispensing small white sphere robots, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/printfarm.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, white 3d-printer factory building with robotic arms assembling drones, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/scraper.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, autonomous white street sweeper vehicle inhaling black vinyl through a glowing blue intake, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/bufferbot.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, knee-high white sphere robot with a loading spinner face, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | +| renders/drmwalker.png | 2026-07-20 | glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, tall faceless white mech with one blue ring-light eye and a glowing paywall screen chest, isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text | diff --git a/assets_src/audio/probe.wav b/assets_src/audio/probe.wav new file mode 100644 index 0000000..d0841c1 Binary files /dev/null and b/assets_src/audio/probe.wav differ diff --git a/assets_src/contact_sheet.png b/assets_src/contact_sheet.png new file mode 100644 index 0000000..96bf8b2 Binary files /dev/null and b/assets_src/contact_sheet.png differ diff --git a/assets_src/renders/ampstack.png b/assets_src/renders/ampstack.png new file mode 100644 index 0000000..db40296 Binary files /dev/null and b/assets_src/renders/ampstack.png differ diff --git a/assets_src/renders/ampstack_raw.png b/assets_src/renders/ampstack_raw.png new file mode 100644 index 0000000..04eec7a Binary files /dev/null and b/assets_src/renders/ampstack_raw.png differ diff --git a/assets_src/renders/basscannon.png b/assets_src/renders/basscannon.png new file mode 100644 index 0000000..143fdff Binary files /dev/null and b/assets_src/renders/basscannon.png differ diff --git a/assets_src/renders/basscannon_raw.png b/assets_src/renders/basscannon_raw.png new file mode 100644 index 0000000..328b488 Binary files /dev/null and b/assets_src/renders/basscannon_raw.png differ diff --git a/assets_src/renders/bufferbot.png b/assets_src/renders/bufferbot.png new file mode 100644 index 0000000..f31a24d Binary files /dev/null and b/assets_src/renders/bufferbot.png differ diff --git a/assets_src/renders/bufferbot_raw.png b/assets_src/renders/bufferbot_raw.png new file mode 100644 index 0000000..30644b5 Binary files /dev/null and b/assets_src/renders/bufferbot_raw.png differ diff --git a/assets_src/renders/datacentre.png b/assets_src/renders/datacentre.png new file mode 100644 index 0000000..90a345a Binary files /dev/null and b/assets_src/renders/datacentre.png differ diff --git a/assets_src/renders/datacentre_raw.png b/assets_src/renders/datacentre_raw.png new file mode 100644 index 0000000..039cc8f Binary files /dev/null and b/assets_src/renders/datacentre_raw.png differ diff --git a/assets_src/renders/digger.png b/assets_src/renders/digger.png new file mode 100644 index 0000000..2b4626f Binary files /dev/null and b/assets_src/renders/digger.png differ diff --git a/assets_src/renders/digger_raw.png b/assets_src/renders/digger_raw.png new file mode 100644 index 0000000..58dc7c9 Binary files /dev/null and b/assets_src/renders/digger_raw.png differ diff --git a/assets_src/renders/djgrunt.png b/assets_src/renders/djgrunt.png new file mode 100644 index 0000000..bb98fe9 Binary files /dev/null and b/assets_src/renders/djgrunt.png differ diff --git a/assets_src/renders/djgrunt_raw.png b/assets_src/renders/djgrunt_raw.png new file mode 100644 index 0000000..369bc0f Binary files /dev/null and b/assets_src/renders/djgrunt_raw.png differ diff --git a/assets_src/renders/drmwalker.png b/assets_src/renders/drmwalker.png new file mode 100644 index 0000000..a700bb9 Binary files /dev/null and b/assets_src/renders/drmwalker.png differ diff --git a/assets_src/renders/drmwalker_raw.png b/assets_src/renders/drmwalker_raw.png new file mode 100644 index 0000000..394d452 Binary files /dev/null and b/assets_src/renders/drmwalker_raw.png differ diff --git a/assets_src/renders/garage.png b/assets_src/renders/garage.png new file mode 100644 index 0000000..40f9432 Binary files /dev/null and b/assets_src/renders/garage.png differ diff --git a/assets_src/renders/garage_raw.png b/assets_src/renders/garage_raw.png new file mode 100644 index 0000000..f62482f Binary files /dev/null and b/assets_src/renders/garage_raw.png differ diff --git a/assets_src/renders/mastering.png b/assets_src/renders/mastering.png new file mode 100644 index 0000000..a89ead4 Binary files /dev/null and b/assets_src/renders/mastering.png differ diff --git a/assets_src/renders/mastering_raw.png b/assets_src/renders/mastering_raw.png new file mode 100644 index 0000000..0455af9 Binary files /dev/null and b/assets_src/renders/mastering_raw.png differ diff --git a/assets_src/renders/merchtable.png b/assets_src/renders/merchtable.png new file mode 100644 index 0000000..0223822 Binary files /dev/null and b/assets_src/renders/merchtable.png differ diff --git a/assets_src/renders/merchtable_raw.png b/assets_src/renders/merchtable_raw.png new file mode 100644 index 0000000..69bc0d4 Binary files /dev/null and b/assets_src/renders/merchtable_raw.png differ diff --git a/assets_src/renders/podfarm.png b/assets_src/renders/podfarm.png new file mode 100644 index 0000000..f1b84f3 Binary files /dev/null and b/assets_src/renders/podfarm.png differ diff --git a/assets_src/renders/podfarm_raw.png b/assets_src/renders/podfarm_raw.png new file mode 100644 index 0000000..1798526 Binary files /dev/null and b/assets_src/renders/podfarm_raw.png differ diff --git a/assets_src/renders/popupshop.png b/assets_src/renders/popupshop.png new file mode 100644 index 0000000..75ed888 Binary files /dev/null and b/assets_src/renders/popupshop.png differ diff --git a/assets_src/renders/popupshop_raw.png b/assets_src/renders/popupshop_raw.png new file mode 100644 index 0000000..2670910 Binary files /dev/null and b/assets_src/renders/popupshop_raw.png differ diff --git a/assets_src/renders/popupvan.png b/assets_src/renders/popupvan.png new file mode 100644 index 0000000..f5f9f6b Binary files /dev/null and b/assets_src/renders/popupvan.png differ diff --git a/assets_src/renders/popupvan_raw.png b/assets_src/renders/popupvan_raw.png new file mode 100644 index 0000000..641f449 Binary files /dev/null and b/assets_src/renders/popupvan_raw.png differ diff --git a/assets_src/renders/pressplant.png b/assets_src/renders/pressplant.png new file mode 100644 index 0000000..9990ea2 Binary files /dev/null and b/assets_src/renders/pressplant.png differ diff --git a/assets_src/renders/pressplant_raw.png b/assets_src/renders/pressplant_raw.png new file mode 100644 index 0000000..fdd4e13 Binary files /dev/null and b/assets_src/renders/pressplant_raw.png differ diff --git a/assets_src/renders/printfarm.png b/assets_src/renders/printfarm.png new file mode 100644 index 0000000..8ddc9d9 Binary files /dev/null and b/assets_src/renders/printfarm.png differ diff --git a/assets_src/renders/printfarm_raw.png b/assets_src/renders/printfarm_raw.png new file mode 100644 index 0000000..ce0d177 Binary files /dev/null and b/assets_src/renders/printfarm_raw.png differ diff --git a/assets_src/renders/roadie.png b/assets_src/renders/roadie.png new file mode 100644 index 0000000..ecc23c9 Binary files /dev/null and b/assets_src/renders/roadie.png differ diff --git a/assets_src/renders/roadie_raw.png b/assets_src/renders/roadie_raw.png new file mode 100644 index 0000000..d651b92 Binary files /dev/null and b/assets_src/renders/roadie_raw.png differ diff --git a/assets_src/renders/scraper.png b/assets_src/renders/scraper.png new file mode 100644 index 0000000..edd2a55 Binary files /dev/null and b/assets_src/renders/scraper.png differ diff --git a/assets_src/renders/scraper_raw.png b/assets_src/renders/scraper_raw.png new file mode 100644 index 0000000..f8d32dd Binary files /dev/null and b/assets_src/renders/scraper_raw.png differ diff --git a/assets_src/renders/spinner.png b/assets_src/renders/spinner.png new file mode 100644 index 0000000..4bae4ce Binary files /dev/null and b/assets_src/renders/spinner.png differ diff --git a/assets_src/renders/spinner_raw.png b/assets_src/renders/spinner_raw.png new file mode 100644 index 0000000..0901bcd Binary files /dev/null and b/assets_src/renders/spinner_raw.png differ diff --git a/assets_src/renders/stacktank.png b/assets_src/renders/stacktank.png new file mode 100644 index 0000000..8228945 Binary files /dev/null and b/assets_src/renders/stacktank.png differ diff --git a/assets_src/renders/stacktank_raw.png b/assets_src/renders/stacktank_raw.png new file mode 100644 index 0000000..d22903f Binary files /dev/null and b/assets_src/renders/stacktank_raw.png differ diff --git a/assets_src/renders/streamhub.png b/assets_src/renders/streamhub.png new file mode 100644 index 0000000..d73aafc Binary files /dev/null and b/assets_src/renders/streamhub.png differ diff --git a/assets_src/renders/streamhub_raw.png b/assets_src/renders/streamhub_raw.png new file mode 100644 index 0000000..c09a5da Binary files /dev/null and b/assets_src/renders/streamhub_raw.png differ diff --git a/assets_src/renders/streamvan.png b/assets_src/renders/streamvan.png new file mode 100644 index 0000000..80979da Binary files /dev/null and b/assets_src/renders/streamvan.png differ diff --git a/assets_src/renders/streamvan_raw.png b/assets_src/renders/streamvan_raw.png new file mode 100644 index 0000000..6df75e7 Binary files /dev/null and b/assets_src/renders/streamvan_raw.png differ diff --git a/assets_src/renders/transcoder.png b/assets_src/renders/transcoder.png new file mode 100644 index 0000000..f741bef Binary files /dev/null and b/assets_src/renders/transcoder.png differ diff --git a/assets_src/renders/transcoder_raw.png b/assets_src/renders/transcoder_raw.png new file mode 100644 index 0000000..d9cc1de Binary files /dev/null and b/assets_src/renders/transcoder_raw.png differ diff --git a/assets_src/renders/vault.png b/assets_src/renders/vault.png new file mode 100644 index 0000000..caa0697 Binary files /dev/null and b/assets_src/renders/vault.png differ diff --git a/assets_src/renders/vault_raw.png b/assets_src/renders/vault_raw.png new file mode 100644 index 0000000..2a9fbb0 Binary files /dev/null and b/assets_src/renders/vault_raw.png differ diff --git a/mods/vinylgod/audio/mc_baseattack.wav b/mods/vinylgod/audio/mc_baseattack.wav new file mode 100644 index 0000000..af505f7 Binary files /dev/null and b/mods/vinylgod/audio/mc_baseattack.wav differ diff --git a/mods/vinylgod/audio/mc_construction.wav b/mods/vinylgod/audio/mc_construction.wav new file mode 100644 index 0000000..4c5f965 Binary files /dev/null and b/mods/vinylgod/audio/mc_construction.wav differ diff --git a/mods/vinylgod/audio/mc_lose.wav b/mods/vinylgod/audio/mc_lose.wav new file mode 100644 index 0000000..86dbded Binary files /dev/null and b/mods/vinylgod/audio/mc_lose.wav differ diff --git a/mods/vinylgod/audio/mc_lowpower.wav b/mods/vinylgod/audio/mc_lowpower.wav new file mode 100644 index 0000000..099c301 Binary files /dev/null and b/mods/vinylgod/audio/mc_lowpower.wav differ diff --git a/mods/vinylgod/audio/mc_nofunds.wav b/mods/vinylgod/audio/mc_nofunds.wav new file mode 100644 index 0000000..03f0e7e Binary files /dev/null and b/mods/vinylgod/audio/mc_nofunds.wav differ diff --git a/mods/vinylgod/audio/mc_unitready.wav b/mods/vinylgod/audio/mc_unitready.wav new file mode 100644 index 0000000..783e5f2 Binary files /dev/null and b/mods/vinylgod/audio/mc_unitready.wav differ diff --git a/mods/vinylgod/audio/mc_waxlow.wav b/mods/vinylgod/audio/mc_waxlow.wav new file mode 100644 index 0000000..cf6ce62 Binary files /dev/null and b/mods/vinylgod/audio/mc_waxlow.wav differ diff --git a/mods/vinylgod/audio/mc_win.wav b/mods/vinylgod/audio/mc_win.wav new file mode 100644 index 0000000..9f44ea2 Binary files /dev/null and b/mods/vinylgod/audio/mc_win.wav differ diff --git a/mods/vinylgod/chrome/assets/loadscreen.png b/mods/vinylgod/chrome/assets/loadscreen.png index 792fa46..810a203 100644 Binary files a/mods/vinylgod/chrome/assets/loadscreen.png and b/mods/vinylgod/chrome/assets/loadscreen.png differ diff --git a/mods/vinylgod/fluent/mod.ftl b/mods/vinylgod/fluent/mod.ftl index 7e43f72..79ca717 100644 --- a/mods/vinylgod/fluent/mod.ftl +++ b/mods/vinylgod/fluent/mod.ftl @@ -1,6 +1,6 @@ ## Metadata -mod-title = Vinylgod mod -mod-windowtitle = Vinylgod +mod-title = VINYLGOD +mod-windowtitle = VINYLGOD — Wax War # To silence "Warning: Missing key `loadscreen-loading` in mod ftl files required by `LogoStripeLoadScreen.Loading`" # Because https://github.com/OpenRA/OpenRA/issues/20693 wasn't fixed. diff --git a/mods/vinylgod/music/sideawin.wav b/mods/vinylgod/music/sideawin.wav new file mode 100644 index 0000000..71394c4 Binary files /dev/null and b/mods/vinylgod/music/sideawin.wav differ diff --git a/mods/vinylgod/music/thestream.wav b/mods/vinylgod/music/thestream.wav new file mode 100644 index 0000000..1aa6c6e Binary files /dev/null and b/mods/vinylgod/music/thestream.wav differ diff --git a/mods/vinylgod/music/vinylgod.yaml b/mods/vinylgod/music/vinylgod.yaml index e69de29..aeea99e 100644 --- a/mods/vinylgod/music/vinylgod.yaml +++ b/mods/vinylgod/music/vinylgod.yaml @@ -0,0 +1,3 @@ +music/waxattack: Wax Attack +music/thestream: The Stream Never Sleeps +music/sideawin: Side A diff --git a/mods/vinylgod/music/waxattack.wav b/mods/vinylgod/music/waxattack.wav new file mode 100644 index 0000000..5408503 Binary files /dev/null and b/mods/vinylgod/music/waxattack.wav differ diff --git a/mods/vinylgod/notifications/vinylgod.yaml b/mods/vinylgod/notifications/vinylgod.yaml index 9df6a7b..0d8e621 100644 --- a/mods/vinylgod/notifications/vinylgod.yaml +++ b/mods/vinylgod/notifications/vinylgod.yaml @@ -3,3 +3,14 @@ Sounds: ChatLine: ClickDisabledSound: ClickSound: + +Speech: + DefaultVariant: .wav + Notifications: + ConstructionComplete: audio/mc_construction + UnitReady: audio/mc_unitready + InsufficientFunds: audio/mc_nofunds + BaseAttack: audio/mc_baseattack + Win: audio/mc_win + Lose: audio/mc_lose + LowPower: audio/mc_lowpower diff --git a/mods/vinylgod/rules/player.yaml b/mods/vinylgod/rules/player.yaml index 29c7bff..3b9ffc8 100644 --- a/mods/vinylgod/rules/player.yaml +++ b/mods/vinylgod/rules/player.yaml @@ -9,20 +9,27 @@ player: DefaultCash: 5000 ResourceValues: Wax: 25 + InsufficientFundsNotification: InsufficientFunds PowerManager: TechTree: PlaceBuilding: ClassicProductionQueue@Building: Type: Building Group: Building + ReadyAudio: ConstructionComplete ClassicProductionQueue@Vehicle: Type: Vehicle Group: Vehicle + ReadyAudio: UnitReady ClassicProductionQueue@Infantry: Type: Infantry Group: Infantry + ReadyAudio: UnitReady ConquestVictoryConditions: MissionObjectives: + WinNotification: Win + LoseNotification: Lose + BaseAttackNotifier: editorplayer: Inherits: ^baseplayer diff --git a/mods/vinylgod/sequences/assets/ampstack.png b/mods/vinylgod/sequences/assets/ampstack.png index 9367373..7b7ea48 100644 Binary files a/mods/vinylgod/sequences/assets/ampstack.png and b/mods/vinylgod/sequences/assets/ampstack.png differ diff --git a/mods/vinylgod/sequences/assets/basscannon.png b/mods/vinylgod/sequences/assets/basscannon.png index 761e664..f00efa4 100644 Binary files a/mods/vinylgod/sequences/assets/basscannon.png and b/mods/vinylgod/sequences/assets/basscannon.png differ diff --git a/mods/vinylgod/sequences/assets/bufferbot.png b/mods/vinylgod/sequences/assets/bufferbot.png index 86d3357..eb491e5 100644 Binary files a/mods/vinylgod/sequences/assets/bufferbot.png and b/mods/vinylgod/sequences/assets/bufferbot.png differ diff --git a/mods/vinylgod/sequences/assets/datacentre.png b/mods/vinylgod/sequences/assets/datacentre.png index 91718dd..a7bf3b9 100644 Binary files a/mods/vinylgod/sequences/assets/datacentre.png and b/mods/vinylgod/sequences/assets/datacentre.png differ diff --git a/mods/vinylgod/sequences/assets/digger.png b/mods/vinylgod/sequences/assets/digger.png index c196a4d..dbb3cd9 100644 Binary files a/mods/vinylgod/sequences/assets/digger.png and b/mods/vinylgod/sequences/assets/digger.png differ diff --git a/mods/vinylgod/sequences/assets/djgrunt.png b/mods/vinylgod/sequences/assets/djgrunt.png index 2ab367c..5a90d8e 100644 Binary files a/mods/vinylgod/sequences/assets/djgrunt.png and b/mods/vinylgod/sequences/assets/djgrunt.png differ diff --git a/mods/vinylgod/sequences/assets/drmwalker.png b/mods/vinylgod/sequences/assets/drmwalker.png index 1c3324b..512f9a6 100644 Binary files a/mods/vinylgod/sequences/assets/drmwalker.png and b/mods/vinylgod/sequences/assets/drmwalker.png differ diff --git a/mods/vinylgod/sequences/assets/garage.png b/mods/vinylgod/sequences/assets/garage.png index 9748465..4b34d3f 100644 Binary files a/mods/vinylgod/sequences/assets/garage.png and b/mods/vinylgod/sequences/assets/garage.png differ diff --git a/mods/vinylgod/sequences/assets/icon_ampstack.png b/mods/vinylgod/sequences/assets/icon_ampstack.png index 22cef5a..3c7a84f 100644 Binary files a/mods/vinylgod/sequences/assets/icon_ampstack.png and b/mods/vinylgod/sequences/assets/icon_ampstack.png differ diff --git a/mods/vinylgod/sequences/assets/icon_basscannon.png b/mods/vinylgod/sequences/assets/icon_basscannon.png index 878319c..5adf6a4 100644 Binary files a/mods/vinylgod/sequences/assets/icon_basscannon.png and b/mods/vinylgod/sequences/assets/icon_basscannon.png differ diff --git a/mods/vinylgod/sequences/assets/icon_bufferbot.png b/mods/vinylgod/sequences/assets/icon_bufferbot.png index cc134c0..d79365d 100644 Binary files a/mods/vinylgod/sequences/assets/icon_bufferbot.png and b/mods/vinylgod/sequences/assets/icon_bufferbot.png differ diff --git a/mods/vinylgod/sequences/assets/icon_datacentre.png b/mods/vinylgod/sequences/assets/icon_datacentre.png index 1104115..82cba12 100644 Binary files a/mods/vinylgod/sequences/assets/icon_datacentre.png and b/mods/vinylgod/sequences/assets/icon_datacentre.png differ diff --git a/mods/vinylgod/sequences/assets/icon_digger.png b/mods/vinylgod/sequences/assets/icon_digger.png index d8e6296..d28bfa9 100644 Binary files a/mods/vinylgod/sequences/assets/icon_digger.png and b/mods/vinylgod/sequences/assets/icon_digger.png differ diff --git a/mods/vinylgod/sequences/assets/icon_djgrunt.png b/mods/vinylgod/sequences/assets/icon_djgrunt.png index bdebe68..35eb1c2 100644 Binary files a/mods/vinylgod/sequences/assets/icon_djgrunt.png and b/mods/vinylgod/sequences/assets/icon_djgrunt.png differ diff --git a/mods/vinylgod/sequences/assets/icon_drmwalker.png b/mods/vinylgod/sequences/assets/icon_drmwalker.png index cc134c0..acd6f8b 100644 Binary files a/mods/vinylgod/sequences/assets/icon_drmwalker.png and b/mods/vinylgod/sequences/assets/icon_drmwalker.png differ diff --git a/mods/vinylgod/sequences/assets/icon_garage.png b/mods/vinylgod/sequences/assets/icon_garage.png index 9b36320..dd999ec 100644 Binary files a/mods/vinylgod/sequences/assets/icon_garage.png and b/mods/vinylgod/sequences/assets/icon_garage.png differ diff --git a/mods/vinylgod/sequences/assets/icon_mastering.png b/mods/vinylgod/sequences/assets/icon_mastering.png index 42c5298..1a36f51 100644 Binary files a/mods/vinylgod/sequences/assets/icon_mastering.png and b/mods/vinylgod/sequences/assets/icon_mastering.png differ diff --git a/mods/vinylgod/sequences/assets/icon_merchtable.png b/mods/vinylgod/sequences/assets/icon_merchtable.png index 3d39089..1b166ad 100644 Binary files a/mods/vinylgod/sequences/assets/icon_merchtable.png and b/mods/vinylgod/sequences/assets/icon_merchtable.png differ diff --git a/mods/vinylgod/sequences/assets/icon_podfarm.png b/mods/vinylgod/sequences/assets/icon_podfarm.png index 1104115..c3854b7 100644 Binary files a/mods/vinylgod/sequences/assets/icon_podfarm.png and b/mods/vinylgod/sequences/assets/icon_podfarm.png differ diff --git a/mods/vinylgod/sequences/assets/icon_popupshop.png b/mods/vinylgod/sequences/assets/icon_popupshop.png index 8e21ead..171498f 100644 Binary files a/mods/vinylgod/sequences/assets/icon_popupshop.png and b/mods/vinylgod/sequences/assets/icon_popupshop.png differ diff --git a/mods/vinylgod/sequences/assets/icon_popupvan.png b/mods/vinylgod/sequences/assets/icon_popupvan.png index 8e21ead..8801ab6 100644 Binary files a/mods/vinylgod/sequences/assets/icon_popupvan.png and b/mods/vinylgod/sequences/assets/icon_popupvan.png differ diff --git a/mods/vinylgod/sequences/assets/icon_pressplant.png b/mods/vinylgod/sequences/assets/icon_pressplant.png index d8e6296..c7031c5 100644 Binary files a/mods/vinylgod/sequences/assets/icon_pressplant.png and b/mods/vinylgod/sequences/assets/icon_pressplant.png differ diff --git a/mods/vinylgod/sequences/assets/icon_printfarm.png b/mods/vinylgod/sequences/assets/icon_printfarm.png index 1104115..779566d 100644 Binary files a/mods/vinylgod/sequences/assets/icon_printfarm.png and b/mods/vinylgod/sequences/assets/icon_printfarm.png differ diff --git a/mods/vinylgod/sequences/assets/icon_roadie.png b/mods/vinylgod/sequences/assets/icon_roadie.png index 8e21ead..2e0d6f7 100644 Binary files a/mods/vinylgod/sequences/assets/icon_roadie.png and b/mods/vinylgod/sequences/assets/icon_roadie.png differ diff --git a/mods/vinylgod/sequences/assets/icon_scraper.png b/mods/vinylgod/sequences/assets/icon_scraper.png index cc134c0..cf3273d 100644 Binary files a/mods/vinylgod/sequences/assets/icon_scraper.png and b/mods/vinylgod/sequences/assets/icon_scraper.png differ diff --git a/mods/vinylgod/sequences/assets/icon_spinner.png b/mods/vinylgod/sequences/assets/icon_spinner.png index 0da3756..86d149d 100644 Binary files a/mods/vinylgod/sequences/assets/icon_spinner.png and b/mods/vinylgod/sequences/assets/icon_spinner.png differ diff --git a/mods/vinylgod/sequences/assets/icon_stacktank.png b/mods/vinylgod/sequences/assets/icon_stacktank.png index 47c5508..eac5d74 100644 Binary files a/mods/vinylgod/sequences/assets/icon_stacktank.png and b/mods/vinylgod/sequences/assets/icon_stacktank.png differ diff --git a/mods/vinylgod/sequences/assets/icon_streamhub.png b/mods/vinylgod/sequences/assets/icon_streamhub.png index 1104115..6ed0e9d 100644 Binary files a/mods/vinylgod/sequences/assets/icon_streamhub.png and b/mods/vinylgod/sequences/assets/icon_streamhub.png differ diff --git a/mods/vinylgod/sequences/assets/icon_streamvan.png b/mods/vinylgod/sequences/assets/icon_streamvan.png index 1104115..7be7fad 100644 Binary files a/mods/vinylgod/sequences/assets/icon_streamvan.png and b/mods/vinylgod/sequences/assets/icon_streamvan.png differ diff --git a/mods/vinylgod/sequences/assets/icon_transcoder.png b/mods/vinylgod/sequences/assets/icon_transcoder.png index 1104115..953fb8c 100644 Binary files a/mods/vinylgod/sequences/assets/icon_transcoder.png and b/mods/vinylgod/sequences/assets/icon_transcoder.png differ diff --git a/mods/vinylgod/sequences/assets/icon_vault.png b/mods/vinylgod/sequences/assets/icon_vault.png index 945fc63..157cd8a 100644 Binary files a/mods/vinylgod/sequences/assets/icon_vault.png and b/mods/vinylgod/sequences/assets/icon_vault.png differ diff --git a/mods/vinylgod/sequences/assets/mastering.png b/mods/vinylgod/sequences/assets/mastering.png index e1cfd53..3b081f6 100644 Binary files a/mods/vinylgod/sequences/assets/mastering.png and b/mods/vinylgod/sequences/assets/mastering.png differ diff --git a/mods/vinylgod/sequences/assets/merchtable.png b/mods/vinylgod/sequences/assets/merchtable.png index b03ac82..110c8ef 100644 Binary files a/mods/vinylgod/sequences/assets/merchtable.png and b/mods/vinylgod/sequences/assets/merchtable.png differ diff --git a/mods/vinylgod/sequences/assets/podfarm.png b/mods/vinylgod/sequences/assets/podfarm.png index f90639a..f22f652 100644 Binary files a/mods/vinylgod/sequences/assets/podfarm.png and b/mods/vinylgod/sequences/assets/podfarm.png differ diff --git a/mods/vinylgod/sequences/assets/popupshop.png b/mods/vinylgod/sequences/assets/popupshop.png index 631cd62..8527d1a 100644 Binary files a/mods/vinylgod/sequences/assets/popupshop.png and b/mods/vinylgod/sequences/assets/popupshop.png differ diff --git a/mods/vinylgod/sequences/assets/popupvan.png b/mods/vinylgod/sequences/assets/popupvan.png index c77e45e..e362894 100644 Binary files a/mods/vinylgod/sequences/assets/popupvan.png and b/mods/vinylgod/sequences/assets/popupvan.png differ diff --git a/mods/vinylgod/sequences/assets/pressplant.png b/mods/vinylgod/sequences/assets/pressplant.png index 064d81c..9891bbf 100644 Binary files a/mods/vinylgod/sequences/assets/pressplant.png and b/mods/vinylgod/sequences/assets/pressplant.png differ diff --git a/mods/vinylgod/sequences/assets/printfarm.png b/mods/vinylgod/sequences/assets/printfarm.png index efc7359..4855403 100644 Binary files a/mods/vinylgod/sequences/assets/printfarm.png and b/mods/vinylgod/sequences/assets/printfarm.png differ diff --git a/mods/vinylgod/sequences/assets/roadie.png b/mods/vinylgod/sequences/assets/roadie.png index cb68921..9b7ddc0 100644 Binary files a/mods/vinylgod/sequences/assets/roadie.png and b/mods/vinylgod/sequences/assets/roadie.png differ diff --git a/mods/vinylgod/sequences/assets/scraper.png b/mods/vinylgod/sequences/assets/scraper.png index 491b493..6d7b861 100644 Binary files a/mods/vinylgod/sequences/assets/scraper.png and b/mods/vinylgod/sequences/assets/scraper.png differ diff --git a/mods/vinylgod/sequences/assets/spinner.png b/mods/vinylgod/sequences/assets/spinner.png index 8925bb4..606d89a 100644 Binary files a/mods/vinylgod/sequences/assets/spinner.png and b/mods/vinylgod/sequences/assets/spinner.png differ diff --git a/mods/vinylgod/sequences/assets/stacktank.png b/mods/vinylgod/sequences/assets/stacktank.png index 39aaa03..daae591 100644 Binary files a/mods/vinylgod/sequences/assets/stacktank.png and b/mods/vinylgod/sequences/assets/stacktank.png differ diff --git a/mods/vinylgod/sequences/assets/streamhub.png b/mods/vinylgod/sequences/assets/streamhub.png index 7d54ac4..a170661 100644 Binary files a/mods/vinylgod/sequences/assets/streamhub.png and b/mods/vinylgod/sequences/assets/streamhub.png differ diff --git a/mods/vinylgod/sequences/assets/streamvan.png b/mods/vinylgod/sequences/assets/streamvan.png index 82916aa..9d710b5 100644 Binary files a/mods/vinylgod/sequences/assets/streamvan.png and b/mods/vinylgod/sequences/assets/streamvan.png differ diff --git a/mods/vinylgod/sequences/assets/transcoder.png b/mods/vinylgod/sequences/assets/transcoder.png index 89f43fd..a321cdd 100644 Binary files a/mods/vinylgod/sequences/assets/transcoder.png and b/mods/vinylgod/sequences/assets/transcoder.png differ diff --git a/mods/vinylgod/sequences/assets/vault.png b/mods/vinylgod/sequences/assets/vault.png index 14bf9c0..a23cd02 100644 Binary files a/mods/vinylgod/sequences/assets/vault.png and b/mods/vinylgod/sequences/assets/vault.png differ diff --git a/tools/__pycache__/mbgen.cpython-314.pyc b/tools/__pycache__/mbgen.cpython-314.pyc new file mode 100644 index 0000000..5ec0c8d Binary files /dev/null and b/tools/__pycache__/mbgen.cpython-314.pyc differ diff --git a/tools/gen_placeholders.py b/tools/gen_placeholders.py index 6231072..a26a13d 100644 --- a/tools/gen_placeholders.py +++ b/tools/gen_placeholders.py @@ -1,6 +1,10 @@ #!/usr/bin/env python3 """Generate placeholder sprite PNGs for Phase A (stdlib only). +SUPERSEDED for actor sprites/icons by mbsprites.py (real MODELBEAST art) — +re-running this OVERWRITES the real art with boxes. Still the source for: +wax.png sheet, clock.png, chrome production-icons.png. + OpenRA PngSheet slices multi-frame sheets via an embedded tEXt chunk "FrameSize: w,h" (see engine PngSheetLoader.cs). Real art replaces these in Phase D — keep the filenames. diff --git a/tools/mbgen.py b/tools/mbgen.py index b97431b..a01ec0d 100644 --- a/tools/mbgen.py +++ b/tools/mbgen.py @@ -64,7 +64,9 @@ def run(op, params, out, asset_id=None): mine = [x for x in items if x.get('parent_job') == jid] if not mine: sys.exit('[mb] no output asset with matching parent_job') - open(out, 'wb').write(req(f"/api/assets/{mine[0]['id']}/file", raw=True)) + # some operators emit a params .json alongside the real output — skip it + media = [x for x in mine if not str(x.get('name', '')).endswith('.json')] or mine + open(out, 'wb').write(req(f"/api/assets/{media[0]['id']}/file", raw=True)) print(f'[mb] wrote {out} ({os.path.getsize(out) // 1024}KB)') diff --git a/tools/mbsprites.py b/tools/mbsprites.py new file mode 100644 index 0000000..b981606 --- /dev/null +++ b/tools/mbsprites.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Batch-generate real sprites for every actor: flux_local -> bg_remove_local -> +trim + downscale (Pillow). Overwrites the placeholder PNGs in sequences/assets. +Full-res renders kept in assets_src/renders. Prompts appended to assets_src/PROMPTS.md. +Single facing per actor — the Blender 16-facing turntable pipeline is the Phase D +upgrade path in MEGAPLAN.md. +""" +import os, sys, datetime +sys.path.insert(0, os.path.dirname(__file__)) +from mbgen import run, upload # noqa: E402 +from PIL import Image # noqa: E402 + +ROOT = os.path.join(os.path.dirname(__file__), '..') +RENDERS = os.path.join(ROOT, 'assets_src', 'renders') +ASSETS = os.path.join(ROOT, 'mods', 'vinylgod', 'sequences', 'assets') +os.makedirs(RENDERS, exist_ok=True) + +MRP = 'rusty junkyard robot aesthetic, rust metal with hot pink trim, analog dials and speaker parts, ' +STR = 'glossy seamless white tech aesthetic, soft blue ring lights, smooth rounded minimal design, ' +SUF = ', isometric three-quarter view from above, single object centered, video game asset, plain flat grey background, no text' + +ACTORS = [ + ('popupvan', 24, MRP + 'small delivery truck covered in band stickers and a roof-mounted loudspeaker'), + ('popupshop', 64, MRP + 'record store shack built from shipping containers with neon OPEN sign and crane arm'), + ('pressplant', 64, MRP + 'industrial hydraulic vinyl record pressing plant building with steam vents and conveyor of records'), + ('ampstack', 32, MRP + 'wall of stacked guitar amplifiers crackling with pink energy'), + ('vault', 32, MRP + 'squat bunker with a huge round bank vault door and stacked record crates'), + ('merchtable', 32, MRP + 'folding merch table under a small tent with t-shirts and records'), + ('garage', 64, MRP + 'corrugated iron vehicle workshop with engine hoist and band posters'), + ('mastering', 64, MRP + 'pristine acoustic-panelled recording studio grafted onto a junk tower with satellite dish'), + ('digger', 24, MRP + 'forklift monster robot with crate claw carrying milk crates of vinyl records'), + ('spinner', 20, MRP + 'small agile one-wheeled robot whose wheel is a spinning vinyl record with blade tonearms'), + ('stacktank', 28, MRP + 'two-legged walker mech made of stacked speaker cabinets with subwoofer chest'), + ('basscannon', 26, MRP + 'six-wheeled flatbed truck hauling one colossal subwoofer cannon with fold-out legs'), + ('djgrunt', 16, MRP + 'small hooded robot with a portable turntable chest rig holding a razor-sharp record'), + ('roadie', 16, MRP + 'four-armed robot with gaffer tape bandoliers and a flight case backpack'), + ('streamvan', 24, STR + 'autonomous white delivery van with a glowing blue play-button logo'), + ('streamhub', 64, STR + 'white monolithic server hub building with one huge blue status ring'), + ('datacentre', 32, STR + 'humming white server monolith with a single blue LED strip'), + ('transcoder', 64, STR + 'white cube building that swallows records on a conveyor, receipts coming out'), + ('podfarm', 32, STR + 'vending machine wall dispensing small white sphere robots'), + ('printfarm', 64, STR + 'white 3d-printer factory building with robotic arms assembling drones'), + ('scraper', 22, STR + 'autonomous white street sweeper vehicle inhaling black vinyl through a glowing blue intake'), + ('bufferbot', 14, STR + 'knee-high white sphere robot with a loading spinner face'), + ('drmwalker', 28, STR + 'tall faceless white mech with one blue ring-light eye and a glowing paywall screen chest'), +] + + +def fit(im, w, h): + im = im.crop(im.getbbox() or (0, 0, im.width, im.height)) + im.thumbnail((w, h), Image.LANCZOS) + out = Image.new('RGBA', (w, h), (0, 0, 0, 0)) + out.paste(im, ((w - im.width) // 2, (h - im.height) // 2)) + return out + + +log = open(os.path.join(ROOT, 'assets_src', 'PROMPTS.md'), 'a') +today = datetime.date.today().isoformat() +only = sys.argv[1:] +for name, size, prompt in ACTORS: + if only and name not in only: + continue + raw = os.path.join(RENDERS, f'{name}_raw.png') + cut = os.path.join(RENDERS, f'{name}.png') + if not os.path.exists(cut): + run('flux_local', {'prompt': prompt + SUF}, raw) + run('bg_remove_local', {}, cut, asset_id=upload(raw)) + log.write(f'| renders/{name}.png | {today} | {prompt + SUF} |\n') + log.flush() + im = Image.open(cut).convert('RGBA') + fit(im, size, size).save(os.path.join(ASSETS, f'{name}.png')) + fit(im, 56, 40).resize((56, 40)).save(os.path.join(ASSETS, f'_icon_tmp.png')) + ic = Image.new('RGBA', (64, 48), (18, 16, 20, 255)) + ic.paste(Image.open(os.path.join(ASSETS, '_icon_tmp.png')), (4, 4)) + ic.save(os.path.join(ASSETS, f'icon_{name}.png')) + print(f'[sprite] {name} done', flush=True) +os.remove(os.path.join(ASSETS, '_icon_tmp.png')) +print('ALL DONE')