Усі сторінки форматів ↓
Юніти, скрипти, конфігурації

TDF / FBI / OTA — текстові конфігураційні файли

Джерело: coreprime/kbot @ 0ab97bf · Редагувати на GitHub

Файли TDF («Text Data File»), FBI («Feature/Building/Item») і OTA («Online Total Annihilation») мають один і той самий текстовий формат, схожий на INI. Саме в них Cavedog описувала усе, що не було двійковим: характеристики юнітів, параметри зброї, визначення об'єктів, метадані місій, категорії звуків, підказки для ШІ.

Розширення Де трапляється Приклади
.fbi units/ ARMCOM.FBI, CORRAID.FBI — визначення юнітів
.tdf features/, weapons/, sounds/, gamedata/ тощо armflak_weapon.tdf, treeb.tdf
.ota maps/ metal heck.ota — метадані мапи, стартові позиції, вказівки для ШІ

Це звичайні файли ASCII; їх можна відкрити в будь-якому текстовому редакторі.

Tip

Спробуйте самі.

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

Про перегляд у терміналі й параметри розгортання (flatten) див. довідник CLI kbot mount.

З Go. Скористайтеся пакетом 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"))

Синтаксис

Файл TDF — це дерево секцій. Кожна секція має ім'я у квадратних дужках, а за ним — тіло { ... } з парами ключ=значення та/або вкладеними секціями.

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

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

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

Правила:

  • Імена секцій пишуться у квадратних дужках; усе, що йде далі до відповідної }, належить цій секції. Секція може займати один рядок ([special0] { specialwhat=StartPos1; XPos=464; ZPos=216; }).
  • Значення триває від = до наступної ;, навіть через розриви рядків: ніщо інше його не завершує, тож фігурні й квадратні дужки та = усередині значення — звичайний текст, а символу ; у значенні бути не може взагалі. Пробіли, табуляції й розриви рядків на обох кінцях ключа чи значення обрізаються. Ключ, якому присвоєно значення двічі, зберігає останнє.
  • Ключі нечутливі до регістру. UnitName, unitname і UNITNAME позначають одне й те саме поле; інструменти зазвичай під час читання зводять їх до нижнього регістру. Імена секцій теж порівнюються без урахування регістру.
  • Значення за замовчуванням — рядки. Числа читаються як у C, з початкових цифр: 12abc читається як 12, а 56.8 — як 56 там, де гра очікує ціле число (поля на кшталт killmul і tidalstrength читаються як дробові). Списки розділяються пробілами (наприклад, Category=NOTSUB COMMANDER NOTAIR ...).
  • Коментарі вилучаються ще до того, як читається все інше: // до кінця рядка й блоки /* ... */, які можуть займати кілька рядків. Тож missiondescription=See http://tauniverse.com; втрачає все від // і далі, зокрема свою ;, і значення переходить на наступний рядок. kbot відмовляється записувати значення, що містить ;, // або /*.
  • Пробільні символи й порожні рядки ігноруються.

Вкладені секції (як-от [SOUNDS] усередині [UNITINFO] вище) — звичайна річ у FBI/OTA. Специфікація TDF не встановлює максимальної глибини; на практиці понад 3 рівні не трапляються.


FBI — визначення юнітів

FBI — це повне уявлення рушія про юніт. Він зводить в одному місці 3D-модель юніта, скрипт, список зброї, звуковий банк, вартість будівництва й бойову поведінку. Скорочений приклад 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;
        ...
    }
}

Посібник спільноти з FBI 1998 року (збережений серед вихідних матеріалів цього репозиторію) описує понад сотню полів. Більшість із них зрозумілі без пояснень; неочевидними зазвичай бувають такі:

