EZ SCRIPT USER'S GUIDE
Version 3.208

By M25

 

Contents

What is this?

Installation

How to Play

Your First Mini-Mod

How to Get Your Mini-Mod to Use Talking Heads

Encounters

Linking Encounters Together

Villains vs. Minions

A List of Available Encounters

Cut Scenes

How Substitutions Work

Cut scene Commands

Maps

Doing more with maps: specifying where things appear

Special Encounter Markers

Making EZ Script Campaigns

What is a Campaign?

How to Get Started

Making a Mission

Making a Base Screen

The First Mission

Adding your missions to the campaign

Objectives and Experience

Special Encounters for Campaigns

Making Freeroam Campaigns in EZ Script

What is a Freeroam Campaign?

How to Get Started

Anthologies

Where and When do Encounters Appear?

Testing Freeroam Campaigns

Map making

Credits

Known Problems

 

What is this?

Have you ever wanted to make a campaign for the Freedom Force computer game, but couldn’t find someone to write python code for you?

EZ script is an attempt to bring mod-making to the masses.  EZ script allows you to write missions for Freedom Force vs. the Third Reich in a simple and intuitive way, rather than having to learn how to program in python.

 

Installation

EZ script now comes with FFX 3.2. Follow the installation instructions for FFX and you will have EZ script.

 

How to Play

So you’ve installed EZ script and you want to take it for a spin.  There are sample mini-mods included to show what the system is capable of, and hey, they’re fun too.

First find and run FFX shortcut.  You may have copied it to your desktop during installation.

Once the game is running, select the rumble room option.  In the list of game modes you should see ‘Mini-Mod Spy Games’.  Select it and you will then see a short list of maps compatible with EZ script.  Choose a map and click on the Next button.

Choose your hero squad as normally, click Next and you will be taken into the mission.  Have fun.

 

Your First Mini-Mod

Mini-mods are missions that run through the rumble room interface in Freedom Force vs. the Third Reich.  Each is a one-shot deal – that is, it contains a single story and does not continue into other missions like a campaign.  They are easy to make, easy to run and easy to swap with other owners of the game.  Even better, they can fully take advantage of the rumble room interface – allowing players to select their favorite heroes, villains and even maps to play on. 

How to get started:

You should have already installed the EZ script.  This guide assumes you’ve used the ffx3 directory.

Open up notepad or your favorite text editor. 

We’re going to start with a basic beat ‘em up with the hero taking on a group of thugs. 

First we need a name for our story.  Let’s call it Thug Busting.  Go to the text editor and add this line:

Story: Thug Busting

Every story in EZ script consists of a series of encounters.  An encounter can be anything from a conversation with one of Patriot City’s fine citizens, to an attempt to foil a robbery, to an all out brawl with several bad guys.  For our story, we’ve already decided that we want a brawl with a group of thugs. 

Each encounter needs a name (let’s call this one Thug Brawl) and a type.  The type of encounter determines the goals and objectives of the villains and heroes in the encounter.  For this encounter we’ll choose the type fight which represents a straight up brawl.

Encounter: Thug Brawl
Type: Fight

Next, we’ll need someone for the hero to fight against.  These go into the Villains: line in your encounter.  A note of caution:  EZ script is picky about what you enter as villains, allies, objects, etc.  These MUST match the name of the template for the character that you wish to use.  The template name is either the template given in the templates tab of ffedit, or the name of your hero file.  Capitalization, spacing, etc. are all important.

Let’s add three thugs for the hero to take on:  one with a gun and two with bats.

Villains: thug_with_gun, thug_with_bat, thug_with_bat

Finally, we’ll add a cut scene or two.  Cut scenes are the little cinematic touches that bring a story to life.  Each encounter type has a list of cut scenes that you can add and will play automatically at the appropriate times.

For the Fight encounter type, you can supply these cut scenes:

For the Alert cut scene, we’ll add an arrow to one of the villains, so that we can find them easily (good for testing purposes).

Alert Cutscene:
Red arrow on Villain

Once the hero reaches the fight, we’ll play the following cut scene:

Start Cutscene:
Camera on Villain1
Villain1 turns to Hero
Villain1 says, “Hey boys, look what just dropped into our neck of the woods.”
Villain2 turns to Hero
Villain 2 says, “Get ‘em.”

Finally, once the fight is over and the hero has rousted the villains, we’ll play this cut scene:

End Cutscene:
Camera on Hero
Hero says, “You should know that evil never triumphs.”

Once you’ve done all this, your text file should look something like:

Story: Thug Busting

Encounter: Thug Brawl
Type: Fight
Villains: thug_with_gun, thug_with_bat, thug_with_bat

Alert Cutscene:
Red arrow on Villain

Start Cutscene:
Camera on Villain1
Villain1 turns to Hero
Villain1 says, “Hey boys, looked what just dropped into our neck of the woods.”
Villain2 turns to Hero
Villain 2 says, “Get ‘em.”

End Cutscene:
Camera on Hero
Hero says, “You should know that evil never triumphs.”

Make sure the format of your file is similar to this, and especially make sure that there is a blank line after every cutscene.  WARNING:  if you copy and paste this story directly from this document, chances are the quotes will be messed up.  You will have to delete and retype all quotation marks yourself.

Now save your file in the ffx3\stories directory.  Call it thugbusting.txt

