Introduction

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. On the MacOS version of Aleph One, MML scripts are stored as TEXT resources in the Aleph One app which are accessed in increasing order of ID. On the SDL version of Aleph One, the scripts are stored in "MML" subdirectories of the local and 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).

For more on XML, check out these links:

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.

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.

Here is the format:

Marathon Root Element: <marathon>

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 <maralevel index="value">.

This element has no attributes and contains these child elements:


String-Set Element: <stringset>

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: This element contains child elements with form <string>, 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:
<!-- STR# Resource: "Filenames" -->
<stringset index="129">
<string index="0">Shapes</string>
<string index="1">Shapes.16</string>
<string index="2">Sounds</string>
<string index="3">Sounds.16</string>
<string index="4">Aleph One Preferences</string>
<string index="5">Map</string>
<string index="6">Untitled Game</string>
<string index="7">Marathon</string>
<string index="8">Aleph One Recording</string>
<string index="9">Physics Model</string>
<string index="10">Music</string>
<string index="11">Images</string>
<string index="12">Movie</string>
</stringset>

Interface-Stuff Element: <interface>

This kind of element specifies stuff used in the heads-up display (HUD). It has one attribute, "motion_sensor", which is boolean, 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:

Here is a list of all the interface rectangles:

  1. Player Name
  2. Oxygen
  3. Shield
  4. Motion Sensor
  5. Microphone
  6. Inventory
  7. Weapon Display
  8. New-Game Button
  9. Load-Game Button
  10. Gather Button
  11. Join Button
  12. Preferences Button
  13. Replay Button
  14. Save-Last Button
  15. Replace-Saved Button
  16. Credits Button
  17. Quit Button
  18. Center Button

Here is a list of all the interface colors:

  1. Ammo Box-Display Full
  2. Ammo Box-Display Empty
  3. Black
  4. Inventory Text
  5. Inventory Header Background
  6. Inventory Background
  7. Slate Player
  8. Red Player
  9. Violet Player
  10. Yellow Player
  11. White Player
  12. Orange Player
  13. Blue Player
  14. Green Player
  15. White
  16. Invalid Weapon
  17. Computer Border-Text background
  18. Computer Border Text
  19. Computer Text
  20. Computer White Text
  21. Computer Red Text
  22. Computer Dark Green Text
  23. Computer Cyan Text
  24. Computer Yellow Text
  25. Computer Dark Red Text
  26. Computer Blue Text
Here is a list of all the interface fonts:
  1. Interface
  2. Weapon Name
  3. Player Name
  4. Interface Item Count
  5. Terminal
  6. Terminal Title
  7. Network Statistics
Here is a list of all the weapon displays:
  1. Knife (seems to be a placeholder for wielding no weapon)
  2. Pistol
  3. Fusion Pistol
  4. Assault Rifle
  5. Rocket Launcher
  6. Flamethrower
  7. Alien Weapon
  8. Shotgun
  9. Ball
  10. SMG


Motion-Sensor Element: <motion_sensor>

This kind of element is for assigning motion-sensor features; the assignment is done by doing <assign>, which has attributes "monster" (which one of these in the list) and "type", which is
  1. Self, Friendly Player, and Bob
  2. Alien
  3. Hostile Player

One can disable it by specifying that the top-level element <interface> has attribute "motion_sensor" with value "false".


Overhead-Map Element: <overhead_map>

This kind of element is for setting up overhead-map features. It can have an attribute of "mode", which has possible values:
  1. Normal: automapping is cumulative (the default)
  2. Currently visible only
  3. All

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

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.

Thus, one assigns live monsters with <assign_live> and dead ones with <assign_dead>. 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:

One can display additional stuff by specifying an appropriate element; this elements have an attribute of "on", which is a boolean value.

Lines can be specified with the element <line>, which has these attributes, all mandatory:

Colors can be specified with the element <color>, which is indexed; For more on specifying colors, go here. Here are what the colors are:
  1. Plain polygon
  2. Platform
  3. Water
  4. Lava
  5. Sewage
  6. JjaroGoo
  7. PfhorSlime
  8. Hill
  9. Solid Line
  10. Elevation Line
  11. Control Panel
  12. Bob Display
  13. Monster Display
  14. Item Display
  15. Projectile Display
  16. Checkpoint Display
  17. Annotation
  18. Map Title
  19. Path
  20. Minor Ouch
  21. Major Ouch

Fonts can be specified with the element <font>, which is indexed; For more on specifying fonts, go here. Here are what the fonts are:

  1. Annotation at scale 0 (lowest)
  2. Annotation at scale 1
  3. Annotation at scale 2
  4. Annotation at scale 3 (highest)
  5. Map title
One can disable it by specifying that the top-level element <view> has attribute "map" with value "false".


Infravision Element: <infravision>

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 <assign>, which has the attributes "coll" (for collection) and "color" (for which one of the colors). Here are the default colors:
  1. Aliens (red)
  2. Friends and Items (green)
  3. Walls and Scenery, also the S'pht (blue)
  4. Player Stuff and Explosion Effects (yellow)
Colors can be specified with the element <color>, which is indexed; For more on specifying colors, go here.


Animated-Textures Element: <animated_textures>

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:

a - a b c a b c ...
b - b c a b c a ...
c - c a b c a b ...

This element has two kinds of child elements, <clear> and <sequence>.

The first one, <clear>, 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.

The second one, <sequence>, specifies the sequences themselves. It takes these attributes:

