Gamerzilla:一個開源遊戲成就系統
一些開源遊戲的質量已經媲美商業遊戲。儘管還難以比肩 3A 大作,但開源遊戲在獨立遊戲中已頗具競爭力。不過,遊戲玩家的期望是隨時間變化的。早期的遊戲只有高分成就。不斷增加的成就種類促使玩家反覆重玩遊戲。比如你可能達到了滿級,卻還沒有找到所有隱藏物品或沒有完成全物品收集。Xbox 360 推出了首個在線多遊戲成就系統。隨後其它遊戲平台也紛紛推出了自己的成就系統。
開源遊戲在很大程度被遊戲平台的成就系統排除在外。你可以在 Stream 上發布開源遊戲,但這需要付費。遊戲平台主要與公司合作,而不是與自由軟體社區合作。這也進一步把玩家鎖定在了非自由的遊戲平台上。
商業遊戲開發商也沒有得到太多好處。由於不能共享成就,一些享受成就的玩家拒絕從其他商店購買遊戲。這種鎖定效應增強了遊戲平台的話語權。由於各個遊戲平台使用不同的系統,開發者不得不針對它們分別進行適配和測試。較小的遊戲平台則可能完全被忽略掉。並且平台方能夠訪問到所有使用該平台的公司的成就數據,這些數據可以被用來擴大競爭優勢。
Gamerzilla 的架構
Gamerzilla 是一個致力於改善這種現狀的開源遊戲成就系統。Gamerzilla 在設計上同時考慮了開源遊戲和商業遊戲。你可以運行自己的 Gamerzilla 伺服器,使用遊戲商店提供的伺服器,甚至 Linux 發行版提供的伺服器。伺服器也可以由其他團體來運行。在哪裡購買遊戲不再重要。成就數據都會上傳到你的 Gamerzilla 伺服器上。
一個基本的成就系統需要兩個要素:遊戲和 Gamerzilla 伺服器。然而隨著遊戲數量增長,這種設計會暴露出其缺點。每個遊戲都需要證書才能上傳數據到伺服器。由於擁有大量的遊戲資源,並且能夠在不同遊戲商店之間同步數據,遊戲啟動器成為了眾多玩家的選擇。通過讓啟動器支持 Gamerzilla,遊戲本身就不再需要證書了。遊戲結果直接從啟動器上傳到 Gamerzilla 伺服器。
freegamedev.net 曾提供了社交網路系統 Hubzilla。我們基於此開發了一個插件來進行 Gamerzilla 的開發。不幸的是 Hubzilla 的一次升級導致了 freegamedev.net 的服務故障,因此 freegamedev.net 決定不再提供它了。
目前 Gamerzilla 伺服器有兩種實現。維護 Hubzilla 是一項複雜的工作,所以我們用 .Net 和 React 開發了一個獨立的 Gamerzilla 伺服器。遊戲調用的 API 是相同的,所以不用關心連接的伺服器是哪種實現。
遊戲啟動器的開發和支持工作通常是滯後的。為了方便啟動器增加對 Gamerzilla 的支持,我們開發了 libgamerzilla。這個庫負責處理啟動器、遊戲和 Gamerzilla 伺服器之間的交互。目前只有 GameHub 實現了一個支持 Gamerzilla 的版本,並將在近期整合到項目中。Fedora 上的 libgamerzilla-server 是一個臨時解決方案。它不啟動遊戲,而是監聽成就並把成就上傳到伺服器。
支持 Gamerzilla 的遊戲在不斷增長。與遊戲啟動器一樣,開發者使用 libgamerzilla 來完成 Gamerzilla 的集成工作。這個庫由 C 語言實現,已經被 Python 和 nim 等多種編程語言使用。對於那些已經有成就系統的遊戲,只需要花幾天時間就可以完成對 Gamerzilla 的支持。其他遊戲想要支持 Gamerzilla,大部分時間都是花在收集信息和授予成就上。
架設伺服器
架設伺服器最容易的方式是使用 Hubzilla 插件。但是運行 Hubzilla 站點卻不是一件輕鬆的事情。在 Fedora 上架設基於 .Net 和 React 的伺服器相對來說要容易一些,儘管這仍然需要許多步驟。詳細步驟請參考 readme 文件。需要這麼多步驟的一部分原因是目前沒有預編譯好的發布版本。這意味著你需要自己安裝 .Net,動手構建 React 源碼部分。構建完成之後,React 代碼會直接運行在 Apache 中。.Net 後端則運行在單獨的服務上。Apache 作為代理負責把所有 Gamerzilla API 請求轉發給後端服務。
按上面的步驟操作,Gamerzilla 已經運行起來了,但是現在還沒有用戶。當然應該有一個簡單的方式來創建管理員和註冊新用戶。但是該功能還沒有完成。目前只能通過 sqlite3 命令行來錄入用戶信息。具體步驟請參考 readme 文件。用戶可以是公開可見的,也可以是隱藏的。批准標記可以讓新用戶不立刻使用該系統,但是網路註冊是必須的。在設計時我們已經考慮了用戶相關模塊的可替換性。通過替換 backend/Service/UserService.cs
就可以與其他站點進行集成。遊戲網站也可以通過這種方式來為用戶提供 Gamerzilla 成就系統。
目前 Gamerzilla 的後端使用的是 sqlite 資料庫。我們還沒有對它進行過性能測試。我們預計較大型的應用安裝需要改進系統以使用更魯棒的資料庫。
測試
目前要找一個支持 Gamerzilla 的遊戲啟動器太難了。如果你安裝了 libgamerzilla-server,就可以在命令行中運行 gamerzillaserver
命令。首次運行該命令時需要輸入 URL 和登錄信息。以後再運行時會直接從配置文件讀取這些信息。目前更正錯誤的唯一方法是刪除 .local/share/gamerzillaserver/server.cfg
再重新運行 gamerzillaserver
命令。
大多數遊戲還沒有支持 Gamerzilla 的版本。itch.io 上的 《Pinball Disc Room》,它的 Linux 版本支持 Gamerzilla,但是它的網頁版是沒有成就系統的。這款遊戲只有兩個成就:一個是存活 10 秒鐘,另一個是解鎖並使用隧道。只需要稍加練習,你就能獲得一個成就。由於這款遊戲沒有可視化的成就提示消息,你需要查看 Gamerzila 伺服器才能確認成就。
目前打包到 Fedora 中的遊戲都還不支持 Gamerzila。《SuperTuxKart》 已經整合了對 Gamerzila 的支持,正在等待發布新版本。《Seahorse adventures》 和 《Shippy 1984》 添加了成就,但是新發布版本還沒有打包。還有一部分遊戲由我們獨立完成了對 Gamerzila 的支持,但我們的 拉取請求 或其它聯繫嘗試還沒有得到開發者的回應。
後續工作
Gamerzilla 需要更多遊戲的支持。目前已經有很多遊戲支持 Gamerzilla,並且正在以大約每月一個的速度增長。如果你有喜歡的遊戲,可以請求開發方支持 Gamerzilla。如果你是遊戲開發者,並且在支持 Gamerzilla 上需要技術支持,請聯繫我們。
伺服器的開發工作在緩步開展中,我們希望不久之後就會有一個可用的註冊系統。在那之後我們可能會建立一個永久託管站點。目前你可以看到我們的 測試伺服器。一些人對於使用 .Net 作為後端表示擔憂。我們的 API 並不複雜,可以很容易用 Python 重寫。
最大的不確定性來自遊戲啟動器方面。GameHub 希望有一個通過用的成就介面。未來我們可能會在這方面與他們開展合作。增加對 itch.io 應用的支持可以提升系統的關注度。另一種方案是完全拋開啟動器。也許可以將 gamerzillaserver 添加到 Gnome 中。然後你就可以在一個設置頁面里配置 URL 和登錄信息。這樣任何啟動的遊戲都可以記錄成就了。
via: https://fedoramagazine.org/open-source-game-achievements/
作者:Dennis Payne 選題:lujun9972 譯者:toknow-gh 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive