58 lines
1.9 KiB
GDScript
58 lines
1.9 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
|
|
@onready var perk_effects = get_node("/root/Game/PerkEffects")
|
|
|
|
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 perk_effects.tornado_fruit_collect:
|
|
_collect_nearby_fruits()
|
|
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 _collect_nearby_fruits() -> void:
|
|
var drop_manager = get_node_or_null("/root/Game/DropManager")
|
|
if drop_manager == null:
|
|
return
|
|
for child in drop_manager.get_children():
|
|
if child is DropsBase and not child.is_spawning and not child.in_orbit:
|
|
if global_position.distance_to(child.global_position) < 120.0:
|
|
child.collect()
|
|
|
|
func _explode() -> void:
|
|
_is_pulling = false
|
|
var targets = get_overlapping_bodies().filter(func(b): return b.is_in_group("enemies") and not b.is_dying)
|
|
tornado_area.disabled = true
|
|
explosion_collision.disabled = false
|
|
if animated_sprite_2d.sprite_frames.has_animation("explosion"):
|
|
animated_sprite_2d.play("explosion")
|
|
for body in targets:
|
|
if is_instance_valid(body):
|
|
body.take_damage(explosion_damage)
|
|
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()
|