条顿武士 发表于 2013-12-18 08:51:37

自制战役的测试与Bug排查教程

自制战役的测试与Bug排查教程

帝国时代二的地图编辑器,总体来说结构比较简单,也比较容易上手。通过初级宝典的学习,研究几个成品战役的场景档案(.Scx),便可以大致掌握地图编辑器的基本技巧。然而,这个结构简单的编辑器,在Bug排查和测试方面的功能却并不全面;触发正确性检查、测试中即时编辑等功能的缺失,不免给制作者们带来了很多麻烦。刚刚接触战役制作的朋友在制造出一部成品战役后,大多都会遭遇到“Bug查找难”、“测试耗时”、“平衡性难以控制”等尴尬的局面。
从十年前帝国2自定战役兴起以来,战役的测试和Bug排查,都是需要制作者长时间的经验积累、在Bug的荆棘中摸爬滚打,方能慢慢摸索出的门道和技巧;从没有出现过系统全面的教程和心得,以至于新人作者在面对众多Bug的成品后,不免会由于缺乏相应的经验和技巧,变得不知所措、被水淹没(误)。
然而,在战役制作辅助工具不断增多、设计理论不断完善的今天,有许多技巧和工具可以在测试与Bug排查时很好地被利用起来,帮助新人作者尽快上手,也给老作者们一些新的思路和启发。这里我就打算推介一些优秀的工具,结合一些经验化的技巧,尝试着写一篇关于战役测试和Bug排查的教程。
以上是开场白,下面我们将从战役制作前,战役制作中,以及战役完成后三个阶段入手,进行具体地介绍。先是给大家展现一个科学的流程,从根源上减少Bug出现的可能性;再进行战役制作后的测试相关技巧。请大家记住~我们的目标是:平衡5分,没有Bug。
一、战役制作前:
必要工具:
翔鹰版帝国时代:语言翻译得更准确,文件更完整规范,修复负号触发和新触发条件不可点选的BUG,减少制作过程出错几率;结合Userpatch,可实现编辑器内自由放置单位、条件效果清单上显示其内容等强大功能。https://www.hawkaoe.net/bbs/thread-114379-1-1.html


帝国触发工作室(AOKTS 1.0.0):带有基础的触发正误检测功能。https://www.hawkaoe.net/bbs/thread-110368-1-1.html


变速齿轮:节省重复测试过程中花费的时间。


AOCEditor:即时修改内存数据,可在流程测试中灵活使用以减少重复测试的次数。



设计规划:
做大型战役,或者有复杂系统的战役时,务必在地图开始动工之前,做好设计和规划。 一是划分地图区域,预留出足够的触发系统区域(如通过建立物件实现的统计系统、升级系统;通过巡逻、冲车实现的随机系统等),并合理规划每个关卡任务所要占用的大致空间。 二是做好触发规划,先对需要制作的关卡有个整体的构思,然后尽可能将系统触发、任务栏触发、区域限定触发、集中修改单位名称状态的触发统一制作并尽量放在触发列表的前面,以方便战役制作过程中随时调整和检查。

二、战役制作中:
地图方面——
为了防止由于地图设计不当导致的种种测试跳出的Bug,请注意以下几点:
一、给每个使用到的玩家一个续命单位,如地图角落里的“马”或“村民”。这样做一方面为了防止玩家失败,另一方面,如果存在一个已开启的玩家在地图上不存在任何属于它的单位,而且地图上没有3X3大小的平坦空地让编辑器在测试时自动生成该玩家的城镇中心,就会导致测试跳出。
二、注意使用AOKTS、上下法或者Ctrl+S的密铺功能时,放置单位不要超出地图边界;换言之,在地图边界区域慎用密铺和上下法,否则有可能会导致测试跳出甚至在编辑器中直接跳出,地图边界处的山脉和树木经常会导致这样的问题。
三、使用旧版重组资料库制作战役时请注意区分建筑物的名称和对应单位,推荐使用新重组资料库,以免将“需要发挥功能的建筑”错放置为只有装饰作用的“时代建筑”。
四、善用AOKTS的地图扩大和单位替换功能。在AOKTS的地图选项卡中可以随时更改地图尺寸且不影响已经放置在地图上的单位,但注意地图只能向右扩大,所以建议绘制地图时从左边开始着手。另外,在AOKTS的单位选项卡中,可以选中单位列表中某玩家的一个单位,并通过右侧列表转换为该玩家的任一其他单位,想要更换已有触发关联的单位时,用此方法可以不破坏触发关联防止Bug出现。