One more thing before you can play the mini-mod – you must create the skirmish file that uses the story you’ve just written.  To make the skirmish file, go to ffx3\skirmish and make a copy of the file called MiniMod spy games.py.  Call the copy MiniMod thug busting.py.

Now, using a text editor again, open up the Mini Mod thug busting.py file and change this line:

storyfile = ‘spygames’

to:

storyfile = ‘thugbusting’

That’s it.  You’ve just created a fully functioning mission.   To play it, start the game, go to the rumble room and select MiniMod thug busting in the game mode selection box. 

 

How to Get Your Mini-Mod to Use Talking Heads

 If you create a custom mission, or run some of the samples provided, chances are you’ve seen dialogue from cut scenes come up on the side of the screen instead of using the talking heads we’re all accustomed to.

 Mini-Mods CAN use talking heads, but see the cautions below.

 To set up the taking heads, you must have ffedit installed (it comes as part of the mod tools on Irrational Games’ web site). 

 There are two steps to the process.  First you must add the captions to the captions.txt file.   EZ script will do this for you.   Second, you must use FFEdit to generate the captions.dat file.  EZ script can’t do that for you, but it only takes the press of a button, so it’s easy to do.

To add the captions, you can load up a special rumble room mod called (appropriately enough) ‘Generate Captions.’  This will automatically scour your stories directory and generate captions for ALL of the stories in it.

Alternatively, you can go into ffx3/missions/scripts/m25config.py and look for this line:

M25_MAKE_CAPTIONS = 0

Change it to 1 and save the file.

Open up the game, load your mini-mod and wait until it starts.  Quit the mini-mod and the game.

Go into ffx3\Lang\English\captions.txt and scroll to the end of the file.  You should see the lines from your mini-mod there.

Remember, either turn on M25_MAKE_CAPTIONS or run the Generate Captions rumble room mod.  You don’t need to do both.

Open up ffedit.  Look for the ‘Speech, Text and Languages’ box.  Make sure the input directory box is BLANK (nothing in it).

 Set the output directory to:

C:\Program Files\Irrational Games\Freedom Force vs The 3rd Reich\ffx3\Lang\English

If you didn’t install the game in the standard location, then change this to point to where the game is installed.

Click the Generate Language Files button, and wait.  And wait.  Er, grab a coffee or something.  FFedit will appear to be unresponsive, but don’t try to kill the process in any way.  It just takes a while.  When FFEdit becomes responsive again, you will be done.

Start up your mini-mod and you should see the talking heads.

You may want to set M25_MAKE_CAPTIONS back to 0, or leave it if you intend to add more talking heads later.

EZ script uses a default head for all custom characters (courtesy of Renegade) that should work for nearly any character.  The head uses the character’s portrait, so it is of a fairly low resolution.  For an even better experience, seek out Renegade’s or tommyboy’s custom heads.

CAUTION:

Talking heads can crash your game.  If you or someone else decides to play the mod with a character that doesn’t have a head.nif defined for it, the game may be ok, but it may complain about it, or it may just crash. 

 

Encounters

Encounters are the basis of the story.  Each encounter represents a conflict or action within the story and encounters are strung together to make the story as a whole.

Each encounter has the following format:

Encounter:  Name
Starts when:
-- Parameters --
Next:

-- Cutscenes --

Name is the name you give the encounter.  It is used to both identify which encounter is running and to allow you to connect encounters together.

Starts when: is used when you want an encounter to start only after several other encounters have ended.  It is completely optional.  So if I want an encounter to start after encounters Fight1 and Fight2 have ended, I’d use:

Starts when: Fight1 at End, Fight2 at End

Parameters are all of the information that an encounter needs, such as which villains are involved.

Next is the encounter that should be run after the current encounter has completed.

Cut scenes are all of the cutscenes that will play as part of the encounter.

Example:

Encounter: Save the Scientist
Type: Save Civilian
Villains: ice_trooper, ice_trooper
Allies: civilian_male
Next: Capture the Ice Queen

Alert Cutscene:
Red arrow on Ally
Hero1 says, “Dr. Mike needs our help!”

Start Cutscene:
Villain1 says, “Come no closer, or the good doctor gets it!”
Villain2 says, “But you said he would get it anyway.”
Villain1 says, “Quiet!”
Hero1 says, “Quickly, while they are distracted.  Get them!”

Ally Thanks Cutscene:
Ally says, “You’ve saved more than you could know this day, hero.”

 

Linking Encounters Together

Not every mission is made up of a single encounter.  Usually you will want to have more than one encounter in a story, and then you will need some means of telling the game how the encounters should be connected.

For example, suppose you save the scientist, but that scientist has a tip to an even bigger villainous plan that must be foiled.  The easiest way to connect them is to put them in the order you want in the story text file.  You don’t need to use the Next parameter at all.

Encounter: Save the Scientist

Encounter: Capture the Ice Queen

Next can be used to jump to an encounter that is out of sequence.  So if I have the above story, but I want to throw in a random fight with ice troopers, I could have:

Encounter: Save the Scientist

Next: Capture the Ice Queen

Encounter: Fight Ice Troopers

Next: None

Encounter: Capture the Ice Queen

When the save the scientist mission is over, the capture the ice queen mission will play.  When the fight ice troopers encounter is complete, no encounter will play.

But wait, how does the story get to the fight ice troopers encounter in the first place?

You can add a Starting Encounters:  command to the beginning of your story to tell it which encounters to start.  This way, you can have multiple encounters all running at the same time.

