すべての形式のページ ↓
チュートリアルとリファレンス

ユニットのMODを最初から最後まで作る

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

この手順では、標準のTotal Annihilationのインストールから始めて、ARMのフラッシュ戦車の新しい派生型を1つ追加する小さなMODを作ります。速度を2倍にした見た目違いのユニットです。最後には、ゲームフォルダーに置くだけで読み込まれる、配布可能な.ufoアーカイブができあがり、kbotが扱うすべての形式について、実際に使える全体像がつかめているはずです。

全体で20分ほどかかり、HPI、FBI、COB、3DO、PCX、TDF、sidedata.tdfを一通り使います。

Important

手順はUNIX系のシェルを前提にしています。kbotのCLIはWindowsでも同じです。必要に応じて、パスの/を\に置き換えてください。


0. 前提条件

  • $TAにある、完全なTAのインストール(GoG、Steam、または元のCD)。
  • インストール済みのkbot:
    go install github.com/coreprime/kbot/cmd/kbot@latest
    kbot ctx add "$TA" --alias ta --game totala
  • 展開した作業用コピーのためのディスク容量(約120 MB)。

1. インストールを展開する

個々のファイルを編集するので、普通のツールで読めるように、アーカイブを一度展開しておきます。

kbot mount "$TA" flatten --target ./ta-flat

できたものを確認します。

ls ta-flat/                # ai/  anims/  features/ ... weapons/
ls ta-flat/units/ | head   # ARMCOM.FBI, ARMFLASH.FBI, ...

フォルダーの構成はVFSの構造と同じです。実行時にアーカイブがどう重なるかはHPIを参照してください。


2. MODの作業用ディレクトリを作る

TAのMOD制作は追加方式です。既存のアーカイブの隣に.ufoを置くと、そのファイルがベースゲームのファイルより優先されます。MODは、同じ構成を写したツリーの中で作ります。

mkdir -p mymod/{units,scripts,objects3d,unitpics,download}

Note

配布する必要があるのは、変更したファイルだけです。ゲーム全体をmymod/にコピーしないでください。.ufoが肥大化するうえ、意図しないものまで覆い隠してしまうおそれがあります。download/ディレクトリは、ステップ5で追加する建設メニューの登録を置く慣習的な場所です。


3. 元にするユニットを選ぶ

MYFLASHは、既存のARMのフラッシュを元にします。4つのファイルをコピーします。

cp ta-flat/units/armflash.fbi      mymod/units/myflash.fbi
cp ta-flat/scripts/ARMFLASH.cob    mymod/scripts/MYFLASH.cob
cp ta-flat/objects3d/armflash.3do  mymod/objects3d/myflash.3do
cp ta-flat/unitpics/armflash.pcx   mymod/unitpics/myflash.pcx

なぜこの4つなのでしょうか。どのユニットにも次のファイルが必要だからです。

ファイル 用途 ページ
units/X.fbi ステータスとメタデータ FBI
scripts/X.cob アニメーションと挙動のバイトコード COB
objects3d/X.3do 3Dメッシュ 3DO
unitpics/X.pcx 建設メニュー用の96×96の肖像画 PCX
download/X.tdf 建設メニューへの登録(ステップ5で追加) TDF

ファイル名は慣習としてFBIのObjectnameを小文字にしたもので、.fbi自体は大文字になっていることもあります。エンジンはどこでも大文字と小文字を区別しません。


4. FBIをつなぎ直す

mymod/units/myflash.fbiを開きます。必ず変更しなければならないフィールドは、UnitName(参照用のキー)とObjectname(ファイル名の基になる参照)の2つです。

[UNITINFO]
{
    UnitName=MYFLASH;             // ← was ARMFLASH
    Objectname=myflash;           // ← was armflash
    Side=ARM;
    Designation=ARM-MV;
    Name=Super Flash;             // ← display name
    Description=Twice-as-fast Flash variant;
    ...
}

次に、変更が効いていることを確かめるために、ステータスを1つ引き上げます。速度を2倍にしましょう。

    MaxVelocity=4.0;              // was 2.0
    Acceleration=0.30;            // was 0.15

