Pokemon Emerald 移植到 WebAssembly

通过 WebAssembly 在浏览器原生运行

Pokemon Emerald 已使用 WebAssembly(WASM)移植到网页,使游戏能够直接在浏览器中运行。不同于传统的基于浏览器的模拟方式——后者运行用 JavaScript 或 WASM 编写的 Game Boy Advance(GBA)模拟器来执行 ROM——本项目将游戏本身的逻辑和资源编译为 WASM。这得益于社区主导的反编译项目提供的 Pokemon Emerald 源代码,随后将其目标定位为 Web 平台。

性能与控制

此移植版提供了一个 “Speed 1x” 切换,允许用户加速游戏以跳过冗长的部分。虽然项目标题暗示性能可高达 100k FPS,但用户报告的实际结果各不相同,有用户在其特定硬件上仅获得 29 FPS。

键盘控制:

  • 移动: 方向键
  • A 键: Z 键
  • B 键: X 键
  • 开始: Enter 键
  • 选择: Shift 键

当前技术限制与错误

虽然该移植提供了可用的体验,但用户已发现若干稳定性和游戏性问题,可能会影响进度:

游戏崩溃

  • 菜单卡死: 多位用户在战斗菜单 “Fight/Bag/Pokemon/Run” 中选择 “Pokemon” 时报告崩溃。
  • 事件触发: 报告显示当初始 Pokemon 在 16 级进化时游戏会卡死。
  • 道具使用: 部分用户在战斗中使用药水(例如对抗 May)时出现崩溃。

视觉与输入错误

  • 文字渲染: 某些实体显示为数字而非文字(例如显示 “You received a 6” 而不是物品名称)。
  • 输入延迟: 部分用户报告如果 A 键释放后快速重新按下,按键不会被记录。
  • 导航: 在名字选择菜单中出现异常行为的报告。

缺失功能

  • 音频: 当前版本没有声音,尽管社区成员提到正在开发分支以添加音频支持。
  • 存档管理: 虽然已确认存档功能可用,用户仍希望能够导出和重新加载存档文件,以防止浏览器缓存清除导致的数据丢失。
  • PWA 支持: 用户指出 Android Firefox 缺少渐进式网页应用(PWA)支持。

社区洞察

社区讨论凸显了使用大型语言模型(LLM)协助此类移植的兴趣。一位用户提到使用 Claude 帮助构建 “discord plays pokemon” 项目,另一位则指出用 Rust 编写的 Gameboy 模拟器已通过 Opus 导出为 WASM。

"这不是一个 wasm GBA 模拟器……这是真正的游戏被编译成 wasm。即使官方从未发布过源代码,也有基于社区的反编译。"

这种区别对技术受众至关重要:项目从模拟硬件转向以原生 Web 代码执行游戏的原始逻辑。

Sources