はじめてのMOD作り その2

MOD/作成情報/はじめてのMOD作り その2
Last-modified: 2009-04-16 18:55:20

MOD/作成情報/はじめてのMOD作り その2 †

はじめてのMOD作りの続き

前回の復習 †

前回説明した"KaitakuRunner"では、以下のような流れでMODを作りました。

どんな複雑なMODであっても、この点において作り方は同じです。

MODの基本は「置き換え」 †

MODというものはファイルの置き換えによって成り立っています。
繰り返しになりますが、重要なことなのでもう一度説明しましょう。

ModTutorial10.png

(画像をクリックすると拡大されます。以下同じ)
Civ4のゲーム内容に関するデータは、図の緑枠、"Assets"フォルダ以下に大量に配置されています。*1
その緑枠部分に、MOD内のAssetsフォルダ以下(図の茶色枠)の部分を、上書きコピーする、というのがMODの働きです。*2
KaitakuRunner MODの場合は、ファイルが CIV4UnitInfos.xml だけなので、これ1つだけが置き換えられましたが、大型MODであれば、Assets以下のほとんど全部が置き換えられるということもありうるでしょう。

以上より、MODを作る時は

  1. 変えたい内容が、Assets以下(上の緑枠)のどのファイルに記述されているのか(=どのファイルを変更すればいいのか)を把握する
  2. 改変するファイルをMods名フォルダ以下(上図の茶色枠)にコピーする
  3. そのファイルを編集する

という手順を踏めばいいわけです。

ここで注意。事前にどのバージョン(無印/WL/BtS)に対するMODなのかを決めておき、BtSならばBtSのフォルダ内にあるファイル、つまりC:\Program Files\CYBERFRONT\Sid Meier's Civilization 4(J)\Beyond the Sword(J)\Assets 内のファイルからコピーする''ことに気をつけましょう。*3
CIV4UnitInfos.xml という同じ名前のファイルが、無印用・WL用・BtS用の3ヶ所に存在します。紛らわしいので、間違えないでください。無印用の CIV4UnitInfos.xml は無印に存在するユニットだけを記述しており、BtSで追加されたユニット(スパイなど)のデータがありません。これを元にMODを使って、上図のようにBtSの CIV4UnitInfos.xml に上書きしてしまうと、あるべきデータ(スパイ等)が存在しないがための不具合を引き起こしてしまいます。
気をつけましょう。(と言いつつ、筆者はこの講座最終回でこのミスをやってしまいました…。)

以上で復習を終わります。

XMLの「キー」を理解しよう †

では、XML編集によるMOD作りについての説明を続けます。
XMLでは「キー」という概念が出てきます。初心者にとってはとっつきにくいかもしれませんが、重要ですのでしっかり理解してください。(XMLやデータベース開発等の経験があり、キーのことを理解している人は、次の節まで進んでください)

サンプルとして、前回編集したKaitakuRunner MODのXMLファイルであるCIV4UnitInfos.xmlをもう一度眺めてみましょう。
ここから先は、作成情報/ユニットの編集と見比べながら読み進めると分かりやすいかもしれません。

CIV4UnitInfos.xmlより抜粋

  <UnitInfo>
   <Class>UNITCLASS_SETTLER</Class>
   <Type>UNIT_SETTLER</Type>
  (中略)
   <Description>TXT_KEY_UNIT_SETTLER</Description>
  (中略)
  </UnitInfo>

UnitInfoタグの開始から終了(/UnitInfo)までの中で、1種類のユニットを定義しています。
Classタグの内容である"UNITCLASS_SETTLER"、Typeタグの内容である"UNIT_SETTLER"というのが、開拓者を表すキーです。(Civ4の英語で、Settlerは開拓者の意味)

「UNIT_SETTLERという文字列が、開拓者というユニットのことを指し示している」という意味を、「開拓者ユニットのキーはUNIT_SETTLERである」という言い回しで表現していると思ってもらえればよいかと。
なお、Civ4のXMLにおけるキーは半角大文字のアルファベットとアンダーバー(_)からなる文字列である、と思っておけばほぼ間違いありません。

