外观
Event 类型值域速查
状态:Authoritative Reference v1 / Incomplete Enum Closure
本页只汇总已经进入当前 Event Reference 的 type/value 语义。
完整物理记录与参数 union 规则见:records/event.md。
ActionType
Event +0x0C 为 ActionType。
已闭合值
| Value | 十进制 | 当前安全语义 | 关键参数 | 状态 |
|---|---|---|---|---|
0x00 | 0 | 目标 Country 全体相关单位士气 +1,持续 3 回合 | +0x14 = CountryRecordId | Confirmed |
0x01 | 1 | 目标 Country 全体相关单位士气 -1,持续 3 回合 | +0x14 = CountryRecordId | Confirmed |
0x02 | 2 | 目标 Country 全体相关单位士气 -2,持续 3 回合 | +0x14 = CountryRecordId | Confirmed |
0x03 | 3 | 目标 Country 全体相关单位士气 -3,持续 3 回合 | +0x14 = CountryRecordId | Confirmed |
0x0D | 13 | 普通 reinforcement / spawn 路径族 | 参数布局仍需逐分支闭合 | Partial |
0x0E | 14 | ownership / camp transfer 路径族 | 目标域、顺序、异常边界仍未完全闭合 | Partial |
0x18 | 24 | airborne reinforcement / spawn 路径族 | 参数布局仍需逐分支闭合 | Partial |
0x00..0x03 参数语义
这四个 morale action 已确认:
text
Event +0x14
-> CountryRecordId
-> resolve runtime Country
-> 遍历该 Country 的 Tile / primary Unit
-> apply morale delta
-> duration = 3因此 +0x14 在这些 action 中不是 BTL Country 数组 index。
其他 ActionType
当前 Reference 不发布猜测 enum。
例如 0x04..0x0C、0x0F..0x17 以及 0x18 之外的其他值,如果没有单独条目,应解释为:
text
current semantic status = Unknown
runtime support/validity = not established by this quick reference这不是“这些值无效”的声明。
TriggerType
Event +0x08 为 TriggerType。
Android 1.28.0 的 1358 个原版 BTL 共含 15052 条 Event;corpus 中观察到的 TriggerType 恰为 0..5:
| Value | 十进制 | corpus 条数 | 当前安全功能描述 | BehaviorStatus | NameStatus |
|---|---|---|---|---|---|
0x00 | 0 | 1995 | direct EventId callback 的跨 Camp gate variant;stock corpus 强烈对应 CaptureEvent target role | Characterized | Unknown |
0x01 | 1 | 1853 | stock Unit.DeathEventId target convention/family;激活本身按 EventId | Characterized | Unknown |
0x02 | 2 | 2494 | scheduled / GameRound trigger family | FunctionConfirmed | Unknown |
0x03 | 3 | 102 | direct EventId callback 的 Human-controller gate variant | Characterized | Unknown |
0x04 | 4 | 8495 | stock LinkedEvent continuation-target convention/family;激活本身按 EventId | Characterized | Unknown |
0x05 | 5 | 113 | caller Country.RecordId gate + inclusive hex-radius 圈外→圈内 entry trigger family | FunctionConfirmed | Unknown |
这里的功能描述是研究侧 characterization,不是原版 enum 名称。NameStatus=Unknown 与“行为已经大致知道”并不矛盾。
同时,0..5 只是当前 stock corpus 的完整观察集合,不是 parser allowed-domain 证明。不能据此宣布其他数值必然非法。
0x02:scheduled / GameRound trigger family
Native dispatch 已确认 TriggerType 2 属于回合调度族:
text
Event +0x20
-> 与当前 GameRound / zero-round path 比较对非 ActionType 4 路径,Event +0x10 还参与当前行动 Country gate。
带延迟的 LinkedEvent 也会进入这个调度族,目标回合按:
text
current GameRound + LinkedEventDelay建立。
因此 0x02 的功能族状态可记为 FunctionConfirmed。仍未完全闭合的是 ActionType 4 特例、同回合排序、repeat/executed、missing LinkedEvent 和模式差异。
0x05:caller Country.RecordId gate + inclusive hex-radius 圈外→圈内 entry trigger family
Importer 会把所有 Event 放入主 vector,并把 TriggerType 5 额外加入 dedicated vector;该 vector 保留 source/import 顺序。FUN_00383C90 的判定已经可以精确归一化为:
text
Event.executed == 0
TriggerType == 5
Event+0x10 == callerCountryContext.RecordId
Event+0x20 > 0
if previous/source TileId >= 0:
hexDistance(Event+0x20, previous/source TileId) > Event+0x23
hexDistance(Event+0x20, current/destination TileId) <= Event+0x23这里的 hexDistance 是已由 Reconstruction authority 闭合的 FUN_0036E170 六角 Tile 距离。
所以 Type5 当前安全描述可升级成:
受 caller-supplied
Country.RecordId门控的 inclusive hex-radius“从圈外进入圈内”边界触发族。
它不是“持续处在半径内就触发”:previous/source 已经在 distance <= radius 内时,原版显式跳过该 Event。
Type5 scoped 参数:
text
+0x10 = caller-supplied Country.RecordId equality gate
+0x20 = positive center/anchor TileId (int16)
+0x23 = inclusive hex-distance radius/threshold (uint8)Radius=0 有效,表示精确进入中心 Tile;113 条 stock Type5 中有 54 条为 0,其中 16 条同时具有正 center 和可用的非零 Country gate。
如果 previous/source TileId < 0,原版跳过 outside-side distance 比较,只检查 current/destination 是否位于 radius 内。
+0x22 == 0 时,evaluator 会在执行前调用 FUN_0036E5D8(Map);113 条 stock Type5 的 +0x22 全为 0。本轮已确认该 helper 是 map-scoped transient intrusive-list reset:当 Map+0x210 guard 非零时清理/释放由 Map+0x1F0 关联的节点,并清零相关 Map+0x200/+0x210 状态。它也被普通 post-move/ownership cleanup 调用,并非 Type5 专属。最终业务名称仍未闭合,所以不能擅自命名成 path cache / fog / movement marker / ZOC。
Type5 也不是“离开后再进入就可以无限重复”的区域触发。Importer FUN_00383274 将磁盘 Event+0x28 直接复制为 runtime executed state;15052/15052 条 stock Event 和 113/113 条 Type5 的 seed 都是 0。common executor FUN_003835B4 成功执行 Event 后将 runtime +0x28 写为 1,后续 Type5 scan 首先拒绝非零 executed state;已审计 Event-manager 核心范围没有正常清零路径。因此同一 runtime Event 对象执行一次后,后续重新进入半径不会再次由 Type5 evaluator 执行。跨 save/load / battle 的持久化仍未在本工作单元闭合。
corpus 还有一个重要 seed 边界:
text
Type5 总数 113
+0x20 > 0 75
+0x20 == 0 38
+0x10 == 0 24
全 1358 BTL 中 Country.RecordId == 0 0因此 38 条 center=0 在磁盘 seed 下会被 center > 0 gate 挡住;24 条 +0x10=0 也无法匹配任一 stock initial Country.RecordId。这里仅标为 seed-ineligible in the audited evaluator,不宣称它们在所有 runtime mutation/未审计路径下永久无效。
0x00 / 0x03:direct EventId callback 的精确 gate
FUN_00383AC8 先按 EventId 找 Event,然后只允许 TriggerType 0/3 按两套不同 gate 继续:
text
TriggerType 0
-> new/current Country.Camp != old/context Country.Camp
TriggerType 3
-> new/current Country+0x158 == 0 (Human)
其他 TriggerType
-> 该 callback 不接受共同前置还包括 EventId 正值、old/context Country 非空、Event 存在且尚未执行。
在已审计 FUN_004D0ED4 ownership-transition caller 中:
text
old/context Country = transition 前 target Tile owner
new/current Country = current/operation Country所以 Type0 在这条路径中是跨 Camp owner-transition gate,Type3 是新/current Country 必须 Human 的 gate。这仍是 scoped runtime characterization,不能把原版正式 enum 名直接命名成“敌军占领/玩家占领”。
stock corpus 对 Type0 还提供了很强的 authoring-role 证据:2167 个正值 Building.CaptureEventId 引用中 2087 个(96.3083%)指向 Type0;1995 条 Type0 中有 1856 条(93.0326%)至少被一个 Building.CaptureEventId 引用。
Building+0x0E CaptureEventId <-> runtime Tile+0x150 已有直接双向 native 投影:FUN_004759D8 用 ldrsb 将 raw int8 符号扩展写入 Tile +0x150,FUN_004757E0 又用 strb 写回 Building +0x0E。因此该 storage provenance 已是 Confirmed。
Type3 仍只有 38/102 条被 CaptureEventId 覆盖。把 initial Unit death、Reinforcement spawned-Unit death、LinkedEventId 一并加入已知入边后,分类为:
text
capture only 35
capture + linked 3
linked only 7
none among known sets 5757/57 no-known-inbound Type3 都是 MapSource=0;initial/reinforcement death 对 Type3 入边均为 0。当前只能把这 57 条称为 no-known-producer / seed-unreachable under the audited producer set,不能宣称永久死数据或编造额外 producer。
0x01:stock Unit.DeathEventId target convention/family
0x01 现在可以从 Observed 升到 Characterized,但这里闭合的是原版引用/authoring role,不是一个独立的 Type1 predicate evaluator。
Native 已形成完整链:
text
BTL Unit +0x2A DeathEventId
-> FUN_0048059c
-> runtime Unit +0x150 EventId
-> death processing FUN_0047294c
-> FUN_00383bbc direct EventId dispatchFUN_0048059c 明确执行:
text
runtime Unit +0x150 = sign-extended BTL Unit +0x2A而 FUN_0047294c 在死亡处理时读取 runtime +0x150,正值就交给 FUN_00383bbc。后者按 EventId 找 Event,不检查目标 Event 的 TriggerType 是否等于 1。
原版 corpus 关联:
text
Type1 Event 总数 1853
正值 Unit.DeathEventId 引用 2150
其中指向 Type1 的 Unit 引用 2131
不同 death-target Event 1649
其中 Type1 1638 (99.3329%)
Type1 中至少被一个 DeathEventId 引用 1638 (88.3972%)少量非 Type1 death target 以及非 death-reference Type1 都真实存在。因此安全描述是:
text
stock Unit.DeathEventId target convention/family而不是:
text
TriggerType 1 = 强制“单位死亡”运行时枚举0x04:stock LinkedEvent continuation-target convention/family
FUN_003835b4 在一个 Event 执行完成后读取 LinkedEventId / LinkedEventDelay。
零延迟时:
text
find target by EventId
-> target becomes next common-execution record
-> no target TriggerType check有延迟时更加关键:
text
target.TriggerType = 2
target.+0x20 = current GameRound + LinkedEventDelay也就是说,磁盘 Type4 可以作为 linked continuation target;当它被延迟链激活时,runtime 会先转成 Type2 再进入回合调度。
原版 corpus 关联:
text
Type4 Event 总数 8495
LinkedEvent 记录 8953
不同 linked-target Event 8560
其中 Type4 8387 (97.9790%)
Type4 中至少被一个 LinkedEventId 引用 8387 (98.7287%)
有延迟 LinkedEvent 89
其中磁盘目标 Type4 88因此安全描述是:
text
stock LinkedEvent continuation-target convention/family不是“Type4 有一个每帧扫描的 linked predicate”,也不是 writer 的强制合法性规则。
Direct EventId dispatch 与 TriggerType 不是一回事
FUN_00383274 会把全部 Event 放进主 Event vector,只有 Type5 额外进入专用 spatial vector;完整 audited Event-manager range 中没有找到 Type1/Type4 的独立 autonomous scanner/evaluator。
FUN_00383bbc 与 pending-resume FUN_00383dd0 都按 EventId 找记录,不要求某个 TriggerType。Building.CaptureEventId 的 corpus 也跨越 0..5,进一步证明“引用来源”和 TriggerType 不是严格一一对应的 enum。
所以本页对 Type1/4 发布的是强 stock role characterization,不是原版正式枚举名,也不是排他性 runtime validation。
完整证据:
text
reconstruction/docs/btl_event_trigger_type_semantic_characterization_v1_report.md
reports/btl_semantic_recovery/event_trigger_characterization_v1/trigger_type_characterization.json
reconstruction/docs/btl_event_trigger_type_1_4_activation_mapping_v1_report.md
reports/btl_semantic_recovery/event_trigger_type_1_4_activation_mapping_v1/trigger_type_1_4_activation_mapping.json
reconstruction/docs/btl_event_trigger_type_0_3_and_5_semantic_closure_v1_report.md
reports/btl_semantic_recovery/event_trigger_type_0_3_and_5_semantic_closure_v1/trigger_type_0_3_5_semantic_closure.json
reconstruction/docs/btl_event_producer_and_execution_lifecycle_closure_v1_report.md
reports/btl_semantic_recovery/event_producer_and_execution_lifecycle_closure_v1/event_producer_and_execution_lifecycle_closure.json参数 union 规则
Event 的正确阅读方式是:
text
TriggerType
-> 解释 trigger-side 参数
ActionType
-> 解释 action-side 参数不是:
text
固定 offset
-> 永远同一个业务含义所以例如 +0x14 = CountryRecordId 只对已经闭合的相关 action branch 成立,不能推广到全部 ActionType。
证据入口
text
reconstruction/docs/btl-reference/records/event.md
reports/btl_v1280_so_recovery.md
reconstruction/docs/rendering/event50101_opening_morale_event_recovery_20260723.md
reports/btl_third_party_validation_matrix.csv