Skip to content

Unit Record 单位记录 ​

状态:Authoritative Reference v1

1. 记录版本 ​

Unit 有两种磁盘长度:

BTL 版本磁盘长度原版加载路径
v10x30FUN_0048052C 先扩展到 common 0x40 表示,再进入正常加载
v2/v30x40FUN_0048059C 直接消费 common 记录

原版 Unit 构造主链:

text
raw Unit record
-> resolve Tile from +0x00
-> resolve ArmySettings from Army/Country/Ranking/Formation inputs
-> allocate runtime Unit
-> FUN_00476580 initialize
-> FUN_0048059C apply disk state
-> attach to Tile and Country collections

因此本页描述的是 BTL 磁盘记录,不是 runtime Unit 对象布局。

当前最新 1.30.0 corpus:

text
Unit total = 133934
v1         = 17179
v2/v3      = 116755

主要证据:

text
reports/btl_v1280_so_recovery.md
reports/btl_editor/round4/field_write_whitelist_matrix.csv
reconstruction/src/WC4.Runtime.BattleData/BtlRecords.cs

2. 完整 byte map ​

说明:

  • Confirmed 表示该行所写的具体语义已确认,不代表所有值域和运行时后续写入都闭合;
  • Partial 表示用途范围已知但完整业务语义仍开放;
  • Unknown 表示不得用经验名称填空;
  • NoGo 写入状态表示当前 Reference 明确不授权按该解释修改;
  • 其余字段的实际写权限由当前 BTL writer 产品门禁另行裁决,本 Reference 不自动授予写权限。
