sp00nznet/shufflepuck-cafe

GitHub: sp00nznet/shufflepuck-cafe

将 1988 年 Macintosh 经典游戏 Shufflepuck Cafe 的 68k 二进制通过静态重编译技术提升为原生 C 代码并以 SDL2 运行,无需模拟器。

Stars: 2 | Forks: 0

# 🏓 SHUFFLEPUCK CAFE — 静态重编译 ``` ___ _ _ _ _ ___ ___ _ ___ ___ _ _ ___ _ _ / __| || | | | | __| __| | | __| _ \ | | / __| |/ / \__ \ __ | |_| | _|| _|| |__| _|| _/ |_| | (__| ' < |___/_||_|\___/|_| |_| |____|___|_| \___/ \___|_|\_\ C A F E · 1 9 8 8 ``` **Broderbund,1988 → 原生代码,今天。** 没有模拟器。原始的 68k Macintosh 二进制文件,被拆解并重新构建。 ![Shufflepuck Cafe 标题画面](https://static.pigsec.cn/wp-content/uploads/repos/cas/f2/f210b819a6aedbabea4d22ee991151318d70d525b826946ca79e651a769ff895.png) *标题画面 — 防拷保护已被破解,68k 已被提升为 C, 并且重编译后的游戏通过 Toolbox HAL 启动并绘制了此画面。*
## 这是什么? *Shufflepuck Cafe* 是 **Broderbund** (Christopher Gross, Lauren Elliott, Gene Portwood) 于 1988 年推出的一款空气曲棍球游戏。你坐在一个肮脏的太空港 食堂的桌前,与一群怪人一对一打曲棍球 puck — 神经质的机器人 **Skip Feeney**,作弊的外星人 **Biff Raunch**,不可触碰的 **Princess Bejin**,怪物般的 **Adder** — 在华丽的 512×342 **1-bit 黑白**画面中。球拍跟随你的鼠标,puck 撞击墙壁反弹,而你的对手们*大喷垃圾话*。某类孩子 (👋) 把整个周末都沉浸在其中。 它也非常*小巧* — 一个 `PUCK` 创建者应用程序,**6 个 CODE 段, 约 52 KB 的 68k 代码**,以及作为资源的美术/声音 — 这使其成为 **静态重编译**的理想候选:不是模拟一台 Mac,而是将原始的 68000 机器码提取为 C,在今天原生编译和运行。 这个仓库就是这项成果,使用 [**macrecomp** 工具包](https://github.com/sp00nznet/macrecomp) ( vendored 在 [`ext/macrecomp`](ext/macrecomp))构建 — 它是 DOS 时代 pcrecomp 流程的经典 Mac 兄弟版本,曾让 *Bolo* 和 *SkiFree* 重获新生。 ## 为什么要这么做? 因为模拟只是运行旧游戏;重编译则*释放*了它们。输出是你可以阅读、调试、修复和扩展的原生代码 — 宽屏、存档状态、恢复的声音,甚至可能是那些没人能打败的对手。而且因为有些游戏值得比它们的 800K 软盘活得更久。 ## 工作原理 ``` Shufflepuck Cafe (HFS app: CODE 0..5 + 187 PICT + 27 ASND + MENU/DITL/…) │ ① extract ext/macrecomp/tools/extract_resources.py ▼ CODE segments + asset catalog │ ② disassemble capstone M68K │ ③ classify enumerate Toolbox A-traps ← the go/no-go gate ▼ function table + trap set │ ④ lift 68k → C against the macrecomp runtime ▼ C source ──⑤ HAL──▶ QuickDraw→SDL2, Toolbox→runtime ──⑥ build──▶ native PUCK ``` ## 状态 🚧 **阶段 0 已完成 — 病人已躺在手术台上,而且是个干净、小巧的病人。** 对 4am 破解的 v1.0 磁盘进行了真正的逆向侦察 (`Shufflepuck Cafe`,类型 `APPL`, 创建者 `PUCK`,644 KB 资源分支): - ✅ **获取并挂载**了 HFS 镜像;使用 macrecomp 的 `extract_resources.py` 提取了所有资源。完整映射见 [`docs/RECON.md`](docs/RECON.md)。 - ✅ **代码非常小:** `CODE` 0–5 = **54,202 字节**(段 0 是 2,136 字节的 A5 跳转表;真正的逻辑约 52 KB,分布在 5 个段中 — 比 Bolo 还小)。 - ✅ **资产已编目:** **187 个 `PICT`** (177 KB,标准 1-bit QuickDraw — 球桌、酒吧、每个对手的动画帧),**27 个 `ASND`** (391 KB — Broderbund 的*自定义*异步声音类型,待逆向),位图 `FONT`/`FOND`, 以及正常的 `MENU`/`DITL`/`DLOG`/`WIND`/`ALRT`/`CURS`。 - 🔎 **范围已读取:** 单个黑白窗口 + 鼠标。Toolbox 接口面应该是 有限的 — QuickDraw 位块传输、事件循环、一些菜单/对话框,以及声音。 阶段 2 将统计确切的 trap 并进行确认。 | 阶段 | 内容 | 状态 | |------:|------|-------| | 0 | 获取 + 侦察 | ✅ [`docs/RECON.md`](docs/RECON.md) | | 1 | 提取资源 (CODE + 资产) | ✅ 通过 `ext/macrecomp` | | 2 | 反汇编 + 分类 trap 接口面 | ✅ [`docs/CLASSIFY.md`](docs/CLASSIFY.md) — **可以执行,但代码有保护** | | 2.5 | 解包自解密的 CODE | ✅ [`docs/PROTECTION.md`](docs/PROTECTION.md) — **已破解,字节精确** | | 3 | 将 68k 提升为 C | ✅ **98.5 / 99.9 / 100%** 覆盖率;整个程序编译 + 链接 | | 4 | Toolbox HAL → SDL2 (QuickDraw/Event/Sound) | ✅ 约 95 个 trap + Resource Mgr + CopyBits/DrawPicture | | 5 | 将游戏连接到 HAL + 调试至可玩的牌桌 | 🟢 **运行其主渲染循环** — 每帧 70 万+ trap 无崩溃;需要离屏位图 QuickDraw + 输入 (见下文) | | 6 | 发布原生版本及附加内容 | ⬜ | 路线图见 [`docs/PLAN.md`](docs/PLAN.md)。 ## 仓库布局 ``` shufflepuck-cafe/ ext/macrecomp/ the 68k-Mac static-recomp toolkit (git submodule) docs/ RECON.md · PLAN.md original/ your own copy of the game (gitignored — see below) work/ regeneratable extraction/analysis output (gitignored) src/ lifted + hand-written runtime glue (later phases) ``` ## 构建与运行 提升后的 C 代码现在可以**编译并链接**成原生二进制文件(目前还不能*游玩* — 这需要阶段 4 的 Toolbox HAL)。克隆时带上工具包子模块,将你自己的磁盘镜像放入 `original/`,然后构建: ``` git clone --recursive https://github.com/sp00nznet/shufflepuck-cafe.git # 已经克隆过了? git submodule update --init --recursive # 需要:python3 + macresources/machfs/capstone,以及一个 C compiler # (Windows/MSYS2:先 export PATH="/c/msys64/mingw64/bin:$PATH") ./build.sh "original/Shufflepuck Cafe - Disk 2 (Game).dc42" ``` `build.sh` 会从*你的*镜像重新生成提升后的代码并进行编译 — **此仓库中没有提交任何游戏衍生的内容**(`src/gen/` 已被 gitignored; 见法律声明)。这里只有手写的支撑层 (`src/main.c`) 和工具包。 ## 致谢与法律 原始游戏 © 1988 **Broderbund Software** (Christopher Gross, Lauren Elliott, Gene Portwood)。*Shufflepuck Cafe* 早已绝版且不再受支持。这是一个 个人保存 / 逆向工程项目。 **本仓库不包含任何游戏代码或数据。** 与自由许可的共享软件不同,Shufflepuck 是商业废弃软件 — 因此磁盘镜像、提取的 `CODE`/`PICT`/`ASND` 资源,以及它们的任何提升表示形式都保留在仓库之外(`original/` 和 `work/` 已被 gitignored)。你需要提供自己的副本;v1.0 镜像由社区在 Internet Archive 和 Macintosh Garden 上保存。这里的所有原始代码(工具和手写的 runtime)均为 MIT 许可证 — 见 [LICENSE](LICENSE)。 使用 [macrecomp](https://github.com/sp00nznet/macrecomp) 构建,并伴随着对一个从未存在过的食堂 过多的怀旧之情。
标签:68k架构, Macintosh, SDL2, 云资产清单, 复古游戏, 客户端加密, 逆向工具, 逆向工程, 静态重编译