eratohoまとめ避難所

ERB構文講座

最終更新:

eratoho-sub

- view
だれでも歓迎! 編集

ERB構文講座

  • eramaerで使われているERB構文についての解説ページ。
特別編(ビット演算についてはこちら)



1)基本

構文以前の部分です。『不明な~』などのエラーが出る時はこの部分が怪しいかも。

○構文の記述は半角で行う
 日本語の文章以外の部分は全て半角で入力しましょう。
 見落としやすいのは全角スペースが主です。テキストエディタの検索機能で
 全角スペースを検索すれば簡単に見つけられるはず。

○各ファイルの最後の行には必ず1行以上の空行を入れる
 eramakerの仕様上の問題で、ファイルの最後に空行がない場合
 その直前の行が認識されなくなってしまいます。
 『ENDIF~』というエラーのよくある原因の1つです。

○コメント部分の行頭には;(半角セミコロン)をつける
 構文の行頭に;をつけることによってその行をコメント化することができます。
 コメント部分とは書かれている処理が実行されない部分のことで
 一時的にその処理を無効にしたり、付近の処理についての
 メモ書き代わりに使われることがあります。
 なお、コメント部分では全角文字を使っても構いません。

○分岐や反復にはインデントを行う
 これは直接エラーには繋がりませんが、後述する分岐や反復を使う際には
 インデントを使用しましょう。インデントとは行頭に決まった量の空白を
 置くことによって記述の位置をずらし、ここからここまでが
 一塊の処理です、というのをわかりやすくします。
 インデントの空白にはTABキーを使用します。
 インデントに処理上の効果はありませんが、デバッグで自分が見直す時や
 他の人に見てもらう時などに役立ちます。
 必要ないだろうと思っても一応はつけておきましょう。



2)変数

計算などの処理で使われる変数についてです。

○変数とは?
 変数とは計算結果を保存したり、ある数値とある数値を比較したりする際に
 使用する入れ物のようなものです。
 文章による説明だけではわかりづらいので一例を。

A = 0
B = 0
C = 0

 A = 0とは、変数Aに0を代入する、ということを表しています。
 上のA,B,Cがそれぞれ変数です。現在はいずれも0が中に入っています。

B = A + 1
C = A + 2

 B = A + 1とは、変数BにA+1の結果を代入する、ということを表しています。
 ここで計算が行われ、BとCの中身が書き換えられました。Aは0なので
 Bは0+1で1、Cは0+2で2となります。Aは0のまま変化していません。

A = C
A = B

 次にAにC、つまり2が代入されました。これでAが2になります。
 しかし、次の行でAにB、つまり1が代入されたため、Aは1となります。
 このように、同じ変数に複数回代入が行われると結果は上書きされます。

C = C + 2
A = B + C

 次に、CにC+2が代入されます。
 計算前のCは2だったので、計算後のCは2+2で4です。
 そしてAにB+C、つまり1+4が代入されます。
 ここまでの処理の結果、Aは5、Bは1、Cは4となりました。

○変数の種類
 変数には大きく分けて2種類のものがあります。
 上のA,B,Cのように数字を格納する数値変数と
 文字を格納する文字列変数です。
 数値変数は計算や条件判断に、文字列変数は主に文章の表示に使われます。
 また、変数には配列という概念があります。配列を使うことで変数に複数の値を
 格納することができるようになります。
 例えばAという変数の配列は、A:0,A:1,A:2,A:3,…という風に
 (変数名):(配列番号)で表現します。(:は半角のコロンを使用します)

A:0 = 0
A:1 = 1
A:2 = 2
A:3 = 0

A:3 = A:0 + A:1 + A:2

 この式はA:3にA:0+A:1+A:2の結果、つまり0+1+2を代入することを表します。
 処理の結果、A:3は3になります。

 一部の変数には、二重配列という形式のものもあります。二重配列は
 A:0:0,A:0:1,…,A:1:0,A:1:1,…のように記述し、更に多くの値を格納できます。

 どの変数がどの配列形式かは本家の変数リストのページに載っています。

○変数の使い方
 基本的には本家の変数リストのページに書いてある通りです。
 ここでは扱いに注意が必要なものを主に取り上げます。

・A-Z
 本家では記述されていませんが、配列として使用できます。

・FLAG/TFLAG/CFLAG
 FLAG・TFLAGはゲームシステムに関する部分に使われるため
 特定のキャラのみに使用するフラグを管理する際にはCFLAGを使用しましょう。
 また、非常に被りやすいので使用の際はフラグ一覧表を良く確認しましょう。
 フラグ一覧表はこのWikiの追加機能のページにあります。
 なお、仕様では0~999までの1000個の数字を使えるとなっていますが、実際にはeramakerのバグにより0~998までの999個しか使えません。
 999を使うとセーブデータが破壊されてしまいますので絶対に使用しないでください。

・TEQUIP
 上のフラグ系と同様に被りやすいので使用の際はフラグ一覧表を確認しましょう。

・二重配列について
 二重配列形式の変数は、主にキャラに関するデータに使われています。
 そのため、二重配列変数の読み方は以下のようになっていることがほとんどです。
 (能力の種類):(キャラの登録番号):(能力の番号)