フィールドの一覧はFBIの付録を参照してください。設定していない項目は、エンジンの既定値を受け継ぎます。

Warning

すべての値の末尾に;が必要です。「変更が反映されない」の原因の第1位がこれです。セミコロンが抜けていると、何の警告もなくその値が次の行とつながってしまいます。


5. ユニットを建設メニューに登録する

存在していても、どの建設ユニットからもたどり着けないユニットは建設できません。新しいユニットに建設スロットを追加する正しい方法は、MODにdownload/<UNITNAME>.tdfファイルを置くことです。Cavedog自身の拡張パックCore Contingencyも新しいユニットをこの方法で配布しており、見かける単体ユニットの.ufoアドオン(AFark.ufo、AFlea.ufo、CorNecro.ufoなど)もすべて同じ慣習に従っています。

mymod/download/MYFLASH.tdfを作ります。

[MENUENTRY1]
{
    UNITMENU=ARMVP;       // The builder this unit appears under
    MENU=3;               // Build-menu page number (1-indexed)
    BUTTON=4;             // Slot within that page (0–5 in a 2×3 grid;
                          // 4 = bottom-left)
    UNITNAME=MYFLASH;     // The unit being placed (matches your FBI's UnitName)
}

TAの建設メニューは1ページが2列×3行のグリッドなので、BUTTONは0〜5の値を取り、次のように対応します。

┌─────┬─────┐
│  0  │  1  │   page N, top row
├─────┼─────┤
│  2  │  3  │   page N, middle row
├─────┼─────┤
│  4  │  5  │   page N, bottom row
└─────┴─────┘

対象の建設ユニットの既存の配置から、空いているスロットを選んでください。ベースゲームのすべての建設ユニットについて、ページごとの配置の全体はTAの建設ツリーのリファレンスにあります。

