Novices, please read the entire tutorial step by step before asking for help. It's important that you follow this tutorial from beginning to end; by skipping sections, you may very well miss out on some critical information. If you are an experienced DromEd user, feel free to skip ahead to the following sections for reference:
Welcome to DromEd, Looking Glass Studios’ Thief: The Dark Project level editor, and the tool you need to create your own Thief missions. This tutorial is designed to walk you through the basic functions of DromEd, by teaching you to create rooms, place objects, activate enemies, equip Garrett with some weapons, and specify objectives and difficulty levels.
Keep in mind that DromEd has been released to the public "as is," meaning the program is unsupported by Looking Glass Studios. In other words, do not call Looking Glass or EIDOS asking for help with DromEd! If you have questions, please visit the TEG Forum. Good luck!
When you first load DromEd, you’ll be presented with the main program interface, separated into four distinct sections:
Important Note: In order to properly use DromEd, your desktop must be set larger than DromEd’s default resolution of 640x480. If your desktop is set to 640x480 or less, important parts of the interface screen – like the menu bar at the top – will be cut off.
During the course of this tutorial, we’ll explore each of these interface elements in-depth.
If you have no experience building levels for 3D games, the first thing you need to do is familiarize yourself with the term "brush." In DromEd, anything that gets created is called a brush. Rooms are referred to as "room brushes," lights are called "light brushes," etc. The most common brush is the "operation brush," used to create terrain (hollowed-out "rooms" and solid objects). DromEd allows the user to create spaces using six different shapes of operation brush: cube, cylinder, pyramid, corner-apex pyramid, wedge, and dodecahedron. You can think of the default Thief level as being completely solid and stretching infinitely in all directions. In other words, before you add any brushes, the world is just an infinitely huge block of solid. You carve away from that block to create rooms, stairs, structures, and other unique architectural features. So, to create a square room, you would use a cube-shaped operation brush, filled with air, to carve away a square in the center of the existing solid block. If all of this is a bit confusing, don’t worry: everything will become clear once we start building some rooms.
As you can see by looking at the different view windows, there’s already a beginning operation brush in place (a cube) and you’re standing right in the middle of it, as indicated by the violet-colored icon. Now look down at the bottom of the screen, to the small, funky-looking texture affectionately referred to as "Jorge." (Ugly double-triangle pattern directly left of the command line box.) That’s the default texture for the selected brush, but we’ll discuss textures later in the tutorial. For now, look at the buttons underneath Jorge, specifically, the one that reads "Op<Fill Air>."
Click on the arrows to see the different types of brushes you can create. After you’ve seen all the choices, go back to "Fill Air," because we want to create an air brush, which is essentially a hollowed-out room. Remember, the existing universe is already a giant, solid block, so we need to fill a brush with air to create a room; creating a brush and then filling it in with solid will have no effect, for obvious reasons.
Now that you’ve set the brush selection to "Fill Air," it’s time to "portalize" the level so the change actually takes place in the game world. For the purposes of designing levels with DromEd, portalizing is the process by which your brushes, which are created on the 2D grid, are transformed into 3D space. So, go to the menu bar on the top of the screen, click "Tools," then click "Portalize." Be patient as DromEd processes the brushes. Small levels with just a few brushes usually portalize in just a couple of seconds, but when your levels get larger and more complex, portalization can take a couple of minutes or more. Look at the center of the white bar on the very bottom of the DromEd screen; when it reads "done," the level has been portalized. Whenever you alter the terrain in the level, using one of the 2D views, you will need to portalize to see new changes in the 3D View window and in the game itself.
Okay, you’ve portalized the level. It may seem like nothing actually happened, but don’t panic: that’s just because the 3D View window defaults to a wireframe representation of the 3D world, and it’s tough to notice any changes. Move the mouse cursor to the 3D View window and press and hold the right mouse button. Doing so allows you to select from a list of options for the view you currently have the mouse cursor over. We’ll discuss these options in more depth a bit later. For now, highlight the choice that reads "solid + selection," then release the right mouse button. This will change the 3D View representation from wireframe to solid, with a white outline indicating the currently selected brush (in this case, the only brush).
Now, you may still be wondering why the 3D View hasn’t changed much; right now it should look like we’ve just gone from a wireframe display to a completely black display with a few white lines. Actually, you’re standing in the exact center of the operation brush you just created, but the "room" is shrouded in darkness so it’s impossible to see anything. When you create Thief rooms using DromEd, everything is pitch black – you need to actually place light sources (either light brushes, or light-emitting objects, like torches or electric lamps). But, for the sake of simple level designing, we can take a shortcut and use the "light_bright" command, which completely illuminates the level and eliminates all darkness and shadow. Important Note: While the term "room" can be used to refer to operation brushes you create, it’s important to know that DromEd does not yet consider them rooms. So, even if you create a detailed banquet hall, DromEd won’t see the space as a room, but a large air brush. Don’t worry about that for now, though – we’ll get to this issue later on in the tutorial.
To enter the command, either left click on the command line or press colon (note: you’ll need to hit Shift and the ";" key). Type "light_bright" (as with all commands, do not use quotation marks) and hit the "Enter" key. Now that you’ve entered in the "light_bright" command, you’ll notice (hey, you may even be panicking) that the 3D View window still hasn’t changed. That’s because there needs to be some "movement" in the 3D world before "light_bright" activates. In the 3D View window: the "A" and "D" keys are used to rotate left and right; the "W" and "S" keys are used to move forward and backward; the "Z" and "C" keys are used to slide left and right; and the "Q" and "E" keys are used to move up and down. Hit one of those keys, and the 3D View window will change – you should now be hovering in the center of a small, very ugly room. Use the "R" and "V" keys to look up and down, and the "F" key to recenter your view. Remember how you chose the "solid + selection" representation for the 3D View window, by pressing and holding the right mouse button? Move the mouse cursor over one of the 2D view windows (top, right, or front), and do the same thing. Choose "teleport camera" to instantly jump to that point in the 2D display. The selection defaults to "teleport camera," so you should get into the habit of moving the mouse cursor to different spots in the 2D windows, and right clicking to instantly jump to those positions. Important Note: Don’t try this when the mouse cursor is positioned over the 3D View window. The 3D View menu defaults to "solo view," and accidentally choosing this option will find DromEd’s grid sections replaced by a giant 3D view. If this happens, just right click on the 3D View window to revert DromEd back to normal mode, and bring back the four small windows. Try teleporting outside the operation brush. In the 3DView window, you’ll be able to see the operation brush from a distance, just sort of sitting there in space. It’s important to realize, though, that during the course of creating your level, you never want to allow the player or any AIs to enter any "solid" part of the terrain. The player and AIs can travel through water and air, but putting them in solid is a sure way to "break" your level.
Now it’s time to enter into the 3D world in "game mode" and see the room as Garrett would. Go back inside the room and hit "Alt+G" to enter into the game. You are now, for all intents and purposes, in Thief. You can hit the "Escape" key to access different options, like changing video cards or reconfiguring keyboard keys. Note: Make sure you’re actually inside the confines of your operation brush before you enter into game mode, or you’ll run into problems. You may notice that some things appear to be missing – Garrett doesn’t have a health meter, there are no items in your inventory, and there are no sound effects. That’s because DromEd doesn’t yet recognize your brush as an actual room, and you haven’t yet placed a Garrett character model (referred to as a "Starting Point") in the game world. But don’t worry about those things just yet; we’ll come back to them later.
When you’re ready to go back to the editor hit "Alt+E." It’s now time to modify the room even further, to make it more recognizable.
So, we’ve created a simple room… but it doesn’t exactly look like a room. That’s because the whole thing is using Jorge, the default texture. In order to create Thief-style rooms, complete with carpeting, cobblestones, and wooden planks, we need to load in texture families. Go to the command line, type in "add_family core" and hit "Enter" to load in the "core" set of Thief textures. Now, let’s add another texture family, but this time use a shortcut. Go to the command line again and type "a" – then hit the "Tab" key to cycle alphabetically through all recognizable commands. Use this method to select (or simply type in) the command "add_family rescore" to load in Thief’s core set of residential textures.
To see the textures that you’ve loaded in, bring up the texture palette by pressing "Alt+T." For now, we’ll make the whole room one texture. Click on one of the brick textures so that its name is highlighted in violet. At the end of the texture palette, you’ll notice a few buttons; click the one that reads "Put on Brush." You’ll see that texture instantly applied to the entire room. Occasionally, during the course of level design, you’ll need to portalize the level before you see new textures applied in the 3D View window. When this is the case, DromEd will display a message to that effect on the bottom of your window. In fact, you should get used to checking the message bar on the bottom of the screen for important information. If something goes wrong during the course of your level design, an error message can often be found in that space.
At this point it’s quite possible that something has gone wrong, and clicking the "Put on Brush" button actually applied the selected texture to just one side of the room. If that happens, it’s because at some point you clicked on a face of the wall, thereby selecting that as the "active" face. Using the "Put on Brush" command doesn’t necessarily put a texture on the entire brush – it puts it on the selected face. It just so happens that when you first start DromEd, none of the faces is selected; instead, the program starts with the brush in "default" mode. Basically, imagine the default texture as the original color of an entire room. By adding different textures to different faces of the room (walls and ceiling), you’re not replacing the default texture, but "painting" over it. So, if you were to create an operation brush with a default brick texture, and then chose other textures for the walls, floor, and ceiling, the default texture would still be the brick you originally chose – it would just be hidden under the other textures.
It’s easy to tell which face you have selected. If you still have the texture palette up, remove it by hitting "Alt+T" again. Now, in the 3D View window, click one of the faces of the operation brush. It will highlight in orange, indicating that it is now the selected face. You can also cycle through the different faces by repeatedly hitting the comma (",") key on the keyboard. If you cycle through completely, so that none of the faces is highlighted in orange and the brush is outlined in solid white, then you once again have the brush’s default selected. To quickly see which face of the brush is selected, and which texture has been selected for that brush, look down to the bottom center of the screen, to the buttons that read "Face" and "Texture." You can also use these buttons to directly apply textures to any face of the brush, including the default. To reset the default texture of the room, cycle through the available textures using the arrows to the left and right of the "Texture" button. When you’ve found one you like, hit the "Reset" button, found above the "Face" and "Texture" brushes. This will reset the default texture to the one you selected, essentially allowing you to start from scratch.
Now, hit "Alt+T" to bring the texture palette back up. Click a texture so that its name is highlighted in violet, and then click a face to see the selected texture applied to that face. Use this method to apply textures to the walls and floor. Then, hit the "R" key to look up at the operation brush’s "ceiling." Click the "Sky" button (also found at the end of the texture palette) so that its name is highlighted in violet, and then click the ceiling to place the star texture. Hit "Alt+T" again to remove the texture palette, and then press "Alt+G" to enter to game and take a look around. It should look as if you’re standing is a tall-walled, open-air courtyard, with the starry night sky above. It’s important to understand that, for level design purposes, the sky is just an illusion. It’s actually just a ceiling with a modified texture, and not an actual, limitless sky. So, while it looks as if you could fly up to the heavens, you’d really smash your head against a relatively low ceiling (in this case, the room is still set to the default height – 16 feet). When you’re done admiring your craftsmanship, hit "Alt+E" to enter back into DromEd.
Up until now, we’ve simply played around with the existing, default operation brush. Let’s modify the brush to make it a bit bigger. Look at the lower left-hand corner of the screen and find the three buttons that read "D," "W," and "H." These stand for depth, width, and height respectively, and are measured in an approximation of feet. You’ll notice, then, that the default brush is a perfect cube, measuring 16x16x16 feet. Let’s leave the height at 16 feet, but modify the depth and width. Here we have a few options. The easiest way to change the size of a brush is to press and hold the control key, position the mouse cursor over one of the 2D windows, press and hold the left mouse button, and move the mouse to resize the brush. Move the mouse cursor over the "Top" view window and practice resizing the room. Note how resizing the brush in this manner only affects the two "visible" dimensions – width and depth. To use this method to resize the third dimension (in this case, height), press and hold the right mouse button and move the mouse left and right. Experiment with this method in all of the 2D view windows.
There are other methods of resizing brushes as well, particularly if you want to get more precise in your measurements. Try left clicking on the arrows to the left and right of the measurements to resize the brush in very small increments. It’s also important to know that the "D," W," and "H" indicators (as well as "X," "Y," "Z," "H," "P," "B," and others) are buttons. Move the mouse cursor over the "D" indicator and click and hold the left mouse button; notice how the letter turns purple. With the left mouse button held down, move the mouse left and right to alter the brush’s depth. You can use this method to alter any of the brush’s dimensions. There is also another method for resizing a brush, especially for entering in precise measurements, and that is simply to type in the height of any given dimension. Let’s use this method to make the room 24x32x16. Click the number next to the "D" button so that it highlights in purple. Then, simply type in the desired height in feet – in this case 24 – and press "Enter"; the depth of the brush is now 24 feet. Use this method to change the width to 32 feet as well. Now, portalize the level so that these changes take effect in the 3D world.
Now that we have an operation brush in place, let’s create another operation brush from scratch and attach it to the existing one. In the lower left-hand corner of the screen, under the heading "Create," are several buttons, with the "Brush" button already highlighted. These buttons allow you to create new elements, like brushes, lights, and objects; the option to create a brush is the default. To create a new brush, choose the type of brush you want to create (in this case we want the default, an "air" brush). Left click on one of the 2D view windows and keep the button held down. Now, move the mouse to create a brush; when the brush is big enough, release the left mouse button to place the brush. Brushes can be repositioned in much the same way they can be resized. In the lower left-hand corner of the screen are indicators for a brush’s "X," "Y," and "Z" coordinates; you can use these brushes to modify the brush’s position. Or, press and hold the "Shift" key; move the mouse cursor to one of the 2D view windows; click and hold the left mouse button; and move the mouse to reposition the brush. Resize the brush so that its measurements are depth=8, width=8, and height=16. Then, use the "top" view window to reposition the brush so that its southern wall connects to the existing brush’s northern wall. After you’ve done that, move the mouse cursor over the "Right" or "Front" view window and reposition the new brush so that its bottom side aligns with the existing brush’s bottom side; this will essentially line up the new brush so that it’s on the same level as the existing brush (i.e. they share the same "floor"). When the brush is lined up properly, portalize the level to see the changes reflected in the 3D View window. Feel free to play with the textures, and hit "Alt+G" to jump into the game and walk around the rooms as Garrett would.
Now, use this method to create a circular column somewhere in the southern room. To change the shape of the brush from a cube to a cylinder, go up to the menu bar and click "Shapes" then "Cylinder." You can modify the number of sides in the cylinder (or in a pyramid, if you were to create one) by clicking "Shapes," then "Sides in Base," and entering in the number of sides you want (the default is 6). Let’s choose a cylinder with 10 sides.
Now that we’ve selected a cylinder, we need to tell DromEd to create a solid brush, as opposed to the air brush we just made. Look at the bottom center of the screen, to the button called "Op." Use the arrows to the left and right of the button to cycle through the different brush types, and stop when the selection reads "fill solid." Note: "Fill Solid" is actually the first choice in the list When this is done, create the solid brush somewhere in the northern room, using the same method you used to create the air brush. Resize the brush so that it stretches from floor to ceiling, and actually connects to the floor and ceiling. Portalize the level to see these changes reflected in the 3D View window, and enter into the game to see the column more closely.
You’ll recall that "light_bright" is still enabled, so the spaces you’ve created are completely illuminated in the 3D View window and in the game itself. Let’s change that by placing a torch in the game world.
Objects in DromEd reside in an "object hierarchy," which can be accessed via the menu bar at the top of the screen. Click "Editors" then "Object Hierarchy" to bring up the object hierarchy. All of the game’s objects reside somewhere in this hierarchy, but for now we’re only concerned with placing a torch. Objects are located in one of five categories – "Sound," "SFX," "fnord," "physical," and MotArchetypes. Click the plus sign ("+") next to "Physical" to expand that tree, then expand "Lights." You’ll notice that "Torches" can also be expanded; doing so will bring up an item called "ConTorch." Sometimes, the name next to a "+" sign is simply a heading, and you need to expand that tree to see the objects you can place. In other cases, the headings are objects in themselves, as is the case with the "Torch." Click "Torch" so that it’s highlighted in blue, and then click the "Create" button on the right-hand side of the object hierarchy window. You’ve basically just told DromEd to get a torch object ready for creation.
To place the torch in the game world, position the mouse cursor over one of the 2D windows, and click and drag to create a box, just as if you were creating a new brush. When you release the mouse button, the object will be created in the center of the box. Create a total of four torches – three in this room, near the west, south, and east walls, and two in the northernmost room, near the west and east walls. Now, examine the torches in the 3D View window – you’ll notice that their brackets are all facing a particular direction, south. That’s because all objects, when placed in the game world, "face" southward…but we can attach the torches properly to any wall by rotating them. Important Note: look down to the lower left-hand corner of the of the DromEd screen and find the column of buttons under the "Create" heading. In order to create an object, you first need to click the "Object" button so that it’s highlighted in violet. It just so happens that when you select an object for creation out of the hierarchy, the "Object" button is automatically selected.
Up until now we’ve changed a brush’s "X," "Y," and "Z" planes and modified its depth, width, and height. It’s also possible to modify a brush’s heading, pitch, and bank to rotate it into a desired position. Look at the lower left-hand corner of the screen, to the buttons marked "H," "P," and "B." Use these buttons as you did the previous ones, and practice rotating one of the torches. Or, press and hold the "Alt" key, press and hold the left mouse button, and then move the mouse to rotate the torch. Rotate the torch so that its heading is 270 (but its pitch and bank are both 0), and affix it to the western wall. Use this method to rotate the remaining torches and place them on the other walls. Important Note: Some objects are actually complex composites of several smaller objects. The torch is a perfect example: it’s actually made up of the torch, the flame, and the smoke. When you move the torch, it’s important that you do indeed move the torch…and not the other elements. When you move the torch, it may seem as if the flame and smoke are left behind. Don’t worry – they’ll naturally follow the object. So, when you enter into the game by pressing "Alt+G," you’ll notice that the torch looks just as it should. When you return to DromEd and look at the 2D view windows, you’ll see that everything is back to where it should be.
Note: When you move light sources around, you’ll often need to use the "Light" function to update the lighting. To do so, go to the menu bar and click on "Tools," and then click "Light." This will update the level’s light sourcing.
Now that we’ve placed torches on the walls, let’s place a table on the floor, in the middle of the southern room. Tables, like all objects, reside in the object hierarchy; but instead of fishing through the hierarchy tree, let’s take a shortcut. If you know the name of the object, you can use the "find_object" command to instantly jump to its position in the hierarchy. Click on the command prompt, and enter in the command "find_obj table." (without the period, of course) When you hit "Enter," you’ll go directly to the standard table in the object hierarchy. You can either keep this one, or choose one of the available variations, like "Cabinet Table." Create the table just as you did the torches, and place it in the game world. Chances are, the table will be hovering a few feet off the ground. Instead of manually moving the table, you can have it automatically "grounded" by clicking the "Floor Me" button, located at the bottom center of the screen. Note: "Floor Me" only works if the object you wish to have grounded is hovering in the air over the floor you want to have it grounded to. If, for example, you place a street lamp in the world, its base is sticking through the floor, and you want to have it aligned perfectly with the floor, you’ll need to first raise the street lamp into the air and then hit the "Floor Me" button. Using the "Floor Me" button when an object is already sticking through a floor will have no (or worse, an undesirable) effect.
Now, using the method you just employed for creating and placing the table, we’ll create and place a guard in the northern room. Important Note: If you try to create the default choice – "guard" – it actually places a white wedge in the game world. That’s because "Guard" is a merely a heading in the object hieracrchy, and not an actual object. DromEd interprets "unknown" objects using white wedges. In this case, you need to click the "+" sign next to the heading "Guard" to expand that part of the tree, and choose a specific kind of guard. Find and create a "sword guard" (under guards\swordsmen\grunts). Place the sword guard in the northern room. If you accidentally created a wedge, you can delete it by selecting it as the active object and hitting the "Delete" key. Note that you can use this method to delete any kind of brush, even entire "rooms."
Now that you’re an expert with the object hierarchy, do this: place a table somewhere in the center of the northern room; place the object "BaffordScepter" (the scepter from Thief’s Lord Bafford mission) in the room; and then rotate and move the scepter so that it’s lying, horizontally, on the table. Now you’ve actually got something to steal.
Here’s a really helpful tip for creating multiple objects: instead of creating another table from the hierarchy, we can simply copy the existing table. To copy a brush (including operation brushes, objects and lights), simply highlight the brush in question and hit the "Insert" key. This will create a copy in the same exact position as the original brush, with the copy now highlighted as the active brush. So, while it may look as if nothing happened, you’ve actually made a copy of the existing brush…it’s just that the copy is in the same exact place as the original. If you go to move the original brush, you’ll actually move the copy. So, use this method to copy the existing table and place the new table in the northern room.
You’ll notice that the game world is still fully illuminated, because we’ve still got the "light-bright" command enabled. Now that we’ve placed some torches, we can disable this feature by typing in "light_bright" again and moving around in the 3D View window. Hit "Alt+G" to enter into the game to see the lighting effects more closely.
The first thing we need to do is load in a script. A script is a basic set of commands, used by DromEd to activate different in-game elements, like specific AI behaviors (such as the factory workers in Cragscleft Prison.) Click on the command line and type "script_load convict" to load in the ConVict (Conditions for Victory) script. This is the script DromEd needs to activate victory conditions (mission objectives), doors, and weapons. If you forget to load the script, these and some other in-game elements will fail to function, so it’s good to get into the habit of loading in the script whenever you start a new map. The script will get saved with the level and you won’t ever have to load it for this particular level again. Scripts are powerful tools, but since they are part of the game’s source code, script editing isn’t available to the public. However, "ConVict" should be perfectly adequate for your level building needs.
By now you’ll have noticed that entering into game mode doesn’t quite have the desired effect: Garrett doesn’t have a health meter; there are no sound effects; and the guard you placed is just sort of standing there, with his arms out. That’s because DromEd recognizes the brushes you’ve created and the guard object you’ve placed…but doesn’t yet recognize you as a player, or the brushes as rooms, and the guard’s AI is unable to function because the level hasn’t been processed for AI’s yet.
The first thing we need to do is place the Starting Point, and tell Dromed to start the player model there. To place a Starting Point, go to the object hierarchy and expand the branches under the "fnord" tree until you come to "marker." (Don’t expand past "marker.") Place the marker object in the southernmost room, in the northwest corner, and make a note of its number, which will be located in parentheses, after the name "A Marker" (found at the bottom center of the screen). When the marker is in place, look at the bottom center of the screen and find the "Properties" button; click it. This will bring up a separate "Properties" dialog box, with the marker’s name – "A Marker" – already highlighted. Click the box’s edit button and change the name to "StartingPoint." When the name has been changed, click the window’s "Done" button to return to the main DromEd screen. Now, click the "Links" button at the bottom center of the DromEd screen, located directly below the "Properties" button. This will bring up the "Links" dialog box. Click the "Add" button, which in turn will bring up a small dialog box. This dialog box will have the following fields: "Flavor," "From," and "To." Click the arrow next to the "Flavor" field and select "PlayerFactory" from the drop-down menu. Note: Use the "PlayerFactory" without the tilde (~). In the "From" field, enter the number of the Starting Point you created. In the "To" field, type in the name "Garrett." Click the "OK" button when you’re done, and then click the "Links" box’s "OK" button to return to the main DromEd screen. Press "Alt+G" to enter into the game. Notice that you now enter into the game world in the precise spot you placed the Starting Point, and Garrett now has a health meter, as indicated by the small shield icons in the lower left-hand corner of the screen. Go back to DromEd, and we’ll turn the operation brushes into actual rooms, complete with sound effects.
Note: If you get killed by the guard (or if you accomplish all your objectives, but we’ll get into that later in the tutorial), you’ll need to exit the program and restart DromEd. To avoid this, place the line "no_endgame" (without quotation marks) in your user.cfg file. This will allow you to stay in game mode if you get killed or complete your objectives.
To turn a brush into a room, at least as far as DromEd is concerned, you need to encapsulate that brush in a separate room brush. Look down at the bottom center of the DromEd screen, to the column of "Create" buttons. Click the last button – "Room" – so that it’s highlighted in violet. With the button active, go to one of the 2D view windows and create a violet room brush around the brushes you’ve already created. Make sure you expand the brush in the other views so that it completely surrounds the existing brush (if it doesn’t already do so). While it’s okay to use this method for now, there’s a more precise method of creating room brushes. Click on a brush in one of the 2D view windows so that it’s active. Then, press and hold the "Shift" key and hit the "Insert" key; this will create a room brush around the selected brush. What you’re probably asking yourself right now is this: Why would I want to encapsulate all my individual brushes in separate room brushes, when I could just create one giant room brush around all the brushes I’ve created? Well, room brushes serve to separate the spaces realistically, particularly where Thief’s sound effects are concerned. If you created a giant area, say one equivalent to the "Bonehoard," and surrounded it in one big room brush, all of the sounds in that room brush would appear to be in one big room. By encapsulating each brush in a room brush, you’re helping to channel the game’s sound effects in a much more natural way; sounds will appear to come from around corners; a guard at the other end of the map won’t hear your footsteps; and so forth.
When you’ve created a room brush around the existing brushes, you need to build a room database so DromEd can examine the room/s and calculate sound propagation, etc. Go to the menu bar at the top of the screen and click "Tools," then click "Build Room Database." When this is done, hit "Alt+G" to enter into the game and walk around; notice that you can now hear sound effects, like the crackle of the torches and your own footsteps…but the guard is still standing motionless. Enter back into DromEd and we’ll remedy that.
To activate AIs (guards, servants, monsters, etc.) you need to build a pathfinding database, which basically allows the AIs to find their way around the rooms you’ve created. Note that you must create room brushes and build the room database before you can build a pathfinding database. So, go back to the menu bar at the top of the screen; click "Tools," and then click "Compute Pathfinding Database." When that’s done, enter into the game to see the Hammerite guard come to life. If you placed the Starting Point in the northwest corner of the southern room, and the guard in the northern room, you’ll be out of his field of view and therefore out of harm’s way. You way want to jump out, taunt him, and then run feebly around in circles before he bashes your brains in with that humongous warhammer. Yeah, you’re right – that’s not much fun. Let’s give Garrett some weapons to even the odds. Go back to DromEd, and we’ll equip the player model with a default inventory.
Important Note: As you build more in-depth levels, there may be times when AIs cease to function as you’d expect: they continuously walk into walls, can’t climb stairs, and refuse to enter certain rooms. If that happens, it’s probably because you haven’t updated the pathfinding database. Whenever you add new terrain to your level, the AIs don’t know it’s there unless you tell them…and you tell them by clicking "Compute Pathfinding Database" under the "Tools" section of the menu bar. Get into the habit of updating the pathfinding database whenever you build new terrain.
DromEd supports environmental acoustic settings using EAX, or "Environmental Audio Extensions." This step is optional, but it will greatly enhance the game’s audio effects. EAX effects are supported in DromEd’s "game mode," and in Thief version 1.33 or higher. Keep in mind, however, that you need and EAX-compatible sound card to benefit from these settings.
DromEd allows you to set individual acoustic characteristics for every room brush. Simply select a room brush in the editor, choose a pre-set room type from the table below, and use the hot-key indicated on the table to set the room’s EAX type. That’s all there is to it.
The following table lists the various EAX settings; while some of the names may seem a bit arcane, you should get a general idea of what kinds of sounds each setting will produce. The "Small Dead" setting, for example, would be suitable for any small room with very little reverb, such as a walk-in closet. Pick the room type that sounds closest to the thing you want, and feel free to experiment.
Creating a Starting Point basically creates an in-game representation of Garrett without any inventory. To start a mission with a default selection of items (weapons and powerups), you need to create those items and then "link" them to the Starting Point. Search through the object hierarchy or use the "find_obj" command to create and place in the game world a blackjack, sword, and broadhead arrow. Note: The broadhead arrow is called simply "broadhead." After the objects are created, make a note of each one’s object number.
We’ll start by linking the blackjack to the Starting Point. Select the Starting Point, and click the "Links" button, just as you did before. In the "Flavor" field, select "Contains." In the "From" field, type in the number of the Starting Point (or just "StartingPoint"). In the "To" field, type in the number of the blackjack. Click "OK" and then click "OK" on the "Links" window to return to the main DromEd screen. You have just linked the blackjack to the player model, meaning you will start the game with that weapon. Don’t worry about the blackjack appearing in the world as an actual object during the course of the game: when you create a "contains link," the player contains that object in his/her inventory, and it no longer exists in the game world. Now that you’ve linked to the blackjack, use the same procedure to link to the sword (make sure you use the correct object number for each object you link to).
Linking the broadhead arrow to the player is a bit more complex, because we want to give Garrett multiple arrows, and not just the one we placed in the game world. Before we link the broadhead arrow to the Starting Point, we need to modify the broadhead object so that it gives the player multiple arrows. Click on the broadhead arrow, and then click the "Properties" button to bring up the "Properties" window. Then, click the "Add" button to bring up a list of possible properties. Choose "Engine Features" then "Stack Count," and type in the number of arrows you want to start out with. Let’s choose thirty (30) arrows. When you’ve finished changing the number of arrows, link the broadhead arrow object to the Starting Point just as you did with the sword and blackjack. Note that you don’t actually have to equip Garret with a bow; once you acquire arrows, the bow is automatically available.
Anyone’s who’s played Thief knows that one of the game’s coolest elements is the ability to extinguish torches using water arrows, to create your own beautiful, concealing darkness. Using the methods already described, give Garrett two water arrows. It’s important to note that, for the purposes of creating levels with DromEd, water arrows (and the same is true for moss arrows, fire arrows, and gas arrows.) are actually referred to as crystals, and are found in the hierarchy under Physical\Tulz\Crystal.
Now that you’ve got an inventory, go back into the game world and show that Hammerite who’s boss!
Note: If you use your two water arrows to extinguish the two torches in the guard’s room, that room will be plunged into complete darkness, as those two torches are the only sources of light!
The AIs in Thief: The Dark Project, as evidenced by the guard we placed in this tutorial level, are very intelligent: although they remain stationary when nothing’s going on, they can hear your footsteps, hunt you down, and even run away when threatened. These are all behaviors that are inherent to the AIs, and you as the level designer don’t need to worry about controlling them. And, while complex scripts are not available, you can modify AI behavior by assigning patrol routes. Basically, a patrol route allows an AI, let’s say a guard, to walk a predefined circuit, by travelling from one marker (similar to a waypoint in a flight sim) to another, to another, and so on.
To define a patrol route, you need place a circuit of markers to indicate that route. In the object hierarchy, go to fnord\Marker\TrolPt. Place four TrolPt markers (not LookBackPt markers) in a square pattern around the room; these are the markers the guard will follow on his route. Now, it’s important to know that an AI will start a patrol by heading to the TrolPt marker that is closest to him in 3D space. How do we make sure the AI starts the patrol at a particular marker? Simple: we create the first marker (or move it, if it was created somewhere else) directly inside of the selected AI. When placing markers, it’s important that they always exist inside in the game world (meaning, inside an air brush), close to the floor (up to around 4 feet) where the AI will walk.
Now that the markers have been created, we need to link them together. Click on all the markers and make a note of their object numbers. Then, click on the first one – it should be inside the guard – and bring up its "Links" box (we’re basically going to do something very similar to linking the default weapons to the Starting Point). Click the "Add" button to bring up the smaller dialog box. In the "Flavor" field, use the drop-down menu to select "AIPatrol." Note: Do not use "~AIPatrol." Names with the tilde (~) in front of them are "return" links, and we’ll discuss them in just a bit. In the "From" field, put the number of the currently selected marker. In the "To" field, put the number of the next marker you want the guard to travel to. We placed the markers in a square pattern around the room, so we want the guard to follow a square patrol route. So, in the "To" field, put the number of the next marker in the square patrol route. Use this method to link all the markers together. Remember that we want the guard to walk in a continuous loop, so, when you get to the last marker, link from it back to the first marker. That way, when the guard gets to the last marker, he’ll head back to the first marker and start his patrol all over again.
There’s one more thing we need to before the guard will follow the markers, however. When you first place an AI, it will remain stationary because that’s its default position. Although you’ve placed the TrolPt markers, you haven’t told the AI to follow them. To change this, select the guard, and then bring up his "Properties" box. Click the "Add" button, and then select "AI," "Ability Settings," and "Patrol: Does patrol." This will bring up a small dialog box containing a small, white, unchecked selection box. Click on the selection box to place a check mark there, and then click the "OK" button to close out the dialog box. Then, click the "Done" button on the "Properties" box to return to the main DromEd screen. By checking the box, you have enabled that AI’s ability to go on patrol.
You can also enable an AI’s "random patrol," command, so that instead of following the TrolPt markers in order, the AI chooses a path at random. To do this for the guard, follow the same steps you used for enabling "Patrol: Does patrol," but select "Patrol: Random sequence." This will enable the guard’s ability to patrol at random. Note: "Patrol: Random sequence" is found on the list directly underneath "Patrol: Does patrol." It’s important to note that if you do decide to activate the "Patrol: Random sequence" ability, you still need to activate the "Patrol: Does patrol" ability so the guard knows he’s supposed to patrol in the first place.
You may notice that when you open up a marker’s "Links" box and go to link from that marker to the next, there’s already another link there. It looks similar to the one you’re about to create, but there’s a tilde (~) at the beginning of the "Flavor" name, and the "From" and "To" links are different. The links with the tilde are called "return" links. Basically, you as the level designer create a link from one marker to the next marker. But DromEd recognizes that one marker also links to a previous marker. While you may create three markers, numbered 23, 24, and 25, and link from one to the next, DromEd goes one step further by linking them backward as well. So, let’s say you create a link from marker 23 to 24. Then, you create a link from marker 24 to 25. You have specified that marker 24 links to 25…but DromEd has already linked marker 24 back to 23.
Return links are very similar to normal links except for the following: their flavor names begin with a tilde; they point in the opposite direction; and they have the opposite meaning. Say, for example, you have a chest, and a "contains" link from the chest to a potion. What the link means is that, "The chest contains the potion." The potion can't be seen in the game, but when someone opens the chest the potion goes into his or her inventory. At the same time the "contains" link is created from the chest to the potion, a "~contains" link is created automatically from the potion to the chest. This link means, "The potion is contained by the chest." The important thing for you to remember about return links is that although you will see them frequently, their placement is a normal occurrence that gets managed automatically by DromEd. You don't have to worry about them at all.
Now that you fully understand the concepts of linking, enter into game mode and watch as the guard patrols around the room. See if you can sneak up behind him and knock him out with the blackjack before stealing the scepter. Important Note: If you enabled the "Patrol: Random sequence" ability, you may notice that at some point the guard walks into the column, and just continues walking into it, instead of trying to go around. That’s because you need to update the pathfinding database, as mentioned earlier in the tutorial.
If you’ve followed this tutorial all the way through, from beginning to end, you should now have the knowledge to make fairly detailed Thief maps. You can create terrain, place objects, give yourself weapons, and even define patrol routes for your AIs. Now we come to the most advanced (read: confusing) part of this tutorial: creating mission objectives. If you enter into the current level, you can kill the guard and steal the scepter…but then you’re just sort of stuck there, hanging around with nothing to do. In other words, you have to "pretend" that stealing the scepter is your goal, because DromEd doesn’t yet recognize that (or anything else) as an actual objective.
In order to assign objectives, you must specify a mission’s quest data. Go to the top of the screen, to the menu bar, and click "Editors." Then, click "Mission Quest Data." Don’t worry – nothing is supposed to happen. That’s because you haven’t yet specified any quest data. When you have specified this information, clicking "Mission Quest Data" will bring up a small "Quest Data" dialog box, containing all the objective and difficulty information for that mission. So, we need to enter in this information. Understanding these concepts, at least for the purposes of level creation, is a bit tricky…but this tutorial should at least teach you the basic principles needed for the creation of real missions, with real objectives.
In order to implement objectives, you must first understand how DromEd views those objectives. So, this section of the tutorial will first explain the concepts behind objectives and difficulty levels, and then teach you to actually implement them in your missions.
First and foremost, every objective you include must be given a number, and the first objective must be given the number 0. So, if you have three objectives, they would be numbered 0, 1, and 2. Again, they must be numbered in this way.
Next, each objective has a "state," which indicates whether or not it has been completed or not. DromEd recognizes four states for objectives: "incomplete," "complete," "inactive," and "failed." If you’ve played Thief, you will have seen, on the "Objectives" screen, visible representations of each of these states: "incomplete" is marked by an empty box, meaning that objective has not yet been fulfilled; "complete" is marked by a green check mark, meaning that objective has been satisfied (like when you steal an objective item); "inactive" is marked by a red circle with a line through it, meaning that objective is no longer active or applicable; and "failed" is marked by a red "x" (though at that point, because of the failure of an objective, the mission will usually end before you can even notice this mark on the "Objectives" screen).
DromEd uses the following numbering convention for objective states:
When making Thief levels with DromEd, each objective must be marked with a 0 (zero) for "incomplete," meaning that at the beginning of a mission, each objective has yet to be accomplished by the player. These objectives will be marked either "complete" or "failed" according to the actions of the player.
The next thing a budding level designer needs to know is that in Thief, objectives can be either visible or invisible. Visible objectives are those the player can see on the "Objectives" screen right at the start of the game; so, when starting a Thief mission with visible objectives, the player knows exactly what he or she is supposed to do. A good example of a visible objective can be seen in Thief’s "Lord Bafford’s Manor" mission, where the player has to steal Lord Bafford’s scepter: "Steal the jeweled scepter with as little notice as possible." An invisible objective, on the other hand, is one the player is not aware of at the start of a mission. A good example of an invisible objective can be seen in Thief’s "Assassins" mission, where the player, after tailing two would-be hit men back to Ramirez’s mansion, has to then steal the purse from Ramirez’s belt. The objective to steal the purse is an invisible objective, because it doesn’t show up on the player’s "Objectives" list at the beginning of the mission; instead, that objective is added after the player tails the two assassins back to the mansion. Subsequently, if you set off the alarm during the course of the mission, exiting Ramirez’s mansion will give you yet another objective: to make it back to your "home turf."
For the purposes of designing Thief missions with DromEd, it is imperative that you realize something about mission objectives before you actually begin the creation process: the "ConVict" script only supports visible objectives! So, you could not create a mission with the complexity of "Assassins," because all of the objectives must be visible to the player at the start of that mission. So, you could easily create a mission that required the player to enter a certain building, steal a certain object, and then retreat to a certain location…but the player would have to be aware of all of these objectives at the beginning of the mission. You could not, however, create a mission that required the player to steal a certain object…and then gave that player a new objective after the object was actually stolen.
DromEd uses the following numbering convention for objective visibility/invisibility:
So, as stated, each objective must be numbered 1, for "visible." Important Note: By now, you may be wondering exactly where these numbers come into play. Don’t worry – that will be explained shortly.
You now know that, for the purposes of level design with DromEd, each objective has a "state" (incomplete, complete, inactive and failed) and a visibility (visible, invisible). Well, there are obviously different kinds of objectives as well. The public release of DromEd supports four different kinds of objectives, with the following numbering scheme:
1=Steal an object
2=Kill a creature
3=Get a certain amount of loot
4=Go to a location
Note: Objectives are covered in more detail in the "ConVict" document. There are some variations of the objectives you see here. For example, you could easily have an objective that prevents you from killing a certain creature or creature type.
You could include just one or all four of these objective types in your mission. So, the player could be required to steal an object…or the player could be required to steal an object, kill a creature, get a certain amount of loot, and go to a certain location.
You can even use multiple objectives of the same type, if you wish. For example, the player could be required to steal two different objects, kill three different monsters, and then go to a certain location.
So, how do you enter all this data into DromEd? The first thing you should do is write down on a piece of paper all the objectives you want, starting with the number 0. Using the sample level we’ve made, let’s have two objectives: stealing the scepter and killing the guard. This would read as:
0=Steal the scepter
1=Kill the guard
Now, before we can tell DromEd what the actual objectives are, we have to indicate that each one will be "incomplete," and "visible," as already stated in the tutorial; each of these commands must be entered in separately. The command used for entering in objective data is "quest_create_mis" -- without the quotation marks, of course. Get used to this command, because we’ll be using it quite often.
The command for entering in the "state" of an objective is "goal_state_x, 0" – where "x" is a variable representing the number of that particular goal, and "0" is the number corresponding to the state we want – incomplete. So, the entire command you would need to enter (in the command line) is exactly as follows:
quest_create_mis goal_state_0, 0
Important Note: The first number is always the number of the objective you’re referring to, and the second number is always the number that corresponds to a specific DromEd command. Always use the above format: number, comma, space, number.
After this line is entered in, go back up to the menu; go to "Editors," and "Mission Quest Data." You’ll notice that the small "Quest Data" dialog box now comes up, and lists the info you’ve entered. Click the "Cancel" button to close the window.
Note: You can use the "Quest Data" window to directly edit variables you’ve entered in. Just highlight the command, click "OK," and you can change the command’s "Name" and "Value."
Confused? Let’s dissect that line to see what you’re telling DromEd to do. "Quest_create_mis" is the standard command for entering in objective data. Then, you use a space and type in the rest of the command. "Goal_state_0, 0" means that objective 0 (steal the scepter) is going to be marked with a 0, meaning it is incomplete. What all this means is that when you start the mission, the objective "Steal the scepter" will have an unchecked box next to it on the "Objectives" screen, because that objective has yet to be fulfilled.
Of course (now things get even trickier) the objective "Steal the Scepter" won’t appear on the "Objectives" screen at all unless you mark that objective as visible, meaning the player can see it right at the beginning of the mission. To mark our first objective as visible, use the following command exactly as you see here:
quest_create_mis goal_visible_0, 1
Hopefully, by now you are gaining an understanding of how objective data is entered into the command line. With the above line, we told DromEd that objective 0 (steal the scepter) would be marked with a 1, meaning it is visible at the start of a mission.
Important Note: So, in case you haven’t already figured it out, you must enter in the "goal_state" and "goal_visible" commands for every objective you have, and each one must be made "incomplete" and "visible."
Now that we’ve set the state and visibility of the first goal (steal the scepter), follow the examples above and set the state and visibility of the second goal (kill the guard).
Important Note: If you screw something up and need to delete a comand you’ve entered in, use the command "quest_delete" and then the command you entered. So, if you wanted to delete the line "quest_create_mis goal_state_0, 0" you would type in:
You would not use the comma and second number because you’re not trying to set anything for goal 0 – you’re simply trying to delete goal 0. So, you need only indicate the number of the objective (goal), which in this case is 0, for our first objective, "Steal the scepter."
Okay, we’ve told DromEd that we’ve got two objectives, and that each one will be visible and marked as incomplete at the beginning of the mission…but we haven’t yet told DromEd what those objectives are. For each objective, we must enter in two commands: one to indicate what the objective is, and one to indicate what the subject of that objective is. So, for the first objective – "Steal the scepter" – we need to tell DromEd two things: 1.) The player needs to steal an object; 2.) The object the player needs to steal is the jeweled scepter. To do this, we use the commands "goal_type" and "goal_target."
quest_create_mis goal_type_0, 1
The above line tells DromEd that objective 0 will require the player to steal an item.
Now, find the scepter object you placed on the table, click it, and make a note of its number. Then, type in:
quest_create_mis goal_target_0, x (where "x" is the number of the scepter)
The above line tells DromEd that the subject of objective 0 (which we just defined as "steal an object") is the scepter.
Using the examples above, let’s enter in the data for the second objective – "Kill the guard." First, we would use the following command:
quest_create_mis goal_type_1, 2
The above line tells DromEd that objective 1 will require the player to kill a creature.
Then, we would use:
quest_create_mis goal_target_1, x (where "x" is the number of the guard)
The above line tells DromEd that the subject of objective 1 (which we just defined as "kill a creature") is the guard.
Before you can get the objectives enabled, there’s one more thing you must do, and that is to assign the "VictoryCheck" script to your Starting Point. Click on the Starting Point to select it, and then click the "Properties" button to bring up the "Properties" window. The, click "Add," and choose "S," and then "Scripts." This will bring up a small "Scripts" box with a few different fields. In the "Script 0" field, type in "VictoryCheck" (one word – without the quotation marks) and then click the "OK" button. Click the appropriate buttons to close out the windows and return to DromEd.
Now that you’ve actually got real objectives, enter into game mode by hitting "Alt+G." Once there, hit the "O" key to bring up the "Objectives" screen. You should see two small, empty boxes to the left of the screen, with no text next to them. Those objectives are, in order from top to bottom: Steal the scepter; and kill the guard. The reason there are no text descriptions of the objectives is because this information hasn’t been entered in yet. Don’t worry – we’ll come to that a bit later. For now, it’s enough to know that we have two objectives: the first requires you to steal the scepter; the second requires you to kill the guard. Hit the "Done" button on the "Objectives" screen to return to game mode. Then, kill the guard – either nail him with an arrow from a distance, or get behind him and backstab with the sword. Note: If you knock the guard out with the blackjack, he’ll be merely unconscious, and not dead. To finish him off, you’ll have to hack away at his unconscious body with your sword. When the guard is dead, return to the "Objectives" screen and note that there is now a green check mark in the second box. That’s because you’ve completed the second objective – "Kill the Guard." Exit the "Objectives" screen and steal the scepter – the mission will end, meaning you also completed the first objective – "Steal the scepter."
If you’ve made it this far, you’re to be commended! Learning how to implement real objectives into your missions is the test of a true Thief level designer. And, if you can do that, you can take the objective formula even further and incorporate difficulty levels into your missions.
The first thing you need to realize when creating different difficulty levels is that you first need to create all the objectives, as discussed in the previous section of this tutorial. So, even if you have objectives that only show up on certain difficulty levels, those objectives need to be created before you do anything else. Since we already have two objectives in place, let’s use those to illustrate the differences in difficulty levels. Right now, our objectives are: "Steal the scepter" and "Kill the guard." Whenever we enter the game, we must accomplish these objectives. But let’s modify things a bit, so that the "Kill the guard" objective is only required when we play the game on "Expert" difficulty level.
DromEd recognizes three different difficulty levels, with the following numbering scheme:
To tell DromEd which objectives will be available on which difficulty level, there are two different commands we can use: "goal_min_diff" and "goal_max_diff." "Goal_min_diff" is the minimum difficulty that objective would be available. "Goal_max_diff" is the maximum difficulty that objective would be available. So, let’s say the "Normal" and "Hard" difficulty levels required you to steal 300 gold worth of loot, and the "Expert" difficulty level required you to steal 500 gold worth of loot. The goal "Steal 300 gold worth of loot" would use the "goal_max_diff" command, set to the number 1, for Hard difficulty. So, basically, this would tell Dromed that the goal "Steal 300 gold worth of loot" would apply to all difficulty levels, up to the maximum difficulty level of "Hard." We don’t want to apply this objective beyond the "Hard" difficulty level because we want the "Expert" level to require stealing 500 gold worth of loot. To specify that objective, we would use the "goal_min_diff" command and set the number to 2, for "Expert" difficulty. This would tell DromEd that the goal "Steal 500 gold worth of loot" would only apply to difficulty level of "Expert" and above. Of course, there is no difficulty level higher than "Expert," but that’s okay. That just means the program will apply that difficulty level to just "Expert," which is exactly what we want.
Let’s get back to our tutorial level. Remember, we want the objective "Steal the scepter" to apply on all difficulty levels, and the objective "Kill the guard" to apply only on the "Expert" difficulty level. So, for the "Steal the scepter" objective, we wouldn’t need to specify any conditions. For the "Kill the guard" objective, however, we would need to enter in the following command line:
quest_create_mis goal_min_diff_1, 2
The above line basically tells DromEd that objective 1 ("Kill the guard") will be applied to the minimum difficulty level of 2, which is "Expert."
Note: Remember, "Kill the Guard" is objective 1, because objective 0 is "Steal the scepter."
Now it’s time to test out the difficulty levels. Normally (and this is something that will be covered in the next section), a person playing your mission would select a difficulty level through the pre-mission screen, just as they would when playing any Thief level. But during the course of level design, you need to be able to check your work in DromEd. You do this by using the difficulty level selection command. To play the mission on a particular difficulty, type in:
quest_create_mis difficulty, x (where "x" is the difficulty level you want to play at)
So, to play the tutorial mission on the "Normal" difficulty level, type in:
quest_create_mis difficulty, 0
Now, enter into game mode and hit the "O" button to bring up the "Objectives" screen. You should notice that there is now only one small box…meaning there is only one objective. That’s because we’re playing on the "Normal" difficulty level, and we set the "Kill the guard" objective as an "Expert" difficulty level. So, on "Normal" difficulty, this objective wouldn’t even be available. If we had wanted to play the mission on the "Expert" difficulty level, thereby enabling that second objective, we would have used the command:
quest_create_mis difficulty, 2
You should only use the "set difficulty" command to test out a particular difficulty level through DromEd. If you set a particular difficulty level, and then save the file, the mission will be "stuck" on that level, even if the player chooses another difficulty level on the pre-game screen. So, if we set the tutorial mission to "Expert" difficulty and then saved the mission, anyone who played the mission would be forced to do so at the "Expert" level. If you do save the mission while it’s set to a particular difficulty level, you must delete the difficulty command and resave in order for the mission to operate correctly. So, you would use this command:
If you’ve followed this tutorial from beginning to end, you should now have the ability to build basic Thief 2 maps. By experimenting with DromEd, you can discover the program’s full capabilities. But here are a few helpful commands and tips to get you started.