extends Node const GAME := preload("res://scenes/game/game.tscn") func _ready() -> void: get_tree().create_timer(10.0).timeout.connect(func() -> void: push_error("CAPTAIN_SHIP_DRAWER_TEST: timed out") get_tree().quit(1) ) GameState.start_new_run() var game := GAME.instantiate() as Node2D add_child(game) await get_tree().process_frame for enemy in get_tree().get_nodes_in_group("enemies"): enemy.set_physics_process(false) var ship := game.get_node("PlayerShip") as CharacterBody2D ship.set_physics_process(false) ship.get_node("WeaponController").set_physics_process(false) var hud := game.get_node("HUD") var root := hud.get_node("HUDRoot") as Control var drawer := root.get_node("ShipDrawer") as Control var toggle := root.get_node("ShipToggle") as Button var captain := root.get_node("CaptainPanel") assert(captain._collapsed and not captain.get_node("Contents/Skills").visible) assert(not hud._debug_expanded and not hud.debug_info.visible) assert(not hud._sidebar_open and not drawer.visible) assert(not hud.inventory_panel.visible) toggle.pressed.emit() captain._toggle_collapsed() await get_tree().create_timer(0.3).timeout var equipment := drawer.get_node("Scroll/Contents/ShipEquipmentPanel") assert(captain.get_parent() != equipment.get_parent()) assert(drawer.scale.is_equal_approx(Vector2.ONE * 0.8)) assert(hud.inventory_panel.scale.is_equal_approx(Vector2.ONE * 0.8)) assert(captain.get_node("Contents/PortraitRow/AvatarFrame/CaptainAvatar").texture != null) assert(root.has_node("Cockpit")) var cockpit := root.get_node("Cockpit") as Control assert(cockpit.scale.is_equal_approx(Vector2.ONE * 0.85)) assert(cockpit.WEAPON_DISPLAY_ORDER == [0, 2, 1]) var old_position := ship.global_position ship.global_position = ship.get_viewport().get_canvas_transform().affine_inverse() * (cockpit.position + Vector2(60, 30)) cockpit._process(1.0) assert(is_equal_approx(cockpit.modulate.a, 0.18)) ship.global_position = old_position cockpit._process(1.0) assert(is_equal_approx(cockpit.modulate.a, 1.0)) var crafting := equipment.get_node("Contents/CraftingPanel") assert(not crafting._details.visible) var closed_height: float = drawer.size.y crafting._toggle.pressed.emit() await get_tree().process_frame await get_tree().process_frame assert(crafting._details.visible and drawer.size.y > closed_height) GameState.captain.minerals.merge({"titanium": 1, "sulfur": 2, "iron": 1, "uranium": 1}, true) GameState.captain.emit_changed() var inv: ShipInventory = ship.get_node("ShipInventory") var ammo_before := inv.ammunition var missiles_before := inv.missile_ammunition assert(not crafting._ammo.disabled and not crafting._missile.disabled) crafting._ammo.pressed.emit() assert(inv.ammunition == ammo_before + ShipInventory.AMMUNITION_CRAFT_AMOUNT) crafting._missile.pressed.emit() assert(inv.missile_ammunition == missiles_before + 1) assert(GameState.captain.parts == 0 and crafting._ammo.disabled and crafting._missile.disabled) crafting._toggle.pressed.emit() await get_tree().process_frame await get_tree().process_frame assert(not crafting._details.visible and is_equal_approx(drawer.size.y, closed_height)) var expanded_height: float = captain.size.y captain.get_node("Contents/Header/CollapseCaptain").pressed.emit() await get_tree().process_frame await get_tree().process_frame assert(captain.size.y < expanded_height) assert(root.get_node("DebugToggle").position.y >= captain.position.y + captain.size.y) captain.get_node("Contents/Header/CollapseCaptain").pressed.emit() await get_tree().process_frame await get_tree().process_frame assert(captain.get_node("Contents/Skills").visible) assert(drawer.visible) toggle.pressed.emit() await get_tree().create_timer(0.3).timeout assert(not drawer.visible) toggle.pressed.emit() await get_tree().create_timer(0.3).timeout assert(drawer.visible and is_equal_approx(drawer.position.x + drawer.size.x * drawer.scale.x, root.size.x - 8.0)) GameState.captain.learning_points = 1 GameState.captain.emit_changed() captain.get_node("Contents/Skills/gunner/Train_gunner").pressed.emit() assert(GameState.captain.get_skill_rank("gunner") == 1) equipment.get_node("Contents/InventoryButton").pressed.emit() await get_tree().create_timer(0.3).timeout var inventory_panel: Control = hud.get("inventory_panel") assert(inventory_panel.visible and inventory_panel.get("_drawer_open")) var inventory := ship.get_node("ShipInventory") as ShipInventory var item := ItemInstance.new() item.definition = preload("res://resources/items/engine_extension.tres") assert(inventory.add_item(item)) assert(inventory.move_item("cargo", inventory.cargo.find(item), "module", 2)) assert(ship.get("max_speed") > ship.get("base_max_speed")) var equipment_slot := equipment.get_node("Contents/EquipmentLayout/Module3") assert(is_equal_approx(equipment_slot.size.x, equipment_slot.size.y)) assert(equipment_slot.get_node("ItemIcon").texture == item.definition.icon) assert(item.definition.icon != null) toggle.pressed.emit() await get_tree().create_timer(0.3).timeout assert(not drawer.visible and not inventory_panel.visible) toggle.pressed.emit() await get_tree().create_timer(0.3).timeout assert(drawer.visible and not inventory_panel.visible) var original_size := root.size root.size = Vector2(root.size.x, 400) hud.call("_layout_sidebar") await get_tree().process_frame await get_tree().process_frame var scroll := drawer.get_node("Scroll") as ScrollContainer assert(scroll.get_v_scroll_bar().visible) root.size = original_size hud.call("_layout_sidebar") # The same autoload state is reused by death and level scene reloads. captain._toggle_collapsed() hud._toggle_debug() crafting._toggle_expanded() var saved_state := GameState.hud_panel_state.duplicate() var restored := GAME.instantiate() as Node2D add_child(restored) await get_tree().process_frame await get_tree().process_frame var restored_hud := restored.get_node("HUD") var restored_captain := restored.get_node("HUD/HUDRoot/CaptainPanel") assert(restored_captain._collapsed == saved_state["captain_collapsed"]) assert(restored_hud._debug_expanded == saved_state["debug_expanded"]) assert(restored_hud._sidebar_open == saved_state["ship_open"]) var restored_crafting := restored.get_node("HUD/HUDRoot/ShipDrawer/Scroll/Contents/ShipEquipmentPanel/Contents/CraftingPanel") assert(restored_crafting._expanded == saved_state["crafting_expanded"]) assert(not restored_captain.has_node("Contents/Critical")) var layout := equipment.get_node("Contents/EquipmentLayout") assert(layout.get_node("Weapon1").position.x < layout.get_node("Weapon3").position.x) assert(layout.get_node("Weapon3").position.x < layout.get_node("Weapon2").position.x) print("CAPTAIN_SHIP_DRAWER_TEST: PASS (separate captain, portrait, collapse, debug position, cockpit, ship slide, skills, inventory, equipment stats, small viewport)") get_tree().quit()