Files
opendance-windows/tasks/012-about-version.md
T
zijunchiang 5581cbe05d feat(scene): 场景选择与物理落地 + 整包发布(T-WIN-012/013/014)
T-WIN-013:API 升级与场景选择
- 契约快照同步到 rest-api 0.5.0 / data-models 0.7.0 / database 0.4.0
- catalog_types.gd 新增 SceneConfig(物理/环境/出生点/相机)与 Scene;
  CatalogBundle 增加 scenes[];from_dict 按契约 7.1 再收敛一次
  (缺项默认、越界夹紧、非法枚举回退),与服务端 normalizeSceneConfig 同规则
- 新增 src/scene/scene_runtime.gd:GLB 载入 -> 碰撞体(mesh 三角网 /
  auto 命名约定 *_col、*_colonly / none 不兜底)-> 场景级重力(Area3D
  SPACE_OVERRIDE_REPLACE,不改全局 ProjectSettings)-> 风(每物理帧
  apply_central_force,阵风正弦叠加,支持 local 坐标系)-> 环境光与雾
  -> 出生点与相机(follow/fixed/orbit);无碰撞体时兜底地面
- CatalogStore 增加 scenes/default_scene/find_scene/ensure_scene_cached/
  fetch_thumbnail(场景缓存带 sha256 指纹,避免换包后仍用旧 GLB)
- 主界面改为 2x2 四个选择器(曲目/动作/模型/场景)+ 场景参数面板
  (缩略图 + 重力/摩擦/弹性/碰撞体/风摘要)
- 游戏界面载入场景并落地物理,角色落在出生点;场景缺失/下载失败/
  解析失败一律回退内置空场景并提示,不阻塞开始跟练

T-WIN-012:「关于」清单展示当前版本号
- 版本唯一来源为 project.godot 的 application/config/version(v0.2.0)
- about_manifest() 输出版本/引擎/契约/协议/地址/隐私清单;
  无头测试无 autoload,读取 AppConfig 走 get_node_or_null 容错
- Credits 的单个 CONTRACT_VERSION 常量改为 CONTRACT_VERSIONS 字典
  (六项契约各自独立递增),并双向核对 contracts/VERSION

T-WIN-014:发布必须是单个完整包
- build/package-release.sh 重写:只产出单个 zip + SHA256SUMS,
  清理历史 .partN,超限时告警而非回退分卷;新增源产物与解压后完整性
  自检(PE 头 MZ / pck 魔数 GDPC / exe+pck 同目录同名)与体积-上限对比
- deploy/proxy 相关的 Gitea IIS 256MB 上限说明见 opendance-web

测试:tests/test_scene_config.gd(12 例)+ tests/test_about.gd(4 例);
无头测试 687 通过 / 0 失败(10 个套件),verify.sh 全部通过
2026-09-17 00:45:23 +08:00

43 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# T-WIN-012 「关于」清单展示当前版本号
- **状态**: done
- **依赖**: T-WIN-010
- **文档**: v1.6 §11(版本号展示)
## 目标
Windows 客户端在**「关于」清单**中展示当前运行版本号,且版本号只有一处权威定义。
## 方案
| 项 | 做法 |
|--|--|
| 唯一来源 | `project.godot` 的 `application/config/version`(运行期用 `ProjectSettings.get_setting` 读取) |
| 界面位置 | 关于页面新增「清单」区块,逐行「标签:值」 |
| 禁止重复 | 界面代码中**不出现版本号字面量**;由 `test_about.gd` 反例防护 |
`src/ui/about_screen.gd` 新增两个可直接单测的纯函数:
- `app_version()` —— 返回 `vX.Y.Z` 的来源值(唯一来源);
- `about_manifest()` —— 返回清单各行(版本 / 引擎 / 契约版本 / 接收协议 / 接收地址 / 服务端地址 / 隐私说明)。
`about_manifest()` 读取 `AppConfig` 时走 `get_node_or_null("AppConfig")`,
因为无头测试以 `--script` 运行**没有 autoload**,直接引用会在解析期报错。
## 顺带修正:契约版本不能再用单个常量
`Credits.CONTRACT_VERSION` 原为单个常量 `0.1.0`,但六项契约现在各自独立递增
(`rest-api 0.5.0` / `data-models 0.7.0` / `skeleton-topology 0.2.0` …)。
改为 `Credits.CONTRACT_VERSIONS` 字典 + `version_of()` / `summary()`,
并让 `test_credits.gd` 逐项与 `contracts/VERSION` 双向核对
(新增契约若忘记同步展示,测试直接失败)。
## 验收(文档 §11.3)
| 验收项 | 结果 |
|--|--|
| 关于清单可见 `vX.Y.Z` | ✅ 清单首行「客户端版本:v0.2.0」 |
| 与导出产物文件名一致 | ✅ `opendance-windows-v0.2.0.zip` |
| 与 `project.yaml` / `project.godot` 一致 | ✅ 测试 `test_version_is_semver_and_matches_project_yaml` 核对 |
| 界面代码无版本号字面量 | ✅ 测试 `test_version_not_hardcoded_in_ui_sources` 核对 |