完全な初心者のためのWMLガイド/第9章:マクロ

Last-modified: 2017-03-25 (土) 11:04:34

まったく同じことを何度もやるような仕事をする必要があったことはありますか?たとえば、カフェで働いていて、まったく同じ注文をする3人の顧客がいるとします。a(...)
まったく同じタスクを複数回実行する必要があるプログラミングのインスタンスもあります。それは、同じ作業をもう一度やり直す必要があるたびに同じコードをもう一度書く必要があります。繰り返しコードがたくさんあれば、それを永遠に書くことになります。コードを何回も書くことなく、その作業を何度もやり遂げることができれば素晴らしいとは思いませんか?まあ、マクロを使うとはそういうことです。
マクロは特別な種類の変数と考えることができます。変数に長い文章を保存し、後でそれを複数のメッセージに置き換えることができるように、文章を何度も書く必要がないように、WMLコードをマクロに格納して、単にマクロを呼び出すだけです。マクロには含まれるすべてのコードを記述する必要があります。シナリオでマクロが呼び出されると、プリプロセッサは、呼び出されたマクロに含まれるコードを、そのシナリオが続く間、自動的に置き換えます。
これは混乱する話題になる可能性がありますので、実際のWMLの例をいくつか説明しましょう。ここでは、シナリオの開始時に貴族の指導者と難解な司令官が戦闘計画を策定しようとしています。

 
[event]
  name=start
   [message]
       speaker=Leader
       message= _ "What do you think our plan should be, Stooge?"
   [/message]
   [message]
       speaker=Stooge
       message= _ "WHAT?"
   [/message]
   [message]
       speaker=Leader
       message= _ "I said, what do you think our battle plan should be?"
   [/message]
   [message]
       speaker=Stooge
       message= _ "WHAT?"
   [/message]
   [message]
       speaker=Leader
       message= _ "WHAT DO YOU THINK OUR BATTLE PLAN SHOULD BE?!"
   [/message]
   [message]
       speaker=Stooge
       message= _ "WHAT?"
   [/message]
   [message]
       speaker=Leader
       message= _ "Grrr..."
   [/message]
[/event]
 

リーダーが何かを言うたびに、Stoogeはまったく同じことを言っています:「何?」を何度も書かなくてもいい方法は?

 
[message]
    speaker=Stooge
    message= _ "WHAT?"
[/message]
 

これを"STOOGE_REPLY"という名前のマクロにして、3回コードを張りましょう。 キャンペーンフォルダ内の「マクロ」フォルダに新しいテキストドキュメントを作成します。 名前を "my_macros.cfg"にします。 テキストエディタでファイルを開き(まだ開いていない場合)、次のコードを入力します。
一行目には、もちろんお約束の一行を書いておいてください。

 
#define STOOGE_REPLY
    [message]
        speaker=Stooge
        message= _ "WHAT?"
    [/message]
#enddef
 

今すぐファイルを保存します。 あなたは最初のマクロを作成しました! 早速、先ほどのイベントにマクロを貼り付けてみましょう。

 
[event]
  name=start
   [message]
       speaker=Leader
       message= _ "What do you think our plan should be, Stooge?"
   [/message]
   {STOOGE_REPLY} ←ここにマクロがあります。
   [message]
       speaker=Leader
       message= _ "I said, what do you think our battle plan should be?"
   [/message]
   {STOOGE_REPLY} ←ここにマクロがあります。
   [message]
       speaker=Leader
       message= _ "WHAT DO YOU THINK OUR BATTLE PLAN SHOULD BE?!"
   [/message]
   {STOOGE_REPLY} ←ここにマクロがあります。
   [message]
       speaker=Leader
       message= _ "Grrr..."
   [/message]
[/event]
 

これがマクロを3回貼り付けた状態です、だいぶ行数が減りましたね。マクロの実際の使用例を見た所で次のステップに移りましょう。マクロの個々の内容を説明します。

 

マクロのパーツ

マクロは、マクロプリプロセッサディレクティブ、マクロシンボル、マクロボディという3つの要素で構成されています。

 

マクロプリプロセッサディレクティブ
マクロプリプロセッサディレクティブは、文字列 "#define"と "enddef"で構成されています。 彼らは、マクロの始まりと終わりをゲームに伝えます。
"_main.cfg"ファイルのプリプロセッサディレクティブ(以前、私がタグの一種の様な物と書いた箇所です。覚えていますか?)と同様に、マクロプリプロセッサディレクティブは完全に小文字で、正しく入力されている必要があります。

 

マクロシンボル
マクロのシンボルは、マクロを識別するオープニングプリプロセッサディレクティブに続く大文字の文字列です。 それをマクロのIDと考えてください。 シンボルには、英数字とアンダースコアのみを使用でき、全体を大文字にする必要があります。 上記の例の場合、マクロシンボルは次のようになります。

 
STOOGE_REPLY
 

マクロボディ
マクロ本体は、マクロに含まれるコードです。プリプロセッサディレクティブ間のすべてのもの(マクロシンボルを除く)は、ゲームによってマクロボディとみなされます。この場合、マクロボディは次のようになります。

 
#define STOOGE_REPLY
    [message]      ←ここから
        speaker=Stooge
        message= _ "WHAT?"
    [/message]      ←ここまでがマクロボディ
#enddef
 

マクロを呼び出す方法

マクロを作成し、それが何をしているのか、それぞれの部分が何であるのかを理解したので、先ほどのリーダーとストーグの間の対話を含む開始イベントに戻りましょう。このコードの各インスタンスを置き換えた方法を確認していきます。
私たちは次のコードをマクロに置き換えました。

 
[message]
    speaker=Stooge
    message= _ "WHAT?"
[/message]
 

これを、

 
{STOOGE_REPLY}
 

に置き換えた訳です。マクロを使用する時は、マクロシンボル(STOOGE_REPLYの部分ですね)を「{}」で囲んで書き込む必要があります。
基本的に、これはゲームに、この行のインスタンスを見つけるたびに次のように伝えます。

 
{STOOGE_REPLY}を見つけたら、その行の代わりに次のコードを使用してください。
マクロボディ
[message]
    speaker=Stooge
    message= _ "WHAT?"
[/message]
 

これがマクロの基本形です。

 

マクロ引数

基本的なマクロの使い方を理解した所で、さらなる便利なマクロの機能を紹介します。マクロに引数を設定する事でマクロボディの一部を状況に合わせて変更する事が出来ます。

 

マクロ引数の設定
マクロ引数はマクロシンボルの直後にスペースを挟んで書き込まれる文字列です。マクロシンボルと同じく大文字とアンダーバーのみが使用されます。

 
#define STOOGE_REPLY SPEAKER MESSAGE
 

この例ではマクロシンボル「STOOGE_REPLY」の後に二つのマクロ引数「SPEAKER」と「MESSAGE」が設定されています。次にする事はマクロ引数がマクロボディのどこに代入されるかを指定することです。

 
#define STOOGE_REPLY SPEAKER MESSAGE
    [message]
        speaker={SPEAKER}
        message={MESSAGE}
    [/message]
#enddef
 

この例ではspeakerの値を引数SPEAKER、messageの値を引数MESSAGEで置き換えるように指定しています。先ほどのイベントにマクロを貼付ける書式と同じように「{}」で囲んで記入しています。つまり、因数とはマクロ内マクロと考える事ができます。

 

引数付きマクロの使用
おおかた予想はついていると思いますが、引数があるマクロは次のように使用する事が出来ます。

 
[event]
    name=start
    {STOOGE_REPLY Leader ( _ "What do you think our plan should be, Stooge?")}
    {STOOGE_REPLY Stooge ( _ "WHAT?")}
    {STOOGE_REPLY Leader ( _ "I said, what do you think our battle plan should be?")}
    {STOOGE_REPLY Stooge ( _ "WHAT?")}
    {STOOGE_REPLY Leader ( _ "WHAT DO YOU THINK OUR BATTLE PLAN SHOULD BE?!")}
    {STOOGE_REPLY Stooge ( _ "WHAT?")}
    {STOOGE_REPLY Leader ( _ "Grrr...")}
[/event]
 

1つのマクロをリーダーとStoogeの両方に適用している訳です、随分行数が減りましたね。引数SPEAKERにはその時話すユニットのid、引数MESSAGEにはその台詞を記入します。
ところで引数MESSAGEの方だけ()で囲んでありますね、これは引数MESSAGEの内容がスペースを含んでいることが理由です。()で囲む事でスペースを含めて1つの文字列として扱うようになります。
もし()を使わなかったら、

 
{STOOGE_REPLY Stooge _ "WHAT?"}
 

よく見るとスペースが3個所にあります。引数MESSAGEは「 _ 」一文字と認識され、「"WHAT?"」は余分な引数と見なされるため、エラーが発生します。

 

今あなたはマクロの主要な機能と使い方を知りました、次の章に進む頃合いです。

 

第8章へ戻る
第10章へ進む
目次に戻る