Story: Ice and the Doctor
Starting Encounters: Save the Scientist, Fight Ice Troopers

If you want any sort of branching inside the mission, you will need to use the Next: parameter.  The next parameter specifies which encounter or encounters to play after the current encounter finishes, based on how the current encounter played out.  That is, many encounters have multiple end conditions – so for the save the scientist encounter, the player may save the scientist, but they may also be too late and that gives us two different end conditions.

Encounter: Save the Scientist

Next: If Allies Saved: Capture the Ice Queen
Next: If Allies Lost: End

Now, if the player saves the scientist, they will go on to capture the ice queen, but if they don’t save the scientist, the mission will end.

Not complicated enough for you?  How about starting multiple encounters after a single encounter has finished?  How about starting a random encounter after an encounter finishes?

Next can take a list of encounters and either start all of them, or pick a number of them at random.  To start a list of encounters just separate all of the encounters by commas.

Encounter: Save the Scientist

Next: If Allies Saved: Capture the Ice Queen, Fight Ice Troopers
Next: If Allies Lost: End

To have the game pick one at random use:

Encounter: Save the Scientist

Next: If Allies Saved: Choose 1 from Capture the Ice Queen, Fight Ice Troopers
Next: If Allies Lost: End

The number 1 (one) can be replaced with any number.

Finally, encounters can loop back on themselves.  If you want the player to constantly fight ice troopers, you can have:

Encounter: Fight Ice Troopers
Next: Fight Ice Troopers

 

A different sort of story flow, the Starts when: option

Not all stories flow neatly from one encounter to the next.  Suppose I want a particular villain, Nuclear Winter, to appear only after the player has defeated several groups of icy minions.  I could have each group of minions appear one after the other, but I want the player to have to explore the map a little, so I want all of the groups to appear at once.

Encounter: Ice Queen
Type: Fight
Villains: ice_queen
Next: None

Encounter: Ice Troopers
Type: Fight
Villains: ice_trooper, ice_trooper
Next: None

Encounter: Snow Men
Type: Fight
Villains: snow_man, snow_man
Next: None

Now, I want the big boss fight to occur as soon as all three groups of villains are defeated.  To make this work, I’ll use the Starts when: option.

Encounter: Big Boss Fight
Type: Fight
Villains: nuclear_winter, frozen_giant
Starts when: Ice Queen at End, Ice Troopers at End, Snow Men at End

Notice that I’ve listed each encounter and how it ends (the at End) part.   Once you are more familiar with how encounters work, you can use any end condition, such as Allies Lost, Allies Saved, Item Recovered or Item Lost.

 

Villains vs. Minions

You’ll notice, if you haven’t already, that there are two sorts of enemies contained in each encounter:  Villains and Minions.  Why separate them?  It’s not purely for cosmetic purposes.  Each has a specific meaning to EZ script.  Specifically:

Tip:  If you want to control which enemies appear in your encounter, use Villains.  If you want the game to control which enemies appear and to scale according to difficulty level, use Minions.

 

A List of Available Encounters

Standard Parameters

All encounters have the following parameters, unless otherwise noted.

Villains: - these are enemies the player will face.  Each villain will be spawned once.

Minions: - these are also enemies the player will face.  EZ script can spawn each minion multiple times to increase the level of difficulty.

Allies: - these are friendly to the player

Objects: - static objects (found in the FFEdit templates tab) that don’t move or fight, but are there simply as window dressing

You can use enemies that the player has selected via the rumble room, by adding the word Random in Villains or Minions.

Marker: - you can give a marker name if you want the encounter to start at a specific place on the map.  Of course, the marker you specify has to actually exist on the map, or the encounter will never start.  See the section on maps for more details.

 

Standard Cutscenes

All encounters use the following two cutscenes

Alert – played when the encounter is spawned to alert the player to its presence.

Start – played when a hero gets close to the encounter.

Banter – played approximately every 30 seconds.  Use multiple banter cut scenes to give your encounters even more flavour (have the villain taunt the hero for example.)

Villain/Minion/Ally/Object KO – played when a character of the type specified gets knocked out (has no health left). 

Encounter Types

These are the encounters that are currently implemented and working in the beta version.

Alliance

Any allies in the encounter will follow the nearest hero around even after the encounter ends.  You don’t need to have any villains or minions in the encounter.  Use it to add long-term allies for your heroes.  For example, the heroes could meet up with a group of police and then move on to other encounters.

Addition Cut scenes:

End Conditions

Building Rampage

The villains and minions will target any nearby buildings and try to destroy them.  The encounter ends when all villains and minions are ko’d.

End Conditions:

You can also use Immediate Building Rampage, in which case the bad guys will not wait until the hero reaches them, but instead will immediately start to pound on buildings.

Chat

Have the player chat with an ally to impart information.  Villains (if any) will attack the hero and generally ignore allies.

Additional Cut scenes:

End Conditions:

Cutscene

Play the alert and start cut scenes, then end immediately.   This is good for playing a cut scene and then moving on to a random encounter.

End Conditions:

Destroy Object

The heroes must destroy objects (given by the Objects: command) that are guarded by the villains and minions.

Additional Cut scenes:

End Conditions:

Disarm Bomb

The heroes must race against the clock to disarm a bomb and defeat the villains and minions guarding it.

Additional Parameters:

Additional Cut Scenes:

