Files
cmr-mini/doc/config-option-dictionary.md

557 lines
9.7 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.
# 配置选项字典(当前实现版)
本文档用于整理 **当前客户端已经消费或已经预留承载的配置项**,作为事件配置、后台配置和联调时的统一参考。
目标:
- 明确目前哪些字段已经真正生效
- 明确每个字段的含义、类型、默认逻辑
- 给后续扩展留下统一维护入口
说明:
- 本文档优先以“当前代码真实实现”为准
- 未列出的字段,不代表未来不能加,只代表当前客户端未正式消费
- 后续每次新增配置能力,都应同步补充本文件
---
## 1. 顶层结构
当前推荐结构:
```json
{
"schemaVersion": "1",
"version": "2026.03.27",
"app": {},
"map": {},
"playfield": {},
"game": {},
"resources": {},
"debug": {}
}
```
---
## 2. 顶层字段字典
### `schemaVersion`
- 类型:`string`
- 说明:配置结构版本
- 建议默认值:`"1"`
### `version`
- 类型:`string`
- 说明:当前配置内容版本
- 建议默认值:日期或发布版本号,例如 `2026.03.27`
### `app`
- 类型:`object`
- 说明:活动级基础信息
### `map`
- 类型:`object`
- 说明:地图底座信息
### `playfield`
- 类型:`object`
- 说明:玩法空间对象与内容覆盖
### `game`
- 类型:`object`
- 说明:玩法规则与局流程
### `resources`
- 类型:`object`
- 说明:资源 profile 引用
### `debug`
- 类型:`object`
- 说明:调试开关
---
## 3. `app` 字段
### `app.id`
- 类型:`string`
- 说明:活动或配置实例 id
- 示例:`"sample-classic-001"`
### `app.title`
- 类型:`string`
- 说明:活动标题 / 比赛名称
- 示例:`"顺序赛示例"`
### `app.locale`
- 类型:`string`
- 说明:语言环境
- 建议默认值:`"zh-CN"`
---
## 4. `map` 字段
### `map.tiles`
- 类型:`string`
- 说明:瓦片根路径
- 必填:是
### `map.mapmeta`
- 类型:`string`
- 说明:地图 meta 文件地址
- 必填:是
### `map.declination`
- 类型:`number`
- 说明:磁偏角
- 示例:`6.91`
- 备注:当前会影响真北/磁北换算
### `map.initialView.zoom`
- 类型:`number`
- 说明:初始缩放级别
- 建议默认值:`17`
---
## 5. `playfield` 字段
### `playfield.kind`
- 类型:`string`
- 说明:空间对象类型
- 当前推荐值:
- `course`
- `control-set`
### `playfield.source.type`
- 类型:`string`
- 说明:空间底稿来源类型
- 当前推荐值:`kml`
### `playfield.source.url`
- 类型:`string`
- 说明KML 地址
- 必填:是
### `playfield.CPRadius`
- 类型:`number`
- 说明:检查点绘制半径
- 建议默认值:`6`
### `playfield.metadata.title`
- 类型:`string`
- 说明:路线或控制点集标题
### `playfield.metadata.code`
- 类型:`string`
- 说明:路线或控制点集编码
---
## 6. `playfield.controlOverrides`
`playfield.controlOverrides` 用于对起点、检查点、终点做内容或分值覆盖。
### 6.1 key 命名规则
- 起点:`start-1`
- 普通检查点:`control-1``control-2``control-3`
- 终点:`finish-1`
### 6.2 当前支持字段
#### `score`
- 类型:`number`
- 说明:积分赛控制点分值
- 适用:积分赛
#### `title`
- 类型:`string`
- 说明:打点完成后自动弹出的标题
#### `body`
- 类型:`string`
- 说明:打点完成后自动弹出的正文
#### `clickTitle`
- 类型:`string`
- 说明:点击控制点时弹出的标题
- 默认逻辑:未配置时回退到 `title`
#### `clickBody`
- 类型:`string`
- 说明:点击控制点时弹出的正文
- 默认逻辑:未配置时回退到 `body`
#### `autoPopup`
- 类型:`boolean`
- 说明:完成该点后是否自动弹出内容
- 建议默认值:`true`
- 特殊逻辑:如果当前玩法是自动打点,即 `game.punch.policy = "enter"`,则无论这里如何配置,**都不自动弹出**
#### `once`
- 类型:`boolean`
- 说明:该内容是否本局只自动展示一次
- 建议默认值:`false`
#### `priority`
- 类型:`number`
- 说明:内容优先级,越大越高
- 建议默认值:
- 普通点:`1`
- 终点:`2`
### 6.3 示例
```json
"controlOverrides": {
"start-1": {
"title": "比赛开始",
"body": "从这里出发,先熟悉地图方向。",
"autoPopup": true,
"once": true,
"priority": 1,
"clickTitle": "起点说明",
"clickBody": "点击起点可再次查看起跑说明。"
},
"control-2": {
"score": 20,
"title": "教学楼南侧",
"body": "这里是重要转折点。",
"autoPopup": false,
"once": true,
"priority": 1,
"clickTitle": "教学楼南侧",
"clickBody": "这个点配置成点击查看。"
},
"finish-1": {
"title": "比赛结束",
"body": "恭喜完成本次路线。",
"autoPopup": true,
"once": true,
"priority": 2,
"clickTitle": "终点说明",
"clickBody": "点击终点可再次查看结束说明。"
}
}
```
---
## 7. `game` 字段
### `game.mode`
- 类型:`string`
- 说明:玩法类型
- 当前支持:
- `classic-sequential`
- `score-o`
### `game.rulesVersion`
- 类型:`string`
- 说明:规则版本
- 建议默认值:`"1"`
---
## 8. `game.session`
### `game.session.startManually`
- 类型:`boolean`
- 说明:是否需要手动点击开始
- 建议默认值:`true`
### `game.session.requiresStartPunch`
- 类型:`boolean`
- 说明:是否必须完成起点打卡
- 建议默认值:
- 顺序赛:`true`
- 积分赛:`true`
### `game.session.requiresFinishPunch`
- 类型:`boolean`
- 说明:是否必须完成终点打卡
- 建议默认值:
- 顺序赛:`true`
- 积分赛:`false`
### `game.session.autoFinishOnLastControl`
- 类型:`boolean`
- 说明:是否打完最后控制点自动结束
- 建议默认值:`false`
### `game.session.maxDurationSec`
- 类型:`number`
- 说明:最大比赛时长,单位秒
- 建议默认值:`5400`
---
## 9. `game.punch`
### `game.punch.policy`
- 类型:`string`
- 说明:打点策略
- 当前支持:
- `enter-confirm`
- `enter`
- 建议默认值:`enter-confirm`
### `game.punch.radiusMeters`
- 类型:`number`
- 说明:打点半径
- 建议默认值:`5`
### `game.punch.requiresFocusSelection`
- 类型:`boolean`
- 说明:积分赛是否需要先选中目标再打卡
- 建议默认值:
- 顺序赛:`false`
- 积分赛:`false`
---
## 10. `game.sequence.skip`
仅顺序赛相关。
### `game.sequence.skip.enabled`
- 类型:`boolean`
- 说明:是否允许跳点
- 建议默认值:`false`
### `game.sequence.skip.radiusMeters`
- 类型:`number`
- 说明:跳点半径
- 建议默认值:`30`
### `game.sequence.skip.requiresConfirm`
- 类型:`boolean`
- 说明:跳点是否需要确认
- 建议默认值:`true`
---
## 11. `game.scoring`
### `game.scoring.type`
- 类型:`string`
- 说明:积分模型
- 当前推荐值:`score`
### `game.scoring.defaultControlScore`
- 类型:`number`
- 说明:积分赛默认控制点分值
- 建议默认值:`10`
---
## 12. `game.guidance`
### `game.guidance.showLegs`
- 类型:`boolean`
- 说明:是否显示腿线
- 建议默认值:
- 顺序赛:`true`
- 积分赛:`false`
### `game.guidance.legAnimation`
- 类型:`boolean`
- 说明:是否显示腿线动画
- 建议默认值:
- 顺序赛:`true`
- 积分赛:`false`
### `game.guidance.allowFocusSelection`
- 类型:`boolean`
- 说明:是否允许地图点击选择目标点
- 建议默认值:
- 顺序赛:`false`
- 积分赛:`true`
---
## 13. `game.visibility`
### `game.visibility.revealFullPlayfieldAfterStartPunch`
- 类型:`boolean`
- 说明:起点打卡后是否显示完整路线/控制点集合
- 建议默认值:`true`
---
## 14. `game.finish`
### `game.finish.finishControlAlwaysSelectable`
- 类型:`boolean`
- 说明:终点是否始终可选
- 建议默认值:
- 顺序赛:`false`
- 积分赛:`true`
---
## 15. `game.telemetry.heartRate`
### `age`
- 类型:`number`
- 说明:年龄
- 建议默认值:`30`
### `restingHeartRateBpm`
- 类型:`number`
- 说明:静息心率
- 建议默认值:`62`
### `userWeightKg`
- 类型:`number`
- 说明:体重
- 建议默认值:`65`
---
## 16. `game.feedback`
### `game.feedback.audioProfile`
- 类型:`string`
- 说明:音频反馈 profile
- 建议默认值:`default`
### `game.feedback.hapticsProfile`
- 类型:`string`
- 说明:震动反馈 profile
- 建议默认值:`default`
### `game.feedback.uiEffectsProfile`
- 类型:`string`
- 说明UI 动效 profile
- 建议默认值:`default`
---
## 17. `resources`
### `resources.audioProfile`
- 类型:`string`
- 建议默认值:`default`
### `resources.contentProfile`
- 类型:`string`
- 建议默认值:`default`
### `resources.themeProfile`
- 类型:`string`
- 建议默认值:`default-race`
---
## 18. `debug`
### `debug.allowModeSwitch`
- 类型:`boolean`
- 建议默认值:`false`
### `debug.allowMockInput`
- 类型:`boolean`
- 建议默认值:`false`
### `debug.allowSimulator`
- 类型:`boolean`
- 建议默认值:`false`
---
## 19. 当前默认逻辑说明
当前客户端对配置的处理原则是:
- 能有默认值的尽量给默认值
- 控制点内容类字段缺失时走默认文案
- `clickTitle/clickBody` 缺失时回退到 `title/body`
- 自动打点模式下不自动弹内容
- 内容优先级未配置时使用普通点 `1`、终点 `2`
也就是说:
**大部分配置项都不是强制必填,先保证主骨架完整即可。**
---
## 20. 维护约定
后续每次新增配置项时,应同步更新:
1. 本文档
2. 默认模板文档
3. `event` 目录下的配置样例
这样可以保证:
- 服务端可对照
- 后台可录入
- 客户端联调时有统一参考