open-sourcedemaken64puzzleplatformerportal type: concept 创建: 2026-04-09 更新: 2026-04-09
Portal64 Still Alive
Valve Portal 的 N64 demake(复古平台重制版),移除私有 libultra 依赖,17 个测试室可玩
基本信息
| 项目 |
内容 |
| GitHub |
https://github.com/mwpenny/portal64-still-alive |
| 语言 |
C(主代码)+ 少量 C++ |
| 构建系统 |
CMake(多子目录 CMakeLists.txt) |
| 渲染/引擎 |
N64 libultra 私有库(正在迁移至 libdragon 开源替代) |
| 许可 |
源码 MIT/BSD-like,游戏资产需原版 Portal |
| 原作者 |
James Lambert(被 Valve 要求下架原版) |
| Fork 目标 |
移除 Nintendo libultra 私有依赖,完成游戏开发 |
核心技术点
N64 Demake 架构
- Portal 核心系统移植:传送门枪物理、胶囊体碰撞、portal surface 生成
- Skeletool64 骨骼动画工具:读取
assets/materials/*.yaml 生成静态显示列表(display list)代码
- 17 个测试室已完成:chamber 00-16 可玩,含炮台、传送门、伴生立方体
- scene/render_plan.c(635行)、scene/portal_surface_generator.c(1109行):核心渲染与传送面生成逻辑
- physics/ 子系统(EPA 碰撞+contact_solver+collision_scene,约 2.2K 行):GJK/EPA 碰撞算法
libultra 依赖问题
- 原版依赖 Nintendo 私有 libultra(音频、显示处理、信号处理、系统调用)
- 正在迁移至 libdragon(开源 N64 开发库,支持 OpenGL 1.1)
- debugger/usb.c(1497行)和 debugger/debug.c(2195行):硬件调试支持(USB 调试钩子)
资源管线
- vpk/ 子目录:VPK 文件提取工具,从原版 Portal 提取游戏资源
- assets/ 多子目录:translations/test_chambers/materials/models/fonts/sound,CMake 资源打包
- locales/:多语言字幕/音频支持
存档系统
- savefile/ 模块(serializer + checkpoint + scene_serialize,共约 1.5K 行)
- SRAM 32KB 存档支持,含检查点序列化
玩法特点
- 完整 Portal 核心机制:portal gun、portal surface、physics engine
- 主菜单 + 暂停菜单
- 过场动画(cutscene_runner.c,720行)
- 音效/对话/多语言字幕
- 渲染特效(反射、视觉效果)
对公司 AI 游戏的参考价值
| 方向 |
启示 |
| Demake 架构 |
如何将现代 3D 游戏内容反向移植到复古平台(N64 硬件约束) |
| 物理系统 |
EPA/GJK 碰撞检测在受限硬件上的实现 |
| 资源管线 |
如何从商业游戏提取资产并重新打包用于开源项目 |
| libultra 替代 |
从私有 SDK 迁移到开源替代(libdragon)的增量迁移策略 |
| 调试基础设施 |
USB 硬件调试钩子设计(debugger 模块 3.6K 行) |
源码规模
- 总规模:约 41,674 行 C 代码(不含 asm/linker/vpk/tools)
- 最大文件:debug.c(2195行)、portal_surface_generator.c(1109行)、player.c(1239行)
- 模块化结构:audio/controls/decor/effects/font/graphics/levels/materials/math/menu/physics/player/scene/sk64/strings/system/util
开发状态
- ✅ Chamber 00-16 完成
- ⏳ Chamber 17:伴生立方体完成,焚化炉未完成
- ❌ Chamber 18-19、逃脱关卡、Credits 未完成
- 目标:完成所有关卡 + 移除 libultra 依赖