captn3m0/paperhexagon

GitHub: captn3m0/paperhexagon

将经典游戏 Super Hexagon 通过反编译移植到 Linux 桌面与 Playdate 平台的逆向工程教学项目。

Stars: 1 | Forks: 0

# Paper Hexagon 原版 Super Hexagon 的反编译移植版本。可同时为 Linux 和 Playdate 编译。 请访问 查看相关博客文章。 ## 快速开始 ``` cd clean git submodule update --init # ONE-TIME: fetch the pinned openFrameworks nightly ninja # compile + link -> dist/paperhexagon cd dist ./paperhexagon ``` 该二进制文件必须在包含 `data/` 的目录下运行。**本源码不包含音乐和 音效资源** —— 请参阅下方的[音频资源](#音频资源)(如果缺少这些文件,构建过程会提前报错中止)。 ### Playdate 构建 Playdate 移植版基于一个 Open Frameworks shim 编译相同的代码(详见 `playdate/README.md`): 您需要预先安装 Playdate SDK。 ``` ninja pdx # -> dist/Playagon.pdx (sim pdex.so + ARM device pdex.elf, via pdc) ninja pdcheck # headless smoke gate for the sim binary (no GUI) ``` ## 音频资源 Chipzel 的绝佳音乐并未包含在本仓库中。请在以下路径提供您自己的副本: | 构建 | 音乐曲目 | 音效 | | --- | --- | --- | | 桌面版 | `dist/data/music/music0.dat` … `music5.dat` | `dist/data/sounds/*.ogg` | | Playdate | `playdate/Source/data/music/music0.wav` … `music5.wav` | `playdate/Source/data/sounds/*.wav` | - **音效**(每个构建各 16 个,基础名相同):`awesome begin die excellent gameover hexagon line menuchoose menuselect pentagon rankup square start superhexagon triangle wonderful`。 - **格式。** 桌面版曲目采用游戏专属的 `.dat` 节拍/流容器格式,且 桌面版 SFX 为 Ogg Vorbis;Playdate 音频采用 16-bit PCM WAV 格式(在打包 `.pdx` 时,`pdc` 会将其转换为 `.pda`)。 构建过程**会检查这些文件并在缺失时提前中止**,并会列出每一个缺失的文件名 —— 相关实现在 `tools/check_assets.sh` 中,该脚本已集成至 `ninja`(桌面版)和 `ninja pdx`(Playdate)中 —— 因此,如果在没有这些文件的情况下进行构建,将会以清晰的报错信息停止,而不是在游戏运行时默默出现“没有声音”。上述路径已被 gitignore 忽略,因此您的本地副本永远不会被重新提交到仓库中。 ## 依赖要求 **构建工具** - `git`(用于 openFrameworks submodule;构建过程会通过 `git` 重新应用我们的 OF 补丁) - `ninja` (≥ 1.10) - 支持 C++17 的 `g++` / `gcc`(任何现代版本的 GCC 或 Clang 均可) - `pkg-config` 链接器使用的是 GNU `bfd`(默认)。在 `gen_ninja.sh` (`-fuse-ld=bfd`)中已被显式锁定,因为在使用当前的 GCC 时,`mold`/`gold` 会对静态初始化程序(static initialisers)进行错误排序,并在进入 `main` 之前崩溃;如果您愿意,使用 `lld` 也可以正常工作。 **宿主机开发库。** 这些是游戏在系统层面的依赖项 —— 即链接输入以及 `ofMain.h` 引入的头文件。下表列出的正是该二进制文件的 `DT_NEEDED` 集合(可通过 `objdump -p dist/paperhexagon | grep NEEDED` 或 `ldd dist/paperhexagon` 查看);每一行都标注了提供该库的 Arch 软件包。 | 用途 | 库 (Arch package) | | --- | --- | | OpenGL + loader | `libGL`, `libGLU` (`mesa`, `glu`) · `libGLEW` (`glew`) | | 窗口管理 (GLFW → X11) | `libglfw` (`glfw`) · `libX11` `libXrandr` `libXi` `libXcursor` `libXinerama` | | 音频 | `libopenal` (`openal`) · `libsndfile` | | 文本 / 矢量 | `libcairo` · `libfreetype` (`freetype2`) · `libfontconfig` | | URL loader (OF `ofURLFileLoader`) | `libcurl` · `libssl` `libcrypto` (`openssl`) · `liburiparser` | | 视频 (由 OF core 链接) | `libgstreamer-1.0` `-base` `-app` `-video` (`gstreamer`, `gst-plugins-base`) | | 数学运算 (仅头文件) | `glm` (系统库, `/usr/include/glm`) | `libpthread`, `libdl`, `libm`, `libstdc++`, `libgcc_s` 均随工具链 / glibc 附带;`libglib-2.0` / `libgobject-2.0` 则作为 gstreamer 和 cairo 的依赖被间接引入。构建时的头文件查找均通过 `pkg-config` 进行(`freetype2`, `cairo`, `gstreamer-1.0`/`-app`/`-video`)。 在 Arch 上,只需一行命令即可安装上述所有的构建工具和库: ``` pacman -S git ninja base-devel pkgconf \ mesa glu glew glfw glm \ openal libsndfile cairo freetype2 fontconfig \ curl openssl uriparser \ libx11 libxrandr libxi libxcursor libxinerama \ gstreamer gst-plugins-base ``` 尽管该游戏并未编译任何 `video/*.cpp` 且不获取视频,gstreamer **确实**被链接了(OF 的核心引用了它)—— 它的四个 `libgst*` 对象会出现在 `ldd` 的输出中。**未**使用 `libportaudio`:声音处理通过 OpenAL (`-DOF_SOUND_PLAYER_OPENAL`)进行,因此在升级到 OF-nightly 时移除了 portaudio。 ## 来源说明 基于 **Super Hexagon 的 GOG Linux 构建版本** (Terry Cavanagh) 重构,该原版最初使用 GCC 4.7.2 / OpenFrameworks 0.7.x 构建,并由 flibitijibibo 打包。本移植版本在现代的宿主机工具链上基于**原生 openFrameworks (nightly)** 编译,并 Mock 了 FreeImage 且移除了网络功能。
标签:C++, Playdate, 云资产清单, 开源移植, 数据擦除, 游戏, 逆向工程