# name_color_test —— §8.8 头顶名字色 CInstanceBase::GetNameColorIndex / GetNameColor 1:1: # NAMECOLOR_* 序号、GetNameColorIndex 逐分支、SetEmpireNameMode 调色板重写、 # GetIndexedNameColor 越界回退,以及 introloading.__RegisterColor + colorInfo.py 的 RGB。 # godot --headless --path project --script name_color_test.gd # 退出码 0 = 全过。 extends SceneTree const NameColor = preload("res://name_color.gd") const EntityRules = preload("res://entity_rules.gd") 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: name_color_test (§8.8 GetNameColorIndex / SetEmpireNameMode 1:1)") quit(0) else: printerr("%d check(s) failed" % _fail) quit(1) func _pc(vid: int, empire := 1, extra := {}) -> Dictionary: var d := {"vid": vid, "kind": EntityRules.KIND_PC, "empire": empire, "guild": 0, "alignment": 0, "pk_mode": 0, "state_flags": 0} for k in extra: d[k] = extra[k] return d func _ctx(extra := {}) -> Dictionary: var c := {"main_vid": 1, "duel_mode": 0, "duel_opponents": [], "pvp_pairs": [], "gvg_pairs": [], "party_vids": []} for k in extra: c[k] = extra[k] return c func _run() -> void: # --- 1. NAMECOLOR_* 序号(InstanceBase.h,EMPIRE_NUM = 4)------------------ _ck(NameColor.NAMECOLOR_MOB == 0, "NAMECOLOR_MOB == 0") _ck(NameColor.NAMECOLOR_NPC == 1, "NAMECOLOR_NPC == 1") _ck(NameColor.NAMECOLOR_PC == 2, "NAMECOLOR_PC == 2") _ck(NameColor.NAMECOLOR_NORMAL_MOB == 7, "NAMECOLOR_NORMAL_MOB == 7") _ck(NameColor.NAMECOLOR_NORMAL_NPC == 8, "NAMECOLOR_NORMAL_NPC == 8") _ck(NameColor.NAMECOLOR_NORMAL_PC == 9, "NAMECOLOR_NORMAL_PC == 9") _ck(NameColor.NAMECOLOR_EMPIRE_MOB == 14, "NAMECOLOR_EMPIRE_MOB == 14") _ck(NameColor.NAMECOLOR_EMPIRE_NPC == 15, "NAMECOLOR_EMPIRE_NPC == 15") _ck(NameColor.NAMECOLOR_EMPIRE_PC == 16, "NAMECOLOR_EMPIRE_PC == 16") _ck(NameColor.NAMECOLOR_FUNC == 21, "NAMECOLOR_FUNC == 21") _ck(NameColor.NAMECOLOR_PK == 22, "NAMECOLOR_PK == 22") _ck(NameColor.NAMECOLOR_PVP == 23, "NAMECOLOR_PVP == 23") _ck(NameColor.NAMECOLOR_PARTY == 24, "NAMECOLOR_PARTY == 24") _ck(NameColor.NAMECOLOR_WARP == 25, "NAMECOLOR_WARP == 25") _ck(NameColor.NAMECOLOR_WAYPOINT == 26, "NAMECOLOR_WAYPOINT == 26") _ck(NameColor.NAMECOLOR_NUM == 41, "NAMECOLOR_NUM == 41") # --- 2. 帝国名色模式关(默认):GetNameColorIndex 逐分支 -------------------- NameColor.set_empire_name_mode(false) _ck(not NameColor.is_empire_name_mode(), "default empire-name-mode OFF") var main := _pc(1, 1) # 普通 PC(同帝国、无关系)→ NAMECOLOR_PC + empire _ck(NameColor.name_color_index(_pc(2, 1), main, _ctx()) == NameColor.NAMECOLOR_PC + 1, "normal PC (same empire) -> NAMECOLOR_PC + empire(1)") _ck(NameColor.name_color_index(_pc(2, 3), _pc(1, 3), _ctx()) == NameColor.NAMECOLOR_PC + 3, "normal PC empire 3 (same-empire main) -> NAMECOLOR_PC + 3") # 关模式下 PC..PC+3 槽全解析成 NORMAL_PC(黄) _ck(NameColor.name_color(_pc(2, 1), main, _ctx()).is_equal_approx(Color8(255, 215, 76)), "empire-off: PC name colour == CHR_NAME_RGB_PC (255,215,76)") _ck(NameColor.name_color(_pc(2, 3), _pc(1, 3), _ctx()).is_equal_approx(Color8(255, 215, 76)), "empire-off: empire-3 PC still yellow") # m_isKiller → PK(最先判,压过一切) var killer := _pc(2, 1, {"state_flags": EntityRules.STATE_KILLER}) _ck(NameColor.name_color_index(killer, main, _ctx()) == NameColor.NAMECOLOR_PK, "killer PC -> NAMECOLOR_PK") _ck(NameColor.name_color(killer, main, _ctx()).is_equal_approx(Color8(180, 100, 0)), "PK name colour == CHR_NAME_RGB_PK (180,100,0)") # 队伍成员 → PARTY _ck(NameColor.name_color_index(_pc(7, 1), main, _ctx({"party_vids": [7]})) == NameColor.NAMECOLOR_PARTY, "party member -> NAMECOLOR_PARTY") _ck(NameColor.name_color(_pc(7, 1), main, _ctx({"party_vids": [7]})).is_equal_approx(Color8(128, 192, 255)), "PARTY name colour == CHR_NAME_RGB_PARTY (128,192,255)") # 但 killer 优先于 party _ck(NameColor.name_color_index(_pc(7, 1, {"state_flags": EntityRules.STATE_KILLER}), main, _ctx({"party_vids": [7]})) == NameColor.NAMECOLOR_PK, "killer beats party") # 异帝国 → PVP _ck(NameColor.name_color_index(_pc(2, 2), _pc(1, 1), _ctx()) == NameColor.NAMECOLOR_PVP, "different empire -> NAMECOLOR_PVP") _ck(NameColor.name_color(_pc(2, 2), _pc(1, 1), _ctx()).is_equal_approx(Color8(238, 54, 223)), "PVP name colour == CHR_NAME_RGB_PVP (238,54,223)") # victim empire 0 视作同帝国(IsSameEmpire 短路 true)→ 不判 PVP _ck(NameColor.name_color_index(_pc(2, 0), _pc(1, 1), _ctx()) == NameColor.NAMECOLOR_PC + 0, "victim empire 0 -> same-empire, NAMECOLOR_PC + 0") # 同帝国 + PVP 对表命中 → PVP _ck(NameColor.name_color_index(_pc(2, 1), _pc(1, 1), _ctx({"pvp_pairs": [[1, 2]]})) == NameColor.NAMECOLOR_PVP, "same empire + pvp pair -> NAMECOLOR_PVP") # 同帝国 + 公会战对表命中(两边 guild 非 0)→ PVP _ck(NameColor.name_color_index(_pc(2, 1, {"guild": 20}), _pc(1, 1, {"guild": 10}), _ctx({"gvg_pairs": [[10, 20]]})) == NameColor.NAMECOLOR_PVP, "same empire + gvg pair -> NAMECOLOR_PVP") # guild 0 不触发公会战(防御性 !=0) _ck(NameColor.name_color_index(_pc(2, 1), _pc(1, 1), _ctx({"gvg_pairs": [[0, 0]]})) == NameColor.NAMECOLOR_PC + 1, "guild 0 gvg pair ignored") # 决斗:主角 DUEL_CANNOTATTACK → 恒 NAMECOLOR_PC + empire(即便异帝国) _ck(NameColor.name_color_index(_pc(2, 2), _pc(1, 1), _ctx({"duel_mode": EntityRules.DUEL_CANNOTATTACK})) == NameColor.NAMECOLOR_PC + 2, "main DUEL_CANNOTATTACK -> NAMECOLOR_PC + empire, no PVP") # 决斗:主角 DUEL_START + 对手命中 → PVP;未命中 → NAMECOLOR_PC + empire _ck(NameColor.name_color_index(_pc(2, 1), _pc(1, 1), _ctx({"duel_mode": EntityRules.DUEL_START, "duel_opponents": [2]})) == NameColor.NAMECOLOR_PVP, "main DUEL_START + opponent -> NAMECOLOR_PVP") _ck(NameColor.name_color_index(_pc(2, 1), _pc(1, 1), _ctx({"duel_mode": EntityRules.DUEL_START, "duel_opponents": [99]})) == NameColor.NAMECOLOR_PC + 1, "main DUEL_START, not an opponent -> NAMECOLOR_PC + empire") # 无主角实例(main_e 空)→ 跳过相对块,直接 party / NAMECOLOR_PC + empire _ck(NameColor.name_color_index(_pc(2, 2), {}, _ctx()) == NameColor.NAMECOLOR_PC + 2, "no main instance -> NAMECOLOR_PC + empire (no PVP)") # 自己(vid == main_vid)→ 跳过相对块 _ck(NameColor.name_color_index(_pc(1, 2), _pc(1, 2), _ctx({"main_vid": 1})) == NameColor.NAMECOLOR_PC + 2, "self -> NAMECOLOR_PC + empire") # NPC / MOB / poly / 未知 _ck(NameColor.name_color_index({"kind": EntityRules.KIND_NPC}, main, _ctx()) == NameColor.NAMECOLOR_NPC, "NPC -> NAMECOLOR_NPC") _ck(NameColor.name_color({"kind": EntityRules.KIND_NPC}, main, _ctx()).is_equal_approx(Color8(122, 231, 93)), "NPC name colour == CHR_NAME_RGB_NPC (122,231,93)") _ck(NameColor.name_color_index({"kind": EntityRules.KIND_MONSTER}, main, _ctx()) == NameColor.NAMECOLOR_MOB, "MONSTER -> NAMECOLOR_MOB") _ck(NameColor.name_color({"kind": EntityRules.KIND_MONSTER}, main, _ctx()).is_equal_approx(Color8(235, 22, 9)), "MOB name colour == CHR_NAME_RGB_MOB (235,22,9)") _ck(NameColor.name_color_index({"kind": 99, "poly_vnum": 101}, main, _ctx()) == NameColor.NAMECOLOR_MOB, "standalone poly -> NAMECOLOR_MOB") _ck(NameColor.name_color_index({"kind": 99}, main, _ctx()) == -1, "unknown kind -> -1 (fallthrough)") _ck(NameColor.name_color({"kind": 99}, main, _ctx()).is_equal_approx(Color(1, 1, 1)), "unknown kind name colour -> white") # --- 3. SetEmpireNameMode(true):调色板重写 ------------------------------- NameColor.set_empire_name_mode(true) _ck(NameColor.is_empire_name_mode(), "empire-name-mode ON") # 序号不变,但槽解析改了 _ck(NameColor.name_color_index(_pc(2, 1), main, _ctx()) == NameColor.NAMECOLOR_PC + 1, "empire-on: normal PC index unchanged (PC + empire)") _ck(NameColor.name_color(_pc(2, 1), main, _ctx()).is_equal_approx(Color8(157, 0, 0)), "empire-on: empire-1 PC -> CHR_NAME_RGB_EMPIRE_PC_A (157,0,0)") _ck(NameColor.name_color(_pc(2, 2), _pc(1, 2), _ctx()).is_equal_approx(Color8(222, 160, 47)), "empire-on: empire-2 PC -> CHR_NAME_RGB_EMPIRE_PC_B (222,160,47)") _ck(NameColor.name_color(_pc(2, 3), _pc(1, 3), _ctx()).is_equal_approx(Color8(23, 30, 138)), "empire-on: empire-3 PC -> CHR_NAME_RGB_EMPIRE_PC_C (23,30,138)") # empire 0 的 PC 槽(NAMECOLOR_PC + 0)在 ON 分支仍是 NORMAL_PC(黄) _ck(NameColor.name_color(_pc(2, 0), _pc(1, 1), _ctx()).is_equal_approx(Color8(255, 215, 76)), "empire-on: empire-0 PC slot stays NORMAL_PC yellow") # MOB / NPC 在这套 colorInfo 里帝国色 == 普通色 _ck(NameColor.name_color({"kind": EntityRules.KIND_MONSTER}, main, _ctx()).is_equal_approx(Color8(235, 22, 9)), "empire-on: MOB colour unchanged (235,22,9)") # 还原默认,避免污染后续(静态状态) NameColor.set_empire_name_mode(false) _ck(NameColor.name_color(_pc(2, 1), main, _ctx()).is_equal_approx(Color8(255, 215, 76)), "restore empire-off: PC yellow again") # --- 4. GetIndexedNameColor 越界 → 白 ----------------------------------- _ck(NameColor.indexed_name_color(-1).is_equal_approx(Color(1, 1, 1)), "indexed_name_color(-1) -> white") _ck(NameColor.indexed_name_color(NameColor.NAMECOLOR_NUM).is_equal_approx(Color(1, 1, 1)), "indexed_name_color(NUM) -> white") _ck(NameColor.indexed_name_color(9999).is_equal_approx(Color(1, 1, 1)), "indexed_name_color(9999) -> white") _ck(NameColor.indexed_name_color(NameColor.NAMECOLOR_WARP).is_equal_approx(Color8(136, 218, 241)), "indexed_name_color(WARP) == CHR_NAME_RGB_WARP (136,218,241)") _ck(NameColor.indexed_name_color(NameColor.NAMECOLOR_WAYPOINT).is_equal_approx(Color8(255, 255, 255)), "indexed_name_color(WAYPOINT) == CHR_NAME_RGB_WAYPOINT (255,255,255)")