104 lines
2.7 KiB
GDScript
104 lines
2.7 KiB
GDScript
extends CharacterBody2D
|
|
|
|
const EnemyDeathEffect = preload("res://Effects/EnemyDeathEffect.tscn")
|
|
|
|
@export var ACCELERATION = 300
|
|
@export var MAX_SPEED = 50
|
|
@export var FRICTION = 200
|
|
@export var WANDER_TARGET_RANGE = 4
|
|
|
|
enum {
|
|
IDLE,
|
|
WANDER,
|
|
CHASE
|
|
}
|
|
|
|
var knockback = Vector2.ZERO
|
|
#var velocity = Vector2.ZERO
|
|
|
|
var state = IDLE
|
|
|
|
@onready var sprite = get_node("AnimatedSprite2D")
|
|
@onready var stats = get_node("Stats")
|
|
@onready var playerDetectionZone = get_node("PlayerDetectionZone")
|
|
@onready var hurtbox = get_node("Hurtbox")
|
|
@onready var softCollision = get_node("SoftCollision")
|
|
@onready var wanderController = get_node("WanderController")
|
|
@onready var animationPlayer = get_node("AnimationPlayer")
|
|
|
|
func _ready():
|
|
state = pick_new_state([IDLE,WANDER])
|
|
|
|
func _physics_process(delta):
|
|
knockback = knockback.move_toward(Vector2.ZERO, 200 * delta)
|
|
set_velocity(knockback)
|
|
move_and_slide()
|
|
knockback = velocity
|
|
|
|
match state:
|
|
IDLE:
|
|
velocity = velocity.move_toward(Vector2.ZERO, FRICTION * delta)
|
|
seek_player()
|
|
if wanderController.get_time_left() == 0:
|
|
update_wander()
|
|
|
|
WANDER:
|
|
seek_player()
|
|
if wanderController.get_time_left() == 0:
|
|
update_wander()
|
|
accelerate_towards_point(wanderController.target_position,delta)
|
|
if global_position.distance_to(wanderController.target_position) <= WANDER_TARGET_RANGE:
|
|
update_wander()
|
|
|
|
CHASE:
|
|
var player = playerDetectionZone.player
|
|
if player != null:
|
|
accelerate_towards_point(player.global_position,delta)
|
|
else:
|
|
state = IDLE
|
|
sprite.flip_h = velocity.x < 0
|
|
|
|
if softCollision.is_colliding():
|
|
velocity += softCollision.get_push_vector() * delta * 400
|
|
set_velocity(velocity)
|
|
move_and_slide()
|
|
velocity = velocity
|
|
|
|
func accelerate_towards_point(point,delta):
|
|
var direction = global_position.direction_to(point)
|
|
sprite.flip_h = velocity.x < 0
|
|
velocity = velocity.move_toward(direction * MAX_SPEED, ACCELERATION * delta)
|
|
|
|
func update_wander():
|
|
state = pick_new_state([IDLE, WANDER])
|
|
wanderController.start_wander_timer(randf_range(1,3))
|
|
|
|
func seek_player():
|
|
if playerDetectionZone.can_see_player():
|
|
state = CHASE
|
|
|
|
func pick_new_state(state_list):
|
|
#return state_list.pick_random()
|
|
state_list.shuffle()
|
|
return state_list.pop_front()
|
|
|
|
func _on_Hurtbox_area_entered(area):
|
|
stats.health -= area.damage
|
|
knockback = area.knockback_vector * 120
|
|
hurtbox.create_hit_effect()
|
|
hurtbox.start_invincibility(0.4)
|
|
#queue_free() # Replace with function body.
|
|
|
|
func _on_Stats_no_health():
|
|
queue_free()
|
|
var enemyDeathEffect = EnemyDeathEffect.instantiate()
|
|
get_parent().add_child(enemyDeathEffect)
|
|
enemyDeathEffect.global_position = global_position
|
|
|
|
|
|
func _on_Hurtbox_invincibility_started():
|
|
animationPlayer.play("Start")
|
|
|
|
func _on_Hurtbox_invincibility_ended():
|
|
animationPlayer.play("Stop")
|