More Tutorials

Created 7/27/02

Extracting Tiles, Entities, etc.

How to Create a New Ammo Type

NPC's Conversing With Each Other

Add Text To Debrief Text List Trigger

Red's Level Editor Tips

Creating a New Recruit For Single Player Game

Triggering A Force Speech

Light Entities

Names & Descriptions

Lights & Other Turn-Ons


Turning Off Alarms With a Switch

Enemies Reacting to Alarms

Random Map Terrains

Light Intensity Strings

Extracting Tiles, Entities, etc.

For the editors to work they require some resources to be extracted from the
data files for fallout tactics.

It is recommended you extract the contents of the following files:


If you have the hard drive space you may want to extract all of the .bos files.

The easiest way to extract them is to use WinZip:

1) Launch WinZip
2) Drag-drop the .bos file from explorer into the WinZip window.
3) Do not select any of the files
4) Press the extract button on the toolbar
5) A dialog should appear. Make sure use folder names is checked. Make sure
the output directory is the core folder inside your tactics install path.
6) Press extract.

If you repeat this process for each of the .bos files mentioned above, you
should now be able to access the tiles and entities and campaign from the

How To Create A New Ammo Type - OTB

First, head to the files section of the site and DL "BoSEE", which is what you'll need.

Here's what you need to do:

1) Create ammo and weapon entities that you're going to use w/your new ammo type. It doesn't matter what you set the ammo to, since you're going to change it anyway.

2) You will have to have unpacked the various text files that FoT reads for non-hard-coded information. The file you're looking for is called "ammo.txt" and is located at the following address:

C:\Program Files\14 Degrees East\Fallout Tactics\core\locale\game

3) In this file you will see entries like this:

{name_Needle} = {Needle}

You will need to come up with something to call your new ammo type. Since ".45" is used for the standard .45 (i.e. ACP) in the game, you can simply use:

{name_.45C} = {.45 Colt}

4) Open the ammo entities and weapons that you want to set to this type of ammo with BoSEE and change the ammo field to whatever is in the "name_" portion of your ammo.txt file.

Warning: Once you save the file using BoSEE, you cannot modify it with the standard entity editor w/o setting the ammo type to "None". In other words, if you want to modify the entity, you will have to make whatever changes you want to make, then re-modify and re-save the entity using BoSEE.

BTW, if you're planning on making a mod for distribution, I recommend using the "-path" option on the run command. This way you won't force people to copy-'n'-paste all sorts of files to play your mod.

