UPBoss111's Guide to the Scenario Editor (for dummies!)

## Introduction

Hello! Welcome to a semi-official guide made by UPBoss, one of the many mapmakers in the Community. (Albert changed a lot of stuff in here so it might not seem as beginner-friendly as it once was)

Or, if that's a bit too wordy for you, you can also call it **Scenario Editing 101.**

My name is UPBoss111 (in-game, anyway) and I have only some experience in teaching and writing instructional guides, but I'll do my best to bring you up to speed on the Scenario Editor and how to use it, in layman's terms if needed. There are many expert mapmakers who make scenarios and upload maps, me included. For more links, go to the appendix at the bottom of this page.

## Overview

First, go right out to the main menu. Then look at the top bar, yep, that one with "Multiplayer" and "Settings" and "Customize".

Then you should see, in the fifth button, "Editor". Click on this tab, and it should bring you to a page with a showcase of scenarios. Just for future reference, **Featured scenarios** have been chosen by Justin as the new, trending scenarios and are refreshed regularly. (I think.) **Community scenarios** is a showcase of every single scenario that has been released to the public. It has many, many pages. In order to find what you're looking for, you may want to use the search and filters above the showcase to narrow your search. And **Favorite scenarios** are scenarios that you have saved to your Favorite collection. To Favorite a scenario, right-click on the scenario **name** at the top and select "Add to Favorites". Then you can see it in your Favorites section!

But what you're looking for is the big **Scenario Editor** button, in the upper left. Click on it and proceed...Your first time entering the scenario editor may be a bit daunting. And indeed it should be. The best scenarios are multifaceted monstrosities bursting with complexity, and have many different aspects that come together to make them enjoyable. I'll cover the tabs on top first.

### General

This is indeed the tab for general information, such as the name of your scenario, its filename, and a description to go with it. As well as the game mode and map, if you're using a different one. There are also buttons to import and export scenarios, which are in .json format, and "share scenario", which uploads to the community page. On the Steam version (get it here), it will prompt you asking where you want to upload your scenario, to the community page, to the Steam Workshop, or both.

As well as the all-important **Save** and **Open**. "Save", well, saves your scenario to your scenario list. ***Remember to save often!*** "Open" allows you to open a scenario of yours to edit, or to see what's inside a public scenario. (note: with the setting "bPreventEditing" activated, you can still view a scenario, however you will not be able to save, export or select anything. Bear this in mind if you want to turn it on for your scenario, that anything you don't want the viewers to see is covered.)

### Settings

The nitty-gritty stuff that sets the rules and restrictions for your scenario/game/map. There are a bunch of settings, including boolean toggle settings (should players be allowed to do this? should we allow that?) and number settings (how long should the game last? how many bots are there?). Depending on what you want players to actually do in your scenario, you may need to change some of these. Add additional settings by clicking on the "+ New Setting" button.

Check out another separate guide on settings here.

### Objects

This is the tab that will allow you to add things to your map. Click on it, and there are a multitude of categories of objects that can be added to your map, each with different types. For example, obstacles (which are, essentially, *things* that you can't interact with), vehicles, interactables (switches and buttons and levers), and pawns (characters, bots, any AIs we'll get to later). And each item has its own data values that essentially make it up. Like DNA. There is a compendium of these data values here, as well as a table at the end of this page (took me a long time to make). Remember that each object has a unique id that is used by the game to identify it.

### Brush

A convenience tool. It allows to place large amounts of certain types of objects by just clicking on the map, and is much more efficient to use when doing things like adding trees for scenery for example. Note that the rotation of the placed object will be relative to the location of the last placed object.

### Structures

Structures are essentially black shapes that you can use to add walling and buildings to your map. You can't walk into them unless they have "bNoBody" enabled. And, with the introduction of a recent update, a standard "polygon" object was added, a rectangular whose size you can change to your liking. These are best for making walls and borders, as well as buildings that are just there for environment.

### Triggers

Hoo boy. This is where the hard stuff lies. If you want to give your scenario functionality and code, triggers is where you do it. Clicking "+ New Trigger" will open up a modal window to make your trigger with. Inside *that* window, there are even more features. Don't panic! We'll cover the triggers later.

### Functions