触发方面——
触发是战役的灵魂,而严谨科学合理的触发结构并不是每个制作者都能完全掌握的。触发的设计和程序代码设计本身十分类似,所以可以通过程序编写的一般思路,注意以下几点提示来减少Bug产生的可能性。所以说大家常说,触发做得妙,程序一定编得好,Bug也会相应减少,也就一定没有女朋友。(哼,才没有逻辑混乱呢~)
一、简化触发:
(1)减少多余的激活和关闭效果效果[激活触发]众所周知,触发由条件(状况/“反对”)和效果组成。触发按照达成条件执行效果的规则运行(如果IF——则THEN),而“执行”本身也可以理解为“激活”(或开启)。你希望游戏中满足什么样的条件出现什么样的效果,只要是同时的,就可以放在同一个触发里面,不需要分开后再用效果去激活。一般来说,如果你用[激活触发]效果开启一个没有任何条件的触发,那么你就是多此一举了,你完全可以将这两个触发合并成一个触发。效果[关闭触发]另外,由于触发本身不循环执行一遍后就会关闭,所以在设计触发时不需要建立[关闭触发]效果来关闭自身。一般地,[关闭触发]效果有以下三种用途:(一) 关闭循环触发。 (二) 关闭已经被激活(或本来就开启了),但条件尚未触发效果(即条件未达成)的触发。(三) 移除任务栏的指示。
(2)减少效果群的重复先举个例子:当大家在设计一个援军增援的触发效果时,可能需要在多种条件下都能可发援军增援的事件,于是便会出现在多个触发中重复使用大量[产生物件]的效果群,选择单位、设定区域将带来大量的重复操作,也很容易由于视觉疲劳导致设定失误。所以,在效果群需要被多次调用时,将效果群单独列为一个新触发,并在各种需要调用的条件下用[激活触发]来开启这些效果群,是十分实用的一条设计技巧。这点与上述的减少[激活触发]效果并不矛盾,需要根据情况选择最优的触发简化方法。
二、分类触发:
(1)系统触发与常开触发如果在战役开始动工之前已经做了初步的触发规划,那么系统触发作为贯穿全局都需要频繁调用且不宜频繁更改的触发可以单独分类出来最先开工。例如:任务栏触发、随机器触发等。除去系统触发之外,还有一些贯穿全局,或是与战役初始设定有关的触发,可以单独作为一个分类,将状态调为“开启”并最先做成。例如:循环指派冻结单位、贯穿全局的失败判定、初始的名称状态改变、初始的建筑物外观调整(着火、移除城墙或栅栏的桩子)等。在战役过程中,每个关卡可能还会有需要单独设计这类触发,那么在该关卡的触发系列中,也建议将“系统触发”和“常开触发”单独列为独立触发,并通过控制触发一同激活和关闭。
(2)且条件与或条件大家都知道,一个触发内设置多个条件,他们的关系是“且(AND)”关系,即所有条件必须全部打成才能开启触发内的效果。而如果想实现分支事件,就必须使用“或(OR)”关系的条件,即将条件分属于多个触发并控制在一个分支条件达成时关闭带有其他分支条件的触发。众所周知的三联逆向触发,严格来说也属于“或(OR)”关系条件的应用。所以在设计“或(OR)”关系条件的触发群时,需要将其与一般触发单独分类列出,并在关闭触发时仔细检查,不要让忘记关闭的分支条件引起严重的Bug。

