Maraiah/MarathonData.md

1285 lines
58 KiB
Markdown

# LICENSING ###################################################################
To the extent possible under law, I, Alison Sanderson, have waived all
copyright and related or neighboring rights to this Document as described by
the Creative Commons Zero license linked below.
<http://creativecommons.org/publicdomain/zero/1.0/>
All of the information in this Document is original research. Marathon and
Forge are owned by Bungie, Inc. QuickDraw, QuickTime and Macintosh are owned by
Apple. Aleph One (also referred to as A1 in this Document) is owned by Bungie,
Inc. et al. Igni Ferroque, Ferro, and Atque are owned by Gregory Smith
(treellama.) Maraiah is owned by Project Golan. Any other copyrights belong to
their respective owners.
# CONTENTS ####################################################################
| Title | Description |
| ----- | ----------- |
| LICENSING | The license this document is under. |
| CONTENTS | This table of contents. |
| TERMINAL CODE | Info on terminal definition files. |
| DATA FORMATS | Data formats used throughout Marathon. |
| STRUCTURES | Structure types used throughout Marathon. |
| ENUMERATIONS | Names for integers used in Marathon's structures. |
| FLAGS | Names for bit field flags used in Marathon's structures. |
You can scroll through sections of this document by searching for `/^# /`.
Specific sections can be searched by their name here.
# TERMINAL CODE ###############################################################
The terminal definition format is extremely straightforward. Terminal commands
begin lines and are in the format:
```
#COMMAND_NAME parameters
```
In Forge and Maraiah, commands need not be uppercase. Atque does require all
commands to be uppercase.
Comments also begin lines (they can't be after the beginning of one) and will
disable any text proceeding them. They are formed like:
```
; comment content here
```
Terminals are numbered, and this is used in the map to determine which terminal
to display when a computer is used.
## Blocks ##
### Terminal Blocks ###
The number for the terminal being currently defined is set with the `#TERMINAL`
and `#ENDTERMINAL` commands. These are formed as:
```
#TERMINAL number
#ENDTERMINAL number
```
For example, defining a terminal numbered "1" would be:
```
#TERMINAL 1
; terminal's contents here
#ENDTERMINAL 1
```
### Sections ###
There are four possible sections in a terminal, which are between the
`#TERMINAL` and `#ENDTERMINAL` blocks:
```
#UNFINISHED
#FINISHED
#FAILURE
#SUCCESS
```
These all mark the start of where the terminal will display, depending on the
current status of your mission.
| Name | Will display when |
| ---- | ----------------- |
| `UNFINISHED` | your objective has not been met or no other block exists |
| `FINISHED` | you have succeeded or failed |
| `FAILURE` | you have failed your objective |
| `SUCCESS` | you have succeeded in your objective |
Sections must have an end, which is defined with:
```
#END
```
Between sections may be any amount of regular commands. There are two kinds of
these normal commands: Text commands, and interactive commands.
## Text Commands ##
All text commands may have (but do not require) text following them, which may
be formatted.
Line breaks will break in-game, but unbroken lines will automatically wrap. It
is generally best to just put all of your text onto one line, even if this
destroys your sanity. Use a text editor with line wrapping for this.
Example:
```
#PICT 10007
~text interface terminal malfunction error ~2992dud
welcome to mabmap i am durandal the most pretty ai in ever i made the pfhor ded and won all the everything you should go shoot some things I put here because reasons
```
### Formatting ###
Text effects are designated by a '$' and then one of the following:
| $-code | Effect |
| ------ | ------ |
| `I/i` | enables/disables italic text |
| `B/b` | enables/disables bold text |
| `U/u` | enables/disables underlined text |
| `Cn` | changes the text color, where "n" is a number 0 through 9 |
For more information on colors, see section ENUMERATIONS, Terminal Color.
Example:
```
$C1$BoOooO$IooOOoo$i$b$C0 ... $C6did I $Uspook$u you?$C0
```
### Text Command Overview ###
Text commands include:
```
#PICT pict_id alignment
#LOGON pict_id
#LOGOFF pict_id
#INFORMATION
#CHECKPOINT goal_id
#BRIEFING level_number
```
### `#PICT` ###
```
#PICT pict_id alignment
```
`#PICT` is the most basic and most used command throughout M2 and Infinity.
It displays a picture to the specified alignment and text to the other side.
It will:
* Wait for input before proceeding.
* Display 45 characters per line, and display up to 22 lines on one page.
* Display text aligned to the left on the right side of the screen.
If alignment is specified as RIGHT, text is aligned to the right on the left of
the screen. If alignment is specified as CENTER, no text may be displayed, only
an image. If no alignment is specified, it will default to an image on the left
and text on the right.
Example:
```
#PICT 10007
~text interface terminal malfunction error ~2992dud
hellote this is example text from durnadle prettiest ai in ever thank u for reading goodbye
```
### `#LOGON`, `#LOGOFF` ###
```
#LOGON pict_id
#LOGOFF pict_id
```
`#LOGON` and `#LOGOFF` are generally used first and last in a terminal.
These two display a PICT in the middle of the screen and text below the image
if you supply it. They both do things to the screen borders.
They will:
* Automatically continue, an input will interrupt it.
* Only display one line of text, at most 72 characters.
* Display text aligned to the center in the middle of the screen.
Example:
```
#LOGON 1600
<CMND PRAMA &681g1>
; ... content ...
#LOGOFF 1600
ehhg.431.4122//<PFGR ZNE6 &49c2>
```
### `#INFORMATION` ###
```
#INFORMATION
```
`#INFORMATION` will just display text, and is mostly used in Marathon 1.
It will:
* Wait for input before proceeding.
* Display 72 characters per line, and display up to 22 lines on one page.
* Display text aligned to the left on the left side of the screen.
Example:
```
#INFORMATION
you suck at videogames love durandal
p.s. if you don't win i'm erasing your home planet from existence
```
### `#CHECKPOINT` ###
```
#CHECKPOINT goal_id
```
`#CHECKPOINT` may only be used in M1, unless you're using Aleph One 1.1+.
This shows a map centered on the specified goal point, with the goal circled,
on the left of the screen.
The map will only show polygons connected to the polygon the goal is in, so if
you have a separated area where the goal point is, it will only display that.
It will also not display secret areas and any polygons proceding them.
It will:
* Wait for input before proceeding.
* Display 45 characters per line, and display up to 22 lines on one page.
* Display text aligned to the left on the right side of the screen.
Example:
```
#CHECKPOINT 7
go shoot these things so i can claim this victory as mine forever and tell you about the things that i totally shot for approximately 200 years
```
### `#BRIEFING` ###
```
#BRIEFING level_number
```
BRIEFING may only be used in Marathon 1. It is identical to INFORMATION, but
after you're done reading, it will teleport you to the specified level.
## Interactive Commands ##
Interactive commands are all actions carried out by the game that do not all
effect the active terminal.
### Interactive Command Overview ###
Interactive commands include:
```
#INTERLEVEL TELEPORT level_number
#INTRALEVEL TELEPORT polygon_tag
#TAG tag
#SOUND sound_number
#STATIC duration
```
### `#INTERLEVEL TELEPORT` ###
```
#INTERLEVEL TELEPORT level_number
```
`#INTERLEVEL TELEPORT` exits the terminal and teleports you to the specified
level. If the level number is "256", this ends the game.
Example:
```
#INTERLEVEL TELEPORT 7
```
### `#INTRALEVEL TELEPORT` ###
```
#INTRALEVEL TELEPORT polygon_tag
```
`#INTRALEVEL TELEPORT` exits the terminal and teleports you to the centroid of
the specified polygon within the map.
Example:
```
#INTRALEVEL TELEPORT 77
```
### `#TAG` ###
```
#TAG tag
```
`#TAG` activates all lights and platforms with the specified tag.
Example:
```
#TAG 77
```
### `#SOUND` ###
```
#SOUND sound_number
```
`#SOUND` plays the specified sound from the Sounds file or from the Scenario.
Example:
```
#SOUND 77
```
### `#STATIC` ###
```
#STATIC duration
```
`#STATIC` fills the terminal with TV static for the specified duration in
1/30ths seconds. Aleph One only.
Example:
```
#STATIC 60
```
# DATA FORMATS ################################################################
## Wad ##
Wad files are used for scenario data, images, and physics files. Here is a
listing of all chunks used within them:
| Name | Description |
| ---- | ----------- |
| `PNTS` | Array of Points |
| `LINS` | Array of Lines |
| `SIDS` | Array of Sides |
| `POLY` | Array of Polygons |
| `LITE` | Array of Lights |
| `NOTE` | Not analyzed (annotations) |
| `OBJS` | Array of Objects |
| `påth` | No test data (å is $8C) (guardpaths) |
| `Minf` | Static Map Info |
| `plac` | Not analyzed (item placement) |
| `door` | No test data (extra door data) |
| `plat` | No test data (platform static data) |
| `EPNT` | Array of Endpoints |
| `medi` | Not analyzed (media) |
| `ambi` | Not analyzed (ambient sounds) |
| `bonk` | No test data (random sounds) |
| `term` | Array of Terminals |
| `iidx` | Not analyzed (map indices) |
| `ShPa` | Not analyzed (shapes) |
| `MMLS` | Not analyzed (MML scripts) |
| `LUAS` | Not analyzed (Lua scripts) |
| `FXpx` | Effect definitions |
| `MNpx` | Monster definitions |
| `PRpx` | Player definitions |
| `PXpx` | Physics definitions |
| `WPpx` | Weapon definitions |
| `PICT` | Picture Resource |
| `clut` | Unused(?) |
Map files can be identified by the Minf chunk.
Map files will always have either a PNTS or EPNT chunk, depending on what the
map (and editor) use. PNTS are plain and have no more information than the
actual position, while EPNT has flags and some extra stuff to help the engine
load quicker (not that it needs it.)
Images can be identified by the PICT chunk.
## Marathon 2 Shapes (`.shpA`) ##
The Shapes file is used for storing animation and sprite data. It uses a fixed
format for everything, with sprites sorted into collections along with frames
and sequences.
# STRUCTURES ##################################################################
All integers here are big-endian unless specified.
## Wad ##
### Wad File ###
Wad files are structured like:
* Wad Header
* Entries/Chunks
* Directory
It *must* be in this order because the engine assumes that the data directly
after the 128th byte is entry data.
### Wad Header ###
The Wad header is always at the very beginning of the file, except when it's a
MacBin file or an AppleSingle file, in which case it's at the start of the
resource fork. You'll have to account for that yourself.
The Wad Header is 128 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Wad Version | WadVer |
| u16 | Data Version | DataVer |
| u8[64] | Original filename, null byte terminated | OrigName |
| u32 | Checksum of entire file with this value as 0 | CRC |
If WadVer is greater than or equal to VerDir:
| Type | Description | Name |
| ---- | ----------- | ---- |
| u32 | Directory offset | DirOfs |
| u16 | Number of entries in this file | NumEntries |
| u16 | Bytes to skip for each directory entry | AppData |
| u16 | Size of chunks | ChunkSize |
| u16 | Size of directory entries | EntrySize |
ChunkSize and EntrySize may be zero, in which case it will default to 16 and 10
respectively. They exist for forward compatibility with Wad patching, although
are actually pointless and serve no practical purpose.
If WadVer is greater than or equal to VerOver:
| Type | Description | Name |
| ---- | ----------- | ---- |
| u32 | Checksum of the file we are modifying (if any) | ParentCRC |
### Directory Entry ###
Following this structure is AppData bytes (N), supposed to be used by editor
applications for storing arbitrary extra data, and will be ignored by the
engine.
Directory Entry is 8 bytes if WadVer is VerBase, or EntrySize+AppData bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u32 | Offset to start of data (from start of file) | Offset |
| u32 | Length of entry data | Size |
If WadVer is greater than or equal to VerDir:
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Index of entry | Index |
| u8[N] | Application specified data | AppData |
### Chunk ###
Most Wad entries are made up of tagged data formats, the engine assumes this
for every entry and so every entry has at least one chunk. These are similar to
IFF or PNG chunks.
Chunk is 12 bytes if WadVer is VerBase, or ChunkSize bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u8[4] | Chunk name (no null byte) | Ident |
| u32 | Absolute file offset of next chunk (-file header) | Offset |
| u32 | Size of chunk (not including the header) | Size |
If WadVer is greater than or equal to VerDir:
| Type | Description | Name |
| ---- | ----------- | ---- |
| u32 | TODO | PatchOffs |
## Map ##
### LtFn ###
Light function specification.
LtFn is 14 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Function index | |
| u16 | Period | |
| u16 | Delta period | |
| u16 | Intensity (high) | |
| u16 | Intensity (low) | |
| u16 | Delta intensity (high) | |
| u16 | Delta intensity (low) | |
### SideTex ###
Just stores a texture and an offset.
SideTex is 6 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| i16 | X offset | OffsX |
| i16 | Y offset | OffsY |
| u16 | Texture ID (shape descriptor) | TextureId |
### Point ###
A geometric point.
Point is 4 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| i16 | X position | X |
| i16 | Y position | Y |
### Endpoint ###
More advanced point structure.
Endpoint is 16 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Endpoint Flags | Flags |
| i16 | Highest adjacent floor height | HeightHi |
| i16 | Lowest adjacent ceiling height | HeightLo |
| Point | Position | Pos |
| 4 bytes | Unused | |
| u16 | Index of the highest adjacent polygon | Support |
### Line ###
A geometric line segment.
Line is 32 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Beginning endpoint | Start |
| u16 | Terminating endpoint | End |
| u16 | Line flags | Flags |
| i16 | Length | Length |
| i16 | Highest adjacent floor height | HeightHi |
| i16 | Highest adjacent ceiling height | HeightLo |
| u16 | Index of side in front | SideFront |
| u16 | Index of side in back | SideBack |
| u16 | Index of polygon in front | PolyFront |
| u16 | Index of polygon in back | PolyBack |
### Side ###
One side of a line segment.
Side is 64 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Side Type | Type |
| u16 | Side Flags | Flags |
| SideTex | First texture | TexPri |
| SideTex | Second texture | TexSec |
| SideTex | Transparent texture, drawn over whole side | TexTra |
| Point | Collision top-left | ExTLeft |
| Point | Collision top-right | ExTRight |
| Point | Collision bottom-left | ExBLeft |
| Point | Collision bottom-right | ExBRight |
| u16 | Control panel preset number | PanelType |
| i16 | Control panel permutation | PanelPerm |
| u16 | First texture transfer mode | XferPri |
| u16 | Second texture transfer mode | XferSec |
| u16 | Transparent texture transfer mode | XferTra |
| 15_16s | Ambient shading for visual contrast | Shade |
### Polygon ###
A geometric polygon, essentially Doom's "sector," but must be convex.
Polygon is 128 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Polygon type | |
| u16 | Polygon flags | |
| i16 | Permutation (see polygon types) | |
| u16 | Vertex count | |
| u16[8] | Endpoint indices (clockwise) | |
| u16[8] | Line indices | |
| u16 | Floor texture (shape descriptor) | |
| u16 | Ceiling texture (shape descriptor) | |
| i16 | Floor height | |
| i16 | Ceiling height | |
| u16 | Floor lightsource index | |
| u16 | Ceiling lightsource index | |
| i32 | Area (exponent of 2) | |
| u16 | First object in polygon | |
| u16 | First exclusion zone | |
| u16 | Number of line exclusion zones | |
| u16 | Number of point exclusion zones | |
| u16 | Floor transfer mode | |
| u16 | Ceiling transfer mode | |
| u16[8] | Adjacent polygon indices | |
| u16 | Index of first neighboring polygon | |
| u16 | Number of neighboring polygons | |
| i16 | Center X | |
| i16 | Center Y | |
| u16[8] | Side indices | |
| i16 | Floor origin X | |
| i16 | Floor origin Y | |
| i16 | Ceiling origin X | |
| i16 | Ceiling origin Y | |
| u16 | Media index | |
| u16 | Media lightsource index | |
| u16 | Sound for polygon | |
| u16 | Ambient sound for polygon | |
| u16 | Random sound for polygon | |
### Light ###
Light is 77 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Light type | |
| u16 | Light flags | |
| i16 | Initial phase | |
| LtFn[6] | Primary/secondary/becoming active, and inactive | |
| u16 | Tag | |
### Object ###
Object is 16 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Saved object group | |
| u16 | Saved object index | |
| u16 | Facing angle | |
| u16 | Polygon index | |
| i16 | X | |
| i16 | Y | |
| i16 | Z | |
| u16 | Map object flags | |
### Static Map Info ###
Static Map Info is 88 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Environment Code | EnvCode |
| u16 | Physics model | PhysicsId |
| u16 | Music number | MusicId |
| u16 | Mission Flags | MissionFlags |
| u16 | Environment Flags | EnvFlags |
| 8 bytes | Unused | |
| u8[66] | Level name | Name |
| u32 | Entry point flags | EntryFlags |
The level name was intended to be 65 bytes, but one padding byte was left over,
so the real length is 66 bytes. It is unknown why the entry point flags are
stored in a 32-bit integer when they can fit in 8 bits.
## Terminal ##
### Terminal ###
Terminal text can be encoded with some weird xor bullshit for some reason.
You can decode it and encode it with the same method:
```c
for(i = 0; i < len / 4; i++) {p += 2; *p++ ^= 0xFE; *p++ ^= 0xED;}
for(i = 0; i < len % 4; i++) *p++ ^= 0xFE;
```
* Terminal Header
* Terminal Groups
* Text Faces
* Terminal text (null byte terminated)
### Terminal Header ###
Terminal Header is 10 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Total length of terminal (including header) | Size |
| u16 | Terminal flags | Flags |
| u16 | Lines per page (almost always 22) | PageLines |
| u16 | Number of terminal groups | NumGroups |
| u16 | Number of text faces | NumFaces |
### Terminal Group ###
Terminal Group is 12 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | TODO | |
| u16 | Terminal group type | |
| i16 | Permutation | |
| u16 | Index into text for the start of this group | |
| u16 | Length of this group's text | |
| u16 | TODO | |
### Text Face ###
Text Face is 6 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Index into the text for the start of this face | |
| u16 | TODO | |
| u16 | Terminal color | |
## Images ##
### Picture Resource ###
Pictures are formed with a header and then a variable number of operations. In
other words, a small state machine is used to form an image through effects and
various fill instructions. QuickDraw is horrifying. This is the native image
format. It's a fucking metafile.
* Picture Header
* Picture Opcodes
### Picture Header ###
All QuickDraw PICTs begin with a basic 10 byte header as follows.
| Type | Ignored | Description | Name |
| ---- | :-----: | ----------- | ---- |
| u16 | Yes | Size | Size |
| u16 | Yes | Y start | Top |
| u16 | Yes | X start | Left |
| u16 | No | Height | Height |
| u16 | No | Width | Width |
### CopyBits ###
If direct copy:
| Type | Description | Name |
| ---- | ----------- | ---- |
| u32 | Relative base address (ignored) | BaseAddr |
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Row bytes (upper 2 bits are CopyBits Flags) | Pitch |
| u16 | Y start | Top |
| u16 | X start | Left |
| u16 | Y end | Bottom |
| u16 | X end | Right |
If PICT2:
* PixMap
Else:
* assume pack type is default and bit depth is 1
If packed pixmap:
| Type | Description | Name |
| ---- | ----------- | ---- |
| u32 | Identifier of color table (ignored in A1) | ClutId |
| u16 | Color table flags | ClutFlags |
| u16 | Number of color table entries (N) | ClutNum |
| Clut[N] | Color lookup table | Clut |
The following are ignored in Aleph One:
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Source y start | SrcTop |
| u16 | Source x start | SrcLeft |
| u16 | Source y end | SrcBottom |
| u16 | Source x end | SrcRight |
| u16 | Destination y start | DstTop |
| u16 | Destination x start | DstLeft |
| u16 | Destination y end | DstBottom |
| u16 | Destination x end | DstRight |
| u16 | Transfer mode | XferMode |
If clip:
* Clip Region (skipped the same way as opcode $0001 in A1)
Image data follows.
### PixMap ###
PixMap is 36 bytes.
| Type | Ignored | Description | Name |
| ---- | :-----: | ----------- | ---- |
| u16 | Yes | Version (unused) | Version |
| u16 | No | Packing type | PackType |
| u32 | Yes | Packed size | PackSize |
| u32 | Yes | Horizontal DPI | HorzDPI |
| u32 | Yes | Vertical DPI | VertDPI |
| u16 | Yes | Pixel type | Format |
| u16 | No | Pixel bit depth | BitDepth |
| u16 | Yes | Number of components | Components |
| u16 | Yes | Component depth | CompDepth |
| u32 | Yes | Plane offset | PlaneOffs |
| u32 | Yes | Color table id | ClutId |
### Clut ###
Clut is 8 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| i16 | Index (if device mapping, used as value) | Index |
| u16 | Red magnitude | R |
| u16 | Green magnitude | G |
| u16 | Blue magnitude | B |
### Header Op ###
Header Op is 24 bytes.
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Header version | Version |
| 2 bytes | Unused | |
| u32 | Horizontal resolution | Width |
| u32 | Vertical resolution | Height |
| u16 | Y start | Top |
| u16 | X start | Left |
| u16 | Y end | Bottom |
| u16 | X end | Right |
### QuickTime Image ###
TODO
* 68 bytes
if matte:
* U32: matte ID size
* matte id size - 4 bytes
* U32: id size
* char[4]: codec type
* 36 bytes
* U32: data size
* 38 bytes
* image data follows
* some other bullshit
## Shapes ##
### Collection Header ###
32 bytes
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Status (TODO: unknown purpose) | Status |
| u16 | Flags (TODO: unknown purpose) | Flags |
| u32 | Offset for lo-res collection | OffsetLo |
| u32 | Length for lo-res collection | LengthLo |
| u32 | Offset for hi-res collection | OffsetHi |
| u32 | Length for hi-res collection | LengthHi |
### Collection Definition ###
544 bytes (no, I'm not kidding)
| Type | Description | Name |
| ---- | ----------- | ---- |
| u16 | Version, not checked by engine (current is 3) | Version |
| u16 | Collection Type | Type |
| 2 bytes | Unused | |
# ENUMERATIONS ################################################################
Here is a list of names and descriptions for enumerations used throughout this
document. The names may not match those used in the original engine and are
re-named for clarity of purpose.
### Picture Opcode ###
Operations used in QuickDraw images. Aleph One ignores most of these, so it's
only necessary to document what's ignored and how to process CopyBits. (If
you're interested in the QuickDraw format, Apple has legacy documents still
available on the Internet.)
Opcodes `$0100` through `$7FFF` are skipped by seeking forward by the most
significant byte's value times two.
Opcodes `$8000` through `$8100` are reserved and therefore ignored.
Any unspecified opcodes are not worth skipping, and the state machine should
exit upon reading them.
| Value | Ignored | Extra data | Name |
| ----- | :-----: | ---------- | ---- |
| `$0000` | No | None | No-op |
| `$0001` | Yes | u16 size, (size&~1)-2 bytes | Clip |
| `$0002` | Yes | 8B | BkPat |
| `$0003` | Yes | 2B | TxFont |
| `$0004` | Yes | 2B | TxFace |
| `$0005` | Yes | 2B | TxMode |
| `$0006` | Yes | 4B | SpExtra |
| `$0007` | Yes | 4B | PnSize |
| `$0008` | Yes | 2B | PnMode |
| `$0009` | Yes | 8B | PnPat |
| `$000A` | Yes | 8B | FillPat |
| `$000B` | Yes | 4B | OvSize |
| `$000C` | Yes | 4B | Origin |
| `$000D` | Yes | 2B | TxSize |
| `$000E` | Yes | 4B | FgColor |
| `$000F` | Yes | 4B | BgColor |
| `$0010` | Yes | 8B | TxRatio |
| `$0011` | Yes | 2B | VersionOp |
| `$0015` | Yes | 2B | PnLocHFrac |
| `$0016` | Yes | 2B | ChExtra |
| `$001A` | Yes | 6B | RGBFgCol |
| `$001B` | Yes | 6B | RGBBkCol |
| `$001C` | Yes | None | HiliteMode |
| `$001D` | Yes | 6B | HiliteColor |
| `$001E` | Yes | None | DefHilite |
| `$001F` | Yes | 6B | OpColor |
| `$0020` | Yes | 8B | Line |
| `$0021` | Yes | 4B | LineFrom |
| `$0022` | Yes | 6B | ShortLine |
| `$0023` | Yes | 2B | ShortLineFrom |
| `$002D` | Yes | 10B | LineJustify |
| `$002E` | Yes | 8B | GlyphState |
| `$0030` | Yes | 8B | FrameRect |
| `$0031` | Yes | 8B | PaintRect |
| `$0032` | Yes | 8B | EraseRect |
| `$0033` | Yes | 8B | InvertRect |
| `$0034` | Yes | 8B | FillRect |
| `$0038` | Yes | None | FrameSameRect |
| `$0039` | Yes | None | PaintSameRect |
| `$003A` | Yes | None | EraseSameRect |
| `$003B` | Yes | None | InvertSameRect |
| `$003C` | Yes | None | FillSameRect |
| `$0098` | No | CopyBits | PackBitsRect |
| `$0099` | No | CopyBits | PackBitsRgn |
| `$009A` | No | 4B, CopyBits | DirectBitsRect |
| `$009B` | No | 4B, CopyBits | DirectBitsRgn |
| `$00A0` | Yes | 2B | ShortComment |
| `$00A1` | Yes | 2B, u16 size, (size&~1) bytes | LongComment |
| `$00FF` | No | 2B | OpEndPic |
| `$02FF` | Yes | 2B | Version |
| `$0C00` | Yes | Header Op | HeaderOp |
| `$8200` | No | QuickTime Image | CompressedQuickTime |
### CopyBits Pixel Depth ###
| Value | Description | Name |
| ----- | ----------- | ---- |
| `1` | Color mapped bit | Pal1 |
| `2` | Color mapped dibit | Pal2 |
| `4` | Color mapped nibble | Pal4 |
| `8` | Color mapped byte | Pal8 |
| `16` | X1RGB5 | X1RGB5 |
| `32` | RGB8 (if NoPad) or XRGB8 | RGB8 |
### Pack Type ###
| Value | Description | Name |
| ----- | ----------- | ---- |
| `0` | Always pack | Default |
| `1` | Never pack | None |
| `2` | Never pack, no padding channel in 32bpp mode | NoPad |
| `3` | Only pack in 16bpp mode | RLE16 |
| `4` | Only pack in 32bpp mode, no padding channel | RLE32 |
### Polygon Type ###
| Value | Description | Permutation | Name |
| ----- | ----------- | ----------- | ---- |
| `0` | Normal, no effects | None | Normal |
| `1` | Items may not pass | None | ImpassItem |
| `2` | Monsters may not pass | None | ImpassMons |
| `3` | Hill (for King of the Hill) | None | Hill |
| `4` | Base (for Capture The Flag et al) | Team | Base |
| `5` | Platform | Plat index | Platform |
| `6` | Triggers light on | Light index | TrigLightOn |
| `7` | Triggers platform on | Plat index | TrigPlatOn |
| `8` | Triggers light off | Poly index | TrigLightOff |
| `9` | Triggers platform off | Poly index | TrigPlatOff |
| `10` | Teleports to polygon centroid | Poly index | Teleporter |
| `11` | Zone border | None | ZoneBorder |
| `12` | Goal point | None | Goal |
| `13` | Triggers near-by visible monsters | None | TrigMonsVis |
| `14` | Triggers near-by invisible monsters | None | TrigMonsInv |
| `15` | Same as TrigMonsInv | None | TrigMonsDual |
| `16` | Triggers near-by invisible items | None | TrigItems |
| `17` | Must be entered for Exploration | None | MustExplore |
| `18` | Teleports to next level if success | None | AutoExit |
### Control Panel Type ###
This is used internally for each control panel preset and determines the
permutation each one uses.
| Value | Description | Permutation | Name |
| ----- | ----------- | ----------- | ---- |
| `0` | Oxygen refuel | None | Oxygen |
| `1` | Health charger | None | Shield |
| `2` | Health charger (2x) | None | Shield2x |
| `3` | Health charger (3x) | None | Shield3x |
| `4` | Light switch | Light index | Light |
| `5` | Platform switch | Plat index | Platform |
| `6` | Tag switch | Tag or -1 | Tag |
| `7` | Save station | None | PatternBuf |
| `8` | Computer terminal | None | Terminal |
### Side Type ###
| Value | Description | Name |
| ----- | ----------- | ---- |
| `0` | First texture is mapped over the whole side | Full |
| `1` | First texture is mapped on the ceiling panel | High |
| `2` | First texture is mapped on the floor panel | Low |
| `3` | Composite texture (Not implemented) | Composite |
| `4` | First texture for ceiling panel, second for floor | Split |
"Panel" here refers to a pertrusion inbetween two polygons. These would be
mapped to upper/lower textures in Doom for instance. Even the source code for
Marathon 2 itself acknowledges how redundant this enumeration is.
### Saved Object Group ###
| Value | Description | Name |
| ----- | ----------- | ---- |
| `0` | Monster | |
| `1` | Object | |
| `2` | Item | |
| `3` | Player | |
| `4` | Goal | |
| `5` | Sound source (facing is sound volume) | |
### Transfer Mode ###
| Value | Description | Name |
| ----- | ----------- | ---- |
| `0` | Normal | |
| `1` | Fade to black | |
| `2` | Invisibility | |
| `3` | Invisibility (subtle) | |
| `4` | Pulsate (polygons only) | |
| `5` | Wobble (polygons only) | |
| `6` | Wobble (fast, polygons only) | |
| `7` | Static | |
| `8` | 50% static | |
| `9` | Sky | |
| `10` | Smear | |
| `11` | Static (fade out) | |
| `12` | Static (pulsating) | |
| `13` | Fold-in | |
| `14` | Fold-out | |
| `15` | Horizontal slide | |
| `16` | Horizontal slide (fast) | |
| `17` | Vertical slide | |
| `18` | Vertical slide (fast) | |
| `19` | Wander | |
| `20` | Wander (fast) | |
| `21` | Big sky | |
### Light Type ###
| Value | Description | Name |
| ----- | ----------- | ---- |
| `0` | Normal light | |
| `1` | Strobe light | |
| `2` | Media light | |
### Wad Version ###
Used to determine how the engine loads the Wad file.
| Value | Description | Name |
| ----- | ----------- | ---- |
| `0` | Marathon 1 data (no directory entry) | VerBase |
| `1` | Marathon 1 data (has directory entry) | VerDir |
| `2` | Marathon 2 data (supports overlays) | VerOver |
| `4` | Marathon Infinity data | VerMI |
### Data Version ###
Used to determine how the engine loads map data.
| Value | Description | Name |
| ----- | ----------- | ---- |
| `0` | Marathon 1 data | DataM1 |
| `1` | Marathon 2 data | DataM2 |
### Terminal Group Type ###
| Value | Description | Permutation | Name |
| ----- | ----------- | ----------- | ---- |
| `0` | Logon | None | Logon |
| `1` | Unfinished (conditions incomplete) | None | Unfinished |
| `2` | Success (success condition) | None | Success |
| `3` | Failure (failure condition) | None | Failure |
| `4` | Information (no image attached) | None | Info |
| `5` | End terminal | None | End |
| `6` | Changes level | Level id | TeleInter |
| `7` | Teleports to polygon | Polygon id | TeleIntra |
| `8` | Shows goal point | Goal id | Checkpoint |
| `9` | Plays a sound | Sound id | Sound |
| `10` | Movie (not implemented) | Movie id | Movie |
| `11` | Music (not implemented) | Track id | Track |
| `12` | Show image | Pict id | Pict |
| `13` | Logoff | None | Logoff |
| `14` | Camera (not implemented) | Object id | Camera |
| `15` | Static (TV static effect) | 1/30 secs | Static |
| `16` | Activate tag | Tag number | Tag |
### Terminal Color ###
These are the default colors. These can be overridden with mods.
| Value | Description | Name |
| ----- | ----------- | ---- |
| `0` | Light Green | Color0 |
| `1` | White | Color1 |
| `2` | Red | Color2 |
| `3` | Dark Green | Color3 |
| `4` | Light Blue | Color4 |
| `5` | Yellow | Color5 |
| `6` | Dark Red | Color6 |
| `7` | Dark Blue | Color7 |
| `8` | No color | Color8 |
| `9` | No color | Color9 |
# FLAGS #######################################################################
### Endpoint Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `0` | Point belongs to any solid line | Solid |
| `1` | All polys with this point have the same height | SameHeight |
| `2` | Point does not belong to an opaque line | Transparent |
Note that the SameHeight flag is set relative to the endpoint's lines.
### Line Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `9` | Line has a transparent side | TransSide |
| `10` | Polygons on either side do not have same heights | ElevVar |
| `11` | Differing height between this line's polygons | Elevation |
| `12` | Line shows only sky | Landscape |
| `13` | Both sides are see-through | Transparent |
| `14` | Can't be walked through | Solid |
### Side Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `0` | Button is switched | Status |
| `1` | Control panel | Panel |
| `2` | Must be switched for Repair | Repair |
| `3` | Switch uses an item (for scripts) | ItemUse |
| `4` | Switch must be 3/4ths or more lit up to use | Lighted |
| `5` | Projectiles toggle and disable this switch | CanDestroy |
| `6` | Switch can only be hit by projectiles | HitOnly |
| `7` | Switch item is optional (for scripts) | ItemOpt |
### Polygon Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `14` | TODO | Detached |
### Map Object Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `0` | Initially invisible (warp-in) | Invisible |
| `1` | Reversed Z coordinate (from ceiling) | Ceiling |
| `2` | Can not be activated by sight | Blind |
| `3` | Can not be activated by sounds | Deaf |
| `4` | TODO | Floating |
| `5` | Net-game only, only works on items | NetOnly |
### Mission Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `0` | Kill a certain percentage of monsters | Extermination |
| `1` | Must explore marked polygons | Exploration |
| `2` | Must grab marked items | Retrieval |
| `3` | Must flip marked switches | Repair |
| `4` | Must keep certain percent of BoBs alive | Rescue |
### Environment Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `0` | Makes most weapons not work and oxygen depletes | Vacuum |
| `1` | Motion sensor is fucked | Magnetic |
| `2` | Friendly S'pht, strips items and health | Rebellion |
| `3` | Low gravity | LowGrav |
| `4` | Handles glue like Marathon 1 | M1Glue |
| `5` | The floor damages you | LavaFloor |
| `6` | Friendly S'pht | Rebellion2 |
| `7` | Level has music | Music |
| `8` | Terminals stop time (Solo only) | TermPause |
| `9` | M1 monster activation limits | M1Monster |
| `10` | Weapon pickups on TC, lo-G grenades | M1Weps |
| `13` | Net-play map | NetPlay |
| `14` | Solo map | Solo |
### Light Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `0` | TODO | |
| `1` | TODO | Stateless |
### Entry Point Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `0` | Solo | Solo |
| `1` | Co-op | CoOp |
| `2` | Carnage | Carnage |
| `3` | Kill The Man With The Ball | KTMWTB |
| `4` | King of the Hill | KOTH |
| `5` | Defense | Defense |
| `6` | Rugby | Rugby |
| `7` | Capture The Flag | CTF |
### Terminal Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `0` | Text is encoded | Encoded |
### CopyBits Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `14` | Unused | |
| `15` | Is PICT2 | PICT2 |
### Color Table Flags ###
| Bit | Description | Name |
| --- | ----------- | ---- |
| `15` | Use automatic device mapping for indices | DeviceMap |
<!-- EOF -->