feat: 收敛玩法运行时配置并加入故障恢复

This commit is contained in:
2026-04-01 13:04:26 +08:00
parent 1635a11780
commit 3ef841ecc7
73 changed files with 8820 additions and 2122 deletions

View File

@@ -23,8 +23,9 @@
```json
{
"schemaVersion": "1",
"version": "2026.03.27",
"version": "2026.03.31",
"app": {},
"settings": {},
"map": {},
"playfield": {},
"game": {},
@@ -54,6 +55,12 @@
- 类型:`object`
- 说明:活动级基础信息
### `settings`
- 类型:`object`
- 说明:系统设置页默认值与锁态配置
- 备注:只控制设置页公共项,不属于具体玩法规则本体
### `map`
- 类型:`object`
@@ -81,6 +88,40 @@
---
## `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`
@@ -172,23 +213,63 @@
---
## 6. `playfield.controlOverrides`
## 6. `playfield.controlDefaults` / `playfield.controlOverrides`
`playfield.controlOverrides` 用于对起点、检查点、终点做内容或分值覆盖。
推荐优先使用:
### 6.1 key 命名规则
- `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.2 当前支持字段
### 6.4 当前支持字段
#### `score`
- 类型:`number`
- 说明:积分赛控制点分值
- 适用:积分赛
- 备注:如果同时配置了 `playfield.controlDefaults.score`,则当前点以单点值为准
#### `title`
@@ -216,20 +297,22 @@
- 类型:`string`
- 说明:点击控制点时弹出的标题
- 默认逻辑:未配置时回退到 `title`
- 默认逻辑:最小模板下默认不启用;仅在显式配置点击内容能力时生效
#### `clickBody`
- 类型:`string`
- 说明:点击控制点时弹出的正文
- 默认逻辑:未配置时回退到 `body`
- 默认逻辑:最小模板下默认不启用;仅在显式配置点击内容能力时生效
#### `autoPopup`
- 类型:`boolean`
- 说明:完成该点后是否自动弹出内容
- 建议默认值:`true`
- 说明:完成该点后是否自动弹出内容
- 建议默认值:最小模板下 `false`
- 特殊逻辑:如果当前玩法是自动打点,即 `game.punch.policy = "enter"`,则无论这里如何配置,**都不自动弹出**
- 补充说明:该字段只控制内容卡弹出
- 补充说明:系统默认白卡已改为“显式配置启用”,未开启 `autoPopup` 时,起点和普通点完成后不弹白卡
#### `once`
@@ -415,7 +498,7 @@
"template": "focus",
"title": "比赛结束",
"body": "恭喜完成本次路线。",
"autoPopup": true,
"autoPopup": false,
"once": true,
"priority": 2,
"clickTitle": "终点说明",
@@ -450,7 +533,11 @@
- 类型:`boolean`
- 说明:是否需要手动点击开始
- 建议默认值:`true`
- 建议默认值:
- 顺序赛:`false`
- 积分赛:`false`
- 备注:
- 进入页面后先进入待起跑态,通过开始点打卡正式开赛
### `game.session.requiresStartPunch`
@@ -474,6 +561,14 @@
- 说明:是否打完最后控制点自动结束
- 建议默认值:`false`
### `game.session.minCompletedControlsBeforeFinish`
- 类型:`number`
- 说明:终点生效前至少需要完成的普通检查点数量
- 建议默认值:
- 顺序赛:`0`
- 积分赛:`1`
### `game.session.maxDurationSec`
- 类型:`number`
@@ -517,19 +612,22 @@
- 类型:`boolean`
- 说明:是否允许跳点
- 建议默认值:`false`
- 建议默认值:
- 顺序赛:`true`
- 积分赛:`false`
### `game.sequence.skip.radiusMeters`
- 类型:`number`
- 说明:跳点半径
- 建议默认值:`30`
- 建议默认值:
- 顺序赛:`game.punch.radiusMeters * 2`
### `game.sequence.skip.requiresConfirm`
- 类型:`boolean`
- 说明:跳点是否需要确认
- 建议默认值:`true`
- 建议默认值:`false`
---
@@ -544,8 +642,11 @@
### `game.scoring.defaultControlScore`
- 类型:`number`
- 说明:积分赛默认控制点分值
- 建议默认值:`10`
- 说明:普通控制点未单独配置时的默认基础分
- 建议默认值:
- 顺序赛:`1`
- 积分赛:`10`
- 适用:顺序赛、积分赛
---
@@ -596,6 +697,9 @@
- 建议默认值:
- 顺序赛:`false`
- 积分赛:`true`
- 备注:
- 顺序赛默认要求所有中间点都已被标记为“成功”或“跳过”后,终点才可生效
- 积分赛默认开赛后终点始终可结束,不需要先设为目标点
---
@@ -641,6 +745,50 @@
- 说明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`
@@ -710,6 +858,8 @@
- 类型:`object`
- 说明:顺序赛已跳过点样式
- 备注:
- 默认建议使用偏橙色系,与已完成灰色态区分
### `game.presentation.sequential.controls.start`
@@ -730,6 +880,9 @@
- `colorHex`:十六进制颜色
- `widthScale`:路线腿宽度倍率
- `glowStrength`:路线腿光晕强度
- 备注:
- 默认建议使用传统定向运动紫红色系
- 默认配合电流动效使用
### `game.presentation.sequential.legs.completed`
@@ -740,6 +893,17 @@
- 类型:`object`
- 说明:对指定路线腿做局部样式覆盖
- 建议:优先使用 `playfield.legDefaults` 写整场腿线默认,再用 `legOverrides` 写单腿例外
### `playfield.legDefaults`
- 类型:`object`
- 说明:腿线的活动级默认样式
- 当前支持字段:
- `style`
- `colorHex`
- `widthScale`
- `glowStrength`
- 键名建议:
- `leg-1`
- `leg-2`
@@ -766,6 +930,7 @@
- 类型:`object`
- 说明:积分赛默认点位样式
- 当前默认建议使用传统圆圈样式,编号绘制在圆圈内
### `game.presentation.scoreO.controls.focused`
@@ -810,8 +975,8 @@
"controls": {
"scoreBands": [
{ "min": 0, "max": 19, "style": "classic-ring", "colorHex": "#56ccf2" },
{ "min": 20, "max": 49, "style": "double-ring", "colorHex": "#f2c94c" },
{ "min": 50, "max": 999999, "style": "badge", "colorHex": "#eb5757" }
{ "min": 20, "max": 49, "style": "classic-ring", "colorHex": "#f2c94c" },
{ "min": 50, "max": 999999, "style": "double-ring", "colorHex": "#eb5757" }
]
}
}
@@ -1049,7 +1214,7 @@
- 能有默认值的尽量给默认值
- 控制点内容类字段缺失时走默认文案
- `clickTitle/clickBody` 缺失时回退到 `title/body`
- `clickTitle/clickBody` 在最小模板下默认关闭,不再回退到 `title/body`
- 自动打点模式下不自动弹内容
- 内容优先级未配置时使用普通点 `1`、终点 `2`
@@ -1057,6 +1222,56 @@
**大部分配置项都不是强制必填,先保证主骨架完整即可。**
### 22.1 顺序赛最小模板默认流程
如果只提供顺序赛最小模板,系统默认按以下流程处理:
- 进入游戏后只显示开始点,提示玩家先打开始点
- 成功打开始点后,显示全部普通控制点、终点和腿线,并正式开始计时
- 开始点和结束点默认不弹题,只弹提示信息
- 普通控制点默认允许跳点
- 默认跳点半径为打点半径的 `2`
- 普通控制点成功打点后立即获得 `1` 分基础分
- 最小模板下默认不弹题
- 如需答题,需显式为对应点位配置 `quiz` CTA
- 跳过点不弹题、不得分
- 成功打结束点后停止计时,弹出结束提示,随后进入默认结算页
### 22.2 顺序赛最小模板默认表现
- 起跑前只显示开始点
- 打完开始点后显示完整路线
- 默认路线主色参考传统定向运动紫红色
- 默认腿线带电流动效
- 开始点、结束点、当前目标点都应有动效强调
- 已完成点默认变灰
- 已跳过点默认使用另一套区分色
### 22.3 积分赛最小模板默认流程
如果只提供积分赛最小模板,系统默认按以下流程处理:
- 进入游戏后只显示开始点,提示玩家先打开始点
- 成功打开始点后,显示全部积分点和结束点,并正式开始计时
- 开始点和结束点默认不弹题,只弹提示信息
- 玩家默认不需要先点击积分点
- 底部 HUD 信息面板默认显示当前目标摘要、目标距离和总分 / 收集进度摘要
- 任意未收集积分点进入范围时都可生效
- 成功打点后默认立即获得该点基础分
- 最小模板下默认不弹题
- 如需答题,需显式为对应点位配置 `quiz` CTA
- 默认至少完成 `1` 个普通积分点后,结束点才解锁,且不需要先设为目标点
- 成功打结束点后停止计时,弹出结束提示,随后进入默认结算页
### 22.4 积分赛最小模板默认表现
- 起跑前只显示开始点
- 打完开始点后显示全部积分点和结束点
- 当前目标点默认要有更强高亮和动效
- 默认所有积分点显示分值标签
- 已收集点默认变灰
- 默认不显示腿线
---
## 23. 维护约定
@@ -1072,4 +1287,3 @@
- 服务端可对照
- 后台可录入
- 客户端联调时有统一参考