Add Table

This commit is contained in:
JonShard
2026-07-25 18:18:17 +02:00
parent a1cb484ca5
commit 265dd12b37
8 changed files with 148 additions and 27 deletions
+69 -16
View File
@@ -2,14 +2,14 @@ extends StaticBody3D
const GAME_MANAGER = preload("res://GameManager.gd")
@export var initial_thinking_time: float = 8
@export var initial_primary_time: float = 8
@export var initial_friend_time: float = 3
@export var initial_eating_time: float = 3
@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
@onready var label_3d: Label3D = $Label3D
@onready var label_3d_time: Label3D = $Label3DTime
@onready var snap_zone: XRToolsSnapZone = $XRToolsSnapZone
@onready var snap_zones: Array[XRToolsSnapZone] = []
const lbl_thinking: String = "Thinking..."
const lbl_waiting_primary: String = "Waiting for food"
@@ -34,31 +34,68 @@ func _ready() -> void:
push_error("Table is missing reference to Label3D")
if not label_3d_time:
push_error("Table is missing reference to Label3DTime")
if not snap_zone:
push_error("Table is missing reference to XRToolsSnapZone")
snap_zone.has_picked_up.connect(_on_object_picked_up)
snap_zone.has_dropped.connect(_on_object_dropped)
# Get snap_zones for plates, store in array snap_zones
for child in get_children():
var snap_zone_node = child as XRToolsSnapZone
if snap_zone_node:
snap_zones.append(snap_zone_node)
if snap_zones.is_empty():
push_error("Table is missing XRToolsSnapZone children")
return
for snap_zone_node in snap_zones:
snap_zone_node.has_picked_up.connect(_on_object_picked_up)
snap_zone_node.has_dropped.connect(_on_object_dropped)
_setState(TableState.EMPTY)
func _on_object_picked_up(_item) -> void:
print("Table: object picked up: ", _item)
_update_order_text()
_absorb_item_if_correct(_item)
func _on_object_dropped() -> void:
print("Table: object dropped ")
func _get_plate_from_item(_item: Node) -> PlateController:
return _item.get_children().filter(func(c): return c is PlateController).front() as PlateController
func _absorb_item_if_correct(_item: Node) -> void:
# Get plate controller in childer of _item (hopefully a plate XRpickable)
var plate = _get_plate_from_item(_item)
if not plate:
print("Table: held object is not a Plate")
return
print("Table: held a Plate!")
# Absorm items from the plate we want
for food_item in plate.container.contained_items:
print("Table: held a plate with FoodItem: ", food_item.id)
if food_item.id in _unsatisfied_orders:
print("Table: held FoodItem is in unsatisfied orders, removing it")
_unsatisfied_orders.erase(food_item.id)
GAME_MANAGER.money += food_item.sell_value
_setState(TableState.WAITING_FRIEND)
_update_order_text()
# Table has everything it wants. Start eating
if _unsatisfied_orders.is_empty():
_setState(TableState.EATING)
func place_order() -> void:
print("Table: place_order()")
_unsatisfied_orders.append(GAME_MANAGER.get_random_meal())
_update_order_text()
_unsatisfied_orders.append(GAME_MANAGER.get_random_meal())
func _update_order_text() -> void:
label_3d.text = "Order: " + ", ".join(_unsatisfied_orders)
label_3d.text = "%s\n%s" % [TableState.keys()[_state], "\n".join(_unsatisfied_orders)]
func _setState(newState: TableState) -> void:
@@ -73,11 +110,12 @@ func _setState(newState: TableState) -> void:
if newState == TableState.WAITING_PRIMARY:
_state_time = initial_primary_time
_update_order_text()
_update_order_text()
if newState == TableState.WAITING_FRIEND:
_state_time = initial_friend_time
_update_order_text()
if newState == TableState.EATING:
_state_time = initial_eating_time
label_3d.text = lbl_eating
@@ -92,17 +130,32 @@ func _process(delta: float) -> void:
label_3d_time.text = "%.1f" % _state_time
return
# When state timer is finished, do this stuff before moving to next state
match _state:
TableState.EMPTY:
_setState(TableState.THINKING)
TableState.THINKING:
place_order()
_setState(TableState.WAITING_PRIMARY)
place_order()
_update_order_text()
TableState.WAITING_PRIMARY:
label_3d.text = lbl_gameover
TableState.WAITING_FRIEND:
label_3d.text = lbl_gameover
TableState.EATING:
for snap_zone_node in snap_zones:
var held_object = snap_zone_node.picked_up_object
if not held_object:
continue
var plate = _get_plate_from_item(held_object)
if plate:
plate.container.clear()
plate.is_dirty = true
_setState(TableState.EMPTY)
+41 -3
View File
@@ -18,7 +18,7 @@ script = ExtResource("1_2vcpj")
shape = SubResource("BoxShape3D_24d3s")
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=1947858647 groups=["station"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5270121, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.31874347, 0.5270121, 0)
collision_layer = 65536
collision_mask = 65536
script = ExtResource("1_8j1nt")
@@ -29,6 +29,42 @@ metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.000975132, 0)
shape = SubResource("SphereShape3D_dlkho")
[node name="XRToolsSnapZone2" type="Area3D" parent="." unique_id=694448387 groups=["station"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.34755045, 0.5270121, 0)
collision_layer = 65536
collision_mask = 65536
script = ExtResource("1_8j1nt")
snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D2" type="CollisionShape3D" parent="XRToolsSnapZone2" unique_id=650960099]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.000975132, 0)
shape = SubResource("SphereShape3D_dlkho")
[node name="XRToolsSnapZone3" type="Area3D" parent="." unique_id=1734026785 groups=["station"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.012355864, 0.5270121, 0.33038777)
collision_layer = 65536
collision_mask = 65536
script = ExtResource("1_8j1nt")
snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D2" type="CollisionShape3D" parent="XRToolsSnapZone3" unique_id=1271210642]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.000975132, 0)
shape = SubResource("SphereShape3D_dlkho")
[node name="XRToolsSnapZone4" type="Area3D" parent="." unique_id=1358457948 groups=["station"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.022546828, 0.5270121, -0.36528283)
collision_layer = 65536
collision_mask = 65536
script = ExtResource("1_8j1nt")
snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D2" type="CollisionShape3D" parent="XRToolsSnapZone4" unique_id=1880499470]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.000975132, 0)
shape = SubResource("SphereShape3D_dlkho")
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=2085635675]
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D" unique_id=411048765]
@@ -108,12 +144,14 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1444692, -0.18527734, -0.15
size = Vector3(0.05, 0.6713196, 0.05)
[node name="Label3D" type="Label3D" parent="." unique_id=662960977]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1781815, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3247777, 0)
billboard = 2
text = "table state"
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.0412213, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3306234, 0)
pixel_size = 0.003
billboard = 2
text = "20.1s"