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, 云资产清单, 开源移植, 数据擦除, 游戏, 逆向工程