63 lines
No EOL
1.5 KiB
GDScript
63 lines
No EOL
1.5 KiB
GDScript
class_name Ability extends Node2D
|
|
|
|
@export var cooldown: float = 5.0
|
|
@export var effect_duration: float = 3.0
|
|
|
|
var modifiers: Array = []
|
|
var can_activate: bool = true
|
|
var cooldown_timer: Timer
|
|
var effect_timer: Timer
|
|
var is_active: bool = false
|
|
|
|
func _ready():
|
|
cooldown_timer = Timer.new()
|
|
add_child(cooldown_timer)
|
|
cooldown_timer.one_shot = true
|
|
cooldown_timer.connect("timeout", _on_cooldown_timeout)
|
|
|
|
effect_timer = Timer.new()
|
|
add_child(effect_timer)
|
|
effect_timer.one_shot = true
|
|
effect_timer.connect("timeout", _on_effect_timeout)
|
|
|
|
func activate():
|
|
if !can_activate:
|
|
return
|
|
|
|
# Apply ability effects
|
|
_start_ability()
|
|
|
|
# Apply modifiers to the ability
|
|
for modifier in modifiers:
|
|
modifier.modify_ability(self)
|
|
|
|
is_active = true
|
|
can_activate = false
|
|
effect_timer.start(effect_duration)
|
|
|
|
func add_modifier(modifier: Modifier):
|
|
modifiers.append(modifier)
|
|
modifier.on_equip(self)
|
|
|
|
func remove_modifier(modifier_id: String):
|
|
for i in range(modifiers.size()):
|
|
if modifiers[i].id == modifier_id:
|
|
modifiers[i].on_unequip(self)
|
|
modifiers.remove_at(i)
|
|
break
|
|
|
|
# Override in child classes
|
|
func _start_ability():
|
|
pass
|
|
|
|
# Override in child classes
|
|
func _end_ability():
|
|
pass
|
|
|
|
func _on_effect_timeout():
|
|
is_active = false
|
|
_end_ability()
|
|
cooldown_timer.start(cooldown)
|
|
|
|
func _on_cooldown_timeout():
|
|
can_activate = true |