Maraiah/MarathonData.md

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