The OTA file is one of the two components of a Total Annihilation map or mission. The second component is the TNT file. The OTA file contains text information that describes properties of a map/mission, such as the planet type, narration, tidal strengths, wind speeds, gravity, and unit starting positions and orders. OTA and TNT files are found side-by-side in the maps subdirectory, and should be given the same filename for consistency.
Within OTA files is the concept of schemas. Each schema is a slight variation on the map and/or mission based on difficulty (easy, medium, or hard) or if it is a multiplayer map. Many variables that are set in a particular OTA file are specific to all schemas (such as the map size, etc.), but they can be altered, added, or removed for different schemas. For example, you could place extra metal deposits, trees, or steam vents on easier schemas, or add additional computer units for harder schemas.
In addition to units and features, OTA files also contain what are simply called "special" objects. The "special" objects are simply the 10 starting positions that are placed in the map's multiplayer schema to determine where everybody starts on the map.
In most cases, your OTA file will be generated for you by map/mission editing tools such as TAE (comes with The Core Contingency) and Kinboat's Annihilator (man, he's a busy guy!). However, it could be helpful to understand the contents of this file in case you want to do any fine-tuning of your own.
A small example from the Core Contingency's Biggie Biggs multiplayer map:
[GlobalHeader] { missionname=Biggie Biggs; missiondescription=36 X 16 Dance from island to island crushing your opponents.; planet=Slate; missionhint=; brief=; narration=; glamour=; lineofsight=1; mapping=1; tidalstrength=20; solarstrength=20; lavaworld=1; killmul=50; timemul=0; minwindspeed=3500; maxwindspeed=5000; nosealeveltrigger=1; gravity=112; maxunits=200; waterdoesdamage=0; waterdamage=100; numplayers=2, 4, 6, 8, 10; size=36 x 16; memory=32 mb; useonlyunits=biggie biggs.tdf; SCHEMACOUNT=1; [Schema 0] { Type=Network 1; aiprofile=AirBattle; SurfaceMetal=3; MohoMetal=40; HumanMetal=1000; ComputerMetal=1000; HumanEnergy=1000; ComputerEnergy=1000; MeteorWeapon=earthquake; MeteorRadius=650; MeteorDensity=.4; MeteorDuration=4; MeteorInterval=700; [specials] { [special0] { specialwhat=StartPos7; XPos=1216; ZPos=3840; } [special1] { specialwhat=StartPos8; XPos=16112; ZPos=3312; } ..... } } }
Within the OTA file that describes a mission associated with a map, you will typically have additional schemas defined that will look similar to this piece from the Core Contingency's ARM Mission 1 OTA file:
..... SCHEMACOUNT=3; [Schema 0] { Type=Easy; aiprofile=Waterwrld; ..... [units] { ..... [unit13] { Unitname=CORCS; Ident=; XPos=3216; YPos=0; ZPos=1184; Player=2; HealthPercentage=100; Angle=0; Kills=0; InitialMission=w 900,p 1416 852,; } ..... [unit18] { Unitname=CORPLAT; Ident=; XPos=4192; YPos=0; ZPos=1040; Player=2; HealthPercentage=100; Angle=180; Kills=0; InitialMission=w 920,b CORSEAP 1,w 300,b CORSEAP 1, ....; } ..... } [features] { [feature0] { Featurename=WaterAquaOre3; XPos=362; ZPos=427; } } [specials] { [special0] { specialwhat=StartPos1; XPos=5696; ZPos=6816; } } } [Schema 1] { ..... } .....
Within the OTA files, the following variables can be set for the particular map, mission, schema, unit, or special object.
Variable | Description | Example |
---|---|---|
aiprofile | The name of the TXT file that describes the AI profile that the computer opponent will be using for the given mission being defined. | aiprofile=AirBattle; |
AllUnitsKilled | A victory condition. If set to one, you are victorious after killing all enemy units. | AllUnitsKilled=1; |
Angle | The starting "angle" of a unit. (i.e. which direction is it facing when the mission begins) | Angle=90; |
brief | The name of the TXT text file containing the mission briefing that will be displayed before beginning a mission, and while the narration sound is being played. | brief=Krogoth; |
CommanderKilled | A victory condition. You are victorious if you kill the enemy commander. | CommanderKilled=1; |
ComputerEnergy | How much energy the computer opponent begins with in a mission. | ComputerEnergy=1500; |
ComputerMetal | How much metal the computer opponent starts with in a mission. | ComputerMetal=1000; |
Featurename | The name of a feature being placed on the map. | Featurename=WaterAquaOre3; |
glamour | The "glamour shot" (i.e. picture) PCX image that will be displayed on the screen upon completion of the mission. | glamour=Krogvict; |
glamoursound | The "glamour sound" (i.e. sound) WAV file that will be played upon completing a mission, while the "glamour" picture is being displayed. | glamoursound=Exp1kevs; |
gravity | The strength of the planet's gravity. This mainly affects ballistic weaponry. | gravity=122; |
HealthPercentage | The amount of health remaining for a particular unit (if you want to damage them before the mission begins). | HealthPercentage=100; |
HumanEnergy | How much energy the human player (i.e. you) begin with in a mission. | HumanEnergy=1000; |
HumanMetal | How much metal the human player (i.e. you) begin with in a mission. | HumanMetal=1000; |
Ident | A special identifier assigned to a unit during a mission. This identifier is used during in the "Initial Mission" designations to assign orders to a unit regarding another unit. | Ident=GANT2; |
InitialMission | The "initial mission" to be carried out by a specific unit. These are it's orders. It is a bit of a programming language in and of itself that is described below. | InitialMission=wa GANT2,g GANT2,; |
KillAllOfType | A victory condition. If set, you are victorious if you kill all units of the specified type. | KillAllOfType=CORKROG; |
killmul | killmul=50; |
|
Kills | The number of kills a unit has. This value is used to determine a unit's veteran status, if its kill count is greater than 5. | kills=0; |
KillUnitType | A victgory condition. You are victorious if you kill the specified number of the specified unit type. | KillUnitType=CORGANT, 2; |
lavaworld | Is the world a lava world? | lavaworld=1; |
lineofsight | The "line of sight" setting for the mission. A value of 1 indicates that normal line-of-sight rules apply (you only see what is within your range, and what is not blocked from your view). | lineofsight=1; |
mapping | The "mapping" setting for the mission. A value of 1 indicates that normal mapping rules apply (i.e. if you haven't seen it, you don't know what's there). | mapping=1; |
maxunits | The maximum number of units a player is allowed to have during the mission. | maxunits=200; |
maxwindspeed | The maximum speed of the wind. | maxwindspeed=5000; |
memory | The recommended amount of system RAM you should have to use the map/mission described in this OTA file. | memory=32 mb; |
MeteorDensity | How "dense" is the meteor storm? | MeteorDensity=.4; |
MeteorDuration | How long do the meteor showers last? | MeteorDuration=4; |
MeteorInterval | How often meteors fall from the sky. | MeteorInterval=700; |
MeteorRadius | How large an area is included in the meteor showers. | MeteorRadius=650; |
MeteorWeapon | What weapon describes the damage inflicted by the meteors. | MeteorWeapon=earthquake; |
minwindspeed | The minimum speed of the wind. | minwindspeed=3500; |
missiondescription | A brief description of the mission. | missiondescription=36 X 16 Dance from island to island crushing your opponents.; |
missionhint | ||
missionname | The name of the mission. | missionname=Biggie Biggs; |
MohoMetal | mohometal=40; |
|
narration | The name of the narration sound file that will be played during the missoin introduction. | narration=Exp1kebm; |
nomovie | nomovie=1; |
|
nosealeveltrigger | nosealeveltrigger=1; |
|
numplayers | What are the recommended number of players to use on this map for multiplayer games? | numplayers=2, 4, 6, 8, 10; |
planet | What type of planet does this map take place on? (This value is used to determine what the spinning planet image looks like during the mission briefing) | planet=Slate; |
Player | When placing units, to which player does the unit belong? | player=2; |
SCHEMACOUNT | How many individual schemas are present in the OTA file? (Should be between 1 and 4) | SCHEMACOUNT=3; |
size | The size of the map in 512 pixel squares. | size=36 x 16; |
solarstength | How strong is the sunlight? (i.e. how much energy will a solar collector produce) | solarstrength=28; |
specialwhat | When placing a "special" object (i.e. a player starting position), which "special" object is being placed. | specialwhat=StartPos1; |
SurfaceMetal | surfacemetal=3; |
|
tidalstrength | How strong are the tides? (i.e. how much energy will a tidal generator produce) | tidalstrength=24; |
timemul | ||
Type | For a given schema, what type of schema is it? The valid values are "easy", "medium", and "hard" for missions, and a value of "network 1" indicates schema information for multiplayer games. | Type=easy; |
Unitname | The shortname of the unit that is being placed in the mission. | Unitname=CORSS; |
useonlyunits | The name of the TDF file that contains the "use-only" specifications for this mission. (i.e. the list of units that you are only allowed to use during the mission). | useonlyunits=Exp1Ac01.tdf; |
waterdamage | The amount of damage water (acid) does to a unit while the unit is touching it. | waterdamage=100; |
waterdoesdamage | Does the water do damage to units that enter it? (a positive value indicates that water is really acid) | waterdoesdamage=0; |
XPos | The X-position (East-West) for the placement of a unit, feature, or special. | XPos=362; |
YPos | The Y-position (Up-Down) for the placement of a unit, feature, or special. (But why???) | YPos=0; |
ZPos | The Z-position (North-South) for the placement of a unit, feature, or special. | ZPos=427; |
The Initial Mission selection is the true heart of mission creation. Most missions created do not rely on the AI to handle the battle, rather, everything is carefully planned ahead. Having units wait until they are attacked, having groups of units attack at the same time, having them target specific units, even roving patrols, are all commands that are set here. Giving all (or most) of your enemy units a series of commands that interact and mesh to make an appropriate defense (and offense) is what mission creation is all about. If a Unit is given no initial commands, or runs out of commands, the AI will take over, if it is a Computer controlled Unit (anything other than Player 1). If it is a Player controlled Unit and you want the Player to be able to interrupt the initial commands, insert a "s" (to make it selectable) in the initial command list.
What follows is a list of the available commands; use a comma to separate commands. Remember that all unit references should be to the unit’s short name, not the unit’s description (e.g. CORTL not Core Torpedo Launcher).
Syntax | Description | Example |
---|---|---|
m <X> <Y> | Move to coordinates X and Y as measured in pixels; see "Location" on the Status Bar at the bottom of your map editor's window. | w 304 640 |
p <X> <Y> | Patrol from the coordinate at which it is presently to the coordinate that follows the "p" and back again. If only one coordinate is given the computer will assign the current location as the second point in the command. If you give two points (p X Y X Y), the unit will patrol between those two points. If you give three points, the Unit will patrol between those three points in the order given, etc. You can specify any number of points in this way. The patrol command should be at the end of the command list, since once on patrol, the unit will ignore all later commands. | p 600 200 600 800 200 800 |
a <UNITNAME> | Attack the nearest specified Unit. This could be either a Unit Type (for example "a ARMPW") or a unique identifier like "fred". If there are no units of the specified Type, the AI will take control of the unit. | a ARMCOM |
w <SECONDS> | Wait at its present location for the specified number of seconds before continuing with the command list. You can specify fractional seconds (for example "w 0.5"). | w 60 |
b <UNITTYPE> <X> <Y> | Mobile Construction Units only. Tells the Construction Unit (or Commander) to build a Unit of the specified Type at location X Y. | b ARMLLT 300 20 |
b <UNITTYPE> <n> | Construction Building only. Tells the Construction Building to build n Units of type UNITTYPE on its construction pad. | b CORAK 50 |
d | Destroys the Unit instantly. | d //no parameter |
s | Makes the Unit selectable even though the initial command list isn’t completed yet, allowing the AI or player to take control of the Unit. If not set, the user will have no control over the unit until it has completed it's assignment(s). | s |
i <UNITNAME> | Place this Unit in the specified transport. If there is more than one transport of that type, give the transport a unique identifier. | i ARMSHIP |
s | Makes the Unit selectable even though the initial command list isn’t completed yet, allowing the AI or player to take control of the Unit. If not set, the user will have no control over the unit until it has completed it's assignment(s). | s |
u <X> <Y> | You can then tell the transport where to unload the unit that it is carrying at the designated coordinate. If there is more than one unit in transport then it will unload the most current unit. | u 700 700 |
wa | Wait and do nothing until attacked by something. | wa |
wa <UNITNAME> | Wait and do nothing until something attacks the specified unit. You must use a unique identifier, not just a unit type. | wa ALFRED |
Short example scenario:
Let’s say for a moment, that you’re in the middle of creating an Arm mission, for which the goal is to get your squad of Zeus into the enemy’s base and take out their fusion plant. While setting up the defenses, you might program a fleet of Rapier gunships to wait until the Arm lightning-chuckers have destroyed a radar tower abandoned in the middle of a valley, move to co-ordinates 513, 700, followed by a run on the Arm Commander, nestled in it’s camp. To spring your little trap, you would need to do the following setup.
wa TRAP, a ARMZEUS, m 513 700, a ARMCOM
It’s important to make sure that you’ve provided the player with at least one Zeus unit to start with. If there is no Zeus units on the map, the Rapiers will simply skip the command "a ARMZEUS" and go straight after the Commander. The radar tower does not need to be destroyed by a Zeus unit to trigger this event. Upon destruction of the radar tower by any unit, the Rapiers will search for a Zeus and try to kill it.