akratch/mgb64

GitHub: akratch/mgb64

将 1997 年 N64 游戏《007:黄金眼》反编译为可读的 C 源码,并原生移植到 PC 和 macOS 上运行,用于研究与保存。

Stars: 0 | Forks: 0

MGB64

拥有黄金构建的男人

这是一款 1997 年 Nintendo 64 第一人称射击游戏的反编译原生源码移植版, 采用可移植的 C 语言重新实现,以便于 对其进行研究、保存,并在现代机器上原生运行。

License: MIT (first-party) Status: experimental Bring your own ROM

## 游戏示例 | Runway | Cradle | | --- | --- | | [![Runway 游戏示例](https://img.youtube.com/vi/Jh3GOirvobI/hqdefault.jpg)](https://youtu.be/Jh3GOirvobI) | [![Cradle 游戏示例](https://img.youtube.com/vi/Pob6Itc7rCQ/hqdefault.jpg)](https://youtu.be/Pob6Itc7rCQ) | | [在 YouTube 上观看](https://youtu.be/Jh3GOirvobI) | [在 YouTube 上观看](https://youtu.be/Pob6Itc7rCQ) | ## 这是什么? MGB64 将反编译的游戏代码与 PC/macOS 原生移植版结合在一起。它建立在与其他项目相同的 N64 反编译生态系统之上,例如 [Super Mario 64](https://github.com/n64decomp/sm64) 和 [Ocarina of Time](https://github.com/zeldaret/oot) 的反编译项目,以及 [Perfect Dark](https://github.com/fgsfdsfgs/perfect_dark) 的移植版: - **反编译** —— 原版 N64 游戏的逻辑,被重写为可读、可构建的 C 和 MIPS 汇编代码。目前支持的原生移植版即为此版本的构建结果;字节级一致的 N64 ROM 重构工作仍在进行中。 - **原生移植** —— 一个平台层(`src/platform/`),可在 PC/macOS 上运行相同的游戏代码:它会在运行时加载*你的* ROM,将 N64 显示列表转换为现代 GPU 可识别的格式,并提供音频、输入和文件 I/O。二进制文件中不会编译任何受版权保护的数据(“请自备 ROM”)。 ## 状态 - ✅ 反编译工作涵盖了游戏的大部分系统(渲染、AI、战斗、关卡逻辑、菜单、音频)。 - ✅ **原生移植版可以通过纯净的代码检出 + 你自己的 ROM 进行构建和运行** (`cmake -B build && cmake --build build`),支持原生渲染、音频以及键盘/鼠标 + 手柄输入。 - ✅ **无资源文件:** 二进制文件中不会编译任何 ROM 媒体数据 —— 纹理、音频、动画、字体和标志都会在运行时从*你的* ROM 中读取。 - 🚧 重构原始 **N64 ROM**(字节匹配)、SDK 来源清理以及渲染器/音频的一致性是目前主要的待完善领域。有关确切状态和适合新手的 issues,请参阅 **[docs/STATUS.md](docs/STATUS.md)** 和 **[ROADMAP.md](ROADMAP.md)**。 - ⚠️ 代码树中仍包含已登记在册的 N64 SDK/libultra 兼容性材料,这些**不是**基于 MIT 许可的官方第一方代码。在描述或重新分发本项目之前,请参阅 **[THIRD_PARTY.md](THIRD_PARTY.md)**。 目前已知的图形和游戏玩法问题以及偶尔出现的不稳定性依然存在。欢迎积极提交 Bug 报告和 PR。 ## 构建说明 完整的说明 —— 包括工具链、依赖项、原生移植版设置以及匹配目标的资源提取路径 —— 位于 **[docs/BUILDING.md](docs/BUILDING.md)** 中。简要步骤如下: 1. 安装适用于你所用平台的构建依赖项(参见构建文档)。 2. 使用 CMake 构建原生移植版;公开的代码检出版本无需 ROM 媒体或提取的资源即可编译。 3. 使用**你合法拥有**的 ROM 运行该移植版,使用 `--rom /path/to/rom.z64`, 或者将其放在代码库根目录下以便自动检测。 4. 匹配目标的贡献者可以使用构建文档中描述的资源提取和 Makefile 路径。 ``` # 原生移植版 (PC/macOS): cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j ``` ## 运行方式 你必须已经拥有并提供 ROM —— 移植版会在运行时读取它;本项目不附带任何游戏数据。默认命令会正常启动并进入游戏前端界面: ``` ./build/ge007 --rom "/path/to/baserom.u.z64" ``` 常见的启动示例: ``` # 使用显式 ROM 路径正常启动: ./build/ge007 --rom "/path/to/baserom.u.z64" # 通过名称直接启动单个关卡: ./build/ge007 --rom "/path/to/baserom.u.z64" --level dam # 在 Secret Agent 上直接启动任务 2: ./build/ge007 --rom "/path/to/baserom.u.z64" --mission 2 --difficulty secret # 通过原始内部 LEVELID 直接启动,用于验证: ./build/ge007 --rom "/path/to/baserom.u.z64" --level 33 # 将存档/配置保留在专用目录中: ./build/ge007 --rom "/path/to/baserom.u.z64" --savedir "$HOME/.mgb64" ``` 如果你不传入 `--rom` 参数,移植版会通过文件大小、N64 文件头和内部卡带名称,自动检测工作目录和常见位置(`~/Downloads`、`~/Documents`、`~/Desktop`、`~`)中的兼容 ROM。 实用的运行时选项: | 选项 | 用途 | | --- | --- | | `--rom PATH` | 从 `PATH` 加载 ROM。也支持直接以位置参数的形式提供 ROM 路径。 | | `--level NAME` | 通过别名直接启动支持的独立关卡,例如 `dam`、`facility`、`runway`、`surface1`、`bunker1` 或 `egypt`。 | | `--level N` | 直接启动原始的内部 `LEVELID`。示例:`33` 代表 Dam。这些数字不是任务顺序号。 | | `--mission N` | 直接启动单人任务顺序 `1` 到 `20`。当你要表达“任务 2”、“任务 3”等时,请使用此参数。 | | `--difficulty VALUE` | 选择直接启动的难度。可选值:`agent`、`secret`、`00`、`007`,或数字 `0` 到 `3`。默认为 Agent。 | | `--savedir PATH` | 将 `ge007.ini` 和存档数据存储在 `PATH` 中。若无此参数,移植版会在当前目录可写时使用当前目录,然后回退到用户专属目录。 | | `--no-input-grab` | 不捕获鼠标。在测试窗口化启动时非常有用。 | | `--background` | 在不捕获输入的情况下运行,并采用对后台友好的设置。适用于冒烟测试。 | 如果不传入任何直接启动选项,游戏将正常启动。`--level` 接受关卡别名或原始内部 `LEVELID` 值;`--mission` 接受战役顺序。 例如,运行任务 2 请使用 `--mission 2` 或 `--level facility`,而不是 `--level 2`。有关更多平台设置的详细信息,请参阅 [docs/BUILDING.md](docs/BUILDING.md#running)。 ### 操作方式(默认) | 动作 | 键盘与鼠标 | 手柄 | | --- | --- | --- | | 移动 | `W` `A` `S` `D` | 左摇杆 | | 视角 | 鼠标 | 右摇杆 | | 射击 | 鼠标左键 | RT | | 瞄准(长按) | 鼠标右键 | LT | | 切换武器 | 鼠标滚轮 | `Y`(下一个)/ Back(上一个) | | 装弹 | `R` | — | | 互动 | `F` | — | | 蹲下(切换) | `C` / `LCtrl` | L3 | | 左/右倾斜(瞄准模式下) | `Q` / `E` | — | | 手表菜单 | `Tab` | — | | 暂停 | `Esc` | — | | 静音 | `M` | — | | 显示操作方式 | `H` | — | 鼠标灵敏度、全屏显示和窗口大小均可在 `ge007.ini` 中配置 (首次运行时会生成在可执行文件旁边)。按下 `H` 也会在控制台中打印出完整的控制列表。 ## 已知限制 这是一个处于实验阶段、仍在开发中的移植版 —— **并非**对原版硬件的 1:1 完美替代。它在本地原生运行游戏反编译后的代码;它不是模拟器,也不是周期精确的。渲染和音频使用了一些已知的兼容性近似处理,少数区域的实现仍在向完全还原 N64 行为靠拢。**[PORT.md](PORT.md)** 提供了完整且客观的分析说明:包括哪些部分是忠实的、哪些不是、已知的偏差以及验证覆盖率。在提交有关一致性的 Bug 之前,请务必阅读该文档。 ## 代码库结构 | 路径 | 内容 | | --- | --- | | `src/` | 反编译的游戏代码(`src/game/`)、libultra 以及原生移植层(`src/platform/`) | | `include/` | 共享头文件 | | `assets/` | 仅包含资源**构建粘合代码**(提取配置、链接器脚本、`.incbin` 包装器)。提取出的 ROM 数据会在构建时生成于此,并已被 git 忽略。 | | `tools/` | 构建/提取工具(提取器、纹理转换、校验和、`asm-processor` 等) | | `scripts/` | 提取和构建辅助脚本 | | `macos/` | 原生 macOS 应用外壳源码(Swift/AppKit),本地未签名的 `.app` 打包,以及签名/公证脚本 —— 参见 [`macos/README.md`](macos/README.md) | | `ld/`, `*.ld` | 链接器脚本 | | `docs/` | 构建、状态和设计文档 | ## 许可证与法律声明 本代码库中的第一方代码(移植层、构建系统、工具和文档)基于 **[MIT License](LICENSE)** 发布。MIT 许可证**不**授予与原版游戏相关的任何权利。有关简短的许可证/来源摘要,请参见 **[NOTICE.md](NOTICE.md)**。 反编译后的游戏代码是一种衍生作品,仅供研究、保存和教育目的提供。**本项目不分发任何受版权保护的 ROM 或资源。** 所有商标均为其各自所有者的财产,本项目不隶属于任何版权所有者,也未获得其背书。在使用本项目之前,请务必完整阅读 **[DISCLAIMER.md](DISCLAIMER.md)**。 第三方组件(包括 N64 SDK 兼容性头文件/源码、内置工具/库,以及仅限本地使用的匹配目标工具占位符)及其来源已登记在 **[THIRD_PARTY.md](THIRD_PARTY.md)** 中。 公开发布的规范检查记录在 **[docs/RELEASE_CHECKLIST.md](docs/RELEASE_CHECKLIST.md)** 中,当前公开发布前的准备决策矩阵位于 **[docs/PUBLIC_LAUNCH_READINESS.md](docs/PUBLIC_LAUNCH_READINESS.md)** 中。
标签:Bash脚本, URL提取, 任天堂64, 原生移植, 反编译, 客户端加密, 游戏, 游戏保存