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:
@@ -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 `0x8209F300–0x8209F600`
|
||||
(`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 `0x820A119C–0x820A1378`, 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.
|
||||
|
||||
@@ -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 (S01–S16, S18–S29) and the player's craft per stage | ✅✅ CONFIRMED — two independent files close on 6 + 15 + 1 + 6 = 28 |
|
||||
|
||||
@@ -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