すべての形式のページ ↓
ユニット、スクリプト、設定

TDF / FBI / OTA — テキスト形式の設定ファイル

出典:coreprime/kbot @ 0ab97bf · GitHubで編集

TDF(「Text Data File」)、FBI(「Feature/Building/Item」)、OTA(「Online Total Annihilation」)の各ファイルは、どれもINIに似た同じテキスト形式を使っています。Cavedogがバイナリではないものをすべて記述するための標準的な手段で、ユニットのステータス、武器のパラメーター、地形物の定義、ミッションのメタデータ、サウンドのカテゴリ、AIへのヒントなどがこの形式で書かれています。

拡張子 置き場所 例
.fbi units/ ARMCOM.FBI、CORRAID.FBI — ユニット定義
.tdf features/、weapons/、sounds/、gamedata/など armflak_weapon.tdf、treeb.tdf
.ota maps/ metal heck.ota — マップのメタデータ、開始位置、AI向けの情報

これらのファイルはプレーンな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;
    }
}

規則:

  • セクション名は角括弧で囲みます。その後に続く、対応する}までのすべてがそのセクションに属します。セクションを1行に収めることもできます([special0] { specialwhat=StartPos1; XPos=464; ZPos=216; })。
  • 値は=から次の;までで、改行をまたいで続きます。それ以外に値を終わらせるものはないので、値の中の波括弧、角括弧、=はただの文字として扱われ、値に;を含めることはできません。キーや値の両端にあるスペース、タブ、改行は取り除かれます。同じキーに2回代入すると、最後の値が残ります。
  • キーは大文字と小文字を区別しません。UnitName、unitname、UNITNAMEはどれも同じフィールドを指します。ツールは読み込み時に小文字にそろえるのが一般的です。セクション名も大文字と小文字を区別せずに比較されます。
  • 値は既定では文字列です。数値はC言語と同じく、先頭の数字から読み取られます。ゲームが整数を求める箇所では、12abcは12、56.8は56として読まれます(killmulやtidalstrengthなどのフィールドは小数として読まれます)。リストはスペース区切りです(例:Category=NOTSUB COMMANDER NOTAIR ...)。
  • コメントは、ほかの何よりも先に空白に置き換えられます。対象は行末までの//と、複数行にまたがってもよい/* ... */ブロックです。そのためmissiondescription=See http://tauniverse.com;は//以降が;も含めてすべて失われ、値は次の行まで続いてしまいます。kbotは;、//、/*を含む値の書き込みを拒否します。
  • 空白文字と空行は無視されます。

入れ子のセクション(上の例の[UNITINFO]の中の[SOUNDS]など)は、FBIやOTAではよく見られます。TDFの仕様は深さの上限を定めていませんが、実際には3段より深いものは見かけません。


FBI — ユニット定義

FBIはエンジンから見たユニットのすべてです。ユニットの3Dモデル、スクリプト、武器のリスト、サウンドバンク、建設コスト、戦闘時のふるまいを1か所にまとめています。ARMコマンダーの例を短くしたものを示します。

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

1998年にコミュニティが書いたFBIガイド(このリポジトリの資料に保存されています)は、100を超えるフィールドを解説しています。ほとんどは名前を見ればわかりますが、わかりにくいのは次のようなものです。

フィールド 実際に制御するもの
Bmcode 建設メニューのページコード。通常のユニットでは1のままにします。
Category スペース区切りのタグのリスト。武器のBadTargetCategory、NoChaseCategory、AI、建設メニューが使います。
MovementClass gamedata/movinfo.tdfのクラスを参照し、通行できる地形の傾斜や水深などを定めます。
YardMap ASCIIの絵(例:oooo\noooo\n)で、ユニットのフットプリントと、マスごとの水上・陸上の制限を宣言します。
Corpse 残骸として残す[FEATURE](後述)の名前。
SoundCategory gamedata/sound.tdfの中の音声バンクを選びます。
TEDClass Cavedogのエディター向けのヒント。実行時には無視されます。

Important

UnitNameは、ほかのあらゆる場所で参照に使われるキーです。OTAもAIも建設メニューもこれを参照します。FBIの名前を変えるなら、MOD全体をgrepして参照箇所を探さなければなりません。


TDF — 地形物・武器・サウンドの定義