OffsetSizeRaw type当前中文语义 / code name版本语义状态写入状态
+0x002uint16 LEUnit Tile ID / TileIdv1-v3ConfirmedNotAssessed
+0x021uint8Army bucket / ArmyTypeId,参与 ArmySettings 解析v1-v3ConfirmedNotAssessed
+0x031uint8Ranking / effective elite level raw / Level;不是普通 HUD 经验等级v1-v3ConfirmedNotAssessed
+0x041uint8编制 / Formationv1-v3ConfirmedNotAssessed
+0x051uint8朝向 / Directionv1-v3ConfirmedNotAssessed
+0x061int8初始移动/运行状态 / MovementRawv1-v3PartialNotAssessed
+0x071uint8初始回合/行动状态 / TurnStateRawv1-v3PartialNotAssessed
+0x082int16 LE未闭合 scalar / Stat08Rawv1-v3UnknownNoGo
+0x0A2int16 LE未闭合 scalar / Stat0ARawv1-v3UnknownNoGo
+0x0C2int16 LE初始当前 HP / CurrentHpv1-v3ConfirmedNotAssessed
+0x0E2int16 LE初始最大 HP / MaximumHpv1-v3ConfirmedNotAssessed
+0x102int16 LE将领 ID / GeneralIdv1-v3ConfirmedNotAssessed
+0x121uint8将领军衔 / GeneralRankv1-v3ConfirmedNotAssessed
+0x131uint8将领品质 / GeneralQualityv1-v3ConfirmedNotAssessed
+0x14..+0x163raw byteslegacy/unknown bytes;不是将领装备槽v1-v3UnknownNoGo
+0x171uint8技能等级槽 0v1-v3ConfirmedNotAssessed
+0x181uint8技能等级槽 1v1-v3ConfirmedNotAssessed
+0x191uint8技能等级槽 2v1-v3ConfirmedNotAssessed
+0x1A1uint8技能等级槽 3v1-v3ConfirmedNotAssessed
+0x1B1uint8技能等级槽 4v1-v3ConfirmedNotAssessed
+0x1C1int8单位目标标记 / ObjectiveMarkerv1-v3ConfirmedNotAssessed
+0x1D1uint8persistent fallback AI main behavior / FallbackBehaviorMainTypev1-v3ConfirmedNotAssessed
+0x1E1uint8persistent land/sea transition restriction / LandSeaTransitionRestriction;0 不加方向禁令、1 禁止海→陆、2 禁止陆→海v1-v3Confirmed mechanism;official enum names UnknownNotAssessed
+0x1F1int8signed AI priority / PriorityRawv1-v3ConfirmedNotAssessed
+0x202int16 LEpersistent primary scripted target TileId / PrimaryScriptedTargetTileIdv1-v3Confirmed field roleNoGo
+0x222int16 LEArmyAIConfig group ID / ArmyAiConfigurationIdv1-v3ConfirmedNotAssessed
+0x241int8behavior state / BehaviorStateRawv1-v3ConfirmedNotAssessed
+0x251uint8 rawBattleMode 6 / Frontier 相关 override gate/inputv1-v3PartialNoGo
+0x262int16 LEpersistent ArmyAIConfig schedule counter / ArmyAiScheduleCounterv1-v3ConfirmedNotAssessed
+0x281uint8初始士气状态 / MoraleRawv1-v3ConfirmedNotAssessed
+0x291uint8初始士气持续回合 / MoraleDurationRawv1-v3ConfirmedNotAssessed
+0x2A1int8死亡 Event ID / DeathEventIdv1-v3ConfirmedNotAssessed
+0x2B1packed uint8mixed active flags / PackedFlags2Bv1-v3PartialNoGo
+0x2C1uint8defensive-distance raw / DefensiveDistanceRawv1-v3PartialNoGo
+0x2D1raw byte已确认可加载到 runtime counter-qualification blocker;完整生命周期/含义未闭合v1-v3PartialNoGo
+0x2E1raw byte未闭合v1-v3UnknownNoGo
+0x2F1uint8 rawElite skin index raw / EliteSkinIndexRaw;1.30 官方正样本与 EliteSkinSettings.Index 对齐v1-v3字段身份 Confirmed;完整值域 PartialNoGo
+0x301compressed uint8General equipment slot 0:medal-family codev2/v3ConfirmedNotAssessed
+0x311compressed uint8General equipment slot 1:medal-family codev2/v3ConfirmedNotAssessed
+0x321compressed uint8General equipment slot 2:medal-family codev2/v3ConfirmedNotAssessed
+0x331compressed uint8General equipment slot 3:ribbon-family codev2/v3ConfirmedNotAssessed
+0x341compressed uint8General equipment slot 4:ribbon-family codev2/v3ConfirmedNotAssessed
+0x351compressed uint8General equipment slot 5:ribbon-family codev2/v3ConfirmedNotAssessed
+0x361active extension byte原版会读取;精确语义未闭合v2/v3PartialNoGo
+0x371packed nibblesactive Feature slot0/slot1 cooldownv2/v3ConfirmedNoGo
+0x38..+0x3B4active extension bytes原版会读取;逐字段完整语义未闭合v2/v3PartialNoGo
+0x3C1Army-dependent union byteArmy-specific persistent state / ArmySpecificPersistentState3CRaw:Army 70 保存企业号特殊空中动作当前资源;Army 94 保存第二 active Feature slot state/durationv2/v3Confirmed union mechanismNoGo
+0x3D1active extension byte原版会读取;精确语义未闭合v2/v3PartialNoGo
+0x3E1packed nibblesstrategic nuclear state / StrategicNuclearStatePacked3E:low nibble=剩余/当前战略核弹载荷数,high nibble=核弹生成进度v2/v3ConfirmedNoGo
+0x3F1active extension byte原版会读取;精确语义未闭合v2/v3PartialNoGo

3. 关键字段详解 ​

3.1 +0x02 不是简单的 ArmySettings.Type ​

+0x02 是 Army bucket 输入。最终 ArmySettings 解析还会结合 CountryDefinition、有效 Ranking 和 Formation。

因此旧工具若直接把 +0x02 显示为完整 ArmySettings.Type,会丢失真实解析关系。

3.2 +0x03 不是普通经验等级 ​

当前证据支持它作为构造时 Ranking / effective elite level 类输入。它不能直接等同于 HUD 中玩家理解的普通“经验等级”。

当前 1.30 corpus:12 种值,范围仍为 1..12。

3.3 +0x0C/+0x0E 是 HP 对 ​

text
+0x0C CurrentHp
+0x0E MaximumHp

当前 1.30 corpus:

text
CurrentHp  = 0..32500
MaximumHp  = 1..32500

相对 1.29 的 stock 上限 25000,1.30 新增了两条 32500/32500 正样本,分别位于 event21102.btl 与 event21112.btl 的 Unit index 159(Army bucket 44)。这证明 stock 观察范围扩大,不证明格式上限就是 32500。

两者虽然是独立磁盘 scalar,但作者工具修改时必须考虑 CurrentHp <= MaximumHp 以及模式/定义缩放;读取语义确认不自动授权任意写入。

3.4 +0x14..+0x16 不是勋章槽 ​

社区/第三方编辑器曾把这三个字节候选解释为将领徽章/装备。

