外观
Event Record 事件记录
状态:Authoritative Reference v1
1. 物理结构
BTL Event record 固定为:
text
0x2C = 44 bytes当前最新 Event 磁盘 corpus 为 Android 1.30.0:
text
BTL files = 1383
Event records = 15674
parse pass = 1383 / 13831.29.0 继续承担 ActionType 0x19 native handler 与既有行为恢复的静态 authority;1.28.0 / 1358 BTL / 15052 Event 保留为更早历史 native/corpus 证据层。本轮 1.30 对原包 Event 记录和引用做全量重扫,并首次获得 ActionType 0x19 的 24 条官方 stock 正样本,但没有把这些磁盘正样本冒充 1.30 设备动态验收。
原版 FUN_00383274 复制完整 0x2C 记录并建立 Event 索引。Event 是固定物理容器 + trigger/action 类型依赖参数 union,所以不能把所有参数槽赋予一个跨 ActionType/TriggerType 永远成立的业务名称。
主要证据:
text
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/src/WC4.Runtime.BattleData/BtlRecords.cs
reconstruction/docs/rendering/event50101_opening_morale_event_recovery_20260723.md2. 完整 byte map
| Offset | Size | Raw type | 当前中文语义 / code name | 状态 | 写入边界 |
|---|---|---|---|---|---|
+0x00 | 4 | int32 LE | Event identity / Id | Confirmed | reference validation required |
+0x04 | 2 | int16 LE | linked Event ID / LinkedEventId | Confirmed | NoGo automatic repair |
+0x06 | 2 | int16 LE | linked Event delay / LinkedEventDelay | Confirmed | NoGo automatic repair |
+0x08 | 4 | int32 LE | trigger type / TriggerType | Confirmed dispatch | per-type writer NoGo |
+0x0C | 4 | int32 LE | action type / ActionType | Confirmed dispatch | per-type writer NoGo |
+0x10 | 4 | int32 LE | type-dependent parameter;Type5 scoped 为 caller-supplied Country.RecordId gate / Parameter10 | Partial | NoGo |
+0x14 | 4 | int32 LE | action-dependent target parameter;Country-scoped Action 0x00..0x03/0x06..0x0C/0x0E..0x0F/0x12..0x16/0x19 中为 CountryRecordId / TargetCountryRecordIdRaw | Confirmed scoped union / globally Partial | NoGo |
+0x18 | 4 | int32 LE | action-dependent parameter / ActionParameter | Partial | NoGo |
+0x1C | 2 | int16 LE | trigger condition low / TriggerConditionLow | Partial | NoGo |
+0x1E | 2 | int16 LE | trigger-side CountryRecordId-like parameter / TriggerCountryRecordIdRaw | Partial | NoGo |
+0x20 | 2 | int16 LE | trigger value;Type5 scoped 为 positive center/anchor TileId / TriggerValue | Partial | NoGo |
+0x22 | 1 | uint8 | Event disabled flag / disk seed;0=enabled、非零=disabled;Type5 enabled 时执行前还会 discard pending Move Undo rollback state / DisabledSeed | Confirmed active flag | NoGo |
+0x23 | 1 | uint8 | trigger radius/extension byte;Type5 scoped 为 inclusive hex-distance radius/threshold / TriggerRadiusOrExtension | Partial | NoGo |
+0x24 | 4 | int32 LE | dialogue ID / DialogueId | Confirmed | definition/reference validation required |
+0x28 | 1 | uint8 | disk executed-state seed / runtime executed state byte / ExecutedSeed | Confirmed active byte | NoGo |
+0x29..+0x2B | 3 | raw bytes | conventional 0xCC disk tail in normal records;不是强制 parser checksum | Confirmed convention / not validation | raw-preserve |
物理上 +0x28..+0x2B 也可以作为一个 uint32 RuntimeMarkerRaw 读取,但当前已确认的运行时活动位首先是 +0x28 的 executed byte。
3. +0x04/+0x06:Linked Event chain
磁盘上这两个 int16 连续存储;旧资料有时将 +0x04 起始的 32 位 word 描述为:
text
low16 = linked Event ID
high16 = linked Event delay当前强类型 parser 等价地拆成:
text
+0x04 LinkedEventId
+0x06 LinkedEventDelayEvent chain 是记录间引用,工具不能因为目标 Event 当前不可解析就自动重编号、删除或改成 0。
4. +0x14 不是 Country 数组索引
旧兼容访问器曾叫:
text
TargetCountryIndex但 ActionType 0..3 的原版 action switch 已确认:
text
BTL Event +0x14
-> FUN_003835B4
-> FUN_00346FB0
-> lookup runtime Country by Country.RecordId因此对已闭合的 morale actions,正式解释是:
text
TargetCountryRecordIdRaw不是 BtlCountryIndex。
event50101 动态证据进一步给出:
text
CountryRecordId 3 -> BTL Country slot 0
CountryRecordId 4 -> BTL Country slot 2二者并不等于数组下标,直接证明旧 Index 名称过强。
本轮 ActionType 全 switch 恢复后,+0x14 的 CountryRecordId scope 已扩展到:
text
0x00..0x03 morale
0x06..0x09 AI/Camp overrides
0x0A..0x0C BattleMoney/Gear/Atomic
0x0E..0x0F ownership / battlefield-clear
0x12..0x16 status remove/apply
0x19 GeneralId-targeted occupied-Tile/Unit transfer (1.29-only native branch)这些分支都由 executor 解析成 runtime Country context。其他 action 可不使用 +0x14 或走不同参数域,所以物理字段整体仍是 action-dependent union,不能无条件重命名成 Country ID。
4.1 +0x18 ActionParameter 的 scoped union
本轮已能把多数 stock Action 的 +0x18 直接按 ActionType 解释:
| ActionType | Event+0x18 当前安全解释 |
|---|---|
0x05 | center TileId |
0x06 | fallback AI behavior main type |
0x07 | new Camp value |
0x08 | primary scripted target TileId |
0x09 | land/sea transition restriction (Unit+0x140) |
0x0A | BattleMoney signed delta |
0x0B | BattleGear signed delta |
0x0C | BattleAtomic signed delta |
0x10 | target EventId to enable |
0x11 | target EventId to disable |
0x12..0x16 | status/effect definition ID |
0x18 | airborne reinforcement helper parameter;最终业务名仍 Partial |
0x19 | GeneralId / general-identity lookup key within target Country owned-Tile primary Units |
因此 +0x18 不能全局改成 TileId、EventId、资源 delta 或 status ID;它就是典型的 ActionType-discriminated union。
5. +0x1E TriggerCountryRecordIdRaw
Trigger-side Country 字段同样通过 FUN_00346FB0 按 runtime Country 的 record ID 解析。
当前已确认:
text
zero / negative
!= BTL Country slot 0这些值在已审计路径应保持 NotApplicable/特殊参数语义,而不是错误 fallback 到 Country 数组第 0 项。
旧兼容 alias TriggerCountryIndex 仅为历史 API,不应继续作为正式语义名称。
6. ActionType:1.30 stock 已覆盖 0x00..0x19
如果只需要快速查数值含义,可直接看 Event ActionType / TriggerType 值域速查。0..24 的既有功能语义见 reconstruction/docs/btl_event_action_type_semantic_characterization_v1_report.md;0x19 的 native handler 恢复见 reconstruction/docs/btl_event_android_1290_latest_baseline_and_action25_v1_report.md,1.30 stock 正样本见 reports/btl_reference/android_1300_baseline_and_elite_skin_index.json。
Android 1.30.0 stock 的 15674 条 Event 已观察到 ActionType 0..25 全部 26 个值;其中 0x19/25 从 1.29 的 native-supported / stock-count-0 状态提升为 1.30 stock count 24。1.29 ARM64 dispatcher 仍是该分支行为解释的 native authority;1.30 本轮给出的是官方 authoring/corpus 交叉证据。
| ActionType | 1.30 stock 条数 | 当前安全语义 | 状态 |
|---|---|---|---|
0x00 | 2330 | 目标 Country 主单位士气 +1,持续 3 回合 | Confirmed |
0x01 | 2206 | 士气 -1,持续 3 回合 | Confirmed |
0x02 | 848 | 士气 -2,持续 3 回合 | Confirmed |
0x03 | 111 | 士气 -3,持续 3 回合 | Confirmed |
0x04 | 3088 | 无 action-specific mutation;dialogue/continuation carrier | Characterized |
0x05 | 88 | +0x18 中心 Tile hazard level 2,六邻格 level 1 | FunctionConfirmed |
0x06 | 1957 | 目标 Country 主单位 fallback AI behavior main type | FunctionConfirmed |
0x07 | 444 | 修改目标 Country Camp 并刷新派生关系/地图状态 | FunctionConfirmed |
0x08 | 2236 | 目标 Country 主单位 primary scripted target TileId | FunctionConfirmed |
0x09 | 194 | 目标 Country 主单位 land/sea transition restriction | FunctionConfirmed |
0x0A | 482 | BattleMoney signed delta,夹到 0..9999 | FunctionConfirmed |
0x0B | 106 | BattleGear signed delta,夹到 0..9999 | FunctionConfirmed |
0x0C | 81 | BattleAtomic signed delta,夹到 0..9999 | FunctionConfirmed |
0x0D | 385 | 按 current Event.Id 生成 normal Reinforcement | FunctionConfirmed |
0x0E | 62 | 目标 Country 有主单位 owned Tiles 转交给第一个 Human Country | FunctionConfirmed |
0x0F | 54 | target-Country battlefield-clear family | Characterized |
0x10 | 34 | enable +0x18 指定 Event | FunctionConfirmed |
0x11 | 342 | disable +0x18 指定 Event | FunctionConfirmed |
0x12 | 21 | 从目标 Country 主单位移除 +0x18 status/effect | FunctionConfirmed |
0x13 | 186 | 添加/替换 status,duration counter 9999 | FunctionConfirmed |
0x14 | 21 | 添加/替换 status,duration counter 1 | FunctionConfirmed |
0x15 | 67 | 添加/替换 status,duration counter 2 | FunctionConfirmed |
0x16 | 222 | 添加/替换 status,duration counter 3 | FunctionConfirmed |
0x17 | 55 | 无 action-specific mutation;linked-continuation carrier | Characterized |
0x18 | 30 | airborne Reinforcement spawn path | FunctionConfirmed |
0x19 | 24 | 在 +0x14 目标 Country 中按 +0x18 GeneralId 找主单位,将其 occupied Tile/Unit 转给第一个 Human Country,并清 Unit+0x140 land/sea transition restriction | FunctionConfirmed / StockPositive1300 |
0x04 / 0x17 carrier
两项 native switch 都直接进入 common Dialogue / executed / LinkedEvent 流程,不做 action-specific mutation。corpus 中 0x04 有 2937/3002 条带 DialogueId;0x17 则 51/51 条带 LinkedEventId。因此可发布功能特征,但不宣称官方名是 Dialogue/Link。
0x05 Tile hazard
text
FUN_0036E3A4(Map, Event+0x18 centerTileId)
-> center Tile temporary hazard/movement-penalty level 2
-> 六方向邻格 level 1Tile+0xC8 的 battle update/tick/clear consumer 已由 fallback-AI hazard authority 闭合。
0x06 / 0x08 / 0x09 AI override
text
0x06 -> Unit+0x13C fallback behavior main type
0x08 -> Unit+0x144 primary scripted target TileId
0x09 -> Unit+0x140 land/sea transition restriction均遍历目标 Country owned Tiles 的 admitted primary Units。0x06 的参数值如何进入主行为 0..4、以及这些值在 fallback AI 中的实际分派和 mode2 特殊规则,见 Fallback AI 主行为 0~4。
0x07 Camp change
text
newCamp = Event+0x18
Country+0x3C = newCamp
-> refresh derived Country relation / Map stateBTL Country Camp 到 runtime +0x3C 的 projection 已独立闭合,所以这不是对 Camp 的猜测命名。
0x0A..0x0C Battle resources
三项对目标 Country 的混淆存储资源做 signed Event+0x18 delta 后 clamp 到 0..9999。Human UI key 分别明确为:
text
0x0A -> BattleMoney
0x0B -> BattleGear
0x0C -> BattleAtomic0x0D / 0x0E / 0x0F / 0x18
0x0D 把 current Event.Id 交给 FUN_0037BC88,按 Reinforcement +0x02 grouping key 生成 normal reinforcement。
0x0E 调 FUN_0048DEB4(targetCountry, FUN_003471B8());后者是第一个 Human-controlled Country。目标 Country owned Tiles 中只有带 primary Unit 的 Tile 由 FUN_00472708 转交 owner,并刷新 Unit/Building relation state。
0x0F 的 FUN_0048E074 会清目标 Country owned Tiles 的 primary Unit;对没有 Tile+0xA8 auxiliary object 的 Tile 还解除 owner,并清额外 Country runtime object state。因此只 Characterize 为 battlefield-clear/elimination-style cleanup,不冒充“投降/灭国”正式名称。
0x18 进入 FUN_0037C314(service, current Event.Id, Event+0x18) airborne reinforcement path;+0x18 最终业务名仍 Partial。
0x19:GeneralId-targeted ownership transfer
Android 1.28.0 Event dispatcher 只接受到 0x18;1.29.0 将上界扩展为 0x19 并新增独立 handler。1.30 stock corpus 现在提供 24 条正样本,因此该分支已经从“native-supported / no stock sample”提升为“native behavior recovered + official stock authoring positive”。
参数和行为链:
text
Event+0x14
-> Country.RecordId lookup
-> target Country
Event+0x18
-> GeneralId / general-identity key
-> 遍历 target Country owned Tiles
-> Tile+0xF0 primary Unit
-> Unit+0x78 general/skill runtime container
-> container+0x00 identity id equality
matching occupied Tile
-> transfer owner to first Human-controlled Country
-> refresh owned-Tile / Unit / attached-object relation state
-> primary Unit+0x140 land/sea transition restriction = 0因此当前安全描述是:按 GeneralId 找目标 Country 的主单位,将其 occupied Tile/Unit 归属转给第一个 Human Country,并把该单位 LandSeaTransitionRestriction 重置为 0。 这在用户侧很接近“指定将领转入玩家阵营/倒戈类”行为,但没有原版正式 enum/UI 名证据,所以正式名称仍为 Unknown。
1.30 的 24 条正样本来自 5 个 BTL:event21105 2 条、event21107 5 条、event21115 2 条、event21117 5 条、event80602 10 条。14 条使用 TriggerType 4,10 条使用 TriggerType 1。24/24 的 +0x14 CountryRecordId 都能命中本 BTL Country,且 24/24 的 +0x18 GeneralId 都能在该国家 owned Tiles 上唯一命中一个同 GeneralId Unit;没有 unresolved 或 multi-match。
一个重要边界仍是:没有 Unit+0x78 general/skill container 时,native identity getter 返回 0。因此 Event+0x18 == 0 不能被作者工具擅自解释为安全的“无将领 sentinel”;无匹配、重复匹配与动态表现异常边界也未用 1.30 设备验证,writer 继续 NoGo。
0x10 / 0x11 Event enable/disable,同时闭合 +0x22
完整 Event-manager 审计确认:
text
Event+0x22 == 0 -> enabled
Event+0x22 != 0 -> disabled;Type2 scanner/common executor 均跳过所以:
text
0x10 -> targetEventId = Event+0x18 -> target.+0x22 = 0 -> enable
0x11 -> targetEventId = Event+0x18 -> target.+0x22 = 1 -> disableType5 enabled 时还有执行前 discard pending movement rollback 的附加行为。
0x12..0x16 status remove/apply
0x12 通过 FUN_0047AEA4 按 status definition ID 删除 Unit status entry。
0x13..0x16 通过 FUN_0048E44C -> FUN_0047A04C 添加/替换 Event+0x18 status ID,duration counter 分别为 9999/1/2/3。FUN_0047A824 只在 entry 保存的 Country index 与当前 tick Country 匹配时递减该 counter,到 0 删除,因此这里正式描述为 matching-Country-turn duration counter。
特别注意:Battle action/completion namespace 的 command 0x14 是 Move Undo completion;它与 BTL Event ActionType 0x14 完全不同域。BTL 0x14 是上述 status duration-counter 1 action。
7. ActionType 的仍开放边界
现在开放项已经从“ActionType 大量未知”收窄为:
0x00..0x19的原版正式 enum/UI 名称;0x19已有 1.30 stock 24 条正样本,但仍缺 1.30 设备动态验收;GeneralId=0、无匹配/重复匹配的 author/runtime 边界仍 Unknown;0x0D/0x18Reinforcement 的完整占用、失败、表现时序;0x0E异常/null/context 边界;0x0FCountry 额外 runtime object cleanup 的完整业务名称;- status ID 的 definition 级效果表;
- 1.29 parser/native 对
0..25外数值的精确异常/合法边界; - writer validity 仍为
NoGo。
禁止把征服/集团军 JSON EventBuffSettings 的 type 编号混入 BTL Event ActionType;两者不是同一编号域。
8. TriggerType:原版正样本与功能特征
当前 1.30.0 corpus 的 15674 条 Event 对 TriggerType 的观察为:
| TriggerType | 1.30 条数 | 当前功能特征 | 行为状态 | 原版名称状态 |
|---|---|---|---|---|
0x00 | 2039 | direct EventId callback 的跨 Camp gate variant;stock corpus 强烈对应 CaptureEvent target role | Characterized | Unknown |
0x01 | 1950 | stock Unit.DeathEventId target convention/family;激活本身按 EventId | Characterized | Unknown |
0x02 | 2555 | scheduled / GameRound trigger family | FunctionConfirmed | Unknown |
0x03 | 102 | direct EventId callback 的 Human-controller gate variant | Characterized | Unknown |
0x04 | 8884 | stock LinkedEvent continuation-target convention/family;激活本身按 EventId | Characterized | Unknown |
0x05 | 144 | caller Country.RecordId gate + inclusive hex-radius 圈外→圈内 entry trigger family | FunctionConfirmed | Unknown |
0..5 是 stock corpus 的完整观察集合,不是 parser exact allowed-domain。所有功能短名都是研究侧 characterization,不声称是原版 enum 名。
0x02:回合调度族
FUN_00383420、FUN_00383484、FUN_003834D0、FUN_00383A74 的组合证据确认:
text
TriggerType == 2
Event +0x20 -> GameRound / zero-round comparison
Event +0x10 -> current-operation-Country gate(非 ActionType 4)带延迟的 LinkedEvent 也会由 common continuation/action 链安排到该族:
text
target round = current GameRound + LinkedEventDelay因此 0x02 可以安全描述为 scheduled / GameRound trigger family,但同回合排序、repeat/executed、missing linked target 和所有 mode 边界仍未完全闭合。
0x05:六角半径圈外→圈内 entry trigger family
Importer FUN_00383274 会把 Type5 额外加入 dedicated vector,FUN_00383C90 按 source/import 顺序扫描。精确判定已闭合为:
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+0x23FUN_0036E170 已由现有 Reconstruction authority 确认为六角 Tile 距离。因此 Type5 可以安全描述为:受 caller-supplied Country.RecordId 门控的 inclusive hex-radius 圈外→圈内 entry trigger family。
Type5 scoped 参数已经可以具体写成:
text
+0x10 = caller-supplied Country.RecordId equality gate
+0x20 = positive center/anchor TileId
+0x23 = inclusive hex-distance radius/thresholdRadius=0 有效,不是 unset;它表示精确进入 center Tile。若 previous/source TileId 为负数,outside-side 比较被跳过,只检查 current/destination 是否进入 radius。
1.30 的 144 条 stock Type5 中:+0x20>0 有 99 条、+0x20=0 有 45 条;+0x10=0 有 30 条,而全 1383 stock BTL 中仍没有 Country.RecordId=0。这些不满足初始 gate 的记录只标为 audited evaluator 下的 seed-ineligible,不宣称全局永久无效。
+0x22==0 会在执行前调用 FUN_0036E5D8(Map),且 1.30 的 144 条 stock Type5 全为 0。现在这套 Map state 已经闭合为 movement rollback / Move Undo transaction(研究侧功能名):Map+0x208 保存 movement source TileId,Map+0x20C 保存最终 moved-to TileId;FUN_0036E574 在临时 owner mutation 前把 {TileId, oldOwner} 记入 Map+0x1F0 rollback journal;FUN_0036E65C 会把 Unit 从 final Tile 搬回 source Tile,并逐条恢复 journal 中的 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 样本,不能擅自命名为 AllowUndo / DisableUndo / KeepMoveUndo 等正式字段。
Type5 的重复执行边界也进一步闭合到原版正常 battle save/resume。FUN_00383274 会把磁盘完整 0x2C Event record 复制成 runtime Event,1.30 stock 15674/15674 条 +0x28 ExecutedSeed 均为 0;common executor FUN_003835B4 在 Event 成功进入执行链后把 runtime Event+0x28 写为 1。所有已审计 Type5 scan 都先拒绝 +0x28 != 0。Route6 packed-save authority 又确认 Events section 按完整 0x2C/44-byte record 保存,resume 时每条记录仍由 FUN_00383274 完整恢复。post-load FUN_00334454 进入 Event core 的相关调用是 pending-resume FUN_00383DD0;它会读取 restored Event+0x28,非零时拒绝恢复执行并清 pending EventId,而不是清零 latch。因此:同一 runtime Event 执行后不会因重新进入半径而重复触发,而且该 executed 状态在已审计的原版 battle packed save/resume 后仍保持。 new battle/restart 会重新从 BTL seed 构造;debug/import/跨 battle carryover 不在本结论范围。
0x00 / 0x03:direct EventId callback 的精确 gate
FUN_00383AC8 是只接受 Type0/3 的 direct EventId callback:
text
Type0 -> new/current Country.Camp != old/context Country.Camp
Type3 -> new/current Country+0x158 == 0 (Human)
其他 TriggerType -> 该 callback 不接受共同前置包括 EventId 正值、old/context Country 非空、Event 存在且尚未执行。
在已审计 FUN_004D0ED4 owner-transition caller 中,old/context Country 是 transition 前 target Tile owner,new/current Country 是 current/operation Country。因此 Type0 是跨 Camp owner-transition gate,Type3 是新/current Country 的 Human gate。
1.29 corpus 对 Type0 的 stock authoring role 很强:2168 个正值 Building.CaptureEventId 中 2088 个(96.3100%)指向 Type0;1995 条 Type0 中 1857 条(93.0827%)至少被一个 CaptureEventId 引用。
Building+0x0E CaptureEventId -> runtime Tile+0x150 现在已经直接闭合:FUN_004759D8 用 ldrsb 从 Building +0x0E 读取并写入 Tile +0x150,FUN_004757E0 又把 Tile +0x150 用 strb 写回 Building +0x0E。因此这个 raw/runtime storage provenance 已从 Partial 升级为 Confirmed direct bidirectional projection。
Type3 仍只有 38/102 条被 Building.CaptureEventId 覆盖。把已知入边扩展为 Building.CaptureEventId + initial Unit.DeathEventId + Reinforcement spawned-Unit DeathEventId + LinkedEventId 后,102 条 Type3 分类为:
text
capture only 35
capture + linked 3
linked only 7
none among known sets 57initial Unit death 与 Reinforcement death 对 Type3 的入边均为 0;57/57 无已知入边记录又全部属于 MapSource=0 且 Event+0x22=0,因此 external-map 初始化和“初始 disabled 等待解锁”都不能解释它们。v2 又对 hash-bound 原版 ARM64 全 .text 做 direct-call 审计:FUN_00383BBC 只有 Unit-death 一个 direct BL caller,FUN_00383AC8 只有两个已审计 ownership/capture caller;没有发现 Building loader 之外新的 nonzero Tile+0x150 producer。57 条中仅 1 条被 ActionType 0x10/0x11 控制引用,而该引用只改 disabled flag,不执行 Event。跨 BTL 44-byte raw 与“忽略 EventId”的模板匹配也均为 0。
因此当前可以进一步收窄为:在已审计的原版 1.28 normal Battle activation graph 下 dormant / unreachable,机器状态 StronglySupportedNoKnownActivationUnderAuditedGraph。这仍不是 ConfirmedDeadCode:不排除未审计 computed/indirect 特殊入口、debug/tool/runtime mutation,也不声称原开发者故意留下死数据。完整证据见 reconstruction/docs/btl_event_trigger_type3_activation_reachability_v2_report.md。
这仍不授权把原版正式名称写成“敌军占领/玩家占领”。
0x01:Unit death EventId target 的 stock authoring family
现在已经可以建立完整 native provenance:
text
BTL Unit +0x2A DeathEventId
-> FUN_0048059c
-> runtime Unit +0x150 EventId
-> FUN_0047294c death processing
-> FUN_00383BBC(EventId)FUN_0048059c 直接把 raw Unit +0x2A 的 signed byte 写到 runtime Unit +0x150。FUN_0047294c 在死亡流程读取这个 runtime EventId,正值就调用通用 EventId dispatcher。
关键边界是:FUN_00383BBC 不检查目标 Event 的 TriggerType。
corpus 交叉验证:
text
Type1 Event 总数 1879
正值 Unit.DeathEventId 引用 2176
其中指向 Type1 的引用 2157 (99.1268%)
不同 death-target Event 1675
其中 Type1 1664 (99.3433%)
Type1 中至少被 DeathEventId 引用 1664 (88.5577%)所以 0x01 当前是 Characterized:可以安全描述为 stock Unit.DeathEventId target convention/family。但不能把它升级成“只有 Type1 才能被死亡引用”或“runtime 必须验证 Type1”,原版样本与 native dispatcher 都否定这种排他规则。
0x04:LinkedEvent continuation target 的 stock authoring family
FUN_003835B4 执行完当前 Event 后会按 LinkedEventId 在主 Event vector 找目标。
零延迟:
text
直接把 linked target 作为下一条 common execution record
不检查 target.TriggerType非零 LinkedEventDelay:
text
target.TriggerType = 2
target.+0x20 = current GameRound + LinkedEventDelay因此 delayed continuation 不靠某个 Type4 evaluator 等待,而是把目标 runtime Event 改成 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
有延迟且可解析 linked records 99
其中磁盘 target Type4 98所以 0x04 当前同样是 Characterized:安全描述为 stock LinkedEvent continuation-target convention/family,而不是“独立 Type4 predicate”。
Direct EventId dispatch
BTL Event 激活并不只依靠 TriggerType predicate scan。FUN_00383274 把所有 Event 放入主 Event vector,只把 Type5 额外加入 dedicated spatial vector;完整 audited Event-manager range 没有恢复出 Type1 或 Type4 的 autonomous scanner/evaluator。
FUN_00383BBC 按 EventId 直接进入执行链,FUN_00383DD0 恢复 pending Event,也都不要求目标 TriggerType。Building.CaptureEventId 的原版目标记录实际覆盖 TriggerType 0..5,可以作为“引用来源 ≠ 严格 TriggerType enum”的控制证据。
因此:
text
Type1 / Type4 role characterization = 强证据
原版正式 enum 名 = Unknown
strict runtime equality rule = 不成立
writer authority = NoGo完整证据入口:
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.json9. +0x28..+0x2B 的 00 CC CC CC
普通原版磁盘记录常见:
text
00 CC CC CC其中:
text
+0x28 = executed-state seed / runtime executed byte
+0x29..+0x2B = conventional 0xCC tail bytes全 1383 BTL / 15674 条 1.30 stock Event 中:
text
ExecutedSeed == 0 15674
nonzero 0FUN_00383274 复制完整 0x2C record,所以这个磁盘 byte 直接成为 runtime 初始 executed state;FUN_003835B4 的正常执行路径随后把它写成 1。已审计 Event-manager 核心范围没有发现正常清零路径。因此它不是只供磁盘展示的“padding 前导字节”,而是实际 runtime execution latch 的 seed。跨 save/load 的持久化仍未在本页闭合。
关键结论:原版 importer 不会因为这 4 字节不是 00 CC CC CC 就拒绝 Event。
所以社区说法:
Event 必须以
00 CC CC CC结尾,否则导入失败。
当前裁决:PartialRefutation。
它是正常磁盘 seed/padding convention,不是 parser checksum。
高保真工具仍应原样保存 +0x29..+0x2B,不能因为不是强校验就自动清零或重写。
10. Event 参数必须按 union 阅读
安全思路:
text
TriggerType
-> 解释 trigger 参数槽
ActionType
-> 解释 action 参数槽而不是:
text
固定 offset
-> 永远只有一个业务名称例如 +0x14 在 Action 0..3 中已经闭合为 CountryRecordId,但这不能推出所有 ActionType 都使用 Country。
因此作者工具如果未来开放 Event writer,应先建立:
text
ActionType × field meaning × reference domain × valid sentinel
TriggerType × field meaning × reference domain × valid sentinel的完整门禁矩阵,不能用一个通用属性面直接修改所有参数。
11. 当前 closure backlog
Event 是 BTL 长尾语义中当前较大的剩余块,重点包括:
- ActionType
0x00..0x18与 TriggerType0x00..0x05的原版正式 enum/UI 名称; - Type3 57 条 dormant/unreachable-under-audited-graph records 的 computed/indirect 特殊入口或 runtime mutation 证据;
- TriggerType
0x02的同回合排序、repeat/executed、ActionType-4 特例和 missing-linked-event 边界; - Type5 center/Country-gate seed-ineligible 记录的完整 lifecycle,以及 stock 没有 enabledFlag 非零 Type5 正样本的边界;
0x0D/0x18Reinforcement 完整占用/失败/表现时序;0x0E异常/null/context 边界;0x0FCountry 额外 runtime object cleanup;- status definition 逐 ID 效果、stack/替换边界;
- LinkedEvent cycle/re-entry、presentation defer、pending resume 与 missing target 的完整异常边界;
ActionType 0..24外 parser/runtime validity,以及+0x10/+0x14/+0x18union 剩余长尾;- dialogue/carrier 的 UI/presentation 精确时序;
- 非法 Country/Event/Tile 引用的原版异常/跳过/反馈行为。
物理 0x2C record 已闭合;这里剩下的是 runtime union semantics,而不是文件长度问题。