三、标识触发与备用触发:
一般来说,大型战役的特点就是触发复杂、数量庞大,而没有一定量的触发支持,战役是很难成为精品的。复杂数多的触发容易出现BUG,也常常需要修改,这就要求合理地给触发命名及整理。常用的命名整理的技巧如下。
(1)分隔符: 触发是按照战役中的任务制作的,一般来说,每个任务会有相应的配套触发、触发系统,同一个任务的触发会聚集在一块。我们可以把不同的任务的触发用一个没有任何内容的红色出发分隔开,用“==========”之类作为触发名称,最好在中间写上任务名称。这样修改触发时就能较快地找到你要找的任务的触发区。而任务区之下可能会有一些不小的触发系统。比如说连续的对话等,可以用“---------”之类分隔开,另外,空触发也是不错的分隔符,将触发名称清空使其变为不可选状态,便可在一些小的触发系统中充当分隔符了。
(2)名称前缀:触发的编号不会因移动位置而改变,在[激活/关闭触发]列表中查找起来比较麻烦,特别是中文名称的触发,十分难以辨认。如果我们把建立触发时自动生成的“触发事件 XXX”的“触发事件”四个字删掉,只留数字。便可在[激活/关闭触发]列表中,可以直接点键盘上该触发的开头数字来查找,会快捷方便很多。同样,你也可以在每个触发的名字前加上触发名的拼音或英文的头一个字母做前缀,查找的时候直接通过键盘键入字母即可。
(3)触发描述:不作为任务栏的触发中,触发描述的文本框可以作为触发设计的备忘录来使用,本触发内暂时没有完成的效果、不可点击的效果、需要多次测试更正的条件,都可以写在触发描述中,以便在长期且间断的制作过程中不至于因为思路中断而产生设计上的BUG。
(4)备用触发:战役制作者设计战役时常常会遇到这样的问题:突然觉得之前完成的一个部分需要增加一个触发,结果只好新建一个触发,然后多次点击“↑”按钮把触发移动到相应的位置,甚至干脆不调整位置,放在原地。这样的做法很容易导致触发混乱,新建的触发即便移动到正确的位置,其“排序编号(隐藏属性)”是不会变的,表现在[激活/关闭触发]列表中的位置。如果一个后来补充的触发距离相应任务的触发群较远,检查触发、修改BUG时会造成一定的麻烦。[激活触发]没有设置正确,是导致战役断节的常见原因,特别在连续的对话“电影”中更是如此,如果需要激活的触发上一个下一个,顺序混乱,设置[激活/关闭触发]时就非常麻烦,难以查找且容易出错。为了让同任务的触发尽量地靠近,顺序尽量正常,我们可以在做战役时,时不时地留几个空触发作为备用,这样需要的时候就不用调远水救近火了。

四、触发检测与控制器触发:
(1)触发检测:在触发设计完成后,可以使用AOKTS打开场景,进入“触发”选项卡,查看AOKTS的触发检测情况。列表中有红叉的触发,就代表存在可能的问题,如:效果没有选中目标单位,或者效果尚未设定类型。这时候双击点开触发可以进行修正和编辑,有红叉的效果/条件也同理。不过,AOKTS的触发检测并不认可群体圈选的效果,会将这类触发判定为“红叉”即错误触发,如果在编辑器中已经确定这类触发的设置无误,此处可以无视。另外,很多玩家会用到“广义效果”,即不设置目标单位也不设置目标区域的效果,例如将玩家二的所有长枪兵改变所有权给玩家一,增加改变玩家一所有单位的攻击力等,这类效果很有可能会由于目标数量过大而导致跳出游戏,所以在AOKTS的触发检测中会被判定为错误触发,如果设计者确定这类触发不会出现问题,此处也可以忽略其检测结果。当然,AOKTS的触发检测只是“语法条件”层面的检测,由于触发结构而产生的问题需要在后续的测试中不断查找才能解决。
(2)辅助触发:灵活的设置辅助触发,可以有目的地控制测试的方向,方便在测试的时候查找Bug。例如在复杂的触发系统中加入[送出聊天]的触发效果,用来判断相关触发的激活时机;亦或是在未经平衡性测试的关卡中加入大幅度增加玩家单位能力的触发,以防止测试者由于难度设置过高而卡关等。
(3)控制器触发:在多关卡或多任务的战役中,通过上述的触发分类,我们需要一个控制关卡所有相关触发激活与关闭的控制器触发。即在单个关卡设计时,将有所这个关卡任务所需要的触发的初始状态都设置成否(不开启),然后通过一个触发中的[激活触发]效果来开启所有其他触发。设置这种控制器触发的一个最大好处,便是可以通过开启和关闭相应的控制器达成分段测试战役的目的。翔鹰小组的合作战役“天龙八部”便要求每个作者将自己设计的部分通过一个控制触发来开启关闭,做到不同关卡之间的独立与互不干扰,测试和统筹都十分的方便。

