Spike14’s

Complete DROMED

Tutorial

Version 1.4

 

BEFORE YOU DO ANYTHING:

Click the “refresh” button on your browser to make sure

the version of CompleteTut you’re viewing is the most up-to-date!

 

You are visitor number:

counter.bloke.com

 

Table of Contents

Click on a heading to go there

 

Updates

Starting Up

What’s All This?

Manipulation

General Know-How

Really Getting Started

Expanding

Flow Brushes

Garrett’s Inventory and Weapons

Inventory

We Continue

Resizing Objects

Sound

Saving

Doors

Switches and Buttons

Containers

Lights

Dynamic Lights

Garrett and Dynamic Lights

Candles

AIs

Fnords

Useful Scripts

Useful Links

FnordLocks

Undercover-Style Missions

Assassins-Style Missions

Readable Items

Advanced Book Techniques

Frobbing

MetaProperties

Making Objects Loot

Conversations

Blueroom Conversations

Ambient Sound

Garrett’s Comments

SoundTraps

Responses

The Infamous AIWatchObj Link

Making a Bow Object

Making a Quiver

Stairs

Elevators

Teleport Traps

Emit Traps

Sources and Receptrons

LockBoxes

Keys

LockPicks

Gates

Triggering From Inventory Frobbing

The Player and the StartingPoint

Difficulty Levels

Brush Timing

Creating Outdoors Areas

U, V, and Scale – Aligning Textures

Roombrushes

The GameSys and You

Schemas

How to Get Effects Started at the Mission’s Beginning/Loops

Saving Precious Object IDs

Tweq

Objectives

Objectives: QVars

Objectives: Invisible/Visible

Objectives: Text Descriptions

Objectives: Don’t Alert Anyone

Objectives: KOs

Objectives: Kills

Roombrushes as Objectives

Reverse and Final

Making a Store

CamVator Sequences

DarkLoader

Garrett’s Comments List

Troubleshooting

Afterword

Legal Stuff

 

Updates:

Version 1.0:

 

YAHOO!  The biggest DROMED tutorial on the web is HERE!

 

Version 1.1:

 

Corrected spelling and grammar

 

Version 1.2:

 

Corrected additional spelling and grammar

Removed excessive “Next”s, and “Now”s

Added “FnordLocks”, “Objectives: KOs”, “Objectives: Kills”, “Undercover-Style Missions”, “Assassins-Style Missions”, “Dynamic Lights”, “Reverse and Final”, “Updates”, “How to Get Effects Started at the Mission’s Beginning/Loops”, and “U, V, and Scale – Aligning Textures”

Removed the tips concerning upping the maxes…my mission CRASHED because of this (used to be in “Troubleshooting”)

Added a note about DarkLoader and DROMED working together in the “Starting Up” section…read this, it’s important

Added a note in “Conversations”, about roombrushing actors…read this, it’s important

 

Version 1.3:

 

Fixed more grammar and spelling

Started a new conversation listing convention, updated throughout

Page count at letter-size is now: 89

Added: “Garrett and Dynamic Lights”, “Blueroom Conversations”, and “Saving Precious Object IDs”

Updated: “Assassins-Style Missions” extensively

Added: “M-KnockedOut”, “M-ResettingLockbox”, and “M-NeverEfficient” to the list of useful MetaProperties in the “MetaProperties” section

Fixed the “Don’t Inherit” mistake…I had people checking it when they shouldn’t have…see “Useful Scripts” for more info…this update affects the following sections: “Lockboxes”, “Undercover-Style Missions”, “Useful Scripts”, and “Switches and Buttons”

Fixed the “TerrPathInit” link problem in “Elevators”, I’d forgotten to tell about the crucial link data…thanks goes to fellow T1/G loyalist EmperorSteele

Updated “Inventory”

 

Version 1.4:

 

Fixed a problem in “Dynamic Lights” and “Garrett and Dynamic Lights”, where in the gamesys in multi-mission packs were adversely affected!

Clarified a few issues in “Garrett and Dynamic Lights”, I’d suggest a re-read

Page count at letter-size is now: 107…YEAH!!!!  I hit 3 digits!

Fixed a problem in “FnordLocks”

Totally re-did “Sources and Receptrons”, now info is easier to find, and generally more abundant!

Added the “Gates” section…some useful information here

Added “Triggering From Inventory Frobbing”, provoked by my own bad experiences with this certain subject

Added “Candles”…seeing how there was such uproar about them on TEG a couple days ago

Added “The Player and the StartingPoint”, which contains important information about referencing to the avatar “Garrett” in-game!

Added “CamVator Sequences”

Fixed “Elevators”…AGAIN!

Added some info in: “Containers”

Fixed “The Infamous AIWatchObj Link”

Fixed data on “SecureDoor” script, and added documentation of the “M-SecureDoor” metaproperty

Added the “Tweq” section.

 

Starting Up

 

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.

 

Before you even THINK about installing DROMED, ensure that ALL FMs are uninstalled, by going into DarkLoader and “Install Only” “Thief 1 Campaign”.  (Only applicable if you actually have DarkLoader installed on the copy of Thief you’re looking to use for DROMEDing…I suggest a separate install for DROMED, but if you don’t have enough HD space, just make sure all FMs are un-installed before you fire-up DROMED…unless you’re using the “DROMED” button in DarkLoader, in which case, don’t bother un-installing.)

 

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 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, start-up DROMED, and get ready to create some FMs!

 

What’s all this?

 

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!

 

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:

 

TERRAIN:

 

-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.

-Blockable: Useless

 

OBJECT:

 

-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).

 

ROOM:

 

-Default: Ordinary roombrush (allows for sound propagation).

-Other: Roombrushes you create to create effects, such as ControlDevice links, or automaps.

 

AREA:

 

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!  Click on any area brush and hit “Show All” to see your whole level again.

 

FLOW:

 

