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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
58
docs/re/structures/stage16-boss.md
Normal file
58
docs/re/structures/stage16-boss.md
Normal file
@@ -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
|
||||
「ボスのレーザー弾IDが取れていない」 — *"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.
|
||||
Reference in New Issue
Block a user