Add scene-authored FX effect library and Fx autoload

Replace code-buried CPUParticles with inspector-editable effect scenes fired
through one Fx autoload: code names the effect (Fx.spawn(&"blood_burst", xform)),
the .tscn owns the look. Ships four placeholder effects (blood_burst, slam_dust,
spark, hit_flash) seeded from the old code params, a self-freeing one_shot_effect
root helper, a live preview gallery, and an FX style guide for Siim. CPUParticles
only (mobile GLES3 constraint). Existing call sites untouched -- migrated later.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 00:12:08 +03:00
parent 1ea7f7a744
commit 973db7d8b8
17 changed files with 623 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
extends Node3D
## Live preview stage for the FX library. Cycles through every registered effect on a loop against
## arena-ish lighting so Siim sees each one as it reads in-game. Open fx/effect_gallery.tscn and
## press Play, then edit any effect .tscn in the inspector and re-run to compare. See fx/README.md.
const _CYCLE_SEC := 1.6
const _EFFECTS: Array[StringName] = [&"blood_burst", &"slam_dust", &"spark", &"hit_flash"]
@onready var _label: Label = $UI/Label
# Reached by path rather than the Fx global so the placeholder-seeder can compile and attach this
# script headless (autoload globals aren't resolvable during an on-demand compile in a --script run).
@onready var _fx: Node = get_node("/root/Fx")
var _index := 0
func _ready() -> void:
var timer := Timer.new()
timer.wait_time = _CYCLE_SEC
timer.autostart = true
add_child(timer)
timer.timeout.connect(_fire_next)
_fire_next()
func _fire_next() -> void:
var effect := _EFFECTS[_index % _EFFECTS.size()]
_index += 1
_label.text = "%s (%d/%d)" % [effect, (_index - 1) % _EFFECTS.size() + 1, _EFFECTS.size()]
_fx.call("spawn", effect, global_transform.translated_local(Vector3(0.0, 0.25, 0.0)))