Todas las páginas de formatos ↓
Unidades, scripts y configuración

TDF / FBI / OTA: archivos de configuración de texto

Fuente: coreprime/kbot @ 0ab97bf · Editar en GitHub

Los archivos TDF («Text Data File»), FBI («Feature/Building/Item») y OTA («Online Total Annihilation») comparten el mismo formato de texto al estilo INI. Son la forma canónica con la que Cavedog declaraba todo lo que no era binario: estadísticas de unidades, parámetros de armas, definiciones de elementos, metadatos de misiones, categorías de sonido, pistas para la IA.

Extensión Dónde se encuentra Ejemplos
.fbi units/ ARMCOM.FBI, CORRAID.FBI: definiciones de unidades
.tdf features/, weapons/, sounds/, gamedata/, etc. armflak_weapon.tdf, treeb.tdf
.ota maps/ metal heck.ota: metadatos del mapa, posiciones de inicio, información para la IA

Son archivos ASCII normales; puedes abrirlos con cualquier editor de texto.

Tip

Pruébalo tú mismo.

# The web UI renders FBI/TDF/OTA as collapsible section trees
kbot mount ~/games/totala --server
# → browse to units/ARMCOM.FBI

Consulta la referencia de kbot mount de la CLI para usar el navegador en el terminal y las opciones para desempaquetar.

Desde Go. Usa formats/tdf:

import "github.com/coreprime/kbot/formats/tdf"

doc, _ := tdf.ParseFile("units/ARMCOM.FBI")
info := doc.Section("UNITINFO")
fmt.Println(info.String("UnitName"), info.Int("MaxDamage"))

Sintaxis

Un archivo TDF es un árbol de secciones. Cada sección tiene un nombre entre corchetes y después un cuerpo { ... } que contiene pares clave=valor, secciones anidadas o ambas cosas.

[UNITINFO]
{
    UnitName=ARMCOM;
    Designation=Commander;
    Description=Commander, Arm;
    Side=ARM;
    Objectname=armcom;

    BuildCostEnergy=2500;
    BuildCostMetal=2500;
    MaxDamage=3000;

    [SOUNDS]
    {
        canselect=cmdsel1;
        select1=cmdok1;
    }
}

Reglas:

  • Los nombres de sección van entre corchetes; todo lo que sigue hasta la } correspondiente pertenece a esa sección. Una sección puede ocupar una sola línea ([special0] { specialwhat=StartPos1; XPos=464; ZPos=216; }).
  • Un valor va desde el = hasta el siguiente ;, aunque haya saltos de línea por medio: ninguna otra cosa lo termina, así que las llaves, los corchetes y los = dentro de un valor son texto normal, y un valor nunca puede contener un ;. Los espacios, tabuladores y saltos de línea en los extremos de una clave o de un valor se recortan. Una clave asignada dos veces conserva el último valor.
  • Las claves no distinguen mayúsculas de minúsculas. UnitName, unitname y UNITNAME se refieren al mismo campo; las herramientas suelen normalizarlas a minúsculas al leer. Los nombres de sección también se comparan sin distinguir mayúsculas.
  • Los valores son cadenas por defecto. Los números se leen a la manera de C, a partir de los dígitos iniciales: 12abc se lee como 12 y 56.8 como 56 allí donde el juego espera un número entero (campos como killmul y tidalstrength se leen como fracciones). Las listas van separadas por espacios (p. ej., Category=NOTSUB COMMANDER NOTAIR ...).
  • Los comentarios se borran antes de leer cualquier otra cosa: // hasta el final de la línea, y los bloques /* ... */, que pueden ocupar varias líneas. Así, missiondescription=See http://tauniverse.com; pierde todo desde // en adelante, incluido su ;, y el valor continúa en la línea siguiente. kbot se niega a escribir un valor que contenga ;, // o /*.
  • Los espacios en blanco y las líneas vacías se ignoran.

Las secciones anidadas (como [SOUNDS] dentro de [UNITINFO] en el ejemplo de arriba) son habituales en los FBI y los OTA. La especificación de TDF no fija una profundidad máxima; en la práctica no verás más de 3 niveles.


FBI: definiciones de unidades

