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

@@ -1,105 +1,125 @@
map check: 154 fields agree with the disc, 0 disagree map check: 406 fields agree with the disc, 0 disagree
runtime value where the disc record DEFAULTS the field: runtime value where the disc record DEFAULTS the field:
AA_AxisMode_Max 0 (5 units) AA_AxisMode_Max 0 (10 units)
AA_AxisMode_Min 0 (5 units) AA_AxisMode_Min 0, 1.74533 (11 units)
AA_PitchMinus_Max 0.0628319 (5 units) AA_PitchMinus_Max 0, 0.0628319, 0.174533 (8 units)
AA_PitchMinus_Min 0.0628319 (5 units) AA_PitchMinus_Min 0, 0.0628319, 0.261799, 0.349066, 0.698132 (10 units)
AA_PitchPlus_Max 0.0628319 (5 units) AA_PitchPlus_Max 0, 0.0628319 (6 units)
AA_PitchPlus_Min 0.0628319 (5 units) AA_PitchPlus_Min 0, 0.0628319, 1.74533 (8 units)
AA_Roll_Max 0.0628319 (5 units) AA_Roll_Max 0, 0.0628319, 0.174533, 0.523599, 1.0472 (10 units)
AA_Roll_Min 0.0628319 (5 units) AA_Roll_Min 0, 0.0628319, 1.0472 (7 units)
AA_Yaw_Max 0.0628319 (5 units) AA_Yaw_Max 0, 0.0628319, 0.0872665 (7 units)
AA_Yaw_Min 0.0628319 (5 units) AA_Yaw_Min 0, 0.0628319, 0.261799 (7 units)
AB_AA_PitchMinus 0 (5 units) AB_AA_PitchMinus 0, 0.174533 (11 units)
AB_AA_PitchPlus 0 (5 units) AB_AA_PitchPlus 0 (10 units)
AB_AA_Roll 0 (5 units) AB_AA_Roll 0, 0.523599 (11 units)
AB_AA_Yaw 0 (5 units) AB_AA_Yaw 0, 0.174533 (11 units)
AB_AV_PitchMinus 0 (5 units) AB_AV_PitchMinus 0 (10 units)
AB_AV_PitchPlus 0 (5 units) AB_AV_PitchPlus 0, 0.523599 (11 units)
AB_AV_Roll 0 (5 units) AB_AV_Roll 0, 0.698132 (11 units)
AB_AV_Yaw 0 (5 units) AB_AV_Yaw 0, 0.279253 (11 units)
AB_ConsumeShield 0 (5 units) AB_ConsumeShield 0, 10 (11 units)
AB_ConsumeShield_Begin 0 (5 units) AB_ConsumeShield_Begin 0 (10 units)
AV_AxisMode_Max 0 (5 units) AV_AxisMode_Max 0, 0.174533 (11 units)
AV_AxisMode_Min 0 (5 units) AV_AxisMode_Min 0 (10 units)
AV_PitchMinus_Max 0.0628319 (5 units) AV_PitchMinus_Max 0, 0.0628319, 0.349066 (7 units)
AV_PitchMinus_Min 0.0628319 (5 units) AV_PitchMinus_Min 0, 0.0628319 (6 units)
AV_PitchPlus_Min 0.0628319 (5 units) AV_PitchPlus_Max 0 (1 units)
AV_Roll_Max 0.0628319 (5 units) AV_PitchPlus_Min 0, 0.0628319, 1.74533 (7 units)
AV_Roll_Min 0.0628319 (5 units) AV_Roll_Max 0, 0.0628319, 0.349066, 1.0472, 2.0944 (10 units)
AV_Yaw_Max 0.0628319 (5 units) AV_Roll_Min 0, 0.0628319, 1.0472 (7 units)
AV_Yaw_Min 0.0628319 (5 units) AV_Yaw_Max 0, 0.0628319, 0.174533 (7 units)
ArterBurner_Acc 2 (5 units) AV_Yaw_Min 0, 0.0628319, 0.349066 (7 units)
ArterBurner_Vc 2 (5 units) AccPitchFactor 0, 30 (5 units)
AttackCraftPoint 0.1, 0.5 (5 units) Acceleration 0 (1 units)
AttackVesselPoint 0.1 (2 units) ArterBurner_Acc 0, 2 (10 units)
BarrelRoll_CountMaximum 0 (5 units) ArterBurner_Vc 0, 2 (6 units)
BarrelRoll_CountMinimum 0 (5 units) AttackCraftPoint 0, 0.1, 0.5, 1 (9 units)
BarrelRoll_Radius 0 (5 units) AttackVesselPoint 0, 0.1 (3 units)
BarrelRoll_Time 0 (5 units) BarrelRoll_CountMaximum 0, 5 (11 units)
BoostAway_Time_Maximum 0 (5 units) BarrelRoll_CountMinimum 0, 0.5 (11 units)
BoostAway_Time_Minimum 0 (5 units) BarrelRoll_Radius 0 (7 units)
ChargeDelay 1 (5 units) BarrelRoll_Time 0 (7 units)
Color_B 1 (1 units) BoostAway_Time_Maximum 0, 2 (11 units)
BoostAway_Time_Minimum 0, 1 (11 units)
ChargeDelay 1, 3, 5 (10 units)
ChargeDelay_Break 1, 10 (6 units)
ChargeSpeed 25 (3 units)
Color_B 0, 1 (3 units)
Color_G 1 (1 units) Color_G 1 (1 units)
CutoffTimeMax 0 (5 units) CruisingVelocity 0 (1 units)
CutoffTimeMin 0 (5 units) CutoffTimeMax 0, 5 (10 units)
DecPitchFactor 30 (5 units) CutoffTimeMin 0 (7 units)
DefencePoint 0.1, 0.25 (4 units) DecPitchFactor 0, 30 (11 units)
Delay 0 (3 units) Deceleration 0, 50 (2 units)
DelayAdjustment 0, 2 (5 units) DefencePoint 0, 0.1, 0.25 (5 units)
DragFactorThreshold 0.5 (5 units) Delay 0, 1.5, 3 (8 units)
DryMass 10000 (2 units) DelayAdjustment 0, 1, 2 (10 units)
FiringRange 0 (5 units) DestroyMotionTime 0 (1 units)
GrossMass 10000 (5 units) DragFactorThreshold 0, 0.5 (10 units)
HQRatio 0.2, 1 (4 units) DryMass 100, 10000 (8 units)
HoldPosition_BackRatio 0 (5 units) FCSRange 0, 500000 (3 units)
HoldPosition_CancelTime 0 (5 units) FiringRange 0 (11 units)
HoldPosition_CutoffRatio 0 (5 units) GrossMass 10000, 200 (10 units)
HoldPosition_LengthMax 0 (5 units) HQRatio 0.2, 1 (9 units)
HoldPosition_LengthMin 0 (5 units) HoldPosition_BackRatio 0, 0.1, 0.3 (11 units)
HoldPosition_MaximumTime 0 (5 units) HoldPosition_CancelTime 0, 20 (10 units)
HoldPosition_MinimumTime 0 (5 units) HoldPosition_CutoffRatio 0, 0.5 (11 units)
HoldPosition_SideRatio 0 (5 units) HoldPosition_LengthMax 0, 400 (8 units)
HomingResistAdjustment 0 (5 units) HoldPosition_LengthMin 0, 150 (10 units)
LowerHPThresholdRatio 0.3 (1 units) HoldPosition_MaximumTime 0, 10 (10 units)
MinimumVelocity 0 (4 units) HoldPosition_MinimumTime 0, 5 (11 units)
PitchDragFactor 2 (5 units) HoldPosition_SideRatio 0, 0.3 (11 units)
PowerCutConsumeShield 0 (5 units) HomingResistAdjustment 0, 0.5 (11 units)
PowerCutDeceleration 0 (5 units) LowerHPThresholdRatio 0, 0.3 (7 units)
ResistanceToExplosion 0.5 (3 units) MaxValue 100 (3 units)
ResistanceToPlayer 1 (5 units) MaximumBank_Normal 0, 0.523599, 1.0472 (5 units)
ResistanceToShell 0.1 (3 units) MaximumVelocity 0 (1 units)
ReverseThrust_Acc 0.25 (3 units) MinimumVelocity 0, 100 (7 units)
RollDragFactor 2 (5 units) PitchDragFactor 0, 2, 3 (11 units)
SELength 2000 (5 units) PowerCutConsumeShield 0, 20 (11 units)
ShieldRatio 1 (1 units) PowerCutDeceleration 0, 10 (11 units)
SideRoll_Length 0 (5 units) RadarRange 0 (1 units)
SideRoll_Time 0 (5 units) ResistanceParalyze 1 (1 units)
ResistanceToExplosion 0.1, 0.5, 1 (9 units)
ResistanceToOptics 0.1, 1 (4 units)
ResistanceToPlayer 0, 1 (10 units)
ResistanceToShell 0.1, 1 (8 units)
ReverseThrust_Acc 0, 0.25, 2 (9 units)
ReverseThrust_Vc 0 (1 units)
RollDragFactor 0, 2, 3 (11 units)
SELength 2000 (11 units)
ShieldRatio 1 (6 units)
SideRoll_Length 0 (7 units)
SideRoll_Time 0, 0.5, 1.5 (11 units)
SideThrustAcceleration 0, 100, 1000 (5 units)
SideThrustVelocity_Max 0, 100, 1000 (3 units)
Size_Radius 10, 50 (4 units)
Size_Y 200, 300, 400, 600, 700 (5 units) Size_Y 200, 300, 400, 600, 700 (5 units)
Slalom_CutoffRatio 0 (5 units) Slalom_CutoffRatio 0 (7 units)
Slalom_TurnCount_Max 0 (5 units) Slalom_TurnCount_Max 0 (11 units)
Slalom_TurnCount_Min 0 (5 units) Slalom_TurnCount_Min 0 (9 units)
SolidCutoff_LengthMax 0 (5 units) SolidCutoff_LengthMax 0 (7 units)
SolidCutoff_LengthMin 0 (5 units) SolidCutoff_LengthMin 0, 500 (9 units)
SolidCutoff_Ratio 0 (5 units) SolidCutoff_Ratio 0, 0.5 (11 units)
Through_AngleMaximum 0 (5 units) Through_AngleMaximum 0, 1.0472 (11 units)
Through_AngleMinimum 0 (5 units) Through_AngleMinimum 0, 0.523599 (11 units)
Through_CutoffRatio 0 (5 units) Through_CutoffRatio 0, 0.5 (11 units)
Through_LengthMaximum 0 (5 units) Through_LengthMaximum 0, 500 (10 units)
Through_LengthMinimum 0 (5 units) Through_LengthMinimum 0, 250 (11 units)
Through_Time1Max 0 (5 units) Through_Time1Max 0, 2 (11 units)
Through_Time1Min 0 (5 units) Through_Time1Min 0, 5 (11 units)
Through_Time2Max 0 (5 units) Through_Time2Max 0, 1.5 (8 units)
Through_Time2Min 0 (5 units) Through_Time2Min 0, 5 (11 units)
ThrusterRatio 0.2, 1 (4 units) ThrusterRatio 0.2, 1 (10 units)
TurnAttack_CutoffRatio 0 (5 units) TurnAttack_CutoffRatio 0 (7 units)
TurnAttack_DoubleRatio 0 (5 units) TurnAttack_DoubleRatio 0 (7 units)
TurnAttack_DoubleTimeMax 0 (5 units) TurnAttack_DoubleTimeMax 0 (7 units)
TurnAttack_DoubleTimeMin 0 (5 units) TurnAttack_DoubleTimeMin 0 (7 units)
TurnAway_Time_Maximum 0 (5 units) TurnAway_Time_Maximum 0, 2, 5 (11 units)
TurnAway_Time_Minimum 0 (5 units) TurnAway_Time_Minimum 0, 0.5 (11 units)
Turn_AngularVelocity 0 (5 units) Turn_AngularVelocity 0, 0.523599 (8 units)
UsingChaffRatio 0 (5 units) UsingChaffRatio 0 (11 units)
YawDragFactor 0 (1 units)

View File

@@ -426,3 +426,33 @@ The shape of the answer:
That is the `…Ratio` / `…Count` family the mission brief named, answered from the 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 running game, with the field identities read out of the title's own code rather
than guessed. 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.