A function is basically a trigger, without an event or conditions. It's literally just a sequence of actions that you can call in a trigger or other function so you don't have to copy over the actions everywhere.

### Macros

A few actions designed to make your life easier while building the map. Click "Execute" to run.

* **performanceCheck** - shows a window that details the amount of each type of things on your map.
* **moveObjects** - moves all objects, or objects of a specified type, by an amount of pixels horizontally (x) or vertically (y).
* **removeObjects** - removes all objects, or objects of a specified type.
* **setKeyForAllObjects** - sets one data value for all objects, or objects of a specified type. Unfortunately, you cannot use this to set all boolean values to true or false, as it can only set strings and numbers.
* **addEdgeTrees** - covers the edges of the map in a specified type of tree.

### Tiles

For custom maps, you have to use the tiles section to paint the terrain with water, sand, grass, and concrete. Each tile is 256 x 256 pixels and can be painted with a different type of tile. You can set the amount of tiles in the map size in General, in the Tiles button.

## Pawns

Characters/humans and dinosaurs (living things), known technically as **pawns**, are all the AI and players and characters and dinosaurs on the map. Characters and dinosaurs all have their own data values. All humans are "characters". Again, you can find their data values here. But I'll list some important ones. You can find my complete table of data values in the appendix at the end of the page.

To add an AI/Bot, click on the "Objects" tab and select the "Pawns" section. You'll see a "character", and a bunch of "dinosaur"s to choose from.

We'll go with a human for now. Click on the character. You'll see a human holding a pistol appeared on the map. This is a bot at its simplest. This bot, when you start the game, will stay at the same place and do basically nothing. Until an enemy appears in range. Then it will start firing its pistol at the enemy.

### Customizing Avatar

The avatar is what characters look like. Just like in the Customize section of the main menu, where you can change your appearance, you can also change appearances for bots. Click on the "avatar" key. Here you can mix and match clothing articles to make your bot avatar. There is a body, headgear, facewear, eyewear, and facial hair among other things. You can customize it however you'd like, and it won't cost you a thing.

Alternatively you can use the avatarId key. This shows you a list of preset character avatars that you can choose from, including some characters from the original Dinogen game. It also contains zombie and juggernaut.

Bot avatars can be changed using setCharacterAvatar trigger action.

### Customizing Weapons

You can customize the equipment and gear your bot has. This is done through four values: *inventory* (for primary/secondary firearms), *melee* (for melee weapons), *equipment* (for gadgets), and *grenade* (for grenades.)

Inventory slot is an array of two weapons. For each weapon, you can change the "id" key to change the actual weapon, as well as changing the name of the weapon, the magazine ammo and reserve ammo, as well as the weapon attachments. **Tip: if you want to vary weapons, you can use {special:randomFirearmId} to give the bot a random weapon every time you play the game.**

Melee: select a melee weapon from dropdown menu. Use {special:randomMeleeId} for a random melee weapon.

Equipment: select a gadget from dropdown menu. Use {special:randomEquipmentId} for a random gadget.

Grenade: select a grenade from dropdown menu. Use {special:randomGrenadeId} for a random grenade.

Bot weapons can be changed with setCharacterInventory and setCharacterInventoryItem trigger actions.

### Changing the Health

You can change the health of your bot by inputting an integer into the health key. Default player health is 200. Setting damageMultipliers can make the bot take more damage from different sources (bullet, melee, explosive, fire, world). You can also turn on bGodMode, which will make the bot completely invulnerable to any damage (except for the /killBots command). If you want the bot to be tougher without increasing the size of the health bar, use damageMultipliers.

### Changing the Behaviors

Bots can be programmed to do a variety of things. Here are some of the associated values:

