re(route-b): full field map verified 154/154, and 101 defaulted fields read out
Anchoring each key string to the first store AFTER the accessor call makes the extraction exact: 159 fields, 125 of them floats, and verify_fieldmap now checks every one against the live objects -- 154 agree with the disc, 0 disagree. The last ten mismatches taught the rule: angle fields are degrees on disc and RADIANS at runtime (AV_PitchPlus_Max 3.6 -> 0.0628319; MaximumBank_Normal 60 -> 1.0472), an exact conversion across every angle field and unit. 101 defaulted fields now have runtime values: angle limits default to 3.6 degrees, afterburner/turn-attack fields to 0, FiringRange to 0 (matching the loader's miss value), Size_Y to that unit's Size_X, and the ratio family is per-unit rather than constant (HQRatio 0.2 or 1, DefencePoint 0.1 or 0.25, ...). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
105
docs/re/captures/stage02-defaulted-field-runtime-values.txt
Normal file
105
docs/re/captures/stage02-defaulted-field-runtime-values.txt
Normal file
@@ -0,0 +1,105 @@
|
||||
|
||||
map check: 154 fields agree with the disc, 0 disagree
|
||||
|
||||
runtime value where the disc record DEFAULTS the field:
|
||||
AA_AxisMode_Max 0 (5 units)
|
||||
AA_AxisMode_Min 0 (5 units)
|
||||
AA_PitchMinus_Max 0.0628319 (5 units)
|
||||
AA_PitchMinus_Min 0.0628319 (5 units)
|
||||
AA_PitchPlus_Max 0.0628319 (5 units)
|
||||
AA_PitchPlus_Min 0.0628319 (5 units)
|
||||
AA_Roll_Max 0.0628319 (5 units)
|
||||
AA_Roll_Min 0.0628319 (5 units)
|
||||
AA_Yaw_Max 0.0628319 (5 units)
|
||||
AA_Yaw_Min 0.0628319 (5 units)
|
||||
AB_AA_PitchMinus 0 (5 units)
|
||||
AB_AA_PitchPlus 0 (5 units)
|
||||
AB_AA_Roll 0 (5 units)
|
||||
AB_AA_Yaw 0 (5 units)
|
||||
AB_AV_PitchMinus 0 (5 units)
|
||||
AB_AV_PitchPlus 0 (5 units)
|
||||
AB_AV_Roll 0 (5 units)
|
||||
AB_AV_Yaw 0 (5 units)
|
||||
AB_ConsumeShield 0 (5 units)
|
||||
AB_ConsumeShield_Begin 0 (5 units)
|
||||
AV_AxisMode_Max 0 (5 units)
|
||||
AV_AxisMode_Min 0 (5 units)
|
||||
AV_PitchMinus_Max 0.0628319 (5 units)
|
||||
AV_PitchMinus_Min 0.0628319 (5 units)
|
||||
AV_PitchPlus_Min 0.0628319 (5 units)
|
||||
AV_Roll_Max 0.0628319 (5 units)
|
||||
AV_Roll_Min 0.0628319 (5 units)
|
||||
AV_Yaw_Max 0.0628319 (5 units)
|
||||
AV_Yaw_Min 0.0628319 (5 units)
|
||||
ArterBurner_Acc 2 (5 units)
|
||||
ArterBurner_Vc 2 (5 units)
|
||||
AttackCraftPoint 0.1, 0.5 (5 units)
|
||||
AttackVesselPoint 0.1 (2 units)
|
||||
BarrelRoll_CountMaximum 0 (5 units)
|
||||
BarrelRoll_CountMinimum 0 (5 units)
|
||||
BarrelRoll_Radius 0 (5 units)
|
||||
BarrelRoll_Time 0 (5 units)
|
||||
BoostAway_Time_Maximum 0 (5 units)
|
||||
BoostAway_Time_Minimum 0 (5 units)
|
||||
ChargeDelay 1 (5 units)
|
||||
Color_B 1 (1 units)
|
||||
Color_G 1 (1 units)
|
||||
CutoffTimeMax 0 (5 units)
|
||||
CutoffTimeMin 0 (5 units)
|
||||
DecPitchFactor 30 (5 units)
|
||||
DefencePoint 0.1, 0.25 (4 units)
|
||||
Delay 0 (3 units)
|
||||
DelayAdjustment 0, 2 (5 units)
|
||||
DragFactorThreshold 0.5 (5 units)
|
||||
DryMass 10000 (2 units)
|
||||
FiringRange 0 (5 units)
|
||||
GrossMass 10000 (5 units)
|
||||
HQRatio 0.2, 1 (4 units)
|
||||
HoldPosition_BackRatio 0 (5 units)
|
||||
HoldPosition_CancelTime 0 (5 units)
|
||||
HoldPosition_CutoffRatio 0 (5 units)
|
||||
HoldPosition_LengthMax 0 (5 units)
|
||||
HoldPosition_LengthMin 0 (5 units)
|
||||
HoldPosition_MaximumTime 0 (5 units)
|
||||
HoldPosition_MinimumTime 0 (5 units)
|
||||
HoldPosition_SideRatio 0 (5 units)
|
||||
HomingResistAdjustment 0 (5 units)
|
||||
LowerHPThresholdRatio 0.3 (1 units)
|
||||
MinimumVelocity 0 (4 units)
|
||||
PitchDragFactor 2 (5 units)
|
||||
PowerCutConsumeShield 0 (5 units)
|
||||
PowerCutDeceleration 0 (5 units)
|
||||
ResistanceToExplosion 0.5 (3 units)
|
||||
ResistanceToPlayer 1 (5 units)
|
||||
ResistanceToShell 0.1 (3 units)
|
||||
ReverseThrust_Acc 0.25 (3 units)
|
||||
RollDragFactor 2 (5 units)
|
||||
SELength 2000 (5 units)
|
||||
ShieldRatio 1 (1 units)
|
||||
SideRoll_Length 0 (5 units)
|
||||
SideRoll_Time 0 (5 units)
|
||||
Size_Y 200, 300, 400, 600, 700 (5 units)
|
||||
Slalom_CutoffRatio 0 (5 units)
|
||||
Slalom_TurnCount_Max 0 (5 units)
|
||||
Slalom_TurnCount_Min 0 (5 units)
|
||||
SolidCutoff_LengthMax 0 (5 units)
|
||||
SolidCutoff_LengthMin 0 (5 units)
|
||||
SolidCutoff_Ratio 0 (5 units)
|
||||
Through_AngleMaximum 0 (5 units)
|
||||
Through_AngleMinimum 0 (5 units)
|
||||
Through_CutoffRatio 0 (5 units)
|
||||
Through_LengthMaximum 0 (5 units)
|
||||
Through_LengthMinimum 0 (5 units)
|
||||
Through_Time1Max 0 (5 units)
|
||||
Through_Time1Min 0 (5 units)
|
||||
Through_Time2Max 0 (5 units)
|
||||
Through_Time2Min 0 (5 units)
|
||||
ThrusterRatio 0.2, 1 (4 units)
|
||||
TurnAttack_CutoffRatio 0 (5 units)
|
||||
TurnAttack_DoubleRatio 0 (5 units)
|
||||
TurnAttack_DoubleTimeMax 0 (5 units)
|
||||
TurnAttack_DoubleTimeMin 0 (5 units)
|
||||
TurnAway_Time_Maximum 0 (5 units)
|
||||
TurnAway_Time_Minimum 0 (5 units)
|
||||
Turn_AngularVelocity 0 (5 units)
|
||||
UsingChaffRatio 0 (5 units)
|
||||
@@ -387,3 +387,42 @@ matches the loader's own miss value.
|
||||
off-by-one column in the dump reader — `f[3]` is the u32, `f[4]` the float — and
|
||||
decoding one by hand (`1128792000` = `0x43480000` = 200.0) showed the map had been
|
||||
right all along.
|
||||
|
||||
## ✅ The whole map verified — 154/154 — and 101 defaulted fields read out
|
||||
|
||||
Anchoring the key string to the **first store after the accessor call** (rather
|
||||
than to the nearest store) makes the extraction exact: **159 fields**, of which
|
||||
**125 are floats**. `verify_fieldmap.rs` now checks every one of them against the
|
||||
live objects: **154 field values agree with the disc record, 0 disagree** across
|
||||
five capital ships.
|
||||
|
||||
Getting there needed one rule, and the ten last "mismatches" are what taught it:
|
||||
|
||||
```
|
||||
AV_PitchPlus_Max disc 3.6 live +176 = 0.0628319 ( = 3.6° in radians)
|
||||
MaximumBank_Normal disc 60 live +256 = 1.0472 ( = 60° in radians)
|
||||
```
|
||||
|
||||
**Angle fields are degrees on disc and radians at runtime** — the incidental
|
||||
observation from the previous pass, now confirmed as an exact conversion across
|
||||
every angle field and every unit.
|
||||
|
||||
With the map verified, the dump answers the brief's question for **101 fields**
|
||||
that these records leave defaulted
|
||||
([`captures/stage02-defaulted-field-runtime-values.txt`](captures/stage02-defaulted-field-runtime-values.txt)).
|
||||
The shape of the answer:
|
||||
|
||||
- **Angle limits default to 3.6°** (`0.0628319` rad) — every `AA_*`/`AV_*`
|
||||
`Pitch/Roll/Yaw` `Min`/`Max`, identical across all five units.
|
||||
- **Afterburner and turn-attack fields default to 0** (`AB_*`, `TurnAttack_*`,
|
||||
`AA_AxisMode_*`, `AV_AxisMode_*`).
|
||||
- **`FiringRange` defaults to 0**, matching the loader's own miss value exactly.
|
||||
- **The ratio family is per-unit, not constant**: `HQRatio` 0.2 or 1,
|
||||
`ThrusterRatio` 0.2 or 1, `AttackCraftPoint` 0.1 or 0.5, `DefencePoint` 0.1 or
|
||||
0.25, `DelayAdjustment` 0 or 2 — so these are *runtime values for units that do
|
||||
not set the field*, not a single global default.
|
||||
- **`Size_Y` takes that unit's own `Size_X`** (200/300/400/600/700).
|
||||
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user