75 lines
3.8 KiB
Plaintext
75 lines
3.8 KiB
Plaintext
// All encounter state resets on entry, even when prior script statistics were saved.
|
|
fn on_mission_start(event, state, random) {
|
|
let commands = [
|
|
#{op:"objective", key:"iron_coast_mission_5:phase", value:1},
|
|
#{op:"objective", key:"iron_coast_mission_5:foundries_destroyed", value:0},
|
|
#{op:"objective", key:"iron_coast_mission_5:foundries_required", value:2},
|
|
#{op:"objective", key:"iron_coast_mission_5:heat_lane", value:0},
|
|
#{op:"objective", key:"iron_coast_mission_5:complete", value:0},
|
|
#{op:"objective", key:"iron_coast_boss_5:defeated", value:0},
|
|
#{op:"play_sound", sound:"iron_coast_mission_5:approach"}
|
|
];
|
|
let slots = event.player.inventory.len() + event.player.super_shield_reserves.len();
|
|
if event.player.inventory.contains("iron_coast_mission_5:coolant") || slots < 20 {
|
|
commands.push(#{op:"give_item", item:"iron_coast_mission_5:coolant", count:3});
|
|
}
|
|
#{commands:commands, state:#{complete:false, second_alarm:false, boss_alarm:false}}
|
|
}
|
|
|
|
fn on_tick(event, state, random) {
|
|
let commands = [];
|
|
if event.tick == 240 {
|
|
commands.push(#{op:"objective", key:"iron_coast_mission_5:phase", value:2});
|
|
commands.push(#{op:"play_sound", sound:"iron_coast_mission_5:foundry_alarm"});
|
|
}
|
|
if event.tick >= 920 && !state.second_alarm {
|
|
state.second_alarm = true;
|
|
commands.push(#{op:"objective", key:"iron_coast_mission_5:phase", value:3});
|
|
commands.push(#{op:"play_sound", sound:"iron_coast_mission_5:foundry_alarm"});
|
|
}
|
|
// Slag falls only in the outer lanes. A warning precedes each bounded volley
|
|
// by 35 simulation ticks (1.5 seconds); the central firing corridor is safe.
|
|
if event.tick >= 360 && event.tick < 1560 {
|
|
let cycle = event.tick / 180;
|
|
let left = cycle % 2 == 0;
|
|
if event.tick % 180 == 0 {
|
|
let lane = if left { -1 } else { 1 };
|
|
commands.push(#{op:"objective", key:"iron_coast_mission_5:heat_lane", value:lane});
|
|
commands.push(#{op:"play_sound", sound:"iron_coast_mission_5:heat_warning"});
|
|
}
|
|
if event.tick % 180 == 35 {
|
|
let origin = if left { 32 } else { 232 };
|
|
for offset in [0, 16, 32] {
|
|
commands.push(#{op:"projectile", weapon:"iron_coast_mission_5:slag", x:origin + offset, y:24, vx:0, vy:5, hostile:true});
|
|
}
|
|
commands.push(#{op:"play_sound", sound:"iron_coast_mission_5:slag_release"});
|
|
commands.push(#{op:"objective", key:"iron_coast_mission_5:heat_lane", value:0});
|
|
}
|
|
}
|
|
if event.tick >= 1660 && !state.boss_alarm {
|
|
state.boss_alarm = true;
|
|
commands.push(#{op:"objective", key:"iron_coast_mission_5:phase", value:4});
|
|
commands.push(#{op:"play_sound", sound:"iron_coast_mission_5:launch_alarm"});
|
|
}
|
|
let foundries = if event.objectives.contains("iron_coast_mission_5:foundries_destroyed") {
|
|
event.objectives["iron_coast_mission_5:foundries_destroyed"]
|
|
} else { 0 };
|
|
let boss = if event.objectives.contains("iron_coast_boss_5:defeated") {
|
|
event.objectives["iron_coast_boss_5:defeated"]
|
|
} else { 0 };
|
|
if foundries >= 2 && boss >= 1 && !state.complete {
|
|
state.complete = true;
|
|
commands.push(#{op:"objective", key:"iron_coast_mission_5:phase", value:5});
|
|
commands.push(#{op:"objective", key:"iron_coast_mission_5:complete", value:1});
|
|
commands.push(#{op:"credits", amount:15000});
|
|
commands.push(#{op:"play_sound", sound:"iron_coast_mission_5:victory"});
|
|
commands.push(#{op:"complete"});
|
|
}
|
|
#{commands:commands, state:state}
|
|
}
|
|
|
|
fn on_mission_end(event, state, random) {
|
|
let value = if event.success { 1 } else { 0 };
|
|
#{commands:[#{op:"objective", key:"iron_coast_mission_5:debrief", value:value}], state:state}
|
|
}
|