Flow: Allows for the precise manipulation of water (e.g.: 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!

 

Manipulation

 

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:

 

Cube

Cylinder

Wedge

Decahedron (10 sided geometric shape)

Pyramid

 

Okay, so you’ve tried creating a cylinder, but ended up with a “cube” 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.

 

Note: You can add extra sides to Cylinders and Pyramids.

 

“Align by side” and “Align by vertice” determine how DROMED snaps the brushes…if “Align by side”, DROMED will snap the sides of the brush, “Align by vertice” will make DROMED snap the vertices of the shape.

 

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.

 

General Know-How

 

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.

 

Really Getting Started

 

Okay, now we’ve learned hotkeys, learned about textures and objects, brushes also, we’ve also covered creating and 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!

 

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!

 

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!

 

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!

 

You’re probably 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’d 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, and 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 2000 objects.  That may sound like a lot, but it really isn’t.

 

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!

 

Click 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:

 

Flavour:               PlayerFactory

From:                  StartingPoint

To:                      Garrett

 

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 buttons 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!

 

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.

 

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 by pressing Alt+G!

 

There, wasn’t that enjoyable?  I’ll bet you wish there was a bit more to explore, don’t you?

 

Expanding

 

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!

 

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.  Texture it, and portalize!  There, a beautiful doorway…without a door?

 

Remember to use Heading (H) in degrees if your doorway isn’t oriented correctly with the wall!

 

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 its heading +180.

 

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?  Go ahead, I can wait!  (Remember that if the door is smaller or bigger than 4x8, you’ll have to adjust the doorway size and portalize!)

 

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 door’s 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?

 

Let’s add the property to assign a key to a door!  Add-Engine Features-KeyDst, leave MasterBit alone, make RegionMask “1”, and make LockID a number of your choosing.

 

Flow Brushes

 

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 lava!

 

Now, hit “Edit Group”.  In “Texture Name” type “bl”.  There, blue water!

 

The second bonus is water current!  Use the boxes that read:

 

X change/sec

Y change/sec

Z change/sec

 

This is the current, in feet per second!  Z is up and down, down is a negative number, X is north and south, north is a negative number (North is “up” on-screen in the “Top” or “Plan” view), and Y is east and west, west is negative.

 

Garrett’s Inventory and Weapons

 

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 a 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?

 

Inventory

 

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:

 

Yes

 

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:

 

Name_XXX:“YYY”

 

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:

 

No

 

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”.

 

To change the frob distance of an object, Add>Inventory>Max Pick Distance, and set it to a number in feet.

 

To change an object to/from junk to an item or weapon, Add>Inventory>Type, and select the appropriate type.

 

To make it so you can’t drop an item, Add>Inventory>Can’t Drop This, and set to “TRUE”.

 

We continue

 

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.

 

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!

 

Resizing objects

 

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!

 

Sound

 

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.  A 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

10                       Tunnels

11                       Caverns

12                       Sewers

 

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 and the Room Database.

 

Saving

 

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…

 

Doors

 

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

 

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 (“TurnOn”), 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 (uncheck “Don’t Inherit”, see “Useful Scripts”)

TrigRoomPlayer                               Triggers when a player enters a room.

TrigWorldFocus                               Triggers when the object is focused on in-game.

 

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 its 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 two 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!  Remember that for this to look realistic, both switches must start off in the same state, otherwise you’ll have to frob either one twice to get the other to change states.

 

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”.

 

You can “lock” a switch by locking it and giving it “KeyDst”, “PickCfg” (see “Lockpicks”), or “Lock”-link, and then have it either: A. Just locked.  Or B. Locked like the smelting levers in Cragscleft, which make a BUZZ, and lights up a lamp when it’s frobbed without unlocking or without them being unlocked.  Just find that lamp (open up an unstripped version of Cragscleft in DROMED, and find the smelting center, and the lamp), and make a “ScriptParams” link from the lever to the lamp, fill in the data with this: “ErrorOutput”, now, isn’t that something?

 

Containers

 

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”.

 

Also remember that you CAN place multiple things in a container, however this could become extremely confusing, unless two different types of things were placed in the container.  Example: A healing potion and a healing fruit are placed in the container.  The healing fruit is linked first, and the potion second.  Since links execute in order starting at the top, the healing fruit will go into your inventory, THEN the healing potion will slide into your inventory.  Since the item you acquired is displayed when it is acquired, the healing fruit will go UNNOTICED since it was de-selected a mere fraction of the millisecond after it was selected!  This could result in great confusion amongst players, as they may become frustrated if you should place a truly important item in a container in this fashion.  The FM “The Treasury” is confusing in this manner because a key AND some loot are placed in the same container, the key slides UNNOTICED into your inventory!  Even it’s sound isn’t audible since the loot sound is louder!

 

However, if you place…say, a blackjack and some loot in one container, BOTH will go noticed, since one is a weapon and the other an item.  When you successfully frob the container (search it), your blackjack will become selected, as well as your loot “item”…which really isn’t an item per se, but rather a space in your inventory list, which shows you how much loot you have, and a picture of the last loot item you acquired!

 

Also remember that the “Container” script sends a “TurnOn” ControlDevice signal when it’s frobbed.  That’s how the two arrow-firing treasure chests in “Down in the Bonehoard” worked.  They were ControlDevice-linked to the EmitterTraps which emitted a broadhead!

 

Lights

 

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 (or, so they say).  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.  (If it’s not there, when you add “AnimLight” and configure it, remove the “Light” property.)

 

Note: If you’re planning on copying “AnimLight” sources, don’t delete the “Light” property, rather set it to “0” across the board, since whenever a light is created (by cloning, or using “Insert”, too), the “Light” property is automatically added if it isn’t there.

 

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!

 

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 becomes 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, add a “FrobProxy” link to a hidden switch, and then link the switch back to the light.

 

Dynamic Lighting

 

I know, I know, I just told you that Dynamic Lighting in T1/G was impossible, but it is…technically!

 

Please read “Sources and Receptrons” before reading this.

 

Okay, now, create a “lantern”, Physical>Lights>lanterns>lantern.

 

Reduce all its “Light” properties to 0, and then Add>Renderer>Self Lit: 250

 

Go into the object hierarchy, go into: physical>Creature>Animal>Human>Swordguard>Grunts>sword guard, select “sword guard”, and press “Add”.

 

Type: “Normal”, and press “Enter”.

 

Repeat twice, naming the next two guards “High” and “Highest”.

 

Close the hierarchy, and save the gamesys!  (See “The Gamesys and You” for further details.)

 

Next let’s create a custom stim.  Open up the object hierarchy, and view Stims.  Press “Create” and name your new stim “LanternStim”.  Save your gamesys, and restart DROMED.

 

Now, go into the hierarchy, select “Normal”, and Add>AI>Utility Settings>Visibility Control.

 

Set the values as follows: Low Light: 13 Mid Light: 19 High Light: 44

 

“High”:

 

Low Light: 6 Mid Light: 10 High Light: 22

 

“Highest”:

 

Low Light: 0 Mid Light: 0 High Light: 0

 

Good!

 

Open up the lantern’s properties, and Add>Act/React>Source:

 

Object:                                                        A lantern

Stimulus:                                                      LanternStim

Propagator:                                                  Radius

Edit Shape: Radius:                                      50

Edit Shape: Flags:                                         [None]

Edit Shape: Dispersion:                                 Linear

Edit Life Cycle: Flags:                                   raycast

Edit Life Cycle: Period:                                 100

Edit Life Cycle: Max Firings                         1

Edit Life Cycle: Intensity Slope:                    0

Edit Life Cycle: Intensity:                              50

 

Now create a guard, any kind of guard…a sword guard, though.  Open the “Links” dialog, and Add:

 

Flavour:                                                       CreatureAttachement

From:                                                           LanternGuard

To:                                                               A lantern

Data:                                                            Left Fingers

 

The next step is to make this new “LanternStim” affect Garrett:

 

Open up the hierarchy, and “Edit”: Physical>Avatar>Garrett

 

Add>Act/React>Receptrons: In this dialog, press “Add”:

 

Object:                                                        Garrett (-2099)

Stimulus:                                                      LanternStim

Min Intensity:                                               NoMin (check the box)

Max Intensity:                                              25

Effect:                                                          Set Property

Edit Effect: Prop Name:                                AI_VisCtrl

Edit Effect: Target Obj:                                 Me

Edit Effect: Agent Obj:                                 Normal

 

Press “OK”, then “Add” again:

 

Object:                                                        Garrett (-2099)

Stimulus:                                                      LanternStim

Min Intensity:                                               26

Max Intensity:                                              38

Effect:                                                          Set Property

Edit Effect: Prop Name:                                AI_VisCtrl

Edit Effect: Target Obj:                                 Me

Edit Effect: Agent Obj:                                 High

 

Press “OK”, then “Add”:

 

Object:                                                        Garrett (-2099)

Stimulus                                                       LanternStim

Min Intensity:                                               39

Max Intensity:                                              50

Edit Effect: Prop Name:                                AI_VisCtrl

Edit Effect: Target Obj:                                 Me

Edit Effect: Agent Obj:                                 Highest

 

Press “OK”, then “OK”.  If the window pops-up again, just dismiss it once more.  Now dismiss “Garrett”’s properties, as well as the hierarchy, then save your gamesys!

 

You might be wondering, then, how the actual LIGHT gets there, the light that lights up the guard’s path.  Well, dynamic lighting in T1/G IS possible, with the “Self Lit” property, however, this property, for some reason, doesn’t illuminate Garrett, so we’ve developed this clever work-around!

 

If you’re using DROMED for Thief 2, just use the >Renderer>Dynamic Light property.

 

Garrett and Dynamic Lights

 

So, now we’ve gone from: “Dynamic Lighting in T1/G is IMPOSSIBLE”, to describing a dynamic lighting technique in-depth!  Please read: “Dynamic Lights”, and “Conversations” first.

 

First, go into your object hierarchy, and create a new metaproperty, called it “MoveAndScript”.

 

Put this property on it:

 

Add>Engine Features>FrobInfo: Move,Script;[None];[None]

 

Create and roombrush a blueroom.

 

Create an AI in the blueroom, call him “LanternAI”.

 

Now, open up the hierarchy, select “Act/React Stimuli”, and create two new stims: “PassItOn”, and “LanternFStim”.  Then save your gamesys, and restart DROMED.

 

Go to your roombrushed blueroom, create four buttons.  Create 2: physical>Lights>lanterns>lantern, from the hierarchy.  Name the first: “UnlitLantern”, and the second “LitLantern”.

 

Add the following properties to “UnlitLantern”:

 

Inventory>Can’t Drop This: TRUE

Inventory>Object Name: Name:“Lantern: Off”

Inventory>Type: Item

Renderer>Light: 0;0;0;0

S>Scripts: StdButton;;;;FALSE

Engine Features>FrobInfo: Script;[None];[None]

Metaproperty>MoveAndScript (Only if you plan to have the player pick up the lantern)

 

And add these properties to “LitLantern”:

 

Inventory>Can’t Drop This: TRUE

Inventory>Object Name: Name:“Lantern: On”

Inventory>Type: Item

Renderer>Light: 0;0;0;0

S>Scripts: StdButton;;;;FALSE

Engine Features>FrobInfo: Script;[None];[None]

Metaproperty>MoveAndScript (Only if you plan to have the player pick up the lantern)

 

Now, place “UnlitLantern” somewhere either A. The player can pick it up.  Or B. Link the StartingPoint to it with a “Contains” link.

 

If “A”, there’s an extra step…which will be mentioned later.

 

Now, create three markers (fnord>Marker), four teleport traps (fnord>TrapTrig>TeleportTrap), four buttons (physical>Gizmo>Switches>Buttons>Button), and an OmniLightPoint (fnord>HackLight>OmniLightPoint).

 

Read: “Conversations”.

 

Add the following properties to the 3 markers (name them: “UnliteLantern”, “LiteLantern”, and “AddRemoveLinks”):

 

S>Scripts: TrapConverse;;;;FALSE

AI>Conversations>SaveConversation: TRUE

 

Link each marker in turn to “LanternAI”, with an “AIConversationActor” link…set the data to “1” for each.

 

Next, name the buttons: “RealButton”, “OmniButton”, “UnlitButton”, and “LitButton”.

 

Name the TeleportTraps: “RealTele”, “OmniTele”, “UnlitTele”, and “LitTele”.

 

Link each button to its respective TeleportTrap with a “ControlDevice” link (“LitButton” to “LitTele”, etc.).

 

Name the OmniLightPoint: “RealLantern”.

 

Link each TeleportTrap to it’s respective lantern…you’ll notice you have one (“OmniTele”) left over…link it to “RealLantern”…all links are “ControlDevice” flavour.

 

Next, add the following properties to “RealLantern”:

 

Renderer>Self Lit: 250

Renderer>Light: 0;0;0;0

 

Now we’re going to give “RealLantern” a source, which will make it able to follow Garrett around, so, open up it’s properties, and Add>Act/React>Sources.

 

Press “Add”, and a window will pop-up…fill it in like this:

 

Name: RealLantern

Stimulus: LanternFStim

Propagator: Radius

Intensity: 1

Edit Shape>Radius: 8

Edit Shape>Flags: [None]

Edit Shape>Dispersion: None

Edit Life Cycle>Flags: No Max Firings

Edit Life Cycle>Period: 100

Edit Life Cycle>Max Firings: 1

Edit Life Cycle>Intensity Slope: 0

 

Press “OK” to add this source…then add ANOTHER source:

 

Name: RealLantern

Stimulus: LanternStim

Propagator: Radius

Intensity: 50

Edit Shape>Radius: 50

Edit Shape>Flags: Line of Sight (raycast)

Edit Shape>Dispersion: Linear

Edit Life Cycle>Flags: No Max Firings

Edit Life Cycle>Period: 100

Edit Life Cycle>Max Firings: 1

Edit Life Cycle>Intensity Slope: 0

 

Press “OK” to add that source, then press “OK” to dismiss the sources box…it may pop back up, just press “OK” again…it’s a bug!

 

Now, in order for this stim to be able to have “RealLantern” follow Garrett, we need to make Garrett receive the stim and act appropriately!  So, open up the hierarchy, select physical>Avatar>Garrett (-2099), and hit “Edit”.

 

Then look for a property entitled “Receptrons”.  Hit “Edit” (Garrett already has receptrons, so you’d bugger up the game by adding “Receptrons” again…if a property exists, just edit, DON’T add…unless that property is hierarchied…then add!).

 

Now hit “Add” to make a new receptron!

 

A large box will pop-up, fill it in like this:

 

Name: -2099

Stimulus: LanternFStim

Min: 0

Max: No Max (check it)

Effect: Teleport Object

Target Object: Source

Agent Object: Me

Edit Effect>X: 0.1

Edit Effect>Y: 0.1

Edit Effect>Z: 0.1

 

That’s it!

 

If you remember from the “Dynamic Lights” section, Garrett already has receptrons for “LanternStim”.  If you didn’t alter your gamesys in the last section for Dynamic Lighting…then go back to “Dynamic Lights”, and add the necessary receptrons to the “Garrett” archetype…then return here!

 

Okay, you might remember we have a marker called “AddRemoveLinks”…if, in the A/B choice above, you chose “B”, then delete this marker.

 

Also, if you chose “B”, link “UnlitLantern” to “LiteLantern” via “ControlDevice”.

 

Select “OmniTele”, and position it overlapping the StartingPoint on all views.  Then Add>Act/React>Sources:

 

Name: OmniTele

Stimulus: LanternFStim

Propagator: Radius

Intensity: 1

Edit Shape>Radius: 8

Edit Shape>Flags: [None]

Edit Shape>Dispersion: None

Edit Life Cycle>Flags: No Max Firings

Edit Life Cycle>Period: 100

Edit Life Cycle>Max Firings: 1

Edit Life Cycle>Intensity Slope: 0

 

There, now the “OmniTele” will follow Garrett.

 

Add another Source to “OmniTele”:

 

Name: OmniTele

Stimulus: LanternStim

Propagator: Radius

Intensity: 15

Edit Shape>Radius: 1000

Edit Shape>Flags: [None]

Edit Shape>Dispersion: None

Edit Life Cycle>Flags: No Max Firings

Edit Life Cycle>Period: 100

Edit Life Cycle>Max Firings: 1

Edit Life Cycle>Intensity Slope: 0

 

Select “UnlitLantern”, and “LitLantern”, in turn, and add this Source to both of them:

 

Name: UnlitLantern OR LitLantern

Stimulus: PassItOn

Propagator: Contact

Intensity: 1

Edit Shape>Contact: Frob in Inv

Edit Shape>Velocity Coefficient: 0

Edit Shape>Frob Time Coefficient: 0

 

Next we need to make Garrett react to the source…edit Garrett’s receptrons again:

 

Name: -2099

Stimulus: PassItOn

Min: 0

Max: No Max

Effect: Frob Object

Target Object: Source

 

Ah, done!

 

Next, make sure that “RealLantern” in the blueroom, is AT LEAST 8ft away from any player-accessible areas on ALL SIDES, top, bottom, front, back, left, right, otherwise WEIRD errors will occur!

 

Now that everything is setup, it’s time to start setting up the conversations!

 

The first thing is to say, did I choose “A” or “B”?  If you chose “A”, just keep on reading, if you chose “B”, skip down to the place titled “Bs Start Here”:

 

Okay As, link “UnlitLantern” to “AddRemoveLinks” with a “ControlDevice” link.

 

Select the marker that you didn’t delete, “AddRemoveLinks”.  It should already have the framework of a conversation (if you followed this section of my tutorial word-for-word), “AIConversationActor” link, “SaveConversation” property, and the “TrapConverse” script!

 

Add>AI>Conversations>Conversation:

 

STEP 00:                                                    

 

Action 00:                                                    Add Link

                                                                    Actor One

Arg1:                                                           ControlDevice

Arg2:                                                           LiteLantern

Arg3:                                                           UnlitLantern

 

Action 01:                                                    Remove Link

                                                                    Actor One

Arg1:                                                           ControlDevice

Arg2:                                                           AddRemoveLinks

Arg3:                                                           UnlitLantern

 

Action 02:                                                    Add/Remove Metaproperty

                                                                    Actor One

Arg1:                                                           Remove

Arg2:                                                           MoveAndScript

Arg3:                                                           LitLantern

 

Action 03:                                                    Add/Remove Metaproperty

                                                                    Actor One

Arg1:                                                           Remove

Arg2:                                                           MoveAndScript

Arg3:                                                           UnlitLantern

 

Bs Start Here

 

Link “LitLantern” to “UnliteLantern” with a “ControlDevice” link.

 

Select “LiteLantern”, Add>AI>Conversations>Conversation:

 

STEP 00:

 

Action 00:                                                    Remove Link

                                                                    Actor One

Arg1:                                                           Contains

Arg2:                                                           UnlitLantern

Arg3:                                                           Player

 

STEP 01:

 

Action 00:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           UnlitButton

Arg2:

Arg3:

 

Action 01:                                                    Add Link

                                                                    Actor One

Arg1:                                                           Contains

Arg2:                                                           LitLantern

Arg3:                                                           Player

 

Action 02:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           OmniButton

Arg2:

Arg3:

 

That’s that conversation out of the way…onto the next conversation (“UnliteLantern”):

 

STEP 00:

 

Action 00:                                                    Remove Link

                                                                    Actor One

Arg1:                                                           Contains

Arg2:                                                           LitLantern

Arg3:                                                           Player

 

Action 01:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           RealButton

Arg2:

Arg3:

 

STEP 01:

 

Action 00:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           LitButton

Arg2:

Arg3:

 

Action 01:                                                    Add Link

                                                                    Actor One

Arg1:                                                           Contains

Arg2:                                                           UnlitLantern

Arg3:                                                           Player

 

Last, but certainly NOT least, add the following properties to “LanternAI”:

 

Add>AI>AI Core>Team: Neutral

 

Then add the metaproperties: “M-NoBabble”, and “M-NeverEfficient”.

 

Go in-game, and enjoy!

 

Candles

 

You might have played the T1/G FM “Lorgan’s Web”, which was FAMOUS for its candles that burned, and could be frobbed out!

 

I’m going to teach you how to make such candles!

 

First, you must know where to find the candles…they are under: physical>Lights>candles>

 

There are three different kinds of candles: Treasure Candles, Long Candles, and Short Candles.  Each one is different.  The only thing different between “Long Candles”, and “Short Candles” is the bounding box setting on the particle effect (the space off-set from center the actual particle effect can occupy)…however, treasure candles are more complicated, because they have to be allowed to move into the player’s inventory, too.

 

We’ll cover treasure candles first.

 

Create a torch: physical>Lights>torch.

 

Add the following properties to it:

 

Add>Metaproperty>IsLoot

Add>Dark Gamesys>Loot: Gold: 50

Add>Shape>Model Name: trcandle

Add>Tweq>Models>(change all “Model X” fields to “trcandle”)

Add>Renderer>AnimLight>(change min to 22, max to 30, change mode to “Random but coherent”)

 

There!  Now, if you go in-game, you’ll have a candle with a MASSIVE particle effect on top, whose light does weird things when it’s picked up.  So, let’s tweak the particle effect.

 

First off, delete the “TorchFlameSmoke”, so that only the “TorchFlameYellow” remains.

 

Open the “TorchFlameYellow”’s properties, and modify it’s SFX> properties so that it has a particle size of 0.08, a min Z-axis bounding box of 1.5, and a max Z-axis bounding box of 1.9

 

Next, add the following properties:

 

Add>S>Scripts: StdButton;;;;FALSE

Add>Engine Features>FrobInfo: Script;;

Add>Inventory>Max Pick Distance>7.00

 

Good!  Next, find a nearby object without any script- or tweq-driven functionality (example of ideal objects: a table, ladder, or banner), add the the script: “TrapInverter”.

 

Link the TorchFlameYellow to the object (which is now an Inverter), then link the object to the candle itself.

 

There’s one last thing to do.  To ensure that the player CAN’T take the candle right off the bat and cause weird lighting errors, add a “FrobProxy” link from the candle to the TorchFlameYellow.

 

There!  Now we know how to make a “Treasure Candle”, well, what about a “Long Candle”?  Do the SAME thing, only this time forget the “FrobProxy” link, the “IsLoot” metaproperty, and the “Loot” property.

 

So, what about a “Short Candle”?  Do the same thing as a “Long Candle” only this time, change the bounding box Z-axis min and max to: 0.5, and 0.65, respectively!

 

Note: Tinker with the “AnimLight” settings, changing from “Random but coherent”, to “Random” to make the candle flickering more apparent…you can also fiddle with the max and min brightness to make the light flicker over a wider or thinner selection of brightnesses.

 

AIs

 

Okay, here we are, AIs, the third most difficult DROMED concept to master.  Conversations are the most difficult, followed by S/R (Sources and Receptrons).  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”, also integral to a conversation’s functioning.

 

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!

 

AIs are just like other objects, you can place them and leave them…they appear without portalizing.

 

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 its 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 cheesy!

 

Create markers at suitable flee points in your levels, and name them “FleePointX”, where X is the number of the flee point.  Add-AI-Utility-Flee Point to these markers, 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!

 

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, or add an “AICurrentPatrol” from the AI to the TrolPt you want him to start at.

 

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, which causes the AI to patrol to the last linked TrolPt, then stop!

 

We have to tell the 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”.

 

Compute the pathfinding database, and go in-game…there, your AI patrols!

 

Let’s tackle sleeping AI next.  You must understand that Thief comes with a MetaProperty called “M-SleepingServant”, which was used to make servants sleep; never guards.  But since the advent of FMs in 1999, we’ve seen everyone and everything sleeping!

 

So, ignore the servant part.  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…we’re going to modify your Dark Gamesys.  Sound daunting?  Don’t worry, it isn’t.

 

Please read: “The Gamesys and You”.

 

First we have to change this M-SleepingServant metaprop, and then we must save the gamesys.

 

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”.

 

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.

 

Add-AI-Responses-Alert Response to the AI you wish to have sleeping!

 

Set the alert level to 3, and the priority to “Very High”.

 

Change the first action to Add/Remove MetaProperty, and then type the following in Arg 1, 2, and 3.

 

Arg1:                                                           Remove

Arg2:                                                           M-SleepingServant

Arg3:                                                          

 

Please note that empty “Arg”s (from here on out) are not type-Os, but really are empty, with some actions they’re not necessary!

 

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!

 

Get out of the Obj Hierarchy, then go File>Save Gamesys, and save over “Thief\dark.gam”.

 

Please note that adding this prop (M-SleepingServant) will cause the AI to change his stance, which will cause him to not move at all in the solid world, and make him appear twice in the wireframe world!  Don’t worry, just move and he’ll move in the solid world, or move him in the wireframe world to dismiss the errant copy!

 

This same error occurs when you rotate an AI to an angle NOT a multiple of 90 (0, 90, 180, 270), such as 45.  A larger box will appear, which is odd…only the middle slice of that box is “really” occupied.

 

Note: When you make an AI sleeping on a bed, sometimes he’ll actually exist INSIDE the solid of the object…such as in a bunkbed when he/she is sleeping on the bottom bunk.  When this happens, or when the AI is sleeping a top a “bunk”, when he/she stands up, they’ll end up INSIDE the object, so they won’t be able to move!  To workaround this, select the bed, and Add>AI>Utility>Path Avoid: [None].  This will cause the AIs to ignore the bed’s solidness, and merely walk right through it…do the same thing with chairs that an AI is sitting in.

 

Note: Don’t use beds from the “Beds” archetype…use beds from the “BedParts” archetype…the former will crash Thief!

 

Next question: 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!

 

Now the all-together too popular AI trick, 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

Arg1:                                                           Remove

Arg2:                                                           M-AlertCapZero

Arg3:                                                          

 

Action01:                                                     Play Sound/Motion

Arg1:                                                           tolevelthree

Arg2:

Arg3:

 

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.

 

Add-Motions-ActorTagList, type: “WithSword 0, Drunk 0”, this changes the guard’s motion configurations so that he sways drunkenly, with his hands and sword flying about.  The “WithSword 0” 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.  If you look at a guards “ActorTagList” by default, you’ll notice it reads “WithSword 0”.

 

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 its number and open up the drunk guard’s links window.  Add a new link:

 

Flavour                                                        CreatureAttachement

From:                                                           Drunk Guard

To:                                                               Goblet

 

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.  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 weapon!

 

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!

 

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 whose 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 BadXs

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.

 

Open up his links.  You’ll see that by default he has the following links:

 

Flavour:                                                       Contains

From:                                                           The Archer

To:                                                               A Broadhead

Data:                                                            Generic Contents

 

Flavour:                                                       Culpable For

From:                                                           The Archer

To:                                                               A Broadhead

 

Flavour:                                                       AIProjectile

From:                                                           The Archer

To:                                                               A Broadhead

 

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.

 

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.

 

Open the bowman’s properties and Add>Shape>Model Name

 

Type “HamBow”

 

Press enter.

 

Now Add>Speech>Voice

 

Type: “hammrs”.

 

Press enter.

 

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”.

 

Lastly, save your gamesys (See “The gamesys and you”), and try him out!

 

Fnords

 

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                                            Sends “on” when all linked objects are on, sends “off” when NOT all objects are “off”, even if one turns off and the rest are still “on”

RequireAnyTrap                                          Sends an “on” signal if any of the ControlDevices to it are “on”, and an “off” when all ControlDevices are “off”.

RelayTrap                                                    Relays a link signal

DestroyTrap                                                Destroys whatever it’s linked to via ControlDevice when it receives a ControlDevice

ReleaseTrap                                                 Releases whatever it “Contains” when it receives a ControlDevice.

TrolPt                                                          A patrol point (is just a re-named marker…)

TerrPt                                                          See “Elevators”

LookBackPt                                                The patrolling individual looks back here, operates like a TrolPt.

QVarTrap                                                    Changes mission objectives, see the “Objectives” series of topics

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”

CreateTraps                                                 Creates whatever it “Contains” when it receives a ControlDevice

FnordLock                                                  See “FnordLocks”

 

Note: RequireAll and RequireAnyTraps.  These traps use “ScriptParams” links with “On” data to signify which ControlDevice-linked objects are on.  If you’ve linked an object to the trap, and it starts off “On”, you should create the link with the appropriate data…otherwise the trap won’t function properly until you’ve turned that offending switch off then on again.

 

Useful Scripts

 

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 conctrete room, “On” when occupied, “Off” when not

TrigAIAlert                                                  Triggers when an AI becomes alert

TrigWorldFocus                                           Triggers when an object becomes focused upon, make sure FrobInfo, WorldAction is: “FocusScript”

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                                                 See “Undercover-Style Missions”

CollisionStick                                               The object sticks to wooden surfaces

AnimLight                                                    See “Lights”

OnOffSounds                                               The object produces sounds when turned on/off, needs Schemas>Class Tags, or “SoundDescription” link

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 an object into a container.  See “Containers”

LoadoutCache                                             See “Making a Store”

SuspiciousToFrob                                        See “Undercover-Style Missions”

SuspiciousToTake                                        See “Undercover-Style Missions”

StickyWebs                                                 Makes the object a SpiderBeasts sticky web…5 sticky webs for every repeat of the script!

WatchMe                                                    See “The Infamous AIWatchObj Link”

AttackActivate                                             Activates all “ParticleAttachement” objects when an attack commences…is by default on the Hammer Priest

StdParticleGroup                                         ??? – Must be on a particle effect for “AttackActivate” to work

ActivateAmbient                                          Activates ambients on “ControlDevice” linked objects on “TurnOn”, de-activates on “TurnOff”

ReloadTweqEmit                                         Allows and “EmitTrap” to fire more than once, but NOT in a stream!

 

Note: On the “Don’t Inherit” checkbox.  If you add scripts to an object for the first time, and you see scripts in the box, if you leave “Don’t Inherit” unchecked, you can delete them.  However, if you wish to alter these original scripts (remove some), check “Don’t Inherit”, that way the object won’t inherit scripts from the parent archetype.

 

Useful Links

 

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’s inventory…set data to determine launch point…etc.

AIPatrol                                                       Link from TrolPt to TrolPt to form a patrol route

AIWatchObj                                                See the section on this one!

Lock                                                            Link from something to a lockbox (or fnordlock) 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…can also be used with a SoundTrap…see appropriate sections

Weapon                                                       Makes the linked to object the AI’s weapon

Corpse                                                        Causes the object to become this object when “slayed”, not destroyed, “slayed”.

FrobProxy                                                   A weird link…see the section on Frobbing

TPath                                                           See “Elevators”

TPathInit                                                      See “Elevators”

CreatureAttachement                                   Useful for attaching one creature to another creature/object

ParticleAttachement                                     Attaches objects and particle effects

AICurrentPatrol                                           The AI’s first patrol point.

AIAwareness                                               Is linked from an AI to the player if the AI is aware of the player.

PhysAttach                                                  Used to attach two things.  See note.

ScriptParams                                               Like ControlDevice, too broad to do here.

 

Note: The links with tildes “~” in front 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:

 

Flavour:                                                       Contains

From:                                                           StartingPoint

To:                                                               A Sword

 

DROMED automatically creates this one:

 

Flavour:                                                       ~Contains

From:                                                           A Sword

To:                                                               StartingPoint

 

Note: The PhysAttach link.  The PhysAttach link functions differently in Thief 1 than in Thief 2.  In Thief 1 the object being PhysAttached is attached to the target object, and moves whenever that object moves, the same distance and in the same direction.  However, in Thief 1, when a PhysAttach link attaches something, that object is NOT automatically moved to that object.  In Thief 2, when a PhysAttach ink is added, the agent object is automatically pulled forcefully to the target object.  Also in Thief 2, the PhysAttach link data can be set for an off-set, originating from the center of the target object.  In Thief 1 this is unnecessary, since the PhysAttach link doesn’t move the agent object to the target object automatically.

 

FnordLocks

 

FnordLocks are like lockboxes, only they’re Fnords, and respond to ControlDevices rather than just frobbing.

 

Let’s try out a FnordLock now!

 

Create a FnordLock (Fnord>TrapTrig>FnordLock), a door, a switch, and an inverter

 

To have a FnordLock start out locked, Add>Engine Features>Locked: TRUE.

 

Link the door to the FnordLock (“Lock” flavour).

 

Link the switch to the inverter.

 

Link the inverter to the FnordLock.

 

Add the “Locked: TRUE” property to the FnordLock.

 

Try it out!  Flipping the switch will lock and unlock the door!

 

Note: When a FnordLock receives a “TurnOn” signal, it locks, “TurnOff” it unlocks.

 

Undercover-Style Missions

 

To me, as a DROMEDer, “Undercover” was a magnificent piece of work!

 

It had all sorts of complex stuff!  A. The AIs ignored you until you opened a forbidden door, or until you threatened them, OR until they saw you stealing something.  B.  It had a complex timer system.

 

I’m going to explain how YOU, yes, YOU can duplicate the style of “Undercover” in you’re missions.

 

Okay.  First, let’s learn about the MetaProperties, and scripts used in “A”:

 

SuspiciousToFrob                                        AIs seeing you frobbing this item become alerted…uncheck “Don’t Inherit” and remove all original scripts to avoid weird bug

SuspiciousToTake                                        AIs seeing you taking this item become alerted…see note on “SuspiciousToFrob”

M-FrontGateGuard                                      AIs ignore you until you threaten them, or until they “sense combat”

M-AlertCapZero                                         See the section on metaproperties to know the difference between “M-FrontGateGuard”, and “M-AlertCapZero”

 

So, create a hallway, with some guards patrolling (preferably a hallway they can walk out of sight), and a door, and a room.

 

Add the metaproperty: “M-FrontGateGuard” to all the guards.

 

Now, Add>S>Scripts.  Delete all the scripts, type “SuspiciousToFrob”, uncheck “Don’t Inherit”, and press “OK”.

 

A better script to use might be “SecureDoor”, adding it in the same way.  “SecureDoor” alerts guards if the door isn’t in it’s original state (“Open” or “Closed”), but in this case we want the guards to have to SEE YOU opening the door in order to be alerted.  (With “SecureDoor” the AIs don’t become alerted if another allied AI opens the door.)  Also note that “SecureDoor” uses “AIWatchObj” links…so, in order to get “SecureDoor” to work properly, also add the metaproperty: “M-SecureDoor”, for the proper watch link defaults!

 

So, now, go in-game, and open the door when a guard’s looking…he attacks, right?

 

Now, open it when he’s not looking…he ignores you, right?

 

If this doesn’t work, try typing: “script_load miss10” into the command box and hitting ENTER.

 

If this still doesn’t work, substitute “SecureDoor”.

 

Try the same thing with “SecureDoor”.  You’ll notice that this makes it much harder to intrude, because the guard notices THE DOOR, not YOU FROBBING THE DOOR.

 

Same thing with “SuspiciousToTake”.  The guards don’t notice the item gone, they notice YOU TAKING THE ITEM.  (This is also in miss10.osm, so try: “script_load miss10”, if that doesn’t work, you’ll have to see “The Infamous AIWatchObj” link, and make a line of sight AIWatchObj that adds a ControlDevice link from the object to a conversation which alerts the guard…then make another AIWatchObj that triggers when the guard is close and ISN’T aware of the player (should be a smaller cylinder), which deletes the AIWatchObj, both links should kill on completion, and both should create the others, so you’ll need to set-up “Watch: Watch Links Default”.)

 

Now, let’s resolve “B”:

 

Create five switches…hidden switches.  Now, decide on a time limit…say, 5 minutes, or, 300 seconds.

 

Knowing the number of seconds is VERY IMPORTANT!

 

In order for this to work, we must divide the number of seconds by 4.  300/4 = 75.

 

Now, lower the grid size (or raise it) accordingly, and create a blueroom 75ft wide, and say, 20ft long.

 

At the far end, create an EmitTrap, pointing across the room (so it has 75ft to go in a straight line until it hits the wall), and nestle the EmitTrap in a “fill air” hole so that it’s end just reaches the edge of the blueroom.

 

Open up the EmitTrap’s properties, and Add>S>Scripts and add the script: ReloadTweqEmit.

 

Next, create a button, and nestle it in another “fill air” hole DIRECTLY across the room from the EmitTrap…the DIRECTLY part of this is VERY important.  The EmitTrap and Button must be in a STRAIGHT LINE!

 

Read “Emit Traps”.

 

Open up the EmitTrap’s Tweq>Emit property, and make sure the projectile is “gasarr”, and that the firing speed is “0.25ft/sec”.

 

Light up the blue room, and rig a button to the EmitTrap, and experiment until the EmitStreamTrap fires a gas arrow towards the far button at one-quarter foot per second.

 

Now, everyone knows…of course, that arrows hit buttons and activate them…right?  Well…if you didn’t know that, they do.

 

So, why didn’t we use a broadhead?  Because broadheads fall as they fly!  Gas arrows and fire arrows don’t…we chose gas arrows over fire arrows because they don’t have so many particle attachments, which means they gobble up less precious object IDs.

 

Now, we need a servant.  Place the servant well away from our little arrow set-up, and rig him up with a conversation (See “Conversations”).

 

Create an Inverter, and link the button the arrow is destined to hit to the inverter.  Now link the inverter to all 5 of your hidden switches.  Also create a RequireAllTrap.

 

Link all 5 of your switches to the EmitTrap, also, link all five switches to the RequireAllTrap, and link the RequireAllTrap to your secret “thing” (use an Inverter if necessary).

 

Next link all 5 of your switches to the conversation.

 

Set-up the conversation to delete the links from the switches to the EmitTrap, and to destroy the links from the switches to the conversation.

 

Rig up ANOTHER conversation, with the same guy, to re-add the same links!  Link the button the arrow triggers to this conversation.

 

Create ANOTHER servant, with another conversation, and link the RequireAllTrap to this conversation, make this conversation add the MetaProperty “FrobInert” to THE button, then make the next step (I mean step, not action, step) to wait 300000 (that’s 300 seconds * 1000 milliseconds per second), then remove the property FrobInert (this remove metaprop action should be action 00 in step 02)…this is so that the arrow fired when the first switch was flipped on, won’t undo all your switch flipping once you’ve succeeded in flipping the switches.

 

There!  The secret of “Undercover” is out!

 

Assassins-Style Missions

 

Assassins is, without a doubt, one of the most complex OMs.

 

Want to know how you can do a similar mission?

 

Good, I thought you might!

 

First, create a room, with your StartingPoint, a man behind a counter, some weapons, a window, and a shadowy area outside!

 

Hide a ThiefBow in the shadows outside, and change his name to “Assassin”.

 

Next, add the metaproperty: “M-CannonFodder”, to the man behind the counter, this will make it so that one shot will kill him!

 

Read “EmitTraps”.

 

Create an EmitTrap, and nestle it in the window pointing at the man behind the counter, set it’s projectile to “broadhead”.

 

Find “BoundsTrigger”, in the “Fnord” section of the hierarchy, and place it near the StartingPoint…resize it to 8x8x8, and make sure that it completely contains the StartingPoint!

 

Create an Inverter.

 

ControlDevice link the BoundsTrigger to the Inverter which you should link to the EmitTrap.

 

Next, add AI>AI Core>Team Tag: Neutral, to the man behind the counter.

 

Go in-game.  Notice as soon as you move, an arrow kills the man behind the counter.

 

Next, create a bit of a city, and create a little house.

 

Add TrolPts and LookBackPts along the way to the house, and AIPatrol link them.

 

Read “VOTraps”.

 

Place a VOTrap in the middle of the shop, and SoundDescription link it to “garm0506” (“That shot was meant for me”), create another VO, linked to “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”), another VO, linked to “garm0501” (“So these are Ramirez’s boys, I think it’s time I dealt with Mr. Ramirez once and for all!”), then, last but not least, a fourth VO, linked to “garm0505” (“Damn, I guess I lost their trail”).

 