Last, but not least, I have to get up on my cartridge nomenclature soapbox. There is no such cartridge as ".45 Long Colt". It's actually just ".45 Colt", but it's been misused for so long that even Colt brochures list it as ".45 LC". (Source: Lyman's Handloading Manual).

NPC's Conversing With Each Other - OTB

There is a way that you can simulate NPCs chatting w/one another w/o the headache of scripting the conversations.

The answer is actually quite simple. Compare the following two speech nodes:

D02_WSPR01_A00 = {This wind is getting on my nerves...}
D02_WSPR01_A01 = {This is just *too* boring...}
D02_WSPR01_A02 = {I could go for some more chitlins.}
D02_WSPR01_A03 = {As if anyone would have the nerve to attack this place...}
D02_WSPR01_A04 = {Better check your weapons.}
D02_WSPR01_A05 = {::belch:: Yep, those chitlins were good...}

D02_WSPR02_A00 = {It is a bit breezy...}
D02_WSPR02_A01 = {It like it when it's boring...}
D02_WSPR02_A02 = {The mess hall certainly made enough...}
D02_WSPR02_A03 = {You never know...someone could be watching us right now.}
D02_WSPR02_A04 = {But I just checked my weapons when we came on shift.}
D02_WSPR02_A05 = {::fans air:: I hate the effect chitlins have on you...*gag*}

Basically, each line within a node is related to the identical line in its sister node. These two nodes are each for one roving guard, and in practice, they ---- far more often than not ---- will look like they are having a conversation. This is, however, not foolproof, so you might not want to have lines that sound odd if they happen to be seen out of context.

Add Text To Debrief Text List Trigger - Endocore

In the past I've always just used a "world text display" for my debriefings, but due to the nature of the story in the map I was working on I decided to try to take advantage of the more flexible/generic way the normal FOT campaign generated many of its debriefs by use of the "Add text to Debrief text list" trigger. Anyone wanting to take advantage of this trigger who has never used it before would profit by looking at the triggers and speech file for Mission 6 (Quincy) of the regular campaign and exactly following the implementation MF used there. I initially had placed several of the "Add text to Debrief text list" triggers in amongst my other scripts to add relevant lines to the debriefing as the events that called for them actually happened in scripting terms, but this turned out to be a big mistake since the game was unable to "remember" any of these debrief lines being added and would only display in the debriefing the debrief lines for the last two or three objectives accomplished, leaving out the parts that had been triggered earlier on. Needless to say, this was very bad because in order to experiment with this I had to keep going all the way through the entire (rather lengthy) mission and accomplishing all the objectives in various orders to try to figure out what was happening, and risked introducing new errors into map because I had to delete so many opponent entities in order to speed up the tests that once I finally worked out some scripts for the debriefing that worked, I had to write them down on a piece of paper and enter them into the "real" map (always have a backup file) from there since the map used for experimenting on this stuff was no longer recognizable.

Use of the "Add text to Debrief text list" trigger seems to require that all possible lines of text one might want to use in the debriefing be triggered only after the player has completed the mission and has all their characters at the exit grid for the map. Any use of this trigger to add text to the debriefing before the player has all his characters at the exit grid runs the risk of having that text forgotten at debriefing time, apparently overwritten by later texts added to the debriefing.

Let's say you had a smallish map where the player had to 1)rescue some hostages from some gunmen, and 2)defuse a bomb that was going to blow up a building. There would then be four possible outcomes of your map that you would want to discuss in the debriefing, so you would put four appropriate lines in your mission's speech file:

hostagessaved = {You saved the hostages. You're an epic hero who's loved by all women and respected by all men.\n\n}

hostagesdead = {I wouldn't trust you to make me a cup of coffee, you pathetic excuse for a soldier. The hostages are dead, and you're going to be court-martialed.\n\n}

bombdefused = {Let me present you with a hearty handshake for defusing the bomb and saving the headquarters of the Acme Telemarketing Corporation.\n\n}

bombwentoff = {Due to your inept clumsiness, the headquarters of the Acme Telemarketing Corporation were destroyed by the bomb. How will decent citizens ever find the will to live again if they're not able to enjoy their right to be constantly interrupted by telephone solicitors?\n\n}

In order to utilize these lines of text in your debriefing, they all need to be tied to a variable that is set only when the mission is over, the exit grids have been turned on, and the player has all their remaining characters at the exit grid ready to leave the map. In the example mission I've set up for this discussion, then, a minimum of eight lines of script would be required to make a debriefing that was responsive to what happened in the mission.
1) Mission Set-Up


Set variable missionover to False
Set variable hostagesrescued to False
Set variable bombingstopped to False
Set variable finallyfinished to False

You'd then have all your normal scripting to determine what actually counted as saving the hostages and defusing the bomb, etc. Once both objectives were either accomplished or flubbed, the player would be prompted to head for the exit grid since there was nothing else to do in the mission.


2) Almost End of Game

Player 1 [the PC's] has all alive at exit grids

Set variable missionover to True


3) Hostage Situation Result 1

Variable missionover is True
Variable hostagesrescued is True

Add text 'hostagessaved' [from your entry in the mission speech file above] to Debrief text list at position: 0 [this will be the first thing talked about in the debriefing]


4) Hostage Situation Result 2

Variable missionover is True
Variable hostagesrescued is False

