流程图
翻译自原文档:https://osdn.net/projects/emuera/wiki/flow
流程图是用DiagramDesigner创建的。
数据文件在这里。
在以下描述中,除非另有说明,否则句子的主语是Emuera.exe。
TITLE
在启动和读取ERB后,并在运行BEGIN TITLE后。

如果@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指令,就没有下一个要执行的进程,错误结束。
SHOP
在加载和运行BEGIN SHOP后。

如果在加载后,@EVENTSHOP未被处理。
在@SHOW_SHOP调用之后,要求输入。如果输入是0-99,则处理购买,否则就调用@USERSHOP。 这个范围可以在_replace.csv中改变。 详见_replace.csv。
请注意,@PRINT_ITEMSHOP指令显示的项目范围是ITEMNAME或ITEMSALES中的元素数,以小者为准(标准是1000)。
当购买过程被调用时,要确定相应的ITEMSALES是否为非零,或者MONEY是否大于ITEMPRICE。
如果购买决策失败,则要求再次输入。
在 Eramaker 中,如果购买失败,用户必须从@SHOW_SHOP重新开始。
如果购买决策成功,将ITEM编号分配给BOUGHT变量,将ITEM:BOUGHT增加1,并通过ITEMPRICE:BOUGHT减少MONEY。
呼叫@EVENTBUY,返回@SHOW_SHOP。
除非在某个地方发出BEGIN指令,否则你永远不会离开SHOP。
TRAIN
在执行BEGIN TRAIN后。

首先,一些变量会被初始化。
具体来说,将0分配给ASSIPLAY:0,-1分配给PREVCOM:0,-1分配给NEXTCOM:0。
此外,TFLAG被设置为0,GOTJUEL、TEQUIP、EX、PALAM和SOURCE的所有字符都被设置为0。
最后,为所有字符的STAIN:2分配2,为STAIN:3分配1,为STAIN:4分配8,为其他分配0。
当你离开训练流程时,这些值不会被初始化,所以如果你在商店里保存,这些值会保留在你的保存数据中。
你可以通过@SAVEINFO或其他方法将角色的GOTJUEL、TEQUIP、EX、PALAM等指定为0来保存保存数据的大小。
这里不解释NEXTCOM的非负值的行为,因为它有一个严重的错误。
Emuera的NEXTCOM是为了重现旧代码的行为而实施的,包括上述的缺陷,并不打算用于新的用途。
关于CALLTRAIN指令,见扩展。
显示调用@SHOW_STATUS后可执行的TRAIN。
搜索@COM_ABLExx,寻找那些有定义的TRAINNAME。
搜索范围(图中的MAX_TRAIN)对于Emuera来说是到VariableSize.csv中指定的TRAINNAME范围,对于 Eramaker 来说是到2147483647。
如果@COM_ABLExx没有被定义或返回非零值,那么它就是可执行的,TRAINNAME被打印出来。
如果@COM_ABLExx返回0,则不能执行,不显示TRAINNAME。
在这个时候,它记住了是否可执行。 (这并不意味着@COM_ABLExx在运行时被再次调用)。
显示TRAINNAME后,调用@SHOW_USERCOM。
在@SHOW_USERCOM之后,输入前初始化UP、DOWN和LOSEBASE。
之后,要求输入。
输入的结果与@COM_ABLExx的结果进行核对,如果该命令是可执行的,则调用相应的@COMxx。
首先,TRAIN号被分配给SELECTCOM变量,所有字符的NOWEX的所有元素被设置为0。
接下来,@EVENTCOM被调用,接着是相应的@COM。
如果@COM返回一个非零值,则调用@SOURCE_CHECK、@EVENTCOMEND并返回@SHOW_STATUS。
在@SOURCE_CHECK完成后,在调用@EVENTCOMEND前,将所有字符的SOURCE的所有元素设置为0。
如果在@SOURCE_CHECK之后,@EVENTCOMEND不存在或者在@EVENTCOMEND中没有给出WAIT指令,那么在@SHOW_STATUS之前就会产生一个WAIT。
如果@COM返回0,则返回到@SHOW_STATUS。
注意,当UPCHECK指令被执行时,UP和DOWN的值与TARGET的PALAM相加和相减,并且UP和DOWN的值都被分配为0。
如果输入的结果不是可执行的命令,则调用@USERCOM并返回@SHOW_STATUS。
除非在某个地方发出BEGIN命令,否则你永远不会离开TRAIN。
ABLUP
在执行了BEGIN ABLUP之后。

调用@SHOW_JUEL和@SHOW_ABLUP_SELECT来请求输入。
如果输入的范围是0-99,找到相应的@ABLUP。
如果定义了相应的@ABLUP,则调用@ABLUP并返回到@SHOW_JUEL。
如果没有定义,就会再次要求输入。
在 Eramaker 中,如果没有定义,就从@SHOW_JUEL重新开始。
如果输入值在0-99范围之外,则调用@USERABLUP并返回@SHOW_JUEL。
从Emuera 1.705开始,没有办法改变这个范围。
除非在某处给出BEGIN指令,否则你永远无法从ABLUP中出来。
AFTERTRAIN
在执行BEGIN AFTERTRAIN后。

如果在@EVENTEND内没有执行BEGIN指令,就没有下一个进程可以执行,错误结束。
TURNEND
在执行了@BEGIN TURNEND之后。

如果在@EVENTTURNEND内没有执行BEGIN指令,就没有下一个进程可以执行,错误结束。
LOADGAME
当执行LOADGAME指令时。

BEGIN指令包含RETURN指令,BEGIN下面的语句从不执行,但LOADDATA和SAVEDATA指令与CALL指令一样返回原处。
然而,当LOAD被执行时,它就会忘记原来的位置并过渡到LOADDATAEND。
SAVEGAME
当@SAVEGAME指令被执行时。

调用@SAVEINFO的时机是在实际写完之前。
LOADDATAEND
在LOADGAME中执行了LOAD后,在执行了LOADDATA指令后。

当执行LOAD时,所有以前的状态,包括被调用的函数,都被擦除。
Eramaker 在这里什么都不做,就过渡到@SHOW_SHOP。
在 Emuera 中,如果@SYSTEM_LOADEND被定义,@SYSTEM_LOADEND将被执行。
如果BEGIN指令在@SYSTEM_LOADEND结束之前被执行,它就会过渡到那里。
否则,如果定义了@EVENTLOAD,就会执行@EVENTLOAD。
如果BEGIN指令在@EVENTLOAD结束前被执行,它就会向该方向移动。
如果BEGIN指令没有被执行,则照常过渡到@SHOW_SHOP。