End Conditions:

Escort

Have the player escort allies to the edge of the map.  Escorted allies may fight villains they encounter along the way.

Additional Cutscenes:

End Conditions

Examine

The heroes must examine an object, possibly fighting off villains and minions before doing so.

Additional Cutscenes:

End Conditions:

Fight

The player fights a group of enemies.

Additional Cutscenes:

End Conditions:

Flee The Scene

The villains and minions all try to flee to the edge of the map.  The heroes must prevent them from getting away.

Additional Cut scenes:

End Conditions:

You can also use Immediate Flee The Scene and the villains and minions will start to flee before even before the heroes get there.

Gang War

Two teams of enemy characters will fight both the player and each other! The encounter ends when both teams of enemies have been defeated.

Additional Parameters:

Additional Cut scenes:

End Conditions:

Guard Object

The heroes must prevent any objects in the encounter (from the Objects: command) from being destroyed.  Villains and minions will start a short distance away and move towards the object when the heroes get close.

Additional Cut scenes:

End Conditions:

Heist

A group of enemies tries to steal an object on the map, and flee to the edge of the map.

Additional Parameters:

Additional Cut scenes:

End Conditions:

Hunt

A group of enemies actively hunts down the heroes.

Additional Cutscenes:

End Conditions:

Interrogation

The heroes fight a group of enemies and interrogate one of them.

Additional Cutscenes:

End Conditions:

Local Cutscene

A cutscene will play when the player gets close to an encounter.

End Conditions:

One-Shot Power Trap

An item uses its power on any hero that gets too close, but only uses the power once. Good for exploding objects.

Parameters:

End Conditions:

Rampage

The villains and minions will target any nearby objects and try to destroy them.  The encounter ends when all villains and minions are ko’d.

End Conditions:

You can also use Immediate Rampage, in which case the bad guys will not wait until the hero reaches them, but instead will immediately start to attack any nearby objects.

Remove Ally

The specified ally will stop following the player around and will be removed from the game.

End Conditions:

Rescue Caged

Each of the allies is caught in a cage. The heroes have to destroy each of the cages to free the allies. The allies thank the heroes when the villains are defeated.

Additional Cutscenes:

End Conditions:

Rescue Fire

A fire is raging around the allies, and the heroes must rescue the allies. Allies then congregate a short distance away.

Additional cutscenes:

End Conditions:

Rescue Frozen

The allies have been encased in blocks of ice, and the heroes must free them.

Additional cutscenes:

End Conditions:

Rival Factions

A group of rivals and their cohorts will fight the villains and the heroes.

Additional cutscenes:

End Conditions:

Sabotage

The heroes have to destroy a guarded object.

Additional Cutscenes:

End Conditions:

Save Civilian

Villains actively attack any allies, and the heroes must try to save the allies.

Additional Cutscenes:

End Conditions:

Snatch

Villains steal an item and try to escape to the edge of the map.  The hero must intercept them and return the item to their ally.

Additional Parameters:

Additional Cutscenes:

End Conditions:

Switchable Power Trap

An item uses its powers on nearby heroes, and must be switched off to deactivate it.

Parameters:

Additional cutscenes:

End Conditions:

Wait

Delay for a random amount of seconds before starting the next encounter.

Additional Parameters:

End Conditions:

 

Cut Scenes

A cut scene is a sequence of dialogue and/or actions that add purpose and spice to a mission.  Cut scenes can either play while the player is still in control of their characters, or can temporarily take over the game to allow for more advanced control.

A cut scene in EZ script consists of a name and a series of commands, each on it’s own line.  Each cut scene must end with a blank line.  Comments do not count as a blank line.

Name Cutscene:
Commands
            -- blank line here --

The name of the cut scene must be one that the encounter you are using allows (such as Start or Alert).  Other cut scenes will be ignored.

You can specify multiple cut scenes of the same name for each encounter.  Why?  If you do, then the game will randomly pick one of the cut scenes of the appropriate name and play it.  So I can have multiple start cut scenes and the game will pick one of these when the hero nears the encounter.  That way you can add a little variety to your encounters.

Start Cutscene:
Villain says, “Ho ho.”

Start Cutscene:
Villain says, “Hee hee.”

How Substitutions Work

You’ll notice that the example stories rarely use the actual name of a character in the cut scene.  Instead they use substitutions.  When playing a cut scene, EZ script will comb through the cut scene, and replace any instances of Villain, Minion, Ally, Hero or Object with an actual character that is in the cut scene.

For example:

Start Cutscene:
Villain1 says, “Muhahaha!”

will replace the Villain1 with the name of an actual villain that spawned as part of the encounter.

You can use the template of a particular character if you want to force them to do the speaking.

Start Cutscene:
nuclear_winter says, “Muhahaha!”

Cut scene Commands

These are the commands currently available.

Arrow

Red arrow on Character

Yellow arrow on Character

Remove arrow from Character

Use an arrow to point to Character.  You specify whether the arrow is red or yellow (no other colours are included in the game).  Alternately, you can remove an arrow from a character.

Camera on

Camera on Character zoom 100.0 heading 100.0

Move the camera to focus on Character with the given zoom and heading.  Zoom can take values from -300 to 1000+ with a default of -160.0 and controls how close the camera is to the character.  Heading can take values from 0 to 360 and controls the direction the camera faces.

You can substitute the name of a marker or a location tuple (x, y, z) instead of Character.