features/**/*.tdfファイルには[FEATURE]セクションが入っており、マップに置く静的なオブジェクト1つにつき1セクションです。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フィールドは、ゲームのIDで索引付けされた武器テーブルを通じて、weapons/内のいずれかのTDFにある[COMMANDER_WEAPON]セクションに解決されます。各セクションには0〜255のID=が必要で、同じ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を変更せずに、1つ以上の建設ユニットの建設メニューにユニットを登録します。CavedogのCore Contingency拡張パックが自分のユニットを追加するのに使っている仕組みで、ユニット1体だけの.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 追加されるユニット。自分のユニットのFBIにあるUnitName=と一致していなければなりません。

ファイル名の慣例。ファイル名は慣例としてdownload/<UNITNAME>.tdf(最初のエントリのUNITNAME=に合わせる)とします。ただしエンジンはdownload/内のすべての*.tdfを読むので、ファイル名はMOD制作者向けの目印にすぎません。1ファイルにユニット1体が普通です。

複数のエントリ。1つのファイルに複数のエントリを入れられます。Cavedogのdownload/Armfort.tdfは3つのエントリを使って、ARMの防壁をACK、ACV、ACAから建設できるようにしています。TA 3.1cは各ファイルの最初の5セクションを、名前に関係なく読みます(慣例は[MENUENTRY1]ですが、[ENTRY0]でも動きます)。6番目のセクションが読まれることはありません。UNITMENUがどのユニットも指していないエントリや、Builder=1のユニットを指していないエントリは無視されます。UNITNAMEがどのユニットも指していないエントリも同様です。MENUとBUTTONは8ビットに収められ、建設ユニットのメニュー([CANBUILD]のリストとdownloadによる追加分の合計)に入るのは最大31ユニットです。

Important

