Files

49 lines
2.1 KiB
Plaintext

// Damage is collision-triggered. Empty space, aircraft and inactive equipment
// never start a blast. Native targeting handles the primary ground collision.
fn on_fire(event, state, random) {
if event.hostile { return #{commands: [], state: state}; }
let shots = if state.contains("shots") { state.shots % 100000 + 1 } else { 1 };
let hits = if state.contains("hits") { state.hits } else { 0 };
#{commands: [#{op: "play_sound", sound: "iron_coast_depth_charge:fire"}],
state: #{shots: shots, hits: hits}}
}
fn on_hit(event, state, random) {
let shots = if state.contains("shots") { state.shots } else { 0 };
let hits = if state.contains("hits") { state.hits % 100000 + 1 } else { 1 };
let center_x = event.x;
let center_y = event.y;
for enemy in event.entities {
if enemy.entity == event.entity {
center_x = enemy.x + enemy.width / 2;
center_y = enemy.y + enemy.height / 2;
}
}
let commands = [#{op: "play_sound", sound: "iron_coast_depth_charge:impact"},
#{op: "effect", kind: "small_air", x: center_x, y: center_y}];
let struck = [event.entity];
for neighbor in 0..3 {
let chosen = #{};
let nearest = 1000000;
for enemy in event.entities {
let cx = enemy.x + enemy.width / 2;
let cy = enemy.y + enemy.height / 2;
if !enemy.ground || enemy.health <= 0 || struck.contains(enemy.entity)
|| cx < 0 || cx >= 320 || cy < 0 || cy >= 200 { continue; }
let dx = cx - center_x;
let dy = cy - center_y;
let distance = dx * dx + dy * dy;
if distance <= 36 * 36 && distance < nearest {
chosen = #{entity: enemy.entity};
nearest = distance;
}
}
if !chosen.contains("entity") { break; }
let damage = if nearest <= 16 * 16 { 36 } else { 20 };
commands.push(#{op: "damage", entity: chosen.entity, amount: damage});
struck.push(chosen.entity);
hits = hits % 100000 + 1;
}
#{commands: commands, state: #{shots: shots, hits: hits}}
}