63 lines
1.9 KiB
GDScript
63 lines
1.9 KiB
GDScript
class_name Enemy
|
|
extends Unit
|
|
|
|
@export var player : Player
|
|
@export var chasing_range := 30.0
|
|
@export var attack_range := 3.0
|
|
|
|
var attacks := ["Unarmed_Melee_Attack_Punch_A", "Unarmed_Melee_Attack_Punch_B", "Unarmed_Melee_Attack_Kick"]
|
|
|
|
@onready var nav_agent: NavigationAgent3D = $NavigationAgent3D
|
|
|
|
func _ready() -> void:
|
|
health = maximum_health
|
|
stamina = maximum_stamina
|
|
state_changed.connect(_on_state_changed)
|
|
|
|
func _physics_process(_delta: float) -> void:
|
|
if state == States.dead: return
|
|
if player == null: return
|
|
if player.state == States.dead:
|
|
state = States.idle
|
|
return
|
|
|
|
var distance = global_position.distance_to(player.global_position)
|
|
if distance > chasing_range:
|
|
state = States.idle
|
|
elif distance <= chasing_range and distance >= attack_range:
|
|
state = States.chasing
|
|
if distance <= attack_range:
|
|
state = States.attacking
|
|
|
|
func _on_state_changed(new_state: States) -> void:
|
|
name_changed.emit(unit_name, States.keys()[new_state])
|
|
match new_state:
|
|
States.idle:
|
|
#TODO: Random movement
|
|
_on_velocity_computed(Vector3.ZERO)
|
|
|
|
States.chasing:
|
|
nav_agent.set_target_position(player.position)
|
|
if nav_agent.is_navigation_finished() or nav_agent.is_target_reached(): return
|
|
var next_path_position: Vector3 = nav_agent.get_next_path_position()
|
|
model.look_at(next_path_position)
|
|
var new_velocity: Vector3 = global_position.direction_to(next_path_position) * speed
|
|
_on_velocity_computed(new_velocity)
|
|
States.attacking:
|
|
if enough_stamina_available(attack_cost):
|
|
use_stamina(attack_cost)
|
|
anim_state.travel(attacks.pick_random())
|
|
States.dead:
|
|
player.gold += 1
|
|
#TODO: Slightly disapear
|
|
|
|
|
|
func _on_velocity_computed(safe_velocity: Vector3) -> void:
|
|
velocity = safe_velocity
|
|
var vy = velocity.y
|
|
velocity.y = 0
|
|
var vl = velocity * model.transform.basis
|
|
anim_tree.set("parameters/IWR/blend_position", Vector2(vl.x, -vl.z) / speed)
|
|
velocity.y = vy
|
|
move_and_slide()
|