johnqherman/EetsMod

GitHub: johnqherman/EetsMod

为 Klei 益智游戏 Eets 提供原生 C++ 插件式的 Mod 开发与加载框架,支持跨平台编译打包和游戏内管理。

Stars: 0 | Forks: 0

eetsmod

[![build](https://github.com/johnqherman/eets-mod-framework/actions/workflows/ci.yml/badge.svg)](https://github.com/johnqherman/eets-mod-framework/actions/workflows/ci.yml) 一个用于 **Eets**(Klei 益智游戏)的 Mod 框架。 Mod 属于原生插件(Windows 下为 `.dll`,Linux 下为 `.so`),通过一个小型加载器注入,打包为一个独立的 `.eetsmod` 文件,并可在游戏内部进行管理。 ## 游玩 Mod 一个 Mod 就是一个包含所有内容(代码、资源、配置等)的 **`.eetsmod`** 文件。 开启 Mod 支持需要三个步骤。前两步因平台而异;第三步在所有平台上都相同。 1. **打开游戏文件夹。** 在 Steam 中,右键点击 **Eets > 管理 > 浏览本地文件**,然后将加载器(来自 [发布页面](../../releases))放入其中: - **Windows:** `version.dll`(游戏启动时加载的代理文件) - **Linux:** `libeetsmod.so` 2. **设置启动选项**(Steam > 右键点击 **Eets > 属性 > 常规 > 启动选项**),准确粘贴以下内容: - **Windows:** 无需设置;Windows 会自动从游戏文件夹中加载 `version.dll`。 - **Linux:** LD_PRELOAD=./libeetsmod.so %command% 3. **添加 Mod。** 将 `.eetsmod` 文件放入 `mods` 文件夹中。点击 **播放**。 在游戏内:在主菜单中,点击 **MODS** 按钮(左下角)以启用/禁用 Mod、更改其设置或打开 mods 文件夹。 ## 制作 Mod ### 开始之前 下文使用的 `eetsmod` CLI 位于此仓库的 `bin/eetsmod` 中。克隆该仓库并将其添加到你的 `PATH` 中: ``` git clone https://github.com/johnqherman/eets-mod-framework export PATH="$PWD/eets-mod-framework/bin:$PATH" ``` 你还需要一个 C++ 编译器(`g++`)。如果也要构建 Windows 的 `.dll`,请安装 MinGW(`i686-w64-mingw32-g++`);如果没有它,`pack` 命令仍然可用,但打包出的文件仅适用于 Linux。 ### 1. 脚手架 ``` eetsmod new mymod ``` 此操作会生成三个文件: - **`mymod.cpp`**: 你的代码,预填了空的事件 hook。 - **`mymod.cfg`**: 清单文件(版本、作者、依赖项;均为可选)。 - **`compile_flags.txt`**: 包含路径,以便 clangd/你的编辑器能够解析 API。 ### 2. 编写 hook 实现你关心的引擎回调;其余的保留默认即可。主要的 hook 包括: | Hook | 触发时机 | |------|-------| | `EetsMod_Init()` | 加载时触发一次 | | `EetsMod_Update()` | 每一帧均会触发 | | `EetsMod_OnKey(key, mods, down)` | 按键按下/释放时 | | `EetsMod_OnEvent(name, a, b)` | 游戏事件:`object_spawn`、`object_killed`、`level_load`、`level_reset`、`level_complete` | 完整的引擎 API 位于 [`API.md`](API.md) 和 `include/` 头文件中。 ### 3. 添加资源(可选) 自定义的图像、声音和动画位于同级的 **`mymod.assets/`** 文件夹中,其布局**与游戏的 `Data/` 目录树保持一致**(例如 `mymod.assets/Sound/Music/song.ogg`)。 将文件放入此处,下一步即会自动将它们打包。 声音是个例外:引擎需要其自身的补丁格式,而不是原始的音频文件。请提供一个 **`.ogg`** 文件并先进行转换: ``` eetsmod add-sound mymod song.ogg # writes the engine-format files into mymod.assets/ ``` 然后就可以在代码中通过名称播放它:`PlaySound("song")`。 ### 4. 打包 ``` eetsmod pack mymod.cpp -o mymod.eetsmod ``` `pack` 一步到位:编译 `.dll`(Windows)和 `.so`(Linux),然后将它们与源代码、清单文件以及 `mymod.assets/` 一起打包成一个单独的 `mymod.eetsmod` 文件。 ### 5. 安装与运行 将 `mymod.eetsmod` 放入 `/mods` 中,然后启动游戏 并在游戏内的 **MODS** 按钮中将其开启。启动时,加载器会解压资源包,并在引擎读取它们*之前*,将其资源覆盖到游戏的 `Data/` 目录上,从而使得自定义资源就像是游戏自带的一样被加载。构建日志会存放在 `/Log/native_mods.log` 中。 请通过 [`examples/`](examples) 中的示例进行学习:重力、自定义图像/声音/动画、UI 工具包、对象扩展、碰撞。 ## 目录结构 ``` bin/eetsmod build/pack/manage CLI loader/ the injected loader (hooks, crash isolation, .eetsmod staging) include/ mod headers: engine API, addresses, UI toolkit examples/ example mods (source + .assets/) tools/ check-mod, add-sound, gen-api-ref, new-mod API.md generated engine-API reference Makefile build / check / bundles / apidoc / release ``` ## 许可证 MIT。 本框架不附属于 Klei Entertainment,也未获得其认可;*Eets* 及其资源归其各自所有者所有。本框架不包含任何游戏代码,仅包含我们基于自己拥有的游戏副本原创的工具和衍生地址。使用风险自负。
标签:C++, Eets, Gophish, Mod框架, 动态注入, 数据擦除, 文档结构分析, 游戏