動作角色扮演游戲的技能構(gòu)筑,表面看是內(nèi)容設(shè)計問題,直到組合開始爆炸式增長。
開發(fā)者分享了一個用Zig語言編寫的ARPG游戲引擎案例。技能、輔助寶石、物品、運行時規(guī)則,所有這些都需要組合生效。起初每條規(guī)則看起來都很單純:這個輔助加傷害,那個讓投射物穿透,某件裝備讓法術(shù)傷害作用于近戰(zhàn),某個狀態(tài)臨時增加屬性,某個詞綴給怪物加速,某件暗金改變規(guī)則。
![]()
然后組合出現(xiàn)了。
![]()
橫掃技能配合擴大范圍的輔助。橫掃配合縮小范圍但增傷的輔助。橫掃附加流血效果。橫掃配合雙子側(cè)擊。一個投射物技能同時帶有穿透、連鎖和分裂。一件裝備讓法術(shù)屬性作用于近戰(zhàn)攻擊。一個狀態(tài)臨時修改了已被裝備和輔助寶石動過的同一項屬性。
最直觀的解法是一堆特例代碼:如果技能是橫掃且輔助是闊刃,就擴大半徑;如果技能是橫掃且輔助是聚鋒,就縮小但增傷;如果技能是橫掃且輔助是雙子橫掃且規(guī)則是守護弧,就默默躲進樹林。演示版本可以這么干。一旦技能、輔助、物品、狀態(tài)和遭遇規(guī)則多起來,這套就崩了。
更可行的框架是:把Buildcraft當(dāng)成小型編譯器流水線。
策劃創(chuàng)作的內(nèi)容是源碼輸入。輔助、物品、狀態(tài)、詞綴、職業(yè)規(guī)則都發(fā)射事實(facts)。這些事實被折疊進派生緩存。戰(zhàn)斗系統(tǒng)消費緩存。
在這個設(shè)計里,技能結(jié)算時不該問"這是帶了闊刃的橫掃嗎?放在第3個輔助槽?"到技能結(jié)算時,這個問題已經(jīng)變成底層運行時數(shù)據(jù):增加傷害基點500,范圍半徑加成子單位1000,范圍橫掃輪廓默認(rèn),狀態(tài)負(fù)載數(shù)量0,更多乘數(shù)列表[...]。
![]()
策劃數(shù)據(jù)應(yīng)該保持枯燥。輔助定義不是可執(zhí)行的游戲代碼,而是詞匯表很窄的數(shù)據(jù)。輔助可以發(fā)射屬性修正和行為變更,就這個盒子。它不直接操作投射物存儲、調(diào)用戰(zhàn)斗系統(tǒng)、或給世界里的隨機字段打補丁。
一條輔助定義讀起來像內(nèi)容,不是行為代碼:技能域內(nèi)增加物理傷害;發(fā)射一個行為;行為是范圍半徑增量;只作用于帶近戰(zhàn)和范圍標(biāo)簽的技能。輔助可能插在橫掃旁邊,但發(fā)射的行為仍用內(nèi)部適用性標(biāo)簽說話。它說"近戰(zhàn)+范圍",不是說"調(diào)用橫掃實現(xiàn)并改它的半徑"。
未來技能可以和現(xiàn)有輔助規(guī)則配合,不用手動把每個技能連到每個輔助。這也保持了一個重要區(qū)分:玩家可見的標(biāo)簽和運行時適用性標(biāo)簽不必相同。
輔助編譯成行。技能槽變動時,舊的編譯輸出必須先銷毀,再發(fā)射新輸出。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.