Next create four buttons in a blueroom, give them all specific names, and link them all to an appropriate VOTrap.

 

Okay!  That was long, and arduous, but it’ll be worth it once you see the fruits of your labours!

 

Create two QVarTraps, and some objectives (read the “Objectives” series).

 

The objectives should be (“Get 5000 loot in picked pockets” (No Type) “Follow the Assassin” (No Type, Final, Invisible))

 

Name the first QVar: “Succeed”, and the second “Fail”.

 

Set them up so that one makes your objective (the second one) succeed, and so that the other makes your objective fail.

 

Create two RelayTraps, and a DestroyTrap.

 

Link each the fail Relay to its appropriate QVar (but DON’T link the succeed Relay to its QVar), and link the Relays to the Destroy, and link the DestroyTrap back again.  So each Relay is linked to one QVar and the Destroy, and so that the Destroy is linked to both RelayTraps (all links are ControlDevice).

 

Now, create ANOTHER button (“QVarButton”), and link it to “Succeed”.

 

Create two more QVars, and set one up to mark the initial objective “inactive”, and set the other up to show the second objective.

 

Link one blueroom button (“HideandShow”) to them both (ControlDevice).

 

Next create a blueroom button for each Relay, give it a sensical name (“SucceedButton”, and “FailButton”), and link them to the appropriate RelayTrap.

 

