extends Node var failures: Array[String] = [] var is_runner := false func check(ok: bool, message: String) -> void: if not ok: failures.append(message) push_error(message) func _ready() -> void: if not is_runner: var runner := get_script().new() as Node runner.is_runner = true get_tree().root.add_child.call_deferred(runner) else: run.call_deferred() func frames(count := 3) -> void: for index in count: await get_tree().process_frame func run() -> void: var state := GameState state.start_new_run() check(not preload("res://scripts/planets/expedition_controller.gd").PLANET_LANDING_ENABLED,"Landing disabled") var checks := preload("res://tests/distant_expeditions_checks.gd").new() for failure in checks.run_checks().failures: check(false,str(failure)) checks.free() var map := {"id":"space_test","level":2,"seed":81234,"name":"Test","source_planet":"Boss","source_level":1} state.captain.expedition.distant_maps[map.id] = map state.captain.expedition.deuter = 0 check(state.depart_distant(map.id),"Departure without deuter") check(state.captain.expedition.deuter == 0,"No fuel mutation") check(not state.depart_distant(map.id),"No duplicate departure") get_tree().change_scene_to_file("res://scenes/game/game.tscn") await frames(8) var game := get_tree().current_scene var player := game.get_node("PlayerShip") player.set_physics_process(false) for enemy in get_tree().get_nodes_in_group("enemies"): enemy.set_physics_process(false) var bases: Array[Node] = [] for poi in get_tree().get_nodes_in_group("exploration_pois"): if str(poi.get("kind")) == "enemy_base": bases.append(poi) check(bases.size() == 3,"Three resource bases") var base := bases[0] var rewards: Dictionary = base.materials(base.reward_seed,base.level) var id: String = base.base_id base.take_weapon_hit(1e12) base.take_weapon_hit(1e12) await frames() check(state.explored_pois.has(id),"Base claimed persistently") for pickup in get_tree().get_nodes_in_group("loot"): if pickup.get_script() == preload("res://scripts/items/expedition_pickup.gd") and pickup.payload.has("materials"): player.position = pickup.position pickup._physics_process(0.0) await frames() for key in rewards: check(state.captain.minerals.get(key,0) == rewards[key],"Collect base material "+str(key)) var sample := Node2D.new() sample.set_script(preload("res://scripts/items/expedition_pickup.gd")) sample.payload = {"samples":1} sample.position = player.position game.add_child(sample) sample._physics_process(0.0) check(state.captain.expedition.analysis_samples == 1,"Collect sample") var controller := game.get_node("PlanetExpeditions") player.position = controller.freighter.position controller.land_nearby() await frames() check(is_instance_valid(controller.screen),"Docking still works") var screen: Control = controller.screen var inventory := player.get_node("ShipInventory") var weapon: ItemInstance = preload("res://scripts/items/item_generator.gd").generate_for_definition(inventory.weapon_slots[0].definition,10,2) inventory.weapon_slots[0] = weapon screen._tab = "hangar" screen._refresh() check(screen.find_child("RepairLander",true,false) == null,"No lander repair") screen._tab = "workshop" screen._refresh() await frames() check(screen.find_child("EngineerItem",true,false) != null,"Engineer on freighter") state.captain.expedition.time_crystals = 100000 var service := preload("res://scripts/planets/time_engineer.gd") var addon := -1 for index in weapon.additional_modifiers.size(): if service.affix_for(weapon,index) != null: addon = index weapon.additional_modifiers[index].value = 0.0 break if addon >= 0: check(service.maximize(state.captain.expedition,inventory,weapon,addon),"Engineer works outside surface") check(not service.maximize(state.captain.expedition,inventory,weapon,addon),"No charge for max addon") check(addon >= 0,"Test equipment has addon") var orb := preload("res://scripts/items/special_orbs.gd").create_item("piercing") check(inventory.add_item(orb),"Orb in cargo") check(inventory.select_orb(inventory.cargo.find(orb)),"Click orb") check(inventory.use_selected_orb(weapon),"Click equipment applies orb") controller._leave() game.set_physics_process(false) state.restore_distant_home() var enemy := get_tree().get_first_node_in_group("enemies") enemy.loot_tier = 2 enemy._drop_loot() await frames() var maps := 0 for pickup in get_tree().get_nodes_in_group("loot"): if pickup.get_script() == preload("res://scripts/items/expedition_pickup.gd") and pickup.payload.has("map"): maps += 1 player.position = pickup.position pickup._physics_process(0.0) check(maps == 1,"Normal boss drops exactly one map") check(state.captain.expedition.distant_maps.size() == 1,"Boss map collected") print("SPACE_PROGRESSION_TEST: ",JSON.stringify({"failures":failures})) get_tree().quit(0 if failures.is_empty() else 1)