Sophie

Sophie

distrib > Mandriva > 2008.1 > i586 > by-pkgid > a65770d5990b4710c744cb2ea963eba3 > files > 7

AlephOne-0.20.2-0.20080913.1mdv2008.1.i586.rpm

<html>
<head>
<title>The Marathon Markup Language</title>
</head>
<body bgcolor="#ffffff">

<h3>Introduction</h3>

The Marathon Markup Language (MML), a subset of the Extensible Markup Language (XML):
This was created for the purpose of configuring the Marathon engine in a non-hardcoded way.
MML scripts are stored in the "Scripts" subdirectory of the local data directory, and the "MML" subdirectory of the global data directories and accessed in alphabetical order
(scripts in the local directory are read after the global ones so they can
override their settings).
<p>

For more on XML, check out these links:
<ul>
<li><a href="http://www.xml.com">xml.com; has lots of XML-related stuff</a>
<li><a href="http://www.trafficstudio.com/sixpack">Sixpack, a MacOS-native XML editor</a>
</ul>

One feature that I've attempted to maintain is that any set of values
can always be overrode by another.
For example, if you set some color to be red in one file,
and that color to be green in a file processed after it,
that color will be green.
<p>

Many of the element attributes here are some sort of index value,
and they are all counted from 0 unless specified otherwise;
for example, collections are numbered from 0 to 31.
But one problem that I currently face is that
the lists in this document are shown as starting from 1 instead of 0.
I'm not sure how to correct that without numbering the items by hand;
this document contains the kludge of adding 1000.
<p>


Here is the format:
<p>

<h3><a name="marathon">Marathon Root Element: &lt;marathon&gt;</a></h3>

This is the root element, the one that contains all the others.
Other Marathon-related root elements may be defined in the future, however,
such as root elements for stuff that is intended for individual map levels.
These may have a format like &lt;maralevel index="value"&gt;.
<p>

This element has no attributes and contains these child elements:

<ul>
<li><a href="#stringset">String-Set Element: &lt;stringset&gt;</a>
<li><a href="#interface">Interface-Stuff Element: &lt;interface&gt;</a>
<li><a href="#motsens">Motion-Sensor Element: &lt;motion_sensor&gt;</a>
<li><a href="#ovhdmap">Overhead-Map Element: &lt;overhead_map&gt;</a>
<li><a href="#infravision">Infravision Element: &lt;infravision&gt;</a>
<li><a href="#motsens">Motion-Sensor Element: &lt;motion_sensor&gt;</a>
<li><a href="#animtxtrs">Animated-Textures Element: &lt;animated_textures&gt;</a>
<li><a href="#controlpanels">Control-Panels Element: &lt;control_panels&gt;</a>
<li><a href="#platforms">Platforms Element: &lt;platforms&gt;</a>
<li><a href="#liquids">Liquids (Medias) Element: &lt;liquids&gt;</a>
<li><a href="#sounds">Sounds Element: &lt;sounds&gt;</a>
<li><a href="#faders">Fader Element: &lt;faders&gt;</a>
<li><a href="#player">Player Element: &lt;player&gt;</a>
<li><a href="#view">View Element: &lt;view&gt;</a>
<li><a href="#weapons">Weapons Element: &lt;weapons&gt;</a>
<li><a href="#items">Items Element: &lt;items&gt;</a>
<li><a href="#damage_kicks">Damage-Kicks Element: &lt;damage_kicks&gt;</a>
<li><a href="#scenery">Scenery Element: &lt;scenery&gt;</a>
<li><a href="#landscapes">Landscapes Element: &lt;landscapes&gt;</a>
<li><a href="#textureloading">Texture-Loading Element: &lt;texture_loading&gt;</a>
<li><a href="#opengl">OpenGL-Rendering Element: &lt;opengl&gt;</a>
<li><a href="#software">Software Rendering Element: &lt;software&gt;</a>
<li><a href="#dynlims">Dynamic-Limits Element: &lt;dynamic_limits&gt;</a>
<li><a href="#playername">Player-Name Element: &lt;player_name&gt;</a>
<li><a href="#scenario">Scenario Element: &lt;scenario&gt;</a>
<li><a href="#keyboard">Keyboard-Defaults Element: &lt;keyboard&gt;</a>
<li><a href="#cheats">Cheating Element: &lt;cheats&gt;</a>
<li><a href="#logging">Logging Configuration Element: &lt;logging&gt;</a>
<li><a href="#console">Console: &lt;console&gt;</a>
<li><a href="#levelscripts">Level Scripting</a>
<li><a href="#appendix1">Appendix 1: Additional Elements</a>
<li><a href="#appendix2">Appendix 2: Lists of Entity Types</a>
</ul>

<hr>

<h3><a name="stringset">String-Set Element: &lt;stringset&gt;</a></h3>

This element is an imitation of MacOS 'STR#' resources. It has an attribute of "index",
which has a numerical value corresponding to the original resource ID:

<ul>
<li>128: Errors
<li>129: Filenames
<li>130: Top-Level Interface Items
<li>131: Prompts
<li>132: Network Errors
<li>133: Key Codes to Names
<li>134: Preferences Advice
<li>135: Computer Interface
<li>136: Join Dialog Messages
<li>137: Weapon Names
<li>138: File Search Path
<li>139: Preferences Groupings
<li>140: Postgame Network Game Statistics
<li>141: Net Game Setup
<li>142: New Join Dialog Messages
<li>143: Progress Strings for Networking
<li>145: Difficulty Level Names</li>
<li>150: Item Names
<li>151: Item types
<li>152: Player and Team Color Names</li>
<li>153: Net Statistics Strings
<li>200: OpenGL-Option Color-Picker Prompts
</ul>

This element contains child elements with form &lt;string&gt;,
which have an attribute of "index",
and contents of whatever the string is supposed to be.
The index is zero-based, unlike the original STR# resources, whose indices are one-based.
For example, the filenames are specified in this fashion:

<pre>
&lt;!-- STR# Resource: "Filenames" --&gt;
&lt;stringset index="129"&gt;
&lt;string index="0"&gt;Shapes&lt;/string&gt;
&lt;string index="1"&gt;Shapes.16&lt;/string&gt;
&lt;string index="2"&gt;Sounds&lt;/string&gt;
&lt;string index="3"&gt;Sounds.16&lt;/string&gt;
&lt;string index="4"&gt;Aleph One Preferences&lt;/string&gt;
&lt;string index="5"&gt;Map&lt;/string&gt;
&lt;string index="6"&gt;Untitled Game&lt;/string&gt;
&lt;string index="7"&gt;Marathon&lt;/string&gt;
&lt;string index="8"&gt;Aleph One Recording&lt;/string&gt;
&lt;string index="9"&gt;Physics Model&lt;/string&gt;
&lt;string index="10"&gt;Music&lt;/string&gt;
&lt;string index="11"&gt;Images&lt;/string&gt;
&lt;string index="12"&gt;Movie&lt;/string&gt;
&lt;/stringset&gt;
</pre>

<h3><a name="interface">Interface-Stuff Element: &lt;interface&gt;</a></h3>

This kind of element specifies stuff used in the heads-up display (HUD).
It has one attribute, "motion_sensor", which is <a href="#boolean">boolean</a>,
and which indicates whether or not the motion sensor will be active.
In what follows, the HUD coordinates used will be x = rightward and y = downward,
with the HUD's top left corner being at x = 0, y = 320.
This element also contains these kinds of child elements:
<ul>
<li>&lt;rect&gt;, with all interface rectangles;
it contains the attributes
<ul>
<li> index, others are short integers
<li>top
<li>left
<li>bottom
<li>right
</ul>
All of them are mandatory.
The interface rectangles have the meanings listed below.
<li>&lt;color&gt;, for all interface colors; it is indexed.
For more on specifying colors, go <a href="#color">here</a>.
The interface colors have the meanings listed below.
<li>&lt;font&gt;, for all interface fonts; it is indexed.
For more on specifying fonts, go <a href="#font">here</a>.
The interface fonts have the meanings listed below.
<li>&lt;vidmaster&gt;, for customizing the vidmaster level-selection dialog; it contains the attribute:
<ul><li>stringset_index: this is the index of a stringset containing the dialog text. Here's an example:<br>
<pre>
&lt;interface&gt;
&nbsp;&nbsp;&nbsp;&nbsp;...
&nbsp;&nbsp;&nbsp;&nbsp;&lt;vidmaster stringset_index="1234" /&gt;
&lt;/interface&gt;
<br>
&lt;stringset index="1234"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="0"&gt;Before proceeding any further, you&lt;/string&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="1"&gt;must take the oath of the vidmaster:&lt;/string&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="2"&gt;&lt;/string&gt; &lt;!-- empty string for line break --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- [QUOTE] at string's start makes Aleph One use a different text style --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="3"&gt;[QUOTE]"I pledge to punch all switches,&lt;/string&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="4"&gt;[QUOTE]to never shoot where I could use grenades,&lt;/string&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="5"&gt;[QUOTE]to admit the existence of no level&lt;/string&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="6"&gt;[QUOTE]except Total Carnage,&lt;/string&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="7"&gt;[QUOTE]to never use Caps Lock as my 'run' key,&lt;/string&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;string index="8"&gt;[QUOTE]and to never, ever, leave a single Bob alive."&lt;/string&gt;
&lt;/stringset&gt;
</pre></li></ul>
<li>&lt;weapon&gt;, for the weapon display;
it contains the attributes
<ul>
<li>index: the only mandatory attribute
<li>shape: the shape number (which frame in "Interface")
<li>start_y: these are for the text-display rectangle
<li>end_y
<li>start_x: if centered, then equal to -1
<li>end_x: if centered, then equal to -1
<li>top: weapon sprite's position in screen
<li>left
<li>multiple: whether the display will show two of them instead of only one,
which is a <a href="#boolean">boolean</a> value. If multiple is set, the following attributes are read:
<li>multiple_shape: second weapon shape; either replaces shape (if multiple_unusable_shape is not specified) or is drawn in addition to shape (if multiple_unusable_shape is specified) when the player has a second weapon and enough ammo to use it
<li>multiple_unusable_shape: drawn in addition to shape, when the second weapon has not been picked up or is out of ammo
<li>multiple_delta_x: offsets from shape of multiple_shape and multiple_unusable_shape
<li>multiple_delta_y
</ul>
and an optional child element, &lt;ammo&gt;, which contains the attributes
<ul>
<li>index: either 0 or 1, and the only mandatory attribute
<li>type: this has these possible values
<ul>
<li>0: No display (alien weapon, for example)
<li>1: Box display (partially-filled box; takes interface-color indexes instead of shapes)
<li>2: Discrete-bullet display
</ul>
<li>left: position in screen
<li>top
<li>across: how many bullets (energy-weapon max number)
<li>down: how many bullets (unused for energy weapons)
<li>delta_x: bullet offset (energy-weapon width)
<li>delta_y: bullet offset (energy-weapon height)
<li>bullet_shape: the shape number for a bullet, or the full-region color index
<li>empty_shape: the shape number for an empty bullet, or the empty-region color index
<li>right_to_left: whether the bullets go right-to-left instead of left-to-right,
which is a <a href="#boolean">boolean</a> value.
</ul>
</ul>
<p>

Here is a list of all the interface rectangles:
<ol type=1 start=1000>
<li>Player Name
<li>Oxygen
<li>Shield
<li>Motion Sensor
<li>Microphone
<li>Inventory
<li>Weapon Display

<li>New-Game Button
<li>Load-Game Button
<li>Gather Button
<li>Join Button
<li>Preferences Button
<li>Replay Button
<li>Save-Last Button
<li>Replace-Saved Button
<li>Credits Button
<li>Quit Button
<li>Center Button
</ol>
<p>

Here is a list of all the interface colors:

<ol type=1 start=1000>
<li>Ammo Box-Display Full
<li>Ammo Box-Display Empty
<li>Black

<li>Inventory Text
<li>Inventory Header Background
<li>Inventory Background

<li>Slate Player
<li>Red Player
<li>Violet Player
<li>Yellow Player
<li>White Player
<li>Orange Player
<li>Blue Player
<li>Green Player

<li>White
<li>Invalid Weapon

<li>Computer Border-Text background
<li>Computer Border Text

<li>Computer Text
<li>Computer White Text
<li>Computer Red Text
<li>Computer Dark Green Text
<li>Computer Cyan Text
<li>Computer Yellow Text
<li>Computer Dark Red Text
<li>Computer Blue Text
</ol>

Here is a list of all the interface fonts:
<ol type=1 start=1000>
<li>Interface
<li>Weapon Name
<li>Player Name
<li>Interface Item Count
<li>Terminal
<li>Terminal Title
<li>Network Statistics
</ol>

