diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index bd83a346..95bad411 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -5244,3 +5244,51 @@ list. The function body was not read. And four of the five surfaced blocks are still unopened (`STAGE_RESULT`/`EX_OVERVIEW`; `g_mWorldViewProjection`/ `NormalMap`; `Boss16Collision*`; `roh_n001_menu1_cam_pos`) — each grepped this iteration and each appearing in **no** document but my own. + +--- + +## ✅ 2026-08-27 — the debriefing and pilot-record screens; the save-screen block was already owned + +Item (a), the results/leaderboard blocks. New doc +`docs/re/structures/result-screens.md`. Static only; no artefact changed. + +⚠️ **Read-before-claiming caught one of the three.** `savegame-format.md` already +documents the shape *and* this exact list: *"the LOAD/SAVE screen's config key +list is compiled into the executable, as a pointer array of key strings — the +same shape as the Arsenal's … match the pak record exactly"*, run starting +`0x820A0074`. **`sub_82286BC8`'s 18 names are that list** (17/18 are a +`tables.pak` field or record). Nothing new there; residual +**`PLAYER_AMMO_LESS_10`**, not a `tables.pak` name at all. + +✅ **The other two are new screens of the same shape, and they close exactly.** +All names resolve into `tables.pak`: `sub_822814D8` **24/24**, `sub_8227A3A0` +**21/21**. + +* **`sub_822814D8` = the debriefing screen.** 24 = 2 screen ids + (`STAGE_RESULT`, `EX_STAGE_RESULT`) + **21 `stage_*` fields** + one sound cue + (`SE_BOSS_CORE_CHARGE`); the `tables.pak` `STAGE_RESULT` record has **exactly + 21** fields (2 objects, both 21). +* **`sub_8227A3A0` = the pilot record / career screen.** 21 = 5 screen ids + (`LAST_RESULT`, `EX_BASE`, `EX_MAIN`, `EX_OVERVIEW`, `OVERVIEW`) + **7 + `ex_overview_*`** + **9 `overview_*`**; the records `EX_OVERVIEW` and `OVERVIEW` + have **exactly 7 and 9**. + +`2+21+1 = 24` and `5+7+9 = 21`, with 21/7/9 measured independently off the pak — +the arithmetic closes both ways. + +🔑 **The debriefing readout is nine `num`/`points` pairs plus three points-only +lines**: kills by class, main/sub objectives, clear time, shoot-down ratio and +both damage categories carry a raw count *and* its score contribution; +`friendly_fire`, `shoot_down_others` and `weight` have no counter column. Same +partition `mission-scoring.md` measures on the settings side — that document owns +the *rules*, this is the *readout*. + +🔑 `OVERVIEW` = the seven `EX_OVERVIEW` fields **plus `overview_rank` and +`overview_medals`**, which is what makes `EX_` the reduced variant of the same +screen rather than a different one. + +🟡 Not settled: what `EX_` means — `EX_BASE`, `EX_MAIN`, `EX_STAGE_RESULT`, +`EX_FONT` are keys with **no record of that name**, so it is a screen-id +convention, not a table. `PLAYER_AMMO_LESS_10` unexplained. And **two of the four +surfaced blocks remain unopened** (`g_mWorldViewProjection`/`NormalMap` engine +material slots; `Boss16Collision*` + `roh_n001_menu1_cam_pos`). diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index 08796c97..9063a742 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/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 | | [`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 | diff --git a/docs/re/structures/result-screens.md b/docs/re/structures/result-screens.md new file mode 100644 index 00000000..b1782010 --- /dev/null +++ b/docs/re/structures/result-screens.md @@ -0,0 +1,78 @@ +# ✅ The debriefing and pilot-record screens — `STAGE_RESULT`, `OVERVIEW`, `EX_OVERVIEW` + +- **Where:** `tables.pak` (the menu config pak), records `STAGE_RESULT`, `OVERVIEW`, + `EX_OVERVIEW`; key lists compiled into the executable at `sub_822814D8` and + `sub_8227A3A0` (found by the base-solver, [[player-tuning-tables]]). +- **Related:** [[mission-scoring]] owns the *rules* (`Score_*` in the stage + settings); this is the *readout*. [[savegame-format]] documents the same + compiled-key-list shape for the LOAD/SAVE screen. + +## The shape was already known — for other screens + +[[savegame-format]] establishes it: *"the LOAD/SAVE screen's config key list is +compiled into the executable, as a pointer array of key strings — the same shape +as the Arsenal's (whose keys sit a few hundred bytes earlier and match the pak +record exactly)"*, run starting `0x820A0074`. **`sub_82286BC8`'s 18-name block is +exactly that list** — 17 of its 18 are a `tables.pak` field or record name, so it +is the documented save-screen list and nothing new. Its lone residual is +**`PLAYER_AMMO_LESS_10`**, which is not a `tables.pak` name at all. + +## ✅ Two more screens, and the key lists match their records exactly + +| block | names | all present in `tables.pak`? | +|---|---:|---| +| `sub_822814D8` | 24 | **24 / 24** | +| `sub_8227A3A0` | 21 | **21 / 21** | + +And the arithmetic closes against the records themselves: + +* **`sub_822814D8` = the debriefing screen.** 24 names = 2 screen ids + (`STAGE_RESULT`, `EX_STAGE_RESULT`) + **21 `stage_*` fields** + one sound cue + (`SE_BOSS_CORE_CHARGE`). The `tables.pak` record `STAGE_RESULT` has **exactly + 21 fields** (2 objects, both 21). +* **`sub_8227A3A0` = the pilot record / career screen.** 21 names = 5 screen ids + (`LAST_RESULT`, `EX_BASE`, `EX_MAIN`, `EX_OVERVIEW`, `OVERVIEW`) + **7 + `ex_overview_*`** + **9 `overview_*`**. The records `EX_OVERVIEW` and + `OVERVIEW` have **exactly 7 and 9 fields** (2 objects each). + +`2+21+1 = 24` and `5+7+9 = 21`, with 21/7/9 measured independently off the pak. + +### The debriefing readout, in full + +``` +stage_num_shoot_down_aircrafts stage_points_shoot_down_aircrafts +stage_num_shoot_down_ships stage_points_shoot_down_ships + stage_points_shoot_down_others +stage_weight_shoot_down +stage_num_main_objectives stage_points_main_objectives +stage_num_sub_objectives stage_points_sub_objectives +stage_clear_time stage_points_clear_time +stage_shoot_down_ratio stage_points_shoot_down_ratio +stage_damages_friendly_ships stage_points_damages_friendly_ships +stage_damages_wingman stage_points_damages_wingman + stage_points_friendly_fire +stage_total_points stage_rank +``` + +🔑 **Nine `num`/`points` pairs plus three points-only lines** — the screen shows +a raw count *and* its score contribution for kills by class, objectives, time, +ratio and both damage categories; `friendly_fire`, `shoot_down_others` and +`weight` have no counter column. That is the same partition +[[mission-scoring]] measures on the settings side. + +### The career readout + +`overview_points`, `_total_play_time`, `_clear_stages`, `_retry_times`, +`_shoot_down_aircrafts`, `_shoot_down_ships`, `_shoot_down_weight` — seven, and +`OVERVIEW` adds **`overview_rank`** and **`overview_medals`**. The `EX_` twin has +the seven and neither of the two, which is what makes `EX_` the reduced variant +rather than a different screen. + +🟡 Not settled: what `EX_` means (a second profile? the online/leaderboard +variant?) — `EX_BASE`, `EX_MAIN`, `EX_STAGE_RESULT` and `EX_FONT` are keys with +**no record of that name**, so the prefix is a screen-id convention, not a table. +And `PLAYER_AMMO_LESS_10` is unexplained. + +**Reproduce:** parse `tables.pak` with `tools/re-capture/unitgroup.py` and count +the fields of the three records; take the key lists from the `sub_822814D8` / +`sub_8227A3A0` / `sub_82286BC8` sections of [`../data/name-block-bases.txt`](../data/name-block-bases.txt).