From 168bebc700a835756416a6e8b13e327245fd2b74 Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Fri, 28 Aug 2026 03:44:14 +0000 Subject: [PATCH] re: S28 does have an asteroid definition - it borrows Stage 14's Withdrawing my own repeated claim that S28_p1 has an asteroid volume with no definition. It came from a set-difference over FILE NAMES, which cannot see reuse. Joining the fields per PHASE settles it: S28.Phase_1 MapMesh = S28_p1_AsteroidVolume_wp.col AsteroidDefinition = S14_p2_asteroid.tbl S28 scatters Stage 14 phase 2's rock list inside its own volume. Nine definition tables and nine _AsteroidVolume_wp meshes, with one table shared by two phases: S14_p2_asteroid.tbl -> S14.Phase_2 and S28.Phase_1. The earlier census's own arithmetic already contained the answer: the four values counted x12 (2 per language pack) were S01, S04, S05 - two phases of ONE stage - and S14_p2, which is two phases of TWO different stages. The count was right; reading x12 as "two phases of the same stage" was the error. test_s8p1_asteroid.tbl is not test-only either - it is what S02.Phase_1 ships with. A test_ name here is a leftover, not a dead table. The true residual is two phases and it is the opposite pairing to what I recorded: S01.Phase_3 has the volume and no definition (S01 keeps its volume across all three phases but scatters rocks only in 1-2), and S02.Phase_1 has a definition and no volume (MapMesh is the plain mapmesh_box_500km). All fifteen artefacts byte-identical. --- docs/re/BACKLOG.md | 38 +++++++++++++++++++++++++++ docs/re/INDEX.md | 2 +- docs/re/structures/asteroid-fields.md | 36 +++++++++++++++++++++++-- 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index 69439b9..5c7c4de 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -6060,3 +6060,41 @@ dictionary-attack lever remains without a corpus. 🟑 Not settled: why `S28_p1` has an asteroid volume with no definition; the two unnamed `_Test` variant objects; what `Placement_*`/`RouteTest_*` are for. + +--- + +## πŸ”΄βœ… 2026-08-28 β€” S28 does have an asteroid definition: it borrows Stage 14's + +Item (a). **Withdrawing my own repeated claim** that "`S28_p1` has an asteroid +volume with no definition". It came from a set-difference over **file names**, +which cannot see reuse. Joining the fields **per phase** settles it: + +``` +S28.Phase_1 MapMesh = S28_p1_AsteroidVolume_wp.col + AsteroidDefinition = S14_p2_asteroid.tbl +``` + +**S28 scatters Stage 14 phase 2's rock list inside its own volume.** Nine +definition tables ↔ nine `_AsteroidVolume_wp` meshes, with **one table shared by +two phases** β€” `S14_p2_asteroid.tbl` β†’ `S14.Phase_2` *and* `S28.Phase_1`. + +⚠️ **The earlier census's own arithmetic already contained the answer.** The four +values counted **Γ—12** (2 per language pack) were `S01`, `S04`, `S05` β€” two phases +of *one* stage β€” and `S14_p2`, which is two phases of **two different stages**. +Reading Γ—12 as "two phases of the same stage" was the error; the count was right +and my interpretation of it was not. + +⚠️ **`test_s8p1_asteroid.tbl` is not test-only either** β€” it is what +**`S02.Phase_1`** ships with. A `test_` name here is a leftover, not a dead table. +(That also softens the `_Test`-dangling pattern: a `test_`-named *table* can be +live even when `_Test`-named *declarations* dangle.) + +βœ… **The true residual is two phases, and it is the opposite pairing to what I +recorded**: `S01.Phase_3` has the volume and no definition (S01 keeps its volume +across all three phases but scatters rocks only in 1–2), and `S02.Phase_1` has a +definition and no volume (its `MapMesh` is the plain `mapmesh_box_500km`). + +Corrected in `asteroid-fields.md` and `INDEX.md`. + +🟑 Not settled: whether the quaternion is objectβ†’world or worldβ†’object; the two +unnamed `_Test` variant objects; what `Placement_*`/`RouteTest_*` are for. diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index b8a7143..5006510 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -119,7 +119,7 @@ files, which is how the same ground got covered twice. | [`structures/isl-message-dialogue-link.md`](structures/isl-message-dialogue-link.md) | Mission scripts as dialogue β€” built-in 64 -> message id -> caption text | βœ… CONFIRMED total, 2 683/2 683 call sites across all 28 stages resolve, no residue | | [`structures/mission-objective-counter.md`](structures/mission-objective-counter.md) | `REMAINING OB` β€” the mission's own objective counter, in RAM | βœ… CONFIRMED for one Stage 02 run: a big-endian u32 whose value | | [`structures/movie-subtitles.md`](structures/movie-subtitles.md) | Movie subtitles & the movie ↔ mission ↔ text chain | β€” | -| [`structures/asteroid-fields.md`](structures/asteroid-fields.md) | `AsteroidGroup_00N` β€” the asteroid-field tables a `Phase_N.AsteroidDefinition` names | βœ… 10 objects/pack, 384 group records, 3 fields each (`AsteroidModelName`, `AsteroidFrameName`, `EnumAsteroid` = **the frame record's `FrameCount`, 57/57**, and the frame holds **`index, quaternion(x,y,z,w), position(x,y,z)`** per asteroid β€” 37 518 items, unit norm 37 518/37 518); `Enum` counts while `Enumerate` names a table (54/60); the join resolves as `name_hash("stage\" + name)` 9/9; πŸ”‘ a tenth `Frame_Alpha_S01_*` object nothing references β€” it miscounts AND its 7 frames have no placement records; πŸ”‘ **S28_p1 has an asteroid volume but no definition** | +| [`structures/asteroid-fields.md`](structures/asteroid-fields.md) | `AsteroidGroup_00N` β€” the asteroid-field tables a `Phase_N.AsteroidDefinition` names | βœ… 10 objects/pack, 384 group records, 3 fields each (`AsteroidModelName`, `AsteroidFrameName`, `EnumAsteroid` = **the frame record's `FrameCount`, 57/57**, and the frame holds **`index, quaternion(x,y,z,w), position(x,y,z)`** per asteroid β€” 37 518 items, unit norm 37 518/37 518); `Enum` counts while `Enumerate` names a table (54/60); the join resolves as `name_hash("stage\" + name)` 9/9; πŸ”‘ a tenth `Frame_Alpha_S01_*` object nothing references β€” it miscounts AND its 7 frames have no placement records; πŸ”‘ **S28.Phase_1 borrows `S14_p2_asteroid.tbl`** β€” the per-phase join shows 9 tables ↔ 9 volumes with one table shared | | [`structures/mcol-collision.md`](structures/mcol-collision.md) | `MCOL` β€” same container and map parameters as `REGN` | 🟑 OPENED β€” `POF0` at `data_size+16` 11/11, bbox pad words 11/11, `extent == maxβˆ’min` 11/11, and bbox + cell-size distributions identical to `REGN` (2/6/3 and 2/9); everything past `0x40` ❔ | | [`structures/regn-map-grid.md`](structures/regn-map-grid.md) | `REGN` β€” a per-map spatial grid (and `MCOL` beside it) | βœ… CONFIRMED for the header, which self-checks on all 11 objects on | | [`structures/savegame-format.md`](structures/savegame-format.md) | Save file (`savedata`) β€” container βœ… exact, 3 fields named βœ…, rest ❔ (2026-08-11) | βœ… CONFIRMED for the container and the chunk layout β€” parsed off the | diff --git a/docs/re/structures/asteroid-fields.md b/docs/re/structures/asteroid-fields.md index 7f6e8b1..606d822 100644 --- a/docs/re/structures/asteroid-fields.md +++ b/docs/re/structures/asteroid-fields.md @@ -155,9 +155,41 @@ these are metres from the map origin. **There is no scale slot** β€” an asteroid size comes from its group's `AsteroidModelName`, which is why one group is one model plus one placement list. +## πŸ”΄βœ… CORRECTION β€” S28 does have a definition: it borrows Stage 14's (2026-08-28) + +Withdrawing "`S28_p1` has an asteroid volume with no definition". That came from a +set-difference over **file names**, which cannot see reuse. Joining the fields +**per phase** instead: + +| table | the phases that declare it | +|---|---| +| `S01_asteroid.tbl` | S01.Phase_1, S01.Phase_2 | +| `S04_asteroid.tbl` | S04.Phase_1, S04.Phase_2 | +| `S05_asteroid.tbl` | S05.Phase_1, S05.Phase_2 | +| `S08_p1` / `S08_p2` | S08.Phase_1 / S08.Phase_2 | +| `S13_asteroid.tbl` | S13.Phase_1 | +| `S14_p1_asteroid.tbl` | S14.Phase_1 | +| **`S14_p2_asteroid.tbl`** | **S14.Phase_2 *and* S28.Phase_1** | +| `test_s8p1_asteroid.tbl` | **S02.Phase_1** | + +**S28.Phase_1 declares `S14_p2_asteroid.tbl` while using its own +`S28_p1_AsteroidVolume_wp` mesh** β€” it scatters Stage 14's rock list inside its +own volume. Nine tables, nine volumes, one table shared by two phases. + +⚠️ The earlier census's own arithmetic contained this: the four values counted +**Γ—12** (2 per language pack) were `S01`, `S04`, `S05` β€” two phases of one stage β€” +and `S14_p2`, which is **two phases of two different stages**. Reading Γ—12 as +"two phases of the same stage" was the error. + +⚠️ **`test_s8p1_asteroid.tbl` is not test-only either** β€” it is what **S02.Phase_1** +ships with. A `test_` name here is a leftover, not a dead table. + +**The true residual is two phases, and it is the opposite pairing:** +`S01.Phase_3` has the volume and no definition (S01 keeps its volume across all +three phases but scatters rocks only in 1–2), and `S02.Phase_1` has a definition +and no volume (its `MapMesh` is the plain `mapmesh_box_500km`). + ## 🟑 Not settled -* Why `S28_p1` has an asteroid volume and no definition (S28 is the challenge - mission that alone flies `rou_f004`, see [[stage-numbering-and-player-craft]]). * Whether the quaternion is objectβ†’world or worldβ†’object, and its handedness β€” the norm test cannot tell them apart.