Looks like I’ve not said much about the three formats used by the game yet: ANM, RGD and STR. So I guess it’s time to rectify that.
ANM
Apparently there is only one animation format despite file magic being either 8XOV
or MIRT
. It starts with 4-byte magic, 32-bit header size (always 36 bytes), 16-bit animation name, 32-bit number of animations in the file, 32-bit number of animation blocks in each animation and 32-bit animation delay (usually 33 or 66 milliseconds).
Each animation block consists of two 32-bit integers (seem to be always 1 and 0 correspondingly), translation vector (three 32-bit floats) and rotation matrix (nine 32-bit floats).
I suppose animation sequences are supposed to be applied to the corresponding meshes in the model (each mesh has an animation ID in its header) and maybe I’ll see it eventually if I ever get to the rendering stage.
RGD
This is probably the most annoying format. It describes region data for the room in 3D format (I suppose) and packs a lot of different data that references other parts of the data.
Here’s a brief header description (all items are 32-bit integers):
- always 0?
- always 2?
- total number of regions;
- region data offset (each region includes among other things a 3-D vector index and an offset to a list of segment IDs);
- offset to a list of offsets, data those offsets has a list of vector indices;
- some ignored offset;
- offset to an array of some region positioning information
- total number of regions
- offset to a full list of region IDs
- total number of region IDs
- data start offset (seems to be always 0x5C)?
- number of segments
- offset to segment data (which includes two point indices and an offset to region ID list);
- number of points
- offset to point data (two doubles per point)
- number of vectors
- offset to vector data (three doubles per vector)
- flag signalling that the following fields are meaningful
- number of special (walkable?) regions
- connectivity matrix offset (that number of regions squared, -1 and -2 mean there’s no connection)
- another connectivity matrix (in the same format) offset
- offset to the list of special region IDs.
As you can see, indirection can get a bit deep. At least until I get my engine reimplementation to the point where I have to worry about pathfinding and hero interaction with things I don’t have to think about it (which is likely never).
STR
This is a special room format that happens only in 30 room (sub)variants. The format by itself is simple: 32-bit number of entries and pairs of 32-bit integers defining points. And as expected from the name, those are used to describe stars (i.e. shiny points in the sky of some locations).