エンジンは起動時にすべてのdownload/*.tdfを読み、それぞれの[MENUENTRY<N>]を解析して、sidedata.tdfが宣言した建設メニューにそのエントリを統合します。sidedata.tdfを編集する必要はありません。

sidedata.tdfを編集するよりこちらが優れている理由

方法 長所 短所
sidedata.tdfを編集する 情報源が1か所にまとまる ファイル全体(約50 KB)を上書きする。このファイルに手を加えるほかのMODとすべて競合する。次にベースゲームにパッチが当たると、追加した内容が失われる
download/*.tdf 追加方式で、約150バイト。ほかのMODと競合せず、MODに向いている 追加するユニット1体につき1ファイル(どのみちMOD制作の自然な単位)

これはCavedogが公式に用意した拡張の仕組みで、単体ユニットのアドオンがsidedata.tdfを丸ごと作り替えずに済むようにするためにこそ存在しています。

複数の建設ユニットから建設する

ユニットを複数の建設ユニットから建設できるようにするには、[MENUENTRY<N>]セクションを追加するだけです。Cavedog自身のdownload/Armfort.tdf(ARMの防壁。ccdata.ccxに同梱)がまさにこれを行っています。

[MENUENTRY1] { UNITMENU=ARMACK; MENU=3; BUTTON=4; UNITNAME=ARMFORT; }
[MENUENTRY2] { UNITMENU=ARMACV; MENU=3; BUTTON=4; UNITNAME=ARMFORT; }
[MENUENTRY3] { UNITMENU=ARMACA; MENU=3; BUTTON=4; UNITNAME=ARMFORT; }

これでARMFORTを、上級建設Kボット、上級建設車両、上級建設航空機から建設できるようになります。建設ユニット1つにつきエントリが1つです。

MENUとBUTTONの値の選び方

標準のTAは、最初の2つのメニューページ(MENU=1、MENU=2)をベースゲームのユニット用に確保しています。コミュニティの慣習では、Cavedogが同梱するものと衝突しないように、ダウンロードで追加するユニットはMENU=3(またはそれ以降)に置きます。BUTTONはそのページの中のスロットです。

迷ったら、同じ建設ユニットに追加している既存のdownload/*.tdfから値をコピーしてください。動作する参考例として、CavedogのArmfort.tdf、Armmark.tdf、Cormort.tdfなどを取り出してみましょう。

kbot hpi extract /path/to/ccdata.ccx "*.tdf" -t /tmp/cc-downloads
ls /tmp/cc-downloads/download/

Note

(UNITMENU, MENU, BUTTON)の3つ組が同じ2つのMODは、予測できない形で衝突します。後から読み込まれたほうがスロットを取ります。ほかのMODと共存させるつもりのMODを配布するときは、大きなページ番号(MENU=4や5)を選んでください。

フィールドのリファレンスはTDF:[MENUENTRY]を参照してください。


6. COBを再コンパイルする(省略可)

MYFLASH.cobはARMFLASH.cobのコピーなので、そのままでも動きます。アニメーションを調整したい場合は、逆コンパイルし、編集して、再コンパイルします。

# Decompile to readable BOS
kbot cob decompile mymod/scripts/MYFLASH.cob -t mymod/scripts/MYFLASH.bos

# Edit MYFLASH.bos in any text editor
# (See cob.md for the BOS language reference.)

# Compile back to bytecode
kbot cob compile  mymod/scripts/MYFLASH.bos -t mymod/scripts/MYFLASH.cob

# Lint for common issues
kbot cob lint     mymod/scripts/MYFLASH.cob

逆コンパイル→コンパイルのラウンドトリップは、Cavedogの製品版のスクリプトすべてでバイト単位で一致します。kbot cob roundtripで、ゲームに含まれる全スクリプトについてこれを検証できます。


7. (省略可)肖像画を描き直す

unitpics/myflash.pcxは96×96のパレット付きPCXです。8ビットのPCXを扱える画像エディター(GIMP、Aseprite、Krita)で、TAのパレットを保ったまま編集してください。パレットが無事かどうかは次のように確認します。

kbot pcx describe mymod/unitpics/myflash.pcx
# Expected: BitsPerPixel: 8, embedded palette present

パレットが壊れてしまった場合は、保存する前に正規のTAパレット(palettes/palette.pal)を読み込み直してください。0x0CのマーカーとBytesPerLineの余白にまつわる注意点はPCXを参照してください。


8. (省略可)3Dモデルを描き直す

objects3d/myflash.3doは、頂点、プリミティブ、テクスチャの参照からなる階層構造のメッシュです。古いツールですが、Cavedogのエディター(3DO Builder)が今でも最も実用的な3DOエディターです。kbotは.3doを直接編集しません。Web UIで確認用に描画するだけです。

kbot mount $(kbot ctx path) --server
# → browse to objects3d/myflash.3do for the piece tree and textures

ツールを作る場合のディスク上の構造については、3DOを参照してください。


9. .ufoにまとめる

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

kbotは既定で、チャンク単位のLZ77圧縮と、Cavedogの標準のヘッダーキー、そしてゲームが必要とするCavedogの著作権表示のトレーラーを使います。つまり、エンジンは問題なくこれを受け入れます。次のように確認します。

kbot hpi info  myflash.ufo
# Should show ~5–8 files, marker 0x49504148 (HAPI), decrypt key 0xBF,
# and "TA 3.1c would mount: yes". A "no" names the reason (for example
# a missing Cavedog trailer), and the game would silently skip the file.

kbot hpi list  myflash.ufo -v
# units/myflash.fbi, scripts/MYFLASH.cob, objects3d/myflash.3do, ...

10. インストールしてテストする

なぜ.ufoなのでしょうか。TA 3.1cはrev31.gp3、次にすべての.ccx、すべての.ufo、そして最初の10個の.hpiだけをマウントします。どのグループもASCIIの大文字に揃えた名前の順で、各ファイルはそれを含む最初のアーカイブから読まれます(HPIの読み込み順を参照)。.ufoは必ずマウントされ、どの.hpiよりも上位になります。.hpiのMODは、製品版のインストールがすでに埋めている10個の*.hpiの枠を奪い合うことになります。rev31.gp3や.ccxにも含まれているファイル(たとえばunits/ARMCOM.FBIやgamedata/sidedata.tdf)は、それでもそれらのアーカイブから読まれます。そうしたファイルを上書きしたい場合は、インストール先のルートに単体のファイルとして置いて配布してください。スタジオの「Export mod…」ダイアログでは、ダウンロードする前に、ワークスペースのそうしたファイルが一覧表示されます。

.ufoを、TAのインストール先のルートのtotala1.hpiと同じ場所に置きます。

cp myflash.ufo "$TA/"

TAを起動します。スカーミッシュを開始してARMの車両工場を建設すると、建設メニューにSuper Flashが表示されるはずです。通常のフラッシュの2倍の速さです。

Tip

素早く試行錯誤するには、変更のたびにまとめ直す代わりに、mymod/を展開済みのインストール(ファイルがアーカイブの内容より優先される)に直接置くこともできます。まとめ直すのは、配布する準備ができたときだけで構いません。


トラブルシューティング

症状 考えられる原因
ユニットが建設メニューに表示されない。 download/<UNITNAME>.tdfがない、UNITMENU=が間違っている(建設ユニット名の打ち間違い)、または(MENU, BUTTON)のスロットがすでに別のユニットに使われている。
建設メニューにユニットが表示されるが、クリックしても何も起こらない。 downloadのTDFのUNITNAME=がFBIのUnitName=と一致していない。または、FBIのユニットのBmcode=が0(「建設不可」という意味)になっている。
読み込み時にゲームがクラッシュする。 FBIの値が不正(;の抜け、形の崩れた[SECTION])。kbot mount mymod --serverを実行し、Web UIのTDFビューアーでFBIを確認してください。解析エラーが強調表示されます。
ユニットがマゼンタの塊として表示される。 FBIのObjectnameが、存在しない.3doのファイル名を指している。objects3d/<Objectname>.3doを確認してください。
ユニットが動かない。 MovementClassがmoveinfo.tdfにないクラスを参照している。そのクラスを追加するか、既存のクラスを使ってください。
ユニットは移動するが、メッシュがアニメーションしない。 COBスクリプトが3DOにないピース名を参照している。kbot cob decompile myflash.cob | grep pieceの結果を、Web UIに表示される3DOのピースツリーと比べてください。
速度は正しいが、肖像画が違う。 unitpics/<Objectname>.pcxがない。あるいはエンジンがまだ標準のarmflash.pcxを見ている(MODがベースのアーカイブより後に読み込まれている?)。
建設メニューのアイコンが空白になる。 PCXが8ビットのパレット付きで保存されていない。kbot pcx describeを実行して確認してください。

次のステップ

  • 新しい武器を追加する:weapons/から.tdfをコピーして編集し、FBIのWeapon1=から参照します。weapons.tdfのリファレンスを参照してください。
  • 新しい移動クラスを追加する:moveinfo.tdfに追記します。Gamedataを参照してください。
  • 独自のマップを作る:.sctのセクションから.tntを組み立てます(またはkbot tnt packでTNTを直接手作りします)。TNTを参照してください。
  • 新しいサウンドを追加する:WAVをsounds/に置き、gamedata/sound.tdfで結び付けます。サウンドを参照してください。
  • AIを調整する:新しいユニットのためのWeight/Limitのルールをai/default.txtに追加します。AIを参照してください。
  • 既存のMODを調べる:kbot hpi listとkbot hpi extractは、他人が作った.ufoにも使えます。ほかの人がどのようにアーカイブを作ったかを調べるのが、MOD制作の慣習を身に付ける一番の近道です。

関連項目

  • HPI:アーカイブへのまとめ方の詳細。
  • FBI / TDF:ユニット定義の言語と、フィールドの完全な辞典。
  • COB / BOS:スクリプト言語。
  • 3DO:メッシュの形式。
  • Gamedata:sidedata.tdf、moveinfo.tdf、weapons.tdfのリファレンス。
  • 用語集:用語のリファレンス。