extends SceneTree ## Boot straight into the game and save a viewport screenshot (needs a window, not --headless): ## Godot --path . --script tests/screenshot.gd -- car=datto_120y mode=cruise out=shot.png frames=90 throttle=1 ## Defaults: first car, cruise, screenshot.png, 90 physics frames, throttle held. func _initialize() -> void: _run() func _run() -> void: var opts := {} for a in OS.get_cmdline_user_args(): var kv := a.split("=") if kv.size() == 2: opts[kv[0]] = kv[1] var cars := Registry.cars() Game.car_path = cars.get(opts.get("car", ""), cars.values()[0]) var levels := Registry.levels() Game.level_path = levels.get(opts.get("level", ""), levels.values()[0]) Game.mode = opts.get("mode", "cruise") Game.junction = {} if opts.has("jct"): # jct= within the chosen level's junction events var jcts := Registry.junctions().filter(func(j): return j.level_path == Game.level_path) Game.junction = jcts[int(opts["jct"])].data Game.mode = "junction" var game: Game = (load("res://src/game.tscn") as PackedScene).instantiate() root.add_child(game) await process_frame if opts.get("throttle", "1") == "1": Input.action_press("throttle") for i in int(opts.get("frames", "90")): await physics_frame if opts.get("cam", "") == "front": game.set_process(false) # stop the chase cam fighting us game.cam.global_position = game.car.global_position + game.car.global_basis * Vector3(2.6, 1.6, -6.5) game.cam.look_at(game.car.global_position + Vector3.UP * 0.4) await process_frame await process_frame elif opts.get("cam", "") == "top": game.set_process(false) var alt := float(opts.get("alt", "150")) game.cam.far = 4000.0 game.cam.global_position = game.car.global_position + Vector3(0, alt, 0) game.cam.look_at(game.car.global_position, Vector3.FORWARD) await process_frame await process_frame root.get_texture().get_image().save_png("res://" + opts.get("out", "screenshot.png")) print("screenshot saved") quit(0)