Now create four servants in the blueroom.

 

Read “Conversations”.

 

Rig the first servant up with a conversation, make him actor one, create a RelayTrap, and a DestroyTrap.

 

Link the RelayTrap to the DestroyTrap (ControlDevice), and vice versa.  Then link the Inverter to the RelayTrap, and link the RelayTrap to the conversation.

 

Setup the conversation as follows:

 

STEP 00:

 

Action 00:                                                    Wait

                                                                    Actor One

Arg1:                                                           1000

Arg2:

Arg3:

 

STEP 01:

 

Action 00:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           X (The button linked to the “That shot…” VO)

Arg2:                                                          

Arg3:

 

Action 01:                                                    Add/Remove MetaProperty

                                                                    Actor One

Arg1:                                                           Add

Arg2:                                                           M-DoesPatrol

Arg3:                                                           Assassin

 

Action 02:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           HideandShow

Arg2:

Arg3:

 

Action 03:                                                    Wait

                                                                    Actor One

Arg1:                                                           1000

Arg2:

Arg3:

 

STEP 02:

 

Action 00:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           X (The button linked to the “These creeps…” VO)

Arg2:

Arg3:

 

Read “Sources and Receptrons”.

 

Create a new stim called “FollowingStim”.

 

Save your gamesys and mission, then re-start DROMED.

 

