Complete remaining client gap features
This commit is contained in:
@@ -26,6 +26,7 @@ class FakeClient extends Node:
|
||||
func get_entities() -> Array: return ents.values()
|
||||
func say(t, s) -> bool: said.append([t, s]); return true
|
||||
func whisper(to, s) -> bool: whispered.append([to, s]); return true
|
||||
func get_guild_name(gid: int) -> String: return "Camelot" if gid != 0 else ""
|
||||
|
||||
class FakeProto extends Node:
|
||||
func item(vnum: int) -> Dictionary:
|
||||
@@ -112,6 +113,14 @@ func _run() -> void:
|
||||
chat._on_submit("/w Bob psst hey")
|
||||
_ck(fc.whispered.size() == 1 and fc.whispered[0] == ["Bob", "psst hey"], "/w Bob ... -> whisper('Bob','psst hey')")
|
||||
_ck(_last(tWhisper).contains("→ Bob: psst hey"), "/w -> local echo in Whisper tab")
|
||||
# game.py OpenWhisperDialog:目标框独立于公共聊天输入行,回车发送后关闭。
|
||||
chat.start_whisper("Carol")
|
||||
_ck(chat.is_whisper_open() and chat.whisper_target() == "Carol",
|
||||
"start_whisper -> 独立私聊窗口打开并锁定目标")
|
||||
chat._on_whisper_submit("private window")
|
||||
_ck(fc.whispered.size() == 2 and fc.whispered[1] == ["Carol", "private window"],
|
||||
"独立私聊窗口发送 -> whisper('Carol', msg)")
|
||||
_ck(not chat.is_whisper_open(), "私聊发送后关闭独立窗口")
|
||||
|
||||
# --- 气泡 ---
|
||||
var nw: Node = NetWorld.new()
|
||||
@@ -126,6 +135,67 @@ func _run() -> void:
|
||||
nw._bubble(2000, "hi there")
|
||||
var bob: Node3D = nw.node_for(2000)
|
||||
_ck(bob != null and bob.get_node_or_null("bubble") != null, "entity 2000 got a bubble node")
|
||||
# §8.8 seam ⑨(UpdateShowingTextTail :110-114):有「聊天」气泡时名字尾标顶到气泡上方 17px。
|
||||
var bob_name := bob.get_node_or_null("Label3D") as Label3D
|
||||
var bob_bubble := bob.get_node_or_null("bubble") as Label3D
|
||||
_ck(bob_name != null and bob_bubble != null, "entity 2000 has Label3D + bubble")
|
||||
_ck(absf(bob_name.position.y - (bob_bubble.position.y + 17.0 * bob_name.pixel_size)) < 0.0001,
|
||||
"聊天气泡在 -> 名字 y = 气泡 y + 17*pixel_size")
|
||||
_ck(bob_name.position.y > bob_bubble.position.y, "名字尾标顶到气泡上方")
|
||||
# §8.8 seam ⑦ 收口(增量 119 / ArrangeTextTail :228/:258/:283):公会名 / 称号 / 等级
|
||||
# 子标签锚在名字尾标上,名字被气泡顶起时三者整体平移同一段。
|
||||
var g_tag := bob.get_node_or_null("GuildTag") as Label3D
|
||||
var t_tag := bob.get_node_or_null("TitleTag") as Label3D
|
||||
var l_tag := bob.get_node_or_null("LevelTag") as Label3D
|
||||
_ck(g_tag != null and t_tag != null and l_tag != null, "entity 2000 has 公会/称号/等级子标签")
|
||||
var lift := bob_name.position.y - 2.1
|
||||
_ck(lift > 0.0, "名字尾标确有上移量")
|
||||
_ck(absf(g_tag.position.y - (2.34 + lift)) < 0.0001, "GuildTag 随名字上移同一段")
|
||||
_ck(absf(t_tag.position.y - (1.86 + lift)) < 0.0001, "TitleTag 随名字上移同一段")
|
||||
_ck(absf(l_tag.position.y - (1.74 + lift)) < 0.0001, "LevelTag 随名字上移同一段")
|
||||
# 信息尾标(bNameFlag FALSE)不顶名字 —— 复用同一张 _chat_tails,覆盖成 info 后名字回默认。
|
||||
nw.register_info_tail(2000, "skill fizzled")
|
||||
_ck(absf(bob_name.position.y - 2.1) < 0.0001, "信息尾标覆盖 -> 名字回默认局部 y 2.1")
|
||||
_ck(absf(g_tag.position.y - 2.34) < 0.0001, "信息尾标覆盖 -> GuildTag 回默认 2.34")
|
||||
_ck(absf(t_tag.position.y - 1.86) < 0.0001, "信息尾标覆盖 -> TitleTag 回默认 1.86")
|
||||
_ck(absf(l_tag.position.y - 1.74) < 0.0001, "信息尾标覆盖 -> LevelTag 回默认 1.74")
|
||||
# --- §8.8 seam ⑦ 水平排版(增量 121 / ArrangeTextTail :211-320 非 EUROPE 分支)------
|
||||
# charlie 有公会 + 善恶度(称号) + 等级 -> 三子标签沿名字锚点水平排开:
|
||||
# 等级在最左、称号居中偏左、名字本身右移 fxAdd(=8);公会名(无徽记)留 x = 0。
|
||||
fc.ents[3000] = {"vid": 3000, "name": "Charlie", "guild": 7, "alignment": 15000, "level": 42}
|
||||
fc.entity_spawned.emit({"vid": 3000, "name": "Charlie", "pos": Vector3(3, 0, 0), "func": 0, "angle_deg": 0.0})
|
||||
await process_frame
|
||||
var charlie: Node3D = nw.node_for(3000)
|
||||
_ck(charlie != null, "entity 3000 spawned")
|
||||
nw._apply_text_tail(3000)
|
||||
var c_name := charlie.get_node_or_null("Label3D") as Label3D
|
||||
var c_g := charlie.get_node_or_null("GuildTag") as Label3D
|
||||
var c_t := charlie.get_node_or_null("TitleTag") as Label3D
|
||||
var c_l := charlie.get_node_or_null("LevelTag") as Label3D
|
||||
_ck(c_g.text == "Camelot", "GuildTag 文本经 get_guild_name 解出")
|
||||
_ck(c_t.text != "", "TitleTag 文本非空(alignment 15000 -> grade 0 -> 有称号)")
|
||||
_ck(c_l.text != "", "LevelTag 文本非空(level 42)")
|
||||
# 名字本身右移 fxAdd —— 有称号 -> 8px 折世界。
|
||||
_ck(absf(c_name.position.x - 8.0 * c_name.pixel_size) < 0.0001,
|
||||
"名字 x = name_x_shift(有称号)=8 * pixel_size")
|
||||
# 称号 / 等级在名字左侧(x < 0),等级比称号更靠左。
|
||||
_ck(c_t.position.x < 0.0, "称号在名字锚点左侧")
|
||||
_ck(c_l.position.x < c_t.position.x, "等级比称号更靠左(-nameW/2 - 8 - titleW)")
|
||||
# 公会名无徽记 -> 留在名字中线正上方。
|
||||
_ck(absf(c_g.position.x) < 0.0001, "GuildTag x = 0(poc 无公会徽记)")
|
||||
# 精确值:nameW = len("Charlie")*7 = 49,称号 x 偏移 = -(49/2) - 8 = -32.5。
|
||||
_ck(absf(c_t.position.x - (-(7.0 * 7.0 / 2.0) - 8.0) * c_t.pixel_size) < 0.0001,
|
||||
"称号 x = (-nameW/2 - 8) * pixel_size 精确")
|
||||
# 撤销称号(alignment -> 0,grade 4 = TITLE_NONE)后称号 x 归零、名字改右移 4(只剩等级)。
|
||||
fc.ents[3000]["alignment"] = 0
|
||||
nw._apply_text_tail(3000)
|
||||
_ck(c_t.text == "" and absf(c_t.position.x) < 0.0001, "称号消失 -> TitleTag x 归零")
|
||||
_ck(absf(c_name.position.x - 4.0 * c_name.pixel_size) < 0.0001,
|
||||
"只剩等级 -> 名字 x = name_x_shift(仅等级)=4 * pixel_size")
|
||||
# 精确值(无称号):等级 x 偏移 = -(nameW/2) - 4 = -(49/2) - 4 = -28.5。
|
||||
_ck(absf(c_l.position.x - (-(7.0 * 7.0 / 2.0) - 4.0) * c_l.pixel_size) < 0.0001,
|
||||
"只剩等级:等级 x = (-nameW/2 - 4) * pixel_size 精确")
|
||||
|
||||
nw.set_local_vid(1000)
|
||||
nw._bubble(1000, "my line")
|
||||
_ck(got_main[0] == "my line", "local vid bubble -> main_bubble signal")
|
||||
|
||||
Reference in New Issue
Block a user