Files
mtgodot-poc/project/target_board_test.gd

97 lines
6.0 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.
# 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 截断)")