The consumer is sub_822F9498, the unit-definition loader the corpus already documents. The field-name block 0x8209F300-600 (BulletTimeVolumePC, FireBirdPower, ChargeMaximum, Turn180RequiredTime, ShieldDoubler_Time, ...) is 36/36 referenced, every reference inside that one function. REFUTED, my own label: "Booster is a new schema". Its 50 field names are a strict subset of the unit Maneuver record -- 50/50 shared, 0 Booster-only. CruisingVelocity occurs in exactly 115 records disc-wide: 114 Maneuver + this one. The first check compared against Generic and scored 0/50, which read as brand new: the wrong record of a multi-record object is not a control. REFUTED: "Booster is the player craft's flight envelope". flight-speed-law.md measured ~125/~420/~1530; unit Maneuver 100/350/1200 gives consistent ratios 1.25/1.20/1.28, Booster 100/612/2100 gives 1.25/0.69/0.73. Booster is a SECOND, faster profile: 39 of 50 values identical to the player unit, and of the 11 that move the three velocities scale by exactly x1.75 and two accelerations by x1.5. BLOCKED: the AnalogRevice/Tweak reader. That schema is its own contiguous block at 0x820A119C-0x820A1378 headed by ControlTweakName -- 0 of 28 strings has a code xref and no instruction anywhere names a 0x820A1xxx operand, against a control of 36/36 on the neighbouring block. Runtime watch needed. Caught on the way: mov_stick_play/eye_stick_play exist twice; the referenced copy belongs to sub_822AE628, which reads GP_HANGAR_ARSENAL's ControlTweak records (6 of them, and none anywhere else) -- a clean, wrong answer if taken for ours. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
7.3 KiB
✅ The player-tuning tables — analog response curves, booster/flight limits, special attacks
- Regenerate:
python3 tools/re-capture/main_game_unnamed.py→../data/main-game-unnamed.txt - Where:
GP_MAIN_GAME_{D,E,F,I,J,S}.pak, as unnamed IDXD objects — identical hash sets in all six language copies. - Related: flight-speed-law, flight-controls-runtime, unit-datasheet-static, archive-naming.
Found while characterising the 337 unnamed IDXD objects in each main-game pak
(see archive-naming.md). 333 of the 337 belong to families the corpus already
documents. These are the four that do not.
✅ The analog stick response curves — object 955ca077
Eight records, one per input axis, each 11 positional values plus a named
Count = 11. ⚠️ Count naming an indexed group is not safe in general — here
it was tested and holds 8/8.
| record | shape | curve |
|---|---|---|
AnalogRevice_yaw |
identity | 0.0 0.1 … 1.0 |
AnalogRevice_roll |
identity | 0.0 0.1 … 1.0 |
AnalogRevice_throttle |
identity | 0.0 0.1 … 1.0 |
AnalogRevice_pitch |
strongly eased | 0.000 0.003 0.010 0.020 0.040 0.065 0.100 0.155 0.250 0.500 1.000 |
AnalogRevice_eye_pitch |
eased | 0.00 0.01 0.03 0.06 0.10 0.18 0.28 0.42 0.60 0.80 1.00 |
AnalogRevice_eye_yaw |
eased, flat dead lead-in | 0.00 0.00 0.00 0.00 0.03 0.10 0.18 0.29 0.45 0.68 1.00 |
AnalogRevice_adv_roll |
S-curve | 0.000 0.005 0.032 0.080 0.138 0.231 0.387 0.584 0.792 0.941 1.000 |
AnalogRevice_adv_yaw |
not monotone | 0.000 0.016 0.052 0.143 0.482 0.940 1.000 0.916 0.611 0.382 0.208 |
✅ Three of the eight are the identity ramp — yaw, roll and throttle are
unshaped, and the shaping the game does apply is all on pitch and the camera
("eye") axes. 🟡 adv_yaw rises to 1.0 at sample 6 then falls back to
0.208, so whatever it indexes, it is not a stick-deflection curve like the
other seven; it has the shape of an envelope over something else. Untested.
The same object carries a Tweak record with what read as deadzones and
input-timing constants — mov_stick_play = 5000, eye_stick_play = 6000
(raw stick units), order_cancel_time = 120, YawMagForNormal = 2.0, and six
receipt_* / minimum_side_s values. 🟡 The units are inferred from magnitude,
not read from the consumer.
🔴 The player craft's flight envelope — object 890e1be4, CORRECTED
My label from the first pass was wrong twice over. Kept, with the measurements that refuted it, because both errors are instructive.
Error 1 — Booster is not a new schema. Its 50 field names are a strict
subset of the unit Maneuver record: 50/50 shared, zero Booster-only. (The
first check compared against Generic and scored 0/50, which looked like a
brand-new structure — the wrong record of a multi-record object is not a
control.) CruisingVelocity appears in exactly 115 records disc-wide: 114
Maneuver + this one Booster.
Error 2 — it is not the profile the player actually flies. flight-speed-law measured the Delta Saber at ~125 / ~420 / ~1 530 (min / cruise / max). Against the two candidate tables:
| min | cruise | max | ratios measured ÷ table | |
|---|---|---|---|---|
unit Maneuver (5 units carry it) |
100 | 350 | 1 200 | 1.25 / 1.20 / 1.28 — consistent |
Booster |
100 | 612 | 2 100 | 1.25 / 0.69 / 0.73 — not |
✅ The flight matches the unit Maneuver record, at one consistent scale.
Booster is a second, faster profile — and the way it differs is the
finding: 39 of its 50 values are identical to the player unit's Maneuver,
and of the 11 that move, the three velocities are scaled by exactly ×1.75
(350 → 612, i.e. 612.5 rounded; 1 200 → 2 100; SideThrustVelocity_Max
500 → 875) and two accelerations by ×1.5 (Acceleration 600 → 900,
SideThrustAcceleration 1 000 → 1 500). The rest: Deceleration 500 → 600,
PowerCutDeceleration 10 → 15, PowerCutConsumeShield 20 → 75,
AB_ConsumeShield_Begin 50 → 20, ArterBurner_Vc 2.0 → 1.5.
🟡 What that profile is for — an upgrade, a difficulty tier, a boost mode — is not settled. Nothing selects it on the disc that I could find.
The object's other records stand as described: TacticalManeuver
(Turn180RequiredTime 0.5, RollL/RRequiredTime 1.0, RollL/RSlideLength 350,
RollToHorizonTime 2.0), SpecialAttack + SpecialAttackGauge_1/2/3
(ChargeMaximum 33 / 66 / 100), SpecialWeapon, Misc.
✅ The consumer: sub_822F9498, the unit-definition loader
The string-xref join settles it. The field-name block at 0x8209F300–0x8209F600
— BulletTimeVolumePC, FireBirdPower, ChargeMaximum, Turn180RequiredTime,
RollToHorizonTime, ShieldDoubler_Time, HPRegenerator_RegenSpeed,
ExtraCartridge_Quantity, … — is 36/36 referenced, and every reference lands
inside sub_822F9498, the loader live-unit-definitions already documents
(← sub_821A6CF0, global [0x828F358C]). So the special-attack / tactical
records are read by the same code that reads unit definitions, which is exactly
what a Maneuver-schema Booster predicts.
🔴 BLOCKED: the analog-curve block is referenced by nothing
The AnalogRevice_* / Tweak schema is a second contiguous block at
0x820A119C–0x820A1378, in the object's own order:
ControlTweakName
mov_stick_play mov_trigger_play eye_stick_play receipt_after_b
receipt_reverse_s receipt_tgt_near receipt_tgt_atk receipt_side_s
minimum_side_s receipt_match_spd order_cancel_time YawMagForNormal
AnalogRevice_adv_roll … AnalogRevice_throttle (8 curve names)
0 of its 28 strings has a code xref, and no instruction anywhere in the
disassembly names a 0x820A1xxx operand. Control: the neighbouring block that
sub_822F9498 reads scores 36/36. So this is a real absence, not a query
mistake — but its cause is unexplained, and the reader is 🔴 unreachable this way.
⚠️ The twin-string-block trap, in the flesh. mov_stick_play and
eye_stick_play each exist twice; only the second copy (0x820AA630,
0x820AA654) is referenced, by sub_822AE628 — which also references
ControlTweak, Camera, Rendering, BackGround, WeaponChangeFrame and the
DOF/bloom field names. And ControlTweak records exist only in
GP_HANGAR_ARSENAL.pak (×6), while Tweak exists only in the six main-game
paks (×1 each). sub_822AE628 reads the hangar's control table. Taking it
for ours would have been a clean, wrong answer.
✅ The Stage 16 boss — object 0202269d
Records Guardian (19 fields) and Core (10). Guardian names its three
weapons by shell id — Shell_S16Boss_AAGun, Shell_S16Boss_Laser,
Shell_S16Boss_HBeam — which is what identifies the object: Stage 16, the
stage stage-settings-table.md singles out via its unique IsBoss16Enable
field. Guardian HP 65 000 with DamageLevel1/2 at 35 000 / 20 000; Core
HP 42 000 with levels at 25 000 / 10 000 and a lock-on release cycle
(LockOnReleaseInterval 15.0 ± LockOnReleaseRandomInterval 5.0).
🟡 The fourth: object a6c6c79b
One record, Generic, one field — the name eff_n0071 with an empty value.
An effect id and nothing else. Not identified.