2023-11-08 14:28:55 +11:00
|
|
|
extends Node3D
|
|
|
|
class_name StatusEffector
|
|
|
|
|
|
|
|
@export var hbox : HBoxContainer
|
2023-11-11 19:03:01 +11:00
|
|
|
@export var enemy : EnemyController
|
2023-11-08 14:28:55 +11:00
|
|
|
|
|
|
|
var icon_scene = preload("res://Scenes/status_icon.tscn")
|
2023-11-11 19:03:01 +11:00
|
|
|
var immune : Array[StatusEffect] = []
|
|
|
|
var effects = {}
|
|
|
|
var icons = {}
|
|
|
|
|
|
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
|
|
for effect in effects:
|
|
|
|
if effects[effect] == 0:
|
|
|
|
continue
|
|
|
|
effect.time_since_proc += delta
|
|
|
|
effect.time_existed += delta
|
|
|
|
if effect.stats.duration > 0.0 and effect.time_existed >= effect.stats.duration:
|
|
|
|
effect.time_existed -= effect.stats.duration
|
|
|
|
effects[effect] -= 1
|
|
|
|
effect.on_removed(enemy, effects)
|
|
|
|
if effects[effect] == 0:
|
|
|
|
icons[effect].set_visible(false)
|
|
|
|
if effect.time_since_proc >= effect.stats.proc_cd:
|
|
|
|
effect.proc(enemy, effects[effect], effects)
|
|
|
|
effect.time_since_proc -= effect.stats.proc_cd
|
|
|
|
|
|
|
|
|
|
|
|
func force_proc(effect_to_proc : StatusEffect):
|
|
|
|
for effect in effects:
|
|
|
|
if effect.stats == effect_to_proc.stats:
|
|
|
|
effect.proc(enemy, effects[effect], effects)
|
2023-11-08 14:28:55 +11:00
|
|
|
|
|
|
|
|
|
|
|
func add_effect(new_effect : StatusEffect):
|
2023-11-11 19:03:01 +11:00
|
|
|
for effect in immune:
|
|
|
|
if effect.stats == new_effect.stats:
|
|
|
|
return
|
|
|
|
|
|
|
|
var existing_effect
|
2023-11-08 14:28:55 +11:00
|
|
|
for effect in effects:
|
|
|
|
if effect.stats == new_effect.stats:
|
2023-11-11 19:03:01 +11:00
|
|
|
existing_effect = effect
|
|
|
|
if !existing_effect:
|
|
|
|
existing_effect = new_effect
|
|
|
|
effects[new_effect] = 0
|
2023-11-08 14:28:55 +11:00
|
|
|
var icon = icon_scene.instantiate()
|
|
|
|
icon.texture = new_effect.stats.icon
|
2023-11-11 19:03:01 +11:00
|
|
|
icon.set_visible(false)
|
|
|
|
icons[new_effect] = icon
|
2023-11-08 14:28:55 +11:00
|
|
|
hbox.add_child(icon)
|
2023-11-11 19:03:01 +11:00
|
|
|
|
|
|
|
if existing_effect.stats.max_stacks == 0 or effects[existing_effect] < existing_effect.stats.max_stacks:
|
|
|
|
existing_effect.on_attached(enemy, effects)
|
|
|
|
icons[existing_effect].set_visible(true)
|
|
|
|
effects[existing_effect] += 1
|
|
|
|
existing_effect.time_existed = 0.0
|
|
|
|
if existing_effect.stats.max_stacks != 0 and effects[existing_effect] > existing_effect.stats.max_stacks:
|
|
|
|
effects[existing_effect] = existing_effect.stats.max_stacks
|