注:このページは、BuildingCampaignsTheCampaignFile(公式wikiの別記事ですね)から大きく借りています。
"_main.cfg"ファイルの作成
さてさて、キャンペーンフォルダを作成しましたが、まだゲームはこの新しいフォルダが存在することを知りません。
ゲームがフォルダを見つけるためには、キャンペーンのデータを見つける場所をゲームに伝える特別なファイル"_main.cfg"を作成する必要があります。
このファイルがなければ、ゲームを起動したときにキャンペーンのデータを見つけることができず、結果的にキャンペーンをプレイできなくなります。
なので、ゲームがあなたのキャンペーンを見つけることができるように、 "_main.cfg"ファイルを作成しましょう。
キャンペーンフォルダの中に新しいテキストファイルを作成し、 "_main.cfg"という名前をつけてください。(アンダースコアは必要ですが、引用符(")は付けないでください)
このファイルを保存する時は'all files'の保存タイプを選択し、'text document (.txt)'は選択しないでください。
'text document (.txt)'を選択した場合、実際には「_main.cfg.txt」という名前のファイルが保存されますが、このファイルはWesnothには認識されません。
要は拡張子が.cfg になるように注意しようねってことです。
"_main.cfg"というファイルを作成しましたが、これで終わりではありません。
今はファイルの中身が空ですので、まだゲームはデータを見つけることができません。しかし、ガッカリしてはいけません。
次にあなたがしなければならないのは、特定のWMLを "_main.cfg"ファイルの中に書くことだけです。そうすればゲームはあなたのキャンペーンをうまく見つけることができます。
最初は Text Domain
Text Domain
テキストエディタで "_main.cfg"ファイルを開き、次のタグセットを書き込みましょう。
[textdomain] [/textdomain]
このタグセットは、キャンペーン内の文字列への翻訳を検索する場所を指定します(この段階では翻訳はありませんが、後で翻訳が行われる場合に備えてテキストドメインを追加するのが一般的です)。
[textdomain]タグは、[campaign]タグで使用されるtextdomainの名前を指定し、キャンペーンシナリオで文字列を翻訳に接続するために使用されます。
[textdomain]タグの中には、属性の名前とパスを含めます(まだ値を割り当てないでください)。
[textdomain] name= path= [/textdomain]
"name"属性
属性"name"は、作成するテキストドメインの名前を指定します。 textdomainの名前は一意で、 'wesnoth-'で始まり、指定されたシステム内の他のテキストドメインと競合しないようにする必要があります。それではテキストドメインを "my_first_campaign"と名づけましょう。
"wesnoth-"で始めるのを忘れないでください。これで、_main.cfgファイルの内容は次のようになります。
[textdomain] name="wesnoth-my_first_campaign" path= [/textdomain]
"path"属性
属性"path"は、コンパイルされた変換ファイルが格納されるディレクトリへのパスを指定します。これは、キャンペーンディレクトリ内のファイルである必要があります。
現在のところ、翻訳フォルダは空ですが、キャンペーンの翻訳を導入した場合は、これが指定する"path"になります。
この属性に "data/add-ons/my_first_campaign/translations" と書いて "translations"フォルダのディレクトリパスを割り当てましょう。
_main.cfgは次のようになります。
[textdomain] name="wesnoth-my_first_campaign" path="data/add-ons/my_first_campaign/translations" [/textdomain]
キャンペーンの定義
今度は、[campaign]タグセットを追加します。はい、お察しの通りです。第1章に出てきた[campaign]タグセットです。
[campaign] [/campaign]
次に、[campaign]タグセットの中に次の行を追加します。
#textdomain wesnoth-my_first_campaign
これは、このファイル内のテキスト文字列が上記で定義したテキストドメインに属することをゲームに伝えます。
次に、id、name、abbrev、icon、image、first_scenario、description、difficulties、およびdifficult_descriptionsという属性を与える必要があります。
まだこれらの属性に値を割り当てないでください、それは後で行います。とりあえずは、キャンペーンタグの中にこれらの属性がすべて含まれていることを確認してください。
(属性の順序は重要ではありませんが、チュートリアルの都合上、以下の順序で書き込むことをおすすめします)
[campaign] #textdomain wesnoth-my_first_campaign id= name= abbrev= define= icon= image= first_scenario= description= difficulties= difficulty_descriptions= [/campaign]
今度は、属性を1つずつ確認し、それらに値を与えましょう。これからそれぞれの属性に割り当てるべき特定の値を説明します。
"id"属性
キャンペーンの一意の識別子。 "id"属性の値には、小文字の英数字とアンダースコアしか含めることができません。私たちはこの属性に"my_first_campaign"という値を与えます。
注:第2章でも書きましたが、実際は大文字も使えます。
id = my_first_campaign
"name"属性
あなたのキャンペーンの名前です。これは翻訳可能な文字列にでき、ゲーム内のキャンペーン選択画面にこの文字列が表示されます。それでは "My First Campaign"という値を付けましょう。この文字列を翻訳可能にしたいので、最初の二重引用符( " )の前に翻訳マーク( _ )を含めることを忘れないでください。
name= _ "My First Campaign"
"abbrev"属性
この属性は、キャンペーンの保存ファイル名の先頭部分に使用されるキャンペーンの略語を定義します。一般に、キャンペーンの名前の略語(つまり、キャンペーン名の各単語の最初の文字、大文字)で構成されます。ここには"MFC"という値を付けましょう。
abbrev = MFC
"define"属性
この属性は、ユーザーがキャンペーンからシナリオをプレイすることを選択したときにゲームに知らせるキーを作成します。
頭に"CAMPAIGN_"と付けてその後にidを大文字にした文字列を追加した値が使用されます。
define=CAMPAIGN_MY_FIRST_CAMPAIGN
"icon"属性
ゲーム内キャンペーンの選択メニューで、キャンペーンの名前の横に表示されるアイコン画像のパスを指定します。
オリジナルの画像も使えますが長いパスを書いたり画像を用意するのは時間がかかるので、とりあえずWesnothのアイコンを割り当てます。
icon = "wesnoth-icon.png"
"image"属性
これは、ゲーム内キャンペーン選択メニューでキャンペーンが選択されたときに、キャンペーンの説明の下に表示される画像を定義します。
ここでもオリジナルの画像が使えますがやはり面倒なので、とりあえずエルフのポートレイト辺りを割り当てます。
image = "portraits/elves/sylph.png"
"first_scenario"属性
これは、キャンペーンをプレイするときに、最初に開始されるシナリオを定義します。
もう予想はついていると思いますが、my_first_scenario としておきます。
first_scenario =my_first_scenario
"description"属性
これは、キャンペーン選択メニューでキャンペーンが選択されたときに表示される、キャンペーンの説明文です。
説明文なので当然ながら翻訳可能にしておきます。次のようにしてください。
description = _ "This is my first campaign."
"difficulties"属性
これは、キャンペーンの難易度を定義します。ここには、あらかじめ定義されたキーワードを値として付けます。
複数の難易度を設定することもできますが、今回はシンプルに一つだけ設定します。
difficulties = EASY
"difficult_descriptions"属性
これは、キャンペーンの難易度選択画面を定義する部分です。かなり複雑な設定が必要な箇所ですが
それを今説明していくと混乱の元なので、次のようにしてください。
difficult_descriptions = {MENU_IMG_TXT2 units/undead/shadow-s-attack-4.png _"Easy" _""}
というわけで、[campaign]タグ内に次のように値を書き入れてください。
[campaign] #textdomain wesnoth-my_first_campaign id=my_first_campaign name= _ "My First Campaign" abbrev= _ "MFC" define=CAMPAIGN_MY_FIRST_CAMPAIGN icon= "wesnoth-icon.png" image= "portraits/elves/sylph.png" first_scenario=my_first_scenario description= _ "This is my first campaign." difficulties=EASY difficulty_descriptions= {MENU_IMG_TXT2 units/undead/shadow-s-attack-4.png _"Easy" _""} [/campaign]
プリプロセッサ
(プリプロセッサディレクティブ、バイナリパス、ディレクトリのインクルードなどについての説明)
このセクションは作者に後回しにされたらしく、欠落した部分があります。そこで訳者のわかる範囲で補足情報を付け足します。まあ、それでも不都合はないと思います。
Wesnothにファイルの場所を教える
[campaign]を書き終わりましたが、もう一つやることがあります。
キャンペーンで使用するファイルの場所をWesnothに教える必要があります。ここで最初にすることはファイルの場所を記入するブロックを明示することです。
次のように書き込んでください。
#ifdef CAMPAIGN_MY_FIRST_CAMPAIGN #endif
#で始まる文字列が初めて出てきましたが、怖がる必要はありません。これもタグみたいなものです。(プログラマーに言うと怒りそうですが)
#ifdef がタグのカギ括弧で #endif が閉じタグのカギ括弧、CAMPAIGN_MY_FIRST_CAMPAIGN がタグの名前と考えてください。
そして、この2行の間にキャンペーンで使用するファイルの場所を書き込んでいくわけです。
ところで、気づいたかもしれませんがCAMPAIGN_MY_FIRST_CAMPAIGNというのは、先ほど[campaign]タグ内のdefineに指定した値と同じですね。
つまり、ここに書かれているのはCAMPAIGN_MY_FIRST_CAMPAIGNで使用するファイルの場所ですよーと宣言しているわけです。(たぶんね)
バイナリパス
バイナリパスは、ファイルを検索するたびにuserdataフォルダに特定のディレクトリを含めるようゲームに指示するために使用されます。
たとえば、キャンペーンで「my_face.png」というカスタム画像がある場合、シナリオ内のそのファイルへの参照が見つかるたびに
(シナリオ内のストーリー画面の1つにその画像を表示するなど)、最初にゲームコアのgamedataディレクトリを検索し、次にバイナリパスに含まれるフォルダを検索します。
gamedataディレクトリまたはバイナリパスで指定されたディレクトリのいずれにもファイルが見つからない場合は、エラーが発生します。
キャンペーンにWesnothのコアに含まれていないカスタム画像、音声、音楽を使用する場合は、バイナリパスを指定する必要があります。
カスタムイメージ、サウンド、または音楽がない場合は、バイナリパスを指定しないでください。
このチュートリアルではキャンペーンにいくつかのカスタムイメージを含めるので、バイナリパスを指定する必要があります。
バイナリパスを指定するには、次の構文を使用します。(さっきの#ifdef CAMPAIGN_MY_FIRST_CAMPAIGNと#endifの間に書き込みます。)
[binary_path] path=data/add-ons/my_first_campaign [/binary_path]
これは、gamedataディレクトリ内の特定のファイルを見つけることができないときは常に、指定されたuserdataディレクトリを検索するようゲームに指示します。
"path"キーの値は、常に「data / add-ons /」で始まり、その後にキャンペーンフォルダの名前が続く必要があります。
ディレクトリの包含
[binary_path]はキャンペーンフォルダの位置をWesnothに教えました。次はその中に何があるかを教えます。
第2章で「images」、「macros」、「maps」、「scenarios」、「translations」、「units」、「utils」の7つのフォルダを作りましたね。
そのうちの「translations」はこの章の最初に[textdomain]というタグでWesnothに伝えてありますから除外します。
そして、少し特殊なのが「units」です。これはカスタムユニットを使用する場合に必要になりますが今は無視します。
残り5つのフォルダの位置を書き込みます。書式は次の通りです。
{~add-ons/my_first_campaign/macros} {~add-ons/my_first_campaign/utils} {~add-ons/my_first_campaign/images} {~add-ons/my_first_campaign/maps} {~add-ons/my_first_campaign/scenarios}
これでWesnothはあなたのキャンペーンフォルダに何があるのか知ることができました。
最終的な_main.cfgは次のようなものになります:
[textdomain] name="wesnoth-my_first_campaign" path="data/add-ons/my_first_campaign/translations" [/textdomain] #textdomain wesnoth-my_first_campaign [campaign] #textdomain wesnoth-my_first_campaign id=my_first_campaign name= _ "My First Campaign" abbrev= _ "MFC" define=CAMPAIGN_MY_FIRST_CAMPAIGN icon= "wesnoth-icon.png" image= "portraits/elves/sylph.png" first_scenario=my_first_scenario description= _ "This is my first campaign." difficulties=EASY difficulty_descriptions= {MENU_IMG_TXT2 units/undead/shadow-s-attack-4.png _"Easy" _""} [/campaign] #ifdef CAMPAIGN_MY_FIRST_CAMPAIGN [binary_path] path=data/add-ons/my_first_campaign [/binary_path] {~add-ons/my_first_campaign/macros} {~add-ons/my_first_campaign/utils} {~add-ons/my_first_campaign/images} {~add-ons/my_first_campaign/maps} {~add-ons/my_first_campaign/scenarios} #endif
(注:ユニットはまだありません。)
これで_main.cfgの完成です。それでは第3章はここまで、お疲れさまでした。