开发者 Draxinar 做了一件很慢的事:把 1998 年《Ultima Online: The Second Age》演示版里的 UoDemo.exe 拆开,将约 5000 个 Microsoft Visual C++ 5.0 编译的 x86 函数,手工翻译成可移植 C99。
更硬的一点是,他不是只让它“差不多能跑”。项目按函数与原二进制做逐指令比对,还重建了类层级、结构体布局、虚表槽位和跨平台运行环境。
这件事有意思,不是因为又有人怀旧《Ultima Online》。它更像一次罕见的代码考古:早期商业 MMORPG 的服务器到底怎么组织对象、地图、NPC、刷怪、衰减和世界状态,终于有了一份可以被翻看的材料。
但边界也要先说清。UoDemo.exe 来自演示版,包含客户端,以及 Windows 移植版服务器代码和数据。它不是 1998 年线上正式服务器源码,也不能被当成完整生产 shard 的复原。
10 年逆向:从演示版里挖出服务器骨架
《Ultima Online》由 Origin Systems 开发,1997 年上线,是商业 MMORPG 早期的标志性产品。正式服务器当年运行在多台 Solaris 机器上,世界按区域拆分。
1998 年 10 月,《The Second Age》首版带了一个独立演示程序:UoDemo.exe 和 UoDemo.dat。这个包主要覆盖 Ocllo 岛,范围有限,也有系统被禁用或打桩。
Draxinar 的判断是,演示包里仍保留了大量来自 1998 年中期线上版本的服务器逻辑。原文提到,UoDemo.exe 日期为 1998 年 9 月 2 日,服务器数据抽取自 1998 年 6 月 2 日的生产环境。
这就是它的价值入口:不是完整世界,而是靠近真实服务器的一块切片。
| 问题 | 这次能看到什么 | 不能误读成什么 |
|---|---|---|
| 代码来源 | 1998 演示版二进制,经反汇编后手工译为 C99 | 官方公开了线上服务器源码 |
| 数据范围 | 原始数据主要覆盖 Ocllo 岛 | 完整复原了 1998 年生产世界 |
| 系统机制 | 可研究对象、NPC、刷怪、衰减、生态系统残留 | 所有可玩内容都等于原版功能 |
| 测试环境 | 有测试服务器 uo.serpent-isle.com | 正式 shard 或稳定运营服 |
我更在意的是“切片”这两个字。对游戏史研究来说,一块高保真切片,往往比一堆回忆录更有用。回忆会变形,模拟器会补洞,二进制留下的是当时工程选择的痕迹。
方法和可信度:比普通模拟器复刻更靠近原件
过去很多人理解 UO,靠的是 RunUO、SphereServer、UOX3 这类模拟器。它们很重要,但多数属于行为复刻:看见游戏怎么表现,再重新实现一套。
OUO 的路线不同。它以 UoDemo.exe 这个原始二进制为锚点,把 MSVC x86 反汇编翻译成 C99,再用逐函数、逐指令比对来校准。
这会直接影响可信度。比如 CEntity、CItem、CMobile、CPlayer 等继承关系,被映射成 C 的 struct embedding;到了 64 位构建,还要补 padding,避免字段偏移破坏原布局。
换句话说,它不是“照着记忆重做一个 UO 服务器”。它是在尽量保留原始结构的前提下,把一段旧 Windows 服务器代码搬到今天还能编译、还能检查的环境里。
这对两类人最具体。
游戏史与 MMORPG 研究者,可以把 OUO 当成可复查材料。研究刷怪、对象生命周期、地图数据、客户端协议时,不必只在玩家回忆和后世模拟器之间打转。更实际的做法,是引用代码证据时标明来源层级:原二进制、逆向翻译、作者补完,三者不能混写。
逆向工程和游戏服务器开发者,则可以把它当成旧式在线世界的工程样本。这里能看到 1990 年代商业服务器如何处理 C++、虚表、定长结构、专有数据格式和兼容客户端。要动手测试,也更适合先读 ouo 代码库和 rundir 数据库,再连接测试环境;别把它当可直接商用或可长期游玩的服务端包。原始游戏资产、仓库许可证和版权边界,都需要单独确认。
发现和限制:代码在,不等于世界完整在
项目重新接通了部分被废弃或未调用的系统。刷怪系统、衰减系统代码仍在,但演示版里没有有效调用路径。知名的生态系统也有残留,重新接通后能看到狼追兔子、乌鸦吃物品等行为。
这很迷人,也最容易被夸大。
Draxinar 明确承认,项目缺少精确数据。代码能说明当时有过哪些结构和逻辑,不能自动还原所有资源、区域定义、刷怪表和生产环境配置。
他为世界内容补写了工具链,并补全了大量门、标牌、装饰、传送点、陷阱、箱子和刷怪点。冥想、潜行、解除陷阱等技能,也属于作者补加或可选启用。
这些补完让项目更可玩,也方便测试。但它们不能被简单写进“1998 原版功能清单”。史料工作最怕以假乱真,差一层来源,结论就会歪。
目前项目相关内容主要包括三块:ouo 代码库,rundir 数据库,以及 uo.serpent-isle.com 测试服务器。作者也说得很清楚,测试服务器不是正式 shard,只是测试中心。
接下来最该看的,不是在线人数。更关键的是两件事:社区能不能补出 1997—2003 年间更可靠的 dynamic0.mul、dynamic0.bkp、regions.txt、resbank.mul 等缺失档案;项目能不能继续把“原始证据”和“作者补完”分层标注。
如果这两点做不好,项目会变成一个很好玩的复古服务端。如果这两点做得住,它才会继续保有研究价值。
这也是整件事的主线:Draxinar 不是把旧世界完整搬了回来,而是把一块原本埋在演示版里的服务器骨架,清理到可以被审计、被讨论、被继续补档的状态。
