このページの編集方針
- このページは編集中です。ごく簡単な無能力ユニットから始めて、一通りの基本能力を持ったユニットを完成させるまでの解説ページに変更する予定です。
初めに
この記事は、Wesnothの1.16バージョンを念頭置いて作成しています。古いバージョンでは、そのままのやり方では動作しない場合がありますので、お気をつけください。
ここではオリジナルのユニットを作成する方法を説明しようと思っていますが、その前にちょっとした準備作業が必要です。
それは、作成したユニットをテストするためのテストシナリオを用意する事です、これは作成したユニットの保存場所も兼ねていますから必須の作業です。自分で用意するのが面倒な人用にアドオンを用意してありますからダウンロードしてください。
ダウンロードしたデータはフォルダごとadd-onsフォルダにぶち込んでください。そして、これ以降の作業はそのフォルダの中で行います。
ほぼ必要最低限の記述でユニットを作ってみよう
まず最初は、最低限ユニットと呼べる状態のものを作るところから始めましょう。
「初めに」の項目でダウンロードしたフォルダの中には、実際にユニットファイルが1つだけ入っています。
このファイルは最低限の記述でユニットを1体定義していますので、ユニットのテンプレートとして使いましょう。
早速、以下のファイルを同じディレクトリに別名で保存し、テキストエディタで開いてください。
ファイルの各項目を変更して、オリジナルのユニットにしてみよう。
前述のファイルを開くと、次のようなテキストが表示されます。
#textdomain wesnoth-unit_test [unit_type] id = jelly_monster name = _ "jelly monster" race = monster image = "units/jelly_monster_1.png" hitpoints = 14 movement_type = smallfoot movement = 4 experience = 18 level = 1 alignment = neutral advances_to = null {AMLA_DEFAULT} cost = 8 usage = fighter description = _ "Jelly-like creature" die_sound = hiss-die.wav [/unit_type]
これは実際にWesnothで使用することができる、ほぼミニマムのユニットの定義です。
1行ごとにユニットのパラメーターを1つ定義しています、まずはこれを順番に理解していきましょう。
- 1行目は、#textdomain wesnoth-unit_test です。実はこの行はユニットの動作には直接影響しませんし、無くてもユニットは正常に動作します。この行はファイル中の翻訳可能なテキストをゲームに認識させるために存在します。なので、翻訳ファイルを作る必要が無ければ、この行は削除してもかまいません。
Wesnothは基本的に英語表示なので、日本語で表示させたい場合は翻訳ファイルが必要になります。そして翻訳ファイルには個別に他と被らない名前(textdomain)が存在します。さらに、翻訳するべきテキストはそれがなんという名前(textdomain)に属しているのかを明確にする必要があります。
この行には次のような意味があります。
「これ以降の行に出現する翻訳可能テキストは wesnoth-unit_test という textdomain に属する。」
textdomain は通常アドオンごとに設定し、wesnoth-○○○○○○○ の○○○○○○○の部分をアドオン名にしたものを使用します。
- 2行目は[unit_type]、これは最終行の[/unit_type]とセットになっています。[unit_type]の次の行から[/unit_type]の直前の行までが一つのユニットの定義であることを表します。
- 次は3行目です。ここからようやくユニットの具体的なパラメーターの定義になります。
この行は id 、Wesnothがユニットを識別するための名前を設定します。jelly_monsterがその名前になります、これをオリジナルのidに変更してみましょう。基本的には小文字のアルファベットを使用します。例)id = office_worker
- name、これはゲーム画面に表示されるユニットの名称です。プレイヤーが目にするテキストなので、翻訳可能テキストになります。
翻訳可能テキストとは、_ (アンダーバー)で始まり"(ダブルクォーテーションマーク)で挟まれたテキストを言います。
では、ここもオリジナルの名前に変更しましょう。例)_ "office worker"
- race、これは種族を表します。human、dwarf、elfなどが代表的な種族名ですね。そして、それぞれの種族には種族特性が設定されています。例えば個体名の命名規則や雇用時に付加される特製の種類などがそうです。この種族もオリジナルで作成することができますが、それを説明すると長くなりますので、ここでは既存のものを使用しましょう。 次のように変更してください。
race = human
- image、この行は、ゲームのマップ上に表示されるユニットのイメージ画像のパスを設定します。
パスの起点はimagesフォルダで、これはコアに含まれるimagesとアドオンに含まれるimagesの両方を指します。
Wesnothは最初にコアのimagesを走査し、続いてアドオンのimagesを走査し、目的の画像を見つけたらそれを表示します。
ここでは、"units/jelly_monster_1.png"となっています、これは起点であるimagesフォルダの中のunitsフォルダの中のjelly_monster_1.pngというファイルを指しています。
これをオリジナルの画像に指定し直すのですが、画像を用意する方法を後で説明しますので今はこのままにしておきます。
- hitpoints、これはユニットの最大ヒットポイントを表します。適当な数字を設定してください、あまり極端な数を設定するとゲームバランスを取りにくくなりますので気をつけましょう。
例)hitpoints = 28
- movement_type、これは地形に対して消費する移動ポイントや地形から受ける防御効果などを設定したプリセットを選択する項目です。
coreのmacrosフォルダに入っているmovetypes.cfgにいくつものmovement_typeが用意されていますので、そこからユニット特性にあったものを選びましょう。例)movement_type = smallfoot
smallfootは一般的なヒューマノイドタイプの2足歩行ユニットに使用されるタイプです。
- movement、これは最大移動ポイントを設定する項目です。通常、足の遅いイメージのユニットなら4、素早そうなユニットで6辺りを設定します。
例)movement = 5
- experience、これは最大経験値を設定する項目です。
例)experience = 24
- level、ユニットのレベルを設定する項目です。
例)level = 1
- alignment、ユニットのアライメントを設定する項目です。lawful/neutral/chaotic/liminalのいずれかを設定します。
例)alignment = lawful
- advances_to、ユニットが取得した経験値が最大経験値以上に到達した時の進化先のユニットを設定する項目です。
値として、進化先ユニットのidを設定します。また、進化先には複数のidを設定することができます。次のレベルへ進化させない場合はnullを設定し、代わりにレベルアップボーナスを与えるための設定(AMLA)を付け加えます。例)advances_to = White Mage,Red Mage advances_to = null
今回はnullとしておいてください。
- {AMLA_DEFAULT}、レベルアップ時にハイレベルユニットへ進化しない場合にユニットに与えられるレベルアップボーナス(After max level advancement)の設定です。これは基本的な設定が数種類マクロで用意されており、通常はそれを使用します。
もちろんオリジナルのボーナス設定を作ることも可能で、WMLに精通している人ならかなりユニークなボーナス設定を作り出せます。
ここでは、{AMLA_DEFAULT}のままにしておきます。
- cost、このユニットを雇用するときに消費するGoldを設定する項目です。
例)cost = 18
- usage、これはAIがユニットを雇用する際の指針の一つとなる情報です。用意されている値とその意味は次の通りです。
- scout:探索と村の占領を目的とした高速の移動ユニット。
- fighter:近接戦闘ユニット、近接攻撃は遠隔攻撃よりも大幅に強力です。
- archer:遠距離戦闘ユニット、近接攻撃よりもかなり強力な遠距離攻撃。
- mixed fighter:近接・遠隔戦闘両用ユニット、近接攻撃と遠隔攻撃はほぼ同じです。
- healer:「治療」または「治癒」の特殊能力持ち。
例)usage = fighter
- description、ゲーム中にプレイヤーが目にする、ユニットの説明文です。これもnameと同じく翻訳可能テキストとなります。それなりに詳細なテキストを用意すると雰囲気が出て楽しいのですが、面倒なら短めでも大丈夫です。
例)description = _ "Workers who get paid from the company and work hard."
- die_sound、ユニットが死亡した時に再生されるサウンドデータです。coreまたはアドオンのsoundsフォルダに用意されたサウンドデータを指定します。
指定する値は複数のサウンドをリストにすることも出来ます、例ではあらかじめ用意されているサウンドリストのマクロを使用しています。例)die_sound = {SOUND_LIST:HUMAN_DIE}
- [/unit_type]、最終行です。これはユニットタイプの設定がここで終了したことを示しています。
ここまでの設定で、とりあえずユニットの体を成した物が出来上がりました!このユニットのidを雇用リストに入れれば、ユニットを雇用してマップ上に出現させることができます。
そうそう、このユニットのファイル名も分かりやすくするためにユニットidと同じにしておきましょう。
ファイル名を「office_worker.cfg」もしくはあなたが採用したidに変更してください。
ユニットの画像を設定してみよう。
せっかくオリジナルのユニットを作るのですから、image画像をオリジナルの物に差し替えてみましょう。
ここではpngファイルを作成できる画像編集ソフトと、それを操作できる知識と能力が必要になります。
説明もそれを前提としていますので、そんなの訳がわからないという人はサンプル画像を使うことで妥協してください。
まず最初にイメージ画像の仕様について確認しておきましょう。
標準的なイメージ画像は次のような仕様になっています。
画像形式:png(背景透明) 画像サイズ:縦横72ピクセルの正方形 画像解像度:72dpi カラーモード:RGB ファイル名:半角英数字を使用
上記の仕様を満たした画像であれば、Wesnothはこれをユニットイメージとして受け入れます。
次にアートワークの面から、どのような画像が良いのか確認していきましょう。
- ユニットをどの角度で描くかを注意する。
ユニットの画像は基本的に斜め前を向いた若干見下ろし気味の角度で描きます。この見下ろし気味の角度を意識するようにしましょう。
人はなんとなく絵を描こうとすると、自分の目線で見えるように描きがちです。人間を描くときはだいたい自分目線、すなわち真っ直ぐ水平に見た状態です。見下ろした状態は、ちゃんと意識しないとなかなk描けない物です。
自分目線の絵と見下ろし気味の絵の違いを、分かりやすく四角柱で示したのが下の図になります。 - ユニットの大きさはどれくらいが良いか
ユニットの画像は、ユニットレベルごとに何となく大きさが決まっています。低いレベルは小さく高いレベルほど大きく描かれています。
チグハグな大きさで描くとプレイヤーを混乱させることになるので、注意しましょう。 - ユニットのプロポーション
人型ユニットの場合は、だいたい3頭身から4頭身で描かれることが多いです。他のユニットと並んだときに、プロポーションがあまりにも違うようだと見た目に違和感が出てきます。同じようなプロポーションで描くことをお勧めします。 - ユニット画像をアドオンに組み込もう
以上の事柄を踏まえて描いたものが下の画像です。それほどに綺麗に描かなくても、ゲーム画面上に登場させればそれなりに見栄えはしますので、ぜひオリジナル画像の作成にチャレンジしてみてください。
面倒くさい事はしたくないという人は、このサンプルを使ってもいいし既存のユニット画像を流用しても構いませんが、オリジナルで作った方が愛着は湧きますよ。例)office_worker.png
保存場所は下の図を参照してください。例)image = "units/office_worker.png"
これで、オリジナルのユニット画像をユニットに組み込むことが出来ました!
ユニットの動作テストしてみよう。
さて、あなたはユニットを一つ完成させました。せっかくなので動作テストをしてみましょう!
これからテストの準備をします。まずは、scenariosフォルダにあるtest.cfgを開いてください。
test.cfgの23行目と41行目に以下のコードが描かれていますので、確認してください。
recruit = "jelly_monster"
これは、サイド1とサイド2のリーダーユニットが雇用できるユニットのid一覧です。
今の段階では、それぞれjelly_monsterというidのユニット1種類だけを雇用できる状態です。ここにあなたが作成したユニットのidを追加しましょう。
やり方は簡単です。jelly_monsterの後に,を追加し新しいユニットのidを続けて入力するだけです。
例)recruit = "jelly_monster,office_worker"
これで準備完了です。
- 早速テスト用のアドオン、unit testを起動してみましょう。
シナリオが開始されたら、雇用画面を開いて見てください。問題が無ければ下図のようになるはずです。
おめでとうございます、テスト成功です!
さて、お気づきでしょうが・・・このユニット、移動する以外は何もできません。
そこで、次の章からはこの無能力ユニットに色々な能力を追加する方法を説明していきます。
ユニットに攻撃手段を与えよう。
さて、ユニットは攻撃手段を持たないとほぼ役立たず、バリケード替わりくらいしか利用法がない状態です。とりあえず、基本的な攻撃手段を追加してみましょう。
ユニットに攻撃手段を追加するには、[attack]タグを使用して以下のようにします。
#textdomain wesnoth-unit_test [unit_type] id = office_worker ・・・その他の設定項目・・・ [attack] name = briefcase description = _"briefcase" icon = attacks/briefcase.png type = impact range = melee damage = 6 number = 3 [/attack] [/unit_type]
では、設定項目の説明をしていきましょう。
- [attack]、このタグから[/attack]の間に記述された内容が攻撃手段の設定になります。
- name、これは武器の固有idとして機能する値です。
- description、これはゲーム画面に表示される武器の名称で、翻訳可能文字列になります。
- icon、これは戦闘直前に現れる武器選択画面で表示される武器アイコンの設定です。コアのimages/attacksフォルダからイメージに近いものを選んで設定するか、オリジナルで画像を用意して設定します。
- type、これは攻撃タイプの設定です。blade、pierce、impact、fire、cold、arcaneの6種類から選択してください。
- range、これは近接攻撃か投射攻撃かを決める項目です。melee(近接攻撃)、ranged(投射攻撃)のどちらかにします。
- damage、これは攻撃のダメージ量を表します。
- number、これは攻撃の回数を表します。
通常の武器であれば、以上の項目を埋めれば設定完了です。
槍兵のファーストストライクや騎兵のチャージ等のような特殊効果を持たせたい場合は、さらに設定を追加します。
[attack] name = briefcase description = _"briefcase" icon = attacks/briefcase.png type = impact range = melee damage = 6 number = 3 [specials] {WEAPON_SPECIAL_CHARGE} [/specials] [/attack]
[specials]と[/specials]の間に特殊効果の設定を記述することで、武器にウエポンスペシャルが追加されます。
上の例の{WEAPON_SPECIAL_CHARGE}はチャージの設定を纏めたマクロです。
Wesnothに最初から収録されているユニットのアタックスペシャル(武器の特殊効果)は全てマクロ化されていますので、見本のように[specials]タグにマクロを追加するだけで武器に搭載することができます。
オリジナルの特殊効果を追加することもできます、その場合はさらに複雑なWMLを書く必要があります。
- icon画像の仕様について
フレームデザインおよび背景色は理由が無い限り変更しない。
その他の仕様はimage画像と同じです。
この画像は、アドオンフォルダ内に収録してください。
ユニットをカスタマイズしてみよう。
さて、ここまでで基本的なユニットの作成はマスターできたわけですが、WMLにはさらにユニットを個性的にするキーがいくつも用意されています。それらを使ってユニットをカスタマイズする方法の一部を紹介します。
ユニットに性別を加える
魔法使いやエルフの射手など、ユニットの中には男女の性別がある場合があります。性別はgenderというキーによって設定できます。
- genderを設定してみましょう。
[unit_type] ・・・その他の設定・・・ gender = male,female [/unit_type]
このキーが設定されていない場合はデフォルトで男性が選択され、male,femaleの場合はランダムで性別が選択されます。
性別がセットされると、ユニットの個人名が男性名になるか女性名になるかが決定されます。
- 名前以外のパラメーターを性別によって変えるには
genderをセットしただけでは、ユニットに男女差は発生しません。そこで登場するのが[male](男性)および[female](女性)タグです。このタグ内で設定した内容がユニットの性別に基づいて自動的に適用されます。
ここに設定する内容はその性別特有の設定を差分として記入します。具体的な記入例は次のようになります。[unit_type] ・・・その他の設定・・・ [female] name = _ "female^office worker" gender = female image = "units/office_worker_f.png" die_sound = {SOUND_LIST:HUMAN_FEMALE_DIE} [/female] [/unit_type]
これで、女性がセットされた場合に、4つのパラメーターが変化します。
name、女性名が選ばれます。
gender、性別が女性になります。
image、ユニットのイメージが女性のものに変更されます。当然ながら、イメージ画像も用意する必要があります。
die_sound、女性用のサウンドが設定されます。
そのほかの項目を適宜、項目を追加します。
時間がある時にちょっとずつ記事を完成させます。たぶん半年くらいで完成させる予定。