# 运行时编译层总表 本文档用于定义当前项目推荐的“运行时编译层”结构,也就是把系统默认值、玩法默认值、活动配置、玩家设置编译成统一运行时 profile 的中间层。 目标: - 避免页面、引擎、规则层到处直接读取原始配置 - 明确各种默认值和覆盖值的合并顺序 - 为后续继续收口代码提供统一目标 说明: - 本文档讲的是“运行时编译结构” - 它不替代字段字典和玩法规则文档 - 当前已先落第一版代码骨架,后续会逐步把更多模块并到这一层 --- ## 1. 为什么需要编译层 当前系统里至少有 4 类来源: 1. 系统默认值 2. 玩法默认值 3. 活动配置 4. 玩家设置 如果页面、引擎、规则层分别自己去判断这些来源,问题会很快出现: - 默认值散落 - 覆盖顺序不一致 - 同一个字段在不同页面里表现不同 - 后续后台接入后更难维护 所以推荐做法是: 先编译,再运行。 也就是: `默认值 / 配置 / 玩家设置 -> Runtime Profile -> MapEngine / Rule / HUD` --- ## 2. 当前推荐编译顺序 ### 2.1 规则与玩法相关 推荐顺序: `系统默认值 -> 玩法默认值 -> 活动配置` 适用: - 对局流程 - 打点规则 - 跳点规则 - 完赛规则 - 分值默认值 ### 2.2 系统设置相关 推荐顺序: `系统设置默认值 -> 活动 settings 默认值 -> 玩家本地设置值` 锁态单独处理: `系统默认锁态 -> 活动 settings 锁态 -> 本局锁态生命周期` 说明: - 设置值可以持久化 - 锁态不持久化 - 锁态只在当前游戏配置运行生命周期内生效 ### 2.3 遥测相关 推荐顺序: `系统遥测默认值 -> 活动 telemetry 默认值 -> 玩家身体数据` 适用: - 年龄 - 静息心率 - 体重 --- ## 3. 当前推荐 profile 结构 当前建议至少编译成以下几块: ### 3.1 `map` 负责地图底座级运行参数: - 标题 - 控制点绘制半径 - 投影 - 磁偏角 - 初始缩放 ### 3.2 `game` 负责玩法与规则层运行参数: - 玩法模式 - 关门时间 - 关门预警时间 - 打点方式 - 打点半径 - 是否先选目标点 - 是否允许跳点 - 跳点半径 - 跳点确认 - 是否自动结束 - 默认点位分值 ### 3.3 `settings` 负责系统设置页相关运行参数: - 设置值最终结果 - 锁态最终结果 - 锁态生命周期是否激活 ### 3.4 `telemetry` 负责遥测层运行参数: - 合并后的遥测配置 - 当前玩家身体数据快照 ### 3.5 `presentation` 负责表现层 profile: - 控制点样式 - 轨迹样式 - GPS 点样式 ### 3.6 `feedback` 负责反馈层 profile: - 音效配置 - 震动配置 - UI 动效配置 --- ## 4. 当前代码落点 第一版运行时编译骨架已落在: - [runtimeProfileCompiler.ts](D:/dev/cmr-mini/miniprogram/game/core/runtimeProfileCompiler.ts) 当前已经开始编译的内容: - `game` - `settings` - `telemetry` - `presentation` - `feedback` - `map` 当前已接入页面 / 引擎的部分: - 设置页运行时 profile - 遥测层运行时 profile - 反馈层运行时 profile - 表现层 runtime profile - 规则层中一部分 `game profile` 字段 当前接入说明: - `settings / telemetry / feedback` 已开始作为日常运行入口使用 - 设置页大部分引擎型设置项已改成“先更新玩家设置,再统一走 `settings profile` 回灌 `MapEngine`” - `settings profile` 现已通过 `MapEngine.applyCompiledSettingsProfile(...)` 统一应用,不再由页面逐项调用各类 `handleSet...` - `presentation` 已开始通过编译层回写 `MapEngine` 表现参数 - `game` 当前已先接入模式、关门时间、打点和跳点这组核心字段 - `map` 已开始接入地图底座参数和配置状态文本这组基础字段 - `MapEngine.applyRemoteMapConfig(...)` 已开始退回为原始场地与资源入口,不再继续双写已编译字段 后续建议继续并入: - `MapEngine.applyRemoteMapConfig(...)` 的配置归一入口 - `map profile` - 更多 `game profile` 字段 - `courseToGameDefinition` --- ## 5. 当前推荐落地步骤 建议按以下顺序继续收代码: 1. 先让剩余设置层完全只吃 `settings profile` 2. 再让遥测层只吃 `telemetry profile` 3. 再让反馈层只吃 `feedback profile` 4. 最后把玩法规则入口和表现入口都改成吃统一 profile 补充: - 规则层中的目标角色也应尽量由统一运行态承载,而不是散落在 HUD 和地图展示字段里反推 - 当前已先明确 4 类目标角色: - 可打目标 - 引导目标 - HUD 目标 - 展示高亮目标 这样风险最小,也最容易逐步验证。 --- ## 6. 这层的边界 运行时编译层应该只做两件事: 1. 合并来源 2. 产出最终运行态 profile 不应该做的事: - 不直接承载页面状态 - 不直接承载本局临时分数和目标点 - 不直接写回配置 - 不承担玩法执行逻辑本身 也就是说: - 编译层负责“准备好” - 引擎和规则层负责“执行” --- ## 7. 当前结论 后续推荐统一按这条链走: `系统默认值 -> 玩法默认值 -> 活动配置 -> 玩家设置 -> 运行时编译层 -> 引擎 / 页面 / 规则` 这样配置越多,系统越不容易乱;后续后台做复杂了,也还是有一层中间结构兜住。