Un FBI es todo lo que el motor sabe de una unidad. Reúne en un solo lugar el modelo 3D de la unidad, el script, la lista de armas, el banco de sonido, los costes de construcción y el comportamiento en combate. Un ejemplo recortado del Arm Commander:

[UNITINFO]
{
    // === Identification ===
    UnitName=ARMCOM;          // Internal lookup key
    Objectname=armcom;        // → objects3d/armcom.3do, scripts/armcom.cob
    Side=ARM;                 // ARM or CORE
    Designation=Commander;    // Mouseover label
    Description=Commander, Arm;

    // === Economy & build ===
    BuildCostMetal=2500;
    BuildCostEnergy=2500;
    BuildTime=89400;          // Build-power × seconds (engine units)
    WorkerTime=300;           // How fast it builds other things

    // === Combat ===
    MaxDamage=3000;           // Hit points
    Weapon1=COMMANDER_WEAPON; // → weapons/commander_weapon.tdf [COMMANDER_WEAPON]
    Weapon2=disintegrator;    // The dreaded D-gun
    candgun=1;                // Allowed to fire weapon2 on demand

    // === Movement ===
    MaxVelocity=1.15;
    Acceleration=0.075;
    BrakeRate=0.0825;
    TurnRate=510;
    MovementClass=COMMANDER_TANK3;  // → gamedata/movinfo.tdf

    // === Senses ===
    SightDistance=520;
    RadarDistance=585;

    // === Tags & categories ===
    Category=COMMANDER SURFACE MOBILE WEAPON ...;
    NoChaseCategory=AIR;

    [SOUNDS] {
        canselect=cmdsel1;
        select1=cmdok1;
        ...
    }
}

La guía de FBI de la comunidad de 1998 (conservada en los materiales de origen de este repositorio) documenta más de un centenar de campos. La mayoría se explican solos; los que no son evidentes suelen ser estos:

Campo Lo que controla realmente
Bmcode Código de página del menú de construcción: déjalo en 1 para las unidades normales.
Category Lista de etiquetas separadas por espacios que usan el BadTargetCategory de las armas, NoChaseCategory, la IA y los menús de construcción.
MovementClass Remite a una clase de gamedata/movinfo.tdf que define las pendientes de terreno aceptables, la profundidad del agua, etc.
YardMap Dibujo ASCII (p. ej., oooo\noooo\n) que declara la huella de la unidad y las restricciones de agua/tierra de cada celda.
Corpse Nombre de un [FEATURE] (ver más abajo) que se usa como restos al destruirse.
SoundCategory Elige el banco de audio en gamedata/sound.tdf.
TEDClass Pista para el editor de Cavedog; se ignora durante la partida.

Important

UnitName es la clave de búsqueda en todas partes: la usan el OTA, la IA y el menú de construcción. Si cambias el nombre de un FBI, tienes que buscar con grep todas las referencias en el mod entero.


TDF: definiciones de elementos, armas y sonidos

Los archivos features/**/*.tdf contienen secciones [FEATURE], una por cada objeto estático del mapa. El formato TNT (TNT) hace referencia a ellas por el nombre de sección:

[ArmTree01]
{
    description=Arm Tree;
    category=trees;
    object=arm_tree01;       // → objects3d/arm_tree01.3do
    footprintx=1;
    footprintz=1;
    height=20;
    blocking=1;              // Pathing obstacle
    flamable=1;
    burnmin=10;
    burnmax=20;
    burntime=30;
    feature_reclamate=ArmTree01_Heap; // Recursive: what's left when reclaimed
    damage=15;
    reclaimable=1;
    energy=0;
    metal=2;
    seqname=arm_tree01;      // GAF sequence to draw (for animated features)
}

