emuera (1-8-2-4) | 2019-01-27 00:29 |
emuera - etc 関連ファイル (1-8-2-1) | 2015-11-04 01:04 |
emuera - source ソースコード (1-8-2-4) | 2019-01-27 00:32 |
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ではこの問題は起きません。
二重配列の引数が定数でも数式でもエラーは起きませんし、文字列変数の引数を省略することができます。
0,ローター,200 0xFF,ルーター,200
上のような記述がItem.csvにあった場合、eramakerは0xFFを0として解釈しTALENT:0はルーターとして定義されます。
Emueraはこれを再現せず、エラーを出した上でこの定義を無効にし、TALENT:0はローターとして定義されます。
A:0:1:99999 +-RESULTS:0=@=+123|*?=Y
上の式はeramakerでは動作します。
Emueraはこれをエラーにします。
SIF 条件文 ;コメント PRINT hogehoge
と言うスクリプトについて、eramakerは常にPRINT行を実行します。
eramakerはSIF の次の行は";コメント"であると認識するからです。
Emueraは吉里吉里などと同様に条件文が真である場合のみPRINT行を実行します。
Emueraは空行やコメント行は全く存在しないものとして扱い、SIFの次の行は"PRINT hogehoge"であると認識します。
また、eramakerではSIFの次の行にIF文やREPEAT文を置くことができますが、これは多くの場合に製作者の意図と異なる動作をするためにEmueraはSIFの次に持ってくる行に制限をかけています。
eramakerではIF、ELSEIFや代入文の引数を省略した場合、動作が不定となります。
ただし、RETURNの引数が省略された場合はRETURN 0です。
Emueraは省略された引数は常に0と解釈するので、IF以下は常に実行されませんが、警告対象となります。
eramakerでは記号や全角文字など全ての文字が使用可能です。
Emueraでも全角文字は使用できますが、_(アンダーバー)以外の記号は使用できません。
また、Emueraでは関数名を半角数字で始めることを推奨しません。
以下のスクリプトはeramakerでは動作しますが、Emueraではエラーになります。
CALL \.,)(][+-%* @&$ @\.,)(][+-%* @&$ PRINTL 関数@\.,)(][+-%* @&$が呼ばれた。 RETURN 0Emueraでは関数名に,または(を含む場合、関数の引数と誤解されてしまいます。
また、関数名が半角数字で始っていると式中で使える関数として呼び出すことができません。
式中では一文字を見て数字か変数・関数かを判別するためです。
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兆程度以下であれば体感できるほどの偏りはありません。
eramakerではWAIT命令実行時には改行せず、Enterキーを押した時に改行を伴います。
EmueraではWAIT命令実行時にカーソルが行の途中の場合改行を行い、「Enterキーを押した」「左クリックをした」などの時には改行を伴いません。
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に戻ってきた
eramakerではCALLNAMEを参照したときにCALLNAMEが空文字列の場合、代わりにNAMEの値を返します。
EmueraではCALLNAMEが空文字列ならば空文字列を返します。
この差を埋めるためにEmueraでは「CALLNAMEが空文字列の時にNAMEを代入する」オプションが用意されています。
このオプションがYESのとき、chara*.csvでCALLNAMEが設定されていない又は空文字列に設定されている場合、NAMEと同じ文字列が設定されたものとして扱います。
しかし、このオプションでも完全に再現できるわけではありません。
例えばeramakerでキャラを追加したセーブデータをEmueraで読んだ場合などに動作が異なることが考えられます。
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 ;S1S2S3S4Emueraはこれを再現しません。
eramakerではイベント関数の呼び出しは以下のように行われています。
foreach(#PRIの付いた関数) { 関数呼び出し if(#SINGLEかつ返り値が1である) break; } foreach(#PRIも#LATERも付いていない関数) { 関数呼び出し if(#SINGLEかつ返り値が1である) break; } foreach(#LATERの付いた関数) { 関数呼び出し if(#SINGLEかつ返り値が1である) break; }#PRIと#LATERを両方付けたイベント関数は2回呼ばれます。
関数リストを#PRI、#LATERに基づき並び替え foreach(全ての関数) { 関数呼び出し if(#SINGLEかつ返り値が1である) break; }#PRIと#LATERを両方付けた場合、どちらも付けていないものと同様に扱われます。
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の場合、ゲーム側のゲームコードに関わらず読み込むことができます。
eramakerでは"99999:技巧"のようにインデックスに負の値や非常に大きい値を指定できます。
ただし、ここで指定した番号はPRINT_ABLなどで使用されるため、PRINT_ABLの際に(eramaker内部で)ABL:99999が参照され、エラーが発生します。
このため、実用的に使える値はABLやTALENTの配列数と同じです。
item.csvでもSHOPでITEMやITEMSALESを参照したときにエラーが発生します。
EmueraではABLなどの配列の範囲外の値を指定できません。
そのような行は無視されます。
その代わり、VariableSize.csvによって配列の範囲を変えることができます。
基本的には他のcsvファイルと同じですが、他と少し事情が違います。
eramakerでは例えば"XXX,99999"という定義をしても、@COM99999が定義されていれば正常に実行されます。
一方、"YYY,-2"のように負の値を定義すると、コマンドは表示されるものの、選択しても何もおきません。
Emueraはこの動作を再現しません。
定義できる範囲はVariableSize.csvで指定したTRAINNAMEのサイズまでで、それ以外は無視されます。
TRAINNAMEのサイズを変更していなければ、0~999までが有効です。
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の場合は正常に動作しません。
eramakerではREPEAT-RENDを抜けるときにCOUNTが+1されます。
BREAKで抜けた時も+1されます。
Emueraもこの動作を再現します。
FOR-NEXT構文においても同様にループ変数を+1します。
一般的なプログラム言語のfor構文やbreak文と動作が異なるので注意してください。
eramakerではNEXTCOMの初期値は-1ですが、NEXTCOMが実行された後に代入される値は-1ではなく0です。
そのため、ERB側で再度代入しない限りCOM0を繰り返し続けることになります。
なお、eramakerの公式の解説にはNEXTCOMの存在は記載されていません。
Emueraもこの動作を再現します。
NEXTCOMの機能はeramakerとの互換性のためにのみ再現しており、使用は推奨されません。
eramakerで動かす予定のないコードであれば、DOTRAINやCALLTRAIN命令の使用を検討してください。
eramakerではcsvでCFLAG:0が非0に設定されたキャラクタはSPキャラとなります。
ADDCHARAでは登録できずADDSPCHARAによって登録しなければならないなどややわかりにくい仕様でした。
また、意図せずにCFLAG:0を非0に設定してADDCHARAで登録できなくなってしまうなどバグの原因ともなっていました。
Emueraではver 1.816からこの機能を標準でサポートしないことに決定しました。
CFLAG:0はもはや特別扱いされず、全てのキャラはADDCHARAから登録できるようになりました。
互換性オプション「SPキャラを使用する」によってeramakerの動作を再現することは可能ですが、古いスクリプトを動作させる以外の目的で使用することは推奨しません。
[PageInfo]
LastUpdate: 2015-07-16 18:40:41, ModifiedBy: minorshift
[Permissions]
view:all, edit:login users, delete/config:members