Title
Game
Community
Media
MAPPING

Have any questions about Marathon:Resurrection? If so, the answers are probably here or in the Manual. Take a peek, learn a thing or two, and if you're still confused, don't hesitate to make a post to our Forums, where team members and fellow gamers will be happy do discuss and debate your input.

Go to the Forums

Mapping with the Marathon Mod
Mapping Q&A

Mapping

If any of the following classes do not show up in the UEd class browser, go to the File menu in the class browser window and select File->Load Package and select UT\system\MarathonMOD.u. As a convenience you can instead add the following line to the end of the [Editor.EditorEngine] section of your UnrealTournament.ini file: EditPackages=MarathonMOD

DefaultGameType
Level Properties->LevelInfo->DefaultGameType

Every Man For Himself
(Death Match)
The default gametype for network DeathMatch and DeathMatch/KOTH maps should be set to:
Class'MarathonMOD.MarathonDM'. 
 
King of the Hill The default gametype for KOTH-only maps should be set to: (although I don't know why anyone would want to make a KOTH-only map)
Class'MarathonMOD.MarathonKOTH'.
 
Single Player The default gametype for a single player map should be set to:
Class'MarathonMOD.MarathonSP'.
 
Game Prefixes In order for network maps to be used with the Marathon:Resurrection mod, the map name should have one of the following prefixes:
DMMR - DeathMatch maps
DMMRK - DeathMatch/KOTH and KOTH-only maps
 


ActionKeyTrigger
Actor->Triggers->Trigger->ActionKeyTrigger

When the command ActionKey is executed by a player any ActionKeyTrigger that has the instigating player within its CollisionRadius is triggered. Thus, to use the ActionKeytrigger the player must bind the command "ActionKey" to a key in their user.ini file. AI support has not yet been added to the ActionKeyTrigger. The ActionKeyTrigger adds some new settings to the Trigger properties that should have attention paid to them:

RotationTolerance Tolerance on facing angle. The facing angle is the angle to the ActionKeyTrigger either way from player 12 o'clock. The facing angle must be less than  RotationTolerance in order to trigger the ActionKeyTrigger. Angle is specified in Unreal integers: 180.039 int/degree, 8191=45 degrees
 
FOV If Advanced->bDirectional is TRUE then the triggering player must be with the ActionKeyTrigger's FOV in the direction the ActionKeyTrigger is facing. Angle is specified in Unreal integers: 180.039 int/degree, 8191=45 degrees
 
 
bDebug If TRUE debug messages will be written the log. Can lead to a LARGE log file.
bDirectional If  bDirectional is set to TRUE, the triggering actor must be within the ActionKeytrigger's FOV to get noticed. I added this for things like doors that can only be opened from one side.
 

In addition, the following standard Trigger properties still apply: CollisionRadius, CollisionHeight, InitialState, bInitiallyActive, ReTriggerDelay, Message, bTriggerOnceOnly

EntryTrigger
Actor->Triggers->Trigger->EntryTrigger

This trigger will trigger as soon as play starts, using the first Playerpawn it finds as the Instigator. This is used on the splash screen map to start things rolling as soon as the player enters.

MaraKOTHHill
Actor->Triggers->Trigger->MaraKOTHHill

MaraKOTHHill triggers are used to designate which area(s) of a map is to be considered the Hill for King of the Hill games. Whenever a players is colliding with a MaraKOTHHill trigger they are considered to be on the Hill and they will be accumulating Hill time. Place a MaraKOTHHill trigger and adjust its CollisionRadius and CollisionHeight such that it just covers the desired Hill area. To create a Hill shape that is non-circular MaraKOTHHill triggers may be overlapped.

CollisionRadius Sets the radius of area around the MaraKOTHHill that will be part of the Hill.
FOV Sets the height above and below the MaraKOTHHill that will be part of the Hill.

MarathonSpawnpoint
Actor->NavigationPoint->Spawnpoint->MarathonSpawnpoint

MarathonSpawnpoints should be placed throughout the map to specify potential item spawn locations. To limit the MarathonThingFactories that can use this Spawnpoint set the Spawnpoint's Tag to match the MarathonThingFactory's SpawnpointTag. Items will be spawned at the exact location of the MarathonSpawnpoint so care should be paid the Spawnpoint's height above the floor and its distance from walls. In addition, the spawned item will be given the rotation (Yaw, Pitch, & Roll) of the MarathonSpawnpoint. Placing a MarathonSpawnpoint too close to the ground will often cause bots to run in place on top of it. To prevent this, place the MarathonSpawnpoint a bit higher and set bFalling to TRUE on the MarathonThingFactory(s) that uses it.

MarathonSecCam
Actor->MarathonSecCam

The MarathonSecCam actor is basically just a convenience for the mapper. It allows the mapper to easily specify the starting viewpoint to display in MarathonTerminal pages. Rather that having to enter the location and rotation for each camera view in the MarathonTerminal properties the mapper can instead just place a MarathonSecCam and enter its tag into the terminal. To setup a MarathonSecCam in UEd:

  1. Add a MarathonSecCam actor in the area you want it to be. In the UEd rendered view move your camera viewpoint so that you can see what you want the SecCam to see.
  2. Go to the overhead, select the camera (the eye icon) and bring up its properties. Copy its Location.X,Y,Z and Rotation.Yaw,Pitch,Roll properties to the same properties of the MarathonSecCam.
  3. Set the MarathonSecCam's Tag to whatever you want and then enter that same tag into the MarathonTerminal TermCam[n] array.

MarathonTerminal
Actor->MarathonTerminal

When triggered the MarathonTerminal takes over the display of the triggering Actor and displays termnial text and security camera views on the player's screen. When first triggered the LoginSound is played and the logon page is displayed for two seconds and then the terminal pages to the first page of text. The logon page consists of the Marathon logo, The phrase "U.E.S.C. Marathon", and the text string that is entered that is entered as the Login string in the MarathonTerminal properties. Instead of waiting the two seconds, the user may pagedown to the first page of text. Paging up and down causes the PageSound to be played and the terminal to display the next or previous page of text. When the user pages down off the last page of the terminal, the EndEvent is triggered. That is, all actors whose tags are set to the same name as that entered into the EndEvent property are triggered. To cancel out of the terminal without triggering the EndEvent the terminal itself should just be triggered again. (Since an ActionKeyTrigger will always be used to trigger the terminal, hitting the ActionKey again will exit the terminal without triggering the EndEvent).

The text to be displayed must be entered into the MarathonTerminal properties by the mapper. Each paragraph of text is entered as a single string. The terminal will automatically wrap the text to the terminal's width but pagination must be set by the mapper. To cause a page break the string "#pp" (without the quotes) should be entered as a string by itslef. There should be no #pp after the last page. To cause a blank line in the terminal text enter a single space as a string.

When a terminal page is to display a MarathonSecCam view, the string "# checkpoint n" (without the quotes) should be entered as the first line of text for that page, where n is the number of the MarathonSecCam to use for the view. For example, entering "#checkpoint 3" would cause the terminal to display the view from the MarathonSecCam whose tag was entered in TermCam[3]. When the page with a SecCam view is displayed, the player can pan the camera's view around with their mouse.

The appropriate text and login string for each terminal may be found in the accompanying file Terminal Text.txt, which is an export of the text from all of the terminals in the original Marathon game.

Currently the MarathonTerminal does not prevent the player from moving or firing while viewing the terminal. However, these *must* be implemented before final release. I just haven't figured out how to do it -- yet.

PageSound Sound that is played when the MarathonTerminal is paged up or down. Should be set to Sound'marathonmod.MaraSnds.TerminalPage'.
OffSound Sound to be played if the MarathonTerminal is disabled. This will be removed in future builds. To disable a MarathonTerminal the mapper should instead disable its trigger and handle this sound with a SpecialEvent.
EndEvent This event is triggered when the player pages past the last page of the MarathonTerminal. Useful for triggering teleporters and the like. The EndEvent is triggered if the MarathonTerminal is exiting by retriggering (like hitting the ActionKey again) instead of by scrolling off the end.
Login This string is displayed under the Marathon logo on the first page. It should be taken from the #logon section of the original Marathon terminal text.
 
TermCam[8] Enter the tags of up to 8 MarathonSecCams here. MarathonTermCams from this array are referenced by checkpoint statements in the  TermText.
TermText[256] An array of up to 256 lines of text for display and formatting on the MarathonTerminal. Although the MarathonTerminal doesn't limit the number of characters per line, UnrealEd appears to limit string length to 1024 characters.
bDebug If TRUE debug messages will be written the log. Can lead to a LARGE log file.
 


MarathonThingFactory
Actor->Keypoint->MarathonThingFactory

In Marathon the map maker could set items to spawn at a random location. The MarathonThingFactory, in conjunction with the MarathonSpawnpoint, mimics this functionality. The MarathonThingFactory can be placed anywhere in the map, either in subtracted space or not. One MarathonThingFactory must be placed for each type of item to spawn. Approximately every 10 seconds the MarathonThingFactory will consider spawning news items of the type set in its Prototype property. If the number of items of type Prototype currently existing in the game (both waiting to be picked up and being carried by players) is less than MinPresent, items will be spawned until the number existing is equal to MinPresent. If MaxPresent is greater than 0 and if the number of items is greater than or equal to MaxPresent no items will be spawned. If MaxPresent is set to 0 there is no limit to how many items can existing in the game. If the number of items present is between MinPresent and MaxPresent an item will be spawned based upon the value in the Probability setting. The spawned item will have its Tag set to itemtag if one has been set. If a SpawnEvent has been set and an item has been spawned all actors whose Tag is equal to SpawnEvent will be triggered.

When spawning an item, the MarathonThingFactory will select at random a MarathonSpawnpoint whose Tag matches SpawnpointTag as the spawn location. If no SpawnpointTag is specified the MarathonThingFactory will select at random any MarathonSpawnpoint.

itemtag Tag given to items produced by this factory.
SpawnEvent Event to trigger after successful spawn.
SpawnpointTag Tag of MarathonSpawnPoint(s) to use.
Probability How likely it is to appear. In Forge the probability percentage is base upon the chance of an item spawning per minute. Since the MarathonThingFactory runs on about a 10 second cycle, the Forge probability should be divided by 6.
MaxPresent Maximum number of this item present in the game, 0 = infinite.
MinPresent Minimum number of this item present in the game at a given time.
Prototype Class of item to spawn.
bDebug If TRUE debug messages will be written the log. Can lead to a LARGE log file.

PatternBuffer
Actor->PatternBuffer

The PatternBuffer actor provides a mechanism for the player to save games in single player maps. When the PatternBuffer is triggered it brings up a window allowing the player to choose one of eights slots to save the current game state in. Since the it doesn't matter where the PatternBuffer is when it is triggered it is only necessary to use one per map. However, for ease of mapping one can be used at each map location where there should be a pattern buffer in the game.

ShieldCharger
Actor->ShieldCharger

When triggered the ShieldCharger works by finding the pawn that instigated the trigger, where ever they are, and increasing their health. Because the ShieldCharger can charge the instigating pawn no matter where it is, care should be taken as to how and where the charger can be triggered from. Once triggered the ShieldCharger will continue to increase the pawn's health until either the pawn moves, the the ShieldCharger is retriggered, or the pawn's health reaches the maximum amount. The maximum amount is determined by the ChargerType setting:

CHRG_1x: MaxHealth = 150
CHRG_2x: MaxHealth = 300
CHRG_3x: MaxHealth = 450

The ChargerType setting also determines how quickly the pawn's health will be increased. For given setting, a pawn can get from 0 health to the maximum amount in about 6 1/3 seconds. The ShieldCharger can also trigger other events both when it starts and stops charging. This can be useful for triggering a mover that shows the ON/OFF state of the charger or toggling a TriggerLight or sound during charging. The Tags for these events should be set in the ChargeStartTag and ChargeStopTag properties. Since the ShieldCharger itself has not light or sound capabilities these must be added by the mapper using a TriggerLight. In the future code may be added that will check the actors whose tag matches these settings and if it is a TriggerLight the ShieldCharger will automatically set its color (LightHue & LightSaturation) based upon the ChargerType setting. However, until that happens the following TriggerLight settings should be used:

CHRG_1x: LightHue=0 SoundPitch=80
CHRG_2x: LightHue=42 SoundPitch=72
CHRG_3x: LightHue=212 SoundPitch=64
AmbientSound=Sound'MaraSnds.MaraSnds.EnergyRefuel'
InitialState=TriggerToggle

The LightSaturation, LightBrightness, and SoundRadius will vary depending depending upon the map situation. The SoundVolume property can also vary but since the EnergyRefuel sound has a small dynamic range this should probably always be set to 255.

TriggerTeleporter
Actor->NavigationPoint->Teleporter->TriggerTeleporter

The TriggerTeleporter is just a a regular teleporter except that it will teleport the Instigator of whatever triggered it. This is used with a Dispatcher to teleport the player out of the splash screen level or a cut scene level.

Decorations
Actor->Decorations->BarrelCross
Actor->Decorations->BarrelFuture
Actor->Decorations->BarrelSmooth
Actor->Decorations->BarrelStandard

Mapping Q&A

Q: What does it take to become a mapper for Marathon:Resurrection?

A: The basic requirements are:

  1. You have played Marathon 1
  2. You have access to Marathon 1
  3. You have access to UnrealEd
  4. You have an attention span

There is some possibility that this can be done without access to a Windoze box. I hear of legends where people have used UnrealEd successfully with Virtual PC. There is also some possibility that this can be done without access to a Macintosh. The port of Marathon 1 to Aleph1 is near completion. We haven't looked at this port yet, but assuming that they were as meticulous and detail oriented as we like to be then their texturing should be identical to the originals. In that case A1:M1 could used as a reference for texturing levels and and the Macintosh version of M1 would not be needed.

Q: So I can make my maps look however I want, right?

A: Wrong. As far as design style, the following requirements must be met:

  1. The level must be immediately recognizable from the original
  2. Except for detail areas, the level should be textured the same as the original using M1.utx
  3. All doors, lifts, terminals, switches, puzzles, secrets, etc. must be recreated. Door and lift timings should be the same as the originals.
  4. No UT pickups, decorations, or textures (except for things like glass or other detail touches).
  5. The Marathon-style rectangular geometry should a general theme for non-alien levels. Deviations that make sense are OK.

Q: Who decides what makes sense?

A: As Wolfchild speaketh, so shall it be.

But I'm just a harmless little Woofy - ask anybody. :-)

We don't want the 27 diferent levels to look like they take place on 27 different ships. Even so there is plenty of room for creativity -- especially in the areas of lighting and architectural detail. It just takes enough skill to be both creative and subtle. If you look at a scene and the first thing that catches your eye is the eye candy then it wasn't done right. This isn't about impressing other mappers - this is about making the player feel like they're on the Marathon. The more realistic and subtle the lighting and architecture are the better.

Q: What maps do you need done?

A: In Marathon 1 there are 27 Single Player levels and fewer than a dozen Multi-Player levels that will need to be converted. SP levels are more complex than the typical MP level. We need people who have the attention span to complete a complex SP level while paying attention to all the details that make a map immersive.

Q: What kind of mapping experience do I need to have?

A: Some mapping experience is necessary. This pretty much means experience with UnrealEd, Forge, Pfhorte, or any of the mapping tools for Quake or Half-Life. While you don't need to be an expert mapper, you do need to know the basics. We can help you out with the rest. If you have never mapped before but you think you can learn UnrealEd pretty quick, feel free to do so and get back to us. There are many good tutorials available at Wolf's Unreal and OsX.

 

Sealed from the outside world for over 15 million years...