Поле Що насправді визначає
Bmcode Код сторінки меню будівництва — для звичайних юнітів залиште 1.
Category Список тегів через пробіл, який використовують BadTargetCategory зброї, NoChaseCategory, ШІ та меню будівництва.
MovementClass Посилається на клас у gamedata/movinfo.tdf, що визначає допустимі нахили рельєфу, глибину води тощо.
YardMap ASCII-малюнок (наприклад, oooo\noooo\n), який задає площу основи (footprint) юніта й обмеження «вода/суходіл» для кожної клітинки.
Corpse Ім'я [FEATURE] (див. нижче), що залишається як уламки.
SoundCategory Обирає звуковий банк у gamedata/sound.tdf.
TEDClass Підказка для редактора Cavedog; під час гри ігнорується.

Important

UnitName — ключ, за яким юніт шукають усюди: на нього посилаються OTA, ШІ, меню будівництва. Якщо ви перейменовуєте FBI, доведеться пройтися grep-ом по всьому моду й знайти всі посилання.


TDF — визначення об'єктів, зброї, звуків

Файли features/**/*.tdf містять секції [FEATURE], по одній на кожен статичний об'єкт мапи. Формат TNT (TNT) посилається на них за іменем секції:

[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)
}

weapons/*.tdf побудовані за тим самим шаблоном, із секціями [WEAPON_NAME]. Поле FBI Weapon1=COMMANDER_WEAPON розв'язується в секцію [COMMANDER_WEAPON] у якомусь TDF у weapons/ через таблицю зброї гри, індексовану за ID: кожна секція потребує ID= у діапазоні 0–255, пізніша секція з тим самим ID заміщає ранішу, а ім'я розв'язується в найменший слот, що його містить (див. Gamedata: таблиця зброї). Посібник спільноти зі зброї описує близько 60 різних полів; найзмістовніші з них — ballistic/lineofsight/dropped (архетип зброї), weapontimer, weaponvelocity, areaofeffect, edgeeffectiveness, burst/burstrate і підсекція [DAMAGE] (модифікатори шкоди за категоріями).

[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
    }
}

Файли в download/*.tdf додають юніт до меню будівництва одного чи кількох будівельних юнітів, не змінюючи sidedata.tdf. Саме цим механізмом розширення Core Contingency від Cavedog додає свої юніти, і саме цієї домовленості дотримується кожне .ufo-доповнення з одним юнітом.

[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;
}
Поле Тип Значення
UNITMENU str UnitName будівельного юніта, до меню якого ми додаємо.
MENU int Номер сторінки меню будівництва. 1–2 Cavedog зарезервувала для стандартних юнітів; за домовленістю спільноти починають із 3.
BUTTON int Слот на сторінці (0–5, розташовані сіткою 2 стовпці × 3 рядки: 0=угорі ліворуч, 1=угорі праворуч, 2=посередині ліворуч, 3=посередині праворуч, 4=унизу ліворуч, 5=унизу праворуч).
UNITNAME str Юніт, який додається, — має збігатися з UnitName= у FBI вашого юніта.

Домовленість про імена файлів. Файл за домовленістю називають download/<UNITNAME>.tdf (за UNITNAME= першого запису), але рушій читає кожен *.tdf у download/, тож ім'я файлу — лише підказка для моддера. Зазвичай в одному файлі — один юніт.

Кілька записів. Один файл може містити кілька записів: у download/Armfort.tdf від Cavedog їх три, щоб Arm Fortification Wall можна було будувати з ACK, ACV і ACA. TA 3.1c читає перші п'ять секцій кожного файлу, хоч як би вони називалися ([MENUENTRY1] — це домовленість, але [ENTRY0] теж працює); шоста секція ніколи не читається. Запис, чий UNITMENU не відповідає жодному юніту або жодному юніту з Builder=1, ігнорується, так само як і запис, чий UNITNAME не відповідає жодному юніту. MENU і BUTTON обрізаються до 8 бітів, а меню будівельника — його список [CANBUILD] плюс юніти, додані через download, — вміщує щонайбільше 31 юніт.

Important

download/*.tdf додає до меню будівництва, нічого не заміщуючи. Якщо обраний вами слот збігається з наявним записом, поведінка рушія непередбачувана: зазвичай перемагає запис, завантажений пізніше, але порядок завантаження .ufo на різних платформах не гарантований. Для модів, які мають співіснувати, обирайте високу сторінку MENU (4 або 5).

Це адитивний механізм для модів, який дає змогу постачати один .ufo, не створюючи власної копії 50-кілобайтного sidedata.tdf. Повний приклад використання див. у посібнику з моддингу.


OTA — метадані мапи

.ota постачається разом із кожним .tnt і містить усе, що потрібно рушію, щоб грати на мапі (на відміну від рендерингу її рельєфу):

[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 читає відповідний .ota й малює нумеровані позначки на кожній стартовій позиції обраної схеми.

Як гра читає схеми й стартові позиції (кожне подання kbot — редактор мап у студії, пісочниця, оглядач ресурсів, kbot tnt preview, kbot tnt lint і Quality Checker — читає їх так само, через ігрове подання OTA з kbot-io):

  • Схеми знаходять за іменем — Schema 0, Schema 1, … аж до першого відсутнього номера. Імена порівнюються без урахування регістру ([schema 1] теж рахується), але номер має бути записано звичайним числом: [Schema0] чи [Schema 01] не знаходиться ніколи, а схема після пропуску (Schema 0, Schema 1, Schema 3) ніколи не читається. SCHEMACOUNT ігнорується.
  • Сутички й мережеві ігри обирають схему за Type і кількістю стартових позицій, а не за порядком. Підходять лише схеми від Network 1 до Network 4 (порівнюються без урахування регістру) з принаймні однією стартовою позицією. Для N гравців гра віддає перевагу останній придатній схемі з рівно N стартовими позиціями, а інакше — схемі з найбільшою їх кількістю. Місія кампанії обирає за складністю (Easy, Medium, Hard). numplayers — це лише текст, який показується в лобі (і 2, 4, і 2-8, і Any — усе завантажується).
  • Стартові позиції — це записи [specials], у яких specialwhat починається зі StartPos (без урахування регістру). StartPosN — це слот гравця N-1, StartPos0 — теж слот 0, а запис без номера після StartPos отримує власний наступний номер (перший — 1). XPos і ZPos задано в пікселях мапи й обрізано до 16 бітів.
  • Відсутні ключі мають значення за замовчуванням, а не нулі: за відсутності missiondescription показується «No description available», відсутній maxunits (лише в кампаніях) означає 200, а заздалегідь розставлений об'єкт ([features]) без XPos чи ZPos пропускається, тож об'єкту в стовпці чи рядку 0 потрібен явний 0.

Note

Редактор мап у студії редагує .ota мапи на місці. Під час збереження змінюються лише значення, які ви відредагували (а також додаються чи видаляються схеми й стартові позиції, які ви додали чи видалили); усе інше — ключі перемоги й тригерів, useonlyunits, [units], [features], інші [specials], дробові значення на кшталт killmul=0.5, коментарі — записується назад без змін. Видалення схеми чи стартової позиції переписує файл у форматі kbot-io (той самий вміст, без коментарів) і перенумеровує наступні схеми, щоб гра й далі їх знаходила. .ota, який kbot не може прочитати, показується з помилкою й під час збереження лишається без змін, а текст діалогів, що містить ;, // або /*, відхиляється. Так само відхиляється збереження, через яке гра почала б читати схему, яку зараз пропускає: нова схема отримує найменший вільний номер, тож у файлі з [Schema 0] і [Schema 2] нова [Schema 1] ввела б у гру [Schema 2]; помилка називає секцію, яку треба перейменувати або видалити. Дробове значення, завелике для зберігання (killmul=1e999, яке гра читає як нескінченність), показується як найбільше можливе число й зберігається в записаному вигляді, якщо ви його не зміните. Гра бере рівень моря із заголовка .tnt; редактор синхронізує наявний ключ sealevel=, але ніколи не додає нового.


Розібраний приклад — мінімальний юніт

Повний робочий «фіктивний» FBI для стаціонарної турелі:

[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;
    }
}

Щоб це стало повноцінним доповненням із юнітом, у ньому мають бути:

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

…а потім запакувати каталог у HPI:

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

Підводні камені

Warning

Кожне значення має закінчуватися на ;. Пропущена крапка з комою не спричиняє помилки — парсер мовчки зливає значення з наступним рядком, і виходять незбагненні характеристики (MaxDamage=3000, за яким іде незавершений Description=..., дає юніта з 30 000 очок міцності й без підказки).

  • Ключі нечутливі до регістру, а значення — чутливі. Side=arm логіка класифікації юнітів сприйме як ARM, але моди, що змінюють сторони на льоту через if (Side == "ARM") з порівнянням рядків на рівність, зламаються.
  • Значення-списки розділяються пробілами (Category=COMMANDER MOBILE WEAPON), а не комами. Рушій розбиває список за будь-якими пробільними символами.
  • Утім, деякі поля OTA використовують коми: numplayers=2,4,6,8,10. Єдиної домовленості щодо роздільника списків немає, а numplayers гра взагалі ніколи не розбирає — лише показує текст.
  • Вкладені секції не мають формального обмеження глибини, але Cavedog ніколи не постачала нічого глибше 3 рівнів. Редактори, що розраховують на 2 рівні, ламаються на кількох TDF зброї з вкладеністю на кшталт [WEAPON][DAMAGE][category].
  • Булеві поля — цілі числа (canmove=1, canstop=0), а не true/false. Рушій приймає лише 1/0.
  • У файлах .ota в описах місій постійно трапляються «кракозябри» з UTF-8 (типографські лапки з Word тощо). Рушій рендерить їх у кодовій сторінці Windows-1252 і показує порожні прямокутники замість усього, що за неї виходить.

Типові розміри

Ресурс Діапазон у вмісті Cavedog
FBI юніта 1–4 КБ (командир: ~3 КБ; легкий танк: ~1,5 КБ)
TDF з одним об'єктом 200 Б – 1 КБ
TDF зброї 0,5–3 КБ на секцію [WEAPON]
Файл OTA 1–8 КБ
gamedata/sidedata.tdf ~50 КБ (здебільшого розмітка HUD)
gamedata/sound.tdf ~20 КБ
Усього FBI у TA + CC ~250 файлів

Додаток A — словник полів FBI

Усі поля, що зазвичай трапляються в units/*.fbi, згруповані за призначенням. Значення стовпця «Тип»: str — ідентифікатор/рядок; int — ціле число; float — число з рухомою комою; bool — 0/1; list — токени, розділені пробільними символами; enum — невелике ціле число із задокументованими значеннями.

Поля, яких тут немає, — це або службові поля редактора (UnitNumber, Copyright), або незадокументовані. Невідомі ключі рушій мовчки ігнорує.

Ідентифікація й відображення

Поле Тип Примітки
UnitName str Основний ключ пошуку. На нього посилаються інші конфігурації, ШІ, OTA, меню будівництва.
Side str ARM або CORE (TA), Aramon/Taros/Veruna/Zhon (TA:K). Відповідає [SIDE<N>] у gamedata/sidedata.tdf.
Objectname str Базове ім'я для 3D-сітки .3do, скрипту .cob і портрета unitpics/*.pcx юніта.
Designation str «Код типу», що показується на панелі інформації про юніт (наприклад, ARM-WM для командира Arm).
Name str Коротке ім'я, що показується над юнітом.
Description str Текст підказки на кнопці будівництва й на панелі інформації про юніт.
GermanName / FrenchName / SpanishName / ItalianName / JapaneseName / PigLatinName str Локалізовані імена. Використовуються відповідно до мовної версії гри.
GermanDescription / FrenchDescription / SpanishDescription / ItalianDescription / JapaneseDescription / PigLatinDescription str Локалізований текст підказки.
Version int Версія схеми, яку відстежує редактор. У релізному вмісті завжди 1 або 2.
UnitNumber int ID лише для редактора. Під час гри ігнорується.
Copyright str Довільний рядок копірайту. Ігнорується.
TEDClass str Класифікація редактора TAE (KBOT, TANK, COMMANDER, …). Суто косметична.

Економіка й будівництво

Поле Тип Примітки
BuildCostMetal int Метал, потрібний для побудови цього юніта.
BuildCostEnergy int Енергія, потрібна для побудови цього юніта.
BuildTime int Будівельна потужність × секунди. Рушій ділить на WorkerTime будівельника, щоб отримати реальний час будівництва.
WorkerTime int Будівельна потужність, яку дає цей юніт, коли він будівельник.
EnergyUse int Енергія, що витрачається за тік, коли юніт активний.
EnergyMake int Енергія, що виробляється за тік, коли юніт активний.
MetalUse int Метал, що витрачається за тік.
MetalMake int Метал, що виробляється за тік.
EnergyStorage int Місткість сховища. Не задається для юнітів, які не є сховищами.
MetalStorage int Місткість сховища. Не задається для юнітів, які не є сховищами.
MakesMetal int Метал, який перетворювач металу виробляє за секунду, поки він увімкнений і його енергію оплачено; читається як ціле число (1.9 — це 1). На відміну від MetalMake, яке діє завжди.
ExtractsMetal float Метал, який екстрактор видобуває на одиницю металу мапи під своєю площею основи, поки він увімкнений і має живлення.
TidalGenerator bool Енерговіддача цього юніта залежить від tidalstrength мапи.
WindGenerator bool Енерговіддача залежить від діапазону швидкості вітру на мапі.
Builder bool Може будувати інші юніти.
Builddistance int Максимальна відстань дії нанотокарні, у клітинках по 16 пікселів.
CanReclamate bool Може переробляти уламки й об'єкти.
CanCapture bool Може захоплювати ворожі юніти (лише командири).
ActivateWhenBuilt bool Після завершення будівництва перемикач «активний» за замовчуванням увімкнено.
onoffable bool Має перемикач увімк./вимк., яким може користуватися гравець.

Бій і живучість

Поле Тип Примітки
MaxDamage int Очки міцності.
Weapon1 / Weapon2 / Weapon3 str Імена секцій зброї в weapons/*.tdf. До 3 видів зброї.
wpri_badTargetCategory list Категорії, проти яких основна зброя діє погано (знижений пріоритет).
wsec_badTargetCategory list Те саме для другорядної зброї.
BadTargetCategory list Цілі, яких юніт загалом уникає.
NoChaseCategory list Цілі, які юніт не переслідуватиме (стрілятиме, лише якщо вони в зоні досяжності).
canattack bool Може взагалі стріляти зі зброї.
candgun bool Може вручну стріляти з 3-ї зброї (D-gun командира).
commandfire bool Кожен постріл має ініціювати гравець.
ExplodeAs str Ім'я зброї для вибуху під час загибелі (у weapons/*.tdf).
SelfDestructAs str Ім'я зброї для вибуху під час самознищення.
Corpse str Ім'я секції [FEATURE] у features/**/*.tdf, що залишається як уламки.
HealTime int Секунди до повного відновлення на ремонтній платформі.
DamageModifier float Множник вхідної шкоди. <1 = стійкий.
ImmuneToParalyzer bool Ігнорує паралізуючу зброю.
HideDamage bool Приховує смугу пошкоджень від ворога.
kamikaze bool Підривається від контакту замість стрільби.
firestandorders bool Має перемикач постійного наказу щодо вогню.
StandingFireOrder enum Режим вогню за замовчуванням: 0 = не стріляти, 1 = відповідати на вогонь, 2 = на власний розсуд. Відсутній ключ дає 2; явне значення зберігає два молодші біти, тож 0 справді означає Hold Fire.
mobilestandorders bool Має перемикач постійного наказу щодо руху.
StandingMoveOrder enum Режим руху за замовчуванням: 0 = утримувати позицію, 1 = маневрувати, 2 = вільно пересуватися. Відсутній ключ дає 2; явне значення зберігає два молодші біти (0 у командирів — це Hold Position).
ShootMe bool Підказка для ШІ/комп'ютерних суперників: пріоритетно цілитися в цей юніт.
Commander bool Позначає юніт як командира (його загибель означає поразку).

