94 lines
2.2 KiB
GDScript
94 lines
2.2 KiB
GDScript
class_name Unit
|
|
extends CharacterBody3D
|
|
|
|
@export var maximum_health := 100
|
|
@export var maximum_stamina := 100
|
|
@export var stamina_regeneration_rate := 2
|
|
@export var speed := 4.0
|
|
@export var acceleration := 4.0
|
|
@export var jump_speed := 8.0
|
|
@export var jump_cost := 20
|
|
@export var attack_cost := 10
|
|
@export var damage := 10
|
|
|
|
@onready var model := $Rig
|
|
@onready var anim_tree := $AnimationTree
|
|
@onready var anim_state = $AnimationTree.get("parameters/playback")
|
|
|
|
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
var last_floor := true
|
|
var stamina_timer: float
|
|
var stamina_timer_max := 0.1
|
|
var hits := ["Hit_A", "Hit_B"]
|
|
var deaths := ["Death_A", "Death_B"]
|
|
|
|
enum States {
|
|
idle,
|
|
walking,
|
|
running,
|
|
chasing,
|
|
jumping,
|
|
attacking,
|
|
blocking,
|
|
dead
|
|
}
|
|
|
|
var state = States.idle:
|
|
get:
|
|
return state
|
|
set(value):
|
|
state = value
|
|
state_changed.emit(value)
|
|
|
|
@export var unit_name: String:
|
|
get:
|
|
return unit_name
|
|
set(value):
|
|
unit_name = value
|
|
name_changed.emit(unit_name, str(state))
|
|
|
|
var health : int:
|
|
get:
|
|
return health
|
|
set(value):
|
|
health = clampi(value, 0, maximum_health)
|
|
health_changed.emit(health, maximum_health)
|
|
anim_state.travel(hits.pick_random())
|
|
if health <= 0: die()
|
|
|
|
var stamina : int:
|
|
get:
|
|
return stamina
|
|
set(value):
|
|
stamina = clampi(value, 0, maximum_stamina)
|
|
stamina_changed.emit(stamina, maximum_stamina)
|
|
|
|
signal name_changed(unit_name: String)
|
|
signal health_changed(current_health: int, maximum_health: int)
|
|
signal stamina_changed(current_stamina: int, maximum_stamina: int)
|
|
signal state_changed(new_state: States)
|
|
|
|
func _process(delta: float) -> void:
|
|
stamina_timer += delta
|
|
if stamina_timer > stamina_timer_max:
|
|
stamina += stamina_regeneration_rate
|
|
stamina_timer = 0
|
|
|
|
func take_damage(damage_amount: int) -> void:
|
|
print(unit_name + " gets " + str(damage_amount) + " damage. Life: " + str(health) + "/" + str(maximum_health))
|
|
health -= damage_amount
|
|
|
|
func enough_stamina_available(stamina_needed: int) -> bool:
|
|
return stamina_needed <= stamina
|
|
|
|
func use_stamina(stamina_needed: int) -> void:
|
|
stamina -= stamina_needed
|
|
|
|
func die() -> void:
|
|
print(unit_name + " died!")
|
|
state = States.dead
|
|
anim_state.travel(deaths.pick_random())
|
|
|
|
func remove_unit() -> void:
|
|
queue_free()
|