From 92d1a39ce251e57123849155f3737da3be94ebe3 Mon Sep 17 00:00:00 2001 From: "Claude (auto)" Date: Thu, 27 Aug 2026 20:33:27 +0000 Subject: [PATCH] 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) Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE --- docs/re/BACKLOG.md | 50 +++++++++++ docs/re/INDEX.md | 2 +- docs/re/structures/player-tuning-tables.md | 97 ++++++++++++++++------ 3 files changed, 124 insertions(+), 25 deletions(-) diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index e5a3a4f9..66e8560d 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -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. diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index c8e5e9c8..b9d4677d 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -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 | | [`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 | diff --git a/docs/re/structures/player-tuning-tables.md b/docs/re/structures/player-tuning-tables.md index c0064a68..406f0fb9 100644 --- a/docs/re/structures/player-tuning-tables.md +++ b/docs/re/structures/player-tuning-tables.md @@ -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`