160 lines
7.1 KiB
GDScript
160 lines
7.1 KiB
GDScript
extends Node
|
|
const GEAR := preload("res://scripts/planets/captain_equipment.gd")
|
|
var screen: Control
|
|
|
|
func settle() -> void:
|
|
for frame in 5:
|
|
await get_tree().process_frame
|
|
await RenderingServer.frame_post_draw
|
|
|
|
func capture(name: String) -> void:
|
|
await settle()
|
|
get_viewport().get_texture().get_image().save_png("res://artifacts/freighter_interior_%s.png" % name)
|
|
|
|
func click_room(id: String) -> void:
|
|
var section: Dictionary = screen.deck.room(id)
|
|
var point: Vector2 = screen.deck.design_to_local((section.rect as Rect2).get_center())
|
|
assert(screen.deck.section_at(point) == id)
|
|
var event := InputEventMouseButton.new()
|
|
event.button_index = MOUSE_BUTTON_LEFT
|
|
event.pressed = true
|
|
event.position = point
|
|
screen.deck._gui_input(event)
|
|
assert(screen._tab == id)
|
|
|
|
func button_starting(text: String) -> Button:
|
|
for node in screen._content.find_children("*","Button",true,false):
|
|
if node.text.begins_with(text):
|
|
return node as Button
|
|
return null
|
|
|
|
func _ready() -> void:
|
|
GameState.system_seed = 8428159
|
|
GameState.selected_ship_path = "res://assets/Ships/player/bastion.png"
|
|
GameState.captain.parts = 100
|
|
GameState.captain.credits = 2000
|
|
for key in ["silicon","copper","nickel","iron","tungsten","titanium"]:
|
|
GameState.captain.minerals[key] = 500
|
|
GameState.captain.expedition.lander_hp = 63
|
|
GameState.captain.expedition.freighter_rooms.clear()
|
|
var game := preload("res://scenes/game/game.tscn").instantiate()
|
|
add_child(game)
|
|
await settle()
|
|
var manager := game.get_node("PlanetExpeditions")
|
|
assert(manager.freighter.z_index < game.player.z_index)
|
|
var music: AudioStreamPlayer = game.get_node("GameMusic")
|
|
assert(music.playing and not music.stream_paused)
|
|
var music_before := music.get_playback_position()
|
|
manager.open_freighter()
|
|
await get_tree().create_timer(0.18,true).timeout
|
|
assert(music.can_process() and music.playing and not music.stream_paused)
|
|
assert(music.get_playback_position() > music_before,"Music must continue from its current position during docking")
|
|
screen = manager.screen
|
|
assert(screen.scene_file_path == "res://scenes/planets/freighter_interior.tscn")
|
|
assert(get_tree().paused and game.player.is_docked)
|
|
assert(screen.deck.ship_texture == game.player.get_node("Sprite2D").texture)
|
|
assert(screen.deck.ship_name == "Bastion")
|
|
assert(screen.deck.ROOMS.size() == 11)
|
|
assert(screen.deck._art.get_image().has_mipmaps())
|
|
var active := 0
|
|
var upper_locked := 0
|
|
var lower_locked := 0
|
|
for section in screen.deck.ROOMS:
|
|
active += int(section.active)
|
|
upper_locked += int(str(section.id).begins_with("expansion"))
|
|
lower_locked += int(str(section.id).begins_with("cabin"))
|
|
var point: Vector2 = screen.deck.design_to_local((section.rect as Rect2).get_center())
|
|
assert(screen.deck.section_at(point) == section.id)
|
|
assert(active == 2 and upper_locked == 3 and lower_locked == 5)
|
|
assert(not screen._drawer.visible)
|
|
var before: float = screen.deck._time
|
|
await capture("overview")
|
|
assert(screen.deck._time > before,"Deck lights must animate while space is paused")
|
|
click_room("workshop")
|
|
await capture("workshop")
|
|
assert(screen._drawer.get_global_rect().end.x <= get_viewport().get_visible_rect().size.x)
|
|
assert(screen._drawer.get_global_rect().end.y <= get_viewport().get_visible_rect().size.y)
|
|
var build := button_starting("WYTWÓRZ I ZAŁÓŻ")
|
|
assert(build != null and not build.disabled)
|
|
build.pressed.emit()
|
|
assert(GEAR.level(GameState.captain,"breathing") == 2)
|
|
assert(GameState.captain.parts == 90)
|
|
screen._close_section()
|
|
click_room("expansion_2")
|
|
await capture("renovation")
|
|
assert(button_starting("WYTWÓRZ") == null)
|
|
click_room("cabin_3")
|
|
assert(screen._drawer_title.text == "KAJUTA 03")
|
|
var escape := InputEventKey.new()
|
|
escape.pressed = true
|
|
escape.keycode = KEY_ESCAPE
|
|
screen._input(escape)
|
|
assert(not screen._drawer.visible and get_tree().paused)
|
|
click_room("hangar")
|
|
await capture("hangar")
|
|
var repair := button_starting("NAPRAW DO 100")
|
|
assert(repair != null and not repair.disabled)
|
|
repair.pressed.emit()
|
|
assert(GameState.captain.expedition.lander_hp == 100)
|
|
assert(GameState.captain.parts == 53)
|
|
# Full cargo must not lose the expedition's recovered module.
|
|
var inventory: ShipInventory = game.player.get_node("ShipInventory")
|
|
var module := preload("res://scripts/items/item_generator.gd").generate_for_definition(preload("res://resources/items/reinforced_shield.tres"),3)
|
|
for index in inventory.cargo.size(): inventory.cargo[index] = module
|
|
GameState.captain.expedition.delivered_modules.append(module)
|
|
screen._refresh()
|
|
button_starting("ODBIERZ").pressed.emit()
|
|
assert(GameState.captain.expedition.delivered_modules.size() == 1)
|
|
inventory.cargo[0] = null
|
|
button_starting("ODBIERZ").pressed.emit()
|
|
assert(GameState.captain.expedition.delivered_modules.is_empty())
|
|
var credits_before: int = GameState.captain.credits
|
|
var parts_before: float = GameState.captain.parts
|
|
var minerals_before: Dictionary = GameState.captain.minerals.duplicate()
|
|
assert(screen.deck.room_nodes.size() == 8)
|
|
for id in ["expansion_1","expansion_2","expansion_3","cabin_1","cabin_2","cabin_3","cabin_4","cabin_5"]:
|
|
click_room(id)
|
|
assert(not screen.deck.is_built(id))
|
|
var construct := button_starting("ZBUDUJ")
|
|
assert(construct != null)
|
|
construct.pressed.emit()
|
|
assert(screen.deck.is_built(id))
|
|
assert(screen.deck.room_nodes[id].built)
|
|
assert(screen.deck.room(id).status == "ZBUDOWANO")
|
|
assert(button_starting("ZBUDUJ") == null)
|
|
screen._construct_room(id) # Repeated requests must be harmless.
|
|
assert(GameState.captain.expedition.freighter_rooms.size() == 8)
|
|
assert(GameState.captain.credits == credits_before)
|
|
assert(GameState.captain.parts == parts_before)
|
|
assert(GameState.captain.minerals == minerals_before)
|
|
# Room state is an exported resource field, ready for game save serialization.
|
|
assert(ResourceSaver.save(GameState.captain.expedition,"user://freighter_rooms_test.tres") == OK)
|
|
var restored: Resource = ResourceLoader.load("user://freighter_rooms_test.tres","",ResourceLoader.CACHE_MODE_IGNORE)
|
|
assert(restored.freighter_rooms == GameState.captain.expedition.freighter_rooms)
|
|
DirAccess.remove_absolute("user://freighter_rooms_test.tres")
|
|
screen._close_section()
|
|
await capture("built")
|
|
var leave := InputEventKey.new()
|
|
leave.pressed = true
|
|
leave.keycode = KEY_L
|
|
screen._input(leave)
|
|
assert(not get_tree().paused and not game.player.is_docked)
|
|
manager.open_freighter()
|
|
screen = manager.screen
|
|
assert(screen.deck.room_nodes.size() == 8)
|
|
for id in GameState.captain.expedition.freighter_rooms:
|
|
assert(screen.deck.is_built(id) and screen.deck.room_nodes[id].built)
|
|
screen.closed.emit()
|
|
game.queue_free()
|
|
await get_tree().process_frame
|
|
# The scene can also be opened directly in the editor without a live inventory.
|
|
GameState.selected_ship_path = "res://assets/Ships/player/zmija.png"
|
|
screen = preload("res://scenes/planets/freighter_interior.tscn").instantiate()
|
|
add_child(screen)
|
|
await capture("second_ship")
|
|
assert(screen.deck.ship_texture.resource_path == GameState.selected_ship_path)
|
|
screen.queue_free()
|
|
await get_tree().process_frame
|
|
print("FREIGHTER INTERIOR PASS: 8 free replaceable rooms, duplicate construction, resource serialization, redocking persistence, real ship, workshop, repair, cargo and ESC/L")
|
|
get_tree().quit()
|