Legacy:Mapping For TTR
The Third Reich Mapping Guide by butto.
- 1 Overview
- 2 The Basics
- 3 Player Starts
- 4 The Level Info: TTR_LevelInfo
- 5 Setting up Objectives
- 6 Using Airplanes
- 7 Adding Minefields
- 8 Doors Activated by the Use Key
- 9 Triggers
- 10 Other Notes
Mapping for the Third Reich will offer its own unique challenges due to the objective based nature of gameplay. This document details everything that you, as a mapper, need to know to create your own scenarios for use in TTR.
Maps in TTR are objective based and play is divided into rounds. One team, the attacking team, is trying to accomplish certain objectives. The other team, the defending team, is trying to prevent them from accomplishing these objectives before the round is over. Each map can have anywhere between one and eight different objectives. An objective can be any variety of things from stealing documents or an enigma machine to capturing territory or rescuing POWs. Objectives can be in one of three different states - incomplete, complete, or failed. When a round starts, all objectives are incomplete. When an objective is accomplished by the attacking team, it is marked as complete. If time runs out or some critical event occurs, an objective will be marked as failed. As soon as an objective is failed, the attacking team immediately loses. The attacking team must complete all of their objectives to attain victory.
There are three teams in TTR - the Allies, Axis, and Spectators. Their team numbers are 0, 1, and 3 respectively. The spawn points for players on the same team should be kept in the same general area with the exception of the spectator team. There should be at least 16 spawn points per team to avoid telefragging in large games with the exception of the spectators once again, as they will only need one or maybe a few, spawn points.
The Level Info: TTR_LevelInfo
Every TTR map must include a TTR_LevelInfo actor. The level info lets the mapper setup all the properties for the map. I'm going to run through every property and explain how to set it. I will use the format 'Variable (Valid values)' followed by a description.
- AirPressure (Barometric Pressure, for you weather fans!)
- This is the air pressure in the map, which is important for ballistics calculations. As a general rule, air pressure at sea level is about 29-30 lb/ft^3. It will go down by one for every thousand feet above sea level. It will also go down a little when there is stormy weather.
- Set this to true (default) to allow wind in your map. Wind affects bullets. It also makes trees and foliage sway and allows newspapers to blow around if placed in the map.
- (CLIMATE_Temperate, CLIMATE_Desert, CLIMATE_Arctic) This is where you set the map's climate. This will determine player uniforms. *Note: is not yet operational ingame.
- North (Any valid rotation in Unreal units)
- This sets what direction is north on the map. -16384 is what you should set this to if north is up on the top view map in UnrealEd.
- Temperature (Anything within reason)
- Set the map's temperature in Fahrenheit here. Sorry it's not Celsius, but it's more convenient to use American units in UT. This affects bullet behavior and causes the players' breath to show if it is cold out. The actual temperature will be within five degrees of what you set.
- WindDirection (DIR_North, DIR_NorthEast, DIR_East, DIR_SouthEast, DIR_South, DIR_SouthWest, DIR_West, DIR_NorthWest)
- This is where you set the general direction that the wind blows. The wind will deviate from this a little, but will generally stay around it.
- WindSpeed (WS_VeryLight,WS_Light,WS_Moderate,WS_Heavy,WS_VeryHeavy)
- This sets how fast the wind is going. WS_VeryLight has a top speed of around 4 MPH (barely felt). WS_VeryHeavy has a top speed around 32 MPH (gale force).
- WindType (WT_Breezy,WT_Gusty,WT_Steady)
- Here you can set how the wind behaves. WT_Breezy causes the wind to be a lot lighter than the max speed, but pick up every now and then. WT_Gusty causes the wind to stay a little closer to the max speed and gusts of wind will come more frequently. WT_Steady causes the wind to stay close to the max speed and gusts occur very frequently.
- DefendingTeam (0,1)
- This is used to set which team is the defending team on this map. Use 0 for Allies or 1 for Axis.
- InvincibilityTime (0-10)
- This is the number of seconds that a player should be impregnable to damage after spawning to prevent spawn camping.
- PrepTime (0 or above)
- This is the number of seconds before a round starts that the defending team can move, but the attackers cannot. This allows the defenders to get into positions. It is the mapper's responsibility to make sure that the defenders cannot reach the attacker spawn point and do lame things.
- ReinforcementInterval (30 or above)
- This is the number of seconds between respawn periods. People are respawned in waves every however many seconds you set so that people can stay together more or less. This interval will be randomized, so the actual waves will be at whatever value you set give or take 10 seconds. This is to prevent players from knowing exactly when everyone will be respawning. The default is 45 seconds between waves, but what this number should be depends a lot on the size of the map.
- RoundDuration (1 or above)
- This is the length of each round in minutes. How long a round should be is entirely up to the mapper. It should be long enough to give the attackers a chance, but not so long that it is easy for them. Please keep rounds longer than one minute, but preferably longer than that.
- AttackerObjectives (Any text)
- This is where you write the text that will appear whenever the objectives are visible to a player on the attacking team in-game. An example of what to put would be "Steal the design plans for the latest German airplane."
- DefenderObjectives (Any text)
- This is the same thing for the defending team. Because the defenders are trying to prevent the attackers from accomplishing the objectives, they need to be reworded. For example, I would write "Protect the design plans for our latest airplane." instead of the text used above for the attackers.
- NumObjectives (1-8)
- This tells the game code how many objectives there will be in total in the map.
Setting up Objectives
Now that we have covered the level info, it is time to look at what we need to do in order to put the actual objectives into the map. There are a wide variety of classes at your disposal to construct the objectives. While each objective is unique, they all have several things in common to make it easy to figure things out.
One of the classes involved in each objective will have a 'TTR_Objectives' category in its default properties. You will be able to set, at the very least, a variable called 'ObjectiveNumber' in here. This number corresponds to the number in the array where you put the text description in the level info. So if you have only one objective, its ObjectiveNumber will be 0 and the description of the objective will be in the first row for both the attacker and defender descriptions.
Because of the way this system works, it is technically possible to have two different objectives use the same number. That would make it possible for the attackers to have an option of completing one objective or another. This was not an intended option, but more of a quirk. :)
So if you've stayed with me this far, it's now time to look at each objective individually and explain all the unique properties.
The stealing documents objective works as follows. Someone on the attacking team must grab a TTR_Documents pickup item placed somewhere on the map and return it to a TTR_DropOffZone. As soon as a player on the attacking team enters the zone with the documents in his position, this objective is completed. Let's take a look at the setup.
Place this item wherever you want in the map. You can rename it to be whatever specific documents they are supposed to be. This classes is located under Actor->Inventory->Pickup->UT_Pickup->TTR_Pickup->TTR_Documents.
- Events -> Tag (Any name)
- This is a tag for the documents used to differentiate one documents pickup from another when it is taken to a drop off zone.
- TTR_Objectives -> ObjectiveNumber (0-7)
- Already explained before. The number of this objective on the objectives list.
This is a zone where any variety of things can be dropped off. As soon as a player from the attacking team carries the documents into here, the objective number of the documents is set to complete.
- PickupItems (class of pickup,tag for pickup)
- You can drop off up to eight different pickup items at a TTR_DropOffZone, not just TTR_Documents. For each one, you must enter the class name (class'TTR.TTR_Documents' in this case) and the tag you gave that item. The zone will take care of the rest.
Stealing an Enigma Machine
The Germans used a special device known as an enigma machine to send coded messages between their ranks. Through the help of stolen machines and lots of dedicated people working at decrypting messages, the Allies knew almost every German movement ahead of time. While it may not be totally realistic to be stealing an enigma machine in the fashion that they will be in TTR, it's fun nonetheless and fits the WWII theme.
This objective works almost exactly like the document objective, so make sure you have read that first. The only difference is that a TTR_EnigmaMachine class is used in place of a TTR_Documents and the TTR_DropOffZone has a few minor changes. The pickup class can be found under Actor->Inventory->Pickup->UT_Pickup->TTR_Pickup->TTR_EnigmaMachine. The class you enter for the item in the TTR_DropOffZone is class'TTR.TTR_EnigmaMachine'. It should be pretty straightforward.
Territorial control is one of the most common objectives in war and also one of the most difficult to replicate in a game. In TTR, holding territory works in the following way. If only a certain percentage of players on the attacking team are in the area for a certain period of time and nobody from the defending team is there, the territory is taken. Territory cannot be taken back because it would go against the attackers/defenders nature of gameplay.
This objective is managed with a single class, TTR_HoldArea. It can be found under Actor >> HoldArea. Place this where you want to allow the attackers to take the territory. You also have the option of adding a TTR_FlagPole actor into your map, which will allow you to have a flag that changes textures depending on who holds the territory.
Here are all the properties of a TTR_HoldArea.
- Events -> Tag (Any name)
- Use this only if you want to have a flag tied to the area.
- TTR_HoldArea -> HoldSecs (0 or above)
- How many seconds there must be enough players from the attacking team and no players from the defending team in this area.
- TTR_HoldArea -> NumPlayers (0-1)
- Percentage of players from the attacking team that must be in the zone to complete the objective. Default is 0.33 (33% or at least 1 player).
- TTR_HoldArea ->Radius (Anything within reason)
- This is the radius within the TTR_HoldArea actor that a player must be. The default is 256. Hold areas can span a pretty large area if you'd like, like a whole town center.
- TTR_HoldArea ->bUseZone
- If true it will use the TTR_zone it is linked to. Make sure you place a TTR_zone in the zone and give it the same 'Tag' as the TTR_HoldArea. Should work after you done that.
- TTR_Objectives -> ObjectiveNumber (0-7)
- Already discussed many times over.
Here is how you can setup a TTR_FlagPole, which can be used with the zone, but doesn't have to. The flagpole will create its own flag when the game starts. That flag will wave according to the wind.
- Events -> Tag (Same name used by TTR_HoldArea)
- Set this if this flag is going to be used with a TTR_HoldArea. It doesn't have to be. It can just be a decoration.
- TTR_FlagPole -> bAttachToHoldArea (true,false)
- True if this flag is going to show which team holds the territory in a hold area.
- TTR_FlagPole ->FlagOffset (Vector)
- This does not need to be changed. It is the offset where the flag will be spawned relative to the center of the flagpole.
- TTR_FlagPole ->TeamNumber (0,1)
- This is used only if the flag is not going to be attached to a hold area. This will determine which flag texture to use in that case. 0 = Allies 1 = Axis.
Airplanes can add a lot of ambient to a level and even provide a unique element to the gameplay. Setting them up is rather complex - I won't lie. The basic idea is that you put a plane anywhere in the level. You then add a bunch of waypoints to define where the plane starts, where it will travel, when it will fire machine guns, and when it will drop bombs. Then you place a trigger in the level that will trigger the plane. When the plane is triggered, it will become visible at the first waypoint (number 0), follow its path, do whatever, and vanish until the next round once it hits the last waypoint.
Now let's take a look at this in more detail. When you add an airplane to the level, its placement does not matter. It will get moved to the first waypoint automatically. You can change several of the plane's settings.
- Events -> Tag (Any name)
- This is the name used so that the waypoints and trigger can be linked to the right plane.
- TTR_Airplane -> FlySound (Any sound)
- This should be fine the way it is, but you can change it.
- TTR_Airplane -> Health (Anything within reason)
- This sets the health of the plane. 1000 is default.
- TTR_Airplane -> Speed (~150-300)
- This is the speed of the plane in miles per hour (MPH).
- TTR_Airplane -> Team (0,1)
- 0 if the plane is on the Allies, 1 if it is on the Axis. This should be setup properly by default.
This should be fine the way it is. It has all the data on machine guns for the plane in there by default.
We covered everything there is to the plane itself. Now the plane needs a path to follow. The TTR_AirplaneWaypoint class is used to create this. You cannot have more than 32 waypoints, but that should be more than enough. Now let's take a look at the properties you have to configure.
- Events -> Tag (Any name)
- Same as for the plane.
- TTR_Waypoint -> Banking (0-16383)
- This is how many unreal units the plane will bank when it hits this waypoint. If the plane is not turning, it can be 0. 0 is no banking and 16384 is 90 degrees of banking. Typically, somewhere around 4096 will be good. The banking has to be perfected by trial and error more or less.
- TTR_Waypoint -> bDropBomb (true,false)
- Obsolete, will get redone
- TTR_Waypoint -> bFireMachineGun (true,false)
-True if the plane should fire machine guns enroute to this waypoint.-
- TTR_Waypoint -> bFireCannon (true,false)
- Here for possible support later. It is not used.
- TTR_Waypoint -> WaypointNumber (0-31)
- Waypoint numbers are used to determine the order of the waypoints. 0 is the starting waypoint. Each waypoint must be added in sequence. If numbers are missing in the middle, the plane will vanish early.
The plane and paths are all set. Next, we need to add a trigger to set this plane on its way. The trigger can set the plane off in any of three ways: a particular round time, if a player comes within a certain distance of the trigger, or if a certain objective or combination of objectives have been completed. The trigger can be found under Triggers->TTR_AirplaneTrigger.
- TTR_AirplaneTrigger-> bRandom (true,false)
- If true, only one out of all the planes linked to this trigger will actually be sent off. This is to add a degree of randomness.
- TTR_AirplaneTrigger-> AirplaneTags (Any name)
- This is where you can specify up to 8 planes that will be launched when this trigger is set off.
- bObjectivesMet (true,false)
- True to enable triggering when the following list of objectives is complete.
- Objectives (0,1)
- The 8 objectives correspond to the 8 objectives in the level info. Put 1 for the objectives that must be completed before the plane can be triggered. Leave the rest at 0.
- bProximity (true,false)
- True to enable triggering when a player comes within a certaibn radius.
- TriggerRadius (Anything within reason)
- How far away a player can be from the trigger to set it off.
- TeamNumber (0,1,255)
- What team must the player be on to set it off? 0 for Allies, 1 for Axis, 255 for any team.
- bTimed (true,false)
- True if the trigger should go after at a certain round time.
- RoundTime (Anything with the duration of a round)
- This is the number of seconds will be REMAINING on the round timer when the plane is to be triggered.
- Incomplete and some stuff will change
Minefields can be added through use of the TTR_MineInfo (Actor->Info->TTR_MineInfo) class. This class automatically plants however many mines you want randomly within a certain radius. It will automatically place them according to the contour of the surface below. Make sure this actor is placed above the highest terrain level in its radius and that there are no big colliding actors underneath. A mine will only be created on the surface of the level itself, not any actors. The mines are reset and randomized at the start of each round.
- NumMines (1-16)
- Sets how many mines are created. There is a maximum of 16 for any one mine info.
- Radius (Anything within reason)
- Sets the radius within which the mines will be spawned.
- MineType (Any valid class)
- Leave it at the default.
Doors Activated by the Use Key
All doors in TTR maps should be use key activated so that the player has more control over when to open and close a door. To create such doors, you must do two things to your mover: Set bUseTriggered to ‘true’ and set InitialState to ‘TriggerControlled’. There you have it.
Several new triggers have been added to TTR that you may find useful. The triggers used in TTR will be automatically reset at the start of each round if you use the correct triggers.
You can use the standard Trigger class without any problems. If bTriggeredOnceOnly is true then the trigger can only be activated once per round.
The TTR_UseTrigger (Actor->Triggers->Trigger->TTR_UseTrigger) works just like a normal trigger except for the fact that it is activated when a player presses the use key. The bTriggeredOnlyOnce behavior for this trigger is the same as the normal trigger.
To trigger an event when a certain objective or group of objectives have been completed, use the TTR_ObjectiveTrigger (Actor->Triggers->Trigger->TTR_ObjectiveTrigger). This trigger has one property - Objectives. The eight members of this array represent the eight objectives that are possible on the objectives list. Set any of them to ‘1’ if you want the event to be triggered after they have been completed. Otherwise, leave them at ‘0’. Setting any to ‘1’ that go beyond the number of objectives on the objectives list will do nothing.
Instead of using the TimedTrigger class, please use TTR_TimedTrigger. This class works in exactly the same manner but will work better with rounds.
When creating zones in TTR, you should use the TTR_Zone and TTR_WaterZone actors. They allow you to disable wind and change the temperature, which is needed for indoor areas.
Mosquito: Yay, finally a TTR tut, thanks who ever fixed it up before posting it