# 程序默认规则基线
> 文档版本：v1.0
> 最后更新：2026-04-02 08:28:05


本文档用于定义当前客户端在**不依赖活动配置细项**时，程序层应该内建的默认规则。

目标：

- 先把程序能力层的默认行为定住
- 让代码实现优先对齐这一套基线
- 等默认行为稳定后，再决定哪些能力值得开放成配置

说明：

- 本文档讲的是**程序默认规则**
- 它先于活动配置存在
- 它不讨论后台录入方式
- 它不追求一次把所有参数开放出去
- 当前这批玩法默认值已开始集中收口到 [gameModeDefaults.ts](D:/dev/cmr-mini/miniprogram/game/core/gameModeDefaults.ts)
- 设置页默认值与锁态已开始集中收口到 [systemSettingsState.ts](D:/dev/cmr-mini/miniprogram/game/core/systemSettingsState.ts)

---

## 1. 总体原则

当前规则收敛顺序固定为：

1. 先定程序默认能力
2. 再定玩法默认差异
3. 最后才开放活动配置覆盖

程序层默认规则要满足 3 个要求：

- 默认可玩：不给额外配置也能顺畅跑完一局
- 默认统一：相同类型行为在不同玩法下表达一致
- 默认克制：不把调试、测试、历史试验行为带进最小流程

补充一条设置页原则：

- 设置值和锁态分离管理，避免运行时状态被历史缓存污染

---

## 2. 程序默认层次

前台默认只保留 5 类可见反馈层。

同时，程序默认值分成两条并行基线：

- 对局规则默认值
- 系统设置默认值

### 2.1 黑底引导提示条

职责：

- 只负责告诉玩家“下一步该做什么”

规则：

- 自动消失
- 可手动关闭
- 文案变化时可有轻动画
- 默认只配轻震动
- 不承担结果反馈
- 不承担内容说明

### 2.2 彩色短反馈条

职责：

- 只负责告诉玩家“刚刚发生了什么”

规则：

- 短暂出现
- 不带按钮
- 不显示长说明
- 不承担下一步引导

### 2.3 白色内容卡

职责：

- 只承载显式配置的点位内容

规则：

- 默认不进入最小流程
- 默认关闭
- 仅当某个点位明确启用时才参与流程
- 浏览型卡片默认短时自动消失
- 交互型卡片只在显式开启时出现

### 2.4 答题卡

职责：

- 承载显式启用的答题玩法

规则：

- 属于强交互层
- 最小模板下默认关闭
- 仅当点位显式配置 `quiz` CTA 时才进入
- 不依赖白色内容卡作为前置

### 2.5 成绩总览页

职责：

- 承载结算结果

规则：

- 终点完成后直接进入
- 不再额外叠终点白卡

---

## 3. 打点默认规则

### 3.1 开始点

程序默认行为：

- 必须先打开始点才能正式开赛
- 成功打开始点后开始计时
- 起点完成后只给短反馈，并更新引导和 HUD
- 默认不弹白色开始卡
- 默认不弹答题卡

### 3.2 普通点

程序默认行为：

- 成功打点后先完成基础结算
- 最小模板下默认不弹答题卡
- 如需答题，必须显式配置点位 CTA
- 默认不先弹白色内容卡
- 默认不重复得分
- 默认不重复出题

### 3.3 结束点

程序默认行为：

- 成功打终点后先给完成短反馈
- 随后直接进入结果页
- 默认不弹白色终点卡
- 默认不弹答题卡

### 3.4 关门时间

程序默认行为：

- 默认关门时间为开赛后 `2` 小时
- 距离关门时间小于等于 `10` 分钟时，HUD 第 1 页时间区切换为倒计时显示
- 倒计时显示需有区别于正常计时的强调样式
- 到达关门时间后，系统自动结束当前对局
- 超时结束必须和正常完赛、主动退出区分开

---

## 4. 玩法默认差异

程序只内建少量玩法差异，不把所有东西做成配置。

### 4.1 顺序打点 `classic-sequential`

默认差异：

- 按顺序推进
- 默认允许跳点
- 默认跳点半径 = 打点半径的 2 倍
- 默认跳点前弹出确认
- 当前目标点由系统自动推进
- 终点默认需要在中间点都“成功或跳过”后才生效
- 普通点基础分默认 `1`
- 普通点默认不附带答题奖励

### 4.2 积分赛 `score-o`

默认差异：

- 自由打点
- 默认不存在跳点
- 默认不要求先选中目标点
- 点击某个积分点时，默认只更新当前目标和 HUD 信息
- 未点击选中时，也允许直接进入任意积分点范围完成打点
- 默认至少完成 `1` 个普通积分点后，终点才解锁
- 普通点基础分默认取该点分值
- 普通点默认不附带答题奖励

---

## 5. HUD 默认规则

HUD 属于公共程序能力，不属于某个玩法专属实现。

### 5.1 固定结构

- HUD 固定为 2 页
- 第 1 页为比赛主信息页
- 第 2 页为心率 / 遥测页
- 异型壳子布局固定，不因玩法改变结构

### 5.2 第 1 页默认职责

- 时间
- 里程
- 动作标签
- 目标摘要
- 目标距离
- 进度摘要
- 速度
- 临近关门时间时，时间槽位切换为倒计时

### 5.3 第 2 页默认职责

- 心率
- 卡路里
- 平均速度
- 精度或相关遥测值

### 5.4 遥测身体数据来源

程序默认口径：

- HUD 第 2 页使用统一遥测运行时
- 活动配置里的 `game.telemetry.*` 只作为活动默认值
- 玩家年龄、静息心率、体重等身体数据，后续允许由线上接口覆盖
- 线上身体数据一旦到位，应高于活动配置生效

