完善客户端功能并同步差距文档

This commit is contained in:
shenlei
2026-09-03 18:40:01 +09:00
parent f93a172296
commit 13ccb8d02d
135 changed files with 21881 additions and 1259 deletions
+180
View File
@@ -0,0 +1,180 @@
# 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.hEMPIRE_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)")