Add a source for the FollowingStim to “Assassin”, make the propagator “Radius”, and make it radiate 50ft in all directions…DON’T make it raycast.  Make it fire 1.5 times per second (750).

 

Create a conversation for the second servant; rig it up to a button (“TimerConvButton”).

 

Then rig up a conversation for the third servant, link a new button (“FailConvButton”) to it, and then set-up the second servant’s conversation like this:

 

STEP 00:

 

Action 00:                                                    Wait

                                                                    Actor One

Arg1:                                                           1000

Arg2:                                                          

Arg3:

 

STEP 01:                                                     Frob Object

                                                                    Actor One

Arg1:                                                           FailConvButton

Arg2:

Arg3:

 

Then setup the third servant’s conversation:

 

STEP 00:

 

Action 00:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           X (The button linked to the “Damn…” VO)

Arg2:

Arg3:

 

STEP 01:

 

Action 01:                                                    Wait

                                                                    Actor One

Arg1:                                                           2000

Arg2:

Arg3:

 

STEP 02:                                                     Frob Object

                                                                    Actor One

Arg1:                                                           FailButton

Arg2:

Arg3:                                                          

 

Another conversation, for the fourth servant, to be activated by the succeed RelayTrap:

 

STEP 00:

 

Action 00:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           X (The button linked to the “So these are…” VO)