This one also contains a child element, <frame>, 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.


Control-Panels Element: <control_panels>

This kind of element specifies various control-panel features, such as what kind it is, what items it accepts, and so forth. Each kind of control panel is specified with the child element <panel>, which has these attributes: 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).

The map files themselves reference control panels by definition; here are the default control-panel definitions:

  1. Water: Oxygen Refuel
  2. Water: Energy Refuel (1x)
  3. Water: Energy Refuel (2x)
  4. Water: Tag Switch (Accepts Chip)
  5. Water: Light Switch
  6. Water: Platform Switch
  7. Water: Tag Switch
  8. Water: Pattern Buffer
  9. Water: Computer Terminal
  10. Water: Tag Switch (Destroyable)
  11. Lava: Energy Refuel (1x)
  12. Lava: Energy Refuel (2x)
  13. Lava: Energy Refuel (3x)
  14. Lava: Light Switch
  15. Lava: Platform Switch
  16. Lava: Tag Switch
  17. Lava: Pattern Buffer
  18. Lava: Computer Terminal
  19. Lava: Oxygen Refuel
  20. Lava: Tag Switch (Accepts Chip)
  21. Lava: Tag Switch (Destroyable)
  22. Sewage: Energy Refuel (1x)
  23. Sewage: Energy Refuel (2x)
  24. Sewage: Energy Refuel (3x)
  25. Sewage: Light Switch
  26. Sewage: Platform Switch
  27. Sewage: Tag Switch
  28. Sewage: Pattern Buffer
  29. Sewage: Computer Terminal
  30. Sewage: Oxygen Refuel
  31. Sewage: Tag Switch (Accepts Chip)
  32. Sewage: Tag Switch (Destroyable)
  33. Pfhor: Energy Refuel (1x)
  34. Pfhor: Energy Refuel (2x)
  35. Pfhor: Energy Refuel (3x)
  36. Pfhor: Light Switch
  37. Pfhor: Platform Switch
  38. Pfhor: Tag Switch
  39. Pfhor: Pattern Buffer
  40. Pfhor: Computer Terminal
  41. Pfhor: Oxygen Refuel
  42. Pfhor: Tag Switch (Accepts Chip)
  43. Pfhor: Tag Switch (Destroyable)
  44. Jjaro: Energy Refuel (1x)
  45. Jjaro: Energy Refuel (2x)
  46. Jjaro: Energy Refuel (3x)
  47. Jjaro: Light Switch
  48. Jjaro: Platform Switch
  49. Jjaro: Tag Switch
  50. Jjaro: Pattern Buffer
  51. Jjaro: Computer Terminal
  52. Jjaro: Oxygen Refuel
  53. Jjaro: Tag Switch (Accepts Chip)
  54. Jjaro: Tag Switch (Destroyable)

The control panels can do various things; these are:

  1. Oxygen Refuel
  2. Energy Refuel (1x)
  3. Energy Refuel (2x)
  4. Energy Refuel (3x)
  5. Light switch
  6. Platform switch
  7. Tag switch
  8. Pattern buffer (for saving games)
  9. Computer terminal

The sound types are:

  1. Activating
  2. Deactivating
  3. Unusable


Platforms Element: <platforms>

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 <platform> child element, which has these attributes: The index is which one of these platform types:
  1. S'pht Door
  2. S'pht Split Door
  3. Locked S'pht Door
  4. S'pht Platform
  5. Noisy S'pht Platform
  6. Heavy S'pht Door
  7. Pfhor Door
  8. Heavy S'pht Platform
  9. Pfhor Platform
This element also has child element <damage> (how much damage; it is described in greater detail here),


Liquids (Medias) Element: <liquids>

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 <liquid> child element, which has these attributes: The index value is which one of these liquid types:
  1. Water
  2. Lava
  3. Pfhor
  4. Sewage
  5. Jjaro
while the "submerged" value is which one of these liquid types
  1. Water
  2. Lava
  3. Sewage
  4. Jjaro
  5. Pfhor
This element also has child elements <damage> (how much damage; it is described in greater detail here), <effect> and <sound>. 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).

The effects:

  1. Small Detonation
  2. Medium Detonation
  3. Large Detonation
  4. Large Emergence

The sounds:

  1. Feet Entering
  2. Feet Leaving
  3. Head Entering
  4. Head Leaving
  5. Splashing
  6. Ambient Over
  7. Ambient Under
  8. Platform Entering
  9. Platform Leaving


Sounds Element: <sounds>

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:

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 <ambient> and <random>. Each of them has these attributes, both mandatory:

The ambient sounds are:
  1. Water
  2. Sewage
  3. Lava
  4. Goo
  5. Under Liquids
  6. Wind
  7. Waterfall
  8. Siren
  9. Fan
  10. S'pht Door
  11. S'pht Platform
  12. Heavy S'pht Door
  13. Heavy S'pht Platform
  14. Light Machinery
  15. Heavy Machinery
  16. Transformer
  17. Sparking Transformer
  18. Machine Binder
  19. Machine Bookpress
  20. Machine Puncher
  21. Electric
  22. Alarm
  23. Night Wind
  24. Pfhor Door
  25. Pfhor Platform
  26. Alien Noise 1
  27. Alien Noise 2
  28. Alien Harmonics
The random sounds are:
  1. Water Drip
  2. Surface Explosion
  3. Underground Explosion
  4. Loon
  5. Creak

The external sounds are specified with the child element <sound>, which has these attributes: