92 lines
3.9 KiB
GDScript3
92 lines
3.9 KiB
GDScript3
|
|
extends SceneTree
|
||
|
|
|
||
|
|
# A ship crafter offers what can actually be ordered there, and nothing else.
|
||
|
|
#
|
||
|
|
# Two rules:
|
||
|
|
# - a hull whose research is not done is not on offer (it never was
|
||
|
|
# orderable; it was drawn greyed, which is a row that says nothing the
|
||
|
|
# absence does not)
|
||
|
|
# - a support vessel needs the structure that USES it. #216 made
|
||
|
|
# transporters and repair drones ordinary craft, and one with no hub or
|
||
|
|
# no workshop has nowhere to be assigned - it would sit in the hangar as
|
||
|
|
# spent resources.
|
||
|
|
#
|
||
|
|
# Covers:
|
||
|
|
# A. with no hub and no workshop, neither support craft can be ordered
|
||
|
|
# B. building a hub offers the transporter, and only the transporter
|
||
|
|
# C. building a workshop offers the drone
|
||
|
|
# D. the model refuses the order too, not just the menu
|
||
|
|
# E. an unresearched fleet hull is not on offer either
|
||
|
|
|
||
|
|
var state: Node
|
||
|
|
var crafter_id: int
|
||
|
|
|
||
|
|
|
||
|
|
func _initialize() -> void:
|
||
|
|
state = root.get_node("GameState")
|
||
|
|
state.buildings.clear()
|
||
|
|
state.extractors.clear()
|
||
|
|
state.transporters.clear()
|
||
|
|
state.repair_drones.clear()
|
||
|
|
state.reset_progression()
|
||
|
|
state.rocks = 900
|
||
|
|
state.unlocked = ["shipyards", "logistics", "freight"]
|
||
|
|
crafter_id = state.add_building(state.BUILDING_SHIP_CRAFTER, Vector2(400.0, 0.0))
|
||
|
|
|
||
|
|
|
||
|
|
func _process(_delta: float) -> bool:
|
||
|
|
# --- A. nothing to assign them to, so nothing on offer ------------
|
||
|
|
if state.vessel_can_be_crafted(GameState.VESSEL_TRANSPORTER):
|
||
|
|
return _fail("a transporter is orderable with no hub to put it in")
|
||
|
|
if state.vessel_can_be_crafted(GameState.REPAIR_DRONE):
|
||
|
|
return _fail("a repair drone is orderable with no workshop to put it in")
|
||
|
|
# --- D. and the model refuses, not merely the menu ----------------
|
||
|
|
if state.queue_order(crafter_id, GameState.VESSEL_TRANSPORTER):
|
||
|
|
return _fail("the crafter queued a transporter with nowhere to send it")
|
||
|
|
print("no hub, no workshop: neither support craft is on offer")
|
||
|
|
|
||
|
|
# --- B. a hub offers the transporter ------------------------------
|
||
|
|
var hub_id: int = state.add_building(state.BUILDING_TRANSPORT_HUB, Vector2(900.0, 0.0))
|
||
|
|
if not state.vessel_can_be_crafted(GameState.VESSEL_TRANSPORTER):
|
||
|
|
return _fail("a hub is standing and the transporter is still not orderable")
|
||
|
|
if state.vessel_can_be_crafted(GameState.REPAIR_DRONE):
|
||
|
|
return _fail("a transport hub made the repair drone orderable")
|
||
|
|
if not state.queue_order(crafter_id, GameState.VESSEL_TRANSPORTER):
|
||
|
|
return _fail("the crafter refused a transporter with a hub standing")
|
||
|
|
state.find_building(crafter_id).orders.clear()
|
||
|
|
print("a hub offers the transporter, and only that")
|
||
|
|
|
||
|
|
# --- C. and a workshop the drone ----------------------------------
|
||
|
|
state.add_building(GameState.BUILDING_WORKSHOP, Vector2(-900.0, 0.0))
|
||
|
|
if not state.vessel_can_be_crafted(GameState.REPAIR_DRONE):
|
||
|
|
return _fail("a workshop is standing and the drone is still not orderable")
|
||
|
|
print("a workshop offers the repair drone")
|
||
|
|
|
||
|
|
# Taking the hub away takes the offer with it - there is nowhere to
|
||
|
|
# assign one again.
|
||
|
|
state.remove_buildings_of_type(state.BUILDING_TRANSPORT_HUB)
|
||
|
|
if state.vessel_can_be_crafted(GameState.VESSEL_TRANSPORTER):
|
||
|
|
return _fail("the last hub came down and the transporter is still on offer")
|
||
|
|
print("the last hub down: the transporter is off the menu again")
|
||
|
|
|
||
|
|
# --- E. an unresearched hull is not on offer ----------------------
|
||
|
|
var locked: String = ""
|
||
|
|
for definition in load("res://vessels/VesselDefinitions.gd").fleet():
|
||
|
|
if not state.vessel_is_unlocked(String(definition.definition_id)):
|
||
|
|
locked = String(definition.definition_id)
|
||
|
|
break
|
||
|
|
if locked == "":
|
||
|
|
return _fail("every fleet hull is already unlocked, so this proves nothing")
|
||
|
|
if state.vessel_can_be_crafted(locked):
|
||
|
|
return _fail("'%s' is unresearched and still on offer" % locked)
|
||
|
|
print("an unresearched hull ('%s') is not on offer" % locked)
|
||
|
|
|
||
|
|
print("TEST_CRAFTER_AVAILABILITY: PASS")
|
||
|
|
quit(0)
|
||
|
|
return true
|
||
|
|
|
||
|
|
|
||
|
|
func _fail(message: String) -> bool:
|
||
|
|
print("TEST_CRAFTER_AVAILABILITY: FAIL (%s)" % message)
|
||
|
|
quit(1)
|
||
|
|
return true
|