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は空行やコメント行は全く存在しないものとして扱い、SI
Fの次の行は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の動作を再現することは可能ですが、古いスクリプトを動作させる以外の目的で使用することは推奨しません。