Marathon Mapmaking: Snafus & Solutions

This is an advanced content creation guide for Marathon Aleph One, an open-source engine based on Bungie’s groundbreaking 1994-1996 first-person shooter trilogy (not its upcoming extraction shooter). It contains far more information than beginners will need (or even want) to know. If you’re just getting started, bookmark this page so you can return here when you’ve mastered the basics; then, consult my beginner’s guide for:

Meanwhile, this guide contains overviews of both common and uncommon problems creators may face (and solutions thereto). It’s meant to help troubleshoot several problems with Marathon content creation that, as far as I know, aren’t documented anywhere else well, if at all.

I’ve been reorganizing this guide into smaller, more digestible pages, though I’m mostly finished now – apologies for the inconvenience, but the ultimate form should be both more accessible and more logically organized.

Should you have any suggestions for improvements to this guide or notice any errors, please either contact me or submit to this page’s GitHub repository. (If you’d like to be credited, please let me know.)

Table of Contents

  1. Introduction
  2. Table of Contents (you’re looking at it?)
  3. General
  4. Mapmaking
    1. General Notes
    2. Aleph One Documentation Errata
    3. Scripts, Monster Limits, & Music
    4. Ambient Sound
    5. Marathon 1 Legacy Compatibility
      1. Those Weird Marathon 1 Polygon Types
      2. Marathon 1 Mission Types
      3. Marathon 1 Compatibility Flags
    6. 8-bit Software Mode
      1. The Images File
      2. Chapter Screens
    7. Directionality
  5. ShapeFusion
    1. General
    2. Restrictions on Number of Colors
    3. Transparency & Landscapes
    4. Sequence Timing & Film Compatibility
    5. ‘Weapons in Hand’ Sequences
  6. Appendices & Transplanted Content
  7. Acknowledgements
  8. Endnotes

Mapmaking

General Notes

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Aleph One Documentation Errata

Aleph One’s documentation is largely accurate, but it does have a few errors. In the Lua documentation:

Scripts, Monster Limits, & Music

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Ambient Sound

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Marathon 1 Legacy Compatibility

Those Weird Marathon 1 Polygon Types

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Marathon 1 Mission Types

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Marathon 1 Compatibility Flags

All of these are found under SpecialLevel ParametersM1 Compatibility.

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

8-bit Software Mode

Aleph One 1.4 restored 8-bit software mode after it had been unavailable for over a decade. This causes potential havoc in territory related to both ShapeFusion (shapes sequences) and Atque (images files, map resources). I address the latter immediately below; see the ShapeFusion section further below for the former.

Chapter Screens & Sounds

Aleph One won’t display a chapter screen in 8-bit software mode unless it has an associated CLUT resource sharing the chapter screen’s resource ID. Make sure to include these if you care about 8-bit software mode at all. Chapter screens go from 1500 (for level 0) to 1599 (for the end screen or, God help us all, level 99). Add 10,000 for ‘24-bit’ versions and (I found this one out the hard way – by noticing it after a scenario release) 20,000 for ‘32-bit’ versions. (This effectively makes 115xx and 215xx unusable if you have a level xx – but I’m not sure if Aleph One will ever display the 115xx picture when the 215xx exists, so if you use 215xx for the chapter screen, you might be able to get away with using 115xx for a terminal picture.)

Also, if there’s an associated sound sharing the 15xx ID, Aleph One will play it. This includes ending screens (though Aleph One also plays the music file, so it’s probably not worth including a sound 1599 unless you plan for your scenario not to have opening music).

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

The Images File

The Images file should have at least images 1100 and 1101 (‘enabled’ and ‘disabled’ versions of the main menu) and 1700 (the vanilla HUD). It also needs CLUT resources with the same IDs. If it lacks images 1100 and 1101 (and their accompanying CLUTs), the menu will show up black if a player selects 8-bit software, and if they then quit the game, they’ll either need to delete their scenario preferences or manually edit them to fix the graphics settings (on the very slim chance they even know how to do this) – which will effectively render the scenario unplayable for many players.

For full reference, the resources in Images correspond to the following:

Add 1,000 to each of these numbers for the ‘24-bit’ versions. It’s ideal to have separate 8-bit and 24-bit versions, as IIRC, Photoshop and GIMP dither images much better than Aleph One does.

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Directionality

Angles in Weland can vary in two, not three, but four different ways. Its representation of objects’ angles corresponds to the game’s representation of the player’s yaw (non-vertical angle)⁽²⁾.

Angle Yaw Objects Sounds Liquids Lines
Faces east Faces east From west East to west West to east
90° Faces south Faces south From north South to north South to north
180° Faces west Faces west From east West to east East to west
270° Faces north Faces north From south North to south North to south

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

ShapeFusion

General

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Restrictions on Number of Colors

Palettes (also called CLUTs, short for Color Look-Up Tables, the name for these resources in MacOS’ resource fork in the classic OS) can pose particular problems. One particular issue occurs with non-standard CLUTs.

  1. We’re restricted to 256 colors not just within one palette but across all eight palettes within a collection. If there are more than 256, then once it runs out, Aleph One will simply use the closest color it encounters among the first 256.
  2. Aleph One counts colors that are imperceptibly different as separate colors. For instance, it regards #0100FF (red 1, green 0, blue 255) as different from #0200FF (red 2, green 0, blue 255).
  3. Unlike Anvil (which tried to restrict itself to vanilla-safe colors unless you specifically enabled a setting to override this), ShapeFusion isn’t guaranteed to use the same colors each time it creates a color ramp unless each ramp starts and ends with the same colors and contains the same number of colors.