* **bBot** - enabling AI. Bots have this on by default, if you turn it off they will not do anything whatsoever.
* **bCamp** - making the bot stay in the same place. It will not move on its own if enabled.
* **bIgnoreEnemies** - preventing the bot from targeting enemies. It will not attack enemies if enabled.
* **bIgnoreOutOfSight** - preventing the bot from seeing through walls and objects.
* **bInteract** - allowing the bot to interact with objects such as levers, vehicles and mounted weapons. Note that bots can still open doors with this disabled.
* **bInvestigate** - when bIgnoreOutOfSight is enabled, it will investigate nearby noises.
* **bSwitchToMelee** - allowing the bot to switch to melee when moving (to go faster).
* **botSkill** - this determines the skill of a bot on a scale of 0-4 (0 = easy, 1 = normal, 2 = hard, 3 = insane, 4 = god), changing its behaviour, allowing it to fire more often with a higher level of accuracy. Bots with skill hard or up can sprint.
* **investigatePosition** - setting the location for the bot to investigate when the game is started.
* **maxRange** - when bIgnoreOutOfSight is enabled, sets the maximum range at which a bot can spot enemies.
* **wanderArea** - setting a pixel radius (integer) for the bot to randomly walk around its starting position.

You can also set a name for your bot using pawnName, which will give it a name under its health bar and this name will also appear when the bot is the target object during a cinematic.

### About Teams

Unless you are making some kind of scenario where everyone gets along in some sort of sandbox utopia, you are going to have to set some enemy teams for your map. Every individual team is classified with an integer, and all bots will attack other enemies (targets that are not part of their own team.) By default, all players start on **team 0**. You know how in a multiplayer lobby, you can pick and choose which players go on team 1 and which players go on team 2? That UI team 1 (refer to the lobby team setting as "UI") is the editor team 0. And the UI team 2 is the editor team 1. All editor teams 2 and past have no UI equivalent. Don't get confused.

To set a team for your bot, scroll down to the "team" key. Then input an integer. By default, the "allied" team is 0 and the "enemy" team is 1, but you can set this to any integer that is not the player team. Then you will have a bot that will attack you and other team 0 bots. The number of teams is technically unlimited, so you can have 1,000 teams of bots all attacking each other. Remember that all AI bots will attack any target that is not on their own team. **Tip: to have a bot that is an enemy to everything else, use team "-1". This means that it will be on no team at all. It will still attack other -1 bots.**

*Note: In Free for Alls, each player is placed on their own team (the first player is on team 0, the second player is on team 1, etc.) This means that having "enemy" bots on team 1 won't work properly, as the team 1 bots will be on the same team as the second player. As such, they will attack all players except for the second player. In order to have some zombie/mercenary faction that attacks all players but not each other, place them on team 12. Or team 100. Or team 762. It doesn't matter as long as the team number is higher than the maximum amount of players (currently 12, so the maximum index is 11).*

## Triggers

This won't be easy for either of us, but I have to explain this. Try clicking the "+ New Trigger" button I mentioned earlier. You'll see a window.

In the top, is the name of the trigger and the "Delete" button. As well as a "Repeats" field that takes a number. What does that do, you ask? It essentially puts a limit on how many times this trigger can run before it is deleted. Leaving it blank lets it run an infinite number of times.

### Events

In the upper left, is an **"Event" dropdown menu.** There are many different events. These are designed so that the trigger knows when to run, for example, when this enemy is killed, do something! Hence the name "trigger". Certain events also have event **parameters**. For example, click on "objectKilled" event. This event runs when an object is killed, that is, destroyed or killed by means of a weapon, explosion or another form of damage. Objects that are removed from the map, such as those removed with "removeObject" action or helicopters leaving the map do not count, those are covered in "objectRemoved" which counts any object removal. (Including killed objects.) Back to "objectKilled", you will notice some parameters appeared. Such as "**objectId**". This is the id of the object/pawn that was killed. You can access this objectId by referencing {objectId} in one of the actions. Or, you can click on the pencil button and edit the objectId parameter. By setting it to something, you will be telling the trigger to only execute when an object with *that specific id* has been killed. There's also **type**, which is the type of the object killed (dinosaur, character, helicopter, obstacle?). You can edit it by choosing a type from a drop down menu. And **team**. Same as objectId, you're telling the trigger to run only when an object on that team has been killed.

### Conditions

In the lower left, is the **conditions area**. You can add conditions. The trigger will check that each condition is true before executing it. One false condition and the trigger won't run. Each condition differs but all of them have an operator (checks whether the value is equal to, greater than, less than, etc) and an actual value, which the operator is comparing. For example, add a "numPawns" condition. You'll see team 0. This will check for the number of pawns (characters and dinosaurs) on team 0. Select an = operator, and add a value. Then press "ok". This condition will appear in the bottom left and the trigger will now only run when there are that number of pawns on team 0.

