Skip to main content

One post tagged with "Godot"

View All Tags

· 5 min read
Wei Ji

前情提要

Robocraft 是一款載具建造戰鬥遊戲,屬於 (Vehicular Combat) 的衍生種類,玩家可以設計自己的載具然後投入遊戲中與其他玩家進行 PvP 競技,是能帶給我樂趣的遊戲之一。

在某次更新之後這個遊戲的開發商大幅度削減 (Nerf) 獎勵系統,讓遊戲資源的獲取變得十分困難,使得創作方面的遊玩體驗上受到限制,使我一度退坑。

2022 左右再次回鍋的時候,獎勵系統與遊戲資源的限制已經被消除,雖然遊戲機制已經和以前有所不同了,但至少可以肯定開發商在遊戲平衡性上的努力,不過玩家基數下降,造成自動批配系統中的野團高機率會碰到有組團的對手,遇到這種情況通常會被慘虐。後來我注意到這遊戲在較冷門的階級 (Tier) 中為了減少玩家在自動批配系統中的等待,會加入 BOT 來促成 5v5 的遊戲,於是我就很不解開發商為什麼不願意內建 PVE (Player Versus Environment) 模式。

「在 Robocraft 的遊玩體驗之上引入 PVE 模式」便是我尋找替代方案的動機之一。

替代方案的嘗試

然而遺憾的是,幾次搜尋下來,都沒有找到這種類型的開源專案,在 AlternativeTo 上沒有找到滿意的結果。評價似乎不錯的 Crossout 並不支援 Linux,而且在 Steam 上還鎖區了一陣子。在 Reddit 的討論串中提到了 Procelio ,在早期(這專案剛啟動沒多久)有試著下載下來玩玩看,不過 Linux 版跑起來十分卡頓,而且我記得是用 Unity3D 做的。

直到上週 (2023-08-20),我終於找到了 OwnWar,一眼就能看出它是衝著 Robocraft Clone 去的開源專案。

Dpendency Chain

拿到開源專案的第一件事當然就是自己 Build 看看,然而事情並沒有這麼簡單,這個專案是用 Godot 引擎撰寫的,但是是有打過 Patch 的 Godot 引擎,因此我需要自己編譯 Godot 引擎,而 Patch 本身又仰賴另外一個物理運算的函式庫 Rapier3D。那個函式庫是用 Rust 寫的,而且必須使用特定版本的編譯器才能編譯。加上我明顯感受到原作者留下的文件有缺失,並沒有完整描述 Build 的所有步驟。

於是我翻閱了 Godot 的文件,試著搞懂這個專案如何跟外部函式庫做 Binding ,接著我發現了了這個東西

[dependencies]
gdnative = "*"
lazy_static = "*"
godot_rapier3d = { path = "../../../../game-assets/godot/godot_rapier3d/rapier3d" }
fxhash = "*"

那個相對路徑指向一個超出專案根目錄的位置,換句話說複數個專案的仰賴關係是隨意的擺在原作者的電腦內,無法根據留下的文件直接完成開發環境的準備,「原作者並沒有花太多心思考慮到接手的人,而是匆匆上傳專案」的假設基本上得到了驗證。

於是我花了一點時間從配置文件內的紀錄的外部仰賴路徑,推敲出數個庫之間的仰賴關係:

成功編譯只是修改專案程式碼的第一步

於是我 Fork 了這個專案並把編譯仰賴的 Godot 引擎和外部函式庫等等瑣碎的操作通通丟到 Docker 裡面。最後終於把這個專案編譯出來了。