Profile
Back to NewsBack
GitHub Trending 2 min
Reader Mode
IllegalCreed/type-pal: 用 TypeScript 从零重写《仙剑奇侠传》(1995),浏览器里能通关,附可视化编辑器 · A from-scratch TypeScript remake of PAL (1995) with a visual editor. Unofficial fan project.

IllegalCreed/type-pal: 用 TypeScript 从零重写《仙剑奇侠传》(1995),浏览器里能通关,附可视化编辑器 · A from-scratch TypeScript remake of PAL (1995) with a visual editor. Unofficial fan project.

8 hours ago

Type PAL

简体中文 | English

用 TypeScript 从零写成的浏览器版《仙剑奇侠传》(1995,亦称 PAL):第一阶段可以在线玩到结局,第二阶段在做新运行时和可视化编辑器。

License: GPL-3.0</a> Live demo</a> TypeScript</a>

▶ 在线试玩

第一阶段可以在简体中文和英文之间切换。游戏里按反引号键打开工具,到「系统」里选语言,选项是「简体中文」和「English」。剧情文字、人名和菜单会跟着所选语言走。浏览器在本地记住这个选择。

在手机上、较窄的窗口里,或又矮又宽的窗口里,画面上会有方向键,以及确认和取消(英文界面写成 OK 和 Back)。按钮文字跟着语言变。同一处「系统」里可以显示或隐藏这组按键,浏览器也会在本地记住。普通的桌面窗口不显示它们。

!从改地图到试玩:地图编辑、场景编辑、NPC 脚本,再到编辑器内试玩

改地图、改场景、写 NPC 脚本,然后在编辑器里试玩。

客栈里的英文对话
第一阶段 · 客栈英文对话
英文游戏菜单
第一阶段 · 英文菜单
英文战斗指令
第一阶段 · 英文战斗指令
手机上的虚拟方向键和按钮
第一阶段 · 手机虚拟按键
余杭客栈对话
第一阶段 · 余杭客栈对话
回合制战斗
第一阶段 · 回合战斗
开发者工具面板
第一阶段 · 场景、坐标与剧本工具
速通计时
第一阶段 · 速通计时
苏州城地图
第二阶段 · 苏州城地图
角色属性
第二阶段 · 角色属性
战斗模拟器
第二阶段 · 战斗模拟器
引用诊断
第二阶段 · 引用诊断
编辑器内试玩
第二阶段 · 编辑器内试玩

它是什么

| 阶段 | 状态 | 内容 | |---|---|---| | 第一阶段 · 忠实复刻 | v1.1.0 已上线 | 浏览器运行时 @type-pal/game,新增英文、移动端与手柄等支持;v1.0.0 保留首次完整通关的里程碑。 | | 第二阶段 · Reforge | 正在开发 | 新运行时 @type-pal/reforge、React 可视化编辑器 @type-pal/editor、离线迁移器 @type-pal/migrate。 | | 第三阶段 · 产品化 | 规划中 | 按发行范围替换版权资源,并规划官网、离线桌面发行等。见 docs/phase3/README.md。 |

第一阶段的功能见 v1.1.0 发布说明 与当前实现:

  • 用 @type-pal/pal-extract 从原版 MKF 归档解包数据表、精灵和事件字节码。YJ1 解压对应参考树里的 yj1.c(见 reference/README.md)。
  • TypeScript 事件字节码解释器驱动对话、过场、场景切换和战斗触发。
  • 320×200 索引色软件帧缓冲:位图存调色板下标,blit 时上色。
  • 回合制战斗:行动队列、伤害公式、法术、状态、敌方 AI、动画时间线。
  • 音乐默认使用 SpessaSynth + TimGM6mb 合成 MIDI,也可在「工具 → 系统 → 音频 → 音源」选择 DOS FM(RIX)。RIX 通过 WebAssembly + AudioWorklet 实时合成,选择会在浏览器中记住;第三方来源与许可见下文。
  • 简体中文或英文:工具 → 系统 → 语言。剧情、人名和菜单跟随所选语言,浏览器在本地记住。
  • 手机、窄窗口或矮宽窗口会显示屏幕方向键和确认/取消,并在「系统」里提供显示或隐藏。普通桌面窗口不显示这组按键。
  • 标准手柄支持;「系统」中可选择虚拟方向键与左摇杆顺时针旋转45°,默认关闭并记住选择。键盘和手柄十字键保持原映射。
第二阶段已经落地的部分(细节以 能力地图 和 任务看板 为准):
  • 编辑场景、地图、剧情、角色、物品、战斗、资源和工程设置。
  • 本地工程打开/保存、撤销/重做、引用诊断、试玩,以及独立战斗模拟器。
  • PAL 内容用事务发布和三方合并迁进当前内容工程。
  • 不依赖源码仓库的独立可玩包仍是本阶段收口项,尚未完成。

和 sdlpal 的 WebAssembly 移植有什么不同

reference/sdlpal/ 是 sdlpal 的 C 源码副本,只作引擎逻辑的参考规格,不作为整套引擎编译或运行。解包、脚本虚拟机、320×200 调色板渲染、战斗系统和编辑器都是 TypeScript 实现。原版数据和行为是第一阶段的首要事实来源;sdlpal 是参考实现。

DOS FM 音源单独使用改编的 RIX 播放器及 Nuked OPL 内核,编译为 WebAssembly;这部分 C/C++ 源码、补丁、许可和重建说明在 packages/game/vendor/rix/。

快速开始

需要 Node.js 22、pnpm 和 Git。

