class_name EffectComponent extends Node ## The node this component applies effects to. ## If left null, defaults to the first parent CanvasItem. @export var target_node: Node = null var active_effects: Array[BaseEffect] = [] func _ready() -> void: if target_node == null: # Auto-resolve to the parent if nothing is set target_node = get_parent() func _process(delta: float) -> void: if target_node == null: return # Process all active effects backwards so we can safely remove finished ones for i in range(active_effects.size() - 1, -1, -1): var effect = active_effects[i] effect.process(delta, target_node) if effect.is_finished(): remove_effect(effect) func apply_effect(effect: BaseEffect) -> void: var instance = effect.duplicate() instance.start(target_node) active_effects.append(instance) func remove_effect(effect: BaseEffect) -> void: effect.stop(target_node) active_effects.erase(effect)