Spike14’s
Complete
DROMED
Tutorial
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:
|
|
Click on a heading to go
there
Garrett’s Inventory and
Weapons
Triggering From Inventory
Frobbing
The Player and the
StartingPoint
U, V, and Scale – Aligning
Textures
How to Get Effects Started at the Mission’s
Beginning/Loops
Objectives: Don’t Alert
Anyone
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
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”
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.
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!
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!
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.
Okay. First, let’s tackle the little problem
of realizing the textures!
If you look to the center-bottom
of your DROMED window, you’ll see a picture of this funky texture called:
“Jorge”. Now, if you hit Alt+T,
you’ll bring up the “Texture Palette”, which is where all the loaded textures
are kept.
When the palette appears, there
will be one texture: “Jorge”, and four buttons: “Sky”, “Put on Brush”, “Remove
from Level”, and “Done”. Let’s see
what each of these five buttons does.
Jorge – This is a texture, click
this and click “Put on Brush” to put the texture on the selected brush
face.
Sky – This is the sky
texture.
Put on Brush – This button puts
the selected texture on the selected brush face.
Remove from Level – Remove the
selected texture from your level.
Done – Closes the
palette.
Okay, now we need more
textures! Click in the command
window and type: “add_family core” (no quotes), then hit ENTER. Now at the bottom of your screen it
should say: “Family Loaded”. Now
hit Alt+T and you’ll see that tons more textures are
available!
Now, it’s good to know the
command to load a texture family, which is “add_family XXX”, but it’s easier to
use KoMaG’s custom menus to our advantage.
Click “Textures 1” and hit “Rescore”. This will load the texture family
“Rescore” into the palette. Now, if
you don’t like a texture family, and want to get rid of it, type “remove_family
XXX” into the command window and hit ENTER.
Now, let’s say you’ve loaded two
or three families, but you’ve only used a couple textures from each. Now, you’re palette is nearly full, and
you need more textures! Oh no! What’ll you DO!
Merely type the following in the
command window and hit ENTER: “compress_family all”. There, now if you open your palette,
only the textures used in the level will be there! Feel free to load another
family!
Now, there’s something VERY
IMPORTANT that we must do before we go any further. Our level won’t work properly if we
don’t load the scripts! So, type
(in the command window): “script_load convict” and hit ENTER. At the bottom of your screen you should
see: “Module Loaded”. We’ve now
loaded all the scripts Thief uses into your level. There, now we’re free to go
on!
Note: GayleSaver’s Custom Scripts
are not covered by this tutorial.
Okay, now we’ve
learned hotkeys, learned about textures and objects, brushes also, we’ve also
covered creating 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?
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.
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?
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”.
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!
You may or may
not have already tried resizing an object…and failed. If you resize a
Physical-Furniture-Tables-Table to, say 60x20x3, you can walk straight through
most of the table!
Aah!
Don’t
panic…like most things, there’s a quick solution!
Open up the
table’s properties, and adjust Physical-Dimensions, and adjust these values to
the appropriate setting!
Please note
that DROMED treats all objects as squares…which is why they appear this way
on-screen!
By now, you’re
probably REALLY angry at me, because your level is MUTE. That can be rectified! Select each of the brushes in your level
in turn and press Shift+Insert. 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.
Save
often! Create a directory inside
your “Thief” directory named after your mission. Every time you save, save under a
different number. Say your mission
is called “BaffTaff” (which my mission is), save like this “BaffTaff_1.mis”,
“BaffTaff_2.mis”, on and on…
How, you
wonder, does something become a door?
Well, first it needs a script, then it needs a
property.
Let’s explain
it!
Create a
BaffBanner. It’s in the decorative
archetype. Now, let’s turn this
simple BaffBanner into an opening-closing rotating door.
Open the
properties, Add-S-Scripts. Type
“StdDoor” in the first box, then hit ENTER.
There, that’s
your script. If you want the door
to be locked, and have lock sounds, add another script in the line below. “LockSounds”, there, that wasn’t so
hard!
Now, the
property!
Add-Door-Rotating.
This box may
look daunting, but we don’t want much out of it! Door speed interests us, open angle and
closed angle interest us, Clockwise?, and Axis interests
us.
The clockwise?
check box is fairly straightforward!
If you want the door to open clockwise, check it, if you want it to open
counterclockwise, uncheck!
Now, axis. The default is Z-axis, change it if it
suits you!
The open angle
is relative to the angle the door is at.
So if the door’s heading is 70, the open angle will be 70+it’s
value. If the door opens
counterclockwise, the open angle should be 90, if it opens clockwise, the open
angle should be 270. Closed angle
is usually 0.
Now, implement
all this, and hit ENTER.
Now, there’s
one more property we need. We need
to tell DROMED that we want the StdDoor script to activate when the banner’s
frobbed. So, Add-Engine
Features-FrobInfo. It’s all set to
[None]. Change WorldAction to
“Script” by checking “Script” in the drop-down menu.
There, go
in-game and try it out…it works, doesn’t it?
Now, create a
bed. Now, make sure you don’t use
the “Bed” archetype, because those crash DROMED. Use “BedParts”, those
work!
Now, add the
“StdDoor” script, “LockSounds” if needed, and add the FrobInfo. Now, here’s the uniqueness of a
translating door!
Add-Door-Translating.
This dialog is similar, but not the
same. The axis’ work the same, but
there’s no “Clockwise?”. The closed
value is usually 0, and the open value is how far along the chosen axis you want
the object to slide before stopping.
If you want the object to move the opposite direction, use a negative
value.
There, check it
out! Wonderful stuff,
huh?
Switches and
Buttons are special objects that are used in many instances to create
effects. They emit ControlDevice
signals. Buttons emit one-type of
ControlDevice signal (“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?
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!
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.
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.
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!
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.
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, 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.
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.
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 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.
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 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?
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.