Los weapons/*.tdf siguen el mismo patrón, con secciones [WEAPON_NAME]. El campo Weapon1=COMMANDER_WEAPON del FBI se resuelve en la sección [COMMANDER_WEAPON] de algún TDF de weapons/, a través de la tabla de armas del juego indexada por ID: cada sección necesita un ID= entre 0 y 255, una sección posterior con el mismo ID sustituye a una anterior, y un nombre se resuelve en la posición más baja que lo contiene (consulta Gamedata: la tabla de armas). La guía de armas de la comunidad documenta unos 60 campos distintos; los más sustanciosos son ballistic/lineofsight/dropped (el arquetipo del arma), weapontimer, weaponvelocity, areaofeffect, edgeeffectiveness, burst/burstrate y la subsección [DAMAGE] (modificadores de daño por categoría).

[FLAMETHROWER] {
    ID=1;
    name=Flame Thrower;
    rendertype=5;
    ballistic=1;
    turret=1;
    range=160;
    reloadtime=1.2;
    weapontimer=1;
    weaponvelocity=188;
    areaofeffect=32;
    burst=17;
    burstrate=.04;
    [DAMAGE] {
        default=10;
        corpyro=2;          // Pyros are nearly fireproof
    }
}

Los archivos de download/*.tdf registran una unidad en los menús de construcción de uno o varios constructores sin modificar sidedata.tdf. Es el mecanismo con el que la expansión Core Contingency de Cavedog añade sus unidades, y la convención que sigue todo complemento .ufo de una sola unidad.

[MENUENTRY1]
{
    UNITMENU=ARMVP;       // Builder's UnitName
    MENU=3;               // Menu page (row)
    BUTTON=4;             // Slot within the page
    UNITNAME=MYFLASH;     // Unit being placed
}

[MENUENTRY2]              // Additional builders for the same unit
{
    UNITMENU=ARMACV;
    MENU=3;
    BUTTON=4;
    UNITNAME=MYFLASH;
}
Campo Tipo Significado
UNITMENU str UnitName de la unidad constructora a cuyo menú se añade la unidad.
MENU int Número de página del menú de construcción. Cavedog reserva 1–2 para las unidades originales; la convención de la comunidad es empezar en 3.
BUTTON int Hueco dentro de la página (0–5, dispuestos en una cuadrícula de 2 columnas × 3 filas: 0=arriba a la izquierda, 1=arriba a la derecha, 2=en medio a la izquierda, 3=en medio a la derecha, 4=abajo a la izquierda, 5=abajo a la derecha).
UNITNAME str La unidad que se añade: debe coincidir con el UnitName= del FBI de tu unidad.

Convención de nombres de archivo. Por convención, el archivo es download/<UNITNAME>.tdf (igual que el UNITNAME= de la primera entrada), pero el motor lee todos los *.tdf de download/, así que el nombre del archivo es solo una pista para el modder. Lo normal es una unidad por archivo.

Varias entradas. Un solo archivo puede contener varias entradas: el download/Armfort.tdf de Cavedog usa tres para que el Arm Fortification Wall se pueda construir desde ACK, ACV y ACA. TA 3.1c lee las cinco primeras secciones de cada archivo, se llamen como se llamen ([MENUENTRY1] es la convención, pero [ENTRY0] también funciona); una sexta sección no se lee nunca. Se ignora la entrada cuyo UNITMENU no corresponda a ninguna unidad (o a ninguna con Builder=1), igual que la que tenga un UNITNAME que no corresponda a ninguna unidad. MENU y BUTTON se limitan a 8 bits, y el menú de un constructor (su lista [CANBUILD] más los añadidos de download) admite como máximo 31 unidades.

Important

download/*.tdf añade entradas al menú de construcción; no sustituye nada. Si el hueco que eliges choca con una entrada existente, el comportamiento del motor es impredecible: normalmente gana la entrada cargada más tarde, pero el orden de carga de los .ufo no está garantizado en todas las plataformas. Elige una página MENU alta (4 o 5) para los mods que vayan a convivir con otros.

Este es el mecanismo aditivo que te permite distribuir un mod en un único .ufo sin hacer una copia propia del sidedata.tdf de 50 KB. Consulta el tutorial de modding para ver el proceso completo.


OTA: metadatos del mapa

El .ota acompaña a cada .tnt y contiene todo lo que el motor necesita para jugar el mapa (a diferencia de renderizar su terreno):

[GlobalHeader]
{
    missionname=Metal Heck;
    missiondescription=A small, brutal metal map.;
    planet=metal;
    tidalstrength=0;
    solarstrength=20;
    lavaworld=0;
    killmul=50;
    waterdoesdamage=0;
    minwindspeed=100;
    maxwindspeed=2500;
    gravity=112;
    numplayers=2,4,6,8,10;

    [Schema 0] {
        Type=Network 1;
        aiprofile=DEFAULT;
        SurfaceMetal=10;
        MohoMetal=125;
        HumanMetal=1000;
        ComputerMetal=1000;
        HumanEnergy=1000;
        ComputerEnergy=1000;
        [specials] {
            [special0] { specialwhat=StartPos1; XPos=464; ZPos=216; }
            [special1] { specialwhat=StartPos2; XPos=3408; ZPos=216; }
            ...
        }
    }
}

kbot tnt preview lee el .ota correspondiente y dibuja marcadores numerados en cada posición de inicio del esquema elegido.

Cómo lee el juego los esquemas y las posiciones de inicio (todas las vistas de kbot, es decir, el editor de mapas del studio, el sandbox, el explorador de recursos, kbot tnt preview, kbot tnt lint y el Quality Checker, los leen de la misma manera, a través de la vista de juego de OTA de kbot-io):

  • Los esquemas se buscan por nombre, Schema 0, Schema 1, … hasta el primer número que falte. Los nombres se comparan sin distinguir mayúsculas ([schema 1] cuenta), pero el número debe estar escrito tal cual: [Schema0] o [Schema 01] no se encuentran nunca, y un esquema después de un hueco (Schema 0, Schema 1, Schema 3) no se lee nunca. SCHEMACOUNT se ignora.
  • Las escaramuzas y las partidas multijugador eligen un esquema por Type y número de posiciones de inicio, no por su posición en el archivo. Solo cuentan los esquemas Network 1 a Network 4 (comparados sin distinguir mayúsculas) con al menos una posición de inicio. Para N jugadores, el juego prefiere el último esquema válido con exactamente N posiciones de inicio y, si no lo hay, el que tenga más. Una misión de campaña elige por dificultad (Easy, Medium, Hard). numplayers es solo un texto que se muestra en el lobby (2, 4, 2-8 y Any cargan todos).
  • Las posiciones de inicio son las entradas de [specials] cuyo specialwhat empieza por StartPos (sin distinguir mayúsculas). StartPosN es la plaza de jugador N-1, StartPos0 también es la plaza 0, y una entrada sin número tras StartPos toma el siguiente número de su propia serie (el primero es 1). XPos y ZPos son píxeles del mapa, limitados a 16 bits.
  • Las claves que faltan tienen valores por defecto, no ceros: si falta missiondescription se muestra «No description available», si falta maxunits (solo en campañas) se usan 200, y un elemento colocado de antemano ([features]) sin XPos o ZPos se omite, así que uno en la columna o la fila 0 necesita un 0 explícito.

Note

El editor de mapas del studio edita directamente el .ota del mapa. Al guardar solo cambian los valores que has editado (y se añaden o eliminan los esquemas y posiciones de inicio que hayas añadido o eliminado); todo lo demás (claves de victoria y de disparadores, useonlyunits, [units], [features], otros [specials], fracciones como killmul=0.5, comentarios) se vuelve a escribir tal como estaba. Eliminar un esquema o una posición de inicio reescribe el archivo con la disposición de kbot-io (mismo contenido, sin los comentarios) y renumera los esquemas posteriores para que el juego siga encontrándolos. Un .ota que kbot no puede leer se muestra con su error y se deja sin cambios al guardar, y se rechaza el texto de un diálogo que contenga ;, // o /*. También se rechaza un guardado que haría que el juego leyera un esquema que ahora omite: al añadir un esquema se toma el número libre más bajo, así que en un archivo con [Schema 0] y [Schema 2] el nuevo [Schema 1] pondría en juego [Schema 2]; el error indica la sección que hay que renombrar o eliminar. Una fracción demasiado grande para guardarse (killmul=1e999, que el juego lee como infinito) se muestra como el número más grande y se conserva tal como está escrita salvo que la cambies. El juego toma el nivel del mar de la cabecera del .tnt; el editor mantiene sincronizada una clave sealevel= existente, pero nunca añade una.


Ejemplo desarrollado: una unidad mínima

Un FBI «de prueba» completo y funcional para una torreta fija:

[UNITINFO]
{
    UnitName=MYTURRET;
    Objectname=myturret;
    Side=ARM;
    Designation=Test Turret;
    Description=Bare-minimum turret for format testing.

    BuildCostMetal=200;
    BuildCostEnergy=400;
    BuildTime=2400;
    MaxDamage=600;

    Category=NOTSUB SURFACE WEAPON NOTAIR;
    TEDClass=LASER;
    Builder=0;
    canattack=1;
    onoffable=0;
    ActivateWhenBuilt=1;

    Weapon1=LIGHTLASER;

    FootprintX=2;
    FootprintZ=2;
    YardMap=cccc;
    MaxSlope=15;
    MaxWaterDepth=0;
    SightDistance=300;

    Corpse=MyTurret_Dead;

    [SOUNDS] {
        select1=corselect1;
        ok1=corok1;
    }
}

Para convertirlo en un complemento de unidad completo, distribuirías:

mymod/
├── units/myturret.fbi
├── objects3d/myturret.3do
├── scripts/MYTURRET.cob
├── features/corpses/myturret.tdf       # contains [MyTurret_Dead]
└── unitpics/MYTURRET.PCX

…y después empaquetarías el directorio como HPI:

kbot hpi pack ./mymod --target myturret.ufo

Escollos

Warning

Todo valor debe terminar en ;. Que falte un punto y coma no da error: el analizador une sin avisar el valor con la línea siguiente, lo que produce estadísticas desconcertantes (un MaxDamage=3000 seguido de un Description=... sin terminar da una unidad con 30 000 puntos de vida y sin texto emergente).

  • Las claves no distinguen mayúsculas de minúsculas; los valores sí. Side=arm funcionará con la lógica que clasifica las unidades de ARM, pero fallarán los mods que cambian de bando sobre la marcha con if (Side == "ARM") y comparaciones de cadenas exactas.
  • Los valores de lista van separados por espacios (Category=COMMANDER MOBILE WEAPON), no por comas. El motor separa por cualquier espacio en blanco.
  • Algunos campos de OTA usan comas, eso sí: numplayers=2,4,6,8,10. No hay una única convención para separar listas, y el juego ni siquiera analiza numplayers: solo muestra el texto.
  • Las secciones anidadas no tienen un límite de profundidad formal, pero Cavedog nunca distribuyó nada con más de 3 niveles. Los editores que suponen 2 niveles fallarán con un puñado de TDF de armas que anidan al estilo de [WEAPON][DAMAGE][category].
  • Los campos booleanos son enteros (canmove=1, canstop=0), no true/false. El motor solo acepta 1/0.
  • Los archivos .ota tienen a menudo mojibake de UTF-8 en las descripciones de las misiones (comillas tipográficas de Word, etc.). El motor los muestra con la página de códigos Windows-1252 y pinta un recuadro vacío en lugar de todo lo que quede fuera de ella.

Tamaños habituales

Recurso Rango observado en el contenido de Cavedog
FBI de una unidad 1–4 KB (comandante: ~3 KB; tanque ligero: ~1,5 KB)
TDF de un solo elemento 200 B – 1 KB
TDF de armas 0,5–3 KB por sección [WEAPON]
Archivo OTA 1–8 KB
gamedata/sidedata.tdf ~50 KB (domina la disposición del HUD)
gamedata/sound.tdf ~20 KB
Total de FBI en TA + CC ~250 archivos

Apéndice A: diccionario de campos FBI

Todos los campos que suelen aparecer en units/*.fbi, agrupados por finalidad. Claves de la columna Tipo: str = identificador/cadena; int = entero; float = coma flotante; bool = 0/1; list = tokens separados por espacios en blanco; enum = entero pequeño con significados documentados.

Los campos que no figuran aquí son datos de trabajo del editor (UnitNumber, Copyright) o no están documentados. El motor ignora sin avisar las claves desconocidas.

Identidad y presentación

Campo Tipo Notas
UnitName str Clave de búsqueda principal. La usan otras configuraciones, la IA, el OTA y los menús de construcción.
Side str ARM o CORE (TA), Aramon/Taros/Veruna/Zhon (TA:K). Coincide con un [SIDE<N>] de gamedata/sidedata.tdf.
Objectname str Nombre base de la malla .3do, el script .cob y el retrato unitpics/*.pcx de la unidad.
Designation str El «código de tipo» que se muestra en el panel de información de la unidad (p. ej., ARM-WM para el comandante de Arm).
Name str Nombre corto que se muestra sobre la unidad.
Description str Texto emergente que se muestra en el botón de construcción y en el panel de información de la unidad.
GermanName / FrenchName / SpanishName / ItalianName / JapaneseName / PigLatinName str Nombres localizados. Se usa el del idioma de la versión distribuida.
GermanDescription / FrenchDescription / SpanishDescription / ItalianDescription / JapaneseDescription / PigLatinDescription str Texto emergente localizado.
Version int Versión del esquema que registra el editor. Siempre 1 o 2 en el contenido de la versión comercial.
UnitNumber int ID exclusivo del editor. Se ignora durante la partida.
Copyright str Cadena de copyright de formato libre. Se ignora.
TEDClass str Clasificación del editor TAE (KBOT, TANK, COMMANDER, …). Solo estética.

Economía y construcción

Campo Tipo Notas
BuildCostMetal int Metal necesario para construir esta unidad.
BuildCostEnergy int Energía necesaria para construir esta unidad.
BuildTime int Potencia de construcción × segundos. El motor lo divide por el WorkerTime del constructor para obtener el tiempo de construcción real.
WorkerTime int Potencia de construcción que aporta esta unidad cuando es constructora.
EnergyUse int Energía consumida por tick mientras está activa.
EnergyMake int Energía producida por tick mientras está activa.
MetalUse int Metal consumido por tick.
MetalMake int Metal producido por tick.
EnergyStorage int Capacidad de almacenamiento. En blanco en las unidades que no almacenan.
MetalStorage int Capacidad de almacenamiento. En blanco en las unidades que no almacenan.
MakesMetal int Metal que convierte por segundo un conversor de metal (metal maker) mientras está encendido y tiene cubierto su consumo de energía; se lee como número entero (1.9 es 1). Es distinto de MetalMake, que está siempre activo.
ExtractsMetal float Metal que rinde un extractor por cada unidad de metal del mapa bajo su huella, mientras está encendido y con energía.
TidalGenerator bool La producción de energía de esta unidad depende del tidalstrength del mapa.
WindGenerator bool La producción depende del rango de velocidades del viento del mapa.
Builder bool Puede construir otras unidades.
Builddistance int Distancia máxima del nanotorno (nano-lathe), en celdas de 16 px.
CanReclamate bool Puede recuperar restos y elementos.
CanCapture bool Puede capturar unidades enemigas (solo los comandantes).
ActivateWhenBuilt bool Pone por defecto el interruptor «activo» en encendido al terminar la construcción.
onoffable bool Tiene un interruptor de encendido/apagado que el jugador puede accionar.

Combate y supervivencia

Campo Tipo Notas
MaxDamage int Puntos de vida.
Weapon1 / Weapon2 / Weapon3 str Nombres de secciones de armas de weapons/*.tdf. Hasta 3 armas.
wpri_badTargetCategory list Categorías contra las que el arma principal rinde mal (se les quita prioridad).
wsec_badTargetCategory list Lo mismo para el arma secundaria.
BadTargetCategory list Objetivos que la unidad en su conjunto evita.
NoChaseCategory list Objetivos que la unidad no persigue (solo dispara si están a su alcance).
canattack bool Indica si la unidad puede disparar.
candgun bool Puede disparar manualmente su 3.ª arma (el D-gun del comandante).
commandfire bool Obliga a que cada disparo lo inicie el jugador.
ExplodeAs str Nombre del arma para la explosión al morir (en weapons/*.tdf).
SelfDestructAs str Nombre del arma para la explosión de autodestrucción.
Corpse str Nombre de la sección [FEATURE] de features/**/*.tdf que se deja como restos.
HealTime int Segundos para repararse del todo en una plataforma de reparación.
DamageModifier float Multiplicador aplicado al daño recibido. <1 = resistente.
ImmuneToParalyzer bool Ignora las armas paralizantes.
HideDamage bool Oculta la barra de daño al enemigo.
kamikaze bool Detona al contacto en vez de disparar.
firestandorders bool Tiene el interruptor de órdenes de fuego permanentes.
StandingFireOrder enum Postura de fuego por defecto: 0 = no disparar, 1 = devolver el fuego, 2 = a discreción. Si falta la clave, es 2; un valor explícito conserva sus dos bits bajos, así que 0 es realmente «no disparar» (Hold Fire).
mobilestandorders bool Tiene el interruptor de órdenes de movimiento permanentes.
StandingMoveOrder enum Postura de movimiento por defecto: 0 = mantener, 1 = maniobrar, 2 = deambular. Si falta la clave, es 2; un valor explícito conserva sus dos bits bajos (el 0 de los comandantes es «mantener la posición», Hold Position).
ShootMe bool Pista para la IA y los oponentes controlados por el ordenador: dar prioridad a esta unidad como objetivo.
Commander bool Marca la unidad como comandante (si muere, se pierde la partida).

