このページについて

このページはeramakerまとめwikiの「開発者向け技術情報」の内容を転載したものが含まれています。
基本的な仕様については本家サイトの「改変のための情報」を参照のこと。
以下では06/06/02版のeramakerの実装に基づいて解説する。

<Emuera>あわせてEmuera1.22c に基づく情報も付記する、もちろん最新版Emueraはさらに変わっている可能性があるのでEmueraWikiなどを参照すること。</Emuera>

eramakerの仕様

システムの制限

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


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

※※
1000人あたりで動作があやしいとの報告もあり。
どのみちセーブ・ロードに時間がかかるようになるので現実的ではない。

<Emuera>
限界備考
整数変数の値-9223372036854775808〜922337203685477580764ビット符号付
文字列変数の文字数2147483647文字?
関数名の文字数2147483647文字?全角文字も使用可能
関数呼び出しスタック2147483647文字?超えた場合、動作が不安定になり強制終了することもある
キャラクタ登録数2147483647文字?
C#のListクラスやStringクラスの上限がEmueraの上限になると思われる。</Emuera>

演算子

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
代入演算子として"=="が"="の代わりに使えるのはこの実装による。
逆に数式中で"=="の代わりに"="を使用するとエラーになるのもこの実装による。
また、"<>"が"!="ではなく"<"と認識されてしまうことに注意が必要。

<Emuera>Emueraでは「1-許容範囲な記法」の書式は使えない。「2-標準的な記法」のようにきちんと書かないと認識されない。例外的に代入演算子として"=="を"="の代わりに使うことができる。</Emuera>
単項演算子
単項演算子として"-"が使えるが、意図した通りに動作しない場合が多い。
特に二項算術演算子と比較演算子の左項に単項演算子付きの項があると単項演算子は無視されてしまうようである。
 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

おそらく使わない方が無難。

<Emuera>この問題は修正されている。しかしeramakerと動作が異なることになるので両方に対応させたい場合はやっぱり使わない方が無難。</Emuera>
2項演算子
以下の演算子が使用できる
分類優先度代入演算記号
算術演算子*, /, %
+, -
比較演算子×<, >, <=, >=
×==, !=
論理演算子&, |
×&&, ||
カッコがあればカッコの中が先に計算され、カッコがなければ優先度にしたがって順番に計算される。

<Emuera>同じ。</Emuera>
代入演算子
代入命令で使用するための演算子。
"="のほか、上の表で代入演算に○をつけた演算子は"="と合わせて複合代入演算子として使える。
C言語のように数式の途中で代入演算子を使うことはできない。
また、代入演算子のない式で行を構成することもできない。

複号演算子は、例えば
 <変数> += <数式>

 <変数> = <変数> + ( <数式> )
とほぼ等価になる。

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

<Emuera>同じ。</Emuera>

変数

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

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

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

ただし、代入先(左辺)の配列変数に数式の引数を指定するとエラーになる。
;NG
 ABL:TARGET:(TALENT:TARGET:0) = A

キャラクタ変数の第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)}

<Emuera>省略に関しては同じ。ABL:0:0 や ABL:(TARGET + 1):0 のような表記もOKになっている。また、左辺の配列変数に数式の引数を指定してもエラーにならない。</Emuera>
数値配列型変数
eramakerの数値型変数が扱える値の範囲は32ビット符号付整数の範囲である。
すなわち、-2147483648〜2147483647の範囲であり、これを超えるとオーバーフローが発生する。

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

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

全ての変数には基本的にはゲーム開始時に配列の全てに0が代入される。
ゲーム開始時に0以外の値が代入されるもの、ゲーム中の特定のタイミングで初期化されるものについて初期値とそのタイミングを下に示す。
多くのバリアントでは例えば@EVENTCOM中でTFLAG:0〜29を0にするなどの処理を行なっているが、ここではeramaker.exeが行なう初期化についてのみ書いてある。
(初期値の欄の読み方について表の下に注を示した)

