MessageBoxの活用(後編)「深さ2階層のオプション画面を作ってみる」
前編に続き、後編ではより高度なオプション画面の作成について解説します。MODで各機能のON/OFFを切り替えられるオプション画面などに使えると思います。
重要なことは、今どのページを表示しているのか、今どの処理をしているのかをそれぞれ変数で管理することです。ちなみにやり方は他にも無数にあるので、「今回の例ではこうやる」ということをご了承下さい。
ページ構成
現在表示しているページを「page」という変数で表すとして、最初に表示するトップページ(目次ページ)を「-1」、そこから辿る各ページを「0,1,2,3...」とします。

プレイヤーが「page0へ」の選択肢を選べば「page」変数に「0」を入れて「0」に該当する「MessageBox」を表示、「トップへ戻る」を選択すると「page」変数に「-1」を入れてトップページを表示します。
スクリプトの構成
処理するブロックを「state」という変数で分けることにします。
If (state == 0) ;初期化処理後、state1へ ElseIf (state == 1) ;pageに該当するMessageBoxを表示してstate2へ ;pageが-1ならトップページ(目次)を表示、0以上ならそのページ内容を表示 ElseIf (state == 2) ;トップページの場合は、選択したページをpageに入れてstate1へ ;トップページ以外の場合は、各オプションでの実際の処理 EndIf
「state == 0」では初期化の処理をします。開始時では変数の値には当然「0」が入っているので、ここが一番最初に実行されることになります。今回の例では都合上、最初の1回だけ実行が必要なものを置いておく場所として使います。
「state == 1」では「page」に入っている値に応じて適切な「MessageBox」を表示します。「state == 1」は一度実行されたらプレイヤーが選択肢を選んで「MessegeBox」が消えるまでは再実行されません。「MessageBox」を同時に2つ以上表示させないためです。
「state == 2」では「page」と「選んだ選択肢」に応じて処理をします。トップページだった場合はどれかのページを選んだということなので、「page」に値を入れて「state == 1」へ戻ってそのMessageBoxを表示、トップページ以外だった場合は該当の処理を実行します。
ScriptName OptionScript short state ;現在処理しているブロックの管理用 short page ;現在どのページにいるのか short button ;プレイヤーが選んだ選択肢の保管用 Begin GameMode ;初期化処理 If (state == 0) set state to 1 set page to -1 ;pageに該当するメッセージ表示 ElseIf (state == 1) set state to 2 ;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ;現在のページに該当するMessageBoxを表示 If (page == -1) MessageBox "トップページ(page == -1)" "page0へ" "page1へ" "page2へ" "終了" ElseIf (page == 0) MessageBox "ページ0(page == 0)" "トップページへ戻る" "オプション切り替え" ElseIf (page == 1) MessageBox "ページ1(page == 1)" "トップページへ戻る" "オプション切り替え" ElseIf (page == 2) MessageBox "ページ2(page == 2)" "トップページへ戻る" "オプション切り替え" EndIf ;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ;メッセージ表示後の処理 ElseIf (state == 2) set button to GetButtonPressed If (button == -1) ;入力待ちならReturnでこのフレームの処理を終了 Return EndIf set state to 1 ;プレイヤーが選択肢を選んだためMessageBoxが消えているので再表示させる If (page != -1) && (button == 0) ;トップページ以外でbutton0(トップページへ戻る)を選択したなら set page to -1 ;トップページへ戻る Return EndIf ;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ;トップページだった場合は、選択したページをpageに入れてstate1へ戻る If (page == -1) set page to button If (button == 3) ;もしも「終了」を選んだなら終了処理 set state to 0 ;他に「StopQuest」や専用フラグOFFなどが必要 Return EndIf ;トップページ以外の場合は、各オプションでの実際の処理 ElseIf (page == 0) ;ページ0の「オプション切り替え」で行う処理 ElseIf (page == 1) ;ページ1の「オプション切り替え」で行う処理 ElseIf (page == 2) ;ページ2の「オプション切り替え」で行う処理 EndIf ;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ EndIf End
パッと見てすぐに理解できるものではないので少しずつ理解する必要がありますが、やっていることはそこまで複雑怪奇ではありません。じっくり処理を辿れば必ず理解できるはずです。
ちなみにこのオプションスクリプトの構成は「HTSCLight」のものを参考にしています。作者様ありがとうございました。
おまけ: オプションはクエストスクリプトを使うのがオススメ
このオプションスクリプトの始め方は「OnEquip」でアイテムを使ってでも、「OnActivate」で何かを調べてでも可能ですが、一番のオススメは「StartQuest」でオプションスクリプト専用のクエストを開始して行うことです。どれも大差はないですけど。
まずクエストの実行間隔を0.001など限り無く小さくして毎フレーム実行されるようにして、例えば魔法を使った時のスクリプトでクエストを「StartQuest」して開始、そして「終了」を選んだら「StopQuest」でクエストを終了させます。クエストが走っている間だけオプションが実行されるというわけです。
もしも「OnEquip」などでやる場合は専用フラグを1つ用意して、「GameMode」ブロックの一番最初に専用フラグがOFFだった場合は即Returnでオプションの実行を回避、何かのアイテムを使ったらそこで専用フラグをONにしてオプションを実行させます。「終了」を選んだら再び専用フラグをOFFで。