Files
mtgodot-poc/project/name_color_test.gd
T

181 lines
9.7 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)")