AIRNovel テクニック wiki (非公式) menu_button

分岐・ループサンプル

作成日:2017.06.20、最終更新日:

分岐

初回起動時のみ変数初期化

const.an.isFirstBootという初回起動時のみtrueになる変数がありますので、それを利用して判断します。

[jump label=**after cond="! const.an.isFirstBoot"]
&sys:test = true
;など初期化するシステム変数
**

const.an.isFirstBootは開発者向け情報では「ゲームがインストールされてから、初めての起動か」となっていますが、起動時にセーブファイルがあるかどうかが判断基準となっています。
ですので、一旦アンインストールして、再インストールしてもfalseですし、初回起動で無くてもセーブファイルを削除した直後であればtrueとなります。

好感度によって呼び方を変更

最初は「名字くん」だったのが「名前くん」になり、「愛称」になる場合、さすがに毎回条件分岐を書くのは面倒です。
マクロにしてしまったり、変数に呼び方を入れてしまう方法があります。

マクロにする場合

;マクロ
[macro name="call_me"]
	[ch text="名字くん" cond="save:love < 50"]
	[ch text="名前くん" cond="save:love >= 50 && save:love < 75"]
	[ch text="愛称" cond="save:love >= 75"]
[endmacro]

;使用時
おはよう、[call_me][r]
今日も早いね。[p][er]

変数に入れる場合

;好感度変化時
&save:love = save:love + 5
[call label=*check_call_me]

;call
*check_call_me
[let name="save:call_me" text="名字くん" cond="save:love < 50"]
[let name="save:call_me" text="名前くん" cond="save:love >= 50 && save:love < 75"]
[let name="save:call_me" text="愛称" cond="save:love >= 75"]
[return]

;使用時
おはよう、	&save:call_me&	[r]
今日も早いね。[p][er]

条件を満たした場合に選択支出現

事前に変数操作を行って、条件判定ができるようにしておく必要があります。
相手への好感度が高ければ告白するための選択肢を出す、鍵を持っていれば開けるための選択肢を出すなど。

選択肢やボタンに条件設定してあげればOKです。
選択肢の場合、3つのタグ全てに条件を設定しなければなりませんので、マクロにしてしまう方がおすすめです。

;マクロ
[macro name=select]
	[link *]
	[ch *]
	[endlink *]
	[r * cond="mp:r"]	;改行までマクロに入れる場合
[endmacro]

;鍵を持っている(save:have_keyがtrue)の場合の見開く選択肢
[select label=*check text="調べる" r=true]
[select label=*open text="開ける" cond="save:have_key"]

条件で選択肢なしに勝手に分岐

好感度が高くなれば告白イベント発生とか、エンディングをそれまでにどれだけの条件を満たしているかで分岐させるとか、そういうのです。
[jump]に条件をつけるのが良くある方法だと思います。
上から順に難しい条件にした方が、分岐を考えやすいかと思います。より難しい条件を満たしていれば、勝手に[jump]してしまっているので、その後の判定はより難しい条件を満たしているかを考えなくて済みますので。

;save:a、save:bが両方trueならベスト、片方だけならノーマル、そうでなければバッドエンドの場合例
[jump label=*best cond="save:a && save:b"]
[jump label=*normal cond="save:a || save:b"]
[jump label=*bad]

ループ

連想配列の初期化

全くのバラバラな初期値を入れるには1個ずつ初期化を行うしか無いのですが、全て同じ場合や、一定の規則がある場合には、繰り返し処理で対応できます。
test.1〜test.10に1〜10を入れる場合。

& i = 1
**
[let name="&'test.'+i" text=i]
&i = i + 1
[jump label=**before cond="i <= 10"]

値が入っている変数を探す

test.1〜test.10に1〜10のどれかがランダムで重複せず入っている場合に、5が入っている変数を探すような場合です。

& i = 1
**
[jump label=**after cond="test[i] == 5"]
& i = i + 1
[jump label=**before]
**

3行目で5の場合にループから抜け出します。
必ず見つかるわけでは無い場合、無限ループを防ぐために5行目に最大回数を仕込む必要があります。

ボタンを並べて配置

サイズが同じボタンの場合、ループと変数や計算を上手く利用することで、簡単にきれいに並べることができます。
次の画像のように並べる場合の例です。

ボタン画像

button.0〜button.5には事前にボタンに使用する画像のファイル名を入れておきます。

&i = 0
**
[button pic="&button[i]" left="&(w + sh) * (i % 3) + l" top="&(h + sv) * (i ¥ 3) + t"]
&i = i + 1
[jump label=**before cond="i <= 5"]

分岐とループの複合化

押せるボタンと押せないボタンを並べる

行き先選択をボタンで行いたい。現在、行き先に制限はあるけれど、今はいけないけれど、後にいけるようになることをあらわすためにも押せないボタンを表示したいという場合などに。

ボタン画像ファイル名記憶用の連想配列(button.0〜button.5など)、押せないようのボタン画像の名前は通常ボタン名に何かをつけた形にする(そうでなければこちらも変数で記憶)、有効無効の判定記憶用連想配列の準備(canselect.0〜canselect.5など)という準備が必要です。

&i = 0
**
[if exp="canselect[i]"]
	[button pic="&button[i]" left="&(w + sh) * (i % 3) + l" top="&(h + sv) * (i ¥ 3) + t"]
[else]
	[button pic="&button[i] + '_dont'" enabled=false left="&(w + sh) * (i % 3) + l" top="&(h + sv) * (i ¥ 3) + t"]
[endif]
&i = i + 1
[jump label=**before cond="i <= 5"]

 
up_button