話が横道に逸れますが…ClassとTypeの2つがある理由は、ユニークユニットのためです。例えば労働者と熟練労働者は、Classタグの内容が"UNITCLASS_WORKER"で共通ですが、Typeタグの内容は"UNIT_WORKER"と"UNIT_INDIAN_FAST_WORKER"で別物です。 作成情報/ユニットの編集も参照。

開拓者に関するキーはそれだけではありません。上のXML文を見ると、Descriptionタグの内容に"TXT_KEY_UNIT_SETTLER"というものがあります。これは、このユニットの名前を表すキーです。
「UNIT_SETTLERというユニットの仮の名前はTXT_KEY_UNIT_SETTLERである」というような意味だと思ってください。「UNIT_SETTLERというユニットの名前キーは、TXT_KEY_UNIT_SETTLERである」というふうに表現します。
このTXT_KEY_UNIT_SETTLERという文字列(名前キー)は、 Sid Meier's Civilization 4(J)\Assets\XML\Text\CIV4GameTextInfos_Objects.xml という別のXMLファイル内でも用いられ、そこで本当の名前との対応がわかるようになっています。*4

CIV4GameTextInfos_Objects.xmlより抜粋

<TEXT>
 <Tag>TXT_KEY_UNIT_SETTLER</Tag>
  <English>Settler</English>
(中略)
 <Japanese>
  <Text>&#38283;&#25299;&#32773;</Text>
(中略)
</TEXT>

補足:メモ帳などで表示させた場合、&amp;#38283;&amp;#25299;&amp;#32773;という変なデータが表示されますが、これはCiv4が日本語表記にUnicodeを採用している影響です。このファイルをCiv4本体プログラムが読み込むと、文字コード変換処理を経て「開拓者」という文字列になります。エディタの種類によっては、最初から正しく「開拓者」を表示してくれるかもしれません。詳細はMOD日本語化を参照。

仮の名前TXT_KEY_UNIT_SETTLERに対する真の名前は、英語では"Settler"、日本語では「開拓者」である、ということがここで定義されています。*5

なぜキーを使うのか &dagger;

上の説明を見て、「何だか、ややこしいなぁ。もっと簡単に書けないの?」と思ったでしょうか。例えば…

  <UnitInfo>
   <Class>開拓者</Class>
  (中略。ここに開拓者のデータを記述)
  </UnitInfo>

このように書けばいいと思うでしょうか。
なるほど、シンプルですし、わざわざTXT_KEY_UNIT_SETTLERだなんて仮の名前を使って別ファイルで真の名前に置き換えるなんてマネを別のファイルでする必要もないし、MODを作る我々にも分かりやすいですよね?

ところが、こう書いてしまうと、あとからの修正がとても大変になるのです。
もし後から「開拓者」という名前が気に入らず、「入植者」に変更したい、と思ったら、どうなるでしょうか。
開拓者について記述したファイルは、上記の2つだけでなく、画像やアニメ関係、AIの思考ルーチン、シヴィロペディアなど多岐にわたり、そのすべてにおいて「開拓者」を「入植者」に書き換えねばならなくなります。データが複雑になればなるほど、書き換え忘れたり、データに矛盾が生じたりする危険が大きくなります。
上で説明したような構造にしておけば、「開拓者」という文字列は1ヶ所しか無いのでそれを「入植者」に書き換えればよいのです。修正の手間は大幅に減り、それだけバグも発生しにくくなります。
他にも、英語などの多言語対応*6や、新たなゲーム要素の追加などを行う際、このように「キー」を使った記述をしておくと、とても柔軟に対応できることが多いです。
(余談:もともと、データベース設計の世界においては、キーの活用は常識といえるもののようです。その方面に詳しい方や技術者の方がいたら、うまい説明の加筆をお願いします)

