TDF / FBI / OTA — テキスト形式の設定ファイル
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
}
}
[MENUENTRY] — 建設メニューの拡張
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)が入り口としてよいでしょう。