開發(fā)團(tuán)隊(duì)的幕后工作:刀塔漫談 - 拆解炸彈
《DOTA2》開發(fā)團(tuán)隊(duì)于steam社區(qū)推出一則新的文字欄目《刀塔漫談》,第一期節(jié)目著重講了重做英雄“工程師” 。以下為原文翻譯。
隆重推出“刀塔漫談”,全新的特色博文,我們開發(fā)團(tuán)隊(duì)的成員會梳理在開發(fā)像Dota這樣獨(dú)特的游戲時(shí)遇到的一些挑戰(zhàn)、錯(cuò)誤修復(fù)還有偶爾令人莞爾的意外。
每次Dota的大更新都讓我們有機(jī)會在游戲中推出新英雄、物品和技能更不用說要對老的英雄、物品進(jìn)行無數(shù)的調(diào)整。 這讓Dota作為一款游戲不斷地發(fā)展,但也引入了無法估量的潛在交互。 雖然這意味著每場比賽中總會出現(xiàn)新的體驗(yàn),但也讓我們的部分改動更有可能偶爾帶來一兩個(gè)錯(cuò)誤。 或者二十個(gè)。
幸運(yùn)的是,Dota社區(qū)一直都在試驗(yàn)和探索,很快就能發(fā)現(xiàn)隱藏的優(yōu)勢,新的打法和徹底破壞游戲的漏洞,連我們都是措手不及。
工程師的粘性炸彈錯(cuò)誤就是一個(gè)極好的例子。 這個(gè)錯(cuò)誤的根源可以追溯到去年工程師的更新,當(dāng)時(shí)他們的技能和玩法得到了全面重做。 這次重做產(chǎn)生了工程師的粘性炸彈不會消失的錯(cuò)誤,在部分情況下還能被施放的玩家所控制。 不過有趣的是,在當(dāng)時(shí)的游戲機(jī)制下,這樣的錯(cuò)誤并沒有在比賽中出現(xiàn)的環(huán)境。 所以一直就這樣蟄伏著,直到今年春天的大展宏圖7.33更新里出現(xiàn)了雙生之門。
突然之間,工程師玩家可以制造可控的粘性炸彈,在地圖上任意移動,向敵方玩家無限傾瀉致命的炸藥。 這優(yōu)勢有點(diǎn)大了。 所以沒多久我們就在我們的GitHub上收到大量反饋。
在一般的游戲編程中常見的模式,特別是Dota中,創(chuàng)建(不會破壞游戲的)新東西是去找現(xiàn)有的(可以運(yùn)作而且不會破壞游戲的)相似物,利用它作為起點(diǎn)來加入改動。 粘性炸彈是基于經(jīng)典的工程師遙控炸彈。 他們是作為“npc_dota_techies_remote_mine”的召喚物來實(shí)現(xiàn)的和老的遙控炸彈NPC相同的NPC類型。
工程師的粘性炸彈使用的是“扔出”/“追逐”/“倒計(jì)時(shí)后引爆”的序列,由NPC上一系列服務(wù)器端的修飾符(狀態(tài))來管理,處理序列里每一步的單位動作和行為。 “追逐”和“倒計(jì)時(shí)”修飾符通過修飾符的狀態(tài)標(biāo)記來阻止玩家指令。 “扔出”修飾符是動作控制器,阻止多個(gè)類型的玩家指令,另外npc_dota_techies_remote_mine本身還具有特殊性質(zhì)(具體而言是給NPC設(shè)置的攻擊能力DOTA_UNIT_CAP_NO_ATTACK)。
由于遙控炸彈可以由工程師使用炸彈本身的技能手動引爆,遙控炸彈NPC被允許使用技能。 這意味著它自帶的標(biāo)記有,歸施法玩家所擁有(用于結(jié)算擊殺),同時(shí)可以被施法玩家控制。 右鍵點(diǎn)擊雙生之門(或者任何可以持續(xù)施法的地圖實(shí)體)的生效機(jī)制是把點(diǎn)擊后發(fā)動攻擊轉(zhuǎn)變?yōu)閷Τ掷m(xù)施法目標(biāo)的施放技能(持續(xù)施法時(shí)時(shí)對雙生之門進(jìn)行“施法”)。 其他地圖實(shí)體需要英雄才能持續(xù)施法。 但是,由于雙生之門還要被肉山使用,所以也允許非英雄單位進(jìn)行持續(xù)施法。
這就帶來了粘性炸彈的錯(cuò)誤:在粘性炸彈被扔出后在空中的極短時(shí)間內(nèi),如果玩家通過統(tǒng)一單位指令選中工程師和粘性炸彈后點(diǎn)擊雙生之門,炸彈也會對雙生之門持續(xù)施法。 這讓粘性炸彈進(jìn)入了持續(xù)施法的狀態(tài),終止了“扔出”并且破壞了修飾符的序列,導(dǎo)致產(chǎn)生意外的行為。
理解了這一切以后,解決的辦法就非常簡單了。 粘性炸彈不需要施法玩家可控制的屬性。 移除炸彈的這個(gè)標(biāo)記意味著修飾符的預(yù)期序列總是會按照原定的順序執(zhí)行,使炸彈最終得以爆炸。
與非常多的錯(cuò)誤一樣,修復(fù)錯(cuò)誤的99%時(shí)間里通常都是在排查。 真正的解決辦法一般都是改動一行代碼還有可能是為了修復(fù)之前的錯(cuò)誤編寫出來的同一行代碼。 (這就是為什么大家常說調(diào)試代碼就像是自己作為偵探調(diào)查一起兇手就是自己的謀殺案)。
所以,這就是粘性炸彈錯(cuò)誤如何意外出現(xiàn)的過程;它引發(fā)了短暫的混亂;我們注意到玩家的反饋后又是如何去修復(fù)。 接下來會發(fā)生什么? 好,現(xiàn)在我們就坐等,刪除了那行代碼修復(fù)了老的錯(cuò)誤后又會產(chǎn)生什么新的錯(cuò)誤。 如果碰巧發(fā)現(xiàn)了,歡迎發(fā)到GitHub上。
本文由:捕魚大作戰(zhàn)機(jī)械公司提供