外观
Event 类型值域速查
状态:Authoritative Reference v1 / Incomplete Enum Closure
本页只汇总已经进入当前 Event Reference 的 type/value 语义。
完整物理记录与参数 union 规则见:records/event.md。
ActionType
Event +0x0C 为 ActionType。
1.30 stock + 1.29 native 0x00..0x19 功能速查
Android 1.30.0 的 15674 条 stock Event 已观察到完整 ActionType 0..25。其中 0x19 / 25 在 1.29 原版 ARM64 中已经由 dispatcher 和独立 handler 证明为 native-supported,但当时 stock count 为 0;1.30 现在首次提供 24 条官方正样本。1.29 对 0..24 的 jump-table 与 1.28 保持同序的 native 证据继续作为行为 authority,1.30 本轮补充的是 stock authoring/corpus 证据,不把静态恢复冒充 1.30 动态设备验收。这里仍不把研究侧短名冒充原版 enum 名,也不从当前上界自动推导 writer 权限。
| Value | 十进制 | 1.30 stock 条数 | 当前安全语义 | 关键参数 | 状态 |
|---|---|---|---|---|---|
0x00 | 0 | 2330 | 目标 Country 主单位士气 +1,持续 3 回合 | +0x14 = CountryRecordId | Confirmed |
0x01 | 1 | 2206 | 士气 -1,持续 3 回合 | +0x14 = CountryRecordId | Confirmed |
0x02 | 2 | 848 | 士气 -2,持续 3 回合 | +0x14 = CountryRecordId | Confirmed |
0x03 | 3 | 111 | 士气 -3,持续 3 回合 | +0x14 = CountryRecordId | Confirmed |
0x04 | 4 | 3088 | 无 action-specific mutation;dialogue/continuation carrier family | Dialogue/LinkedEvent 走 common 流程 | Characterized |
0x05 | 5 | 88 | 临时 Tile hazard / movement-penalty:中心 level 2,六邻格 level 1 | +0x18 = center TileId | FunctionConfirmed |
0x06 | 6 | 1957 | 设置目标 Country 主单位 fallback AI behavior main type | +0x18 -> Unit+0x13C | FunctionConfirmed |
0x07 | 7 | 444 | 修改目标 Country Camp 并刷新派生关系/地图状态 | +0x18 -> Country+0x3C | FunctionConfirmed |
0x08 | 8 | 2236 | 设置目标 Country 主单位 primary scripted target TileId | +0x18 -> Unit+0x144 | FunctionConfirmed |
0x09 | 9 | 194 | 设置目标 Country 主单位 land/sea transition restriction | +0x18 -> Unit+0x140 | FunctionConfirmed |
0x0A | 10 | 482 | BattleMoney signed delta,结果夹到 0..9999 | +0x18 = signed delta | FunctionConfirmed |
0x0B | 11 | 106 | BattleGear signed delta,结果夹到 0..9999 | +0x18 = signed delta | FunctionConfirmed |
0x0C | 12 | 81 | BattleAtomic signed delta,结果夹到 0..9999 | +0x18 = signed delta | FunctionConfirmed |
0x0D | 13 | 385 | 按当前 Event.Id 生成 normal Reinforcement records | Reinforcement +0x02 grouping key | FunctionConfirmed |
0x0E | 14 | 62 | 将目标 Country 有主单位的 owned Tiles 转交给第一个 Human Country | +0x14 = target CountryRecordId | FunctionConfirmed |
0x0F | 15 | 54 | target-Country battlefield-clear family:清主单位,并解除无 Tile+0xA8 对象 Tile 的 owner | +0x14 = target CountryRecordId | Characterized |
0x10 | 16 | 34 | enable +0x18 指定 Event | target.Event+0x22 = 0 | FunctionConfirmed |
0x11 | 17 | 342 | disable +0x18 指定 Event | target.Event+0x22 = 1 | FunctionConfirmed |
0x12 | 18 | 21 | 从目标 Country 主单位移除 +0x18 status/effect ID | +0x18 = status ID | FunctionConfirmed |
0x13 | 19 | 186 | 添加/替换 status/effect,matching-Country-turn duration counter 9999 | +0x18 = status ID | FunctionConfirmed |
0x14 | 20 | 21 | 添加/替换 status/effect,duration counter 1 | +0x18 = status ID | FunctionConfirmed |
0x15 | 21 | 67 | 添加/替换 status/effect,duration counter 2 | +0x18 = status ID | FunctionConfirmed |
0x16 | 22 | 222 | 添加/替换 status/effect,duration counter 3 | +0x18 = status ID | FunctionConfirmed |
0x17 | 23 | 55 | 无 action-specific mutation;linked-continuation carrier family | LinkedEvent/common 流程 | Characterized |
0x18 | 24 | 30 | airborne Reinforcement spawn path | current Event.Id + +0x18 helper parameter | FunctionConfirmed |
0x19 | 25 | 24 | 按 GeneralId 找目标 Country 主单位,将其 occupied Tile/Unit 转给第一个 Human Country,并清该 Unit land/sea transition restriction | +0x14 = target CountryRecordId;+0x18 = GeneralId/general identity key | FunctionConfirmed / StockPositive1300 |
0x09 参数值:海陆转换限制
ActionType 0x09 的 +0x18 不是 AI subtype,而是直接写入目标 Country 主单位的 Unit+0x140 LandSeaTransitionRestriction。Android 1.28 common path consumer 已确认:
+0x18 | 当前机械语义 | 说明 |
|---|---|---|
0 | 本字段不额外禁止海陆转换 | 不代表无其他地形/单位规则 |
1 | 禁止海→陆 | 已在海上的单位不能通过普通路径上岸;不是绝对 SeaOnly |
2 | 禁止陆→海 | 陆上单位不能通过普通路径下海/登船;若已经在海上,仍可海上移动并可上岸 |
该限制由玩家与 AI 共用的普通 path legality 消费;海陆转换的移动力 penalty 是另一套机制,不能用“免登船/登陆移动力”推导可以绕过这里的方向禁令。原作者 enum/UI 名仍 Unknown。
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 的几个关键结构族
0x04 / 0x17 的 native branch 都没有 action-specific mutation,但 common 流程仍会执行 Dialogue、executed latch 和 LinkedEvent。1.30 corpus 中 0x04 有 3022/3088 条带 DialogueId;0x17 则 55/55 条带 LinkedEventId,因此分别可 Characterize 为 dialogue/continuation carrier 与 linked-continuation carrier。
0x10 / 0x11 同时把 Event+0x22 的通用语义闭合为 disabled flag:Type2 scanner 和 common executor 都在 +0x22 != 0 时跳过 Event。因此 0x10 是 enable target Event,0x11 是 disable target Event。
0x12..0x16 是 status remove/apply family:0x12 删除 +0x18 指定 status;0x13..0x16 通过 FUN_0047A04C 添加/替换同一 status,并分别写 duration counter 9999/1/2/3。FUN_0047A824 只在 status entry 保存的 Country index 与当前 tick Country 匹配时递减 counter,到 0 移除,因此 Reference 使用更精确的 matching-Country-turn duration counter,不直接把所有模式下都简化成全局回合数。
0x19 是 1.29 新增 native branch:1.28 dispatcher 对 >0x18 直接走 default,1.29 则接受到 0x19。它先用 +0x14 CountryRecordId 取得目标 Country,再沿该 Country owned-Tile 链按 +0x18 匹配 primary Unit 的 Unit+0x78 general/skill container -> +0x00 identity;匹配后把该 occupied Tile/Unit owner 转给第一个 Human Country,并把 Unit+0x140 LandSeaTransitionRestriction 写 0。
1.30 首次出现 24 条 stock 0x19:分布于 event21105/21107/21115/21117/event80602.btl 五个文件;其中 TriggerType 4 有 14 条、TriggerType 1 有 10 条。24/24 的 +0x14 都能解析当前 BTL 的 Country.RecordId,24/24 的 +0x18 都在该目标 Country owned Tiles 上唯一命中一个同 GeneralId 的 Unit,0 条 unresolved / 0 条 multi-match。这把 1.29 native 恢复出来的参数解释与 1.30 官方 authoring 数据直接对齐。
正式 enum/UI 名、GeneralId=0 author-side 合法性、无匹配时的完整反馈和 1.30 设备动态表现仍 Unknown;writer 继续 NoGo。
注意:Battle action/completion command namespace 也存在数值 0x14,其已确认行为是 movement rollback / Move Undo completion;该 0x14 与本页 BTL Event.ActionType 0x14 不同域。BTL 0x14 是 status duration-counter 1 的 action。
TriggerType
Event +0x08 为 TriggerType。
Android 1.30.0 的 1383 个原版 BTL 共含 15674 条 Event;corpus 中观察到的 TriggerType 仍恰为 0..5:
| Value | 十进制 | 1.30 corpus 条数 | 当前安全功能描述 | BehaviorStatus | NameStatus |
|---|---|---|---|---|---|
0x00 | 0 | 2039 | direct EventId callback 的跨 Camp gate variant;stock corpus 强烈对应 CaptureEvent target role | Characterized | Unknown |
0x01 | 1 | 1950 | stock Unit.DeathEventId target convention/family;激活本身按 EventId | Characterized | Unknown |
0x02 | 2 | 2555 | scheduled / GameRound trigger family | FunctionConfirmed | Unknown |
0x03 | 3 | 102 | direct EventId callback 的 Human-controller gate variant | Characterized | Unknown |
0x04 | 4 | 8884 | stock LinkedEvent continuation-target convention/family;激活本身按 EventId | Characterized | Unknown |
0x05 | 5 | 144 | 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;1.30 的 144 条 stock Type5 中有 61 条为 0,其中 16 条同时具有正 center 和可解析的非零 Country gate。
如果 previous/source TileId < 0,原版跳过 outside-side distance 比较,只检查 current/destination 是否位于 radius 内。
+0x22 == 0 时,evaluator 会在执行前调用 FUN_0036E5D8(Map);1.30 的 144 条 stock Type5 的 +0x22 仍全部为 0。该 Map state 现在已经闭合为 movement rollback / Move Undo transaction(研究侧功能名):Map+0x208 是 source TileId,Map+0x20C 是 final moved-to TileId;Map+0x1F0 journal 记录移动事务中临时改 owner 前的 {TileId, oldOwner};FUN_0036E65C 会把 Unit 从 final Tile 搬回 source Tile并恢复这些 old owner。FUN_0036E5D8 不执行 rollback,而是直接释放 journal、清除 active state。因此 Type5 scoped 下,+0x22==0 可以安全描述为:common Event execution 前 discard / invalidate 当前 pending movement rollback / Move Undo state。 非零值只证明跳过这次 discard call;stock 没有 Type5 非零样本,正式字段名仍 Unknown。
Type5 也不是“离开后再进入就可以无限重复”的区域触发。Importer FUN_00383274 将磁盘 Event+0x28 直接复制为 runtime executed state;当前 1.30 corpus 的 15674/15674 条 stock Event 和 144/144 条 Type5 的 seed 都是 0。common executor FUN_003835B4 成功执行 Event 后将 runtime +0x28 写为 1,后续 Type5 scan 首先拒绝非零 executed state。更进一步,原版 Battle packed save 会按完整 0x2C Event record 保存该 byte,resume 时又用 FUN_00383274 完整恢复;post-load pending-resume FUN_00383DD0 会尊重 restored +0x28,非零时拒绝再次执行而不是清零。因此同一 Event 执行后不仅当前 runtime 不会重触发,在已审计的原版 battle save/resume 后也继续保持 executed。 new battle/restart 重新从 BTL seed 构造;其他 debug/import/跨 battle 路径不在当前结论范围。
corpus 还有一个重要 seed 边界:
text
Type5 总数 144
+0x20 > 0 99
+0x20 == 0 45
+0x10 == 0 30
全 1383 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 名直接命名成“敌军占领/玩家占领”。
1.29 stock corpus 对 Type0 还提供了很强的 authoring-role 证据:2168 个正值 Building.CaptureEventId 引用中 2088 个(96.3100%)指向 Type0;1995 条 Type0 中有 1857 条(93.0827%)至少被一个 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 且 Event+0x22=0;initial/reinforcement death 对 Type3 入边均为 0。v2 全 SO direct-call audit 进一步确认:FUN_00383bbc 只有 Unit-death 一个 direct caller,FUN_00383ac8 只有两个已审计 ownership/capture caller;没有恢复出 Building loader 之外新的 nonzero Tile+0x150 producer。57 条中只有 1 条被 Event enable/disable action 控制引用,而这种引用不执行 Event;跨文件 raw/忽略 EventId 模板匹配也均为 0。
所以当前最强安全描述已升级为:在已审计的原版 1.28 normal Battle activation graph 下 dormant / unreachable(StronglySupportedNoKnownActivationUnderAuditedGraph),但仍不宣称全局 ConfirmedDeadCode,也不推断原开发者为何保留这些记录。
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 总数 1879
正值 Unit.DeathEventId 引用 2176
其中指向 Type1 的 Unit 引用 2157 (99.1268%)
不同 death-target Event 1675
其中 Type1 1664 (99.3433%)
Type1 中至少被一个 DeathEventId 引用 1664 (88.5577%)少量非 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 再进入回合调度。
1.30 原版 corpus 关联:
text
Type4 Event 总数 8884
LinkedEvent 记录 9341
不同且可解析 linked-target Event 8947
其中 Type4 8773 (98.0552%)
Type4 中至少被一个 LinkedEventId 引用 8773 (98.7506%)
missing linked-target records 22
有延迟且可解析 LinkedEvent 99
其中磁盘目标 Type4 98因此安全描述是:
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
reconstruction/docs/btl_event_type5_move_undo_and_resume_lifecycle_v1_report.md
reports/btl_semantic_recovery/event_type5_move_undo_and_resume_lifecycle_v1/type5_move_undo_and_resume_lifecycle.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
reconstruction/docs/btl_event_android_1290_latest_baseline_and_action25_v1_report.md
reports/btl_semantic_recovery/event_android_1290_latest_baseline_v1/latest_baseline.json
reports/btl_v1280_so_recovery.md
reconstruction/docs/rendering/event50101_opening_morale_event_recovery_20260723.md
reports/btl_third_party_validation_matrix.csv