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
}
}
[MENUENTRY] — розширення меню будівництва
Файли в 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.