extends Area2D signal spell_cast(pos, radius) @export var duration: float = 0.5 @export var cooldown: float = 2.0 @export var damage: int = 20 @export_color_no_alpha var spell_color: Color = Color(1, 1, 0, 0.5) var can_cast: bool = true var radius: float = 0.0 @onready var explosion_effect: AnimatedSprite2D = $ExplosionEffect @onready var spell_visual: ColorRect = $SpellVisual func _ready(): setup_visual() hide() # Hide the spell initially explosion_effect.visible = false func setup_visual(): await get_tree().process_frame var collision_shape = get_node("CollisionShape2D") if collision_shape and collision_shape.shape is CircleShape2D: radius = collision_shape.shape.radius spell_visual.size = Vector2(radius * 2, radius * 2) spell_visual.position = -spell_visual.size / 2 spell_visual.color = spell_color update_effect_size() func cast_spell(): if not can_cast: return can_cast = false show() # Trigger the explosion effect explosion_effect.visible = true explosion_effect.play() var overlapping_bodies = get_overlapping_bodies() for body in overlapping_bodies: if body.is_in_group("enemies") and body.has_method("take_damage"): body.take_damage(damage) emit_signal("spell_cast", global_position, radius) await get_tree().create_timer(duration).timeout hide() explosion_effect.stop() explosion_effect.visible = false await get_tree().create_timer(cooldown - duration).timeout can_cast = true func update_effect_size(): var base_texture = explosion_effect.sprite_frames.get_frame_texture("default", 0) if base_texture: var scale_factor = (radius * 2) / base_texture.get_width() explosion_effect.scale = Vector2(scale_factor, scale_factor) func set_radius(new_radius: float): var collision_shape = get_node("CollisionShape2D") if collision_shape and collision_shape.shape is CircleShape2D: collision_shape.shape.radius = new_radius radius = new_radius spell_visual.size = Vector2(radius * 2, radius * 2) spell_visual.position = -spell_visual.size / 2 update_effect_size() func get_radius(): return radius