Skip to content

贡献

引擎修改是一个复杂的过程,但其中也包括无需精通逆向工程或成为 C++ 大魔导师即可完成的部分。

研究与逆向工程

你可以通过使用引擎观察其运作机制,并记录哪些因素会影响其行为。但你可能终究还是需要深入其内部原理。通常需要借助反汇编器/反编译器(例如 IDAGhidra)来解析二进制文件(例如 gamemd.exe)中的代码,以及调试器(Cheat Engine 的调试器对此非常适用)来追踪二进制文件的执行流程。

Hint

逆向工程虽复杂但无需畏惧。如果你对此跃跃欲试,那么欢迎你在 Discord 频道向我们提问,我们将乐于为你提供帮助😄

Note

汇编语言 和 C++ 知识、对计算机体系结构、内存结构、OOP 及编译器原理的理解对此大有裨益。

开发

当你理解引擎运作逻辑并确定需要扩展的部分后需要编写代码来实现目标。具体方式是通过声明一个 钩子——即在程序执行到二进制文件特定地址时触发的代码。所有开发工作均使用 C++ 结合 YRpp(提供与 YR 代码交互及通过 Syringe 注入代码的功能),通常需要使用 Visual Studio 2017/2019 或更新的版本。

使用 AI 辅助开发的快速入门指南

仓库中包含一份 Copilot 指令文件,作为项目的快速入门指南——包含构建、项目结构、钩子模式、补丁宏、YRpp 使用方法等内容。该文件可被 GitHub Copilot 和类似的 AI 代码智能体自动识别,同时也是新贡献者快速了解代码库的实用参考。

我们鼓励贡献者尝试使用 AI 代码智能体(如 GitHub Copilot 智能体模式、Cursor 或类似工具)来协助开发工作——编写钩子、审查代码、生成文档以及通过 IDA Pro MCP 浏览反汇编代码。智能体技能(如 IDAPython 技能)可进一步扩展智能体的特定领域知识能力。AI 智能体可显著加速例行工作。

Note

AI 智能体是辅助开发的工具,但并非完美无缺且可能出错。请务必审查和测试 AI 智能体生成或修改的任何代码,以确保其符合项目标准且正常运作。最终代码的质量由你负责,而不是你使用的工具。

向项目提交更改

为了确保顺畅协作,开发者和维护者应首先阅读我们的 项目准则与政策

贡献功能或进行更改需要使用 Git 客户端(我推荐 GitKraken)Fork 并克隆仓库,建议创建一个新分支,随后编辑/添加代码或进行其他修改。然后提交 -> 推送 -> 发起拉取请求 -> 等待审核或合并。

如果你贡献了什么,请确保:

  • 你编写了相关更改的文档说明;
  • 你在 版本更新说明 页的更新日志和迁移指南中提及了这些改动;
  • 你在 鸣谢 页面列出了你的贡献。

若变更不符合标准流程或规模过小无需上述步骤,请在拉取请求标题添加 [Minor],以避免 CI 无故报错。

如果拉取请求仅更改文档,请以 [Docs] 开头命名标题以跳过 DLL 构建。

Hint

每次推送至拉取请求会触发自动构建,你可以在拉取请求页面底部查看构建状态。点击 Show all checks 进入构建详情页,可下载包含 DLL 和 PDB 的压缩包(供你的测试人员使用),或从自动发布的评论中获取构建文件(需要拥有 GitHub 账号)。

Note

举杯 C++ 经验、编程模式及常用技术知识将有助于提升效率。基础汇编知识 有助于正确编写内存交互钩子。同时需掌握 Git 与 GitHub 的基本使用。

测试

这是任何 modder(甚至纯玩家)均可参与的工作。查看新的功能或改动,尽可能设想所有可能的应用场景、逻辑漏洞、边界情况及意外交互等,并加以验证。发现任何 Bug 请提交至本仓库的 Issue 版块。