Zoom and heading are optional.

Cinematic camera on

Cinematic camera on Character1

Cinematic camera on Character1 to Character2

The cinematic camera (thanks to kuertee) will automatically pick a camera angle that includes the characters you want to focus on.  If you specify a single character, the camera will pick a nearby enemy as the second character to include.  If you include two characters, then the camera will try to include both characters in the frame.

Fade

Fade for 2 seconds

The screen will fade to black for the number of seconds that you specify.

Moves To

Character1 moves to Character2

Character1 will attempt to move towards Character2 either by running or by flying if they were flying before the cut scene started.  The cut scene will delay for 1 second while they are moving, although the actual movement may continue after this delay.

Plays Animation

Character plays animation Name

Character will play the animation called Name if they are able to.  The names of animations can be found by opening the mesh of the character in the character tool (part of the FFvTTR mod tools).

Play Effect

Play effect Name of Effect at Character

An effect will play on the named character.  Effects are anything from flashes of light, to temporary flames, to turning the character translucent.  Effects are found in the resources tab of FFEdit.

Play Music

Play music Name of Music

Just as it says, this will play music for your mini-mod.  The music will loop until you play another musical selection.  The names of the music you can use are found in the resources tab of FFEdit (with the prefix music_ ).

Play Sound

Play sound Name of Sound at Character

A sound will be played at the location of the character.   You can use any sound from the sounds tab of FFEdit

Play Transition

Play transition

The classic Freedom Force logo screen transition will play.

Revived

Character is revived

Character will be set to full health and any conditions like acid burnt or blinded will be removed.

Revive All Heroes

Revive all heroes

A special revive command that sets all heroes to full health.

Says

Character says, “Dialogue.”

Character will speak Dialogue either as a talking head, or as text on the side of the screen.  The cutscene will pause for approximately 75 milliseconds per letter in Dialogue.

Says Telepathically

Character says telepathically, “Dialogue.”

Character will speak Dialogue even if they aren’t present in the mission. For example, you can use this to simulate talking over a radio or telephone.

Set Lighting

Set lighting to Style

Change the in game lighting to the style chosen.  Style can currently be:

Shake Camera

Shake camera

The camera will shake for a few seconds.  You can use it to simulate explosions, giant aliens landing, etc.

Teleports To

Character1 teleports to Character2

Character1 will be instantly moved near Character2.  There is no delay in the cut scene.  Use this to move heroes near villains for cut scenes, or villains near heroes for ambushes.

Turns To

Character1 turns to Character2

Character1 will turn to face Character2 with no appreciable pause in the cut scene.

Unfade

Unfade for 2 seconds

The screen will fade from black to the full colour view for the number of seconds that you specify.

Walks To

Character1 walks to Character2

Character1 will walk towards Character2 with no appreciable pause in the cut scene. Use it when you don’t want your characters running in cut scenes.

Wait

Wait for 2 seconds

The cut scene will pause for the number of seconds that you specify.

 

Maps

Maps used with EZ script must have two types of markers present.  Markers are spheres that you can add in the level editor, but are invisible when you actually play the mission. 

Encounter markers must end in a number, and the number must start at 1 and increase sequentially.

For example:

encounter1, encounter2, encounter3

If you start at a number higher than 1, or do not number the markers sequentially, EZ script won’t be able to use them correctly.

encounter3, encounter4, encounter5   - there is no encounter1, so none of these markers will be used

encounter1, encounter2, encounter5 – there is no encounter3 and encounter4 so encounter5 will not be used

Place you encounter markers around the map.  I find that about 12 is a good number.  Try to place them in fairly open areas, so characters don’t appear on top of buildings.

Note: if you’ve read previous versions of this document, it is worth pointing out that encounter markers no longer need to have a size of 30.  You no longer need to set the size at all.

Doing more with maps: specifying where things appear

 

Normally, when making a map, you simply have to lay down the encounter makers and then resize them.  EZ script handles the rest, choosing a random marker for each encounter to spawn at, and then spawning the villains and allies around that marker.  But the placement is random, and doesn’t always look pleasing.

You can control precisely where villains and allies spawn for an encounter by placing additional markers for each encounter.  EZ script looks for markers in the following format:

encounter marker name_object class name

It follows the same sequential numbering that encounter markers do.  So, if I have an encounter marker called encounter1, and I want to have the villains all spawn in wedge formation, I would need to add these markers:

encounter1  - the encounter marker you already added
encounter1_villain1 – the first villain
encounter1_villain2 – the second villain
encounter1_villain3 – the third villain
Etc.

You can do this for minions (encounter1_minion1), allies (encounter1_ally1), and objects (encounter1_object1) as well.

Generally, you should place at least 10 markers for each type (encounter1_villain1 to encounter1_villain10) to leave enough room for any stories people want to play on your map.

You DO NOT have to do this for each encounter.  For example, I could add villain markers only for encounter5 and leave the rest of the encounters alone.

Special Encounter Markers

If you look at the City Landmarks map in the level editor, you will notice that not all of the encounter markers are actually called encounter.  Why?  Well, suppose you want an encounter, say an incident at a police station, to happen in a certain spot on the map.  If you just place encounterX markers, the incident at the police station could happen anywhere on the map, and would not be very satisfying.

On the City Landmarks map, I placed an encounter marker called policestation1.  Notice that it follows the same numbering conventions as any encounter marker (it has to end with a number, and there must be a policestation1 somewhere).