Arg2:

Arg3:

 

Action 01:                                                    Wait

                                                                    Actor One

Arg1:                                                           2000

Arg2:

Arg3:

 

STEP 01:

 

Action 00:                                                    Frob Object

                                                                    Actor One

Arg1:                                                           QvarButton

Arg2:

Arg3:

 

Open up your object hierarchy, and add a receptron to “Garrett (-2099)”, for the “FollowingStim”.  Set the response to be “Stimulate Object” and set the target to: “Source”…it’ll ask what stim we’re stimulating what with, we’re stimulating: “Source” with: “FollowingStim”.

 

Add a receptron to “Assassin”, for the FollowingStim, we want him to frob “TimerConvButton”.

 

You might ask why we’re not having Garrett himself frob the “TimerConvButton”.  That’d get REALLY complicated, seeing how Garrett could (theoretically), end up frobbing two things at once!

 

It’s simpler to go with this setup, so that we know there’ll be no conflicts!

 

Last, but not least, create a marker at the door of the house you’ve set up “Assassin” to go into.

 

Read: “The Infamous AIWatchObj Link”.

 

Create an “AIWatchObj” link from “Assassin”, to the marker.  Set up a VERY low radius, and a height of “8”.  Set the reuse delay to “5000”, don’t worry about kill or no kill, or “kill like links”, leave them unchecked.

 

