c340b7bc48
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.
24 lines
604 B
GDScript
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)
|