Type |
Name |
Notes |
u16 |
view header size |
skip ahead this far to get to loop 1 |
u8 |
# of loops |
|
u8 |
view flags |
bit 6 set if it's uncompressed |
u8 |
high split flag |
unused |
u8 |
(dummy) |
|
u16 |
# of cels |
|
u32 |
palette offset |
null if none |
u8 |
loop header size |
|
u8 |
cel header size |
|
u32 |
animation offset |
unused |
Loops follow directly after, in order.
Type |
Name |
Notes |
u8 |
alternate loop |
for mirroring |
u8 |
flags |
for mirroring |
u8 |
# of cels |
|
u8 |
(dummy) |
|
u8 |
starting cel |
unused |
u8 |
ending cel |
unused |
u8 |
repeat count |
unused |
u8 |
step size |
unused |
u32 |
palette offset |
unused |
u32 |
offsets to cels for this loop |
|
Type |
Name |
Notes |
u16 |
width |
|
u16 |
height |
|
s16 |
X offset |
|
s16 |
Y offset |
|
u8 |
skip color |
transparent |
u8 |
compression |
|
u16 |
compression remap count |
unused |
u32 |
compressed size |
only used in SEQ |
u32 |
control size |
only used in SEQ |
u32 |
palette offset |
unused |
u32 |
data offset |
|
u32 |
color offset |
|
u32 |
compression remap offset |
unused |
Type |
Name |
Notes |
u16 |
header size |
|
u8 |
# of priorities |
unused |
u8 |
# of priority lines |
should be 16 |
u8 |
# of cels |
but really bool hasCel |
u8 |
(dummy) |
|
u16 |
vanishing point X |
unused |
u16 |
vanishing point Y |
unused |
u16 |
viewing angle |
unused |
u32 |
vector data size |
unused |
u32 |
vector data offset |
|
u32 |
priority cel offset |
unused in SCI11 |
u32 |
control cel offset |
unused in SCI11 |
u32 |
palette offset |
|
u32 |
visual header offset |
|
u32 |
polygon offset |
|
u16 |
priority lines |
|
Type |
Name |
Notes |
u16 |
lowest char |
|
u16 |
highest char |
|
u16 |
point size |
|
u16... |
character cells |
|
"Lowest char" is not the index of the first character in the font. It's the lowest character index, inclusive, that the interpreter will agree to draw. It is practically always 0.
Type |
Name |
Notes |
u8 |
width |
|
u8 |
height |
|
1bpp pixel data follows directly after.
Type |
Name |
Notes |
u16 |
version number |
|
u16 |
padding |
|
What follows depends on the version number. Next is as the actual message text.
Type |
Name |
Notes |
u16 |
number of messages |
|
Then for each message:
Type |
Name |
Notes |
u8 |
noun |
|
u8 |
verb |
|
u16 |
text pointer |
|
Type |
Name |
Notes |
u16 |
padding |
|
u16 |
number of messages |
|
Then for each message:
Type |
Name |
Notes |
u8 |
noun |
|
u8 |
verb |
|
u8 |
condition |
|
u8 |
sequence |
|
u8 |
talker |
|
u16 |
text pointer |
|
u8*3 |
padding |
|
Type |
Name |
Notes |
u16 |
pointer to end |
Used for comments by ME . |
u16 |
unused |
Used for bookkeeping by ME ? |
u16 |
number of messages |
|
Then for each message:
Type |
Name |
Notes |
u8 |
noun |
|
u8 |
verb |
|
u8 |
condition |
|
u8 |
sequence |
|
u8 |
talker |
|
u16 |
text pointer |
|
u8 |
reference noun |
|
u8 |
reference verb |
|
u8 |
reference condition |
|
u8 |
reference sequence |
|
If the reference fields are set, the text pointer is ignored and the target message's text is returned instead. This also works on audio.