SchildDerStaerke/scripts/unit.gd

68 lines
1.9 KiB
GDScript

extends CharacterBody3D
class_name Unit
@export var unit_name: String
@export var maximum_health := 100
@export var health := maximum_health
@export var maximum_stamina := 100
@export var stamina := 0
@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 := 30
@export var stamina_regeneration_rate := 2
@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 jumping := false
var last_floor := true
var dead := false
var stamina_timer: float
var stamina_timer_max := 0.1
var hits := ["Hit_A", "Hit_B"]
var deaths := ["Death_A", "Death_B"]
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 died
func _ready() -> void:
name_changed.emit(unit_name)
health_changed.emit(health, maximum_health)
stamina_changed.emit(stamina, maximum_stamina)
func _process(delta: float) -> void:
stamina_timer += delta
if stamina_timer > stamina_timer_max:
stamina += stamina_regeneration_rate
clampi(stamina, 0, maximum_stamina)
stamina_changed.emit(stamina, maximum_stamina)
stamina_timer = 0
func take_damage(damage_amount: int) -> void:
health -= damage_amount
clampi(health, 0, maximum_health)
health_changed.emit(health, maximum_health)
anim_state.travel(hits.pick_random())
if health <= 0: die()
func enough_stamina_available(stamina_needed: int) -> bool:
return stamina_needed <= stamina
func use_stamina(stamina_needed: int) -> void:
stamina -= stamina_needed
clampi(stamina, 0, maximum_stamina)
stamina_changed.emit(stamina, maximum_stamina)
func die() -> void:
print(unit_name + " died!")
dead = true
anim_state.travel(deaths.pick_random())
died.emit()