不准备原版数据时,可以跑自包含 demo,或在编辑器里新建空白工程。demo 的运行依赖已随工程入库,其中仍有少量 PAL 派生示例素材:

pnpm install

Reforge 自动载入自包含 demo

pnpm --filter @type-pal/reforge dev # http://localhost:6050

编辑器启动页;可新建空白工程或打开本地当前格式工程,不会自动载入 demo

pnpm --filter @type-pal/editor dev:demo # http://localhost:6011

跑完整 PAL 内容时,把合法取得的原版数据放进 data/raw/(文件清单见 data/raw/README.md),再提取并迁移:

pnpm install
pnpm extract
pnpm --filter @type-pal/migrate migrate:content --write

然后按需要启动:

pnpm --filter @type-pal/editor dev      # 编辑器 + PAL,http://localhost:6010
pnpm --filter @type-pal/reforge dev:pal # Reforge + PAL,http://localhost:6051
pnpm --filter @type-pal/game dev        # 第一阶段运行时,https://localhost:6005

迁移命令默认 dry-run;只有 --write 会更新 projects/pal。第一阶段 dev 使用本地自签 HTTPS,浏览器第一次打开 6005 需要手动确认证书。更多命令、调试入口和开发边界见 CONTRIBUTING.md。

仓库里有什么

| 应用 | 包 | 用途 | 本地端口 | |---|---|---|---:| | 第一阶段运行时 | @type-pal/game | 已上线的忠实还原版浏览器游戏,也是第二阶段的行为/UX 参考。 | 6005 | | Reforge | @type-pal/reforge | 读取现代内容工程的新运行时。 | 6050 / 6051 | | 编辑器 | @type-pal/editor | 可视化编辑地图、场景、剧情、角色、物品、战斗、资源和项目设置。 | 6010 / 6011 |

其余包:packages/shared(共享类型与解码)、packages/pal-extract(离线提取)、packages/content(第二阶段内容契约)、packages/migrate(离线迁移)。文档入口是 docs/README.md。

进度看哪里

能力格、任务状态和内容格式版本会变,本页不复制这些活账。

| 需要了解什么 | 入口 | |---|---| | 第一阶段 | docs/phase1/README.md | | 第二阶段开工边界 | docs/phase2/READ-FIRST.md | | 第二阶段完成度 | docs/phase2/capability-map.md | | 第二阶段路线 | docs/phase2/roadmap.md | | 第三阶段规划 | docs/phase3/README.md | | 正在做的任务 | docs/ops/board.md |

开发方式

这个仓库是和维护者一起工作的 AI 编程助手写出来的。协作规则在 AGENTS.md:任务卡、同一份实现文件同一时间只有一个编码负责人、独立验收。当前是分派 / 执行 / 独立验收;文件里还留着更早的三方会签记录,那些记录不自动变成新任务的门禁。

许可与声明

非官方同人项目。 与大宇、软星以及《仙剑奇侠传》的权利人无关,未获官方授权或认可。原版资源与在线试玩仅供学习交流;权利人如有要求,将立即下架。请支持正版。

权利问题或下架请求,请在本仓库开 GitHub Issue。

  • 本仓库为这个项目编写的代码,按 GNU General Public License v3.0 授权,与参考实现 sdlpal 的 GPLv3 一致。
  • 完整原版游戏数据不在 Git 里。在线试玩是托管构建;在本机跑完整 PAL 内容,需要自己准备合法取得的原版数据。
  • 已入库的 demo、回归 fixture,以及 Reforge 默认界面里的一部分贴图,含少量 PAL 派生素材。它们不是已经完成版权清理、可以独立发行的资源,也不会因为代码采用 GPL 就变成可以再授权的原版美术。来源说明见 PROVENANCE.md。
  • 第三方组件保留各自的许可。仓库根上的 GPL-3.0 不改写这些许可。

第三方许可

| 来源 | 许可 | 说明 | |---|---|---| | reference/sdlpal/ | GPL-3.0(LICENSE) | 上游源码副本,只作参考。 | | reference/sdlpal/timidity/ | COPYING 是 Artistic License;同目录 README 写明上游允许在 GPL、LGPL、Artistic 中选择 | 只在参考树里,不参与本仓库的构建。 | | reference/sdlpal/adplug/ | NOTES/COPYING 为 LGPL-2.1 | 说明文字写的是随附的旧版 LGPL OPL 模拟器。同一份说明提到的、限制商业再分发的较新 MAME 许可版本,不是这份副本所附的那一版。 | | packages/game/vendor/rix/ | AdPlug LGPL-2.1-or-later;SDLPAL 部分 GPL-3.0-or-later;Nuked GPL-2.0-or-later | 实际构建的 DOS FM 内核。来源、修改补丁、随附许可与重建方式见该目录 README。 | | reference/sdlpal/overlay/ | CC BY 4.0(COPYING) | libretro 叠层素材,只在参考树里。 | | GNU Unifont | OFL-1.1,或 GPL-2.0-or-later 加字体嵌入例外 | 见 PROVENANCE.md、OFL-1.1.txt、COPYING。 | | TimGM6mb 音色库 | 仓库内说明写的是 GPL-2,并链接 GPL version 2 文本,没有 “or later” | packages/game/public/soundfont-LICENSE.txt 与 Reforge 里的同文副本。音色库仍按该说明分发,根目录 GPL-3.0 不把它改成 GPL-3.0。 |

维护者

命令、调试入口、数据流和开发边界在 CONTRIBUTING.md。多 Agent 协议在 AGENTS.md。

Chat with me