58 KiB
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:
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 |