johnqherman/EetsMod
GitHub: johnqherman/EetsMod
为 Klei 益智游戏 Eets 提供原生 C++ 插件式的 Mod 开发与加载框架,支持跨平台编译打包和游戏内管理。
Stars: 0 | Forks: 0
[](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框架, 动态注入, 数据擦除, 文档结构分析, 游戏