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
+96
View File
@@ -0,0 +1,96 @@
# target_board_test —— §5.4 / §8.8 目标框收包分派 1:1:
# RecvTargetPacket 的判定树(实例缺失→CLOSE、已死→NONE、PC|Building→CLOSE_IF_DIFFERENT、
# 可看血→SET_HP、否则→CLOSE)、CanViewTargetHP、m_pInstTarget 写入条件、SetHPTargetBoard
# 换 VID 先 Reset、CloseTargetBoardIfDifferent、SetPCTargetBoard 的 LCONTROL 悄悄话捷径、
# bHPPercent 钳位。
# godot --headless --path project --script target_board_test.gd
# 退出码 0 = 全过。
extends SceneTree
const TargetBoard = preload("res://target_board.gd")
var _fail := 0
func _ck(c: bool, m: String) -> void:
if not c:
_fail += 1
printerr("FAIL: " + m)
func _init() -> void:
_run()
if _fail == 0:
print("PASS: target_board_test (§5.4/§8.8 RecvTargetPacket 分派 + CanViewTargetHP 1:1)")
quit(0)
else:
printerr("%d check(s) failed" % _fail)
quit(1)
func _run() -> void:
var CLOSE := TargetBoard.Action.CLOSE
var DIFF := TargetBoard.Action.CLOSE_IF_DIFFERENT
var SETHP := TargetBoard.Action.SET_HP
var NONE := TargetBoard.Action.NONE
# --- 0. CanViewTargetHPInstanceBase.cpp:2293------------------------------
_ck(TargetBoard.can_view_target_hp(true, false, false) == true, "IsStone -> 可看血")
_ck(TargetBoard.can_view_target_hp(false, true, false) == true, "IsWoodenDoor -> 可看血")
_ck(TargetBoard.can_view_target_hp(false, false, true) == true, "IsEnemy -> 可看血")
_ck(TargetBoard.can_view_target_hp(false, false, false) == false, "皆非 -> 不可看血")
_ck(TargetBoard.can_view_target_hp(true, true, true) == true, "任一为真即可看血")
# door/building 实体现在由 net_play/entity_rules 识别后分别进入这两条参考分支。
_ck(TargetBoard.classify(true, false, false, true, true) == DIFF,
"建筑即使可看血也优先 CLOSE_IF_DIFFERENT")
_ck(TargetBoard.classify(true, false, false, false, true) == SETHP,
"木门经 CanViewTargetHP -> SET_HP")
# --- 1. RecvTargetPacket 判定树(PythonNetworkStreamPhaseGame.cpp:2424------
# 实例缺失(pInstPlayer && pInstTarget 为假)-> :2453 CloseTargetBoard
_ck(TargetBoard.classify(false, false, false, false, false) == CLOSE, "目标实例缺失 -> CLOSE")
_ck(TargetBoard.classify(false, false, true, false, true) == CLOSE, "实例缺失优先于其它分支")
# 目标已死透 -> :2438 !IsDead() 为假 -> 整块跳过(NONE),但 m_pInstTarget 也不写
_ck(TargetBoard.classify(true, true, false, false, true) == NONE, "目标已死 -> NONE(不动框)")
_ck(TargetBoard.classify(true, true, true, false, false) == NONE, "已死优先于 PC 分支")
# PC / Building -> :2440 CloseTargetBoardIfDifferent
_ck(TargetBoard.classify(true, false, true, false, false) == DIFF, "PC 目标 -> CLOSE_IF_DIFFERENT")
_ck(TargetBoard.classify(true, false, false, true, false) == DIFF, "Building 目标 -> CLOSE_IF_DIFFERENT")
_ck(TargetBoard.classify(true, false, true, false, true) == DIFF, "PC 即便可看血也走 CLOSE_IF_DIFFERENTPC 分支在前)")
# 可看血 -> :2442 SetHPTargetBoard
_ck(TargetBoard.classify(true, false, false, false, true) == SETHP, "非 PC 非 building 且可看血 -> SET_HP")
# 不可看血的非 PC 非 building(例如 NPC / warp-> :2444 CloseTargetBoard
_ck(TargetBoard.classify(true, false, false, false, false) == CLOSE, "NPC/warp 不可看血 -> CLOSE")
# --- 2. m_pInstTarget 写入条件(:2447 在 !IsDead() 块内)---------------------
_ck(TargetBoard.updates_current_target(true, false) == true, "目标存在且未死 -> 写 m_pInstTarget")
_ck(TargetBoard.updates_current_target(true, true) == false, "目标已死 -> 不写 m_pInstTarget")
_ck(TargetBoard.updates_current_target(false, false) == false, "实例缺失 -> 不写 m_pInstTarget")
# --- 3. SetHPTargetBoard 换 VID 先 Resetgame.py:829---------------------
_ck(TargetBoard.needs_reset(2000, 0) == true, "无当前目标 -> 先 Reset")
_ck(TargetBoard.needs_reset(2000, 1500) == true, "换目标 -> 先 Reset")
_ck(TargetBoard.needs_reset(2000, 2000) == false, "同目标 -> 只 SetHP,不 Reset")
# --- 4. CloseTargetBoardIfDifferentgame.py:837------------------------
_ck(TargetBoard.should_close_if_different(2000, 1500) == true, "框上是别的 VID -> Close")
_ck(TargetBoard.should_close_if_different(2000, 2000) == false, "框上正是该 VID -> 保留")
_ck(TargetBoard.should_close_if_different(2000, 0) == true, "框上无 VID -> Close")
# --- 5. SetPCTargetBoard 的 LCONTROL 悄悄话捷径(game.py:804-817---------
_ck(TargetBoard.whisper_on_ctrl_click(true, true, false, false) == true, "LCONTROL+同阵营+非本人+非building -> 开悄悄话")
_ck(TargetBoard.whisper_on_ctrl_click(false, true, false, false) == false, "没按 LCONTROL -> 不开")
_ck(TargetBoard.whisper_on_ctrl_click(true, false, false, false) == false, "!IsSameEmpire -> return")
_ck(TargetBoard.whisper_on_ctrl_click(true, true, true, false) == false, "IsMainCharacterIndex -> return")
_ck(TargetBoard.whisper_on_ctrl_click(true, true, false, true) == false, "INSTANCE_TYPE_BUILDING -> return")
# --- 5b. TargetBoard.Open 异阵营前置过滤(uitarget.py:189-193------------
# game-option 关「看他国目标框」+ 异阵营 -> 隐藏;其它组合都不挡。
_ck(TargetBoard.hidden_as_other_empire(false, false) == true, "关看他国框 + 异阵营 -> 隐藏")
_ck(TargetBoard.hidden_as_other_empire(false, true) == false, "关看他国框 + 同阵营 -> 不挡")
_ck(TargetBoard.hidden_as_other_empire(true, false) == false, "开看他国框 + 异阵营 -> 不挡")
_ck(TargetBoard.hidden_as_other_empire(true, true) == false, "开看他国框 + 同阵营 -> 不挡")
# --- 6. bHPPercent 钳位(BYTE 0..100----------------------------------
_ck(TargetBoard.clamp_hp_pct(40) == 40, "40 -> 40")
_ck(TargetBoard.clamp_hp_pct(0) == 0, "0 -> 0")
_ck(TargetBoard.clamp_hp_pct(100) == 100, "100 -> 100")
_ck(TargetBoard.clamp_hp_pct(-3) == 0, "负数 -> 0")
_ck(TargetBoard.clamp_hp_pct(150) == 100, ">100 -> 100")
_ck(TargetBoard.clamp_hp_pct(37.9) == 37, "float 37.9 -> 37int 截断)")