extends Node ## Boot the client windowed, capture a few screens, and quit. ## ## SHOT_DIR=/tmp/shots godot --path . res://tools/screenshot.tscn ## ## This exists because UI is the one part of the game the rest of the tooling ## cannot check. `check.sh` proves it parses, the suite proves the theme ## resolves, the smoke test proves nothing errors -- and all three passed ## while the entire interface rendered unstyled, because Godot's theme ## inheritance breaks at the first non-Control parent and nothing had ever ## looked at the screen. ## ## Needs a real display, so it is not part of any automated gate. Run it after ## touching anything under src/ui/ and open the files. const GAME := preload("res://src/game.tscn") ## Frame numbers, not seconds: the point is a deterministic sequence, and a ## windowed client at 60fps gets there in about four seconds. const AT_MENU := 30 const ENTER_GAME := 34 const AT_GAME := 200 const OPEN_MENU := 210 const AT_INGAME_MENU := 240 const OPEN_SETTINGS := 250 const AT_SETTINGS := 280 const OPEN_CREDITS := 290 const AT_CREDITS := 320 const DONE := 330 var _frame: int = 0 var _game: Node = null var _menu: Control = null var _dir: String = "user://" func _ready() -> void: GameOpts.parse() Engine.physics_ticks_per_second = SimConfig.TICK_RATE Settings.load_and_apply() var from_env := OS.get_environment("SHOT_DIR") if not from_env.is_empty(): _dir = from_env get_window().size = Vector2i(1280, 720) _menu = preload("res://src/ui/main_menu.gd").new() add_child(_menu) func _process(_delta: float) -> void: _frame += 1 match _frame: AT_MENU: _grab("menu") ENTER_GAME: _menu.queue_free() Net.host(27455) Net.start_local_client() _game = GAME.instantiate() add_child(_game) AT_GAME: _grab("game") OPEN_MENU: _game.get_node("GameMenu").open() AT_INGAME_MENU: _grab("menu_ingame") OPEN_SETTINGS: _game.get_node("GameMenu").close() _game.get_node("SettingsScreen").open() AT_SETTINGS: _grab("settings") OPEN_CREDITS: _game.get_node("SettingsScreen").visible = false _game.get_node("CreditsScreen").open() AT_CREDITS: _grab("credits") DONE: Net.shutdown() get_tree().quit(0) func _grab(shot_name: String) -> void: var path := "%s/shot_%s.png" % [_dir, shot_name] var err := get_viewport().get_texture().get_image().save_png(path) if err != OK: printerr("could not write %s (error %d)" % [path, err]) return print("saved ", path)