Рух

Поле Тип Примітки
MaxVelocity float Максимальна швидкість у світових одиницях за тік.
Acceleration float Приріст швидкості за тік.
BrakeRate float Втрата швидкості за тік під час зупинки.
TurnRate int Швидкість обертання в одиницях 2π/65536 за тік.
MaxSlope int Найкрутіший нахил суходолу, на який юніт може піднятися. За замовчуванням 255.
MaxWaterDepth int Найбільша глибина води, у яку юніт може зайти. 0 = лише суходіл; за замовчуванням 10000.
MinWaterDepth int Мінімальна глибина води (лише для кораблів). За замовчуванням -10000.
MovementClass str Ім'я класу в gamedata/moveinfo.tdf ([CLASS0]–[CLASS31]). Якщо клас знайдено, його площа основи, глибини води й нахили заміщують власні ключі FBI (див. Gamedata).
SteeringMode enum 0/1/2 — спершу поворот, потім рух; рух по дузі; миттєвий поворот.
Upright bool Юніт рендериться стоячи (кботи) або пласко (техніка).
BankScale float Наскільки сильно юніт крениться під час повороту (авіація). За замовчуванням 1; з явним 0 юніт ніколи не крениться.
PitchScale float Наскільки сильно юніт змінює тангаж під час розгону.
Scale float Множник візуального масштабу (1.0 = звичайний).
CanFly bool Прапорець авіації.
crusisealt int Крейсерська висота для літальних апаратів.
attackrunlength int Дистанція штурмового заходу для VTOL/бомбардувальників.
HoverAttack bool Літак зависає під час атаки (бойові гелікоптери).
floater bool Плаває на поверхні води.
canmove bool Юніт узагалі може рухатися.
canpatrol bool Наказ патрулювати доступний.
canstop bool Наказ зупинитися доступний.
canguard bool Наказ охороняти доступний.
canload bool Може завантажувати юніти для перевезення.
transportsize int Клас розміру для перевірок під час завантаження в транспорт.
transportmaxunits / TransMaxUnits int Місткість транспортного юніта.
manuverleashlength (також maneuverleashlength) int Як далеко від своєї позиції юніт маневруватиме.
BadSlope int Нахил, на якому рух сповільнюється, але не блокується.
BuildAngle int Максимальний нахил, на якому цей юніт можна побудувати.

