ブロック〜制御単位
概要
sketch/ExHIBITにおけるブロックは、ひとつ以上のシナリオコマンドが集まって出来たコマンドの集まりで、 単に「ブロック」と呼ばれるものと「サブルーチン」と呼ばれるものの2種類があります。
これらはどちらもラベルの働きをしますが、使用する目的が異なるので、コマンドもCMD_BLOCKと、CMD_FUNCに分かれています。

ブロックは次の属性を持つことが出来ます。
  明示的ブロックID TP属性 セーブコメント
ブロック 指定がない場合は直前のブロック番号+1 指定可 指定可
ブロック(TP属性付き) 指定がない場合は直前のブロック番号+1 -- 指定不可
サブルーチン 必須 指定不可 指定不可

シナリオ(RSD)先頭の何もブロックが指定されていない領域のブロックIDは0です。
明示的にブロックIDが指定されているブロックのIDは、指定されたものになります。
ブロックIDが指定されていないブロックのIDは、その直前にあるブロックのID+1です。
TP属性(テンポラリ属性)を持ったブロックは、ジャンプの飛び先になるときはそのブロックに指定されているIDが参照されますが、システムが保持しているブロックIDには影響を与えないためセーブロードのエントリーにはなりません。つまり、単なるラベルと考えて構いません。

以後、単に「ブロック」と呼ぶ場合、サブルーチンを含まない狭義の意味で使用しているものとします。
ブロック
ブロックとは、ブロックコマンドによって区切られシナリオの単位で、セーブロードはこのブロック単位で行われています。
挿入は、制御構造 - ラベル - BLOCKブロックの作成で行います。
分岐関連のコマンドはすべて、このブロックに付けられたブロックIDを利用して対象を識別します。 明示的に番号が指定されていないブロックは、その直前にある、テンポラリ属性(TP属性)を持たないブロック+1の値を持っています。
具体例
……ここのblockIDは、0です。
RSD先頭でブロックがないブロックのIDは0になります。
このブロックでセーブされると、他のシナリオから移動してきた場合の処理が行われるため、RSD先頭でセーブが可能になる前には、必ずブロックを作成しておいたほうが良いでしょう。

……ここのblockIDは、1000です。

……ここのblockIDは、1001です。
番号無しブロックのIDは、その時点のblockID+1となります。

……ここのblockIDは、1002です。

……ここのblockIDは、1002です。
TP属性はブロックIDを設定しません。 従って、ここでセーブされると、ブロックEから開始されます。

……ここのblockIDは、1003ですが、下記注釈を参照して下さい。

TP付きブロックの直後にあるTPなしブロックに、blockIDが明示的に指定されていない場合、sketchは警告を出します。 上記の例で「ブロックD」のIDは、直感的には2001に見えますが、実際は1003です。構造が複雑な場合、これが大変原因を見つけにくい問題を発生させることがあるため、sketchでは、テンポラリブロックの次に置かれるテンポラリ属性をもたないブロックには、明示的なID指定を強要する設計になっています。
ブロック:セーブロードとの関係
ブロックは、セーブロードが行われる基本的な単位です。
行単位ロードが行われる場合も、直前のブロックから状態を復帰しています。
特に意識しなくても、ブロックで自動的に保存される情報は、次の通りです。
  • イベント画面に表示したイベントCGとその属性
  • キャラ登場系コマンドで登場させた立ちキャラとその属性
  • 音楽・環境音・ループ効果音・環境音声の再生状態とその属性

また、保存されないものは、次の通りです。
  • ビルボードの状態
  • 非同期演出の実行状態

つまり音関係と立ちキャラ関係、それにイベント画面関係はなにもしなくても正常に復帰しますが、ビルボードや非同期演出は明示的に復帰させなければなりません。 逆に言えば、ビルボードが表示されておらず、非同期演出が実行されていない場所にブロックを挿入すれば、何もしなくても正常に復帰するということです。
最も簡単なのは、シナリオ(RSD)の先頭にだけブロックを作成し、以降そのRSD内にはブロックを作らなければ、常に正常に復帰します。 ただし、ロード時に先頭から解析を行うことになりますので、長いシナリオの終わりの方でセーブされた場合、復帰に時間がかかるようになります。 可能なら、適当にブロックを挿入した方がよいでしょう。
サブルーチン
サブルーチンは、あらゆる言語に存在しているサブルーチンと同じです。
条件付き呼び出しと、条件付きリターンが用意されています。
sketch/ExHIBITでは「明示的なブロックID指定が必要な、CMD_RETURNで閉じる特殊なブロック」と見なされます。
挿入は、制御構造 - サブルーチン - FUNC サブルーチン作成で行います。
サブルーチンブロックの最後には必ず、制御構造 - サブルーチン - RETURN サブルーチン終了でリターン文を配置して下さい。 これによって、呼び出し元に戻ります。
呼び出しは、制御構造 - サブルーチン - CALL サブルーチン呼出で行います。

ブロック番号999999のサブルーチンは、ロード復帰用エントリーとして予約されています。
これは、非同期演出がブロックをまたいだり、ビルボードがブロックをまたいで存在したりする場合、それらの復帰を行うチャンスを与えるためのサブルーチンで、 ロード時にシステムから自動的に呼び出されます。
このサブルーチン内では、通常レジスタの3番(R3)がこれから復帰しようとしているブロックIDを持っています。
つまり、ブロックID 1000番のブロックを復帰させようとしている場合、R3が1000になっています。 この値を見て、必要な復帰を行うわけです。