Skip to content

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 / 1383

1.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.md

2. 完整 byte map ​

OffsetSizeRaw type当前中文语义 / code name状态写入边界
+0x004int32 LEEvent identity / IdConfirmedreference validation required
+0x042int16 LElinked Event ID / LinkedEventIdConfirmedNoGo automatic repair
+0x062int16 LElinked Event delay / LinkedEventDelayConfirmedNoGo automatic repair
+0x084int32 LEtrigger type / TriggerTypeConfirmed dispatchper-type writer NoGo
+0x0C4int32 LEaction type / ActionTypeConfirmed dispatchper-type writer NoGo
+0x104int32 LEtype-dependent parameter;Type5 scoped 为 caller-supplied Country.RecordId gate / Parameter10PartialNoGo
+0x144int32 LEaction-dependent target parameter;Country-scoped Action 0x00..0x03/0x06..0x0C/0x0E..0x0F/0x12..0x16/0x19 中为 CountryRecordId / TargetCountryRecordIdRawConfirmed scoped union / globally PartialNoGo
+0x184int32 LEaction-dependent parameter / ActionParameterPartialNoGo
+0x1C2int16 LEtrigger condition low / TriggerConditionLowPartialNoGo
+0x1E2int16 LEtrigger-side CountryRecordId-like parameter / TriggerCountryRecordIdRawPartialNoGo
+0x202int16 LEtrigger value;Type5 scoped 为 positive center/anchor TileId / TriggerValuePartialNoGo
+0x221uint8Event disabled flag / disk seed;0=enabled、非零=disabled;Type5 enabled 时执行前还会 discard pending Move Undo rollback state / DisabledSeedConfirmed active flagNoGo
+0x231uint8trigger radius/extension byte;Type5 scoped 为 inclusive hex-distance radius/threshold / TriggerRadiusOrExtensionPartialNoGo
+0x244int32 LEdialogue ID / DialogueIdConfirmeddefinition/reference validation required
+0x281uint8disk executed-state seed / runtime executed state byte / ExecutedSeedConfirmed active byteNoGo
+0x29..+0x2B3raw bytesconventional 0xCC disk tail in normal records;不是强制 parser checksumConfirmed convention / not validationraw-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 LinkedEventDelay

Event 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 解释:

ActionTypeEvent+0x18 当前安全解释
0x05center TileId
0x06fallback AI behavior main type
0x07new Camp value
0x08primary scripted target TileId
0x09land/sea transition restriction (Unit+0x140)
0x0ABattleMoney signed delta
0x0BBattleGear signed delta
0x0CBattleAtomic signed delta
0x10target EventId to enable
0x11target EventId to disable
0x12..0x16status/effect definition ID
0x18airborne reinforcement helper parameter;最终业务名仍 Partial
0x19GeneralId / 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 交叉证据。

ActionType1.30 stock 条数当前安全语义状态
0x002330目标 Country 主单位士气 +1,持续 3 回合Confirmed
0x012206士气 -1,持续 3 回合Confirmed
0x02848士气 -2,持续 3 回合Confirmed
0x03111士气 -3,持续 3 回合Confirmed
0x043088无 action-specific mutation;dialogue/continuation carrierCharacterized
0x0588+0x18 中心 Tile hazard level 2,六邻格 level 1FunctionConfirmed
0x061957目标 Country 主单位 fallback AI behavior main typeFunctionConfirmed
0x07444修改目标 Country Camp 并刷新派生关系/地图状态FunctionConfirmed
0x082236目标 Country 主单位 primary scripted target TileIdFunctionConfirmed
0x09194目标 Country 主单位 land/sea transition restrictionFunctionConfirmed
0x0A482BattleMoney signed delta,夹到 0..9999FunctionConfirmed
0x0B106BattleGear signed delta,夹到 0..9999FunctionConfirmed
0x0C81BattleAtomic signed delta,夹到 0..9999FunctionConfirmed
0x0D385按 current Event.Id 生成 normal ReinforcementFunctionConfirmed
0x0E62目标 Country 有主单位 owned Tiles 转交给第一个 Human CountryFunctionConfirmed
0x0F54target-Country battlefield-clear familyCharacterized
0x1034enable +0x18 指定 EventFunctionConfirmed
0x11342disable +0x18 指定 EventFunctionConfirmed
0x1221从目标 Country 主单位移除 +0x18 status/effectFunctionConfirmed
0x13186添加/替换 status,duration counter 9999FunctionConfirmed
0x1421添加/替换 status,duration counter 1FunctionConfirmed
0x1567添加/替换 status,duration counter 2FunctionConfirmed
0x16222添加/替换 status,duration counter 3FunctionConfirmed
0x1755无 action-specific mutation;linked-continuation carrierCharacterized
0x1830airborne Reinforcement spawn pathFunctionConfirmed
0x1924在 +0x14 目标 Country 中按 +0x18 GeneralId 找主单位,将其 occupied Tile/Unit 转给第一个 Human Country,并清 Unit+0x140 land/sea transition restrictionFunctionConfirmed / 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 1

Tile+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 state

BTL 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 -> BattleAtomic

0x0D / 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 -> disable

Type5 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/0x18 Reinforcement 的完整占用、失败、表现时序;
  • 0x0E 异常/null/context 边界;
  • 0x0F Country 额外 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 的观察为:

TriggerType1.30 条数当前功能特征行为状态原版名称状态
0x002039direct EventId callback 的跨 Camp gate variant;stock corpus 强烈对应 CaptureEvent target roleCharacterizedUnknown
0x011950stock Unit.DeathEventId target convention/family;激活本身按 EventIdCharacterizedUnknown
0x022555scheduled / GameRound trigger familyFunctionConfirmedUnknown
0x03102direct EventId callback 的 Human-controller gate variantCharacterizedUnknown
0x048884stock LinkedEvent continuation-target convention/family;激活本身按 EventIdCharacterizedUnknown
0x05144caller Country.RecordId gate + inclusive hex-radius 圈外→圈内 entry trigger familyFunctionConfirmedUnknown

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+0x23

FUN_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/threshold

Radius=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    57

initial 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.json

9. +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                  0

FUN_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 长尾语义中当前较大的剩余块,重点包括:

  1. ActionType 0x00..0x18 与 TriggerType 0x00..0x05 的原版正式 enum/UI 名称;
  2. Type3 57 条 dormant/unreachable-under-audited-graph records 的 computed/indirect 特殊入口或 runtime mutation 证据;
  3. TriggerType 0x02 的同回合排序、repeat/executed、ActionType-4 特例和 missing-linked-event 边界;
  4. Type5 center/Country-gate seed-ineligible 记录的完整 lifecycle,以及 stock 没有 enabledFlag 非零 Type5 正样本的边界;
  5. 0x0D/0x18 Reinforcement 完整占用/失败/表现时序;0x0E 异常/null/context 边界;0x0F Country 额外 runtime object cleanup;
  6. status definition 逐 ID 效果、stack/替换边界;
  7. LinkedEvent cycle/re-entry、presentation defer、pending resume 与 missing target 的完整异常边界;
  8. ActionType 0..24 外 parser/runtime validity,以及 +0x10/+0x14/+0x18 union 剩余长尾;
  9. dialogue/carrier 的 UI/presentation 精确时序;
  10. 非法 Country/Event/Tile 引用的原版异常/跳过/反馈行为。

物理 0x2C record 已闭合;这里剩下的是 runtime union semantics,而不是文件长度问题。

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