Files

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}
}