94 lines
3.5 KiB
GDScript
94 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)
|
|
mothership._ready()
|
|
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)
|