Now, when I write an encounter, I can put:

Marker: policestation

in the encounter, and it will always occur at the policestation1 marker I put on the map.

If I have multiple police stations on the map, I can put down multiple policestation markers as well (policestation2, policestation3, etc.)

Finally, you can place villain, minion, ally and object markers in you special encounter markers too.  If you look at City Landmarks, I have policestation1_ally1 and policestation1_ally2 specified to show where the police should show up.

 

Making EZ Script Campaigns

So you’ve made a mini-mod and want to move on to the next level? Try linking your stories together in a campaign.

 

What is a Campaign?

If you’ve played the Freedom Force game, you know that a campaign is a series of missions, played out on different maps. The missions each tell a story, but they also combine together to tell an overall story.

How can you do this with EZ script? Each mini-mod in EZ script is a single mission played out on a single map. By combining these missions together, we can easily create a campaign.

 

How to Get Started

EZ script is the same for campaigns and mini-mods. You simply have to set up the maps and directories for the campaign.

1. Create a copy of your ffx directory. Rename the copy to the name of your mod (for example, simply call it freeroam). Make a copy of the shortcut you use to start the mod and change the –game parameter to the name of your directory.

("C:\Program Files\Irrational Games\Freedom Force vs The 3rd Reich\ffvt3r.exe" -game freeroam –log) - change freeroam to the name of your mod

2. Make a copy of the ezscriptcampaign directory. You should see it in <mymod>/missions/ezscriptcampaign. Rename the copy of the directory to the name of your first mission. A standard convention is to use numbers then a name, such as 001_firstmission, but you can call them whatever you want.

3. Find the maps you want to use. Copy a map into the new mission directory, or create a new one. If the map hasn’t been used as an EZ script map before, then open it up with the level editor and add encounter markers to it. Remember that each mission needs both a mission map and a base map. You MUST place encounter markers on all of your maps, even the maps you will use for base screens.

Repeat steps 2 and 3 for each mission you want in your campaign.

 

Making a Mission

A mission is simply an EZ script story. Write your story in a text file as you would for a mini-mod. Test it out in the rumble-room to make sure it works the way you want it to.

Once your story is ready, copy the story into the mission directory with the map you will be using for the mission. Rename the text file to mission.txt. It’s now ready to be used as a campaign mission.

IMPORTANT NOTE: EZ script automatically fades the screen when a mission loads so that all of the start up stuff is hidden from the player. You must include an Unfade command in your opening cutscene.

 

Making a Base Screen

Base screens are used to play intermissions, to allow the player to train their heroes, recruit new heroes and to select which heroes they want to take into the next mission. You create EZ script stories for bases, but you must follow a more specific format than you would for a mission.

Each base story has two parts.

1. Camera placement

Start you base story off with an Encounter that will focus the camera. This also doubles as the ‘Intermission’ cutscene. You can put whatever action you’d like into this cutscene.

Encounter: Start
Type: Base

Start Cutscene:
Camera on viewscreen

2. The briefing cutscene

The briefing cutscene plays when a player selects the ‘Play Briefing’ button. EZ script looks for an encounter that has a ‘Starts When’ command consisting of ‘Briefing’ and then plays that as the mission briefing.

Encounter: Briefing
Starts When: Briefing
Type: Cutscene

Start Cutscene:
narrator says, “This is my briefing cutscene.”

Again, you don’t have to have a briefing cutscene. EZ script will skip it if it isn’t there.

Once you’ve created you base story, copy it into your mission directory and rename it base.txt

 

The First Mission

The first mission is, unfortunately, a special case. You see, normally for each mission you start at a base screen, select the heroes you want for a mission and then actually play the mission. Not so for the first mission. Oh, no. The first mission has NO base screen. That means the player cannot select a hero for their first mission.

There are two ways of dealing with the first mission.

First, you can place a built-in hero on the map, and that will become the hero that the player uses for the mission. You can place up to four such heroes and they will all be added to the player’s squad. Irrational Games did this for both of their games, and many mod-makers have done the same.

Second, you can turn the first mission into a cut scene. That is, the story for your first encounter can consist entirely of cut scenes with no player interaction at all. Think of it as an intro movie. Once all of the cut scenes have played, the mission will end and players can then move on to the next mission.

 

Adding your missions to the campaign

To actually get a group of missions to play as a campaign, you have to add them to the campdef.dat file. Don’t worry, it’s easier than it sounds.

Open up FFEdit. Under the options tab, make sure the Primary Data Path is the same as your campaign directory.

Now select the campaign tab. You will see a list of missions from the original campaign the game ships with. Go down to the bottom of the screen (you may have to scroll the whole window to see it) and press the Add button. Find your mission and then add it to the campaign. It will appear in the list of missions, probably at the end. You can use the up arrow and down arrow buttons to move it (oddly enough) up and down in the list of missions. Move it to the top of the list.

Now look for the Max Heroes field. It’ll be set to zero for your mission. Change it to a number from 1 to 4. This is the number of heroes the player will have to take into your mission. Let me emphasize that… they HAVE to take that many heroes into the mission. Unlike the first FF game, FFvTTR doesn’t allow you to take in less than the maximum number of heroes. If you want your mission to be for 2 heroes, don’t put the number 4 into the Max Heroes field.

Add the rest of your missions and move them up and down until they are in the order you want them for your campaign.

