心灵终结3.3.6地图编辑器萌新教程第22篇:全局变量
前两篇中我们讲了局部变量的原理与应用。与“局部变量”相对应的是“全局变量”。我们在刚开始介绍局部变量时就说过:“局部”的含义是:只能在一张地图中使用。在地图A中建立的局部变量,不能在地图B中使用。而“全局变量”顾名思义,是可以被所有地图共同使用的变量。当然,它的取值和“局部变量”相同,也是只能取0和1,取0时称这个全局变量处于“被清除”的状态,取1时称这个全局变量处于“被设置”的状态。
一、如何创建全局变量
全局变量的创建和局部变量不同。在地编的“编辑”栏中只有“局部变量”没有“全局变量”,这其实也很好理解:既然全局变量是所有地图都可以共用的,那么它就不可能是在某一张地图内创建的。创建全局变量需要修改根目录中的rulesmo.ini,在最后可以看到[VariableNames]小节,这就是创建全局变量的地方。官方已经使用了0-13这14个全局变量,我们从“14=xxx”开始创建。比如我在此创建了“14=Guard”和“15=test”这两个全局变量。然后保存文件。

顺带一提,这样创建出来的全局变量初始值为0,我们并没有办法像创建局部变量一样把它的初始值设置成1。不过这一点不会有任何影响。
二、全局变量的基本原理
首先,全局变量能不能像局部变量那样,只用在一张地图中呢?可以,也不建议这样。能用局部变量解决的问题,就不要那么麻烦地使用全局变量了。之后我们举的也都是在不同地图中使用全局变量的例子。
首先我们新建两张地图,分别命名为test1.map和test2.map,给两张地图都新建关卡入口,并且把它们连起来,也就是test1这一关任务完成后可以直接进入test2。如果你不知道怎么新建关卡入口以及怎么进行关卡之间的连接,可以去看下面这篇专栏:

然后,我们在test1.map中新建两个触发。触发1的条件为“流逝10秒”,结果选“28:设置全局变量”。如果你之前已经正确地创建了局部变量并保存文件,那么你就可以看到参数值的选项中有“15-test1”,选择即可。如果没看到,可以把地编关了再打开。触发2条件“流逝20秒”,结果“胜利者是玩家所属方”。

然后,在test2.map中新建一个触发:条件1为“27:全局变量被设置”,参数值选“15-test”,条件2为“流逝时间10秒”,结果为“文本触发事件”。
最后我们进入test1游戏中,20秒后任务完成,通过评分屏界面进入test2,经过10秒就可以看到触发的文本,说明test这一全局变量已经被成功设置。
三、全局变量在心灵终结中存在的问题
以上我们通过示例说明了全局变量的工作原理,其实和局部变量相同,都是用“设置/清除全局变量”这两个触发结果和“全局变量被设置/被清除”这两个触发条件来对触发事件进行控制,只不过“设置全局变量”和“全局变量被设置”这两个触发不在同一张地图中。下面我们再进行一些试验:以下试验中,“触发文本”说明全局变量为1,“不触发文本”说明全局变量为0.
1、在选关界面直接进入test2,10秒后不触发文本。
2、进入test1,经过15秒(此时全局变量已经被建立,但是还没有任务完成),退出,从选关界面进入test2,10秒后不触发文本。
3、进入test1,任务完成之后通过评分屏进入test2,5秒后退出,再从选关界面进入test2,10秒后不触发文本。
4、进入test1,任务完成后通过评分屏进入test2,5秒后退出。然后从“载入存档”进入test2(每一关开始时都会有一个自动存档),10秒后触发文本。
5、进入test1,任务完成后通过评分屏进入test2,5秒后存档并退出。然后从“载入存档”进入刚才的存档,则再过5秒后触发文本。
6、进入test1,任务完成后通过评分屏进入test2,5秒后存档为A并退出;然后从选关界面进入test2,5秒后存档为B并退出;然后载入存档A,5秒后显示文本;再载入存档B,5秒后不显示文本。
通过以上的试验,我们可以看出来,全局变量在实际使用过程中可能会存在一些问题。具体来说:比如打完了第1关,通过评分屏进入第2关(评分屏界面没有“退出”按键,所以即使你不想打了也必须先点“继续”进入第2关,然后再退出,不考虑任务管理器结束进程、直接拔电源等情况),然后退出。此时会有一个第2关开头的自动存档。第二天你想打第2关时,有两种方法:第一种是通过“载入存档”读取第2关开头的自动存档,第二种是在选关界面直接进入第2关。这两种实际上是有区别的,如果和其他众多可以存档的游戏进行比较的话,第一种就相当于是“继续之前的游戏”,第二种就相当于“开始新游戏并跳过第1关”。第一种方法会保留之前的全局变量信息,第二种方法则会将所有全局变量设定为初始值,也就是0。这就是为什么在上面的试验中,“载入存档”可以显示文本,而“直接选关”就不可以。另外,上面的试验6也表明:不同的存档之间全局变量信息是互不影响的。
这也解释了为什么红警2原版和尤里的复仇中经常使用全局变量而心灵终结中很少使用。在红警2原版中比较著名的使用全局变量的例子是:在盟军第3关“为长官欢呼”中,如果你摧毁了一些地标建筑,那么在盟军第6关这些建筑就不会再出现(当然,前提是第6关和第3关是同一个存档)。在尤里的复仇任务包“林德拉克计划”中,作者使用了全局变量来设计支线任务。这是因为原版和尤里的复仇中没有“选关”界面,而评分屏点“继续”、载入存档、任务失败后“重新开始本关”都算是“延续之前的存档”,所以不会出现上面说的第二种情况。而心灵终结有选关界面,所以使用局部变量可能达不到预期的目的。
四、全局变量应用举例
下面我举一个我自己制作任务过程中使用全局变量的例子。在《守护》第12关结束之后,和官方战役类似,会进入一个“结局”。如果玩家在第12关第1阶段正常摧毁了时间机器,那么就会进入“正常结局”;如果玩家在第12关占领并保护了时间机器,就会进入“隐藏结局”。首先要指明的是:“结局”并没有出现在选关界面,也就是说BattleClient.ini中没有任何关于这一张地图的信息,但是在missionmo.ini和mapselmo.ini中仍然需要像杂谈3中提到的那样写,这样做的结果是:第12关任务完成之后可以进入结局,但是不能直接从选关界面进入结局。这样就避免了前面说的问题。这里用到的全局变量就是前面展示的“14=Guard”,在第12关中将时间机器被占领作为条件,设置这个全局变量,在结局的开头判断该全局变量是否被设置,并触发相应的结果即可。
