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

@@ -4901,3 +4901,53 @@ named 1 283 entries in `DefTables` and 0 here.
consumer; `adv_yaw`'s meaning; object 4. **No loader was located for any of the
three new objects** — this is a data-side characterisation only, so which code
reads the curves is open.
---
## ✅🔴 2026-08-27 — the player-tuning consumer: found for half of it, BLOCKED for the other half, and two of my own labels refuted
Item (a). Static only; no artefact changed (the census output is unaffected).
✅ **The consumer is `sub_822F9498` — the unit-definition loader the corpus
already documents** (`live-unit-definitions.md`, ← `sub_821A6CF0`, global
`[0x828F358C]`). The field-name block `0x8209F3000x8209F600`
(`BulletTimeVolumePC`, `FireBirdPower`, `ChargeMaximum`, `Turn180RequiredTime`,
`ShieldDoubler_Time`, `HPRegenerator_RegenSpeed`, `ExtraCartridge_Quantity`, …)
is **36/36 referenced**, every reference inside that one function.
🔴 **REFUTED — "`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. ⚠️ My 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 / ~1 530. Unit `Maneuver`
100/350/1 200 gives consistent ratios **1.25 / 1.20 / 1.28**; `Booster`
100/612/2 100 gives **1.25 / 0.69 / 0.73**. The flight tracks `Maneuver`.
**What `Booster` actually is:** a **second, faster profile** — **39 of 50
values identical** to the player unit's `Maneuver`, and of the 11 that move the
three velocities scale by **exactly ×1.75** (350→612 = 612.5 rounded;
1 200→2 100; `SideThrustVelocity_Max` 500→875) and two accelerations by **×1.5**
(600→900; 1 000→1 500). 🟡 What selects it is not settled.
🔴 **BLOCKED — the `AnalogRevice_*`/`Tweak` reader.** That schema is its own
contiguous block at `0x820A119C0x820A1378`, headed by **`ControlTweakName`**,
then the 12 `Tweak` names, then the 8 curve names — **0 of 28 strings has a code
xref, and no instruction anywhere names a `0x820A1xxx` operand**. Control: the
adjacent block `sub_822F9498` reads scores 36/36, so the absence is real. Cause
unexplained; the static route is exhausted. **A runtime watch on the curve values
is the way in (NEEDS-HUMAN).**
⚠️ **The twin-string-block trap, caught:** `mov_stick_play`/`eye_stick_play`
exist **twice**; only the second copy (`0x820AA630`) is referenced, by
`sub_822AE628` — which also references `ControlTweak`, `Camera`, `Rendering`,
`BackGround` and the DOF/bloom names. **`ControlTweak` records live only in
`GP_HANGAR_ARSENAL.pak` (×6)**; `Tweak` only in the six main-game paks (×1).
`sub_822AE628` reads the **hangar's** control table — a clean, wrong answer if
taken for ours.
🟡 Not settled: what selects the `Booster` profile; what `adv_yaw`'s non-monotone
curve indexes (unchanged — it needs the reader); why the `0x820A1xxx` block has
no xref at all when its neighbour has 36.

View File

@@ -103,7 +103,7 @@ files, which is how the same ground got covered twice.
| [`structures/stage-settings-table.md`](structures/stage-settings-table.md) | The per-stage settings object — Camera rigs, Player limits, Difficulty_* damage record | ✅ CONFIRMED, 24 settings objects vs 29 resource objects both using Phase_1/2/3; Camera is 13/14 fields constant; GravityFactor non-zero in 4 stages; IsBoss16Enable identifies one object; the Phase block is 94 fields of which 68 never vary between phases; all 24 objects named StageParameter_S<NN> |
| [`structures/isl-mission-timer.md`](structures/isl-mission-timer.md) | The mission timer — two sequential countdowns, not a limit and a warning | ✅ CONFIRMED — read from `sub_822639B8`; the threshold reading is |
| [`structures/archive-naming.md`](structures/archive-naming.md) | Which archives the disc can name — 100% for menu paks, **0.0%** for the six 2D paks and `GP_READY_ROOM` | ✅ CONFIRMED — 6027 names × 16 prefixes, bimodal; unnamed entries split by content — three UI paks have ZERO unnamed IDXD (artwork only), DefTables is the only real data gap (1295 LOD/motion tables); **route 2 = the `Enumerate` declaration tables** closes DefTables to 1413/1425 IDXD (99.2 %), 12 left; XPR2 manifests refuted as a naming source |
| [`structures/player-tuning-tables.md`](structures/player-tuning-tables.md) | Player tuning: 8 analog response curves, the 50-field `Booster` flight envelope, special attacks, the S16 boss | ✅ CONFIRMED — the 4 of 337 unnamed main-game objects that belong to no documented family |
| [`structures/player-tuning-tables.md`](structures/player-tuning-tables.md) | Player tuning: 8 analog response curves, a second (×1.75 velocity) flight profile, special attacks, the S16 boss | ✅/🔴 — special-attack records read by `sub_822F9498`; `Booster` CORRECTED (it is the unit `Maneuver` schema, and NOT the profile the player flies); the analog block is referenced by nothing |
| [`structures/hud-config.md`](structures/hud-config.md) | The in-game HUD configuration — 16 records, 419 asset paths, and a per-stage `ResourceTable` | ✅ CONFIRMED — 0 of 419 config paths resolve as pak entries |
| [`structures/mission-script-manifest.md`](structures/mission-script-manifest.md) | `Stage\script.tbl`'s 11 non-`MISSION` fields, and the mission dialogue table they name | ✅ CONFIRMED — 1 of 7 values resolves (`message\MissionDialogMessage.tbl`, 200 records), controls in the same sweep |
| [`structures/stage-numbering-and-player-craft.md`](structures/stage-numbering-and-player-craft.md) | The disc's stage numbering (S01S16, S18S29) and the player's craft per stage | ✅✅ CONFIRMED — two independent files close on 6 + 15 + 1 + 6 = 28 |

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`