好的,在我那篇宣泄情绪的帖子之后,让我正式介绍 Elysium


它是什么

这是一个基于 Unreal Engine 5.8 + C++《吸血鬼:避世之血族》(VtMB,2004 年)——那款充满 Bug 的邪典经典——的重建。仓库:github.com/jlagedo/elysium-unreal

这不是旧可执行文件的二进制移植,也不是从记忆中的重制。这是一种重构:解码你自己的安装文件,还原原始引擎的实际行为,并将这些数据托管在一个新的运行时上。视觉效果可以实现现代化。原始脚本能够观察到的游戏逻辑被复现,包括 Bug,因为发售时内容就是针对这些 Bug 进行调整的。

它读取合法的本地游戏副本。仓库中不包含任何原始资源、脚本或地图。

使用前沿编码代理构建。Gemini 在与这个仓库接触时未能幸存。


使用的工具

工具 模型
Claude Code Fable 5, Opus 5(Sonnet 基本未使用)
Codex GPT-6 Astra, GPT-5.6 Sol
Grok 4.6
Gemini Antigravity(尝试过;在此规模的项目上毫无用处)

这款游戏,以及为什么它的移植很奇怪

VtMB 使用了 Valve 早期的 Source 引擎授权,情况很特殊。Source 是众所周知的。但人们说的 Source 并不是指 这个 Source。这是一个 HL2 发布前的分支,上面有很多 Troika 自定义代码。

那么:要如何重建这样一款游戏?

游戏资源

第一部分是从游戏中提取游戏内容。我不得不进行大量研究,并使用全面的人工智能推理,来填补社区从未完全填补的空白。二十年来,人们一直在修补和探查这款游戏。那些工作真实存在。人工智能改变的是,你可以突破那些从未有人拥有完整解码器的格式和引擎内部结构,能走多远。

大约 40% 的代码库是一个 Python 管道,它将原始格式(BSP、MDL、VPK、材质、脚本、对话……)解码为引擎中立的中间形式——自定义 glTF/GLB 单元加上附加文件——然后将外观烘焙到 Unreal 资源中。这也是许多之前无法恢复的数据从安装文件中提取出来的方式。

地图包含实体、输入输出、触发器、NPC 生成点以及大量事件连线。但它们并非游戏的全部:旁边还有关卡 Python、.dlg 对话和编排好的场景。

游戏引擎

现在是真正的难点:恢复引擎(使数据产生效果的自定义逻辑)。

Troika 做的一件事让这一步变得容易了些。他们嵌入了一个 Python 运行时(CPython 2.1.2)并将其用作脚本语言。我做了同样的事情:托管原始脚本,但将它们绑定到驱动 Unreal 的新 C++ 对象上。运行时是 CPython 2.7,它连接的是 Unreal 底层,而不是 vampire.dll

如何恢复其余部分:逆向工程加实时捕获(Ghidra + Frida)。这是当前模型真正打破旧工作流程的地方。它们能读取反编译的 C 和汇编代码,能驱动 Ghidra 和 Frida,并且会查看一个函数然后说“这是角色 AI”、“这些是异能函数”、“这个 vtable 槽是覆写”。不是魔法,也不比每个特化的专家强——但速度快到足以让恢复一个子系统成为常规工作项,而不是耗时数月的支线任务。

在此基础上,我构建了一个逆向工程 MCP:一个本地 MCP,通过将 exe/DLL 转储到 SQLite(vtmb-corpus)来运作。模型可以随时查询零售函数、vtable、调用者和字段。这改变了游戏规则。固定指令告诉它们这是一个重构,所以它们会去获取语料库数据,而不是凭空编造逻辑。

在实时 Unreal 端还有第二个 MCP(编辑器 Python + UE 5.8 实验性 MCP,加上项目工具)。代理可以与会话进行中的运行中游戏对话、查找 Bug 并创作一些资源。


所以:AI,以及我不会再用的代理技术

在这个项目上,我学到了很多关于 不要 用这些新模型做什么。分享结论。

少即是多

一开始我把所有可能的东西都塞进 CLAUDE.md / AGENTS.md,并编写技能来控制各处测试。这严重反噬了我。

这些前沿模型已经知道软件开发循环。它们经过训练,会编写、运行和修复。你不需要告诉它们测试。你越少尝试覆盖它们的默认行为,它们就表现越好:更少的 tokens,更少的往返次数。如果你看看我的指令文件,它们精简到了极致。

而且永远不要让 AI 编写这些文件。 CLAUDE.md 是神圣的。我手写它。一个钩子会在任何代理编辑落地之前向我提问。AGENTS.mdCLAUDE.md 的生成镜像,另一个钩子阻止代理碰它。这些指令文件是我绝不想让模型“帮忙”的地方。


模型之战

甚至不想评论 Gemini。测试过,它什么也没做,弃用了。对于这么大的项目,工具选错了。

我喜欢 Claude。然后 GPT Sol 和 Astra 出现了,它们更快,而且非常专注。我不打算加冕一个赢家。一个观察:

模型 行为方式
Claude 家族 在开发功能时更“安全”。当出现计划外的事情,或者计划必须改变时,它会停下来问你每一个细节。它希望有人类参与。
Sol / Astra 更独立。当它们发现意外情况时,通常自己做出决定,并且需要较少的关注。有时这很好。有时会坑你。
Grok 4.6 第一次真正在上面使用。还不错。但达不到 Fable / Astra 的水平。仍然感觉像是上一代模型(Claude 4.x 家族,Sol/Astra 之前的 GPT)。

Unreal + AI

Unreal 的 Python API 加上 UE 5.8 的实验性 MCP 帮助很大。代理可以实时连接,对编辑器/游戏运行命令,探索 Bug,甚至创建一些资源。这是我发现的 Unreal 端最有用的东西。

不好的一面:编辑器仍然没有一流的集成代理循环,蓝图 / uassets 不是模型可以像源代码那样读取和修补的纯文本。我一直希望它们有这些对象的源代码/文本表示形式。


仓库:github.com/jlagedo/elysium-unreal