re(route-b): map generalises to units -- 406/0 across 11 objects, 121 defaulted fields

Applying the map to turrets, fighters, an attacker and a station (UNIT records
rather than VESSEL) gives 406 field values agreeing with the disc and 0
disagreeing across 11 objects, so one layout serves both schemas.

Two consequences the four-value signature could not give: the map IDENTIFIES an
object -- 0xbd3b6a00 is UN_bf001_TCAF_SchlosBase (14 agree, 0 disagree), not
UN_be005_ADAN_SpaceFortress (12 agree, 2 disagree on Color_R/Color_G) -- and
variants are provably identical, with ArrowHead/_EX4/_EX5 at 48/48, Turret/_EX4
at 51/51 and three DeltaSaber player variants at 49/49.

121 defaulted fields now have runtime values. FiringRange (0 in all 11) and
ShieldRatio (1 in all 6) look like true constants; HQRatio, ThrusterRatio and
AttackCraftPoint vary per unit and are recorded as such.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-13 00:12:45 +00:00
parent d674cddad4
commit 19b338d9d8
2 changed files with 150 additions and 100 deletions

View File

@@ -426,3 +426,33 @@ The shape of the answer:
That is the `…Ratio` / `…Count` family the mission brief named, answered from the
running game, with the field identities read out of the title's own code rather
than guessed.
## It generalises, it disambiguates, and variants are provably identical
Applying the same map to the other live objects — turrets, fighters, an attacker,
a station, i.e. `UNIT` records rather than `VESSEL` ones — gives **406 field
values agreeing with the disc and 0 disagreeing across 11 objects**. One object
layout serves both schemas.
Two things fell out that the four-value signature could never have given:
**It identifies the object.** `0xbd3b6a00` had two candidates on
`(HP, Size_X/Y/Z)`. Checking every mapped field separates them cleanly:
| candidate | agreement |
|---|---|
| `UN_be005_ADAN_SpaceFortress` | 12 agree, **2 disagree** (`Color_R` 1↔0, `Color_G` 0↔1) |
| **`UN_bf001_TCAF_SchlosBase`** | **14 agree, 0 disagree** |
**Variants really are identical.** Where several ids shared a signature, all of
them now agree on *every* mapped field — `UN_f003_TCAF_ArrowHead` / `_EX4` /
`_EX5` at 48/48 each, `UN_e007_ADAN_Turret` / `_EX4` at 51/51, and three Delta
Saber player variants at 49/49 (the tutorial variant `_Ttrl1` differs by one field
and is excluded). So a shared live definition between variants is a property of
the data, not a limitation of the match.
Across all 11 objects, **121 fields** are defaulted on disc and readable at
runtime. `FiringRange` (0 in all 11) and `ShieldRatio` (1 in all 6 that default
it) look like genuine constants; `HQRatio` (0.2 or 1 over 9 units),
`ThrusterRatio` (0.2 or 1 over 10) and `AttackCraftPoint` (0, 0.1, 0.5 or 1 over
9) are clearly per-unit and must not be recorded as one value.