隆重推出“刀塔漫谈”,全新的特色博文,我们开发团队的成员会梳理在开发像Dota这样独特的游戏时遇到的一些挑战、错误修复还有偶尔令人莞尔的意外。
每次Dota的大更新都让我们有机会在游戏中推出新英雄、物品和技能——更不用说要对老的英雄、物品进行无数的调整。 这让Dota作为一款游戏不断地发展,但也引入了无法估量的潜在交互。 虽然这意味着每场比赛中总会出现新的体验,但也让我们的部分改动更有可能偶尔带来一两个错误。 或者二十个。
幸运的是,Dota社区一直都在试验和探索,很快就能发现隐藏的优势,新的打法和彻底破坏游戏的漏洞,连我们都是措手不及。
工程师的粘性炸弹错误就是一个极好的例子。 这个错误的根源可以追溯到去年工程师的更新,当时他们的技能和玩法得到了全面重做。 这次重做产生了工程师的粘性炸弹不会消失的错误,在部分情况下还能被施放的玩家所控制。 不过有趣的是,在当时的游戏机制下,这样的错误并没有在比赛中出现的环境。 所以一直就这样蛰伏着,直到今年春天的大展宏图7.33更新里出现了双生之门。
突然之间,工程师玩家可以制造可控的粘性炸弹,在地图上任意移动,向敌方玩家无限倾泻致命的炸药。 这优势……有点大了。 所以没多久我们就在我们的GitHub上收到大量反馈。
在一般的游戏编程中常见的模式,特别是Dota中,创建(不会破坏游戏的)新东西是去找现有的(可以运作而且不会破坏游戏的)相似物,利用它作为起点来加入改动。 粘性炸弹是基于经典的工程师遥控炸弹。 他们是作为“npc_dota_techies_remote_mine”的召唤物来实现的——和老的遥控炸弹NPC相同的NPC类型。
工程师的粘性炸弹使用的是“扔出”/“追逐”/“倒计时后引爆”的序列,由NPC上一系列服务器端的修饰符(状态)来管理,处理序列里每一步的单位动作和行为。 “追逐”和“倒计时”修饰符通过修饰符的状态标记来阻止玩家指令。 “扔出”修饰符是动作控制器,阻止多个类型的玩家指令,另外npc_dota_techies_remote_mine本身还具有特殊性质(具体而言是给NPC设置的攻击能力DOTA_UNIT_CAP_NO_ATTACK)。
由于遥控炸弹可以由工程师使用炸弹本身的技能手动引爆,遥控炸弹NPC被允许使用技能。 这意味着它自带的标记有,归施法玩家所拥有(用于结算击杀),同时可以被施法玩家控制。 右键点击双生之门(或者任何可以持续施法的地图实体)的生效机制是把点击后发动攻击转变为对持续施法目标的施放技能(持续施法时时对双生之门进行“施法”)。 其他地图实体需要英雄才能持续施法。 但是,由于双生之门还要被肉山使用,所以也允许非英雄单位进行持续施法。
这就带来了粘性炸弹的错误:在粘性炸弹被扔出后在空中的极短时间内,如果玩家通过统一单位指令选中工程师和粘性炸弹后点击双生之门,炸弹也会对双生之门持续施法。 这让粘性炸弹进入了持续施法的状态,终止了“扔出”并且破坏了修饰符的序列,导致产生意外的行为。
理解了这一切以后,解决的办法就非常简单了。 粘性炸弹不需要施法玩家可控制的属性。 移除炸弹的这个标记意味着修饰符的预期序列总是会按照原定的顺序执行,使炸弹最终得以爆炸。
与非常多的错误一样,修复错误的99%时间里通常都是在排查。 真正的解决办法一般都是改动一行代码——还有可能是为了修复之前的错误编写出来的同一行代码。 (这就是为什么大家常说调试代码就像是自己作为侦探调查一起凶手就是自己的谋杀案)。
所以,这就是粘性炸弹错误如何意外出现的过程;它引发了短暂的混乱;我们注意到玩家的反馈后又是如何去修复。 接下来会发生什么? 好,现在我们就坐等,删除了那行代码修复了老的错误后又会产生什么新的错误。 如果碰巧发现了,欢迎发到GitHub上。