From 3fc04f816a95f3079dcad2dc3b563018cee4d39e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Wisniewski?= Date: Fri, 14 Aug 2026 22:46:25 +0200 Subject: [PATCH] Supply lab research with transporters --- GameState.gd | 10 ++++- tests/test_lab_transporter_delivery.gd | 46 ++++++++++++++++++++++ tests/test_lab_transporter_delivery.gd.uid | 1 + 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/test_lab_transporter_delivery.gd create mode 100644 tests/test_lab_transporter_delivery.gd.uid diff --git a/GameState.gd b/GameState.gd index db77793..03c35e4 100644 --- a/GameState.gd +++ b/GameState.gd @@ -670,6 +670,9 @@ func outstanding_cost(id: int) -> int: # A started build has already paid, so it is not still owed. if not bool(o.started): need += product_cost(String(o.product)) + for order in b.get("research_orders", []): + if not bool(order.started): + need += research_cost(String(order.id)) return maxi(need - _inventory_for_record(b).amount(RESOURCE_ORE), 0) @@ -771,6 +774,11 @@ func lab_research_order(lab_id: int) -> Dictionary: return {} if orders.is_empty() else orders[0] +func research_cost(id: String) -> int: + var unlock_definition: Resource = vessel_for_unlock(id) + return unlock_definition.unlock_cost if unlock_definition != null else upgrade_cost(id) + + func _advance_lab_research(delta: float) -> void: for lab in buildings: if not building_has_capability(lab, "vessel_research"): @@ -781,7 +789,7 @@ func _advance_lab_research(delta: float) -> void: var order: Dictionary = orders[0] var id: String = String(order.id) var unlock_definition: Resource = vessel_for_unlock(id) - var cost: int = unlock_definition.unlock_cost if unlock_definition != null else upgrade_cost(id) + var cost: int = research_cost(id) var inventory: RefCounted = _inventory_for_record(lab) if not bool(order.started): if inventory.amount(RESOURCE_ORE) < cost: diff --git a/tests/test_lab_transporter_delivery.gd b/tests/test_lab_transporter_delivery.gd new file mode 100644 index 0000000..0096fe7 --- /dev/null +++ b/tests/test_lab_transporter_delivery.gd @@ -0,0 +1,46 @@ +extends SceneTree + +var state: Node +var lab_id: int +var elapsed: float = 0.0 + + +func _initialize() -> void: + state = root.get_node("GameState") + state.buildings.clear() + state.extractors.clear() + state.transporters.clear() + state.reset_progression() + state.rocks = 100 + state.build_time_scale = 0.02 + state.add_building(state.BUILDING_MOTHERSHIP, Vector2.ZERO) + var hub_id: int = state.add_building(state.BUILDING_TRANSPORT_HUB, Vector2(50, 0)) + lab_id = state.add_building(state.BUILDING_SHIP_LAB, Vector2(100, 0)) + state.transporters.append({"hub_id": hub_id, "state": state.TRANSPORTER_IDLE, + "target_id": 0, "extractor_index": -1, "carrying": 0, "progress": 1.0, + "from": Vector2(50, 0), "to": Vector2(50, 0)}) + if not state.queue_lab_research(lab_id, "int_damage"): + return _fail("could not queue lab research") + if state.outstanding_cost(lab_id) != state.upgrade_cost("int_damage"): + return _fail("queued research did not expose its ore demand") + + +func _process(delta: float) -> bool: + elapsed += delta + if state.upgrade_level("int_damage") == 1: + if state.lab_research_order(lab_id).is_empty(): + print("transporter supplied queued lab research end to end") + print("TEST_LAB_TRANSPORTER_DELIVERY: PASS") + quit(0) + return true + if elapsed > 5.0: + return _fail("lab still waiting: demand=%d transporter=%s stock=%d" % [ + state.outstanding_cost(lab_id), state.transporters[0].state, + state.building_stock(lab_id)]) + return false + + +func _fail(message: String) -> bool: + print("TEST_LAB_TRANSPORTER_DELIVERY: FAIL (%s)" % message) + quit(1) + return true diff --git a/tests/test_lab_transporter_delivery.gd.uid b/tests/test_lab_transporter_delivery.gd.uid new file mode 100644 index 0000000..ecf12ff --- /dev/null +++ b/tests/test_lab_transporter_delivery.gd.uid @@ -0,0 +1 @@ +uid://dmw83vfmot52d