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, 代码重构, 任天堂, 像素游戏, 反编译, 复古游戏, 客户端加密, 嵌入式移植, 开源游戏, 游戏引擎, 游戏源码, 游戏逆向工程, 红白机, 经典游戏重制, 超级马里奥, 超级马里奥兄弟, 跨平台移植, 软件移植, 迷失关卡, 错误配置检测, 预握手