135 lines
8.4 KiB
GDScript
135 lines
8.4 KiB
GDScript
# 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_y(poc 世界坐标 `bubble_y + 17*pixel_size`)、
|
||
# 信息气泡(bNameFlag FALSE)不顶名字、无气泡回默认。
|
||
# 增量 119(seam ⑦ 纵向):name_tail_lift_delta / subtag_world_y —— 公会名 / 称号 / 等级
|
||
# 子标签随名字尾标纵向位移整体平移同一段(ArrangeTextTail :228/:258/:283)。
|
||
# 增量 121(seam ⑦ 水平):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.0(PythonTextTail.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_y(poc:世界 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.0(c_fyGuildNamePosition)")
|
||
# name_tail_lift_delta:follows -> 顶起后的净上移量;否则 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 = -24(titleW 被忽略)")
|
||
_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)")
|