Improve ship crafter and hangar controls
This commit is contained in:
parent
82552464d2
commit
06081c41b0
4 changed files with 348 additions and 56 deletions
86
tests/test_hangar_management.gd
Normal file
86
tests/test_hangar_management.gd
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
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)
|
||||
Loading…
Reference in a new issue