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,unitnameyUNITNAMEse 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:
12abcse lee como 12 y56.8como 56 allí donde el juego espera un número entero (campos comokillmulytidalstrengthse 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
}
}
[MENUENTRY]: ampliación del menú de construcción
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.SCHEMACOUNTse ignora. - Las escaramuzas y las partidas multijugador eligen un esquema por
Typey número de posiciones de inicio, no por su posición en el archivo. Solo cuentan los esquemasNetwork 1aNetwork 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).numplayerses solo un texto que se muestra en el lobby (2, 4,2-8yAnycargan todos). - Las posiciones de inicio son las entradas de
[specials]cuyospecialwhatempieza porStartPos(sin distinguir mayúsculas).StartPosNes la plaza de jugador N-1,StartPos0también es la plaza 0, y una entrada sin número trasStartPostoma el siguiente número de su propia serie (el primero es 1).XPosyZPosson píxeles del mapa, limitados a 16 bits. - Las claves que faltan tienen valores por defecto, no ceros: si falta
missiondescriptionse muestra «No description available», si faltamaxunits(solo en campañas) se usan 200, y un elemento colocado de antemano ([features]) sinXPosoZPosse omite, así que uno en la columna o la fila 0 necesita un0explí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=armfuncionará con la lógica que clasifica las unidades de ARM, pero fallarán los mods que cambian de bando sobre la marcha conif (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 analizanumplayers: 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), notrue/false. El motor solo acepta1/0. - Los archivos
.otatienen 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 conCommander=1,CloakCost,MaxDamage=3000),ARMSAM(torreta conWeapon1/2/3rellenos),ARMBRAWL(aeronave conCanFly,crusisealt,BankScale) yARMMEX(extractor de metal conExtractsMetal). - TA: todos los TDF de armas:
[FLAMETHROWER]paraburst/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) yARAARCH(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
Objectnamedel FBI. - GAF: referenciado desde el
seqnamede los elementos y elexplosiongafde las armas. - TDF de gamedata:
moveinfo.tdf,sound.tdfysidedata.tdf, referenciados desde campos del FBI. - Sonido: cómo se resuelve
SoundCategoryen archivos WAV. - Glosario: side, footprint, yardmap, schema.