コンテンツにスキップ

関数・プリプロセッサ

特殊な関数

@EVENTLOAD

データをロードした直後に呼び出されます。
イベント関数なので複数定義することができます。
@EVENTLOADが定義されていない場合、@SHOW_SHOPへ移行します(eramakerと同じ動作)

@TITLE_LOADGAME

標準のタイトル画面でロードを選択した場合に呼び出されます。
@TITLE_LOADGAMEを定義することでタイトルでも独自のロード画面を使用することができます。
定義されていない場合、標準のロード画面が使用されます。
@SYSTEM_TITLEを定義した場合、明示的にCALLしない限り@TITLE_LOADGAMEが呼ばれることはありません。

@SYSTEM_AUTOSAVE

オートセーブが行われるタイミングで呼び出されます。
オートセーブの内容を独自に定めることができます。
定義されていない場合、標準のセーブ機能が使用されます。

@SYSTEM_TITLE

csvのロードが終了したタイミングで呼び出されます。
また、BEGIN TITLEによっても呼び出されます。
@SYSTEM_TITLEを定義することで独自のタイトル画面を使用することができます。
定義されていない場合、標準のタイトル画面が使用されます。

@CALLTRAINEND

CALLTRAINによる自動実行が終了後、システム内部から自動的に呼び出される関数です。
イベント関数ではないため多重定義できないことに注意してください。

自作関数における引数指定

書式

関数側

@(関数名),(引数1),{(引数2)....}
   引数は数値ならARG(:0,1,2...)、文字列ならARGS(:0,1,2...)
   関数中で#DIM、#DIMSを用いて定義したプライベート変数も引数に指定可能

呼び出し側

CALL (関数名),(引数1),{(引数2)....}

数値は数式または文字列式が使用できます。
文字列リテラル(定数)を引数にするときは""でくくってください。
書式付の文字列リテラルを引数にするときは@"~~"で書いてください。
CALL以外にJUMP、CALLFORM、TRYCALLなどでも同じ書式が使えます。
関数側の引数はいくつでも指定できます。
ver1.808現在、関数側と呼び出し側で型が異なる場合、数値から文字列、文字列から数値に関わらず変換せずエラーになります。
ver1.807以前と同様に文字列型の引数に数値を与えて呼び出したい場合、コンフィグ設定を変更するか、TOSTR関数を用いてください。
引数は省略できます。省略した場合、数値型の場合は0、文字列型の場合は空文字列が代入されます(初期値を設定していない場合)。
呼び出された関数側ではARGARGSで渡された値を参照できます
基本的に値渡しなのでARGの中身を変更しても渡した元の変数等の値は変化しないことに注意してください。
ARGARGS、または関数中で#DIM#DIMSを用いて定義したプライベート変数以外の変数(ASTR)を引数にすることも可能ですが、いくつか制限があります。
ver1.808現在、これらの変数を用いた場合は初期値を設定できず、また引数を省略できません。

;定義  
@FOOBAR, ARG:0, ARGS:0  
    ~~  
@HOGEHOGE, ARG:0, ARG:1, ARG:2  
    ~~  
;呼び出し  
;変数で指定  
    CALL FOOBAR, X , STR:0  
;定数で指定  
    CALL FOOBAR, 123 , "あいう"  
;書式付文字列で指定  
    CALL FOOBAR, 123 , @"[{COUNT}] あいう"  
;式で指定  
    CALL FOOBAR, X + 10, "あいう" * 10  
;引数の省略-全部  
    CALL FOOBAR  
;引数の省略-第1引数  
    CALL FOOBAR, , "あいう"  
;引数の省略-第2引数  
    CALL FOOBAR, 123

<エラーになる例>

;エラー(引数が多すぎる)  
    CALL FOOBAR, X , STR:0, Y  
;エラー(引数の型が違う-数値型の第1引数に文字列を代入しようとしている)  
    CALL FOOBAR, "あいう", "かきく"  
;エラー(引数の型が違う-文字列型の第2引数に数値を代入しようとしている)  
    CALL FOOBAR, 123 , 456

<動作はするが推奨されない例>

;代入先はARG、ARGSでなくても可能ですが、通常はARGを使うことを推奨します  
@FOOBAR, X, Y  
;代入先を可変にすることも可能ですが可読性が下がります。  
@FOOBAR, ARG:X, ARG:Y  
;可読性が下がります。  
@FOOBAR, ARG:0, ARG:(ARG:0)

引数の初期値

関数の引数に初期値を設定することができます。
初期値を設定する場合、関数側は以下のようになります。

@(関数名),(引数1 = 初期値1),{(引数2 = 初期値2)....}  
引数は数値ならARG(:0,1,2...)、文字列ならARGS(:0,1,2...)、  
または関数中で#DIM、#DIMSを用いて定義したプライベート変数  
それ以外を指定した場合初期値は設定できません。

指定可能な初期値は定数および定文字列のみで、変数は指定できません。
また文字列の初期値は""でくくってください。
初期値を設定し、呼び出し側が引数を省略した場合、初期値に設定した値が代入されます。
省略せずに関数を呼び出した場合は、通常通りARGARGSに渡された値が代入されます。

;初期値設定(部分省略もできます)  
@FUNCTION, ARGS:0 = "かきく", ARG:0 = 111, ARG:1, ARG:2 = 200  
    ~~

