diff --git a/scenes/managers/ui/debug_ui.gd b/scenes/managers/ui/debug_ui.gd index 82b5f6b..57c17ab 100644 --- a/scenes/managers/ui/debug_ui.gd +++ b/scenes/managers/ui/debug_ui.gd @@ -47,9 +47,9 @@ func update_debug_stats() -> void: for stat in debug_stats: # Create margin container var mc: MarginContainer = MarginContainer.new() - mc.add_theme_constant_override("margin_top", 10) + mc.add_theme_constant_override("margin_top", 2) mc.add_theme_constant_override("margin_left", 20) - mc.add_theme_constant_override("margin_bottom", 10) + mc.add_theme_constant_override("margin_bottom", 2) mc.add_theme_constant_override("margin_right", 20) stats_container_vbox.add_child(mc) diff --git a/scenes/managers/ui/player_ui.gd b/scenes/managers/ui/player_ui.gd index 8c7716f..88a66ae 100644 --- a/scenes/managers/ui/player_ui.gd +++ b/scenes/managers/ui/player_ui.gd @@ -4,9 +4,42 @@ extends Control @onready var hp_bar: ProgressBar = $CenterContainer/VBoxContainer/ProgressBar @onready var elapsed_label: Label = $CenterContainer/VBoxContainer/ElapsedLabel +const ANIM_SPEED = 4.0 +const TRESHOLD = 1 -func set_hp(value: float): - hp_bar.value = value +var wanted_hp_value: float +var wanted_hp_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 + + +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 _process(delta: float) -> void: + if wanted_hp_max != hp_bar.max_value: + print_debug("wanted: %f-%f" % [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: + print_debug("current: %f-%f" % [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 set_elapsed_time(value: float): diff --git a/scenes/player.gd b/scenes/player.gd index d6dfd48..ab216c0 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -15,7 +15,7 @@ var god_mode: bool = false func _ready() -> void: camera.position = global_position - main_ui.player_ui.set_hp(100) + main_ui.player_ui.update_hp() GlobalConst.sig_debug_god_mode.connect(toggle_god_mode) @@ -42,13 +42,16 @@ func take_damage(value: float) -> void: player_stats.current_health = clampf( player_stats.current_health, -1.0, player_stats.get_final("max_health", modifiers) ) + var current_hp = player_stats.get_final("current_health", modifiers) + var max_hp = player_stats.get_final("max_health", modifiers) + GlobalConst.sig_debug_stats_set.emit("current_health", "%f" % current_hp) + GlobalConst.sig_debug_stats_set.emit("max_hp", "%f" % max_hp) + var dm = preload("res://scenes/damage_numbers.tscn").instantiate() dm.damage_taken = value dm.player_damage = false add_child(dm) - main_ui.player_ui.set_hp( - (player_stats.current_health / player_stats.get_final("max_health", modifiers)) * 100 - ) + main_ui.player_ui.update_hp() if player_stats.current_health <= 0: die()