原版 FUN_0048059C 不把它们作为装备读取;真正的 v2+ 六个装备槽位于 +0x30..+0x35。

1.30 全量语料显示:

  • 全部 Unit 133934,+0x14..+0x16 组合有 246 条非零记录;
  • v2/v3 Unit 116755,这三个字节的非零记录仍为 0/116755。

因此当前非零实例仍全部来自 legacy v1 范围,但其原版语义仍未闭合。“v2+ 当前 stock 恒零”不能升级成 padding 结论。

3.5 +0x1D/+0x1E/+0x20/+0x26:持久行为、移动约束与 AI 调度状态 ​

原版 FUN_0048059C load 与 FUN_0048008C save 已形成对称指令级映射:

text
record +0x1D <-> runtime Unit+0x13C fallback main behavior
record +0x1E <-> runtime Unit+0x140 land/sea transition restriction
record +0x20 <-> runtime Unit+0x144 primary scripted target TileId
record +0x26 <-> runtime Unit+0x134 ArmyAIConfig schedule counter

因此旧的 UnitAiModeRaw / TargetTileRaw 保守名称不再是当前 authority。TransportRestrictionRaw 捕捉到了 +0x1E 的移动限制方向,但当前 native consumer 已进一步闭合为精确的海陆转换方向枚举;FallbackBehaviorSubtype 仅保留为兼容旧 accessor,不再作为字段身份 authority。原作者 enum/UI 名仍不能从裸数值自行命名。

+0x26 在 FUN_0048157C 的新回合维护中先 +1,随后 ArmyAIConfig row +0x08 必须与该 counter exact match 才执行。1.28 stock 的全部 127512 个预置 Unit 都以 +0x26=0 开始,因此 stock authoring 中 activation 1,2,3... 与从 Round 1 起推进的该 counter 对齐。对任意自定义/续关状态仍应称 schedule counter,而不是无条件等同全局 GameRound。

社区旧说法还曾把 +0x22 称为 attack target;该说法也已被原版 resolver 链否定:

text
+0x20 -> runtime Unit+0x144 primary scripted target TileId
+0x22 -> FUN_004BB7B4 -> ArmyAIConfig group lookup

当前状态:

  • +0x20:field role Confirmed,writer 继续受现有 NoGo 门禁;
  • +0x22:ArmyAIConfig ID,Confirmed;
  • +0x1D:persistent fallback main behavior,Confirmed;
  • +0x1E:persistent LandSeaTransitionRestriction,0=本字段无方向禁令、1=禁止海→陆、2=禁止陆→海;mechanism Confirmed,原版正式 enum 名 Unknown;
  • +0x26:persistent ArmyAIConfig schedule counter,Confirmed。

主行为 0..4 的实际 dispatcher、候选组和 mode2 特殊机制见 Fallback AI 主行为 0~4。完整 Route7 证据位于同仓库研究 authority:reconstruction/docs/route7_unit_ai_mode_raw_and_main_behavior_correlation_v1_report.md 与 reconstruction/docs/route7_land_sea_transition_restriction_characterization_v1_report.md。

3.6 +0x25:Frontier 相关输入,但不能直接叫 Frontier flag ​

+0x25 是一个独立 byte,不属于 +0x24。

当前表现链已经确认:

text
BattleMode != 6
-> FrontierOverrideActive = false

BattleMode == 6 && Unit raw[0x25] == 0
-> FrontierOverrideActive = false

BattleMode == 6 && Unit raw[0x25] != 0
-> 继续依赖未闭合的 owner / feature gate
-> 当前必须 Deferred / Unknown

原版后续路径可以在条件满足时解析 replacement ArmyDefinition,再选择新的 Motion template。

因此 +0x25 当前安全描述是:

BattleMode 6 / Frontier 相关单位定义覆盖的 gate/input。

不能直接命名为:

  • Frontier flag;
  • Frontier Army ID;
  • skin ID。

证据:reconstruction/docs/rendering/static_unit_integration_report.md。

3.7 +0x2D:已从纯 Unknown 前进到 Partial ​

早期 writer audit 将 +0x2D..+0x2F 整体保留为 Unknown。后续 Fight 证据已经确认一个具体映射:

text
BTL Unit record +0x2D
-> FUN_0048059C
-> runtime Unit counter-qualification blocker field

在已审计 selected Unit87 中,磁盘 +0x2D = 0 对应 runtime blocker Unit+0x104 = 0,并参与 Unit+0x104 <= 0 的 counter qualification。

