extends SceneTree const FakeClient = preload("res://net_client_fake.gd") const GameScene = preload("res://game_scene.gd") const SkillTable = preload("res://ui/skill_table.gd") const Quickbar = preload("res://ui/quickbar.gd") var _fail := 0 func _ck(condition: bool, message: String) -> void: if not condition: _fail += 1 printerr("FAIL: " + message) func _init() -> void: await _run() if _fail == 0: print("PASS: test_full_skill_flow (fixture + scene + action packet order)") quit(0) else: printerr("%d check(s) failed" % _fail) quit(1) func _run() -> void: var assets := AssetRoot.path() var client := FakeClient.new() get_root().add_child(client) var table := SkillTable.new() var loaded := false for lang in ["en", "common"]: if table.load_file(assets.path_join("locale/locale/%s/skilldesc.txt" % lang)): loaded = true break _ck(loaded, "skill table fixture loads") if not loaded: return client.entities[2000] = {"vid": 2000, "name": "Wolf", "race": 101, "kind": 2, "ch_type": 2, "pos": Vector3(1, 0, 0), "pos_cm": Vector3(100, 0, 0), "hp": 100, "max_hp": 100, "dead": false} client.target_vid = 2000 var host := CanvasLayer.new() get_root().add_child(host) var qb := Quickbar.new() get_root().add_child(qb) qb.setup(client, table, host, func() -> Node: return null, assets) qb.assign(0, "skill", 1, false) qb.activate(0) _ck(client.calls.size() >= 2, "skill activation reaches fake client") if client.calls.size() >= 2: _ck(client.calls[0][0] == "cast_skill" and client.calls[1][0] == "use_skill", "40250 order: FUNC_SKILL precedes CG_USE_SKILL") _ck(client.calls[1][1] == 1 and client.calls[1][2] == 2000, "skill intent carries skill id and resolved target") var gs := GameScene.new() get_root().add_child(gs) await gs.setup(client, "", "no_such_map") await process_frame _ck(gs.net_play != null and gs.player != null, "GameScene full flow is assembled") _ck(gs.quickbar == null, "empty asset setup does not create a duplicate skill UI") gs.queue_free() qb.queue_free() host.queue_free() client.queue_free() await process_frame