diff --git a/src/game/engine/scenes/tests/viewport_proof.gd b/src/game/engine/scenes/tests/viewport_proof.gd new file mode 100644 index 00000000..b538caf6 --- /dev/null +++ b/src/game/engine/scenes/tests/viewport_proof.gd @@ -0,0 +1,143 @@ +extends Node2D +## Viewport Window Manager Proof Scene. +## Generates a hex map, instantiates the WorldMap scene, then exercises +## ViewportWindowManager: splits the panel horizontally and opens a floating +## window. Self-capturing: saves screenshot and quits. + +const MapGeneratorScript: GDScript = preload( + "res://engine/src/generation/map_generator.gd" +) +const GameMapScript: GDScript = preload("res://engine/src/map/game_map.gd") +const PlayerScript: GDScript = preload("res://engine/src/entities/player.gd") +const WorldMapScene: PackedScene = preload( + "res://engine/scenes/world_map/world_map.tscn" +) + +const OUTPUT_DIR: String = "user://screenshots" + +var _captured: bool = false +var _screenshot_name: String = "viewport_proof" + + +func _ready() -> void: + RenderingServer.set_default_clear_color(Color(0.06, 0.05, 0.04)) + get_viewport().size = Vector2i(1920, 1080) + DisplayServer.window_set_size(Vector2i(1920, 1080)) + + var env_name: String = OS.get_environment("SCREENSHOT_NAME") + if not env_name.is_empty(): + _screenshot_name = env_name + + DataLoader.load_theme("age-of-dwarves") + + await get_tree().process_frame + + _setup_game_state() + _add_world_map() + + # Wait 2 frames for the WorldMap scene to fully initialize + await get_tree().process_frame + await get_tree().process_frame + + _exercise_viewport_manager() + + # Wait 1 more frame for viewport changes to render + await get_tree().process_frame + + # Additional frames to let split panels and floating window settle + for _i: int in range(8): + await get_tree().process_frame + + _capture_and_quit() + + +func _setup_game_state() -> void: + print("=== Viewport Proof ===") + + var settings: Dictionary = { + "map_size": "duel", + "map_type": "continents", + "seed": 42, + "num_players": 2, + "map_wrap": "cylinder", + } + + GameState.initialize_game(settings) + GameState.map_seed = 42 + + var generator: RefCounted = MapGeneratorScript.new() + var game_map: GameMapScript = generator.generate(settings) + + var primary: Dictionary = GameState.get_primary_layer() + primary["map"] = game_map + + # Create a player so WorldMap can render + var player: RefCounted = GameState.create_player("Proof Player", "dwarf", true) + print( + "Map: %dx%d, duel, seed 42 | Player: %s (index %d)" + % [game_map.width, game_map.height, player.player_name, player.index] + ) + + +func _add_world_map() -> void: + var world_map: Node2D = WorldMapScene.instantiate() + world_map.name = "WorldMap" + add_child(world_map) + print("WorldMap scene instantiated") + + +func _exercise_viewport_manager() -> void: + var world_map: Node2D = get_node_or_null("WorldMap") + if world_map == null: + push_error("ViewportProof: WorldMap node not found") + return + + var vwm: Control = world_map.get_node_or_null("ViewportWindowManager") + if vwm == null: + push_error("ViewportProof: ViewportWindowManager not found") + return + + # Exercise split panel: make it visible and split horizontally + var split_container: Control = vwm.get_split_panel_container() + split_container.visible = true + split_container.split_focused_horizontal() + print("Split panel: split_focused_horizontal() called") + + # Exercise floating window: open one at the map center + vwm.open_floating_window(Vector2(400, 300), 1) + print("Floating window: opened at (400, 300), layer_mask=1") + + +func _capture_and_quit() -> void: + if _captured: + return + _captured = true + + DirAccess.make_dir_recursive_absolute( + ProjectSettings.globalize_path(OUTPUT_DIR) + ) + var image: Image = get_viewport().get_texture().get_image() + if image == null: + push_error("ViewportProof: Failed to get viewport image") + get_tree().quit(1) + return + + var timestamp: String = ( + Time.get_datetime_string_from_system() + .replace(":", "-") + .replace("T", "_") + ) + var rel_path: String = "%s/%s_%s.png" % [OUTPUT_DIR, _screenshot_name, timestamp] + var abs_path: String = ProjectSettings.globalize_path(rel_path) + var err: Error = image.save_png(abs_path) + + if err == OK: + print("SCREENSHOT_PATH:%s" % abs_path) + print( + "Screenshot: %dx%d saved to %s" + % [image.get_width(), image.get_height(), abs_path] + ) + else: + push_error("ViewportProof: Save failed: %s" % error_string(err)) + + get_tree().quit() diff --git a/src/game/engine/scenes/tests/viewport_proof.gd.uid b/src/game/engine/scenes/tests/viewport_proof.gd.uid new file mode 100644 index 00000000..14e96e50 --- /dev/null +++ b/src/game/engine/scenes/tests/viewport_proof.gd.uid @@ -0,0 +1 @@ +uid://x1dj50wpjio0 diff --git a/src/game/engine/scenes/tests/viewport_proof.tscn b/src/game/engine/scenes/tests/viewport_proof.tscn new file mode 100644 index 00000000..609fb074 --- /dev/null +++ b/src/game/engine/scenes/tests/viewport_proof.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://vp7proof1"] + +[ext_resource type="Script" path="res://engine/scenes/tests/viewport_proof.gd" id="1_script"] + +[node name="ViewportProof" type="Node2D"] +script = ExtResource("1_script")