Movimiento

Campo Tipo Notas
MaxVelocity float Velocidad máxima en unidades del mundo por tick.
Acceleration float Velocidad ganada por tick.
BrakeRate float Velocidad perdida por tick al frenar.
TurnRate int Velocidad de giro en unidades de 2π/65536 por tick.
MaxSlope int Pendiente de terreno más pronunciada que puede subir la unidad. Por defecto 255.
MaxWaterDepth int Agua más profunda en la que puede entrar la unidad. 0 = solo tierra; por defecto 10000.
MinWaterDepth int Profundidad mínima de agua (solo barcos). Por defecto -10000.
MovementClass str Nombre de clase de gamedata/moveinfo.tdf ([CLASS0]–[CLASS31]). Cuando se resuelve, la huella, las profundidades de agua y las pendientes de la clase sustituyen a las claves propias del FBI (consulta Gamedata).
SteeringMode enum 0/1/2: girar y luego avanzar, describir un arco o girar al instante.
Upright bool Dibuja la unidad de pie (kbots) o plana (vehículos).
BankScale float Cuánto se inclina lateralmente la unidad al girar (aeronaves). Por defecto 1; con un 0 explícito no se inclina nunca.
PitchScale float Cuánto cabecea la unidad al acelerar.
Scale float Multiplicador de escala visual (1.0 = normal).
CanFly bool Marca de aeronave.
crusisealt int Altitud de crucero de las unidades voladoras.
attackrunlength int Distancia de las pasadas de ataque de VTOL y bombarderos.
HoverAttack bool La aeronave se mantiene en vuelo estacionario mientras ataca (cañoneras).
floater bool Flota en la superficie del agua.
canmove bool Indica si la unidad puede moverse.
canpatrol bool La orden de patrulla está habilitada.
canstop bool La orden de detenerse está habilitada.
canguard bool La orden de proteger está habilitada.
canload bool Puede cargar unidades transportadas.
transportsize int Clase de tamaño para las comprobaciones de carga en transportes.
transportmaxunits / TransMaxUnits int Capacidad de las unidades de transporte.
manuverleashlength (también maneuverleashlength) int Hasta qué distancia de su posición fija maniobrará la unidad.
BadSlope int Pendiente a partir de la cual el movimiento se ralentiza sin llegar a bloquearse.
BuildAngle int Pendiente máxima sobre la que se puede construir esta unidad.

