re: the player-tuning consumer -- found for half, BLOCKED for the other, two of my labels refuted

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
This commit is contained in:
Claude (auto)
2026-08-27 20:33:27 +00:00
parent c171a194d9
commit 92d1a39ce2
3 changed files with 124 additions and 25 deletions

View File

@@ -37,33 +37,82 @@ input-timing constants** — `mov_stick_play = 5000`, `eye_stick_play = 6000`
`receipt_*` / `minimum_side_s` values. 🟡 The units are inferred from magnitude,
not read from the consumer.
## The player craft's flight envelope — object `890e1be4`
## 🔴 ~~The player craft's flight envelope~~ — object `890e1be4`, CORRECTED
Eight records. The big one is **`Booster`, 50 fields**, and it is the *player*
side of the `AA_`/`AV_` acceleration/velocity pair that
[[unit-datasheet-static]] documents for NPC craft: `AA_Yaw_Min/Max`,
`AV_Yaw_Min/Max`, `AA_Roll_*`, `AV_Roll_*`, `AA_PitchPlus/Minus_*`,
`AV_PitchPlus/Minus_*`, `AA_/AV_AxisMode_*`, each with an afterburner twin
(`AB_AA_Yaw`, `AB_AV_Roll`, …), plus `MinimumVelocity 100`,
`CruisingVelocity 612`, `MaximumVelocity 2100`, `Acceleration 900`,
`Deceleration 600`, `SideThrustAcceleration 1500`, `SideThrustVelocity_Max 875`,
three `*DragFactor 3.0` and `MaximumBank_Normal 60.0`.
> **My label from the first pass was wrong twice over.** Kept, with the
> measurements that refuted it, because both errors are instructive.
The other seven:
**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`.
- `TacticalManeuver``Turn180RequiredTime 0.5`, `RollL/RRequiredTime 1.0`,
`RollL/RSlideLength 350`, `RollToHorizonTime 2.0`, `TurnTargetRequiredTime 2.0`.
These name the **evade moves** whose morph poses the mesh work already found as
`_mnv*` / `_turn180` XBG7 variants.
- `SpecialAttack` + `SpecialAttackGauge_1/2/3` — the charge gauge in three bands
(`ChargeMaximum` 33 / 66 / 100, each with its own `AttackTime_Minimum/Maximum`),
and the "FireBird" attack (`FireBirdPower 1000`, `_Ex 4000`, `FireBirdTime
0.75`, `FireBirdRadius 100.0f` — the game's own stray `f` suffix).
`BulletTimeVolumePC 0.4` / `NPC 0.1` are the slow-motion factors.
- `SpecialWeapon``ShieldDoubler_Time/Count`, `HPRegenerator_RegenSpeed/
MinimumTime`, `ExtraCartridge_Quantity/CoolVolume/TimeVolume`.
- `Misc` — effect names (`eff_s110`, `eff_i003_f`, `eff_i004_f`, `eff_c001`) and
`EffectPlacementFrameName = GN_mnt`.
**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 **`0x8209F3000x8209F600`**
`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
**`0x820A119C0x820A1378`**, 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`