75 lines
3.6 KiB
Plaintext
75 lines
3.6 KiB
Plaintext
// Stormwall uses the shared Iron Coast units and pins every objective battery
|
|
// on the battlefield until it is destroyed. Nothing completes on a time limit.
|
|
fn on_mission_start(event, state, random) {
|
|
let commands = [
|
|
#{op:"objective",key:"iron_coast_mission_4:phase",value:1},
|
|
#{op:"objective",key:"iron_coast_mission_4:turrets_required",value:4},
|
|
#{op:"objective",key:"iron_coast_mission_4:complete",value:0},
|
|
#{op:"objective",key:"iron_coast_turret:defeated",value:0},
|
|
#{op:"objective",key:"iron_coast_boss_4:defeated",value:0},
|
|
#{op:"play_sound",sound:"iron_coast_mission_4:approach"}
|
|
];
|
|
// A full inventory starts safely. Existing equipment is never replaced.
|
|
let slots = event.player.inventory.len() + event.player.super_shield_reserves.len();
|
|
let loaned = false;
|
|
let available = event.player.inventory.contains("pulse_cannon:equipment")
|
|
&& event.player.inventory["pulse_cannon:equipment"] > 0;
|
|
if !available && slots < 20 {
|
|
loaned = true;
|
|
available = true;
|
|
commands.push(#{op:"give_item",item:"pulse_cannon:equipment",count:1});
|
|
}
|
|
let issued = if available {1} else {0};
|
|
commands.push(#{op:"objective",key:"iron_coast_mission_4:trial_issued",value:issued});
|
|
#{commands:commands,state:#{loaned:loaned,second_battery:false,cruiser_alarm:false,complete:false}}
|
|
}
|
|
|
|
fn on_tick(event, state, random) {
|
|
let commands = [];
|
|
// The ground-unit engine scrolls one pixel each step; clamp in the mission
|
|
// callback to keep mandatory survivors reachable after the coast passes.
|
|
for unit in event.entities {
|
|
if unit.definition == "iron_coast_turret:unit" && unit.health > 0 && unit.y >= 72 {
|
|
commands.push(#{op:"move",entity:unit.entity,x:unit.x,y:72});
|
|
commands.push(#{op:"velocity",entity:unit.entity,vx:0,vy:0});
|
|
}
|
|
}
|
|
if event.tick >= 600 && !state.second_battery {
|
|
state.second_battery = true;
|
|
commands.push(#{op:"objective",key:"iron_coast_mission_4:phase",value:2});
|
|
commands.push(#{op:"play_sound",sound:"iron_coast_mission_4:battery_alarm"});
|
|
}
|
|
if event.tick >= 1150 && !state.cruiser_alarm {
|
|
state.cruiser_alarm = true;
|
|
commands.push(#{op:"objective",key:"iron_coast_mission_4:phase",value:3});
|
|
commands.push(#{op:"play_sound",sound:"iron_coast_mission_4:cruiser_alarm"});
|
|
}
|
|
let turrets = if event.objectives.contains("iron_coast_turret:defeated") {
|
|
event.objectives["iron_coast_turret:defeated"]
|
|
} else {0};
|
|
let cruisers = if event.objectives.contains("iron_coast_boss_4:defeated") {
|
|
event.objectives["iron_coast_boss_4:defeated"]
|
|
} else {0};
|
|
if turrets >= 4 && cruisers >= 1 && !state.complete {
|
|
state.complete = true;
|
|
commands.push(#{op:"objective",key:"iron_coast_mission_4:phase",value:4});
|
|
commands.push(#{op:"objective",key:"iron_coast_mission_4:complete",value:1});
|
|
commands.push(#{op:"credits",amount:12000});
|
|
commands.push(#{op:"play_sound",sound:"iron_coast_mission_4:victory"});
|
|
commands.push(#{op:"complete"});
|
|
}
|
|
#{commands:commands,state:state}
|
|
}
|
|
|
|
fn on_mission_end(event, state, random) {
|
|
let success = if event.success {1} else {0};
|
|
let commands = [#{op:"objective",key:"iron_coast_mission_4:debrief",value:success}];
|
|
if state.contains("loaned") && state.loaned
|
|
&& event.player.inventory.contains("pulse_cannon:equipment")
|
|
&& event.player.inventory["pulse_cannon:equipment"] > 0 {
|
|
commands.push(#{op:"consume_item",item:"pulse_cannon:equipment",count:1});
|
|
}
|
|
state.loaned = false;
|
|
#{commands:commands,state:state}
|
|
}
|