How to Get Your Mini-Mod to Use Talking Heads
A List of Available Encounters
Making Freeroam Campaigns in EZ Script
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.
EZ script now comes with FFX 3.2. Follow the installation instructions for FFX and you will have EZ script.
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.
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.
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_batAlert Cutscene:
Red arrow on VillainStart 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.
C:\Program Files\Irrational Games\Freedom Force vs The 3rd Reich\ffx3\Lang\English
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 QueenAlert 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.”
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
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: NoneEncounter: Ice Troopers
Type: Fight
Villains: ice_trooper, ice_trooper
Next: NoneEncounter: 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.
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:
Minions: ice_queen, nuclear_winterI may see more than one ice queen and no nuclear winter characters, more than one nuclear winter character and no ice queens, or a random assortment of both ice queens and nuclear winter characters.
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.
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.
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).
These are the encounters that are currently implemented and working in the beta version.
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
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.
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:
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:
The heroes must destroy objects (given by the Objects: command) that are guarded by the villains and minions.
Additional Cut scenes:
End Conditions:
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:
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
The heroes must examine an object, possibly fighting off villains and minions before doing so.
Additional Cutscenes:
End Conditions:
The player fights a group of enemies.
Additional Cutscenes:
End Conditions:
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.
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:
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:
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:
A group of enemies actively hunts down the heroes.
Additional Cutscenes:
End Conditions:
The heroes fight a group of enemies and interrogate one of them.
Additional Cutscenes:
End Conditions:
A cutscene will play when the player gets close to an encounter.
End Conditions:
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:
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.
The specified ally will stop following the player around and will be removed from the game.
End Conditions:
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:
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:
The allies have been encased in blocks of ice, and the heroes must free them.
Additional cutscenes:
End Conditions:
A group of rivals and their cohorts will fight the villains and the heroes.
Additional cutscenes:
End Conditions:
The heroes have to destroy a guarded object.
Additional Cutscenes:
End Conditions:
Villains actively attack any allies, and the heroes must try to save the allies.
Additional Cutscenes:
End Conditions:
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:
An item uses its powers on nearby heroes, and must be switched off to deactivate it.
Parameters:
Additional cutscenes:
End Conditions:
Delay for a random amount of seconds before starting the next encounter.
Additional Parameters:
End Conditions:
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.”
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!”
These are the commands currently available.
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 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 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 for 2 seconds
The screen will fade to black for the number of seconds that you specify.
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.
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 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 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 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
The classic Freedom Force logo screen transition will play.
Character is revived
Character will be set to full health and any conditions like acid burnt or blinded will be removed.
Revive all heroes
A special revive command that sets all heroes to full health.
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.
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 to Style
Change the in game lighting to the style chosen. Style can currently be:
Shake camera
The camera will shake for a few seconds. You can use it to simulate explosions, giant aliens landing, etc.
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.
Character1 turns to Character2
Character1 will turn to face Character2 with no appreciable pause in the cut scene.
Unfade for 2 seconds
The screen will fade from black to the full colour view for the number of seconds that you specify.
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 for 2 seconds
The cut scene will pause for the number of seconds that you specify.
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.
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.
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.
So you’ve made a mini-mod and want to move on to the next level? Try linking your stories together in 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.
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.
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.
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: BaseStart 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: CutsceneStart 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 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.
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!
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.
There are a few special encounters that can be used in campaigns.
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.
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.
Any allies you give will be added to the campaign as potential recruits. The player will still have to recruit them using their prestige.
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.
Freeroam technology developed by DrMike
Adapted to EZ script by m25
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.
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 readsfreeroam_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.
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.
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.
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.
It’s easy to put together your own set of maps for a freeroam campaign. Here’s a set of steps to follow:
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.
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.
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).