心灵终结3.3.6地图编辑器萌新教程第9篇:触发的禁止和允许(三):异常情况的处理
在任务地图制作中,作者往往会设计一个“正常打法下”的通关方式,并且引导玩家按照自己想要的通关方式来打,或者期望正常战役能够按照自己的预期去发展。然而,在设计地图、编写触发的时候,我们还必须考虑一些可能会出现的“异常情况”,并且在自己的能力范围内尽可能去避免这种情况的发生。
“异常情况”的来源主要有两种。一种是任务本身可能会出现一些小概率的事件影响触发的判定条件,从而引发一些不合理的结果。另一种是玩家“整活”,故意不按套路来。当然,也可能是两者都有。对于第一种,我们需要在编写触发时充分考虑可能会出现的影响触发判定的“异常情况”,并通过适当的触发来避免;对于第二种,如果不鼓励“整活”,或者说任务本身流程不允许“整活”,否则会导致卡关,可以通过锁科技、封路等措施来避免;如果鼓励玩家“整活”,就需要像第一种情况一样通过触发等来避免“整活”可能带来的异常情况。
我们通过具体的例子来说明各种针对异常情况的应对方法,并体现“触发的禁止和允许”在这里发挥的作用。
例1:红警2原版“残兵败将”战役中的bug(接第4篇)
我们在“第4篇:触发的关联对象”中谈到了原版苏军第10关“残兵败将”这一关里的一个bug。任务目标一是“占领盟军作战实验室”,如果作战实验室在占领前被摧毁,就会判定任务失败;而一旦被占领,即使再被摧毁也不会判定失败。使用的“任务完成”判定条件为:进入事件,所属方为苏联(玩家),关联对象为盟军作战实验室。作者认为这里的“进入事件”就可以代表工程师进入。原版苏军不能造间谍,并且在这一关中即使玩家占领了盟军基地也不能造作战实验室,从而也不能造间谍,因此“正常情况”下,能“进入盟军作战实验室”的只有工程师。然而,这一关的一个小岛上有一个心灵突击队,只要玩家登陆这座小岛就可以获得他,心灵突击队对建筑的攻击方式是安装C4,而在原版中,像谭雅、海豹部队这样的在给建筑安装C4时会先“进入”建筑,然后建筑被炸毁(心灵终结中不存在这样的问题)。这就导致了如果玩家用心灵突击队炸毁作战实验室之后,仍然会在突击队进入实验室的一瞬间显示“任务目标一完成”,炸毁后也不会导致任务失败,从而出现不合理的情况。
我们可以通过给“任务目标一完成”这一触发添加适当的延迟,从而让心灵突击队炸毁实验室时,“实验室被摧毁”这一事件发生得比“任务目标一完成”这一事件早,从而避免这个bug,具体如下:
触发1:进入作战实验室
触发所属方:苏俄
条件:进入事件
结果:允许触发2
关联对象为作战实验室
触发2:任务目标一完成
初始状态:禁止
条件:流逝时间3秒(至少要长于从突击队进入建筑到建筑爆炸之间的时间间隔)
结果0:禁止触发3
其他结果与任务目标一完成相关(如文本提示等)
触发3:实验室被摧毁
初始状态:允许
条件:科技类型不存在,参数填盟军作战实验室(假设地图上只有这一个盟军作战实验室,并且作战实验室不可建造。注意这个条件是指任何一个所属方都没有该科技类型。不能换为“所属方不存在科技类型”并将触发所属方设为美国,否则当实验室被占领时也会满足该条件)。
结果0:禁止触发2(或者摧毁触发2)
其他结果与任务失败相关
这样的话,如果还用突击队炸作战实验室,当突击队进入实验室的一瞬间,触发1的条件满足,但结果仅仅是触发2被允许。此后3秒之内,实验室爆炸,触发3的条件满足,触发任务失败,此时触发2的结果还没有被执行就又被禁止。在整个过程中不会再出现任何与“任务目标一完成”相关的东西。不过,这样的触发还是有一点点小问题,就是如果玩家在占领实验室后的3秒内把实验室摧毁或卖掉,仍然会显示任务失败,与我们的“预期”——一旦实验室被占领,再被摧毁不算任务失败这一点不同。不过我觉得在3秒之内这种情况应该不会发生吧……
例2:自制战役《守护》第三关:“岂曰无衣”中的一些异常状况
这一关的任务目标是护送所有卡玛兹安全通过此区域(即开到地图可见区域外面)。所有卡玛兹是不受玩家指挥的,会按照设定的路线一直行进。后来,有一位朋友在试玩这一关时说所有卡玛兹全部卡在路中间不走了。我本来以为是动作脚本出了问题,后来细问才知道他在卡玛兹移动的时候用蜻蜓无人机给定住了,再松开的时候就不走了……后来解决办法简单粗暴,直接在内置ini里给卡玛兹加了一句免疫EMP的代码。但实际上,像这种护送任务,只要玩家愿意整活,卡关是轻轻松松的事,比如用围墙把卡玛兹的入口围起来。所以说,地图作者也不可能考虑到,或者即使考虑到了也不可能解决所有的“异常情况”。
这一关在制作时还有一处可能会出现异常状况的细节。本关总共会有6批卡玛兹,只要任何一辆被摧毁就会判定失败。本关的所有卡玛兹都被设定为拉丁同盟所属方,而地图上没有其他所属方为拉丁同盟的单位。因此,任务失败的条件比较容易控制:条件16:单位被摧毁X个,参数X为1,触发所属方为拉丁同盟。而当6批卡玛兹全部安全驶离地图时判定任务成功,触发判定条件为:条件82:所属方不存在科技类型,参数为卡玛兹,触发所属方为拉丁同盟。该触发初始处于“禁止”状态,当最后一批卡玛兹进入战场之后被允许(想想为什么要这样?)。
但如果是这样的话,可能会发生这样一个事件(虽然概率很小):如果最后一批卡玛兹只剩下最后一辆没有驶离地图,而这辆卡玛兹被摧毁了,会怎样呢?这时任务失败的条件被满足了,因为拉丁同盟的单位确实被摧毁了1个;而任务成功的条件也被满足了,因为此时“任务成功”的触发已经处于允许状态,而场上也确实没有拉丁同盟的卡玛兹了。根据任务要求,此时任务应该是失败了,所以我们要想办法避免这种异常情况。一种解决方法可以模仿例1,即新建一个触发A,将原来“任务成功”的触发中的所有结果挪到触发A的结果中,触发A的条件为“流逝时间若干秒”,然后原来的“任务成功”的触发只设一个结果,就是“允许触发A”,同时在原来“任务失败”的触发中新添一个结果:“摧毁触发A”。这样若再出现这种情况,与任务完成有关的触发A会在触发之前被摧毁。.
以上我们通过例子说明了“触发的禁止和允许”的一个应用:处理异常情况。从上面举的例子来看,这种异常情况的出现通常是因为:有若干个事件(起因)都会分别引发某个触发的条件,而实际上我们想要的真正的“起因”只是其中之一。这时,我们可以通过延时并且适当地设置允许或禁止触发,来“识别”这些不同的“起因”,从而避免异常情况的发生。