spaceship/tests/test_hangar_management.gd
2026-08-13 20:54:22 +02:00

93 lines
3.5 KiB
GDScript

extends SceneTree
# Forgejo #23 + #25: the mothership hangar presents vessels by type, tapping
# an available type crews one, tapping a fleet type stores one, and contextual
# world buttons each get their own touch berth.
var game_state: Node
var scene: Node
var fleet: Node
var controller: Node
var stage: int = 0
var elapsed: float = 0.0
func _initialize() -> void:
game_state = root.get_node("GameState")
game_state.buildings.clear()
game_state.extractors.clear()
game_state.transporters.clear()
game_state.stored_vessels.clear()
game_state.rocks = 100
scene = load("res://Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
controller = scene.get_node("BuildController")
func _process(delta: float) -> bool:
elapsed += delta
if stage == 0:
scene.get_node("AsteroidField").set_process(false)
scene.get_node("EnemySpawner").set_process(false)
for a in get_nodes_in_group("asteroids"):
if is_instance_valid(a):
a.queue_free()
fleet.spawn_ships(1, Vector2.ZERO)
fleet.add_ship(GameState.VESSEL_SHIELD)
game_state.stored_vessels = [GameState.VESSEL_INTERCEPTOR, GameState.VESSEL_SHIELD]
controller._on_hangar_pressed()
elapsed = 0.0
stage = 1
return false
if stage == 1:
if elapsed < 0.2:
return false
# Available cards name the vessel and count what can be crewed.
var available_label: Label = controller.hangar_available_labels[0]
if "Interceptor" not in available_label.text or "1 available" not in available_label.text:
_fail("available interceptor card says '%s'" % available_label.text)
return true
controller._on_hangar_crew_type(0)
if fleet.ships.size() != 3 or game_state.stored_vessels.has(GameState.VESSEL_INTERCEPTOR):
_fail("tapping an available interceptor did not crew it")
return true
controller._on_hangar_store_type(1)
if fleet.ships.size() != 2 or not game_state.stored_vessels.has(GameState.VESSEL_SHIELD):
_fail("tapping the shield fleet card did not store it")
return true
# The safety rule prevents an empty deployed fleet.
controller._on_hangar_store_type(0)
controller._on_hangar_store_type(0)
if fleet.ships.size() != 1:
_fail("hangar allowed the last deployed ship to be stored")
return true
# Context actions are compact until expanded. A mothership has three
# choices: research, transfer cargo and hangar, which unfold in their
# own non-overlapping berths to the right only after expansion.
var mothership: Node2D = load("res://Building.tscn").instantiate()
mothership.set("building_type", GameState.BUILDING_MOTHERSHIP)
controller.current_building = mothership
controller.context_actions_expanded = true
controller._layout_context_buttons()
var buttons: Array = [controller.building_action_button, controller.transfer_button, controller.hangar_button]
for i in range(buttons.size() - 1):
if buttons[i].offset_right > buttons[i + 1].offset_left:
_fail("context buttons %d and %d overlap" % [i, i + 1])
return true
controller._collapse_context_actions()
if controller.building_action_button.visible or controller.transfer_button.visible or controller.hangar_button.visible:
_fail("collapsing the context button left an action visible")
return true
mothership.free()
print("hangar crews and stores typed vessels; contextual actions expand and collapse")
print("TEST_HANGAR_MANAGEMENT: PASS")
quit(0)
return true
return false
func _fail(message: String) -> void:
print("TEST_HANGAR_MANAGEMENT: FAIL (%s)" % message)
quit(1)