Click on a heading to go there
Before you can do any DROMEDing of any kind, you must, obviously, download and install DROMED.
Please note that this tutorial deals with DROMED 1.32, not DedX or DROMED 2, although most of the methods mentioned here could most likely be carried over into the aforementioned programs.
Note: My tutorial aspires to cover EVERY aspect of DROMED 1.32. Even though most of the methods mentioned here could be crossed-over, this tutorial certainly doesn’t cover all the features that are available to Thief 2.
You can download DROMED from http://www.thief-thecircle.com.
Now, open the ZIP archive which contains DROMED, and unzip all the files to your “Thief” directory. You will be asked about overwriting, when the first on pops up, hit “Yes to all”, once this is done, go into your “Thief” directory, find “DROMED.exe”, right-click on it, and hit “Create Shortcut”. Now cut this shortcut, and place it wherever you want, start menu, desktop…
There! Now, there are a couple of essentials you should download, these can be found at DROMED Central (http://www.thief-thecircle.com/dromed/) under “Tools” or “Essentials”.
These essentials are:
KoMaG’s custom menus for DROMED 1, Thief Objective Wizard, Thief Book Wizard, Thief Text File Wizard, and Thief Mission Zipper. Download them all, and install them as per their readmes.
There, now, start-up DROMED, and get ready to create some levels!
Okay, do NOT PANIC! DROMED is an extremely simple editor, but looks daunting. Mainly because of the blacks and purples, rather than the blues and grays we’re used to!
Okay, you’ll see that we have a box down in the lower-right-hand corner. That’s the “command box”. You type commands there, we’ll use only a few commands, but they’re crucial!
You’ll also see, in the middle of the screen, four boxes, labeled “right”, “3D”, “Top”, and “Front”. Okay, the top view is the one you’ll be using most, it’s known as the “Plan view” by most DROMEDers. You’ll see in the three 2D boxes (Front, Top, and Right), that there’s a box which occupies 4x4x4 grid squares. Okay. This is a good time to tell you exactly what this box is…it’s a “brush”.
A brush is anything in the DROMED (or Thief) world which is created and manipulated! There are many different types of brushes, the basic ones are:
-Fill Air: Fills encompassed space with air.
-Fill Solid: Fills encompassed space with solid.
-Fill Water: Fills encompassed space with water.
-Flood: Turns all air in encompassed space into water.
-Solid-Water: Turns all solid in encompassed space into water.
-Air-Solid: Turns all air in encompassed space into solid.
-Solid-air: Turns all solid in encompassed space into air.
-Evaporate: Turns all water in encompassed space into air.
-Physical: Normal objects.
-Lights: Objects that give off light.
-Fnords: Invisible objects that create effects.
-SFX: Visible particle effects.
-Sound: Sounds (not usually created, but they are referred to via links quite often).
-Default: Ordinary roombrush (allows for sound propagation).
-Other: Roombrushes you create to create effects, such as ControlDevice links, or automaps.
Area: Allows for manipulation of individual areas within area brushes. Extremely useful for complex levels. Surround an area and hit “Me Only” to see only the brushes contained within that area brush!
Flow: Allows for the precise manipulation of water (eg: Water that flows, water that is lava, green or blue). See “Flow Brushes” for more info.
These brushes can be created by clicking on the buttons in the lower-center of the screen, labeled according to the type. In order to create the different types of TERRAIN brushes, when you click on “Brush” (Terrain), use the arrows to the left and right of “OP” to change the brushes operation…this can be done by selecting an already created brush, or by setting this before creation!
The type of OBJECT to be created by an OBJECT brush can be changed by hitting EDITORS-OBJECT HIERARCHY, then selecting a type of object (archetype) and hitting “Create”, now drag to create this type of object!
Okay, we now understand WHAT we see, but, once we’ve created it, how do we move it? Okay, here goes.
You can move brushes many ways. The most precise being X,Y,Z,W,D,H,H,P,B.
These are the values you see on the lower-left of your screen…we’ll work right to left, top to bottom explaining these values!
X – The brush’s current X-axis co-ordinates (should NEVER BE ZERO! THIS IS CRUCIAL!)
Y – The brush’s current Y-axis co-ordinates (should NEVER BE ZERO! THIS IS CRUCIAL!)
Z – The brush’s current Z-axis co-ordinates (should NEVER BE ZERO! THIS IS CRUCIAL!)
H – The brush’s current heading in degrees
P – The brush’s current pitch in degrees
B – The brush’s current bank in degrees
W – The brush’s current width in approximate feet (should NEVER EXCEED 250!)
D – The brush’s current depth in approximate feet (should NEVER EXCEED 250!)
H – The brush’s current height in approximate feet (should NEVER EXCEED 250!)
There! Now, you’ll notice that above all this, there is an indicator that reads: Grid Size: 16. Okay, this is your grid size, which denotes snap size. Try not to work below 11, and don’t work above 16, after that it gets too big!
Okay, here are your Number-Grid-Snap sizes. Number is the number size of the grid…16 for example, grid is the size of the visible grids, and snap is the smallest dimension you can have with that snap size, 11-16 are provided:
Number Grid Snap
16 4 8
15 2 4
14 1 2
13 0.5 1
12 0.25 0.5
11 0.125 0.25
As you can see, you’ll rarely need lower than 11. And remember that object-type brushes DO NOT SNAP!
And never turn snap off, if you do, you’ll get tons of errors because the lines aren’t snapped!
Okay, now you’ve made so many cubes that you’re bored of cubes, and you want to make different shapes!
So, let’s create more shapes! Go to Shapes, and click on a shape, now you can create that shape!
Here are the shapes supported by the DARK ENGINE:
Decahedron (10 sided geometric shape)
Okay, so you’ve tried creating a cylinder, but ended up with a prism rotated 45 degrees. That’s just not right! So, with “cylinder” shape selected, hit Shapes-Sides in Shape, and type “10”, now drag to create! There, a 10-sided cylinder.
Tip: Don’t have more than 10-sides in your cylinders…if you have more than that, the DARK ENGINE spends too much time processing the sides, and you get slowdowns. Think about the people with slow PCs.
Okay, so, you now want to move your brushes, or manually resize them (imagine THAT!). Here are the DROMED hotkeys:
Shift – Hold and drag to move a brush
Ctrl – Hold and drag to resize a brush
Alt – Hold and move to rotate a brush
W – Move your camera (the little purple thing) forward
X – Move your camera backwards
A – Rotate your camera left (the purple line indicates where you’re facing)
D – Rotate your camera right
R – Look up
V – Look down
F – Center view
1 – Bank left
3 – Bank right
2 – Center banking
Q – Strafe left
R – Strafe Right
Z – Strafe Up
C – Strafe Down
Comma – Select next brush face
Period – Select previous brush face
Right Click – Bring up the menu (when over one of the views), allows you to teleport camera, hide the grid, etc.
Enter/Return – Implement a typed command
- - Zoom all views (except 3D) out.
+ - Zoom all views (except 3D) in. (Do not use SHIFT to activate this command)
Delete – Deletes the selected brush.
There, those are the hotkeys you’ll be using.
Okay. First, let’s tackle the little problem of realizing the textures!
If you look to the center-bottom of your DROMED window, you’ll see a picture of this funky texture called: “Jorge”. Now, if you hit Alt+T, you’ll bring up the “Texture Palette”, which is where all the loaded textures are kept.
When the palette appears, there will be one texture: “Jorge”, and four buttons: “Sky”, “Put on Brush”, “Remove from Level”, and “Done”. Let’s see what each of these five buttons does.
Jorge – This is a texture, click this and click “Put on Brush” to put the texture on the selected brush face.
Sky – This is the sky texture.
Put on Brush – This button puts the selected texture on the selected brush face.
Remove from Level – Remove the selected texture from your level.
Done – Closes the palette.
Okay, now we need more textures! Click in the command window and type: “add_family core” (no quotes), then hit ENTER. Now at the bottom of your screen it should say: “Family Loaded”. Now hit Alt-T and you’ll see that tons more textures are available!
Now, it’s good to know the command to load a texture family, which is “add_family XXX”, but it’s easier to use KoMaG’s custom menus to our advantage. Click “Textures 1” and hit “Rescore”. This will load the texture family “Rescore” into the palette. Now, if you don’t like a texture family, and want to get rid of it, type “remove_family XXX” into the command window and hit ENTER.
Now, let’s say you’ve loaded two or three families, but you’ve only used a couple textures from each. Now, you’re palette is nearly full, and you need more textures! Oh no! What’ll you DO!
Merely type the following in the command window and hit ENTER: “compress_family all”. There, now if you open your palette, only the textures used in the level will be there! Feel free to load another family!
Now, there’s something VERY IMPORTANT that we must do before we go any further. Our level won’t work properly if we don’t load the scripts! So, type (in the command window): “script_load convict” and hit ENTER. At the bottom of your screen you should see: “Module Loaded”. We’ve now loaded all the scripts Thief uses into your level. There, now we’re free to go on!
Note: GayleSaver’s Custom Scripts are not covered by this tutorial.
Okay, now we’ve learned hotkeys, learned about textures and objects, brushes also, we’ve also covered creating an manipulating, but how do we actually make a level? Okay, let’s go!
First, there’s a command you should know about. Until you add light sources, you’ll want to completely illuminate your terrain brushes so you can look at them until you get around to light sourcing, so, type this into the command window and hit ENTER: “light_bright”.
Okay, now we want to get a look around us. Right-click on the 3D window and hold the right mouse button down, now drag the mouse pointer down to: “Solid World”, and release.
Don’t scream and yell if noting happens. Tap “W” once so you move (and activate light_bright), now, nothing will happen (in the 3D box, at least).
Now go up to Tools-Portalize. Portalizing calculates all the brushes. While objects and changes to objects appear in the world instantly, in order for changes to brushes to appear (texturing excluded), you must portalize. That’s what we’re doing!
Remember that the more brushes you have, the longer portalizing takes! Since we only have the default brush, a 16x16x16 Jorge brush, this shouldn’t take very long.
Once portalizing is done, you’re 3D view should light up, and show a 16x16x16 expanse of air textured with Jorge. You can move around if you like, but it’s not like there’s much to see!
Now, why don’t we do something cool to show off our texturing prowess? Okay, look down to the “Face” indicator, it should say “Default”, which means all the faces that HAVEN’T been set to a different texture. (You can set a face, say “Top” back to default by selecting it and typing “-1” in the texture box (remember that you don’t include the quotes).) Okay, since we have the core texture family loaded, we should have some options to choose from.
Hit Alt-T and select a texture that looks outdoorsy. Hit “Put on Brush” and “Done”. There! You’re room has magically been transformed!
Now, I said earlier that this is going to be outdoorsy. So, it needs a sky! Hit comma until the “Face” indicator reads “Top”. Then hit Alt-T, select “Sky”, hit “Put on Brush”, and hit “Done” or Alt-T to close the palette!
There! A perfectly good outdoor area…but, it’s a bit small!
Now, before we go any further, we need to get this default brush AWAY from the incriminating 0,0,0 world co-ordinates (I’m sure I mentioned this earlier). I good value is 500,500,500, so, implement this!
Now, zoom out until you can see your brush, then teleport into it on all 3 2D views. Now let’s make this brush bigger! A courtyard should be HUGE! Make the brush 32x32x32. There, now portalize!
Okay. Now, you’re wondering, “How does Garrett know to start out in this brush?”
The answer, sorry to say, is HE DOESN’T. If you don’t have a “StartingPoint”, Garrett will automatically start out at the co-ordinates 0,0,0, and won’t be physical! He’ll be able to walk through objects, go unnoticed by the AI, it’ll be a catastrophe! So, let’s rectify this little problem of ours!
Go into the “Object Hierarchy”, and hit the plus arrows beside the following things (all in levels beneath the last): Fnord. Now select “Marker” (the words, not the plus sign), and hit “Create”.
There, object brush type is now Marker!
Drag to create the marker, then use SHIFT to position the newly created Marker in the center of your room. Now, if you look down, you’ll see that the window in the center-bottom reads: “A Marker (1)”, or any other suitably low number, like “2”. This number is the OBJECT NUMBER! Object numbers are important for linking, and for you. It’s recommended you don’t have more than 1800 objects. That may sound like a lot, but it really isn’t.
Now, we don’t want our StartingPoint to be called “A Marker”. No, that’s stupid! So, hit the “Properties” button below the object’s name and number. This should bring up a daunting dialog!
We’ll learn more about properties later. For now, click on the top property, which is the object’s name and number, then hit “Edit”. Type “StartingPoint” in the pop=up dialog, then hit Enter, and dismiss the properties box.
Now our StartingPoint is called just that!
Now, hit the “Links” button. This should bring up an empty box. That’s because our marker isn’t linked to anything! But, we must link it to Garrett himself!
Hit “Add”. Then fill out the ensuing box like this:
Now hit “OK”.
Let’s figure this out, okay? The Flavour of a link is the type. There are HUNDREDS of links! Links make objects react to one another. For example, a link makes the button’s at Ramirez’s trigger the alarm! From is the object or archetype the link originates from, and To is the object or archetype the link goes to!
Now, let’s dismiss the links window for now. We no longer require its services!
One last thing, click on the StartingPoint, and hit “Properties”. Now Add-S-Scripts, in the first box type “VictoryCheck”, then hit enter, and hit “OK” to dismiss the properties box.
Okay. Now, we’re going to let you go in-game. Which means you’ll pop into game mode. Please note that in order to get back into the editor you’ll have to hit Alt-E. Also note that you’ll have NO WEAPONS OR INVENTORY ITEMS. There will be NO SOUND!
Okay, go in-game, hit Alt-G!
There, wasn’t that enjoyable? I’ll bet you wish there was a bit more to explore, don’t you?
Okay, now why don’t we create some more rooms? You know how! Adjust the grid size accordingly, and make sure that you leave some space between rooms. If you don’t, there will be no walls, and that will look VERY funky.
Okay, now you have several rooms! Congratulations! But…if you pop in-game, you can’t actually get into them…very weird!
Okay, let’s make doors. First, we need some doorways. So, set the grid size to “15” and create a brush that is 4x4x8. This assumes, of course, that your walls are four feet thick. If they’re bigger or smaller, adjust the brushes depth or width accordingly!
Now, position this brush level with the floor, and between two rooms. Now texture it, and portalize! There, a beautiful doorway…without a door?
Let’s create a door! Go into Object Hierarchy-Physical-TerrainLike-Doors-SpinnyDoor-4x8 door-MetalDoor21, hit “Create” and then “OK”.
Now create this door, fiddle with its heading until it faces properly, and position it inside the doorway, so that the door’s left and right align with the brush’s left and right, and so that the door’s top and bottom align with the same faces in the brush. And remember, if your door opens the wrong way, you can always turn it’s heading +180.
Okay, pop in-game. The door works, no? If the door disappears into the wall, just use SHIFT and move it a little away from the wall it disappeared into. If you zoom in you can work with more precision…
There, you have a door! Why don’t you try out different types of doors? Do ahead, I can wait!
Okay, so you’re finished playing, and you want to know more? Good thing I know more than just about doors and brushes!
Now, why don’t we lock a door? Hmm? We’ll give Garrett the key later, but now we want to make the door locked AND unlockable…yes, that’s right, you can make a door that can’t be unlocked…but don’t be cruel by hiding treasure behind those doors, use those to add realism while not taking up your time…most useful in city maps!
Okay, open up the doors properties, and Add-Engine Features-Locked. Check the box and hit ENTER.
Now your door is locked, and unlockable…that was simple, wasn’t it?
Okay, let’s add the property to assign a key to a door! Add-Engine Features-KeyDst, leave MasterBit alone…no one really quite knows what that does, and make RegionMask “1”, and make LockID a number of your choosing.
Remember that RegionMask should always be “1”, and that MasterBit should be left alone, unless you feel like having DROMED crash (it does this quite frequently, so save often!).
Normally, if you create a water brush, all you’ll see is Jorge. That’s not very fun, is it?
So, let’s learn about FLOW BRUSHES!
First, create a little pool of water.
Good, now encompass the water with a flow brush.
An important note: Flow brushes and solid brushes may not share the same center point!
Okay, there are two bonuses to flow brushes: 1. You can make the water blue, green, or water!
Now, hit “Edit Group”. In “Texture Name” type “bl”. There, blue water!
Now, let’s say we want some current! We use the boxes that read:
This is the current, in feet per second! Z is up and down, down is a negative number, for X is north and south, north is a negative number (North is “up” on-screen), and Y is east and west, west is negative.
Okay. Let’s create some weapons to give Garrett. Find them in the hierarchy and create them around your marker.
Done? Now, link them all to the StartingPoint with a “Contains” flavour link.
Now, if you gave Garrett arrows or inventory items, you should realize that there’s a better way to give Garrett 45 broadheads than by creating 45 separate objects and linking them all to the StartingPoint!
Quite simply, pull up the Properties window, and Add-Engine Features-Stack Count. In the pop-up, type the number you want that object to be worth, and hit ENTER. Then “OK” the properties window! Remember, this can be done with ANYTHING. Carrots, treasure, arrows, flash bombs…anything.
Note: On crystal arrows. If you want Garrett to have a moss arrow to start off with, give him an EarthArrow object. If you want him to pick up an moss arrow, create an EarthCrystal, found under Physical-Tulz-Crystals. Simply put, Garrett should receive arrows to start off, should pick up crystals. Doing it the other way around, or just giving crystals or arrows, causes…you guessed it! Thief crashes. So predictable!
That wasn’t so hard, was it?
So, you don’t want keys to appear in your inventory as just: “Key”. Well, here’s the solution. But first, ask yourself:
Do you plan to include multi-language support?
If you answered:
Then go open strings.crf in your “Thief” directory, and extract objnames.str to “Thief\Strings\English\”
Now open up objnames.str in notepad, and, at the bottom of the list, type:
Make XXX one word that describes your object, and that is not included anywhere else in as a title in objnames.str. So, MyBasementKey would work. YYY is what you want that object to be named.
Now, go back into your level, and open up the properties for the object you want to name. Add-Inventory-Inventory Name, and type Name_XXX in the field that appears.
If you answered:
Then open up the object’s properties, and Add-Inventory-Inventory Name and type: Name:”XXX” where XXX is the name you want the object to be.
Now, say you’ve created a scroll (See “Readable Items”), and you want the player to be able to buy it…for 1000 loot. If you don’t slap a price on it, it will appear as FREE! No, Thieves don’t get free info. So, Add-Inventory-Purchase Price, and type in the amount!
You’ve got this scroll, with a name and a price…but it’s got no description? So, open up strings.crf and extract objdescs.str to “Thief\Strings\English\”
Now insert your description at the bottom, and Add-Inventory-Long Description.
For more info on creating stores, see “Creating a Store”.
Okay, now let’s create that key I promised you. Create a Physical-Key-Key1. Remember that of the keys, only the numbered keys are really keys. The KeeperKey is that weird-looking key that unlocks the Lost City.
Now, create the key and link it to Garrett.
Now we have to assign it to the door we locked. Open it’s properties and Add-Engine Features-KeySrc. Fill out this dialog EXACTLY as you filled out the door’s KeyDst.
There! Go in-game, and unlock the door!
You may or may not have already tried resizing an object…and failed. If you resize a Physical-Furniture-Tables-Table to, say 60x20x3, you can walk straight through most of the table! Aah!
Don’t panic…like most things, there’s a quick solution!
Open up the table’s properties, and adjust Physical-Dimensions, and adjust these values to the appropriate setting!
Please note that DROMED treats all objects as squares…which is why they appear this way on-screen!
By now, you’re probably REALLY angry at me, because your level is MUTE. That can be rectified! Select each of the brushes in your level in turn and press Shift+Insert. I little purple box should spring up to encompass each of them. Now, once you’re done, click on one of the them, and press “Compile”. Now go to each roombrush in turn and (if you wish) assign it an EAX value. The following are the EAX values assignable. Remember that in order to assign an EAX value, press Ctrl+the function button numbered to the EAX setting. For example, Small Dead is EAX setting “1”. To assign it to a roombrush (once you’ve “compiled”), hit Ctrl+F1.
Here’s the chart:
1 Small Dead
2 Small Normal
3 Small Live
4 Large Dead
5 Large Normal
6 Large Live
7 Dead Hallway
8 Normal Hallway
9 Live Hallway
There! Now you have an EAXed, roombrushed level! Now, before we go in-game, we must process the room database and the AI Room Database! Hit Tools-Build Room Database, and Tools-Build AI Room Database, then go in-game.
Isn’t the sound wonderful? Enjoy it, and use it!
And remember, each time you change a setting on a roombrush, build the AI Room Database the Room Database.
Save often! Create a directory inside your “Thief” directory named after your mission. Every time you save, save under a different number. Say your mission is called “BaffTaff” (which my mission is), save like this “BaffTaff_1.mis”, “BaffTaff_2.mis”, on and on…
How, you wonder, does something become a door? Well, first it needs a script, then it needs a property.
Let’s explain it!
Create a BaffBanner. It’s in the decorative archetype. Now, let’s turn this simple BaffBanner into an opening-closing rotating door.
Open the properties, Add-S-Scripts. Type “StdDoor” in the first box, then hit ENTER.
There, that’s your script. If you want the door to be locked, and have lock sounds, add another script in the line below. “LockSounds”, there, that wasn’t so hard!
Now, the property! Add-Door-Rotating.
This box may look daunting, but we don’t want much out of it! Door speed interests us, open angle and closed angle interest us, Clockwise?, and Axis interests us.
The clockwise? check box is fairly straightforward! If you want the door to open clockwise, check it, if you want it to open counterclockwise, uncheck!
Now, axis. The default is Z-axis, change it if it suits you!
The open angle is relative to the angle the door is at. So if the door’s heading is 70, the open angle will be 70+it’s value. If the door opens counterclockwise, the open angle should be 90, if it opens clockwise, the open angle should be 270. Closed angle is usually 0.
Now, implement all this, and hit ENTER.
Now, there’s one more property we need. We need to tell DROMED that we want the StdDoor script to activate when the banner’s frobbed. So, Add-Engine Features-FrobInfo. It’s all set to [None]. Change WorldAction to “Script” by checking “Script” in the drop-down menu.
There, go in-game and try it out…it works, doesn’t it?
Now, create a bed. Now, make sure you don’t use the “Bed” archetype, because those crash DROMED. Use “BedParts”, those work!
Now, add the “StdDoor” script, “LockSounds” if needed, and add the FrobInfo. Now, here’s the uniqueness of a translating door!
Add-Door-Translating. This dialog is similar, but not the same. The axis’ work the same, but there’s no “Clockwise?”. The closed value is usually 0, and the open value is how far along the chosen axis you want the object to slide before stopping. If you want the object to move the opposite direction, use a negative value.
There, check it out! Wonderful stuff, huh?
Switches and Buttons are special objects that are used in many instances to create effects. They emit ControlDevice signals. Buttons emit one-type of ControlDevice signal, which is useful for activating one-way effects, such as alarms, or DestroyTraps.
Switches, however, use on/off ControlDevices, which is useful for things that must be turned on AND off. Such as doors or lights.
ControlDevices are a complex subject, but I will try and make you well informed as I can.
The following are the scripts I know of the produce ControlDevice signals:
StdLever On/Off (default on switches)
StdButton Single Fire (default on buttons)
TrigSlain Triggers a single fire when something is slain
TrigUnlock Triggers on/off based on a lock’s state.
TrigDoorOpen Triggers on/off when a door opens/closes.
TrigRoomPlayer Triggers when a player enters a room.
You can also use alert responses and conversations to trigger ControlDevices, but that’s discussed later! And remember, on/off ControlDevices can, in theory, operate single fire objects. For example, a switch can trigger a DestroyTrap on it’s first frobbing, but after that will be useless.
Tip: If you find that you must frob a switch twice to get something to work, try linking the switch to an inverter, and an inverter to the target object(s). An inverter reverses the sense of links passing through it.
Remember, if you’re using a switch to open/close a door, make the door’s WorldAction FrobInfo: “Script,Ignore”, so you can’t bypass the switch by frobbing the door directly…especially portcullises, a frobbable portcullis is cheesy, period!
Also remember that a switch’s state can be changed by ControlDevice linking to it. For example, if you want to switches to stay in the same state as the other, always, link them back and forth to each other, then link one (only one) to the target object. Chain as many switches as you like!
You can “reverse” a switch so that it sends an “Off” ControlDevice initially, and, so that it appears “down” rather than “up” by opening it’s properties, selecting: “JointsState”, hitting “Edit”, and changing AnimS from “[None]” to “On”.
Okay, now you can make switches, you can make doors and lock them, make Garrett, make sound. But you can’t make those nifty footlockers!
Find them in Physical-Containers-FootLocker. Create one, and create an object to go in it.
Now, link the FootLocker to the contained object with a “Contains” flavour link. There! It works!
You can turn anything into a container by adding the script “Container”, and changing the FrobInfo WorldAction to “Script”.
A light is anything that gives off light in Thief. Please keep in mind that TDP and TG DO NOT support dynamic lighting, or moving light sources, as this is better known. TMA, however, does support dynamic lighting.
There are many different types of lights. There are torches, electric lights, and lightmushes. Torches are the most common, followed by electric lights. Torches are interesting in that they can be doused and re-lit, electric lights are interesting because they have the ability to be switched on/off, and the fact that they give off MUCH more light than a torch.
Please do remember to place light sources, because light_bright only illuminates brushes, and also makes for a very unconvincing game play, remember that Thief is about stealthiness, and shadows, so be sure there’s always away to sneak around!
There are two general types of lights, physical light sources, and hacklights. Hacklights are invisible light sources, useful for illuminating tight spaces. Hacklights can be found in the fnord category of the object hierarchy, while physical lights are under physical.
There are two different TYPES of lights. Spotlights, and normal lights. Spotlights give off a focused beam of light, and are useful for creating a lit room, with shadowed walls! Normal lights give off light in all directions, and are useful for general rooms.
Okay, now, how to make a light switch able! Create your electric light, and open it’s properties (please note that ANY light can be switched, however, switched torches are cheesy). Now, look for an AnimLight property. If it’s there, you’re safe, if it’s NOT, add it.
This is a good time to discuss the AnimLight menu. Here you can adjust the light’s mode. If you want your light to be off initially, set the mode to “Minimum Brightness”, and leave minimum brightness at “0”. Now set a nice maximum brightness, and set the light’s radius. There, you’re done!
Now Add-S-Scripts, and type “AnimLight” in the first available spot. Now, if your light is on initially, you’ll also need an inverter. Link the inverter to the light, and link a switch to the inverter. There, you’re done!
Keep in mind the way to reverse the starting state of switches. But remember, it looks better if the switch starts “up” and the lights are “on”. We seem to associate switches that are “up” with “on” lights!
So, on the same token, if you have a light that’s off initially, reverse the switch and add an inverter…that way real life and Thief seem even more seamless!
Hit Tools-Light, and enjoy!
Tip: If you find that you can’t get an area shadowed by fiddling with the position of physical lights, don’t worry about it, simple create a SpotLightPoint HackLight, point it at the area you want shadowed, and set it’s “Light” property to a negative value!
To create Lost City lights, lights that turn on when you (or another creature) enters a room, and so that they turn off when the room once again because unoccupied, create your light, and take all the steps necessary to turn it into a switchable light.
Now, read “Roombrushes”.
Now, create a concrete roombrush, and add the scripts “TrigRoomPlayer” and “TrigRoomCreature”. Now ControlDevice link that room to the light.
Remember that for each set of individually switching lights you MUST create a new concrete roombrush archetype! However, if you want two roombrushes to control the same light, create two of the same archetype…the scripts and links will automatically be inherited!
To create a light that switches itself, make it switchable, and then Add-Engine Features-FrobInfo and set WorldAction to: “Script”.
Okay, here we are, AIs, the most difficult DROMED concept to master. There are two processes that pertain to AIs, and these are:
Build Pathfinding Database Tells the AIs where to go and how to get there
Build AI Room Database Allows the AIs to “hear”.
Okay. Keep in mind that AIs are objects just like everything else, only, they’re special, they move, and think!
This is a good time to mention an extremely useful command: “aiawareofplayer”. Enter this in the command window and hit ENTER, and the AI will become completely oblivious to your presence. They will, however, notice if you hit something (like a torch) with your sword or blackjack, and they’ll become alert when you shoot them!
Now, AI are just like other objects, you can place them and leave them…they appear without portalizing.
Now, don’t get scared when you create your first AI because it’s as wide as it is tall, if not wider. This is because an AI’s default posture is with it’s arms out. This changes when you go in-game, however.
Okay. You’ll notice that if you create a servant, and scare him, he won’t run away, he’ll search for you (and never find you). That’s too cheesy for me to handle!
Create markers at suitable flee points in your levels, and name them “FleePointX”, where X is the number of the flee point. Now Add-AI-Utility-Flee Point, and set a desirability level. 0 is totally undesirable, and 100 is ultimately desirable. If you set multiple flee points of the same value, fleeing AI will either run to the closest one, or run back and forth between them. (You can observe this sort of behaviour by scaring the talking servants in the bedroom in Bafford’s, after which you’ll find them dashing frantically around in the halls.)
Remember to build the pathfinding database after you create flee points, though.
Okay, you have AIs that flee, and that stand around waiting for you. But what if you want patrolling AIs? Read on!
Okay, so, you want patrols? So, create an AI, now, open the hierarchy, and create: Fnord-Marker-TrolPt.
Create them where you want the AI to patrol. Now, take in mind that an AI will patrol at the closest patrol point, so, to make sure he doesn’t go gallivanting off into some Godforsaken corner of the map, create the first TrolPt inside him!
Now, link forwards all the TrolPts with AIPatrol flavour links. Remember to link the first back to the last, or the last back to the second to last…on and on. This is a common mistake!
Now, we have to tell Mr. AI that he’s supposed to patrol. So, pull up his properties, and Add-AI-AI Ability Settings-Patrol: Does Patrol. Check the box, and hit “OK”.
Now, compute the pathfinding database, and go in-game…there, your AI patrols!
Okay, let’s tackle sleeping AI. Now, you must understand that Thief comes with a MetaProperty called “M-SleepingServant”, which was used to make a servant sleep. Never guards. But since the advent of FMs in 1999, we’ve seen everyone and everything sleeping!
So, ignore the servant part. Now, there’s one defect in this sleeping metaprop, and that’s that the sleeper doesn’t wake up. The OMs used AIWatchObj links to wake the AIs up…which was a bit cheesier than the method I have in-mind! So, we’re going to modify your Dark Gamesys. Sound daunting? Don’t worry, it isn’t.
Now, let’s dive into what, exactly your Dark Gamesys is. It is dark.gam, the file that defines everything about how the game runs. So, when you change your object hierarchy, you must save the changes to the gamesys, otherwise they’ll be lost!
So, first we have to change this M-SleepingServant metaprop, then we must save the gamesys.
Okay, open the object hierarchy, look up at the top, it says that you’re currently viewing archetypes. Change that to MetaProperties. Now browse until you find M-SleepingServant. Select that and hit “Edit”.
Now, I must tell you what a MetaProperty is. A MetaProperty is a collection of properties, which create a desired effect. M-FrobInert, for example, causes an object to become unfrobbable, or incapable of producing effects.
The benefit to MetaProperties is the fact that they can be added or removed by a Response or Conversation, both covered later.
Now, Add-AI-Responses-Alert Response.
Set the alert level to 3, and the priority to “Very High”.
Now change the first action to Add/Remove MetaProperty, and then type the following in Arg 1, 2, and 3.
Okay, this means that when the AI becomes alerted, he/she will remove the M-SleepingServant MetaProperty from himself/herself. If I wanted to remove the MetaProperty from another object, I would have typed that object’s unique name (must not be a number) in Arg3, but since I was targeting the AI itself, there was no need!
Now, get out of the Obj Hierarchy, then go File>Save Gamesys, and save over “Thief\dark.gam”.
Okay, now the question is, how do I put a purse or key on an AI’s belt? That’s simple! First you create the purse/key, and modify the properties as necessary. Then link the guard to the object via contains link.
But don’t close the links window yet! Once you’ve hit “OK” to create the link, it appears in the link list. Now, look under the “Data” column. Right now this says “Generic Contents”. Now, this is great if you want an AI to have a key so he can go through a locked door, but, not be steal able by the player, but, if you want it on his belt, that’s a no-no. So, click on the link’s ID number, then hit the “Data” button.
This drop-down menu contains three choices: Hand, Belt, and Generic Contents. “Hand” doesn’t appear to work, and right now we’re worried about the belt, so hit “Belt”, then “OK”. There, it works! Go in-game and check it out!
Okay, here’s THE BEST AI trick in the world…drunkenness!
Create the guard to be drunk, now, we have to edit his properties (you could make this a MetaProperty if you were going to use it enough). First Add-MetaProperties…find M-AlertCapZero and click on it.
Now Add-Speech-Voice, change the default value to “drunk1”, and hit ENTER.
Now Add-AI-Responses-Threat Response, change the threat to “Raised Weapon”, and change the actions to:
Action00: Add/Remove MetaProperty
Action01: Play Sound/Motion
Okay, here’s what the above does. When the guard sees a raised weapon, including the bow, he removes the M-AlertCapZero MetaProperty, and plays a sound that indicates he’s become alert. The Add-Speech-Voice made it so that his voice was drunken, you know, with all the hiccups and that!
Okay, now Add-AI Core-Awareness Capacitor, and change the value of all three fields to ten. I think this makes him harder to alert…but I’m not sure, I just tore these properties configurations straight from the well house guard in Bafford’s.
Now Add-Motions-ActorTagList, type: “WithSword0, Drunk0”, this changes the guard’s motion configurations so that he sways drunkenly, with his hands and sword flying about. The “WithSword0” part just makes it so that his motions are consistent with that of someone carrying a lethal piece of heavy metal around in their hand.
Now Add-AI Core-AI, make that “Default”. This just sets it up so he behaves in the default fashion.
This is all well, but it’s kind of cheesy. We’ve got a drunk guard standing in the middle of no where. Why don’t you put some bottles and goblets around his feet, hmm? And how about a goblet in his hand…no, seriously!
First, create the goblet. Now remember it’s number and open up the drunk guard’s links window. Add a new link:
From: Drunk Guard
Now, once you’ve pressed “OK” to create the link, change it’s data to “Left Fingers”, that’s where the goblet will attach to the guard. Now dismiss these windows, and pop in-game. There! A drunk guard swaying about madly, holding a goblet, who ignores you until either you alert some sober guards, or until you threaten him with a raised weapons!
Okay. So now you can make drunk guards, make patrolling guards, and put things in a guard’s inventory. But what if you want to make an archer fire, fire arrows? Or, what if you want an AI on Garrett’s team? What if you want a super-talkative guard? Don’t worry, I’m not going to leave you to figure those things out on your own!
Okay, first, let’s tackle super-talkative guards. This is an easy one! Pull up the guard’s property and Add-AI-Attributes-Verbosity. Set the value to whatever it pleases you, and hit “OK”. Please note that AI-Attributes are a good way to make your guard behave a certain way. For example, a guard who’s sloth is high will be lethargic, a guard with a high efficiency won’t miss any spots when he’s searching for you, and so on and so forth!
Now, an AI on Garrett’s team is also easy. You Add-AI-AI Core-Team, change that to whatever you want, here’s the low-down on the teams:
Good On Garrett’s team, against all BadX
Neutral Neutral, isn’t hostile to anyone
Bad 1 Bad, against Good and all other BadXs
Bad 2 Bad, against Good and all other BadXs
Bad 3 Bad, against Good and all other BadXs
Bad 4 Bad, against Good and all other BadXs
Bad 5 Bad, against Good and all other BadXs
Bad 6 Bad, against Good and all other BadXs
There! You can also make being non-hostile by Add-AI-Ability Settings-Combat: Non-Hostile. There are many different settings, all of which are quite literal.
Now, to tackle archers. Please note that this is the same for ALL OTHER RANGED AIs, for example you can change a high priests spell to an arrow if you want.
Create an archer, found under Physical-Creature-Animal-Humans-Guards-Bowman-, any old archer will do.
Now, open up his links. You’ll see that by default he has the following links:
From: The Archer
To: A Broadhead
Data: Generic Contents
Flavour: Culpable For
From: The Archer
To: A Broadhead
From: The Archer
To: A Broadhead
Data: High Arcing
We’re going to dissect these links. The first one tells DROMED that the archer contains a broadhead. The second tells DROMED that he CAN carry broadheads. The third tells DROMED that when he fires, he fires a broadhead.
So, create a firearrow (not firecrystal!). Then delete all the archer’s links, and re-do them, all to the fire arrow. Change the data of the AIProjectile link for a flat trajectory, as this is how fire arrows fly!
Note: All CulpableFor links are done automatically by DROMED.
And last, how to make an AI start out dead!
Add-MetaProperties. Now find and add “M-PosedCorpse”.
Or, make a zombie who’s dead, but activates when you walk over him: “M-ZombiePossum”, and “M-FrobInert”.
And there, you’re done!
Ever wondered why Thief didn’t ship with a Hammer Archer?
You’re wrong! Thief DID ship with a Hammer Archer! And here’s how you can activate him!
Create a bowman.
Now, open the bowman’s properties and Add>Shape>Model Name
That’s all fine and dandy. Now, let’s do some more AIProjectile work.
We’re going to make a farting burrick! Oh, yeah!
First, we’ll have to edit the archetypes a little. So, “Edit” Physical>Creature>Animal>Burrick>DefectiveBurrick.
You’ll see that the “DefectiveBurrick” has an “AIProjectile” link to a “fart”.
Click on that link and hit “Edit”. A link window will come up. Select the only link and hit “Data”. Now adjust the launch point to: “Butt”.
Then save your gamesys (See “The gamesys and you”), and try him out!
Fnords, they’re invisible, they aren’t physical, all they are, are tiny red boxes on your screen…WHAT DO THEY DO?
It’s pretty simple! Below is listed the effects of the Fnords I know:
Marker A generic Fnord, used for gotos, conversations, and StartingPoints
Inverter Inverts the sense of a ControlDevice on/off link
RequireAllTrap Requires all off the links to it to be in the same state before it sends a message of that state
RequireAnyTrap Sends an “on” signal if any of the ControlDevices to it are “on”, and vice versa
RelayTrap Relays a ControlDevice
DestroyTrap Destroys whatever it’s linked to via ControlDevice when it receives a ControlDevice
ReleaseTrap Releases whatever it “Contains” when it received a ControlDevice.
TrolPt A patrol point
TerrPt See “Elevators”
LookBackPt The patrolling individual looks back here, operates like a TrolPt.
QVarTrap Changes mission objectives, see “Objectives”
VOTrap See “Garrett’s Comments”
EmitTrap Emits projectiles, Bonehoard and The Sword style!
EmitStreamTrap Emits multiple projectiles. See “EmitTraps”
BoundsTrigger “On” while occupied (by player or creature) “Off” while unoccupied
SoundTrap See “SoundTraps”
There you have it!
Okay, here’s a list of useful scripts. Some of them require special properties, most of which can be gleaned by taking a peek at the object drawn from.
StdDoor Makes the object a door, needs a “Door” property
StdElevator Makes the object an elevator, requires “Moving Terrain” property
StdLever Object transmits on/off ControlDevices, needs FrobInfo and “JointsState”
StdKey Makes a key a key, see the section: “Keys” for more info
LootSounds When picked up, the object produces loot sounds
LockSounds The object produces lock sounds if locked
StdButton The object transmits single-state ControlDevices, needs FrobInfo
TrapDestroy Turns the object into a DestroyTrap
TrapInverter Turns the object into an Inverter
TrapRequireAll Turns the object into a RequireAllTrap
TrapRequireAny Turns the object into a RequireAnyTrap
TrapQVar Turns the object into a QvarTrap
TrapRelease Turns the object into a ReleaseTrap
TrapTeleporter Turns the object into a TeleportTrap
TrigUnlock Sends an “On” when unlocked, an “Off” when locked
TrigSlain Sends a single-state when the object is slain
TrigDoorOpen Triggers “On” when open, “Off” when closed
TrigRoomPlayer Place on concrete room, “On” when occupied by player, “Off” when not
TrigRoomCreature Place on contrete room, “On” when occupied, “Off” when not
TrigAIAlert Triggers when an AI becomes alert
TrigWorldFocus Triggers when an object becomes focused upon
TrapRelay Turns the object into a RelayTrap
TrapTweqEmit Turns the object into an EmitTrap
EatFood Makes the object Eatable
StdScroll Makes the object a scroll, see “Readable Items”
StdBook Makes the object a book, see “Readable Items”
SecureDoor Guards become alert if they see the door not in it’s original state
CollisionStick The object sticks to wooden surfaces
AnimLight See “Lights”
OnOffSounds The object produces sounds when turned on/off
TrapConverse Turns the object into a conversation, see “Conversations”
VictoryCheck Must be placed on StartingPoint or the level cannot be completed
Extinguishable The object’s light can be extinguished and re-lit, see “Sources and Receptrons”
LockPick This is the lockpick script, see “Lock Picks”
WelcomeRoom See “Objectives”
Container Turns and object into a container. See “Containers”
LoadoutCache See “Making a Store”
There, there’s a lot, isn’t there?
Goodness…there’s links, Fnords, scripts!
ControlDevice Creates effects…this one’s too broad! See individual sections
Contains Causes one object to contain another
CulpableFor Makes an AI capable of containing something (automatic)
AIProjectile Causes an AI’s projectile to be whatever it’s linked to, must be in AI inventory
AIPatrol Link from TrolPt to TrolPt to form a patrol route
AIWatchObj Eek! See the section on this one!
Lock Link from something to a lockbox to lock the something
AIConversationActor Link from conversation to actor, see “Conversations”
SoundDescription Link from a VOTrap to a sound archetype, then the VO will play that sound
Weapon Makes the linked to object the AI’s weapon
Corpse Makes the linked to object the object’s weapon
FrobProxy A weird link…see the section on Frobbing
TerrPath See “Elevators”
TerrPathInit See “Elevators”
CreatureAttachement Useful for attaching one creature to another creature/object
ParticleAttachement Attaches objects and particle effects
Note: The links with tildes “~” infront of them do not concern the average DROMEDer, they are backwards links, and DROMED creates and manages them automatically. For example, when you create the following link from your StartingPoint:
To: A Sword
DROMED automatically creates this one:
From: A Sword
Making an item readable is fairly easy. There are three things that are of concern:
The script: StdBook or StdScroll
Before you begin creating books, open up your “Thief” directory, and create a new folder, called “books”, under that folder, create “English”. Now we’re ready to begin!
Let’s now explain how books work. DROMED, when a book text is requested of it, searches the *.crfs and the “Books” folder for books of an identical name. So, don’t go naming a book in your mission the same as a book from an OM.
Now, take note that all book files must be *.str, you can create them using NotePad.
So, pull up notepad.
Now, here’s the format for books, the pages start at “0” and work their way up, have as many pages as you want (although, remember, people aren’t going to read boring stuff forever, eventually they’ll dismiss it!):
page_0:”This is the first page…”
page_1:”This is the second page…”
page_2:”On, and on…”
Now, save this under “Books\English\Test.str”, inside your “Thief” directory, and restart DROMED (if it’s open), or start DROMED (if it’s closed), this is because if you create a book, then try and access it without restarting DROMED, DROMED won’t find the book, and will crash (of course)!
Now, he’s how things work. You can have “Scrolls”, which are picked up and read from your inventory, or “Books” which are read in the world, and are stationary. A “Scroll” can be a book object, and vice versa. It’s just what you want to happen! For example, a GoldPlaque is considered a “Book”, because it’s read in the world. Here are the steps to create a “Scroll”:
Create an object (readable or not)
Remove the script: “StdBook” (if it’s there already)
Add the script: “StdScroll” (if it’s not in-place already)
Add FrobInfo: WorldAction: Move InvAction: Script
Add Book-Text, and make it “Test” (remember not to include complete directory or *.str)
Add Book-Art, and make it: “parch”, or “pbook”, you can make many more, just take a look in the books’ *.crf
Note: If you don’t want art, and want the text to be drawn onscreen, exclude the Book=Art property, but remember, only the first page will be drawn if you do it in this fashion!
Steps to create a “Book”:
Create an object (readable or not)
Remove the script: “StdScroll” (if it’s there already)
Add the script: “StdBook” (if it’s not in-place already)
Add FrobInfo: WorldAction: Script
Add Book-Text, and make it “Text”
Add Book-Art, and make it: “parch”, or “pbook”, or anything else fancy you’ve scrounged up!
There! Objects you can read!
Let’s say you want an object, that, when you pick up, displays the following text atop your screen: “This will be important later…much later.”
First, obviously, create the *.str file…you know how! Make sure it’s only one page, though!
Now, create the object…say, the Horn of Quintus…yeah!
Now, go into it’s properties and change it’s FrobInfo. Leave the defaults, but add the “Script” property to the WorldAction.
Add the following script: “StdButton”.
Now, create a plaque hidden someplace the player can’t get at it, and make sure that, when read, it displays the text previously specified atop your screen.
Now, select the Horn of Quintus, and add this link:
From: Horn of Quintus
Now, jump in-game and try it out…cool eh?
Okay, all through this tut I’ve been talking about “frobbing”. You might have gone to the dictionary and been dismayed not to find it there. But, yes, “frobbing” is a word, and is to some, an art!
Frobbing is the art of activating an object. But technically, activating implies a world action. Basically, in order to “activate” you have to be near something!
That’s not the case with frobbing. That’s the beauty of it! Frobbing is completely internal! There’s no default action when an AI “frobs”, you have to manually prescribe it, meaning you can do all sorts of nifty stuff with frobbing, when the button being activated is hidden, perhaps in a BLUEROOM!
There’s one link that concerns frobbing…FrobProxy, FrobProxy links make it so, if you from the “From” object, the “To” object is frobbed.
Frobbing will be discussed more in-depth in the following sections: “Conversations”, “The Infamous AIWatchObj Link”, and “Responses”.
You may be wondering about these “MetaProperties”. Well, MetaProperties are collections of properties. They are advantageous because they save time, in that you can add several properties at once, and their useful because most of them shipped with Thief, and can be used to produce effects that were used in the OMs.
Another good thing about MetaProperties, they can be added by AIWatchObj (see “The Infamous AIWatchObj Link) links, Responses (See “Responses”), and by Conversations (See “Conversations”). Using the “Add/Remove MetaProperty” action. But we won’t get into that now. That’s covered by the section: “Conversations”.
Now, you want to create a new MetaProperty! So, open the object hierarchy, and then, in the drop-down box at the top select “MetaProperties”. Here are all the metaproperties currently in your gamesys (See “The Gamesys and You”).
Now browse through the archetypes until you find an archetype suitable to add your MetaProperty to! Now click on the archetype, and hit “Add”. Now type the name of your MetaProperty. Then press “Enter”. Now your new MetaProperty will appear. Click on it, and press “Edit”, to add the appropriate properties to your MetaProperties.
Remember, if you modify and/or create new MetaProperties, you must save your gamesys! See “The Gamesys and You”).
And here’s a list of useful MetaProperties:
M-AlertCapZero The AI isn’t alerted unless nearby AIs are alerted.
M-GoodGuy Makes the AI good.
M-BaseRamirez Makes the selected AI Ramirez.
M-ServantWithTray Makes a servant, into a servant with a tray.
M-PosedCorpse Make an AI dead.
M-ZombiePossum Makes a lying down Zombie that will activate when you walk over it.
M-CannonFodder One shot kills.
M-CuttyCritter Make an AI into cutty.
M-FrobInert Sets FrobInfo to: “[None],[None],[None]”.
M-FrontGateGuard The AI is non-hostile until alerted or threatened.
IsLoot See “Making Objects Loot”.
Tip: When making cities where the populace and guard’s shouldn’t be hostile unless attacked or alerted, or unless the player enters a door he shouldn’t, add the script “SecureDoor” on all restricted doors, then give all the AIs “M-FrontGateGuard”.
First, select the object you want to be loot, and add the MetaProperty “IsLoot”.
Now Add>Dark Gamesys>Loot, and fill in the appropriate values.
Okay, here we go, THE SINGLE MOST COMPLEX SUBJECT IN DROMED! Yikes, you might be saying, I’d better turn this off…but don’t, and don’t skip it either. Conversations can be used for more than talking, that’s what makes them so good! You can add/remove MetaProperties, add/remove links, FROB, play motions and sounds, make AI go-to and wait!
If you ever hope to do ANYTHING cool with DROMED, you’d better get to know conversations, intimately!
First, what is a conversation? A conversation is a marker (usually), with the script “TrapConverse”, it also has two other properties, but we’ll discuss those later!
You can have up to SIX actors in your conversation. Remember, EVERY CONVERSATION MUST HAVE AN ACTOR, even if it doesn’t really use that actor…and EVERY ACTION MUST HAVE AN ACTOR, even if that actor isn’t involved in the least! It’s another one of those crazy DROMED things.
So, make your marker, and add the script: “TrapConverse”.
Now link the marker to your actors:
Data: Actor# (CRUCIAL, must be defined)
There! But we’re not doing much yet! Firstly, the conversation doesn’t know what to do with itself, and it doesn’t know when to start! Wow, so much left to explain (and read).
Now, let’s add the necessary properties. First Add-AI-Conversations-SaveConversation.
Check the box and hit “OK”. Now Add-AI-Conversations-Converation.
A HUGE box will pop-up. Be sure your screen resolution is at least 1024x768 before attempting. Just dismiss all the boxes with “OK” in succession, don’t even worry about the contents!
Now, the conversation has the properties (even if the values of the main conversation haven’t been filled out). Now, we need to manipulate the actors. If this is going to be a “conversation” per say, you’ll need to assign the actors the correct voices.
Let’s make the conversation between two servants…here are the lines:
MaleServant: “Do you ever feel like there’s someone…watching you?”
FemaleServant: “The sir you mean?”
MaleServant: “No, I mean more like spirits…or someone hiding, watching you!”
FemaleServant: “I think it’s just the house, the shadows, they…get to you.”
That conversation is sv_c09, there are four lines, LineNo 1, LineNo2, LineNo3, and LineNo4.
Now, there’s something you must understand about conversations. Each conversation and/or sound in the game is specified by a set of data files called “Schemas”. They assign sounds to voices, and assign sound files to lines, and assign lines to sound files.
But, before you can edit the schemas to make your own conversations, you need the actual set of schema files! There are two, schemas.zip, and schemas_update.zip. Both are available HERE.
We’ll get into schema editing/creating later, for now, let’s worry about re-creating an existing conversation…here’s what you’ll need:
2 Markers outfitted to be conversations
So, you’ve created all these…what do you do? Well, for convenience’s sake, name one conversation “ServConv”, and the other “AbortServConv”.
Now, you remember those huge window that popped up when you went: Add-AI-Converstions-Conversation.
That was the conversation box! The first box was filled with options, as detailed below:
Let’s dissect this. You remember earlier, when we created an “Alert Response”. Well, alert responses operate on the same principle as conversations. Only a conversation is much, much bigger.
The numbers are each a “Step”. There are eleven steps. Each step has a certain number of actions…six or seven. So, what’s the difference between a “Step” and an “Action”.
Here’s the difference…all the actions within a step occur SIMULATANEOUSLY! So, if you want someone to talk, and make a motion at the same time, put both those in the same step. If you want someone to talk, then someone else to talk AFTER, put one line in one step, the second in the second.
Basically, the next step begins when all the actions in the previous step are COMPLETE. All the actions commence at the same time!
Okay, feel free to pull up “ServConv”, and “Edit” the conversation. Choose “00”, and hit okay. Remember that in DROMED, most lists start at zero, rather than one!
Now, the HUGE box pops-up. If you’re using 1024x768, the bottom and top of the box are barely visible! Now, you’ll notice that each “Action” is made up of an “Action”, a number, like “00”, three “Arg”s, and an actor. These “Arg”s are the arguments you give each “Action”, so it knows what each action is supposed to do. For example, click on the drop-down box next to “Action 00”, and note all the available actions. Most of those actions do NOTHING without arguments. For example, the “Goto Object” action needs an argument to tell it what object to go to. The “Add/Remove MetaProperty” action needs two or three arguments! The “Play Sound/Motion” action can have one, two, or three arguments. The useful actions are listed below:
Arg1: Add or Remove?
Arg2: MetaProperty name?
Arg3: Leave blank for self, otherwise, specify?
Arg1: What object?
Arg2: Blank for normal speed, for fast type “Very Fast”
Arg2: What object?
Arg1: Sound? Or Conversation? If any
Arg2: If conversation, what line?
Arg3: Motion? If any
Arg1: How long? In milliseconds (1000 equals one second)
There, now, to teach you all you need to know to get these arguments working. Here are some good tips:
Garrett isn’t an object. If you want an AI to face “Garrett”, type “Player” in the place of an object.
Remember that you can’t use object numbers in conversations, each object used must have a unique name!
And now, for the motions! Remember that the motion database for Thief has not been cracked! Therefore our choice of motions are limited to those used in conversations in the OMs (the missions that shipped with Thief)(don’t worry about the cryptic names):
Conversation 0, Quux 0 Cross arms behind back
Conversation 0, Baz 0 Jump and shake arms as if agitated
Conversation 0, Baz 0, Quux 0 Raise arms as if to say “I don’t know”
Conversation 0, Bar 0 Lean backwards as if surprised
Conversation 0, Bar 0, Quux 0 Cross arms in front
Conversation 0, Bar 0, Baz 0 Move arms as if conductor conducting music
Conversation 0, Foo 0 Raise left hand and nod as if in greeting
Conversation 0, Foo 0, Baz 0 Nod head as if in agreement
Conversation 0, Foo 0, Bar 0 Take a step forward with one foot, then back
Conversation 0, Foo 0, Bar 0, Baz 0 Look right
Conversation 0, Quux 0, Foo 0 Cross arms
Conversation 0, Quux 0, Bar 0 Keep arms crossed
WorldFrob 0, AtWaist 0, BellPull 0 The “Frob” action
WorldFrob 0, WithTray 0, AtWaist 0, BellPull 0 Servant with tray puts tray down
Now we’re REALLY going to set the conversation up, link from “ServConv” to each of your two servants with an “AIConversationActor” link, make sure the MaleServant is actor “1” and that the FemaleServant is actor “2”.
Next we need to worry about their voices, in order for this conversation to actually play, we need the MaleServant’s voice to be “normal1”, and the FemaleServants to be “normal2”, so, open their properties and Add-Speech-Voice, and set them to the appropriate values.
Last thing with the servants, make sure that they each have their own unique name!
Now we’re going to setup the conversations start. The button will start the conversation, but we don’t want the conversation repeating EVERY TIME you press the button, so, create the following links:
Dissecting time. What this does, is, when the button’s pressed, it sends a ControlDevice signal to the RelayTrap. The RelayTrap relays that signal to the conversation (which starts it), and to the DestroyTrap.
Remember what I said about the DestroyTrap fnord, when triggered, it destroys whatever it’s ControlDevice linked to, so when it receives the signal from the RelayTrap, it destroys the RelayTrap, making it impossible for the conversation to start over once it’s started once! This is the same system that was used in ASSASSINS! to make sure the alarm could only be triggered once. Only then, since there were so many buttons, they all would have been linked to a RequireAnyTrap, which would have been linked to the RelayTrap…same principle, though!
Now we have a conversation that has actors, and that knows when to start…but it has no actions! Eek! Let’s fix that!
Input the following variables into the steps and actions specified
Action 00: Play Sound/Motion
Arg2: LineNo 1
Action 01 Play Sound/Motion
Arg3: Choose one!
Action 00: Play Sound/Motion
Arg2: LineNo 2
Action 01: Play Sound/Motion
Arg3: Choose one!
Action 00: Play Sound/Motion
Arg2: LineNo 3
Action 01: Play Sound/Motion
Arg3: Choose one!
Action 00: Play Sound/Motion
Arg2: LineNo 4
Action 01: Play Sound/Motion
Arg3: Choose one!
Okay, go in-game and try it out. You’ll see that it works, but since the AI are aware, they run off to a flee point, but their lines still go on? That’s so cheesy! Let’s fix it!
Now, open up the conversation, and in the “Steps” dialog, choose “Abort Conditions”. Set the abort level to “3”, and the priority to “Absolute”.
This means that when either of the servants reaches alert level 3, he’ll abort the conversation without delay!
Okay, so, what if you use a gas arrow…they won’t be alerted if they don’t see you…oh no! They’re lying on the floor, still talking? That’s BAD!
Hence the “AbortServConv” conversation. We’re going to add some receptrons! For more info on both receptrons and their opposite, sources, see the section: “Sources and Receptrons”.
Before we do anything, create a button that the player can’t get to (blueroom) and link it to “AbortServConv”. Then do the AIConversationActor links. Now, slap a motion in there for both servants…don’t worry, if they’re knocked out, they won’t perform the motion! Now, make sure the button has a unique name…how about “ServAbortButton”.
Now, go into the first servant’s properties and Add-Act/React-Receptrons, a dialog that looks like a link box should come up. Hit “Add”.
This box is indeed VERY confusing. But don’t worry, I’ll walk you through what we must do!
First, set the stimulus to “KnockOut”. Then check the “No Max Intensity” box, and leave the “Min Intensity” at 0. Now, set the action to “Frob Object” (yes, AI can frob while their knocked out), and set the object to be frobbed to “ServAbortButton”. Now click okay, and dismiss both boxes. Don’t worry if the receptrons box pops back up, it’s a bug, just dismiss it again!
Do the same thing for the other servant.
The principle here is that when an AI is in the midst of a conversation, that conversation can be overridden by the AI being told to participate in ANOTHER conversation…meaning that we can terminate this conversation by starting ANOTHER conversation that does absolutely NOTHING!
And remember that conversations are good for more than just talking! And remember NOT TO HAVE ABORT CONDITIONS OR ABORTING IN ANY WAY on effect conversations…that is, one’s that DON’T make the AI talk. If these conversations abort halfway through, weird things could happen!
Ambient sound is exceptional! It adds depth!
To insert an ambient sound, create a marker, and Add-A-AmbientHacked.
The following options are in this dialog. Here’s what they do:
Radius The radius of the sound (feet).
Override Volume Volume, -1 is loudest, lower than that is softer.
Schema Name The name of the sound. See Sounds-Schemas in the obj hierarchy.
Aux Schemas 1 & 2 More schemas to play.
Flags, see below:
Environmental Sound Turns the sound into an environmental sound.
DestroyObj Destroys the object upon completion of the ambient sound.
RemoveProp Removes A-AmbientHacked at the completion of the ambient sound.
TurnedOff Mutes the sound
DoAutoOff Adds “TurnedOff” at the completion of the sound.
NoSharpCurve The sound fades gradually as you approach and walk away from it.
You can fiddle with sounds by opening their properties in Sounds-Schemas.
To see how you can create schemas of your own, see “Schemas”.
Okay, you want Garrett to talk. Now, Garrett can’t be an actor, per say, because he’s not really an object. Sure, you can have AIs face him (Face object “Player”), but he can’t be an actor! Or what happens if you just want him to say something cool, like…”Inside at last.”
Is that so much to ask?
No. I’ll explain.
First, create a VOTrap…anywhere. VOTraps aren’t like normal sounds. They don’t fade as you get farther away. They’re omnipresent, because their not really sounds…the AI can’t “hear” them, like they can hear your footsteps!
To learn more about creating custom comments, see “Schemas”.
Now. Since Garrett can’t actually speak in a conversation…what do we do? Well, you read “Schemas” and create the lines you want as if they’re comments! Now, in a blueroom create as many VOTraps as you’ll need (one for every line), a button for each, linked to them all, and an AI to talk to.
Now give the AI his lines, and have him frob a button when Garrett’s supposed to talk. Now, the problem is, that the AI won’t wait for Garrett to finish talking! So, you’ll have to listen to each of Garrett’s comments, and see how long they are, then, after the AI frobs the button, have him “Wait” for the correct amount of time before moving on.
Okay, so you’ve created this setup. But nothing happens, the AI talks, sure, but that’s old hat. We want GARRETT to talk.
So, we must find the name of the comment we want Garrett to say. Say, “garm1101”. That’s valid!
Now, in order to have a VOTrap play a sound, you must link a VOTrap to the object archetype of the sound. So, open up the VOTrap’s properties, and Add a “SoundDescription” link from it, to the archetype.
Now test it out! There, Garrett speaks!
It is recommended you read “Garrett’s Comments” before reading this.
So, you love VOTraps. But you don’t like the fact they only play once. Well, that’s the nature of VOs. Wouldn’t it be comical if Garrett said: “Inside at last!” every time you walked into the storage room at Baffords? But still, VOs have many different uses! Or perhaps Garrett SHOULD say the same comment over and over!
SoundTraps are your saviour! They work the same way as VOs, except they don’t delete themselves!
A response is an AI’s way of dealing with something they see. For example, if you want an AI to push a button when it becomes alert, you’d setup the Alert Response like a conversation telling the AI to push the button.
There are four different responses:
Alert Response What an AI does when the player alerts it.
Threat Response How the AI responds to a certain threat.
Body Response What the AI does when it sees a knockedout or dead AI.
Sense Combat Response What the AI does when it senses combat nearby.
AIWatchObj is one of the most useful links ever. It tells an AI to watch a radius and height around a certain something for a certain intrusion, self- or player-. The rest of it’s properties are pretty much self-explanatory, and it’s actions run much like a conversation’s!
So, you’re just clipping along through your FM. But, you’ve created an armory, and you want a few bows lying around along with your swords.
You’ve searched the obj hierarchy, but haven’t found one.
So, let’s create one!
Create a Physical>Debris>Rubble>broke_sword
Now, open up it’s properties, and Add>Shape>Model Name.
And you’re done!
So, you want a quiver?
Okay, let’s do that! Create Physical>Container>Footlocker.
Now open the footlocker’s properties and Add>Shape>Model Name, change it to: “quiver2”.
Now add a “Contains” link FROM the quiver TO some arrows!
Try using “CreatureAttachement” (See “Useful Links”) link to attack the new quiver to an archer’s back!
Stairs are a must have in Thief, but they’re exceptionally hard to make. You must turn the grid size down to at most 13, then make each individual stair from a solid brush.
That’s just for a square staircase! Circular staircases actually require some mathematical skill!
Don’t worry, I’ll show you the formulae:
The basic principles are:
A circle is 360 degress around
The stairs are 1 foot high and 1 foot deep (as big as they can go for AI)
The circumference of a circle is (Rx2)xpi
Okay, make your air brush that you want your stairs inside…then make a solid core (if you want, not mandatory).
Now, here’s the formulae:
SH = Stair Height
SD = Stair Depth
R = Radius
C = Circumference
SW = Stair Width
D = Diameter
P = Pi, or 3.14, which is the ratio of a circle’s diameter to its circumference
SC = Numbers of stairs in a circle (unknown at first)
SA = Degrees each stair should be rotated from the last (unknown at first)
IC = Stairs in circle
RH = Height of one full rotation of stairs
D/2 = R
(R*2)*P = C
360/C = SA
360/SA = IC
IC = RH
So, what do we do with all this? First, we create a block of solid who’s width is equal to the circle’s radius, or diameter divided by two. Then we rotate it the number of degrees specified by SA, then we line it up with the center, and rotate it another SA degrees, and so one until we reach the desired height. The number of feet the stairs will rise in one full rotation is equal to RH. Here’s the formula if you’re stairs AREN’T 1 foot high and 1 foot deep:
D/2 = R
(R*2)*P = C
C*SD = X
360/X = SA
360*SA = IC
IC*SH = RH
Same instructions as above.
Okay, before you read this section, please read “Conversations” and “The Infamous AIWatchObj Link”.
First, create an elevator-type setting.
Now, create a “TerrPt” at the EXACT location you want your elevator to start out. And one and the EXACT location you want it to end up at.
Now link the two “TerrPt”s back and forth with “TerrPath” links.
Now create two buttons at the bottom, two at the top. One we’ll call the elevator, the other will send it to the other floor.
Link them with ControlDevices to the appropriate TerrPts (the ones you want the elevator to end up at when the button is frobbed.
Now create the elevator, and link it to the TerrPt you want it to start out at with a “TerrPathInit” link.
There! You’re done!
Like frobbing, teleporting is an art. Use TeleportTraps if you want your level to be dynamic, rather than static.
Let’s say you want a mission where you have to kill someone, and get out. So, create a room with the special somebody, connected to the starting room via a hall. Now, we’re not going to have real objectives…we’ll just pretend!
Now, create a blueroom…that’s a room off in space with no lightsources where the player could never go. It’s for storing things used behind the scenes, like plaques or buttons used exclusively by the AI. Or, we can hide our teleporting AIs there! Let’s do that! Make two RamirezGuards, and put them in the blueroom.
Now, create Ramirez. How? First create a merchant, then Add-MetaProperty, and add the MetaProperty “BaseRamirez”. There. Good!
Next we add a script to Ramirez: “TrigSlain”.
Now, add two TeleportTraps, one where you want each guard to be. Create the following links:
There, now set up your StartingPoint and give yourself a sword…now go in-game, and go slaughter Ramirez in a duel! Mace against sword! Of course, you, being the super-Thief you are, did kill Ramirez…without loosing a health point.
Now go back to the room you started off in…surprise surprise! There’s two RamGuards waiting for you!
To see bluerooms and TeleportTraps in real-life action, check out ASSASSINS! Make sure you get the unstripped version from www.thief-thecircle.com/teg-old/tools though.
Emit Traps are ultra-cool. They make the player think in an all-new Thiefy way!
You can set up emit traps to shoot the following (these are the names of the objects in the emit trap dialog as well):
Keep in mind that an emit trap is invisible, but it’s always good to put it in a hole in the wall!
Okay, now, create an emittrap (if you want your emit trap to fire only once), or emitstreamtrap (if you want your emit trap to shoot multiple times), and place it in the world.
Now open it’s properties, and edit “Tweq-Emit”.
There are a few options in here:
AnimC Sim for emittrap, Sim,NoLimit for emitstreamtrap
Rate 1 for emittrap, 1000 for emitstreamtrap
Max Frames 1 for emittrap, 0 for emitstreamtrap
Emit What What is going to be emitted.
Velocity X How fast the projectile moves along the X axis, see below
Velocity Y How fast the projectile moves along the Y axis, see below
Velocity Z How fast the projectile moves along the Z axis, see below
Okay, now to explain the “Velocities”.
X North and South. Negative is north (south is “down”)
Y East and West. Negative is west
Z Up and Down. Negative is down
Now all we need to do is link something to the emit trap via ControlDevice. Make it anything, a pressure plate, a concrete room (See “Roombrushes”) with “TrigRoomPlayer”, a BoundsTrigger…anything!
Have you ever wondered how a zombie knows to die when it gets hit with a holy water arrow?
Have you ever wondered how a BaffGuard knows how much damage to take when you deliver a blow with an overhead swing?
Ever wondered how AIs, and you, can react differently to different damage?
Ever wondered how healing potions heal Garrett?
Then wonder no longer, because in each of these examples, there’s source…say, the sword in example 2, and a receptron, the guard.
Now, there are myriad stims (stimuli, or things which provoke receptrons), and here they are (yes, another list):
weapon has this
Pokestim Broadhead Arrows have this
BugPoke Insects have this
Slashstim Specific to a sword
Bashstim Blunt weapons such as a blackjack
Water Water arrows have these, as does any “water” in Thief
Fire Fires, and fire arrows
Touch I believe this has to do with contact with terrain brushes
Holy Holy Water Arrows have this
Knockout A blackjack has this
Restore Healing potions have this, as does healing fruit
KOGas Gas arrows
MagicZapStim Wizard and trap zaps
Toxic Poisonous gas
Stench From a burrick's maw
Earthstim Moss arrow
So, how do we make things give these off/react to them? Well, we already saw an example in the “Conversations” section, when we made a servant frob a button after receiving a “KnockOut” stim.
If you though receptrons were cool, wait until you hear about sources!
Although sources and receptrons are pretty complicated, you can figure most of them out for yourself. All we have to do is explain the basics!
First, receptrons. When you try and add a receptron, it asks what to do. You can do many different things. These are all self-explanatory. And most of them you learned about in conversations. So you’re fine!
Now, there’s this “Min-“ and “Max Intensity”.
So, let’s say your creating a stim for swords. SlashStim. But you want this guard to be armoured, so he ONLY responds to heavy swings, which have an intensity of “6”. So, set the “Min Intensity” to “6” and the check the “No Max Intensity” box. Then change the action to “Damage Object” target object “Me”.
Receptrons are extremely simple! But sources are a different matter! Sources are how receptrons are activated. The sword has three different sources. One for the normal swing, one for the medium swing, and one for the heavy swing. The intensities of these sources are 2, 4, and 6 respectively.
You already know about stims, so I won’t explain those.
Now, when you try and create a new source, you’ll be asked for the object number. This is obviously the object you’re working with. If you’re creating a new archetype, type the negative value of that archetype.
There are four kinds of propagators. Contact, script, flow, and radius.
Radius means the stim is omnipresent within a certain radius of the target object. Script means the stim is triggered by a script, like the “Restore” stim of the healing potion, or healing fruit. Flow means a flow brush, and contact means when two objects touch, whether by a weapon, or by frobbing, or by just touching!
Editing shape edit’s the stim’s propagator. For contact, for example, you can alter the velocity coeffecient (the veloticy required for this stim to take place) or the type of contact. Contact is just that, normal contact, whilst frob in world means when you frob in world, frob in inv means when your frob in the inventory, and the others are when the object in question transitions between world and inv, like when you pick something up. Or drop it.
Now, for radius, you have two options, edit life cycle and edit shape. Editing the life cycle controls the number of max firings, and whether or not the intensity multiplies as the firings go on.
In this box you also have flags. “No Max Firings” and “Destroy Object on Completion” are the options.
Number of max firings is how many firings are maximum. Interval controls how often the stim firings, and intensity slope is how much the stim’s intensity multiplies by as it goes on.
Destroy Object on Completion does just that, when the object reaches it’s max firings, it is destroyed.
You can edit the shape. In editing shape you have the option of specifying a radius, adding flags, or specifying a dispersion.
Under flags, only “Line of sight (raycast)” is available. This means that the stim’s radius is blocked by anything that can’t be seen through.
Under dispersion there are two options: “Linear Dispersion” and “Inverse Quadratic”. Linear dispersion means the stim is strongest at the center, and gets weaker out towards the edge, and inverse Quadratic means the same thing, the stim is strongest at the outside, weaker at the center.
“Script” and “Flow” are the same as “Radius”, except they lack an “Edit Shape” option, because of their nature!
Okay, you’ve tried fiddling with the script “Extinguishable”, haven’t you?
Well, Extinguishable is activated by S&R, sorry to say!
So, let’s make a really cheesy extinguishable electric light…hmm?
Create an electric light, and remove the “Light” property and add the “AnimLight” property. Fill everything in appropriately, but don’t add the “AnimLight” script, instead, add the “Extinguishable” script.
Okay, now Add>Act/React>Receptrons.
Add a WaterStim receptron. Make it’s minimum “0” and set it’s maximum to “No Max”.
Now, set the action to “Send to Scripts”.
Now, create a second receptron. This time FireStim. Make it the same.
Now dismiss all the boxes, and recalculate lighting. Tools>Light.
Give yourself a few fire arrows (the ones under the projectile archetype, don’t forget!) and water arrows (still projectile). Now, go in-game and have fun extinguishing electric light with water arrows, and re-lighting the electric light with fire arrows!
He-he. Let’s have some undead fun, eh?
Okay, create ten or twenty zombies in a huge room.
Don’t panic, you’re about to transform yourself into an ultra-holy warrior!
Create a sword, and give it to yourself with the “Contains” link. If you’ve already given yourself a sword, don’t worry about it.
Now, as you know, zombies, by nature, are unaffected by ANYTHING except FireStims and HolyStims. They can also drown. But that doesn’t involve S&R!
So, let’s play upon the zombies’ weakness for Holyness!
So, let’s give you a holy sword!
Just for fun, open up the sword’s properties, and Add>Inventory>Object Name. Type in: Name:“Blessed Sword of the Hammerites”
Now that we’ve had our fun, let’s set up some sources so we can have even MORE fun!
Set up a HolyStim, intensity 2, propagator Contact, under Edit Shape, set to: “Weapon Low”.
Next, a HolyStim of 4, same thing only “Weapon Med”.
Next, 6, “Weapon High”.
And last, 0.5, “Weapon Block”.
Go in-game, and carve up some zombies!
LockBoxes, in my books, are the greatest! They don’t look cheesy, and you can create completely awesome effects! There’s one thing they’re missing though (and you might want to change this in the hierarchy, then save your gamesys), and that’s the “LockSounds” script. When you frob them without a key, they’re completely silent!
Anyway, there are two things you must understand about LockBoxes. Firstly, they lock/unlock JUST like a door, secondly, there are two different ways of implementing a LockBox.
The most loved way is to add “TrigUnlock” to the LockBox, and then ControlDevice it to whatever you want opened. That way, when the lockbox is unlocked, the door is open, and vice versa!
Secondly, you can lock things with the “Lock” link, link a door or switch, or just about anything frobbable FROM itself TO the lockbox. The flavour, naturally, is “Lock”.
Now, I know I’ve dealt with this before, but if you have a door that’s opened with a lockbox (not locked with, opened with), or opened with a switch, please make the item unfrobbable.
Now, if you were to make all the FrobInfo “[None]” that would do you absolutely no good, because, upon receiving a ControlDevice signal, the door wouldn’t know what to do with itself…so, set the world action to:
Do this by clicking on both “Script” and “Ignore” in the WorldAction drop-down menu.
Now that that’s done, why don’t we deal with AI? Hmm?
Now, if you’ve read the AIWatchObj link section, you should know how to do this, so, if you haven’t read it, read it now…oh, no, don’t worry, I can wait!
Back? Good. Now, implement the same system as used, with the markers and links, only this time we have one of two options. Option 1 if you used “TrigUnlock” to open the door, Option 2 if you used Switch locked via LockBox to open the door.
This gets a bit tricky.
Create a lockbox (with “TrigUnlock” and a ControlDevice to the door), and a door. Make the door’s FrobInfo WorldAction: Script,Ignore. Now create a servant in a blueroom, make sure he has the key to the lockbox. Put a conversation there also (if you already haven’t, read the section on conversations), and make the servant the only actor.
Now link the lockbox to the conversation.
Now make the conversation’s actions as follows:
Action 00: Wait
Action 00: Frob Object
Arg1: (The lockbox’s unique name)
Since the servant is in a blueroom, and since this is an effect conversation, we don’t need abort conditions!
Now create concrete roombrush (See section “RoomBrushes”) extending outwards about 4 feet from the door on both sides. Add the script: “TrigRoomCreature” to the roombrush.
Now create a RequireAllTrap and an Inverter.
Link the lockbox to the Inverter (ControlDevice), and the Inverter to the RequireAllTrap (ControlDevice), and link the RequireAllTrap back to the lockbox.
There, you’re done!
That wasn’t QUITE so tricky…hmm?
Go in-game, and admire your handy-work!
Want to know what happens?
Okay, if the player opens the door, the servant closes it five seconds later. If a guard comes along, the lockbox isn’t frobbed unless the door’s closed. In which case it opens, and he has five seconds to pass through!
This is the same as Option 1, except!
The RequireAllTrap is linked to the switch, rather than the lockbox.
The servants Step 01 goes as follows:
Action 00: Frob Object
Action 01: Frob Object
Action 02: Frob Object
There, lockboxes are COVERED!
Keys are pretty straightforward. To make any object into a key, you need three things:
You already know how to set KeySrc up, to that’s fine. Now we need to add the script. It’s “StdKey”. That simple. Now, the FrobInfo…here’s how you should set it up:
There, now when you frob the key in the world, it moves to your inventory. When you use it in your inventory, it does nothing, unless your going to use it as a tool, then it executes a script, and deselects itself.
One of the greatest thieving tools ever are the lockpicks. They make you a nearly unstoppable force, unlocking the locked, and taking the secured!
Unless, you don’t know how to set them up!
First, we’re going to tell you how to make something into a lockpick, then we’ll tell you how to make a lock pickable. So, in order to make something into a lockpick, here’s what you need:
Okay, the PickSrc is the PickBits of the lockpick…confused? Well, PickBits is how Thief tells one lockpick from another, and is how you assign a lock to a lockpick. Here’s how pickbits work:
1 Square Lock Pick
10 Triangle Lock Pick
11 Both Picks
Now, that’s fine and dandy, but say you make a NEW lockpick…say a hook-toothed LockPick. And you want it’s pickbits to be different from Triangle and Square.
The problem with pickbits is that they are BITS.
Here’s an example:
1 – A match!
Pick 01 – A match!
So, add your new pick, and make its pickbits 100.
Pick 100 – A match!
Pick 100 – No match!
See, the ones have to line up! So, now we have these three picks:
11 Square and Triangle
110 Triangle and hooked
101 Square and hooked
Get the hang of it? Good!
Now, create a door, and lock it. Add-Engine Features-Locked.
In order to make the door pickable, we must add PickCfg, and fill it out properly! So, Add-Dark gamesys-PickCfg.
Don’t let this window confused you! You’ll see that there are three sets of identical fields. Each set represents a stage. Each stage can be set up differently. Now, let’s take the first one for example. The top box is “PickBits”. We already know about those! Fill in “10”, for the triangle lockpick.
Now, look down to “Pins”. This is the number of pins in each stage. For each pin within a stage, you’ll hear a click. Set this to “5”. Now, TimePct. This is the time it takes to pick each pin. Set this to “1”.
Keep in mind that if you leave everything blank, the game will ignore that stage! So, right now, if you were to give Garrett the lockpicks and go in-game (don’t), you’d be able to pick this in a couple seconds with the triangle lockpick.
Now, you’ll see that there is a “Flags” box. There are two options:
Reset on fail Doesn’t seem to work…maybe it’s a bug?
Randomize time Randomizes the time it takes to pick each pin
Add the flags you want, then hit “OK”. Now, to give Garrett the lockpicks.
Lockpicks are found under Physical-Tulz-LockPicks. But there are THREE options…LockPickSG (Square) LockPickLG (Triangle), and LockPickBoth. Only use LockPickBoth if you’re building a store…which we’re not, so give Garrett LockPickLG and LockPickSG.
NOW go in-game, and enjoy!
In order to make an object only appear at a certain difficulty level, you must Add-Difficulty-Destroy, and type in the difficulty levels you want it to be destroyed on. 0 is normal, 1 is hard, and 2 is expert.
Here’s the syntax:
If you want an objective to disappear at normal, but appear at all others:
If you want the object to disappear at hard and expert:
If you want the object to disappear at normal and expert:
When you portalized, brushes are processed sequentially, in the order specified by the number in the lower right-hand corner. For example, if a solid brush is encased by an air brush, and the air brush’s timing is later, or higher, the solid brush will be air. If the solid brush is later, and solid will be solid!
You can change the timing by typing and pressing ENTER, or by using the left and right buttons!
Before reading this tutorial, please read “Brush Timing”.
You’ve created a nice manor, or cave network…or, anything indoors, and you want to create an outdoors area. Okay. Now, find the first brush you created, change it’s brush timing to “3”, and change the timing of the second brush to “4”.
Now create a solid brush around the part your indoors that will be visible outside. Make sure you account for walls.
Before you portalize to check out this magnificent thing, set it’s timing to “2”.
Now create an airbrush encompassing this solid brush, let it’s timing be “1”.
Now, since the exterior of your building/structure/formation won’t be lit, activate light_bright, and then go have a look!
Remember not to be afraid of decahedrons; they’re most useful for forming odd-shaped things, like caves, mountains, hills. And if two of them intersect…that’s where it gets REALLY interesting! If you’ve ever looked at the caves in the OMs, and wondered how they were done, decahedrons are the answer!
Okay, that looks good! Now, how to roombrush!
You’re going to have to use multiple roombrushes for this. If your structure is square, it’s easy. If it’s ten-sided cylindrical, it’s hard. If it’s a mountain…talk about hard.
You can’t allow this roombrush to intersect/encompass the interior roombrushes, otherwise sound will propagate between them…so, if you have an exterior doorway, make SURE they intersect/touch. Otherwise that’s a no-no!
But also, don’t allow these roombrushes NOT to touch/go into the walls, otherwise, if the player’s sneaking along the exterior wall, his sound will drop out, and he’ll get angry, and send you hate mail!
Now, set all these roombrushes to “Large Live” EAX. (If you’re doing EAX). Why? Because echoing exteriors sound fake, unless it’s a canyon or something that WOULD echo.
Create a cityscape the same way. If you want sloped streets, you can do it one of two ways: 1. Slope the brush, 2. Add wedges to the floor to slope it. The first way is preferable, because you don’t have to include extra brushes.
Remember that cities take a long time because of the variety and painstaking detail required.
If you want a good, believable cityscape, you could always download the unstripped version of ASSASSINS! (Grab that here: http://www.thief-thecircle.com/teg-old/tools) and base it on that.
If you have problems, see the “Troubleshooting” section.
In order to create some effects, you must create a “Concrete Roombrush”. These include “TrigRoomPlayer” and “WelcomeRoom”, as well a “TrigRoomCreature”.
It is imperative that you understand that each room archetype acts as one object. This can be used to your advantage. Say you want to use a roombrush as an objective (See “Roombrushes as Objectives”), you must create a concrete roombrush type and add the script: “WelcomeRoom”. Now say the area you want the player to get to has multiple entrances, and in turn multiple roombrushes. Then, instead of complicating things by using QVars (See “Objectives: QVars”), you could use the same archetype!
Please note that using concrete roombrushes does NOT require you to re-save the gamesys.
To create a concrete roombrush, click the roombrush you want to make concrete, and hit “Create”, in this pop-up click “Add” and type the name of your room…make it descriptive! Now hit ENTER. You’ll be asked if you want a concrete brush, say yes, then select your new roombrush, and click “Create”. This will make your “Default Room” your new concrete brush!
Now, press “Edit” to add scripts, or “Links” to add links!
If you’ve ever poked around in your “Thief” directory, you’ll notice that there’s a file called “dark.gam”. This is the single most important file in the entire game. It specifies all objects, metaproperties, stims, sounds, and textures.
So, at some point, if you want to alter these things, you’ll have to tamper with the gamesys.
DROMED and dark.gam operate as one unit. Therefore, you can edit the gamesys without knowing it! Say you edit the “Sword” archetype. You’ve just modified the gamesys, and unless you File-Save GameSys, and save over dark.gam, you’re changes will disappear once you restart DROMED.
Now, let’s say you’re paranoid, or are creating multiple gamesyses. You can maintain several gamesyses, but it get’s confusing. What I do is constantly tinker with dark.gam until it’s PERFECT! But, if you want gamesyses altered for each mission, go ahead!
Let’s say you are creating a mission called “BaffTaff”. And you save your gamesys as “BaffTaff.gam”. The next time you start up DROMED you are startled to find all your gamesys changes GONE! Don’t fret! Type the following in the command line:
Hit ENTER, then restart DROMED. BOOM! All’s fixed!
Remember than when setting a gamesys, the gamesys MUST be in the main Thief directory, otherwise you’ll have to type the whole path, like this:
set_gamesys C:\My Documents\My Thief Folder\BaffTaff.gam
And that’s plain boring…PLUS, if you do this, things will get complicated once you try to make your level DarkLoader-compatible!
Before we begin editing/making our own schemas. Let’s download the schema files for TDP/TG.
Once you’re done, extract those files to “Thief\schema\”
The only files which worry us are the *.sch files. Those are the schema files.
Before we begin fooling around with the schema files, you must understand exactly what a schema file is. It’s not a sound file, it is a file that contains all the data Thief needs to find your files, and understand what to do with them.
First we’ll deal with ambient sounds. Open up “Ambient_m01.sch”. Take a look around. You should understand what everything means, take the first entry for example:
Okay, let’s break this down. Below is a list of what everything there means:
//Start Mission A comment. Anything preceeded by “//” is a comment.
schema m01start The name of the schema: m01start
archetype AMB_M01 The archetype. Make sure the archetype is previously created.
volume –500 Volume. –1 is loudest, below that is softer.
keehit_s Name of file in snd.crf, without extension.
Note, for convenience, you can decompress snd.srf into a “Thief\snd\” folder. Keep in mind that you must place all your schemas under the proper voice and language. Example: “Garrett\English\”.
Note you may also insert the following flags after the archetype statement:
mono_loop X Y The sounds will loop, separated by a break between X and Y.
poly_loop 2 X Y Multiple sounds will be played at once, looping with a break between X and Y.
no_repeat Means no two identical sounds will play twice in a row.
For poly_loop, the “2” must always be present, and multiple sounds should be specified in the file names area. Example, you have BaffWind1, BaffWind2, and BaffWind3, and you want them all to play at the same time!
poly_loop 2 2000 3000
BaffWind1 BaffWind2 BaffWind3
Let’s say we want these BaffWind sounds to loop infinitely, playing separately, and no two identical ones ever playing in a row:
mono_loop 0 0
BaffWind1 BaffWind2 BaffWind3
Okay. Now that we’ve tired of creating ambient sounds, let’s create AI sounds!
Here’s an example AI sound entry:
//Unaware (Alert Level 0)
mono_loop 3000 15000
sv1a0hu1 sv1a0hu2 sv1a0hu3
schema_voice normal1 2 atlevelzero
The only thing different about this schema is the last line:
schema_voice normal1 2 atlevelzero
This line means that this is the voice “normal1”’s comments “atlevelzero”, which means he’s totally unalerted. The number “2” is a priority, 1 being absolute, and numbers greater being less likely.
Now, let’s look at the way the files are named. If this file naming system was good enough for LGS, it’s good enough for us FM makers:
Means: SerVant #1 at Alert 0 HUm #1
Just a quick note, sv1 is a male voice, sv2 is a female voice.
In DROMED these are: “normal1” and “normal2”, respectively.
Keep in mind, if you create a new AI voice, you must enter the following line in “Speech.spc”:
Where “x” is the name of your new voice.
Now, last but certainly not least, custom conversations:
//CONV 1 "Peaceful, i'nt it?"
schema_voice normal1 1 sv_c01 (LineNo 1 1)
schema_voice normal2 1 sv_c01 (LineNo 2 2)
schema_voice normal1 1 sv_c01 (LineNo 3 3)
schema_voice normal2 2 sv_c01 (LineNo 4 4)
Okay, let’s break this down:
schema sv1c0101 Name of schema.
archetype SV_CONV Archetype…make sure this is created before processing!
sv1c0101 Name of *.wav, minus extension.
schema_voice normal1 Voice required to play.
sv_c01 Conversation concept name.
(LineNo 1 1) Line number.
Remember that each time you change the schemas you must reprocess the schemas, with the following command in DROMED:
Once you’ve done this, resave your gamesys (See “The Gamesys and You”).
If you’re creating a new conversation concept, example of a built-in concept is: sv_c09, the lines of which are stated in the “Conversations” section of this tutorial, you must define the concept for DROMED. Open up “speech.spc” and add the following below the rest of the concept definitions:
where “XXX” is your custom concept.
Remember to reload schemas and save your gamesys after this change.
Also keep in mind that DROMED doesn’t need your custom schemas after it’s loaded them, and saved them in the gamesys. Therefore, just include your custom gamesys in your DarkLoader (See “DarkLoader”) archive, not the custom schema files!
Another note. You don’t have to compress your custom sounds into snd.crf, you can just place them in a “snd” directory in your “Thief” directory. Keep in mind that custom sounds should be placed in an “English” folder, and try not to create any subfolders aside from “English”, as otherwise it can get confusing. But if you are creating lots of sounds (like whole new voices) sort by voice, then by language. Example, you’re creating a new voice: “Farkus”:
snd/Farkus/English/fa0mu1.wav Farkus at alert level 0, mutter number 1
One last all important word. Save your Thief sound files as “IMA ADPMC” format audio, at a quality of: “8.000kHz, 4 bit, Mono”.
Remember that “format” and “extension” are different. The extension should still be *.wav, but the format should be the aforementioned.
If you’re using Windows Sound Recorder, you can alter the quality from the save dialog, by pressing “Change” beside “Format”. Note that when using Windows Sound Recorder, you will be unable to apply any effects to the sound, after saving them in this format and quality.
Remember that you will probably have to increase the volume of your sound in Sound Recorder by 100%, otherwise it will be inaudible, to do this hit Effects>Increase Volume (25%) four times!
Before we go on, I’d like to congratulate you on making it this far. Very few DROMEDers ever grasp what comes before this! Okay. Now we’ll learn about objectives!
First, I’ll tell you that doing objectives directly through DROMED is an ABSOLUTE CHORE! So don’t do it…it’s boring, not to mention a waste of time, considering there’s Thief Objective Wizard!
Okay, so, if you haven’t already downloaded it, zoom over to http://www.thief-thecircle.com/dromed/ and find and download Thief Objective Wizard (or TOW). Install it as per the readme, then run it.
Okay. This program pretty much explains itself. If you’ve decided on objectives, just enter in the first objective’s data, hit “Add” then enter the next objective’s data. A few things to point out.
Objective numbering starts at zero
If you want to use objective type: “Goto a location, see “Roombrushes As Objectives””.
Ignore the “Special Flags” under loot goals
Ignore everything marked “T2 Only”, you don’t use DROMED 2 or DedX…I said this at the beginning!
Okay, and here’s the explanation of the TOW functions:
Reverse This reverses the sense of a goal. Turns don’t kill into kill.
Final This goal is the last one…don’t use this on more than one goal.
Irreversible This goal can’t be reversed.
Invisible/Visible Goal’s visibility. See “Objectives: Invisible/Visible”.
Difficulty Levels Check the difficulty levels you want this goal to appear on.
Incomplete Goal requirements have not yet been met (Nothing).
Complete Goal requirements have been met (Green check).
Inactive Goal is no longer applicable (circle with a slash).
Failed The goal is failed. If one objective is failed, you fail the mission (X).
Steal an object Input object number to be stolen.
Kill a creature Self-explanatory, input creatures’ object number.
Get a certain amount of loot Get a certain amount of loot, either gold, gems, goods, or total.
Goal Number Goal number, from 0-30
No Type Goal has no type. See “Objectives: QVars”
Add Adds the goal
Reset Resets all goals
Raw Objective List These are the raw commands
Once you’ve finished inputting all your goals, hit File-Save, and save it as XXX.cmd.
Now go back into DROMED, and type the following: run XXX (XXX is path of *.cmd file).
Now, the ConVict (Conditions for Victory) script is quite limited, really. It doesn’t actually support the switching of objectives from visible to invisible.
But, there is a workaround! The Fnord QVarTrap! A QVrTrap, upon receiving a ControlDevice, can change a goal state!
Say you want an objective:
Kill joe, bob, and billy
Now, with ConVict’s basic objectives, here’s what you’d HAVE TO HAVE:
That’s really quite stupid! So, create a QVar, add “TrigSlain” to Joe, Bob, and Billy, then link them to an appropriately setup QVar, in the meantime, set the TOW objective type to “No Type”.
First, let’s show you the QVar commands:
goal_visible_X Changes goal visibility, 0 is invisible, 1 is visible.
goal_state_X Changes goal state, 0 is incomplete, 1 is complete, 2 is inactive, 3 is failed.
goal_final_X Makes a goal final/not final, 0 is not final, 1 is final.
goal_reverse_X Sets a goal’s “Reverse” property, 0 is normal, 1 is reversed.
goal_mindiff_X Sets a goal’s minimum difficulty, 0 is normal, 1 is hard, 2 is expert.
goal_maxdiff_X Sets a goal’s maximum difficutlty, 0 is normal, 1 is hard, 2 is expert.
goal_irreversible_X Makes a goal irreversible, 0 is reversible, 1 is irreversible.
goal_type_X 0 is steal object, 1 is kill creature, 2 is loot, 3 is goto room.
goal_target_X See below.
goal_loot_X Total loot.
goal_gems_X Total gems.
goal_gold_X Total gold.
goal_goods_X Total goods.
Okay. First I’ll explain the property you must add to make a QVar run properly, then I’ll show you the syntax, THEN I’ll give you the info for all the commands marked “See below”.
A QVar needs a property: Add-Trap-QVar. That wasn’t so hard, no you’re faced with a pop-up. Syntax time!
Now, first things first. The “X” in the commands above is the goal’s number. The value you want to set whatever you specified to goes BEFORE. Take a look:
Now, let’s say you wanted to make goal #15 visible.
So, what you want to change the variable to goes before the colon. And after the colon you input the variable, and the goal number. Don’t get confused or do it backwards or weird errors to occur! And be sure to include the “=” it’s crucial!
The goal_target_X variable is very tricky. This variable applies to three of the five types of goals. Get to a certain room, kill a creature, and steal an object. Remember the reverse variable, though. For example, the servant archetype number is “-52” (all archetype numbers are negative. Just like “Garrett” is “-2099”). So, if you set: goal_type_X,1, goal_target_X,-52. That would be “Kill a servant”. If you set the following:
This would be a: “Don’t kill any servants” objective.
Remember, you can use archetypes no matter how broad! If you want to have a “Don’t kill anything” objective, here’s what you’d set:
That would work, because “-8” is the number of the “Creature” archetype…and all AI are contained within this archetype!
If you look at the hierarchy, it’s set up VERY well for these kinds of goals. Say you want a “Don’t steal anything” goal. Why you’d want one is beyond me…but anyway.
Normal objectives are great, but certainly you could create a better storyline with invisible objectives!
So, how can you make the flip? Use QVars!
What’s a good way to trigger this? How about a roombrush with “TrigRoomPlayer”? A scroll/book with StdButton? A guard with “TrigSlain”, or with a “Frob Object” receptron? I conversation that has an actor frob a button linked to a QVar?
Creating objectives is all fine and dandy. But all you have are these blank boxes…what’s the scoop?
You need a goals.str file. You can create this file with notepad, so, open it up.
There are two different things that must be inputted for each goal, fiction text, and text. Fiction text is displayed at the initial load-out, and text is displayed on the in-game screen. So, say we have these two goals:
Steal the scepter
Don’t kill any servants.
Now, here’s the fiction text:
You’re short on cash, and stealing the scepter should be a good way to make a quick buck.
Servants are harmless…don’t harm them!
So, here’s what we type in our text file:
fiction_0:”You’re short on cash, and stealing the scepter should be a good way to make a quick buck.”
text_0:”Steal the scepter.”
fiction_1:”Servants are harmless…don’t harm them!”
text_1:”Don’t kill any servants.”
X is the goal number, and Y is the fiction text.
X is the goal number, and Z is the text!
So, you’ve saved this file as “goals.str”. Now, what do we do with it?
Make sure the following directory structure is in place in your Thief directory:
X is the number of your mission…make sure that this number is greater than fourteen! Twenty is good.
We’ll use all these directories LATER when we make the mission DarkLoader-compatible, but for now, move “goals.str” into “Thief\intrface\English”.
Remember that all your books go into “Thief\Books\English”.
Now, restart DROMED, then play your mission, hit “O” to access the objectives screen, and there are your objectives!
Before reading this, please ensure that you’ve read the “Roombrushes” section.
In order to use a roombrush in the “Goto” objective, you must create a new concrete roombrush, and add the script: “WelcomeRoom” on it. Then type it’s number into the “Goto Location” field in Thief Objective Wizard.
You’ve created your mission. It has extra-cool effects, it has extra-comlicated objectives, it has conversations, MetaProperties, doors, lockboxes, complicated scripts, act/react! But it’s missing a store!
Fret no longer!
It is recommended that before you read on, you read the section “Inventory”.
Okay, first make sure that everything you’re trying to sell has a long description, an object name, and a purchase price.
Now, create two markers near your StartingPoint. Name them “Store” and “LoadoutCache”.
Open the properties of “Store”. Add-Inventory-Store, check!
Now open “LoadoutCache”’s properties, and Add-S-Scripts: “LoadoutCache”.
Now, link everything that’s “Starting Gear” to the StartingPoint (Contains flavour). Link everything that’s up for sale to “Store” (Contains), and link things that you want to be inserted AFTER the store (Compass, maybe sword) to the LoadoutCache (Contains).
If this is the first mission in a series, you might want to link some loot to the StartingPoint so that the player can spend it!
Make sure that you remove the following flag for your mission from “missflag.str”: “no_loadout”.
There, a store!
Note: The store will NOT appear when you play from DROMED. Note that loot left over after purchasing will be deleted automatically. If you have multiple missions in a series, note that loot will be carried over automatically from one mission to the other.
There are several things that DarkLoader needs to run your mission:
Let’s explain each of these:
missflag.str Let’s DROMED know to skip the OMs
titles.str Specifies a title for your mission
goals.str Specifies objectives text for your mission
page001.pcx Page one of the map, you can have multiple pages.
readme.txt Your readme
missX.mis The mission file
newgame.str Specifies the names of the buttons at the “New Game” menu
objnames.str Specifies object names (See “Inventory”)
objdescs.str Specifies object descriptions (See “Inventory”)
And let you know where they go:
Custom Schemas schemas\VOICE\English
Custom Sounds snd\VOICE\English
Now, rather than create all those *.strs by HAND, why don’t you just up and download the Thief Book Wizard (TBW) and Thief Text File Wizard (TFW or TTFW). And use THEM to create these files! They work MUCH better.
As for the map, I can’t help you with that. It’s up to YOU how much (or how little) detail to include.
Now, for multi-mission archives!
These are quite daunting. Inside “intrface\” create a missX for each mission (20, 21, 22), now alter your original missflag.str so that it does NOT include “end” for your original mission, and so that you add lines for your other missions:
Things to know about missflag. If you want missions NOT to play, add the following line:
If you want a mission to play with a briefing, with a loadout, and not being the end of the campaign, write this:
This is an example for a three-mission archive.
Remember that if you don’t include the “no_briefing” line, you must make a movie briefing for your mission, these should be stored in “movies\English\”.
Also note that they must be named: “BX.avi”. X is the number of your mission. If you want an end-of-game cutscene to play after your last mission, make the missflag like this:
Cutscenes must be named: “CX.avi”. Where X is the mission they come after.
If you’re still confused, take a look at the Thief missflag, found in ”strings.crf”.
Remember to compress your missions at “Normal” compression setting in winzip, and to include a “readme.txt”.
If you’ve made changes to your gamesys, include it also!
GAR001 This door is bolted, and there is no way to open it
GAR002 Locked! I'd better get the key to open it
GAR003 It’s locked, I can try picking the lock or finding the right key
GAR004 Ah, got it!
GAR005 A container like this might have something good inside it
GAR006 That's too high
GAR007 Crystals are good for powering up arrows
GAR008 This will be useful
GAR009 Rope arrows will only stick in wooden surfaces
GAR010 Always good to grab loot
GAR011 Now this is worth the price of admission
GAR012 Now the bow will shoot fire arrows
GAR013 Now the bow will shoot water arrows
GAR014 Now the bow will shoot moss arrows
GAR015 Now the bow will shoot gas arrows
GAR016 I'd rather not walk out there into the light
GAR017 If I stick close to the walls I have a chance of not being seen
GAR018 I better wait till his back is turned
GAR019 Too many for me to take all at once
GAR020 I'd be better off looking for another way around
GAR021 I shouldn't leave the body lying around
GAR022 Perfect. Only one, and he's looking the other way
GAR023 Just keep looking the other way...
GAR024 I think I lost him
GAR025 I hate blind corners - you never know what you're going to run into
GAR026 It almost always pays to listen at a door before opening it
GAR027 If I can hit him with the blackjack without being spotted, he'll drop without a sound
GAR028 That was bloody. I should move the body, but if someone walks by here they might figure out something’s up
GAR029 Ooh... This is not good!
GAR030 I can pick that guy off with an arrow, but if I miss, I'll give myself away
GAR031 Lots of pyrotechnics but not very stealthy I've got to be careful with those
GAR032 Water arrows are most useful for putting out torches
GAR033 Moss arrows are meant to be fired at noisy surfaces so that I can walk on them without making a racket
GAR034 Not much point in firing those into the floor
GAR035 I should remember that splashing around can make a lot of noise
GAR036 I can't stay underwater too long or I'll drown!
GAR037 I've only got a few seconds of air left!
GAR038 I'll never make any headway against this current!
GAR039 Barrels like these, can provide good cover in a pinch
GAR040 Crates like these are useful for concealment
GAR041 Every key opens something, somewhere
GAR042 Aah, not so secret anymore, is it?
GAR043 Aagh, I'm making too much noise walking on this tile
GAR044 Walking over metal is noisy, I have to be careful
GAR045 I have a bad feeling about this
GAR046 Hmm... This looks interesting
GAR047 I wonder what happened here
GAR048 Looks like this hasn't worked in years
GAR049 I wonder how I can get up there
GAR050 Hmm... There must be a way down there
GAR100 No luck here
GAR101 I'm not opening this
GAR102 Can't get through here
GAR103 Can't go this way
GAR104 Not this way
GAR105 Ahh, no point in going here
GAR106 I need'nt bother here
GAR107 Nothing useful this way
GAR108 Nothing back here I care about
GAR110 Doesn't seem to do anything
GAR111 Doesn't do much
GAR120 Hmm.. this can't be opened now
GAR121 Looks like I can't open it
GARC0101 Alright old man, lets get you out here and me my money
GARC0103 Good thing you're dying Cutty, or I'd have to kill you for stiffing me, again.
GARM0101 The keepers were training me to be one of them, but I found other uses for those skills
GARM0201 Hmm... A few too many to try to get by here
GARM0202 Only one guard, still it would be nice to get the drop on him
GARM0203 Inside, at last
GARM0204 Hah! Could you possibly be any more helpful?
GARM0205 Better not leave too many bodies lying around
GARM0206 I wonder if reads them or if it's just for show
GARM0207 Since I'm in here, I might as well pick up something for myself
GARM0208 Hah! Its a throne room, how pretentious can you get?
GARM0209 Here we go...
GARM0301 I should be near the prison entrance by now
GARM0302 He can't see me while I stick to the shadows, but I'll have to cross into the light to get to the stairs.
GARM0303 Agh, clanky metal grating, I better tread softly
GARM0304 Blocked from the other side
GARM0305 Hmm, better not let anyone bang that gong, or I'll have more company than I can handle
GARM0306 Heh! Just what the world needs - more hammers
GARM0307 More than one guy, that'll make things trickier
GARM0308 Looks like I'm on the right track
GARM0309 I hate blind corners, you never know what you are going to run into
GARM0310 I have a bad feeling about this
GARM0311 Better stick to the shadows here, if they see me I'm in trouble
GARM0312 Right, cell block 4, Cutty you better appreciate this
GARM0313 This seems too easy
GARM0314 How many guards do they have in here anyway?
GARM0315 But which one is Cutty, and how am I going to get the door open?
GARM0316 Just keep looking the other way
GARM0317 I bet the door controls are in there
GARM0318 Well this was a lost cause, time to get out before I end up in the cell next door
GARM0319 Heh, this must be how they spend all those tithes
GARM0320 I wonder if I have time for to stop for a snack
GARM0321 No point going that way, it'll be crawling with hammers
GARM0322 They take all this stuff way too seriously
GARM0323 If I keep going up, I'm going to run out of building
GARM0324 No good going this way, nowhere to hide
GARM0325 Cutty won't be needing this anymore
GARM0326 Aah, this is what I'm looking for
GARM0327 At least I can swim better than anyone carrying a sledgehammer
GARM0328 So long hammers
GARM0329 Interesting ride, I wonder if any of the hammers take it
GARM0330 Well there's Basso. If he weren't unconscious it would be simpler, but now I have to carry him out
GARM0401 Not my most elegant entrance, but it worked
GARM0402 Felix, you don't look so good
GARM0403 Damn, there has to be another way in
GARM0404 What's that sound?
GARM0405 Whoa! You know you can't take it with you, but I can
GARM0406 The horn of Quintus, I presume?
GARM0407 So this is the fabled horn of Quintus. Hope no one minds if I just take it with me.
GARM0408 So much for Felix, then
GARM0409 Its a long way down
GARM0410 Heh, how rude
GARM0411 Heh, tombs with piped-in music. How classy
GARM0412 Nice view, I wonder if the dead appreciate it
GARM0413 Good thing I'm not afraid of heights
GARM0414 Sounds like I'm getting close
GARM0415 Heh, these guys don't look too mean
GARM0501 So these are Ramirez's boys, I think it's time I dealt with Mr. Ramirez once and for all
GARM0502 It may be time for me to move along now, don't want to wear out my welcome
GARM0503 Maybe I should head back to my own neighborhood, those fellows don't seem too friendly
GARM0504 What sort of a lunatic keeps these things as pets
GARM0505 Damn, I guess I lost their trail
GARM0506 That shot was meant for me
GARM0507 These creeps are going to lead me right back to whoever sent them to kill me, but only if I can tail them without them noticing me
GARM0601 A glass gem, this sword was just a waste of time!
GARM0602 Damn, it’s a fake!
GARM0603 Information on Constantine, almost as good as gold
GARM0604 Time to take my new sword and get out of this crazy place
GARM0605 Magical traps, I guess he's serious about his privacy
GARM0701 Looks like this place was built by my old pals the keepers. I wonder what they're hiding in here
GARM0901 What have we here?
GARM0902 I'm not swimming across there
GARM0904 Anybody home?
GARM0905 I wonder if the keepers have seen this
GARM0906 One down, one to go
GARM0907 How can the keepers keep this place a secret?
GARM0908 Looks like this must have been some sort of library
GARM0909 According to the map, this was probably a market place
GARM0910 Time to raid some tombs
GARM0911 I'm not too crazy about the neighbourhood
GARM0912 For me to make use of my map, I'm going to have to find some sort of landmark to go by
GARM0913 So this is the lost city... heh heh, its not lost no more
GARM1001 Damn, I took too much time
GARM1002 I am a wall builder... This is no place to be reading poetry
GARM1003 I am a wall builder, let my walls endure from season to season, year to year, and age to age. Let my walls stand while families toil, armies march and empires fall. I am a wall builder and my walls will stand always as a shield against evil. This I pray that will the master builder grant.
GARM1101 I don't like the looks of this
GARM1102 Uh oh
GARM1104 What do we have here?
GARM1105 These stairs have seen better days
GARM1106 Looks like this doesn't work anymore
GARM1107 If I don't get this thing to work, I'm not going to get very far
GARM1108 What was that?!
GARM1109 Now how am I going to get out of here
GARM1110 Oh master builder, we ask thee to bless our brother who hath died in thy service. Forgive him the transgressions of his living days and look with favor on his works in thy name. Pum and plain, fire and forge, purify his spirit and draw from him all which does not meet thy plan. Take him to serve with thee in thy home where he may rest in peace eternal.
GARM1202 Well! This is interesting, but it doesn't say anything about the eye
GARM1203 Wow! Not even the hammers can make heads or tails of this, but it doesn't look good
GARM1301 What happened here, and where are all the hammerites?
GARM1302 Damn, looks like Constantine got here before me
GARM1303 This looks like it'd make a good escape route for me and the high priest
GARM1401 Well this is my way out, better not mess with it
GARM1402 That can't go anywhere pleasant
GARM1403 All you other demon things, you can just stay home now
GARM1404 Let's not try that again
GARM1405 You’ve gotta be kidding me
GARM1406 Heh... Now that's big!
GARM1407 Ahh... Interesting
GARM1408 I've had enough of this
GARM1409 Let's just disable that portal and give the hammers a fighting chance
Problem: I’ve created an object, but for some odd reason, it’s invisible in-game!
Solution: Open it’s properties and Add>Renderer>Has Refs? Check the box and hit OK.
Problem: My conversation isn’t working!
Solution: Make sure the conversation has the script: “TrapConverse”, that it has the property “SaveConversation” and that that’s set to TRUE, and make sure that there’s something controlling the conversation, and make sure that the conversation has AIConversationActor flavour links forwards from the conversation to the actors, with the proper data number. With this in mind check in your “Conversation” property to see if the “Actor” drop-downs are set right. Also check to make sure that the actor you’re trying to make talk has the right voice property (Add>Speech>Voice), and make sure that if the motions aren’t working, the motions are entered in correctly, with a space between the word and the “0”, and with a space after the comma:
Conversation 0, Foo 0
Problem: My DROMED window is 640x480 even though my screen resolution is 1600x1200!
Solution: Open up the file “User.cfg” under “Thief” in notepad, and add the following line: “edit_screen_size 1024,768”. Make sure the resolution is always one step lower than your screen size, otherwise DROMED will run off the edges, for example, if you’re screen resolution is 1024x768 (which it should never be for DROMED, the bare minimum is 1024x768, otherwise conversation dialogs run off the screen) add this line: “edit_screen size 800,600”.
Problem: My screen resolution is 1024x768, but I can’t see the bottom of the AIWatchObj dialog!
Solution: Unless you have a HUGE monitor (21” or higher) I wouldn’t recommend going to 1600x1200, so just make sure you don’t have any dialogs selected (no drop-downs highlighted in blue) and hit ENTER to dismiss the dialog…same with Responses or Conversations.
Problem: Okay, my DROMED keeps crashing, telling me that I have too many polygons!
Solution: Open up “dark.cfg” in notepad, and add this line: “max_polygons 99999”. (Make sure you include the new “dark.cfg” in your DarkLoader archive, though.)
Problem: I have more that 1800 object Ids!
Solution: Open up “dark.cfg” in notepad, find the max_obj line, and increase the count to 9999. (Remember to include the new “dark.cfg” in your DarkLoader archive!)(Remember to make the min_obj count –3 times the max_obj count as well).
Problem: I have too many archetypes.
Solution: Open up “dark.cfg” in notepad, and find the min_obj line (right above max_obj) and DECREASE the number to a value equivalent of –3 times your max_obj count. So if your max_obj count is 6000, make min_obj -18000. (Remember to include the new “dark.cfg” in your DarkLoader archive!)
Problem: Everything’s messed!
Solution: Back up all your custom files (gamesys, levels, dark.cfg, user.cfg, custom sounds and schemas, saves) and then uninstall Thief and DROMED. Then re-install.
Problem: I played an FM with DarkLoader, and now everything is totally messed-up in DROMED!
Solution: Go into DarkLoader, select the top mission option (is the default campaign) and click “Install Only”. Once it’s finished, close DarkLoader and open DROMED. Do this each time you play an FM. Remember that save-games for each FM are saved when you un-install them!
Problem: I’ve created a custom door…but it’s got this black box, so I can’t see the door!
Solution: Go into the door’s properties, edit the Door property and uncheck: “Blocks Vision?”.
Problem: Things aren’t working the way they’re supposed to be…my doors aren’t frobbable…etc..
Solution: Make sure you’ve loaded ConVict (script_load convict).
Problem: I type “load_script convict” into the command window, and DROMED tells me that there’s no such command!
Solution: The command is actually “script_load convict”.
Problem: I have two separate installations of Thief, one has DROMED and the other doesn’t. I’ve installed DarkLoader on my non-DROMED copy, and the FMs don’t work, everything is non-frobbable, the weapons don’t appear, etc..
Solution: Copy the file “convict.osm” from your DROMED copy of Theif’s main folder, to your DarkLoader copy’s folder. Like DROMED, FMs can’t run without the convict scripts.
Problem: I have a large outdoor area, and my solids are starting to disappear when viewed from far away!
Solution: Either decrease the size of the outdoor area, or use other buildings so the player can’t see far-off solids…sorry, that’s the only way, the Dark Engine wasn’t designed for spacious outdoors, it was designed for claustrophobic indoors!
Problem: Everything is blurring.
Solution: You either have too big an open space, so decrease the size, or your have too many solid brushes contained within an air brush…cut back.
Problem: My water is Jorge…
Solution: Is your water flowbrushed? If not, flowbrush it, if so, does that incriminating flowbrush share the same center as a solid brush?
Well, congratulations! You are now an officially qualified DROMEDer! Go out, and create your own FMs, use my knowledge well! And don’t forget to check out Lord Bafford the Tafford, and my other FMs!
Also, don’t be afraid to use the “DROMED” button in DarkLoader to check out other people’s FMs to see how they did things!
Don’t be afraid to download unstripped versions of the OMs and look around at them!
Don’t be afraid to create FMs and release them to the FM community!
And remember, no matter how outdated, there will ALWAYS be loyalists to TDP. Not all of us run off and abandon Thief’s origins to play T2, a story of insane cultists, which doesn’t even begin to compare with TDP’s story!
And remember, if you have TDP and yearn for TG, download the patch from http://www.thief-thecircle/teg-old/tools/, unstripped versions of the OMs (the missions that ship with Thief) can be found here, so that they can be examined and/or have an FM based on them. For example, ASSASSINS is a particularly popular mission for an FM to be based on because of the popular cityscape. Examples are “Lorgan’s Web” and “The Gem”.
Also, if you have ANY questions, e-mail Spike14, author, at firstname.lastname@example.org
Or, check out my website, home of BaffTaff, at http://www.geocities.com/spike14dromed/
AND! Remember to experiment with DROMED, write your own tutorials, AND, experiment with insane ideas, remember, this is DROMED, the editor that wasn’t supposed to be released to the public, we had to petition for it, and remember that DROMED is UNSUPPORTED! Neither Eidos Interactive, Looking Glass Studios, nor Activision Publishing provides technical support of any kind for DROMED.
If you need help, go to DROMED Central, or Through the Looking Glass forums!
I look forward to seeing your FMs, and seeing your tutorials and ideas at TTLG, and DROMED Central!
And remember, TTLG is always looking for new members to it’s VERY friendly community! Sign-up, post, help other newbies (and oldies) out. You’ll be surprised what you can be dreamt up in a single discussion thread! Sometimes it’s slow, but it’s worth it!
Note: If you have NO IDEA where to look for FMs check out The Keep of Metal and Gold! Thanks KoMaG! Or http://www.thiefmissions.com/missions for epithumia’s Cheap Missions Download Site. If you cross-reference between these two sites, you can grab EVERY FM TO DATE! Have fun playing other people’s FMs, and opening them up in DROMED to see how they were done!
DROMED is obsessive…you know what you’re getting into.
Oh, yes, remember not to cross the streams…and also remember that DROMED IS UNSUPPORTED! I can’t re-iterate this point enough…you asked for it.
This tutorial is copyright Spike14.
Distribution and or publication of this tutorial without the express permission of the aforementioned copyright holder is expressly forbidden!
If a person should violate this agreement, he/she shall find themselves the focal point of legal action.
Jason Tibbits AKA epithumia has express permission to host my tutorial at the following URL:
MadBull#34 has express permission to host this tutorial here:
He also has permission to translate this tutorial into German.
Balan Sergey has permission to host here:
He also has permission to translate this tutorial into Russian.
Spike14 can be contacted here: email@example.com
Also keep in mind that neither Activision Publishing, Spike14, Eidos Interactive, nor the deceased Looking Glass Studios, nor TTLG nor any of it’s descendant sites/employees/members/volunteers takes any responsibilities for the consequences of DROMED, FM, ConVict, or Fan-Made Tools usage on your computer, you, your family, you friends, your school/business/organization, or your property.
DROMED is obsessive…you’ve been warned. You know what you’re getting into.