流程图

翻译自原文档:https://osdn.net/projects/emuera/wiki/flowopen in new window

本章节所涉及的流程图是用 DiagramDesigneropen in new window 编辑的。流程图源文件文件在这里open in new window

后文除另有说明,否则句子的主语应是Emuera.exe

Title 标题流程

流程进入方式:

  • 自动:游戏引擎启动后会读取ERB文件,文件全部读取完成后,自动进入;
  • 手动:使用Begin Title语句手动进入。

@System_Title函数已定义,则调用它;若存在多个定义,则调用第一次读取到的定义。

如果@System_Title函数在Return之前,没有调用BeginLoadData命令,则会报错退出。

若没有定义@System_Title,就会执行后续的默认标题流程。

默认标题中的文字,如标题、版本、介绍、命令按钮(如[0]从头开始)等,都可以被改变,详见 _replace.csv

在这个界面中,若选择[0]从头开始,首先要做的就是初始化数据。如StrPrintLV的初始值(与ResetData命令同理),AddChara 0等。

然后自动执行Begin First命令。进入First流程。

若选择[1]加载存档,若已定义@Title_LoadGame函数,则调用。

若未定义,则显示默认加载界面。该界面与@LoadGame所调用的界面略有不同。

First 从头开始流程

流程进入方式:

  • 自动:在标题界面选择了[0]从头开始后,自动进入;
  • 手动:使用Begin First语句手动进入。

https://osdn.net/projects/emuera/wiki/flow/attach/first.gif

如果@EventFirst函数在Return之前,没有调用Begin命令,则会报错退出。

Shop 商店流程

注意

此处流程的名称具有迷惑性,虽然名称是商店,但其实并不是指游戏中的物品购买流程,而是游戏的行动主界面,即行动按钮最多的那个界面。一般来说,可以理解为行动按钮分层排列就像商店里的商品一样的那种感觉。

流程进入方式:

  • 自动:加载存档后自动进入;
  • 手动:使用Begin Shop语句手动进入。

如果该流程是从加载存档处进入,则不进行@EventShop处理。

@Show_Shop执行完毕后,等待输入,若输入序号在0~99内,则执行内置购买逻辑,若不在内,则调用@UserShop函数。这个数值范围可被改变,详见 _replace.csv

注意:@Print_ItemShop函数显示的项目范围是ItemNameItemSales中的项目数,以小者为准(标准是1000)。

购买时,要确定相应的ItemSales是否为非零,或者Money是否大于ItemPrice

若购买失败,则会要求再次输入。

在 Eramaker 中,如果购买失败,用户必须从@Show_Shop重新开始。

如果购买决策成功,将Item编号分配给Bought变量,将Item:Bought增加1,并通过ItemPrice:Bought减少Money

调用@EventBuy,返回@Show_Shop

除非调用Begin指令,否则你永远不会离开Shop流程。

TRAIN

流程进入方式:

  • 手动:使用Begin Train语句手动进入。

进入流程后,首先一些变量会被初始化,如:

  • AssiPlay:0 = 0
  • PrevCom:0 = -1
  • NextCom:0 = -1
  • TFlag = 0
  • GotJuelTEquipEXPalamSource中的所有角色都被设置为0。
  • 最后,为所有角色的STAIN:2分配2,为STAIN:3分配1,为STAIN:4分配8,为其他分配0。

当你离开Train流程时,这些值不会被初始化,所以如果你在Shop里保存,这些值会保留在你的保存数据中。

你可以通过@SaveInfo或其他方法将角色的GotJuelTEquipEXPalam等指定为0来保存保存数据的大小。

这里不解释NextCom的非负值的行为,因为它含有一个严重的 Bug。

Emuera 的NextCom是为了兼容旧代码而设计的,包括上述的 Bug,且并不打算用于新的用途。

关于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之后,输入前初始化UpDownLoseBase

然后等待用户输入。

输入的结果与@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指令被执行时,UpDown的值与TargetPalam相加和相减,并且UpDown的值都被分配为0。

如果输入的结果不是可执行的命令,则调用@UserCom并返回@Show_Status

除非调用Begin指令,否则你永远不会离开Train流程。

AblUp 升级流程

流程进入方式:

  • 手动:使用Begin AblUp语句手动进入。

https://osdn.net/projects/emuera/wiki/flow/attach/ablup.gif

调用@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函数在Return之前,没有调用Begin命令,则会报错退出。

https://osdn.net/projects/emuera/wiki/flow/attach/aftertrain.gif

TurnEnd

流程进入方式:

  • 手动:使用Begin TurnEnd语句手动进入。

如果@EventTurnEnd函数在Return之前,没有调用Begin命令,则会报错退出。

https://osdn.net/projects/emuera/wiki/flow/attach/turnend.gif

LoadGame

流程进入方式:

  • 手动:使用LoadGame语句手动进入。

Begin指令自带Return特性,Begin指令以下的语句从不执行,但LoadDataSaveData指令与Call指令一样,执行完毕后会返回原处。

然而,当Load命令被执行时,它就会注销原来的调用位置并进入到LoadDataEnd

SaveGame

流程进入方式:

  • 手动:使用SaveGame语句手动进入。

调用@SaveInfo的时机是在实际写完存档之前。

LoadDataEnd

流程进入方式:

  • 自动:LoadData命令执行完成后自动进入;
  • 自动:LoadGameLoad命令执行完成后自动进入;

当执行Load时,所有以前的状态,包括被调用的函数,都被擦除。

Eramaker 在这里直接过渡到@SHOW_SHOP

在 Emuera 中,如果@System_LoadEnd被定义,则调用。

如果Begin指令在@System_LoadEnd结束之前被调用,它就会过渡到那里。

否则,如果定义了@EventLoad,就会执行@EventLoad

如果Begin指令在@EventLoad结束前被执行,它就会向该方向移动。

如果Begin指令没有被执行,则照常过渡到@Show_Shop