Set action 00 to frob the “SucceedButton”.

 

Make sure that there’s one TrolPt INSIDE the house.  Rig up the “Assassin” with an AIWatchObj link that that TrolPt, then read “TeleportTraps”.

 

Place a TeleportTrap in a NEW blueroom, and rig it up to “TeleButton”.

 

Make the AIWatchObj link trigger when the “Assassin” comes near, and make the response be to frob “TeleButton”, link the TeleportTrap to “Assassin”, with a ControlDevice!

 

The last step is to add an alert response to “Assassin”.  Level 3, Absolute, Frob Object: “FailButton”.

 

You can alter this example!  Everything makes sense once you look at it:

 

Off the start, Garrett moves, the Emitter fires, and a conversation begins.  After a short delay (Garrett has to be able to think before he speaks), Garrett says: “That shot was meant for me!”, then, after another delay, the Assassin walks off.  Then, after another short delay, it’s “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.” (Hence the Alert Response for “Assassin”), and new objectives.

 

The “FollowingStim” emanates from the Assassin, and whenever Garrett receives it, he stimulates the Assassin, who, in turn, frobs a button, starting a conversation.

 

You’ll remember, from the “Conversations” section you were instructed to read, that whenever an AI receives a conversation, he/she terminates whatever conversation he/she was participating in (if any).

 

