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