Retune Iron Coast waves, enemy attacks and weapon presentation

This commit is contained in:
raptorreplica committed 2026-10-17 18:13:20 +11:00
1 parent 00cfcc2031
commit c4a4d821d5
145 files changed
+9242 -2951

No files matched your search

+6 -60
View File
@@ -1,67 +1,13 @@
# Iron Coast — Mission 3: Saltworks Convoy
Intercept three armored cargo transports, disable two escort turrets and destroy
the **Saltbreaker** command cruiser. Cargo wrecks recover maintenance supplies
that restore 15 shield each. The completion bonus is 7,500 credits, in addition
to enemy destruction rewards. Waiting out the duration cannot complete it.
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`.
Enable this individual mod to select its installed dependencies automatically:
`iron_coast_scout`, `iron_coast_turret`, `iron_coast_boss_3`, `pulse_cannon`,
`seeker_swarm`, `ion_lance`, and `iron_coast_music`, all compatible with `^1.0`.
Then choose **Iron Coast 3 — Saltworks Convoy** in the mission list. The optional
Iron Coast campaign assembly places this mission after Mission 2; the individual
mod works independently and does not override any other mission.
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.
The saltworks include rectangular evaporation basins, steel conveyors, brine
channels and a central cargo route. Eighteen fighter arrivals mix fourteen
scripted Iron Coast scouts with four original Raptor enemy definitions:
`base:enemy_0_20` uses a weaving descent; `base:enemy_0_21` and
`base:enemy_0_22` make opposing lateral sweeps; `base:enemy_0_73` makes a
curved approach. Their original sprite IDs, animation, weapons, movement paths,
health and rewards are retained. They spawn before the command cruiser.
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.
Cargo transports and required turrets stop at their interdiction lines instead
of scrolling out of reach. The Saltbreaker remains in its patrol corridor until
destroyed. A full 20-slot inventory can start and complete this mission: it
does not grant loans or additional equipment, and cargo recovery restores
shield directly. Mission start resets the objective and phase state on retries.
Align the forward guns with required targets while moving around incoming shots. If carried, select Field Repair or coolant with Cycle and use Special: they restore 25 or 30 energy respectively and consume a real item. Shop purchases and refills still cost credits.
All new artwork and sound are included in Git: three built-in imagegen master
images, their packaged SD and HD variants, five synthesized WAV cues, the
deterministic asset builder and provenance. SD uses the original game palette;
HD keeps the same logical canvases. Terrain is quantized as one complete image
before tile extraction. A forward/reflected repeat makes both scroll boundaries
match exactly. `asset-report.json` records dimensions, transparency, palette
checks, seam checks, source hashes and audio hashes.
## Validation and history
Regenerate the packaged images and cues from the checked-in masters:
```sh
python3 RustRaptor/mods/iron_coast_mission_3/build_assets.py
```
The default builder palette comes from the separately installed original catalog
at `data/misc/PALETTE_DAT`; use `--palette PATH` to select another copy. Original
game assets are not copied into the mod. `prompts.md` and `prompts.json` document
generation, including the style-reference roles.
Run the local acceptance probe from the repository root:
```sh
RustRaptor/mods/iron_coast_mission_3/validate.sh
```
The probe uses the actual original catalog and scripts, tests registered pilots
(75 shield and 10,000 credits) on difficulties 1–3, tests a default deterministic
fixture, checks that essential targets remain available, and checks restart,
full-inventory and single-reward behavior. Ordinary playthroughs use starter
forward guns with held fire at logical position `(144, 160)` and inject no
damage, credits, shield or inventory commands into the playthrough. The separate retention
test restores test shield only to observe waiting behavior; it is not used as
a successful gameplay proof. `validation-report.txt` records final results.
Final registered-pilot starter results: difficulty 1 completed at tick **1184**
with **88** shield; difficulties 2 and 3 completed at tick **1264** with
**83** shield. All three ended with **21,515** credits. The full 20-slot flight
completed at tick **1178** with 82 shield and retained every non-energy item
and count. No paid refills or premium weapon purchases are required.
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.
+424 -71
View File
@@ -68,7 +68,7 @@
"missions": [
{
"id": "iron_coast_mission_3:mission_03",
"name": "Iron Coast 3 \u2014 Saltworks Convoy",
"name": "Iron Coast 3 — Saltworks Convoy",
"duration": 3000,
"auto_complete": false,
"columns": 9,
@@ -2886,148 +2886,501 @@
],
"spawns": [
{
"tick": 40,
"enemy": "base:enemy_0_20",
"x": 80,
"y": -32
},
{
"tick": 75,
"tick": 36,
"enemy": "iron_coast_scout:unit",
"x": 200,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 125,
"enemy": "base:enemy_0_21",
"x": 232,
"y": -32
"tick": 36,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 36,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 36,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 36,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 116,
"enemy": "base:enemy_0_23",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 116,
"enemy": "base:enemy_0_24",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 116,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 116,
"enemy": "base:enemy_0_23",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 116,
"enemy": "base:enemy_0_24",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 130,
"enemy": "iron_coast_turret:unit",
"x": 144,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 190,
"enemy": "iron_coast_mission_3:convoy",
"x": 148,
"y": -40
"y": -40,
"difficulty": 0
},
{
"tick": 235,
"enemy": "iron_coast_scout:unit",
"x": 228,
"y": -24
"tick": 214,
"enemy": "base:enemy_1_25",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 280,
"enemy": "iron_coast_scout:unit",
"x": 70,
"y": -24
"tick": 214,
"enemy": "base:enemy_1_26",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 340,
"tick": 214,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24
"y": -24,
"difficulty": 1
},
{
"tick": 405,
"tick": 214,
"enemy": "base:enemy_1_25",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 214,
"enemy": "base:enemy_1_26",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 306,
"enemy": "iron_coast_scout:unit",
"x": 200,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 306,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 306,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 306,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 306,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 398,
"enemy": "base:enemy_0_21",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 398,
"enemy": "base:enemy_0_22",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 398,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 398,
"enemy": "base:enemy_0_21",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 398,
"enemy": "base:enemy_0_22",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 430,
"enemy": "iron_coast_mission_3:convoy",
"x": 148,
"y": -40
"y": -40,
"difficulty": 0
},
{
"tick": 450,
"tick": 488,
"enemy": "base:enemy_0_73",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 488,
"enemy": "base:enemy_0_74",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 488,
"enemy": "iron_coast_scout:unit",
"x": 92,
"y": -24
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 488,
"enemy": "base:enemy_0_73",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 488,
"enemy": "base:enemy_0_74",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 500,
"enemy": "iron_coast_turret:unit",
"x": 144,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 555,
"tick": 582,
"enemy": "iron_coast_scout:unit",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 582,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 582,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24
"y": -24,
"difficulty": 1
},
{
"tick": 615,
"enemy": "base:enemy_0_22",
"x": 64,
"y": -32
},
{
"tick": 660,
"tick": 582,
"enemy": "iron_coast_scout:unit",
"x": 70,
"y": -24
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 582,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 674,
"enemy": "base:enemy_1_25",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 674,
"enemy": "base:enemy_1_26",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 674,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 674,
"enemy": "base:enemy_1_25",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 674,
"enemy": "base:enemy_1_26",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 720,
"enemy": "iron_coast_mission_3:convoy",
"x": 148,
"y": -40
"y": -40,
"difficulty": 0
},
{
"tick": 730,
"tick": 774,
"enemy": "base:enemy_0_20",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 774,
"enemy": "base:enemy_0_20",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 774,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24
"y": -24,
"difficulty": 1
},
{
"tick": 790,
"tick": 774,
"enemy": "base:enemy_0_20",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 774,
"enemy": "base:enemy_0_20",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 868,
"enemy": "iron_coast_scout:unit",
"x": 210,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 865,
"tick": 868,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 868,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 868,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 868,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 980,
"enemy": "base:enemy_0_73",
"x": 128,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 920,
"tick": 980,
"enemy": "base:enemy_0_74",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 980,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24
"y": -24,
"difficulty": 1
},
{
"tick": 975,
"enemy": "iron_coast_scout:unit",
"x": 220,
"y": -24
"tick": 980,
"enemy": "base:enemy_0_73",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 1030,
"enemy": "iron_coast_scout:unit",
"x": 80,
"y": -24
},
{
"tick": 1070,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24
"tick": 980,
"enemy": "base:enemy_0_74",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 1100,
"enemy": "iron_coast_boss_3:unit",
"x": 112,
"y": -64
"y": -64,
"difficulty": 0
},
{
"tick": 1128,
"enemy": "base:enemy_0_23",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 1128,
"enemy": "base:enemy_0_24",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 1128,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 1128,
"enemy": "base:enemy_0_23",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 1128,
"enemy": "base:enemy_0_24",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 1260,
"enemy": "iron_coast_scout:unit",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 1260,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 1260,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 1260,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 1260,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
}
],
"art": {
+1 -1
View File
@@ -1,6 +1,6 @@
id = "iron_coast_mission_3"
name = "Iron Coast — Mission 3: Saltworks Convoy"
version = "1.0.0"
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."
content = "content.json"