Сенсори

Поле Тип Примітки
SightDistance int Радіус зони видимості (LOS) у клітинках по 16 пікселів.
RadarDistance int Радіус покриття радара. 0 = радара немає.
SonarDistance int Радіус покриття сонара.
RadarDistanceJam int Радіус, у якому юніт глушить ворожі радари.
Stealth bool Юніт не з'являється на ворожих радарах.
CloakCost int Енергія за тік на маскування, поки юніт стоїть.
CloakCostMoving int Енергія за тік на маскування, поки юніт рухається.
mincloakdistance int Маскування не діє, якщо ворог ближче, ніж за цю кількість клітинок.

Меню будівництва й площа основи

Поле Тип Примітки
Bmcode int Код меню будівництва. Залиште 1 для юнітів, які можна будувати; 0 для будівель, які не показуються.
FootprintX / FootprintZ int Площа основи в клітинках по 16 пікселів. Має збігатися з площею основи MovementClass.
YardMap str Багаторядкова ASCII-сітка (o=відкрито, c=закрито, w=вода, g=геотермальне джерело), що задає обмеження для кожної клітинки.
ThreeD bool Рендериться як 3D-модель. Для релізних юнітів завжди 1.
ZBuffer bool Використовувати Z-буфер. Завжди 1.
NoShadow bool Не рендерити тінь.
NoAutoFire bool Вимкнути автоматичну стрільбу.
norestrict bool Не застосовувати заборонені зони.
IsAirBase bool Тут може сідати й ремонтуватися авіація.
IsFeature bool Вважати статичним об'єктом, а не юнітом.
Category list Критично важливе. Список тегів, розділених пробільними символами, який використовують наведення зброї, ваги ШІ, меню будівництва. Стандартні токени: MOBILE, WEAPON, SURFACE, UNDERWATER, VTOL, KBOT, TANK, SHIP, LEVEL1/LEVEL2/LEVEL3, NOTSUB, NOTAIR, COMMANDER, назви сторін.
WaterLine int Глибина, на якій осідає плавучий юніт.
altfromsealevel int Висота літака відраховується від рівня моря, а не від рельєфу.

