复活一款已死的沙丘即时战略游戏

2024 年 7 月 13 日:

  • 创建名为 EmperorLauncher 的补丁,可修改 Emperor: Battle for Dune 使其在现代系统上运行良好,具备高分辨率支持、可直接 IP 连接的在线多人游戏和合作战役模式。可在此处下载补丁,源代码在github
  • Emperor: Battle for Dune 介绍:2001 年由 Westwood Studios 制作的实时战略游戏,是 Dune 2000 的续集,被认为是 RTS 类游戏的鼻祖,虽深受喜爱但如今不太知名,因被 Westwood 其他 RTS 系列 Command & Conquer 掩盖。
  • 存在的问题:游戏无法在现代屏幕的高分辨率下运行,多人游戏模拟速度无上限,Westwood Online 不可用,无法在合作模式下进行战役,安装程序损坏,许多视觉效果在现代 PC 的高帧率下出错。
  • 如何修复

    • 初始目标是制作 Emperor.exe 的替代品以控制 Game.exe 的启动,后发现 Emperor.exe 在运行 Game.exe 前会创建互斥体和匿名文件映射句柄,通过 IPC 消息传递系统将句柄值传递给子进程,从而实现数据传递。
    • 利用 CreateRemoteThread 和 LoadLibrary 技巧注入自定义补丁到 Game.exe 中,使用 detours 库修补函数,解决函数替换和保留原始函数指针等问题。
    • 修补图形部分,解决高分辨率窗口和限制帧率问题,包括引入代码解决 Direct3D7 的分辨率限制,通过补丁去除窗口边框并重新定位游戏窗口,以及修补 IDirect3DDevice7::EndScene 方法限制帧率。
    • 修补网络部分,实现 WOL 模式下的多人游戏,包括设置假的 WOL 主服务器、代理游戏数据包、拦截 winsock 函数等,解决端口随机选择和 NAT 打孔等问题。
  • 打包

    • 替换损坏的安装程序,通过复制安装 CD 内容和提取.cab 文件来完成基本安装,通过分析嵌入式 DLL 实现补丁到 v1.09。
    • 打包 Westwood Online Shared Internet Components,通过重定向注册表并使用 OaEnablePerUserTLibRegistration 函数进行注册。
    • 制作基本的启动器 UI,使用 plain old win32 实现,简单静态。
  • 结论:基本实现目标,感谢阅读,希望玩家喜欢游戏。
  • 补充说明:

    • Detours 还处理 CreateRemoteThread 和 LoadLibrary 技巧。
    • 解决高分辨率问题的代码是一个疯狂的 hack,可能不稳定。
    • 鼠标偏移在 4:3 模式下也存在但影响较小。
    • 每个 Windows 可执行文件都以 DOS 可执行文件开头。
    • 尝试直接使用 DllGetClassObject 函数从 DLL 注册类库未成功。
阅读 14
0 条评论