ButterscotchRunner/Butterscotch

GitHub: ButterscotchRunner/Butterscotch

Butterscotch 是 GameMaker: Studio 运行时的开源重新实现,使基于 bytecode 的 GameMaker 游戏能够跨平台运行到 Web、PS2、PS3 等非官方支持的平台上。

Stars: 323 | Forks: 87

Butterscotch Logo

🥧 Butterscotch 🥧

当你在 GameMaker: Studio 中创建并导出游戏时,GameMaker: Studio 会将游戏代码导出为 bytecode 而不是原生的编译代码,只要它们具有匹配的 GameMaker: Studio 版本,该 bytecode 就与任何其他 GameMaker: Studio runner(也称为 YoYo runner)兼容。这类似于 Java 应用程序的工作原理。 这就是 [Droidtale](https://mrpowergamerbr.com/projects/droidtale)(同样由本人制作)等项目能够存在的原因。我们利用了 GameMaker: Studio 游戏被编译为 bytecode 这一点,这意味着它们可以在*任何*拥有官方 runner 的平台上运行! 自从 10 多年前创建 Droidtale 以来,我的脑海中一直萦绕着一个想法……如果 GameMaker 游戏使用 bytecode,那么是什么阻止了我们创建*自己的* runner 呢?如果我们能编写*自己的* runner,又是什么阻止了我们将 GameMaker: Studio 游戏移植到其他平台呢? 这就是 Butterscotch 的用武之地!Butterscotch 是 GameMaker: Studio runner 的一个开源重新实现。 **Butterscotch Web (WASM):** https://butterscotch.mrpowergamerbr.com/web/ **Butterscotch PlayStation 2 ISO 生成器:** https://butterscotch.mrpowergamerbr.com/ ## 游戏兼容性 Butterscotch 的目标是能够完全游玩 Undertale v1.08(GameMaker: Studio 1.4.1804,WAD 版本 16)。但我们未来也确实希望支持更多的 GameMaker: Studio 游戏! 虽然我们的目标是 Undertale v1.08,但这并不意味着其他游戏*不能*在 Butterscotch 中运行!因为 Butterscotch 是一个 runner,而不是 Undertale 的移植版/重制版,你完全可以用它运行其他 GameMaker: Studio 游戏,只要该游戏是使用 GameMaker: Studio 1.4.1804 编译的,并且只使用 Butterscotch 支持的 GML 变量和函数,它就应该能正常运行。 Butterscotch 支持以下 WAD 版本: * WAD 版本 8(GameMaker: Studio 1.0.198+) * WAD 版本 9(GameMaker: Studio 1.0.527+) * WAD 版本 10(GameMaker: Studio 1.1.609+) * WAD 版本 11(GameMaker: Studio 1.1.754+) * WAD 版本 12(GameMaker: Studio 1.1.867+) * WAD 版本 13(GameMaker: Studio 1.1.917+) * WAD 版本 14(GameMaker: Studio 1.4.1464+) * WAD 版本 15(GameMaker: Studio 1.4.1675+) * WAD 版本 16(GameMaker: Studio 1.4.1767+) * WAD 版本 17(GameMaker: Studio 2.2+) 其他模组工具(例如 UndertaleModTool)将其称为“bytecode 版本”而不是“WAD 版本”。我们决定使用 WAD 版本,是因为有些 GameMaker: Studio 版本(WAD 版本 6 和 7)根本不使用 bytecode,因此称其为“bytecode 版本”并不十分准确,而且 YoYo Runner 在底层也是这样称呼它的。 GameMaker: Studio 1.0.198 之前的版本(即 WAD 版本 8 之前)使用在加载时解释的原始 GML 代码,因此这些版本需要 GML 编译器才能在 Butterscotch 中获得支持。 然而,这并不意味着使用兼容版本的游戏*就一定*能运行!bytecode 支持仍处于 WIP 阶段,而且 Butterscotch 可能会有原始 GameMaker: Studio runner 所没有的一些小毛病。 当然,也有一些会完全破坏游戏兼容性的例外情况: * 使用 YYC 编译的游戏,因为它们使用的是原生代码而不是 bytecode。 * 使用新的 [GMRT](https://github.com/YoYoGames/GMRT-Beta/tree/main) 编译的游戏,因为它们使用的是原生代码而不是 bytecode。 ## 支持的平台 * Windows * Web * PlayStation 2 * PlayStation 3 * ……未来可能还会支持更多! 此外,任何具有合理完整的 C 和 POSIX 一致性的平台都应该可以运行,以下平台已经过测试。 * glibc 版本老至约 1996 年的 Linux * 版本老至 2.2.8 的 FreeBSD * Haiku 以下后端可用于桌面平台(Windows 和 POSIX 系统)。 * GLFW 2 * GLFW 3 * SDL 1.2 * SDL 2 * SDL 3 已测试以下编译器可以成功构建 Butterscotch,旧版本可能也可以,但未经测试。 * C++ 模式下的 GCC 2.7 及以上版本,以及 C99 模式下的 3.0 及以上版本 * Clang 1.1 及以上版本 * TinyCC 0.9.27 及以上版本 * MSVC 19.29.30159 及以上版本 ## 社区移植版 * 由 @ceilingtilefan 制作的 [Xbox 360 (Butterscotch-360)](https://github.com/ceilingtilefan/Butterscotch-360) * 由 @casrielasriel, @grayforz24682, @d16.dorian, @ralcactus 制作的 [3DS 和 Wii U (Cinnamon)](https://github.com/Project-Sunshine-Native/cinnamon) ## 构建 Butterscotch ``` mkdir build && cd build cmake -DPLATFORM=desktop -DDESKTOP_BACKEND=glfw3 -DCMAKE_BUILD_TYPE=Debug .. make ``` 如果你使用的是 CLion,请在 `Settings` > `Build, Execution, Deployment` > `CMake` 中设置平台,并添加 `-DPLATFORM=glfw` 然后使用 `./butterscotch /path/to/data.win` 运行 Butterscotch! ## CLI 参数 GLFW 目标有许多很实用的 CLI 参数,你可以用它们来跟踪和调试在其上运行的游戏。 * `--debug`:启用调试热键。 * `--speed`:速度倍率。 * `--fast-forward-speed`:按下 TAB 键(切换)时的速度倍率。 * `--widescreen-hack`:强制游戏以宽屏模式运行(例如:`--widescreen-hack=16:9`)。 * `--screenshot=file_%d.png`:对 runner 进行截图,需要配合 `--screenshot-at-frame` 使用。 * `--screenshot-at-frame=Frame`:在特定帧对 runner 进行截图。可以多次使用。 * `--screenshot-surfaces=file_%d.%d.png`:截取所有表面(framebuffers),需要配合 `--screenshot-surfaces-at-frame` 使用。 * `--screenshot-surfaces-at-frame=Frame`:在特定帧截取所有表面。可以多次使用。 * `--headless`:以无头模式运行 runner。在无头模式下运行时,游戏将以你的系统所能承受的最大速度运行。 * `--trace-variable-reads`:跟踪变量读取。 * `--trace-variable-writes`:跟踪变量写入。 * `--trace-function-calls`:跟踪函数调用。 * `--trace-alarms`:跟踪 alarms。 * `--trace-instance-lifecycles`:跟踪实例的创建和删除。 * `--trace-events`:跟踪 events。 * `--trace-event-inherited`:跟踪 event inherited 调用。 * `--trace-tiles`:跟踪绘制的 tiles。 * `--trace-collisions`:跟踪实例之间的碰撞。 * `--trace-opcodes`:跟踪 opcodes。 * `--trace-stack`:跟踪 stack。 * `--trace-frames`:记录帧的开始和结束时间,包括处理每一帧所花费的时间。 * `--always-log-unknown-functions`:启用后,Butterscotch 将始终记录未知函数,而不是每个脚本只记录一次。 * `--always-log-stubbed-functions`:启用后,Butterscotch 将始终记录 stubbed 函数,而不是每个脚本只记录一次。 * `--trace-bytecode-after-frame`:设置后,控制 `--trace-opcodes` 和 `--trace-stack` 何时开始记录。在调试重度依赖解释器的脚本时非常有用。 * `--exit-at-frame=Frame`:在 X 帧后自动退出 runner。 * `--seed=Seed`:为 runner 设置固定的种子,适用于需要可复现的运行。 * `--print-rooms`:将所有 rooms 以及存在于该 room 中的所有 objects 打印到控制台。 * `--print-declared-functions`:打印游戏声明的所有 GML 脚本。 * `--print-objects`:打印游戏的所有 objects 定义。 * `--disassemble`:反汇编特定的脚本。 * `--record-inputs`:记录用户输入。 * `--playback-inputs`:回放用户输入。 * `--os-type`:允许更改内置的 `os_type` 值。默认为 Windows。示例:在运行 Undertale Xbox 时,你需要将其设置为 `--os-type xboxone`。 * `--profile-gml-scripts`:记录哪些 GML 脚本在耗时和执行指令方面是最繁重的。 * `--profile-opcodes`:对执行次数最多的 GML opcodes 进行排名。 ## 调试功能 当使用 `--debug` 运行 Butterscotch 时,将启用以下热键: * `Page Up`:向前移动一个 room * `Page Down`:向后移动一个 room * `P`:暂停游戏 * `O`:暂停时,将游戏循环推进一帧 * `F12`:将当前 runner 状态输出到控制台 * `F11`:将当前 runner 状态输出到控制台(JSON 格式),或者如果设置了 `--dump-frame-json-file`,则将其输出到文件中。 * `F10`:将 `global.interact` 标志设置为 `0`。在 Undertale 中,当你在各个 room 之间移动,而其中一个 room 开始了过场动画导致你无法移动时,这会非常有用。 ## 性能 在任何现代计算机上性能都非常不错,但在低端目标平台(如 PS2)上运行时,如果屏幕上有大量实例,或者某个实例执行 for 循环,速度就会变得*非常*慢。 ## 那为什么不使用转译器呢? 转译器的问题在于,如果你尝试以“简单”的方式转译游戏,也就是像原始 bytecode 那样发出 VM 调用,你将无法从中获得任何*改进*,你需要创建一个*优秀*的转译器,将其真正转译为*优质*的代码,而这要困难得多。 拥有转译器还有其他缺点: 1. 你失去了通过跟踪 opcodes 在“高级”层面上调试 runner 的能力。 2. 编译速度很慢,以简单的方式将 Undertale 转译为 C 并进行构建,在现代计算机上需要 90 秒,而将其构建到其他目标平台上的速度实在太慢了,我甚至都无法对其进行测试。 ## 截图 ### Undertale (GLFW) [WAD 版本 16] Image Image Image Image Image Image Image Image Image Image Image Image ### Undertale (PlayStation 2) [WAD 版本 16] 这是一个视频 :3 https://youtu.be/PuzBxe0VGtY 这是另一个视频,这次展示的是 Asriel Dreemurr 的最终战 https://youtu.be/vkQMqXr0MQE ### DELTARUNE (SURVEY_PROGRAM) (PlayStation 2) [WAD 版本 16] 这是一个视频 :3 https://youtu.be/TLJtV2WnrmQ ### DELTARUNE Chapter 2 (GLFW) [WAD 版本 17] image ### DELTARUNE Chapter 2 (PlayStation 2) [WAD 版本 17] 这是一个视频 :3 https://youtu.be/uuN72Hv50d4 ### DELTARUNE Chapter 3 (GLFW) [WAD 版本 17] image image image ### DELTARUNE Chapter 3 (PlayStation 2) [WAD 版本 17] 这是一个视频 :3 https://youtu.be/c9r79sQABYg ### DELTARUNE Chapter Selector (GLFW) [WAD 版本 17] image ### Undertale 10th Anniversary (GLFW) [WAD 版本 17] image image image ### NXTALE (Undertale for Xbox One) (GLFW) [WAD 版本 17] image image image image ### AM2R (GLFW) [WAD 版本 14] image image image ### GameMaker: Studio Platformer Demo (GLFW) [WAD 版本 10] image image
标签:Bash脚本, Bing搜索, GameMaker, Undertale, WASM, 客户端加密, 开源重实现, 游戏引擎