# guild_mark_test —— 会徽下载:guild_ui 会徽图 + app_flow 触发 / 冷却 headless 自检。 # godot --headless --path project --script guild_mark_test.gd extends SceneTree const GuildUI = preload("res://ui/guild_ui.gd") const AppFlow = preload("res://app_flow.gd") class FakeClient extends Node: signal guild_changed() signal guild_marks_ready(mark_count: int) signal guild_mark_updated(guild_id: int, img_idx: int) signal guild_mark_uploaded(ok: bool) signal char_list(list: Array) signal entered_game() signal disconnected(reason: String) signal login_failed(reason: String) var guild := {"in_guild": true, "id": 88, "name": "Wolves", "level": 9, "member_count": 3, "max_member_count": 32, "gold": 1000} var members := [] var grades := [] var mark_img: Image = null var dl_calls := [] var up_calls := [] var mark_srv := {"host": "", "port": 0} var connects := [] var selects := [] func is_in_game() -> bool: return true func get_guild() -> Dictionary: return guild func get_guild_members() -> Array: return members func get_guild_grades() -> Array: return grades func get_guild_mark_image(_gid: int) -> Image: return mark_img func get_mark_server() -> Dictionary: return mark_srv func download_guild_marks(host: String, port: int) -> bool: dl_calls.append([host, port]); return true func upload_guild_mark(host: String, port: int, gid: int, img: Image) -> bool: up_calls.append([host, port, gid, img != null]); return true func connect_to_server(ah, ap, gh, gp, id, pw) -> void: connects.append([ah, ap, gh, gp, id, pw]) func select_character(i) -> void: selects.append(i) var _fail := 0 func _ck(c: bool, m: String) -> void: if not c: _fail += 1 printerr("FAIL: " + m) func _init() -> void: _run() if _fail == 0: print("PASS: guild_mark_test") quit(0) else: printerr("%d check(s) failed" % _fail) quit(1) func _btn(root: Node, label: String) -> Button: for b in root.find_children("*", "Button", true, false): if String(b.text) == label: return b return null func _make_mark() -> Image: var b := PackedByteArray() b.resize(16 * 12 * 4) for i in range(0, b.size(), 4): b[i] = 0x33; b[i + 1] = 0x99; b[i + 2] = 0xCC; b[i + 3] = 0xFF return Image.create_from_data(16, 12, false, Image.FORMAT_RGBA8, b) func _run() -> void: var canvas := CanvasLayer.new() get_root().add_child(canvas) var fc := FakeClient.new() get_root().add_child(fc) # --- guild_ui 会徽图 --- var gu: Node = GuildUI.new() get_root().add_child(gu) gu.setup(fc, canvas) gu.toggle() _ck(gu.is_open(), "公会窗打开") _ck(gu._mark != null and not gu._mark.visible, "无会徽图 -> TextureRect 隐藏") # 会徽下载完成 -> 刷新出图 fc.mark_img = _make_mark() fc.guild_marks_ready.emit(2) _ck(gu._mark.visible and gu._mark.texture != null, "guild_marks_ready -> 会徽显示") _ck(gu._mark.texture.get_width() == 16 and gu._mark.texture.get_height() == 12, "会徽 16x12") # --- 会徽上传按钮 --- # 没配 mark server -> 无按钮 gu._set_tab(0) _ck(_btn(gu._pages[0], "上传会徽") == null, "未配 mark server -> 无上传按钮") # 配上 server + 图源 -> 出按钮 fc.mark_srv = {"host": "1.2.3.4", "port": 11002} gu.mark_image_provider = _make_mark gu._set_tab(0) var ub := _btn(gu._pages[0], "上传会徽") _ck(ub != null, "配好后 -> 有上传按钮") ub.pressed.emit() _ck(fc.up_calls == [["1.2.3.4", 11002, 88, true]], "上传 -> upload_guild_mark(host, port, gid, img)") _ck(gu._upload_status.text.contains("上传中"), "上传中状态") fc.guild_mark_uploaded.emit(true) _ck(gu._upload_status.text.contains("已上传"), "guild_mark_uploaded(true) -> 状态更新") # 无公会 -> 收起会徽 fc.guild = {"in_guild": false} fc.guild_changed.emit() _ck(not gu._mark.visible, "离开公会 -> 会徽隐藏") # --- app_flow 触发下载 + 冷却 --- var fc2 := FakeClient.new() var af: Node = AppFlow.new() af.build_game_scene = false get_root().add_child(af) af.start("", fc2) # mark_port 默认 0 -> 不下载 fc2.entered_game.emit() _ck(fc2.dl_calls.is_empty(), "mark_port=0 -> 不下载会徽") # 配上 mark_port 再进游戏 af.serverinfo._servers[0]["mark_port"] = 11002 af._start_guild_mark_download() _ck(fc2.dl_calls.size() == 1 and fc2.dl_calls[0][1] == 11002, "配置后 -> download_guild_marks(host, 11002)") # guild_mark_updated:冷却过后重下一次 af._mark_redl_after = 0 fc2.guild_mark_updated.emit(88, 1) _ck(fc2.dl_calls.size() == 2, "guild_mark_updated -> 重新下载") # 立刻再来一次 -> 冷却内不重下 fc2.guild_mark_updated.emit(88, 1) _ck(fc2.dl_calls.size() == 2, "1s 冷却内 -> 不重复下载")