48 lines
1.5 KiB
GDScript
48 lines
1.5 KiB
GDScript
extends Area2D
|
|
|
|
@export var pull_duration: float = 1.2
|
|
@export var pull_strength: float = 140.0
|
|
@export var explosion_damage: int = 50
|
|
|
|
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
|
|
@onready var tornado_area: CollisionShape2D = $TornadoArea
|
|
@onready var explosion_collision: CollisionShape2D = $ExplosionCollision
|
|
|
|
var _is_pulling := true
|
|
var _damaged_enemies: Array[Node] = []
|
|
|
|
func _ready() -> void:
|
|
tornado_area.disabled = false
|
|
explosion_collision.disabled = true
|
|
if animated_sprite_2d.sprite_frames.has_animation("default"):
|
|
animated_sprite_2d.play("default")
|
|
await get_tree().create_timer(pull_duration).timeout
|
|
_explode()
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if not _is_pulling:
|
|
return
|
|
for enemy in get_overlapping_bodies():
|
|
if not enemy.is_in_group("enemies"):
|
|
continue
|
|
if enemy.is_dying:
|
|
continue
|
|
enemy.global_position = enemy.global_position.move_toward(global_position, pull_strength * delta)
|
|
|
|
func _explode() -> void:
|
|
_is_pulling = false
|
|
tornado_area.disabled = true
|
|
explosion_collision.disabled = false
|
|
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
|
|
animated_sprite_2d.play("explosion")
|
|
await get_tree().physics_frame
|
|
for body in get_overlapping_bodies():
|
|
if body.is_in_group("enemies") and not _damaged_enemies.has(body):
|
|
body.take_damage(explosion_damage)
|
|
_damaged_enemies.append(body)
|
|
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
|
|
await animated_sprite_2d.animation_finished
|
|
else:
|
|
await get_tree().create_timer(0.35).timeout
|
|
queue_free()
|