;エラー(初期値は定数および定文字列のみ)  
@FOOBAR, ARG:0 = MASTER, ARG:1 = TARGET  
;ARG、ARGS,関数中で#DIM,#DIMSを用いて定義したプライベート変数以外の引数に初期値を設定しても無視されます。  
;そのため想定通りの動作ができません。  
@FOOBAR, X = 5, Y = 4

引数の参照渡し

ver1.810から、参照型変数を仮引数にすることで引数の参照渡しができるようになりました。
参照型変数の定義方法は参照型変数の項を確認してください。

@SYSTEM_TITLE  
A = 0  
CALL TEST(A)  
B = 1  
CALL TEST(B)  
PRINTFORML A == {A}  
PRINTFORML B == {B}  
WAIT

@TEST(HOGE)  
#DIM REF HOGE  
HOGE = 100  
RETURN

<実行結果>

A == 100  
B == 100

上の例で関数@TESTは仮引数に参照型変数を持ちます。
1回目に@TESTが呼ばれたとき、HOGEは実引数Aを参照するようになります。
関数@TEST中でHOGE = 100とすることで参照先の変数A100が代入されるので1回目のPRINTFORMLの結果は100になります。
同様に2回目の@TESTが呼ばれると変数B100が代入され、2回目のPRINTFORMLの結果も100になります。

属性

関数の仕様や動作を決定するプリプロセッサです。
関数に#から始まるプリプロセッサを記述する場合、関数の直下にしなくてはなりません。

#ONLY

イベント関数専用の属性です。
#ONLYが指定されたイベント関数がある場合、その1つのみが実行され、他の同名イベント関数を実行されません。
また#ONLYが指定された同名イベント関数が複数ある場合も実行されるのは「最初の1つ」のみとなります。

#FUNCTION

式中関数の属性です。
式中関数は通常のRETURNで終了することはできず、代わりにRETURNF <数式>で終了する必要があります。
詳しくはユーザー定義の式中関数を参照してください。

#FUNCTIONS

式中関数の属性です。
式中関数は通常のRETURNで終了することはできず、代わりにRETURNF <文字列式>で終了する必要があります。
詳しくはユーザー定義の式中関数を参照してください。

定義

変数の名前やその仕様を定義するプリプロセッサです。
関数に#から始まるプリプロセッサを記述する場合、関数の直下にしなくてはなりません。

#LOCALSIZE <定数式>,#LOCALSSIZE <定数式>

関数ごとに個別にLOCALおよびLOCALSの要素数を指定するためのプリプロセッサです。
定数式の結果は0より大きい整数である必要があり、それ以外もしくは変数を含んだ式や解釈できない文字列が与えられた場合は無視されます。
無視された場合またはこのプリプロセッサを使用しなかった場合は通常通りVariableSize.csvの設定値を使用します。
イベント関数にこのプリプロセッサを使用した場合、一番最初に実行されるものの設定が使用されます(ver1800現在)。

#DIM

ユーザー定義変数宣言です。ERB中の特定の関数内で使用することで、その関数内でのみ使用可能な数値型変数を定義できます。
詳しくはユーザー定義の変数を参照してください。
また、ERH中で使用することで、すべての関数で値を共有できる数値型変数を定義できます。
詳しくはヘッダーファイル(ERH)を参照してください。

#DIMS

ユーザー定義変数宣言です。ERB中の特定の関数内で使用することで、その関数内でのみ使用可能な文字列型変数を定義できます。
詳しくはユーザー定義の変数を参照してください。 また、ERH中で使用することで、すべての関数で値を共有できる文字列型変数を定義できます。
詳しくはヘッダーファイル(ERH)を参照してください。

#DEFINE

DEFINEマクロの宣言です。ERH中で使用することで、全ERBコード中の文字列をあらかじめ定義した別の文字列へ置換することができます。
詳しくはヘッダーファイル(ERH)を参照してください。

特殊なブロックを表す行

これらはプリプロセッサ行です。
これらを記述した同一行において、その直後に続けて命令や関数やコメントなどを記述してはいけません。
これらはeramakerでは解釈できないためコーディングするときに場合によっては;!;を使う必要があります。

[SKIPSTART][SKIPEND]

[SKIPSTART]から[SKIPEND]までの間に書いた行はEmueraでは読み込まれず実行されません。
これはEmueraとeramakerで挙動を意図的に変えたいときに使われるものです。
Emueraでは実行してほしくない文を記述する際に使ってください。
また、;!;と併用することで、Emuera以外では実行してほしくない文を記述することができます。
詳しくはEmueraで追加された記法の項目を参照してください。

[IF XXX][ELSEIF XXX][ELSE][ENDIF]

ある名称XXXのマクロが定義されているかどうかによって複数の行を実行するかどうか、分岐することができます。
詳しくはヘッダーファイル(ERH)を参照してください。

[IF_DEBUG][ENDIF]

[IF_DEBUG]から[ENDIF]までの間に書いた行はデバッグモード時のみ実行されます。
非デバッグモード時はコメント行と見なされ実行されません。
ただし、DEBUG系命令は元々非デバッグモード時には無視されるので、;#;を行頭に付ける必要はありません。
同様にデバッグ変数も非デバッグモード時には空文字列又は0のため、エラーの心配はありません。
デバッグモードについてはこちらを参照してください。

[IF_NDEBUG][ENDIF]

[IF_NDEBUG]から[ENDIF]までの間に書いた行は非デバッグモード時のみ実行されます。
デバッグモード時はコメント行と見なされ実行されません。
[IF_DEBUG]とは判定が逆になっています。
デバッグモードについてはこちらを参照してください。