Cogito, ergo sum
Legacy:Assault Mapping Tutorial/Other Objectives
This page is a section of the Assault Mapping Tutorial. If you have arrived here from some other place, this page will likely make more sense if you start at the above link and read the tutorial through from beginning to end.
Previous Section: Legacy:Assault Mapping Tutorial/Continuing The Assault
Next Section: Legacy:Assault Mapping Tutorial/Adding Vehicles And Turrets (still being written)
So far you've made your way through creating a pretty complete (if a little short) assault map, including a couple of different types of objectives and all the little bits and pieces that go with them. At this point you might be wondering a bit about what kind of options you have beyond what's been shown here when you're putting together your own maps. Well, here's some possibilities:
The UT2004 game comes with several different types of GameObjectives which are useful in Assault maps. Some of these can even be combined with other mapping elements to produce even more possibilities:
These have been pretty well covered in Legacy:Assault Mapping Tutorial/Creating A Destroyable Objective. The obvious use for these is doors, of course, but keep in mind that there's a lot of other things that can be destroyed, and a lot of ways to destroy something. For example, in our tutorial so far, we've been rather assuming that somebody was stupid enough to make a power core with an overload sequence that couldn't be turned off by the bad guys once they've dealt with the pesky invaders. To add a bit of realism, we could add a DestroyableObjective to blow up the console after one has flipped the lever, to prevent deactivation of the overload. For this application, it could just be a quick (doesn't take much to blow it up) thing, but little details like this can add a lot to the feel of a game.
Again, these have been pretty well covered in Legacy:Assault Mapping Tutorial/Continuing The Assault. It is important to note, however, that there are a lot of possible applications for this sort of objective. It's actually rather unfortunate that these seem to have been relegated almost entirely to "flip the lever" sort of goals, because they can do a lot more.
Firstly, keep in mind that while every HoldObjective has to have an associated mover to make it work, this mover doesn't even have to be visible anywhere in the game world (you can even stick it off in solid space somewhere). Also note that if your mover is visible, there's nothing that says it has to have only two keyframes or just a simple movement. There's also nothing that says it has to be small. Be creative!
There are also a couple of variations you can try to add some spice to your HoldObjectives:
- Change the Mover's Object->InitialState property
- The normal way to use them is with an InitialState of TriggerAdvance, but if you set it to TriggerControl instead, then the mover will automatically start moving back to its "home" position when there isn't somebody standing on the HoldObjective. This means that all of a sudden, the objective has become a lot harder because as soon as the attacker who reached it gets killed (or bumped off or whatever), the objective starts "healing" itself.
- Be creative with where you put the HoldObjective
- For example, you can put it on a moving platform (you can even put it on top of its own mover, so that the objective becomes "ride this platform from A to B", etc), and attach it to the mover so it moves with it.
- Use more than one mover
- Nothing says that only one mover can have the same tag. Set up several movers with the MoverTag tag and set them to do different things. Combine this with the "hidden mover" trick and give them different durations and you have a way to trigger events at various points throughout the completion process (just make sure that only the mover which takes the longest is the one which sends an event back to the HoldObjective to disable it). As an example, this technique is used in AS-Convoy to trigger the spawning of C4 packs at timed points while one is standing outside the door.
The ProximityObjective>>TouchObjective is pretty simple: If a member of the attacking team touches it (enters its collision cylinder), it's completed. This can be made a bit more sophisticated, however, by changing the ProximityObjective->ConstraintPawnClass to, for example, require that the attacker touching it be driving a particular type of vehicle ("Get the hellbender to the checkpoint!"), etc.
Again, the ProximityObjective>>UseObjective is also pretty simple: An attacker must get to it and hit the "use" key in order to complete it. The collision cylinder of this objective determines how close somebody has to get before trying to "use" it.
As you might be able to guess from the name, this objective type is used for cases where you want somebody to have to destroy a particular vehicle in order to complete the objective. Unlike most objectives, it doesn't matter where you place this one, and the way you use it isn't actually in the objective actor but mostly in your vehicle factory.
Now, we haven't gotten to vehicles yet in the tutorial (but we'll get there in the next section!), but suffice to say here that whenever you want a vehicle to be in your assault map, you need to place an ASVehicleFactory actor where you want it to spawn to generate the vehicle. Once you have the DestroyVehicleObjective placed in your map, and you also have an ASVehicleFactory which is going to spawn the vehicle you want destroyed, you need to match these tags:
- DestroyVehicleObjective: Events->Tag
- ASVehicleFactory: ASVehicleFactory->VehicleEvent
And the rest is pretty much automatic. Obviously, depending on your application, you may want to trigger the factory to spawn the vehicle when the objective becomes active, set it not to respawn when destroyed, etc. Obviously, you will also want to set all the standard objective properties (event messages, etc) on the DestroyVehicelObjective actor.
Keep in mind that turrets are also spawned using ASVehicleFactory actors, and thus can also be used with a DestroyVehicleObjective ("Destroy the plasma turret!").
The TriggeredObjective is basically a "generic" objective which can be used in many cases when you want to do something not handled by any of the other objective types. This objective will be completed when something somewhere triggers it (by generating an event which matches its Events->Tag). The something somewhere can be a Trigger, or a ScriptedTrigger (it can technically be other kinds of actors too, but if you do this bots may get confused about how to attack the objective, so in general try to stick to Triggers and ScriptedTriggers. Even when doing that, however, you may run into problems if you get too complicated. Test thoroughly.).
Note that the HUD displays generated by a TriggeredObjective will show as being wherever the TriggeredObjective actor is placed, so you will generally want to place it near where the attackers will need to be to do whatever it is that will generate the trigger event or things might get confusing.
It should be noted that a particular type of trigger actor which may be useful in this context (and elsewhere) is the Triggers>>Trigger>>Trigger_ASTeam actor. This is a basic (proximity) trigger which will only trigger if a member of the correct assault team (attackers or defenders) touches it. You can choose which team triggers the actor by setting its Trigger_ASTeam->AssaultTeam property.
Using Optional Objectives
One last thing which isn't exactly a type of objective, but is something to consider when choosing objectives for your map is the use of optional objectives. These are objectives which do not have to be completed in order to successfully complete the map, but can make things easier for the attackers or are otherwise significant events. Examples of these include the bridge control at the beginning of AS-Glacier, and the forward weapon cache in AS-Convoy.
In order to make an objective which is optional, simply go into its properties and set its GameObjective->bOptionalObjective property to True. As with other objectives, you can determine when optional objectives become active using their DefensePriority setting, but they won't prevent the next objective from becoming active as well.
Other Neat Tricks
Flashing Objective Icons
Is the flashing indicator displayed when somebody gets close to your objective not quite right? You can change it by changing the objective's GameObjective->ObjectiveTypeIcon to a different texture. There are several useful animated icons available in the AS_FX_TX package under the Icons group (use the FinalBlend ones) including a hellbender and ion tank icon. Don't like those? Make your own!
Flashing Static Meshes
Want to make it a bit clearer where people are supposed to be going or what they're supposed to be doing? You can take a significant piece of scenery (or two) and make it flash when a particular objective becomes active (for example, a pad on the ground that indicates where to drive a vehicle, or for a UseObjective, make the control panel (or whatever is supposed to be used) flash). To do this, go into the objective's properties and set its Assault->PhysicalObjectiveActorsTag to the tag of the static mesh(es) you want to flash when that objective becomes active.
(The next section is currently being written. We apologize for the inconvenience.)
Return to the Assault Mapping Tutorial main page
This tutorial was originally written and contributed to the Wiki community by Foogod. Questions and comments are welcome! Please either leave them on my personal page or at the bottom of the relevant tutorial page. If you see something which is wrong or unclear and you think needs some correction, please feel free to edit the text directly (that's what the Wiki is for!), but please try to keep the tutorial flow intact (no thread discussions in the middle of the tutorial text, please).
Note: To reduce clutter, comments on the tutorial pages will be periodically moved to the Legacy:Assault Mapping Tutorial/Discussion page. Look there for older comments and thread discussions.