Here is a list of all the weapon displays:
<ol type=1 start=1000>
<li>Knife (placeholder; really one's fists)
<li>Pistol
<li>Fusion Pistol
<li>Assault Rifle
<li>Rocket Launcher
<li>Flamethrower
<li>Alien Weapon
<li>Shotgun
<li>Ball
<li>SMG
</ol>
<p>

<hr>

<h3><a name="motsens">Motion-Sensor Element: &lt;motion_sensor&gt;</a></h3>

This kind of element is for assigning motion-sensor features;
the assignment is done by doing &lt;assign&gt;, which has attributes "monster"
(which one of these in the list) and "type", which is
<ol type=1 start=1000>
<li>Self, Friendly Player, and Bob
<li>Alien
<li>Hostile Player
</ol>
<p>

One can disable it by specifying that the top-level element
<a href="#interface">&lt;interface&gt;</a>
has attribute "motion_sensor" with value "false".
<p>

<hr>

<h3><a name="ovhdmap">Overhead-Map Element: &lt;overhead_map&gt;</a></h3>

This kind of element is for setting up overhead-map features.
It can have an attribute of "mode", which has possible values:
<ol type=1 start=1000>
<li>Normal: automapping is cumulative (the default)
<li>Currently visible only
<li>All
</ol>
<p>

It can also have the attribute "title_offset", whose value is how many pixels downward
to offset the title text.
<p>

One can assign various types to monsters; they can either never show up,
or else show up as a Bob or as an alien.
This must be done separately for living and dead monsters,
because the engine "forgets" what monster type a dead monster is.
<p>

Thus, one assigns live monsters with &lt;assign_live&gt; and dead ones with
&lt;assign_dead&gt;.
Which live monster to assign one specifies with an attribute "monster",
which takes a monster type, while which dead monster to assign one specified
with an attribute of "coll", which takes a collection ID.
Both elements assign to a type of display, specified with attribute "type";
the possible types are:
<ul>
<li>-1(NONE): won't ever show up
<li> 0: Bob (shown by default)
<li> 1: Alien (not shown by default)
</ul>
<p>

One can display additional stuff by specifying an appropriate element;
this elements have an attribute of "on", which is a 
<a href="#boolean">boolean</a> value.
<ul>
<li>&lt;aliens&gt;: shows characters other than players and Bobs
<li>&lt;items&gt;: shows anything that can be picked up
<li>&lt;projectiles&gt;: shows these
<li>&lt;paths&gt;: shows the paths that the monster AI has worked out
</ul>
<p>

Lines can be specified with the element &lt;line&gt;, which has these attributes,
all mandatory:
<ul>
<li>type:
<ol type=1 start=1000>
<li>Wall (solid)
<li>Elevation (not solid; floor on one side higher than on the other side)
<li>Control panel
</ol>
<li>scale: 0 is minimum map scale and 3 is maximum map scale
<li>width: width value in pixels
</ul>

Colors can be specified with the element &lt;color&gt;, which is indexed;
For more on specifying colors, go <a href="#color">here</a>.
Here are what the colors are:
<ol type=1 start=1000>
<li>Plain polygon
<li>Platform
<li>Water
<li>Lava
<li>Sewage
<li>JjaroGoo
<li>PfhorSlime
<li>Hill
<li>Solid Line
<li>Elevation Line
<li>Control Panel
<li>Bob Display
<li>Monster Display
<li>Item Display
<li>Projectile Display
<li>Checkpoint Display
<li>Annotation
<li>Map Title
<li>Path
<li>Minor Ouch
<li>Major Ouch
</ol>
<p>

Fonts can be specified with the element &lt;font&gt;, which is indexed;
For more on specifying fonts, go <a href="#font">here</a>.
Here are what the fonts are:
<ol type=1 start=1000>
<li>Annotation at scale 0 (lowest)
<li>Annotation at scale 1
<li>Annotation at scale 2
<li>Annotation at scale 3 (highest)
<li>Map title
</ol>

One can disable it by specifying that the top-level element
<a href="#view">&lt;view&gt;</a>
has attribute "map" with value "false".
<p>

<hr>

<h3><a name="infravision">Infravision Element: &lt;infravision&gt;</a></h3>

This kind of element contains what is needed to specify infravision colors.
These are assigned by texture collection, and there are 4 colors to choose from.
The assignment is done with element &lt;assign&gt;, which has the attributes
"coll" (for collection) and "color" (for which one of the colors).
Here are the default colors:
<ol type=1 start=1000>
<li>Aliens (red)
<li>Friends and Items (green)
<li>Walls and Scenery, also the S'pht (blue)
<li>Player Stuff and Explosion Effects (yellow)
</ol>
Colors can be specified with the element &lt;color&gt;, which is indexed;
For more on specifying colors, go <a href="#color">here</a>.
<p>

<hr>

<h3><a name="animtxtrs">Animated-Textures Element: &lt;animated_textures&gt;</a></h3>

This kind of element is for specifying animated textures.
Animated textures are specified as sequences, which contain loops of texture frames
and various timing and phase information.
For example, suppose that a sequence contains frames (a,b,c).
As time goes on, frame a will be translated first into frame a, then into frame b,
then into frame c, and then will repeat the sequence, as shown below:
<p>

<table>
<tr>
<td>a</td>
<td>-</td>
<td>a</td>
<td>b</td>
<td>c</td>
<td>a</td>
<td>b</td>
<td>c</td>
<td>...</td>
</tr>
<tr>
<td>b</td>
<td>-</td>
<td>b</td>
<td>c</td>
<td>a</td>
<td>b</td>
<td>c</td>
<td>a</td>
<td>...</td>
</tr>
<tr>
<td>c</td>
<td>-</td>
<td>c</td>
<td>a</td>
<td>b</td>
<td>c</td>
<td>a</td>
<td>b</td>
<td>...</td>
</tr>
</table>
<p>

This element has two kinds of child elements, &lt;clear&gt; and &lt;sequence&gt;.
<p>

The first one, &lt;clear&gt;, clears the sequences; if it has an attribute of "coll",
it will clear the sequences for the collection specified in that attribute's value;
if not, it will clear all the sequences.
However, this command can be followed by commands to create sequences,
which will then be executed as if no "clear" command had been issued.
<p>

The second one, &lt;sequence&gt;, specifies the sequences themselves.
It takes these attributes:
<ul>
<li>coll: which collection (mandatory)
<li>numticks: how many engine ticks to stay at each frame (mandatory)
<lI>framephase: how many frames ahead to start (optional: default = 0)
<li>tickphase: how many ticks into a frame to start (optional: default = 0)
<li>select: for choosing some frame to translate into the loop of frames
as if it was the first one; this frame need not be a member of the loop.
If this is -1, then it is the frames in the loop that are translated.
(optional: default = -1; use the loop frames)
</ul>
<p>

This one also contains a child element, &lt;frame&gt;, which has a mandatory
attribute of "index", which is the frame's index.
There must be at least one of these in a sequence, for rather obvious reasons.
<p>

<hr>

<h3><a name="controlpanels">Control-Panels Element: &lt;control_panels&gt;</a></h3>

This kind of element specifies various control-panel features,
such as what kind it is, what items it accepts, and so forth.
It has these attributes:
<ul>
<li>reach: the maximum distance one can reach to touch a control panel,
in World Units (default: 1.5)
<li>horiz: how compressed-to-horizontal the reaching must be;
no compression is 1 (default: 2)
<li>single_energy: how much the single-energy panel recharges (default: 150)
<li>single_energy_rate: the single-energy panel's recharge rate (default: 1)
<li>double_energy: how much the double-energy panel recharges (default: 300)
<li>double_energy_rate: the double-energy panel's recharge rate (default: 2)
<li>triple_energy: how much the triple-energy panel recharges (default: 450)
<li>triple_energy_rate: the triple-energy panel's recharge rate (default: 3)
</ul>
<p>

Each kind of control panel is specified with the child element
&lt;panel&gt;, which has these attributes:
<ul>
<li>index: which one of the types of control panel (mandatory)
<li>type: what that control panel does
<li>coll: which shapes collection
<li>active_frame: which frame when the panel is active
<li>inactive_frame: which frame when the panel is inactive
<li>pitch: what pitch of panel-active sound
<li>item: what item the panel accepts (-1 is none)
</ul>
This element has an optional child element, "sound", with two attributes,
both mandatory: type and which.
The type indicates when the sound is to play, while which is the index in
the list of sound definitions (-1 means none).
<p>

The map files themselves reference control panels by definition;
here are the default control-panel definitions:
<ol type=1 start=1000>
<li>Water: Oxygen Refuel
<li>Water: Energy Refuel (1x)
<li>Water: Energy Refuel (2x)
<li>Water: Tag Switch (Accepts Chip)
<li>Water: Light Switch
<li>Water: Platform Switch
<li>Water: Tag Switch
<li>Water: Pattern Buffer
<li>Water: Computer Terminal
<li>Water: Tag Switch (Destroyable)

<li>Lava: Energy Refuel (1x)
<li>Lava: Energy Refuel (2x)
<li>Lava: Energy Refuel (3x)
<li>Lava: Light Switch
<li>Lava: Platform Switch
<li>Lava: Tag Switch
<li>Lava: Pattern Buffer
<li>Lava: Computer Terminal
<li>Lava: Oxygen Refuel
<li>Lava: Tag Switch (Accepts Chip)
<li>Lava: Tag Switch (Destroyable)

<li>Sewage: Energy Refuel (1x)
<li>Sewage: Energy Refuel (2x)
<li>Sewage: Energy Refuel (3x)
<li>Sewage: Light Switch
<li>Sewage: Platform Switch
<li>Sewage: Tag Switch
<li>Sewage: Pattern Buffer
<li>Sewage: Computer Terminal
<li>Sewage: Oxygen Refuel
<li>Sewage: Tag Switch (Accepts Chip)
<li>Sewage: Tag Switch (Destroyable)

<li>Pfhor: Energy Refuel (1x)
<li>Pfhor: Energy Refuel (2x)
<li>Pfhor: Energy Refuel (3x)
<li>Pfhor: Light Switch
<li>Pfhor: Platform Switch
<li>Pfhor: Tag Switch
<li>Pfhor: Pattern Buffer
<li>Pfhor: Computer Terminal
<li>Pfhor: Oxygen Refuel
<li>Pfhor: Tag Switch (Accepts Chip)
<li>Pfhor: Tag Switch (Destroyable)

<li>Jjaro: Energy Refuel (1x)
<li>Jjaro: Energy Refuel (2x)
<li>Jjaro: Energy Refuel (3x)
<li>Jjaro: Light Switch
<li>Jjaro: Platform Switch
<li>Jjaro: Tag Switch
<li>Jjaro: Pattern Buffer
<li>Jjaro: Computer Terminal
<li>Jjaro: Oxygen Refuel
<li>Jjaro: Tag Switch (Accepts Chip)
<li>Jjaro: Tag Switch (Destroyable)
</ol>
<p>

The control panels can do various things; these are:
<ol type=1 start=1000>
<li>Oxygen Refuel
<li>Energy Refuel (1x)
<li>Energy Refuel (2x)
<li>Energy Refuel (3x)
<li>Light switch
<li>Platform switch
<li>Tag switch
<li>Pattern buffer (for saving games)
<li>Computer terminal
</ol>
<p>

The sound types are:
<ol type=1 start=1000>
<li>Activating
<li>Deactivating
<li>Unusable
</ol>
<p>

<hr>

<h3><a name="platforms">Platforms Element: &lt;platforms&gt;</a></h3>

This kind of element specifies various platform features,
such as its sounds and how deadly it is when it crunches.
Each individual platform type is specified with a &lt;platform&gt; child element,
which has these attributes:
<ul>
<li>index: which one of the platform types (mandatory)
<li>start_extend: sound index for platform starting to extend (-1 for none)
<li>start_contract: same for starting to contract
<li>stop_extend: same for stopping extending
<li>stop_contract: same for stopping contracting
<li>obstructed: same for obstructed by something
<li>uncontrollable: same if one is unable to control it
<li>moving: same for moving in general
<li>item: index of item that acts like a key (-1 for none)
</ul>
The index is which one of these platform types:
<ol type=1 start=1000>
<li>S'pht Door
<li>S'pht Split Door
<li>Locked S'pht Door
<li>S'pht Platform
<li>Noisy S'pht Platform
<li>Heavy S'pht Door
<li>Pfhor Door
<li>Heavy S'pht Platform
<li>Pfhor Platform
</ol>
This element also has child element &lt;damage&gt;
(how much damage; it is described in greater detail <a href="#damage">here</a>),
<p>

<hr>

<h3><a name="liquids">Liquids (Medias) Element: &lt;liquids&gt;</a></h3>

This kind of element specifies various liquid features,
such as how deadly a liquid is, and so forth.
Each individual liquid type is specified with a &lt;liquid&gt; child element,
which has these attributes:
<ul>
<li>index: which one of the liquid types (mandatory)
<li>coll: which shapes collection
<li>frame: which frame
<li>transfer: this is the texture-rendering transfer mode.
<li>damage_freq: this is for indicating how often to apply a liquid's damage.
This is bitwise-ANDed with the number of engine ticks,
and damage gets applied if the result is all zeros.
Thus, if this quantity has a value of (2^n-1), then damage will be applied
every (2^n) ticks.
<li>submerged: this is the fader used to do the submerged appearance;
its default index values are those of their liquids.
</ul>
The index value is which one of these liquid types:
<ol type=1 start=1000>
<li>Water
<li>Lava
<li>Pfhor
<li>Sewage
<li>Jjaro
</ol>
while the "submerged" value is which one of these liquid types
<ol type=1 start=1000>
<li>Water
<li>Lava
<li>Sewage
<li>Jjaro
<li>Pfhor
</ol>
This element also has child elements &lt;damage&gt;
(how much damage; it is described in greater detail <a href="#damage">here</a>),
&lt;effect&gt; and &lt;sound&gt;.
The latter two have two attributes, both mandatory: type and which.
The type indicates when to make the effect / sound, while which is the index in
the list of effect or sound definitions (-1 means none).
<p>

The effects:
<ol type=1 start=1000>
<li>Small Detonation
<li>Medium Detonation
<li>Large Detonation
<li>Large Emergence
</ol>
<p>

The sounds:
<ol type=1 start=1000>
<li>Feet Entering
<li>Feet Leaving
<li>Head Entering
<li>Head Leaving
<li>Splashing
<li>Ambient Over
<li>Ambient Under
<li>Platform Entering
<li>Platform Leaving
</ol>
<p>

<hr>

<h3><a name="sounds">Sounds Element: &lt;sounds&gt;</a></h3>

This kind of element specifies various sound features.
Its attributes are various formerly-hardcoded sounds here and there;
these are made variable for Marathon 1 compatibility:
<br><br>
<table style="border: solid black 2px">
<tr><td>Name</td><td>Default</td><td>Description</td></tr>
<tr><td>terminal_logon</td><td>#141</td><td>Logging-on sound at a terminal</td></tr>
<tr><td>terminal_logoff</td><td>#142</td><td>Logging-off sound at a terminal</td></tr>
<tr><td>terminal_page</td><td>#143</td><td>Next-page sound at a terminal</td></tr>
<tr><td>teleport_in</td><td>#1</td><td>Teleporting in</td></tr>
<tr><td>teleport_out</td><td>#2</td><td>Teleporting out</td></tr>
<tr><td>got_powerup</td><td>#19</td><td>Picked up a powerup</td></tr>
<tr><td>got_item</td><td>#20</td><td>Picked up anything else</td></tr>
<tr><td>crunched</td><td>#3</td><td>Monster getting crunched</td></tr>
<tr><td>exploding</td><td>#198</td><td>Juggernaut exploding</td></tr>
<tr><td>breathing</td><td>#6</td><td>Made when player is underwater (will play more often if oxygen bar is low)</td></tr>
<tr><td>oxygen_warning</td><td>#7</td><td>Warning when getting low on oxygen</td></tr>
<tr><td>adjust_volume</td><td>#18</td><td>Made when sound volume gets changed</td></tr>
<tr><td>button_success</td><td>#143</td><td>Made when an interface-button action succeeds (changes resolution, for example)</td></tr>
<tr><td>button_failure</td><td>#5</td><td>Made when an interface-button action fails (unable to change resolution, for example)</td></tr>
<tr><td>button_inoperative</td><td>#11</td><td>Made when an interface button cannot make any action</td></tr>
<tr><td>ogl_reset</td><td>#198</td><td>OpenGL textures getting reset</td></tr>
</table>
<p>

It has child elements that specify which ambient and random sound assignments to use,
and also which external files to use, if desired.
The ambient and random sound assigments
are assignments from their indices to the list of (general) sound definitions,
and are specified with child elements &lt;ambient&gt; and &lt;random&gt;.
Each of them has these attributes, both mandatory:
<ul>
<li>index: which one of the ambient or random sound types
<li>sound: which index in the list of sounds (-1 for none)
</ul>
The ambient sounds are:
<ol type=1 start=1000>
<li>Water
<li>Sewage
<li>Lava
<li>Goo
<li>Under Liquids
<li>Wind
<li>Waterfall
<li>Siren
<li>Fan
<li>S'pht Door
<li>S'pht Platform
<li>Heavy S'pht Door
<li>Heavy S'pht Platform
<li>Light Machinery
<li>Heavy Machinery
<li>Transformer
<li>Sparking Transformer
<li>Machine Binder
<li>Machine Bookpress
<li>Machine Puncher
<li>Electric
<li>Alarm
<li>Night Wind
<li>Pfhor Door
<li>Pfhor Platform
<li>Alien Noise 1
<li>Alien Noise 2
<li>Alien Harmonics
</ol>
The random sounds are:
<ol type=1 start=1000>
<li>Water Drip
<li>Surface Explosion
<li>Underground Explosion
<li>Loon
<li>Creak
</ol>
<p>

The external sounds are specified with the child element &lt;sound&gt;,
which has these attributes:
<ul>
<li>index: which index in the list of sounds
<li>slot: which of the slots (0 to 4) gets its sound replaced with the external sound.
<li>file: the name of he soundfile to use; can include a path
</ul>
<p>

One clears the external-sound definitions currently present wtih the child element
&lt;sound_clear&gt;.

<hr>

<h3><a name="faders">Fader Elements: &lt;faders&gt;</a></h3>

This kind of element is for specifying various fader features,
the faders being what causes the whole screen to change color
when one is underneath a liquid or getting hit by something.
It has two kinds of child elements, &lt;fader&gt; and &lt;liquid&gt;.
<p>

The first kind, &lt;fader&gt;, specifies features of each individual fader;
it has attributes
<ul>
<li>index: which fader
<li>type: which type of fade effect to apply
<li>initial_opacity (floating point: 0 = none, 1 = complete)
<li>final_opacity (floating point: 0 = none, 1 = complete)
<li>period: time for fader effect to complete, in engine ticks (1/30 second)
<li>flags: various features; get this value by adding the numerical values
corresponding to the desired features:
<ul>
<li><tt>1 (hex 0001)</tt> Full screen
<li><tt>2 (hex 0002)</tt> Random transparency; makes flickering effect
</ul>
<li>priority: higher is higher priority
</ul>
and a child element &lt;color&gt;, which is not indexed.
For more on specifying colors, go <a href="#color">here</a>.
The fader types are these:
<ol type=1 start=1000>
<li>Tint: fade to the fader's color value:<br>
[new color] = [old color] + ([fader color] - [old color])*[opacity]
<li>Randomize: do random shifts of the colors:<br>
[new color] = [old color] + [opacity]*[random numbers]
<li>Negate: darkens light colors and lightens dark colors. For each channel:<br>
[opacity complement] = 1 - [opacity]<br>
if [old color] &gt; 0.5 then<br>
&nbsp;&nbsp;&nbsp;[new color] = max([old color], xor([fader color], [old color]) + [opacity complement])<br>
else<br>
&nbsp;&nbsp;&nbsp;[new color] = min([old color], xor([fader color], [old color]) - [opacity complement])<br>
Intermediate results may be out of (0,1) range.
<li>Dodge: some weird processing. For each channel:<br>
[new color] = max([old color], 1 - (1 - [fader color])*[old color] - [opacity])<br>
Intermediate results may be out of (0,1) range.
<li>Burn: some weird processing. For each channel:<br>
[opacity complement] = 1 - [opacity]<br>
[new color] = max([old color],[fader color]*[old color] + [opacity complement])<br>
Intermediate results may be out of (0,1) range.
<li>Soft tint: fade to the fader's color value multiplied by the intensity
(maximum of color-channel values):<br>
[intensity] = max(color channels of [old color])<br>
[new color] = [old color] + ([fader color]*[intensity] - [old color])*[opacity]
</ol>
In all these equations, color values are from 0 (black) to 1 (white),
and out-of-range result values are reduced to that range by subtracting whichever integer
will put the result into that range.
<p>

The second kind, &lt;liquid&gt;, specifies faders for liquids;
it has attributes
<ul>
<li>index: which liquid to apply the fader to
<li>fader: this specifies which fader to use for this liquid.
<li>opacity: how strong is the fader effect (floating point: 0 = none, 1 = complete)
</ul>
The index is which one of these liquid types:
<ol type=1 start=1000>
<li>Water
<li>Lava
<li>Sewage
<li>Jjaro
<li>Pfhor
</ol>
<p>

<hr>

<h3><a name="player">Player Element: &lt;player&gt;</a></h3>

This kind of element specifies various player-character features,
such as starting energy, starting oxygen, rebellion-map stripped energy
(specified with attributes), and starting items, damage types,
powerup durations and item assignments (specified with child elements),
and shapes (player collection and sequences for various states).
The attributes are:
<ul>
<li>energy: how much to start with (default: 150)
<li>oxygen: how much to start with (default: 10800)
<li>stripped: how much energy one has if one starts in a rebellion level
<li>light: self-luminosity (the miner's-light effect) (floating point: default: 0.5)
<li>oxygen_deplete: how much oxygen one loses per engine tick under a liquid or in vacuum (default: 1)
<li>oxygen_replenish: how much oxygen one gains per engine tick in air (default: 0)
<li>vulnerability: what kind of damage (true damage type) one is vulnerable to when the
invincibility powerup is active (can be -1 (NONE)) (default: 9, fusion-bolt damage)
<li>guided: whether the players' projectiles seek their targets (default: false)
<li>half_visual_arc: the sideways angle from forward that the guided-projectile targeting will use
to look for in a target; it is in Marathon's angle units, where 90 degrees = 128 (default: 128/3 = 42).
<li>half_vertical_visual_arc: the vertical angle from horizontal that the guided-projectile targeting will use0
to look for in a target; it is in Marathon's angle units, where 90 degrees = 128 (default: 28/3 = 42).
<li>visual_range: In World Units (default: 31)
<li>dark_visual_range: In World Units (default: 31)
<li>single_energy: how much the single-energy powerup recharges (default: 150)
<li>double_energy: how much the double-energy powerup recharges (default: 300)
<li>triple_energy: how much the triple-energy powerup recharges (default: 450)
<li>can_swim: will swim when under a liquid; otherwise, will move "normally" (<a href="#boolean">boolean</a>; default: true)
</ul>
Note: the oxygen depletion and replenishment rates can be negative
if one so desires, making changes in the opposite direction.
<p>

The starting items can be set with an element of &lt;item&gt;,
which has attributes:
<ul>
<li>index (which one in list)
<li>type (which item type)
</ul>
Both of them are mandatory.
The first weapon in the list is the one that will get used.
The default list is:
<ul>
<li>0: Pistol
<li>1: Knife
<li>2: Knife
<li>3: Pistol Ammo
<li>4: Pistol Ammo
<li>5: Pistol Ammo
<li>6 to 15: Knife
</ul>
<p>

The responses to various kinds of damage can be set with an element of &lt;damage&gt;,
which has attributes:
<ul>
<li>index (which one in player-damage list; mandatory, but the others are optional)
<li>threshold: if the amount of damage is greater than this,
then fader (fade)+1 is used instead of fader (fade).
<li>fade: what of the faders to use.
<li>sound: Sound to make.
<li>death_sound: Death sound to make.
<li>death_action: Behavior of sprites when killed.
Here are the appropriate behavior types:
<ul>
<li> 6: Hard death (blown to bits by explosion)
<li> 7: Soft death (stays in shape)
<li> 8: Flaming death
</ul>
</ul>
If there is none of something, then it gets a value of -1.
Soft death for sprites can also be specified with a -1.
<p>

The durations of the powerups can be set with an element of &lt;powerup&gt;.
It has these attributes
<ul>
<li>invisibility (default: 2100 or 70 seconds)
<li>invincibility (default: 1500 or 50 seconds)
<li>extravision (default: 5400 or 3 minutes)
<li>infravision (default: 5400 or 3 minutes)
</ul>
These have a value of the number of engine ticks the powerup lasts;
an engine tick is 1/30 second.
<p>

The item assignments of the powerups can be set with an element of &lt;powerup_assign&gt;.
It has these attributes
<ul>
<li>invincibility: item ID (default: 11)
<li>invisibility: item ID (default: 10)
<li>infravision: item ID (default: 12)
<li>extravision: item ID (default: 17)
<li>triple_energy: item ID (default: 21)
<li>double_energy: item ID (default: 20)
<li>energy: item ID (default: 19)
<li>oxygen: item ID (default: 18)
</ul>
If one turns some ammo or other non-powerup item into a powerup, be sure to set its item type to be "powerup"
with the <a href="#items">items</a> element.
<p>

Player shapes can be set with an element of &lt;shape&gt;, which differs from the usual element with that name;
the player shapes have an overall collection and various sequences,
and each element will set either that collection or one of the sequences.
It has these attributes, all of which are mandatory:
<ul>
<li>type: overall type of shape value
<li>subtype: more specific type: depends on which overall type
<li>value: the shape value to use
</ul>
<p>

The types and subtypes have these values:
<ol type=1 start=1000>
<li>Collection and Death Sequences
<ol type=1 start=1000>
<li>Collection (default: 6)
<li>Hard dying (default: 9)
<li>Soft dying (default: 8)
<li>Hard dead (default: 11)
<li>Soft dead (default: 10)
</ol>
<li>Leg Sequences (player actions)
<ol type=1 start=1000>
<li>Stationary (default: 7)
<li>Walking (default: 0)
<li>Running (default: 0)
<li>Sliding (default: 24)
<li>Airborne (default: 23)
</ol>
<li>Idle-Weapon Torso Sequences
<li>Charging-Weapon Torso Sequences
<li>Firing-Weapon Torso Sequences
<ol type=1 start=1000>
<li>Fists (defaults: 1, 1, 2)
<li>Pistol (defaults: 3, 3, 4)
<li>Fusion Pistol (defaults: 20, 21, 22)
<li>Assault Rifle (defaults: 26, 26, 27)
<li>Rocket Launcher (defaults: 14, 14, 15)
<li>Flamethrower (defaults: 12, 12, 13)
<li>Alien Weapon (defaults: 31, 31, 32)
<li>Shotgun (defaults: 16, 16, 17)
<li>Ball (defaults: 28, 28, 28)
<li>SMG (defaults: 33, 33, 34)
<li>Two Pistols (defaults: 5, 5, 6)
<li>Two Shotguns (defaults: 18, 18, 19)
</ol>
</ol>

<hr>

<h3><a name="view">View Element: &lt;view&gt;</a></h3>

This kind of element specifies various view features.
It has these attributes:
<ul>
<li>map: indicates whether or not to show the overhead map (<a href="#boolean">boolean</a>; default: true)
<li>fold_effect: indicates whether or not to make the field of view stretch horizontally
and squeeze vertically as one teleports (<a href="#boolean">boolean</a>; default: true)
<li>static_effect: indicates whether or not to make teleporting objects have the sparkling
"static" effect and whether they get squeezed horizontally as they teleport (<a href="#boolean">boolean</a>; default: true)
<li>interlevel_in_effects: set false to skip all teleport effects (and sound) when entering level (<a href="#boolean">boolean</a>; default: true)
<li>interlevel_out_effects: set false to skip all teleport effects (and sound) when leaving level (<a href="#boolean">boolean</a>; default: true)
</ul>
<p>
This element has the child elements &lt;font&gt;, for setting on-screen-display fonts
and &lt;fov&gt;, which is for setting field-of-view features.
<p>

The default on-screen font is "Monaco", size 12, normal style;
for more on setting fonts, go <a name="#font">here</a>.
<p>

Field-of-view features are set with child element &lt;fov&gt;,
which has these attributes:
<ul>
<li>normal: the normal field of view (default: 80)
<li>extra: the extravision-powerup field of view (default: 130)
<li>tunnel: the tunnel-vision field of view, good for long-distance sharpshooting
(default: 30)
<li>rate: how much to change the FOV in degrees/(engine tick) (default: 1.667 or 50 degrees/s)
<li>fix_h_not_v: fix the view's horizontal FOV angle instead of its vertical FOV angle (<a href="#boolean">boolean</a>; default: false).
Here is what happens when one shifts from a HUDded to a HUDless view:
<ul>
<li>fix_h_not_v false: the horizontal FOV shrinks
<li>fix_h_not_v true: the vertical FOV expands
</ul>
</ul>
All of them are in degrees, all of them are floating-point values
(can be non-integer) between 0 and 180, and all of them are optional.
<p>

<hr>

<h3><a name="weapons">Weapons Element: &lt;weapons&gt;</a></h3>

This kind of element specifies various features of the weapons,
such as shell casings and weapon order (child elements &lt;shell_casings&gt;
and &lt;order&gt;).
<p>

Shell-casing features one can specify
with the child element &lt;shell_casings&gt;,
which has these attributes:
<ul>
<li>index (mandatory)
<li>coll: which shapes collection
<li>seq: which sequence
<li>x0: initial position (horizontal)
<li>y0: initial position (vertical)
<li>vx0: initial velocity (horizontal)
<li>vy0: initial velocity (vertical)
<li>dvx: acceleration (horizontal)
<li>dvy: acceleration (vertical)
</ul>
<p>
The time unit here is the engine tick;
x0, y0, vx0, vy0, dvx, and dvy are all floating-point values
that are relative to the screen (0 = left, 1 = right; 0 = bottom, 1 = top).
<p>

The various types of shell casings are:
<ol type=1 start=1000>
<li>Assault rifle
<li>Centered pistol
<li>Left-side pistol
<li>Right-side pistol
<li>SMG
</ol>
<p>

The weapon order can be specified with the child element
&lt;order&gt;, which has these attributes, both mandatory:
<ul>
<li>index: which in the ordering list
<li>weapon: what weapon index
</ul>
<p>

The default weapon order is
<ol type=1 start=1000>
<li>Fist
<li>Pistol
<li>Fusion Pistol
<li>Shotgun
<li>Assault Rifle
<li>SMG
<li>Flamethrower
<li>Rocket Launcher
<li>Alien Weapon
<li>Ball
</ol>
<p>

<hr>

<h3><a name="items">Items Element: &lt;items&gt;</a></h3>

This kind of element specifies various features of items that can be picked up.
These are specified with the child element &lt;item&gt;,
which has these attributes:
<ul>
<li>index (mandatory)
<li>type: what kind of item:
<ol type=1 start=1000>
<li>weapon
<li>ammunition
<li>powerup
<li>generic item
<li>weapon powerup (note: the engine does not currently support this type)
<li>ball
</ol>
<li>singular: index of singular name string (only one of them)
<li>plural: index of plural name string (more than one of them)
<li>maximum: maximum number that a player may possess
<li>invalid: what environments the item cannot be used in;
this value is determined by the sum of values for individual
environment types:
<ul>
<li><tt>&nbsp;&nbsp;&nbsp;&nbsp;0 (hex 0000)</tt> Normal
<li><tt>&nbsp;&nbsp;&nbsp;&nbsp;1 (hex 0001)</tt> Vacuum
<li><tt>&nbsp;&nbsp;&nbsp;&nbsp;2 (hex 0002)</tt> Magnetic
<li><tt>&nbsp;&nbsp;&nbsp;&nbsp;4 (hex 0004)</tt> Rebellion
<li><tt>&nbsp;&nbsp;&nbsp;&nbsp;8 (hex 0008)</tt> Low Gravity
<li><tt>&nbsp;8192 (hex 2000)</tt> Network
<li><tt>16384 (hex 4000)</tt> Single Player
</ul>
</ul>
<p>
The item shape can be specified with a <a href="#shape">shape</a>
child element, which can be blank (&lt;shape/&gt;).
<p>

<hr>

<h3><a name="damage_kicks">Damage-Kicks Element: &lt;damage_kicks&gt;</a></h3>

This element specifies the velocity impulse that some damage type will produce.
The kick for each damage type is specified with a &lt;kick&gt; child element,
which has these attributes:
<ul>
<li>index: which "true" damage type (mandatory)
<li>base: quantity of kick that is always present
<li>mult: how much to multiply the damage amount by to obtain an additional kick
<li>vertical: indicates whether the kick will have a vertical component
in addition to a horizontal one (<a href="#boolean">boolean</a>)
</ul>

<hr>

<h3><a name="scenery">Scenery Element: &lt;scenery&gt;</a></h3>

This kind of element specifies various features of scenery objects,
including size and solidity.
Each individual type of scenery object is specified with a &lt;object&gt; child element,
which has these attributes:
<ul>
<li>index: which one of the scenery-object types (mandatory)
<li>flags: various features; get this value by adding the numerical values
corresponding to the desired features:
<ul>
<li><tt>1 (hex 0001)</tt> Solid (can't pass through it)
<li><tt>2 (hex 0002)</tt> Unused
<li><tt>4 (hex 0004)</tt> Destroyable
</ul>
<li>radius: horizontal dimension in internal units, for doing collision detection.
<li>height: vertical dimension like above; if negative,
then object's extent downward from reference point (good for ceiling objects).
<li>destruction: effect to make when destroyed (-1 is none).
</ul>
<p>

This element's shapes can be specified with child elements
&lt;normal&gt; and &lt;destroyed&gt;, for before-and-after shapes;
each of them has the actual shape value specified with a
<a href="#shape">shape</a> child element.
<p>

Some notes on the flags:
<p>

"Destroyable" is not meaningful unless the object is also "solid";
this is because a projectile must collide with the object in order to destroy it.
Thus, a solid but indestructible object would get flags="1",
and a destroyable one would get flags="5".
<p>

The index is which one of these scenery-object types:
<ol type=1 start=1000>
<li>Lava: light dirt
<li>Lava: dark dirt
<li>Lava: bones
<li>Lava: bone
<li>Lava: ribs
<li>Lava: skull
<li>Lava: hanging light 1
<li>Lava: hanging light 2
<li>Lava: small cylinder
<li>Lava: large cylinder
<li>Lava: block 1
<li>Lava: block 2
<li>Lava: block 3
<li>Water: pistol clip
<li>Water: short light
<li>Water: long light
<li>Water: siren
<li>Water: rocks
<li>Water: blood drops
<li>Water: water thing
<li>Water: gun
<li>Water: Bob remains
<li>Water: puddles
<li>Water: big puddles
<li>Water: security monitor
<li>Water: alien supply can
<li>Water: machine
<li>Water: fighter's staff
<li>Sewage: stubby green light
<li>Sewage: long green light
<li>Sewage: junk
<li>Sewage: big antenna 1
<li>Sewage: big antenna 2
<li>Sewage: alien supply can
<li>Sewage: bones
<li>Sewage: big bones
<li>Sewage: Pfhor pieces
<li>Sewage: Bob pieces
<li>Sewage: Bob blood
<li>Pfhor: green light
<li>Pfhor: small alien light
<li>Pfhor: alien ceiling rod light
<li>Pfhor: bulbous yellow alien object
<li>Pfhor: square gray organic object
<li>Pfhor: Pfhor skeleton
<li>Pfhor: Pfhor mask
<li>Pfhor: green stuff
<li>Pfhor: Hunter shield
<li>Pfhor: bones
<li>Pfhor: alien sludge
<li>Jjaro: short ceiling light
<li>Jjaro: long light
<li>Jjaro: weird rod
<li>Jjaro: Pfhor ship
<li>Jjaro: Sun
<li>Jjaro: large glass container
<li>Jjaro: nub 1
<li>Jjaro: nub 2
<li>Jjaro: Lh'owon
<li>Jjaro: floor whip antenna
<li>Jjaro: ceiling whip antenna
</ol>
<p>

<hr>

<h3><a name="landscapes">Landscapes Element: &lt;landscapes&gt;</a></h3>

This kind of element is for modifying landscape rendering.

This element has two kinds of child elements, &lt;clear&gt; and &lt;landscape&gt;.
<p>

The first one, &lt;clear&gt;, clears the landscape options,
setting them back to their defaults; if it has an attribute of "coll",
it will clear the sequences for the collection specified in that attribute's value;
if not, it will clear all the sequences.
However, this command can be followed by commands to set up landscape options,
which will then be executed as if no "clear" command had been issued.
<p>

The second one, &lt;landscape&gt;, specifies the landscape options themselves.
It takes these attributes:
<ul>
<li>coll: which collection (mandatory)
<li>frame: which frame to apply the options to (default: -1, all frames)
<li>horiz_exp: exponent for power of 2 that is the number of wraparound repeats in the horizontal direction.
(default: 1 - two repeats)
<li>vert_exp: exponent for power of 2 that makes a vertical scaling equal to the scaling
produced by the same value of horiz_exp in the horizontal direction. (default: 1 - equal to two horizontal repeats)
<li>ogl_asprat_exp: exponent for power of 2 that is the ratio of width to height
of the part of the texture that OpenGL will use (width is fixed; height can be variable).
This part will always be centered in height, and will either include some untextured area
or will not include the top and bottom parts. (default: 1 -- height is 1/2 width)
<li>vert_repeat: whether texture repeats in the vertical direction
(default: false -- clamped in the vertical direction; last pixels stretched out)
<li>azimuth: angle in degrees to rotate the texture leftward relative to the map.
This could be useful for aligning landscape features with map ones. (default: 0)
</ul>
<p>

<hr>

<h3><a name="textureloading">Texture-Loading Element: &lt;texture_loading&gt;</a></h3>

This kind of element is for setting what textures are to be loaded.
It has one attribute, "landscapes",  which is <a href="#boolean">boolean</a>;
it indicates whether or not to load M2/Moo-style landscapes (collections 26 to 30).
It also has a child element, &lt;texture_env&gt;, for indicating what wall-texture and
scenery collections are to be loaded.
It takes these attributes, all mandatory:
<ul>
<li>index: which one of the texture environments (water, lava, sewage, etc.)
<li>which: which position in the texture-environment definition (0 = first, etc;).
There are currently 7 such positions available.
<li>coll: which collection in that position; -1 is no collection.
</ul>
<p>

The defaults for Marathon 2/oo are, in order (walls, scenery):
<ol type=1 start=1000>
<li>17, 22 -- Lh'owon Water
<li>18, 23 -- Lh'owon Lava
<li>19, 24 -- Lh'owon Sewage
<li>20, 25 -- Jjaro
<li>21, 26 -- Pfhor
</ol>
<p>

Those for Marathon 1 are, in order (walls, control panels, scenery):
<ol type=1 start=1000>
<li>17, 8, 23 -- Marathon Set 1
<li>18, 8, 23 -- Marathon Set 2
<li>19, 8, 23 -- Marathon Set 3
<li>2, 24, 25 -- Pfhor
</ol>
<p>

Note also that Marathon 1 has its landscapes in the wall-texture collections;
the attribute "landscapes" is to be false for it.
<p>

<hr>

<h3><a name="opengl">OpenGL-Rendering Element: &lt;opengl&gt;</a></h3>

This kind of element is for modifying the OpenGL rendering.
Currently, both texture-rendering modification and fog are supported;
texture-rendering modification modifies the rendering of each bitmap.

This element has these kinds of child elements, &lt;txtr_clear&gt;, &lt;texture&gt;,
&lt;model_clear&gt;, &lt;model&gt;, and &lt;fog&gt;.
<p>

The first one, &lt;txtr_clear&gt;, clears the texture options,
setting them back to their defaults. If it has an attribute of "coll",
it will clear the sequences for the collection specified in that attribute's value;
if not, it will clear all the sequences.
However, this command can be followed by commands to set up texture options,
which will then be executed as if no "txtr_clear" command had been issued.
<p>

The next one, &lt;texture&gt;, specifies the texture options themselves.
It takes these attributes:
<ul>
<li>coll: which collection (mandatory).
<li>clut: which color table. Values 0 to 7 are the familiar color-table values,
and there are these special values:
<ul>
<li>All color tables: -1 (default)
<li>Infravision: 8
<li>Silhouette: 9 [used for invisibility and static effect]
</ul>
<li>bitmap: which one to apply the options to (mandatory).
<li>opac_type: what type of opacity to use (default: 0 -- crisp edges).
<li>opac_scale: scaling value for the opacity;
how much to multiply it by (default: 1 -- no change).
<li>opac_shift: shift value for the opacity;
how much to add after multiplying (default: 0 -- no change).
<li>void_visible: can see into the void (what's not in any map polygon) through this texture;
can cause smearing and weird show-through (default: false; cannot see into void).
<li>normal_image: the name of the file whose image content to substitute
in "normal" rendering (sensitive to light levels).
<li>normal_mask: the name of the file whose image content becomes the opacity mask
for "normal" rendering (sensitive to light levels).
It must be used with a normal_image file.
<li>glow_image: the name of the file whose image content to substitute
in "glowing" rendering (independent of light levels).
<li>glow_mask: the name of the file whose image content becomes the opacity mask
for "glowing" rendering (independent of light levels).
It must be used with a glow_image file.
<li>normal_blend: which blend mode for semitransparent normal textures (default: 0 -- crossfade)
<li>glow_blend: which blend mode for semitransparent glowing textures (default: 0 -- crossfade)
<li>image_scale: The amount to scale a substituted sprite, from pixel units to internal distance units.
If it is zero or less, then it and the offsets are ignored.
<li>x_offset: The amount to shift the top left corner rightward, in internal units.
<li>y_offset: The amount to shift the top left corner downward, in internal units. 
<li>type: the texture type to use for image quality adjustments. If not set, the image quality settings in graphics preferences will be ignored for this image, and the largest version in the file used.
<li>normal_premultiply: the normal image uses premultiplied alpha (default: false, the image does not use premultiplied alpha)
<li>glow_premultiply: the glow image uses premultiplied alpha (default: false, the image does not use premultiplied alpha)
</ul>
<p>
Note: all resulting values will be pegged to the range 0 to 1.
Here are the various opacity types:
<ol type=1 start=1000>
<li>Crisp edges. The opacity threshold is 0.5.
<li>Fuzzy edges.
<li>Fuzzy edges with opacity = average of color channels.
<li>Fuzzy edges with opacity = maximum of color channels.
</ol>
Here are the various blend types, to be used for semitransparent rendering:
<ol type=1 start=1000>
<li>Crossfade blending; reasonable for semitransparent, non-glowing object
<li>Additive blending; reasonable for glowing, low-opacity object
</ol>
<p>

The opacities of all but the first will be scaled and shifted
with opac_scale and opac_shift.
The first one of these is good for objects with well-defined edges;
the others are good for clouds, flames, energy-weapon bolts, and so forth,
which will not have sharp boundaries.
The average and maximum modes were included as a way of producing variable opacity
without adding any new files; this hack was inspired by the semitransparency handling
in the Tomb Raider series.
The idea here is that the brighter regions are likely to be the more opaque ones
in these cases.
I've put both of them in because they behave somewhat differently;
max has the same strength for saturated colors as for grays,
while mean has less strength for saturated colors than for grays.
<p>
Here are the texture types:
<ol type=1 start=1000>
<li>Wall Textures
<li>Landscape Textures
<li>Inhabitants
<li>Weapons in hand
</ol>
<p>

The next one, &lt;model_clear&gt;, clears all the model definitions;
it works much like &lt;txtr_clear&gt;.
<p>

The next one, &lt;model&gt; specifies a 3D model to be used in place
of some sequence. Models can either be static, having no built-in animations
(most 3D-model formats), or they can be dynamic, having such animations
(Brian Barnes's Dim3 model format, for example).
These animations are specified by sequence (animation in BB's terminology);
each sequence should have at least one frame.
There is one special "sequence", the neutral pose, which indicates a model
with no animations applied.
This element takes child elements &lt;seq_map&gt; and &lt;skin&gt;, and these attributes:
<ul>
<li>coll: which collection (mandatory).
<li>seq: which sequence in the Marathon engine.
Checked after the sequence mapping is searched for a sequence;
it may be omitted if a sequence mapping is being used.
Recommended for use with static models;
for dynamic models, it maps onto the model's neutral pose.
<li>file: the name of the file containing the model data.
For static models, this is the only file,
for Dim3 models, this is the "mesh" file (basic model data).
<li>file1: an extra model-data file. Unnecessary for static models;
for Dim3 models, this is the "pose" file (frames).
<li>file2: an extra model-data file. Unnecessary for static models;
for Dim3 models, this is the "animate" file (sequences).
<li>type: a string identifying the model-data format:
<ul>
<li>Alias|Wavefront Object: "wave" to "wavefront"
<li>3D Studio Max Object: "3ds" to "3ds max" or "3dsmax"
<li>QuickDraw 3D / Quesa 3D Metafile: "qd3d" or "3dmf" or "quesa"
<li>Brian Barnes Dim3 animated model: "dim3"
</ul>
If it is absent, the type will then be guessed from the file contents,
an operation that may work on some file formats but not others.
<li>scale: how much to scale the model before rendering,
from model coordinates to internal coordinates.
A negative scale will cause the model to be reflected around all three axes
(default: 1).
<li>x_rot: rotation in degrees around the x-axis (default: 0).
<li>y_rot: rotation in degrees around the y-axis (default: 0).
<li>z_rot: rotation in degrees around the z-axis (default: 0).
<li>x_shift: shift in internal units in the x direction (default: 0).
<li>y_shift: shift in internal units in the y direction (default: 0).
<li>z_shift: shift in internal units in the z direction (default: 0).
<li>side: which side is visible (default: clockwise):
<ul>
<li>+: clockwise side
<li>0: both sides
<li>-: counterclockwise side
</ul>
<li>norm_type: which sort of normals to use for doing the lighting (default: originals)
<ol type=1 start=1000>
<li>None
<li>Original-model normals (may be none)
<li>Reverse-direction original-model normals (may be none)
<li>Normals in the direction of the polygons' clockwise sides
<li>Normals in the direction of the polygons' counterclockwise sides
</ol>
<li>norm_split: threshold for spltting the vertex normals
for clockwise-side or counterclockwise-side normals;
if the normals' standard deviation is greater than this value,
then a vertex's normal is split into one for each of its polygons.
(default: 0.5)
<li>light_type: what sort of lighting to use (default: fast)
<ol type=1 start=1000>
<li>Fast lighting; only one calculation of the player light
<li>Like above, but the player light won't fade off on the sides
<li>Individual-vertex calculation of the player light (more accurate, but slower)
<li>Like above, but the player light won't fade off on the sides
</ol>
<li>depth_type: what sort of depth to use in the depth sorting
<ul>
<li>+: Farthest bounding-box point (good for all-or-nothing-opacity objects)
<li>0: Center of bounding box
<li>-: Nearest bounding-box point (good for semitransparent objects)
</ul>
Ideally, objects with all-or-nothing opacity ought to be rendered
before semitransparent ones;
these different depth options offer a way to approximate that effect.
</ul>
<p>
The scaling and rotations will be applied before the shifts;
the rotations will be applied in order x, y, and z.
<p>

Its child element of &lt;seq_map&gt; is the sequence-mapping element,
has these attributes, both mandatory:
<ul>
<li>seq: sequence in the Marathon engine to map to.
<li>model_seq: sequence in the model, starting from 0.
The model sequence -1 is the neutral pose.
</ul>
A model element can have several such elements,
covering many of a collection's sequences.
<p>

The model element's child element of &lt;skin&gt; has these attributes,
which closely parallel those of &lt;texture&gt;:
<ul>
<li>clut: which color table (default: -1 -- all of them).
<li>opac_type: what type of opacity to use (default: 0 -- crisp edges).
<li>opac_scale: scaling value for the opacity;
how much to multiply it by (default: 1 -- no change).
<li>opac_shift: shift value for the opacity;
how much to add after multiplying (default: 0 -- no change).
<li>normal_image: the name of the file whose image content to substitute
in "normal" rendering (sensitive to light levels).
<li>normal_mask: the name of the file whose image content becomes the opacity mask
for "normal" rendering (sensitive to light levels).
It must be used with a normal_image file.
<li>glow_image: the name of the file whose image content to substitute
in "glowing" rendering (independent of light levels).
<li>glow_mask: the name of the file whose image content becomes the opacity mask
for "glowing" rendering (independent of light levels).
It must be used with a glow_image file.
<li>normal_blend: which blend mode for semitransparent normal textures (default: 0 -- crossfade)
<li>glow_blend: which blend mode for semitransparent glowing textures (default: 0 -- crossfade)
</ul>
<p>

The final one, &lt;fog&gt;, has these attributes:
<ul>
<li>type: which type of fog:
<ol type=1 start=1000>
<li>Above liquid
<li>Below liquid
</ol>
The default is 0 (above liquid).
<li>on: (<a href="#boolean">boolean</a>; default: false)
<li>depth: the fog depth in World Units (default: 8)
<li>landscapes: whether this fog affects landscape textures (default: true)
</ul>
<p>

and a <a href="#color">color</a> subelement, which indicates the fog color
(default: gray [red = green = blue = 0.5]).
<p>

<hr>

<h3><a name="software">Software Rendering Element: &lt;software&gt;</a></h3>
This kind of element is for modifying the software rendering. This element has the child element &lt;texture&gt;
<p>
&lt;texture&gt; specifies options for wall textures only, CLUT 0. It takes these attributes:
<ul>
<li>coll: which collection
<li>bitmap: which bitmap to apply the options to
<li>opac_type: what type of opacity to use (default: 0 -- no change).
<li>opac_scale: scaling value for the opacity; how much to multiply it by (default: 1 -- no change).
<li>opac_shift: shift value for the opacity; how much to add after multiplying (default: 0 -- no change).
</ul>
<p>
Here are the various opacity types:
<ol type=1 start=1000>
<li>Crisp edges. Opacity is unaltered (this will cause no visible change in the software renderer).
<li>Fuzzy edges.
<li>Fuzzy edges with opacity = average of color channels.
<li>Fuzzy edges with opacity = maximum of color channels.
</ol>
<p>
In all cases, the wall texture's bitmap transparency definition is unaltered by opac_shift, opac_scale, and opac_type. Therefore, if a bitmap is marked transparent, the pixels that use color 0 will always be transparent, regardless of this MML.

<hr>

<h3><a name="dynlims">Dynamic-Limits Element: &lt;dynamic_limits&gt;</a></h3>

This kind of element specifies various dynamic limits,
more specifically, the maximum numbers of various entities whose quantity
varies during the game.
These are specified with various child elements, each one of which
has a mandatory attribute of "value", which is set to the appropriate number.
Here they are:

<ul>
<li> &lt;objects&gt; (default: 1024) Every sort of inhabitant object (players, monsters, items, projectiles, scenery)
<li> &lt;monsters&gt; (default: 512) Monsters / Non-Player Characters (NPC's).
<li> &lt;paths&gt; (default: 128) Paths for NPC's to follow; if not enough, they will not move.
<li> &lt;projectiles&gt; (default: 128) Bullets, missiles, flame, fist punches, etc.
<li> &lt;effects&gt; (default: 128) Explosions, splashes, etc.
<li> &lt;rendered&gt; (default: 1024) How many inhabitants to render at any one time.
<li> &lt;local_collision&gt; (default: 64) Target visibility, NPC-NPC collisions, etc.
<li> &lt;global_collision&gt; (default: 256) Projectiles with other objects
</ul>

<hr>

<h3><a name="playername">Player-Name Element: &lt;player_name&gt;</a></h3>

This is the default player name in netgames, which takes the form:
<pre>
&lt;player_name&gt;Marathon Player&lt;/player_name&gt;
</pre>
<p>

<hr>
<h3><a name="scenario">Scenario Element: &lt;scenario&gt;</a></h3>
This element is for identifying the scenario. It has an attribute "name" which is the scenario name displayed in the Find Internet Game client, an attribute "version" which is the scenario version displayed in the Find Internet Game client, and an attribute "id" which is used to determine which games to gray out. The defaults for name, version, and id are blank.
<p>There are also child elements &lt;can_join&gt; which specify other scenario ids this one can join.
<p>
Scenario names are limited to 32 characters in length. Scenario version strings are limited to 8 characters in length. Scenario IDs are limited to 24 characters in length.
<p>
Games show up as joinable when any of these is true:
<ul>
<li>The joiner's scenario id is blank</li>
<li>The gatherer's scenario id is blank</li>
<li>The joiner's scenario id matches the gatherer's scenario id</li>
<li>The gatherer's scenario id matches one of the joiner's can_join elements</li>
</ul>
All matches are case sensitive.
<p>
For example:
<p>
<pre>
&lt;scenario name="Marathon Infinity" id="Marathon Infinity"&gt;
&lt;can_join&gt;Marathon 2&lt;/can_join&gt;
&lt;/scenario&gt;
</pre>
<hr>

<h3><a name="keyboard">Keyboard-Defaults Element: &lt;keyboard&gt;</a></h3>

This element is for setting the default keyboard settings.
It has an attribute "set" which indicates which of the three sets to set keys for
(Standard, Arrows, PowerBook), and a child element &lt;key&gt; with attributes
<ul>
<li> index: which key action
<li> sdl: the SDL key code
</ul>
Here are the various actions:
<ol type=1 start=1000>
<li>Moving Forward
<li>Moving Backward
<li>Turning Left
<li>Turning Right
<li>Sidestepping Left
<li>Sidestepping Right
<li>Looking Left
<li>Looking Right
<li>Looking Up
<li>Looking Down
<li>Looking Center
<li>Cycle Weapons Backward
<li>Cycle Weapons Forward
<li>Left Trigger State
<li>Right Trigger State
<li>Sidestep Don't Turn
<li>Run Don't Walk
<li>Look Don't Turn
<li>Action Trigger State
<li>Toggle Map
<li>Microphone Button
</ol>
<p>

Here are the SDL key definitions, which have been cribbed from the SDL include file
"SDL_keysym.h":
<p>
<pre>
	/* The keyboard syms have been cleverly chosen to map to ASCII */
	SDLK_UNKNOWN		= 0,
	SDLK_FIRST		= 0,
	SDLK_BACKSPACE		= 8,
	SDLK_TAB		= 9,
	SDLK_CLEAR		= 12,
	SDLK_RETURN		= 13,
	SDLK_PAUSE		= 19,
	SDLK_ESCAPE		= 27,
	SDLK_SPACE		= 32,
	SDLK_EXCLAIM		= 33,
	SDLK_QUOTEDBL		= 34,
	SDLK_HASH		= 35,
	SDLK_DOLLAR		= 36,
	SDLK_AMPERSAND		= 38,
	SDLK_QUOTE		= 39,
	SDLK_LEFTPAREN		= 40,
	SDLK_RIGHTPAREN		= 41,
	SDLK_ASTERISK		= 42,
	SDLK_PLUS		= 43,
	SDLK_COMMA		= 44,
	SDLK_MINUS		= 45,
	SDLK_PERIOD		= 46,
	SDLK_SLASH		= 47,
	SDLK_0			= 48,
	SDLK_1			= 49,
	SDLK_2			= 50,
	SDLK_3			= 51,
	SDLK_4			= 52,
	SDLK_5			= 53,
	SDLK_6			= 54,
	SDLK_7			= 55,
	SDLK_8			= 56,
	SDLK_9			= 57,
	SDLK_COLON		= 58,
	SDLK_SEMICOLON		= 59,
	SDLK_LESS		= 60,
	SDLK_EQUALS		= 61,
	SDLK_GREATER		= 62,
	SDLK_QUESTION		= 63,
	SDLK_AT			= 64,
	/* 
	   Skip uppercase letters
	 */
	SDLK_LEFTBRACKET	= 91,
	SDLK_BACKSLASH		= 92,
	SDLK_RIGHTBRACKET	= 93,
	SDLK_CARET		= 94,
	SDLK_UNDERSCORE		= 95,
	SDLK_BACKQUOTE		= 96,
	SDLK_a			= 97,
	SDLK_b			= 98,
	SDLK_c			= 99,
	SDLK_d			= 100,
	SDLK_e			= 101,
	SDLK_f			= 102,
	SDLK_g			= 103,
	SDLK_h			= 104,
	SDLK_i			= 105,
	SDLK_j			= 106,
	SDLK_k			= 107,
	SDLK_l			= 108,
	SDLK_m			= 109,
	SDLK_n			= 110,
	SDLK_o			= 111,
	SDLK_p			= 112,
	SDLK_q			= 113,
	SDLK_r			= 114,
	SDLK_s			= 115,
	SDLK_t			= 116,
	SDLK_u			= 117,
	SDLK_v			= 118,
	SDLK_w			= 119,
	SDLK_x			= 120,
	SDLK_y			= 121,
	SDLK_z			= 122,
	SDLK_DELETE		= 127,
	/* End of ASCII mapped keysyms */

	/* International keyboard syms */
	SDLK_WORLD_0		= 160,		/* 0xA0 */
	SDLK_WORLD_1		= 161,
	SDLK_WORLD_2		= 162,
	SDLK_WORLD_3		= 163,
	SDLK_WORLD_4		= 164,
	SDLK_WORLD_5		= 165,
	SDLK_WORLD_6		= 166,
	SDLK_WORLD_7		= 167,
	SDLK_WORLD_8		= 168,
	SDLK_WORLD_9		= 169,
	SDLK_WORLD_10		= 170,
	SDLK_WORLD_11		= 171,
	SDLK_WORLD_12		= 172,
	SDLK_WORLD_13		= 173,
	SDLK_WORLD_14		= 174,
	SDLK_WORLD_15		= 175,
	SDLK_WORLD_16		= 176,
	SDLK_WORLD_17		= 177,
	SDLK_WORLD_18		= 178,
	SDLK_WORLD_19		= 179,
	SDLK_WORLD_20		= 180,
	SDLK_WORLD_21		= 181,
	SDLK_WORLD_22		= 182,
	SDLK_WORLD_23		= 183,
	SDLK_WORLD_24		= 184,
	SDLK_WORLD_25		= 185,
	SDLK_WORLD_26		= 186,
	SDLK_WORLD_27		= 187,
	SDLK_WORLD_28		= 188,
	SDLK_WORLD_29		= 189,
	SDLK_WORLD_30		= 190,
	SDLK_WORLD_31		= 191,
	SDLK_WORLD_32		= 192,
	SDLK_WORLD_33		= 193,
	SDLK_WORLD_34		= 194,
	SDLK_WORLD_35		= 195,
	SDLK_WORLD_36		= 196,
	SDLK_WORLD_37		= 197,
	SDLK_WORLD_38		= 198,
	SDLK_WORLD_39		= 199,
	SDLK_WORLD_40		= 200,
	SDLK_WORLD_41		= 201,
	SDLK_WORLD_42		= 202,
	SDLK_WORLD_43		= 203,
	SDLK_WORLD_44		= 204,
	SDLK_WORLD_45		= 205,
	SDLK_WORLD_46		= 206,
	SDLK_WORLD_47		= 207,
	SDLK_WORLD_48		= 208,
	SDLK_WORLD_49		= 209,
	SDLK_WORLD_50		= 210,
	SDLK_WORLD_51		= 211,
	SDLK_WORLD_52		= 212,
	SDLK_WORLD_53		= 213,
	SDLK_WORLD_54		= 214,
	SDLK_WORLD_55		= 215,
	SDLK_WORLD_56		= 216,
	SDLK_WORLD_57		= 217,
	SDLK_WORLD_58		= 218,
	SDLK_WORLD_59		= 219,
	SDLK_WORLD_60		= 220,
	SDLK_WORLD_61		= 221,
	SDLK_WORLD_62		= 222,
	SDLK_WORLD_63		= 223,
	SDLK_WORLD_64		= 224,
	SDLK_WORLD_65		= 225,
	SDLK_WORLD_66		= 226,
	SDLK_WORLD_67		= 227,
	SDLK_WORLD_68		= 228,
	SDLK_WORLD_69		= 229,
	SDLK_WORLD_70		= 230,
	SDLK_WORLD_71		= 231,
	SDLK_WORLD_72		= 232,
	SDLK_WORLD_73		= 233,
	SDLK_WORLD_74		= 234,
	SDLK_WORLD_75		= 235,
	SDLK_WORLD_76		= 236,
	SDLK_WORLD_77		= 237,
	SDLK_WORLD_78		= 238,
	SDLK_WORLD_79		= 239,
	SDLK_WORLD_80		= 240,
	SDLK_WORLD_81		= 241,
	SDLK_WORLD_82		= 242,
	SDLK_WORLD_83		= 243,
	SDLK_WORLD_84		= 244,
	SDLK_WORLD_85		= 245,
	SDLK_WORLD_86		= 246,
	SDLK_WORLD_87		= 247,
	SDLK_WORLD_88		= 248,
	SDLK_WORLD_89		= 249,
	SDLK_WORLD_90		= 250,
	SDLK_WORLD_91		= 251,
	SDLK_WORLD_92		= 252,
	SDLK_WORLD_93		= 253,
	SDLK_WORLD_94		= 254,
	SDLK_WORLD_95		= 255,		/* 0xFF */

	/* Numeric keypad */
	SDLK_KP0		= 256,
	SDLK_KP1		= 257,
	SDLK_KP2		= 258,
	SDLK_KP3		= 259,
	SDLK_KP4		= 260,
	SDLK_KP5		= 261,
	SDLK_KP6		= 262,
	SDLK_KP7		= 263,
	SDLK_KP8		= 264,
	SDLK_KP9		= 265,
	SDLK_KP_PERIOD		= 266,
	SDLK_KP_DIVIDE		= 267,
	SDLK_KP_MULTIPLY	= 268,
	SDLK_KP_MINUS		= 269,
	SDLK_KP_PLUS		= 270,
	SDLK_KP_ENTER		= 271,
	SDLK_KP_EQUALS		= 272,

	/* Arrows + Home/End pad */
	SDLK_UP			= 273,
	SDLK_DOWN		= 274,
	SDLK_RIGHT		= 275,
	SDLK_LEFT		= 276,
	SDLK_INSERT		= 277,
	SDLK_HOME		= 278,
	SDLK_END		= 279,
	SDLK_PAGEUP		= 280,
	SDLK_PAGEDOWN		= 281,

	/* Function keys */
	SDLK_F1			= 282,
	SDLK_F2			= 283,
	SDLK_F3			= 284,
	SDLK_F4			= 285,
	SDLK_F5			= 286,
	SDLK_F6			= 287,
	SDLK_F7			= 288,
	SDLK_F8			= 289,
	SDLK_F9			= 290,
	SDLK_F10		= 291,
	SDLK_F11		= 292,
	SDLK_F12		= 293,
	SDLK_F13		= 294,
	SDLK_F14		= 295,
	SDLK_F15		= 296,

	/* Key state modifier keys */
	SDLK_NUMLOCK		= 300,
	SDLK_CAPSLOCK		= 301,
	SDLK_SCROLLOCK		= 302,
	SDLK_RSHIFT		= 303,
	SDLK_LSHIFT		= 304,
	SDLK_RCTRL		= 305,
	SDLK_LCTRL		= 306,
	SDLK_RALT		= 307,
	SDLK_LALT		= 308,
	SDLK_RMETA		= 309,
	SDLK_LMETA		= 310,
	SDLK_LSUPER		= 311,		/* Left "Windows" key */
	SDLK_RSUPER		= 312,		/* Right "Windows" key */
	SDLK_MODE		= 313,		/* "Alt Gr" key */
	SDLK_COMPOSE		= 314,		/* Multi-key compose key */

	/* Miscellaneous function keys */
	SDLK_HELP		= 315,
	SDLK_PRINT		= 316,
	SDLK_SYSREQ		= 317,
	SDLK_BREAK		= 318,
	SDLK_MENU		= 319,
	SDLK_POWER		= 320,		/* Power Macintosh power key */
	SDLK_EURO		= 321,		/* Some european keyboards */

	/* Add any other keys here */

	SDLK_LAST
</pre>
<p>

<hr>

<h3><a name="cheats">Cheating Element: &lt;cheats&gt;</a></h3>

This element controls whether or not the engine will respond to the cheat codes;
it has these attributes:
<ul>
<li>on: it is <a href="#boolean">boolean</a> (default: false [cheating off])
</ul>
and this child element: &lt;keyword&gt;, which is for specifying the cheat keywords.
It has a mandatory attribute, "index", and some contained text, as with the text-string elements.
<p>
The cheat-code keywords and their defaults are
<ol type=1 start=1000>
<li>Energy (1x): NRG
<li>Oxygen: OTWO
<li>Map Everything: MAP
<li>Invisible: BYE
<li>Invincible: NUKE
<li>Infravision: SEE
<li>Extravision: WOW
<li>Pistol: MAG
<li>Assault Rifle: RIF
<li>Rocket Launcher: POW
<li>Flamethrower: TOAST
<li>Fusion Gun: MELT
<li>Shotgun: PUFF
<li>SMG: ZIP
<li>Alien weapon: PZBXAY
<li>All weapons' ammo: AMMO
<li>Jump: QWE
<li>Everything (almost): SHIT
<li>Save at this spot: YOURMOM
</ol>
<p>
For example, making the energy cheat into "JUICE" means setting up
<pre>
&lt;keyword index="0"&gt;JUICE&lt;/keyword&gt;
</pre>
<p>
Hold down control and type the cheat code in to activate it.
<hr>

<h3><a name="logging">Logging Configuration Element: &lt;logging&gt;</a></h3>

This element is used to configure Aleph One's logging behavior.  It has no attributes of its own.  Its single child element, &lt;logging_domain&gt;, requests particular logging behaviors for a logging domain.

<p>

The &lt;logging_domain&gt; element has the following attributes:

<ul>
<li>domain (string, required): names the logging domain whose behavior should be modified.  At the moment, the only logging domain is "global", in which all logging is currently done.
<li>threshhold (integer): only log messages at a level strictly lower than (i.e. less detailed than) the threshhold will appear.  See below for information about logging levels.
<li>show_locations (boolean): determines whether log entries will include source code filenames and line numbers.
<li>flush (boolean): determines whether output to the log file should be flushed after every log message (slower) or allowed to sit in a buffer for later writing (faster, but may fail to write log entries just before an application crash).
</ul>

The following are the currently-defined standard log levels:

<ul>
<li>logFatalLevel = 0: program must exit
<li>logErrorLevel = 10: can't do something significant
<li>logWarningLevel = 20: can continue but results could be really screwy
<li>logAnomalyLevel = 30: can continue, results could be off a little, but no big deal
<li>logNoteLevel = 40: something worth mentioning
<li>logTraceLevel = 50: details of actions and logic
<li>logDumpLevel = 60: values of data etc.
</ul>

Note that the &lt;threshhold&gt; attribute requires that the level be specified as an integer (but that it need not equal one of the standard levels), and further that log messages with level exactly equal to the threshhold level will NOT be seen.

<p>

Example:
<pre>
&lt;logging&gt;
&lt;logging_domain domain="global" threshhold="40" show_locations="true" flush="true"/&gt;
&lt;/logging&gt;
</pre>
This would set up the "global" logging domain such that only messages more important than "notes" would be seen; that source code filenames and line numbers would be included in the log; and that the log file would be flushed after every message, so a message logged just before an application crash would appear in the log file.

<p>

<hr>

<h3><a name="console">Console</a></h3>
The &lt;console&gt; tag controls messages typed into or printed to the screen. It has these attributes:

<ul>
<li>lua: <a href="#boolean">boolean</a>, enables a Lua interpreter in solo play, handy for debugging maps and scripts
</ul>

There are also child elements for macros and carnage messages:
<h4>Macros</h4>
Macros are substitutions performed on commands entered into the console. For instance, you can make a macro that changes &quot;.1&quot; into &quot;I&apos;ll defend&quot;. Macros can be used for chat, or to shorten other commands. Each macro child element has an input and an output attribute. To trigger the macro, type a dot immediately followed by the macro input into the console. 
<p>Macro inputs can be letters and numbers, but not spaces. Anything after the first space will remain unsubstituted. For instance, &quot;.1 you losers&quot; becomes &quot;I&apos;ll defend you losers&quot;
<p>
Example:
<pre>
&lt;console&gt;
&lt;macro input=&quot;1&quot; output=&quot;I'll defend&quot;/&gt;
&lt;/console&gt;
</pre>
<p>

<h4>Carnage Messages</h4>
Carnage messages are printed to the screen when a player is killed by himself or another player in a net game (assuming the gatherer has not disabled carnage messages). Each &lt;carnage_message&gt; tag has these attributes:
<ul>
<li>projectile_type: the type of projectile that triggers this message</li>
<li>on_kill: a string containing the message to print when one player kills another. In the string, %aggressor% will be replaced with the name of the player who did the killing, and %player% will be replaced with the name of the player who was killed.</li>
<li>on_suicide: a string containing the message to print when a player kills himself. In the string, %player% will be replaced with the name of the player who suicided.</li>
</ul>
A blank string (the default) results in nothing being printed.
<p>
Example:
<pre>
&lt;console&gt;
&lt;carnage_message projectile_type=&quot;14&quot; 
     on_kill=&quot;%aggressor% killed %player% with a SPNKR&quot; 
     on_suicide=&quot;%player% suicided with a SPNKR&quot;/&gt;
&lt;/console&gt;
</pre>
<hr>

<h3><a name="levelscripts">Level Scripting</a></h3>

Unlike most MML elements, a level-script element can only live in a map file,
and it must be TEXT resource 128 or some equivalent, in order for its parser
to know where to find it.
Its root element is &lt;marathon_levels&gt; and not
&lt;marathon&gt;, to distinguish it from the usual sort of MML.
<p>

It has child elements &lt;level&gt;, &lt;end&gt;, &lt;default&gt;, &lt;restore&gt;,
and &lt;end_screens&gt;,
all but the last one specify what individual level scripts to execute. The element &lt;level&gt;
has a mandatory attribute, "index", which specifies which level the script is for;
the first one is index 0.
The element &lt;end&gt; specifies a script that is for the end of a game;
The element &lt;default&gt; specifies a script that is for the entire map file;
it is executed before a level's script is executed, for rather obvious reasons.
The element &lt;restore&gt; is intended to restore parameters to their A1 defaults
when switching to another map file; this is done because the parameters that the MML parser sets
are set in a "sticky" fashion,
and because saving and restoring default values inside the code
would require a whole lot of extra coding.
<p>

These elements have child elements that specify the script entries;
the entries are executed in the order that they are specified in the file.
This means that music files played in sequential order will be played in the order
that they are specified in, the first in the list played first, etc.
<ul>
<li>&lt;mml&gt; executes the MML script in the resource specified in the value of the attribute "resource"
<li>&lt;music&gt; plays the music file specified in the value of the attribute "file"
<li>&lt;random_order&gt; has the <a href="#boolean">boolean</a> attribute "on", which indicates whether
the music files are to be played in random order;
if not (the default), they are played in looping sequence.
<li>&lt;movie&gt; plays at the beginning of a level the movie file
specified in the value of the attribute "file".
It has an optional attribute, "size" (default: 2),
which indicates how much the movie is to be scaled when playing back.
If this attribute is specified for level index <b>256</b>, this movie
will be played after completing the last level of the scenario.
<li>&lt;load_screen&gt; displays the file in the attribute "file" in place of the OpenGL loading progress dialog. An optional attribute "stretch" defaults to true, and says whether to ignore aspect ratio when scaling the image to fill the screen. Optional attributes "progress_left", "progress_top", "progress_right", and "progress_bottom" specify where to display an optional progress bar, in image co-ordinates. The progress bar will fill left to right if it is wider than it is high, and bottom to top if it is taller than it is wide. Lastly, two optional color child elements can be specified, indices 0 and 1, for background and foreground colors of the progress bar, respectively.
</ul>
<p>
Directoris and files are specified in Unix fashion, &lt;dirname&gt;/&lt;dirname&gt;/&lt;filename&gt;,
with a ':' being translated into a '/' in the MacOS.
The root directory for such specifications is the map file's parent directory,
so something like "Music/bang_my_head.mp3" means looking for file "bang_my_head.mp3"
in the directory "Music", which is in the same directory that the map file lives in.
<p>
Aleph One supports playing back MPEG-1 movies, and AIFF, WAV, Ogg/Vorbis, and mp3 music.
<p>

Finally, the &lt;end_screens&gt; element is for specifying which PICT resources
are to be used as the end-of-game screen displays.
This specification is done with these attributes:
<ul>
<li>index: which fake level-index value to use for the end of the game (default: 99);
all chapter screens have the resource ID (1500 + (level index)).
If there is more than one ending chapter screen, then this is for finding the first one.
<li>count: how many in sequence (default: 1), with resource ID's incremented by one for each one.
</ul>
<p>
You can also use &lt;load_screen&gt;, &lt;music&gt;, and &lt;random_order&gt; in a &lt;default_levels&gt; tag in regular &lt;marathon&gt; MML.
<hr>

<h3><a name="appendix1">Appendix 1: Additional Elements</a></h3>

<h4><a name="color">Colors</a></h4>

Colors are specified with the element &lt;color&gt;
colors may be either indexed (being list members), or non-indexed (being in isolation).
The color channels are red, green, and blue, with values that range from 0 to 1.
<ul>
<li>index (mandatory if indexed; must be absent if not indexed)
<li>red
<li>green
<li>blue
</ul>
All the color-channel attributes (red, green, blue) are mandatory.
This example makes color 7 be yellow:
<pre>
&lt;color index="7" red="1" green="1" blue="0"/&gt;
</pre>
<p>

<h4><a name="shape">Shapes</a></h4>

Shapes can be specified with the element &lt;shape&gt;.
A shape specification includes which collection, which color table,
and which sequence or frame; a shape may also be allowed to be blank.
A shape's attributes are
<ul>
<li>coll: which collection (0 to 31)
<li>clut: which color table; default is 0 (0 to 7)
<li>seq: which sequence (0 to 255)
<li>frame: like the above, included if the meaning of "frame" is clearer
in some context.
</ul>
A blank shape is specified as one having no attributes: &lt;shape/&gt;.
A non-blank shape requires the collection and sequence attributes,
and optionally the color-table attribute (default: 0).
<p>

<h4><a name="damage">Damage</a></h4>

Damage is specified with the element &lt;damage&gt;.
Damage features are set with these attributes, which are all optional.
<ul>
<li>type ("true" damage index; none is -1)
<li>flags (0 or 1 [is alien: weaker in easier difficulty levels])
<li>base
<li>random
<li>scale (1 = identity scaling)
</ul>
<p>

<h4><a name="font">Fonts</a></h4>

Fonts are specified with the element &lt;font&gt;
like colors, fonts may be either indexed (being list members), or non-indexed (being in isolation).
<ul>
<li>index (mandatory if indexed; must be absent if not indexed)
<li>name: the font name; it can be a series of names separated by commas or semicolons,
much like HTML font specifications.
If a series of the names, the engine will look for a font with the first name,
and then the second, and so forth, until it finds such a font.
<li>size: the font size in points (standard unit)
<li>style: the font style, which follows MacOS conventions; it is the sum of whichever of these
attributes are used:
<ul>
<li>1: Bold
<li>2: Italic
<li>4: Underline
<li>8: Outline
<li>16: Shadow
<li>32: Condense
<li>64: Extend
</ul>
Normal is none of these attributes, or 0.
<li>file: this is for SDL support, and indicate which font file to use.
</ul>
None of the font attributes proper are mandatory.
This example sets font 4 to the default font for the computer terminals.
<pre>
&lt;font index="4" name="Courier" size="12" style="0"/&gt;
</pre>
<p>


<h4><a name="boolean">Boolean data</a></h4>

This is not a separate element, but a kind of value of an attribute.
These values for a boolean attribute,
<ul>
<li>1
<li>t
<li>true
</ul>
indicate that a flag is to be on or an action is to be taken.
These values,
<ul>
<li>0
<li>f
<li>false
</ul>
indicate that a flag is to be off or an action is not to be taken.
<p>

<hr>

<h3><a name="appendix2">Appendix 2: Lists of Entity Types</a></h3>

The collections:
<ol type=1 start=1000>
<li>Interface
<li>Weapons in Hand
<li>Juggernaut
<li>Tick
<li>Explosion Effects
<li>Hunter
<li>Player
<li>Items
<li>Trooper
<li>Pfhor Fighter
<li>S'pht'Kr
<li>F'lickta
<li>Bob
<li>VacBob
<li>Enforcer
<li>Drone
<li>S'pht
<li>Walls - Water
<li>Walls - Lava
<li>Walls - Sewage
<li>Walls - Jjaro
<li>Walls - Pfhor
<li>Scenery - Water
<li>Scenery - Lava
<li>Scenery - Sewage
<li>Scenery - Jjaro
<li>Scenery - Pfhor
<li>Landscape - Day
<li>Landscape - Night
<li>Landscape - Moon
<li>Landscape - Outer Space
<li>Cyborg
</ol>
<p>

The monsters:
<ol type=1 start=1000>
<li>Player
<li>Tick - Energy
<li>Tick - Oxygen
<li>Tick - Kamikaze
<li>S'pht - Minor
<li>S'pht - Major
<li>S'pht - Minor Invisible
<li>S'pht - Major Invisible
<li>Pfhor Fighter - Minor
<li>Pfhor Fighter - Major
<li>Pfhor Fighter - Minor Projectile
<li>Pfhor Fighter - Major Projectile
<li>Bob - Crew
<li>Bob - Science
<li>Bob - Security
<li>Bob - Bad
<li>Drone - Minor
<li>Drone - Major
<li>Drone - Big Minor
<li>Drone - Big Major
<li>Drone - Subverted
<li>Cyborg - Minor
<li>Cyborg - Major
<li>Cyborg - Minor Flame
<li>Cyborg - Major Flame
<li>Enforcer - Minor
<li>Enforcer - Major
<li>Hunter - Minor
<li>Hunter - Major
<li>Trooper - Minor
<li>Trooper - Major
<li>Mother of All Cyborgs
<li>Mother of All Hunters
<li>F'lickta - Sewage
<li>F'lickta - Water
<li>F'lickta - Lava
<li>S'pht'Kr - Minor
<li>S'pht'Kr - Major
<li>Juggernaut - Minor
<li>Juggernaut - Major
<li>Tiny Fighter
<li>Tiny Bob
<li>Tiny F'lickta
<li>VacBob - Crew
<li>VacBob - Science
<li>VacBob - Security
<li>VacBob - Bad
</ol>
<p>

The items to be picked up:
<ol type=1 start=1000>
<li>Knife (apparently some placeholder item for "nothing")
<li>Pistol
<li>Pistol Ammo
<li>Fusion Pistol
<li>Fusion Pistol Ammo
<li>Assault Rifle
<li>Assault Rifle Bullets
<li>Assault Rifle Grenades
<li>Rocket Launcher
<li>Rockets
<li>Invisibility Powerup
<li>Invincibility Powerup
<li>Infravision Powerup
<li>Alien Weapon
<li>Alien Weapon Ammo
<li>Flamethrower
<li>Flamethrower Ammo
<li>Extravision Powerup
<li>Oxygen Powerup
<li>Energy Powerup x1
<li>Energy Powerup x2
<li>Energy Powerup x3
<li>Shotgun
<li>Shotgun Ammo
<li>S'pht Door Key
<li>Uplink Chip
<li>Light Blue Ball
<li>Red Ball (the skull)
<li>Violet Ball
<li>Yellow Ball
<li>Brown Ball
<li>Orange Ball
<li>Blue Ball
<li>Green Ball
<li>SMG
<li>SMG Ammo
</ol>
<p>

The weapons:
<ol type=1 start=1000>
<li>Fist
<li>Pistol
<li>Fusion Pistol
<li>Assault Rifle
<li>Rocket Launcher
<li>Flamethrower
<li>Alien Weapon
<li>Shotgun
<li>Ball
<li>SMG
</ol>
<p>

The projectiles:
<ol type=1 start=1000>
<li>Rocket
<li>Grenade
<li>Pistol Bullet
<li>Rifle Bullet
<li>Shotgun Bullet
<li>Staff Hit
<li>Staff Bolt
<li>Flamethrower Flames
<li>S'pht Bolt - Minor
<li>S'pht Bolt - Major (Seeking)
<li>Alien-Weapon Bolt
<li>Fusion Bolt - Minor
<li>Fusion Bolt - Major
<li>Hunter Bolt
<li>Fist Punch
<li>Armageddon Sphere
<li>Armageddon Electricity
<li>Juggernaut Rocket
<li>Trooper Bullet
<li>Trooper Grenade
<li>S'pht'Kr Bolt - Minor
<li>S'pht'Kr Bolt - Major
<li>Juggernaut Missile
<li>Energy Drain - Minor
<li>Energy Drain - Major
<li>Oxygen Drain
<li>Drone Bolt - Minor
<li>Drone Bolt - Major
<li>Drone Bolt - Subverted
<li>Grenade - Minor Cyborg (Bouncing)
<li>Grenade - Major Cyborg (Seeking)
<li>Ball
<li>Dispersal - Minor Fusion
<li>Dispersal - Major Fusion
<li>Dispersal - Overloaded Fusion
<li>F'lickta Claw
<li>F'lickta Glob
<li>F'lickta Lava Glob
<li>SMG Bullet
</ol>
<p>

The effects:
<ol type=1 start=1000>
<li>Rocket Explosion
<li>Rocket Contrail
<li>Grenade Explosion
<li>Grenade Contrail
<li>Bullet Impact
<li>Alien Weapon Impact
<li>Flamethrower Flame
<li>Pfhor Hit
<li>Player Hit
<li>Bob Hit
<li>Bad Bob Hit
<li>Enforcer Hit
<li>S'pht Bolt Minor Impact
<li>S'pht Bolt Major Impact
<li>S'pht Bolt Major Contrail
<li>Pfhor Projectile Impact
<li>Pfhor Melee Hit
<li>Hunter Projectile Detonation
<li>Hunter Hit
<li>Minor Fusion Impact
<li>Major Fusion Impact
<li>Major Fusion Contrail
<li>Fist Hit
<li>Minor S'pht'Kr Impact
<li>Minor S'pht'Kr Impact
<li>S'pht'Kr Hit
<li>Trooper Hit
<li>Water Lamp Breaking
<li>Lava Lamp Breaking
<li>Sewage Lamp Breaking
<li>Pfhor Lamp Breaking
<li>Clank (melee hit)
<li>Teleport In
<li>Teleport Out
<li>Small Water Splash
<li>Medium Water Splash
<li>Large Water Splash
<li>Large Water Emergence
<li>Small Lava Splash
<li>Medium Lava Splash
<li>Large Lava Splash
<li>Large Lava Emergence
<li>Small Sewage Splash
<li>Medium Sewage Splash
<li>Large Sewage Splash
<li>Large Sewage Emergence
<li>Small Goo Splash
<li>Medium Goo Splash
<li>Large Goo Splash
<li>Large Goo Emergence
<li>Minor Drone Projectile Impact
<li>Major Drone Projectile Impact
<li>Subverted Drone Projectile Impact
<li>Drone Hit
<li>Cyborg Projectile Explosion
<li>Cyborg Hit
<li>Minor Fusion Dispersal
<li>Major Fusion Dispersal
<li>Overloaded Fusion Dispersal
<li>Sewage F'lickta Hit
<li>Sewage F'lickta Projectile Hit
<li>Water F'lickta Hit
<li>Lava F'lickta Hit
<li>Lava F'lickta Projectile Hit
<li>F'lickta Claw
<li>Juggernaut Hit
<li>Juggernaut Missile Contrail
<li>Small Jjaro Splash
<li>Medium Jjaro Splash
<li>Large Jjaro Splash
<li>Large Jjaro Emergence
<li>VacBob Hit
<li>Bad VacBob Hit
</ol>
<p>

Player-damage types (out of order from "true" damage types):
<ol type=1 start=1000>
<li>Explosion
<li>Crushing
<li>Bullet
<li>Shotgun Bullet
<li>Electrical Staff
<li>Hulk Slap
<li>Absorbed
<li>Teleporter
<li>Flame
<li>Hound Claws
<li>S'pht Bolt
<li>Alien-Weapon Bolt
<li>Hunter Bolt
<li>Fusion Bolt
<li>Fist
<li>F'lickta Claws
<li>F'lickta Glob
<li>S'pht'Kr Bolt
<li>Lava
<li>Goo
<li>Suffocation
<li>Energy Drain
<li>Oxygen Drain
<li>Drone Bolt
</ol>
<p>

"True" damage types:
<ol type=1 start=1000>
<li>Explosion
<li>Electrical Staff
<li>Bullet
<li>Absorbed
<li>Flame
<li>Hound Claws
<li>Alien-Weapon Bolt
<li>Hulk Slap
<li>S'pht Bolt
<li>Fusion Bolt
<li>Hunter Bolt
<li>Fist
<li>Teleporter
<li>S'pht'Kr Bolt
<li>F'lickta Claws
<li>F'lickta Glob
<li>Crushing
<li>Lava
<li>Suffocation
<li>Goo
<li>Energy Drain
<li>Oxygen Drain
<li>Drone Bolt
<li>Shotgun Bullet
</ol>
<p>

The faders:
<ol type=1 start=1000>
<li>Start Cinematic Fade In
<li>Cinematic Fade In
<li>Long Cinematic Fade In
<li>Cinematic Fade Out
<li>End Cinematic Fade Out
<li>Red (bullets, fists)
<li>Big Red (bigger bullets, fists)
<li>Picked Something Up
<li>Bright (teleporting)
<li>Long Bright (nuclear explosions)
<li>Yellow (explosions)
<li>Big Yellow (big explosions)
<li>Purple
<li>Cyan (Pfhor-staff/projectile hits)
<li>White (absorbed)
<li>Big White
<li>Orange (flamethrower)
<li>Long Orange (M1 lava)
<li>Green (Hunter projectile)
<li>Long Green (M1 goo)
<li>Static (S'pht projectile)
<li>Negative (minor fusion bolt)
<li>Big Negative (major fusion bolt)
<li>Flicker Negative (Drone bolt)
<li>Dodge Purple (alien weapon)
<li>Burn Cyan (Armageddon Beast electricity)
<li>Dodge Yellow (Armageddon Beast projectile)
<li>Burn Green (Hunter projectile)
<li>Tint Green (under goo)
<li>Tint Blue (under water)
<li>Tint Orange (under lava)
<li>Tint Gross (under sewage)
<li>Tint Jjaro (under JjaroGoo)
</ol>
<p>

The texture-mapping transfer modes:
<ol type=1 start=1000>
<li>Normal
<li>Fade Out to Black
<li>Invisibility
<li>Subtle Invisibility
<li>Pulsate
<li>Wobble
<li>Fast Wobble
<li>Static
<li>50% Static
<li>Landscape
<li>Smear
<li>Fade Out Static
<li>Pulsating Static
<li>Fold In
<li>Fold Out
<li>Horizontal Slide
<li>Fast Horizontal Slide
<li>Vertical Slide
<li>Fast Vertical Slide
<li>Wander
<li>Fast Wander
<li>Big Landscape
</ol>
<p>

The sounds:
<ol type=1 start=1000>
<li>Startup
<li>Teleport In
<li>Teleport Out
<li>Body Being Crunched
<li>Creak
<li>Absorbed
<li>Breathing
<li>Oxygen Warning
<li>Suffocation
<li>Energy Refuel
<li>Oxygen Refuel
<li>Can't Toggle Switch
<li>Switch On
<li>Switch Off
<li>Puzzle Switch
<li>Chip Insertion
<li>Pattern Buffer
<li>Destroy Control Panel
<li>Adjust Volume
<li>Got Powerup
<li>Got Item
<li>Bullet Ricochet
<li>Metallic Ricochet
<li>Empty Gun
<li>S'pht Door Opening
<li>S'pht Door Closing
<li>S'pht Door Obstructed
<li>S'pht Platform Starting
<li>S'pht Platform Stopping
<li>Loon
<li>SMG Firing
<li>SMG Reloading
<li>Heavy S'pht Platform Starting
<li>Heavy S'pht Platform Stopping
<li>Fist Hitting
<li>Pistol Firing
<li>Pistol Reloading
<li>Assault Rifle Firing
<li>Grenade Launcher Firing
<li>Grenade Exploding
<li>Grenade Flyby
<li>Fusion Firing
<li>Fusion Exploding
<li>Fusion Flyby
<li>Fusion Charging
<li>Rocket Exploding
<li>Rocket Flyby
<li>Rocket Firing
<li>Flamethrower
<li>Body Falling
<li>Body Exploding
<li>Bullet Hitting Flesh
<li>Fighter Activate
<li>Fighter Wail
<li>Fighter Scream
<li>Fighter Chatter
<li>Fighter Attack
<li>Fighter Projectile Hit
<li>Fighter Projectile Flyby
<li>S'pht Attack
<li>S'pht Death
<li>S'pht Hit
<li>S'pht Projectile Flyby
<li>S'pht Projectile Hit
<li>Cyborg Moving
<li>Cyborg Attack
<li>Cyborg Hit
<li>Cyborg Death
<li>Cyborg Projectile Bounce
<li>Cyborg Projectile Hit
<li>Cyborg Projectile Flyby
<li>Drone Activate
<li>Drone Start Attack
<li>Drone Attack
<li>Drone Dying
<li>Drone Death
<li>Drone Projectile Hit
<li>Drone Projectile Flyby
<li>Bob Wail
<li>Bob Scream
<li>Bob Hit
<li>Bob Chatter
<li>Bad Bob Chatter
<li>Bob Trash Talk
<li>Bob Apology
<li>Bob Activation
<li>Bob Clear
<li>Bob Stop Shooting Me, You Bastard
<li>Bob Area Secure
<li>Bob Kill the Player
<li>Water
<li>Sewage
<li>Lava
<li>Goo
<li>Under Liquids
<li>Wind
<li>Waterfall
<li>Siren
<li>Fan
<li>S'pht Door
<li>S'pht Platform
<li>Alien Harmonics
<li>Heavy S'pht Platform
<li>Light Machinery
<li>Heavy Machinery
<li>Transformer
<li>Sparking Transformer
<li>Water Drip
<li>Walking in Water
<li>Exit Water
<li>Enter Water
<li>Small Water Splash
<li>Medium Water Splash
<li>Large Water Splash
<li>Walking in Lava
<li>Enter Lava
<li>Exit Lava
<li>Small Lava Splash
<li>Medium Lava Splash
<li>Large Lava Splash
<li>Walking in Sewage
<li>Exit Sewage
<li>Enter Sewage
<li>Small Sewage Splash
<li>Medium Sewage Splash
<li>Large Sewage Splash
<li>Walking in Goo
<li>Exit Goo
<li>Enter Goo
<li>Small Goo Splash
<li>Medium Goo Splash
<li>Large Goo Splash
<li>Major Fusion Firing
<li>Major Fusion Charged
<li>Assault Rifle Reloading
<li>Assault Rifle Shell Casings
<li>Shotgun Firing
<li>Shotgun Reloading
<li>Ball Bounce
<li>You Are It
<li>Got Ball
<li>Computer interface Logon
<li>Computer interface Logout
<li>Computer interface Page
<li>Heavy S'pht Door
<li>Heavy S'pht Door Opening
<li>Heavy S'pht Door Closing
<li>Heavy S'pht Door Open
<li>Heavy S'pht Door Closed
<li>Heavy S'pht Door Obstructed
<li>Hunter Activate
<li>Hunter Attack
<li>Hunter Dying
<li>Hunter Landing
<li>Hunter Exploding
<li>Hunter Projectile Hit
<li>Hunter Projectile Flyby
<li>Enforcer Activate
<li>Enforcer Attack
<li>Enforcer Projectile Hit
<li>Enforcer Projectile Flyby
<li>F'lickta Melee Attack
<li>F'lickta Melee Attack Hit
<li>F'lickta Projectile Attack
<li>F'lickta Projectile Sewage Attack Hit
<li>F'lickta Projectile Sewage Flyby
<li>F'lickta Projectile Lava Attack Hit
<li>F'lickta Projectile Lava Flyby
<li>F'lickta Dying
<li>Machine Binder
<li>Machine Bookpress
<li>Machine Puncher
<li>Electric
<li>Alarm
<li>Night Wind
<li>Surface Explosion
<li>Underground Explosion
<li>S'pht'Kr Attack
<li>S'pht'Kr Hit
<li>S'pht'Kr Flyby
<li>S'pht'Kr Being Hit
<li>S'pht'Kr Exploding
<li>Tick Chatter
<li>Tick Falling
<li>Tick Flapping
<li>Tick Exploding
<li>Ceiling Lamp Exploding
<li>Pfhor Platform Starting
<li>Pfhor Platform Stopping
<li>Pfhor Platform
<li>Pfhor Door Opening
<li>Pfhor Door Closing
<li>Pfhor Door Obstructed
<li>Pfhor Door
<li>Pfhor Switch Off
<li>Pfhor Switch On
<li>Juggernaut Firing
<li>Juggernaut Warning
<li>Juggernaut Exploding
<li>Juggernaut Preparing to Fire
<li>Enforcer Exploding
<li>Alien Noise 1
<li>Alien Noise 2
<li>VacBob Wail
<li>VacBob Scream
<li>VacBob Hit
<li>VacBob Chatter
<li>Bad VacBob Chatter
<li>VacBob Trash Talk
<li>VacBob Apology
<li>VacBob Activation
<li>VacBob Clear
<li>VacBob Stop Shooting Me, You Bastard
<li>VacBob Area Secure
<li>VacBob Kill the Player
</ol>
<p>

</body>
</html>