Randoloot/tests/ships/freighter_storage_test.gd
2026-10-18 14:46:34 +02:00

90 lines
4.2 KiB
GDScript

extends Node
var screen: Control
func settle() -> void:
for frame in 5: await get_tree().process_frame
func find_button(prefix: String) -> Button:
for node in screen._content.find_children("*","Button",true,false):
if node.text.begins_with(prefix): return node
return null
func _ready() -> void:
GameState.start_new_run()
GameState.selected_ship_path = "res://assets/Ships/player/bastion.png"
var game := preload("res://scenes/game/game.tscn").instantiate()
add_child(game)
await settle()
var inv: ShipInventory = game.player.get_node("ShipInventory")
var captain := GameState.captain
assert(inv.get_cargo_capacity() == 5 and inv.unlocked_cargo_rows == 1)
var items: Array[ItemInstance] = []
for index in 6:
items.append(preload("res://scripts/items/item_generator.gd").generate_for_definition(preload("res://resources/items/reinforced_shield.tres"),index+1))
for index in 5: assert(inv.add_item(items[index]))
assert(not inv.add_item(items[5]) and inv.cargo[5] == null)
assert(not inv.can_move_item("cargo",0,"cargo",5))
captain.minerals["iron"] = 100
assert(not inv.unlock_cargo_row(captain))
assert(not inv.store_on_freighter(0,items[0],captain))
var manager := game.get_node("PlanetExpeditions")
manager.open_freighter()
screen = manager.screen
screen._select_section("storage")
assert(find_button("ZBUDUJ SKŁAD") != null)
assert(not inv.store_on_freighter(0,items[0],captain))
find_button("ZBUDUJ SKŁAD").pressed.emit()
assert(find_button("ODŁÓŻ") != null)
find_button("ODŁÓŻ").pressed.emit()
assert(captain.expedition.freighter_storage[0] == items[0])
assert(inv.cargo[0] == null)
assert(not inv.store_on_freighter(0,items[0],captain))
assert(inv.add_item(items[5]))
assert(not inv.retrieve_from_freighter(0,items[0],captain))
assert(captain.expedition.freighter_storage.size() == 1)
screen._refresh()
assert(find_button("← ODBIERZ").disabled)
screen._select_section("hangar")
captain.minerals["iron"] = 9
assert(not inv.unlock_cargo_row(captain) and captain.minerals.iron == 9)
captain.minerals["iron"] = 30
screen._refresh()
find_button("ODBLOKUJ RZĄD").pressed.emit()
assert(inv.get_cargo_capacity() == 10 and captain.minerals.iron == 20)
screen._select_section("storage")
find_button("← ODBIERZ").pressed.emit()
assert(inv.cargo[5] == items[0] and captain.expedition.freighter_storage.is_empty())
assert(inv.store_on_freighter(1,items[1],captain))
assert(inv.store_on_freighter(2,items[2],captain))
assert(not inv.retrieve_from_freighter(0,items[2],captain),"Stale buttons cannot transfer another item")
screen._refresh()
await settle()
await RenderingServer.frame_post_draw
get_viewport().get_texture().get_image().save_png("res://artifacts/freighter_storage.png")
assert(inv.unlock_cargo_row(captain) and inv.unlock_cargo_row(captain))
assert(inv.get_cargo_capacity() == 20 and captain.minerals.iron == 0)
captain.minerals["iron"] = 10
assert(not inv.unlock_cargo_row(captain) and captain.minerals.iron == 10)
assert(ResourceSaver.save(captain.expedition,"user://freighter_storage_test.tres") == OK)
var restored: Resource = ResourceLoader.load("user://freighter_storage_test.tres","",ResourceLoader.CACHE_MODE_IGNORE)
assert(restored.freighter_storage.size() == 2)
assert(restored.freighter_storage[0].item_level == items[1].item_level)
DirAccess.remove_absolute("user://freighter_storage_test.tres")
inv.preserve_for_restart()
screen.closed.emit()
assert(not inv.retrieve_from_freighter(0,items[1],captain))
game.free()
game = preload("res://scenes/game/game.tscn").instantiate()
add_child(game)
await settle()
inv = game.player.get_node("ShipInventory")
assert(inv.get_cargo_capacity() == 20 and captain.expedition.freighter_storage.size() == 2)
game.get_node("PlanetExpeditions").open_freighter()
assert(inv.retrieve_from_freighter(0,items[1],captain))
game.get_node("PlanetExpeditions").screen.closed.emit()
game.free()
GameState.start_new_run()
assert(GameState.captain.expedition.freighter_storage.is_empty())
print("FREIGHTER STORAGE PASS: 5 starting cargo cells, locked loot/drop, row costs/limits, construction, bidirectional transfers, full cargo, stale buttons, resource serialization, system persistence, new run reset")
get_tree().quit()