20年,1人寫出70萬行代碼!沙盒游戲「鼻祖」13年靠玩家捐贈維生
一款游戲,讓一位玩家皈依佛教。
這位玩家曾寄信開發者,因其開發的游戲理解了「眾生皆苦,世事無常」。
究竟是什么游戲還能讓人看破紅塵?
Dwarf Fortress (矮人堡壘)!

在Roguelike游戲界,你一定不要錯過大名鼎鼎的矮人堡壘!
2006年面世的矮人堡壘可以說是「開創類的老游戲」,就連《我的世界》開發者們表示自己深受這款游戲的啟發。
你可知這個游戲背后的開發者如何將其建造出來?
矮人堡壘是由Tarn Adams(又名Toady One)一人開發,20年來,親自寫下70萬行代碼!
最「現實」的游戲,最有理想主義的開發者
Tarn Adams 從2002年開始就在矮人堡壘工作。最初,它只是一個兼職項目。
從2006年開始,Adams一心投入,自己編寫所有的代碼。
期間,Adams的兄弟還幫助他來設計和創建基于游戲的故事。
圖右為Tarn Adams
目前,他正在開發一個帶有像素圖形和改進用戶界面的版本,可以在Steam上購買。
近13年來,矮人堡壘并未在任何游戲平臺上發售,這是因為「亞當斯兄弟」的信念。
他們希望這款游戲和市面上發布的商業版本有所不同,并且矮人堡壘也要以10年為單位,一直更新下去。
對于這漫長的更新,這對兄弟表示并沒有任何規劃。
「想到哪,做到哪。」
開發后的游戲不賣錢,穩定的收入從何而來?
全靠玩家捐贈維持生計!據說,亞當斯兄弟每個月可以有幾千美元的捐贈收入,足以維生。
許多游戲玩家為此憤憤不平,但他們卻表示,「我們只是不想成為商人,賺錢對我們來說沒有意義」。
他們開發了最「現實」的游戲,卻是最有理想主義的開發者。
沙盒游戲「鼻祖」,70萬行代碼,亞當斯兄弟自述
矮人堡壘至今已持續開發20年,有3種游玩模式。
1、要塞模式(Fortress mode):玩家要幫助一小群矮人從無到有建造城市。
2、冒險模式(Adventure mode):該模式下到處都是中世紀武器和要命的怪物。
3、傳說模式(Legend mode):玩家能夠體驗逐漸演變的精巧歷史,親歷充滿英雄人物、橫跨幾代人的史詩戰爭。
那么僅憑一個人,如何敲下這70萬行代碼?
Adams表示,「我嘗試給變量和對象一致命名,并且留下足夠的注釋來提醒自己到了一個代碼點時會發生什么。有時候我需要多次搜索才能找到想要的線索。
當我去重溫一些已經十年沒有碰過的游戲片段時,這種情況經常發生。」
在矮人堡壘開發過程中,Adams 主要使用了2種編程語言,C和C++。
為了將其更容易地移植到OSX和Linux系統中,Adams使用OpenGL和SDL來處理引擎問題。
整個項目中,除了SDL以便我們可以做端口之外,所有這些都一直保持不變。
在游戲機制方面,Adams并沒有使用很多外部數據庫,但是偶爾會選擇一些隨機的數字原始資料—— 比如梅森旋轉算法(Mersenne twister),還有SplitMix64。
其它類似于矮人堡壘的游戲會因為算法問題「夭折」。
矮人堡壘用的是A*算法,速度很快,但Tarn認為還是不夠好。
一般而言,為了簡化操作,開發者會在地圖頂部添加各種大型結構。
但因為矮人堡壘的地圖非常大,而且還會不斷變化,用A*算法只會耗費大量維護時間。

所以Tarn決定,通過行走來追蹤可到達的連接組件。這樣就算地圖變化再快,更新也很容易。
雖然更新維護變快了,但這個方法還是有缺點:
維護的部件指數只能用于行走。
針對這個問題,Tarn做過一些嘗試,但都以失敗告終。
他留意到有些成功的游戲用了矩形覆蓋,覺得這個方法還蠻不錯,但又沒法確定那些游戲的地圖大小和穩定性。
Tarn認為,最簡單方法其實就是為飛行生物添加一個新索引。
但因為兩個索引都需要同時維護,而其中一個索引已經夠差了,所以這對內存和速度有很大影響。
又或者可以跟蹤它們的路徑屬性,但是隨著地圖的變化,維護起來還是會變得困難緩慢。
Tarn表示,在代理和地圖復雜性方面,目前已經盡最大能力來支持agent和復雜的地圖了,所以如果我們想從中得到更多,就必須做出一些讓步。
「失敗就是樂趣!」
除了矮人堡壘,Tarn在過去十年左右的時間里也嘗試做過其它游戲項目。
不多,也就大概90個吧。
不過,有些項目只能持續了幾天,有些就持續了好幾年。
這些游戲項目幾乎都是其它類型的游戲,但也有一些是矮人堡壘的輔助項目,比如神話生成器原型。
雖然基本上沒有多少個項目能夠持續運作下去,但Tarn認為,偶爾擺脫矮人堡壘,開開小差還是挺不錯的。
在這90個「隨便做做」的項目里,Tarn也想過用其它編程語言。
他認為有些語言是能夠加快實現設計,所以他覺得自己應該再學一點腳本語言,多玩一些線程。
不過人嘛,都是「想一套,做一套」。
對于更喜歡設計的Tarn來說,既然那90個項目是用來摸魚放松的,又怎么會去學編程語言呢。
bug是所有開發人員都逃不掉的坑。
在矮人堡壘這個游戲里,Tarn最喜歡的bug是那只永遠都打不贏的醉貓。

在酒館里的貓在地板上走來走去,貓爪就沾了不少灑出來的酒,結果貓在舔爪的時候就喝醉了。
這個bug是因為在貓舔爪攝入東西的代碼里,有個數字出錯了,結果這個bug就讓貓顯示出了酒精中毒的癥狀。
不過,這個bug反倒是被Tarn利用起來,添在了有毒生物的設計代碼里了。