開発者向け技術情報

基本的な仕様については本家サイトの「改変のための情報」を参照のこと。
以下では06/06/02版のeramakerの実装に基づいて解説する。

システムの制限

〜〜以上となっているものは調査した範囲では限界を見つけられなかったもの。
限界備考
整数変数の値-2147483648〜214748364732ビット符号付
文字列変数の文字数1024文字以上
関数名の文字数1024文字以上全角文字も使用可能
関数呼び出しスタック(*)1000超えた場合、動作が不安定になり強制終了することもある
キャラクタ登録数16384(16進数で4000)さらにADDCHARAすると応答がなくなる

 @EVENTCOM
 	CALL FUNC0001
 @FUNC0001
 	CALL FUNC0002
 @FUNC0002
 	……
これが続いて@FUNC1000あたりまで来ると不安定になる。

演算子

eramakerは代入演算子が必要な場合、記号列の先頭から順に演算子を捜し、最初に見つかった代入演算子を認識する。
非代入演算子が必要な場合、記号列の先頭1文字または2文字を調べ、非代入演算子である方を認識する。どちらも演算子として認識出来る場合、2文字の方が優先される。どちらも認識できない場合はエラー。
何を言っているのかわからないかもしれないが、下の2つが等価になることから推測してほしい。


 ;1-許容範囲な記法
 A <=+=* B <=+=* C
 SIF D <> 0
 	E &&== F &&== G
 ;2-標準的な記法
 A = B <= C
 SIF D < 0
 	E &= F && G
 ;NG-全ての行でエラー。
 A = B =+=* C
 SIF D =< 0
 	E = F !!== G

代入演算子として"=="が"="の代わりに使えるのはこの実装による。
逆に数式中で"=="の代わりに"="を使用するとエラーになるのもこの実装による。
また、"<>"が"!="ではなく"<"と認識されてしまうことに注意が必要。
単項演算子
単項演算子として"-"が使えるが、意図した通りに動作しない場合が多い。
特に二項算術演算子と比較演算子の左項に単項演算子付きの項があると単項演算子は無視されてしまうようである。
A = (-1) + 0 + 0
B = 0 + (-1) + 0
C = 0 + 0 + (-1)
D = 0 > -1
E = -1 < 0
PRINTFORML A={A}, B={B}, C={C}
PRINTFORML D={D}, E={E}
;出力
A=1, B=1, C=-1
D=1, E=0

また負の数や変数に対して単項演算子を用いるとエラーになる。
;エラー! eramaker曰く「計算式の中にマイナス符号の連続を見つけました。」
A = -(0-1)
;エラー! eramaker曰く「計算式展開時に不明な変数名が見つかりました。」
B = 1
C = -B

おそらく使わない方が無難。
2項演算子
以下の演算子が使用できる
分類優先度代入演算記号
算術演算子*, /, %
+, -
比較演算子×<, >, <=, >=
×==, !=
論理演算子&, |
×&&, ||
カッコがあればカッコの中が先に計算され、カッコがなければ優先度にしたがって順番に計算される。
代入演算子
代入命令で使用するための演算子。
"="のほか、上の表で代入演算に○をつけた演算子は"="と合わせて複合代入演算子として使える。
C言語のように数式の途中で代入演算子を使うことはできない。
また、代入演算子のない式で行を構成することもできない。

複号演算子は、例えば
<変数> += <数式>
<変数> = <変数> + ( <数式> )
とほぼ等価になる。

厳密には以下のような場合には等価ではない。
 RAND:100 += 1
 RAND:100 = RAND:100 + 1
上はRAND:100の値が1増えるが、下の式はRAND:100に1〜100までのランダムな値が代入される。
もっともRANDに代入した値を参照する方法が無いのでこの違いが何かに影響することは無い。

変数

全ての変数は何らかの形で配列変数である。

配列変数を呼び出す際に引数を省略することができる。
通常の配列変数なら":0"、キャラクタ変数なら1つ省略すると":TARGET"、2つ目は":TARGET:0"を省略したと見なされる。
一貫して引数を省略して使えば配列変数でないかのように用いることが出来る。A〜ZやCOUNTなどは通常はこのように使われる。
また、引数を数式にすることもできる。

例えば以下の2つの式はどちらも有効で同じ意味になる。
 A = ABL:TALENT
 A = ABL:TARGET:(TALENT:TARGET:0)

キャラクタ変数の第1引数を省略しない場合は少し特殊で、第1引数には変数しか指定できない。
NAMEやISASSIのような引数が1つしかない変数でも同様。
以下のように定数や数式を指定するとエラーになる。

 ;NG
 X = ABL:0:0
 X = ABL:(TARGET + 1):0
 NO:(MASTER + 1) = X
 PRINTFORMW %NAME:(COUNT + 1)%

