Unify Iron Coast mission names and cinematic mission previews

This commit is contained in:
raptorreplica committed 2026-10-19 00:10:38 +11:00
1 parent 668b3ff86d
commit 2d95e145a5
406 files changed
+134963 -245

No files matched your search

+14 -2
View File
@@ -1,8 +1,8 @@
# Iron Coast — Mission 3: Saltworks Convoy
# Iron Coast S1 M03: Saltworks Convoy
API 1 package, version 1.0.1. Enable it in Mods at the main menu and apply the selection. The normal dependency selection also enables `iron_coast_scout`, `iron_coast_turret`, `iron_coast_boss_3`, `pulse_cannon`, `seeker_swarm`, `ion_lance`, `iron_coast_music`.
Mission `iron_coast_mission_3:mission_03`: **Iron Coast 3 — Saltworks Convoy**. Destroy three cargo transports, two escort turrets and Saltbreaker. Required ground objectives remain reachable; escaping optional aircraft never counts as a kill. Elapsed time alone does not finish the mission.
Mission `iron_coast_mission_3:mission_03`: **Iron Coast S1 M03: Saltworks Convoy**. Destroy three cargo transports, two escort turrets and Saltbreaker. Required ground objectives remain reachable; escaping optional aircraft never counts as a kill. Elapsed time alone does not finish the mission.
Scheduled spawn totals for Training / Rookie / Veteran / Elite are **32 / 45 / 58 / 71**. These are enabled scheduled entries, not simultaneous live-enemy counts. Groups can overlap when earlier enemies survive.
@@ -11,3 +11,15 @@ Align the forward guns with required targets while moving around incoming shots.
## Validation and history
See the [current Iron Coast retune results and limits](../../docs/iron-coast-retune.md). Package-local acceptance reports, validation results and retained test sources describe pre-retune 1.0 behavior unless a result explicitly identifies the newer package and runner. They remain historical material, not current playthrough guarantees.
## Rebuilding the briefing
Run `python3 art/build_cinematic_briefing.py` from this package directory
(Pillow required). It verifies the unchanged cinematic master and rebuilds the
exact SD/HD filenames referenced by `content.json`; the prompt and provenance
are beside the master in `art/`. This artwork update changes package hashes;
existing pilots use the normal changed-mod confirmation, with stable IDs and
saved equipment/progression retained.
`build_assets.py` also includes the cinematic briefing recipe when rebuilding
this package's assets; its tile, sprite and sound processing is unchanged.
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

