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 str(node.get_meta("transfer_action",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() screen._content.find_child("UnlockCargo",true,false).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()