eramakerとの相違点¶
バグ・不自然な動作の修正¶
配列の最後の要素が使用できない¶
eramakerでは配列の最後の要素が0で無いとロード時にデータが破壊されます。
Emueraではこの問題は起きません。
この問題はeramakerでセーブとロードの仕様が統一されていないことから発生していますが、Emueraはセーブ時の仕様で統一しています。
したがって、eramakerでセーブしEmueraでロードするとこの問題は発生しませんが、Emueraでセーブしeramakerでロードするとこの問題が再現されます。
単項演算子-の異常¶
eramakerでは-100 < 0が偽になるなどの問題があります。
Emueraではこの問題は起きません。
ファイルの最後の行が読まれない¶
eramakerでは改行コードの無い行を無視します。
つまり、CSVでもERBでもファイルの最後の行は無視されます。
Emueraではこの動作を再現しません。
配列に余分な要素がある場合無視される¶
A:1:2 = 34
上の式はeramakerではA:1に34が代入されます。
Emueraはこれをエラーにします。
配列の呼び出しに特定の書式が使えない¶
eramakerではA:0やA:(COUNT+1)といった変数の使い方ができます。
一方で二重配列変数でABL:0:2やTALENT:(COUNT+1):2のような書き方をするとエラーになります。
また文字列変数の呼び出しの際に引数を省略するとエラーになることがあります。
Emueraではこの問題は起きません。
二重配列の引数が定数でも数式でもエラーは起きませんし、文字列変数の引数を省略することができます。
CSV内の異常な数値を整数として扱う¶
0,ローター,200
0xFF,ルーター,200
上のような記述がItem.csvにあった場合、eramakerは0xFFを0として解釈しTALENT:0はルーターとして定義されます。
Emueraはこれを再現せず、エラーを出した上でこの定義を無効にし、TALENT:0はローターとして定義されます。
不自然な表記が動作する¶
A:0:1:99999 +-RESULTS:0=@=+123|*?=Y
上の式はeramakerでは動作します。
Emueraはこれをエラーにします。
その他eramakerと動作が異なる点¶
SIFの直後が空行・コメント行などである場合
SIF 条件文
;コメント
PRINT hogehoge
と言うスクリプトについて、eramakerは常にPRINT行を実行します。
eramakerはSIFの次の行は;コメントであると認識するからです。
Emueraは吉里吉里などと同様に条件文が真である場合のみPRINT行を実行します。
Emueraは空行やコメント行は全く存在しないものとして扱い、SIFの次の行はPRINT hogehogeであると認識します。
また、eramakerではSIFの次の行にIF文やREPEAT文を置くことができますが、これは多くの場合に製作者の意図と異なる動作をするためにEmueraはSIFの次に持ってくる行に制限をかけています。
IF、ELSEIFなどの引数を省略した場合の動作¶
eramakerではIF、ELSEIFや代入文の引数を省略した場合、動作が不定となります。
ただし、RETURNの引数が省略された場合はRETURN 0です。
Emueraは省略された引数は常に0と解釈するので、IF以下は常に実行されませんが、警告対象となります。
関数名に使用可能な文字¶
eramakerでは記号や全角文字など全ての文字が使用可能です。
Emueraでも全角文字は使用できますが、_(アンダーバー)以外の記号は使用できません。
また、Emueraでは関数名を半角数字で始めることを推奨しません。
以下のスクリプトはeramakerでは動作しますが、Emueraではエラーになります。
CALL \.,)(][+-%* @&$
@\.,)(][+-%* @&$
PRINTL 関数@\.,)(][+-%* @&$が呼ばれた。
RETURN 0
Emueraでは関数名に,または(を含む場合、関数の引数と誤解されてしまいます。
また、関数名に@や演算子の記号などを含む場合、LOCAL@関数名という呼び出しが正常に機能しません。
{}や%を含む場合、CALLFORMでの呼び出しに支障があります。
そのためEmueraでは、C#や吉里吉里など多くのプログラミング言語と同様に、関数名に記号を使うことを禁止しています。
ver 1.721現在ではこれは警告Lv 1であり直ちにエラー終了するような警告ではありませんが、どこかで意図しない動作をする可能性があります。
また、関数名が半角数字で始っていると式中で使える関数(in_expression_functions.md)として呼び出すことができません。
式中では一文字を見て数字か変数・関数かを判別するためです。
RANDの仕様¶
A = RAND:X
について、eramakerではXが0の時、0を返します。
そうでない場合、(0~32767までの乱数) % (Xの絶対値)を返します。
この方式はXが負の値でも動作する、32767以上の値を返すことが無い、Xが1000を超えるあたりで値の偏りが無視できない、などの特徴があります。
Emueraはこれらを再現しません。
Emueraは(0~18446744073709551615までの乱数) % (X)を返します。
Xが0または負の値の時、Emueraはエラーになります。
(公式の解説にある返されるのはRAND:Aの場合0からA-1までの整数であるとの記載に基づき、戻り値の一貫性を重視した結果です)
また、Xは1~9223372036854775807の範囲(64ビット符号付整数の正の範囲)まで有効です。
Xが100兆程度以下であれば体感できるほどの偏りはありません。
WAITの仕様¶
eramakerではWAIT命令実行時には改行せず、Enterキーを押した時に改行を伴います。
EmueraではWAIT命令実行時にカーソルが行の途中の場合改行を行い、「Enterキーを押した」「左クリックをした」などの時には改行を伴いません。
JUMPの仕様¶
eramakerではCALLで呼ばれた関数からJUMPすることができません。
EmueraではCALLされた関数でもJUMPすることができます。
JUMP先でRETURNするとJUMP元関数でRETURNした時と同じ動作になります。
例
CALL FOOBAR
@FOO
PRINTL 関数@FOO
JUMP BAR
@BAR
PRINTL 関数@BAR
RETURN 0
@FOOBAR
PRINTL 関数@FOOBAR
CALL FOO
PRINTW 関数@FOOBARに戻ってきた
実行結果
eramaker(エラー)
CALLで呼ばれた先からJUMPで関数を呼び出そうとしました
Emuera
関数@FOOBAR
関数@FOO
関数@BAR
関数@FOOBARに戻ってきた
CALLNAMEの仕様¶
eramakerではCALLNAMEを参照したときにCALLNAMEが空文字列の場合、代わりにNAMEの値を返します。
EmueraではCALLNAMEが空文字列ならば空文字列を返します。
この差を埋めるためにEmueraではCALLNAMEが空文字列の時にNAMEを代入するオプションが用意されています。
このオプションがYESのとき、chara*.csvでCALLNAMEが設定されていない又は空文字列に設定されている場合、NAMEと同じ文字列が設定されたものとして扱います。
しかし、このオプションでも完全に再現できるわけではありません。
例えばeramakerでキャラを追加したセーブデータをEmueraで読んだ場合などに動作が異なることが考えられます。
PRINTFORMなどFORMの展開¶
eramakerは展開できるものが無くなるまで何度でも繰り返します。
自己参照や循環参照がある場合、フリーズします。
Emueraは一度だけ展開します。
eramakerの展開はおそらく以下のように行われます。
str = 展開したい文字列
while(strの中に{~~}がある)
一番左の{~~}を展開
while(strの中に%~~%がある)
一番左の%~~%を展開
while(strの中に***がある)
一番左の***を展開
while(strの中に$$$がある)
一番左の$$$を展開
while(strの中に+++がある)
一番左の+++を展開
while(strの中に///がある)
一番左の///を展開
while(strの中に===がある)
一番左の===を展開
この動作のため、eramakerでは以下のようなことも可能です。
例
STR:1 = S1%STR:2%3%4%
STR:2 = S2%STR:
STR:3 = S3%STR:
STR:4 = S4
PRINTFORMSL STR:1
PRINTFORML %STR:1%
DRAWLINE
結果
;S1S2S3S4
;S1S2S3S4
Emueraはこれを再現しません。
EVENT関数の属性¶
eramakerではイベント関数の呼び出しは以下のように行われています。
foreach(#PRIの付いた関数)
{
関数呼び出し
if(#SINGLEかつ返り値が1である)
break;
}
foreach(#PRIも#LATERも付いていない関数)
{
関数呼び出し
if(#SINGLEかつ返り値が1である)
break;
}
foreach(#LATERの付いた関数)
{
関数呼び出し
if(#SINGLEかつ返り値が1である)
break;
}
#PRIと#LATERを両方付けたイベント関数は2回呼ばれます。
#SINGLEは返り値が1のときのみ、以降の関数呼び出しを中断します。
また、#SINGLEによる関数呼び出しの中断は、#PRIや#LATERを付けた組ごとに行われます。
ver1.800(開発版も含めると1.756alpha018)以降のEmueraではこの動作を正確に再現します。
それより前のEmueraではイベント関数の呼び出しは以下のように行われていました。
関数リストを#PRI、#LATERに基づき並び替え
foreach(全ての関数)
{
関数呼び出し
if(#SINGLEかつ返り値が1である)
break;
}
#PRIと#LATERを両方付けた場合、どちらも付けていないものと同様に扱われます。
#SINGLEにより関数呼び出しを中断された場合、#PRI、#LATERの有無によらずそのイベント関数の呼び出しは終わりです。
なお、Emuera1.751bまでは#SINGLEは返り値が0でないときに以降の関数呼び出しを中断していました。
これは1.752で修正され、現在のバージョンではeramaker同様に返り値が1のときのみ以降の関数呼び出しを中断します。
gamebase.csv「コード」の読み方¶
gamebase.csvのコードに、eramakerで扱える数である-2147483648~2147483647の範囲を超えた数の値を書いた場合、
eramakerではcsvに書かれた値を16進数に直し、下8桁をゲームコードとして使用します。
たとえばコード,08231000181818110のような場合、ゲームコードは301712126になり、eramakerで扱える範囲になります。
Emueraはこの動作を再現しません。
ver1.803以前のEmueraでは、コード,08231000181818110のような場合、ゲームコードは0になります。
Emueraでは-9223372036854775808~9223372036854775807の範囲の数を扱うことができますが、
GAMEBASE_GAMECODEのみeramaker同様-2147483648~2147483647の範囲の数しか扱わず、その範囲を超えた場合は0になります。
さらに、ver1.804以降のEmueraでは、コード,08231000181818110のような場合もゲームコードは書いた通り8231000181818110となります。
(GAMEBASE_GAMECODEも他の変数と同様の範囲を扱う変数に変更されました)
この場合もコード,98231000181818110110のようにEmueraで扱える数の範囲を超えた数の値の場合、ゲームコードは0になります。
なお、ver1.805以降のEmueraでは、セーブデータのゲームコードが0の場合、ゲーム側のゲームコードに関わらず読み込むことができます。
abl.csvなどの読み方¶
eramakerでは99999:技巧のようにインデックスに負の値や非常に大きい値を指定できます。
ただし、ここで指定した番号はPRINT_ABLなどで使用されるため、PRINT_ABLの際に(eramaker内部で)ABL:99999が参照され、エラーが発生します。
このため、実用的に使える値はABLやTALENTの配列数と同じです。
item.csvでもSHOPでITEMやITEMSALESを参照したときにエラーが発生します。
EmueraではABLなどの配列の範囲外の値を指定できません。
そのような行は無視されます。
その代わり、VariableSize.csvによって配列の範囲を変えることができます。
train.csvの読み方¶
基本的には他のcsvファイルと同じですが、他と少し事情が違います。
eramakerでは例えばXXX,99999という定義をしても、@COM99999が定義されていれば正常に実行されます。
一方、YYY,-2のように負の値を定義すると、コマンドは表示されるものの、選択しても何もおきません。
Emueraはこの動作を再現しません。
定義できる範囲はVariableSize.csvで指定したTRAINNAMEのサイズまでで、それ以外は無視されます。
TRAINNAMEのサイズを変更していなければ、0~999までが有効です。
chara*.csvの読み方¶
eramakerでは番号が0未満や1000以上であっても正常にADDCHARAできます。
これはEmueraでも同じ動作です。
eramakerでは基礎,0のように、3番目の値が必要な場合にそれを省略すると0と扱われます。
また、素質,0,100のように3番目の値が不要な場合に値を指定しても無視され、1になります。
Emueraはこの動作を再現しません。
基礎,0とすればMAXBASE:0は1になり、素質,0,100とすればTALENT:0は100になります。
ファイルの改行コード¶
eramakerでは改行コードが[CR][LF]と[LF]のときを改行としますが、[CR]のみのとき改行とされずさまざまな誤動作が発生します。
Emueraはこの動作を再現せず、[CR]のみの場合も改行とみなします。
修正されていないバグ・不自然な動作¶
ファイル読込順がファイルシステムに依存する¶
eramaker basicでは多重定義された関数をCALLしたときなど、動作がファイルの読込順に依存するケースがあります。
しかし、eramakerではファイルの読込順がファイルシステムに依存するので期待した通りに動かない場合があります。
Emueraでもこの問題が再現されます。
現在公開されている多くのスクリプトはファイルシステムがNTFSであることを前提としており、ファイルシステムがFATの場合は正常に動作しません。
REPEAT-REND終了時にCOUNTが加算される¶
eramakerではREPEAT-RENDを抜けるときにCOUNTが+1されます。
BREAKで抜けた時も+1されます。
Emueraの動作を再現します。
FOR-NEXT構文においても同様にループ変数を+1します。
一般的なプログラム言語のfor構文やbreak文と動作が異なるので注意してください。
NEXTCOMの動作¶
eramakerではNEXTCOMの初期値は-1ですが、NEXTCOMが実行された後に代入される値は-1ではなく0です。
そのため、ERB側で再度代入しない限りCOM0を繰り返し続けることになります。
なお、eramakerの公式の解説にはNEXTCOMの存在は記載されていません。
Emueraもこの動作を再現します。
NEXTCOMの機能はeramakerとの互換性のためにのみ再現しており、使用は推奨されません。
eramakerで動かす予定のないコードであれば、DOTRAINやCALLTRAIN命令の使用を検討してください。
変更された機能¶
SPキャラ¶
eramakerではcsvでCFLAG:0が非0に設定されたキャラクタはSPキャラとなります。
ADDCHARAでは登録できずADDSPCHARAによって登録しなければならないなどややわかりにくい仕様でした。
また、意図せずにCFLAG:0を非0に設定してADDCHARAで登録できなくなってしまうなどバグの原因ともなっていました。
Emueraではver 1.816からこの機能を標準でサポートしないことに決定しました。
CFLAG:0はもはや特別扱いされず、全てのキャラはADDCHARAから登録できるようになりました。
互換性オプション「SPキャラを使用する」によってeramakerの動作を再現することは可能ですが、古いスクリプトを動作させる以外の目的で使用することは推奨しません。