■分岐/ループ
条件分岐の使用方法:
IF (条件式) {
// 条件が真の場合に実行される処理
}
ELSEIF (条件式) {
// 条件が真ではない場合で、別の条件が真の場合に実行される処理
}
ELSE {
// 上記の条件が全て偽の場合に実行されるデフォルト処理
}
≪使用例≫
IF (F[000] == 0) {
// もし F[000] が 0 ならば、ここを実行
…
}
ELSEIF (F[000] <= 100) {
// 上記IF文ではない場合で、F[000] が 100 以下ならば、ここを実行
…
}
ELSEIF (F[000] <= 1000) {
// 上記IF/ELSEIF文ではない場合で、F[000] が 1000 以下ならば、ここを実行
…
}
ELSE {
// 上記のどれにも当てはまらない場合、ここを実行
…
}
スイッチ分岐の使用方法:
SWITCH (値) {
CASE (値):
// 値に一致する場合に実行される処理
...
CASE (値):
// 値に一致する場合に実行される処理
...
CASE (値):
// 値に一致する場合に実行される処理
...
DEFAULT:
// 上記のいずれのCASEにも一致しない場合のデフォルト処理
...
}
≪使用例≫
SWITCH (F[000]) {
CASE (0):
// F[000]が0と一致する場合に実行
...
CASE (1):
// F[000]が1と一致する場合に実行
...
CASE (2):
// F[000]が2と一致する場合に実行
...
DEFAULT:
// 上記のいずれのCASEにも一致しない場合のデフォルト処理
...
}
※DEFAULTは必ずしも必要ではありませんが、全てのCASEに一致しない場合でDEFAULTが無い場合は、SWITCH文の中を通らず下に抜けます。
ループの使用方法:
FOR (代入式, 条件式, 算術式) {
// ループ内の処理
...
}
無限ループの使用方法:
FOR () {
// 無限ループ内の処理
...
}
ループを抜ける方法:
BREAK // ループを抜ける
≪使用例(100回ループ)≫
FOR (F[000]=0; F[000]<100; F[000]+=1) {
// ループ内の処理
...
}
F[000] を 0 に初期化した後、F[000] をループするたびに 1 ずつ加算していきます。
F[000] が 100 になった時、ループを抜けます。
F[000] が 0 から 99 の間ループし続けるので、全部で100回ループします。
≪使用例(無限ループ)≫
FOR () {
// 無限ループ内の処理
...
}
≪使用例(途中で抜ける)≫
FOR (F[000]=0; F[000]<100; F[000]+=1) {
// ループ内の処理
...
IF (F[001] == 1) {
BREAK // 処理中に F[001] が 1 になったらループを抜ける
}
}
≪BREAK 補足≫
ループ中で BREAK するとループを抜けますが、1つだけループが抜けられます。
2重ループの場合は2回 BREAK を使用する必要があります。
FOR (F[000]=0; F[000]<100; F[000]+=1) {
FOR (F[001]=0; F[001]<100; F[001]+=1) {
IF (F[002] == 1) {
BREAK // 処理中に F[002] が 1 になったらループを抜ける
}
}
IF (F[002] == 1) {
BREAK // 処理中に F[002] が 1 になったらループを抜ける
}
}
3重や4重のループは煩雑になるため、そういった場合はGOTO文を使用して抜けることがあります。
FOR (F[000]=0; F[000]<100; F[000]+=1) {
FOR (F[001]=0; F[001]<100; F[001]+=1) {
FOR (F[002]=0; F[002]<100; F[002]+=1) {
FOR (F[003]=0; F[003]<100; F[003]+=1) {
IF (F[004] == 1) {
GOTO *LOOPOUT // 処理中に F[004] が 1 になったら *LOOPOUT にジャンプする
}
}
}
}
}
*LOOPOUT
■ジャンプ/コール
ラベルとジャンプの使い方:
*LAVEL // ラベル
GOTO *lavel // ラベルジャンプ
GOSUB *lavel // ラベルコール(FARCALL命令のコールスタック参照)
RETURN // ラベルコールリターン(ラベルコールした場所に戻ります)
≪ラベルの使い方≫
無限ループの例です。
*START
// ラベルの処理
...
GOTO *START // ラベル *START にジャンプしてループを繰り返す
※無限ループの場合、FOR文でも同様のことができます。
FOR () {
// ループ内の処理
...
}
■シーンジャンプ/シーンコール
シーンジャンプとコールの使い方:
JUMP(SeenNo) // シーンジャンプ(Z00)
JUMP(SeenNo, ZLavelNo) // シーンジャンプ(Zラベル指定)
FARCALL(SeenNo) // シーンコール(Z00)
FARCALL(SeenNo, ZLavelNo) // シーンコール(Zラベル指定)
FARRETURN // シーンコールリターン(シーンコールした場所に戻ります)
≪コールスタック≫
GOSUB系およびFARCALL命令は、ラベルもしくは別のシーンにジャンプします。
この時、システムはRETURNやFARRETURNで元の場所に戻る情報を自動的に記憶します。
これを「コールスタック」と呼びます。
コールスタックは最大で64個までしか記憶できません。
(※通常のスクリプトなら、3つも使えば十分に組めると思います。)
コールスタックはRETURNやFARRETURNすると、1つ元に戻ります。
また、64個以上コールした場合、システム的にエラーとなり、RETURNやFARRETURNできなくなります。
(※2005/04/21 最大256個から最大64個に減少しました。)
≪Zラベルについて≫
Zラベルは通常のラベルとしても使用できます。
Zラベルは、#Z00 - #Z99 の特殊なスクリプト記号を指します。
通常はシーンジャンプ/コールの第2パラメータとして使用しますが、通常のラベルとしても利用可能です。
≪シーンジャンプ/コール≫
JUMP(0010, 05) // シーン10のZラベル5にシーンジャンプする。
FARCALL(0010, 05) // シーン10のZラベル5にシーンコールする。
≪通常のラベルとして使用≫
GOTO #Z05 // Zラベル5にジャンプ
ONGOSUB(F[000]) {#Z01, #Z02, #Z03} // 条件によって、Zラベル1から3にジャンプ
※コンパイルエラー時には「**SYSEXLV0000??」と出力されるので注意してください。
■コール/シーンコール(引数パラメータ付&返り値付)
*
返り値付きのラベルコール(GOSUBP命令):
Res = GOSUBP(Par0, Par1, Par2, …最大56個) *lavel
返り値付きラベルコールリターン(RETURNP命令):
RETURNP(Res)
省略可能ですが、その場合は0が帰ります。(通常のRETURNと同じ扱い)
シーンコール(FARCALL命令)の引数に返り値を含める場合:
Res = FARCALLP(SeenNo, ZLavelNo, Par0, Par1, Par2, …最大56個)
返り値付きシーンコールリターン(FARRETURNP命令):
FARRETURNP(Res)
省略可能ですが、その場合は0が帰ります。(通常のFARRETURNと同じ扱い)
≪説明≫
基本的な説明は、GOSUB / RETURN / FARCALL / FARRETURN を参照してください。
■リターン時の引数の受け渡し命令(RETURN_L_FLAG_SET / RETURN_K_FLAG_SET)
と組み合わせることで、より高度な引数の受け渡しが可能です。
≪引数パラメータについて Par0, Par1, Par2, …≫
引数は最大56個まで指定でき、省略可能です。
引数は自動的にコールフラグに代入され、コール先に引き継がれます。
参照する際は、L[???] もしくは K[???] と通常のフラグと同様に扱ってください。
ただし、L変数は最大40個、K変数は最大16個しか存在しません。
≪引数パラメータの制限事項≫
変数の引数パラメータは最大で40個までしか指定できません。
文字列の引数パラメータは最大で16個までしか指定できません。
それ以上指定した場合、コンパイルエラーになります。
文字数は最大で、全角30文字、半角なら60文字までです。
文字数オーバーはコンパイルエラーにはなりませんが、実行中に文字数オーバーの警告が出ます。
コールの際、K変数に引き継がれます。
≪引数パラメータに変数と文字列が混在する場合≫
引数パラメータには変数と文字列の両方を指定できますが、
(文字列A、文字列B、文字列C、変数A、変数B、変数C、…)のように指定した場合でも、
「変数A」は L[000] に引き継がれます。
指定した順番のフラグ番号に格納されるのではなく、各フラグごとに番号を詰めて引き継ぎます。
例.(変数A、文字列A、文字列B、変数B、変数C、文字列C、…)
L[000] = 変数A
L[001] = 変数B
L[002] = 変数C
K[000] = 文字列A
K[001] = 文字列B
K[002] = 文字列C
≪返り値について≫
Res = GOSUBP と Res = FARCALLP はどちらも返り値(Res)を持っていますが、
返り値を受け取るには、RETURNP(Res) または FARRETURNP(Res) でコールから戻る必要があります。
通常の RETURN または FARRETURN でも問題ありませんが、返り値は必ず0が返ります。
返り値は必ずしも受け取る必要はないため、Res = の部分は指定がなくても問題ありません。
≪FARCALLPの2つ目のパラメータについて Zラベル番号≫
通常の FARCALL の場合、省略した場合はZラベル0番を指定したことになりますが、
FARCALLP の場合、Zラベル番号は省略できません。
指定しないと、引数パラメータのつもりの引数がZ番号として扱われますので、ご注意ください。
≪コールフラグについて≫
このフラグは40個しかありませんが、コール(GOSUB / FARCALL)するたびにシステムが自動的に記憶します。
リターン(RETURN / FARRETURN)すると、コール前の状態に復元され、コール先で自由に使用できます。
また、コールの際に「引数」として渡すことも可能です。(GOSUBP / FARCALLP 参照)
L[00]~L[39]の40個しかありませんが、コールのたびに40個確保されるので、フラグ中最強の使い勝手があります。
関連命令は、GOSUBP / FARCALLP / RETURNP / FARRETURNP があります。
ビット分解もできるため、Lb[] L2b[] L4b[] L8b[] といった使い方も可能です。
≪変数(値: -2147483647 ~ 2147483647)≫
L[0000] - L[0039] ※40個しかありません!
≪文字列フラグ≫
16個しかありません。
各フラグが記憶できる文字数も最大で、全角30文字、半角なら60文字までです。
コールでの取り扱いは上記のL変数と同様です。
K[0000] - K[0015] ※16個しかありません!
■リターン時の引数の受け渡し
*
RETURN_L_FLAG_SET(FlagNo, Nom): リターン時のL変数を設定
RETURN_K_FLAG_SET(FlagNo, Str): リターン時のK変数を設定
RETURN_L_FLAG_SETS((FlagNo, Nom), (FlagNo, Nom), …): 複数設定バージョン
RETURN_K_FLAG_SETS((FlagNo, Str), (FlagNo, Nom), …): 複数設定バージョン
≪説明≫
RETURN / FARRETURN / RETURNP / FARRETURNP で戻った際のコールフラグを設定する命令です。
コールフラグの詳細については、マニュアルの◆コールフラグをご参照ください。
または、GOSUBP / FARCALLP 命令の説明を確認してください。
≪注意点≫
「コールから戻った際のコールフラグを設定する」というのは、
「1つ前のコールフラグを設定する」と言い換えることができます。
1度もコール(GOSUB / FARCALL)していない場合は、自然に1つ前のコールフラグは存在しませんので、
この命令は無視されます。(無意味なため処理されません。)
■コールスタックの制御
*
INIT_CALLSTACK: コールスタックを初期化(クリア)
ADD_CALLSTACK: コールスタックを追加(1つ) ※追加したスタックはダミーです
ADD_CALLSTACK(Count): コールスタックを追加(Count 数追加) ※追加したスタックはダミーです
DEL_CALLSTACK: コールスタックを削減(1つ)
DEL_CALLSTACK(Count): コールスタックを削減(Count 数削減)
Res = GET_CALLSTACK: コールスタックを取得
SET_CALLSTACK(Count): コールスタックを設定(※現在のスタック値より大きな値は設定できません)
■特殊な制御命令
*
GOTOIF(条件式) *lavel: ラベルジャンプ(条件成立時にジャンプする)
GOTOUNIF(条件式) *lavel: ラベルジャンプ(条件否成立時にジャンプする)
GOSUBIF(条件式) *lavel: ラベルコール(条件成立時にコールする)
GOSUBUNIF(条件式) *lavel: ラベルコール(条件否成立時にコールする)
ONGOTO(値){*lavel, *lavel, ・・・}: ラベルジャンプ(簡易分岐)
ONGOSUB(値){*lavel, *lavel, ・・・}: ラベルコール(簡易分岐)
≪使用例≫
ONGOSUB(F[000]){*CASE00, *CASE01, *CASE02}
*CASE00: F[000] == 0
…
GOTO *CASEEND
*CASE01: F[000] == 1
…
GOTO *CASEEND
*CASE02: F[000] == 2
…
GOTO *CASEEND
*CASEEND
ONGOTOSWITCH(値){(値)*lavel, (値)*lavel, ・・・, ()*lavel}: ラベルジャンプ(スイッチ分岐)
ONGOSUBSWITCH(値){(値)*lavel, (値)*lavel, ・・・, ()*lavel}: ラベルコール(スイッチ分岐)
≪使用例≫
ONGOTOSWITCH(F[000]){(0)*CASE00, (10)*CASE00, (100)*CASE00, ()*CASEDEFAULT}
*CASE00: F[000] == 0
…
GOTO *CASEEND
*CASE01: F[000] == 10
…
GOTO *CASEEND
*CASE02: F[000] == 100
…
GOTO *CASEEND
*CASEDEFAULT: F[000] == (※ 0, 10, 100 以外はココにジャンプします。)
…
GOTO *CASEEND
*CASEEND
※最後の ()*LABEL は必須です。無いとコンパイルエラーになります。
※簡易命令の SWITCH の方が使い勝手が良いです。
●フラグ操作
■フラグの一括操作
*
FLAGSET(F[StartIndex], Num1, Num2, Num3, ...): フラグセット(インデックスを1づつ進める)
≪例/詳細≫
FLAGSET(F[000], 111, 222, 333):
F[000] = 111
F[000 + 1] = 222
F[000 + 1 + 1] = 333
↓
F[000] = 111
F[001] = 222
F[002] = 333
FLAGSET_INDEX(F[StartIndex], Index, Num1, Num2, Num3, ...): フラグセット(インデックスを指定値づつ進める)
≪例/詳細≫
FLAGSET_INDEX(F[000], 10, 111, 222, 333):
F[000] = 111
F[000 + 10] = 222
F[000 + 10 + 10] = 333
↓
F[000] = 111
F[010] = 222
F[020] = 333