37 lines
936 B
GDScript3
37 lines
936 B
GDScript3
|
extends Node3D
|
||
|
class_name StatusEffector
|
||
|
|
||
|
@export var hbox : HBoxContainer
|
||
|
|
||
|
var icon_scene = preload("res://Scenes/status_icon.tscn")
|
||
|
var effects : Array[StatusEffect]
|
||
|
var icons : Array[TextureRect]
|
||
|
|
||
|
|
||
|
func add_effect(new_effect : StatusEffect):
|
||
|
var icon_present = false
|
||
|
for effect in effects:
|
||
|
if effect.stats == new_effect.stats:
|
||
|
icon_present = true
|
||
|
new_effect.expired.connect(remove_effect)
|
||
|
effects.append(new_effect)
|
||
|
if !icon_present:
|
||
|
var icon = icon_scene.instantiate()
|
||
|
icon.texture = new_effect.stats.icon
|
||
|
icons.append(icon)
|
||
|
hbox.add_child(icon)
|
||
|
|
||
|
|
||
|
func remove_effect(expiring_effect : StatusEffect):
|
||
|
effects.erase(expiring_effect)
|
||
|
var has_remaining_stack = false
|
||
|
for effect in effects:
|
||
|
if effect.stats == expiring_effect.stats:
|
||
|
has_remaining_stack = true
|
||
|
if !has_remaining_stack:
|
||
|
for icon in icons:
|
||
|
if icon.texture == expiring_effect.stats.icon:
|
||
|
icons.erase(icon)
|
||
|
icon.queue_free()
|
||
|
break
|