06. フラグと分岐
選択肢の結果を記録し、後のシーンやエンディングを変えるための変数と条件分岐を扱います。入門で使うのは主に setvar / addvar / if / #if です。
6.1 変数の基本(setvar / addvar)
シナリオ内の数値を、名前付きの変数に保存します。
setvar affection 0
addvar affection 2
addvar affection -1
| 命令 | 意味 |
|---|---|
setvar 名前 値 | 変数を指定値に設定 |
addvar 名前 値 | 変数に加算(減算は負の数) |
random 名前 最小 最大 | 乱数を変数に入れる(例: random dice 1 6) |
- 変数に入るのは整数だけです。
- まだ値を入れていない変数は 0 として扱われます。
- 変数はセーブデータごとに保存されます。別のファイルへ
jumpしても、値はそのまま引き継がれます。 - タイトルの「はじめから」(
System.loadScenario)は、変数を空にしてから始めます。
キャプチャ差し替え
images/06_setvar_if.png
選択肢と変数の章(feature_demo *b_select)の実行画面
images/06_setvar_if.png6.2 条件でジャンプ(if)
条件が成立したときだけ、指定ラベルへ飛びます。
setvar demo_count 8
if demo_count >= 5 *high_route
この行は demo_count が 5 より小さいときだけ表示されます。
jump *done
*high_route
条件成立! high_route に来ました。
*done
書式: if 変数 演算子 値 *ラベル名(ラベルの * は付けても付けなくても動きます)
| 演算子 | 例 |
|---|---|
== != < <= > >= | if affection >= 8 *happy_end |
行き先をランダムに選ぶときは randomjump *route_a *route_b と書きます。
6.3 条件ブロック(#if / #endif)
複数行をまとめて条件表示したいときは、ブロックの形を使います。
setvar route 1
#if "route == 1"
route が 1 のときだけ、この行が表示されます。
#endif
#if "route == 2"
このブロックは route が 2 のときだけ実行されます。
#endif
#else / #elif と、ブロックの入れ子も使えます。
setvar route 2
#if "route == 1"
ルートA
#elif "route == 2"
ルートB
#else
その他
#endif
- 条件は
"変数 演算子 値"の形です。変数・演算子・値の間は空白で区切ります。 - 値の位置には、別の変数の名前も書けます(例:
"score >= border")。 - 実演:
feature_demo.txtの*b_branch(開発環境には、分岐の動作確認用のscenario\_selftest_branch.txtもあります)。
キャプチャ差し替え
images/06_if_block.png
images/06_if_block.png6.4 選択肢と変数を組み合わせる
03章の choice と変数を繋げると、ルート分岐の基本が作れます。
*talk_start
setvar affection 0
msgshow
name "ヒロイン"
今日はどうしますか?
choice "一緒に散歩" *walk "別れる" *part
*walk
addvar affection 2
jump *after_choice
*part
jump *after_choice
*after_choice
if affection >= 2 *good_talk
jump *normal_talk
*good_talk
name "ヒロイン"
うれしいな、また来てね。
jump *ending
*normal_talk
name "ヒロイン"
またね。
jump *ending
*ending
end
キャプチャ差し替え
images/06_choice_route.png
images/06_choice_route.png6.5 CG ギャラリー用フラグ(cg_flag)
イベント CG を見た記録を残すときに使います(ギャラリー画面と連携)。
evcg_show "smile" 600
cg_flag cg01 0
- 書式は
cg_flag CG の ID 差分番号です。差分番号の0がベースの絵です。 - CG の ID(例:
cg01)は、プロジェクトのギャラリー設定と合わせてください。
キャプチャ差し替え(任意)
images/06_cg_flag.png
images/06_cg_flag.png6.6 変数とフラグの使い分け
setvar の変数はセーブデータごとに残ります。どのセーブでも共通に残したい記録には、永続フラグを使います。クリア・システム・フローチャートのフラグは systemdata.dat に残ります。
| 仕組み | 残る場所 | 用途 | シナリオでの書き方 |
|---|---|---|---|
| 変数 | セーブデータごと | 好感度・その場の分岐 | setvar route 1 / if route >= 5 *label |
| クリアフラグ | 全体に永続 | クリア状況 | setclearflag game_cleared 1 |
| システムフラグ | 全体に永続 | 解放・周回数など | setsysflag demo_visited 1 / addsysflag play_count 1 |
| フローチャートフラグ | 全体に永続 | 到達した場面(フローチャートの表示) | setflowflag chapter_basic 1 / addflowflag route_a 1 |
| CG フラグ | 全体に永続 | CG の閲覧記録 | cg_flag cg01 0(本章 6.5) |
- タイトル画面は
game_clearedのクリアフラグを見て、クリア後の並びに変わります(紹介デモが立てるのはdemo_clearedです)。 - システムスクリプトからは
System.getClearFlag("game_cleared")/System.getSystemFlag/System.checkSystemFlag/System.getFlowchartFlagで読みます。 - 実演:
feature_demo.txtの*a_flag2。
目安: まずは
setvar / if で十分です。どのセーブでも共通に残したいもの(クリア・解放・到達)だけ、setclearflag などの永続フラグを使います。フラグの仕様の詳細は 公式マニュアル 第6章(フラグ仕様)、および 第9章 システム API を参照してください。
6.7 デバッグのコツ
feature_demoの*b_select/*b_branch/*a_flag2で動作を確認する- Debug 実行モードなら、
lumina_debug.logに[変数]の行が出ます。ifのときの実際の値も出ます - Debug 実行モードの Windows では、Shift+F3 のフラグインスペクタで値を確かめられます(道具の一覧は Shift+D)
- 変数の値が想定と違うときは、
setvarのタイミングとifの演算子を再確認する - ラベル名の打ち間違い(
jump *endingと*endingの不一致)に注意する