Warning

总体稳定性仅可通过大量离线/在线游戏测试进行验证。大多 modder 没有测试团队,若期望功能稳定,请组织测试人员参与新功能测试!下方检查清单有助于问题定位。

测试检查清单

  • 涵盖所有有效用例:尽可能验证你所能想到的正常使用场景是否按预期工作。
  • 正确的存档与读档:多数新增内容例如 INI 标签需存入存档中的对象信息。有时这会出现问题,尤其在复杂一些的东西上(例如辐射类型)。请确保所有改进在保存和加载前后(当然是在同一版本的 Phobos 环境下)都能正常工作。
  • 与其他功能的交互:测试该功能与原版或其他库功能的联动(例如:最初的解除心控弹头作用于永久心控目标时会导致崩溃)。
  • 重叠功能的兼容性:(包括来自 Ares、HAres、CnCNet Spanwer DLL 等第三方库的功能)考虑哪些功能的代码可能与你当前所测试功能的代码重叠(从技术上讲;这意味着它们修改了相同代码)。由于项目的性质部分功能可能会出现冲突(例如:最初实现的低优先级框选曾导致 Ares 的 GroupAs 被破坏,导致使用它的单位无法被正确按类群选)。
  • 边界情况:某些极端情况下的工作状况,通常是一些极端参数值引发的(例如:原版游戏在 [PreviewPack] 尺寸为 0 的情况不会跳过渲染而是导致崩溃)。
  • 角落案例:类似边界情况,并且难以复现,通常需要多重极端参数加以组合才能引发。

Note

熟悉 YR Mod 制作、具备探索精神以及对细节的敏感将有助于测试效率。

编写文档

无需多言。如果你对 Phobos 中某部分机制理解的相当透彻,那么你可以通过撰写详细说明来做出贡献,或者你也可以改进现有文档中不够详尽的段落。AI 代码智能体同样可以用于编写和改进文档——参见上面的 使用 AI 辅助开发的快速入门指南

这些文档使用 Markdown 编写(语法非常简单,60秒即可掌握 MD)。我们使用 VitePress 构建文档站点,并使用 Read the Docs 托管。

Hint

你可以在本地预览文档:

  1. cd docs
  2. npm ci
  3. npm run dev

生产构建请运行 npm run build

中文文档会在 devbuild 期间由 VitePress PO locale 插件自动从 docs/locale/zh_CN/LC_MESSAGES/*.po 构建。

Hint

如果只是想查看文档更改效果,你不需要在本地安装 Node.js、VitePress 和 npm 包——你提交的每个拉取请求都会由 Read the Docs 自动构建并托管。和 nightly builds 一样,滚动到拉取请求页面底部,点击 Show all checks,然后打开 Read the Docs 构建运行详情即可查看构建后的文档。

有两种方式可以编辑文档:

  • 本地编辑:如 向项目提交更改 中所述,文档位于 docs 文件夹。
  • 在线编辑:找到要编辑的文档,点击右上角按钮——跳转至 GitHub 文件编辑页(在右上角寻找铅笔图标)。编辑后将自动创建 fork 仓库,你可以提交更改(建议新建分支)并向主仓库发起拉取请求。

Note

README.mdCREDITS.mdLICENSE.md 会由 VitePress root pages 插件从仓库根目录读取。请改为编辑仓库根目录中的文件。

Note

拥有足够好的英语语法与对文档结构的理解即可参与。当然你还需要拥有一个 GitHub 账号。

提供展示功能用的素材

这些将在文档中被使用,并附有对应 mod 的链接作为对 mod 作者的鼓励。请提供 WebM 格式的无声演示视频。

Note

请提供适当尺寸的截图和 WebM 视频,避免冗余内容与过长的时长。

促进工作

无论你是知名 Youtuber、C&C 社区领袖还是普通玩家都可以通过向其他人宣传本项目来帮助我们。