From 2a6f04053c1c3e7f97fa8a9dde269214b9e1745f Mon Sep 17 00:00:00 2001 From: Jeremy Baxter Date: Thu, 22 Jan 2026 17:40:18 +1300 Subject: [PATCH 1/4] player: rename BackpackUI to HUD --- player/player.gd | 26 +++++++++++++------------- player/player.tscn | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/player/player.gd b/player/player.gd index fe99f5a..a849ce4 100644 --- a/player/player.gd +++ b/player/player.gd @@ -16,21 +16,21 @@ var direction = Vector3.ZERO var target_velocity = Vector3.ZERO func resize_ui(): - var bpui_h = 200 + var hud_h = 200 var size = get_viewport().get_visible_rect().size $Message.size.x = size.x - $BackpackUI.size.x = size.x - $BackpackUI.size.y = bpui_h - $BackpackUI.position.x = 0 - $BackpackUI.position.y = size.y - bpui_h + $HUD.size.x = size.x + $HUD.size.y = hud_h + $HUD.position.x = 0 + $HUD.position.y = size.y - hud_h -func make_backpack_ui(): +func make_hud(): var text = "Holding " + $Pivot/Container/Gear.gear_name() for node in $Backpack.get_children(): if not node is Gear: continue text += "\n%s (%s)" % [node.gear_name(), node.name] - $BackpackUI.text = text + $HUD.text = text func message(string): $Message.text = string @@ -40,7 +40,7 @@ func message(string): func die(): suspended = true visible = false - $BackpackUI.visible = false + $HUD.visible = false # strip gears for gear in $Backpack.get_children(): @@ -61,8 +61,8 @@ func respawn(): var gear = starting_gear.instantiate() $Pivot/Container.add_child(gear) - make_backpack_ui() - $BackpackUI.visible = true + make_hud() + $HUD.visible = true # Backpack functions @@ -87,7 +87,7 @@ func use_backpack_slot(n): old.reparent($Backpack, false) get_node(gear_node).reparent($Pivot/Container, false) get_node("Pivot/Container/" + n).name = "Gear" - make_backpack_ui() + make_hud() return # couldn't find a free slot, so replace # the new slot with the current gear @@ -95,7 +95,7 @@ func use_backpack_slot(n): old.reparent($Backpack, false) old.name = n get_node("Pivot/Container/" + n).name = "Gear" - make_backpack_ui() + make_hud() return func equip(gear: Gear): @@ -120,7 +120,7 @@ func equip(gear: Gear): new_gear = gear.duplicate() new_gear.name = "Gear" $Pivot/Container.add_child(new_gear) - make_backpack_ui() + make_hud() message("You picked up a " + gear_name + "!") return true # if no slots are free diff --git a/player/player.tscn b/player/player.tscn index 3da27e3..10a0f29 100644 --- a/player/player.tscn +++ b/player/player.tscn @@ -93,7 +93,7 @@ vertical_alignment = 1 wait_time = 4.0 one_shot = true -[node name="BackpackUI" type="Label" parent="."] +[node name="HUD" type="Label" parent="."] offset_right = 200.0 offset_bottom = 200.0 text = "Pictures of you" From 5b8d7fdccee510eb617c708ef06651b83ffd16a4 Mon Sep 17 00:00:00 2001 From: Jeremy Baxter Date: Thu, 22 Jan 2026 20:54:21 +1300 Subject: [PATCH 2/4] player: display health in HUD --- player/player.gd | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/player/player.gd b/player/player.gd index a849ce4..02bba3c 100644 --- a/player/player.gd +++ b/player/player.gd @@ -25,11 +25,13 @@ func resize_ui(): $HUD.position.y = size.y - hud_h func make_hud(): - var text = "Holding " + $Pivot/Container/Gear.gear_name() + var text = "" for node in $Backpack.get_children(): if not node is Gear: continue - text += "\n%s (%s)" % [node.gear_name(), node.name] + text += "%s (%s)\n" % [node.gear_name(), node.name] + text += "Holding " + $Pivot/Container/Gear.gear_name() + "\n" + text += str(health) + " hp" $HUD.text = text func message(string): From 7e1847942bbe00cdf6ad01b96f742db699f14fcb Mon Sep 17 00:00:00 2001 From: Jeremy Baxter Date: Thu, 22 Jan 2026 21:11:05 +1300 Subject: [PATCH 3/4] player: add health callbacks Allows us to update the HUD on health change --- player/player.gd | 22 ++++++++++++++++++---- world/killbrick.gd | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/player/player.gd b/player/player.gd index 02bba3c..b91bccc 100644 --- a/player/player.gd +++ b/player/player.gd @@ -10,11 +10,12 @@ const gear_slots = ["1", "2", "3"] var starting_gear = preload("res://gears/ball.tscn") -var health = 100 var suspended = false var direction = Vector3.ZERO var target_velocity = Vector3.ZERO +var _health = 100 + func resize_ui(): var hud_h = 200 var size = get_viewport().get_visible_rect().size @@ -31,7 +32,7 @@ func make_hud(): continue text += "%s (%s)\n" % [node.gear_name(), node.name] text += "Holding " + $Pivot/Container/Gear.gear_name() + "\n" - text += str(health) + " hp" + text += str(health()) + " hp" $HUD.text = text func message(string): @@ -39,6 +40,19 @@ func message(string): $Message.visible = true $Message/VanishTimer.start() +func harm(hp): + assert(hp >= 0) + _health -= hp + make_hud() + +func heal(hp): + assert(hp >= 0) + _health += hp + make_hud() + +func health(): + return _health + func die(): suspended = true visible = false @@ -55,7 +69,7 @@ func die(): func respawn(): position = Vector3(spawn) $CameraGimbal.reset() - health = 100 + _health = 100 visible = true suspended = false @@ -159,7 +173,7 @@ func _physics_process(delta): if suspended: return - if health < 1 or position.y <= -1000: + if health() < 1 or position.y <= -1000: die() # UI and backpack keys diff --git a/world/killbrick.gd b/world/killbrick.gd index c587fe8..45f437b 100644 --- a/world/killbrick.gd +++ b/world/killbrick.gd @@ -2,4 +2,4 @@ extends Area3D func _on_body_entered(body: Node3D): if body is Player: - body.health = 0 + body.die() From 27613b766f18c876e14105c8847e7ef38eb48297 Mon Sep 17 00:00:00 2001 From: Jeremy Baxter Date: Thu, 22 Jan 2026 21:17:47 +1300 Subject: [PATCH 4/4] player: organise code --- player/player.gd | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/player/player.gd b/player/player.gd index b91bccc..48f08e0 100644 --- a/player/player.gd +++ b/player/player.gd @@ -16,6 +16,8 @@ var target_velocity = Vector3.ZERO var _health = 100 +# Player UI + func resize_ui(): var hud_h = 200 var size = get_viewport().get_visible_rect().size @@ -40,6 +42,8 @@ func message(string): $Message.visible = true $Message/VanishTimer.start() +# State functions + func harm(hp): assert(hp >= 0) _health -= hp @@ -143,7 +147,7 @@ func equip(gear: Gear): message("Backpack full") return false -# Player movement and engine callbacks +# Player mechanics func move_player(x, z): var camera_basis = $CameraGimbal.get_global_transform().basis @@ -164,19 +168,7 @@ func move_player(x, z): if x != 0: direction += camera_basis.x * x -func _ready(): - get_viewport().size_changed.connect(resize_ui) - resize_ui() - respawn() - -func _physics_process(delta): - if suspended: - return - - if health() < 1 or position.y <= -1000: - die() - - # UI and backpack keys +func do_backpack_keys(): if Input.is_action_just_pressed("backpack_1"): use_backpack_slot("1") if Input.is_action_just_pressed("backpack_2"): @@ -184,7 +176,7 @@ func _physics_process(delta): if Input.is_action_just_pressed("backpack_3"): use_backpack_slot("3") - # Movement keys +func do_movement(delta): var mx = 0 var mz = 0 @@ -212,7 +204,7 @@ func _physics_process(delta): move_and_slide() - # Gear uses +func do_gears(): var gear = $Pivot/Container/Gear assert(gear is Gear) if gear.continuous(): @@ -222,6 +214,27 @@ func _physics_process(delta): if Input.is_action_just_pressed("gear_use"): gear.use(self) +# Engine callbacks + +func _ready(): + get_viewport().size_changed.connect(resize_ui) + resize_ui() + respawn() + +func _physics_process(delta): + if health() < 1 or position.y <= -1000: + die() + + if suspended: + return + + # Backpack keys + do_backpack_keys() + # Movement + do_movement(delta) + # Use gears + do_gears() + # Signals func _on_vanish_timer_timeout():