86 lines
2.5 KiB
GDScript
86 lines
2.5 KiB
GDScript
class_name PlayerUI
|
|
extends Control
|
|
|
|
@onready var hp_bar: ProgressBar = $CenterContainer/VBoxContainer/HPBar
|
|
@onready var xp_bar: ProgressBar = $CenterContainer/VBoxContainer/XPBar
|
|
|
|
@onready var elapsed_label: Label = $CenterContainer/VBoxContainer/ElapsedLabel
|
|
|
|
const ANIM_SPEED = 4.0
|
|
const TRESHOLD = 1
|
|
|
|
var wanted_hp_value: float
|
|
var wanted_hp_max: float
|
|
var wanted_xp_value: float
|
|
var wanted_xp_max: float
|
|
var player: Player
|
|
|
|
|
|
func _ready() -> void:
|
|
player = get_tree().get_first_node_in_group("player")
|
|
if player:
|
|
hp_bar.value = player.player_stats.current_health
|
|
hp_bar.max_value = player.player_stats.max_health
|
|
xp_bar.value = player.player_stats.current_xp
|
|
xp_bar.max_value = player.player_stats.xp_required_for_level()
|
|
await get_tree().create_timer(0.5).timeout
|
|
update_hp()
|
|
update_xp()
|
|
|
|
|
|
func update_hp():
|
|
if not player:
|
|
push_error("cant update hp, no player found")
|
|
var current_hp = player.player_stats.get_final("current_health", player.modifiers)
|
|
var max_hp = player.player_stats.get_final("max_health", player.modifiers)
|
|
wanted_hp_value = current_hp
|
|
wanted_hp_max = max_hp
|
|
|
|
|
|
func update_xp():
|
|
if not player:
|
|
push_error("cant update xp, no player found")
|
|
var current_xp = player.player_stats.get_final("current_xp", player.modifiers)
|
|
var max_xp = player.player_stats.xp_required_for_level()
|
|
wanted_xp_value = current_xp
|
|
wanted_xp_max = max_xp
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
update_hp_bar(delta)
|
|
update_xp_bar(delta)
|
|
|
|
|
|
func update_hp_bar(delta: float):
|
|
if wanted_hp_max != hp_bar.max_value:
|
|
hp_bar.max_value = lerpf(hp_bar.max_value, wanted_hp_max, ANIM_SPEED * delta)
|
|
if abs(hp_bar.max_value - wanted_hp_max) < TRESHOLD:
|
|
hp_bar.max_value = wanted_hp_max
|
|
if wanted_hp_value != hp_bar.value:
|
|
hp_bar.value = lerpf(hp_bar.value, wanted_hp_value, ANIM_SPEED * delta)
|
|
if abs(hp_bar.value - wanted_hp_value) < TRESHOLD:
|
|
hp_bar.value = wanted_hp_value
|
|
|
|
|
|
func update_xp_bar(delta: float):
|
|
if wanted_xp_max != xp_bar.max_value:
|
|
xp_bar.max_value = lerpf(xp_bar.max_value, wanted_xp_max, ANIM_SPEED * delta)
|
|
if abs(xp_bar.max_value - wanted_xp_max) < TRESHOLD:
|
|
xp_bar.max_value = wanted_xp_max
|
|
if wanted_xp_value != xp_bar.value:
|
|
xp_bar.value = lerpf(xp_bar.value, wanted_xp_value, ANIM_SPEED * delta)
|
|
if abs(xp_bar.value - wanted_xp_value) < TRESHOLD:
|
|
xp_bar.value = wanted_xp_value
|
|
|
|
|
|
func set_elapsed_time(value: float):
|
|
elapsed_label.text = format_time(value)
|
|
|
|
|
|
func format_time(seconds: float) -> String:
|
|
var total_ms = int(seconds * 1000.0)
|
|
var s = (total_ms / 1000) % 60
|
|
var m = total_ms / 60000
|
|
|
|
return "%02d:%02d" % [m, s]
|