@@ -0,0 +1,9 @@
Use case: stylized-concept
Asset type: ONE cinematic mission briefing illustration for Iron Coast S1 M03: Saltworks Convoy.
Primary request: replace the old top-down briefing composition with a new cinematic illustration matching Image1, the user's approved Stormwall briefing.
Input images: Image1 is the exact STYLE AND FOREGROUND AIRCRAFT reference, not the scene to duplicate. Image2 is this mission's existing briefing and is ONLY its environment/material/terrain theme reference; do NOT imitate its top-down tiled perspective.
Actual mission environment: Coastal salt flats with broad pale-white rectangular evaporation basins, dark brine channels and rust-colored conveyor gantries. A short convoy of armored cargo trucks crosses the narrow central industrial causeway with two small escorts; a gray command cruiser is only distant coastal context. Clear pale morning atmosphere, readable white salt basins against navy channels.
Foreground subject: one compact steel-gray twin-engine Raptor-like strike fighter viewed from behind and above, banking and flying toward the upper right into this mission. Believable cockpit, exactly two engines, coherent wings and fin geometry, worn mechanical panels with restrained teal and amber accents.
Composition: cinematic oblique landscape illustration, not overhead or a screenshot. Foreground fighter fills the lower-left/center but its complete silhouette and the signature destination both fit within the center75percent of image height. Clear middle-distance mission environment, atmospheric horizon and broad readable value masses that survive a132x70 menu thumbnail. Avoid fine detail as the only mission distinction.
Style: restrained hand-painted 1990s shooter box-art realism matching Stormwall, crisp aircraft silhouette and readable panels, navy/desaturated teal, steel-gray machinery and muted amber industrial light. Follow the actual environment above, not an arbitrary generic storm or ocean scene.
Canvas: landscape16:10, ideally1280x800, opaque. No text, labels, HUD, logos, watermarks, borders, grid, atlas, split panels, tile collage or gameplay screenshot. Do not invent objectives, new enemies, excessive aircraft limbs, forests, glaciers, alien architecture or large explosions absent from the setting. Do not regenerate Stormwall or Iron Crown. One complete new illustration only.
@@ -0,0 +1,54 @@
{
"asset": "Iron Coast S1 M03: Saltworks Convoy cinematic briefing",
"mission_id": "iron_coast_mission_3:mission_03",
"generation": {
"tool": "built-in image_gen.imagegen",
"actual_calls": 1,
"gate_owner": "/root/iron_coast_names",
"gate_lease": "2b49401c-b975-482c-b859-292b8a6bf177",
"outcome": "success",
"terminal_reported_immediately": true,
"prompt": "briefing-cinematic-prompt.txt",
"prompt_sha256": "ebc9c9a18cb1775edfc5523719ff649e2f1b74635202a8d638ba82b88fb0df4d",
"master": "briefing-cinematic-generated-master.png",
"master_sha256": "f7aaea7fcd6cf38907dba796ccb33efe3a9307638e0443ac668ef43fff3ae02f",
"master_dimensions": [
1586,
992
],
"untouched_master_preserved": true,
"references": [
{
"role": "Stormwall style and foreground aircraft",
"path": "mods/iron_coast_mission_4/art/briefing_hd.png",
"sha256": "cd987c13bc55bba2620379ca435c0cccf08d7564364d730c65d0be285bb82221"
},
{
"role": "own prior top-down environment reference only",
"path": "mods/iron_coast_mission_3/art/briefing_hd.png",
"sha256": "171793b667a6750fc47d79816e4f16a35a9a2e12166d229baf28442028d381c1"
}
]
},
"derivation": {
"recipe": "build_cinematic_briefing.py",
"hd": "RGB1280x800, centered ImageOps.fit LANCZOS preserving16:10; no repaint",
"sd": "RGB320x200 LANCZOS downsample of complete sameHD",
"menu_review_crop": "centered132x70 LANCZOS file-onlypreview; actual SDLthumbnail review required separately"
},
"outputs": {
"hd": {
"path": "art/briefing_hd.png",
"sha256": "04bb44e7dcabcf0d12c49d07691e278b538104c81799181ec468ec227fc51ee6"
},
"sd": {
"path": "art/briefing_sd.png",
"sha256": "ea69b6378ea9382a8e38f14460d2c055ad5d8e982461456db076aeaca716b0f9"
}
},
"limits": [
"Illustrative mission briefing only; no mission objectives, names, IDs, scripts, wave counts, collisions, equipment, music or gameplay change.",
"New authored artwork does not count toward Originalsprite/terrainHD coverage.",
"Original top-down briefing remains in Git history and originalgenerationfiles; currentreplacementis a newindependentillustration."
]
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 141 KiB

@@ -0,0 +1,13 @@
#!/usr/bin/env python3
"""Rebuild only this generated mission briefing's SD/HD derivatives (Pillow)."""
from pathlib import Path
import hashlib
from PIL import Image, ImageOps
root = Path(__file__).resolve().parent
master = root / 'briefing-cinematic-generated-master.png'
if hashlib.sha256(master.read_bytes()).hexdigest() != 'f7aaea7fcd6cf38907dba796ccb33efe3a9307638e0443ac668ef43fff3ae02f':
raise SystemExit('Unexpected original briefing master bytes')
with Image.open(master) as image:
hd = ImageOps.fit(image.convert('RGB'), (1280, 800), Image.Resampling.LANCZOS, centering=(0.5,0.5))
hd.save(root / 'briefing_hd.png')
hd.resize((320, 200), Image.Resampling.LANCZOS).save(root / 'briefing_sd.png')
+3 -3
View File
@@ -12,6 +12,7 @@ import random
import struct
import wave
from pathlib import Path
import runpy
from PIL import Image, ImageOps
ROOT = Path(__file__).resolve().parent
@@ -96,9 +97,8 @@ def main():
assert terrain_hd.crop((0, 1535, 1152, 1536)).tobytes() == ImageOps.flip(terrain_hd).crop((0, 0, 1152, 1)).tobytes()
terrain_sd.save(art / "terrain-preview-sd.png")
terrain_hd.save(art / "terrain-preview-hd.png")
briefing = Image.open(art / "briefing-source-hd.png").convert("RGBA")
sd(briefing, (320, 200), palette).save(art / "briefing_sd.png")
briefing.resize((1280, 800), Image.Resampling.LANCZOS).save(art / "briefing_hd.png")
# The cinematic briefing has its own unchanged generated master.
runpy.run_path(str(art / "build_cinematic_briefing.py"), run_name="__main__")
convoy = Image.open(art / "convoy-source-hd.png").convert("RGBA")
# Use the generated alpha bounds, then preserve its complete silhouette in
# the logical canvas with a small transparent border. This is packaging.
+1 -1
View File
@@ -68,7 +68,7 @@
"missions": [
{
"id": "iron_coast_mission_3:mission_03",
"name": "Iron Coast 3 — Saltworks Convoy",
"name": "Iron Coast S1 M03: Saltworks Convoy",
"duration": 3000,
"auto_complete": false,
"columns": 9,
+1 -1
View File
@@ -1,5 +1,5 @@
id = "iron_coast_mission_3"
name = "Iron Coast — Mission 3: Saltworks Convoy"
name = "Iron Coast S1 M03: Saltworks Convoy"
version = "1.0.1"
api_version = 1
description = "Intercept three armored cargo transports through the salt flats, disable their two escorts and destroy the convoy command cruiser. New SD/HD saltworks terrain, cargo sprites and synthesized radio cues."