This tutorial will teach you how to setup the
necessary insertion zones, actors, and mission objectives for
all 12 Raven Shield game modes.
This tutorial assumes that you are already
familiar with UnrealED and know how to perform basic functions
in the editor and how to load a simple custom map into Raven
Shield. If this is not the case, take a look at my earlier
tutorial, Building
Your First Raven Shield Map, and then come back to this
one.
Note: If you're
working on a multiplayer-only map and don't care about single
player or coop mission objectives, I recommend you read the
first section of this tutorial--where we build the basic
geometry of our sample map--then skip down to Part III. which
covers Adversarial game types. (But keep in mind that everyone
has a different game type that they love, so if you choose not
to support certain game types, you will alienate players would
have otherwise downloaded and enjoyed your map.)
Let's get started. Create a
builder brush cube sized Height=640,Width=2048,Breadth=2048.
With this cube, subtract a total of six rooms, each spaced 512
units apart, and each with a different texture. Then, subtract
a hallway sized Height=320,Width=320,Breadth=14848 which
connects all six rooms (make sure you align the floor of the
hallway with the floor of the rooms). Your map should look
roughly like this:
Now we're going to designate
a name and purpose to each room; this may seem silly at first,
but I promise it will help us to keep the rooms straight
throughout this tutorial, and it will help you to keep track
of each of the insertions and objectives that we setup for
each of the 12 game types. In the static mesh browser, open
"Garage_SM.usx", choose "Cars", and select "PoliceVan". Right
click anywhere in the first room and choose "Add Static Mesh:
'Garage_SM.Cars.PoliceVan'". I'll refer to this room as the
Front Street. In the static mesh browser, choose the "Bureau"
category and select the "Bureau" model. Right click anywhere
in the second room and choose "Add Static Mesh:
'Garage_SM.Bureau.Bureau'". This room will be the Mayor's
Office. In the third room, place the
'Garage_SM.Trees.plante_02' static mesh. This will be the
Courtyard. In the fourth room, place the
'Garage_SM.cafeteria.Snak_Machine' static mesh. This room will
be the Cafeteria. In the fifth room, place the
'Garage_SM.Bureau.BossTable' static mesh. This will be the
Conference Room. Open the Actor Classes browser, expand
"Emitter | R6SFX", and select "R6SmokeExtraction". Right click
anywhere in the sixth room and choose "Add R6SmokeExtraction
Here". I'll refer to this room as the Back Alley. Adjust the
positioning of the static meshes as necessary, making sure
especially that each one is aligned with the floor.
In
the Actor Classes browser, expand "Info" and select
"ZoneInfo". Right click somewhere in the hallway and choose
"Add ZoneInfo Here". Make sure the ZoneInfo isn't embedded
into the floor. Open the ZoneInfo Properties, expand
"ZoneLight", and set AmbientBrightness to "150". Hold [Ctrl]
and left click to select the hallway floor and the floor of
each room together. Right click and choose "Surface Properties
(7 selected)". Set Main Floor and Sec. Floor to "100" and
select the "Walkable" checkbox. Click the "Apply" button and
close the Surface Properties window. Right click in the first
room and choose "Add Path Node Here". Place path nodes
throughout the map, ideally at least six in each room and 20
spaced throughout the hallway (remember that if your path
nodes are spaced over 1000 units apart you will see a warning
message when you rebuild the map). Rebuild and save the map.
Part I. - Single Player
Single Player Story
Mission
Let's add our first insertion zone. Open
the Actor Classes browser, expand "NavigationPoint |
SmallNavigationPoint | PlayerStart | R6AbstractInsertionZone",
and select "R6InsertionZone". Right click in the middle of the
Front Street and choose "Add R6InsertionZone Here".
Double-click on the insertion zone (represented as a yellow
square) to open the properties window, and expand "Display".
Change m_bOutlinedInPlanning to "False". Change DrawType to
"DT_StaticMesh". Scroll down and select "StaticMesh". Click
the "..." button, and browse to
"Garage_SM.Deployement_Zone.Deployement_Zone_01". Then go back
to the properties window and click the "Use" button. In the 3d
view, the yellow square will change to a larger square with
the word "plan" plastered over it. Reposition and rotate the
insertion zone as necessary so that it does not overlap any
walls or the police van. Vertically, this insertion zone
should sit slightly above the floor. Back in the properties
window, expand "R6Planning". Change m_iPlanningFloor_0 to
"100" and change m_iPlanningFloor_1 to "100". Select
m_PlanningColor, click the "..." button, select the dark red
color in the fourth row, first column, and click the "OK"
button. Expand R6Availability. Set every game type to
"MFO_NotAvailable" except for m_eStoryMode (after the first
one, press [DOWN ARROW], then the "m" key, [DOWN ARROW], then
the "m" key, etc. to do this quickly). Note that 'StoryMode'
refers to the single player practice mission while
'MissionMode' refers to the Coop mission game type
Let's create four evil terrorists for our mission.
Open the Actor Classes browser, expand "R6DeploymentZone", and
select "R6ZonePoint". Right click in the Mayer's Office and
choose "Add R6ZonePoint Here". Open the properties for this
terrorist and expand "R6ZoneTerrorist". Expand "m_Template",
expand "[0]", and change m_szName to "Oil-1". Set
m_eEngageReaction to "EREACT_AimedFire". Expand
"R6Availability" and set every game type to "MFO_NotAvailable"
except for m_eStoryMode. Close the properties window. With
this terrorist still selected, press [CTRL]+w three times to
create duplicates of the R6ZonePoint. Drag one into the
Courtyard, one into the Cafeteria, and one into the Conference
Room, leaving the fourth in the Mayor's Office.
We're
going to make this a pretty complex mission, so that I can
demonstrate different types of mission objectives. First we're
going to place a hostage, then a bomb, then a mission-critical
laptop computer. Select the terrorist in the Cafeteria and
press [CTRL]+w. Open the properties for the new copy; we're
going to change him into a hostage. Expand "R6ZoneTerrorist"
and set m_iMaxTerrorist and m_iMinTerrorist to "0". Expand
"R6ZoneHostage" and set m_iMaxHostage and m_iMinHostage to
"1". Expand "m_HostageTemplates", expand "[0]", and change
m_szName to "Suit2-1". Move this hostage partway across the
room from the terrorist.
Let's add an extraction zone
so that we can rescue this hostage without having to
neutralize all of the terrorists. Open the Actor Classes
browser, expand "NavigationPoint | R6AbstractExtractionZone",
and select "R6ExtractionZone". Right click in the middle of
the Back Alley and choose "Add R6ExtractionZone Here".
Double-click on the extraction zone (represented as a yellow
square) to open the properties window, and expand "Display".
Change m_bOutlinedInPlanning to "False". Change DrawType to
"DT_StaticMesh". Scroll down and select "StaticMesh". Click
the "..." button, and browse to
"Garage_SM.Deployement_Zone.Deployement_Zone_01". Then go back
to the properties window and click the "Use" button. Change
DrawScale to "1.5" to resize the extraction zone. Expand
"R6Planning". Change m_iPlanningFloor_0 and m_iPlanningFloor_1
to "100". Select m_PlanningColor, click the "..." button, and
select the solid green color in the fourth row, third column,
and click the "OK" button. Expand R6Availability. Set every
game type to "MFO_NotAvailable" except for m_eStoryMode.
Next, we're going to place a bomb. Open the Actor
Classes browser, expand "R6InteractiveObject | R6IActionObject
| R6IOObject", and select "R6IOBomb". Right click in the
Conference Room and choose "Add R6IOBomb Here". We could
change the static mesh of the bomb if we wanted to, or we
could hide the bomb actor and place it right on top of a
visible static mesh to represent to bomb, but I think the
default model will work fine here. Open the properties for the
bomb and expand "R6ActionObject". Set m_blsActivated to "True"
to arm the bomb. Expand "R6Availability". Set every game type
to "MFO_NotAvailable" except for m_eStoryMode.
Now
we'll place the laptop computer. Return to the Actor Classes
browser, expand "R6InteractiveObject | R6IActionObject |
R6IOObject", and select "R6IODevice". Right click on the desk
in the Mayor's Office and choose "Add R6IODevice Here". Open
the properties for the device and expand "Display". Select
StaticMesh and then click the "..." button. Open
"Island_SM.usx", choose "BreakableObject", and select
"LapTop". Return to the properties window and click the "Use"
button. Expand "R6ActionObject". Set m_bRainbowCanInteract to
"True" and m_eAnimToPlay to "BA_Keyboard". Expand
"R6Availability" and set every game type to "MFO_NotAvailable"
except for m_eStoryMode. Reposition the laptop to sit nicely
on the desk, so that the Rainbow operatives will be able to
reach it.
Let's place some mission intelligence icons
to indicate the location of our three objectives on the map.
Open the Actor Classes browser, expand "R6ReferenceIcons", and
select "R6HostageIcon". Right click near the hostage in the
Cafeteria and choose "Add R6HostgeIcon Here". Open the
properties window, expand "R6Availability" and set every game
type to "MFO_NotAvailable" except for m_eStoryMode. Expand
"R6Planning". Set m_iPlanningFloor_0 and m_iPlanningFloor_1 to
"100". Drag this icon directly over the hostage. Return to the
Actor Classes browser, expand "R6ReferenceIcons", and select
"R6ObjectiveIcon". Right click near the bomb in the Conference
Room and choose "Add R6ObjectiveIcon Here". Open the
properties window, expand "R6Availability" and set every game
type to "MFO_NotAvailable" except for m_eStoryMode. Expand
"R6Planning". Set m_iPlanningFloor_0 to "100" and
m_iPlanningFloor_1 to "100". Drag this icon directly over the
bomb. Press [CTRL]+w to make one copy of the R6ObjectiveIcon.
Hold [SHIFT], drag the copy into the Mayor's Office, and place
it directly over the laptop computer (you may want to raise it
a bit off the floor). Note that in single player games,
objective icons appear in both the planning stage map and the
in-game map, whereas hostage icons only appear in the planning
stage map.
Next, let's assign terrorists to interact
with each of these actors. Select the R6DZonePoint terrorist
in the Cafeteria and open his properties. Expand
"R6DZoneTerrorist" and set m_HostageShootChance to "80".
Select m_HostageZoneToCheck and click the "Add" button. With
[0] selected, click the "Pick" button, then carefully left
click the eyedropper on the hostage in that same room. Now
there is a high probability that the terrorist guarding the
Cafeteria will try to kill the hostage when he realizes he's
in danger.
Enabling terrorists to toggle (interact
with) bombs and IODevices is a little more complicated; we
need to use InteractiveObjects to tell them what to do. Open
the Actor Classes browser, and select "R6InteractiveObject".
Right click next to the bomb in the Conference Room and choose
"Add R6InteractiveObject Here". Then, open it's properties.
Expand "Advanced" and set bDirectional to "True" and bHidden
to "True". Expand "Collision" and set bBlockActors,
bBlockPlayers, and bCollideActors all to "False". And before
we forget, expand "R6Availability" and set every game type to
"MFO_NotAvailable" except for m_eStoryMode. Expand "R6Action"
and select m_ActionList. Click the "Add" button. Select New,
choose "R6InteractiveObjectActionGoto", and then click the
"New" button. Expand "Goto", select m_Target, click the "Pick"
button, and then click the eyedropper on the InteractiveObject
actor (not the bomb). Select m_ActionList again. Click the
"Add" button. Select New, choose
"R6InteractiveObjectActionPlayAnim", and then click the "New"
button. Expand "PlayAnim" and set m_vAnimName to
"RelaxValve_b". Select m_ActionList once more. Click the "Add"
button. Select New, choose
"R6InteractiveObjectActionToggleDevice", and then click the
"New" button. Expand "ToggleDevice". Select m_aIOBombs and
click the "Add" button. With [0] selected, click the "Pick"
button and left click the eyedropper on the bomb.
Now
reposition the InteractiveObject actor so that it sits a foot
or two above the floor, exactly where you want the terrorist
to stand when he sets off the bomb, and make sure the red
arrow points right at the keypad on the bomb so that he'll
face in the proper direction. Now, Select the R6DZonePoint
terrorist in the Conference Room, open his properties, and
expand "R6DZoneTerrorist". Select m_InteractiveObject, click
the "Pick" button, and then left click the eyedropper on the
InteractiveObject actor we just created (not on the bomb).
That's it! Now, at the first sign of trouble, the terrorist in
the Conference Room will run to the bomb and fiddle with the
mechanics to immediately detonate it. He won't waste any time,
so I recommend placing him a good distance from the bomb. If
you needed to slow him down, you could add additional
animations to the ActionList and increase the
m_fActionInterval value.
If we wanted to, we could
order the terrorist in the Mayor's Office to run to and toggle
the laptop in a similar manner, but we're actually going to
make that laptop a victory condition, rather than a failure
condition of the mission. In other words, I'm going to require
the Rainbow team to place a bug in the laptop as part of their
mission. (Of course this doesn't make much sense outside of a
recon mission, but I want you to see how it's done since we
won't be creating a recon mission in this tutorial.)
Let's go setup all the victory and failure conditions
now. Open the "View" menu in the editor, choose "Level
Properties", and expand "R6MissionObjectives". Select
m_aMissionObjectives and click the "Add" button. Select New,
choose "R6MObjObjectInteraction", and click the "New" button.
Expand "R6MissionObjectiveBase". Change
m_bIfCompletedMissionIsSuccessfull to "False". (Because this
is not the only mission objective, we don't want the mission
to automatically end as soon as the bug is planted.) Set
m_szDescriptionInMenu to "PlaceBugInTheComputer" and
m_szFeedbackOnCompletion to "TheComputerHasBeenBugged". (Both
of these settings pull text from a localization file which
I'll mention in more detail later). Expand
"R6MObjObjectInteraction" and set
m_bIfDeviceIsDeactivatedObjectiveIsCompleted to "True". Select
m_r6IOObject, click the "Pick" button, and left click the
eyedropper on the laptop. If we were to test the map at this
point, the mission would end successfully as soon as you or
one of your operatives bug the computer, regardless of whether
the terrorists are still alive, and regardless of whether the
bomb has detonated.
Don't
close the Level Properties window yet. We're going to create
our hostage rescue mission objective. Select
m_aMissionObjectives again and click the "Add" button. Select
New, choose "R6MObjGroupMission", and click the "New" button.
The 'GroupMission' objective allows you to group multiple
objectives together for situations where an objective can be
accomplished through more than one avenue. For example,
hostages can be rescued by escorting them to an extraction
zone, or by neutralizing all terrorists. Expand
"R6MissionObjectiveBase". Set m_szDescriptionFailure to
"HostageWasKilled" and m_szDescriptionInMenu to
"RescueTheHostageToExtractionZone". Expand
"R6MObjGroupMission". Select m_aSubMIssionObjectives and click
the "Add" button. Select New, choose "R6MObjRescueHostage",
and click the "New" button. Expand "R6MissionObjectiveBase"
and set m_szFeedbackOnCompletion to
"AllHostagesHaveBeenRescued". Select m_aSubMissionObjectives
again and click the "Add" button. Select New, choose
"R6MObjNeutralizeTerrorist", and click the "New" button.
Expand "R6MissionObjectiveBase" and set
m_szFeedbackOnCompletion to "AllTerroristHaveBeenNeutralized".
Note that m_iMinSuccessRequired is set to "1", so that if
either of our two sub-objectives are accomplished, this
"GroupMission" objective will be accepted as complete.
Finally, let's create our disarm bomb mission
objective. Scroll up, select m_aMissionObjectives once more,
and click the "Add" button. Select New, choose
"R6MObjGroupMission", and click the "New" button. Because
there is only one terrorist with orders to detonate the bomb,
we can prevent detonation either by disarming the bomb or by
killing that terrorist. Expand "R6MissionObjectiveBase" and
set m_bIfFailedMissionIsAborted to "True". This will cause the
mission to end immediately if the bomb detonates. Set
m_szDescriptionInMenu to "PreventOneBombDetonation". Set
m_szFeedbackOnCompletion to "BombDetonationPrevented". Expand
"R6MObjGroupMission". Select m_aSubMissionObjectives and click
the "Add" button. Select New, choose
"R6MObjPreventBombDetonation", and click the "New" button.
Expand "R6MObjObjectInteraction". Select "m_r6IOObject", click
the "Pick" button, and left click the eyedropper on the bomb
in the Conference Room. Select m_aSubMissionObjectives again
and click the "Add" button. Select New, choose
"R6MObjNeutralizeTerrorist", and click the "New" button.
Expand "R6MObjNeutralizeTerrorist". Select "m_depZone", click
the "Pick" button, and left click the eyedropper on the
terrorist in the Conference Room.
Before we close the
level properties window, take a look at the
m_szMissionObjLocalization setting. This setting references a
localization file in the "\Ravenshield\system\" directory
named "R6MissionObjectives". (For most of you, the file will
have an .INT extension.) All of the menu descriptions and
success and failure messages we specified are being pulled
from this file. In this sample mission, we were fine using the
standard mission objective descriptions and messages, but for
a very unique or specific custom mission (prevent the release
of SmallPox, prevent the assassination of George Bush, etc.),
you'll probably want to create your own localization file.
Overall, the Mission Objectives settings are pretty flexible
and should allow for some very creative custom missions.
It is important to note that the victory and failure
conditions we specified in this part of the tutorial only
apply to the single player and coop "Mission" game types. All
other game types will automatically inherit the correct
mission objectives as long as you setup the proper insertion
zones, extraction zones, hostages, and devices.
If you
made it this far, you'll coast through the rest of this
tutorial. Let's test out our new single player mission. Make
sure you load the map as a "Practice Mission" since we haven't
setup any other single player game types yet. Important Note: If you still have the map
open in the editor, do NOT launch Raven Shield from the
Joystick button in UnrealED; launch it from a desktop icon
instead. If you launch RvS from the Joystick button, your
mission objectives won't show up in-game. I don't know why
this occurs but it had me puzzled for hours, and I want to
save you my pain. Press [ESCAPE]
occasionally while playing to monitor your objectives and pay
close attention to what triggers completion of each mission
objective.
Single
Player Terrorist Hunt
For our Terrorist Hunt, we
could use the exact same insertion zone that we created for
the single player mission. All we'd need to do is set
R6Availability.m_eTerroristHunt to "MFO_Available". But what
fun would that be? After all, the point of a game type like
tango hunt is to extend the value of the map, to mix it up a
bit. So let's start the player in a different area. Select the
insertion zone we created in the Front Street and press
[CTRL]+w to create a copy of it. Hold [SHIFT] and drag the new
insertion zone all the way into the Cafeteria. Expand
R6Availability. Change m_eStoryMode to "MFO_NotAvailable" and
set m_eTerroristHunt to "MFO_Available".
Now, let's
add some random terrorist insertions points. Note that while
you can use RandomPoints, ZonePoints, and ZonePaths in
StoryMode, you only use RandomPoints in the TerroristHunt,
LoneWolf, and Hostage Rescue game types. Open the Actor
Classes browser, expand "R6DeploymentZone", and select
"R6ZoneRandomPoints". Right click in the Courtyard and choose
"Add R6ZoneRandomPoints Here". (Please note that you should
only ever have one 'R6DZoneRandomPoints' actor in your entire
map.) Open the properties of the actor that was just created
(the larger blue man). Expand "R6ZoneTerrorist". Expand
"m_Template", expand "[0]", and change m_szName to "Garage-1".
Expand "R6Availability" and set every game type to
"MFO_NotAvailable" except for m_eTerroristHunt. Expand
"Object" and set Group to "RandomTangos". Expand "R6DZone".
Select m_aNode and click the "New" button to create a new node
(represented by the smaller blue man). Each RandomPointNode
provides another random spot where a terrorist could spawn.
Select m_aNode and click the "New" button eight more times so
that we have a total of ten RandomPointNodes created. Select
all ten RandomPointNodes, open the properties window, expand
"R6Availability" and set every game type to "MFO_NotAvailable"
except for m_eTerroristHunt. Expand "Object" and set Group to
"RandomTangos". Now, drag each RandomPointNode to a different
area of the map (but don't place any in the Cafeteria, unless
you want a dangerous insertion).
That's all there is
to setting up a terrorist hunt. However, on a full size map,
you should place at least 50 RandomPointNodes, and I recommend
placing closer to 200 so that it seems like terrorists are
never in the same place twice. Load up the map in game, and
try a terrorist hunt with 5 terrorists. (Note that if you set
the game to 10 terrorists or more, all 10 of our
RandomPointNodes will be utilized and there won't be anything
random about it.) When you're done testing, go back to the
editor.
Now is a good time to show you one nice
feature of the editor. Open the "Visibility" menu and choose
"Story Mode (Campaign)". Notice that all of the actors we just
placed have become hidden. Open the "Visibility" menu again
and choose "Terrorist Hunt". Now, the RandomPointNodes appear,
but the hostage, bomb, and laptop computer are all hidden.
Open the "Visibility" menu once more, and choose "All Mode" to
display all actors again.
Single Player Lone
Wolf
For our lone wolf game, let's start the
player in the back alley and then force him/her to cross the
entire map to reach the Police Van. Select the insertion zone
we created in the Cafeteria and press [CTRL]+w to create a
copy of it. Hold [SHIFT] and drag the new insertion zone into
the Back Alley. Expand R6Availability. Change m_eTerroristHunt
to "MFO_NotAvailable" and set m_eLoneWolf to "MFO_Available".
If this insertion zone is too large for your tastes, expand
"Display", and change the DrawScale setting (this only affects
how large the zone will appear in the planning stage). Next,
select the extraction zone in the Back Alley and press
[CTRL]+w to create a copy of it. Hold [SHIFT] and drag the new
insertion zone all the way into the Front Street. Expand
"R6Availability". Change m_eStoryMode to "MFO_NotAvailable"
and set m_eLoneWolf to "MFO_Available".
Since we
already have random Terrorist Hunt deployments placed
throughout the map, it makes sense to reuse them for Lone Wolf
mode. Search out and select all ten RandomPointNodes and the
R6DZoneRandomPoint (the larger blue man) that we placed in the
Courtyard. (It's not the end of the world if you miss a
RandomPointNode or two, but it's important you you get the
R6DZoneRandomPoint.) Since we added these all of these to the
same Group, the easiest way to reselect them all is to first
make sure you don't have any actors selected, then open the
Groups browser, click the "Refresh Group List" button, select
"RandomTangos", open the "Edit" menu, and choose "Select
Actors". Once all 11 actors are selected, open the properties
window, expand "R6Availability", and set m_eLoneWolf to
"MFO_Available".
Single Player Hostage Rescue
For our hostage rescue game, let's use our Lone Wolf
Back Alley insertion zone, plus let's reuse both extraction
zones we created earlier, so that the player can choose to
escort hostages to the Front Street or the Back Alley. Select
the Extraction Zone in the Front Street and the Insertion and
Extraction Zones in the Back Alley together. Open the
properties window, expand "R6Availability", and set
m_eHostageRescue to "MFO_Available". Be careful not to touch
any other settings, or we'll screw up the other game types.
We could use the same hostage from the single player
mission, but I think it would be more fun to create two new
hostages in different rooms. Select the hostage in the
Cafeteria and press [CTRL]+w to make a copy. Hold [SHIFT] and
drag the new hostage into the Conference Room. Open the
properties window and expand "R6ZoneHostage". Expand
"m_Template", expand "[0]", and change m_szName to
"CasualWoman2-1". Expand "R6Availability". Change m_eStoryMode
to "MFO_NotAvailable" and set m_eHostageRescue to
"MFO_Available". With the new hostage still selected, press
[CTRL]+w to make one more copy. Hold [SHIFT] and drag one of
these new hostages into the Courtyard.
Let's also
place two mission intelligence icons to indicate the location
of our two hostages. Select the R6HostageIcon in the Cafeteria
and press [CTRL]+w to make a copy. Hold [SHIFT] and drag the
copy into the Courtyard. Open the properties window and expand
"R6Availability". Change m_eStoryMode to "MFO_NotAvailable"
and set m_eHostageRescue to "MFO_Available". With the
R6HostageIcon still selected, press [CTRL]+w to make another
copy. Drag one icon over the hostage in the Courtyard, and the
other over the hostage in the Conference Room.
I guess
we need some bad guys to guard these hostages. Let's use the
same random terrorists once more. Select all ten
RandomPointNodes and the R6DZoneRandomPoint in our
"RandomTangos" group. (If you use the group browser, make sure
you don't have any actors selected first.) Open the properties
window (confirm that the top of the window indicates '11
selected'), expand "R6Availability", and set m_eHostageRescue
to "MFO_Available". We don't need to assign any terrorists to
guard specific hostages as we did in single player mission
mode; in the Hostage game type, the terrorists will
automatically start gunning for the hostages once you're
spotted.
Part II. - Cooperative
Coop Mission
Since we already have all of our StoryMode actors in
place, we just need to make these same actors available in
coop mode, as well as create some additional insertion zones.
Open the "Visibility" menu and choose "Story Mode (Campaign)".
Select the laptop, bomb, InteractiveObject, terrorists,
hostages, intelligence icons, and extraction zone together
(basically everything except for the insertion zone and our
static meshes). Expand "R6Availability", and set
m_eMissionMode to "MFO_Available". Be careful not to touch any
other settings. Open the "Visibility" menu again and choose
"All Mode".
Notice that we are not sharing the same
insertion zone that StoryMode uses. Coop insertion zones are a
little different, so let's create one from scratch. Open the
Actor Classes browser, expand "NavigationPoint |
SmallNavigationPoint | PlayerStart | R6AbstractInsertionZone",
and select "R6InsertionZone". Right click somewhere in the
Front Street near the StoryMode insertion zone and choose "Add
R6InsertionZone Here". Double-click on the new insertion zone
to open the properties window, and expand "Display". Select
"Texture" and click the "..." button (if the texture browser
doesn't automatically open, open it manually). Browse to
"R6_Common.MP_Coop" (you may need to click the "load entire
package" button to see 'MP_Coop'). Then go back to the
properties window and click the "Use" button. Expand
"R6Planning". Change m_iPlanningFloor_0 to "100" and change
m_iPlanningFloor_1 to "100". Expand "R6Availability". Set
every game type to "MFO_NotAvailable" except for
m_eMissionMode.
Notice that the yellow square has
changed to a smaller blue square with the letter "C" on it.
With the Coop insertion zone still selected, press [CTRL]+w
seven times. Reposition your eight new coop insertion zones so
that they are close, but not too close together. Don't be
afraid to overlap these insertion zones with the single player
mission insertion zone (in fact I recommend placing them all
in the same general space as the single player insertion in a
staggered formation). Now, load the game and test the map in
Coop Mission mode.
Coop Terrorist Hunt
If you've gotten this far in the tutorial, you should
know exactly what needs to be done to enable our terrorist
hunt to work in coop mode. First, select all 11 actors in the
"RandomTangos" group. Open the properties window, expand
"R6Availability", and set m_eTerroristHuntCoop to
"MFO_Available".
We could use the same coop insertion
zones as the Coop Mission Mode, but I think it would be better
if the Coop Terrorist Hunt ran pretty much the same as the
single player Terrorist Hunt, inserting the team into the
Cafeteria. Select one of the Coop insertion zones in the Front
Street and press [CTRL]+w. Drag the new copy into the
Cafeteria. Open it's properties and expand "R6Availability".
Change m_eMissionMode to "MFO_NotAvailable" and set
m_eTerroristHuntCoop to "MFO_Available". Then press [CTRL]+w
seven times and reposition the resulting eight coop insertion
zones.
Coop Hostage Rescue
Select the
hostage in the Courtyard, the hostage in the Cafeteria, both
extraction zones, and all 11 actors in the "RandomTangos"
group, together. Open the properties window, expand
"R6Availability", and set m_eHostageRescueCoop to
"MFO_Available". Select one of the Coop insertion zones in the
Cafeteria and press [CTRL]+w. Drag the new copy into the Back
Alley. Open it's properties and expand "R6Availability".
Change m_eTerroristHuntCoop to "MFO_NotAvailable" and set
m_eHostageRescueCoop to "MFO_Available". Then press [CTRL]+w
seven times and reposition the resulting eight coop insertion
zones.
Part III. - Adversarial
Adversarial Team
Survival
For a Team Survival game on a single
floor map like this one, it makes sense to place the two
team's insertion zones on opposite sides of the map. We'll
start the Green Team in the Front Street and the Red Team in
the Back Alley. Since I know some of you have skipped the
single player and coop portions of this tutorial and jumped
directly to this paragraph, we'll create the adversarial
insertion zones from scratch.
Open the Actor Classes
browser, expand "NavigationPoint | SmallNavigationPoint |
PlayerStart | R6AbstractInsertionZone", and select
"R6InsertionZone". Right click somewhere in the Front Street
and choose "Add R6InsertionZone Here". Double-click on the new
insertion zone to open the properties window, and expand
"Display". Select "Texture" and click the "..." button (if the
texture browser doesn't automatically open, open it manually).
Browse to "R6_Common.MP_Green" (you may need to click the
"load entire package" button to see 'MP_Green'). Then go back
to the properties window and click the "Use" button. Expand
"R6Planning". Set m_iPlanningFloor_0 and m_iPlanningFloor_1 to
"100". Expand "R6Availability". Set every game type to
"MFO_NotAvailable" except for m_eTeamDeathmatch (after the
first one, press [DOWN ARROW], then the "m" key, [DOWN ARROW],
then the "m" key, etc. to do this quickly).
Close the
properties window. You'll notice that the yellow square has
changed to a smaller green square with a 'G' on it. Note that
since multiplayer insertion zones don't show up anywhere
in-game, the texture that you assign in the Display properties
has no effect whatsoever on the functioning of your map. The
sole purpose of assigning these textures is so that you can
keep everything straight in the editor. With that said, I
highly recommend assigning the appropriate R6_Common texture
to each and every multiplayer insertion zone that you create.
With the new insertion zone still selected, press [CTRL]+w
seven times to create seven copies of it. Reposition your
eight Green Team insertion zones so that they are close, but
not too close together. In general, make sure insertion zones
don't ever overlap geometry or static meshes, but there's no
harm in them overlapping other insertion zones from other game
types.
Now, let's create insertion zones for the Red
Team. Select one of the Green Team insertion zones and press
[CTRL]+w. Hold [SHIFT] and drag the new copy all the way into
the Back Alley. Open this insertion zone's properties and
expand "Display". Select "Texture" and click the "..." button
(if the texture browser doesn't automatically open, open it
manually). Select "R6_Common.MP_Red". Then go back to the
properties window and click the "Use" button. Expand "Rainbow"
and set m_iInsertionNumber to "1". Note that this is first
time in this tutorial that we've touched the
m_iInsertionNumber setting. Single player, coop, deathmatch,
and green team insertion zones all use the default insertion
number of "0"; an m_iInsertionNumber set to "1" always
designates the red team for adversarial games. Close the
properties window. You'll notice that the green square has
changed to a red square with an 'R' on it. With the insertion
zone still selected, press [CTRL]+w seven times to create
seven copies of it. Reposition your eight Red Team insertion
zones so that there is some space between each one. (If
necessary, feel free to rearrange the single player and coop
actors to make room for these new insertion zones.)
Adversarial Deathmatch
The Deathmatch game type (also referred to as
'Survival') is one of the easiest game types to setup. Select
one of the Green Team insertion zones in the Front Street and
press [CTRL]+w to create a copy of it. Hold [SHIFT] and drag
the new copy into the hallway. Open the properties window and
expand "Display". Select "Texture" and click the "..." button
(if the texture browser doesn't automatically open, open it
manually). Select "R6_Common.MP_DMatch". Then go back to the
properties window and click the "Use" button. Expand
"R6Availability". Change m_eTeamDeathmatch to
"MFO_NotAvailable" and set m_eDeathmatch to "MFO_Available".
Close the properties window. You'll notice that the green
square has changed to a yellow square with a 'D' on it. With
the insertion zone still selected, press [CTRL]+w 15 times to
create a total of 16 deathmatch insertion zones. Drag each
insertion zone to a different area of the map.
Ideally, you should place deathmatch insertions so
that no player can see another at the start of the game (but
that would be tough to do on our 6-room map). It's been
suggested to me that you might want to place far more than 16
insertion zones for deathmatch games, to add a random element
and prevent players familiar with the map from ever predicting
exactly where another player will spawn.
Adversarial Pilot
For our Pilot game
(also referred to as 'escort'), we'll reuse the same insertion
zones as Team Survival, and require the pilot to make his way
from the Front Street to the Back Alley. Hold [CTRL] and
select all of the Green Team and Red Team insertion zones
together. Open the properties for all 16 zones and expand
"R6Availability". Set m_eEscort to "MFO_Available". We don't
need to do anything special to spawn the 'pilot'; he will
automatically spawn in one of the normal Green Team insertion
zones.
Now, let's reuse the extraction zone we created
for Mission and Hostage Rescue games; double click the
extraction zone in the Back Alley to open it's properties.
Expand "R6Availability" and set m_eEscort to "MFO_Available".
(If you skipped the
single player portion of this tutorial, place a new extraction
zone as follows: Open the Actor Classes browser, expand
"NavigationPoint | R6AbstractExtractionZone", and select
"R6ExtractionZone". Right click in the middle of the Back
Alley and choose "Add R6ExtractionZone Here". Double-click on
the extraction zone (represented as a yellow square) to open
the properties window, and expand "Display". Change
m_bOutlinedInPlanning to "False". Change DrawType to
"DT_StaticMesh". Scroll down and select "StaticMesh". Click
the "..." button, and browse to
"Garage_SM.Deployement_Zone.Deployement_Zone_01". Then go back
to the properties window and click the "Use" button. Expand
"Display" and set DrawScale to "1.5". Expand "R6Planning". Set
m_iPlanningFloor_0 and m_iPlanningFloor_1 to "100". Select
m_PlanningColor, click the "..." button, select the solid
green color in the fourth row, third column, and click the
"OK" button. Expand "R6Availability. Set all game types to
"MFO_NotAvailable" except for m_eEscort.)
Test out the map in pilot mode if you'd like
(choose the Green Team, and if you're the only player you'll
automatically become the pilot). Notice, if you haven't
before, that extraction zones are automatically visible in the
in-game map (this is the case regardless of the game type and
is not based on any settings that we assigned).
Adversarial Bomb
For our Adversarial
Disarm Bomb game, let's place bombs in the Front Street and
Courtyard. Open the Actor Classes browser, expand
"R6InteractiveObject | R6IActionObject | R6IOObject", and
select "R6IOBomb". Right click in the Courtyard and choose
"Add R6IOBomb Here". Open the properties for the bomb and
expand "Display". Select StaticMesh and click the "..."
button. Browse to "R6ActionObjects.MpBomb.MpBomb_01". Return
to the properties window and click the "Use" button. Expand
"R6ActionObject". Select m_ArmedTexture and click the "..."
button (if the texture browser doesn't open automatically,
open it manually). Browse to
"R6_Textures_ActionObject.MpBomb_RED_SHDR". Return to the
properties window and click the "Use" button. Set
m_fDisarmBombTimeMax and m_fDisarmBombTimeMin to "6". Change
m_fGainTimeWithElectronicsKit to "3". Expand "R6Availability".
Set every game type to "MFO_NotAvailable" except for m_eBomb.
With the bomb still selected, press [CTRL]+w to create a copy.
Hold [SHIFT] and drag the second bomb into the Front Street.
Open the properties of the second bomb and expand "Display".
Select StaticMesh and click the "..." button. Browse to
"R6ActionObjects.MpBomb.MpBomb_02". Return to the properties
window and click the "Use" button.
Let's place some
reference icons so new players will know where to find each
bomb. Open the Actor Classes browser, expand
"R6ReferenceIcons", and select "R6ObjectiveIcon". Right click
near the bomb in the Courtyard and choose "Add R6ObjectiveIcon
Here". Open the properties window, and expand "Display".
Select Texture and click the "..." button (if the texture
browser doesn't open automatically, open it manually). Browse
to "R6Planning.Icons.PlanIcon_Bomb_A". Return to the
properties window and click the "Use" button. Expand
"R6Availability" and set every game type to "MFO_NotAvailable"
except for m_eBomb. Expand "R6Planning". Change
m_iPlanningFloor_0 to "100" and change m_iPlanningFloor_1 to
"100". Drag this icon directly over the bomb and raise it off
the floor a bit. Press [CTRL]+w to make a copy. Hold [SHIFT],
drag the copy into the Front Street and place it over the
second bomb. Open the properties of the second bomb and expand
"Display". Select Texture and click the "..." button (if the
texture browser doesn't open automatically, open it manually).
Choose the "R6Planning" package, choose the "Icons" group, and
select "PlanIcon_Bomb_B". Return to the properties window and
click the "Use" button.
Since the Green Team needs to
defend the bombs, let's reuse the same insertion zones as
before, starting the Green Team in the Front Street and the
Red Team in the Back Alley. Hold [CTRL] and select all of the
Green Team and Red Team insertion zones together. Open the
properties for all 16 zones and expand "R6Availability". Set
m_eBomb to "MFO_Available".
Adversarial Hostage
For our Adversarial Hostage game, we'll place hostages
in the Mayer's Office and Cafeteria, and start the rescuing
Green Team in the Back Alley. Open the Actor Classes browser,
expand "R6DeploymentZone", and select "R6ZonePoint". Right
click in the Mayer's Office and choose "Add R6ZonePoint Here".
Open the properties for this actor; currently he's a
terrorist, but we're going to change him into a hostage.
Expand "R6ZoneTerrorist" and set m_iMaxTerrorist and
m_iMinTerrorist to "0". Expand "R6ZoneHostage" and set
m_iMaxHostage and m_iMinHostage to "1". Expand "m_Template",
expand "[0]", and change m_szName to "CasualMan1-1". Expand
"R6Availability" and set every game type to "MFO_NotAvailable"
except for m_eHostageRescueAdv. With the hostage still
selected, press [CTRL]+w to create a copy. Hold [SHIFT] and
drag the second hostage into the Cafeteria.
Let's
place some hostage icons so new players on the map will know
where to go. Open the Actor Classes browser, expand
"R6ReferenceIcons", and select "R6HostageIcon". Right click
near the new hostage in the Cafeteria, and choose "Add
R6HostgeIcon Here". Open the properties window, expand
"R6Availability" and set every game type to "MFO_NotAvailable"
except for m_eHostageRescueAdv. Expand "R6Planning". Set
m_iPlanningFloor_0 and m_iPlanningFloor_1 to "100". Drag this
icon directly over the hostage. With the R6HostageIcon still
selected, Press [CTRL]+w to make a copy. Hold [SHIFT], drag
the new icon into the Mayor's Office and place it over the
first hostage.
Now let's make new Back Alley insertion
zones for the good guys, the Green Team. Select one of the
Green Team insertion zones in the Front Street and press
[CTRL]+w to create a copy. Hold [SHIFT] and drag the new copy
all the way into the Back Alley. Open it's properties and
expand "R6Availability". Set m_eHostageRescueAdv to
"MFO_Available" and change every other game type to
"MFO_NotAvailable". Then press [CTRL]+w seven times and
reposition the new insertion zones so that there is some space
between them.
Since it's the Red Team's job to guard
the hostages, let's create new Red Team insertion zones in the
Mayer's Office and Cafeteria. Select one of the Red Team
insertion zones in the Back Alley and press [CTRL]+w to create
a copy. Hold [SHIFT] and drag the new copy into the Mayer's
Office. Open it's properties and expand "R6Availability". Set
m_eHostageRescueAdv to "MFO_Available" and change every other
game type to "MFO_NotAvailable". Then press [CTRL]+w seven
times so that we have a total of eight Red Team insertion
zones in the Mayor's Office. While it tends to encourage
teamwork, there is no rule that says that all teammates need
to be inserted in the same area of the map. So, let's drag
four of these new Red Team insertion zones into the Cafeteria
and reposition the other four in the Mayer's Office.
To make the game more interesting, I think we should
offer the Green Team two possible hostage extraction zones, on
either ends of the map. Select the extraction zone in the
Front Street and the extraction zone in the Back Alley
together and open the properties window. Expand
"R6Availability" and set m_eHostageRescueAdv to "MFO_Available".
(If
you skipped the single player portion of this tutorial, no
problem: Select the Pilot extraction zone in the Back Alley
and open it's properties. Expand "R6Availability" and set
m_eHostageRescueAdv to "MFO_Available". With the extraction
zone still selected, press [CTRL]+w to copy it, hold [SHIFT]
and drag the copy all the way into the Front Street. Open the
properties window, expand "R6Availability", and change
m_eEscort to "MFO_NotAvailable.)
Conclusion
One of the most important
concepts I can stress in this tutorial is that, like other
actors, you can share insertion and extraction zones
between game types, but you don't have to. It all depends on
where it makes sense strategically for the insertion and
extraction zones to be, and on how much variety you want to
add to each game type experience.
Now that you've
mastered every game type, I encourage you to enable the maps
you create to support every mode possible (in some small maps,
not all game types will make sense). The more game types your
map supports, the more lasting value your map will have. Note
that if your map does not provide support for any of the 12
game types, make SURE that you remove the appropriate
'GameTypes=(package=R6Game,type=GameTypeHere,maxNb=16)' lines
in your .INI file so that those game types are disabled in the
game.
I hope you found
this tutorial helpful. If there's anything I've gotten wrong,
please let me know and I'll correct the information. Email me
if you have any questions or mapping issues you'd like to
discuss. -Beckett
|