gae_wild_jam/scripts/tornado.gd

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()