57 lines
1.9 KiB
GDScript
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
|