Add text 'hostagesdead' to Debrief text list at position: 0 [the point is that whatever happened to the hostages, it will be talked about first in the debriefing]


5) Bomb Situation Result 1

Variable missionover is True
Variable bombingstopped is True

Add text 'bombdefused' to Debrief text list at position: 1 [after the hostage situation has been discussed, the debrief will move on to talk about the bomb situation]

6) Bomb Situation Result 2

Variable missionover is True
Variable bombingstopped is False

Add text to 'bombwentoff' to Debrief text list at position: 1

And finally we have the really odd part which makes no sense at all that seems to allow the whole thing to work properly:


7) Are we done yet?

Variable missionover is True

Set variable finallyfinished to True


8) Player gets to leave the map

Variable finallyfinished is True

B Display Debrief window and text
B Wait 1 second
B End Mission (Main Menu)
Maybe it's just me, but having to include trigger #7 just doesn't make any sense since it seems to serve no useful purpose whatsoever. Nonetheless, that's what I had to do to get my custom debriefing triggers to work.

The original way I tried to use the trigger "Add text to Debrief text list", which was an absolute failure, and I want to show only so mappers can know what NOT to do, was along the lines of what's below. In order to simplify things a little, we'll say that the first map was too long and we cut it down to size by only requiring the player to save some hostages. Once again, this is what NOT to do:
1) Mission Set-up


Set variable objective1done to False


1) Hostages saved

Bad guys has less than 1 alive at anywhere
Hostages has more than 0 alive at anywhere

Set variable objective1done to True
Add text 'hostagessaved' to Debrief text list at position: 0

2) Hostages not saved

Hostages has less than 1 alive at anywhere

Set variable objective1done to True
Add text 'hostagesdead' to Debrief text list at position: 0

3) Mission complete

Variable objective1done is True

Turn exit grids on

4) Time to leave

Player Human [PC's] has all alive at exit grid

B Display debrief window and text
B Wait 1 second
B End mission (Main Menu)

Red's Level Editor Tips

Tip 1: Drag and drop the fps counter somewhere else. Underneath is hidden a neat little white box. Click on that to choose the (another) background color.

Tip2: You can right click on the "level bar" to disable (and re-enable) specific levels. This is great when the Roof Popping and Occlusion just won't do the job.

Tip3a: You can make tilesets which contain the same tile more then once.
The only restriction (within the FO:T editor) is that you need to select an alternate tile to add it to the list. This is great to create "random" floors for desert. You choose the normal desert tiles say 80% of the time, and the "feature tiles" (with small rocks and such) fill up the rest of the tiles. This REALLY looks MUCH better then doing it manually and/or not doing it at all (the last of which can make a map really ugly).

Tip3b: Instead of making the tilesets within the editor which doesn't even save them correctly), first make a tileset with all the tiles you'll plan to use, then save it. Open it in your favorite text editor (I recommend UltraEdit) fix the quoting problem (you either need to add them or remove them I don't remember), and copy-paste the appropriate tiles the number of times you want it represented in the tileset (say you want 80% sand, have 20 tiles "with features", and 8 tiles "with normal sand", then copy paste the sand tile list 10 times to get the ratio... you get the idea, I hope :).
Load the tileset, and use it.

Creating A New Recruit For Single-Player Game - OTB

Here's what you'll need to do:

(I'm assuming that you have unpacked your BOS files for this.)

- Create an ENT file for the recruit using the Entity editors that came w/the v1.27 patch. Save it in the "recruits" folder under "entities".

- Open the characters.txt located at:

C:\Program Files\14 Degrees East\Fallout Tactics\core\locale\game

Here you will want to add two lines:

name_[whateverYourCharacter'sDisplayNameIs] = {Character'sName}
desc_[whateverYourCharacter'sDisplayNameIs] = {Character'sBio/Story}

- Place that entity in Mission 01 (Brahmin Wood) using the level editor. Set the "Player Index" to "1" for your recruit.

- Open the campaign.txt file located in:

C:\Program Files\14 Degrees East\Fallout Tactics\core\tables

Here you will have to add a line under "RECRUIT POOL DEFINITIONS". It will have to have the following format:


If you want to have your recruits show up later, just change the numeric portion of the "mission00" entry to the number of the mission you want them to be available after.

- Now, using the campaign editor, open the file, and go to the Tools tab and click on "Import Recruits". Save the changes to the CAM file.

Don't worry about backing any of the file you're modifying up. If you dork something up, you can always go and re-extract that file.

Voila! You are now ready to rock and roll w/your new recruit to serve at your side.

Incidentally, I will say that Brahmin Wood isn't much of a challenge w/more than 3 characters.

Triggering Force Speech - Max Violence

In order for 'Force Speech' to work when triggered by a speech occurring, one must make sure that either:

A) There is no 'event' tied to the speech that will be forced, and/or

B) There is a Wait action (B Wait 1 second(s) ) before the Force Speech action.

I'm not 100% certain that B) works 100% of the time (I'd guess 75%-75%), but I am sure that A) works (at least, it did for me :) )

