Unify Iron Coast mission names and cinematic mission previews
No files matched your search
@@ -1,6 +1,6 @@
|
||||
# Aurora Field Trials
|
||||
|
||||
This API v1 example adds a scripted pulse cannon, a repair pickup, weaving drones, a guardian, a mission and a campaign. It references the player's installed original sprite catalog; no game artwork is included.
|
||||
This API v1 example adds a scripted pulse cannon, a repair pickup, weaving drones, a guardian, a mission and a campaign. It references the player's installed original sprite catalog for gameplay. The package includes a new cinematic SD/HD mission briefing, with its generated master, prompt and provenance in `art/`. Rebuild both briefing sizes with `python3 build_briefing.py` (Pillow). This cosmetic update retains stable content IDs and gameplay, but changes the package hash; existing pilots use the normal changed-mod load confirmation.
|
||||
|
||||
From the repository root:
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 3.1 MiB |
@@ -0,0 +1,8 @@
|
||||
Use case: stylized-concept
|
||||
Asset type: cinematic mission briefing illustration for Aurora Field Trials in a faithful Raptor-style vertical shooter.
|
||||
Primary request: create ONE landscape illustration with the same cinematic oblique perspective, restrained painted mechanical realism, crisp twin-engine steel-gray foreground strike fighter, atmospheric depth and readable small-thumbnail masses as reference Image 1 (Stormwall). The scene must be new and specifically fit this short test mission.
|
||||
Input images: Image 1 is STYLE AND AIRCRAFT reference only; preserve its cinematic illustration style but replace its ocean cliffs. Image 2 is the actual terrain reference for this mission, enlarged with nearest-neighbor for visibility: rusty reddish-brown rocky dry ground with sparse dark-green scrub. Image 3 is the actual small gray/turquoise Weaver drone reference. Image 4 is the actual wide gray Guardian patrol craft reference. Interpret enemy sprites as distant mechanical silhouettes only, without inventing new objectives.
|
||||
Scene/backdrop: over an austere reddish-brown rocky proving ground with sparse low green scrub and warm dusty haze, a compact steel-gray twin-engine strike fighter banks toward the upper right. Two small gray/turquoise test drones and one larger wide gray multi-pod patrol craft are visible in the middle distance. Broad dry rocky terrain remains the main environment. This is a field trial, not an ocean fortress assault.
|
||||
Composition: cinematic chase camera behind and above the foreground fighter, oblique landscape perspective with horizon; coherent wings, two exhausts and compact cockpit. Fighter and distant test craft remain meaningful inside the center 75 percent of image height for the game's thumbnail crop. Keep clear separation and readable value shapes.
|
||||
Style/medium: restrained hand-painted 1990s shooter box-art realism, precise readable aircraft panels and believable atmospheric perspective, matching Stormwall reference. Navy/desaturated teal metal accents, steel gray, muted amber engine light; reddish brown earth should remain faithful to mission terrain.
|
||||
Canvas: landscape16:10, ideally1280x800, opaque image. No grids, atlas, split panels, top-down tile view or gameplay screenshot. No text, labels, logos, watermark, HUD, borders, invented mission objectives, extra wings or malformed aircraft. No ocean, dam, city, snow, green grassland or giant new boss architecture.
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"asset": "Aurora Field Trials cinematic mission briefing",
|
||||
"mission_id": "aurora:field_trials",
|
||||
"generation": {
|
||||
"tool": "built-in image_gen.imagegen",
|
||||
"actual_calls": 1,
|
||||
"outcome": "success",
|
||||
"gate_owner": "/root/iron_coast_names",
|
||||
"gate_lease": "fdb85ad3-99c1-40fb-ab2c-93fbf1fb98d3",
|
||||
"terminal_reported_immediately": true,
|
||||
"prompt": "briefing-prompt.txt",
|
||||
"prompt_sha256": "c1f57afd4ed5249851ac45dcd94d3ca2e69688159054c7ae726283b1cb5c3a35",
|
||||
"master": "briefing-generated-master.png",
|
||||
"master_sha256": "ddb0b50b344611d49038ac2d5b8e4f609b66daa8c7e3799d4530804780cb1a3f",
|
||||
"master_dimensions": [
|
||||
1586,
|
||||
992
|
||||
],
|
||||
"master_preserved_unmodified": true,
|
||||
"style_reference": {
|
||||
"path": "mods/iron_coast_mission_4/art/briefing_hd.png",
|
||||
"sha256": "cd987c13bc55bba2620379ca435c0cccf08d7564364d730c65d0be285bb82221"
|
||||
},
|
||||
"semantic_references": [
|
||||
{
|
||||
"original_asset": 66400,
|
||||
"catalog_path": "misc/unnamed.104",
|
||||
"sha256": "1d7db99148ebc5db3de1d8c6c45c85fef4cf415936117815f7008483fc1f3357"
|
||||
},
|
||||
{
|
||||
"original_asset": 66296,
|
||||
"catalog_path": "sprites/SHIP01G1_PIC",
|
||||
"sha256": "ada9598e7844d77c0fb8d782b74128772d94d901dc873b4fa23b2c1c009a951b"
|
||||
},
|
||||
{
|
||||
"original_asset": 66310,
|
||||
"catalog_path": "sprites/SHIP10G1_PIC",
|
||||
"sha256": "ae5761847cae4ce296bfa436a8c14cdcfeea42f07e9ca1dfada60cb958466e27"
|
||||
}
|
||||
]
|
||||
},
|
||||
"derivation": {
|
||||
"tool": "../build_briefing.py",
|
||||
"hd": "RGB1280x800; Pillow ImageOps.fit LANCZOS, centered aspect crop",
|
||||
"floating_source_crop_rectangle": [
|
||||
0.0,
|
||||
0.375,
|
||||
1586.0,
|
||||
991.625
|
||||
],
|
||||
"sd": "RGB320x200; downsample complete approved HD with LANCZOS",
|
||||
"sprite_edits_or_paintover": 0
|
||||
},
|
||||
"limits": [
|
||||
"Illustrative mission art only; gameplay sprites, enemies, terrain, objectives, IDs and version remain unchanged.",
|
||||
"Does not increase original sprite or terrain remaster coverage.",
|
||||
"Image author physically reviews full HD and SD; actual in-game full-color thumbnail is reviewed by the integrating owner."
|
||||
],
|
||||
"outputs": {
|
||||
"briefing_hd.png": {
|
||||
"sha256": "8517b565a1dabe0d04e453d9ae6ce66f2e71a8c30f6d07827393607324977ee7",
|
||||
"dimensions": [
|
||||
1280,
|
||||
800
|
||||
]
|
||||
},
|
||||
"briefing_sd.png": {
|
||||
"sha256": "694547106db78f8e6a232cb680f1c0eb039f919ab9f63748c6960d708283a1fc",
|
||||
"dimensions": [
|
||||
320,
|
||||
200
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 137 KiB |
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Rebuild Aurora's SD/HD briefing from its unchanged generated master."""
|
||||
from pathlib import Path
|
||||
import hashlib
|
||||
from PIL import Image, ImageOps
|
||||
|
||||
ROOT = Path(__file__).resolve().parent
|
||||
source = ROOT / 'art/briefing-generated-master.png'
|
||||
expected = 'ddb0b50b344611d49038ac2d5b8e4f609b66daa8c7e3799d4530804780cb1a3f'
|
||||
if hashlib.sha256(source.read_bytes()).hexdigest() != expected:
|
||||
raise SystemExit('Unexpected briefing master; preserve the recorded original bytes.')
|
||||
with Image.open(source) as image:
|
||||
image.load()
|
||||
hd = ImageOps.fit(image.convert('RGB'), (1280, 800), Image.Resampling.LANCZOS, centering=(0.5, 0.5))
|
||||
hd.save(ROOT / 'art/briefing_hd.png')
|
||||
hd.resize((320, 200), Image.Resampling.LANCZOS).save(ROOT / 'art/briefing_sd.png')
|
||||
@@ -121,6 +121,13 @@
|
||||
{
|
||||
"id": "aurora:field_trials",
|
||||
"name": "Aurora Field Trials",
|
||||
"art": {
|
||||
"png": "art/briefing_sd.png",
|
||||
"hd_png": "art/briefing_hd.png",
|
||||
"logical_width": 320,
|
||||
"logical_height": 200,
|
||||
"frames": 1
|
||||
},
|
||||
"duration": 650,
|
||||
"spawns": [
|
||||
{
|
||||
|
||||
@@ -2,6 +2,6 @@ id = "aurora"
|
||||
name = "Aurora Field Trials"
|
||||
version = "1.0.0"
|
||||
api_version = 1
|
||||
description = "A short mission with a scripted pulse cannon, weaving drones and repair cells. Uses your installed original artwork."
|
||||
description = "A short mission with a scripted pulse cannon, weaving drones and repair cells. Uses installed original sprites and a cinematic SD/HD mission briefing."
|
||||
content = "content.json"
|
||||
scripts = ["scripts/weapon.rhai", "scripts/drone.rhai", "scripts/cell.rhai", "scripts/mission.rhai"]
|
||||
@@ -1,9 +1,8 @@
|
||||
# Iron Coast — Complete Campaign
|
||||
# Iron Coast S1: Complete Campaign
|
||||
|
||||
Enable this optional assembly package in **Mods** to select all six Iron Coast
|
||||
mission packages and their shared weapon and enemy dependencies. Review the
|
||||
selected packages and apply changes from the main menu, then choose **Iron
|
||||
Coast 1 — Breakwater** in mission selection to start the route.
|
||||
selected packages and apply changes from the main menu, then choose **Iron Coast S1 M01: Breakwater** in mission selection to start the route.
|
||||
|
||||
Each mission is a separate mod. A mission can be enabled and played without
|
||||
this campaign package. The assembly package changes campaign progression;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "iron_coast_mission_1:campaign",
|
||||
"name": "Iron Coast",
|
||||
"name": "Iron Coast S1",
|
||||
"art": {
|
||||
"png": "art/briefing_sd.png",
|
||||
"hd_png": "art/briefing_hd.png",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_campaign"
|
||||
name = "Iron Coast — Complete Campaign"
|
||||
name = "Iron Coast S1: Complete Campaign"
|
||||
version = "1.0.0"
|
||||
api_version = 1
|
||||
description = "Six linked missions: Breakwater, Tidal Relay, Saltworks Convoy, Stormwall, Cinder Docks and Iron Crown. Selects each mission, its distinct boss, shared equipment and soundtrack. Individual mission mods remain playable separately."
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Iron Coast — Mission 1: Breakwater
|
||||
# Iron Coast S1 M01: Breakwater
|
||||
|
||||
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`, `pulse_cannon`, `seeker_swarm`, `ion_lance`, `iron_coast_music`.
|
||||
|
||||
Mission `iron_coast_mission_1:mission_01`: **Iron Coast 1 — Breakwater**. Destroy two required turrets and the Command Cruiser. 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_1:mission_01`: **Iron Coast S1 M01: Breakwater**. Destroy two required turrets and the Command Cruiser. 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 **25 / 34 / 43 / 52**. These are enabled scheduled entries, not simultaneous live-enemy counts. Groups can overlap when earlier enemies survive.
|
||||
|
||||
@@ -15,3 +15,15 @@ The mission supplies three Field Repair kits when capacity allows (25 energy per
|
||||
## 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.
|
||||
|
After Width: | Height: | Size: 3.2 MiB |
@@ -0,0 +1,9 @@
|
||||
Use case: stylized-concept
|
||||
Asset type: ONE cinematic mission briefing illustration for Iron Coast S1 M01: Breakwater.
|
||||
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: A fortified industrial shoreline and harbor docks with low warehouse roofs, supply-depot stacks, two distant shore turrets and the existing command cruiser offshore. Cold blue-teal water, concrete piers, rust-colored roofs and muted amber dock lights. Dawn approach, industrial harbor silhouette, not an enormous new castle.
|
||||
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 M01: Breakwater cinematic briefing",
|
||||
"mission_id": "iron_coast_mission_1:mission_01",
|
||||
"generation": {
|
||||
"tool": "built-in image_gen.imagegen",
|
||||
"actual_calls": 1,
|
||||
"gate_owner": "/root/iron_coast_names",
|
||||
"gate_lease": "c45d4b00-db77-4f5c-9f08-83a6f387ef52",
|
||||
"outcome": "success",
|
||||
"terminal_reported_immediately": true,
|
||||
"prompt": "briefing-cinematic-prompt.txt",
|
||||
"prompt_sha256": "8d4aec0f93ec9f18980c326c928ef9269681e5ccdebf86f009f0b1c33c79bbb7",
|
||||
"master": "briefing-cinematic-generated-master.png",
|
||||
"master_sha256": "9cb3a40a4bc07894bd01da6b4c2911ba69df1926e4e23dfcaa3ccf7eced742bc",
|
||||
"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_1/art/briefing_hd.png",
|
||||
"sha256": "4312ecd2264e588c291084b3e5fc951ff1ac72caa5df26e68c222e7c72139478"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "72cabe3360aac3c8d7ef2dd35940b68706fe06c39c9a8d51ab90d1fdfb5231e4"
|
||||
},
|
||||
"sd": {
|
||||
"path": "art/briefing_sd.png",
|
||||
"sha256": "7c370090d1596443e5043faab975b0d205b752d5a8a78e6260dfb5232021cc00"
|
||||
}
|
||||
},
|
||||
"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."
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.1 MiB After Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 139 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() != '9cb3a40a4bc07894bd01da6b4c2911ba69df1926e4e23dfcaa3ccf7eced742bc':
|
||||
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')
|
||||
@@ -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__")
|
||||
depot = Image.open(art / "depot-source-hd.png").convert("RGBA")
|
||||
sd(depot, (32, 32), palette).save(art / "depot_sd.png")
|
||||
depot.resize((128, 128), Image.Resampling.LANCZOS).save(art / "depot_hd.png")
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
"missions": [
|
||||
{
|
||||
"id": "iron_coast_mission_1:mission_01",
|
||||
"name": "Iron Coast 1 — Breakwater",
|
||||
"name": "Iron Coast S1 M01: Breakwater",
|
||||
"duration": 2000,
|
||||
"auto_complete": false,
|
||||
"columns": 9,
|
||||
@@ -3077,7 +3077,7 @@
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "iron_coast_mission_1:campaign",
|
||||
"name": "Iron Coast",
|
||||
"name": "Iron Coast S1",
|
||||
"missions": [
|
||||
"iron_coast_mission_1:mission_01"
|
||||
],
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_mission_1"
|
||||
name = "Iron Coast — Mission 1: Breakwater"
|
||||
name = "Iron Coast S1 M01: Breakwater"
|
||||
version = "1.0.1"
|
||||
api_version = 1
|
||||
description = "Raid an industrial shoreline, disable two harbor turrets and destroy the Breakwater command ship. Includes SD/HD port terrain, supply depots, a trial Pulse Cannon and synthesized mission audio."
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Iron Coast — Mission 2: Tidal Relay
|
||||
# Iron Coast S1 M02: Tidal Relay
|
||||
|
||||
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_2`, `iron_coast_music`, `pulse_cannon`, `seeker_swarm`, `ion_lance`.
|
||||
|
||||
Mission `iron_coast_mission_2:mission_02`: **Iron Coast 2 — Tidal Relay**. Destroy all three relays and the Relay Warden. 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_2:mission_02`: **Iron Coast S1 M02: Tidal Relay**. Destroy all three relays and the Relay Warden. 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 **29 / 40 / 51 / 62**. These are enabled scheduled entries, not simultaneous live-enemy counts. Groups can overlap when earlier enemies survive.
|
||||
|
||||
@@ -15,3 +15,15 @@ A temporary Pulse Cannon trial is supplied when it is not already carried and an
|
||||
## 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.
|
||||
|
After Width: | Height: | Size: 3.0 MiB |
@@ -0,0 +1,9 @@
|
||||
Use case: stylized-concept
|
||||
Asset type: ONE cinematic mission briefing illustration for Iron Coast S1 M02: Tidal Relay.
|
||||
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: A tidal causeway and three compact anchored radar relay platforms linked over dark-blue coastal water, low concrete communications buildings and slim radar dishes. Gray command cruiser farther beyond the relays. Cool overcast maritime light, restrained amber signal lamps. Keep distinct round relay platform visible; no giant fantasy antenna.
|
||||
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 M02: Tidal Relay cinematic briefing",
|
||||
"mission_id": "iron_coast_mission_2:mission_02",
|
||||
"generation": {
|
||||
"tool": "built-in image_gen.imagegen",
|
||||
"actual_calls": 1,
|
||||
"gate_owner": "/root/iron_coast_names",
|
||||
"gate_lease": "aa1482df-113d-4891-bdfd-f8808efafbb6",
|
||||
"outcome": "success",
|
||||
"terminal_reported_immediately": true,
|
||||
"prompt": "briefing-cinematic-prompt.txt",
|
||||
"prompt_sha256": "a8e8f7b7971299c8e13ff39f7da00ff3bcab4f36e39cfc86a655920fd8c0a135",
|
||||
"master": "briefing-cinematic-generated-master.png",
|
||||
"master_sha256": "9af0571bf9ca512ddc9f55c0d8b320117d34fa2994f835042748da6b7ddd1a14",
|
||||
"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_2/art/briefing_hd.png",
|
||||
"sha256": "4ebdf34987c5de0abb36638f853473bbba57084fa333419b596de599a8165416"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "fcae040d0d8d2f98e05d7a6e5659a3ddfa8cf3111740eacdfdf557cbe6f7144e"
|
||||
},
|
||||
"sd": {
|
||||
"path": "art/briefing_sd.png",
|
||||
"sha256": "8d8d141ebd2dda2278179626f32a5d638f10f922a03cd402147766697e0210ab"
|
||||
}
|
||||
},
|
||||
"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."
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 137 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() != '9af0571bf9ca512ddc9f55c0d8b320117d34fa2994f835042748da6b7ddd1a14':
|
||||
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')
|
||||
@@ -8,6 +8,7 @@ import random
|
||||
import struct
|
||||
import wave
|
||||
from pathlib import Path
|
||||
import runpy
|
||||
from PIL import Image, ImageOps
|
||||
ROOT=Path(__file__).resolve().parent
|
||||
|
||||
@@ -60,7 +61,7 @@ def main():
|
||||
assert source.crop((0,h-1,w,h)).tobytes()==flip.crop((0,0,w,1)).tobytes()
|
||||
assert flip.crop((0,h-1,w,h)).tobytes()==source.crop((0,0,w,1)).tobytes()
|
||||
hd.save(art/'terrain-preview-hd.png');small.save(art/'terrain-preview-sd.png')
|
||||
for name,size in [('briefing',(320,200)),('relay',(32,32))]:
|
||||
for name,size in [('relay',(32,32))]:
|
||||
source=Image.open(art/f'{name}-source-hd.png').convert('RGBA')
|
||||
if name=='relay':
|
||||
# Normalize excessive generator padding, preserving the complete
|
||||
@@ -73,6 +74,8 @@ def main():
|
||||
source=source.crop((left,top,left+extent,top+extent))
|
||||
sd(source,size,palette).save(art/f'{name}_sd.png')
|
||||
source.resize((size[0]*4,size[1]*4),Image.Resampling.LANCZOS).save(art/f'{name}_hd.png')
|
||||
# Rebuild the cinematic briefing without changing the other artwork.
|
||||
runpy.run_path(str(art / "build_cinematic_briefing.py"), run_name="__main__")
|
||||
audio={
|
||||
'approach':synth('approach',0.75,[147,196,294]),
|
||||
'network_alarm':synth('network_alarm',0.8,[392,294,392,294],True),
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
"missions": [
|
||||
{
|
||||
"id": "iron_coast_mission_2:mission_02",
|
||||
"name": "Iron Coast 2 — Tidal Relay",
|
||||
"name": "Iron Coast S1 M02: Tidal Relay",
|
||||
"duration": 2300,
|
||||
"auto_complete": false,
|
||||
"columns": 9,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_mission_2"
|
||||
name = "Iron Coast — Mission 2: Tidal Relay"
|
||||
name = "Iron Coast S1 M02: Tidal Relay"
|
||||
version = "1.0.1"
|
||||
api_version = 1
|
||||
description = "Disrupt three anchored radar relays across the tidal causeway, then destroy the command cruiser. Includes SD/HD communications-island terrain, relay artwork and synthesized mission cues."
|
||||
|
||||
@@ -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.
|
||||
|
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."
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.1 MiB |
|
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')
|
||||
@@ -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.
|
||||
|
||||
@@ -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,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."
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Iron Coast — Mission 4: Stormwall
|
||||
# Iron Coast S1 M04: Stormwall
|
||||
|
||||
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_4`, `pulse_cannon`, `seeker_swarm`, `ion_lance`, `iron_coast_music`.
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"purpose": "Full RGB SD briefing for the menu; replaces inherited palette posterization",
|
||||
"source": "briefing_hd.png",
|
||||
"source_sha256": "cd987c13bc55bba2620379ca435c0cccf08d7564364d730c65d0be285bb82221",
|
||||
"old_sd_sha256": "11c8b492cd2df36ff05eeccded9a398da4af9113194b355fb4c6630f196d167d",
|
||||
"sd_sha256": "9bd490c5c341303bea69f55bc323f5cced581d64740371703f70d3e7a1012256",
|
||||
"recipe": "rebuild_briefing_sd.py",
|
||||
"method": "RGB 320x200 Lanczos downsample of unchanged approved HD; no image generation",
|
||||
"scope": "Menu illustration only; gameplay terrain, sprites, missions and audio unchanged"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 134 KiB |
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Refresh only this menu briefing SD image; gameplay artwork is untouched."""
|
||||
from pathlib import Path
|
||||
import hashlib
|
||||
from PIL import Image
|
||||
root = Path(__file__).resolve().parent
|
||||
source = root / "briefing_hd.png"
|
||||
assert hashlib.sha256(source.read_bytes()).hexdigest() == "cd987c13bc55bba2620379ca435c0cccf08d7564364d730c65d0be285bb82221", "Unexpected HD briefing"
|
||||
with Image.open(source) as image:
|
||||
image.convert("RGB").resize((320,200), Image.Resampling.LANCZOS).save(root / "briefing_sd.png")
|
||||
@@ -100,7 +100,7 @@ def main():
|
||||
standard.save(art / "terrain-preview-sd.png")
|
||||
briefing = Image.open(art / "briefing-source-hd.png")
|
||||
briefing.convert("RGBA").resize((1280,800), Image.Resampling.LANCZOS).save(art / "briefing_hd.png")
|
||||
sd(briefing, (320,200), palette).save(art / "briefing_sd.png")
|
||||
briefing.convert("RGBA").resize((1280,800), Image.Resampling.LANCZOS).convert("RGB").resize((320,200), Image.Resampling.LANCZOS).save(art / "briefing_sd.png")
|
||||
palette_colors = {tuple(colors[i:i+3]) for i in range(0,768,3)}
|
||||
rgb_pixels = standard.convert("RGB").tobytes()
|
||||
sd_colors = {tuple(rgb_pixels[i:i+3]) for i in range(0,len(rgb_pixels),3)}
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
"missions": [
|
||||
{
|
||||
"id": "iron_coast_mission_4:mission_04",
|
||||
"name": "Iron Coast 4 — Stormwall",
|
||||
"name": "Iron Coast S1 M04: Stormwall",
|
||||
"duration": 3000,
|
||||
"auto_complete": false,
|
||||
"columns": 9,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_mission_4"
|
||||
name = "Iron Coast — Mission 4: Stormwall"
|
||||
name = "Iron Coast S1 M04: Stormwall"
|
||||
version = "1.0.1"
|
||||
api_version = 1
|
||||
description = "Breach a storm-lashed cliff battery, silence four emplacements and destroy the Stormwall Arsenal. Original curved and crossing fighter patrols mix with Iron Coast scouts. Includes SD/HD storm-coast art, mission-only Pulse Cannon loan, warning cues and the Iron Coast soundtrack."
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Iron Coast — Mission 5: Cinder Docks
|
||||
# Iron Coast S1 M05: Cinder Docks
|
||||
|
||||
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_5`, `pulse_cannon`, `seeker_swarm`, `ion_lance`, `iron_coast_music`.
|
||||
|
||||
Mission `iron_coast_mission_5:mission_05`: **Iron Coast 5 — Cinder Docks**. Destroy both foundries and Cinder Hammer. 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_5:mission_05`: **Iron Coast S1 M05: Cinder Docks**. Destroy both foundries and Cinder Hammer. 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 **45 / 64 / 83 / 107**. These are enabled scheduled entries, not simultaneous live-enemy counts. Groups can overlap when earlier enemies survive.
|
||||
|
||||
@@ -15,3 +15,15 @@ The mission supplies three coolant cells when inventory capacity allows. Select
|
||||
## 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.
|
||||
|
After Width: | Height: | Size: 3.1 MiB |
@@ -0,0 +1,9 @@
|
||||
Use case: stylized-concept
|
||||
Asset type: ONE cinematic mission briefing illustration for Iron Coast S1 M05: Cinder Docks.
|
||||
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: A hostile industrial shipbuilding yard along dark-teal water, concrete launch docks, rust-red gantry cranes and two armored furnace stations glowing muted orange. Gray launch cruiser moored beyond the hot foundry. Smoke drifts toward the overcast horizon; machinery, wharf and warm furnace glow distinguish the approach.
|
||||
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 M05: Cinder Docks cinematic briefing",
|
||||
"mission_id": "iron_coast_mission_5:mission_05",
|
||||
"generation": {
|
||||
"tool": "built-in image_gen.imagegen",
|
||||
"actual_calls": 1,
|
||||
"gate_owner": "/root/iron_coast_names",
|
||||
"gate_lease": "5e8550a9-6378-40c4-b546-9190366ef387",
|
||||
"outcome": "success",
|
||||
"terminal_reported_immediately": true,
|
||||
"prompt": "briefing-cinematic-prompt.txt",
|
||||
"prompt_sha256": "f9f13b28ce0814acdecb87e0117f72115629414c6ff54fc9f3c1d12db481051a",
|
||||
"master": "briefing-cinematic-generated-master.png",
|
||||
"master_sha256": "c4e4bf175970efa74cb1a0355c82ef8f1052e2b043523f24c62b432cae885dae",
|
||||
"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_5/art/briefing_hd.png",
|
||||
"sha256": "7f459d0ba9ac01faee41e49f80e87c42a06eb6a6752fff93ed42e21d86939958"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "28289316584da228a27f73c0271476ad43022c7cc876510d1865d95fb6e26af6"
|
||||
},
|
||||
"sd": {
|
||||
"path": "art/briefing_sd.png",
|
||||
"sha256": "ea99825ffa1f75f9b9c2d6b3570131bf0ba4bcc9ea534122c234ec6c923a58e5"
|
||||
}
|
||||
},
|
||||
"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."
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 140 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() != 'c4e4bf175970efa74cb1a0355c82ef8f1052e2b043523f24c62b432cae885dae':
|
||||
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')
|
||||
@@ -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
|
||||
@@ -101,10 +102,12 @@ def main():
|
||||
assert flipped.crop((0,height-1,width,height)).tobytes() == terrain.crop((0,0,width,1)).tobytes()
|
||||
terrain_sd.save(art/"terrain-preview-sd.png")
|
||||
terrain_hd.save(art/"terrain-preview-hd.png")
|
||||
for name,size in [("briefing",(320,200)),("foundry",(48,48))]:
|
||||
for name,size in [("foundry",(48,48))]:
|
||||
image = Image.open(art/f"{name}-source-hd.png")
|
||||
sd(image,size,colors).save(art/f"{name}_sd.png")
|
||||
image.convert("RGBA").resize((size[0]*4,size[1]*4),Image.Resampling.LANCZOS).save(art/f"{name}_hd.png")
|
||||
# Rebuild the cinematic briefing without changing the other artwork.
|
||||
runpy.run_path(str(art / "build_cinematic_briefing.py"), run_name="__main__")
|
||||
audio = {
|
||||
"approach":wav("approach",1.1,[110,147,196],"metal"),
|
||||
"foundry_alarm":wav("foundry_alarm",0.9,[220,330,220,330],"alarm"),
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
"missions": [
|
||||
{
|
||||
"id": "iron_coast_mission_5:mission_05",
|
||||
"name": "Iron Coast 5 — Cinder Docks",
|
||||
"name": "Iron Coast S1 M05: Cinder Docks",
|
||||
"duration": 2600,
|
||||
"auto_complete": false,
|
||||
"columns": 9,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_mission_5"
|
||||
name = "Iron Coast — Mission 5: Cinder Docks"
|
||||
name = "Iron Coast S1 M05: Cinder Docks"
|
||||
version = "1.0.1"
|
||||
api_version = 1
|
||||
description = "Shut down two armored furnace stations in a hostile shipbuilding yard, then destroy its launch cruiser. Includes SD/HD industrial terrain, foundry targets, coolant injectors and synthesized warning cues."
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Iron Coast — Mission 6: Iron Crown
|
||||
# Iron Coast S1 M06: Iron Crown
|
||||
|
||||
API 1 package, version 1.0.2. 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_6`, `iron_coast_music`, `pulse_cannon`, `seeker_swarm`, `ion_lance`.
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"purpose": "Full RGB SD briefing for the menu; replaces inherited palette posterization",
|
||||
"source": "briefing_hd.png",
|
||||
"source_sha256": "cb87cd81b6d8e87c0ceb5469d1832879906c9cee48728e2c56459b51d8a07b2a",
|
||||
"old_sd_sha256": "7e6304191345cc1f9cffcd30c075887077cd5f2351eaa75fc8c41b792780cd53",
|
||||
"sd_sha256": "e1e8ca85d0ee8039b97b420e082f278967402038e681c46f1b064da58cd4c8ab",
|
||||
"recipe": "rebuild_briefing_sd.py",
|
||||
"method": "RGB 320x200 Lanczos downsample of unchanged approved HD; no image generation",
|
||||
"scope": "Menu illustration only; gameplay terrain, sprites, missions and audio unchanged"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 124 KiB |
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Refresh only this menu briefing SD image; gameplay artwork is untouched."""
|
||||
from pathlib import Path
|
||||
import hashlib
|
||||
from PIL import Image
|
||||
root = Path(__file__).resolve().parent
|
||||
source = root / "briefing_hd.png"
|
||||
assert hashlib.sha256(source.read_bytes()).hexdigest() == "cb87cd81b6d8e87c0ceb5469d1832879906c9cee48728e2c56459b51d8a07b2a", "Unexpected HD briefing"
|
||||
with Image.open(source) as image:
|
||||
image.convert("RGB").resize((320,200), Image.Resampling.LANCZOS).save(root / "briefing_sd.png")
|
||||
@@ -104,7 +104,7 @@ def main():
|
||||
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")
|
||||
palette_sd(briefing, (320, 200), palette).save(art / "briefing_sd.png")
|
||||
briefing.resize((1280, 800), Image.Resampling.LANCZOS).convert("RGB").resize((320, 200), Image.Resampling.LANCZOS).save(art / "briefing_sd.png")
|
||||
briefing.resize((1280, 800), Image.Resampling.LANCZOS).save(art / "briefing_hd.png")
|
||||
audio = {
|
||||
"approach": wav("approach", 1.1, [110, 147, 165, 220]),
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
"missions": [
|
||||
{
|
||||
"id": "iron_coast_mission_6:mission_06",
|
||||
"name": "Iron Coast 6 — Iron Crown",
|
||||
"name": "Iron Coast S1 M06: Iron Crown",
|
||||
"duration": 3800,
|
||||
"auto_complete": false,
|
||||
"columns": 9,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_mission_6"
|
||||
name = "Iron Coast — Mission 6: Iron Crown"
|
||||
name = "Iron Coast S1 M06: Iron Crown"
|
||||
version = "1.0.2"
|
||||
api_version = 1
|
||||
description = "Assault the offshore command citadel, disable six anchored batteries and destroy both command cruisers. The Iron Coast finale includes SD/HD fortress terrain, an optional Ion Lance loan and synthesized mission audio."
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# Iron Coast II: Black Tide
|
||||
# Iron Coast S2: Black Tide
|
||||
|
||||
Enable **Iron Coast II — Black Tide** in the game's Mods screen. Dependency
|
||||
Enable **Iron Coast S2: Black Tide** in the game's Mods screen. Dependency
|
||||
selection brings in all eight missions, their individual bosses, the shared
|
||||
coastal enemies, the three-track soundtrack and two optional shop weapons.
|
||||
Apply the selection at the main menu, then select Nightbreak Inlet in the
|
||||
Apply the selection at the main menu, then select **Iron Coast S2 M01: Nightbreak Inlet** in the
|
||||
Hangar's mission menu. Normal pilot saves retain the campaign and package pins.
|
||||
|
||||
The individual mission, boss, enemy and weapon mods can also be enabled
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "iron_coast_stage2_campaign:campaign",
|
||||
"name": "Iron Coast II: Black Tide",
|
||||
"name": "Iron Coast S2: Black Tide",
|
||||
"art": {
|
||||
"png": "art/briefing_sd.png",
|
||||
"hd_png": "art/briefing_hd.png",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_stage2_campaign"
|
||||
name = "Iron Coast II — Black Tide"
|
||||
name = "Iron Coast S2: Black Tide"
|
||||
version = "1.0.0"
|
||||
api_version = 1
|
||||
description = "Eight linked sorties from Nightbreak Inlet to the Black Tide command citadel, with eight distinct bosses, classic Raptor waves, new coastal enemies, two optional weapons and an original three-track soundtrack."
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Iron Coast II — Mission 1: Nightbreak Inlet
|
||||
# Iron Coast S2 M01: Nightbreak Inlet
|
||||
|
||||
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_stage2_boss_1`, `iron_coast_stage2_music`, `iron_coast_stage2_interceptor`, `iron_coast_stage2_siege`.
|
||||
|
||||
Mission `iron_coast_stage2_mission_1:mission_01`: **Nightbreak Inlet**. Destroy three required siege defenses and the boss. Required ground objectives remain reachable; escaping optional aircraft never counts as a kill. Elapsed time alone does not finish the mission.
|
||||
Mission `iron_coast_stage2_mission_1:mission_01`: **Iron Coast S2 M01: Nightbreak Inlet**. Destroy three required siege defenses and the boss. 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 **30 / 43 / 55 / 67**. 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.
|
||||
|
After Width: | Height: | Size: 2.7 MiB |
@@ -0,0 +1,9 @@
|
||||
Use case: stylized-concept
|
||||
Asset type: ONE cinematic mission briefing illustration for Iron Coast S2 M01: Nightbreak Inlet.
|
||||
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: A night harbor inlet between low industrial wharves and concrete shore platforms, dark navy water reflecting sparse amber work lights. A guarded shore platform controls the narrow entry. Predawn blue horizon and low haze; foreground gray aircraft remains legible through cool rim light rather than pure black. No city skyline or added huge fortress.
|
||||
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 S2 M01: Nightbreak Inlet cinematic briefing",
|
||||
"mission_id": "iron_coast_stage2_mission_1:mission_01",
|
||||
"generation": {
|
||||
"tool": "built-in image_gen.imagegen",
|
||||
"actual_calls": 1,
|
||||
"gate_owner": "/root/iron_coast_names",
|
||||
"gate_lease": "86625bc7-43e2-489b-974a-4d8450c130f3",
|
||||
"outcome": "success",
|
||||
"terminal_reported_immediately": true,
|
||||
"prompt": "briefing-cinematic-prompt.txt",
|
||||
"prompt_sha256": "4f1ba49af23701a767d1ea8189242354ea19a2987b4cf3b000768adf0931e050",
|
||||
"master": "briefing-cinematic-generated-master.png",
|
||||
"master_sha256": "ad1b3d91055e957e6f66257b1fd0684ed1211cd277fd1c50d76857281933e539",
|
||||
"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_stage2_mission_1/art/briefing-hd.png",
|
||||
"sha256": "d020f7f5cc7f4bd983b32726cd0d028dd60ba6997db115d0b9a3145da4e78cb5"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "eba3d058464287e933428396259b4f305a071f2e0fd28449c3db0b8c65d15912"
|
||||
},
|
||||
"sd": {
|
||||
"path": "art/briefing-sd.png",
|
||||
"sha256": "53f069624437c4af7b5b8f94fa218063976ef7d4b3d76d8be74d5923671c4fcb"
|
||||
}
|
||||
},
|
||||
"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."
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 128 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() != 'ad1b3d91055e957e6f66257b1fd0684ed1211cd277fd1c50d76857281933e539':
|
||||
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,6 +3,7 @@
|
||||
No decoded original images are packaged. No painted/masked master edits occur.
|
||||
"""
|
||||
from pathlib import Path
|
||||
import runpy
|
||||
import argparse,datetime,hashlib,json,math,random,struct,wave
|
||||
from PIL import Image,ImageOps
|
||||
ROOT=Path(__file__).resolve().parent
|
||||
@@ -58,8 +59,8 @@ def main():
|
||||
# Reflected cycle joins equal boundary rows at full and logical resolution.
|
||||
for im in [hd,sd]:assert im.crop((0,im.height-1,im.width,im.height)).tobytes()==ImageOps.flip(im).crop((0,0,im.width,1)).tobytes()
|
||||
hd.save(ROOT/'art/terrain-preview-hd.png');sd.save(ROOT/'art/terrain-preview-sd.png')
|
||||
bg=ImageOps.fit(src,(1280,800),Image.Resampling.LANCZOS,centering=(.5,.35));bg.save(ROOT/'art/briefing-hd.png');small(bg,(320,200),pal).save(ROOT/'art/briefing-sd.png')
|
||||
report['assets'].append({'source':'art/terrain-generated-v1.png','sha256':h(raw),'logical_map':[320,512],'hd_map':[1280,2048],'reflected_cycle':True,'tiles':320,'briefing':'same generated map cropped with 8:5 viewport, no separate generation','source_not_modified':True})
|
||||
runpy.run_path(str(ROOT/'art/build_cinematic_briefing.py'),run_name='__main__')
|
||||
report['assets'].append({'source':'art/terrain-generated-v1.png','sha256':h(raw),'logical_map':[320,512],'hd_map':[1280,2048],'reflected_cycle':True,'tiles':320,'briefing':'independent cinematic master, art/build_cinematic_briefing.py; see art/briefing-cinematic-provenance.json','source_not_modified':True})
|
||||
cues=[('approach',.6,164+n*30),('objective',.36,392),('boss_alarm',.75,275),('victory',.95,262)]
|
||||
(ROOT/'audio').mkdir(exist_ok=True);report['audio']=[synth(*c) for c in cues]
|
||||
report['final_art']=[{'file':str(p.relative_to(ROOT)),'sha256':h(p),'size':Image.open(p).size} for p in sorted((ROOT/'art').glob('*.png')) if 'generated' not in p.name]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"missions": [
|
||||
{
|
||||
"id": "iron_coast_stage2_mission_1:mission_01",
|
||||
"name": "Nightbreak Inlet",
|
||||
"name": "Iron Coast S2 M01: Nightbreak Inlet",
|
||||
"duration": 3000,
|
||||
"auto_complete": false,
|
||||
"art": {
|
||||
@@ -44015,7 +44015,7 @@
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "iron_coast_stage2_mission_1:campaign",
|
||||
"name": "Iron Coast II: Nightbreak Inlet",
|
||||
"name": "Iron Coast S2 M01: Nightbreak Inlet",
|
||||
"missions": [
|
||||
"iron_coast_stage2_mission_1:mission_01"
|
||||
],
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_stage2_mission_1"
|
||||
name = "Iron Coast II — Mission 1: Nightbreak Inlet"
|
||||
name = "Iron Coast S2 M01: Nightbreak Inlet"
|
||||
version = "1.0.1"
|
||||
api_version = 1
|
||||
content = "content.json"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Iron Coast II — Mission 2: Undertow Run
|
||||
# Iron Coast S2 M02: Undertow Run
|
||||
|
||||
API 1 package, version 1.0.3. Enable it in Mods at the main menu and apply the selection. The normal dependency selection also enables `iron_coast_stage2_boss_2`, `iron_coast_stage2_music`, `iron_coast_stage2_interceptor`, `iron_coast_stage2_skimmer`.
|
||||
|
||||
Mission `iron_coast_stage2_mission_2:mission_02`: **Undertow Run**. Destroy four required skimmers and the boss. Required ground objectives remain reachable; escaping optional aircraft never counts as a kill. Elapsed time alone does not finish the mission.
|
||||
Mission `iron_coast_stage2_mission_2:mission_02`: **Iron Coast S2 M02: Undertow Run**. Destroy four required skimmers and the boss. 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 / 46 / 62 / 79**. These are enabled scheduled entries, not simultaneous live-enemy counts. Groups can overlap when earlier enemies survive.
|
||||
|
||||
@@ -23,3 +23,15 @@ In the separate shield-replenished arsenal fixture, the longest threat-free stre
|
||||
Focused version 1.0.3 checks on 18 October 2026 used the frozen SourceE library and the same recorded legal controller. Four authentic post-Mission-1 saves fed paired version 1.0.2 and 1.0.3 paid continuations through Missions 2–8 and the finale replay. Every route completed with exact save/load, script-state and RNG roundtrips. Mission 2 again ended at 79 / 52 / 44 / 12 shield, with unchanged completion times and refill counts. Veteran defeated one fewer optional interceptor; Elite earned 100 more credits through the altered encounter. Required skimmer and boss objectives were unchanged.
|
||||
|
||||
The separate shield-replenished arsenal observations recorded the earlier Training/Rookie quiet interval from ticks 1,448–1,650 (8.70 seconds). Moving the armed pass split it into a longest piece of 3.73 seconds and produced four observed hostile shots. The later quiet intervals at 1,664–1,762 and 1,804–1,948 were unchanged. Some quiet time remains elsewhere: this is a local pacing correction, not a claim of continuous combat. Veteran/Elite replenished-fixture shield loss rose by six points each, while their ordinary paid routes retained the same shields and purchases. Replenished observations do not establish survival for other controllers or loadouts.
|
||||
|
||||
## 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.
|
||||
|
After Width: | Height: | Size: 2.9 MiB |
@@ -0,0 +1,9 @@
|
||||
Use case: stylized-concept
|
||||
Asset type: ONE cinematic mission briefing illustration for Iron Coast S2 M02: Undertow Run.
|
||||
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: A naval pursuit channel of deep teal coastal water edged by rugged brown rocky shallows, a few orange navigation buoys and compact shore turrets. A distant low gray missile-submarine silhouette moves along the waterway. Overcast late-afternoon sea haze with windblown whitecaps; rocky shallows and narrow channel are clear at thumbnail scale.
|
||||
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 S2 M02: Undertow Run cinematic briefing",
|
||||
"mission_id": "iron_coast_stage2_mission_2:mission_02",
|
||||
"generation": {
|
||||
"tool": "built-in image_gen.imagegen",
|
||||
"actual_calls": 1,
|
||||
"gate_owner": "/root/iron_coast_names",
|
||||
"gate_lease": "0a490a02-e618-417b-8caa-21553afd185d",
|
||||
"outcome": "success",
|
||||
"terminal_reported_immediately": true,
|
||||
"prompt": "briefing-cinematic-prompt.txt",
|
||||
"prompt_sha256": "69f7eae01e1f55aae34025e00aa57b3674cd63c4a47135b00d4fc7945a3d3d0f",
|
||||
"master": "briefing-cinematic-generated-master.png",
|
||||
"master_sha256": "8bcb3e3f907b43f5d7029fa54195c194b49407c229d1796ee57b01c3fd7ec61f",
|
||||
"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_stage2_mission_2/art/briefing-hd.png",
|
||||
"sha256": "c4550e13d85bf6816996e024673673899a92106ed4da0923933cb68fccfac602"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "da44fff28e92ae7c9fad1736e5a5007a64b3dd85fabf777f0c4848d8e02e67e7"
|
||||
},
|
||||
"sd": {
|
||||
"path": "art/briefing-sd.png",
|
||||
"sha256": "1185ff48294c410cf0472f2ac99e406ee2ebb29e525261976392875ce9de3c8a"
|
||||
}
|
||||
},
|
||||
"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."
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 137 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() != '8bcb3e3f907b43f5d7029fa54195c194b49407c229d1796ee57b01c3fd7ec61f':
|
||||
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,6 +3,7 @@
|
||||
No decoded original images are packaged. No painted/masked master edits occur.
|
||||
"""
|
||||
from pathlib import Path
|
||||
import runpy
|
||||
import argparse,datetime,hashlib,json,math,random,struct,wave
|
||||
from PIL import Image,ImageOps
|
||||
ROOT=Path(__file__).resolve().parent
|
||||
@@ -58,8 +59,8 @@ def main():
|
||||
# Reflected cycle joins equal boundary rows at full and logical resolution.
|
||||
for im in [hd,sd]:assert im.crop((0,im.height-1,im.width,im.height)).tobytes()==ImageOps.flip(im).crop((0,0,im.width,1)).tobytes()
|
||||
hd.save(ROOT/'art/terrain-preview-hd.png');sd.save(ROOT/'art/terrain-preview-sd.png')
|
||||
bg=ImageOps.fit(src,(1280,800),Image.Resampling.LANCZOS,centering=(.5,.35));bg.save(ROOT/'art/briefing-hd.png');small(bg,(320,200),pal).save(ROOT/'art/briefing-sd.png')
|
||||
report['assets'].append({'source':'art/terrain-generated-v1.png','sha256':h(raw),'logical_map':[320,512],'hd_map':[1280,2048],'reflected_cycle':True,'tiles':320,'briefing':'same generated map cropped with 8:5 viewport, no separate generation','source_not_modified':True})
|
||||
runpy.run_path(str(ROOT/'art/build_cinematic_briefing.py'),run_name='__main__')
|
||||
report['assets'].append({'source':'art/terrain-generated-v1.png','sha256':h(raw),'logical_map':[320,512],'hd_map':[1280,2048],'reflected_cycle':True,'tiles':320,'briefing':'independent cinematic master, art/build_cinematic_briefing.py; see art/briefing-cinematic-provenance.json','source_not_modified':True})
|
||||
cues=[('approach',.6,164+n*30),('objective',.36,392),('boss_alarm',.75,275),('victory',.95,262)]
|
||||
(ROOT/'audio').mkdir(exist_ok=True);report['audio']=[synth(*c) for c in cues]
|
||||
report['final_art']=[{'file':str(p.relative_to(ROOT)),'sha256':h(p),'size':Image.open(p).size} for p in sorted((ROOT/'art').glob('*.png')) if 'generated' not in p.name]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"missions": [
|
||||
{
|
||||
"id": "iron_coast_stage2_mission_2:mission_02",
|
||||
"name": "Undertow Run",
|
||||
"name": "Iron Coast S2 M02: Undertow Run",
|
||||
"duration": 3400,
|
||||
"auto_complete": false,
|
||||
"art": {
|
||||
@@ -44099,7 +44099,7 @@
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "iron_coast_stage2_mission_2:campaign",
|
||||
"name": "Iron Coast II: Undertow Run",
|
||||
"name": "Iron Coast S2 M02: Undertow Run",
|
||||
"missions": [
|
||||
"iron_coast_stage2_mission_2:mission_02"
|
||||
],
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_stage2_mission_2"
|
||||
name = "Iron Coast II — Mission 2: Undertow Run"
|
||||
name = "Iron Coast S2 M02: Undertow Run"
|
||||
version = "1.0.3"
|
||||
api_version = 1
|
||||
content = "content.json"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Iron Coast II — Mission 3: Stormglass Refinery
|
||||
# Iron Coast S2 M03: Stormglass Refinery
|
||||
|
||||
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_stage2_boss_3`, `iron_coast_stage2_interceptor`, `iron_coast_stage2_siege`, `iron_coast_stage2_music`.
|
||||
|
||||
Mission `iron_coast_stage2_mission_3:mission_03`: **Iron Coast II 3 — Stormglass Refinery**. Destroy all four fuel batteries and the boss. Required ground objectives remain reachable; escaping optional aircraft never counts as a kill. Elapsed time alone does not finish the mission.
|
||||
Mission `iron_coast_stage2_mission_3:mission_03`: **Iron Coast S2 M03: Stormglass Refinery**. Destroy all four fuel batteries and the boss. 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 **42 / 50 / 62 / 78**. 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.
|
||||
|
After Width: | Height: | Size: 3.1 MiB |
@@ -0,0 +1,9 @@
|
||||
Use case: stylized-concept
|
||||
Asset type: ONE cinematic mission briefing illustration for Iron Coast S2 M03: Stormglass Refinery.
|
||||
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: A dense coastal fuel refinery: broad cylindrical storage tanks, steel pipe racks and rust-gray concrete processing buildings along dark water canals, with an industrial defense crawler low in the distant yard. Cool gray daylight under weathered blue clouds, restrained amber work lights, broad tank silhouettes and believable refinery scale.
|
||||
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 S2 M03: Stormglass Refinery cinematic briefing",
|
||||
"mission_id": "iron_coast_stage2_mission_3:mission_03",
|
||||
"generation": {
|
||||
"tool": "built-in image_gen.imagegen",
|
||||
"actual_calls": 1,
|
||||
"gate_owner": "/root/iron_coast_names",
|
||||
"gate_lease": "a7bb212a-6f61-4f05-b112-d5c13df9b6dd",
|
||||
"outcome": "success",
|
||||
"terminal_reported_immediately": true,
|
||||
"prompt": "briefing-cinematic-prompt.txt",
|
||||
"prompt_sha256": "2d4bfc4e69325777a7da24852d66b3161236b3ff22b52f61355c885b80457a67",
|
||||
"master": "briefing-cinematic-generated-master.png",
|
||||
"master_sha256": "086727c497dfc7f3924ae70bc7b4e9c4f97d42ab092843de7d4b8a6ea4234745",
|
||||
"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_stage2_mission_3/art/briefing-hd.png",
|
||||
"sha256": "78a8a162a24dac4f55be3a6ac2395f1efade2eb5a76a9888d7579799291f9da2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "6ef95276d1d895f4c390bf8582fff2122dbf65e7073c37f1271efbeb1c09a5fa"
|
||||
},
|
||||
"sd": {
|
||||
"path": "art/briefing-sd.png",
|
||||
"sha256": "cc197dff54191f708bace27a2eceeafdf865270420c92bba4b5df4d526e13879"
|
||||
}
|
||||
},
|
||||
"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."
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 88 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() != '086727c497dfc7f3924ae70bc7b4e9c4f97d42ab092843de7d4b8a6ea4234745':
|
||||
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')
|
||||
@@ -6,6 +6,7 @@ empty/runtime-subthreshold transparent padding, fits/resamples canvases, splits
|
||||
quantizes SD to ordinary game palette colors; it never paints generated pixels.
|
||||
"""
|
||||
from pathlib import Path
|
||||
import runpy
|
||||
import argparse,hashlib,json,math,random,struct,wave
|
||||
from PIL import Image,ImageOps
|
||||
ROOT=Path(__file__).resolve().parent
|
||||
@@ -62,8 +63,8 @@ def main():
|
||||
for col in range(9):
|
||||
hi.crop((col*128,row*128,(col+1)*128,(row+1)*128)).save(ROOT/'art'/f'tile-{tiles:03}-hd.png');lo.crop((col*32,row*32,(col+1)*32,(row+1)*32)).save(ROOT/'art'/f'tile-{tiles:03}-sd.png');tiles+=1
|
||||
for im in [hd,low]:assert im.crop((0,im.height-1,im.width,im.height)).tobytes()==ImageOps.flip(im).crop((0,0,im.width,1)).tobytes()
|
||||
# Briefing is a truthful wide crop of the generated terrain, not new artwork.
|
||||
briefing=ImageOps.fit(source,(1280,800),Image.Resampling.LANCZOS);briefing.save(ROOT/'art/briefing-hd.png');sd(briefing,(320,200),pal).save(ROOT/'art/briefing-sd.png');low.save(ROOT/'art/terrain-preview-sd.png');hd.save(ROOT/'art/terrain-preview-hd.png')
|
||||
report['terrain']={'master_sha256':hashfile(p),'master_size':list(source.size),'logical_joined_size':[288,512],'hd_joined_size':[1152,2048],'tiles':tiles,'period_rows':32,'repeat':'forward16 rows then reflected16 rows, both periodboundaries identical','joined_before_quantizing_and_splitting':True,'seam_checks':True,'briefing':'320x200 /1280x800 central wide crop from same genuine terrain master'}
|
||||
# The briefing is rebuilt from its independent cinematic master.
|
||||
runpy.run_path(str(ROOT/'art/build_cinematic_briefing.py'),run_name='__main__');low.save(ROOT/'art/terrain-preview-sd.png');hd.save(ROOT/'art/terrain-preview-hd.png')
|
||||
report['terrain']={'master_sha256':hashfile(p),'master_size':list(source.size),'logical_joined_size':[288,512],'hd_joined_size':[1152,2048],'tiles':tiles,'period_rows':32,'repeat':'forward16 rows then reflected16 rows, both periodboundaries identical','joined_before_quantizing_and_splitting':True,'seam_checks':True,'briefing':'independent cinematic master, art/build_cinematic_briefing.py; see art/briefing-cinematic-provenance.json'}
|
||||
(ROOT/'asset-report.json').write_text(json.dumps(report,indent=2)+'\n');print(ROOT.name,'assets/sounds ready')
|
||||
if __name__=='__main__':main()
|
||||
@@ -68,7 +68,7 @@
|
||||
"missions": [
|
||||
{
|
||||
"id": "iron_coast_stage2_mission_3:mission_03",
|
||||
"name": "Iron Coast II 3 \u2014 Stormglass Refinery",
|
||||
"name": "Iron Coast S2 M03: Stormglass Refinery",
|
||||
"duration": 3300,
|
||||
"auto_complete": false,
|
||||
"columns": 9,
|
||||
@@ -5534,7 +5534,7 @@
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "iron_coast_stage2_mission_3:campaign",
|
||||
"name": "Stormglass Refinery \u2014 Standalone",
|
||||
"name": "Iron Coast S2 M03: Stormglass Refinery",
|
||||
"missions": [
|
||||
"iron_coast_stage2_mission_3:mission_03"
|
||||
],
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
id = "iron_coast_stage2_mission_3"
|
||||
name = "Iron Coast II — Mission 3: Stormglass Refinery"
|
||||
name = "Iron Coast S2 M03: Stormglass Refinery"
|
||||
version = "1.0.1"
|
||||
api_version = 1
|
||||
description = "Stormglass Refinery: four mandatory defenses and the distinct Stormglass boss. Original classic enemies interleave new units; objective survivors stay reachable."
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Iron Coast II — Mission 4: Floodgate Zero
|
||||
# Iron Coast S2 M04: Floodgate Zero
|
||||
|
||||
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_stage2_boss_4`, `iron_coast_stage2_interceptor`, `iron_coast_stage2_skimmer`, `iron_coast_stage2_music`.
|
||||
|
||||
Mission `iron_coast_stage2_mission_4:mission_04`: **Iron Coast II 4 — Floodgate Zero**. Destroy all four crossing defenses and the boss. Required ground objectives remain reachable; escaping optional aircraft never counts as a kill. Elapsed time alone does not finish the mission.
|
||||
Mission `iron_coast_stage2_mission_4:mission_04`: **Iron Coast S2 M04: Floodgate Zero**. Destroy all four crossing defenses and the boss. 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 **42 / 50 / 62 / 78**. 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.
|
||||