71 lines
1.6 KiB
GDScript
71 lines
1.6 KiB
GDScript
extends KinematicBody2D
|
|
|
|
const DeathEffect = preload("res://Effects/EnemyDeathEffect.tscn")
|
|
|
|
var knockback = Vector2.ZERO
|
|
var velocity = Vector2.ZERO
|
|
|
|
onready var stats = $Stats
|
|
onready var player_detector = $PlayerDetectionZone
|
|
onready var sprite = $AnimatedSprite
|
|
onready var original_position = global_position
|
|
|
|
export(int) var acceleration = 300
|
|
export(int) var max_speed = 300
|
|
export(int) var friction = 200
|
|
|
|
enum {
|
|
IDLE,
|
|
MOVE,
|
|
CHASE,
|
|
MOVE_BACK
|
|
}
|
|
|
|
onready var state = IDLE
|
|
|
|
func _physics_process(delta):
|
|
knockback = knockback.move_toward(Vector2.ZERO, 200 * delta)
|
|
knockback = move_and_slide(knockback)
|
|
|
|
match state:
|
|
IDLE:
|
|
velocity = velocity.move_toward(Vector2.ZERO, friction)
|
|
seek_player()
|
|
|
|
MOVE_BACK:
|
|
# TODO: Navigation here
|
|
pass
|
|
|
|
MOVE:
|
|
pass
|
|
CHASE:
|
|
var player = player_detector.player
|
|
if player != null:
|
|
var direction = (player.global_position - global_position).normalized()
|
|
velocity = velocity.move_toward(direction * max_speed, acceleration * delta)
|
|
sprite.flip_h = velocity.x < 0
|
|
else:
|
|
state = IDLE
|
|
|
|
velocity = move_and_slide(velocity)
|
|
|
|
func around_the_original_position():
|
|
return abs(original_position.x - global_position.x) < 5 and abs(original_position.y - global_position.y) < 5
|
|
|
|
|
|
func seek_player():
|
|
if player_detector.is_player_detected():
|
|
state = CHASE
|
|
|
|
|
|
func _on_HurtBox_area_entered(area):
|
|
stats.health -= area.damage
|
|
knockback = area.knockback_vector * 120
|
|
|
|
|
|
func _on_Stats_no_health():
|
|
queue_free()
|
|
var effect = DeathEffect.instance()
|
|
get_parent().add_child(effect)
|
|
effect.global_position = global_position
|