bexecの挙動

http://sorejyadamedarou.sakura.ne.jp/nscripter/system_customize2.htm
これについて書いてあることの一部を、もっと噛み砕いて書いてみる。

bexec命令は、プレイヤーからの入力を待つための命令である。
実行すると、そこでスクリプトの処理が止まり、プレイヤーが何かの入力をするまでその状態になる。
ただし、いくつかの例外があって、プレイヤーの入力を待たずに次の行へ処理を渡す仕様になっている。
入力された内容、もしくは処理を終了させた理由は、bexec命令の引数に与えた変数に記録される。

引数の与え方

マニュアルでは、文字列変数でも数値変数でもよく、またどちらを与えてもいいようになっているが、実装的には、

  1. 文字列変数
  2. 数値変数

の順番で与えないと問題がある(そうだ)
なので、基本的に

bexec $0,%0

と、このように記述するのが一番問題がない。

プレイヤーからの入力以外の理由で入力待ちを終了する条件

その1:btime命令

bexec実行前、btime命令でミリ秒を与えておくと、bexec開始時からそのミリ秒が経過した時に自動的に入力待ちを終える。
この場合、文字列変数には"TIMEOUT"が与えられる。
無論、この経過時間前にプレイヤーからの入力があると、そちらが優先される。
また、btime命令の第二引数に1を指定すると、ボイス待ち状態になる。dwaveの0チャンネルを監視し、その演奏状態もチェックするようになる。主に、ボイスの再生終了待ちに使用される。

その2:オートモード

bexec実行時に、systemcall automodeなどでオートモードになっていると、0msでbexecを抜けてしまう。その場合、文字列変数には"AUTO"が与えられる。
従って、bexecをtextgosubなどを通じたクリック待ちに使用する場合は、オートモードに対する処理が必要になってくる。
具体的には、bexec中はオートモードをやめ、クリック待ち終了時に再度オートモードにするような仕組みだ。