最終更新:ID:FQD8p1kCmQ 2011年08月16日(火) 00:15:15履歴
このページはeramakerまとめwikiの「開発者向け技術情報」の内容を転載したものが含まれています。
基本的な仕様については本家サイトの「改変のための情報」を参照のこと。
以下では06/06/02版のeramakerの実装に基づいて解説する。
<Emuera>あわせてEmuera1.22c に基づく情報も付記する、もちろん最新版Emueraはさらに変わっている可能性があるのでEmueraWikiなどを参照すること。</Emuera>
基本的な仕様については本家サイトの「改変のための情報」を参照のこと。
以下では06/06/02版のeramakerの実装に基づいて解説する。
<Emuera>あわせてEmuera1.22c に基づく情報も付記する、もちろん最新版Emueraはさらに変わっている可能性があるのでEmueraWikiなどを参照すること。</Emuera>
〜〜以上となっているものは調査した範囲では限界を見つけられなかったもの。
※
※※
1000人あたりで動作があやしいとの報告もあり。
どのみちセーブ・ロードに時間がかかるようになるので現実的ではない。
<Emuera>
C#のListクラスやStringクラスの上限がEmueraの上限になると思われる。</Emuera>
限界 | 備考 | |
整数変数の値 | -2147483648〜2147483647 | 32ビット符号付 |
文字列変数の文字数 | 1024文字以上 | |
関数名の文字数 | 1024文字以上 | 全角文字も使用可能 |
関数呼び出しスタック※ | 1000 | 超えた場合、動作が不安定になり強制終了することもある |
キャラクタ登録数 | 16384(16進数で4000)※※ | さらにADDCHARAすると応答がなくなる |
※
@EVENTCOM CALL FUNC0001 @FUNC0001 CALL FUNC0002 @FUNC0002 ……これが続いて@FUNC1000あたりまで来ると不安定になる。
※※
1000人あたりで動作があやしいとの報告もあり。
どのみちセーブ・ロードに時間がかかるようになるので現実的ではない。
<Emuera>
限界 | 備考 | |
整数変数の値 | -9223372036854775808〜9223372036854775807 | 64ビット符号付 |
文字列変数の文字数 | 2147483647文字? | |
関数名の文字数 | 2147483647文字? | 全角文字も使用可能 |
関数呼び出しスタック | 2147483647文字? | 超えた場合、動作が不安定になり強制終了することもある |
キャラクタ登録数 | 2147483647文字? |
eramakerは代入演算子が必要な場合、記号列の先頭から順に演算子を捜し、最初に見つかった代入演算子を認識する。
非代入演算子が必要な場合、記号列の先頭1文字または2文字を調べ、非代入演算子である方を認識する。どちらも演算子として認識出来る場合、2文字の方が優先される。どちらも認識できない場合はエラー。
何を言っているのかわからないかもしれないが、下の2つが等価になることから推測してほしい。
逆に数式中で"=="の代わりに"="を使用するとエラーになるのもこの実装による。
また、"<>"が"!="ではなく"<"と認識されてしまうことに注意が必要。
<Emuera>Emueraでは「1-許容範囲な記法」の書式は使えない。「2-標準的な記法」のようにきちんと書かないと認識されない。例外的に代入演算子として"=="を"="の代わりに使うことができる。</Emuera>
非代入演算子が必要な場合、記号列の先頭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>
単項演算子として"-"が使えるが、意図した通りに動作しない場合が多い。
特に二項算術演算子と比較演算子の左項に単項演算子付きの項があると単項演算子は無視されてしまうようである。
また負の数や変数に対して単項演算子を用いるとエラーになる。
おそらく使わない方が無難。
<Emuera>この問題は修正されている。しかしeramakerと動作が異なることになるので両方に対応させたい場合はやっぱり使わない方が無難。</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>
以下の演算子が使用できる
カッコがあればカッコの中が先に計算され、カッコがなければ優先度にしたがって順番に計算される。
<Emuera>同じ。</Emuera>
分類 | 優先度 | 代入演算 | 記号 |
算術演算子 | 高 | ○ | *, /, % |
↑ | ○ | +, - | |
比較演算子 | × | <, >, <=, >= | |
× | ==, != | ||
論理演算子 | ↓ | ○ | &, | |
低 | × | &&, || |
<Emuera>同じ。</Emuera>
代入命令で使用するための演算子。
"="のほか、上の表で代入演算に○をつけた演算子は"="と合わせて複合代入演算子として使える。
C言語のように数式の途中で代入演算子を使うことはできない。
また、代入演算子のない式で行を構成することもできない。
複号演算子は、例えば
厳密には以下のような場合には等価ではない。
もっともRANDに代入した値を参照する方法が無いのでこの違いが何かに影響することは無い。
<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つの式はどちらも有効で同じ意味になる。
ただし、代入先(左辺)の配列変数に数式の引数を指定するとエラーになる。
キャラクタ変数の第1引数を省略しない場合は少し特殊で、第1引数には変数しか指定できない。
NAMEやISASSIのような引数が1つしかない変数でも同様。
以下のように定数や数式を指定するとエラーになる。
しかし、エラーにならない場合もある。法則は不明。
<Emuera>省略に関しては同じ。ABL:0:0 や ABL:(TARGET + 1):0 のような表記もOKになっている。また、左辺の配列変数に数式の引数を指定してもエラーにならない。</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>
表の中で公式の解説と異なる値には赤字にした。
初期値の欄について、−となっているのはゲーム中は初期化されない。
TFLAGのように全て0となっている場合は配列の全てに0が代入される。
PREVCOMのように単に数字が書いているものは:0のみが記されているタイミングで初期化される。:1以降は初期化されない。
PALAMLVのように複数の数字が書かれているものは:0、:1、:2、……に順に記載されている数値が代入されることを表している。
※GAMEBASE.CSVの"アイテムなし"の値で初期化される。0と1以外も指定できる。
※※CHARANUMはどんな要素を指定してもキャラの登録数が返ってくる。RANDはランダムな値が返ってくる。
他の変数と同じように代入できセーブもされるが代入した値を使用する方法が無いので意味は無い。
<Emuera>VariableSize.CSVによって配列の要素数を変更できる。CHARANUMとRANDは代入不可になっており、代入しようとするとエラーになる。</Emuera>
すなわち、-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〜Z | 1000 | ○ | ○ | − | − |
COUNT | 1000 | ○ | ○ | − | − |
RESULT | 1000 | ○ | ○ | − | − |
DAY | 1000 | ○ | ○ | − | − |
TIME | 1000 | ○ | ○ | − | − |
MONEY | 1000 | ○ | ○ | − | − |
MASTER | 1000 | ○ | ○ | − | − |
TARGET | 1000 | ○ | ○ | 1 | ゲーム開始 |
ASSI | 1000 | ○ | ○ | -1 | ゲーム開始 |
PLAYER | 1000 | ○ | ○ | − | − |
ASSIPLAY | 1000 | ○ | ○ | 0 | BEGIN TRAIN |
SELECTCOM | 1000 | ○ | ○ | − | − |
PREVCOM | 1000 | ○ | ○ | -1 | BEGIN TRAIN |
NEXTCOM | 1000 | ○ | ○ | -1 | BEGIN TRAIN |
LOSEBASE | 1000 | ○ | ○ | 全て0 | @SHOW_USERCOM終了時 |
UP | 1000 | ○ | ○ | 全て0 | @SHOW_USERCOM終了時 UPCHECK時 |
DOWN | 1000 | ○ | ○ | 全て0 | @SHOW_USERCOM終了時 UPCHECK時 |
PALAMLV | 1000 | ○ | ○ | 0 100 500 3000 10000 30000 60000 100000 150000 250000 | ゲーム開始 |
EXPLV | 1000 | ○ | ○ | 0 1 4 20 50 200 | ゲーム開始 |
EJAC | 1000 | ○ | ○ | 10000 | ゲーム開始 |
FLAG | 10000 | ○ | ○ | − | − |
TFLAG | 1000 | ○ | ○ | 全て0 | BEGIN TRAIN |
ITEM | 1000 | ○ | ○ | − | − |
ITEMSALES | 1000 | ○ | ○ | − | − |
BOUGHT | 1000 | ○ | ○ | − | − |
NOITEM | 1000 | ○ | ○ | ※ | ゲーム開始 |
PBAND | 1000 | ○ | ○ | 4 | ゲーム開始 |
CHARANUM | 1000 | ※※ | ※※ | − | − |
RAND | 1000 | ※※ | ※※ | − | − |
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でエラーが起きない範囲を要素数の限界とした。
<Emuera>ABLNAME〜ITEMNAMEは疑似配列だが範囲を超えた引数を指定するとエラーになる。item.csvなどで配列の範囲を超えた数字を指定してもLv1警告が出るだけで無視される。RESULTS、SAVESTRについてはVariableSize.CSVで要素数を変更できる。その他のcsvから定義するタイプの変数は要素数を変更できない。</Emuera>
ABLNAME〜ITEMNAMEは実際には疑似配列でありどんな引数を指定してもエラーにはならないがPRINT_ABL命令などでエラーが起きる原因となる。
ここではPRINT_XXXでエラーが起きない範囲を要素数の限界とした。
変数名 | 要素数 | 変更 | セーブ | 初期値 | 初期化されるタイミング |
RESULTS | 100 | ○ | × | − | − |
ABLNAME | 100 | × | × | ABL.CSV | − |
TALENTNAME | 1000 | × | × | TALENT.CSV | − |
EXPNAME | 100 | × | × | EXP.CSV | − |
MARKNAME | 100 | × | × | MARK.CSV | − |
PALAMNAME | 200 | × | × | PALAM.CSV | − |
ITEMNAME | 1000 | × | × | ITEM.CSV | − |
STR | 20000 | ○ | × | STR.CSV | − |
SAVESTR | 100 | ○ | ○ | − | − |
<Emuera>ABLNAME〜ITEMNAMEは疑似配列だが範囲を超えた引数を指定するとエラーになる。item.csvなどで配列の範囲を超えた数字を指定してもLv1警告が出るだけで無視される。RESULTS、SAVESTRについてはVariableSize.CSVで要素数を変更できる。その他のcsvから定義するタイプの変数は要素数を変更できない。</Emuera>
キャラクター変数はNO、ISASSI、NAME、CALLNAMEの4つを除き全て二重配列である。
二重配列は以下のような形で呼び出す。
2つ目の引数も省略し、ABLと書くと、ABL:TARGET:0と解釈される。
<Emuera>NAMEとCALLNAMEが変更○。VariableSize.CSVで要素数を変更できる。</Emuera>
二重配列は以下のような形で呼び出す。
A = ABL:MASTER:21つ目の引数を省略し、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 | ○ | ○ | 全て0 | BEGIN TRAIN |
PALAM | 数値 | 100 | ○ | ○ | 全て0 | BEGIN TRAIN |
STAIN | 数値 | 100 | ○ | ○ | 0 0 2 1 8 その他0 | BEGIN TRAIN |
EX | 数値 | 100 | ○ | ○ | 全て0 | BEGIN TRAIN |
SOURCE | 数値 | 100 | ○ | ○ | 全て0 | BEGIN TRAIN @SOURCE_CHECK終了時 |
NOWEX | 数値 | 100 | ○ | ○ | 全て0 | @EVENTCOM直前(@USERCOM前には更新されない) |
GOTJUEL | 数値 | 200 | ○ | ○ | 全て0 | BEGIN 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>