### Actions

And in the right, the **actions area**. This is what you want your trigger to do. There are a ton of actions, and each do different things and have different keys that you need to fill out. Here are a few of the more important ones:

* **createObject** - creates an object with the specified type, at the specified position, with those attributes you set.
* **removeObject** - removes an object with the specified id.
* **setDataValue** - sets a single data value of an object. This can be virtually anything, from name to rotation to team. Does not work for arrays.
* **message** - displays a message on the screen for all players.
* **respawn** - if the target player is not currently "alive" (meaning on the map and not dead or spectating), it will respawn the player. Most of these data values are optional. If you do not set "position", it will respawn the player at a random spawnPoint. If you do not set "inventory", it will respawn the player with whatever items they had before. This action is in the default "trigger\_playerJoined" trigger.
* **startCinematic** - this will allow the player to pass a cinematic object and fill it up with scenes, that can be set to make a target object talk.

Something important to note, you can set a trigger to be executed when a switch is pressed or a triggerArea is touched. This will execute the trigger no matter what the event is (even if there is no event) as long as all conditions are met. The switch/triggerArea will pass the id of the object that used it as an {objectId} parameter. Bear this in mind if you use "objectUsed", as the objectId parameter will override the switch's parameter and pass the id of the switch, not the user.

## Aesthetics

Making your map look good is... harder than it sounds. Some mapmakers (notably Albert, mrcheesypuff and Bravo 6) specialize in making good-looking maps. One of them will probably write a better guide to the aesthetics than I ever could, but this is a humble introduction to making your map look good.

### Terrain Tiles

To form the fundamental background of your map, you need to add Tiles. These can be found in the "Tiles" tab. You may notice that certain tile types are placed alongside each other because they are meant to go together, like pieces in a puzzle. As of now there is no way to rotate tiles or make your own, therefore you need to align your tiles properly so that nothing looks *too* wrong. Certain tiles are just consistent solid textures (most of the starter tiles such as grass and concrete) and can be used to paint the entire map if you so wish. Note that, if you want a map that is predominantly grass, concrete, water or just black tiles, you can change all the map's tiles by selecting "Tiles" in the General tab and clicking on "Replace Existing Tiles".

### Trees and Other Scenery

Any sort of nature/forest map needs **trees**. Yes, forests have trees *[citation needed]*, and you can find these trees by clicking on the "Scenery" section in the Objects tab. Or, if you're going to have a lot of trees, you can turn to the Brush tool and paint the map with trees using the brush. try to make the type of tree fit the terrain - that is, if you're doing a woodland forest, use the normal tree, and if you're in a desert oasis-type area, maybe a palm tree would be more fitting. Ideally, your trees should be different rotations, which is where the Brush comes in handy (see the Brush section above.) Try to alternate between big trees, small trees, and bushes. You can also place bushes on top of wooden barrels to give the impression of a potted plant.

*Note: if you should ever want to coat the edges of the map with trees, there is a macro action in the Macros tab (addEdgeTrees).*

### Interior Designs

Most scenarios will have an indoor element where you'll have to hide in a house, clear the compound, locate the documents, etc. The methods for interior design are totally different from that of the methods for outdoor design. Basically, you have to organize things, plan rooms, and be wary of long corridors and lines of sight. There are a plethora of objects and furniture that can be added to indoor locations, found in the "Objects" section of the Objects tab. There are desks, cabinets, beds, boxes, and a bunch of other stuff. And doors, too! Doors can be customized, from the standard swinging "wood" door to the "sliding" door. Personally, my strategy for interior design is: Use polygon structures for walls. The introduction of the adjustable box polygon has made walls a lot easier to make, instead of spamming "D" key for building\_small\_2 structures. Place these walls on the tile borders, and then change the inside tiles to concrete or tiled tile.

## Multiplayer Adaptation

Aside from the ol’ clashing objectIds problem, a recurring issue in scenario making is when you want to, say, take a singleplayer mission/mode from another game or something and build it in Dinogen Online. But, once it is released, anyone can just select it in a custom game, invite 11 friends (ok that’s actually unrealistic but still possible), and in your game meant for singleplayer, there will be (up to) 12 players running around and cheesing the level in one-eighth the normal time. In order to prevent this “cheesing” from happening, there are a few ways to adjust and/or balance your scenario:

