Add scripted lightning weapon mods with interpolated anchored effects

This commit is contained in:
raptorreplica committed 2026-10-11 16:45:22 +11:00
1 parent 98465133aa
commit c0a6fd3431
50 files changed
+3500 -65

No files matched your search

@@ -0,0 +1,6 @@
// Pickups use the same reusable equipment as the shop.
fn on_pickup(event, state, random) {
let recovered = if state.contains("recovered") { state.recovered % 100000 + 1 } else { 1 };
#{ commands: [#{ op: "objective", key: "lightning_cannon:recovered", value: recovered }],
state: #{ recovered: recovered } }
}
+56
View File
@@ -0,0 +1,56 @@
// The scripted discharge uses only public snapshots and checked API commands.
// A narrow forward acquisition lane preserves aiming; later hops may go sideways.
fn on_fire(event, state, random) {
if event.hostile {
return #{ commands: [], state: state };
}
let bursts = if state.contains("bursts") { state.bursts % 100000 + 1 } else { 1 };
let hits = if state.contains("hits") { state.hits } else { 0 };
let commands = [#{ op: "play_sound", sound: "lightning_cannon:fire" }];
let struck = [];
let from_x = event.x;
let from_y = event.y;
let damages = [32, 20, 12, 8];
for hop in 0..4 {
let selected = #{};
let nearest = 1000000;
for enemy in event.entities {
let cx = enemy.x + enemy.width / 2;
let cy = enemy.y + enemy.height / 2;
if enemy.health <= 0 || struck.contains(enemy.entity)
|| cx < 0 || cx >= 320 || cy < 0 || cy >= 200 {
continue;
}
let dx = cx - from_x;
let dy = cy - from_y;
let distance = dx * dx + dy * dy;
let reachable = if hop == 0 {
abs(dx) <= 36 && dy < 0 && distance <= 180 * 180
} else {
distance <= 48 * 48
};
// Entity order provides a stable tie break for equally near targets.
if reachable && distance < nearest {
selected = #{ entity: enemy.entity, x: cx, y: cy };
nearest = distance;
}
}
if !selected.contains("entity") { break; }
commands.push(#{ op: "arc", x: from_x, y: from_y,
to_x: selected.x, to_y: selected.y, ticks: 4 });
commands.push(#{ op: "damage", entity: selected.entity, amount: damages[hop] });
struck.push(selected.entity);
from_x = selected.x;
from_y = selected.y;
hits = hits % 100000 + 1;
}
if struck.len() > 0 {
commands.push(#{ op: "play_sound", sound: "lightning_cannon:impact" });
} else {
// A missed shot remains visible without spawning a damaging carrier.
commands.push(#{ op: "arc", x: event.x, y: event.y,
to_x: event.x, to_y: event.y - 180, ticks: 3 });
}
#{ commands: commands, state: #{ bursts: bursts, hits: hits } }
}