108 lines
4.8 KiB
GDScript
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)
|