Almightのタグ・マクロの属性値を変数で動的にする
Almightでマクロを作ってみたりすると、条件ごとに処理を変えたいことがでてくると思います。 「マクロの属性値に特定の値が入力された時にはこの画像を表示する」 「ゲーム変数にある値が入ったらこの音を再生する」 といったような、画像や音声のファイルを動的に切り替えて指定するということ場面です。 AlmightSDKに同梱されているmacro.ksをみるとやりかたはわかるのですが、公式サイトに記載がいないので、改めて説明しようと思います。
マクロ内での属性値の取得
まずはマクロの属性値の取得方法について説明します。 公式にも記載されている方法は、%を使う方法ですね。
[macro] と [endmacro] の間を、マクロとして記録します。マクロ内のタグの属性値には % を頭につけた値を指定できます。 マクロに渡された属性名を指定しておくと、マクロに渡された属性の値をその属性の値とすることができます。
引用元: Almightタグリファレンス
// newmacro という名前のマクロを作成し、エイリアス(別名)に font_color と指定しておく。 [macro name="newmacro" alias="font_color"] [font color="%type"]マクロを実行しました[resetfont] [endmacro] // 赤い文字で「マクロを実行しました」と表示される [newmacro type="#ff0000"]
この公式の説明のように、[font color="%type"]と書くことで[newmacro type="#ff0000"]のtype属性に指定した値が取得できるわけです。 ただ、この方法ではif文で条件分岐させることができません。 if文でも使えるような形で取得するは、公式の配布しているmacro.ksをみるとわかります。 show_bgというマクロで説明します。
// 背景を読み込む // [show_bg file="ファイル名"] // // 背景を読み込みます.その後、[action]を使って実行してください。 // jpgの場合のみ拡張子は省略可能になります [macro name="show_bg"] [eval exp="mp.file = (mp.file.indexOf('.') === -1) ? mp.file + '.jpg' : mp.file"] [image storage="%file" page="back" layer="base"] [endmacro]
mp.fileという記述があるのがわかります。このmpがマクロの属性値を取得するためのものです。 このマクロではevalタグのexp属性内で、JavaScriptの三項演算子を使って条件分岐をしています。 Almightのタグの書き方に直すとこうなります。
[macro name="show_bg"] [if exp="mp.file.indexOf('.') === -1"] [eval exp="mp.file = mp.file + '.jpg'"] [else] [eval exp="mp.file = mp.file"] [endif] [image storage="%file" page="back" layer="base"] [endmacro]
file属性に指定された値に「.」(ドット)が含まれていなければ、.jpgを追加してやり、そうでなければfile属性のそのままの値をfile属性に代入しています。 この場合、elseの処理は実質不要ですね。 まぁそれはともかく、このようにしてmp.fileと書くことでshow_bgのfile属性の値が取得できるわけです。 具体例をだすと、[show_bg file="bg.jpg"]とした場合は、mp.fileの中にはbg.jpgが入っています。 これが独自のマクロで[original type="true" file="dokuji.jpg"]とした場合は、mp.fileの他にmp.typeが存在して、値を操作できます。
以上のことを踏まえて、マクロの中でmpを使って条件分岐をすれば属性の値によって挙動を制御することが可能です。
%以外に属性値を指定する方法
マクロの中で[image storage="%file" page="back" layer="base"]という風に%を指定する方法以外にも、属性値に変数を指定する方法があります。 %ではなく、&を頭に付けると、変数を属性値に指定することが可能です。
[image storage="%file" page="back" layer="base"] これが↓のようになります。 [image storage="&mp.file" page="back" layer="base"]
&を頭に付けるであれば、システム変数、ゲーム変数、一時変数でも使えます。 ↓のような形です。 [image storage="&tf.file_name" page="back" layer="base"]
このように、&を頭に付ける方法を使えば、マクロの中でなくても、シナリオファイルにタグを記述するときに、変数の値をタグに使うことができます。 sf.flag=trueになったら、f.imageにファイルを指定する、というような書き方をすれば、動的に画像表示を切り替えることが可能です もしくは、繰り返しシナリオをループさせて、その回数で表示する画像を変更するということもできます。 例えば↓のような形です。
// 変数を初期化 [eval exp="f.counter=0"] //繰り返し通るシナリオ *loop [eval exp="f.counter+=1"] // カウンターの値を表示 カウンター[emb exp="f.counter"][c] // f.counterが6以上ならbbb画像を表示 [if exp="f.counter < 5"] [eval exp="f.image='aaa'"] [else] [eval exp="f.image='bbb'"] [endif] [image storage="&f.image+'.jpg'" page="fore" layer="base"] //ループに戻る [jump target="*loop"]