Звук

Поле Тип Примітки
SoundCategory str Ім'я секції в gamedata/sound.tdf, яка надає голосові семпли юніта.
[SOUNDS] (вкладена секція) підсекція Вбудовані перевизначення для окремих подій (canselect=…, select1=… тощо).

Різне / маловивчене

Поле Тип Примітки
DefaultMissionType str Початковий стан завдання (Standby, Move тощо).
sortbias int Вага сортування в меню будівництва.
teleporter bool Позначає платформу телепортації (Galactic Gate).
IsAirBase bool Див. «Меню будівництва й площа основи» — продубльовано для повноти.
Ovradjust bool Вмикає незадокументоване перевизначення в рушії; використовує лише командир.
ShowPlayerName bool Показує ім'я гравця над юнітом (лише командир).
MoveRate1 / MoveRate2 int Службове поле редактора. Під час гри не використовується.
antiweapons bool Використовується платформами захисту від зброї (Fortitude, anti-nuke).

Живі приклади в довідковому каталозі

Використання полів найкраще вивчати на справжніх FBI. Довідкові репозиторії каталогізують кожен юніт, що постачався з грою:

  • TA — усі FBI: добрі «насичені» приклади — ARMCOM (командир із Commander=1, CloakCost, MaxDamage=3000), ARMSAM (турель із заповненими Weapon1/2/3), ARMBRAWL (літальний апарат із CanFly, crusisealt, BankScale), ARMMEX (екстрактор металу з ExtractsMetal).
  • TA — усі TDF зброї: [FLAMETHROWER] для burst/burstrate/firestarter, [NUCLEAR_MISSILE] для двофазних керованих ракет, [LIGHTNING] для променевої зброї.
  • TA — дерево будівництва об'єктів і зброї — кожна реєстрація [MENUENTRY] в інсталяції.
  • Юніти TA: Kingdoms — інший набір полів (buildcost= з одним ресурсом, damagecategory=, вбудовані [WEAPONn]). ARAKING (Elsin, монарх Aramon) і ARAARCH (Archer) — зручні для початку.

Див. також

  • TNT — посилається на імена об'єктів, які розв'язуються в секції TDF [FEATURE].
  • 3DO, COB — на них посилається Objectname у FBI.
  • GAF — на нього посилаються seqname об'єкта й explosiongaf зброї.
  • TDF у gamedata — moveinfo.tdf, sound.tdf, sidedata.tdf, на які посилаються поля FBI.
  • Звук — як SoundCategory розв'язується у файли WAV.
  • Глосарій — side, footprint, yardmap, schema.