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:
@@ -0,0 +1,45 @@
|
||||
extends SceneTree
|
||||
## Smoke test for the FX library: every registered effect instantiates and attaches without error,
|
||||
## and an unknown name fails soft (returns null, no crash). Catches a broken effect .tscn before it
|
||||
## ships. Run: godot --headless --script tests/fx_gallery_test.gd
|
||||
|
||||
var _pass := 0
|
||||
var _fail := 0
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
_run.call_deferred()
|
||||
|
||||
|
||||
func _ok(cond: bool, msg: String) -> void:
|
||||
if cond:
|
||||
_pass += 1
|
||||
print(" PASS: ", msg)
|
||||
else:
|
||||
_fail += 1
|
||||
print(" FAIL: ", msg)
|
||||
|
||||
|
||||
func _run() -> void:
|
||||
var fx: Node = root.get_node("/root/Fx")
|
||||
var host := Node3D.new()
|
||||
root.add_child(host)
|
||||
current_scene = host
|
||||
|
||||
for id: StringName in [&"blood_burst", &"slam_dust", &"spark", &"hit_flash"]:
|
||||
var inst: Node = fx.call("spawn", id, Transform3D.IDENTITY, host)
|
||||
_ok(inst != null and is_instance_valid(inst), "spawns %s" % id)
|
||||
|
||||
var missing: Node = fx.call("spawn", &"does_not_exist", Transform3D.IDENTITY, host)
|
||||
_ok(missing == null, "unknown effect returns null instead of crashing")
|
||||
|
||||
# The preview gallery scene is wired (has its controller script + label).
|
||||
var gallery: Node = load("res://fx/effect_gallery.tscn").instantiate()
|
||||
_ok(gallery.get_script() != null, "gallery scene keeps its controller script")
|
||||
host.add_child(gallery)
|
||||
await process_frame
|
||||
_ok(gallery.get_node_or_null("UI/Label") != null, "gallery scene has its name label")
|
||||
|
||||
await process_frame
|
||||
print("Results: %d passed, %d failed" % [_pass, _fail])
|
||||
quit(1 if _fail > 0 else 0)
|
||||
Reference in New Issue
Block a user