Godot 迁移实施进度
更新:2026-10-16。M2 已接入完整七单章节、救援 / 解药分支与客村 / TIT 生活循环,当前结果见 M2 实施与验收记录。Windows 实机继续后置,默认客户端保持原有入口。
以下保留 M0–M1 历史记录,数值、限制与待办均对应当时的午餐切片;M2 的后续覆盖以新记录为准。
M0–M1 已建立生产目录中的 Godot 客户端、共享内容包与原生物理包,并在 macOS 跑通「陈叔登记 → 午餐接单 → 骑行取餐 → 停稳交付 → 结算 → 退出重启恢复」。Windows x64 薄包已交叉构建和导出,Windows 实机测试按维护者明确安排后置;G1.3 的目标平台运行验收仍开放。
当前交付是 m1-functional-slice,不是完整首章、完整生活街区或生产客户端切换。原有 Three.js / Electron 继续保留。阶段定义与后续顺序见完整迁移计划。
M0–M1 历史状态
| 项目 | 已完成与证据 | 未完成 / 下一阶段 |
|---|---|---|
| G0.1 基线 | 实施前冻结跟踪与未跟踪源码、固定运行资源、锁文件和 hash;1,821 个文件,31,692,870 字节,33 个固定媒体文件齐全;提供可重复冻结命令 | 每次正式性能对照和候选发布重新冻结完整工作区 |
| G0.2 范围与台账 | 固定客村 / TIT 主街区、坐标原点、七个首章订单 ID;按下表记录功能去向;固定午餐路线和明确边界 | 完整街区及章节路线逐项实玩属于 M2 |
| G0.3 工具链 | Godot / 模板 4.7.2,Rust 1.96.0,godot-rust 0.5.5,Rapier 0.36.0;原生库来源与 hash 可追溯 | Windows 原机构建复验、Steam 设备矩阵仍待执行 |
| G1.1 原生入口 | 独立工程、暂停、交谈、失焦释放、保存失败提示;发布包排除 helper、测试、夹具和专用模板 | 完整菜单、设置、手机与实体手柄在 M2 / M6 |
| G1.2 流水线 | 固定地图 / 配送 / tuning / ADV 内容 / token → 确定性内容 → Godot 导入 → 正式模板导出 → 包内检查 | 完整城市模型、纹理与音频表达仍须逐项导入 |
| G1.3 薄包 | macOS arm64 实际导出包在源码目录外启动并恢复;Windows x64 EXE / PCK / 原生 DLL 已导出并检查架构和内容 | Windows 启动、键鼠、关闭重启及离线运行未验收;音频 / 完整资源不在当前功能包中 |
| G1.4 行为契约 | Web 真正引用共享配送规则与目录;原生移植逻辑与 Web 导出行为对照;独立 schema 1 存档 | 完整剧情指令、旧档导入和更多槽在 M2 / M3 |
| G2.0 午餐切片 | macOS 连续骑行与两进程恢复通过;陈叔按钮与键盘确认、原生包骑行和正常关窗另行验证 | Windows 实机复验后才能关闭该项的平台待办 |
初始工作树包含原有未提交的城市、渲染、联机及实验改动,均保留;冻结记录包含这些实际源码。归档、原始日志、截图、工具缓存及导出包留在私有源码仓库的忽略目录,不放入公开文档仓库。冻结命令不改暂存区或历史。
monorepo 与双端共享
| 目录 | 职责与边界 |
|---|---|
apps/dayun-kicker | Three.js / Vue Web 宿主;保留现有入口与城市构建工具 |
apps/dayun-kicker-desktop | 现有 Electron 客户端与回退入口 |
apps/dayun-kicker-godot | 原生场景、Control / Theme、GDScript 规则、输入与存档 |
packages/dayun-kicker-content | 两端共用的配送目录、规则 JSON、类型与迁移范围 |
packages/dayun-kicker-physics | Rust Rapier GDExtension;平台动态库与 target 缓存不进 Git |
scripts/godot | 内容导出、工具链校验、构建、原生测试、包检查与工作树冻结 |
这里的“同构”指同一内容源和行为契约:地图原点与地点 ID、配送目录和数值规则、骑行 tuning、ADV.JS 对白及 UI token 共用。Three.js 和 Godot 分别实现渲染、UI 与运行时;GDScript 不直接执行 TypeScript,当前 Rust 扩展也没有同时替换 Web 的 Rapier WASM。
陈叔开场、登记 / 接单选项及成功文案从现有 ADV.JS schema 1 编译程序导出,宿主再次核对位置、停稳、登记与订单状态。当前只覆盖两项宿主操作;完整条件、分支及章节执行仍在 M2。不复制一份首章对白单独维护。
地图、订单与存档契约
- 城市使用现有 13 份地图组合,原点固定为经纬度
[113.3196, 23.0995],本地米制坐标继续用于道路、任务和物理。 - 主街区冻结为客村 / TIT,WGS84 矩形边界为
[113.3155, 23.094, 113.326, 23.105]。M1 只取午餐路线周围 80 米范围,边界围栏与碰撞对应;155 段道路和 40 个建筑轮廓来自同一地图数据,保留来源与许可。 - 首章订单保持
tit-lunch、granny-first、riverside-coffee、granny-second、chen-antidote、chen-food、chen-tools;咖啡遭遇延续现有取消后继续剧情的语义。M1 只开放tit-lunch。 - 骑手站至取餐点路网约 106 米,麦当劳至 TIT 北侧约 437 米。实际驾驶轨迹随转弯与停靠有所不同;当前两进程测试累计行驶约 533 米,没有测试传送。
- 物理只有 Rust Rapier 胶囊查询一个权威来源;此切片覆盖平地、建筑外墙与地图边界。桥面、水边、台阶、活体和踹飞不能借用该结果验收。
- 新存档使用独立原生目录和 schema 1,带内容 hash、校验和、大小 / 数值限制、临时文件替换和备份。登记、订单、位置与已结算积分可恢复;重启速度归零,不重复发奖。损坏主档尝试备份,未来版本或不同内容拒绝覆盖。
- 旧 Web / Electron / 实验存档不读取、不覆盖。完整旧档转换、槽 1 / 2 / 3、剧情及权益兼容在 M3 处理。
当前地图采用程序几何和简单骑手 / 车辆表达。完整街景、材质、后处理、交通、环境音尚未移植;不以本切片证明同画质城市表现或性能收益。
验证结果
开发机为 macOS 26.6.2、Apple M1 Pro、32 GB,原生窗口使用 Metal Forward+。以下是功能与构建检查,不是目标设备性能验收。
| 检查 | 结果 |
|---|---|
| 原生行为与物理契约 | 74 项检查通过:配送事件 / 阶段 / 结算对照、停稳与登记门槛、真实扩展查询、非法碰撞更新不破坏旧世界、存档与备份 / 未来格式保护 |
| 原生连续骑行与重启 | 原生窗口两段路线,2,836 个物理步,约 533.39 米;交付 264 分;新进程恢复完成状态且不能再次结算 |
| 实际 macOS 导出包 | 源码目录之外启动,加载打包的物理库、PCK 与存档;输入、正常关窗保存及再次启动恢复已检查;最终内容版本另行启动复验 |
| Windows 构建与包 | x64 MSVC DLL 使用静态 CRT;EXE / DLL PE 架构与 PCK 内容检查通过;没有 Windows 运行结论 |
| 双端与构建工具 | 现有 Web 配送、首章及存档相关 42 个测试通过;Web 与原生构建工具类型检查通过 |
| Web 回退版本 | Web 构建、发布检查与既有体积预算通过,保留原预算 |
| 资源策略 | 33 个固定媒体文件 hash 校验通过;未新增媒体;原生库、导入缓存及导出包保持忽略 |
最终两包内容 hash 为 b4d51da831d31acd3722a55dbf9088b70171523221b061c2b4f8a2e54291cb8f。Windows 包总计 112,624,399 字节,其中 PCK 与原生库 3,495,760 字节;macOS 解压后的 .app 为 86,184,178 字节,其中 PCK 与原生库 3,194,512 字节。两者均在既有总包 768 MiB / 资源 128 MiB 门槛内,且包内不含测试、夹具、编辑器 helper 或导出模板。
macOS 当前为本地 arm64 测试包,签名 / 公证和 Steam 分发尚未完成。Windows 包检查不等于 Windows 输入、离线启动、升级或关闭写盘验收。现有增强档、300 只压力、稳定 60 FPS 的 P95 / P99 与长帧门槛保持不变;此前未通过的结论仍有效。
运行与后续顺序
固定工具链为 Node 24、pnpm 11.10.0、Godot 4.7.2 和 Rust 1.96.0。首次按源码仓库原生 README 恢复资源并构建扩展,运行:
pnpm godot:dev
pnpm godot:test
pnpm godot:test:rendered
pnpm godot:export:win
pnpm godot:export:mac
pnpm godot:verify windows
pnpm godot:freeze在陈叔附近停稳按 E 登记,再次交谈接单。W / S 油门与倒车,A / D 转向,空格刹车,V 切视角,F5 保存,Esc 暂停;任务节点、骑行每五秒、失焦和正常关窗保存。Windows 分发保留 EXE、PCK、DLL 的相对位置。
后续先补第一章与客村 / TIT 的完整表达,再做原生发行验收;M4 才接地图分块,M5 按相邻街区扩城。功能台账如下,避免遗漏现有能力:
| 既有能力 | 当前原生覆盖 | 去向 |
|---|---|---|
| 骑行、碰撞、镜头 | 平地骑行、刹车、倒车、第一 / 第三人称、建筑 / 边界查询 | M2:步行、上下车、踹、桥水台阶及活体 |
| 配送与陈叔 | 登记、园区午餐、导航、取送、结算 | M2:七单首章、条件分支与剧情宿主 |
| 首章战斗与救援 | 未迁入当前切片 | M2:两名 / 三名事件、救援、主路 / 绕行与据点 |
| 街区生活与美术 | 真实道路 / 建筑轮廓的程序几何 | M2:完整站点、车库、换装、公交 / 行人、昼夜 / 天气 / 音频 |
| 菜单与输入 | 桌面键鼠 HUD、交谈、暂停与焦点释放 | M2:完整菜单与设置、中文长文本、实体手柄;M6:手机 |
| 存档与权益 | 独立切片档、单槽与备份、结算幂等 | M3:旧档导入、全字段与多槽;M6:可信权益恢复 |
| 性能与发行 | 导出包架构 / 内容 / 体积检查 | Windows 实机后置;M2 / M3:同画质、压力、目标机与正式签名 / Steam |
| 地图与扩城 | 固定构建期范围 | M4:分块生命周期;M5:逐区扩展 |
| 经典赛事、其余设施、多人及平台 | 现有 Web / Electron 继续承担 | M6:独立能力包及单独验收,不以第一章切换代替全部迁完 |