Note: If the above isn't true, than the game will freeze when the 'Speech Occured' event is triggered.

Light Entities - Ed Orman

- Light entities are used to light specific points in a mission map.
- The light emanates from the base of the light entity image, so if you have a torch half-way up a wall, the light entity should be at the same height.
- For examples of lights and their settings, open any of the Single Player tactics maps.

Animation Rotation
- This is only useful if the light has an Arc set (see below).
- There are eight steps of rotation, from 0 (facing North, the top left corner of the screen) to 7.

Night Only
- Means the light will only appear during the game's night hours.
- Most outdoor lights should be tagged as night only.
- Useful for campfires and torches which shouldn't be illuminating anything during the day (this can cause washing out of the color in tiles).

[Note: a light with the "Night Only" tag will still illuminate shadowed areas within its radius during daylight hours. -OTB]

- The radius (in meters) of the lights total range.
- This includes the fall-off range.

Rate of Change
- How quickly the light changes from one intensity setting to another.
- The speed should never be smaller than 60-100 (it's in milliseconds).
- Anything smaller, and the rate of change will be so fast that you'll start slowing the game down (a light can "dirty" a large chunk of the screen at once, and this chunk has to be redrawn).

Intensity String
- The intensity string allows you to control the brightness of a light. "a" is the brightest", "z" is the darkest.
- By typing in multiple letters (no spaces) like this "aejejpa", the light will change through different levels of brightness.
- Useful for flickering campfires, broken lights, etc.

- Use this to set the color of your light.

Use Arc
- Tick this box if you want the light to illuminate in a certain arc.

Arc (degrees)
- Specify how large an arc you want the light to illuminate.
- By default, this arc is centered to the North. To change the direction of the center of the Arc, change the animation Rotation field at the top of the entity.

High Bound
- How high the light will illuminate (in meters).
- If you're having a problem with lights showing through from the floor below, set this to 1.

Low Bound
- How low the light will illuminate (in meters).
- If you're having a problem with lights showing through from the floor above, set this to 0.1.

Use Fog
- This allows a light to become a volumetric fog entity.
- This means that instead of illuminating, the light will obscure an area.
- Fog can be intensive.

Fog Alpha
- The intensity of the fog.
- Very sensitive. A setting of 0.25 is usually adequate.

How to turn a light On/Off
- First you need to tag some lights, for example LIGHT_GEN. Then you need a trigger that executes at the start of your mission:
(Condition: Always) (Action: Set Object Script State, Set Unit: LIGHT_GEN, Object State: ). Leave the Object State: field blank. This will initially turn the light off.
- When you want it on, create another trigger with:
(Action: Set Object Script State, Set Unit: LIGHT_GEN, Object State:TICK).
- This time, the Object State: field is ticked. This will turn the light on.

Names & Descriptions - OTB

Enter the entity's name under "Display Name". Then you will have to make identical entries in the characters.txt file prefaced by "name_" and "desc_" for the name and story for the character (or name and description for an item, although that goes in the items.txt file).

For instance, enter "rec_hm01" in that field for a recruit, then enter the following in the characters.txt:

name_rec_hm01 = {Max}
desc_rec_hm01 = {Max wanted to be a scribe and spent his formative years training to maintain vacuum tubes and read punch cards. Then, later he discovered his lifelong love of explosions, and added traps to his repertoire.}

Whatever you enter in "Custom Name" overrides the "Display Name" field.

Lights and Other Turn-Ons - OTB

In order to have lights that turn off and on using a switch, you will have to do the following:

Set up a new trigger, name it something meaningful, then:


Object script state of [Tag Name of Switch] (ticked/checked)


Set Object script state of [Tag Name of Light(s)] (ticked/checked)


Object script state of [Tag Name of Switch] (unticked/unchecked)


Set Object script state of [Tag Name of Light(s)] (unticked/unchecked)

Make sure that both of these triggers have "Preserve" ticked/checked, otherwise you will only be able to turn the lights on and off once each.

Now, for your other problem, its similar to the previous one.

Trigger 1


Object script state of [tag name of switch] (ticked/checked)


Set Object script state of [Tag Name of Alarm] (ticked/checked)
Open/Close Door [tag name of door] (ticked/checked)

Trigger 2


Object script state of [Tag Name of Alarm] (ticked/checked)


B Center view for Player (WhateverYouNamedPlayerIndex1) on [tag name of alarm]

Play alarm.wav centered on [tag name of alarm]

The "B" in the action indicates that you have ticked/checked "blocking" which means that the next action in sequence will not be executed until that one has been.

From here you should be able to get what you want done, although you'll have to extrapolate a bit from my examples.

Note, that you can also set up variables which are tripped when Object Script States are changed. These variables can in turn be used to set guards to come investigate by setting them to Waypoints, change lighting to red emergency lights, etc., etc.

Variables - OTB

Variables are actually pretty simple. Just set up a trigger that will set up all of your mission variables for you right at the beginning. Do this by setting up a trigger (I usually call it something like "Mission Variable Initialization", but you could call it "Purple People Eaters R Us" if it floats your boat) that has the condition "Always" and then the Action "Set Variable".

Now you have to come up with something to call that variable and decide to set a value. (Usually True or False are used.) Be very careful when you set up your variables and every time you set up a trigger that depends on those variables. I say this because variable names are case sensitive and if they aren't exactly alike they will not execute. (The other morning I was about to pull yet more of my hair out after almost an hour of dorking around...all because I had failed to capitalize one letter...)

Once you have all of your mission variables set up you can set triggers up based on them.

For instance, you could set up a mission variable "alarmSounded" which has an initial value of "False". Then you can set up another trigger that will change the variable based on if an alarm is sounded. It would look like this:


Object Script State of [tag name of alarm] (checked/ticked)


Set mission variable "alarmSounded" to "True"

Now another trigger could then be set up:


Mission Variable "alarmSounded" is "True"


Set Object script state of [tag name of red alarm lights](checked/ticked)
Set Object script state of [tag name of normal lights] (unchecked/unticked)
Set Player X to Waypoint at "guardInvestigates" (which could be the tag name of a series of waypoints that lead a couple of guards into the area)

Turning Off Alarms With A Switch - OTB

To turn the alarms off when the switch turns off, just do the same thing w/the alarm-related triggers that you did w/the lights. That is, you have to check/tick "Preserve" and have Object Script State settings for both ticked/checked and unticked/unchecked settings.

Enemies Reacting To Alarms - OTB

I've been screwing around w/having enemies react to alarms and here are two neat little tricks I've come up with for when you'd like to have a bunch of sleeping individuals come barreling out of a building/bunker/whatever when an alarm is sounded:

1) Set the sleepers to different player indexes.