「開拓者ユニット(=UNIT_SETTLER)」と「"開拓者"*7という文字列(=TXT_KEY_UNIT_SETTLER)」は別物であると考えて、前者のことをUNIT_SETTLERという文字列(キー)で表した。これがキーを使う理由の一つであると思います。

第2のMOD作り &dagger;

長々と講釈が続いて、少し退屈したかもしれません。
ここらで、KaitakuRunnerに続く第2のMODを作ってみることにしましょう!
MOD名は…"SuperWarrior"としましょう。今回もBtS用のMODにします。
MODの内容は、「ケチュア戦士の戦闘力を100にする」というものです。*8

MOD作りの準備(前回の復習) &dagger;

ではMODを作り始めましょう。
復習です。まずやることは?
…そう、フォルダ作りでしたね。ドキュメント\My Games\Beyond the Sword(J)\Mods 配下にフォルダ "SuperWarrior" を作りましょう。
次に、MODのために変更が必要なファイルをこの下にコピーします。
ユニットのパラメータを変えるわけですから、前回同様、ユニットの情報を記述したファイル・ Assets\XML\Units\CIV4UnitInfos.xml が修正対象ファイルとなります。
BtsのAssets以下の構造を再現して、 Mods\SuperWarrior\Assets\XML\Units\CIV4UnitInfos.xml という形にしましょう。下図のようになればOKです。

ModTutorial11.png

名称からキーを探す &dagger;

さあ、あとはこのファイルを開いて、ケチュア戦士の戦闘力を変更するだけです。
では、やってみてください!

…と言われて、ふと気が付くでしょうか。
「ケチュア戦士のデータって、どこにあるんだ!?」
なにせ、700KB超の巨大ファイルです。闇雲に探すだけではうまくいきません。ならばと、エディタの検索機能を使って「ケチュア」で検索しても、ヒットしません。当たり前ですね、前章で説明したように、「ケチュア戦士」という名称は別のファイルで規定されており、このファイルにおいては、ケチュア戦士のデータは「ケチュア戦士ユニットのキー」を使って記述されているわけです。つまり。ケチュア戦士のパラメータを変更するためには…、
ケチュア戦士ユニットのキーとなる文字列を、突き止めなくてはいけないのです!

その方法は、いくつかあります。

方法1.ケチュア戦士の英語名をもとに検索する。
まず、ケチュア戦士の英語名を調べます。BtSを起動して「オプション」から言語を英語に変え、シヴィロペディアを開いて、ケチュア戦士のアイコンを見ると、"Quechua"と書かれています。これがケチュア戦士の英語名です。

ModTutorial13.png

開拓者(英語名:Settler)のユニットキーが"UNIT_SETTLER"であったのですから、ケチュア戦士のユニットキーにも"QUECHUA"が含まれていると推測できるでしょう。*9
SuperWarriorファイル内にコピーしたCIV4UnitInfos.xmlをエディタで開き、"QUECHUA"で検索すると…ありました!
 <Type>UNIT_INCAN_QUECHUA</Type>という行(4455行め)がヒットしましたね。ケチュア戦士のユニットキーは、UNIT_INCAN_QUECHUAです。

ModTutorial12.png

なお、ファイルの前後を見ると、

 <UnitInfo>
  <Class>UNITCLASS_WARRIOR</Class>
  <Type>UNIT_INCAN_QUECHUA</Type>

となっています。Classタグの内容はUNITCLASS_WARRIOR、戦士ユニットのそれと同じですが、Typeタグの内容はケチュア戦士独特のUNIT_INCAN_QUECHUAとなっています(先ほど労働者と熟練労働者を例に説明したのと同じことです)。
ユニット名は"Quechua"だけですが、ユニットキーには"INCAN"(インカの)が加わっており、ユニット名とキーは必ずしも一致しないようです。

方法2.一般的な英訳から推測する。
辞書やWikipediaなどで調べると、ケチュアの英語訳は"Quechua"であることがわかります。それでCIV4UnitInfos.xmlファイル内を検索すれば早いですね。
ただしこの手は、Civ4内で独特の用語や和訳が使われている場合には通用しません。方法1のほうが確実です。

