extends SceneTree # The dev button is now a doorway rather than a one-off wave shortcut. This # exercises the real Main scene so additions and removals prove they affect # the live fleet, not only GameState bookkeeping. const VESSEL_DEFINITIONS = preload("res://vessels/VesselDefinitions.gd") var state: Node var scene: Node var fleet: Node var dev_button: Control var menu: Control var stage: int = 0 var elapsed: float = 0.0 func _initialize() -> void: state = root.get_node("GameState") state.start_dev_game() scene = load("res://world/Main.tscn").instantiate() root.add_child(scene) current_scene = scene fleet = scene.get_node("Fleet") dev_button = scene.get_node("UI/DevMenuButton") menu = scene.get_node("UI/DevMenu") func _process(delta: float) -> bool: elapsed += delta match stage: 0: if elapsed < 0.2: return false if state.intro_active: return _fail("the dev world opened inside the intro") if fleet.ships.size() != GameState.STARTING_SHIP_COUNT: return _fail("post-intro dev mode did not start with the normal fleet") dev_button.button.pressed.emit() if not menu.visible: return _fail("the HUD dev button opened no menu") menu.unlock_button.pressed.emit() for skill in GameState.SKILL_TREE: if not state.is_unlocked(String(skill.id)): return _fail("unlock-all missed %s" % skill.id) if state.max_fleet_size() != GameState.DEFAULT_FORMATION.size(): return _fail("unlock-all did not expose the complete fleet capacity") for definition in VESSEL_DEFINITIONS.fleet(): menu.fleet_add_requested.emit(String(definition.definition_id)) for definition in VESSEL_DEFINITIONS.fleet(): if not fleet.has_vessel_type(String(definition.definition_id)): return _fail("the menu could not add %s" % definition.display_name) print("dev menu added every fleet-eligible vessel to the live fleet") var before: int = fleet.ships.size() menu.fleet_remove_requested.emit(GameState.VESSEL_GAS_BOMBER) if fleet.ships.size() != before - 1: return _fail("the dev menu did not remove a vessel") menu.unlimited_button.pressed.emit() if not state.dev_unlimited_resources: return _fail("the unlimited-resources toggle did not turn on") for resource_type in state.resource_types(): state.bank_inventory.withdraw(resource_type, GameState.DEV_UNLIMITED_AMOUNT) state.research_points = 0 state._process(0.0) for resource_type in state.resource_types(): if state.banked_resource(resource_type) != GameState.DEV_UNLIMITED_AMOUNT: return _fail("unlimited mode did not replenish %s" % resource_type) if state.research_points != GameState.DEV_UNLIMITED_AMOUNT: return _fail("unlimited mode did not replenish research points") print("skill unlock and unlimited resources operate on persistent GameState") var wave_before: int = state.wave_number menu.wave_button.pressed.emit() if menu.visible: return _fail("starting a wave left the dev menu over the action") if state.wave_number != wave_before + 1 or not state.wave_pending: return _fail("the dev menu did not retain the immediate wave tool") state.reset_new_game() if state.dev_mode or state.dev_unlimited_resources: return _fail("dev cheats leaked into a normal new game") print("TEST_DEV_MENU: PASS") quit(0) return true return false func _fail(message: String) -> bool: print("TEST_DEV_MENU: FAIL (%s)" % message) quit(1) return true