re: the 8 values per asteroid are index, quaternion, position
Measured over every Frame_*Asteroid* record on the disc - 384 records, 37518
items (6253 per language pack x 6; the remaining 380 per pack belong to the
seven record-less Alpha frames, the same 57-vs-64 split as before).
slot 0 equals the running index 0..N-1 37518 / 37518, max 587, and the
largest FrameCount is 588, so the last index is N-1
slots 1-4 a unit quaternion 37518 / 37518 within 1e-4 of 1.0
(min 0.999999, max 1.000001)
slot 4 sign of the real part min +0.001, never negative -
canonical w-last, so the order is (x, y, z, w)
slots 5-7 position in metres -163858..+79572, -114308..+76422,
-105224..+110263 - inside the +/-250 km half-extent of
mapmesh_box_500km
len(anonymous fields) == 8 * FrameCount on 384 of 384, zero mismatches.
The unit-norm test is the control: an arbitrary 4-tuple has no reason to sit on
the unit sphere and every one of the 37518 does. Two further cross-checks fell
out - the maximum index is exactly max(FrameCount) - 1, and every position lies
inside the 500 km box the corpus already knows (world unit = 1 metre).
There is no scale slot: an asteroid's size comes from its group's
AsteroidModelName, which is why a group is one model plus one placement list.
Not settled: whether the quaternion is object->world or world->object and its
handedness - a norm test cannot separate those; and why S28_p1 has an asteroid
volume with no definition.
All fifteen artefacts byte-identical.
This commit is contained in:
@@ -5793,3 +5793,35 @@ a discrepancy, **read how the corpus routine calls it** — the prefix list was
|
||||
🟡 Not settled: what the 8 values per asteroid are (position/rotation/scale is the
|
||||
obvious reading, untested — [[regn-map-grid]] has the neighbouring work); why
|
||||
`S28_p1` has an asteroid volume and no definition.
|
||||
|
||||
---
|
||||
|
||||
## ✅ 2026-08-28 — the 8 values per asteroid: index, quaternion, position
|
||||
|
||||
Item (a). Measured over every `Frame_*Asteroid*` record on the disc — **384
|
||||
records, 37 518 items** (6 253 per language pack × 6; the remaining 380 per pack
|
||||
belong to the seven record-less `Alpha` frames, which is the same 57-vs-64 split
|
||||
as before).
|
||||
|
||||
| slot | test | result |
|
||||
|---|---|---|
|
||||
| 0 | equals the running index `0…N−1` | **37 518 / 37 518**, max **587** — and the largest `FrameCount` is **588**, so the last index is `N−1` |
|
||||
| 1–4 | a **unit quaternion**? | **37 518 / 37 518 within 1e-4 of 1.0** (min 0.999999, max 1.000001) |
|
||||
| 4 | sign of the real part | min **+0.001**, never negative — canonical w-last, so `(x, y, z, w)` |
|
||||
| 5–7 | position in metres | −163 858…+79 572, −114 308…+76 422, −105 224…+110 263 — inside the ±250 km half-extent of `mapmesh_box_500km` |
|
||||
|
||||
`len(anonymous fields) == 8 × FrameCount` on **384 of 384**, zero mismatches.
|
||||
|
||||
**The unit-norm test is the control**: an arbitrary 4-tuple has no reason to sit
|
||||
on the unit sphere, and every one of the 37 518 does. Two further independent
|
||||
cross-checks fell out — the maximum index (587) is exactly `max(FrameCount) − 1`,
|
||||
and every position lies inside the 500 km box the corpus already knows
|
||||
([[regn-map-grid]], world unit = 1 metre).
|
||||
|
||||
🔑 **There is no scale slot.** An asteroid's size comes from its group's
|
||||
`AsteroidModelName` — which is why a group is *one model plus one placement
|
||||
list*, and why the group table needed both fields.
|
||||
|
||||
🟡 Not settled: whether the quaternion is object→world or world→object, and its
|
||||
handedness — a norm test cannot separate those. And still: why `S28_p1` has an
|
||||
asteroid volume with no definition.
|
||||
|
||||
@@ -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 8 anonymous values per asteroid); `Enum<Thing>` counts while `Enumerate<Thing>` 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<Thing>` counts while `Enumerate<Thing>` 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/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 |
|
||||
|
||||
@@ -112,9 +112,37 @@ works here. (`Stage\` scores identically — the hash lower-cases.)
|
||||
**Two independent joins, 9/9 agreement**, and both leave the same tenth object
|
||||
unreferenced.
|
||||
|
||||
## ✅ The 8 values are `index, quaternion(x,y,z,w), position(x,y,z)` (2026-08-28)
|
||||
|
||||
Measured over every `Frame_*Asteroid*` record on the disc — **384 records,
|
||||
37 518 items** (6 253 per language pack × 6; the other 380 per pack belong to the
|
||||
seven record-less `Alpha` frames). One raw item, for shape:
|
||||
|
||||
```
|
||||
0 0.268744 0.505919 0.579670 0.579487 15667.14 -7199.61 -58794.88
|
||||
1 -0.053496 -0.540765 -0.260996 0.797868 -43571.37 -60583.68 -3417.80
|
||||
2 -0.696396 0.682371 …
|
||||
```
|
||||
|
||||
| slot | test | result |
|
||||
|---|---|---|
|
||||
| 0 | equals the running index `0…N−1` | **37 518 / 37 518**, max **587** — and the largest `EnumAsteroid`/`FrameCount` is **588**, so the last index is `N−1` |
|
||||
| 1–4 | is it a **unit quaternion**? `\|q\|` | **37 518 / 37 518 within 1e-4 of 1.0** (min 0.999999, max 1.000001) |
|
||||
| 4 | sign of the real part | min **+0.001**, never negative — the canonical **w-last** form, so the order is `(x, y, z, w)` |
|
||||
| 5–7 | position, metres | ranges **−163 858…+79 572**, **−114 308…+76 422**, **−105 224…+110 263** — inside the ±250 km half-extent of `mapmesh_box_500km` |
|
||||
|
||||
And `len(anonymous fields) == 8 × FrameCount` on **384 of 384** records, zero
|
||||
mismatches.
|
||||
|
||||
The unit-norm test is the control: an arbitrary 4-tuple has no reason to sit on
|
||||
the unit sphere, and **every one of the 37 518 does**. World unit = 1 metre, so
|
||||
these are metres from the map origin. **There is no scale slot** — an asteroid's
|
||||
size comes from its group's `AsteroidModelName`, which is why one group is one
|
||||
model plus one placement list.
|
||||
|
||||
## 🟡 Not settled
|
||||
|
||||
* What the 8 values per asteroid are — position/rotation/scale is the obvious
|
||||
reading, untested here; [[regn-map-grid]] has the neighbouring work.
|
||||
* 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.
|
||||
|
||||
Reference in New Issue
Block a user