特定の地形だと何かが起きるようにする
特定の地形で何か起きるようにするには、[filter_location]~[/filter_location](
FilterWML参照) を使って地形を指定します。
例(草原に止まるたびに Lulu が一言しゃべる)
[event]
name=moveto
first_time_only=no
[filter]
id=Lulu
[filter_location]
terrain=Gg
[/filter_location]
[/filter]
[message]
speaker=Lulu
message= _ "草は臭いわ。"
[/message]
[/event]
例のように必ず [filter]~[/filter] タグの中に入れ子にします。
なお、マップ上の特定のタイルの地形コードを知りたい場合は、Wesnoth Map Editor メニューの「マップ」で「地形コードを描画」にチェックを入れると表示されるようになります。
複数の地形を指定するときには、
terrain=Gg,Gg^Ve,Gs^Hp
のようにコンマで区切って書きます。
すべての平地を指定する場合には、
terrain=G*
のように書きます。
すべての村を指定する場合には、
terrain=*^V*
と書きます。
敵を発見したらイベントが起きる(会話するなど)(幕や霧があるとき限定)
ON_SIGHTING マクロが便利です。
例(サイド1がサイド2のユニットを発見した時にケロリンが発言する。)
{ON_SIGHTING () 1 side=2 (
[message]
speaker=Kerolyn
message= _ "え?なんでここに敵兵がいるんだ?聞いてないよ。"
[/message]
)}
[event]
name=moveto
[filter]
side=2
first_time_only=yes
[filter_vision]
viewing_side=1
[/filter_vision]
[/filter]
[message]
speaker=Kerolyn
message= _ "え?なんでここに敵兵がいるんだ?聞いてないよ。"
[/message]
[/event]
この場合、サイド1が敵(サイド2)を発見したときに一言話します(なんとなく、逆にしたくなりますので気をつけてください。)。
あるイベントの数ターム後に別のイベントを発生させる。
あるイベントAが発生してから一定のターンが過ぎてからイベントBを発生させたいことがあります。
はじめから、イベントAがいつ発生するのかわかっていれば簡単なのですが、ユニットがある場所に行ったときにイベントAが発生するような場合はそうはいきません。
そのようなときには、変数を活用します。
今回は、イベントAの2ターン後にイベントBが発生するようにしてみます。
(例:イベントAの発生)
[event]
name=moveto
[filter]
side=1
x=8
y=12
[/filter]
[unit]
side=1
x=8
y=1
id=Kerolyn
type=Elvish Hero
name= _ "ケロリン"
[/unit]
[set_variable] ← 変数に値を格納するためのタグ
name=turn_stored ← 変数に「turn_stored」と名前をつける。
value=$turn_number ← 変数「turn_stored」の中に今のイベント発生時のターンナンバーを格納する。
[/set_variable]
[set_variable]
name=turn_stored ← 変数「turn_stored」を呼び出す。
add=2 ← 変数「turn_stored」に入っている数字(=今のイベントのターンナンバー)に2を足す。
[/set_variable]
[/event]
はじめの name=turn_stored は、変数に名前をつけますが、2回目は、既にある変数を呼び出しています。
turn_nunber は、WML であらかじめ決まっている変数で、常に現在のターンナンバーを示します。なお、ここで先頭に$をつけ忘れないように気をつけてください。
変数の中に格納しているのが数字の場合、このように足し算引き算掛け算割り算も出来ます(ということは、変数の中に文字が入ることもあるんですね。変「数」というのに変ですねえ。)。
余談は、ともかくとして、これで変数「turn_stored」の中には、「今のターンナンバー + 2」という数字が格納されています。つまり、仮に今が、ターン4だとしたら、変数「turn_stored」の中は「6」ということです。
(例:イベントBの発生)
[event]
name=new turn ← 必ず「new turn」にする
first_time_only=no ← 必ず no にする
[if] ← もしも、○○ならという条件文
[variable]
name=turn_number ← 変数「turn_number(現在のターンナンバー)」を呼び出す。
numerical_equals=$turn_stored ← 変数「turn_number」の中身の数字と変数「turn_stored」の中身の数字
が同じか比べている。
[/variable]
[then] ← 条件が成立するなら、以下の通りになる。
[unit]
side=2
x=8
y=1
id=Poppon
type=White Mage
name= _ "ポポン"
[/unit]
[clear_variable]
name=turn_stored ← もう使わなくなった変数の中身をチャラにする。
[/clear_variable]
[/then]
[/if]
[/event]
なにやら複雑ですね。
name=new turn は、新しいターンになったらイベントが発生するということです。
first_time_only=no は、このイベントは、1度きりではなくて、条件さえ合えば何度でも発生するよ。ということです。
[if]、[then]、([else]) は、「もし、○○だったらこうなるよ。(○○でなければああなるよ。)」という条件文で、[filter] が使えないようなときには、これを使います(むしろ [filter] は基本的にユニットにしか使えません。)。
また、条件が成立しないときには、何も起こらないことも多いので、その場合は、[else] は省略して構いません。
「name=new turn」と「first_time_only=no」と [if] をセットで使うことで、毎回新しいターンになると、条件が成立するかチェックして、成立するとはじめてイベントが発生します。
[variable] の中で、変数「turn_number」の中身の数字と変数「turn_stored」の中身の数字が一致(equal)するかチェックしてます。ちなみに「numerical」というのは「数字の」という意味です。仮に変数「turn_stored」の中身が「ABC」のような文字だったりすると、チェックできません。
今回の例では、もし変数「turn_stored」の中が「6」だったとすると、第6ターンになって初めてポポンが登場します。また、第7ターン以降、再びポポンが登場することはありません。
ところで、こちらの例では、「name=turn_number」で先の例では「value=$turn_number」となっていますね。
$をつけると「変数の中身」を表します。
よく使われるたとえですが、変数というのは、「容器」のようなものです。
例えば、「調味料入れ」という容器があったとします。調味料入れには「砂糖」を入れることも出来ますし、「塩」を入れることも出来ます。でも、「調味料入れ」そのものが、砂糖になったり塩になったりするわけではありません。
「name=調味料入れ」の場合は、容器である調味料入れそのものを指します。
一方「value=$調味料入れ」は、調味料入れの中に入っている砂糖なり塩なりを指します。
変数そのものか変数の中身かの違いはつまづきやすいところなので注意しましょう。
[clear_variable] は、使用済みの変数の中身を空っぽにするためのものです。変数は、一度中身を格納すると、キャンペーンの最後まで保持します。そのため、あるシナリオで発生したイベントを後のシナリオに影響させることも可能になります。
一方で、使用済みの変数を残しておくと、後々思いがけないトラブルの原因ともなりますので、[clear_variable] で空にしておくことをお勧めします。
変数は、理解するのがちょっと大変ですが、いろいろちょっと凝ったことをしたいときには便利(というか必須)です。詳しくは本家サイトを読んでくださいと言いたいのですが、実例がほとんど載っていないので、(「変数っていうのに、なんで数字以外でも使えるんだ?」というところでつまずく私のような)素人にはキビシイです。
最終更新:2013年07月20日 17:24