From 16c079aa6009c0c04edb2beecf568a6a87d945e7 Mon Sep 17 00:00:00 2001 From: "Claude (auto)" Date: Thu, 27 Aug 2026 23:32:09 +0000 Subject: [PATCH] re: the Stage 16 boss closed end to end; five disc fields the image never names New doc docs/re/structures/stage16-boss.md joining three iterations' pieces: the data object (player-tuning-tables), the collision table (collisionset) and now the loader. sub_82315AE8 r11 is the boss loader, and it says so itself: 558 instructions, one call site (sub_82308AB8), and its 21-entry block is 19 field names plus the Japanese error "the boss's laser shell ID could not be obtained". Zero partials: every one of the 19 is a Guardian or Core field -- 16 of Guardian's 19, 5 of Core's 10, DamageLevel1/2 shared. The boss reads as a rotating, vertically-moving platform with a guard cycle, three shell ids (AAGun, Laser, HomingLaser -- the Shell_S16Boss_* set) and a Core that periodically drops lock-on. The residual is the finding: 8 disc fields the loader never names, and five of them are not strings in the executable at all -- InitHight (the game's own typo for Height) and the four DamageLevel{1,2}Bomb{,Rand}Time. Controls: ChargeTime (10 chars) and GuardTime (9) are the same shape and both ARE present, so it is not an extraction artefact; HP (2 chars) is below the extractor's floor (shortest row is 6); Radius exists but is generic. So the disc carries fields no code names -- the mirror image of the usual trap, a loader naming a field the disc never values. Whether they are read positionally or are dead data is not settled. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE --- docs/re/BACKLOG.md | 35 ++++++++++++++++++ docs/re/INDEX.md | 1 + docs/re/structures/stage16-boss.md | 58 ++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 docs/re/structures/stage16-boss.md diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index dcbc6543..bc13cfe9 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -5383,3 +5383,38 @@ coordinates as strings** (`757,228`, `903,343`, `1092,457`). ๐ŸŸก Not settled: none of the five was opened โ€” this iteration produced the shortlist, not the findings. The 224 non-table rows were not partitioned further (XDK vs game engine vs noise). + +--- + +## โœ… 2026-08-27 โ€” the Stage 16 boss closed end to end; and five disc fields the image never names + +Item (a). New doc `docs/re/structures/stage16-boss.md` joining three iterations' +pieces: the data object (`player-tuning-tables.md`), the collision table +(`collisionset.md`) and now the loader. Static only; no artefact changed. + +โœ… **`sub_82315AE8` `r11` is the boss loader, and it says so itself.** 558 +instructions, **one** call site (`sub_82308AB8`); its 21-entry block is 19 field +names plus the Japanese error ใ€Œใƒœใ‚นใฎใƒฌใƒผใ‚ถใƒผๅผพ๏ผฉ๏ผคใŒๅ–ใ‚Œใฆใ„ใชใ„ใ€ โ€” *"the boss's +laser shell ID could not be obtained"*. + +โœ… **Zero partials: every one of the 19 is a `Guardian` or `Core` field** โ€” 16 of +`Guardian`'s 19, 5 of `Core`'s 10, `DamageLevel1`/`2` shared. The boss reads as a +rotating, vertically-moving platform with a guard cycle, three shell ids +(`AAGun`/`Laser`/`HomingLaser` โ€” the `Shell_S16Boss_*` set) and a `Core` that +periodically drops lock-on. + +๐Ÿ”‘ **The residual is the finding: 8 disc fields the loader never names, and five +of them are not strings in the executable at all** โ€” `InitHight` (the game's own +typo for *Height*) and the four `DamageLevel{1,2}Bomb{,Rand}Time`. **Controls:** +`ChargeTime` (10 chars) and `GuardTime` (9) are the same shape and both ARE +present, so it is not an extraction artefact; `HP` (2 chars) is below the +extractor's floor (shortest row is 6); `Radius` exists but is generic (3 copies, +used by many systems). + +โ‡’ **The disc carries fields no code names** โ€” the mirror image of the usual trap +(a loader naming a field the disc never values). ๐ŸŸก Whether they are read +positionally or are dead data is not settled. + +๐ŸŸก Not settled: the other four shortlisted rows (`sub_823BDAA8` r11/r10 muzzle +frames + motion names, `sub_8219E560` leaderboard keys, `sub_825F2CF0`/ +`sub_825F2F88` post-processing) are still unopened. diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index 9063a742..a838470a 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -103,6 +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/stage16-boss.md`](structures/stage16-boss.md) | The Stage 16 boss end to end โ€” object, loader `sub_82315AE8`, collision | โœ… CONFIRMED โ€” 19/19 of the loader's names are `Guardian`/`Core` fields; 5 disc fields have no string in the image (two same-length controls do) | | [`structures/result-screens.md`](structures/result-screens.md) | The debriefing and pilot-record screens โ€” `STAGE_RESULT` 21 fields, `OVERVIEW` 9, `EX_OVERVIEW` 7 | โœ… CONFIRMED โ€” the compiled key lists `sub_822814D8` (24/24) and `sub_8227A3A0` (21/21) match the `tables.pak` records exactly; `2+21+1=24`, `5+7+9=21` | | [`structures/player-tuning-tables.md`](structures/player-tuning-tables.md) | **`PlayerParams`** โ€” the player parameter table: `Booster` flight model, special attacks, 8 analog curves, the S16 boss | โœ…โœ… `sub_822F9498` is `PlayerParams`'s loader, not the unit loader; **the analog block's reader SOLVED โ€” `sub_821A6CF0`, base `0x820A1630`**, via the new base-solver (277 name-block loaders image-wide, control 217/226 on `sub_82341A20`); ๐ŸŸก nothing selects `Booster` | | [`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 | diff --git a/docs/re/structures/stage16-boss.md b/docs/re/structures/stage16-boss.md new file mode 100644 index 00000000..8500b8f1 --- /dev/null +++ b/docs/re/structures/stage16-boss.md @@ -0,0 +1,58 @@ +# โœ… The Stage 16 boss โ€” object, loader and collision, end to end + +Three iterations found the pieces separately; this joins them. + +| piece | where | found in | +|---|---|---| +| the data object (`Guardian` 19 fields + `Core` 10) | `GP_MAIN_GAME_*.pak`, object `0202269d` | [[player-tuning-tables]] | +| the collision table (23 parts / 20 meshes) | `sub_823AE908` `r11`, `sub_823C0260` `r11` | [[collisionset]] | +| **the loader** | **`sub_82315AE8` `r11`, base `0x820B0000`** | here | + +## โœ… `sub_82315AE8` is the boss loader โ€” it says so itself + +558 instructions, **one** call site (`sub_82308AB8`). Its name block is 21 +entries: **19 field names and two strings**, one of which is the Japanese error +ใ€Œใƒœใ‚นใฎใƒฌใƒผใ‚ถใƒผๅผพ๏ผฉ๏ผคใŒๅ–ใ‚Œใฆใ„ใชใ„ใ€ โ€” *"the boss's laser shell ID could not be +obtained"*. The function names its own subject. + +โœ… **Every one of the 19 is a `Guardian` or `Core` field โ€” zero in neither.** +16 of `Guardian`'s 19, and 5 of `Core`'s 10 (`DamageLevel1`/`DamageLevel2` are +shared by both records, so the sets overlap): + +``` +Guardian side InitRotation MaxRotationSpeed RotationAccel MaxVerticalSpeed + VerticalAccel ChargeTime GuardInterval GuardTime + LaserShellID LaserIntervalTime LaserLifeTime + HomingLaserShellID HomingLaserPlayerCheckTime AAGunShellID + DamageLevel1 DamageLevel2 +Core side LockOnCancelTime LockOnReleaseInterval LockOnReleaseRandomInterval +``` + +So the boss is **a rotating, vertically-moving platform** (`InitRotation`, +`Max*Speed`, `*Accel`) with a **guard cycle** (`GuardInterval`/`GuardTime`), +**three weapons** (`AAGunShellID`, `LaserShellID`, `HomingLaserShellID` โ€” the +`Shell_S16Boss_*` ids), and a **`Core` that periodically drops its lock-on** +(`LockOnReleaseInterval` ยฑ `LockOnReleaseRandomInterval`, `LockOnCancelTime`). + +## ๐Ÿ”‘ Eight disc fields the loader never names โ€” and five are not in the image at all + +`Guardian`: `HP`, `InitHight`, `Radius`. `Core`: `HP`, `DamageLevel1BombTime`, +`DamageLevel2BombTime`, `DamageLevel1BombRandTime`, `DamageLevel2BombRandTime`. + +Searching the executable's string table for each: + +| name | length | string rows | +|---|---:|---:| +| `InitHight` (the game's own typo for *Height*) | 9 | **0** | +| `DamageLevel1BombTime` โ€ฆ all four | 20โ€“24 | **0** | +| `ChargeTime` โ€” **control, same shape, IS read** | 10 | 1 | +| `GuardTime` โ€” **control** | 9 | 1 | +| `Radius` | 6 | 3 (generic; many systems) | +| `HP` | 2 | 0 โ€” below the extractor's floor (shortest row is 6) | + +โ‡’ **Five field names the disc values do not exist as strings in the executable**, +and the two same-length controls that the loader *does* read are both present, so +this is not an extraction artefact. **The disc carries fields no code names** โ€” +the mirror image of the usual trap (a loader naming a field the disc never +values). ๐ŸŸก Whether they are read positionally, or are simply dead data the +designers left in, is not settled.