# 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 截断)")