extends Node ## Platform smoke test of an exported build (G2): starts an offline match, plays into the ## combat at 4x, photographs planning, combat, grotto and Ancient, writes a short report and ## quits. It only drives the normal game; nothing here changes rules or presentation. ## Run: -- --lune-smoke[=] (default folder: user://smoke) var main: Node var folder: String = "user://smoke/" var report: Dictionary = {} func setup(entry: Node, target: String) -> void: main = entry if not target.is_empty(): folder = target if target.ends_with("/") else target + "/" func _ready() -> void: call_deferred("run") func shot(label: String) -> void: await RenderingServer.frame_post_draw DirAccess.make_dir_recursive_absolute(folder if folder.begins_with("/") or folder.contains(":") else ProjectSettings.globalize_path(folder)) var path: String = folder + label + ".png" get_viewport().get_texture().get_image().save_png(path) print("LUNE_SMOKE_SHOT ", ProjectSettings.globalize_path(path)) func wait(seconds: float) -> void: await get_tree().create_timer(seconds).timeout func run() -> void: var started: int = Time.get_ticks_msec() await wait(1.5) await shot("00-menue") main.start_match({"seed": 7}) await wait(2.0) var game: Node3D = main.game await shot("01-planung") game.hud._starter.pressed.emit() game._on_ready() game.speed_index = 2 await wait(8.0) game.focus_lane("mid", true) await wait(1.5) await shot("02-kampf") var fps_combat: float = Engine.get_frames_per_second() game.focus_grotto(true) await wait(1.5) await shot("03-grotte") game.focus_base(true) await wait(1.5) await shot("04-ancient") report = {"engine": Engine.get_version_info().string, "os": OS.get_name(), "os_version": OS.get_version(), "architecture": Engine.get_architecture_name(), "renderer": RenderingServer.get_current_rendering_method(), "driver": RenderingServer.get_current_rendering_driver_name(), "adapter": RenderingServer.get_video_adapter_name(), "window": get_window().size, "fps_in_combat": fps_combat, "fps_at_end": Engine.get_frames_per_second(), "missing_assets": AssetLibrary.missing, "boss_model": AssetLibrary.has_model("schlundkrone"), "tower_views": game.world.tower_views.size(), "ancient_views": game.world.ancient_views.size(), "grotto_state": game.world.grotto_view.state_name(), "phase": game.match_state.phase, "combat_seconds": game.match_state.combat.elapsed if game.match_state.combat != null else 0.0, "seconds": (Time.get_ticks_msec() - started) / 1000.0} var ok: bool = AssetLibrary.missing.is_empty() and bool(report.boss_model) and int(report.tower_views) == 16 and int(report.ancient_views) == 2 report["result"] = "PASS" if ok else "FAIL" var file := FileAccess.open(folder + "report.json", FileAccess.WRITE) if file != null: file.store_string(JSON.stringify(report, "\t")) file.close() print("LUNE_SMOKE_%s %s" % [report.result, JSON.stringify(report)]) get_tree().quit(0 if ok else 1)