From b7775e9de63b0fa44cfbdc0c295710a4a35b55bc Mon Sep 17 00:00:00 2001 From: JonShard Date: Mon, 27 Jul 2026 13:32:04 +0200 Subject: [PATCH] Add progress bar to Table --- Stations/table.gd | 51 +++++++++++++++++++++++++++++-------------- Stations/table.tscn | 7 +++++- UI/progress_bar_3d.gd | 4 ++++ 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/Stations/table.gd b/Stations/table.gd index 827b586..0577809 100644 --- a/Stations/table.gd +++ b/Stations/table.gd @@ -3,17 +3,17 @@ extends StaticBody3D const GAME_MANAGER = preload("res://GameManager.gd") -@export var initial_thinking_time: float = 6 -@export var initial_primary_time: float = 60 -@export var initial_friend_time: float = 10 -@export var initial_eating_time: float = 4 +@export var thinking_duration: float = 6 +@export var primary_duration: float = 23 +@export var friend_duration: float = 10 +@export var eating_duration: float = 4 @onready var label_3d: Label3D = $Label3D @onready var label_3d_time: Label3D = $Label3DTime @onready var snap_zones: Array[XRToolsSnapZone] = [] +@onready var progress_bar: ProgressBar3D = $ProgressBar3D -const lbl_thinking: String = "Thinking..." -const lbl_waiting_primary: String = "Waiting for food" +const lbl_thinking: String = "..." const lbl_gameover: String = "Game Over!" const lbl_eating: String = "Eating..." @@ -35,13 +35,18 @@ enum TableState { ## the same text. Use _setState(), never assign _state directly. var _state: TableState = TableState.EMPTY: set = _set_state var _state_time: float = 0.0: set = _set_state_time +var _state_duration: float = 0.0 # set in _set_state_time var _unsatisfied_orders: Array[String] = []: set = _set_unsatisfied_orders + func _ready() -> void: if not label_3d: push_error("Table is missing reference to Label3D") if not label_3d_time: push_error("Table is missing reference to Label3DTime") + if not progress_bar or progress_bar is not ProgressBar3D: + push_error("Hob missing reference to progressbar, or wrong type:", progress_bar) + progress_bar.y_billboard = true # Get snap_zones for plates, store in array snap_zones for child in get_children(): @@ -64,7 +69,6 @@ func _on_object_picked_up(_item) -> void: _absorb_item_if_correct(_item) - func _on_object_dropped() -> void: print("Table: object dropped ") @@ -128,14 +132,19 @@ func _setState(newState: TableState) -> void: match newState: TableState.EMPTY: _state_time = 0.0 + _state_duration = 0.0 TableState.THINKING: - _state_time = initial_eating_time + _state_time = eating_duration + _state_duration = eating_duration # Can't be done in _set_state(), will set duration inside timer TableState.WAITING_PRIMARY: - _state_time = initial_primary_time + _state_time = primary_duration + _state_duration = primary_duration TableState.WAITING_FRIEND: - _state_time = initial_friend_time + _state_time = friend_duration + _state_duration = friend_duration TableState.EATING: - _state_time = initial_eating_time + _state_time = eating_duration + _state_duration = eating_duration _state = newState @@ -143,19 +152,29 @@ func _setState(newState: TableState) -> void: ## Pure presentation, driven off the current (locally authoritative or ## synced-from-server) state. Runs on every peer. func _refresh_display() -> void: - if not label_3d: - return match _state: TableState.EMPTY: + progress_bar.set_bar_visible(false) label_3d.text = "empty" TableState.THINKING: + progress_bar.set_bar_visible(false) label_3d.text = lbl_thinking - TableState.WAITING_PRIMARY, TableState.WAITING_FRIEND: + TableState.WAITING_PRIMARY: label_3d.text = "%s\n%s" % [TableState.keys()[_state], "\n".join(_unsatisfied_orders)] + progress_bar.set_bar_visible(true) + progress_bar.override_fill_color(Color.RED if _state_time < 10 else Color.YELLOW) + TableState.WAITING_FRIEND: + label_3d.text = "%s\n%s" % [TableState.keys()[_state], "\n".join(_unsatisfied_orders)] + progress_bar.set_bar_visible(true) + progress_bar.override_fill_color(Color.RED if _state_time < 5 else Color.YELLOW) TableState.EATING: label_3d.text = lbl_eating - if label_3d_time: - label_3d_time.text = "%.1f" % _state_time + progress_bar.set_bar_visible(false) + + label_3d_time.text = "%.1f" % _state_time + print("_state_duration = ", _state_duration) + progress_bar.set_progress(clampf(float(_state_time) / _state_duration, 0.0, 1.0)) + func _set_state(value: TableState) -> void: diff --git a/Stations/table.tscn b/Stations/table.tscn index c69c862..c76a42a 100644 --- a/Stations/table.tscn +++ b/Stations/table.tscn @@ -2,6 +2,7 @@ [ext_resource type="Script" uid="uid://caeikc7e3igkd" path="res://Stations/table.gd" id="1_2vcpj"] [ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="1_8j1nt"] +[ext_resource type="PackedScene" uid="uid://bxbocxdaayvwx" path="res://UI/progress_bar.tscn" id="3_kjf1i"] [sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"] @@ -162,10 +163,14 @@ vertical_alignment = 0 line_spacing = -15.0 [node name="Label3DTime" type="Label3D" parent="." unique_id=1534849507] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3306234, 0) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.4532461, 0) pixel_size = 0.003 billboard = 2 text = "20.1s" [node name="Sync" type="MultiplayerSynchronizer" parent="." unique_id=2000411505] replication_config = SubResource("SceneReplicationConfig_np_table") + +[node name="ProgressBar3D" parent="." unique_id=654673176 instance=ExtResource("3_kjf1i")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3676775, 0) +y_billboard = true diff --git a/UI/progress_bar_3d.gd b/UI/progress_bar_3d.gd index 604cf37..6ed0966 100644 --- a/UI/progress_bar_3d.gd +++ b/UI/progress_bar_3d.gd @@ -1,13 +1,17 @@ extends Node3D class_name ProgressBar3D +@export var y_billboard: bool = false @onready var progress_bar: ProgressBar = $Sprite3D/SubViewport/ProgressBar +@onready var sprite_3d: Sprite3D = $Sprite3D func _ready() -> void: if not progress_bar: push_error("Progressbar3D missing reference to ProgressBar") + if y_billboard: + $Sprite3D.billboard = BaseMaterial3D.BillboardMode.BILLBOARD_FIXED_Y func set_progress(value: float) -> void: print("ProgressBar set_progress: ", value)