### Local Play Lock

One of the possible methods is to entirely restrict your scenario to local play. This will ensure the game will end itself when started in multiplayer, thus stopping groups of players from cheesing the scenario. However, I have not seen anyone use this method, and it could put off some random duo who just wants to play a random fun scenario. It is recommended to only use this method if your scenario absolutely needs to be played in singleplayer, and the rest of the methods listed here have been tried and don't work.

1. Add a trigger with the event `gameStart`.
2. Add a condition with the condition `isMultiplayer`.
3. Set the operator to == and the value to `true`.
4. Add an `endGame` action. This will end the game in any outcome you want, ideally set the condition text to something that indicates this is a local play-only scenario, such as "Play this scenario in Local Play".

### Difficulty Adjustment

This method is slightly more common than the Local Play Lock, and uses the number of players to determine how hard the scenario should be, based on a number of factors including bot difficulty, bot speed, and equipment available. Inversely, you can also use the number of players to make the scenario easier if there is only one player or in local play, typically by granting the player stat boosts and/or AI helpers. This is a solid method for PvE and Survival scenarios. Note that you may not be able to effectively counter players joining/leaving mid-game, except by turning off `bJoinInProgress`.

#### Bot difficulty

*\*When the `executeMacro` trigger action is fully working, you will be able to use this instead of the `setGameValue` action.*

1. You need to have all of your bots' (at least the ones whose difficulty you want to be adjusted) `botSkill` keys set to `{setting:botSkill}`. This will set the bot's skill to whatever skill was set in the game settings/values.
2. For every difficulty step, add a trigger with the event `gameInit`.
3. In each of these triggers, you need a condition which detects `numPlayersAlive`, assuming that all players spawn on join through the default `trigger_playerJoined` trigger.
4. Add a `setGameValue` action to each trigger with the key `botSkill` and the value to the skill number (see the pawns section). Recommended settings: 1-2 players - 2 (Hard), 3-6 players - 3 (Insane), 7+ players - 4 (God). You can adjust these as needed.

#### Stat boosts

1. Add a trigger with the event `gameInit`, and with a `numPlayersAlive` condition. Depending on the scenario, you might want to give a duo (2 players) stat boosts but in most cases a solo stat boost will do, so set the value to 1.
2. Now for the fun part. Add `setDataValue` actions with the objectId set to `{playerId:0}`. This will apply the boosts to the first player only.
3. Some different attributes you might want to change are maxHealth (default 200), health (default 200), baseSpeedMultiplier (default 1), or you can use `setCharacterInventoryItem` to give the player a special item.

#### AI helpers

1. Add a trigger with the event `gameInit`, and with a `numPlayersAlive` condition. Set the value to 1.
2. Use `createObject` to add a few AI soldiers on the same team as the player, that spawn near the player. Give them some decent gear and stats, and maybe botSkill 2 or 3, to compensate for the solo player.
3. For every helper created, add a `setAI` action, set the objectId to the id of one of the helpers, and set the followTargetId to `{playerId:0}`. This will make the bot follow the player. Do this for each character you add.

## Collaboration

Collaboration in scenarios is a great way to get peer feedback and perspectives and work with others to make the best possible version of a map. Sometimes, especially in particularly large or advanced scenarios, it becomes downright necessary. Multiple great scenarios have been collaboration jobs, one notable example is Bravo 6's *The Battle for Dinogen City*. Ideally you want to have multiple editors who are each skilled in a different aspect of the Editor, such as one or two for mapmaking, one or two for design and flow, one or two for triggers, etc.

**However**, there are multiple considerations and dangers when attempting a collaboration map. As you may have noticed, the Scenario Editor is entirely local. That is, collaborative synchronous editing like Google Docs is not supported (yet). You open it, you work, and you save. But it's not hard right? You can still do collaborative editing by just saving changes and importing new files, right?

**WRONG!**

You see, what tends to happen, especially with larger numbers of collaborators/editors, is that two or more people are editing the map at the same time, working on separate parts of the map. So they both finish up their edits (that took hours to do), save the file, export it, and upload both files to the Discord server or whatever chat group they use. But here's where the problem starts.

