Files
urm03/scripts/fx_ring.gd
T
vh c340b7bc48 feat: card layer — 2-slot hand, build-generated charges, card-time freeze/dilate
Hand (CanvasLayer, PROCESS_MODE_ALWAYS): Space toggles the hand, Q/E
play slot 1/2, charges accrue from auto-fire hits (4 hits/charge, cap
5). KINETIC card: radial shockwave shove + light damage. HEAT card:
paints heat status in a radius; heat accumulates, glows, detonates at
threshold (damage only, no knockback — tag purity). Freeze/dilate is
an exposed knob: [ and ] step dilation 0.0-0.3 live.

Freeze uses SceneTree.paused, not Engine.time_scale = 0: probed on
4.7 headless — time_scale 0 still steps physics with delta 0, so
delta-independent logic (heat thresholds, contact callbacks) kept
firing while nominally frozen. Dilation > 0 uses time_scale slow-mo.
Hand._exit_tree restores pause + time_scale so hull-zero reloads can
never strand a frozen world.

Smoke gate extended: charge accrual from build hits, pause-on-open at
knob 0, HEAT x2 spend + threshold, detonation on release. 3/3 green
on nh3-dev headless 4.7.1.
2026-08-06 22:42:46 -07:00

24 lines
604 B
GDScript

extends Node2D
## One-shot expanding ring, greybox stand-in for any radial event
## (card blasts, heat detonations). Runs on scaled time, so a ring
## spawned during freeze blooms on release — which is the rhythm.
var max_radius := 56.0
var color := Color(1.0, 0.6, 0.2)
var duration := 0.18
var _t := 0.0
func _process(delta: float) -> void:
_t += delta
queue_redraw()
if _t >= duration:
queue_free()
func _draw() -> void:
var k := clampf(_t / duration, 0.0, 1.0)
var c := Color(color.r, color.g, color.b, 1.0 - k)
draw_arc(Vector2.ZERO, maxf(max_radius * k, 1.0), 0.0, TAU, 48, c, 3.0)