Randoloot/tests/ships/captain_ship_drawer_test.gd
2026-10-12 22:16:09 +02:00

132 lines
6.3 KiB
GDScript

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")
var equipment := drawer.get_node("Scroll/Contents/ShipEquipmentPanel")
assert(captain.get_parent() != equipment.get_parent())
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.parts = ShipInventory.AMMUNITION_CRAFT_PARTS_COST + ShipInventory.MISSILE_CRAFT_PARTS_COST
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, 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()