但任意值域、其他 writer、生命周期和完整业务名称尚未闭合,所以仍为 Partial,不能把 selected-case 名称扩张成最终全局字段名。

证据:

text
reports/route5_fixed_seed_fight_recovery/fight_input_field_matrix.csv
reports/route5_fixed_seed_fight_recovery/final_counter_predicate_matrix.csv

3.8 +0x2F:Elite skin index ​

静态单位表现链早已确认:

text
skin = ArmyDefinition.IsElite ? UnitRaw[0x2F] : 0

随后该值进入 Unit 初始化的 skin/variant 状态。Android 1.29 的全部 128932 条 Unit 在 +0x2F 上都为 0,所以此前只能确认 consumer,缺少官方磁盘正样本。

Android 1.30 首次补上官方正样本:

text
全量 Unit             = 133934
+0x2F == 0            = 133904
+0x2F == 1            = 30
非零文件               = assets/stage/conquest9.btl
conquest9 Unit        = 1436
conquest9 +0x2F == 1 = 30

这 30 条非零 Unit 的 Army bucket 分布为:

text
49=5  53=5  55=3  56=2  61=2  70=4  100=9

1.30 EliteSkinSettings.json 对这些 Army 都存在 Index=1 的定义;30/30 个 (Army, +0x2F) 组合都能按 (Army, Index) 命中配置。配置中的 Id 则是 4901/5301/5501/... 这类独立标识,因此磁盘字节存的是 skin Index,不是完整 EliteSkinSettings.Id。

当前可以确认:

  • +0x2F 的字段身份可命名为 EliteSkinIndexRaw;
  • 官方已观察值为 0 和 1;
  • 1 在当前正样本中对应 EliteSkinSettings.Index = 1;
  • 非 Elite 时现有 consumer 会把最终 skin 强制为 0;
  • 2..255、缺失 (Army, Index)、非法 Index 的 fallback/异常行为仍未闭合;
  • writer 继续 NoGo,不能因读取身份确认就自动开放编辑。

特别地,conquest9.btl 是 v3,但其 H54 = 0,所以这些精英皮肤样本不在 ExtensionArea。

证据:

text
reconstruction/docs/rendering/static_unit_integration_report.md
reports/btl_reference/android_1300_baseline_and_elite_skin_index.json

4. General equipment +0x30..+0x35 ​

这些字段只存在于 v2/v3 0x40 Unit record;v1 0x30 磁盘记录没有该区域。

4.1 槽 0-2:medal-family ​

空槽:

text
raw == 0

默认解码:

text
type = raw
level = 1

扩展编码区 171..230:

text
type  = (raw - 1) / 10
level = (raw - 1) % 10 + 1

原版槽族门:

text
Type 1..22
Type 40..43

此外 (Type, Level) 必须能解析到 GeneralMedalSettings。

4.2 槽 3-5:ribbon-family ​

空槽:

text
raw == 0

非零解码:

text
type  = raw / 10 + 20
level = raw % 10

原版槽族门:

text
Type 23..39

同样必须存在对应定义。

4.3 Corpus ​

Slot非零次数不同 raw 值观察范围
01568381..229
11274421..226
2754621..230
370507631..195
468228331..195
552307932..195

所有审计到的非零值都能命中定义并通过对应槽族门。

详细证据:reconstruction/docs/btl_editor_round11_unit_medal_ribbon_field_audit_report.md。

5. +0x37 active Feature cooldown packed byte ​

这是 +0x36..+0x3F 中目前闭合程度最高的字段。

v2+ 持久化格式:

text
low nibble  = active Feature slot0 cooldown
high nibble = active Feature slot1 cooldown

反序列化:

text
slot0 = packed & 0x0F
slot1 = packed >> 4

序列化:

text
packed = (slot1 << 4) | slot0

该结论已经跨 ARM64/x86 对齐:

  • 构造时两个 cooldown 清零;
  • runtime copy 会复制两槽;
  • v2+ load/save 使用 record+0x37;
  • 正值在回合维护中递减;
  • active Feature 执行会写入对应槽 cooldown。

Type 0x5D death-protection 只是 slot0 cooldown 的一个消费者,不能因此把整个 +0x37 命名成“死亡保护冷却”。

主要证据:

text
reconstruction/docs/route5_fixed_seed_fight_round8_death_protection_report.md
reports/route5_fixed_seed_fight_recovery/death_protection_lifecycle_matrix.csv