Once you’ve added all of your missions, scroll down again and press the Save button.

Now, run the game and press the new campaign button. You should see your campaign start!

 

Objectives and Experience

If you’ve played the game, you know all about objectives… bossy little lines like ‘Defeat Blitzkrieg’ or ‘Find the Whatzit’. Now you can be the boss. Objectives inform the player what they are supposed to be accomplishing, and hand out rewards once they are complete.

Objectives are included in an encounter description:

Encounter: Name
Type: Fight
Villains: nuclear_winter
Allies: minute_man
Primary Objective: ‘Defeat Nuclear Winter’ for 1000 prestige and 100 xp

Let’s break down the primary objective line:

Primary objective – means that the objective will appear in the primary objectives box on the objectives screen. You can use Secondary Objective if you want the objective to appear in the secondary objectives box.

‘Defeat Nuclear Winter’ – the description of the objective that the player will see in the objectives screen

for 1000 prestige – the prestige the player will receive for completing the objective (used to recruit characters or buy weapons or other goodies)

and 100 xp – the amount of experience or character points the player will receive for completing the objective. XP is used to buy new abilities and powers or improve old ones.

An objective is completed if the encounter reaches a successful end condition and failed if the encounter reaches a losing end condition. For example, if the encounter is the ‘Save Civilian’ type, the objective would complete if the heroes defeat the villain and don’t let the civilians fall. It would fail if all of the civilians are ko’d.

Objectives appear when an encounter is created by the game, so you can have multiple objectives revealed as you move through the encounters in a story.

Sometimes you want to give out prestige and xp without having to tie it to an objective. For this you can use the Bonus line:

Encounter: Name
Type: Fight
Villains: nuclear_winter
Allies: minute_man
Bonus: 1000 prestige and 100 xp

Why would you want to use the bonus line? I find it most useful for random encounters in which I want the player to gain experience, but I don’t want an objective to appear.

 

Special Encounters for Campaigns

There are a few special encounters that can be used in campaigns.

Campaign Recruit

Any allies you give will be added as recruits for the game. That means, the player will be able to select them as part of their squad.

Any villains and missions you give will be added to the base screen ‘library.’ The player will be able to view information about them.

IMPORTANT: only recruit built-in characters using this encounter type. If you try to recruit a custom hero (in a .hero file), the game will crash. It’s unfortunate, but beyond my control.

You can also add prestige to the player with the prestige parameter.

Example:

Encounter: Bring in Minute Man
Type: Campaign Recruit
Allies: minute_man
Villains: nuclear_winter
Prestige: 1000

This encounter will recruit Minute Man for the player, add Nuclear Winter to the rogues library and give the player 1000 prestige.

Campaign Add Heroes

Any allies you give will be added to the campaign as potential recruits. The player will still have to recruit them using their prestige.

Populate Base

Use this in a base screen to add custom characters your player may have recruited.

In order for this encounter to work, you have to do a little work. Place the marker where you want the encounter to appear. Then place ‘hero’ markers around the encounter. So if I want my encounter to appear at the ‘base1’ marker, and I want up to 3 custom heroes to appear, I need to place markers called ‘base1_hero1’, base1_hero2, and base1_hero3 for the heroes to show up.

If you want to get fancy, you can place ‘trait’ makers instead of hero markers. What’s a trait marker? There’s a little file called ffxtraits.py in your missions/scripts directory. In it you will find a list of voice IDs and several traits associated with those voice IDs. Mentor’s voice ID has the trait ‘wise’ for example. So if I want a ‘wise’ hero to appear in a this encounter, I would place a marker called base1_wise1, and then still have base1_hero1, and base1_hero2 for the other heroes. Of course, if the player doesn’t have a wise hero, nothing will appear in the ‘wise’ marker.

 

Making Freeroam Campaigns in EZ Script

Freeroam technology developed by DrMike
Adapted to EZ script by m25

 

What is a Freeroam Campaign?

In a standard campaign, the player starts at a base, receives a briefing on a mission, plays that mission on a single map, and then is automatically taken back to the base to receive another briefing. In a freeroam campaign, the player has much more freedom. They can pursue several different story lines at once, or focus on a single one if they wish. They can cross map boundaries whenever they wish. They can return to base whenever they wish. This freedom creates a very satisfying game experience.

Think of it this way:

A mini-mod (played through the rumble room) is a single short story.

A standard campaign is a longer story (or a series of short stories one after the other).

A freeroam campaign is an anthology of stories that the player can pick and choose from.

 

How to Get Started

If you know how to write EZ script, you already know how to make a campaign. Yes, it is that easy.

1. Create a copy of your ffx directory. Rename the copy to the name of your mod (for example, simply call it freeroam). Make a copy of the shortcut you use to start the mod and change the –game parameter to the name of your directory.

("C:\Program Files\Irrational Games\Freedom Force vs The 3rd Reich\ffvt3r.exe" -game freeroam –log) - change freeroam to the name of your mod

2. Download or create a set of linked maps. Download one of the sample map sets. The map sets come with a selection of maps that are pre-linked together. Unzip them into your mod directory. If you want to create your own set of maps, refer to documentation below.

3. Create your stories. If you’ve made a mini-mod, you already know how this works. Write the stories that you want to include in your mod. Place each story in your freeroam directory. The freeroam directory should be located just inside your mod folder (/your mod/freeroam/). If it doesn't exist, go ahead and create a new directory inside your mod and call it freeroam.