Sentidos

Campo Tipo Notas
SightDistance int Radio de la línea de visión (LOS) en celdas de 16 px.
RadarDistance int Radio de cobertura del radar. 0 = sin radar.
SonarDistance int Radio de cobertura del sonar.
RadarDistanceJam int Radio en el que la unidad interfiere el radar enemigo.
Stealth bool La unidad no aparece en el radar enemigo.
CloakCost int Energía por tick para seguir camuflada mientras está quieta.
CloakCostMoving int Energía por tick para seguir camuflada mientras se mueve.
mincloakdistance int El camuflaje falla cuando hay un enemigo a menos de este número de celdas.

Menú de construcción y huella

Campo Tipo Notas
Bmcode int Código del menú de construcción. Déjalo en 1 para lo que se construye como unidad; 0 para los edificios que no aparecen.
FootprintX / FootprintZ int Huella en celdas de 16 px. Debe coincidir con la huella de la MovementClass.
YardMap str Cuadrícula ASCII de varias líneas (o=abierta, c=cerrada, w=agua, g=geotérmica) que define las restricciones de cada celda.
ThreeD bool Se dibuja como modelo 3D. Siempre 1 en las unidades de la versión comercial.
ZBuffer bool Usa Z-buffer. Siempre 1.
NoShadow bool No dibuja la sombra.
NoAutoFire bool Desactiva el disparo automático.
norestrict bool No aplica las zonas restringidas.
IsAirBase bool Las aeronaves pueden aterrizar o repararse aquí.
IsFeature bool Se trata como un elemento estático, no como una unidad.
Category list Fundamental. Lista de etiquetas separadas por espacios en blanco que usan la selección de objetivos de las armas, los pesos de la IA y los menús de construcción. Tokens estándar: MOBILE, WEAPON, SURFACE, UNDERWATER, VTOL, KBOT, TANK, SHIP, LEVEL1/LEVEL2/LEVEL3, NOTSUB, NOTAIR, COMMANDER y los nombres de bando.
WaterLine int Profundidad a la que se asienta una unidad flotante.
altfromsealevel int La altitud de la aeronave se mide desde el nivel del mar, no desde el terreno.

