Lintech-1/dark-render-re
GitHub: Lintech-1/dark-render-re
一个通过 FFmpeg 纹理渲染代理修复 DARK(2013)游戏在 Proton/Linux 上 WMV 过场动画冻结问题的逆向工程项目。
Stars: 1 | Forks: 0
# dark-render-re
**DARK (2013)** 的逆向工程视频渲染代理。
该项目修复了 Proton/Linux 上的 WMV 过场动画播放问题。原版游戏的视频层可能会在几秒钟后冻结,而音频、字幕、取消按钮和加载流程仍然正常工作。该代理尽可能保留了原版游戏的 UI 和时间轴,使用由 32 位 Windows FFmpeg 解码的帧替换了视频纹理上传,并通过 FFplay 播放提取出的过场动画音频。
游戏链接:
- Steam:
- SteamDB:
## 它的功能
- 使用代理 DLL 替换 `VideoEnginePlugin.vPlugin`。
- 将原版插件作为 `VideoEnginePlugin.orig.vPlugin` 加载。
- 让原版插件保留字幕、时间轴、跳过/取消按钮以及关卡过渡功能。
- 启动 `ffmpeg\bin\ffmpeg.exe` 将当前的 `.wmv` 解码为 BGRA rawvideo。
- 启动 `ffmpeg\bin\ffplay.exe`,播放放置在每个过场动画 `.wmv` 旁边的已提取 `.wav` 音频。
- 通过 `VTextureObject::UpdateRect` 将解码后的帧上传到游戏纹理中。
- 使用导出的 `vBase100.dll` 重置标志来处理 Alt+Enter/设备重置。
- 以低优先级/单线程模式运行 FFmpeg,以避免音频卡顿。
## 构建工具
该项目使用 [FFmpeg](https://ffmpeg.org/) 进行 WMV 解码,测试版本为来自 [FFmpeg-Builds-Win32](https://github.com/defisym/FFmpeg-Builds-Win32) 的 32 位 Windows 构建。运行时测试在 [Proton-GE](https://github.com/GloriousEggroll/proton-ge-custom) 上进行,使用了 [Wine](https://www.winehq.org/) 生态系统中的 Wine/Proton 兼容层。
该代理使用 [LLVM/Clang](https://clang.llvm.org/) 和 Wine i386 导入库构建。渲染集成的目标是 DARK 原始的 `VideoEnginePlugin.vPlugin`、`VisionEnginePlugin.vPlugin` 和 `vBase100.dll` 接口。
此代码库包含代理源代码和一个可选的预构建代理二进制文件。它不包含原版 DARK 游戏文件。
## 当前状态
推荐的运行环境:**Proton-GE**。
此修复程序是在 Proton-GE 上开发和测试的。其他 Proton 版本可能也可以运行,但并未经过测试目标验证。
已在运行 Proton-GE 且安装了俄语本地化 DARK 的环境中正常工作。
已知设计:
- 过场动画音频会被提取到原版 `.wmv` 文件旁边的 `.wav` 文件中,并通过 FFplay 播放,以避免 Proton/Wine DirectShow 音频卡顿。
- 视频来自 FFmpeg 纹理钩子。
- FFmpeg 必须是 32 位 Windows 构建版本,因为游戏/插件进程是 32 位的。
## 一行命令安装
发布此代码库后,Steam Deck/Linux 用户可以运行以下命令:
```
git clone https://github.com/Lintech-1/dark-render-re.git && sh dark-render-re/install.sh
```
安装程序会自动执行以下操作:
- 通过检查 `DarkApp.exe`、`Localization_Common/` 和 `VisionEnginePlugin.vPlugin` 来查找 DARK 的 Steam 安装路径;
- 如果找到多个副本,会询问使用哪一个安装路径;
- 下载经过测试的 32 位 Windows FFmpeg 构建;
- 将 FFmpeg/FFplay 放置在 `Dark/ffmpeg/bin/`;
- 将 `.wav` 音频提取到每个过场动画 `.wmv` 旁边,但静音的 `intro.wmv` 除外;
- 将每个处理过的 `.wmv` 替换为静音副本,并在其旁边保留原版备份;
- 将原版插件重命名为 `VideoEnginePlugin.orig.vPlugin`;
- 将代理安装为 `VideoEnginePlugin.vPlugin`。
如果游戏位于自定义路径:
```
DARK_GAME_DIR="/path/to/SteamLibrary/steamapps/common/Dark" sh dark-render-re/install.sh
```
## 手动安装
1. 打开游戏文件夹:
cd "/path/to/SteamLibrary/steamapps/common/Dark"
2. 将 32 位 Windows FFmpeg/FFplay 放置在此处:
Dark/ffmpeg/bin/ffmpeg.exe
Dark/ffmpeg/bin/ffplay.exe
测试过的目录布局:
Dark/
ffmpeg/
bin/
ffmpeg.exe
ffplay.exe
Localization_Common/
Video/
ru/
comic_even_intro.wmv
comic_even_intro.wav
3. 备份一次原版插件:
mv VideoEnginePlugin.vPlugin VideoEnginePlugin.orig.vPlugin
4. 复制代理插件:
cp dark-render-re/dist/VideoEnginePlugin.vPlugin VideoEnginePlugin.vPlugin
5. 运行游戏。
## 安装程序说明
可以从任意位置运行安装程序:
```
sh dark-render-re/install.sh
```
脚本预期:
- 存在 `dark-render-re/dist/VideoEnginePlugin.vPlugin`;
- 原版插件名称为 `VideoEnginePlugin.vPlugin` 或已重命名为 `VideoEnginePlugin.orig.vPlugin`。
- 存在原生的 Linux `ffmpeg`,用于准备 `.wav` 音频和静音的 `.wmv` 文件。
游戏根目录检测需要以下文件:
- `DarkApp.exe`
- `Localization_Common/`
- `VisionEnginePlugin.vPlugin`
覆盖 FFmpeg 下载 URL:
```
FFMPEG_URL="https://example.com/ffmpeg-win32.zip" sh dark-render-re/install.sh
```
## 构建
Linux 构建依赖项:
- `clang`
- `lld`
- Wine i386 导入库:
- `/usr/lib/wine/i386-windows/libkernel32.a`
- `/usr/lib/wine/i386-windows/libuser32.a`
Linux 安装依赖项:
- `find`
- `ffmpeg`
- `awk`
- `curl` 或 `wget`
- `unzip`、`bsdtar` 或 `7z`
构建:
```
cd dark-render-re
sh build_proxy.sh
```
输出:
```
dist/VideoEnginePlugin.vPlugin
```
调试日志构建:
```
LOGS=1 sh build_proxy.sh
```
## 文件
- `src/VideoEnginePlugin_proxy.c` - 代理实现。
- `src/VideoEnginePlugin_proxy.def` - 导出的原版插件符号。
- `dist/VideoEnginePlugin.vPlugin` - 由该项目构建的即用型 32 位代理 DLL,不是原版游戏插件。
- `install.sh` - 游戏根目录的安装/更新助手。
- `build_proxy.sh` - 本地构建脚本。
## 运行时日志
默认的发布版本不会写入运行时日志。
如果使用 `LOGS=1` 构建,游戏根目录可能包含:
- `dark_video_proxy.log`
- `dark_video_ffmpeg.log`
这些是调试日志。可以安全删除。
## 致谢
DARK 归其所有者所有。FFmpeg 归 FFmpeg 项目/构建维护者所有。不会重新分发原版 DARK 游戏文件。
预构建的 `dist/VideoEnginePlugin.vPlugin` 是该项目的代理二进制文件,而不是原版 DARK 的 `VideoEnginePlugin.vPlugin`。
## 许可证
MIT。详见 `LICENSE`。
标签:Cutter, DLL代理, FFmpeg, Proton/Wine, 云资产清单, 客户端加密, 游戏 Mod, 视频解码, 逆向工程