# 配置选项字典（当前实现版）
> 文档版本：v1.0
> 最后更新：2026-04-02 08:28:05


本文档用于整理 **当前客户端已经消费或已经预留承载的配置项**，作为事件配置、后台配置和联调时的统一参考。

目标：

- 明确目前哪些字段已经真正生效
- 明确每个字段的含义、类型、默认逻辑
- 给后续扩展留下统一维护入口

说明：

- 本文档优先以“当前代码真实实现”为准
- 未列出的字段，不代表未来不能加，只代表当前客户端未正式消费
- 后续每次新增配置能力，都应同步补充本文件

---

## 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` 目录下的配置样例

这样可以保证：

- 服务端可对照
- 后台可录入
- 客户端联调时有统一参考


