第5章:イベント
平均的な朝を考えてみましょう。 あなたは目覚まし時計が鳴ったら、目を覚ます。 あなたは階下へ行き、朝食のためにトースタにパンを入れる。 トーストが飛び上ったら、バターを塗って食べる。 あなたは朝食を食べた後に外に出て、バスが到着するのを待ちます。 バスが到着すると、あなたはそれに乗ります。 あなたの目的地で止まると、バスから降りる。
これが、他の何かが起きないかぎり、いつも行う朝の行動だということに注意してください。 これらはすべて「出来事」です。
警報が鳴り出して目が覚めました。 トースターから射出したトーストにバターを塗って食べます。 朝食後は外に出る。 バスが止まると、あなたは乗り降りします。 これらはすべてWMLのようなイベントとして考えることができます。
イベントを書くための構文は次のようになります。
[event] name=name_of_the_event #何かをする [event]
WMLには、ここで利用可能なイベントがいくつかあります。 これらのうち、最も一般的に使用されるのは、prestartイベント、startイベント、およびmovetoイベントです。
共通イベント
さて、私は、あらゆる種類の定義済みのイベントのそれぞれの網羅的なリストを提供するつもりはありません、それはWMLリファレンスページのためのものです。ただし、あらかじめ定義された最も頻繁に使用されるイベントのリストとその内容については、後でキャンペーンシナリオで使用する予定ですので、これを説明していきます。
"prestart"イベント
このイベントは、シナリオの画面に何かが表示される前に発生します。
このイベントは、プレイヤーのための忠実なヒーローを思い出し、忠実なディフェンダーを作成するためによく使用されます。ユーザーがMAPを見ることができる前に起こってほしいことは、このイベントの中に入ります。このように考えてみましょう。
シナリオ開始前のローディング画面では、プレスタートイベントのすべてが実行されます。このイベントを作成するには、次のWMLを使用します。
[event] name=prestart #ここでする事 [/event]
"prestart"イベントは、機能するために追加のキー(name = prestart以外)を必要としません。ただし、サンプルシナリオではこのイベントは使用しません。
"start"イベント
"start"イベントは、ユーザーがマップと画面を表示できるようになった後で、ユーザーが実際に何かを実行できるようになる前に発生します。開始イベントを宣言するには、単にこう書きます。
name=start
Objectives(勝利目標)
開始イベントの一般的な使用方法は、シナリオの目的(CTRL + Jを押してアクセスできる小さなウィンドウ)を宣言することです。
これは、[objectives]と[objective]の2つのタグを使用して行われます。(語尾にsがあるか無いかで使う場所が違うので、間違わないように!)
[event] name=start [objectives] [objective] description= _ "Defeat the enemy leader" condition="win" [/objective] [objective] description= _ "Death of your leader" condition="lose" [/objective] [/objectives] [/event]
[objectives]タグが[objective]タグをどのように囲んでいるかに注目してください。
基本的に[objectives]タグはWMLに、シナリオの目的を宣言することを開始することを伝え、その後に[objective]タグで目的が表されます。
[objective]タグには2つのキーがあります
description = _ "ここに目的を記述する" condition= ここに "win" か "lose"のどちらかを入力。 - "win"は緑色でグループ化され、"lose"は赤でグループ化されます。
[message]
もちろん、開始イベントはゲーム開始前の会話を作成するのにも適しています。これは[message]タグを使用して行われます。このタグには2つのキーがあります。
speaker= message= _ ""
スピーカータグには、話しているユニットのIDが含まれています。一つ前の章で、我々のリーダーに「MyLeader」のIDをどのように与えたかを覚えていますか?まあ、今すぐ彼は短い演説をするつもりです。
speaker=MyLeader
メッセージキーは、話し手が実際に何を話すかを表します。これは翻訳可能とマークする必要があります:。
message= _ "I see the orcs!"
これと、もう一つ別のメッセージをサンプルの開始イベントに入れて見ましょう。
[event] name=start [message] speaker=MyLeader message= _ "I see the orcs!" [/message] [message] speaker=EnemyLeader message= _ "Grrrr!" [/message] [objectives] [objective] description= _ "Defeat the enemy leader" condition="win" [/objective] [objective] description= _ "Death of your leader" condition="lose" [/objective] [/objectives] [/event]
イベントを配置する場所はWMLには関係ありませんが、他の人があなたのWMLをより簡単に読むことができるように、[side]タグの下に配置するのは良い形式です。
では、シナリオファイルがどのようになっているか、見てみましょう。
textdomain wesnoth-my_first_campaign [scenario] id=my_first_scenario next_scenario=null name=_"My First Scenario." map_data="{~add-ons/my_first_campaign/maps/my_first_map.map}" turns=30 [side] side=1 controller=human team_name="good" user_team_name= _ "My Team" id=MyLeader name= _ "My Leader's Name" type="Elvish Ranger" unrenameable=yes canrecruit=yes recruit="Elvish Fighter, Elvish Archer, Elvish Shaman" gold=100 [/side] [side] side=2 controller=ai team_name="bad" user_team_name= _ "Bad Guys" id="EnemyLeader" name= _ "My Villain" type= "Orcish Warrior" unrenameable=yes canrecruit=yes recruit="Orcish Grunt, Orcish Archer, Orcish Assassin, Wolf Rider" gold=100 [/side] [event] name=start [message] speaker=MyLeader message= _ "I see the orcs!" [/message] [message] speaker=EnemyLeader message= _ "Grrrr!" [/message] [objectives] [objective] description= _ "Defeat the enemy leader" condition="win" [/objective] [objective] description= _ "Death of your leader" condition="lose" [/objective] [/objectives] [/event] [/scenario]
これで、シナリオがスタートする所までが完成しました。
"moveto"イベント
あなたが推測したように、ユニットが動いたときには「moveto」イベントがカバーします。
このイベントは、ユニットが移動して所定の[filter]に一致した後にトリガされます。あなたは[filter]とは何か疑問に思いますか?簡単に見てみましょう。
[filter]
[filter]タグは、このイベントをフィルタに一致するユニットにのみ適用するようにWMLに指示します。例えば、サイド1がユニットをヘクス1,1に移動させたときにのみmovetoイベントを実行したい場合、[filter]を次のように使用します。
[filter] side=1 x,y=1,1 [/filter]
シンプルですね?フィルタタグのその他の共通キーには、次のものがあります。
id=MyLeader
リーダーのような特定のユニットのID。
type="Elvish Shaman"
Elvish Shaman(エルフの女呪術師)だけがこのフィルターを通過します。
[filter]の詳細については、FilterWML(本家wikiにあります)を参照してください。これで、非常にシンプルなmovetoイベントをサンプルシナリオに追加できます。
[event] name=moveto first_time_only="no" [filter] side=1 x,y=1,1 [/filter] [message] speaker=unit #unitはこのイベントをトリガーするユニットを意味します。この場合は、移動したばかりの人 message= _ "Look at me! I'm on hex 1,1!" [/message] [/event]
おっと!あなたに説明せずに新しいキーを追加しました...私は混乱しています!ちょっとした手違いです、すぐにその"first_time_only"キーを説明するつもりです。
"first_time_only"キー
「first_time_only」キーには、「yes」と「no」の2つの値があります。
このキーは、入力しなくても、実際にはすべてのイベントに表示されます。この場合、値には「yes」(これはデフォルト値とも呼ばれます)が含まれています。 first_time_only = "yes"の場合、イベントは条件が満たされた最初の1回のみ実行されます。この例では、これは、最初のユニットのみが1,1ヘクスへ移動すると、彼の存在を世界に知らせることを意味します。しかし、first_time_only = "no"の場合、ユニットがヘクスへ移動するたびに1,1が発言するようになります。さっきのが、そのイベントの例です。
"time over"イベント
このイベントは、すべてのターンが終了した後に起動します。 これは、通常、シナリオを失う前に簡単なメッセージを出すために使用されます。 ところで、WMLを使用して勝敗を強制することは、次のように行われます。
[endlevel] result=victory または result=defeat 勝利と敗北の2種類の値があります。 [/endlevel]
かなり典型的なイベントの例は次のようになります。
[event] [message] speaker=MyLeader message= _ "I give up. This is taking too long..." [/message] [endlevel] result=defeat [/endelevel] [/event]
"last breath"と"die"イベント
これらの2つの出来事は非常に似ています。両方のイベントは、'unit'という値で扱われる[filter]で指定されたユニットがkillされたときにトリガされますが、さらに、'second_unit'と呼ばれるkillした側のユニットを[filter_second]で指定できます。
"last breath"はユニットの死亡アニメーションが表示される前(ユニットが死ぬ前でヒットポイントは0以下の状態の時に発動する)。"last breath"イベントが終了した後にユニットの死亡アニメーションが再生され"die"イベントが発生する。
結果として、死に至るユニットに最後のメッセージを言わせたいときに"last breath"を使い、その死の結果として起こるものについては"die"を使用する。次に、これらの両方のイベントを使用する例を示します。正確に何が起こっているか把握できるかどうかを確認してください。
[event] name="last breath" first_time_only=no [filter] side=2 [/filter] [filter_second] side=1 [/filter_second] [message] speaker=second_unit message= _ "Take that!" [/message] [message] speaker=unit message= _ "Hah! You missed!" [/message] [/event] [event] name=die first_time_only=no [filter] side=2 [/filter] [filter_second] side=1 [/filter_second] [message] speaker=second_unit message= _ "Wrong!" [/message] [/event]
この2つのイベントは、サイド1がサイド2のユニットの1つを殺すたびに発生します。これらのイベントが発生すると、プレイヤーには次のように表示されます。
- > "Take that!" -> "Hah! You missed!" -> Death animation -> "Wrong!"
ネストされたイベント
あなたがこれをしたらどうなるのか疑問に思ったことがありますか(擬似コードの例):
[event] name=event1 (...) [event] name=event2 (...) [/event] [/event]
1つのイベントがもう1つのイベントの中に「入れ子になっている」ため、これはネストイベントと呼ばれます。ここでは、event1がトリガーされたときに、event1中のevent2以外のイベントに加えて、event2が発生します。これにより、イベント2がイベント1より先に発生するのを防止します。
敵の指揮官(id = EnemyLeader)を倒してリーダー(id = MyLeader)を敵のkeep(x、y = 20,7)に移動してメッセージを表示したかったとします。これを次のように行うことができます:
[event] name=die [filter] id=EnemyLeader [/filter] [event] name=moveto [filter] id=MyLeader x,y=20,7 [/filter] [message] speaker=unit message= _ "Haha! I captured the enemy keep!" [/message] [/event] [/event]
さらに詳しい情報:イベントの詳細、イベントの記述方法、動作方法についてもっと知りたい人は、EventWMLのページを参照してください。(英語ですが)
さあ、作ったサンプルイベントのいくつかをシナリオに挿入して(敵の指導者のための新しい"die"イベントを作成します)、次のようにしてみましょう。
#textdomain wesnoth-my_first_campaign [scenario] id=my_first_scenario next_scenario=null name=_"My First Scenario." map_data="{~add-ons/my_first_campaign/maps/my_first_map.map}" turns=30 [side] side=1 controller=human team_name="good" user_team_name= _ "My Team" id=MyLeader name= _ "My Leader's Name" type="Elvish Ranger" unrenameable=yes canrecruit=yes recruit="Elvish Fighter, Elvish Archer, Elvish Shaman" gold=100 [/side] [side] side=2 controller=ai team_name="bad" user_team_name= _ "Bad Guys" id="EnemyLeader" name= _ "My Villain" type= "Orcish Warrior" unrenameable=yes canrecruit=yes recruit="Orcish Grunt, Orcish Archer, Orcish Assassin, Wolf Rider" gold=100 [/side] [event] name=start [message] speaker=MyLeader message= _ "I see the orcs!" [/message] [message] speaker=EnemyLeader message= _ "Grrrr!" [/message] [objectives] [objective] description= _ "Defeat the enemy leader" condition="win" [/objective] [objective] description= _ "Death of your leader" condition="lose" [/objective] [/objectives] [/event] [event] name=moveto first_time_only="no" [filter] side=1 x,y=1,1 [/filter] [message] speaker=unit #unit means the unit triggering this event--in this case the guy who just moved message= _ "Look at me! I'm on hex 1,1!" [/message] [/event] [event] name="last breath" first_time_only=no [filter] side=2 [/filter] [filter_second] side=1 [/filter_second] [message] speaker=second_unit message= _ "Take that!" [/message] [message] speaker=unit message= _ "Hah! You missed!" [/message] [/event] [event] name=die first_time_only=no [filter] side=2 [/filter] [filter_second] side=1 [/filter_second] [message] speaker=second_unit message= _ "Wrong!" [/message] [/event] [event] name=die [filter] id=EnemyLeader [/filter] [message] speaker=second_unit message= _ "Yeah! I killed him!" [/message] [endlevel] result=victory [/endlevel] [/event] [/scenario]
おめでとう! これで最初の機能的なシナリオが作成されました!
続行する準備が整ったら、次に進んでください。
第4章へ戻る
第6章へ進む
目次に戻る