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

+9 -68
View File
@@ -1,76 +1,17 @@
# Iron Coast 2 — Tidal Relay
# Iron Coast — Mission 2: Tidal Relay
Disrupt the tidal communications network after the Breakwater raid. Destroy
all three armored navigation relays, then defeat the **Relay Warden** radar
carrier. Relays anchor in the firing corridor until destroyed; neither an
escaped optional enemy nor an early boss kill can lock the objectives.
Each relay yields 140 credits and recovers 12 ordinary energy. Victory pays
7,500 credits in addition to normal destruction and salvage rewards.
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`.
Enable this package in **Mods** to select its eight-package standalone set:
this mission, `iron_coast_scout`, `iron_coast_turret`, `pulse_cannon`,
`seeker_swarm`, `ion_lance`, `iron_coast_boss_2`, and `iron_coast_music`.
Choose **Iron Coast 2 — Tidal Relay** in the mission menu. The optional
`iron_coast_campaign` assembly package connects it to the full six-level
route. This individual package has no next-mission override and can be played
without the other five mission packages.
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.
The flight grants a mission-only Pulse Cannon when a free inventory slot
exists. The cannon is returned on success or failure; a cannon already owned
by the pilot is retained. A full 20-slot inventory skips the loan. No kits,
ammunition, or premium weapon purchases are required for the acceptance route.
The duration of 2,300 ticks is a catalog hint; timer expiry does not win.
The Relay Warden arrives at tick 860 and remains available until destroyed.
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.
The waves mix Iron Coast scouts and turrets with untouched original enemy
registry definitions and their native animation, guns, and movement:
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.
| Spawn | Original definition | Native movement |
| --- | --- | --- |
| Tick 75, x216 | `base:enemy_0_20` / SHIP05G1_PIC | Six-leg zigzag entry, speed 3 |
| Tick 330, x168 | `base:enemy_0_23` / SHIP06G1_PIC | Wide crossing sweep, speed 3 |
| Tick 620, x176 | `base:enemy_0_56` / SHIP25G1_PIC | Authored entry then player chase, speed 5 |
## Equipment supplied by the mission
All three appear on every difficulty. Their original assets remain in the
separately installed game catalog; this package neither duplicates nor
redefines original enemy data. New package-local art supplies the relay
station, briefing and scrolling tidal causeway in SD and HD. The shared
**Coastal Steel** soundtrack is a 96-second generated MUS loop played by
the Rust FM synthesizer. Six local WAV cues cover approach, network alert,
relay destruction, network shutdown, boss arrival and victory.
A temporary Pulse Cannon trial is supplied when it is not already carried and an inventory slot is available. It fires automatically with the primary Fire control and is returned after the mission.
All three generated art masters, 216 pairs of terrain crops, SD/HD briefing
and relay sprites, WAVs, scripts and provenance are included in Git.
`prompts.json` and `prompts.md` record the exact built-in imagegen prompts.
The original VGA palette remains outside Git. The builder converts the full
SD terrain canvas before splitting tiles, uses a reflected scroll period with
identical repeat boundaries, and normalizes excessive transparent padding
around the relay silhouette without changing its logical 32×32 canvas.
## Validation and history
```sh
python3 RustRaptor/mods/iron_coast_mission_2/build_assets.py
cargo run --locked --manifest-path RustRaptor/Cargo.toml --no-default-features \
-- --data data --mods RustRaptor/mods \
--validate-mods iron_coast_scout,iron_coast_turret,pulse_cannon,seeker_swarm,ion_lance,iron_coast_boss_2,iron_coast_music,iron_coast_mission_2
cargo run --locked \
--manifest-path RustRaptor/mods/iron_coast_mission_2/validation/Cargo.toml \
--target-dir RustRaptor/target --bin validate-mission
```
The standalone validator uses the actual engine and locally installed original
catalog. It preserves script state between four mission restarts, exercises a
registered 75-energy/10,000-credit pilot, a 100-energy fixture, an owned cannon
and a full inventory, and checks exact completion gating and one-time reward.
It fires continuously at y160, moving at most four pixels per tick toward the
first live relay, or x144 when no relay is alive. It injects no damage, shield,
credit or purchased-weapon commands during its playable routes.
The normal registration run wins at **tick 926**, with **86 energy** and
**21,365 total credits** (11,365 earned). All three native enemies are observed
moving. The full-inventory run wins at tick 930 with 82 energy, no loaned cannon
and ordinary equipment preserved. Combat shield charge may naturally change.
The owned-cannon run retains the pilot's cannon. All six local cues dispatch.
See `acceptance-report.json` for exact independent/restarted-run results and
`asset-report.json` for palette, seam, transparency and waveform checks.
Human play difficulty and audiovisual preference still require normal play
review; these controlled simulations establish a viable path.
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.
+371 -39
View File
@@ -79,7 +79,7 @@
"missions": [
{
"id": "iron_coast_mission_2:mission_02",
"name": "Iron Coast 2 \u2014 Tidal Relay",
"name": "Iron Coast 2 — Tidal Relay",
"duration": 2300,
"auto_complete": false,
"columns": 9,
@@ -2681,106 +2681,438 @@
],
"spawns": [
{
"tick": 35,
"tick": 32,
"enemy": "iron_coast_scout:unit",
"x": 72,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 75,
"enemy": "base:enemy_0_20",
"tick": 32,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 130,
"tick": 32,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24
"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": 112,
"enemy": "base:enemy_0_73",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 112,
"enemy": "base:enemy_0_74",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 112,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 112,
"enemy": "base:enemy_0_73",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 112,
"enemy": "base:enemy_0_74",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 180,
"enemy": "iron_coast_mission_2:relay",
"x": 96,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 220,
"enemy": "base:enemy_0_23",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 220,
"enemy": "base:enemy_0_24",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 220,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 220,
"enemy": "base:enemy_0_23",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 220,
"enemy": "base:enemy_0_24",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 250,
"enemy": "iron_coast_turret:unit",
"x": 48,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 290,
"tick": 302,
"enemy": "iron_coast_scout:unit",
"x": 88,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 330,
"enemy": "base:enemy_0_23",
"x": 168,
"y": -32
"tick": 302,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 302,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 302,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 302,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 360,
"enemy": "iron_coast_mission_2:relay",
"x": 176,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 410,
"enemy": "base:enemy_0_21",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 410,
"enemy": "base:enemy_0_22",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 410,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 410,
"enemy": "base:enemy_0_21",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 410,
"enemy": "base:enemy_0_22",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 420,
"enemy": "iron_coast_turret:unit",
"x": 240,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 455,
"tick": 496,
"enemy": "base:enemy_0_73",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 496,
"enemy": "base:enemy_0_74",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 496,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24
"y": -24,
"difficulty": 1
},
{
"tick": 496,
"enemy": "base:enemy_0_73",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 496,
"enemy": "base:enemy_0_74",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 520,
"enemy": "iron_coast_mission_2:relay",
"x": 136,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 585,
"tick": 602,
"enemy": "iron_coast_scout:unit",
"x": 72,
"y": -24
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 620,
"enemy": "base:enemy_0_56",
"x": 176,
"y": -32
"tick": 602,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 602,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 602,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 602,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 665,
"enemy": "iron_coast_turret:unit",
"x": 144,
"y": -32
"y": -32,
"difficulty": 0
},
{
"tick": 715,
"enemy": "iron_coast_scout:unit",
"x": 112,
"y": -24
"tick": 700,
"enemy": "base:enemy_0_20",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 760,
"tick": 700,
"enemy": "base:enemy_0_20",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 700,
"enemy": "iron_coast_scout:unit",
"x": 184,
"y": -24
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 700,
"enemy": "base:enemy_0_20",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 700,
"enemy": "base:enemy_0_20",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 774,
"enemy": "base:enemy_0_21",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 774,
"enemy": "base:enemy_0_22",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 774,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 774,
"enemy": "base:enemy_0_21",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 774,
"enemy": "base:enemy_0_22",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 860,
"enemy": "iron_coast_boss_2:unit",
"x": 112,
"y": -64
"y": -64,
"difficulty": 0
},
{
"tick": 888,
"enemy": "iron_coast_scout:unit",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 888,
"enemy": "iron_coast_scout:unit",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 888,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 888,
"enemy": "iron_coast_scout:unit",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 888,
"enemy": "iron_coast_scout:unit",
"x": 264,
"y": -32,
"difficulty": 3
},
{
"tick": 1008,
"enemy": "base:enemy_0_23",
"x": 64,
"y": -32,
"difficulty": 0
},
{
"tick": 1008,
"enemy": "base:enemy_0_24",
"x": 216,
"y": -32,
"difficulty": 0
},
{
"tick": 1008,
"enemy": "iron_coast_scout:unit",
"x": 136,
"y": -24,
"difficulty": 1
},
{
"tick": 1008,
"enemy": "base:enemy_0_23",
"x": 24,
"y": -32,
"difficulty": 2
},
{
"tick": 1008,
"enemy": "base:enemy_0_24",
"x": 264,
"y": -32,
"difficulty": 3
}
],
"art": {
+1 -1
View File
@@ -1,6 +1,6 @@
id = "iron_coast_mission_2"
name = "Iron Coast — Mission 2: Tidal Relay"
version = "1.0.0"
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."
content = "content.json"