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

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
+127
View File
@@ -0,0 +1,127 @@
# text_tail.gd —— 头顶「称号 / 等级 / 公会名」子标签的 1:1 迁移(§8.8)
#
# 参考(REF/ = /Users/shenlei/Work/mt/40250/ClientVS22/source/):
# UserInterface/InstanceBaseEffect.cpp:609 GetTitleColor —— uGrade>=TITLE_NUM 时白,否则 g_akD3DXClrTitle[uGrade]
# UserInterface/InstanceBaseEffect.cpp:621 AttachTextTail —— fTextTailHeight = IsMountingHorse()?110:10;末尾 if(m_dwLevel) UpdateTextTailLevel
# UserInterface/InstanceBaseEffect.cpp:654 UpdateTextTailLevel —— s_kLevelColor = D3DXCOLOR(152/255,255/255,51/255,1)"Lv %d"
# UserInterface/InstanceBaseEffect.cpp:664 RefreshTextTail —— SetCharacterTextTailColor(GetNameColor()) + 按 AlignmentGrade attach/detach 称号
# UserInterface/InstanceBaseEffect.cpp:1107 RegisterTitleName —— g_TitleNameMap[i] = c_szTitleName
# UserInterface/InstanceBaseEffect.cpp:1131 RegisterTitleColor —— g_akD3DXClrTitle[u] = __RGBToD3DXColoru(r,g,b)
# UserInterface/InstanceBase.h:262 TITLE_NUM = 9 / TITLE_NONE = 4
# UserInterface/InstanceBase.cpp:2053 SetAlignment -> RefreshTextTailTitle -> RefreshTextTail
# UserInterface/PythonTextTail.cpp:18 c_TextTail_Guild_Name_Color = 0xFFEFD3FF
# UserInterface/PythonTextTail.cpp:23 bPKTitleEnable = TRUEEnablePKTitle
# UserInterface/PythonTextTail.cpp:509 RegisterCharacterTextTail —— dwGuildID!=0 才建公会名标签;GetGuildName 失败 -> "Noname"
# UserInterface/PythonTextTail.cpp:890 AttachTitle / :943 AttachLevel —— 均 if(!bPKTitleEnable) return
# assets/root/introloading.py:287 TITLE_COLOR_DICT(注册序 0..8
# assets/root/colorInfo.py:29 TITLE_RGB_GOOD_4 .. TITLE_RGB_EVIL_4
# assets/root/localeInfo.py:215 TITLE_NAME_LIST = (PVP_LEVEL0..PVP_LEVEL8,)
# assets/root/constinfo.py:4 PVPMODE_ENABLE = 1game.py:155 textTail.EnablePKTitle(constInfo.PVPMODE_ENABLE)
#
# 纯静态。调用方(net_world.gd)把网络快照 self_e{alignment,level,guild,mount_vnum,...}
# 传进来,再自己把 title_name_key / 公会名解析成本地化字符串并落到 Label3D 上。
extends RefCounted
const EntityRules = preload("res://entity_rules.gd")
# InstanceBase.h 匿名枚举
const TITLE_NUM := 9
const TITLE_NONE := 4
const _WHITE := Color(1, 1, 1)
# UpdateTextTailLevel 的 s_kLevelColor = D3DXCOLOR(152/255, 255/255, 51/255, 1)
const LEVEL_COLOR := Color(152.0 / 255.0, 255.0 / 255.0, 51.0 / 255.0)
# PythonTextTail.cpp:18 c_TextTail_Guild_Name_Color = 0xFFEFD3FFARGB -> RGB 239,211,255
const GUILD_NAME_COLOR := Color(239.0 / 255.0, 211.0 / 255.0, 255.0 / 255.0)
# CPythonGuild::GetGuildName 失败时的兜底名(PythonTextTail.cpp:551
const GUILD_NAME_FALLBACK := "Noname"
# g_akD3DXClrTitleintroloading.py TITLE_COLOR_DICT 经 RegisterTitleColor -> __RGBToD3DXColoru
# 写进的 9 个槽(idx0 GOOD_4 .. idx8 EVIL_4)。Color8(r,g,b) == D3DXCOLOR(r/255,g/255,b/255)。
static func _title_colors() -> Array:
return [
Color8(0, 204, 255), # 0 GOOD_4
Color8(0, 144, 255), # 1 GOOD_3
Color8(92, 110, 255), # 2 GOOD_2
Color8(155, 155, 255), # 3 GOOD_1
Color8(255, 255, 255), # 4 NORMAL= TITLE_NONE,实际不会 attach
Color8(207, 117, 0), # 5 EVIL_1
Color8(235, 83, 0), # 6 EVIL_2
Color8(227, 0, 0), # 7 EVIL_3
Color8(255, 0, 0), # 8 EVIL_4
]
# --- EnablePKTitle / bPKTitleEnablePythonTextTail.cpp:23 / :938--------------
# game.py:155 起始 EnablePKTitle(constInfo.PVPMODE_ENABLE)constinfo.py:4 PVPMODE_ENABLE = 1。
static var _pk_title_enabled := true
static func set_pk_title_enabled(enabled: bool) -> void:
_pk_title_enabled = enabled
static func is_pk_title_enabled() -> bool:
return _pk_title_enabled
# --- CInstanceBase::GetTitleColorInstanceBaseEffect.cpp:609)—— 逐行 -----------
# 入参是 GetAlignmentGrade() 的结果(0..8),越界(>=TITLE_NUM)返回白。
static func title_color(grade: int) -> Color:
if grade < 0 or grade >= TITLE_NUM:
return _WHITE
return _title_colors()[grade]
# introloading.py __RegisterTitleNamechrmgr.RegisterTitleName(i, TITLE_NAME_LIST[i])
# TITLE_NAME_LIST[i] == localeInfo.PVP_LEVEL<i>。调用方用它查 Locale 表。
static func title_name_key(grade: int) -> String:
return "PVP_LEVEL%d" % grade
# UpdateTextTailLevelsprintf(szText, "Lv %d", level)
static func level_text(level: int) -> String:
return "Lv %d" % level
# AttachTextTailfTextTailHeight = IsMountingHorse() ? 110.0f : 10.0f
static func text_tail_height(mounted: bool) -> float:
return 110.0 if mounted else 10.0
# --- CInstanceBase::RefreshTextTail 的称号分支(InstanceBaseEffect.cpp:664-------
# 返回 { show_title, grade, name_key, color }。
# iAlignmentGrade = GetAlignmentGrade();
# if (TITLE_NONE == iAlignmentGrade) DetachTitle();
# else if (g_TitleNameMap.has(grade)) AttachTitle(name, GetTitleColor());
# AttachTitle/DetachTitle 均 if(!bPKTitleEnable) return —— 关闭时参考端「冻结」上一态;
# 本移植取「隐藏」(show_title=false),差异见 §8.8 seam ⑦。
static func refresh_title(alignment: int) -> Dictionary:
var grade := EntityRules.alignment_grade(alignment)
var out := {
"show_title": false,
"grade": grade,
"name_key": title_name_key(grade),
"color": title_color(grade),
}
if not _pk_title_enabled:
return out
if grade == TITLE_NONE:
return out
# g_TitleNameMap 注册了 0..8 全部(introloading.__RegisterTitleName),故只排除 TITLE_NONE。
if grade < 0 or grade >= TITLE_NUM:
return out
out["show_title"] = true
return out
# --- AttachTextTail 的等级分支(InstanceBaseEffect.cpp:621 末 + UpdateTextTailLevel
# if (m_dwLevel) UpdateTextTailLevel(m_dwLevel)AttachLevel 亦 if(!bPKTitleEnable) return。
static func refresh_level(level: int) -> Dictionary:
var show := _pk_title_enabled and level > 0
return {
"show_level": show,
"text": level_text(level) if show else "",
"color": LEVEL_COLOR,
}
# --- RegisterCharacterTextTail 的公会名分支(PythonTextTail.cpp:543--------------
# dwGuildID != 0 才建公会名标签;CPythonGuild::GetGuildName(dwGuildID) 失败 -> "Noname"。
# resolved_name 由调用方经 client.get_guild_name(guild_id) 解出(空串 = 解析失败)。
static func refresh_guild(guild_id: int, resolved_name: String) -> Dictionary:
if guild_id == 0:
return {"show_guild": false, "name": "", "color": GUILD_NAME_COLOR}
var nm := resolved_name if resolved_name != "" else GUILD_NAME_FALLBACK
return {"show_guild": true, "name": nm, "color": GUILD_NAME_COLOR}