bgen/demo/scripts/arcade/hud.gd
saarsena@gmail.com e45f121fb9 init
2026-04-16 21:04:50 -04:00

57 lines
1.9 KiB
GDScript

extends CanvasLayer
# HP bar, depth label, enemy count, death / win overlay.
@onready var hp_bar: ColorRect = $HPBar/Fill
@onready var hp_label: Label = $HPBar/Label
@onready var depth_label: Label = $InfoLabel
@onready var overlay: Control = $EndOverlay
@onready var overlay_title: Label = $EndOverlay/Title
@onready var overlay_hint: Label = $EndOverlay/Hint
const HP_COLOR_HIGH := Color(0.32, 0.82, 0.36)
const HP_COLOR_LOW := Color(0.88, 0.28, 0.22)
const HP_BAR_MAX_WIDTH := 200.0
var _game_over := false
var _scene_ref: Node = null
func _ready() -> void:
overlay.hide()
_scene_ref = get_parent()
_scene_ref.depth_changed.connect(_on_depth)
_scene_ref.enemies_changed.connect(_on_enemies)
_scene_ref.game_over.connect(_on_game_over)
# Player is a sibling; @onready on parent isn't set yet when we fire.
var p: Node = get_node("../Player")
p.hp_changed.connect(_on_hp)
func _unhandled_input(event: InputEvent) -> void:
if _game_over and event is InputEventKey and event.pressed and event.keycode == KEY_R:
_game_over = false
overlay.hide()
_scene_ref.restart_from_start()
func _on_hp(current: int, maximum: int) -> void:
var frac := 0.0 if maximum <= 0 else float(current) / float(maximum)
hp_bar.size.x = HP_BAR_MAX_WIDTH * frac
hp_bar.color = HP_COLOR_LOW.lerp(HP_COLOR_HIGH, frac)
hp_label.text = "HP %d / %d" % [current, maximum]
func _on_depth(depth: int, total: int) -> void:
depth_label.text = "Depth %d / %d" % [depth, total]
func _on_enemies(remaining: int, _total: int) -> void:
depth_label.text = "%s Enemies: %d" % [depth_label.text.split(" ")[0], remaining]
func _on_game_over(won: bool) -> void:
_game_over = true
overlay.show()
if won:
overlay_title.text = "YOU WIN"
overlay_title.modulate = Color(0.35, 0.90, 0.45)
else:
overlay_title.text = "YOU DIED"
overlay_title.modulate = Color(0.92, 0.28, 0.28)
overlay_hint.text = "Press R to restart"
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE