animates beam effects (#96339)

This commit is contained in:
Arturlang
2026-06-12 16:17:08 -04:00
committed by GitHub
parent 9f57ec6845
commit 0b6a8e8f7f
3 changed files with 261 additions and 67 deletions
+9 -20
View File
@@ -75,7 +75,9 @@
return FALSE
/// Used to refresh the beam in whatever context.
/obj/item/assembly/infra/proc/make_beam()
/// glide_seed/glide_time (from a predecessor beam's get_last_geometry) make the rebuilt beam glide
/// from the old position instead of snapping; left as defaults for non-movement refreshes.
/obj/item/assembly/infra/proc/make_beam(list/glide_seed = null, glide_time = 0)
SHOULD_NOT_SLEEP(TRUE)
if(!isnull(buffer_turf))
@@ -115,6 +117,8 @@
emissive = TRUE,
override_target_pixel_x = pixel_x,
override_target_pixel_y = pixel_y,
glide_seed = glide_seed,
glide_time = glide_time,
)
RegisterSignal(active_beam, COMSIG_BEAM_ENTERED, PROC_REF(beam_entered))
RegisterSignal(active_beam, COMSIG_BEAM_TURFS_CHANGED, PROC_REF(beam_turfs_changed))
@@ -244,30 +248,15 @@
make_beam()
/obj/item/assembly/infra/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
var/list/glide_seed = active_beam?.get_last_geometry()
. = ..()
if(loc == old_loc)
return
make_beam()
if(!visible || forced || !movement_dir || !Adjacent(old_loc))
make_beam()
return
// Because the new beam is made in the new loc, it "jumps" from one turf to another
// We can do an animate to pretend we're gliding between turfs rather than making a whole new beam
var/x_move = 0
var/y_move = 0
if(movement_dir & NORTH)
y_move = -ICON_SIZE_Y
else if(movement_dir & SOUTH)
y_move = ICON_SIZE_Y
if(movement_dir & WEST)
x_move = ICON_SIZE_X
else if(movement_dir & EAST)
x_move = -ICON_SIZE_X
var/fake_glide_time = round(ICON_SIZE_ALL / glide_size * world.tick_lag, world.tick_lag)
for(var/obj/effect/ebeam/beam as anything in active_beam?.elements)
var/matrix/base_transform = matrix(beam.transform)
beam.transform = beam.transform.Translate(x_move, y_move)
animate(beam, transform = base_transform, time = fake_glide_time)
var/glide_time = ICON_SIZE_ALL / max(glide_size, MIN_GLIDE_SIZE) * world.tick_lag * GLOB.glide_size_multiplier
make_beam(glide_seed, glide_time)
/obj/item/assembly/infra/setDir(newdir)
var/prev_dir = dir