When the next person comes along to work on something else, they'll see two files. One from each of the previous editors. You can only import one file into the Scenario Editor, so which one do you use? As you can see, you have fallen into the trap of having two files with separate edits. And in order to combine the changes, you will have to upload one file, and manually read all the changes from the other and add them into the first file. All that hard work undone, and a pain in the butt to repair.

So how do you prevent it from happening in the first place? Well, you start by ensuring that no two people are editing at the same time. You can do this by imposing a sign-in/out system where someone who wants to work on the map does not start before the previous person has finished. That way, the previous editor can save the file, send it, then the next person can download that file and start working with the new content in. It's simple, as long as nobody edits at the wrong time. And when sending the files, also say what you changed so that the next editor doesn't undo it by mistake.

Alternatively, you could use a GitHub repository. Apparently on GitHub it's really easy to merge changes (?) so multiple people can edit and just merge the files afterward (?). But this is still risky and could result in confusion, so still try to limit the concurrent editing. I (UPBoss111) have created a repository for this purpose, for all Dinogen collab mapmakers to safely store their changes in. The repository is at https://github.com/UPBoss111/Dinogen-Scenarios, message me and I'll add you as a collaborator (just someone with repository access) and you can upload and change the files (in your folders that I will create for you) as you wish.

To conclude, scenario collaboration can be terribly dangerous if the proper precautions are not taken, but if systems are set up to ensure efficient editing, it can result in some of the most awesome scenarios we see in the Featured section. Go do a collaboration.[1]

## Walkthroughs

In this section I will be discussing some common scenario features and how to implement them.

### Shop Buttons

To give players custom items that aren't in the shop, you may need to use buttons/switches for purchasing items. Here's a quick guide on doing that.

1. Go to "Objects", select "Interactables", and click on "lever". This will add a lever to your map.
2. Click on the lever. You could technically keep it as a lever, but personally I use buttons. To change the switch type, click on the "leverType" key. There are currently 3 types, (lever, button, tv\_small). You want to select "button", which will make it a button type.
3. This step is optional, but recommended if you want players to know what they're buying. Select the switch and click on "indicatorData". You can change the text and icons, which will show up above the switch as text and icon. Ideally put the item's cost in your text.
4. Go to "Triggers" and make a new trigger. Optionally, call it something like "trigger\_buyItem".
5. Now you want to add the appropriate content to the trigger. There are two ways to accomplish this: with the lever {objectId} parameter or the objectUsed event. The objectUsed event offers more versatility, but the lever {objectId} parameter is simpler to do. We'll go with the lever parameter.
6. Don't add an event. Add a condition, and set the condition (on top) to "playerStateValue".
7. Set the key to "money", the playerId to "{objectId}", and the operator ">=" (This will check if the player has enough money). Then set the value to however much you want the item to cost.
8. In the actions section, you will primarily need two actions. One to subtract the money, and one to actually add/spawn the item. Add an "addPlayerMoney" action. We'll be using it to subtract the money (because adding a negative = subtracting a positive).
9. Set the playerId to "{objectId}". You really don't need to worry about the playerIndex with a shop button. Leave it null. Then set the value to subtract however much the cost is, for example, a $10,000 item has an addPlayerMoney value of -10000.
10. Next, you need to add an action to give the item. In most cases the shop will give a weapon of sorts or equipment, but you could also summon a vehicle/NPC ally/any other thing, really. To grant a weapon, use setCharacterInventoryItem. To grant a vehicle/NPC ally, use createObject.
11. For setCharacterInventoryItem, you need to set an inventory index to add the item to. That being said, it starts at 0 and there are five slots. 0-1 = firearms/weapons, 2 = melee, 3 = gadget/equipment, 4 = grenade. Set the appropriate index number, set the objectId to {objectId}, and you're free to pick out a weapon/equipment from the dropdown menu and adjust it however you'd like.
12. Save the whole trigger, and remember that switch you placed? Click on it, and scroll down to the "triggerId" key. Select your trigger from the dropdown menu and save. Then, it should work!

### Scenario Objectives