download/*.tdfは建設メニューに追加するだけで、何も置き換えません。選んだスロットが既存のエントリと重なると、エンジンの動作は予測できません。通常は後から読み込まれたエントリが勝ちますが、.ufoの読み込み順はプラットフォームをまたいで保証されてはいません。ほかのMODと共存させるつもりなら、大きなMENUページ(4か5)を選んでください。

これは、50 KBのsidedata.tdfをフォークせずに.ufoを1つだけ配布できるようにする、追加型のMOD用フックです。最初から最後までの使い方はMOD制作チュートリアルを参照してください。


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)も、すべてkbot-ioのOTAゲームビューを通じて同じように読みます。

  • スキーマは名前で探されます。Schema 0、Schema 1、…と、最初に欠けた番号の手前まで続きます。名前は大文字と小文字を区別せずに比較されます([schema 1]も数えられます)が、番号はそのまま書かなければなりません。[Schema0]や[Schema 01]は決して見つからず、番号が飛んだ後のスキーマ(Schema 0、Schema 1、Schema 3)は読まれません。SCHEMACOUNTは無視されます。
  • スカーミッシュとマルチプレイのゲームは、位置ではなくTypeと開始位置の数でスキーマを選びます。対象になるのは、Network 1〜Network 4のスキーマ(大文字と小文字を区別せずに比較)のうち、開始位置が1つ以上あるものだけです。N人のプレイヤーなら、ゲームは開始位置がちょうどN個ある対象スキーマのうち最後のものを優先し、なければ開始位置が最も多いものを選びます。キャンペーンのミッションは難易度(Easy、Medium、Hard)で選びます。numplayersはロビーに表示されるテキストにすぎません(2, 4、2-8、Anyのどれでも読み込めます)。
  • 開始位置は、specialwhatがStartPosで始まる[specials]のエントリです(大文字と小文字は区別しません)。StartPosNはプレイヤースロットN-1で、StartPos0もスロット0です。StartPosの後に番号のないエントリには、それら専用の通し番号が次々に振られます(最初は1)。XPosとZPosはマップ上のピクセル単位で、16ビットに収められます。
  • 欠けたキーにはゼロではなく既定値が使われます。missiondescriptionがなければ「No description available」と表示され、maxunits(キャンペーンのみ)がなければ200になります。配置済みの地形物([features])でXPosやZPosがないものは飛ばされるので、列0や行0に置くものには明示的に0を書く必要があります。

Note

スタジオのマップエディターは、マップの.otaをその場で編集します。保存で変わるのは編集した値だけです(加えて、追加・削除したスキーマと開始位置がファイルでも追加・削除されます)。それ以外のもの、つまり勝利条件やトリガーのキー、useonlyunits、[units]、[features]、ほかの[specials]、killmul=0.5のような小数、コメントは、元のまま書き戻されます。スキーマや開始位置を削除すると、ファイルはkbot-ioのレイアウトで書き直され(内容は同じで、コメントは失われます)、ゲームが引き続き見つけられるよう後続のスキーマの番号が振り直されます。kbotが読めない.otaはエラーとともに表示され、保存しても変更されません。また、;、//、/*を含むダイアログのテキストは拒否されます。今は読み飛ばされているスキーマをゲームが読むようになってしまう保存も、同様に拒否されます。スキーマを追加すると空いている最小の番号が使われるため、[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")のように陣営をその場で切り替えるMODは動かなくなります。
  • リストの値はスペース区切りです(Category=COMMANDER MOBILE WEAPON)。カンマ区切りではありません。エンジンは任意の空白文字で分割します。
  • ただし、カンマを使うOTAフィールドもあります。numplayers=2,4,6,8,10がその例です。リストの区切り文字に統一された慣例はなく、しかもゲームはnumplayersをまったく解析せず、テキストを表示するだけです。
  • 入れ子のセクションに正式な深さの上限はありませんが、Cavedogが配布したものは3段より深くなっていません。2段までを前提にしたエディターは、[WEAPON][DAMAGE][category]のような入れ子を持ついくつかの武器TDFで失敗します。
  • 真偽値のフィールドは整数です(canmove=1、canstop=0)。true/falseではありません。エンジンが受け付けるのは1/0だけです。
  • .otaファイルのミッション説明には、UTF-8の文字化けがよくあります(Wordのスマートクォートなど)。エンジンはWindows-1252のコードページで表示するので、その範囲外の文字はすべて豆腐(□)になります。

典型的なサイズ

アセット Cavedogのデータで見られる範囲
ユニットのFBI 1〜4 KB(コマンダー:約3 KB、軽戦車:約1.5 KB)
地形物1つのTDF 200 B〜1 KB
武器のTDF [WEAPON]セクション1つあたり0.5〜3 KB
OTAファイル 1〜8 KB
gamedata/sidedata.tdf 約50 KB(大半はHUDのレイアウト)
gamedata/sound.tdf 約20 KB
TA + CCのFBIの総数 約250ファイル

付録A — FBIフィールド辞典

units/*.fbiでよく見られるフィールドをすべて、用途別にまとめます。型列の凡例:str = 識別子・文字列、int = 整数、float = 浮動小数点数、bool = 0/1、list = 空白文字区切りのトークン、enum = 意味が決まっている小さな整数。

ここにないフィールドは、エディター用の作業値(UnitNumber、Copyright)か、文書化されていないものです。エンジンは未知のキーを黙って無視します。

識別と表示

フィールド 型 備考
UnitName str 主な参照キー。ほかの設定ファイル、AI、OTA、建設メニューから参照されます。
Side str ARMまたはCORE(TA)、Aramon/Taros/Veruna/Zhon(TA:K)。gamedata/sidedata.tdfの[SIDE<N>]に対応します。
Objectname str ユニットの.3doメッシュ、.cobスクリプト、unitpics/*.pcxの肖像画に使う基本名。
Designation str ユニット情報パネルに表示される「タイプコード」(例:ARMコマンダーではARM-WM)。
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 稼働中に1ティックあたり消費するエネルギー。
EnergyMake int 稼働中に1ティックあたり生産するエネルギー。
MetalUse int 1ティックあたり消費する金属。
MetalMake int 1ティックあたり生産する金属。
EnergyStorage int 貯蔵量。貯蔵庫でないユニットでは空欄。
MetalStorage int 貯蔵量。貯蔵庫でないユニットでは空欄。
MakesMetal int 金属変換機がオンで、エネルギーが支払われている間に、1秒あたり変換する金属。整数として読まれます(1.9は1)。常時有効なMetalMakeとは別物です。
ExtractsMetal float 金属抽出機がオンで電力を得ている間に、フットプリントの下にあるマップの金属1単位あたりから得る金属。
TidalGenerator bool このユニットのエネルギー出力がマップのtidalstrengthに比例します。
WindGenerator bool 出力がマップの風速の範囲に応じて変わります。
Builder bool ほかのユニットを建設できます。
Builddistance int ナノ旋盤の最大距離(16 pxのマス単位)。
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ガン)。
commandfire bool すべての射撃をプレイヤーの指示によるものにします。
ExplodeAs str 破壊時の爆発に使う武器の名前(weapons/*.tdf内)。
SelfDestructAs str 自爆時の爆発に使う武器の名前。
Corpse str 残骸として残す、features/**/*.tdf内の[FEATURE]セクション名。
HealTime int 修理パッドで完全に回復するまでの秒数。
DamageModifier float 受けるダメージに掛かる倍率。<1なら耐性あり。
ImmuneToParalyzer bool 麻痺兵器の影響を受けません。
HideDamage bool ダメージバーを敵から隠します。
kamikaze bool 射撃せず、接触時に爆発します。
firestandorders bool 射撃命令のトグルを持ちます。
StandingFireOrder enum 射撃命令の初期値:0 = 射撃中止、1 = 反撃、2 = 自由射撃。キーがなければ2です。明示した値は下位2ビットが使われるので、0は本当に射撃中止になります。
mobilestandorders bool 移動命令のトグルを持ちます。
StandingMoveOrder enum 移動命令の初期値:0 = 現在地を固守、1 = 機動、2 = 自由移動。キーがなければ2です。明示した値は下位2ビットが使われます(コマンダーの0は現在地を固守)。
ShootMe bool AI・コンピューターの対戦相手へのヒント。このユニットを優先して狙わせます。
Commander bool コマンダーユニットであることを示します(倒されるとゲームに負けます)。

