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:
@@ -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 **`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`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user