Alternatively, you can create a special freeroam mission file. Open up the file called your mod/missions/freeroam_start/mission.py and change the line that reads

freeroam_story = ‘freeroam.txt’

To the name of your story file. Then place your stories in the story directory.

 

To play your new campaign, start the game, and choose the new campaign button.

 

Anthologies

A freeroam campaign might be satisfying with a single, well-told story, but giving the player the freedom to play through several stories at once is even better. An anthology is simply a collection of stories that are all available at the same time.

An anthology file looks like this:

Anthology:
Story name 1
Story name 2

Each story name refers to a story file (in your stories directory). All of the stories in an anthology will be loaded into the game and the player will be able to run through them as they please.

For example, suppose we want two main storylines (Nuclear Winter’s Cold Snap and The Subterranians), plus random encounters. After creating the story files, we can put them together into an anthology like this:

Anthology:
cold_snap
subterranians
freeroam_random_encounters

Notice that you have to include the name of each story file in your anthology, not the name of the story.

 

Where and When do Encounters Appear?

In a mini-mod, there is a single map and all encounters must appear on that map. In a freeroam campaign, the player is free to, well, roam across multiple maps. Unless told otherwise, EZ script will place encounters on whichever map the player is currently on. That works in our favor since it keeps the action moving in most cases, but sometimes you just don’t want your carefully crafted subterrainian encounter popping up in the middle of Pinstripe’s night club. You can tell EZ script which map you want things to appear on with… you guessed it… the Map command.

Encounter: Beneath the city
Type: Fight
Villains: subterrestrial
Primary Objective: ‘Defeat the strange creatures’ for 1000 prestige and 100 xp
Map: sewer1

The Map command simply states that this encounter should only appear when the player is on the map called sewer1. You can find out the names of the maps available to you by looking at the map set you downloaded, or by looking at the naming object you placed on the map if you are making your own.

You can use the first few letters of a map name as the Map: parameter. For example, if I want an encounter to only happen on city maps, I could use:

Map: city

If I wanted the encounter to only occur on sewer maps, I could use:

Map: sewer

Tip: Name you maps consistently. Start all city maps with the word ‘city’ and all sewer maps with the word ‘sewer’.

If you don’t specify a map, encounters will follow the player around as he moves between maps. So if an encounter spawns Nuclear Winter and crew in, say, cityblock1, and the player then moves to cityblock2, Nuclear Winter and crew will appear on cityblock2. Once an encounter is completed (successfully or not), then it will no longer appear. So if the player defeats Nuclear Winter on cityblock2, and then moves to cityblock1, Nuclear winter won’t appear as the encounter was already completed.

 

Testing Freeroam Campaigns

Once you’ve written your epic campaign and assembled all of the pieces, how do you know it will all work out the way you envisioned? You could try to play through the whole thing, but there is another, easier way. Take the story you would like to test, make it a mini-mod, and then play it in the rumble room. How do you make it a mini-mod? Just create a .py file for it in the skirmish directory. EZ script is the same whether you are making a standard campaign, a freeroam campaign, or a mini-mod.

 

Map making

It’s easy to put together your own set of maps for a freeroam campaign. Here’s a set of steps to follow:

  1. Gather all of the maps together. Put them in separate directories and name the directories. The name of the directory MUST be the same as the name you will be giving the map later on.
  2. Think about how the maps will link together. Draw out a rough sketch on a piece of paper to help you visualize.
  3. Open up each map in FFEdit, and then use the Level Editor. Now, place markers on the map to tell EZ script how the maps link together. You must have the following:
    1. Place a marker called mapname_<mymap> , replacing <mymap> with the actual name of the map. This must be the same name as the directory the map is in.
    2. If the map is intended to be used as a base screen in the game, then place another marker called base_map. This will tell EZ script that it is a base map.
    3. Add a marker called hero_1. This is required by the game, or your hero won’t show up.
    4. Now, put down markers that will link this map to other maps. Name the markers to_<nextmap> where <nextmap> is the name of the map the player will go to if they take this exit.
  4. Remember to place exit markers on each map. If I want cityblock1 to connect to sewers1 then I need a to_sewers1 marker in my cityblock1 map AND I need a to_cityblock1 marker in my sewers1 map.

If you want to have more than one exit on a map leading to the same map (for example, if you have a long city map and you want players to be able to move to another city map at multiple places along the edge of the map), then name your exit markers to_<nextmap>-1, to_<nextmap>-2, etc. So if cityblock1 has 3 exits that go to cityblock2, I would use the markers to_cityblock2-1, to_cityblock2-2 and to_cityblock2-3.

 

Credits

Epimethee and stumpy for detecting when a character is flying or falling – who’d have thought it would be so difficult

Stumpy for decoding the data files and allowing the AI and EZ script to work in the first place

Kuertee for his custom camera, trig functions and useful map functions

Dr. Mike, and the whole FFX crew, for all of the powers in FFX, and the ability to tell which character is which

Renegade for the default custom head

Everyone who has tested this and provided feedback.

 

Known Problems

Characters can spawn on top of each other and this will prevent them from moving or attacking.

Characters that are built into the game, and do not have a talking head specified, will not use a talking head and may cause the game to crash.

Any characters spawned by FFX are not considered part of the encounter, and so do not affect the outcome of the encounter (private army for example).