文档方面——
常见的由于战役之外的其他文件导致的Bug包括AI错误与播放音乐文件跳出。AI出错时,游戏开始后会弹出对话框并给出提示,错误所在的行数的错误原因都是给出,排查起来比较容易。播放音乐跳出的问题,已由孟雨经过测试给出了最终解释。播放音乐使帝国崩溃的情况只与带有ID3标签的Mp3有关,而与位元速率无关。在帝国中设置播放音乐文件之前,使用Foobar 2000等音频编辑工具,删除掉MP3文件的ID3v2标签或者选上ID3v1标签即可。具体可以参考:https://www.hawkaoe.net/bbs/thread-114012-1-1.html对于战役文件本身,切记多多备份,分阶段保存,以防文件损坏或文件丢失导致自己的努力和心血付诸东流。

附录:来自狂~剧情狂的跳出Bug原因总结——
测试剧情中途跳出游戏,这通常是和剧情本身之设定失误有很大的关系。以下列出所有可能导致这种状况的失误:.「指派物件」效果 「指派物件」效果的「设定物件」或「设定目标」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。另一方面,对大量的单位使用「指派物件」效果也会造成过大的负荷以致游戏无法承受。.「毁灭物件」效果 「毁灭物件」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。另一方面,对大量的单位使用「毁灭物件」效果也会造成过大的负荷以致游戏无法承受。.「移除物件」效果 「移除物件」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。另一方面,对大量的单位使用「移除物件」效果也会造成过大的负荷以致游戏无法承受。.「改变视野」效果 同时执行二个或以上的「改变视野」效果,又或「改变视野」的「设定目标」距离当时玩家所处的位置太远。.「卸载」效果 「卸载」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。.「改变所有权」效果 「改变所有权」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。另一方面,对大量的单位使用「改变所有权」效果也会造成过大的负荷以致游戏无法承受。.「巡逻」效果 「巡逻」效果的「设定物件」没有设好。.「冻结单位」效果 「冻结单位」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。.「摧毁目标」效果 「摧毁目标」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。另一方面,对大量的单位使用「摧毁目标」效果也会造成过大的负荷以致游戏无法承受。.「改变目标名字」效果 「改变目标名字」效果的「设定物件」没有设好。.「改变目标的生命值」效果 「改变目标的生命值」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。另一方面,对大量的单位使用「改变目标的生命值」效果也会造成过大的负荷以致游戏无法承受;而当一个单位的最大生命值超越32767的上限后,亦有可能出现跳出游戏现象。.「改变目标的攻击力」效果 「改变目标的攻击力」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。另一方面,对大量的单位使用「改变目标的攻击力」效果也会造成过大的负荷以致游戏无法承受;而当一个单位的攻击力超越32767的上限后,亦有可能出现跳出游戏现象。.「停止部队」效果 「停止部队」效果的「设定物件」没有设好,又或由于没有进行任何设定,以致对象成为地图上所有大地之母的物件。.「开启城门」效果 「开启城门」效果的「设定物件」没有设好。.「关闭城门」效果 「关闭城门」效果的「设定物件」没有设好。.非触发事件效果 地图上放置过多的单位,或在测试剧情途中对过多的单位下达指令。

三、战役完成后:

