66 lines
1.5 KiB
GDScript
66 lines
1.5 KiB
GDScript
extends Node2D
|
|
|
|
@export var speed = 300;
|
|
@export var spawn_points : Node2D
|
|
@export var spawn_scene : PackedScene
|
|
@export var anim_player : AnimationPlayer
|
|
@export var movable : Node2D
|
|
|
|
var target_pos := Vector2(0, 0)
|
|
|
|
enum s { Follow, Smash, Spawn, Laser}
|
|
var state = s.Follow
|
|
|
|
var max_follow_time = 2;
|
|
var following = max_follow_time;
|
|
|
|
var timer = 0;
|
|
|
|
func _ready() -> void:
|
|
target_pos = position
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
match(state):
|
|
s.Follow:
|
|
follow(delta)
|
|
s.Smash:
|
|
pass
|
|
|
|
func spawn_minions(times : int):
|
|
var points : Array[Node]= spawn_points.get_children()
|
|
points.shuffle()
|
|
for i in range(times):
|
|
var p = points[i].global_position
|
|
await create_tween().tween_property(movable, "global_position", p, 1).finished
|
|
anim_player.play("grab")
|
|
await anim_player.animation_finished
|
|
state = s.Follow
|
|
|
|
func spawn_enemies():
|
|
for j in range(3):
|
|
var enemy = spawn_scene.instantiate()
|
|
enemy.global_position = movable.global_position
|
|
add_child(enemy)
|
|
await get_tree().create_timer(0.1).timeout
|
|
|
|
func smash():
|
|
anim_player.play("smash")
|
|
await anim_player.animation_finished
|
|
if randf() < 0.7:
|
|
state = s.Follow
|
|
else:
|
|
state = s.Spawn
|
|
spawn_minions(3)
|
|
|
|
func follow(delta : float):
|
|
var player : Player = get_tree().get_first_node_in_group("player")
|
|
if not player: return
|
|
move_to(player.global_position, delta)
|
|
following -= delta
|
|
if following < 0:
|
|
state = s.Smash
|
|
smash()
|
|
following = max_follow_time;
|
|
|
|
func move_to(pos : Vector2, delta : float):
|
|
movable.global_position = movable.global_position.move_toward(pos, delta * speed)
|