Complete remaining client gap features

This commit is contained in:
shenlei
2026-09-04 13:25:05 +09:00
parent 13ccb8d02d
commit 9a4a044da5
47 changed files with 6667 additions and 140 deletions
+134
View File
@@ -0,0 +1,134 @@
# name_tail_layout_test —— §8.8 seam ⑨:名字尾标「有聊天气泡时顶到气泡上方 17px」1:1。
# name_follows_bubble(有 chat 尾标 && bNameFlag)、name_tail_screen_y(参考端字面
# `chat.y - 17`)、name_tail_world_ypoc 世界坐标 `bubble_y + 17*pixel_size`)、
# 信息气泡(bNameFlag FALSE)不顶名字、无气泡回默认。
# 增量 119seam ⑦ 纵向):name_tail_lift_delta / subtag_world_y —— 公会名 / 称号 / 等级
# 子标签随名字尾标纵向位移整体平移同一段(ArrangeTextTail :228/:258/:283)。
# 增量 121seam ⑦ 水平):name_x_shift / title_x_offset / level_x_offset /
# guild_name_x_offset / mark_x_offset / subtag_world_x —— 逐像素水平排布
# ArrangeTextTail :211-320 非 EUROPE 分支:称号 / 等级在名字左侧、名字右移 fxAdd)。
# godot --headless --path project --script name_tail_layout_test.gd
# 退出码 0 = 全过。
extends SceneTree
const NameTailLayout = preload("res://name_tail_layout.gd")
var _fail := 0
func _ck(c: bool, m: String) -> void:
if not c:
_fail += 1
printerr("FAIL: " + m)
func _feq(a: float, b: float, m: String) -> void:
_ck(absf(a - b) < 0.0001, "%s (got %f want %f)" % [m, a, b])
func _init() -> void:
_run()
if _fail == 0:
print("PASS: name_tail_layout_test (§8.8 seam ⑨ 名字尾标贴气泡 1:1)")
quit(0)
else:
printerr("%d check(s) failed" % _fail)
quit(1)
func _run() -> void:
_feq(NameTailLayout.NAME_OFFSET_ABOVE_BUBBLE_PX, 17.0, "常量 17.0PythonTextTail.cpp:114")
# --- 0. name_follows_bubble:110 有尾标 && :112 bNameFlag------------------
_ck(NameTailLayout.name_follows_bubble(true, true) == true, "有聊天气泡(bNameFlag TRUE) -> 顶名字")
_ck(NameTailLayout.name_follows_bubble(true, false) == false, "有信息气泡(bNameFlag FALSE) -> 不顶")
_ck(NameTailLayout.name_follows_bubble(false, true) == false, "无气泡 -> 不顶(即便 flag 传 true")
_ck(NameTailLayout.name_follows_bubble(false, false) == false, "无气泡无 flag -> 不顶")
# --- 1. name_tail_screen_y(参考端字面:屏幕 y 向下,follows -> bubble_y - 17---
_feq(NameTailLayout.name_tail_screen_y(300.0, 250.0, true), 233.0, "follows -> 气泡屏幕 y 250 - 17 = 233")
_feq(NameTailLayout.name_tail_screen_y(300.0, 250.0, false), 300.0, "!follows -> 名字投影原值 300")
# 与 name_follows_bubble 串起来:信息气泡不顶 -> 用默认
var follows_info := NameTailLayout.name_follows_bubble(true, false)
_feq(NameTailLayout.name_tail_screen_y(300.0, 250.0, follows_info), 300.0, "信息气泡 -> 名字留默认屏幕 y")
# --- 2. name_tail_world_ypoc:世界 y 向上,follows -> bubble_y + 17*px_size---
# 名字 Label3D pixel_size = 0.006 -> 17px = 0.102 世界单位;气泡局部 y = 2.35。
_feq(NameTailLayout.name_tail_world_y(2.1, 2.35, true, 0.006), 2.35 + 17.0 * 0.006,
"follows -> 名字世界 y = 气泡 2.35 + 17*0.006")
_feq(NameTailLayout.name_tail_world_y(2.1, 2.35, true, 0.006), 2.452, "= 2.452")
_feq(NameTailLayout.name_tail_world_y(2.1, 2.35, false, 0.006), 2.1, "!follows -> 回默认世界 y 2.1")
# 顶起来后名字确实在气泡之上(世界 y 更大)
_ck(NameTailLayout.name_tail_world_y(2.1, 2.35, true, 0.006) > 2.35, "顶起后名字在气泡上方")
# 不同 pixel_size 线性缩放
_feq(NameTailLayout.name_tail_world_y(2.1, 2.35, true, 0.012), 2.35 + 0.204, "px_size 翻倍 -> 偏移翻倍")
# --- 3. 组合:完整判定链 --------------------------------------------------
# 聊天气泡在,名字顶上去
var f1 := NameTailLayout.name_follows_bubble(true, true)
_feq(NameTailLayout.name_tail_world_y(2.1, 2.35, f1, 0.006), 2.452, "聊天气泡 -> 名字 2.452")
# 气泡过期(has=false),名字回落
var f2 := NameTailLayout.name_follows_bubble(false, false)
_feq(NameTailLayout.name_tail_world_y(2.1, 2.35, f2, 0.006), 2.1, "气泡过期 -> 名字回 2.1")
# --- 4. seam ⑦ 收口(增量 119):子标签随名字尾标纵向位移 -------------------
_feq(NameTailLayout.GUILD_NAME_ABOVE_NAME_PX, 15.0, "常量 15.0c_fyGuildNamePosition")
# name_tail_lift_deltafollows -> 顶起后的净上移量;否则 0。
_feq(NameTailLayout.name_tail_lift_delta(2.1, 2.35, true, 0.006), 2.452 - 2.1,
"follows -> lift_delta = 2.452 - 2.1 = 0.352")
_feq(NameTailLayout.name_tail_lift_delta(2.1, 2.35, false, 0.006), 0.0,
"!follows -> lift_delta = 0")
_feq(NameTailLayout.name_tail_lift_delta(2.1, 2.35, true, 0.012), (2.35 + 0.204) - 2.1,
"px_size 翻倍 -> lift_delta 随之变大")
# subtag_world_y:默认局部 y 加上位移量。三个子标签整体平移同一段。
var lift := NameTailLayout.name_tail_lift_delta(2.1, 2.35, true, 0.006)
_feq(NameTailLayout.subtag_world_y(2.34, lift), 2.34 + 0.352, "GuildTag 2.34 -> 2.692")
_feq(NameTailLayout.subtag_world_y(1.86, lift), 1.86 + 0.352, "TitleTag 1.86 -> 2.212")
_feq(NameTailLayout.subtag_world_y(1.74, lift), 1.74 + 0.352, "LevelTag 1.74 -> 2.092")
# 三者之间的相对间距不变(整体平移,不是各自缩放)
var g := NameTailLayout.subtag_world_y(2.34, lift)
var t := NameTailLayout.subtag_world_y(1.86, lift)
_feq(g - t, 2.34 - 1.86, "平移后 GuildTag/TitleTag 相对间距不变")
# 气泡过期 -> lift 0 -> 子标签回默认
var lift0 := NameTailLayout.name_tail_lift_delta(2.1, 2.35, false, 0.006)
_feq(NameTailLayout.subtag_world_y(2.34, lift0), 2.34, "气泡过期 -> GuildTag 回默认 2.34")
_feq(NameTailLayout.subtag_world_y(1.74, lift0), 1.74, "气泡过期 -> LevelTag 回默认 1.74")
# --- 5. seam ⑦ 水平排版(增量 121 / ArrangeTextTail :211-320 非 EUROPE 分支)--------
_feq(NameTailLayout.NAME_X_ADD_TITLE, 8.0, "常量 8.0:242 fxAdd when pTitle")
_feq(NameTailLayout.NAME_X_ADD_LEVEL_ONLY, 4.0, "常量 4.0:288 fxAdd when 仅等级)")
_feq(NameTailLayout.MARK_X_PAD, 1.5, "常量 1.5:20 c_fxMarkPosition")
_feq(NameTailLayout.MARK_ABOVE_NAME_PX, 26.0, "常量 26.0:22 c_fyMarkPosition = 15 + 11")
# name_x_shift:320 名字本身右移 fxAdd
_feq(NameTailLayout.name_x_shift(true, true), 8.0, "有称号 -> 名字右移 8")
_feq(NameTailLayout.name_x_shift(true, false), 8.0, "有称号无等级 -> 名字右移 8")
_feq(NameTailLayout.name_x_shift(false, true), 4.0, "只有等级 -> 名字右移 4")
_feq(NameTailLayout.name_x_shift(false, false), 0.0, "都没有 -> 名字不移")
# title_x_offset:258 x - iNameWidth/2 - 8
_feq(NameTailLayout.title_x_offset(40.0), -(40.0 / 2.0) - 8.0, "称号 x 偏移 = -nameW/2 - 8 = -28")
_ck(NameTailLayout.title_x_offset(40.0) < 0.0, "称号在名字左侧")
# level_x_offset:有称号 -> :282 x - nameW/2 - 8 - titleW;只有等级 -> :312 x - nameW/2 - 4
_feq(NameTailLayout.level_x_offset(40.0, 30.0, true), -(40.0 / 2.0) - 8.0 - 30.0,
"有称号:等级 x 偏移 = -nameW/2 - 8 - titleW = -58")
_feq(NameTailLayout.level_x_offset(40.0, 30.0, false), -(40.0 / 2.0) - 4.0,
"只有等级:等级 x 偏移 = -nameW/2 - 4 = -24titleW 被忽略)")
_ck(NameTailLayout.level_x_offset(40.0, 30.0, true) < NameTailLayout.title_x_offset(40.0),
"有称号时等级比称号更靠左")
# guild_name_x_offset / mark_x_offset:224/:227/:228,仅有公会徽记时用)
_feq(NameTailLayout.guild_name_x_offset(20.0), 20.0 / 2.0 + 1.5, "公会名 x 偏移 = markW/2 + 1.5 = 11.5")
_feq(NameTailLayout.guild_name_x_offset(0.0), 1.5, "无徽记宽 -> 1.5(调用方实际按此路不改写处理)")
_feq(NameTailLayout.mark_x_offset(60.0, 20.0), -(60.0 / 2.0) - (20.0 / 2.0 + 1.5),
"徽记 x 偏移 = -guildW/2 - (markW/2 + 1.5) = -41.5")
# subtag_world_x:像素偏移 * pixel_size,线性;符号保留(左负右正)
_feq(NameTailLayout.subtag_world_x(-28.0, 0.006), -28.0 * 0.006, "-28px @ 0.006 -> -0.168 世界本地 x")
_feq(NameTailLayout.subtag_world_x(8.0, 0.006), 0.048, "8px @ 0.006 -> +0.048")
_feq(NameTailLayout.subtag_world_x(-28.0, 0.012), -0.336, "pixel_size 翻倍 -> 偏移翻倍")
_feq(NameTailLayout.subtag_world_x(0.0, 0.006), 0.0, "0 偏移 -> 0")
# 组合:名字 40px、称号 30px、等级 12px,都在 -> 三者从左到右 = 等级、称号、名字
var name_px := 40.0
var title_px := 30.0
var nx := NameTailLayout.name_x_shift(true, true) # +8
var tx := NameTailLayout.title_x_offset(name_px) # -28
var lx := NameTailLayout.level_x_offset(name_px, title_px, true) # -58
_ck(lx < tx and tx < nx, "水平顺序:等级(-58) < 称号(-28) < 名字(+8)")