方法3.元のAssetsから日本語で「ケチュア戦士」を検索する。
どうしても英語になじめない場合、日本語からの検索も不可能ではありません。ですが、かなりややこしいのでお勧めはしません。方法1,2で十分だという人は、次の項まで読み飛ばしてください。

「ケチュア戦士」という名称は必ずCiv4の名前データファイルのどこかで定義されているはずですから、その文字列を元に検索しましょう。
ただし、気を付けるべき点が2つあります。まず上で見たように、Civ4のデータファイル内で「ケチュア戦士」という言葉はUnicodeで記述されているということ。「開拓者」が「&amp;#38283;&amp;#25299;&amp;#32773;」という文字に化けることがあったように、「ケチュア戦士」も化ける可能性があります。「ケチュア戦士」でヒットしなかった場合、検索ツールの種類によっては、それを変換したもので検索したほうがいいかもしれません。Unidcodeへの変換ツールは 10進、16進文字コードin HTMLユニコード(IE6以降専用サイト)などがあります。「ケチュア戦士」を変換した結果は、16進数表記なら"&amp;#x30B1;&amp;#x30C1;&amp;#x30E5;&amp;#x30A2;&amp;#x6226;&amp;#x58EB;"、10進数表記なら"&amp;#12465;&amp;#12481;&amp;#12517;&amp;#12450;&amp;#25126;&amp;#22763;"。これで検索すれば、見つかるでしょう。
気を付けるべき点、その2。ケチュア戦士の名称データは、BtSのデータフォルダ(Sid Meier's Civilization 4(J)\Beyond the Sword(J)\Assets\以下)ではなく、Civ4無印のデータフォルダ(Sid Meier's Civilization 4(J)\Assets\以下)に格納されています。Civ4無印のデータファイルはBtSの同名ファイルに上書きされることが多い(CIV4GameTextInfos_Objects.xml もそうです)が、ユニット名を定義したファイルについては、無印版がC:\Program Files\CYBERFRONT\Sid Meier's Civilization 4(J)\Assets\XML\Text\CIV4GameTextInfos_Objects.xml、BtS版が C:\Program Files\CYBERFRONT\Sid Meier's Civilization 4(J)\Beyond the Sword(J)\Assets\XML\Text\CIV4GameTextInfos_Objects_BTS.xmlと別名のファイルになっているため、上書きされません*10。無印時代から存在するユニットの名前は前者、BtSで追加された新ユニットの名前は後者に入っています。ケチュア戦士は無印から存在したユニットですから、無印用の CIV4GameTextInfos_Objects.xml にデータが載っている、ということになります。
このあたりをわずらわしく感じるなら、Civ4全体の親フォルダであるC:\Program Files\CYBERFRONT\Sid Meier's Civilization 4(J) フォルダからサブフォルダを含めて、目的の文字列*11で検索するのも一つの手段です。Windows Vistaなら「ファイルコンテンツの検索」機能を使うと便利だと思います。

データの変更 &dagger;

UNIT_INCAN_QUECHUA がケチュア戦士ユニットのキーだと分かりました。
CIV4UnitInfos.xml を編集して、戦闘力を変更しましょう!
…と、またここで詰まってしまいます。
「戦闘力のパラメータって、どれだ!?」
ケチュア戦士のデータと言っても、膨大です。テキストエディタで見ると、100行以上。しかも、よくわからない名前のタグがいっぱいあります。これを編集しろと言われても困ってしまいますね…。

ところが世の中には偉大な先人がいるもので。
MOD/作成情報/ユニットの編集 の "CIV4UnitInfos.xml" の項目を見てください。それぞれの項目が何を意味するのか、きっちり説明してくれています。これは無印向けの情報ということですが、BtSでもそれほど変わっているわけではないので、十分役に立ちます。
ユニットの戦闘力を表すタグは何か、この表を調べてみると(ページ内検索を使っても可)…ありました。
<iCombat>が、ユニットの戦闘力を表す、とのことです!黄色に塗って表示してくれて(重要パラメータだからでしょうか)、親切ですね。