例1)TALENT:5:20
 これは登録番号5のキャラの20番の素質を表します。
 ここで気をつけないといけないことは、キャラの登録番号とキャラ番号の違いです。
 eratohoならキャラ番号5はチルノとなっていますが
 登録番号5は常にチルノを指すとは限りません。
 登録番号はSHOPでキャラを購入するなどして調教可能になった際に
 割り振られる番号で、キャラリストの並び順を表しています。
 例えば最初に霊夢を購入し、次にチルノを購入した場合
 チルノの登録番号は2となり、その状態で霊夢を売却するとリスト全体が
 1つ手前にずれ、チルノの登録番号は1となります。

例2)TALENT:100
 見た感じこれは二重配列ではないように見えますね。
 しかし、これはTALENT:TARGET:100の省略されたもので、現在調教中もしくは
 調教予定のキャラの100番の素質を表しています。
 TARGETは現在調教中もしくは調教予定のキャラの登録番号を示す変数です。
 TARGETは指定されることが多いためか省略可能となっています。

 ちなみに、例1でTALENT:5:20というのを説明しましたが
 eramakerの仕様上の問題で実際にこう記述しても登録番号5の
 キャラの20番の素質を表すことはできません。
 その原因がこのTARGETの省略で、TALENT:5まで読み込んだ時点で
 TALENT:TARGET:5の省略されたものと判断されてしまい
 エラーの原因になってしまうようです。
 実際に登録番号5のキャラの20番の素質を表したい場合は

A = 5
TALENT:A:20

 というように、一旦変数に登録番号を格納するなどの工夫が必要となります。



3)演算

数値処理には欠かせない計算の方法です。

○基本的な四則演算
 四則演算を行うための基本的な演算子
A + B AとBの和をとる。
A - B AとBの差をとる。
A * B AとBの積をとる。
A / B AとBの商をとる。
A % B AをBで割ったときの余りをとる。

○自身に対する四則演算
 A = A + Bの様な形式は次のように省略できる。
A += B A = A + Bと同じ。
A -= B A = A - Bと同じ。
A *= B A = A * Bと同じ。
A /= B A = A / Bと同じ。
A %= B A = A % Bと同じ。

○論理演算子
 ビット処理のために使う特殊な演算子です。
A | B AとBをOR演算したものを返す。
A & B AとBをAND演算したものを返す



4)表示

主に口上で使用する、画面に文字などを表示させるPRINT系の構文です。

○PRINT系命令の種類
 PRINT系の命令には主に以下のものがあります。

PRINT 通常の文字列を表示します。変数等は使用できません。
PRINTV 数値変数を表示します。
PRINTS 文字列変数を表示します。
PRINTFORM 通常の文字列に数値・文字列変数を複合して表示します。

 あまり使われませんが、以下のようなものもあります。
PRINTFORMS 文字列変数を表示します。
PUTFORM PRINTFORMと同様ですが、セーブデータ専用です。

各命令の後にLやWをつけると、改行や入力待ち(Enterキーを押すまで進まない)を
させることができます。例えば、

PRINT あ
PRINT い
PRINTL う
PRINTW え
PRINTL お

と記述すると、まず

あいう

と表示され、入力待ち状態になります。
ここでEnterキーを入力すると残りも表示され

あいう


と表示されます。

○PRINT系命令の使い方
 上の項にある通り、PRINT系の命令にはそれぞれの用途がありますが
 実際にはPRINTFORMでほとんどのものを代用することができます。
 普通の文章を表示させるなら

PRINTFORM あいうえお

 のようにそのまま記述します。この時、PRINTFORMと表示させる文章の間に
 半角スペースを入れておくのを忘れないようにしましょう。
 数値変数を組み合わせて表示させるなら

A = 5
PRINTFORM 変数Aは{A}です

 のように変数名を半角の{}で括って記述します。
 文字列変数なら

STR:0 = かきくけこ
PRINTFORM あいうえお%STR:0%さしすせそ

 のように変数名を%%で括って記述します。

 セーブデータに表示させるPUTFORMのみPRINTFORMでは代用できませんが
 セーブデータの表示を変更する機会は少ないと思われるので割愛します。

○その他の表示
 文字を表示した後改行させるにはPRINTFORMLを使いますが
 文字を表示させずに改行させたい、つまり空白行を表示させたいという
 場合にもPRINTFORMLを使います。

PRINTFORML あいう
PRINTFORML
PRINTFORML えお

 2行目はPRINTFORMLの後に半角スペースのみを入力しており、これによって

あいう

えお


 のように空白行を表示させることができます。

 また、DRAWLINEを使用することで

 -------------------------------------------------------------------------------

 このように長い横線を表示させることができます。



5)分岐と反復


○条件式
 分岐や反復の前に、それらの実行される基準となる条件式についてです。
 条件式は変数と変数、変数と数値の大小などを比較し、
 それが正しいかどうかを判定します。
 その比較に使われるのが比較演算子で、==,!=,<,>,<=,>=などがあります。
 ==は等しい、!=は等しくない、不等号はそれぞれそのままの意味です。
 例えば、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:

 までになります。


6)関数と関数呼び出し

ここからは主に機能パッチやバリアントを作成する際に使う範囲となります。

○関数とは
 いくつかの決まった処理を行わせたい時、それを予め別の場所に記述しておいて
 任意の場所から使えるようにしたものを関数と言います。
 例として、変数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が表示されます。


7)ラベルとキー入力

主に選択肢による分岐で使用されるのがラベルとキー入力です。

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つ目の入力処理を別の関数に移すなどの工夫をしましょう。

8)その他注意点など

○キャラの追加と削除
 キャラの追加と削除には、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を終了させます。主にゲームオーバー時などに使用します。


タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

記事メニュー
目安箱バナー