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

+8 -61
View File
@@ -1,70 +1,17 @@
# Iron Coast — Mission 4: Stormwall
Enable this individual mission in **Mods**. Its seven installed dependencies
are selected automatically: `iron_coast_scout`, `iron_coast_turret`,
`iron_coast_boss_4`, `pulse_cannon`, `seeker_swarm`, `ion_lance`, and
`iron_coast_music`, all at
compatible 1.x versions. This mission is independently playable; the optional
Iron Coast campaign pack supplies campaign ordering.
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`.
Choose **Iron Coast 4 — Stormwall**. Scout flights screen four coastal
batteries on the right-hand cliff. Destroy all four emplacements and the
Stormwall Arsenal to finish. Turrets enter at ticks 180, 340, 620 and 820;
the Arsenal enters at 1150. Surviving batteries stop at logical y=72 and
the Arsenal patrols at the top of the battlefield until killed. Waiting out
the 3000-tick duration never completes the mission.
Mission `iron_coast_mission_4:mission_04`: **Iron Coast 4 — Stormwall**. Destroy four required turrets and Stormwall Arsenal. Required ground objectives remain reachable; escaping optional aircraft never counts as a kill. Elapsed time alone does not finish the mission.
Six original aircraft entries mix with fourteen Iron Coast scouts. The
`base:enemy_0_73` and `base:enemy_0_74` pair follows curved nine-point
routes; `base:enemy_0_23` and `base:enemy_0_24` cross the battlefield;
`base:enemy_1_25` and `base:enemy_1_26` use a second original curved entry.
Their catalog definitions retain original flight points, speed, firing,
animation and rewards. This package references them directly and contains
no copied original sprites or definitions.
Scheduled spawn totals for Training / Rookie / Veteran / Elite are **35 / 50 / 65 / 84**. These are enabled scheduled entries, not simultaneous live-enemy counts. Groups can overlap when earlier enemies survive.
Hold Fire, move under each battery on the right, then follow the Arsenal's
horizontal patrol. Its battery alarms and visible pauses warn before each
three-shell salvo. A Pulse Cannon is loaned when absent and an inventory slot
is free. It fires alongside the primary guns without weapon selection. The
loan is returned on success or failure; owned equipment is preserved. Full
20-slot inventories skip the loan and start without deleting equipment.
Storm effects are artwork and warning sounds; there is no hidden weather
damage. The separate soundtrack mod supplies the looping **Coastal Steel**
MUS composition through Rust FM synthesis. Victory awards 12,000 credits
plus ordinary enemy destruction rewards.
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.
The mission contains 216 SD/HD terrain pairs, matching SD/HD briefing art,
two generated source masters and four synthesized WAV cues. Artwork, sounds,
prompts and provenance are packaged here for Git. Original game data remains
external. See `prompts.json`, `prompts.md` and `asset-report.json`.
## Equipment supplied by the mission
Regenerate the deterministic packaging from the project root:
A temporary Pulse Cannon trial is supplied when needed and capacity allows. Hold Fire to use it alongside the forward guns; the temporary item is returned after the mission.
```sh
python3 RustRaptor/mods/iron_coast_mission_4/build_assets.py
```
## Validation and history
After building RustRaptor in release mode, validate the real catalog, scripts
and playthrough without changing any saves:
```sh
python3 RustRaptor/mods/iron_coast_mission_4/validate.py
```
Actual-input acceptance uses difficulty 2, held fire, y=160, and horizontal
movement limited to four logical pixels per step, aiming at a visible turret
first, then the Arsenal, then aircraft. It uses the mission loan and no
purchased equipment, direct damage commands or shield refills. Separate
tests check original enemies seen and moving, late reachable objectives,
reward gating, one-time payout, full-inventory victory, loan return on failure,
successful replay with retained script state and owned equipment.
Final revision results are recorded in `acceptance-report.json`.
The revised eight-package run passes seven focused tests. A normal
75-shield/10,000-credit pilot completes at tick **1218** with **63 shield
and 27,805 credits**; the 100-shield/zero-credit fixture ends at the same
step with **88 shield and 17,805 credits**. All six native aircraft types
are observed moving in both runs. A veteran with twenty occupied inventory
slots also completes without receiving the loan or losing equipment.
These controlled runs establish a viable path; they do not establish
balancing for every player, loadout or difficulty.
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.
+514 -82
View File
@@ -40,7 +40,7 @@
"missions": [
{
"id": "iron_coast_mission_4:mission_04",
"name": "Iron Coast 4 \u2014 Stormwall",
"name": "Iron Coast 4 — Stormwall",
"duration": 3000,
"auto_complete": false,
"columns": 9,
@@ -2858,160 +2858,592 @@
],
"spawns": [
{
"tick": 35,
"tick": 32,
"enemy": "iron_coast_scout:unit",
"x": 56,
"y": -24
},
{
"tick": 85,
"enemy": "base:enemy_0_73",
"x": 170,
"y": -80,
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 140,
"enemy": "base:enemy_0_74",
"x": 70,
"y": -80,
"tick": 32,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 32,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 32,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 32,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 124,
"enemy": "base:enemy_1_25",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 124,
"enemy": "base:enemy_1_26",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 124,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 124,
"enemy": "base:enemy_1_25",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 124,
"enemy": "base:enemy_1_26",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 180,
"enemy": "iron_coast_turret:unit",
"x": 224,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 245,
"enemy": "iron_coast_scout:unit",
"x": 104,
"y": -24
"tick": 220,
"enemy": "base:enemy_0_20",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 295,
"tick": 220,
"enemy": "base:enemy_0_20",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 220,
"enemy": "iron_coast_scout:unit",
"x": 184,
"y": -24
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 220,
"enemy": "base:enemy_0_20",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 220,
"enemy": "base:enemy_0_20",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 240,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 3
},
{
"tick": 310,
"enemy": "iron_coast_scout:unit",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 310,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 310,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 310,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 310,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 340,
"enemy": "iron_coast_turret:unit",
"x": 208,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 405,
"tick": 400,
"enemy": "base:enemy_0_73",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 400,
"enemy": "base:enemy_0_74",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 400,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 400,
"enemy": "base:enemy_0_73",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 400,
"enemy": "base:enemy_0_74",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 496,
"enemy": "base:enemy_0_23",
"x": 184,
"y": -72,
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 455,
"tick": 496,
"enemy": "base:enemy_0_24",
"x": 88,
"y": -72,
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 510,
"tick": 496,
"enemy": "iron_coast_scout:unit",
"x": 208,
"y": -24
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 560,
"tick": 496,
"enemy": "base:enemy_0_23",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 496,
"enemy": "base:enemy_0_24",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 586,
"enemy": "iron_coast_scout:unit",
"x": 104,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 586,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 586,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 586,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 586,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 606,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 3
},
{
"tick": 620,
"enemy": "iron_coast_turret:unit",
"x": 240,
"y": -32
},
{
"tick": 680,
"enemy": "iron_coast_scout:unit",
"x": 184,
"y": -24
},
{
"tick": 730,
"enemy": "base:enemy_1_25",
"x": 176,
"y": -64,
"y": -32,
"difficulty": 0
},
{
"tick": 780,
"enemy": "base:enemy_1_26",
"tick": 676,
"enemy": "base:enemy_0_20",
"x": 64,
"y": -64,
"y": -32,
"difficulty": 0
},
{
"tick": 676,
"enemy": "base:enemy_0_20",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 676,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 676,
"enemy": "base:enemy_0_20",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 676,
"enemy": "base:enemy_0_20",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 766,
"enemy": "base:enemy_0_21",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 766,
"enemy": "base:enemy_0_22",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 766,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 766,
"enemy": "base:enemy_0_21",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 766,
"enemy": "base:enemy_0_22",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 820,
"enemy": "iron_coast_turret:unit",
"x": 192,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 870,
"tick": 860,
"enemy": "iron_coast_scout:unit",
"x": 208,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 925,
"tick": 860,
"enemy": "iron_coast_scout:unit",
"x": 104,
"y": -24
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 980,
"enemy": "iron_coast_scout:unit",
"x": 184,
"y": -24
},
{
"tick": 1040,
"enemy": "iron_coast_scout:unit",
"x": 56,
"y": -24
},
{
"tick": 1100,
"tick": 860,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24
"y": -24,
"difficulty": 1
},
{
"tick": 860,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 860,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 956,
"enemy": "base:enemy_0_23",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 956,
"enemy": "base:enemy_0_24",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 956,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 956,
"enemy": "base:enemy_0_23",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 956,
"enemy": "base:enemy_0_24",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 976,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 3
},
{
"tick": 1054,
"enemy": "base:enemy_1_25",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 1054,
"enemy": "base:enemy_1_26",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 1054,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 1054,
"enemy": "base:enemy_1_25",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 1054,
"enemy": "base:enemy_1_26",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 1150,
"enemy": "iron_coast_boss_4:unit",
"x": 112,
"y": -64
"y": -64,
"difficulty": 0
},
{
"tick": 1260,
"tick": 1182,
"enemy": "iron_coast_scout:unit",
"x": 208,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 1320,
"tick": 1182,
"enemy": "iron_coast_scout:unit",
"x": 104,
"y": -24
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 1400,
"tick": 1182,
"enemy": "iron_coast_scout:unit",
"x": 184,
"y": -24
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 1182,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 1182,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 1302,
"enemy": "base:enemy_0_21",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 1302,
"enemy": "base:enemy_0_22",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 1302,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 1302,
"enemy": "base:enemy_0_21",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 1302,
"enemy": "base:enemy_0_22",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 1422,
"enemy": "base:enemy_0_73",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 1422,
"enemy": "base:enemy_0_74",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 1422,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 1422,
"enemy": "base:enemy_0_73",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 1422,
"enemy": "base:enemy_0_74",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 1442,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 3
}
],
"art": {
+1 -1
View File
@@ -1,6 +1,6 @@
id = "iron_coast_mission_4"
name = "Iron Coast — Mission 4: Stormwall"
version = "1.0.0"
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."
content = "content.json"