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 上运行 —— 通过 **主动逆向工程** 原始二进制文件及其数据格式构建而成。 ![duel](https://static.pigsec.cn/wp-content/uploads/repos/cas/e4/e4cce5341ec83a3453af73d5f86d6200955cc4a372c3be652433e4d13d721f7a.png) ## 项目简介 原版游戏是一款采用 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 的怪异行为(寻路与原版存在差异,对时间敏感的机关设定),以及各种尚未完成逆向工程的行为细节缺陷。请将其视为一个可玩性极高的“在建工程”,而非最终完成的重制版。 | | | | --- | --- | | ![first encounter](https://static.pigsec.cn/wp-content/uploads/repos/cas/7e/7e725a319afbf2cbd74fe92d5853a0fe415f2d7932d70d4e814cb59e43e7926b.png) | ![ufo fight](https://static.pigsec.cn/wp-content/uploads/repos/cas/f0/f045502ab4e78f9279ce0232c7e3e86ecc0a5aa0ba05eb00734382c107747193.png) | | ![blowup particles](https://static.pigsec.cn/wp-content/uploads/repos/cas/f4/f44c29b647c08515c9cb22df654b9374d39d3f832b4fc019b5dbbd371afc7514.png) | ![duel result](https://static.pigsec.cn/wp-content/uploads/repos/cas/27/27b45657f04921fdc59097999771088e205441e860950f9454b3be7867712f83.png) | ## 构建 需要 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, 云资产清单, 客户端加密, 文件解析, 游戏开发, 游戏引擎, 逆向工程