默认优先级：

`系统默认值 -> 活动遥测默认值 -> 玩家线上身体数据`

### 5.5 玩法映射默认口径

- 顺序打点：
  - 目标摘要显示当前目标点
  - 进度摘要显示完成进度和跳点数
- 积分赛：
  - 目标摘要显示当前选中目标点
  - 进度摘要显示总分和收集进度

### 5.6 目标角色默认口径

程序默认把目标拆成 4 类：

- 可打目标：当前进入范围后可真正完成打点的对象
- 引导目标：用于距离音效、接近提示和弱引导的对象
- HUD 目标：用于底部信息面板距离与摘要显示的对象
- 展示高亮目标：用于地图上重点高亮的对象

约束：

- 这 4 类目标不能再混用
- 积分赛里“选中目标”默认只影响 HUD 目标
- 距离音效默认只跟随引导目标，不跟随选中状态

---

## 6. 距离反馈默认规则

距离反馈和黑底引导提示条分离管理。

### 6.1 黑底引导提示条

- 默认只走轻震动
- 不绑定提示音

### 6.2 距离提示

默认分为 3 档：

1. `distant`
2. `approaching`
3. `ready`

默认口径：

- `ready`：进入可打点范围
- `approaching`：接近目标
- `distant`：较远但仍处于有效提醒范围
- 更远距离默认静默

默认阈值：

- `distantDistanceMeters = 80`
- `approachDistanceMeters = 20`
- `readyDistanceMeters = 5`

默认节奏：

- `distant`：弱提醒，默认间隔 `4800ms`
- `approaching`：较明确提醒，默认间隔 `950ms`
- `ready`：确认提醒，默认间隔 `650ms`

---

## 7. 系统设置默认规则

设置页属于程序公共能力，不属于某个玩法专属逻辑。

### 7.1 设置项结构

每个设置项默认由两部分组成：

- `value`：设置值
- `isLocked`：是否允许玩家修改

### 7.2 默认值规则

程序默认要求：

- 每个设置项都必须有系统默认值
- 玩家未手动修改时，直接使用系统默认值
- 默认值应集中维护，不散落在页面逻辑里

### 7.3 持久化规则

程序默认要求：

- `value` 需要持久化
- `isLocked` 不持久化
- 页面每次进入时，锁态都应重新按当前运行时规则计算
- 锁态只受系统默认值与活动配置影响，玩家不能在页面中修改锁态
- 设置页中的锁态徽标只做状态展示，不提供点按切换能力
- 锁态生存期：从当前游戏配置载入并进入该局开始，到本局正常结束、超时结束或主动退出为止

默认优先级：

`系统设置默认值 -> 玩家本地持久化值`

锁态优先级：

`系统锁态默认值 -> 当前运行时或活动规则覆盖`

### 7.4 当前已集中维护的设置基线

当前已在 [systemSettingsState.ts](D:/dev/cmr-mini/miniprogram/game/core/systemSettingsState.ts) 集中维护：

- 轨迹显示
- GPS 点显示
- 侧边按钮习惯
- 自动旋转
- 指北针调校
- 北向参考
- 中央标尺显示与锚点
- 各设置项的默认锁态

---

## 8. 最小流程基线

### 8.1 顺序打点最小流程

1. 进入游戏，只显示开始点
2. 打开始点，开赛并显示全场
3. 按顺序推进普通点
4. 普通点打点后默认只做基础结算
5. 可触发跳点
6. 打终点后直接进入结果页
7. 如果超过 `2` 小时仍未结束，系统按超时结束处理

### 8.2 积分赛最小流程

1. 进入游戏，只显示开始点
2. 打开始点，开赛并显示全部积分点和终点
3. 可直接前往任意积分点，或点击某个点更新当前目标
4. 进入积分点范围后成功打点
5. 普通点打点后默认只做基础结算
6. 默认至少完成 `1` 个普通积分点后可打终点结束
7. 如果超过 `2` 小时仍未结束，系统按超时结束处理

---

## 9. 暂不开放为配置的内容

当前先不优先配置化的内容：

- 弹层体系层级
- 起点是否弹白卡
- 普通点是否先白卡后答题
- 终点是否白卡后结算
- HUD 是否双页
- HUD 异型壳子结构
- 黑条提示与距离反馈的职责边界

这些内容应先作为程序默认能力稳定下来。

---

## 10. 故障恢复基线

当前故障恢复按“轻量快照恢复”处理：

- 仅恢复进行中的对局
- 仅恢复核心赛局状态、遥测累计值和地图基础视口
- 不恢复白卡、答题卡、临时动效、短反馈和提示层
- 恢复后由规则层和展示层重新计算 HUD、按钮文案、目标提示和音效状态

当前默认恢复内容：

- 当前配置入口
- `startedAt / completedControlIds / skippedControlIds / currentTargetControlId / score / modeState`
- 累计里程、基础心率/卡路里累计、最后 GPS 点
- `zoom / centerTile / rotation / gpsLock`

当前默认不恢复内容：

- 详情卡
- 答题中间态
- 待查看内容入口
- 所有瞬时动效和提示队列

---

## 11. 后续开放配置的原则

后续只有满足以下条件的内容，才建议开放成配置：

- 运营确实会频繁改
- 改动不会破坏主流程一致性
- 改完不会引入一组新的层级冲突

优先可配置的内容应是：

- 点位分值
- 点位内容是否启用
- 点位样式
- 三档距离提示阈值
- 三档距离提示间隔

---

## 12. 一句话结论

当前阶段应以这份文档作为**程序默认能力基线**：先把最小流程、弹层职责、HUD 结构和距离反馈定死，再决定哪些内容值得进入配置层。