移動

フィールド 型 備考
MaxVelocity float 最高速度(1ティックあたりのワールド単位)。
Acceleration float 1ティックあたりに増す速度。
BrakeRate float 停止するときに1ティックあたり減る速度。
TurnRate int 回転速度(1ティックあたり、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 ユニットを直立(Kボット)または水平(車両)で描画します。
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 視界の半径(16 pxのマス単位)。
RadarDistance int レーダーの探知半径。0 = レーダーなし。
SonarDistance int ソナーの探知半径。
RadarDistanceJam int ユニットが敵のレーダーを妨害する半径。
Stealth bool 敵のレーダーに映りません。
CloakCost int 静止中にクロークを維持するための、1ティックあたりのエネルギー。
CloakCostMoving int 移動中にクロークを維持するための、1ティックあたりのエネルギー。
mincloakdistance int この数のマス以内に敵がいると、クロークが解けます。

建設メニューとフットプリント

フィールド 型 備考
Bmcode int 建設メニューのコード。ユニットから建設できるものは1のまま、メニューに出ない建物は0。
FootprintX / FootprintZ int フットプリント(16 pxのマス単位)。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 非常に重要。武器の照準、AIの重み付け、建設メニューが使う、空白文字区切りのタグのリスト。標準のトークン: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 テレポート台であることを示します(銀河ゲート)。
IsAirBase bool 「建設メニューとフットプリント」を参照。網羅のために重複して載せています。
Ovradjust bool 文書化されていないエンジンの上書き処理を起動します。使うのはコマンダーだけです。
ShowPlayerName bool ユニットの上にプレイヤー名を表示します(コマンダーのみ)。
MoveRate1 / MoveRate2 int エディター用の作業値。実行時には使われません。
antiweapons bool 迎撃兵器の台座が使います(フォーティチュード、核迎撃)。

リファレンスカタログの実例

フィールドの使い方は、実際のFBIから学ぶのがいちばんです。リファレンスのリポジトリには、収録されている全ユニットがカタログ化されています。

  • TA — 全FBI:「充実した」例としては、ARMCOM(Commander=1、CloakCost、MaxDamage=3000を持つコマンダー)、ARMSAM(Weapon1/2/3がすべて埋まった砲塔)、ARMBRAWL(CanFly、crusisealt、BankScaleを持つ航空機)、ARMMEX(ExtractsMetalを持つ金属抽出機)がよいでしょう。
  • TA — 全武器TDF:burst/burstrate/firestarterなら[FLAMETHROWER]、2段階の誘導ミサイルなら[NUCLEAR_MISSILE]、ビーム兵器なら[LIGHTNING]。
  • TA — 地形物と武器の建設ツリー — インストール内のすべての[MENUENTRY]登録。
  • TA: Kingdomsのユニット — フィールドの構成が異なります(資源が1つだけのbuildcost=、damagecategory=、インラインの[WEAPONn])。ARAKING(Aramonの君主Elsin)とARAARCH(Archer)が入り口としてよいでしょう。

関連項目

  • TNT — [FEATURE]のTDFセクションに解決される地形物名を参照します。
  • 3DO、COB — FBIのObjectnameから参照されます。
  • GAF — 地形物のseqnameと武器のexplosiongafから参照されます。
  • GamedataのTDF — FBIのフィールドから参照されるmoveinfo.tdf、sound.tdf、sidedata.tdf。
  • サウンド — SoundCategoryがWAVファイルに解決される仕組み。
  • 用語集 — side(陣営)、footprint(フットプリント)、yardmap(ヤードマップ)、schema(スキーマ)。