OTA

Last updated: 11/07/98 00:08

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;

Initial Mission Commands

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
//this will make the unit
//patrol in a triangle
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.

  1. Place a radar tower with unique name (e.g. "TRAP")
  2. Place some Rapier units, each with the following initial command string:
    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.