the cutting room mirror

Marathon 2: Durandal (Mac OS Classic, Windows)

This article has a talk page!
view on tcrf.net

To do:

The second entry of the Marathon series. The story is a continuation of the first game's and notably features all-new graphics and audio for everything. The engine was tweaked a little bit, and the game lacks any music aside from the opening screens.

Bungie released the full source code for the game in 2000, paving the way for modern source ports.

Level Select#

Marathon2-levelselect.png
As in the original game, holding the Command and Option keys together while clicking on the "Begin New Game" button brings up a prompt to go to any level in the game, along with a set of instructions on how to be the hardest-core gamer.

Unused Text#

General#

The copy expiration message is still from Marathon.

Messages for Cheaters#

Three terminals in the game display messages that can only be seen in-game through the use of third-party cheating utilities. All three terminals display normal messages when accessed without cheating.

<CMND THRESHOLD 92%>

You cheater. Quit cheating and play for
real!

<CMND THRESHOLD 92%>

This is the second message of the second terminal in the level "What About Bob?"

Atc &33c.3ckl2

That's cool how you just walked through
that door, but I still won't let you leave.

The first message displays this on the second terminal in "Curiouser and Curiouser..."

<Trn 36 ap&1cz:: 9cm2>

Cheaters don't really win,
and winners don't really cheat,
Unless you're talking politics.

The fourth terminal in "Eat It, Vid Boi!" displays this as its first message.

Developer Message#

A developer message exists in Marathon 2 for those using ResEdit. However, it is also shorter than the one from Marathon.

Here we are again, guys.

Nobody here has slept very much recently or eaten
anything besides pizza or burritos in a few weeks, but
we hope you like what we ended up with.

I don't have much to say, and I won't be fool enough to
give away my email address again, but I figured everyone
would be disappointed if there wasn't some inane little
message here.

So.

Keep your heads up and your fingers off the Caps Lock key.
See you at MacWorld.

Jason, Ryan, Greg, Mark and Rob

Map Messages#

Several levels contain hidden messages in the map geometry that cannot be seen without using a level editor. One level has multiple hidden messages. The original capitalization of the text has been preserved.

Level

Message

Image

We're Everywhere

hey you, the bob carrying my 2nd pistol! - let's go!

Ex Cathedra

The NAR

Bob's Big Date

BOB'S LATE FOR HIS BIG DATE!!

The Big House

JAIL BREAK, or PRISON RIOT?!

God Will Sort The Dead...

Q: How do you tell the difference between the good Bobs and the bad ones?

God Will Sort The Dead...

A: Good Bobs?

All Roads Lead To Sol...

723rd KICKS WUSSY NAR BUTT!

Hidden Soundtrack#

Watch on YouTube

Track 2 on the disc is an arrangement of "Jingle Bells" using Bob death screams, followed by 26 seconds of silence. Later revisions of the game such as The Trilogy do not contain this track.

(Source: Marathon Music)

Uncompiled Source Code#

Two terminals in the game display pieces of its source code along with some dialogue. Although the source code has since been officially released, these messages were displayed in-game before then.

li5%!_data(*li!$ne_in
 
ary, "endpoint &%d not in polygon &%d (fro
&%d)", endpoint_index, polygon_iing
the shipd.
ndex, polyg't believe
everython_index));nS_TRANSPARENT(line))
{polygon= get_polygon_data(*polygon_index);
case _clockwise_bias
 
Tycho is infiltrating the ship.
Don't believe everything you read.
 
/* loif (*polygon_indor (index=0;index<
polygon->vertex_count && p
polygon_index, polygTycho is
infiltrat3on_index));nS_TRANSPARENT(line))
{polygon= get_polygon_data(*polygon_index);
 
*line_E_I>endpoint_
indexes[index]!=endpoint_
index;+'index);vasse tyc!=cool
polygon->vertex_courcate our endpo
 
n->adjacent_polygon_indexesuct line_data *
line;struct wor
ld_point2d *vertex;long
cross_product;olygon-t, csprintf(tempo
 switch (bias){
 
You were inadvertently transported to an
abandoned and unimportant section of the
ship, but the Pfhor followed you anyway.
 
Someone's after you, personally. One word;
two syllables; rhymes with Psycho.
 
dex!=NONE){strex];
/* loif (*polygon_indor (index=0;
index<polygon->vertex_count && p
*polygon_index= polygo
 
The humans sustained heavy losses while you
were gone and our defenses are falling
apart, but the evacuation is not yet
complete.
 
li5%!_data(*li!$ne_in

The second terminal in the level "Sorry Don't Make It So" displays this message.

Yt-c469d02l;12
 
ary, "endpoint &%d not in polygon &%d (from
&%d)", endpoint_index, polygon_iing the
shipd.
ndex, polyg't believe
everython_index));nS_TRANSPARENT(line))
{polygon= get_polygon_data(*polygon_index);
  case _clockwise_bias
 
Finish me. I won't be like Leela.
 
Get out of here and find the human leader,
Blake.
 
/* loif (*polygon_indor (index=0;index<
polygon->vertex_count && p
polygon_index, polygTycho is
infiltrat3on_index));nS_TRANSPARENT(line))
{polygon= get_polygon_data(*polygon_index)
 
Yt-c469d02l;12

This message is displayed by the first terminal in "Begging For Mercy Makes Me Angry!"

struct line_data *line;
struct world_point2d *vertex;
long cross_product;
 
*line_index= polygon->line_indexes[index];
*side_index= polygon->side_indexes[index];
*polygon_index= polygon->adjacent_polygon_indexes[index];
               
line= get_line_data(*line_index);
if (*polygon_index!=NONE && LINE_IS_TRANSPARENT(line))
{
        polygon= get_polygon_data(*polygon_index);
                       
        /* locate our endpoint in this polygon */
        for (index=0;indexvertex_count && polygon->endpoint_indexes[index]!=endpoint_index;++index);
        vassert(index!=polygon->vertex_count, csprintf(temporary, "endpoint #%d not in polygon #%d (from #%d)", endpoint_index,
                polygon_index, polygon_index));
       
        switch (bias)
        {
                case _clockwise_bias: index= WRAP_HIGH(index, polygon->vertex_count-1); break;
                case _counterclockwise_bias: index= WRAP_LOW(index, polygon->vertex_count-1); break;

Compare the previous two messages with this section of "render.c" from the game's source code.