nukep/smb-vanilla-port

GitHub: nukep/smb-vanilla-port

将 NES 经典游戏「超级马力欧兄弟」和「失落的关卡」反编译为可读的 C/C++ 代码,提供精确的行为还原和汇编交叉参考。

Stars: 26 | Forks: 0

# smb-vanilla-port NES 游戏“Super Mario Bros”和“Super Mario Bros 2 Japan”(又称 Lost Levels)的 C(以及部分 C++)反编译项目。 本程序仅重新实现了代码,不包含关卡数据和图形素材。 当前进度: - [x] Super Mario Bros 可以运行,且可通关 - [x] Super Mario Bros 2J (Lost Levels) 可以运行,且可通关 - [x] SMB1 和(结尾除外的)SMB2J 的音频 - [ ] SMB2J 结尾的音频(使用了 2C33 音频芯片) - [ ] 单元测试和回归测试 - [ ] 代码重构 - [ ] 良好的 UI/UX,可自定义的控制按键 - [ ] 让核心游戏代码能在 C 语言下编译(以确保可移植到较旧和嵌入式系统) ## 运行游戏 准备一份“smb.nes”的副本,并将其放在与可执行文件相同的目录中。或者,修改 smbport.ini 中的文件路径。 如果默认的按键绑定不符合你的习惯,smbport.ini 中也提供了修改选项。 一切准备就绪后,运行 smbport.exe(或在 *nix 系统上运行 smbport)。第一个 CLI 参数可以是 ROM 文件名,用于覆盖 smbport.ini 中的值。在 Windows 上,你也可以直接将 ROM 拖拽到可执行文件上。 要玩 SMB2J (Lost Levels),请修改 smbport.ini。 已知可用的哈希值: - smb.nes (NTSC) 的 SHA-1 哈希值:ea343f4e445a9050d4b4fbac2c77d0693b1d0922 - smb2j.fds 的 SHA-1 哈希值:3b8c8998b4887d6dd676965943d69a320738ab9c 或 20e50128742162ee47561db9e82b2836399c880c ## 构建说明 你需要一个 C 和 C++ 编译器以及 Meson。 本项目依赖于 SDL2 或 SDL3(其中一个是必需的)和 GLEW(可选)。这些在大多数 Linux 发行版中都可以作为软件包获取。 首选 SDL3。如果未找到 SDL3,将使用 SDL2。 如果缺少 GLEW,项目将在没有 OpenGL 支持的情况下构建。 ### Rocky Linux 10 使用 `pip install meson` 或 `sudo dnf install meson` 安装 Meson。 安装 SDL3 及其依赖项: ``` sudo dnf --enablerepo=devel install gcc gcc-c++ SDL3-devel glew-devel ``` 如果你想使用 SDL2,请将 `SDL3-devel` 替换为 `sdl2-compat-devel`。 构建: ``` meson setup build/ meson compile -C build/ ``` 运行: ``` ./build/smbport ``` ## 支持的内容 你必须提供原版游戏的副本,否则它们将无法运行。 需要 ROM 来加载关卡、音频和图形素材。因此,对关卡、音频和图形数据的简单修改应该能够生效。 不支持修改代码或其他类型数据的 Romhack。 ## 本项目的愿景 本项目的主要目标是尽可能表现出与原版游戏完全一致的行为(包括 Bug)。 次要目标是为 Super Mario Bros 的逻辑提供一个易于理解的高级参考。 对于复古游戏爱好者来说,将其与汇编列表进行交叉参考是合理的。因此,鼓励在代码注释中提及“原版是如何实现的”(在合理范围内)。 这是一个“原汁原味”(Vanilla)的 Super Mario Bros 移植版本。本项目的非目标是成为一个独立的“超级引擎”。然而,当本项目稳定后,我们鼓励创建一个具有非原版增强功能的分支(一些想法包括模组支持、宽屏支持等)。 本着作为良好交叉参考的精神,我们也不应该在重构上走得太远。 简化循环和表达式、为单元测试分离内容,甚至内联简单的函数都是可以的——但我不建议偏离太远。可能会有人想将其面向对象化,或减少全局变量的使用,但这应该在分支项目中进行,而不是在这里。 ## 特别感谢 感谢 doppelganger,他创建了首选的 Super Mario Bros 反汇编项目。他们的工作提供了极大的帮助,该反汇编项目也是本项目中使用的标签名称的基础: https://www.romhacking.net/documents/344/
标签:C/C++, GLEW, Meson构建系统, NES游戏, OpenGL, ROM提取, SDL2, SDL3, SMB, URL提取, 事务性I/O, 代码重构, 任天堂, 像素游戏, 反编译, 复古游戏, 客户端加密, 嵌入式移植, 开源游戏, 游戏引擎, 游戏源码, 游戏逆向工程, 红白机, 经典游戏重制, 超级马里奥, 超级马里奥兄弟, 跨平台移植, 软件移植, 迷失关卡, 错误配置检测, 预握手