将《泰拉瑞亚》和《星露谷物语》移植到 WebAssembly

2024 年作者发现有人在浏览器中运行半工作状态的《Celeste》游戏,于是开始了长达一年的在浏览器中运行《Terraria》和《Celeste》游戏的旅程。

  • Terraria:两者都用 FNA 引擎用 C#编写,作者试图以相同方式移植。最初因缺少ReLogic.dll导致反编译失败,后从游戏资源中提取该库成功反编译并重新编译,在 Linux 上运行。项目目标是将其编译为 WASM 并配置 Emscripten,虽编译无问题但 FNA 引擎部分用 C++编写需链接原生组件,通过FNA-WASM-BUILD自动化处理。最终编译出 WebAssembly 和 JS 包,通过修改 Terraria 的 Linux 入口点和创建简单循环驱动 FNA 游戏循环,利用Origin Private File System加载游戏资产,虽解决了一些问题但因.NET 8.0 wasm 不支持新线程导致游戏崩溃,后等待.NET 9.0 稳定发布解决该问题,还通过代理 OpenGL 调用到主线程等方式让游戏最终运行起来,可在这里游玩,查看git 仓库
  • Celeste:与 Terraria 同引擎,复制粘贴代码,升级 SDL3 工具链以使用OffscreenCanvas避免代理 hack,但存在依赖问题,Celeste 用专有 FMOD 库,虽有 emscripten 版本但不支持在 worker 中运行,通过提取.o文件插入编译后的代码解决。还尝试让[Strawberry Jam]mod 和Everest 模组加载器在浏览器中运行,其中 MonoMod.RuntimeDetour 是难点,在 WebAssembly 中通过修改 IL 字节码而非原始程序集来实现函数劫持,虽历经困难最终成功,实现了 Everest 在浏览器中的运行,可在这里游玩,查看git 仓库
  • Why:作者表示这个项目可能对大多数人无用,很少有人会在浏览器中玩完《Celeste》或《Terraria》,但这是他做过最有趣的项目之一,有独特约束、涉及有趣技术并结识了一些很酷的人,有时只是为了好玩而尝试一些晦涩技术在网上做一些不切实际的事情是值得的。
阅读 6
0 条评论