It’s a mess. Two ways to ensure you’re getting the 256 colors you want:

  1. Export all color tables in a collection to GIMP format (.gpl) and go through them with a fine-toothed comb. GIMP palettes are human-readable and can be edited in any text editor; each color is simply listed in RGB format, with values ranging from 0 to 255 for all three colors. After weeding out the unwanted near-identical colors across palettes, save and reimport.
  2. Simply use all 256 colors you want in CLUT 0 and rearrange them as desired in the others if needed. Be warned, however, that ShapeFusion currently has no option to reduce the number of colors per CLUT, should you decide you want fewer. You’d currently need to open the shapes file in Anvil or Hakvil (using an emulator or a classic Mac) and adjust the palettes there.

Note that using more than 253 colors across all 8-bit palettes in a shapes file can look very, very stupid in 8-bit software mode, in case anyone even cares about that in 2024. I don’t actually know how 8-bit software mode selects colors, but sticking strictly to vanilla colors averts the issue. To that end, I’ve compiled the safe colors for Marathon 1 and Marathon 2/. (To be clear: use M1 colors for M1 shapes and M2/ colors for M2/ shapes.)

The other possibility is to pick a set of 253 colors and ensure that every “8-bit color version” sticks exclusively to those colors. This is more challenging, since you’ll have to edit every existing 8-bit palette in your shapes file, but it can result in a distinctive aesthetic.

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Transparency & Landscapes

Marathon counts the first three colors of each CLUT as transparent, whether you want it to or not. Why does it need three? Why not just one? In all likelihood, only Jason Jones might be able to answer this question, assuming he even remembers the answer. This poses problems with custom landscape CLUTs. Why do landscapes even have transparency? Another question Jason Jones probably doesn’t recall the answer to. The first three colors in a landscape CLUT are still considered transparent, and in OpenGL mode, Marathon changes anything it regards as transparent to show up as white.

As a result, for all practical purposes, landscape CLUTs are restricted to 253 colors, so when generating landscape CLUTs, you must account for transparency and fill the CLUT’s first three colors with garbage that won’t show up in the landscape. Alternately (in Photoshop), you can:

  1. Convert to 253-color indexed color.
  2. Convert back to RGB.
  3. Using Forced > Custom with #0000FF, #FF00FF, and #00FFFF, convert to 256-color indexed color.
  4. Export the new CLUT.

Either way. (I don’t use GIMP, but I’m guessing you can do something similar by making a 253-color bitmap, exporting the CLUT, and editing it in a text editor.)

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Sequence Timing & Film Compatibility

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

‘Weapons in Hand’ Sequences

For years, Aleph One didn’t have 8-bit software mode, so ‘8-bit color’ and ‘true color’ sequences being out of alignment wasn’t a problem. Aleph One 1.4 restored it, so it’s worth taking note if a sequence is present in one and not the other. A physics model calling said sequence in 8-bit software mode will crash Aleph One (or cause an assertion failure; I forget which, but either way, it closes the game). Plus, if a sequence has a different timing between the two versions of a collection, it’ll desync films and may desync network games if one player uses 8-bit software mode and the other doesn’t.

As tempting as it is to tell players not to use 8-bit software mode, some will inevitably disregard it out of ignorance, and others out of pure spite (insert out-of-context ‘Killing in the Name’ quote here). The best solution is to make sure each sequence in both versions has the same sequence type, frames per view, ticks per frame, loop frame, key frame, transfer mode period, and frame sound, then update one anytime you update the other.

By default, the only other collections with ‘true color’ versions are the landscape palettes, and it’s very rare (though not unthinkable) for something to call one of the sequences in these (assuming any are even defined). I think a classic Mac utility could create ‘true color’ versions of other collections (all 32 collections can have them; it’s just that, by default, only the Weapons in Hand and Landscapes did), and if a shapes file had these, their sequences should align between ‘8-bit’ and ‘true color’ wherever they’re defined.

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Appendices & Transplanted Content

I’ve split several sections off onto their own pages. Please update your links accordingly:

Additionally, to avoid duplicating content, I’ve moved several sections to the beginners’ mapmaking page. Here are direct links to the relevant sections – again, please update your links.

Lastly, I’ve moved my biography and contact info to a dedicated page: aaronfreed.github.io/aboutme.html.

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Acknowledgements

Back to top · Table of contents · Beginners’ guide · Contact me · Website index

Endnotes

# Note
1 What, you don’t have a third hand? I guess your name isn’t “Zaphod Beeblebrox”.
2 The game actually represents the player’s yaw internally as a 9-bit value, ranging from 0 to 511; an increase of 1 in its internal representation corresponds to an increase of 0.703125°, i.e., 360/512. If you press F10, it shows the angle as a value ranging from –179.296875° to 180°, but this is because it subtracts 360° from angles greater than 180° – printing the value in the Lua console returns values from 0° to 359.296875°.

Back to top · Table of contents · Beginners’ guide · Contact me · Website index