Adding quests and objectives is a great way to give a linear mission scenario a purpose. People can follow these objectives, and they can be updated and completed at any time by using trigger actions. You can add a quest at any point, but in this example we'll have it from the start.

1. Select the default gameInit or gameStart triggers. It really doesn't matter unless you're having a start timer (gameStart only starts when the start timer ends)
2. Add an action "addQuest". This action has 4 keys. QuestName, which is the large text on the left of the bar, QuestDesc, which is the smaller description on the right of the bar, objectives, which is the array of initial objectives, and questId which is the id of the quest. Set the text-based ones to their values.
3. Select the "objectives" key. You'll see an array, currently only has one objective.
4. You can add multiple objectives. Each one has an id, set these to what you want (but make them different). The ObjectiveDesc key is the text that is displayed on the UI. The targetId, when set to an object's id, will highlight that object with an arrow and automatically complete the objective when that object is killed. (I think.) Otherwise, you can remember this objective id and complete it later.
5. To update the objective to be complete, make another trigger with the event of your choice (that will trigger the completed objective.)
6. Add an action "updateQuestObjective". You can find this at the bottom of the dropdown menu, just scroll all the way down. This action has 3 keys, the delay (don't worry about it), the objective data and the questId. Add the questId, because if there are multiple quests this can conflict.
7. The objective key is a dictionary which has two more keys. id, the id of the objective, and bComplete, which is a boolean value. Setting the boolean value to false does nothing. Setting it to true will display the objective as complete on the UI and remove it from the quest.
8. If you want the game to end when this objective is complete, make another trigger with event "questObjectiveIsComplete".
9. Set the objectiveId to the id of the objective and the questId to the id of the quest. Assuming you want the players to win, add an endGame action, set the winning team to 0 (or whichever team is the player team) and add in victory condition texts accordingly.

### Extraction Vehicle

So your player team has got into the enemy base, killed a bunch of Militia (or Dinogen I dunno.), blew things up and now they have to get out alive. To accomplish this, you can use an extraction vehicle that arrives at the extraction point and all players need to get to it to escape and win the game. Can be in the form of a ground vehicle (at the extraction point), or a helicopter that can either extract the players immediately, or extract all players who are under it at a given time (advanced mapmakers only). For now, we'll stick with the simple extraction MRAP.

1. First, one needs a variable to track the number of players who have to extract, you can set a variable to increase by 1 whenever a player joins.
2. You also need an event to set off the extraction sequence. When the player(s) complete whatever you want them to do, start the sequence in a trigger. Set the event to anything, or use questObjectiveIsComplete. (see How-To above for more info)
3. To spawn the extraction vehicle, you need to use a createObject action, with the position of the exfil zone, type car, team 0 (or player team) and you can pick any vehicle you'd like. Ideally name the id something that you can remember, and set the vehicle bGodMode and bUntargetable to true.
4. This step is optional, but you can add a cinematic for more flavor. Set the objectId to the vehicle and add whatever text you want in the dialogue.
5. Also create a triggerArea, and set its attachToId to the id of the vehicle. Ensure that the triggerArea is big enough to surround the vehicle and has at least 12 uses (number of players) and targets team 0 characters.
6. Make a new trigger, without conditions or an event, and add a removeObject action, with objectId set to {objectId}, and an "addToVariable" action that removes the player variable by 1. Set the triggerArea to trigger this trigger on touch.
7. Now you need to win the game. Add a trigger with event "variableChanged". And the variableName must be your player count variable, to track the players left. The value parameter must also be 0, as you want the game to end when all players have extracted. Add the action "endGame" where the winning team is the player team.
8. And it should work, touch the vehicle (triggerArea) to extract and you should win!

## Appendix

### Other links to other pages

* Player851's documentation
* Albert's mission guide
* Lostuser's trigger guide
* Scenario Editor Data Values
* Scenario Editor Sounds
* Scenario Settings

### The Definitive table to Data Values

Note: all key names that start with "b" followed by a capital letter are booleans, "All objects" means all objects from "Objects menu", "All tangible objects" means actual things (character, dinosaur, tree, car, tank, helicopter, obstacle, door, equipment, mountedWeapon, droppedWeapon, lever, money, arrow).

Legend:

d Chosen from drop-down menu

a Can technically be applied to any object, but only appears by default on specified types