Correct the moby class array offset: it is per chunk type

The previous commit reported moby class IDs at u16 slots 129 through 140. That
was a pooling artifact. Repeating the scan per chunk type shows every type
places its class array at a different offset:

  aac4  129-134     82c4  104-109     4ec4  106-111
  b8c4  120-125     9943   82-87      79c4  111-115
  3245   24-29      and so on across all 26 types

Slots 129-140 were simply the type with the largest stride dominating a scan
that pooled every type together. The previous commit flagged this as
unverified; the check confirmed the flag.

What survives is stronger than what it replaced. In every one of the 26 types
the top hits form a contiguous run of consecutive u16 slots. The real
invariant is therefore per-type: each chunk type has its own class array, at
its own offset, of its own length. That fits the header-implies-one-stride
result -- each type is a distinct record layout -- but the class array is a
per-type field, not a common one at a fixed offset.

The moby reference itself is unaffected. The 38.6x excess was measured across
all records and does not depend on which slots were counted.
This commit is contained in:
2026-10-11 04:31:15 +02:00
parent ddfbc6eb33
commit b13901a7e7
+33 -3
View File
@@ -913,6 +913,36 @@ chunk is `moby_anim` -- an instance table, a model list and an animation table
would all reference class IDs. The format is still unnamed, and so is the would all reference class IDs. The format is still unnamed, and so is the
meaning of slots 129-140. meaning of slots 129-140.
**Also unverified:** whether the twelve slots are always the same fields. The **Correction to the above: the slot offsets were a pooling artifact.**
offsets are quoted from the largest records; a chunk type with a different
stride would place them elsewhere, and this scan pooled all types together. The entry above reported slots 129 through 140. Repeating the scan per chunk
type shows that is wrong: **every chunk type places its class array at a
different offset.**
| type (header prefix) | top hit slots |
|---|---|
| `aac4` | 129-134 |
| `82c4` | 104-109 |
| `4ec4` | 106-111 |
| `b8c4` | 120-125 |
| `9943` | 82-87 |
| `79c4` | 111-115 |
| `3245` | 24-29 |
Slots 129-140 were simply the type with the largest stride, dominating a scan
that pooled all types together. The previous entry flagged exactly this as
unverified, and the check confirmed the flag.
**What survives the correction.** In every one of the 26 types the top hits
form a **contiguous run of consecutive `u16` slots**. That is the real
invariant, and it is per-type: each chunk type has its own class array at its
own offset, of its own length.
So the corrected statement is: chunk records contain a contiguous array of
moby class IDs, and where that array sits depends on the chunk's type header.
This is consistent with each type being a distinct record layout, which is
what the header-implies-one-stride result already indicated -- but the class
array is a per-type field, not a common one at a fixed offset.
The moby reference itself is unaffected: 38.6x excess measured across all
records stands, since it does not depend on which slots were counted.