6. +0x36..+0x3F 不得视为 padding ​

社区旧资料曾遗漏或把该区间视为 unused/unknown padding。原版 FUN_0048059C 实际会读取整个 v2+ extension range。

Android 1.30 已对这段重新做逐字节全量统计:116755 个 v2/v3 Unit 中有 532 条记录在 +0x36..+0x3F 至少一个字节非零。当前 stock 正值只落在:

text
+0x3C values = 0,5,8,12,15,16   nonzero records = 248
+0x3E values = 0,2               nonzero records = 284

6.1 +0x3C 是 Army-dependent persistence union ​

Android 1.30 ARM64 原版 loader/save 已形成直接双向投影:

text
load:
  Unit+0x164 = 0
  Unit+0x110 = 0
  if Army == 70 / 0x46:
      Unit+0x164 = uint8(record+0x3C)
  if Army == 94 / 0x5E:
      Unit+0x110 = int8(record+0x3C)

save:
  record+0x3C = uint8(Unit+0x164)
  if Unit+0x110 != 0:
      record+0x3C = uint8(Unit+0x110)

1.30 对应 native 地址为 loader 0x00385F40..0x00386054、save 0x00385A24..0x00385A54。因此 +0x3C 不是一个跨 Army 共享的普通 scalar,而是按 Army 身份复用的磁盘状态槽。

Army 70 的分支可以继续闭合到企业号特殊空中动作资源。原版会扫描 ArmyFeatureSettings.Type 72 / 0x48,把该 Feature 的 FeatureEffect 写入 Unit+0x164;1.30 四级定义正是 5/8/12/16。动作结算又会按实际 action cost 从 Unit+0x164 扣减。1.30 的 248 条非零 +0x3C 全部属于 Army 70:

text
5  -> 19 records
8  -> 151 records
12 -> 68 records
15 -> 4 records
16 -> 6 records

其中 4 条 15 都是 rank 12 企业号,而 rank 12 的 Type72 定义上限是 16。这直接证明 +0x3C 保存的是当前可变资源状态,不能把磁盘字节简化成“从 definition 重新计算的最大值”。

Army 94 分支把 +0x3C 按 signed byte 恢复到 Unit+0x110。既有 active-slot authority 已确认 Unit+0x110 是第二 active Feature slot 的 state/duration;但 Android 1.30 stock BTL 中没有 Army94 的非零 +0x3C 正样本,因此这里是 NativeConfirmed / NoPositiveStockCorpus,不是 writer 合法性证明。

6.2 +0x3E 是战略核状态的两个 4-bit 字段 ​

Android 1.30 原版 load/save 同样完全对称:

text
low nibble  <-> Unit+0x16C
high nibble <-> Unit+0x170

record+0x3E = Unit+0x16C | (Unit+0x170 << 4)

Unit+0x16C 已闭合为当前/剩余战略核弹载荷数,Unit+0x170 是 ArmyFeature Type 81 / 0x51“战略核威慑”的核弹生成进度。回合维护会:

text
cap       = Type81.SecondEffect (+0x30) [+ scoped CountryTech modifier]
threshold = Type81.FeatureEffect (+0x2C)

if currentPayloadCount < cap:
    generationProgress += 1
    if generationProgress >= threshold:
        currentPayloadCount += 1
        generationProgress = 0

Type 82 / 0x52 特殊导弹/核投送路径会检查核载荷可用性;1.30 结算链 0x003DD748..0x003DD780 在对应资格成立后把 Unit+0x16C 减 1。当前 1.30 的 284 条非零 +0x3E 全部等于 0x02,即 payloadCount=2 / generationProgress=0,且只出现在同时带 Type81/82 的 Army 75(155 条)与 Army 86(129 条)。

1.28/1.29/1.30 历史 corpus 都没有高 nibble 正样本,但原版 native 已直接证明其 producer、阈值、reset 与 save/load 生命周期,所以它不再属于 Unknown;仍未闭合的是 authoring 合法范围、overflow/异常值和 writer acceptance。

其余 +0x36/+0x37/+0x38/+0x39/+0x3A/+0x3B/+0x3D/+0x3F 在当前 1.30 stock corpus 全零。native consumer 已证明整个 v2+ extension range 会被读取,因此这些全零结果不能升级成 padding/unused 结论。

本轮机器证据见 reports/btl_reference/unit_v2_tail_3c_3e_semantic_closure.json。其余未命名字节仍应 raw-preserve,不能因为 Reference 尚未命名就删除、清零或批量编辑。