Since the FollowingStim pulses 1.5 times per second, and the “TimerConv” waits one second before failing the mission, the mission won’t fail unless Garrett leaves the radius around the Assassin (50ft).

 

If Garrett succeeds in tailing the Assassin back to the house, the Assassin will frob and button to succeed the mission upon entering the front door.

 

Thanks to our unique RelayTrap/DestroyTrap setup, frobbing the “SucceedButton”, will destroy the relay, so no matter how many times the servant in “FailConv” frobs the “FailButton”, the ControlDevice signal will never reach the appropriate QVar, and as such, Garrett succeeds!

 

Probable alterations: If you’re using this in a REAL mission, you’ll probably want to change the fourth servant’s conversation around a bit, so that while succeeding a mission objective, several more are added.  In this setup, we have a “Wait” for 2 seconds so that the schema can finish before the mission ends in success.  Normally, the “QVarButton” would be linked to several QVars, one to succeed the “following” objective, and several more to reveal additional objectives…therefore, you wouldn’t want a delay, you’d want the comments, and succeeding/unveiling to happen simultaneously, therefore the “Wait” action wouldn’t be there, and the “Frob Object: QVarButton” would probably be STEP 00: Action 01.

 

You’ll probably want more assassins…if this is the case, have them stay together, have them BOTH have the fail mission alert response but have only one radiate the “FollowingStim”…it’s just easier that way.

 

You’ll probably want the first servant’s conversation to end BEFORE M-DoesPatrol is added, so that the assassins (you’ll probably have multiple) can have a very informative chat…otherwise it looks fake.  In this instance, instead of having the servant make Garrett say: “These creeps…” and have the assassin walk off, you’d have him frob a button which starts a conversation in which the assassins are the actors.  Then, at the end of the “AssassinConv”, you’d have the Assassins add M-DoesPatrol to themselves, then have them frob the button which unveils/inactivates the objectives and makes Garrett speak.

 

You’ll probably want to fiddle with the radius of the “FollowingStim”.  Maybe your city map has short streets, making it easier to tail closer, so you’ll set the radius down to 30ft…maybe you have long streets, and want Garrett to stay 70ft from the Assassins?

 

Readable Items

 

Making an item readable is fairly easy.  There are three things that are of concern:

 

The script:                                                    StdBook or StdScroll

FrobInfo

Art

Text

 

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…but I wouldn’t worry about that happening, because all the OM books have the prefix “mX”, where “X” is the number of the OM.  Since your mission HAS TO BE a number around 20, even if you use this convention, you’ll have “m20goblet”, rather than “m10skull”, which would overwrite the text from the plaque above the Skull of St. Yora, in Undercover.

 

Now, take note that all book files must be *.str, you can create them using NotePad.