Audio

Campo Tipo Notas
SoundCategory str Nombre de una sección de gamedata/sound.tdf que proporciona las muestras de voz de la unidad.
[SOUNDS] (sección anidada) subsección Sustituciones en línea para eventos concretos (canselect=…, select1=…, etc.).

Varios / poco conocidos

Campo Tipo Notas
DefaultMissionType str Estado de misión inicial (Standby, Move, etc.).
sortbias int Peso de ordenación en el menú de construcción.
teleporter bool Marca la unidad como plataforma de teletransporte (Galactic Gate).
IsAirBase bool Consulta «Menú de construcción y huella»; se repite para que la lista esté completa.
Ovradjust bool Activa una sustitución no documentada del motor; solo la usa el comandante.
ShowPlayerName bool Muestra el nombre del jugador sobre la unidad (solo el comandante).
MoveRate1 / MoveRate2 int Datos de trabajo del editor. No se usan durante la partida.
antiweapons bool Lo usan las plataformas antiarmas (Fortitude, antinuclear).

Ejemplos reales en el catálogo de referencia

El uso de los campos se aprende mejor con FBI reales. Los repositorios de referencia catalogan todas las unidades distribuidas:

  • TA: todos los FBI: buenos ejemplos «ricos» son ARMCOM (comandante con Commander=1, CloakCost, MaxDamage=3000), ARMSAM (torreta con Weapon1/2/3 rellenos), ARMBRAWL (aeronave con CanFly, crusisealt, BankScale) y ARMMEX (extractor de metal con ExtractsMetal).
  • TA: todos los TDF de armas: [FLAMETHROWER] para burst/burstrate/firestarter, [NUCLEAR_MISSILE] para los misiles guiados de dos fases y [LIGHTNING] para un arma de rayo.
  • TA: árbol de construcción de elementos y armas, con todos los registros [MENUENTRY] de la instalación.
  • Unidades de TA: Kingdoms, con un conjunto de campos distinto (buildcost= con un único recurso, damagecategory=, [WEAPONn] en línea). ARAKING (Elsin, el monarca de Aramon) y ARAARCH (Archer) son buenos puntos de partida.

Véase también

  • TNT: hace referencia a nombres de elementos que se resuelven en secciones TDF [FEATURE].
  • 3DO, COB: referenciados desde el Objectname del FBI.
  • GAF: referenciado desde el seqname de los elementos y el explosiongaf de las armas.
  • TDF de gamedata: moveinfo.tdf, sound.tdf y sidedata.tdf, referenciados desde campos del FBI.
  • Sonido: cómo se resuelve SoundCategory en archivos WAV.
  • Glosario: side, footprint, yardmap, schema.