MrPowerGamerBR/Butterscotch
GitHub: MrPowerGamerBR/Butterscotch
Butterscotch 是 GameMaker: Studio 运行器的开源重新实现,通过直接解释执行字节码让游戏能够运行在官方未支持的平台上,同时提供强大的调试与分析能力。
Stars: 182 | Forks: 31
🥧 Butterscotch 🥧
当你在 GameMaker: Studio 中创建游戏并将其导出时,GameMaker: Studio 会将游戏代码导出为 bytecode 而不是原生编译代码,并且该 bytecode 与任何其他 GameMaker: Studio 运行器(也称为 YoYo runner)兼容,只要它们具有匹配的 GameMaker: Studio 版本即可。这类似于 Java 应用程序的工作原理。 这就是 [Droidtale](https://mrpowergamerbr.com/projects/droidtale) 等项目(这也是由区区在下制作的)能够存在的原因。我们利用了 GameMaker: Studio 游戏会编译成 bytecode 这一特性,这意味着它们可以在*任何*拥有官方运行器的平台上运行! 自从 10 多年前我创建了 Droidtale 以来,脑海中就一直萦绕着一个想法……既然 GameMaker 游戏使用的是 bytecode,是什么阻止了我们创建*自己的*运行器呢?如果我们能编写*自己的*运行器,又是什么阻止了我们将 GameMaker: Studio 游戏移植到其他平台呢? 而这正是 Butterscotch 的用武之地!Butterscotch 是 GameMaker: Studio 运行器的开源重新实现。 **Butterscotch PlayStation 2 ISO 生成器:** https://butterscotch.mrpowergamerbr.com/ ## 游戏兼容性 Butterscotch 的目标是让 Undertale v1.08(GameMaker: Studio 1.4.1804,Bytecode 版本 16)能够完全游玩。但我们也希望在未来能支持更多的 GameMaker: Studio 游戏! 虽然我们的目标是 Undertale v1.08,但这并不意味着其他游戏*不能*在 Butterscotch 中运行!因为 Butterscotch 是一个运行器而不是 Undertale 的移植版/重制版,你*可以*用它来运行其他 GameMaker: Studio 游戏,只要该游戏是使用 GameMaker: Studio 1.4.1804 编译的,并且它们只使用了 Butterscotch 支持的 GML 变量和函数,就应该能正常运行。 以下是 Butterscotch 支持的 Bytecode 版本 * Bytecode 版本 15 * Bytecode 版本 16 * Bytecode 版本 17 然而,这并不意味着使用兼容版本的游戏*就一定能*运行!Bytecode 支持仍在开发中 (WIP),并且 Butterscotch 可能会存在原始 GameMaker: Studio 运行器所没有的一些怪异行为。 当然,也有会完全破坏游戏兼容性的例外情况: * 使用 YYC 编译的游戏,因为它们使用的是原生代码而不是 bytecode。 * 使用新的 [GMRT](https://github.com/YoYoGames/GMRT-Beta/tree/main) 编译的游戏,因为它们使用的是原生代码而不是 bytecode。 ## 支持的平台 * Linux (GLFW, OpenGL) * macOS (GLFW, OpenGL) * Windows (GLFW, OpenGL, MinGW) * PlayStation 2 (ps2sdk, gsKit) * Haiku (GLFW) * ...未来可能还会支持更多! ## 社区移植版 * 由 @ceilingtilefan 制作的 [Xbox 360 (Butterscotch-360)](https://github.com/ceilingtilefan/Butterscotch-360) ## 构建 Butterscotch ``` mkdir build && cd build cmake -DPLATFORM=glfw -DCMAKE_BUILD_TYPE=Debug .. make ``` 如果你使用的是 CLion,请在 `Settings` > `Build, Execution, Deployment` > `CMake` 中设置平台,并添加 `-DPLATFORM=glfw` 然后使用 `./butterscotch /path/to/data.win` 运行 Butterscotch! ## CLI 参数 GLFW 目标平台有许多实用的 CLI 参数,可用于跟踪和调试在其上运行的游戏。 * `--debug`:启用调试快捷键 * `--screenshot=file_%d.png`:对运行器进行截图,需要配合 `--screenshot-at-frame` 使用。 * `--screenshot-at-frame=Frame`:在特定帧对运行器进行截图。可以多次使用。 * `--headless`:以 headless 模式运行运行器。在 headless 模式下运行时,游戏将以你的系统能处理的最大速度运行。 * `--print-rooms`:打印 `data.win` 文件中的所有房间并退出。 * `--print-declared-functions`:打印 `data.win` 文件中所有已声明的函数(脚本、对象事件等)并退出。 * `--trace-variable-reads`:跟踪变量读取 * `--trace-variable-writes`:跟踪变量写入 * `--trace-function-calls`:跟踪函数调用 * `--trace-alarms`:跟踪 alarms * `--trace-instance-lifecycles`:跟踪实例的创建和删除 * `--trace-events`:跟踪事件 * `--trace-event-inherited`:跟踪 event inherited 调用 * `--trace-tiles`:跟踪绘制的 tiles * `--trace-opcodes`:跟踪 opcodes * `--trace-stack`:跟踪堆栈 * `--trace-frames`:记录帧何时开始和结束,包括处理每一帧所花费的时间。 * `--always-log-unknown-functions`:启用后,Butterscotch 将始终记录未知函数,而不是每个脚本只记录一次。 * `--always-log-stubbed-functions`:启用后,Butterscotch 将始终记录存根函数,而不是每个脚本只记录一次。 * `--trace-bytecode-after-frame`:设置后,控制 `--trace-opcodes` 和 `--trace-stack` 何时开始记录。在调试解释器开销大的脚本时非常有用。 * `--exit-at-frame=Frame`:在 X 帧后自动退出运行器。 * `--speed`:速度倍数 * `--seed=Seed`:为运行器设置固定的 seed,对于需要可复现的运行非常有用。 * `--print-rooms`:将所有房间以及房间中存在的所有对象打印到控制台。 * `--print-declared-functions`:打印游戏声明的所有 GML 脚本 * `--disassemble`:反汇编特定脚本 * `--record-inputs`:记录用户输入 * `--playback-inputs`:回放用户输入 * `--os-type`:允许更改内置的 `os_type` 值。默认为 Windows。例如:在运行 Undertale Xbox 版本时,你需要将其设置为 `--os-type xboxone`。 * `--profiler`:记录哪些 GML 脚本在执行时间和执行指令数方面开销最大。 ## 调试功能 当使用 `--debug` 运行 Butterscotch 时,将启用以下快捷键: * `Page Up`:前进一个房间 * `Page Down`:后退一个房间 * `P`:暂停游戏 * `O`:在暂停期间,将游戏循环推进一帧 * `F12`:将当前运行器状态转储到控制台 * `F11`:将当前运行器状态转储到控制台(JSON 格式),或者在设置了 `--dump-frame-json-file` 时将其转储到文件中。 * `F10`:将 `global.interact` 标志设置为 `0`。在 Undertale 中,当你在房间间移动而其中一个房间开启了不允许你移动的过场动画时,这会非常有用。 ## 性能 在任何现代计算机上性能都非常好,但在低端目标平台(如 PS2)上运行时,如果屏幕上有大量实例,或者某个实例执行 for 循环,速度会变得*非常*慢。 ## 那为什么不使用转译器呢? 转译器的问题在于,如果你尝试以“简单”的方式转译游戏,即像原始 bytecode 那样发出 VM 调用,你将无法从中获得任何*改进*。你需要创建一个*优秀*的转译器,将其真正转译为*优质*的代码,而这要困难得多。 使用转译器还有其他缺点: 1. 你会失去通过跟踪 opcodes 在“高级”层面调试运行器的能力。 2. 编译速度极慢,在一台现代计算机上,以简单方式将 Undertale 转译为 C 语言并进行构建需要 90 秒,而将其构建到其他目标平台则慢到甚至无法进行测试。 ## 截图 ### Undertale (GLFW) [Bytecode 版本 16]
### Undertale (PlayStation 2) [Bytecode 版本 16]
这是一个视频 :3 https://youtu.be/PuzBxe0VGtY
### DELTARUNE (SURVEY_PROGRAM) (PlayStation 2) [Bytecode 版本 16]
这是一个视频 :3 https://youtu.be/TLJtV2WnrmQ
### DELTARUNE Chapter 2 (GLFW) [Bytecode 版本 17]
### DELTARUNE Chapter 3 (GLFW) [Bytecode 版本 17]
### DELTARUNE Chapter Selector (GLFW) [Bytecode 版本 17]
标签:Bash脚本, C++, Droidtale, GameMaker, GML, PlayStation 2, UML, Undertale, YoYo Runner, 云资产清单, 传说之下, 字节码, 客户端加密, 开源, 数据擦除, 游戏开发, 游戏引擎, 游戏移植, 生成式AI安全, 虚拟机, 运行器, 逆向工程, 重新实现