1294 lines
28 KiB
Markdown
1294 lines
28 KiB
Markdown
# 配置选项字典(当前实现版)
|
||
|
||
本文档用于整理 **当前客户端已经消费或已经预留承载的配置项**,作为事件配置、后台配置和联调时的统一参考。
|
||
|
||
目标:
|
||
|
||
- 明确目前哪些字段已经真正生效
|
||
- 明确每个字段的含义、类型、默认逻辑
|
||
- 给后续扩展留下统一维护入口
|
||
|
||
说明:
|
||
|
||
- 本文档优先以“当前代码真实实现”为准
|
||
- 未列出的字段,不代表未来不能加,只代表当前客户端未正式消费
|
||
- 后续每次新增配置能力,都应同步补充本文件
|
||
|
||
---
|
||
|
||
## 1. 顶层结构
|
||
|
||
当前推荐结构:
|
||
|
||
```json
|
||
{
|
||
"schemaVersion": "1",
|
||
"version": "2026.03.31",
|
||
"app": {},
|
||
"settings": {},
|
||
"map": {},
|
||
"playfield": {},
|
||
"game": {},
|
||
"resources": {},
|
||
"debug": {}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 顶层字段字典
|
||
|
||
### `schemaVersion`
|
||
|
||
- 类型:`string`
|
||
- 说明:配置结构版本
|
||
- 建议默认值:`"1"`
|
||
|
||
### `version`
|
||
|
||
- 类型:`string`
|
||
- 说明:当前配置内容版本
|
||
- 建议默认值:日期或发布版本号,例如 `2026.03.27`
|
||
|
||
### `app`
|
||
|
||
- 类型:`object`
|
||
- 说明:活动级基础信息
|
||
|
||
### `settings`
|
||
|
||
- 类型:`object`
|
||
- 说明:系统设置页默认值与锁态配置
|
||
- 备注:只控制设置页公共项,不属于具体玩法规则本体
|
||
|
||
### `map`
|
||
|
||
- 类型:`object`
|
||
- 说明:地图底座信息
|
||
|
||
### `playfield`
|
||
|
||
- 类型:`object`
|
||
- 说明:玩法空间对象与内容覆盖
|
||
|
||
### `game`
|
||
|
||
- 类型:`object`
|
||
- 说明:玩法规则与局流程
|
||
|
||
### `resources`
|
||
|
||
- 类型:`object`
|
||
- 说明:资源 profile 引用
|
||
|
||
### `debug`
|
||
|
||
- 类型:`object`
|
||
- 说明:调试开关
|
||
|
||
---
|
||
|
||
## `settings` 字段补充
|
||
|
||
推荐结构:
|
||
|
||
```json
|
||
{
|
||
"settings": {
|
||
"autoRotateEnabled": {
|
||
"value": true,
|
||
"isLocked": false
|
||
},
|
||
"trackDisplayMode": {
|
||
"value": "tail",
|
||
"isLocked": true
|
||
},
|
||
"gpsMarkerStyle": {
|
||
"value": "beacon",
|
||
"isLocked": false
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
规则:
|
||
|
||
- `value` 表示该设置项的活动默认值
|
||
- `isLocked` 表示该设置项是否允许玩家修改
|
||
- `value` 会和玩家本地持久化值一起参与解析
|
||
- `isLocked` 不持久化,只受系统默认值和活动配置控制
|
||
- 玩家不能在页面里修改锁态
|
||
- `isLocked` 只在当前游戏配置运行生命周期内生效;本局结束或主动退出后失效
|
||
|
||
---
|
||
|
||
## 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.controlDefaults` / `playfield.controlOverrides`
|
||
|
||
推荐优先使用:
|
||
|
||
- `playfield.controlDefaults`:活动级默认
|
||
- `playfield.controlOverrides`:单点重载
|
||
|
||
默认覆盖顺序:
|
||
|
||
`系统默认值 -> 玩法默认值 -> playfield.controlDefaults -> playfield.controlOverrides`
|
||
|
||
### 6.1 `playfield.controlDefaults`
|
||
|
||
- 类型:`object`
|
||
- 说明:普通检查点的活动级默认配置
|
||
- 适用:普通检查点,不直接作用于起点和终点
|
||
|
||
当前支持字段:
|
||
|
||
- `score`
|
||
- `template`
|
||
- `title`
|
||
- `body`
|
||
- `clickTitle`
|
||
- `clickBody`
|
||
- `autoPopup`
|
||
- `once`
|
||
- `priority`
|
||
- `ctas`
|
||
- `contentExperience`
|
||
- `clickExperience`
|
||
- `pointStyle`
|
||
- `pointColorHex`
|
||
- `pointSizeScale`
|
||
- `pointAccentRingScale`
|
||
- `pointGlowStrength`
|
||
- `pointLabelScale`
|
||
- `pointLabelColorHex`
|
||
|
||
### 6.2 `playfield.controlOverrides`
|
||
|
||
`playfield.controlOverrides` 用于对起点、检查点、终点做单点覆盖。
|
||
|
||
### 6.3 key 命名规则
|
||
|
||
- 起点:`start-1`
|
||
- 普通检查点:`control-1`、`control-2`、`control-3`
|
||
- 终点:`finish-1`
|
||
|
||
### 6.4 当前支持字段
|
||
|
||
#### `score`
|
||
|
||
- 类型:`number`
|
||
- 说明:积分赛控制点分值
|
||
- 适用:积分赛
|
||
- 备注:如果同时配置了 `playfield.controlDefaults.score`,则当前点以单点值为准
|
||
|
||
#### `title`
|
||
|
||
- 类型:`string`
|
||
- 说明:打点完成后自动弹出的标题
|
||
|
||
#### `template`
|
||
|
||
- 类型:`string`
|
||
- 说明:原生内容卡模板
|
||
- 当前支持:
|
||
- `minimal`
|
||
- `story`
|
||
- `focus`
|
||
- 建议默认值:
|
||
- 起点/终点:`focus`
|
||
- 普通点:`story`
|
||
|
||
#### `body`
|
||
|
||
- 类型:`string`
|
||
- 说明:打点完成后自动弹出的正文
|
||
|
||
#### `clickTitle`
|
||
|
||
- 类型:`string`
|
||
- 说明:点击控制点时弹出的标题
|
||
- 默认逻辑:最小模板下默认不启用;仅在显式配置点击内容能力时生效
|
||
|
||
#### `clickBody`
|
||
|
||
- 类型:`string`
|
||
- 说明:点击控制点时弹出的正文
|
||
- 默认逻辑:最小模板下默认不启用;仅在显式配置点击内容能力时生效
|
||
|
||
#### `autoPopup`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:完成该点后是否自动弹出内容卡
|
||
- 建议默认值:最小模板下 `false`
|
||
- 特殊逻辑:如果当前玩法是自动打点,即 `game.punch.policy = "enter"`,则无论这里如何配置,**都不自动弹出**
|
||
- 补充说明:该字段只控制内容卡弹出
|
||
- 补充说明:系统默认白卡已改为“显式配置启用”,未开启 `autoPopup` 时,起点和普通点完成后不弹白卡
|
||
|
||
#### `once`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:该内容是否本局只自动展示一次
|
||
- 建议默认值:`false`
|
||
|
||
#### `priority`
|
||
|
||
- 类型:`number`
|
||
- 说明:内容优先级,越大越高
|
||
- 建议默认值:
|
||
- 普通点:`1`
|
||
- 终点:`2`
|
||
|
||
#### `contentExperience`
|
||
|
||
- 类型:`object`
|
||
- 说明:打点完成后使用的体验承载配置
|
||
- 当前支持:
|
||
- `native`
|
||
- `h5`
|
||
|
||
#### `contentExperience.type`
|
||
|
||
- 类型:`string`
|
||
- 说明:自动弹出内容的承载方式
|
||
- 当前支持:
|
||
- `native`
|
||
- `h5`
|
||
|
||
#### `contentExperience.url`
|
||
|
||
- 类型:`string`
|
||
- 说明:当 `type = "h5"` 时对应的 H5 页面地址
|
||
|
||
#### `contentExperience.bridge`
|
||
|
||
- 类型:`string`
|
||
- 说明:H5 bridge 版本
|
||
- 建议默认值:`"content-v1"`
|
||
|
||
#### `contentExperience.presentation`
|
||
|
||
- 类型:`string`
|
||
- 说明:H5 内容的展示形态
|
||
- 当前运行建议:
|
||
- `fullscreen`
|
||
- 兼容历史值:
|
||
- `sheet`
|
||
- `dialog`
|
||
- 建议默认值:`fullscreen`
|
||
- 备注:经过真机验证,`web-view` 不再承担局部弹窗职责;当前应按“原生内容卡 + H5 全屏详情页/任务页”理解。
|
||
|
||
#### `clickExperience`
|
||
|
||
- 类型:`object`
|
||
- 说明:点击控制点时使用的体验承载配置
|
||
- 当前支持:
|
||
- `native`
|
||
- `h5`
|
||
|
||
#### `clickExperience.type`
|
||
|
||
- 类型:`string`
|
||
- 说明:点击内容的承载方式
|
||
- 当前支持:
|
||
- `native`
|
||
- `h5`
|
||
|
||
#### `clickExperience.url`
|
||
|
||
- 类型:`string`
|
||
- 说明:当 `type = "h5"` 时对应的 H5 页面地址
|
||
|
||
#### `clickExperience.bridge`
|
||
|
||
- 类型:`string`
|
||
- 说明:H5 bridge 版本
|
||
- 建议默认值:`"content-v1"`
|
||
|
||
#### `clickExperience.presentation`
|
||
|
||
- 类型:`string`
|
||
- 说明:点击内容的展示形态
|
||
- 当前运行建议:
|
||
- `fullscreen`
|
||
- 兼容历史值:
|
||
- `sheet`
|
||
- `dialog`
|
||
- 建议默认值:`fullscreen`
|
||
- 备注:点击详情页当前统一按整页 H5 处理,不再把 `web-view` 作为局部弹窗承载。
|
||
|
||
#### `pointStyle`
|
||
|
||
- 类型:`string`
|
||
- 说明:单个控制点的样式覆盖,仅影响当前控制点
|
||
- 支持值:
|
||
- `classic-ring`
|
||
- `solid-dot`
|
||
- `double-ring`
|
||
- `badge`
|
||
- `pulse-core`
|
||
|
||
#### `pointColorHex`
|
||
|
||
- 类型:`string`
|
||
- 说明:单个控制点的颜色覆盖,例如 `#27ae60`
|
||
- 备注:通常和 `pointStyle` 一起使用,未配置时回退到玩法样式 profile
|
||
|
||
#### `pointSizeScale`
|
||
|
||
- 类型:`number`
|
||
- 说明:单个控制点的尺寸倍率覆盖
|
||
- 建议范围:`0.6 ~ 1.4`
|
||
- 建议默认值:`1`
|
||
- 备注:大于 `1` 会放大点位,小于 `1` 会缩小点位
|
||
|
||
#### `pointAccentRingScale`
|
||
|
||
- 类型:`number`
|
||
- 说明:单个控制点强调环/外环的尺寸倍率
|
||
- 建议范围:`1.0 ~ 1.6`
|
||
- 建议默认值:由样式 profile 决定
|
||
- 备注:适合当前点、高分点、终点这类需要更强层次感的点位
|
||
|
||
#### `pointGlowStrength`
|
||
|
||
- 类型:`number`
|
||
- 说明:单个控制点的光晕强度
|
||
- 建议范围:`0 ~ 1`
|
||
- 建议默认值:`0`
|
||
- 备注:`0` 为无光晕,越接近 `1` 光晕越明显
|
||
|
||
#### `pointLabelScale`
|
||
|
||
- 类型:`number`
|
||
- 说明:单个控制点编号文字的尺寸倍率
|
||
- 建议范围:`0.7 ~ 1.3`
|
||
- 建议默认值:`1`
|
||
- 备注:适合高价值点、终点、特殊活动点的编号强调
|
||
|
||
#### `pointLabelColorHex`
|
||
|
||
- 类型:`string`
|
||
- 说明:单个控制点编号文字颜色覆盖,例如 `#ffffff`
|
||
- 备注:未配置时回退到样式系统默认标签颜色逻辑
|
||
|
||
### 6.3 示例
|
||
|
||
```json
|
||
"controlOverrides": {
|
||
"start-1": {
|
||
"template": "focus",
|
||
"title": "比赛开始",
|
||
"body": "从这里出发,先熟悉地图方向。",
|
||
"autoPopup": true,
|
||
"once": true,
|
||
"priority": 1,
|
||
"clickTitle": "起点说明",
|
||
"clickBody": "点击起点可再次查看起跑说明。"
|
||
},
|
||
"control-2": {
|
||
"template": "minimal",
|
||
"score": 20,
|
||
"title": "教学楼南侧",
|
||
"body": "这里是重要转折点。",
|
||
"autoPopup": false,
|
||
"once": true,
|
||
"priority": 1,
|
||
"clickTitle": "教学楼南侧",
|
||
"clickBody": "这个点配置成点击查看。",
|
||
"contentExperience": {
|
||
"type": "h5",
|
||
"url": "https://example.com/content/control-2",
|
||
"bridge": "content-v1",
|
||
"presentation": "fullscreen"
|
||
},
|
||
"clickExperience": {
|
||
"type": "h5",
|
||
"url": "https://example.com/content/control-2-click",
|
||
"bridge": "content-v1",
|
||
"presentation": "fullscreen"
|
||
}
|
||
},
|
||
"finish-1": {
|
||
"template": "focus",
|
||
"title": "比赛结束",
|
||
"body": "恭喜完成本次路线。",
|
||
"autoPopup": false,
|
||
"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`
|
||
- 说明:是否需要手动点击开始
|
||
- 建议默认值:
|
||
- 顺序赛:`false`
|
||
- 积分赛:`false`
|
||
- 备注:
|
||
- 进入页面后先进入待起跑态,通过开始点打卡正式开赛
|
||
|
||
### `game.session.requiresStartPunch`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:是否必须完成起点打卡
|
||
- 建议默认值:
|
||
- 顺序赛:`true`
|
||
- 积分赛:`true`
|
||
|
||
### `game.session.requiresFinishPunch`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:是否必须完成终点打卡
|
||
- 建议默认值:
|
||
- 顺序赛:`true`
|
||
- 积分赛:`false`
|
||
|
||
### `game.session.autoFinishOnLastControl`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:是否打完最后控制点自动结束
|
||
- 建议默认值:`false`
|
||
|
||
### `game.session.minCompletedControlsBeforeFinish`
|
||
|
||
- 类型:`number`
|
||
- 说明:终点生效前至少需要完成的普通检查点数量
|
||
- 建议默认值:
|
||
- 顺序赛:`0`
|
||
- 积分赛:`1`
|
||
|
||
### `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`
|
||
- 说明:是否允许跳点
|
||
- 建议默认值:
|
||
- 顺序赛:`true`
|
||
- 积分赛:`false`
|
||
|
||
### `game.sequence.skip.radiusMeters`
|
||
|
||
- 类型:`number`
|
||
- 说明:跳点半径
|
||
- 建议默认值:
|
||
- 顺序赛:`game.punch.radiusMeters * 2`
|
||
|
||
### `game.sequence.skip.requiresConfirm`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:跳点是否需要确认
|
||
- 建议默认值:`false`
|
||
|
||
---
|
||
|
||
## 11. `game.scoring`
|
||
|
||
### `game.scoring.type`
|
||
|
||
- 类型:`string`
|
||
- 说明:积分模型
|
||
- 当前推荐值:`score`
|
||
|
||
### `game.scoring.defaultControlScore`
|
||
|
||
- 类型:`number`
|
||
- 说明:普通控制点未单独配置时的默认基础分
|
||
- 建议默认值:
|
||
- 顺序赛:`1`
|
||
- 积分赛:`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`
|
||
|
||
### `game.audio.distantDistanceMeters`
|
||
|
||
- 类型:`number`
|
||
- 说明:远距离提示音的最大生效距离,超出该距离默认静默
|
||
- 建议默认值:`80`
|
||
|
||
### `game.audio.approachDistanceMeters`
|
||
|
||
- 类型:`number`
|
||
- 说明:接近提示音的最大生效距离
|
||
- 建议默认值:`20`
|
||
|
||
### `game.audio.readyDistanceMeters`
|
||
|
||
- 类型:`number`
|
||
- 说明:可打点提示音的最大生效距离
|
||
- 建议默认值:`5`
|
||
- 备注:
|
||
- 运行时不会小于 `game.punch.radiusMeters`
|
||
|
||
### `game.audio.cues["guidance:distant"].loopGapMs`
|
||
|
||
- 类型:`number`
|
||
- 说明:远距离提示音循环间隔,单位毫秒
|
||
- 建议默认值:`4800`
|
||
|
||
### `game.audio.cues["guidance:approaching"].loopGapMs`
|
||
|
||
- 类型:`number`
|
||
- 说明:接近提示音循环间隔,单位毫秒
|
||
- 建议默认值:`950`
|
||
|
||
### `game.audio.cues["guidance:ready"].loopGapMs`
|
||
|
||
- 类型:`number`
|
||
- 说明:可打点提示音循环间隔,单位毫秒
|
||
- 建议默认值:`650`
|
||
|
||
### `game.audio.cues["guidance:distant" | "guidance:approaching" | "guidance:ready"].volume`
|
||
|
||
- 类型:`number`
|
||
- 说明:三档距离提示音各自音量
|
||
- 建议范围:`0 ~ 1`
|
||
|
||
---
|
||
|
||
## 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. `game.presentation`
|
||
|
||
### `game.presentation.sequential.controls.default`
|
||
|
||
- 类型:`object`
|
||
- 说明:顺序赛普通未完成控制点的默认样式
|
||
- 支持字段:
|
||
- `style`:`classic-ring | solid-dot | double-ring | badge | pulse-core`
|
||
- `colorHex`:十六进制颜色,例如 `#cc006b`
|
||
- `sizeScale`:点位尺寸倍率
|
||
- `accentRingScale`:强调环尺寸倍率
|
||
- `glowStrength`:点位光晕强度
|
||
- `labelScale`:编号文字尺寸倍率
|
||
- `labelColorHex`:编号文字颜色
|
||
|
||
### `game.presentation.sequential.controls.current`
|
||
|
||
- 类型:`object`
|
||
- 说明:顺序赛当前目标点/可打点状态样式
|
||
|
||
### `game.presentation.sequential.controls.completed`
|
||
|
||
- 类型:`object`
|
||
- 说明:顺序赛已完成点样式
|
||
|
||
### `game.presentation.sequential.controls.skipped`
|
||
|
||
- 类型:`object`
|
||
- 说明:顺序赛已跳过点样式
|
||
- 备注:
|
||
- 默认建议使用偏橙色系,与已完成灰色态区分
|
||
|
||
### `game.presentation.sequential.controls.start`
|
||
|
||
- 类型:`object`
|
||
- 说明:顺序赛起点样式
|
||
|
||
### `game.presentation.sequential.controls.finish`
|
||
|
||
- 类型:`object`
|
||
- 说明:顺序赛终点样式
|
||
|
||
### `game.presentation.sequential.legs.default`
|
||
|
||
- 类型:`object`
|
||
- 说明:顺序赛默认路线腿样式
|
||
- 支持字段:
|
||
- `style`:`classic-leg | dashed-leg | glow-leg | progress-leg`
|
||
- `colorHex`:十六进制颜色
|
||
- `widthScale`:路线腿宽度倍率
|
||
- `glowStrength`:路线腿光晕强度
|
||
- 备注:
|
||
- 默认建议使用传统定向运动紫红色系
|
||
- 默认配合电流动效使用
|
||
|
||
### `game.presentation.sequential.legs.completed`
|
||
|
||
- 类型:`object`
|
||
- 说明:顺序赛已完成路线腿样式
|
||
|
||
### `playfield.legOverrides`
|
||
|
||
- 类型:`object`
|
||
- 说明:对指定路线腿做局部样式覆盖
|
||
- 建议:优先使用 `playfield.legDefaults` 写整场腿线默认,再用 `legOverrides` 写单腿例外
|
||
|
||
### `playfield.legDefaults`
|
||
|
||
- 类型:`object`
|
||
- 说明:腿线的活动级默认样式
|
||
- 当前支持字段:
|
||
- `style`
|
||
- `colorHex`
|
||
- `widthScale`
|
||
- `glowStrength`
|
||
- 键名建议:
|
||
- `leg-1`
|
||
- `leg-2`
|
||
- `leg-3`
|
||
|
||
- 字段:
|
||
- `style`:`classic-leg | dashed-leg | glow-leg | progress-leg`
|
||
- `colorHex`:十六进制颜色
|
||
- `widthScale`:路线腿宽度倍率
|
||
- `glowStrength`:路线腿光晕强度
|
||
|
||
- 示例:
|
||
|
||
```json
|
||
"legOverrides": {
|
||
"leg-2": {
|
||
"style": "glow-leg",
|
||
"colorHex": "#27ae60"
|
||
}
|
||
}
|
||
```
|
||
|
||
### `game.presentation.scoreO.controls.default`
|
||
|
||
- 类型:`object`
|
||
- 说明:积分赛默认点位样式
|
||
- 当前默认建议使用传统圆圈样式,编号绘制在圆圈内
|
||
|
||
### `game.presentation.scoreO.controls.focused`
|
||
|
||
- 类型:`object`
|
||
- 说明:积分赛当前聚焦/选中点样式
|
||
|
||
### `game.presentation.scoreO.controls.collected`
|
||
|
||
- 类型:`object`
|
||
- 说明:积分赛已收集点样式
|
||
|
||
### `game.presentation.scoreO.controls.start`
|
||
|
||
- 类型:`object`
|
||
- 说明:积分赛起点样式
|
||
|
||
### `game.presentation.scoreO.controls.finish`
|
||
|
||
- 类型:`object`
|
||
- 说明:积分赛终点样式
|
||
|
||
### `game.presentation.scoreO.controls.scoreBands`
|
||
|
||
- 类型:`array`
|
||
- 说明:积分赛按分值档位映射点位颜色和样式
|
||
- 数组项字段:
|
||
- `min`:分值下界,含
|
||
- `max`:分值上界,含
|
||
- `style`:`classic-ring | solid-dot | double-ring | badge | pulse-core`
|
||
- `colorHex`:十六进制颜色
|
||
- `sizeScale`:该积分档位的点位尺寸倍率
|
||
- `accentRingScale`:该积分档位的强调环倍率
|
||
- `glowStrength`:该积分档位的光晕强度
|
||
- `labelScale`:该积分档位的编号文字尺寸倍率
|
||
- `labelColorHex`:该积分档位的编号文字颜色
|
||
|
||
- 示例:
|
||
|
||
```json
|
||
"presentation": {
|
||
"scoreO": {
|
||
"controls": {
|
||
"scoreBands": [
|
||
{ "min": 0, "max": 19, "style": "classic-ring", "colorHex": "#56ccf2" },
|
||
{ "min": 20, "max": 49, "style": "classic-ring", "colorHex": "#f2c94c" },
|
||
{ "min": 50, "max": 999999, "style": "double-ring", "colorHex": "#eb5757" }
|
||
]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 20. `game.presentation.track`
|
||
|
||
- 类型:`object`
|
||
- 说明:用户轨迹显示策略与样式配置
|
||
|
||
### `game.presentation.track.mode`
|
||
|
||
- 类型:`string`
|
||
- 说明:轨迹显示模式
|
||
- 当前支持:
|
||
- `none`:不显示轨迹
|
||
- `tail`:彗尾拖尾
|
||
- `full`:全轨迹
|
||
- 建议默认值:
|
||
- 顺序赛:`full`
|
||
- 积分赛:`tail`
|
||
|
||
### `game.presentation.track.style`
|
||
|
||
- 类型:`string`
|
||
- 说明:轨迹风格 profile
|
||
- 当前支持:
|
||
- `classic`
|
||
- `neon`
|
||
- 当前默认值:`neon`
|
||
|
||
### `game.presentation.track.tailLength`
|
||
|
||
- 类型:`string`
|
||
- 说明:拖尾基础长度档位
|
||
- 当前支持:
|
||
- `short`
|
||
- `medium`
|
||
- `long`
|
||
- 备注:
|
||
- 实际显示长度会继续按移动速度动态变化
|
||
- 跑得越快,尾巴越长
|
||
- 跑得越慢,尾巴越短
|
||
|
||
### `game.presentation.track.colorPreset`
|
||
|
||
- 类型:`string`
|
||
- 说明:轨迹亮色调色盘
|
||
- 当前支持:
|
||
- `mint`
|
||
- `cyan`
|
||
- `sky`
|
||
- `blue`
|
||
- `violet`
|
||
- `pink`
|
||
- `orange`
|
||
- `yellow`
|
||
- 备注:
|
||
- 运行时会在此基础上根据速度和心率张力自动提亮头部颜色与光晕
|
||
|
||
### `game.presentation.track.tailMeters`
|
||
|
||
- 类型:`number`
|
||
- 说明:拖尾基础长度(米)
|
||
- 备注:
|
||
- 若未显式配置,则按 `tailLength` 自动映射
|
||
|
||
### `game.presentation.track.tailMaxSeconds`
|
||
|
||
- 类型:`number`
|
||
- 说明:拖尾最大时间窗口(秒)
|
||
|
||
### `game.presentation.track.fadeOutWhenStill`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:静止后是否逐步收尾消失
|
||
|
||
### `game.presentation.track.stillSpeedKmh`
|
||
|
||
- 类型:`number`
|
||
- 说明:低于该速度时进入静止收尾逻辑
|
||
|
||
### `game.presentation.track.fadeOutDurationMs`
|
||
|
||
- 类型:`number`
|
||
- 说明:静止后拖尾完全淡出的时长(毫秒)
|
||
|
||
### `game.presentation.track.colorHex`
|
||
|
||
- 类型:`string`
|
||
- 说明:轨迹主色
|
||
- 备注:
|
||
- 未配置时按 `colorPreset` 自动映射
|
||
|
||
### `game.presentation.track.headColorHex`
|
||
|
||
- 类型:`string`
|
||
- 说明:轨迹头部高亮颜色
|
||
- 备注:
|
||
- 未配置时按 `colorPreset` 自动映射
|
||
|
||
### `game.presentation.track.widthPx`
|
||
|
||
- 类型:`number`
|
||
- 说明:轨迹基础宽度
|
||
|
||
### `game.presentation.track.headWidthPx`
|
||
|
||
- 类型:`number`
|
||
- 说明:轨迹头部高亮宽度
|
||
|
||
### `game.presentation.track.glowStrength`
|
||
|
||
- 类型:`number`
|
||
- 说明:轨迹光晕强度
|
||
- 备注:
|
||
- `standard / lite` 会自动做 glow 强度降级
|
||
|
||
---
|
||
|
||
## 21. `game.presentation.gpsMarker`
|
||
|
||
- 类型:`object`
|
||
- 说明:GPS 定位点显示、尺寸、颜色、朝向指示和品牌化扩展配置
|
||
|
||
### `game.presentation.gpsMarker.visible`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:是否显示 GPS 定位点
|
||
- 当前默认值:`true`
|
||
|
||
### `game.presentation.gpsMarker.style`
|
||
|
||
- 类型:`string`
|
||
- 说明:GPS 点基础样式
|
||
- 当前支持:
|
||
- `dot`
|
||
- `beacon`
|
||
- `disc`
|
||
- `badge`
|
||
- 当前默认值:`beacon`
|
||
|
||
### `game.presentation.gpsMarker.size`
|
||
|
||
- 类型:`string`
|
||
- 说明:GPS 点整体大小档位
|
||
- 当前支持:
|
||
- `small`
|
||
- `medium`
|
||
- `large`
|
||
- 当前默认值:`medium`
|
||
|
||
### `game.presentation.gpsMarker.colorPreset`
|
||
|
||
- 类型:`string`
|
||
- 说明:GPS 点亮色调色盘
|
||
- 当前支持:
|
||
- `mint`
|
||
- `cyan`
|
||
- `sky`
|
||
- `blue`
|
||
- `violet`
|
||
- `pink`
|
||
- `orange`
|
||
- `yellow`
|
||
- 当前默认值:`cyan`
|
||
|
||
### `game.presentation.gpsMarker.colorHex`
|
||
|
||
- 类型:`string`
|
||
- 说明:GPS 点主色
|
||
- 备注:
|
||
- 未配置时按 `colorPreset` 自动映射
|
||
|
||
### `game.presentation.gpsMarker.ringColorHex`
|
||
|
||
- 类型:`string`
|
||
- 说明:GPS 点外圈颜色
|
||
- 备注:
|
||
- 未配置时按 `colorPreset` 自动映射
|
||
|
||
### `game.presentation.gpsMarker.indicatorColorHex`
|
||
|
||
- 类型:`string`
|
||
- 说明:朝向小三角颜色
|
||
- 备注:
|
||
- 未配置时按 `colorPreset` 自动映射
|
||
|
||
### `game.presentation.gpsMarker.showHeadingIndicator`
|
||
|
||
- 类型:`boolean`
|
||
- 说明:是否显示跟随朝向旋转的小三角
|
||
- 当前默认值:`true`
|
||
- 备注:
|
||
- 运行时会结合朝向可信度自动降低透明度
|
||
|
||
### `game.presentation.gpsMarker.animationProfile`
|
||
|
||
- 类型:`string`
|
||
- 说明:GPS 点动画 profile
|
||
- 当前支持:
|
||
- `minimal`
|
||
- `dynamic-runner`
|
||
- `warning-reactive`
|
||
- 当前默认值:`dynamic-runner`
|
||
- 备注:
|
||
- 第一阶段主要影响静止、移动、高速和高压状态下的动势强弱
|
||
- 未配置时使用系统默认动画逻辑
|
||
|
||
### `game.presentation.gpsMarker.logoUrl`
|
||
|
||
- 类型:`string`
|
||
- 说明:品牌 logo 资源地址
|
||
- 当前状态:已支持中心贴片
|
||
- 备注:
|
||
- logo 作为中心贴片嵌入 GPS 点,不直接替代定位点
|
||
- 建议使用透明背景正方形资源
|
||
|
||
### `game.presentation.gpsMarker.logoMode`
|
||
|
||
- 类型:`string`
|
||
- 说明:logo 嵌入方式
|
||
- 当前支持:
|
||
- `center-badge`
|
||
- 当前状态:已支持
|
||
|
||
---
|
||
|
||
## 22. 当前默认逻辑说明
|
||
|
||
当前客户端对配置的处理原则是:
|
||
|
||
- 能有默认值的尽量给默认值
|
||
- 控制点内容类字段缺失时走默认文案
|
||
- `clickTitle/clickBody` 在最小模板下默认关闭,不再回退到 `title/body`
|
||
- 自动打点模式下不自动弹内容
|
||
- 内容优先级未配置时使用普通点 `1`、终点 `2`
|
||
|
||
也就是说:
|
||
|
||
**大部分配置项都不是强制必填,先保证主骨架完整即可。**
|
||
|
||
### 22.1 顺序赛最小模板默认流程
|
||
|
||
如果只提供顺序赛最小模板,系统默认按以下流程处理:
|
||
|
||
- 进入游戏后只显示开始点,提示玩家先打开始点
|
||
- 成功打开始点后,显示全部普通控制点、终点和腿线,并正式开始计时
|
||
- 开始点和结束点默认不弹题,只弹提示信息
|
||
- 普通控制点默认允许跳点
|
||
- 默认跳点半径为打点半径的 `2` 倍
|
||
- 普通控制点成功打点后立即获得 `1` 分基础分
|
||
- 最小模板下默认不弹题
|
||
- 如需答题,需显式为对应点位配置 `quiz` CTA
|
||
- 跳过点不弹题、不得分
|
||
- 成功打结束点后停止计时,弹出结束提示,随后进入默认结算页
|
||
|
||
### 22.2 顺序赛最小模板默认表现
|
||
|
||
- 起跑前只显示开始点
|
||
- 打完开始点后显示完整路线
|
||
- 默认路线主色参考传统定向运动紫红色
|
||
- 默认腿线带电流动效
|
||
- 开始点、结束点、当前目标点都应有动效强调
|
||
- 已完成点默认变灰
|
||
- 已跳过点默认使用另一套区分色
|
||
|
||
### 22.3 积分赛最小模板默认流程
|
||
|
||
如果只提供积分赛最小模板,系统默认按以下流程处理:
|
||
|
||
- 进入游戏后只显示开始点,提示玩家先打开始点
|
||
- 成功打开始点后,显示全部积分点和结束点,并正式开始计时
|
||
- 开始点和结束点默认不弹题,只弹提示信息
|
||
- 玩家默认不需要先点击积分点
|
||
- 底部 HUD 信息面板默认显示当前目标摘要、目标距离和总分 / 收集进度摘要
|
||
- 任意未收集积分点进入范围时都可生效
|
||
- 成功打点后默认立即获得该点基础分
|
||
- 最小模板下默认不弹题
|
||
- 如需答题,需显式为对应点位配置 `quiz` CTA
|
||
- 默认至少完成 `1` 个普通积分点后,结束点才解锁,且不需要先设为目标点
|
||
- 成功打结束点后停止计时,弹出结束提示,随后进入默认结算页
|
||
|
||
### 22.4 积分赛最小模板默认表现
|
||
|
||
- 起跑前只显示开始点
|
||
- 打完开始点后显示全部积分点和结束点
|
||
- 当前目标点默认要有更强高亮和动效
|
||
- 默认所有积分点显示分值标签
|
||
- 已收集点默认变灰
|
||
- 默认不显示腿线
|
||
|
||
---
|
||
|
||
## 23. 维护约定
|
||
|
||
后续每次新增配置项时,应同步更新:
|
||
|
||
1. 本文档
|
||
2. 默认模板文档
|
||
3. `event` 目录下的配置样例
|
||
|
||
这样可以保证:
|
||
|
||
- 服务端可对照
|
||
- 后台可录入
|
||
- 客户端联调时有统一参考
|