Cahb/skippy-re
GitHub: Cahb/skippy-re
基于逆向工程的经典游戏引擎重制项目,使用 C11 和 raylib 在 Linux 上从零重建了2001年3D益智平台游戏「Skippy / Ka'roo」的完整引擎。
Stars: 3 | Forks: 0
# Skippy / Ka'roo — 原生重写
这是一个从零开始的原生 **C11 + [raylib](https://www.raylib.com/)** 重实现项目,复刻了 2001 年的
Win32 游戏 **Skippy Adventures / Ka'roo** (Fakt-Software),在现代 Linux 上运行 —— 通过
**主动逆向工程** 原始二进制文件及其数据格式构建而成。

## 项目简介
原版游戏是一款采用 3D 渲染的 **2D 网格** 益智平台游戏:你控制一只袋鼠 跨越
悬浮平台,收集水晶以开启关卡出口,躲避敌人,并与时间赛跑。本项目从零开始重建了游戏引擎 —— 包括游戏循环、物理模拟、渲染器 —— 所有逻辑均基于从已发布的原始二进制文件中提取的知识(通过 Ghidra 进行反汇编、数据格式解码,以及直接从可执行文件中提取的物理/时间常数和行为规则)。
加载/解析路径已逐字节移植以完全匹配原版:它完全按照游戏原本的方式读取已发布的
`.gam / .jjm / .mdl / .ani / .thm / .par / .tga / .wav / .leo / .jjs / .cdt` 文件 —— 格式相同、字段含义相同、slot 枚举相同。存档和最高分以
**原始文件格式** (`.sav` / `.hsc`) 写入,与真实游戏实现字节级兼容。驱动这一切的逆向工程笔记位于
[`reference/`](reference/);[`reference/ARCHITECTURE.md`](reference/ARCHITECTURE.md) 是引擎概述。
## 状态
几乎整个游戏都已就位且可玩:
- **资源加载器** (`.gam .jjm .mdl .ani .thm .par .tga .leo .jjs .cdt`) —— 已通过游戏自带的 `LevelReport.txt` 调试预言机和字节级一致的往返测试验证。
- **渲染** —— 带纹理的悬浮平台瓦片、阶梯、天空盒、按主题划分的世界
(森林 / 城堡 / 水域 / 埃及 / 太空 / 糖果 / 决战),以及一个完全**数据驱动的 `.thm`
Field-layer 渲染器**:每个主题的有序纹理堆栈都有各自的混合模式、
Active/InActive 状态条件,以及 Turn/Scroll/Pulse/Wobble/Flash 动画 —— 无需任何针对特定主题的特殊处理。
- **移动与物理** —— 网格步进的坦克式操控,经逆向验证的重力 / 坠落 / 阶梯规则、
摔落死亡、冰面滑行、强制方向滑道、滑翔伞滑翔(支持在半空中收集物品,正如某些关卡所要求的那样)。
- **瓦片与机关** —— 电梯、移动平台、传送门、弹跳板、开关 +
伸缩桥、粘性踏板、坍塌/再生的破坏区、爆破清除的障碍物。
- **实体** —— 带有 BFS 追踪 AI 的捕捉型敌人、投射炮台、敌人工厂
(存活数量上限,始终重生)、阻挡瓦片的敌人碰撞。
- **拾取物** —— 水晶、爱心、时间、冰冻、加速、炸弹、滑翔伞充能、保护、
反向/减速负面效果,以及**惊喜盒子** (随机摇奖,直接源自逆向分析)。
- **炸弹** —— 可投掷、可滑翔、可乘骑移动平台、可在冰面滑动、带有引线燃烧音效、能够清除障碍物并击杀敌人的 3×3 爆破。
- **菜单与持久化** —— 脚本化 `.jjs` 摄像机背景上的标题菜单、暂停菜单、
选项 (音乐/音效音量)、使用原版 `.sav` 插槽的存档/读取、名字输入、
原版 `.hsc` 格式的**最高分**,以及采用原版精确计分公式的关卡完成分数摘要 (水晶、额外物品、敌人、时间、西西弗斯、生命力)。
- **音频** —— 主题驱动的事件 SFX(带有语音池、3D 定位混音)、`.leo` 环境音
循环(喷泉、蜜蜂)、状态持有的持续循环(滑行、移动平台)和重触发音效
(炸弹引线、最后几秒的倒计时),完美复现了原版对 DirectSound 的调用,并且通过 `JJ.CDT` 音轨映射,从你自己抓取的 `audio/TrackNN.wav` 文件中按世界流式传输 **CD 音乐**。
- **特效** —— 解码后的二进制 `.par` 粒子系统:水晶发光、出口光环、爆破碎片、
蜂群、飞溅的喷泉、死亡天使升天。
- **HUD** —— 原汁原味的按主题划分的面板、位图字体、计时器/计数器、雷达小地图、奖励状态图标。
- **调试工具** —— 自由视角、暂停 / 逐帧步进、点击拾取器 + 瞬移、动画检查器、
关卡切换、调试覆盖层。
### 已知限制
**不保证能够顺畅完成从头到尾的完整通关。** 重写版在已测试的部分表现得很逼真,
但某些关卡仍可能因未完善的粗糙之处而卡关 —— 敌人 AI 的怪异行为(寻路与原版存在差异,对时间敏感的机关设定),以及各种尚未完成逆向工程的行为细节缺陷。请将其视为一个可玩性极高的“在建工程”,而非最终完成的重制版。
| | |
| --- | --- |
|  |  |
|  |  |
## 构建
需要 C11 编译器和 **raylib**(在 `/usr/local` 下基于 raylib 6.0 开发,通过 `pkg-config` 寻找)。
```
make game # build build/game
make # build the format-loader test harnesses
make test # run loader tests against your game data
```
在 `-Wall -Wextra -Wshadow` 编译选项下,构建过程保持无任何警告。
## 运行
将其指向你自己的游戏安装目录(默认为 `../game_root/EN`):
```
make run # level 1
make run BASE=/path/to/game LEVEL=4
./build/game /path/to/game 4 # start at a level index
```
资源解析器支持处理 Windows 风格的路径和不区分大小写的查找,因此可以直接原样使用安装目录,无需重新打包。要播放音乐,请将光盘的音轨抓取为
` /audio/Track02.wav` …… —— 游戏会通过 `CDTracks/JJ.CDT` 将世界映射到音轨。
### 操控方式
| 按键 | 操作 |
| --- | --- |
| **W / S** | 向前 / 向后跳 |
| **A / D** | 向左 / 向右转 |
| **SPACE** | 投掷炸弹(如果有弹药) |
| **ESC** | 暂停菜单 (选项 / 存档 / 读取 / 退出) |
| **ENTER** | 确认 (菜单、分数摘要、跳过开场动画) |
| **方向键** | 菜单导航 |
调试按键:**F1** 自由视角 (WASD + Q/E 飞行,鼠标右键环顾,滚轮推拉,**G** 瞬移到选中的
瓦片),**F2** 截图,**F3/F4** 暂停 / 逐帧步进,**F5** 动画检查器 (**F6/F7**
循环播放片段),**F8/F9** 上一个 / 下一个关卡,**F10** 调试覆盖层,**F11** 填充水晶。
左键点击瓦片可对其进行检查。
## 目录结构
```
src/
formats/ asset loaders — engine-agnostic C (gam, jjm, mdl, ani, thm, par, tga, leo, jjs, sav, hsc, cdt)
sim/ grid + entities + per-frame tick (movement, physics, tiles, AI) — engine-agnostic
render/ renderer.h (thin backend interface) + renderer_raylib.c (rlgl immediate mode)
game/ scene loading, rendering passes, camera, HUD, menus, audio, FX, mode machine
main.c game loop
tests/ loader validation against real files + LevelReport oracle
reference/ reverse-engineering docs + found_structs_ghidra.h (read-only reference)
```
物理模拟和加载器与引擎无关;渲染器隐藏在一个小型接口
(`render/renderer.h`) 之后,以保持后端的可替换性。
## 致谢与出处
逆向工程(Ghidra、格式解码、物理/行为提取)、调试以及整体指导由 **Oleksandr Mazur** 完成。随后,代码库在与
**Claude (Anthropic)** 的深度合作下开发完成 —— 采用结对编程的方式,基于逆向得出的数据,共同完成了游戏移植、渲染器以及迭代式的玩法 / 特效 / 音频开发工作。
所有原始游戏资源、代码和商标仍归其各自的所有者
(Fakt-Software) 所有。这是一个独立的、非商业性质的粉丝向引擎重制项目:本项目**不包含**任何原始数据,旨在配合你自己拥有的游戏副本运行。
## 许可证
本仓库中的代码基于 [0BSD 许可证](LICENSE) 发布 —— 随意使用,
没有任何附加条件。(此许可仅涵盖重写版的代码,不包括原版游戏及其资源。)
标签:raylib, 云资产清单, 客户端加密, 文件解析, 游戏开发, 游戏引擎, 逆向工程