というわけで、あとは簡単です。
ドキュメント\My Games\Beyond the Sword(J)\MODS\SuperWarrior\Assets\XML\Units\CIV4UnitInfos.xml ファイルを開いて、<Type>UNIT_INCAN_QUECHUA</Type>の先にある<iCombat>を探すと、

<iCombat>2</iCombat>

と4576行めに見つかりますので、2を100に変更してファイルを上書き保存します。

ModTutorial14.png


MOD完成 &dagger;

これでめでたく、SuperWarrior MODの完成です!

さっそく遊んでみましょう。CivModChooserを使うなどして、MODを起動します。
マップはパンゲア、極小マップ3文明、自国は当然インカのワイナ・カパック。難易度は天帝です。筆者の腕前では本来、とても生き残れないはずですが…。

ModTutorial18.png

戦闘力100のケチュア戦士が、この世界をゲームバランスごと壊滅させてくれます。
建築物だの研究だの、そんなまだるっこしいものは要りません。生産はケチュア戦士のみ。

ModTutorial15.png

ライバル文明に出会ったら、即「こんにちは、死ね!」
落とした都市はそのまま焼却。ケチュア戦士の行くところ、ペンペン草も残りません。
ワールドビルダーを使って敵に戦車をプレゼントしてみましたが…。

ModTutorial16.png

棍棒で戦車の装甲を破壊するケチュア戦士の図(笑)。
そんなわけで、2520 BCに征服勝利と相成りました。

このMODも、とりあえずアップロードしておきます。

fileSuperWarrior.zip

キー一覧 &dagger;

ここまでで分かったように、MOD作りにおいてはキーを知ることがとても重要です。
キーの探し方を学習するため、今回のSuperWarrior MOD作成においては自力でケチュア戦士のキーを調べました。*12
しかし、このWikiにはキーの情報をまとめたページが存在しますので、必ずしもすべて自力での調査が必要なわけではありません。

キー一覧
今後のMOD作成においては、キーの辞書として、この一覧を活用していきましょう。

まとめ &dagger;

今回のまとめ。

読んで頂き、ありがとうございました。

はじめてのMOD作り その3 に続く


*1 図にはありませんが、Warlords(J)\Assets配下にもあります
*2 言うまでもありませんが、本当にファイルを上書きするわけではありません。MODを動作させている間だけ、あたかも上書きされたかのようにふるまう、という意味です
*3 無印用のMODなら C:\Program Files\CYBERFRONT\Sid Meier's Civilization 4(J)\Assets 内から、 WL用のMODなら C:\Program Files\CYBERFRONT\Sid Meier's Civilization 4(J)\Warlords(J)\Assets 内からコピーします。
*4 このファイルにはユニット名だけでなく、いろいろな要素の名称が記述されています。
*5 フランス語等、他の言語のデータも、中略部分に入っています
*6 Civ4は元々英語なので本来は「日本語対応」というべきですが
*7 日本語の場合
*8 2ch Civ4 MODスレ vol.14の 420 のアイディアを使わせていただきました。
*9 この推測はたいてい的中します。万一外れた場合は、下にある方法3のように、CIV4GameTextInfos_Objects.xml等を"Quechua"で検索し、ユニット名称とユニット名称キーの対応を調べ、次にそのユニット名称キーの文字列でCIV4UnitInfos.xml内を検索すれば確実に見つかります。
*10 一般に、XML\Textフォルダ内にある、文字列(ものの名称や会話文、説明文など)を定義したファイルについて、これが成り立ちます。
*11 「ケチュア戦士」か「&amp;#12465;&amp;#12481;&amp;#12517;&amp;#12450;&amp;#25126;&amp;#22763;」か「&amp;#x30B1;&amp;#x30C1;&amp;#x30E5;&amp;#x30A2;&amp;#x6226;&amp;#x58EB;」
*12 ケチュア戦士のようなユニークユニットのキーが執筆時においてはキー一覧に存在しなかったのも理由ですが。