SchildDerStaerke/scripts/unit.gd

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()