蚊章汇 - 成就系统
type: channel
link: https://linuxcn.bwsl.wang/tag/%E6%88%90%E5%B0%B1%E7%B3%BB%E7%BB%9F/
items: Gamerzilla：一个开源游戏成就系统

Gamerzilla：一个开源游戏成就系统
type: item
date: 2022-12-28T21:02:01+08:00
description: 了解开源游戏成就系统 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 文件。用户可以是公开可见的，也可以是隐藏的。批准标记可以让新用户不立刻使用该系统，但是网络注册是必须的。在设计时我们已经考虑了用户相关模块的可替换性…