後編
4)分岐と反復
○条件式
分岐や反復の前に、それらの実行される基準となる条件式についてです。
条件式は変数と変数、変数と数値の大小などを比較し、
それが正しいかどうかを判定します。
その比較に使われるのが比較演算子で、==,!=,<,>,<=,>=などがあります。
==は等しい、!=は等しくない、不等号はそれぞれそのままの意味です。
例えば、A = 0,B = 1,C = 0のとき
A == B は不成立(正しくない)、A == C は成立(正しい)、
A > B は不成立、B > C は成立、
B <= A は不成立、A >= C は成立します。
また、比較演算子を使った条件式の代わりに0かそれ以外の数字を書くことでも
成立と不成立を表すことができます。
この場合、0が不成立、それ以外が成立です。
複数の条件式を使う場合は、条件式と条件式の間に&&や||を記述します。
例えば、変数Aが0かつ変数Bが1という条件の場合は
A == 0 && B == 1となります。
変数Aが0または変数Bが0という条件ならA == 0 || B == 0となります。
もっと複雑に、変数Aが0で変数Bが1、または変数Aが0で変数Cが1なら
(A == 0 && B == 1) || (A == 0 && C == 1) もしくは
A == 0 && (B == 1 || C == 1) となります。
・キャラの能力や素質を判定する
よく使われる条件式の中に、キャラの能力や素質を判断するものがあります。
例えば、調教中のキャラが処女の時、TALENT:TARGET:0 == 1が成立します。
素質は持っている状態が1、持っていない状態が0となるため、
条件式に単にTALENT:TARGET:0と書いた場合、調教中のキャラが処女である
という条件と同じ意味になります。
調教中のキャラの従順がLv3以上の時は、ABL:TARGET:0 >= 3が成立します。
能力や刻印はLvがそのまま数値となります。
体力や経験などレベルで表されない能力は、値がそのまま使用されます。
調教中のキャラのV経験が10以上であるという条件を表すなら、
EXP:TARGET:0 >= 10となります。
・ランダム
RAND:(数値もしくは数値変数)と記述することで、一定の範囲の中から
ランダムで数値を決定することができます。
例えば、A = RAND:10と記述した場合、変数Aは0から9(10 - 1)までの
いずれかの整数になります。また、
A = 5
B = RAND:A
の場合、変数Bは0から4(A - 1 = 5 - 1)までのいずれかの整数になります。
○分岐
○○が××した時□□を表示する、のような処理を行うのが分岐です。
分岐に使われる構文にはIFとSIFがあります。
・IF-ELSEIF-ELSE-ENDIF
もし○○ならば、という処理に最もよく使われる構文です。
IF A == 0
PRINTFORML 変数Aは0です。
ELSEIF B == 0
PRINTFORML 変数Aは0でなく、変数Bは0です。
ELSE
PRINTFORML 変数Aは0でなく、変数Bも0ではありません。
ENDIF
上がIF-ELSEIF-ELSE-ENDIF構文の基本的な形です。上の構文は
もし変数Aが0ならば(IF A == 0)『変数Aは0です。』と表示します。
変数Aが0でなく変数Bが0ならば(ELSEIF B == 0)
『変数Aは0でなく、変数Bは0です。』と表示します。
いずれの条件にも当てはまらないならば(ELSE)
『変数Aは0でなく、変数Bも0ではありません。』と表示します。
このように一つのIF-ENDIF間では上から順に条件式を判定していき、
条件の成立した部分の直後の処理のみを行います。
上の例文では処理の部分が1行ずつしかありませんが、実際には
次のELSEIF,ELSE,ENDIFまでの処理が全て行われます。
IF 条件式1
処理1
処理2
処理3
ELSEIF 条件式2
処理4
処理5
ELSE
処理6
ENDIF
(条件式1が成立の時は処理1~3、条件式1が不成立で条件式2が成立の時は
処理4と5、どちらも不成立の時は処理6のみが行われる)
判定したい条件が1つの場合は、ELSEIF以下の部分はなくても構いません。
IF A == 0
PRINTFORML 変数Aは0です。
ELSE
PRINTFORML 変数Aは0ではありません。
ENDIF
条件を満たさない時何もしない場合、ELSE以下の部分はなくても構いません。
IF A == 0
PRINTFORML 変数Aは0です。
ELSEIF B == 0
PRINTFORML 変数Aは0でなく、変数Bは0です。
ENDIF
IFとENDIFは絶対に必要です。
ENDIFの書き忘れはエラーの原因になりますので注意しましょう。
・SIF
上のIF-ELSEIF-ELSE-ENDIFを簡略化したのがSIFになります。
SIF A == 0
PRINTFORML 変数Aは0です。
SIFにはENDIFが必要ない、ELSEIFやELSEが使用できない、
直後の1行しか実行できない、などの特徴があります。例えば
SIF 条件式
処理1
処理2
と記述すると、条件式の正否に関わらず処理2は実行されてしまうので
注意しましょう。
2つ以上の処理を行う時は上のIF-ELSEIF-ELSE-ENDIFを使いましょう。
・IFとSIFの組み合わせ
IF 条件式1
SIF 条件式2
処理1
処理2
処理3
ENDIF
と記述すると、条件式1のみが成立する時は処理2と3を
条件式2も成立する時は処理1から3を実行させることができます。
SIF 条件式1
IF 条件式2
処理1
処理2
ENDIF
逆にこう記述すると、条件式1が成立しない時にエラーが発生します。
SIFの直後の行にIFやSIFなどの特殊な処理を行う文は書かないようにしましょう。
○反復
同じような処理を複数回繰り返すときに使うのが反復です。
反復はREPEAT-REND間の処理を繰り返し実行します。
REPEAT 10
PRINTFORML あ
REND
と記述すると、『あ』が10行分表示されます。
繰り返す回数はREPEAT(半角スペース)の直後にある数値か数値変数回です。
・COUNT
変数COUNTは、現在までに何回繰り返しを行ったかを格納しています。
REPEAT-REND内の処理を最初に行う時はまだ一度も繰り返していないので
REPEAT 10
PRINTFORML 現在{COUNT}回目です。
REND
こう記述した場合、表示されるのは0回目から9回目となります。
COUNTがとる値は0からREPEATの直後の数値-1までと覚えておきましょう。
また、COUNTに数値を代入するのはエラーの原因となるので注意しましょう。
・REPEATとIF,SIFの組み合わせ
REPEAT-RENDの間にもIFやSIFを使用することができます。
REPEAT 10
IF COUNT == 5
PRINTFORML 6回目です?
ELSE
PRINTFORML {COUNT}回目です
ENDIF
REND
と記述すると、COUNTが5、つまり6回目のみ最後に?が表示されます。
また、REPEAT-RENDの間にもう一つREPEAT-RENDを使用することは
可能ですが、COUNTの値が二つ目のREPEAT-RENDで操作されてしまうため
そのままでは正常に動作しません。
使用したい場合は二つ目のREPEAT-RENDの前後にCOUNTの値を
退避・返還する処理を行うなどの工夫が必要となります。
・CONTINUEとBREAK
REPEAT-REND間で、以降の処理を行わずに次の繰り返しに入る場合には
CONTINUEを、以降の処理を行わず、さらに繰り返し自体を終了させる
場合にはBREAKを使用します。
REPEAT 10
A = COUNT
IF A == 5
CONTINUE
ENDIF
PRINTFORM {A}:
REND
これを実行した場合、実際に表示されるのは
0:1:2:3:4:6:7:8:9:
となります。また、
REPEAT 10
A = COUNT
IF A == 5
BREAK
ENDIF
PRINTFORM {A}:
REND
これを実行した場合、実際に表示されるのは
0:1:2:3:4:
までになります。
5)関数と関数呼び出し
ここからは主に機能パッチやバリアントを作成する際に使う範囲となります。
○関数とは
いくつかの決まった処理を行わせたい時、それを予め別の場所に記述しておいて
任意の場所から使えるようにしたものを関数と言います。
例として、変数Aを10倍にして返す関数を作ってみましょう。
@A_TEN_TIMES
A = A * 10
@の後に半角英数と_で関数の名前を付けることができます。
それ以降の処理が関数で行う内容となります。
A = 0
CALL A_TEN_TIMES
PRINTFORML 変数Aは{A}です。
A = 5
CALL A_TEN_TIMES
PRINTFORML 変数Aは{A}です。
作った関数を利用する(呼び出す)にはCALL (関数名)と記述します。
この結果、上は『変数Aは0です。』下は『変数Aは50です。』と表示されます。
また、関数を呼び出すのにJUMP (関数名)を使うこともあります。
CALLとJUMPの違いは関数での処理を実行した後、元の場所に戻るか
どうかで、CALLは戻る、JUMPは戻らないようになっています。
ある条件を満たした時、関数を途中で終わらせたいという場合は
RETURN (数値もしくは数値変数)を利用します。
@TEST
SIF A == 0
RETURN 0
A = A * 5
この場合、関数TESTを呼び出した時Aが0なら何も行われず、そうでなければ
Aが5倍されて返ってきます。
また、RETURNで元の場所に戻ってくるとRESULTを書き変えます。
@TEST2
IF A == 0
RETURN 0
ELSEIF A == 1
RETURN 1
ELSEIF A == 2
RETURN 2
ELSE
RETURN 9
ENDIF
という関数を作り、別の場所から呼び出すと
A = 0
CALL TEST2
PRINTFORML {RESULT}
A = 2
CALL TEST2
PRINTFORML {RESULT}
A = 3
CALL TEST2
PRINTFORML {RESULT}
上から順に0,2,9が表示されます。
6)ラベルとキー入力
主に選択肢による分岐で使用されるのがラベルとキー入力です。
PRINTFORML 選択してください
PRINTFORML [0]選択肢1
PRINTFORML [1]選択肢2
$INPUT_LOOP
INPUT
IF RESULT != 0 && RESULT != 1
GOTO INPUT_LOOP
ELSEIF RESULT == 0
処理1
ELSEIF RESULT == 1
処理2
ENDIF
INPUTはキー入力待ちをし、入力された数値をRESULTに格納します。
この場合、0を入力すれば処理1、1を入力すれば処理2を実行します。
0でも1でもない数値を入力した場合、RESULT != 0 && RESULT != 1が
成立するためGOTO INPUT_LOOPが実行されます。
GOTO (ラベル名)は$(ラベル名)の処理に移動するもので、CALLやJUMPと@との
関係に似ていますが、GOTOと$に関しては同じ関数内にある必要があります。
GOTO INPUT_LOOPで$INPUT_LOOPに移動すると再びINPUTを実行するため、
この一連の処理は0か1かを入力するまで繰り返されることになります。
また、一つの関数内で複数の$とGOTOの組み合わせを使用すると『IFに対応しない
ELSEIF,ELSE,ENDIFが~』というエラーが発生することがあります。
この場合、2つ目の入力処理を別の関数に移すなどの工夫をしましょう。
7)その他注意点など
○キャラの追加と削除
キャラの追加と削除には、ADDCHARAとDELCHARAを使用します。
ADDCHARA 1
ADDCHARA 5
ADDCHARA 9
ADDCHARAではCSVにあるキャラ番号が参照されます。
DELCHARA 3
DELCHARA 1
DELCHARAではキャラ番号ではなく、キャラの登録番号が参照されます。
ここまでの処理でキャラ番号1、5、9のキャラが追加され、
次に登録番号3番、つまりキャラ番号9のキャラが削除、
その後登録番号1番、つまりキャラ番号1番のキャラが削除され、
キャラ番号5番のキャラのみが残る状態になります。
DELCHARAを続けて使用する際には、削除された登録番号より後のキャラは
それぞれ前に詰められることに注意しましょう。
また、キャラの追加・削除をする場合は調教中のキャラ、助手などの状態を
確認しましょう。例えば助手をやっていたキャラがDELCHARAで削除されても
助手の登録番号を保存しているASSIは変化しません。しかし全体の登録番号は
前にずれてしまうため、助手になる条件を満たしていないキャラが助手に
なってしまうこともあります。
○計算・表示
BAR(BARL)を使用することで数値の表示を視覚的に行うことができます。
BAR (数値or変数),(数値or変数),(グラフの長さ)のように記述し
A = 80
B = 100
BAR A,B,10
では
[********..]
と表示されます。
Aに現在の値、Bにその最大値を入れることで、現在の値が最大値の
どのくらいの割合かを示す際によく使用されます。
BARLでは表示後に改行されることも覚えておきましょう。
era basicでは変数などは全て整数で処理されますが、例外として
TIMESを使用することで小数の計算を行うことができます。
A = 1000
TIMES A,1.5
これで変数Aは1000×1.5の1500となります。
○その他の命令
WAIT…入力待ちのみを行います。RESULTに値は格納されません。
QUIT…eramakerを終了させます。主にゲームオーバー時などに使用します。
最終更新:2008年12月28日 19:11