<Emuera>64ビット符号付整数の範囲、つまり -9223372036854775808〜9223372036854775807 の範囲で使用できる。この範囲を超えてオーバーフローが起きるとエラーで強制終了する。セーブロード時のバグは修正されている。</Emuera>

表の中で公式の解説と異なる値には赤字にした。
変数名要素数変更セーブ初期値初期化されるタイミング
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※※※※
初期値の欄について、−となっているのはゲーム中は初期化されない。
TFLAGのように全て0となっている場合は配列の全てに0が代入される。
PREVCOMのように単に数字が書いているものは:0のみが記されているタイミングで初期化される。:1以降は初期化されない。
PALAMLVのように複数の数字が書かれているものは:0、:1、:2、……に順に記載されている数値が代入されることを表している。
※GAMEBASE.CSVの"アイテムなし"の値で初期化される。0と1以外も指定できる。
※※CHARANUMはどんな要素を指定してもキャラの登録数が返ってくる。RANDはランダムな値が返ってくる。
他の変数と同じように代入できセーブもされるが代入した値を使用する方法が無いので意味は無い。


<Emuera>VariableSize.CSVによって配列の要素数を変更できる。CHARANUMとRANDは代入不可になっており、代入しようとするとエラーになる。</Emuera>
文字列配列型変数
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

<Emuera>ABLNAME〜ITEMNAMEは疑似配列だが範囲を超えた引数を指定するとエラーになる。item.csvなどで配列の範囲を超えた数字を指定してもLv1警告が出るだけで無視される。RESULTS、SAVESTRについてはVariableSize.CSVで要素数を変更できる。その他のcsvから定義するタイプの変数は要素数を変更できない。</Emuera>
キャラクター変数
キャラクター変数は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全て0BEGIN TRAIN
@SOURCE_CHECK終了時
NOWEX数値100全て0@EVENTCOM直前(@USERCOM前には更新されない)
GOTJUEL数値200全て0BEGIN TRAIN

<Emuera>NAMEとCALLNAMEが変更○。VariableSize.CSVで要素数を変更できる。</Emuera>

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


条件文に、たとえば、
IF TALENT:86 &&
や、
IF A == 3 || A == 7 || A ==
などのように、不完全な記述があると、そこでeramakerがフリーズしてしまうので注意。
<Emuera>フリーズはしないがエラーで強制終了する</Emuera>


ゲームバージョンについて


 CSVフォルダ内のGamebase.csvの中にバージョンを記してある。この数値は結構重要であり、セーブデータにおいてこれの一致不一致を見ている例もある。
 ところが、このバージョンにおいて数字以外の文字を使うとそこで読むのをやめてそれまでの数字で判断してしまう仕様なので注意。
 例えば 0.12a3 という風になっていたら、eramakerはバージョン0.12と判断する。a以下は無視するので、0.12a4というバージョンと0.12a3のバージョンをeramakerは区別しない。
 そして、Emueraでもその仕様に合わせるとのことなので、ゲームバージョンのバージョンに関しては必ず数字を使うようにすべきである。

<Emuera>Emuera1728までは違う処理がされていたようだが、eramakerに合わせるように修正されるとのこと</Emuera>





Emueraの仕様

Emuera 122c に同梱されているetcフォルダ内の"eramakerとの違い.txt"を参照。

変数一覧(Emueraとeramaker1)

 変数に関しては以下の各ページも参照してほしい。
 その1:非キャラクター数値変数
 その2:文字列変数およびキャラクター変数
 その3:Emuera専用変数







Menu

メニュー

過去スレ


初めて遊ぶ時、
何か困った時や
わからない時は
まず下を読んでください


本体・パッチ関連






リンク

スレッド

各スレッドは、こちらを読んでから書き込むことをおすすめします。
eratohoスレ(era板 避難所)
【調教SLG】eratoho総合スレ【戦闘経験307】

避難所スレ(したらばのちゅっちゅ板)
eratoho避難所スレ

eraシリーズ総合スレ(2chのエロ同人板)
【調教SLG】eraシリーズを語るスレ24【サークル獏】


【スレッド編集】

どなたでも編集できます