しかし、エラーにならない場合もある。法則は不明。
 ;OK
 ABL:0:0 = X
 X = NO:(MASTER + 1)
 PRINTFORMW {NO:(MASTER + 1)}
数値配列型変数
eramakerの数値型変数が扱える値の範囲は32ビット符号付整数の範囲である。
すなわち、-2147483648〜2147483647の範囲であり、これを超えるとオーバーフローが発生する。

全ての数値型変数は実は配列変数である。
A:100やPBAND:200を使用することもできるし、セーブも行なわれている。

下の表で要素数がnのとき、変数に使える範囲は0〜(n-1)である。
例えばLOSEBASEは要素数が1000なのでLOSEBASE:999は使用できるがLOSEBASE:1000は使えない。
配列変数の最後の要素が0で無い場合、セーブ・ロード後にデータが破壊されるバグが確認されている。
実際に使える範囲は0〜(n-2)と考えるべきだろう。

初期値が書いていない変数はゲーム開始時に全て0が代入される。
多くのバリアントでは例えば@EVENTCOM中でTFLAG:0〜29を0にするなどの処理を行なっているが、ここではeramaker.exeが行なう初期化についてのみ書いてある。

表の中で公式の解説と異なる値には赤字にした。
変数名要素数変更セーブ初期値初期化されるタイミング
A〜Z1000
COUNT1000
RESULT1000
DAY1000
TIME1000
MONEY1000
MASTER1000
TARGET10001ゲーム開始
ASSI1000-1ゲーム開始
PLAYER1000
ASSIPLAY10000BEGIN TRAIN
SELECTCOM1000
PREVCOM1000-1BEGIN TRAIN
NEXTCOM1000-1BEGIN TRAIN
LOSEBASE1000全て0@SHOW_USERCOM終了時
UP1000全て0@SHOW_USERCOM終了時
UPCHECK時
DOWN1000全て0@SHOW_USERCOM終了時
UPCHECK時
PALAMLV10000
100
500
3000
10000
30000
60000
100000
150000
250000
ゲーム開始
EXPLV10000
1
4
20
50
200
ゲーム開始
EJAC100010000ゲーム開始
FLAG10000
TFLAG1000全て0BEGIN TRAIN
ITEM1000
ITEMSALES1000
BOUGHT1000
NOITEM1000ゲーム開始
PBAND10004ゲーム開始
CHARANUM1000※※※※
RAND1000※※※※
※GAMEBASE.CSVの"アイテムなし"の値で初期化される。0と1以外も指定できる。
※※CHARANUMはどんな要素を指定してもキャラの登録数が返ってくる。RANDはランダムな値が返ってくる。
他の変数と同じように代入できセーブもされるが代入した値を使用する方法が無いので意味は無い。
文字列配列型変数
RESULTSも配列変数である。
ABLNAME〜ITEMNAMEは実際には疑似配列でありどんな引数を指定してもエラーにはならないがPRINT_ABL命令などでエラーが起きる原因となる。
ここではPRINT_XXXでエラーが起きない範囲を要素数の限界とした。
変数名要素数変更セーブ初期値初期化されるタイミング
RESULTS100×
ABLNAME100××ABL.CSV
TALENTNAME1000××TALENT.CSV
EXPNAME100××EXP.CSV
MARKNAME100××MARK.CSV
PALAMNAME200××PALAM.CSV
ITEMNAME1000××ITEM.CSV
STR20000×STR.CSV
SAVESTR100
キャラクター変数
キャラクター変数はNO、ISASSI、NAME、CALLNAMEの4つを除き全て二重配列である。
二重配列は以下のような形で呼び出す。
A = ABL:MASTER:2
1つ目の引数を省略し、ABL:2と書くと、ABL:TARGET:2と解釈される。
2つ目の引数も省略し、ABLと書くと、ABL:TARGET:0と解釈される。
変数名要素数変更セーブ初期値初期化されるタイミング
NO数値
ISASSI数値
NAME文字列×
CALLNAME文字列×
BASE数値100
MAXBASE数値100
ABL数値100
TALENT数値1000
EXP数値100
MARK数値100
RELATION数値100
JUEL数値200
CFLAG数値1000
EQUIP数値100
TEQUIP数値100全て0BEGIN TRAIN
PALAM数値100全て0BEGIN TRAIN
STAIN数値1000
0
2
1
8
その他0
BEGIN TRAIN
EX数値100全て0BEGIN TRAIN
SOURCE数値100全て0@SHOW_USERCOM終了時
NOWEX数値100全て0@SHOW_USERCOM終了時
GOTJUEL数値200全て0BEGIN TRAIN

条件文の記述ミスによるフリーズ


条件文に、たとえば、
IF TALENT:86 &&
や、
IF A == 3 || A == 7 || A ==
などのように、不完全な記述があると、そこでeramakerがフリーズしてしまうので注意。


Menu

メニュー







他OSで動かす方法



リンク

どなたでも編集できます