7. 当前 corpus 摘要 ​

以下是 Android 1.30.0 / 133934 Unit 的全量 stock 观察值域。这里只描述磁盘正样本,不把观察最小/最大值提升成格式合法域:

字段1.30 观察值摘要
+0x02 ArmyTypeId75 种,1..104;104 为 1.30 新值,33 条 Unit
+0x03 Level12 种,1..12
+0x04 Formation5 种,0..4
+0x05 Direction2 种,0..1
+0x06 MovementRaw26 种:0,5..29;29 仅 1 条,业务含义仍 Partial
+0x07 TurnStateRaw全 0
+0x08 Stat08Raw全 0
+0x0A Stat0ARaw63 种,1..3000
+0x0C CurrentHp0..32500
+0x0E MaximumHp1..32500
+0x1D FallbackBehaviorMainType0,1,2,3,4,255
+0x1E LandSeaTransitionRestriction0,1,2
+0x1F PriorityRaw27 种,-100..100
+0x20 PrimaryScriptedTargetTileId1031 种,-1..12006
+0x22 ArmyAIConfig ID440 种,0..529
+0x24 BehaviorStateRaw全 0
+0x25 FrontierGateRaw全 0
+0x26 ArmyAiScheduleCounter全 0
+0x28 MoraleRaw0,1,253,254,255
+0x29 MoraleDurationRaw0,3
+0x2A DeathEventId67 种,0..77
+0x2B PackedFlags2B1,9
+0x2C DefensiveDistanceRaw20 种,0..200
+0x2D全 0
+0x2E全 0
+0x2F EliteSkinIndexRaw0,1;非零 30 条

7.1 1.30 新增 Army bucket 104 ​

1.29 stock Unit/Reinforcement 都没有 ArmyTypeId=104。1.30 首次观察到:

text
Unit ArmyTypeId=104          = 33 records
Reinforcement ArmyTypeId=104 = 13 records

1.30 ArmySettings.json 同时新增 Army=104 的 12 条定义,Id=357001..357012、Ranking=1..12、Elite=1、Type=3,资源名称/动画族为 AS-90。因此 104 是已有 ArmyTypeId 域中的新内容值,而不是 BTL 格式新字段;这些 Army=104 Unit 的 EliteSkinIndexRaw 仍为 0,不能把“新精英兵种”与“精英皮肤索引”混为同一机制。

7.2 MovementRaw=29 只确认正样本 ​

当前唯一 MovementRaw=29 样本位于:

text
assets/stage/conquest9.btl
Unit index = 364
ArmyTypeId = 97
HP = 1178 / 1178

这只能把 29 加入官方 stock 观察域;没有 native consumer/动态证据支持给它自行命名。

这些都是 观察范围,不是允许写入范围,也不是格式允许值域的上限证明。机器证据见 reports/btl_reference/android_1300_value_domain_polish.json。

8. 社区兼容结论 ​

旧说法当前裁决
+0x22 = attack targetRefuted;实际为 ArmyAIConfig ID
+0x14..+0x16 = General equipmentRefuted
+0x30..+0x35 = medal/ribbonConfirmed with slot-family refinement
+0x36..+0x3F = padding/unusedRefuted

完整社区勘误见 ../community/corrections.md。

9. 当前主要 Unknown / Partial backlog ​

优先级较高:

  1. +0x08 完整语义;
  2. +0x0A 完整语义;
  3. legacy +0x14..+0x16;
  4. +0x1D 完整 AI mode enum;
  5. +0x1E 各 Army/运输类型状态矩阵;
  6. +0x20 behavior-specific target 语义;
  7. +0x25 非零值与 Frontier owner/feature gate 完整语义;
  8. +0x2B 全 bit mask;
  9. +0x2C defensive-distance 完整 consumer;
  10. +0x2D 完整生命周期与值域;
  11. +0x2E;
  12. +0x2F EliteSkinIndexRaw 的 Index > 1、缺失定义、非 Elite 非零值与非法值 fallback/异常边界;
  13. +0x36/+0x38..+0x3B/+0x3D/+0x3F 逐字段/逐 bit consumer;+0x3C/+0x3E 的 runtime 字段角色已闭合,剩余仅 authoring 合法域、异常值/overflow 与 writer acceptance。

这些条目应通过 native/corpus/runtime evidence 逐项闭合,不进行“合理化设计”。

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