Skip to content

Event 类型值域速查

状态:Authoritative Reference v1 / Incomplete Enum Closure

本页只汇总已经进入当前 Event Reference 的 type/value 语义。

完整物理记录与参数 union 规则见:records/event.md

ActionType

Event +0x0CActionType

已闭合值

Value十进制当前安全语义关键参数状态
0x000目标 Country 全体相关单位士气 +1,持续 3 回合+0x14 = CountryRecordIdConfirmed
0x011目标 Country 全体相关单位士气 -1,持续 3 回合+0x14 = CountryRecordIdConfirmed
0x022目标 Country 全体相关单位士气 -2,持续 3 回合+0x14 = CountryRecordIdConfirmed
0x033目标 Country 全体相关单位士气 -3,持续 3 回合+0x14 = CountryRecordIdConfirmed
0x0D13普通 reinforcement / spawn 路径族参数布局仍需逐分支闭合Partial
0x0E14ownership / camp transfer 路径族目标域、顺序、异常边界仍未完全闭合Partial
0x1824airborne 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..0x0C0x0F..0x17 以及 0x18 之外的其他值,如果没有单独条目,应解释为:

text
current semantic status = Unknown
runtime support/validity = not established by this quick reference

这不是“这些值无效”的声明。

TriggerType

Event +0x08TriggerType

Android 1.28.0 的 1358 个原版 BTL 共含 15052 条 Event;corpus 中观察到的 TriggerType 恰为 0..5

Value十进制corpus 条数当前安全功能描述BehaviorStatusNameStatus
0x0001995direct EventId callback 的跨 Camp gate variant;stock corpus 强烈对应 CaptureEvent target roleCharacterizedUnknown
0x0111853stock Unit.DeathEventId target convention/family;激活本身按 EventIdCharacterizedUnknown
0x0222494scheduled / GameRound trigger familyFunctionConfirmedUnknown
0x033102direct EventId callback 的 Human-controller gate variantCharacterizedUnknown
0x0448495stock LinkedEvent continuation-target convention/family;激活本身按 EventIdCharacterizedUnknown
0x055113caller Country.RecordId gate + inclusive hex-radius 圈外→圈内 entry trigger familyFunctionConfirmedUnknown

这里的功能描述是研究侧 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_004759D8ldrsb 将 raw int8 符号扩展写入 Tile +0x150FUN_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    57

57/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 dispatch

FUN_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