战役完成后,作者务必亲自对自己的作品进行一次流程完整的全面测试。这是内测阶段。测试时所抱持的原则应该是:先流畅,后平衡。即首先保证游戏流程顺畅,不会由于触发结构等问题导致卡关和程序崩溃等情况。在这个阶段,可以利用设计好的辅助触发或者AOCEditor配合变速齿轮进行多次的检查。遇到有分支事件设计的关卡,作者需要尝试所有可能的分支以保证游戏过程流畅。在流畅性初步保证的前提下,设定难度分级,并在合适作者自身的难度下进行平衡性的内测,保证战役的难度分级中,至少有一个难度可以被作者自身通关。如果作者设计的是多关卡战役,可以通过上述的控制器触发进行分段测试,以节省测试时间。
由于作者在经历自己的设计时不可避免的会产生思维惯性,即按照自己设想的玩法来通关,但是对于其他不清楚作者设计思路的玩家来说,很有可能会产生不同的玩法和通关路线,这时便需要在作品发布前找一些朋友进行小范围内的测试。测试员的选择,尽可能囊括操作一般的新手玩家、操作精湛的骨灰玩家、以及思路活跃有制作经验的玩家。前两种测试员可以对难度和通关路线进行有效的评估,而后一种测试员可以站在制作者的角度发散出不同的思路,并可以看出游戏流程中的Bug和不合理的地方,直接向作者指明甚至给出改进方法。
最后便是将作品发布在论坛上,供有精力玩赏的玩家先行下载,接受玩家的反馈,进入公测阶段。这个阶段可能是Bug和平衡性问题被诟病最多的阶段,作者要虚心接受玩家的反馈意见并及时对作品进行修正。罗马不是一天建成的,好的作品也需要不断的修缮和打磨,在不断更新版本号的过程中获得更多的经验,进行更多的反思,方是做成经典作品、成为战役制作的大师的必经之路。

以上,全文完。

本教程参考了
CCC_大智的《触发优化设计》
Ikarus的《有关战役制作中bug的排查方法几则》

天日 发表于 2013-12-18 09:58:44

在工具、技艺日益成熟的今日,复杂的战役带来复杂的问题,但问题排查的方法也渐成系统。强烈推荐有战役野心的坛友研读。

另,针对“触发做得妙,程序一定编得好,Bug也会相应减少,也就一定没有女朋友”这句,TT给出了典型的例子,大家参看附录《来自狂~剧情狂的跳出Bug原因总结》。。。

VicViper 发表于 2013-12-18 10:17:34

T神你太伟大了,最近正需要一个这样的教程呢

十分感谢!{:155:}

AMO 发表于 2013-12-18 11:54:20

还有一点我觉得可以考虑加进去,就是经常测试、多测试,每做一小节就测试一下。否则很容易造成游戏中跳出而不知道哪个触发导致的……我自己就经常这样。
很全面很好的教程,留着假期慢慢看,先前排留名~

knight★银月 发表于 2013-12-18 13:21:50

TT我爱死你了!

M.I.K.U. 发表于 2013-12-18 17:22:02

受教了{:164:}

W.Claudius 发表于 2013-12-18 18:38:33

阿姨洗铁路!

Howerds 发表于 2013-12-18 20:04:21

{:379:}怪不得本少没有女朋友

我了个丢丢 发表于 2013-12-18 21:45:03

Howerds 发表于 2013-12-18 20:04
怪不得本少没有女朋友

楼上正解!怪不得TT.这么有时间。话说TT.都二十了吧

逸轩帝国制作组 发表于 2013-12-18 22:54:15

凑个热闹
LS的一切全都是来水的(一猜就是)
备用触发倒是个好主意,这个不错不错
控制器也打开了思路
现在最需要的就是有人能续写触发工作室,那个东东还是很局限的,基本上测试的时间是制作的时间的2倍

话说提个问题,帝国2有预加载的可能么?因为在某个场景中偶然发现,每隔1秒增加200生命上限,在大约3W600~3W1400的时候就会跳出,而如果设定为每隔30秒便3W2600之后才会爆

而且貌似在开始1~2秒内是很难执行触发的

铁血帝国战士 发表于 2013-12-20 10:48:45

{:153:}好文,顶一个,必需滴…

爱德华先生 发表于 2013-12-24 16:43:35

刚刚看完,忽然 觉得自己做的战役好草根或者说是“野”战役,完全都是靠自己的认识来做。
这个帖子很赞{:155:}
页: [1]
查看完整版本: 自制战役的测试与Bug排查教程