====== ゲームの実行・処理の流れ ======
[[erabasicリファレンス|リファレンストップ]] · [[erabasicリファレンス_総索引|名前の総索引]]
ゲームモードの遷移、イベント関数、実行フロー、終了処理を調べます。
===== @EVENTLOAD =====
データをロードした直後に呼び出されます。\\
イベント関数なので複数定義することができます。\\
@EVENTLOADが定義されていない場合、@SHOW_SHOPへ移行します(eramakerと同じ動作)\\
===== @TITLE_LOADGAME =====
標準のタイトル画面でロードを選択した場合に呼び出されます。\\
@TITLE_LOADGAMEを定義することでタイトルでも独自のロード画面を使用することができます。\\
定義されていない場合、標準のロード画面が使用されます。\\
@SYSTEM_TITLEを定義した場合、明示的にCALLしない限り@TITLE_LOADGAMEが呼ばれることはありません。\\
===== @SYSTEM_AUTOSAVE =====
オートセーブが行われるタイミングで呼び出されます。\\
オートセーブの内容を独自に定めることができます。\\
定義されていない場合、標準のセーブ機能が使用されます。\\
===== @SYSTEM_TITLE =====
csvのロードが終了したタイミングで呼び出されます。\\
また、BEGIN TITLEによっても呼び出されます。\\
@SYSTEM_TITLEを定義することで独自のタイトル画面を使用することができます。\\
定義されていない場合、標準のタイトル画面が使用されます。\\
===== @CALLTRAINEND =====
CALLTRAINによる自動実行が終了後、システム内部から自動的に呼び出される関数です。\\
イベント関数ではないため多重定義できないことに注意してください。\\
===== 命令の説明 =====
==== QUIT ====
Emueraを終わらせる命令です。
==== BEGIN <キーワード> ====
BEGINはeramakerから存在する命令ですが、キーワードとして新しくFIRSTとTITLEが追加されました。\\
BEGIN FIRSTはタイトル画面で"[0]最初からはじめる"を選択した時と同じ効果で、イベント関数@EVENTFIRSTが実行されます。\\
BEGIN TITLEはタイトル画面に戻ります。\\
どちらも変数の初期化などは行いませんので適宜RESETDATA命令を実行してください。\\
=== 基本の動作 ===
**BEGIN 定型語**
ゲームモード遷移命令です。調教を始めたり、ターンを終わらせたりするときに使いますがeramakerのシステムをどのくらい利用しているかによって使えるかどうか違いますし、状況によってはBEGIN命令できないタイミングも存在します。なお、BEGIN命令以降の命令たちは実行はされません。また、場合によっては一部フラグがクリアされたりします。
以下のBEGIN命令が可能になります。
* BEGIN SHOP:ショップ画面を呼び出す
* BEGIN TRAIN:調教を開始する。
* BEGIN ABLUP:能力上昇画面を呼び出す。
* BEGIN AFTERTRAIN:調教終了処理を始める。
* BEGIN TURNEND:ターン終了処理を始める。
* BEGIN FIRST:最初から始めるに移動する。
* BEGIN TITLE:タイトル画面に移動する。
==== CALLTRAIN <コマンド数> ====
連続コマンド実行命令です。\\
あらかじめSELECTCOM:(1〜)にコマンド番号を代入しておき、実行するコマンドの数を引数にして実行します。\\
SELECTCOM:1 = XXX
SELECTCOM:2 = YYY
・
・
・
SELECTCOM:N = ZZZ
CALLTRAIN (設定したコマンドの数)
通常のコマンド実行と同様にSHOW_STATUSやSHOW_USERCOMも呼び出しますが、TRAINコマンド、USERCOMの表示はされません。\\
どうしてもUSERCOMの表示をしたい場合はNOSKIP〜ENDNOSKIPを使うと良いでしょう。\\
CALLTRAINによる自動実行が終了後、システム関数@CALLTRAINENDが呼び出されます。\\
ただし、@CALLTRAINENDはイベント関数ではないため多重定義できないことに注意してください。\\
なお、コマンドの指定に使うコマンド番号は、ゲーム中の値でなく、TRAIN.CSVで指定した値になります\\
==== DOTRAIN <数式> ====
強制的にTRAINを行う命令です。\\
@EVENTTRAIN、@SHOW_STATUS、@SHOW_USERCOM、@USERCOM、@EVENTCOMEND及びそこから呼び出された関数の中でのみ使用可能です。\\
引数で指定する番号はtrain.csvで定義した番号に対応しています。\\
動作はコマンドが選択された場合と同じで、UP、DOWNなどの変数を初期化し、SELECTCOMに引数を代入し、@EVENTCOMが呼ばれ、@COM{SELECTCOM}が呼ばれ……という流れになります。\\
引数が0未満であるか、TRAINNAMEの要素数以上の値であればエラーになりますが、それ以外のチェックは行われません。\\
引数がtrain.csvで定義されていない数字でも強制的に実行しようとします。\\
また、@COM_ABLEを呼び出さず、強制的に実行されます。\\
必要であればDOTRAINの前に以下のようなチェックを行ってください。\\
SIF ( X < 0 || X >= VARSIZE("TRAINNAME") || TRAINNAME:X == "" )
RETURN
RESULT = 1
TRYCALLFORM COM_ABLE{X}
SIF RESULT == 0
RETURN
DOTRAIN X
逆にDOTRAINを用いてTRAINのコマンドを独自に実装することもできます。\\
例えばtrain.csvを空にしておき、@SHOW_USERCOMで独自に表示し、@USERCOMでDOTRAINを行います。\\
あるいはtrain.csvを空にする代わりに全ての@COM_ABLEが0を返すようにしてもよいでしょう。\\
@COM_ABLEを変更する代わりに、全ての@COM_ABLEを削除し、_replace.csvの"COM_ABLE初期値"を0にする方法もあります。\\
なお、CALLTRAINの処理の途中でDOTRAINが行われた場合、CALLTRAINの残りは無効になります。\\
==== AWAIT {int time} ====
ERBの実行を一時停止し、Windowsの処理を行います。\\
引数を指定した場合、指定したミリ秒数だけ実行を待機します。\\
AWAIT命令はEmueraの無限ループ警告を中断し、Emueraのプロセスが「応答なし」になることを防ぎます。\\
時間がかかる処理を行うときに使用して下さい。\\
ただし、AWAIT命令自体がそれなりの実行時間がかかるため、頻繁に行いすぎると遅くなります。\\
また、ユーザーを不安にしないため、例えば以下のように作業進度を逐次表示することをお勧めします。\\
REDRAW 0
FOR LCNT, 0, 100
PRINTSL "作業中・・・ " + TOSTR(LCNT) + "% 完了"
AWAIT
CLEARLINE 1
;時間がかかる処理
NEXT
==== STOPCALLTRAIN ====
以下、私家改造版更新履歴より、\\
○CALLTRAIN命令のフローをスクリプトから強制終了するSTOPCALLTRAIN追加
書式:STOPCALLTRAIN
内容:CALLTRAIN命令が動いている間に呼び出されると、その時点でCALLTRAINの処理を終了する
それ以外の場合は何もしない
===== ゲームモードと実行フロー =====
フロー図はDiagramDesignerを用いて作成した。\\
データファイルは[[https://book-shelf-end.com/up/dwlink.cgi?eraRx4752.7z|こちら]]。\\
以下の説明文中で特に明示されていない場合は文の主語はEmuera.exeである。\\
==== TITLE ====
起動してerbを読み終えた後、およびBEGIN TITLE実行後。\\
{{:eraten:wpx3_w_ka4-s_bfdd7867.gif}}\\
@SYSTEM_TITLEが定義されていればそれを呼び出し、他には何もしない。\\
@SYSTEM_TITLE中でBEGIN命令やLOADDATA命令が行われずにRETURNされると次に実行する処理がなくなりエラー終了する。\\
@SYSTEM_TITLEが定義されていなければ標準のタイトル処理を行う。\\
標準のタイトル画面の"[0] 最初からはじめる"などの文字は変更可能である。\\
詳細は_replace.csvを参照。\\
"[0] 最初からはじめる"が選択された場合、まずデータの初期化を行う。\\
具体的にはSTRやPRINTLVの初期値の設定(RESETDATA命令と同じ)、ADDCHARA 0など。\\
次にBEGIN FIRSTを実行し、FIRSTへ遷移する。\\
"[1] ロードしてはじめる"が選択された場合、@TITLE_LOADGAMEが定義されていればそれを呼び出す。\\
定義されていなければ標準のロード画面を表示する。\\
LOADGAMEで呼ばれる画面とは微妙に異なる。\\
==== FIRST ====
タイトル画面で"[0] 最初からはじめる"を選んだ時、およびBEGIN FIRST実行後。\\
@EVENTFIRST内でBEGIN命令が行われなかった場合、次に実行する処理がなくなりエラー終了する。\\
{{:eraten:bfrwq3f49s-s_9bf1441b.gif}}\\
==== SHOP ====
ロード後、およびBEGIN SHOP実行後。\\
ロード後の場合は@EVENTSHOPの処理を行わない。\\
{{:eraten:mc6kioajyb-s_64c7cceb.gif}}\\
@SHOW_SHOP呼び出し後に入力を要求する。 この入力において、0〜99が入力されると購入処理、それ以外が入力されると@USERSHOPを呼び出す。\\
この範囲は_replace.csvによって変更可能である。詳細は_replace.csvを参照。\\
なお、PRINT_ITEMSHOP命令で表示されるアイテムの範囲はITEMNAMEとITEMSALESの要素数のいずれか小さい方まで(標準は1000)。\\
購入処理が呼ばれた場合、対応するITEMSALESが0以外であるか、MONEYがITEMPRICEより大きいかどうかを判定する。\\
購入判定に失敗した場合、再度入力を要求する。\\
eramakerでは購入に失敗した場合は@SHOW_SHOPからやり直していた。\\
購入判定に成功した場合、BOUGHT変数にITEM番号を代入し、ITEM:BOUGHTを1増やし、MONEYをITEMPRICE:BOUGHTだけ減らす。\\
@EVENTBUYを呼び出し@SHOW_SHOPへ戻る。\\
どこかでBEGIN命令が行われない限り、SHOPから出ることはない。\\
==== TRAIN ====
BEGIN TRAIN実行後。\\
{{:eraten:tm9bioxn4y-s_85c9116f.gif}}\\
まず一部の変数の初期化を行う。\\
具体的には、ASSIPLAY:0に0、PREVCOM:0、NEXTCOM:0に-1を代入する。\\
さらにTFLAGを全て0にし、全てのキャラのGOTJUEL、TEQUIP、EX、PALAM、SOURCEを全て0にする。\\
最後に全てのキャラのSTAIN:2に2、STAIN:3に1、STAIN:4に8、その他に0を代入する。\\
TRAINを出るときには初期化を行わないので、SHOPでセーブするとセーブデータにこれらの値が残ることになる。\\
@SAVEINFOなどでキャラのGOTJUEL、TEQUIP、EX、PALAMなどに0を代入しておくことでセーブデータのサイズを節約することができる。\\
NEXTCOMに非負の値を代入した場合の動作は重大な不具合を抱えているためここでは解説しない。\\
EmueraのNEXTCOMは旧来のコードの動作を前記不具合を含めて再現する目的で実装されたものであり、新規の利用は想定されていない。\\
CALLTRAIN命令に関しては拡張命令を参照。\\
@SHOW_STATUS呼び出し後に実行可能なTRAINを表示する。\\
TRAINNAMEが定義されているものについて、@COM_ABLExxを探す。\\
探索範囲(図中のMAX_TRAIN)はEmueraではVariableSize.csvで指定したTRAINNAMEの範囲まで、eramakerなら2147483647まで。\\
@COM_ABLExxが定義されていないか、0以外の値を返したなら実行可能なのでTRAINNAMEを表示する。\\
@COM_ABLExxが0を返したなら実行できないのでTRAINNAMEを表示しない。\\
この時に実行可能かどうかを記憶しておく。(実行時に再度@COM_ABLExxを呼び出すわけではない。)\\
TRAINNAMEの表示が終わったら@SHOW_USERCOMを呼び出す。\\
@SHOW_USERCOM後、入力の前にUP、DOWN、LOSEBASEを初期化する。\\
その後、入力を要求する。\\
入力結果を先の@COM_ABLExxの結果と照らし合わせ、実行可能なコマンドであれば対応する@COMxxを呼び出す流れになる。\\
まず、SELECTCOM変数にTRAIN番号を代入し、全てのキャラのNOWEXの全ての要素を0にする。\\
次に@EVENTCOMを呼びだし、その後に対応する@COMを呼び出す。\\
@COMが0でない値を返したならば@SOURCE_CHECK、@EVENTCOMENDを呼び出し、@SHOW_STATUSに戻る。\\
@SOURCE_CHECK終了後、@EVENTCOMEND呼び出し前に全てのキャラのSOURCEの全ての要素を0にする。\\
@SOURCE_CHECK終了後、@EVENTCOMENDが存在しないか@EVENTCOMEND内で一度もWAIT命令が行われない場合、@SHOW_STATUSの直前にWAITを発生させる。\\
@COMが0を返したならば@SHOW_STATUSに戻る。\\
なお、UPCHECK命令が実行されるとTARGETのPALAMにUPとDOWNの値が加算・減算され、UPとDOWNの全てに0が代入される。。\\
入力結果が実行可能なコマンドでなければ@USERCOMを呼びだし、@SHOW_STATUSに戻る。\\
どこかでBEGIN命令が行われない限り、TRAINから出ることはない。\\
==== ABLUP ====
BEGIN ABLUP実行後。\\
{{:eraten:wnnxuhfh4s-s_667239ef.gif}}\\
@SHOW_JUEL、@SHOW_ABLUP_SELECTを呼び出し、入力を要求する。\\
入力が0〜99の範囲内である場合、対応する@ABLUPを探す。\\
対応する@ABLUPが定義されていれば@ABLUPを呼び出し、@SHOW_JUELに戻る。\\
定義されていない場合、再度入力を要求する。\\
eramakerでは定義されていない場合は@SHOW_JUELからやり直していた。\\
入力が0〜99の範囲外である場合、@USERABLUPを呼び出し、@SHOW_JUELに戻る。\\
Emuera1.705現在ではこの範囲を変える方法はない。\\
どこかでBEGIN命令が行われない限り、ABLUPから出ることはない。\\
==== AFTERTRAIN ====
BEGIN AFTERTRAIN実行後。\\
@EVENTEND内でBEGIN命令が行われなかった場合、次に実行する処理がなくなりエラー終了する。\\
{{:eraten:hxhqcxmv4j-s_2406ede3.gif}}\\
==== TURNEND ====
BEGIN TURNEND実行後。\\
@EVENTTURNEND内でBEGIN命令が行われなかった場合、次に実行する処理がなくなりエラー終了する。\\
{{:eraten:pogrgu7175-s_be2eaa8b.gif}}\\
==== LOADGAME ====
LOADGAME命令の実行時。\\
BEGIN命令はRETURN命令を内包しBEGIN以下の文は決して実行されないが、LOADDATAとSAVEDATA命令はCALL命令と同様に元の場所に帰ってくる。\\
ただし、LOADが実行された場合はもとの位置を忘れてLOADDATAENDへ遷移する。\\
{{:eraten:vhjo4thmse-s_1a369980.gif}}\\
==== SAVEGAME ====
SAVEGAME命令の実行時。\\
@SAVEINFOを呼び出すタイミングは実際に書き込みが行われる直前である。\\
{{:eraten:qjpuapojdz-s_e01b6ff0.gif}}\\
==== LOADDATAEND ====
LOADGAMEでLOADが実行された後、およびLOADDATA命令の実行後。\\
LOADが行われた時点で呼び出し中の関数などこれまでの状態は全て消去される。\\
{{:eraten:xtsi0cxdbp-s_97f57fe7.gif}}\\
eramakerだとここでは何もせず、@SHOW_SHOPに遷移する。\\
Emueraでは、@SYSTEM_LOADENDが定義されていれば@SYSTEM_LOADENDを実行する。\\
@SYSTEM_LOADEND終了までにBEGIN命令が行われれば、そちらへ遷移する。\\
でなければ@EVENTLOADが定義されていれば@EVENTLOADを実行する。\\
@EVENTLOAD終了までにBEGIN命令が行われれば、そちらへ遷移する。\\
BEGIN命令が行われなければ通常通り@SHOW_SHOPに遷移する。\\