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 # #25: all three contextual controls have non-overlapping vertical # rectangles when the mothership exposes Action, Transfer and Hangar. controller.action_button.visible = true controller.transfer_button.visible = true controller.hangar_button.visible = true controller._layout_context_buttons() var buttons: Array = [controller.action_button, controller.transfer_button, controller.hangar_button] for i in range(buttons.size() - 1): if buttons[i].offset_bottom > buttons[i + 1].offset_top: _fail("context buttons %d and %d overlap" % [i, i + 1]) return true print("hangar crews and stores typed vessels; contextual buttons have separate berths") 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)