Add config-driven game host updates

This commit is contained in:
2026-03-25 13:58:51 +08:00
parent f0ced54805
commit d1cc6cc473
28 changed files with 3247 additions and 105 deletions

View File

@@ -1251,3 +1251,192 @@ GPS
- 把已经证明有效的主链打磨稳
- 再逐步扩展玩法和能力
# 21. 今日新增宿主层约定
今天这批调整的重点,不是新增某一个玩法,而是继续把宿主层的同步与展示链路收干净。它们的价值在于:
- 不只服务顺序赛或积分赛
- 后续新玩法也能直接复用
- 让“用户操作”和“程序状态变化”最终都汇到同一条同步链
## 21.1 配置入口元信息开始进入宿主快照
远程配置入口目前已经不再只服务地图与路线加载,也开始承载活动级元信息。
当前 [remoteMapConfig.ts](/D:/dev/cmr-mini/miniprogram/utils/remoteMapConfig.ts) 已经能从配置中解析并标准化这些字段:
- `app.id`
- `app.title`
- `schemaVersion`
- `version`
- `map.*`
- `playfield.*`
- `game.*`
其中:
- `configAppId`
- `configSchemaVersion`
- `configVersion`
已经进入 [MapEngine](/D:/dev/cmr-mini/miniprogram/engine/map/mapEngine.ts) 的宿主状态,并可以被上层面板消费。
这意味着配置入口开始具备“双重职责”:
- 一方面装配运行所需的地图、路线、玩法参数
- 另一方面提供活动本身的识别信息和版本信息
这一步为后面配置文件完全成为游戏入口打下了基础。
## 21.2 统一状态提交管线继续强化
前面已经建立了:
- `event -> RulePlugin -> GameResult`
今天继续强化的是:
- `GameResult -> MapEngine.commitGameResult(...) -> 页面 / telemetry / feedback / renderer`
这条宿主管线的目标是:
- 不再靠某个功能里“顺手刷新一下状态”
- 而是让所有玩法动作最终都走统一提交
当前这条统一提交链已经被用于:
- 开始对局
- 打点
- 跳点
- 积分赛 focus 选点
- GPS 更新后的规则推进
- 切换配置后的定义加载
这一步的意义非常大,因为游戏过程中真正需要同步的状态越来越多,例如:
- 当前目标
- 已完成 / 已跳过状态
- HUD 文案
- 打点与跳点按钮可用性
- guidance 音效状态
- 地图高亮
- telemetry 目标距离
- renderer 表现层
只要这些更新仍然能统一收敛到 `commitGameResult(...)` 这条链上,架构就还是健康的。
## 21.3 游戏信息面板成为新的宿主诊断出口
11 号按钮现在不再是临时调试入口,而是一个正式的“游戏信息面板”。
当前它由 [map.ts](/D:/dev/cmr-mini/miniprogram/pages/map/map.ts) 负责开关,由 [MapEngine](/D:/dev/cmr-mini/miniprogram/engine/map/mapEngine.ts) 提供快照数据,页面层只负责展示。
面板当前分成两部分:
- `Local`
- `Global`
其中:
- `Local` 负责展示本地已知的实时状态
- `Global` 目前还是占位,后面联网后再接全局赛事态
`Local` 当前已经可以展示:
- 比赛名称
- 配置版本
- Schema 版本
- 活动 ID
- 当前玩法
- 当前状态
- 当前目标
- 进度
- 分数
- 打点与跳点规则
- GPS、心率、里程、速度、卡路里等本地信息
这块的设计原则是:
- 页面不自己拼业务逻辑
- 引擎只提供统一快照
- 后面全局数据接入时,继续沿这套面板结构扩展
## 21.4 侧边按钮体系正式分成两类
今天还把地图页的侧边按钮体系收了一版,避免后面按钮越来越多后状态逻辑变乱。
当前已经明确分成两类:
### A. 三态功能按钮
适用于:
- `4 exit`
- `11 info`
- `16 skip`
它们统一使用三种状态:
- `muted`
- `default`
- `active`
这些按钮的视觉态不再由模板零散判断,而是由页面层统一派生。
当前 [map.ts](/D:/dev/cmr-mini/miniprogram/pages/map/map.ts) 中已经有:
- `SideActionButtonState`
- `buildSideButtonState(...)`
输入的是主状态,例如:
- `showGameInfoPanel`
- `skipButtonEnabled`
- `gameSessionStatus`
输出的是最终按钮态,例如:
- `sideButton4Class`
- `sideButton11Class`
- `sideButton16Class`
这意味着:
- 有些状态虽然是用户点击触发的
- 有些状态虽然是程序运行中更新的
- 但最后按钮显示都统一走同一套派生逻辑
### B. 循环模式按钮
左上角那个按钮不属于三态功能按钮,而是单独的“模式切换器”。
当前它根据 `sideButtonMode` 循环切换不同图标:
- `btn_more1`
- `btn_more2`
- `btn_more3`
它的本质是:
- 点击后切换显示模式
- 图标跟随当前模式变化
而不是普通意义上的启用/禁用/激活按钮
把这类按钮和普通功能按钮分开,是为了后面继续扩展侧边栏时不把状态语义搅乱。
## 21.5 当前阶段的判断
到今天这一步,可以比较明确地说:
- 统一提交管线已经有雏形
- 游戏信息面板已经成为宿主状态对外展示窗口
- 侧边按钮体系已经开始统一状态派生
这三件事都不是只服务某个玩法的补丁,而是在继续把“通用宿主层”做稳。
当前最重要的不是继续为了理论纯度大拆,而是:
- 先用这套底座承接后续配置字段和玩法细化
- 一旦再次出现“某类状态总是漏同步”的真实问题,再继续沿统一提交链收口