Skip to content

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 条数当前安全语义关键参数状态
0x0002330目标 Country 主单位士气 +1,持续 3 回合+0x14 = CountryRecordIdConfirmed
0x0112206士气 -1,持续 3 回合+0x14 = CountryRecordIdConfirmed
0x022848士气 -2,持续 3 回合+0x14 = CountryRecordIdConfirmed
0x033111士气 -3,持续 3 回合+0x14 = CountryRecordIdConfirmed
0x0443088无 action-specific mutation;dialogue/continuation carrier familyDialogue/LinkedEvent 走 common 流程Characterized
0x05588临时 Tile hazard / movement-penalty:中心 level 2,六邻格 level 1+0x18 = center TileIdFunctionConfirmed
0x0661957设置目标 Country 主单位 fallback AI behavior main type+0x18 -> Unit+0x13CFunctionConfirmed
0x077444修改目标 Country Camp 并刷新派生关系/地图状态+0x18 -> Country+0x3CFunctionConfirmed
0x0882236设置目标 Country 主单位 primary scripted target TileId+0x18 -> Unit+0x144FunctionConfirmed
0x099194设置目标 Country 主单位 land/sea transition restriction+0x18 -> Unit+0x140FunctionConfirmed
0x0A10482BattleMoney signed delta,结果夹到 0..9999+0x18 = signed deltaFunctionConfirmed
0x0B11106BattleGear signed delta,结果夹到 0..9999+0x18 = signed deltaFunctionConfirmed
0x0C1281BattleAtomic signed delta,结果夹到 0..9999+0x18 = signed deltaFunctionConfirmed
0x0D13385按当前 Event.Id 生成 normal Reinforcement recordsReinforcement +0x02 grouping keyFunctionConfirmed
0x0E1462将目标 Country 有主单位的 owned Tiles 转交给第一个 Human Country+0x14 = target CountryRecordIdFunctionConfirmed
0x0F1554target-Country battlefield-clear family:清主单位,并解除无 Tile+0xA8 对象 Tile 的 owner+0x14 = target CountryRecordIdCharacterized
0x101634enable +0x18 指定 Eventtarget.Event+0x22 = 0FunctionConfirmed
0x1117342disable +0x18 指定 Eventtarget.Event+0x22 = 1FunctionConfirmed
0x121821从目标 Country 主单位移除 +0x18 status/effect ID+0x18 = status IDFunctionConfirmed
0x1319186添加/替换 status/effect,matching-Country-turn duration counter 9999+0x18 = status IDFunctionConfirmed
0x142021添加/替换 status/effect,duration counter 1+0x18 = status IDFunctionConfirmed
0x152167添加/替换 status/effect,duration counter 2+0x18 = status IDFunctionConfirmed
0x1622222添加/替换 status/effect,duration counter 3+0x18 = status IDFunctionConfirmed
0x172355无 action-specific mutation;linked-continuation carrier familyLinkedEvent/common 流程Characterized
0x182430airborne Reinforcement spawn pathcurrent Event.Id + +0x18 helper parameterFunctionConfirmed
0x192524按 GeneralId 找目标 Country 主单位,将其 occupied Tile/Unit 转给第一个 Human Country,并清该 Unit land/sea transition restriction+0x14 = target CountryRecordId;+0x18 = GeneralId/general identity keyFunctionConfirmed / 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 条数当前安全功能描述BehaviorStatusNameStatus
0x0002039direct EventId callback 的跨 Camp gate variant;stock corpus 强烈对应 CaptureEvent target roleCharacterizedUnknown
0x0111950stock Unit.DeathEventId target convention/family;激活本身按 EventIdCharacterizedUnknown
0x0222555scheduled / GameRound trigger familyFunctionConfirmedUnknown
0x033102direct EventId callback 的 Human-controller gate variantCharacterizedUnknown
0x0448884stock LinkedEvent continuation-target convention/family;激活本身按 EventIdCharacterizedUnknown
0x055144caller 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;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    57

57/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 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 总数                         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

除另有说明外,本站有权许可的原创文档采用 CC BY-SA 4.0;第三方内容除外。