Randoloot/tests/space_progression_test.gd
2026-10-31 16:08:17 +01:00

108 lines
4.8 KiB
GDScript

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)