Files
mtgodot-poc/project/name_tail_layout_test.gd

135 lines
8.4 KiB
GDScript
Raw Permalink 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_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)")