1976149ce5
Chemistry row *Spread* (canon CONCEPT.md § tag grammar): a heated enemy slammed into another (knockback impact >= threshold, not a walking bump) spreads its heat on contact and passes momentum, so chains cascade with decaying force — chemistry feeding chemistry. Authorship-loud feedback stack per canon: ~80ms hitstop (owned by the hand, capped so chain procs can't lock the world; rides on top of freeze/thaw states), the two tag hues meeting at the point of impact (oriented fx, no proc text), and a per-pair audio sting (procedural placeholder, _ph-marked per asset policy). Burster: second enemy type, HEAT-tagged walking bomb (orange base, literal tag mirror) — self-heats ~0.5/s toward threshold, big detonation. Every 4th spawn. Detonations are now symmetric: they damage enemies AND the mech in radius (one grammar on both sides; heat play prices standing close). Grunt scene exports drive both enemy types — no subclass. Smoke gate extended: burster self-heat observed (retry-tolerant), deterministic staged chemistry proc (heated striker slammed into cold neighbor outside weapon range -> proc counter, heat spread). 3/3 green on nh3-dev headless 4.7.1. Known cosmetic: 2 ObjectDB instances reported leaked at exit (constant, exit-order artifact — audio stream alive at quit), not a runtime leak.
30 lines
934 B
GDScript
30 lines
934 B
GDScript
extends Node2D
|
|
## KINETIC+HEAT chemistry proc marker: the two tag hues visibly meet
|
|
## at the point of impact (canon feedback stack — the light and the
|
|
## sting are the noun; no proc text, ever). Oriented along the impact
|
|
## axis: KINETIC steel-blue sweeps in from the striker side, HEAT
|
|
## orange flares out the struck side, white core where they touch.
|
|
|
|
var axis := Vector2.RIGHT
|
|
var duration := 0.28
|
|
var max_r := 26.0
|
|
|
|
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 a := 1.0 - k
|
|
var r := lerpf(6.0, max_r, k)
|
|
var ang := axis.angle()
|
|
draw_arc(Vector2.ZERO, r, ang + PI - 1.2, ang + PI + 1.2, 20, Color(0.75, 0.85, 0.95, a), 3.0)
|
|
draw_arc(Vector2.ZERO, r * 0.8, ang - 1.2, ang + 1.2, 20, Color(0.95, 0.55, 0.2, a), 3.0)
|
|
draw_circle(Vector2.ZERO, lerpf(5.0, 1.0, k), Color(1, 1, 1, a))
|