97 lines
6.0 KiB
GDScript
97 lines
6.0 KiB
GDScript
# 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. CanViewTargetHP(InstanceBase.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_DIFFERENT(PC 分支在前)")
|
||
# 可看血 -> :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 先 Reset(game.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. CloseTargetBoardIfDifferent(game.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 -> 37(int 截断)")
|