181 lines
9.7 KiB
GDScript
181 lines
9.7 KiB
GDScript
# 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)")
|