a) Have an alarm set to one of the player indexes of the sleepers and give it a tag name as well. That index will be automatically awakened by the alarm.

b) Set up a trigger that depends on the object script state of the tagged alarm that will trip one tagged alarm for each of the other player indexes you're using. Hide the other alarms somewhere out of sight/perception range so that your squealers don't try to trip them.

An easier method:

1) Set all of your sleepers on the same index. Assign them different tag names based on where you're going to want them to go.

a) Set a trigger that depends on the object script state of the alarm (you'll beed it to have a tag name for this). Have that trigger set a variable to true or false.

b) When the variable is changed to true/false, you can have triggers that have the sleepers change player index according to where you want them to go.

c) Set the various player indexes you want to move to various series of waypoints, mobility and movement priority based on the situation.

Random Map Terrains - JJ86

I went through the landscape maps and catalogued them for future reference. It is also handy to use these as generic starter maps so you don't have to start building from scratch which is very useful for something complex like cliffs or canyons.

Mission Y01 - Rocky Desert
Mission Y02 - Rocky Desert
Mission Y03 - Rocky Desert
Mission Y04 - Rocky Desert
Mission Y05 - Rocky Desert
Mission Y06 - Rocky Desert
Mission Y07 - Rocky Forest
Mission Y08 - Rocky Forest
Mission Y09 - Rocky Forest
Mission Y10 - Rocky Desert Wastes
Mission Y11 - Rocky Desert
Mission Y12 - Rocky Desert Wastes
Mission Y13 - Rocky Forest Wastes
Mission Y14 - Swampy Forest Wastes
Mission Y15 - Rocky Forest Wastes
Mission Y16 - Rocky Swampy Forest
Mission Y17 - Rocky Swampy Forest
Mission Y18 - Rocky Forest
Mission Y19 - Rocky Forest
Mission Y20 - Rocky Forest
Mission Y21 - Rocky Forest Cliffs
Mission Y22 - Rocky Forest Cliffs
Mission Y23 - Tribal Village
Mission Y24 - Tribal Rocky Swampy Forest
Mission Y25 - Raiders Rocky Forest
Mission Y26 - Raiders Rocky Swampy Forest
Mission Y27 - Snowy Rocky Forest Cliffs
Mission Y28 - Snowy Rocky Forest Cliffs
Mission Y29 - Snowy Rocky Forest Cliffs
Mission Y30 - Snowy Rocky Forest Cliffs
Mission Y31 - Rocky Canyon
Mission Y32 - Rocky Canyon
Mission Y33 - Rocky Forest Cliffs
Mission Y34 - Rocky Forest Cliffs
Mission Y35 - Ruined City Streets
Mission Y36 - Ruined City Streets
Mission Y37 - Ruined City Rutted Paths
Mission Y38 - Ruined City Rutted Paths
Mission Y39 - Ruined Industrial Streets
Mission Y40 - Ruined Industrial Streets
Mission Y41 - Ruined City
Mission Y42 - Ruined City Rocky Desert

Light Intensity Strings - Max-Violence

Insanely pulsating loop:

Fast flicker:

Really fast flicker:

A flicker, a pause, a flicker, then another flicker:

Slow loop:

Really slow loop:

Really, REALLY slow loop:

1/2 power flicker:

full power double-flicker:

Fade to 1/2 power, then abruptly go off, then fade back on from 1/2 power:

Fade to 1/2 power, then abruptly go off, then fade back on from 0 power:

Fade to 1/2 power, abruptly go off (the fade starts quickly, then slowly gets slower):

Fade to 1/2 power then off. Start slow, speeds up:

Two double-flickers, the first at around 1/2 power, the second at around full power:

Expanded standard street light flicker:

Near-dead light (blinking):

A fading light that can't make up it's mind whether to stay on or stay off

Intensity Strings made by OnTheBounce:

Slight twinkling:

1/4 power drone, then a sudden "flicker of life," then back to 1/4 power drone: