アットウィキロゴ

既存マクロは、キャンペーンの作成を省力化してくれますが、自分でも作ることができます。
マクロには、次のようなメリットがあります。
  1. 楽できる。(特に修正するときは、元のマクロだけ直せばよい。)
  2. 書き間違えによるエラーが減る。(コピペは間違いの元になりやすい。)
  3. 複雑な処理を別ファイルにすることができるので、シナリオの見通しがよくなる。

一方で、マクロを多用しすぎると、シナリオファイルを読んだだけでは、どんな処理がされているのか見当がつかなくなったりします。
そのあたりは、マクロの命名を工夫するなどしましょう。

どんなときマクロを作るか

  • シナリオを書いていて、以前に書いた処理をコピペして、再び使っているような場合はその処理をマクロにできないか考えましょう。
  • あるイベントの内容が複雑で、シナリオ全体の見通しが悪くなるような場合、イベントごとマクロ化することもできます。

マクロの定義の置き場所

自作マクロを使うためには、どこかであらかじめマクロの名前と働きを定義しておく必要があります。

  • ひとつのシナリオでしか使用しない場合
そのシナリオ内または、キャンペーンフォルダの utils フォルダ内(後述)
なお、コンピュータは基本的にシナリオを上から読んで解釈していきますので、シナリオ内でマクロを定義(後ほど説明します。)する場合は、実際にマクロを使用する箇所より上に記述しないとエラーになってしまいます。

  • 複数のシナリオで共有する場合
キャンペーンの utils フォルダ内
ファイル名は拡張子が .cfg であれば任意で構いませんが、マクロの働きごとに分かりやすい名前をつけるとよいでしょう。
ひとつのファイルに複数のマクロの定義を記述することができます。

なお、utils フォルダにマクロを置く場合は、_main.cfg ファイル内に {~add-ons/キャンペーンフォルダ名/utils} とフォルダへのパスを明記します。シナリオファイルへのパスより前に記述して、マクロ定義を先に読ませないとエラーになってしまいます。
(略)
{~add-ons/Save_the_Woods/utils}
{~add-ons/Save_the_Woods/scenarios}
(略)


マクロの名前のつけ方

基本的な使い方にもあるとおり、マクロの名前は大文字にします(多分小文字でも動くと思いますが、大文字にすることでマクロだとすぐわかります。)。
また、長くなってもよいので、何をするマクロなのか読んでわかるような名前にします。
悪い例
{MACRO_L1}, {LBH}
単なる記号や頭文字だけでは、どんな働きをするのか分かりません。本人がわかればいいという考えもありますが、マクロが増えてくると本人でも混乱します。

(比較的)よい例
{ABILITY_DARKENS_LEVEL_1}, {LAST_BREATH_OF_HEROS}
読めば暗黒化(光明の逆)やヒーローたちの最期の言葉と想像がつきます。

マクロの定義作例

まずは、一番よく使いそうなマクロを定義してみましょう。それは、主人公の最期の言葉です。
キャンペーンを作っていると、大抵のシナリオで主人公が倒されたときの最期の言葉は同じので通用します。この部分をマクロ化すると、大作を作るほどそのありがたみが分かります。

マクロ化前の部分

    [event]
        name=last breath
        [filter]
            id=Kerolyn
        [/filter]
        [message]
            speaker=Kerolyn
            message= _ "さらばだ!"
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]
この last breath イベントをまるごとマクロにします。

下準備

_main.cfg ファイル内に次の行を追加します。
{~add-ons/Save_the_Woods/utils}
先にも書いたように、シナリオへのバスよりも先に書きます

マクロの定義をします

キャンペーンフォルダに utils というフォルダを作成します。
utils フォルダ内にlast_breath.cfg(どんな名称でもよいが、内容がわかりやすいもの)というテキストファイルを作成します。

last_breath.cfg 内に次のように記述します
#define LAST_BREATH_OF_KEROLYN
    [event]
        name=last breath
        [filter]
            id=Kerolyn
        [/filter]
        [message]
            speaker=Kerolyn
            message= _ "さらばだ!"
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]
#enddef
見てわかるように、要するに #define マクロ名 ~ #enddef の間にやりたいことをはさむだけです。

シナリオファイルの修正

マクロの定義ができたので、シナリオファイルを修正します。
まず、シナリオファイル内に次の例のように書きます。
{LAST_BREATH_OF_KEROLYN}
これで、マクロを呼び出せるようになりましたので、元あった last breath イベントを削除します。
やってみると簡単ですね。

応用

多くのキャンペーンでは主人公だけではなく、腹心の部下が殺されてしまったときも、最期の言葉を言います。
1人でも2人でもやることは同じですね。
例1
#define LAST_BREATH_OF_KEROLYN
    [event]
        name=last breath
        [filter]
            id=Kerolyn
        [/filter]
        [message]
            speaker=Kerolyn
            message= _ "さらばだ!"
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]
#enddef

#define LAST_BREATH_OF_LULU
    [event]
        name=last breath
        [filter]
            id=Lulu
        [/filter]
        [message]
            speaker=Lulu
            message= _ "さよなら!"
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]
#enddef
と2つのマクロを定義して、シナリオ中に
{LAST_BREATH_OF_KEROLYN}
{LAST_BREATH_OF_LULU}
とやってもいいですし、
例2
#define LAST_BREATH_OF_HEROS
    [event]
        name=last breath
        [filter]
            id=Kerolyn
        [/filter]
        [message]
            speaker=Kerolyn
            message= _ "さらばだ!"
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]

    [event]
        name=last breath
        [filter]
            id=Lulu
        [/filter]
        [message]
            speaker=Lulu
            message= _ "さよなら!"
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]
#enddef
と定義して、シナリオ中に
{LAST_BREATH_OF_HEROS}
と記述してもよいです。

でも、よく見てください。Kerolyn も Lulu も人物と台詞が違うだけで他の部分はまったく同じですよね。
シナリオにこのマクロを書くときに「誰」が「何と言う」かを入れられるようにすれば、応用範囲が広がりそうです。
というわけで、次にマクロを使うときに値を入れられるようにしていきます。

マクロに使うときに値(引数)を入れられるようにする

既存のマクロにも、{GOLD 100 150 200} などのように使うときに何らかの値を入れられるものがたくさんあります。初期資金は、シナリオごとに調整する必要がありますので、変更できないと困りますからね。
自作のマクロでも、同じように使うときに何らかの値を入れられるようにすることができます。

例として、最期の言葉のマクロを「誰」が死んだとき「何と言う」かを使うときに入れられるように改良してみましょう。
#define LAST_BREATH_OF_SOMEONE ID MESSAGE
    [event]
        name=last breath
        [filter]
            id={ID}
        [/filter]
        [message]
            speaker={ID}
            message={MESSAGE}
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]
#enddef
中身を見てみると、Kerolyn や Lulu といった名前が入っていた部分が {ID} に変わっています。また、台詞の部分も {MESSAGE} になっています。

また先頭は、LAST_BREATH_OF_SOMEONE というマクロ名の後に ID と MESSAGE という文字が加わってます。
どうやら、ID と MESSAGE に人名やセリフを入れると、それが置き換えられるようだとわかりますね。

実際にシナリオファイル内に置くときは次のようになります。
{LAST_BREATH_OF_SOMEONE Kerolyn (_ "さらばだ!")}
{LAST_BREATH_OF_SOMEONE Lulu (_ "さよなら!")}
(セリフ部分の書き方に注意してください。マクロの定義の時に _ や " を入れられなかったので、ここで入れています。)

応用編として、「誰か」が殺されたときに、「別の人」が「何か言う」マクロを作ってみましょう。
例えば、「Kerolyn」が殺されたときに「Lulu」が「死んじゃいや!」というようにしてみましょう。
シナリオファイルに書くときには、こんな感じになります。
{LAST_BREATH_OF_FELLOW Kerolyn Lulu (_ "死んじゃいや!")}

できましたか?
例えばこんな感じになります。
#define LAST_BREATH_OF_FELLOW KILLED SPEAKER MESSAGE
    [event]
        name=last breath
        [filter]
            id={KILLED}
        [/filter]
        [message]
            speaker={SPEAKER}
            message={MESSAGE}
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]
#enddef

マクロの入れ子

さて、これまでで、主な登場人物が殺されたときのために、
{LAST_BREATH_OF_SOMEONE Kerolyn (_ "さらばだ!")}
{LAST_BREATH_OF_SOMEONE Lulu (_ "さよなら!")}
とシナリオ内に2つのマクロを書けばよいようになりましたが、これもなんだか無駄なような気がしませんか?
いちいち人名とセリフを書くのも面倒です。
それに主要登場人物が10人もいるキャンペーンでは、シナリオ毎に10行も書かかければなりません(実際にはコピペでしょうけど。)。

実は、マクロを取り込んださらに大きなマクロを作ることができます。
Aという大きなマクロの中にB、C、D・・・と別のマクロを入れることができます。Bの中にX、Y、Z・・・とさらに入れ子にすることもできます。
なお、私が試した限りでは、大きなマクロと中に入れるマクロのどちらを先に定義しても動くようです。

#define LAST_BREATH_OF_SOMEONE ID MESSAGE
    [event]
        name=last breath
        [filter]
            id={ID}
        [/filter]
        [message]
            speaker={ID}
            message={MESSAGE}
        [/message]
        [endlevel]
            result=defeat
        [/endlevel]
    [/event]
#enddef

#define LAST_BREATH_OF_HEROS
     {LAST_BREATH_OF_SOMEONE Kerolyn (_ "さらばだ!")}
     {LAST_BREATH_OF_SOMEONE Lulu (_ "さよなら!")}
#enddef
前半はさっきと同じマクロを定義して、後ろの方で2つのマクロをまとめて1つにしてあります。

シナリオ内では
{LAST_BREATH_OF_HEROS}
と1行で済みます。これで、登場人物が何十人になろうが大丈夫ですね。
ただし、どのシナリオでも同じセリフならいいのですが、変えたいというような場合は、工夫する必要がありますが、それはご自分で考えてみてください。

タグ:

+ タグ編集
  • タグ:
最終更新:2015年01月18日 20:21