外观
Unit Record 单位记录
状态:Authoritative Reference v1
1. 记录版本
Unit 有两种磁盘长度:
| BTL 版本 | 磁盘长度 | 原版加载路径 |
|---|---|---|
| v1 | 0x30 | FUN_0048052C 先扩展到 common 0x40 表示,再进入正常加载 |
| v2/v3 | 0x40 | FUN_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.cs2. 完整 byte map
说明:
Confirmed表示该行所写的具体语义已确认,不代表所有值域和运行时后续写入都闭合;Partial表示用途范围已知但完整业务语义仍开放;Unknown表示不得用经验名称填空;NoGo写入状态表示当前 Reference 明确不授权按该解释修改;- 其余字段的实际写权限由当前 BTL writer 产品门禁另行裁决,本 Reference 不自动授予写权限。
| Offset | Size | Raw type | 当前中文语义 / code name | 版本 | 语义状态 | 写入状态 |
|---|---|---|---|---|---|---|
+0x00 | 2 | uint16 LE | Unit Tile ID / TileId | v1-v3 | Confirmed | NotAssessed |
+0x02 | 1 | uint8 | Army bucket / ArmyTypeId,参与 ArmySettings 解析 | v1-v3 | Confirmed | NotAssessed |
+0x03 | 1 | uint8 | Ranking / effective elite level raw / Level;不是普通 HUD 经验等级 | v1-v3 | Confirmed | NotAssessed |
+0x04 | 1 | uint8 | 编制 / Formation | v1-v3 | Confirmed | NotAssessed |
+0x05 | 1 | uint8 | 朝向 / Direction | v1-v3 | Confirmed | NotAssessed |
+0x06 | 1 | int8 | 初始移动/运行状态 / MovementRaw | v1-v3 | Partial | NotAssessed |
+0x07 | 1 | uint8 | 初始回合/行动状态 / TurnStateRaw | v1-v3 | Partial | NotAssessed |
+0x08 | 2 | int16 LE | 未闭合 scalar / Stat08Raw | v1-v3 | Unknown | NoGo |
+0x0A | 2 | int16 LE | 未闭合 scalar / Stat0ARaw | v1-v3 | Unknown | NoGo |
+0x0C | 2 | int16 LE | 初始当前 HP / CurrentHp | v1-v3 | Confirmed | NotAssessed |
+0x0E | 2 | int16 LE | 初始最大 HP / MaximumHp | v1-v3 | Confirmed | NotAssessed |
+0x10 | 2 | int16 LE | 将领 ID / GeneralId | v1-v3 | Confirmed | NotAssessed |
+0x12 | 1 | uint8 | 将领军衔 / GeneralRank | v1-v3 | Confirmed | NotAssessed |
+0x13 | 1 | uint8 | 将领品质 / GeneralQuality | v1-v3 | Confirmed | NotAssessed |
+0x14..+0x16 | 3 | raw bytes | legacy/unknown bytes;不是将领装备槽 | v1-v3 | Unknown | NoGo |
+0x17 | 1 | uint8 | 技能等级槽 0 | v1-v3 | Confirmed | NotAssessed |
+0x18 | 1 | uint8 | 技能等级槽 1 | v1-v3 | Confirmed | NotAssessed |
+0x19 | 1 | uint8 | 技能等级槽 2 | v1-v3 | Confirmed | NotAssessed |
+0x1A | 1 | uint8 | 技能等级槽 3 | v1-v3 | Confirmed | NotAssessed |
+0x1B | 1 | uint8 | 技能等级槽 4 | v1-v3 | Confirmed | NotAssessed |
+0x1C | 1 | int8 | 单位目标标记 / ObjectiveMarker | v1-v3 | Confirmed | NotAssessed |
+0x1D | 1 | uint8 | persistent fallback AI main behavior / FallbackBehaviorMainType | v1-v3 | Confirmed | NotAssessed |
+0x1E | 1 | uint8 | persistent land/sea transition restriction / LandSeaTransitionRestriction;0 不加方向禁令、1 禁止海→陆、2 禁止陆→海 | v1-v3 | Confirmed mechanism;official enum names Unknown | NotAssessed |
+0x1F | 1 | int8 | signed AI priority / PriorityRaw | v1-v3 | Confirmed | NotAssessed |
+0x20 | 2 | int16 LE | persistent primary scripted target TileId / PrimaryScriptedTargetTileId | v1-v3 | Confirmed field role | NoGo |
+0x22 | 2 | int16 LE | ArmyAIConfig group ID / ArmyAiConfigurationId | v1-v3 | Confirmed | NotAssessed |
+0x24 | 1 | int8 | behavior state / BehaviorStateRaw | v1-v3 | Confirmed | NotAssessed |
+0x25 | 1 | uint8 raw | BattleMode 6 / Frontier 相关 override gate/input | v1-v3 | Partial | NoGo |
+0x26 | 2 | int16 LE | persistent ArmyAIConfig schedule counter / ArmyAiScheduleCounter | v1-v3 | Confirmed | NotAssessed |
+0x28 | 1 | uint8 | 初始士气状态 / MoraleRaw | v1-v3 | Confirmed | NotAssessed |
+0x29 | 1 | uint8 | 初始士气持续回合 / MoraleDurationRaw | v1-v3 | Confirmed | NotAssessed |
+0x2A | 1 | int8 | 死亡 Event ID / DeathEventId | v1-v3 | Confirmed | NotAssessed |
+0x2B | 1 | packed uint8 | mixed active flags / PackedFlags2B | v1-v3 | Partial | NoGo |
+0x2C | 1 | uint8 | defensive-distance raw / DefensiveDistanceRaw | v1-v3 | Partial | NoGo |
+0x2D | 1 | raw byte | 已确认可加载到 runtime counter-qualification blocker;完整生命周期/含义未闭合 | v1-v3 | Partial | NoGo |
+0x2E | 1 | raw byte | 未闭合 | v1-v3 | Unknown | NoGo |
+0x2F | 1 | uint8 raw | Elite skin index raw / EliteSkinIndexRaw;1.30 官方正样本与 EliteSkinSettings.Index 对齐 | v1-v3 | 字段身份 Confirmed;完整值域 Partial | NoGo |
+0x30 | 1 | compressed uint8 | General equipment slot 0:medal-family code | v2/v3 | Confirmed | NotAssessed |
+0x31 | 1 | compressed uint8 | General equipment slot 1:medal-family code | v2/v3 | Confirmed | NotAssessed |
+0x32 | 1 | compressed uint8 | General equipment slot 2:medal-family code | v2/v3 | Confirmed | NotAssessed |
+0x33 | 1 | compressed uint8 | General equipment slot 3:ribbon-family code | v2/v3 | Confirmed | NotAssessed |
+0x34 | 1 | compressed uint8 | General equipment slot 4:ribbon-family code | v2/v3 | Confirmed | NotAssessed |
+0x35 | 1 | compressed uint8 | General equipment slot 5:ribbon-family code | v2/v3 | Confirmed | NotAssessed |
+0x36 | 1 | active extension byte | 原版会读取;精确语义未闭合 | v2/v3 | Partial | NoGo |
+0x37 | 1 | packed nibbles | active Feature slot0/slot1 cooldown | v2/v3 | Confirmed | NoGo |
+0x38..+0x3B | 4 | active extension bytes | 原版会读取;逐字段完整语义未闭合 | v2/v3 | Partial | NoGo |
+0x3C | 1 | Army-dependent union byte | Army-specific persistent state / ArmySpecificPersistentState3CRaw:Army 70 保存企业号特殊空中动作当前资源;Army 94 保存第二 active Feature slot state/duration | v2/v3 | Confirmed union mechanism | NoGo |
+0x3D | 1 | active extension byte | 原版会读取;精确语义未闭合 | v2/v3 | Partial | NoGo |
+0x3E | 1 | packed nibbles | strategic nuclear state / StrategicNuclearStatePacked3E:low nibble=剩余/当前战略核弹载荷数,high nibble=核弹生成进度 | v2/v3 | Confirmed | NoGo |
+0x3F | 1 | active extension byte | 原版会读取;精确语义未闭合 | v2/v3 | Partial | NoGo |
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 roleConfirmed,writer 继续受现有 NoGo 门禁;+0x22:ArmyAIConfig ID,Confirmed;+0x1D:persistent fallback main behavior,Confirmed;+0x1E:persistentLandSeaTransitionRestriction,0=本字段无方向禁令、1=禁止海→陆、2=禁止陆→海;mechanismConfirmed,原版正式 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.csv3.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=91.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.json4. 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 值 | 观察范围 |
|---|---|---|---|
| 0 | 1568 | 38 | 1..229 |
| 1 | 1274 | 42 | 1..226 |
| 2 | 754 | 62 | 1..230 |
| 3 | 7050 | 76 | 31..195 |
| 4 | 6822 | 83 | 31..195 |
| 5 | 5230 | 79 | 32..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.csv6. +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 = 2846.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 = 0Type 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 ArmyTypeId | 75 种,1..104;104 为 1.30 新值,33 条 Unit |
+0x03 Level | 12 种,1..12 |
+0x04 Formation | 5 种,0..4 |
+0x05 Direction | 2 种,0..1 |
+0x06 MovementRaw | 26 种:0,5..29;29 仅 1 条,业务含义仍 Partial |
+0x07 TurnStateRaw | 全 0 |
+0x08 Stat08Raw | 全 0 |
+0x0A Stat0ARaw | 63 种,1..3000 |
+0x0C CurrentHp | 0..32500 |
+0x0E MaximumHp | 1..32500 |
+0x1D FallbackBehaviorMainType | 0,1,2,3,4,255 |
+0x1E LandSeaTransitionRestriction | 0,1,2 |
+0x1F PriorityRaw | 27 种,-100..100 |
+0x20 PrimaryScriptedTargetTileId | 1031 种,-1..12006 |
+0x22 ArmyAIConfig ID | 440 种,0..529 |
+0x24 BehaviorStateRaw | 全 0 |
+0x25 FrontierGateRaw | 全 0 |
+0x26 ArmyAiScheduleCounter | 全 0 |
+0x28 MoraleRaw | 0,1,253,254,255 |
+0x29 MoraleDurationRaw | 0,3 |
+0x2A DeathEventId | 67 种,0..77 |
+0x2B PackedFlags2B | 1,9 |
+0x2C DefensiveDistanceRaw | 20 种,0..200 |
+0x2D | 全 0 |
+0x2E | 全 0 |
+0x2F EliteSkinIndexRaw | 0,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 records1.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 target | Refuted;实际为 ArmyAIConfig ID |
+0x14..+0x16 = General equipment | Refuted |
+0x30..+0x35 = medal/ribbon | Confirmed with slot-family refinement |
+0x36..+0x3F = padding/unused | Refuted |
完整社区勘误见 ../community/corrections.md。
9. 当前主要 Unknown / Partial backlog
优先级较高:
+0x08完整语义;+0x0A完整语义;- legacy
+0x14..+0x16; +0x1D完整 AI mode enum;+0x1E各 Army/运输类型状态矩阵;+0x20behavior-specific target 语义;+0x25非零值与 Frontier owner/feature gate 完整语义;+0x2B全 bit mask;+0x2Cdefensive-distance 完整 consumer;+0x2D完整生命周期与值域;+0x2E;+0x2F EliteSkinIndexRaw的Index > 1、缺失定义、非 Elite 非零值与非法值 fallback/异常边界;+0x36/+0x38..+0x3B/+0x3D/+0x3F逐字段/逐 bit consumer;+0x3C/+0x3E的 runtime 字段角色已闭合,剩余仅 authoring 合法域、异常值/overflow 与 writer acceptance。
这些条目应通过 native/corpus/runtime evidence 逐项闭合,不进行“合理化设计”。