From 9cca04c9afb8953e0a95a574af12f8afa859ef6b Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 15 Sep 2026 04:38:40 +0800 Subject: [PATCH] =?UTF-8?q?docs(gdd):=20=E5=AE=8C=E6=88=90=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E5=BC=8F=E7=B3=BB=E7=BB=9F=E6=96=87=E6=A1=A3=2020=20?= =?UTF-8?q?=E4=BB=BD=EF=BC=88=E8=87=AA=E5=BD=92=E6=A1=A3=20GDD=20=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E6=94=B9=E5=86=99=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/02-系统清单.md | 85 ++++-- design/gdd/systems/冒险循环/元进度.md | 124 +++++++- design/gdd/systems/冒险循环/关卡节点地图.md | 165 +++++++++- design/gdd/systems/冒险循环/冒险结构.md | 262 ++++++++++++++++ design/gdd/systems/冒险循环/难度曲线与Boss.md | 270 +++++++++++++++++ design/gdd/systems/战斗循环/增益状态.md | 239 +++++++++++++++ design/gdd/systems/战斗循环/奖励道具经济.md | 281 ++++++++++++++++++ design/gdd/systems/战斗循环/战斗结算.md | 276 +++++++++++++++++ design/gdd/systems/战斗循环/战斗表现.md | 140 ++++++++- design/gdd/systems/战斗循环/敌人系统.md | 249 ++++++++++++++++ design/gdd/systems/排雷循环/地形变异.md | 141 +++++++++ design/gdd/systems/排雷循环/排雷玩法.md | 254 ++++++++++++++++ design/gdd/systems/排雷循环/棋盘生成.md | 249 ++++++++++++++++ design/gdd/systems/排雷循环/行动经济.md | 2 +- design/gdd/systems/排雷循环/辅助道具.md | 194 ++++++++++++ design/gdd/systems/表现与支撑/HUD框架.md | 259 ++++++++++++++++ design/gdd/systems/表现与支撑/存档序列化.md | 122 +++++++- design/gdd/systems/表现与支撑/教学引导.md | 2 +- design/gdd/systems/表现与支撑/数据配置.md | 220 ++++++++++++++ design/gdd/systems/表现与支撑/设置与本地化.md | 134 ++++++++- design/gdd/systems/表现与支撑/音频.md | 142 ++++++++- 21 files changed, 3774 insertions(+), 36 deletions(-) diff --git a/design/gdd/02-系统清单.md b/design/gdd/02-系统清单.md index 0a258c04..7b6c819a 100644 --- a/design/gdd/02-系统清单.md +++ b/design/gdd/02-系统清单.md @@ -17,42 +17,71 @@ ### 排雷循环(`systems/排雷循环/`) -| 文件 | 一句话概要 | -|---|---| -| `棋盘生成.md` | 棋盘怎么生成、怎么保证可推理可通关 | -| `排雷玩法.md` | 挖格、插旗、连锁展开等扫雷规则本体 | -| `行动经济.md` | 每轮行动点怎么花、停手与刷新的代价 | -| `地形变异.md` | 格子的非雾变异(岩浆/冰冻等,待定);**雾格已从设计中移除** | -| `辅助道具.md` | 扫雷侧辅助道具(显影、探测类) | +| 文件 | 一句话概要 | 状态 | +|---|---|---| +| `棋盘生成.md` | 棋盘怎么生成、怎么保证可推理可通关 | 已定稿·自旧体系迁移 | +| `排雷玩法.md` | 挖格、插旗、连锁展开等扫雷规则本体 | 已定稿·自旧体系迁移 | +| `行动经济.md` | 每轮行动点怎么花、停手与刷新的代价 | 已定稿·自旧体系迁移 | +| `地形变异.md` | 格子的非雾变异(岩浆/冰冻等,待定);**雾格已从设计中移除** | 已定稿·自旧体系迁移 | +| `辅助道具.md` | 扫雷侧辅助道具(显影、探测类) | 已定稿·自旧体系迁移 | ### 战斗循环(`systems/战斗循环/`) -| 文件 | 一句话概要 | -|---|---| -| `战斗结算.md` | 轮末结算的编排与逐行兑现 | -| `敌人系统.md` | 敌人数据、行为环、意图呈现 | -| `增益状态.md` | 增益/减益状态的容器、叠层与衰减 | -| `奖励道具经济.md` | 奖励产出、道具库存与使用窗口 | -| `战斗表现.md` | 战斗动画与演出(旧体系未单独成文) | +| 文件 | 一句话概要 | 状态 | +|---|---|---| +| `战斗结算.md` | 轮末结算的编排与逐行兑现 | 已定稿·自旧体系迁移 | +| `敌人系统.md` | 敌人数据、行为环、意图呈现 | 已定稿·自旧体系迁移 | +| `增益状态.md` | 增益/减益状态的容器、叠层与衰减 | 已定稿·自旧体系迁移 | +| `奖励道具经济.md` | 奖励产出、道具库存与使用窗口 | 已定稿·自旧体系迁移 | +| `战斗表现.md` | 战斗动画与演出(旧体系未单独成文) | 范围草案·待设计 | ### 冒险循环(`systems/冒险循环/`) -| 文件 | 一句话概要 | -|---|---| -| `关卡节点地图.md` | 单关内的节点链与推进 | -| `冒险结构.md` | 整局冒险的关卡序列、失败与大奖励 | -| `难度曲线与Boss.md` | 难度曲线、期望值带与 Boss 设计 | -| `元进度.md` | 跨局成长(旧体系未单独成文) | +| 文件 | 一句话概要 | 状态 | +|---|---|---| +| `关卡节点地图.md` | 单关内的节点链与推进 | 范围草案·待设计 | +| `冒险结构.md` | 整局冒险的关卡序列、失败与大奖励 | 已定稿·自旧体系迁移 | +| `难度曲线与Boss.md` | 难度曲线、期望值带与 Boss 设计 | 已定稿·自旧体系迁移 | +| `元进度.md` | 跨局成长(旧体系未单独成文) | 范围草案·待设计 | ### 表现与支撑(`systems/表现与支撑/`) -| 文件 | 一句话概要 | -|---|---| -| `HUD框架.md` | 界面布局与呈现层契约 | -| `数据配置.md` | 数值表与单一事实源管线 | -| `存档序列化.md` | 存档契约与版本迁移 | -| `音频.md` | 音乐音效方向与实现 | -| `教学引导.md` | 新手教学与提示 | -| `设置与本地化.md` | 设置项与多语言 | +| 文件 | 一句话概要 | 状态 | +|---|---|---| +| `HUD框架.md` | 界面布局与呈现层契约 | 已定稿·自旧体系迁移 | +| `数据配置.md` | 数值表与单一事实源管线 | 已定稿·自旧体系迁移 | +| `存档序列化.md` | 存档契约与版本迁移 | 范围草案·待设计 | +| `音频.md` | 音乐音效方向与实现 | 范围草案·待设计 | +| `教学引导.md` | 新手教学与提示 | 范围草案·待设计 | +| `设置与本地化.md` | 设置项与多语言 | 范围草案·待设计 | + +## 子系统命名对照表(中文规范名 ↔ 英文代号) + +现行文档、评审与沟通一律使用中文规范名;英文代号(大写)供代码标识符、工具链与提交信息使用,语义与中文名一一对应;「旧代号」仅用于解读 `design/archive/gdd-2026-09-14/` 只读归档与 2026-09-14 之前的历史记录,禁止在新文档中作为系统名称使用。 + +| 循环 | 中文规范名 | 英文代号 | 旧代号 | +|---|---|---|---| +| 排雷循环 | 棋盘生成 | `BOARD_GENERATION` | a1 | +| 排雷循环 | 排雷玩法 | `MINESWEEPER_RULES` | a2 | +| 排雷循环 | 行动经济 | `ACTION_ECONOMY` | a3 | +| 排雷循环 | 地形变异 | `TERRAIN_VARIATION` | a4 | +| 排雷循环 | 辅助道具 | `AUXILIARY_ITEMS` | a5 | +| 战斗循环 | 战斗结算 | `COMBAT_RESOLUTION` | b1 | +| 战斗循环 | 敌人系统 | `ENEMY_SYSTEM` | b2 | +| 战斗循环 | 增益状态 | `STATUS_EFFECT` | b3 | +| 战斗循环 | 奖励道具经济 | `REWARD_ITEM_ECONOMY` | b4 | +| 战斗循环 | 战斗表现 | `COMBAT_PRESENTATION` | b5 | +| 冒险循环 | 关卡节点地图 | `LEVEL_NODE_MAP` | c1 | +| 冒险循环 | 冒险结构 | `ADVENTURE_STRUCTURE` | c2 | +| 冒险循环 | 难度曲线与Boss | `DIFFICULTY_CURVE` | c3 | +| 冒险循环 | 元进度 | `META_PROGRESS` | c4 | +| 表现与支撑 | HUD框架 | `HUD_FRAMEWORK` | d1 | +| 表现与支撑 | 数据配置 | `DATA_CONFIG` | d2 | +| 表现与支撑 | 存档序列化 | `SAVE_SERIALIZATION` | d3 | +| 表现与支撑 | 音频 | `AUDIO` | d4 | +| 表现与支撑 | 教学引导 | `TUTORIAL` | d5 | +| 表现与支撑 | 设置与本地化 | `SETTINGS_LOCALIZATION` | d6 | + +> 四个循环本身的英文代号为 `MINESWEEPER_CYCLE`(排雷循环)、`COMBAT_CYCLE`(战斗循环)、`ADVENTURE_CYCLE`(冒险循环)、`PRESENTATION_SUPPORT`(表现与支撑)。 > 旧版参考:`../archive/gdd-2026-09-14/systems-index.md` diff --git a/design/gdd/systems/冒险循环/元进度.md b/design/gdd/systems/冒险循环/元进度.md index e83effeb..d18535cd 100644 --- a/design/gdd/systems/冒险循环/元进度.md +++ b/design/gdd/systems/冒险循环/元进度.md @@ -1,3 +1,125 @@ # 元进度 -> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 C4) +> 一句话:跨局成长(旧体系未单独成文) +> 状态:范围草案(待设计) +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,散见于归档索引) + +## 设计目的 + +元进度管的是跨局成长:一场冒险结束,局内的血、库存与随机种子全部清零重来,而存档里攒下的东西不清零。玩家在下探途中夺得一种叫钥石的永久资源(每层关底 Boss 看守、击杀即取走),在冒险与冒险之间用它解锁永久提升——这就是核心循环里「存档在变厚」的故事线,本系统就是这条线的归属地。本文是范围草案:只收拢现行材料能确证的范围边界与已知约束,解锁什么、花多少、怎么影响难度,全部留待设计批。 + +## 系统范围 + +边界这样划:元进度只管「钥石与解锁」这条跨局账——钥石怎么进存档、能换什么、换到的东西怎么进下一局。局内的一切(这层打不打得过、Boss 怎么死、奖励发什么)都归单局循环的各系统;元进度只在冒险结算之后接手,在下一局开始之前兑现。 + +负责: + +| 负责 | 说明 | +|---|---| +| 钥石的跨局账本 | 钥石入存档、永不丢失;解锁花了多少、还剩多少 | +| 解锁内容的三方向 | 角色属性更强、怪物遭遇更丰富、道具池更厚——方向已拍板,具体内容待设计 | +| 解锁的跨局生效 | 解锁结果在开始新冒险时注入下一局(冒险结构已预留注入位) | +| 资源模型的裁决落地 | 代币记账与钥石是同一种资源还是两种——见待拍板,裁决后归本系统落地 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| Boss 击杀等局内事件的判定 | [冒险结构](冒险结构.md)(关卡收束)——本文只消费其结果 | +| 关卡大奖励的代币记账 | [冒险结构](冒险结构.md)——记账挂点已定,本文是消费方 | +| 存档的读写与版本迁移 | [存档序列化](../表现与支撑/存档序列化.md)——本系统是存进去的内容之一 | +| 解锁内容的配置表结构与读取机制 | [数据配置](../表现与支撑/数据配置.md)——本系统回填内容 | +| 钥石持有量与解锁界面的呈现 | [HUD 框架](../表现与支撑/HUD框架.md) | +| 难度区间模型本身 | [难度曲线与Boss](难度曲线与Boss.md)——本文只经换算率接口位接入 | + +## 在核心循环中的位置 + +``` +一场冒险(排雷 → 结算 → 下探 → 死亡或通关)──▶ 冒险之外:钥石入存档 → 花钥石解锁 ──▶ 更厚的存档开局下一局 +``` + +元进度不是一场冒险里的一段,而是贴在「死亡重开」出口外面的跨局层:局内胜负归零,钥石不归零。它也不改动单局循环的任何规则——没有它,一场冒险照常成立。 + +## 核心规则(已确证的范围边界与已知约束) + +本系统尚未设计,本节只收现行材料能确证的内容;其余问题见文末「待设计问题清单」。 + +### 钥石:已拍板命名的核心资源 + +钥石是玩家在局内夺得、在局外消费的永久资源,2026-09-14 拍板定名。已确证的口径:每一层的关底 Boss 看守他那块区域的钥石,击杀即取走;钥石存进存档、永不丢失,就算之后倒下也不收回;冒险与冒险之间,用它解锁永久提升。 + +解锁方向已登记三个:角色属性更强、怪物遭遇更丰富、道具池更厚。第一局开局时存档是一块白板,只有最基本的内容;每多一枚钥石,白板上的东西就多一些。钥石口径的权威是[游戏概念](../../00-游戏概念.md)与[核心循环](../../01-核心循环.md),本文不另立机制。 + +### 单局循环零依赖:排期边界的推论 + +元进度整体排在 Alpha(见[不做清单](../../05-不做清单.md):先把单局循环做扎实,跨局成长是之后的事)。由此有一条硬边界:单局循环必须在没有元进度时完全成立——排雷、战斗、下探、失败重开,一件不少;第一局的白板存档就是完整可玩的游戏。元进度只回答「下一局比上一局多了什么」,不回答「这一局怎么玩」。 + +### 已挂账的两个接口位 + +上游已为本系统预留了两处接入位,本系统定稿时必须接、且只能按对方口径接: + +| 接口位 | 现状 | 归属 | +|---|---|---| +| 代币记账挂点 | 冒险结构的关卡大奖励(每通关一关兑付的固定奖励)带「代币记账 +10/关」:通关与中途死亡同式记账,通关几关记几笔——记账已挂、语义未定,本系统是该记账的消费方 | 记账规则以[冒险结构](冒险结构.md)定稿口径为准;与钥石的关系见待拍板 | +| 区间平移换算率 | 难度曲线以区间带验收难度,并预留了接口位:解锁让玩家变强,难度验收区间随之需要平移;双方约定解锁的影响不直接改难度判据,而是按统一换算率折算后平移——换算率数值与机制未定 | 以[难度曲线与Boss](难度曲线与Boss.md)定稿口径为准,归设计批 | + +另有一条归档线索:归档索引为本系统登记过「天赋树」一词。它只作为待设计方向存在,没有任何结构承诺——是否保留、什么形态,见待设计问题清单。 + +## 依赖与输出 + +| 方向 | 系统 / 文档 | 接口要点 | +|---|---|---| +| 上游 | [冒险结构](冒险结构.md) | 关卡收束与代币记账挂点——钥石入账的局内事件源;冒险摘要(冒险结算产出的一行小结:通关几关、记了多少账)由本系统消费 | +| 上游 | [存档序列化](../表现与支撑/存档序列化.md) | 钥石与解锁进度的持久化承载方——本系统是存档内容的生产方之一 | +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 解锁内容的配置表结构与读取机制——本系统为内容回填责任方 | +| 下游 | [冒险结构](冒险结构.md) | 冒险开始参数面——解锁效果在开局注入的预留位(对方以「天赋注入位」名义登记,无解锁时为空参数) | +| 下游 | [难度曲线与Boss](难度曲线与Boss.md) | 解锁状态经区间平移换算率接口位接入难度验收 | +| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 钥石持有量与解锁界面的呈现归对方,本文只提需求 | + +## P0 最小闭环 + +MVP 不要求本系统的闭环([不做清单](../../05-不做清单.md)整体排 Alpha),P0 的语义就是那条硬边界:单局循环零元进度完整成立。Alpha 期最小集合的方向:钥石能跨冒险入账并存进存档;三个解锁方向至少一个能在下一局开局生效;玩家能在界面上看懂自己有几枚钥石、解锁了什么。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 三方向解锁内容的设计与铺量 | 资源模型(代币与钥石关系)裁决后才能展开 | +| P1 | 区间平移换算率的数值与机制 | 接口位已留;以难度曲线定稿口径为准,随设计批落地 | +| P2 | 天赋树方向 | 归档只登记了名字,无任何结构承诺 | +| P2 | 关卡大奖励的形态扩展与本文联合评估 | 冒险结构把这条后置项登记为「设计随元进度批」 | + +## 调参表 + +暂无本系统自有的参数。代币记账数值(每关 +10)挂在冒险结构的调参表、消费裁决权归本文设计批;换算率数值归难度曲线的设计批。本文定稿时再登记自己的参数域。 + +## 验收标准 + +待设计。方向性判据(供未来定稿参考): + +- 钥石不丢:取走钥石后,无论后续冒险成败、重开多少次,存档内的钥石数量只增不减。 +- 白板成立:全新存档的第一局与「零解锁」状态完全一致,不因本系统存在而改变任何局内规则。 +- 单局零依赖:禁用元进度后,单局循环的全部现行验收照常通过。 +- 解锁可见:花钥石解锁后,下一局能遇到或用到解锁内容,玩家能说出这局与上局的具体差别。 + +## 待拍板 + +| 条目 | 内容 | +|---|---| +| 代币与钥石的资源关系 | 冒险结构的关卡大奖励已挂「代币记账 +10/关」,而钥石是拍板定名的元进度资源——两者是同一资源还是两种?若两种,记账与钥石如何分工?本文定稿前必须裁决,这是本系统最重的设计缺口 | +| 换算率接口的启用形态 | 难度曲线只预留了「解锁影响以换算率接入」的结构位;换算什么、怎么换,待难度曲线文档定稿口径明确后随设计批裁决 | + +## 待设计问题清单 + +1. 资源模型(对应待拍板首条):代币与钥石是同一种资源还是两种?这是其余一切设计的前提。 +2. 三方向各自的解锁清单与定价:多少钥石换什么,属性、遭遇、道具池各自怎么铺。 +3. 钥石的重复获取:钥石由每层关底 Boss 看守,但同一 Boss 跨冒险被反复击杀时的产出规则没有来源。 +4. 天赋树方向的去留与形态:归档索引登记过该词,是否保留、以什么形态保留,未定。 +5. 解锁注入的实现口径:冒险结构预留的「冒险开始参数面」如何承载各方向解锁,随设计批与对方联合修订。 +6. 解锁界面与钥石呈现的交互形态:与 HUD 框架协作批共同定。 + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档线索整合为范围草案(旧体系未单独成文) | diff --git a/design/gdd/systems/冒险循环/关卡节点地图.md b/design/gdd/systems/冒险循环/关卡节点地图.md index e252f991..b22c54be 100644 --- a/design/gdd/systems/冒险循环/关卡节点地图.md +++ b/design/gdd/systems/冒险循环/关卡节点地图.md @@ -1,3 +1,166 @@ # 关卡节点地图 -> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 C1) +> 一句话:单关内的节点链与推进 +> 状态:范围草案(待设计) +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,散见于归档索引) + +## 设计目的 + +一关不是一场战斗,而是若干**节点**串成的一条链——节点就是关卡内移动的步进单位,画在本系统的地图上就是一个格。玩家从链首出发,打几场仗、开一次奖励、歇一口气,最后走到关底 Boss。关卡节点地图管的就是这条链上的"走":逐节点推进,该开战的开战、该发奖的发奖、该回血的发恢复请求,Boss 分出胜负后把这一关的结局交回给冒险结构。它是冒险的骨架(序列、大奖励、重开,归[冒险结构](冒险结构.md))与战斗的兑现(结算与敌人,归战斗循环)之间的行进层。 + +本文是范围草案:旧体系没有为这个系统单独成文,只在归档索引里留下范围与形态候选。本文先收拢范围边界与已知约束,不设计任何新机制。 + +## 系统范围 + +边界这样划:链上"有哪些节点"归冒险结构——关卡序列与链模板是它管的关卡表内容;本系统管"在这条链上怎么走、走到每一步发生什么"。战斗内部发生什么归战斗结算与敌人系统,奖励给什么归奖励道具经济。本系统是行进与触发的编排层,自己不生产任何数值。 + +负责: + +| 负责 | 说明 | +|---|---| +| 节点链行进 | 从链首逐节点推进到关底 Boss;现行口径是线性节点链(不走岔路) | +| 节点兑付触发 | 行进到奖励节点触发节点奖励入库;行进到恢复节点向冒险结构发恢复请求 | +| 遭遇构成 | 何时开战、战斗节点的坐标与数量怎么定(敌人系统的"不负责"表已登记归本文) | +| 战斗发起组装 | 行进至战斗或 Boss 节点时组装入参,调战斗结算开战 | +| 关卡收束点 | Boss 战胜利或英雄死亡时定局:先调战斗结算的关卡收束清空库存,再向冒险结构宣布关卡结束 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 关卡序列与链上有哪些节点(链模板、关数) | [冒险结构](冒险结构.md) | +| 关卡大奖励、跨关血量账本、失败重开 | [冒险结构](冒险结构.md) | +| 节点奖励与安全格奖励的内容、库存语义 | [奖励道具经济](../战斗循环/奖励道具经济.md) | +| 战斗内的结算编排、胜负判定、伤害合成 | [战斗结算](../战斗循环/战斗结算.md) | +| 敌人表数据、行为环、开战时按坐标生成单位 | [敌人系统](../战斗循环/敌人系统.md) | +| 敌我数值曲线与遭遇投放节奏 | [难度曲线与Boss](难度曲线与Boss.md) | +| 节点链行进的画面呈现 | [HUD 框架](../表现与支撑/HUD框架.md) | + +## 在核心循环中的位置 + +``` +冒险结构 ──开始关卡──▶ 关卡节点地图:节点链逐节点推进(战斗 / 奖励 / 恢复 → 关底 Boss)──关卡结束──▶ 冒险结构 +``` + +核心循环里"关卡:节点链逐节点推进"这一段就是本系统在跑:它从冒险结构接过一关,把玩家沿链送到关底 Boss,再把结局交回去。链上每场战斗都由本系统发起;战斗内部的事(轮末结算、敌人生成)不归它管。 + +## 核心规则(已确证的范围边界与已知约束) + +本系统尚未设计,本节只收现行材料能确证的边界与约束;其余问题见文末「待设计问题清单」。 + +### 关卡内先走线性节点链 + +一关内部现在就是一条不岔路的链:路径分支地图已拍板后置(见[不做清单](../../05-不做清单.md)),关卡内先用线性节点链——玩家沿链逐节点前进,没有岔路可选。这是本文最重要的范围边界:任何分支、选路机制都不在现行范围内。 + +现行链上登记了四种节点类型(类型机制归本文展开,当前只有数据面事实): + +| 节点类型 | 现行事实 | +|---|---| +| 战斗 | 携带深度标号(它是链上第几场战斗);开战时与关卡序号一起构成遭遇坐标 | +| Boss | 恒为链末节点;打赢即一关通关 | +| 奖励 | 不占深度;行进到此处触发节点奖励 | +| 恢复 | 不占深度;行进到此处发恢复请求 | + +术语登记已把节点类型分类学与分支机制的展开权交给本文(见 [registry 术语条目](../../../registry/entities.yaml))——展开本身就是本文定稿要做的设计,当前不预支任何结论。 + +### 四件接口与收束点是本文的强制输入 + +本系统与冒险结构之间已登记四件接口——开始关卡、战斗结果上报、治疗封顶回报、关卡结束。它们是本文定稿时的强制输入,语义权威在[冒险结构](冒险结构.md),本文不复述其内部细节。 + +关卡收束点(一关就此定局的时点:Boss 战胜利即通关,英雄死亡即失败)落在本文。收束点的动作次序是现行登记的编排义务: + +``` +关卡收束点(Boss 战胜利 或 英雄死亡) + ① 调战斗结算的关卡收束:清空关卡域库存 + ② 向冒险结构宣布关卡结束(携带结果) +``` + +战斗发起的组装同样归本文:行进至战斗或 Boss 节点时,由本文组装入参、调用[战斗结算](../战斗循环/战斗结算.md)开战。 + +### 遭遇构成归本文定 + +敌人系统的"不负责"表已登记:何时开战、坐标与数量怎么定,归本文。能确证的事实边界只有两条——开战时把坐标(关卡序号加节点深度)交给[敌人系统](../战斗循环/敌人系统.md),由它按坐标匹配敌种、生成单位;敌我数值与投放节奏的调参所有权归[难度曲线与Boss](难度曲线与Boss.md)。至于哪个节点放哪种遭遇、数量怎么定,是本文将来要设计的主体内容之一(见待设计问题清单)。 + +### 三个 reward 拆名:名字已定、机制未设计 + +设计里有三个"奖励"相关的名字,已拍板各归各位(登记见 [registry 术语条目](../../../registry/entities.yaml))。本文只登记名字与归属;节点奖励的机制是本文将来要设计的主体,这里不预支任何方案。 + +| 名字 | 指什么 | 归属 | +|---|---|---| +| 节点奖励 | 奖励点节点给的奖励 | 本文域(机制待设计) | +| 安全格奖励 | 雷图上挖开安全格开出的奖励 | [奖励道具经济](../战斗循环/奖励道具经济.md) | +| 节点奖励覆盖层 | 节点奖励的呈现候选形态 | 呈现侧候选,未定稿 | + +## 依赖与输出 + +本系统的上下游与对外承诺逐条列出如下——这份清单同时是删除任何一方时的影响面清单。 + +| 方向 | 系统 / 文档 | 接口要点 | +|---|---|---| +| 上游 / 下游 | [冒险结构](冒险结构.md) | 接口契约四件套(开始关卡 / 战斗结果上报 / 治疗封顶回报 / 关卡结束):向下接开始关卡,向上报战斗结果、恢复请求与关卡结束 | +| 上游 | [奖励道具经济](../战斗循环/奖励道具经济.md) | 节点奖励入库:兑付触发归本文,内容与库存语义归它 | +| 上游 | [敌人系统](../战斗循环/敌人系统.md) | 遭遇坐标的消费方:本文交出坐标,按坐标生成单位归它 | +| 上游 | [难度曲线与Boss](难度曲线与Boss.md) | 敌我数值曲线与遭遇投放节奏的调参所有权 | +| 下游 | [战斗结算](../战斗循环/战斗结算.md) | 本文是两个调用入口的发起方:战斗发起组装、关卡收束(清库) | +| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 节点链行进与当前节点的画面呈现 | + +## P0 最小闭环 + +本系统的里程碑登记为垂直切片(归档索引对本系统的登记口径);切片已有关内行进的代码雏形,定稿时回填对照(见待设计问题清单)。最小闭环按线性链口径收拢: + +1. 从冒险结构接收开始关卡,取得本关节点链与开局入参,行进从链首开始。 +2. 行进至战斗或 Boss 节点:按遭遇构成组装入参,调战斗结算开战。 +3. 战斗结束:向冒险结构上报战斗结果。 +4. 奖励节点:触发节点奖励入库;恢复节点:向冒险结构发恢复请求。 +5. Boss 战胜利或英雄死亡即关卡收束点:先调战斗结算的关卡收束清库,再宣布关卡结束。 +6. 节点之间怎么走(逐节点确认还是自动推进)未定;最小闭环按链序逐节点推进,交互形态随定稿裁决。 + +## P1 / P2 后置 + +后置项逐条列出;复活任何一条都走本文修订,不许静默加回。 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 遭遇构成细则(哪个节点放哪种遭遇、数量怎么定) | 依赖敌人表键结构的改键裁决(见待拍板);投放节奏的调参所有权归难度曲线与Boss | +| P1 | 节点奖励机制设计 | 名字已拍板、机制未设计;与奖励道具经济的入库接口对齐后展开 | +| P2 | 路径分支地图 | 已拍板后置([不做清单](../../05-不做清单.md)):分支是加分项,当前体量撑不起有意义的岔路 | +| P2 | 精英节点与精英遭遇 | 与分支地图联动设计,随精英与 Boss 编码位改键同批 | + +## 调参表 + +暂无本系统自有的参数。链上节点构成、恢复比例等已登记参数分属冒险结构的关卡表与难度曲线与Boss 的数值域;本文将来新增的行进参数随设计定稿再登记。 + +## 验收标准 + +待设计。方向性判据(供未来定稿参考): + +- 链序完整:从链首到关底 Boss 恰好经过链上每个节点,不跳过、不回头(线性口径)。 +- 收束点有序且唯一:关卡清库发生在关卡结束宣布之前;每关恰宣布一次关卡结束。 +- 遭遇可溯源:每场开战使用的坐标(关卡序号 + 节点深度)能对上链上该节点的位置。 +- 四件接口全款承接:与冒险结构现行登记的开始关卡、战斗结果上报、治疗封顶回报、关卡结束逐件对上,不另起平行通道。 + +## 待拍板 + +以下条目存在冲突或缺口,本文不自作裁决,逐条登记。 + +| 条目 | 内容 | +|---|---| +| 精英与 Boss 编码位 | 敌人表按(关卡序号 × 节点深度 × 敌种)存放,现行键结构没有"精英 / Boss"的编码位;同深度要出第二个敌种,会被每坐标恰一敌种的加载校验拦下。本文定稿时须与键结构改键一并裁决,走数据配置的接口漂移通道;棋盘生成侧的第三轴登记约定(Boss 走最大深度行、精英与 Boss 命名空间预留)同批重审 | +| 多敌数量的消费面 | 敌人表的数量区间在开战时掷定、教学位节点固定不掷——这组既有登记的消费面复验归本文定稿时核对 | + +## 待设计问题清单 + +以下问题在本文定稿时逐一裁决: + +1. 节点地图形态:线性链是现行口径;已登记候选"四方格步进式前进"(关卡内地图为格网,每步从相邻四格中选一格推进)未拍板——它与路径分支地图的后置口径如何衔接,随定稿裁决。 +2. 节点类型分类学:现行四类(战斗 / 奖励 / 恢复 / Boss)之外是否扩类、每类节点的机制承诺——展开权已登记归本文,全部待设计。 +3. 行进交互形态:玩家在线性链上怎么走(逐节点确认还是自动推进)未定。 +4. 遭遇构成细则:每个战斗节点放哪种遭遇、坐标与数量的对应规则(投放节奏的数值归难度曲线与Boss)。 +5. 节点奖励的机制与呈现:奖励点节点给什么、怎么给;节点奖励覆盖层的呈现候选形态评估。 +6. 切片代码雏形对照:切片已有关内行进代码雏形(node_* 接口命名与归档索引登记的轻量契约注记),定稿时回填对照。 + +## 版本历史 + +| 版本 | 日期 | 说明 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档线索整合为范围草案(旧体系未单独成文) | diff --git a/design/gdd/systems/冒险循环/冒险结构.md b/design/gdd/systems/冒险循环/冒险结构.md index 747423e9..fb772a8c 100644 --- a/design/gdd/systems/冒险循环/冒险结构.md +++ b/design/gdd/systems/冒险循环/冒险结构.md @@ -1,3 +1,265 @@ # 冒险结构 +> 一句话:整局冒险的关卡序列、失败与大奖励 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/c2-adventure-structure.md + +## 设计目的 + +冒险结构管的是"一整局"这个层级:这局要依次下探哪几层、通关一层发什么、倒下之后怎么重来。单场战斗打得再好,也需要这层骨架才能变成"越走越深"的进度感;死亡也需要一个明确的边界——死在哪里、失去什么、留下什么。 + +它还立起本系统的核心张力:主角一条血走完整场冒险,恢复只来自两个显式口,血条跨关只降不自动回。所以越往后,玩家越在意"这局已经走到第几层"。 + +## 系统范围 + +边界这样划:冒险结构只管序列与结构层——冒险从哪开始、有几关、通关发什么、失败怎么算、随机种子怎么接。单关内部怎么走节点归关卡节点地图;一场战斗怎么结算归战斗结算;数值曲线归难度曲线与Boss。 + +负责: + +| 负责 | 说明 | +|---|---| +| 冒险生命周期 | 待机 / 进行中 / 结算中三态,与完成、失败、放弃三种结局的判定和产出 | +| 关卡序列 | 关卡表(逐关一行的配置表)行集内容的责任方;推进规则:线性、无跳关 | +| 生命账本 | 跨战斗生命持久性的冒险侧账本:每战交出、战后收回、两个恢复口 | +| 关卡大奖励 | 通关一关固定发放的三件套的兑付 | +| 失败重开与放弃 | 倒下即冒险终;重开等于全新一轮;放弃与失败同型结算 | +| 主种子接线 | 一场冒险一个主种子,冒险内一切随机数派生自它 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 单关内节点行进与兑付触发 | [关卡节点地图](关卡节点地图.md) | +| 轮末结算编排与关卡清库接口 | [战斗结算](../战斗循环/战斗结算.md) | +| 节点奖励内容与库存语义 | [奖励道具经济](../战斗循环/奖励道具经济.md) | +| 通关率带、敌我数值与 Boss 设计 | [难度曲线与Boss](难度曲线与Boss.md) | +| 钥石与跨局成长 | [元进度](元进度.md) | +| 摘要结算画面与关卡推进指示 | [HUD框架](../表现与支撑/HUD框架.md) | + +## 在核心循环中的位置 + +``` +战斗结算(一场战斗的胜负判定)──(战斗结果上报)──▶ 冒险结构(大奖励 / 推进 / 失败重开)──(开始关卡)──▶ 关卡节点地图(单关节点链行进) +``` + +[核心循环](../../01-核心循环.md)里"一场冒险:关卡串起来的下探"讲的就是本系统的故事线:冒险结构站在"关卡之上、战斗之下"的那一段,向上承接每一场战斗的结果,向下把"下一关开始"的指令交给关卡节点地图。至于存档变厚(钥石攒进存档),发生在冒险之外,归元进度。 + +## 核心规则 + +### 冒险的一生:开始、推进与三种结局 + +"冒险"在本文是一个计量单位:玩家从开始新冒险到出局结算的一段完整游玩,由若干关卡串成,全程只有一条命。冒险任何时刻恰处三种状态之一:待机(还没开始,或上一局已结算完毕)、进行中(某一关正在推进)、结算中(一关刚宣布结束,正在算大奖励与结局)。 + +``` +待机 ──(开始新冒险:注入主种子、生命回满、进第 1 关)──▶ 进行中 +进行中 ──(非末关通关)──▶ 兑付大奖励 ──▶ 进下一关(仍在进行中) +进行中 ──(末关通关 / 任意战斗倒下 / 玩家放弃)──▶ 结算中 ──(产出冒险摘要)──▶ 待机 +``` + +三种结局怎么判、在摘要上留什么标记: + +| 结局 | 判定时机 | 摘要标记 | +|---|---|---| +| 冒险完成 | 最后一关的关底 Boss 被击杀 | 已打穿 | +| 冒险失败 | 任意一场战斗主角倒下 | 未打穿 | +| 冒险放弃 | 玩家主动放弃(仅非战斗期受理) | 未打穿 | + +每次结算产出一份**冒险摘要**(本文含义:结算时打出的一份小账单),记五件事:打穿没有、通关几关、止步第几关、代币记账合计、本局主种子。它是重开后"这局我到第几层"的对照坐标,也是[元进度](元进度.md)(代币入账位)与[存档序列化](../表现与支撑/存档序列化.md)(快照域标识与复盘)的输入。 + +结算受理后只算一次:同一关的结束宣布重复到达时,重复宣布被拒绝并留诊断,账本与摘要零变化。 + +### 关卡序列:一局打几关、怎么算通关 + +一场冒险由关卡串成。关卡(本文含义:地牢一层的完整推进——一条节点链加一个关底 Boss)的序列读关卡表:逐关一行的配置表,本文是它行集内容的责任方,表本体与读取机制归[数据配置](../表现与支撑/数据配置.md)。 + +MVP 的序列是两关线性:第一关是地牢基线,第二关在基线上加入新元素并抬高数值台阶("新元素"具体是什么,见「待拍板」——原表述绑定的机制已从设计中移除)。通关一关(该关关底 Boss 被击杀)自动进下一关;冒险通关 = 最后一关的关底 Boss 被击杀。没有跳关、没有回头路;路径分支地图已明确后置。 + +第二关的生效有前提:要等[难度曲线与Boss](难度曲线与Boss.md)的第二关深度轴行值填充批落地。未落地前,冒险以单关运行——单关冒险是合法状态,不是缺陷。 + +加关纪律:加一关等于一个内容批——节点链行、敌我数值、新元素必须同批落,禁止只加序列不加内容。行集里每个战斗与关底节点都必须在敌人、棋盘生成的数值表里有精确行,冒烟期校验;越界关卡按内容生产缺口拦截。运行期对越界的开始关卡请求与缺失的关卡行一律报错停机——那是配置违约,不是玩家能碰到的状态,不做兜底吞掉。 + +序列的难度排布消费难度曲线与Boss的逐关通关率带。整局难度由长度叠加: + +**结论**:整局通关率 ≈ 各关通关率的连乘——冒险长度就是难度的总闸。 + +``` +整局通关率 = 第 1 关通关率 × 第 2 关通关率 × … × 第 N 关通关率 +``` + +各关通关率目标带的取值归[难度曲线与Boss](难度曲线与Boss.md),本文不复制其数值。 + +### 生命账本:一条血走完整场冒险 + +主角在一场冒险里只有一条血。战斗里扣的、恢复点回的、大奖励回满的,记的是同一本账;战后剩多少血,就带多少进下一场。关卡切换不做任何生命结算——换的是地图,不是血条。 + +账本只有四个收支口: + +| 收支口 | 方向 | 规则 | +|---|---|---| +| 冒险开始 | 入 | 生命置满(基础上限读英雄表) | +| 每场战斗开始 | 出 | 账本当前值作为主角生命入参交给这一战 | +| 每场战斗结束 | 入 | 收回战后生命终值并回写(胜负皆报;倒下记 0,冒险终) | +| 恢复点与大奖励 | 入 | 全冒险仅有的两个恢复口 | + +战斗开始的生命交接走主角战斗入参覆盖值通道(每战以显式入参传入生命与上限、不改全局表——契约见[战斗结算](../战斗循环/战斗结算.md))。恢复口之一是恢复点节点(关卡节点链上回血的一类节点;节点类型分类学归[关卡节点地图](关卡节点地图.md),本文只写它兑付时账本怎么变):按比例回血并封顶上限,满血时回复 0,是合法状态。另一个恢复口是通关大奖励(见下一节)。 + +**结论**:账本三处写入口一律封顶在 [0, 生效上限];血条跨关只降不自动回。 + +``` +战后回写: 生命 = 战斗上报的生命终值(倒下记 0,冒险终) +恢复点: 生命 = min( 生命 + floor( 生效上限 × 恢复比例 ÷ 100 ), 生效上限 ) +大奖励: 生效上限 = 生效上限 + 上限提升;生命 = 生效上限 +战斗入参: 每战交给战斗的上参 = 当前生命、生效上限 +``` + +| 变量 | 含义 | 现行值 | +|---|---|---| +| 生效上限 | 基础上限 + 大奖励累加提升 | 基础上限读英雄表 | +| 恢复比例 | 恢复点回复生效上限的百分比,逐关配置 | 30(provisional) | +| 上限提升 | 每次大奖励的生命上限加成 | 10(provisional) | + +示例轨迹(基础上限 50,示例数值均为 provisional): + +| 时刻 | 账本读数 | +|---|---| +| 冒险开始 | 50/50 | +| 逐场战后(示例) | 43、31、24、17 | +| 恢复点(50 × 30% = 15) | min(17 + 15, 50) = 32 | +| 关底 Boss 胜后余 8,兑大奖励 | 上限 60、生命 60 | +| 下一关开局 | 60/60 满血 | + +冒险内没有其他跨关遗留物:增益随战斗结束清空(归战斗结算)、道具库存随关卡结束清空(由关卡节点地图在收束点编排)、储备行动点随战斗结束清零(归[行动经济](../排雷循环/行动经济.md))。冒险层真正跨关留下的,只有这本生命账与冒险摘要。 + +### 关卡大奖励:通关一关发三件 + +关卡大奖励(本文含义:通关一关时固定发放的三件套)是非末关通关的固定兑付。它不进任何背包、不占任何库存域,收益面只朝"下一战"生效。兑付时点固定:关卡节点地图先调战斗结算的关卡收束接口清空关卡域库存,再向本文宣布关卡结束——大奖励在这之后、下一关开始之前兑付,顺序不可换。上限已有加成时,后续大奖励累加;两关冒险至多兑付一次。 + +| 件 | 内容 | 生效方式 | +|---|---|---| +| 生命上限 +10 | 生效上限累加提升 | 经战斗开始入参的覆盖值通道,对后续每战生效 | +| 血回满 | 生命 = 提升后的生效上限 | 直接写生命账本 | +| 代币记账 +10 | 在冒险摘要里记一笔 | 数值进摘要,消费方归元进度 | + +最后一关通关不发大奖励:没有下一战可受益——只做冒险完成结算,代币照记。设计意图:清库之后才兑付、末关不兑付,都是从"奖励只朝下一战生效"这一条推出来的。 + +三件数值(+10 / +10)为 provisional。上限提升的值锚与上调约束(+10 生命 ≈ +1 轮的换算率锚,上调须重扫第二关通关率带)归[难度曲线与Boss](难度曲线与Boss.md);代币记账的消费归[元进度](元进度.md)。 + +### 失败重开与主种子:倒下即终,重开即全新一轮 + +失败没有中间态:任意一场战斗主角倒下,冒险当场结束——没有关卡重试、没有检查点、没有复活,血条归零即终。这是 Roguelike 的既定语义,已锁。 + +重开 = 全新一轮冒险:注入新主种子、从第一关、满血、空手——不是"重打刚才那一关"。上一局清零的是生命账本、库存与种子;唯一保留面是冒险摘要,它给每次死亡一个可对照的坐标("这局到第二层"),重开因此是新局面而不是复读。 + +主动放弃按与失败同型结算:已获得的大奖励不追回、已到手的保留,摘要标记未打穿。放弃请求只在非战斗期受理,战斗进行中一律拒绝(战斗域单事务在飞)。MVP 没有放弃的界面入口,语义先行预留,入口呈现后置。 + +主种子(本文含义:冒险开始时注入的一个随机种子,本局全部随机性都派生自它)在冒险开始时注入恰一次。冒险内的雷图生成、奖励抽取、遭遇掷骰全部派生自它,冒险内不重置、不逐关播种——早期切片"每关开局各自播种"是没有冒险层时的历史简化,已改写为全冒险单一种子。冒险的可复现域 = 主种子 + 各随机流计数器,供复盘与快照(见[存档序列化](../表现与支撑/存档序列化.md))。重开抽到的种子与上一局相同是允许的(随机源范围小,撞种子不算错误),但生成新种子不得复用玩法里的随机数。 + +### 与关卡节点地图的边界:收束点与接口四件套 + +这条边界是承重的,两边文档都要按它写:冒险结构管序列与结构层——关卡序列、生命账本、关卡大奖励、失败重开、主种子;单关内的节点行进与兑付触发归[关卡节点地图](关卡节点地图.md)。本文对战斗域与库存域零直调:清库存这件事,本文从不亲手做。 + +两边的交汇点叫收束点:一关的关底 Boss 被击杀,或主角在任意战斗倒下的那一刻。收束点的次序固定,先清库、后宣布: + +``` +关卡收束点(关底 Boss 被击杀,或主角倒下) + ├─ 第一步:关卡节点地图调[战斗结算](../战斗循环/战斗结算.md)的关卡收束接口——清空关卡域库存,返回清空前计数 + └─ 第二步:关卡节点地图向冒险结构宣布关卡结束(通关 / 倒下) + ├─ 通关且非末关 → 兑付大奖励 → 开始下一关 + ├─ 通关且是末关 → 冒险完成结算 + └─ 倒下 → 冒险失败结算 +``` + +本文只接结果、不发指令进战斗:不调用任何战斗域接口,也不碰库存。通关宣布到达时,默认库存已清;出现结构性异常(例如宣布通关但生命不为正)按防御断言拦截。 + +接口契约四件套——开始关卡 / 战斗结果上报 / 治疗封顶回报 / 关卡结束——是关卡节点地图文档的强制输入,本文按现行口径如实登记: + +| 接口 | 方向 | 时点 | 载荷 | +|---|---|---|---| +| 开始关卡 | 本文 → 关卡节点地图 | 冒险开始 / 每次关卡推进 | 关卡序号、当前生命、生效上限 | +| 战斗结果上报 | 关卡节点地图 → 本文 | 每场战斗结束后(胜负皆报) | 战后生命终值(倒下记 0) | +| 治疗封顶回报 | 关卡节点地图 → 本文 | 恢复点节点兑付时 | 恢复比例(读该关配置行);本文按比例回血并封顶 | +| 关卡结束 | 关卡节点地图 → 本文 | 关卡收束点(已先清库) | 结果(通关 / 倒下)、生命终值、节点位置 | + +至于一场战斗在哪个节点开打、打谁,组装编排归关卡节点地图;它组装战斗开始调用时,主角生命与上限取自本文下放的值,攻击力走表值通道(MVP 冒险内不提升攻击)。 + +## 依赖与输出 + +这张表就是删除任何一方时的影响面清单。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [难度曲线与Boss](难度曲线与Boss.md) | 逐关通关率带是序列难度排布的输入;第二关深度轴行值填充批是两关序列的生效前提;大奖励与恢复点数值的联动复验归它 | +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 关卡表与冒险表(单行全局)的承载与统一读取,本文是两表的内容与回填责任方;主种子的注入入口(随机服务) | +| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 主角战斗入参覆盖值通道(本文供生命与上限);关卡收束接口由关卡节点地图收束点调用,本文零直调;战后生命终值经上报读回 | +| 下游 | [关卡节点地图](关卡节点地图.md) | 接口契约四件套 + 收束点语义,本文是定义源,也是其文档的强制输入 | +| 下游 | [元进度](元进度.md) | 冒险摘要是代币记账的入账位;冒险开始参数面预留(未来跨局加成在此注入,MVP 空参数) | +| 下游 | [存档序列化](../表现与支撑/存档序列化.md) | 快照契约域单位 = 冒险(主种子 + 随机流计数器);摘要含主种子供复盘 | +| 下游 | [HUD框架](../表现与支撑/HUD框架.md) | 摘要结算画面、关卡推进指示、放弃入口(非战斗期)的数据源 = 冒险摘要与状态投影 | + +## P0 最小闭环 + +1. 待机中开始新冒险:注入新主种子(恰一次)、生命账本置满、序列位置 = 第 1 关。 +2. 开始关卡:把关卡序号、当前生命、生效上限下放关卡节点地图,后者开始节点链行进。 +3. 每场战斗结束:战斗结果上报到达,账本回写生命终值;上报为 0(倒下)直接走失败结算。 +4. 恢复点节点:治疗封顶回报到达,按比例回血并封顶。 +5. 关底 Boss 被击杀 = 收束点:关卡节点地图先调战斗结算清库,再向本文宣布关卡结束(通关)。 +6. 非末关通关:兑付大奖励三件,开始下一关;末关通关:只做冒险完成结算。 +7. 冒险结算(完成 / 失败 / 放弃)产出冒险摘要,回到待机;重开即全新一轮,回到第 1 步。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 两关序列生效(第二关行集扩展批) | 前提 = 难度曲线与Boss的第二关深度轴行值填充批;未落地前以单关冒险运行(合法态) | +| P1 | 放弃入口的界面呈现 | MVP 无界面入口——仅语义预留(非战斗期受理、同失败型结算);呈现归 HUD框架与 UX 批 | +| P2 | 大奖励形态扩展(三选一 / 攻击型 / 通关加成) | 冒险表扩列结构位已留;设计随元进度定稿 | +| P2 | 冒险开始参数面消费 | 预留给未来跨局加成注入(MVP 空参数,结构同覆盖值通道);归元进度 | +| P2 | 冒险长度扩展(多于两关) | MVP 两关对比愿景单局 20–40 分钟;扩关 = 内容批,节奏按真人单关时长数据定 | + +## 调参表 + +全部数值存配置表、经统一读取口读入,代码里零数值字面量;表本体与读取机制归[数据配置](../表现与支撑/数据配置.md)。已锁字段以 [registry 的 level_table / adventure_table 条目](../../../registry/entities.yaml)为准。 + +| 参数 | 域 | 现行值 | 说明 | +|---|---|---|---| +| 关卡行集(关数与节点链模板) | 关卡表逐关行 | 第一关现行,第二关随扩展批 | 加关 = 内容批(链行 + 敌我数值 + 新元素同批);MVP 链模板 = 两战 → 奖励 → 两战 → 恢复 → 关底 Boss(7 节点,战斗深度 5) | +| 恢复比例 | int [0,100],逐关行 | 30(provisional) | 恢复点回复生效上限的百分比;随上限加成同步放大;100 = 恢复点变全满泉,0 = 死节点 | +| 上限提升 | int [0,999],冒险表单行全局 | 10(provisional) | 大奖励的生命上限加成;值锚与上调约束归难度曲线与Boss | +| 每关代币记账 | int [0,999],冒险表单行全局 | 10(provisional) | 每通关一关在摘要记的值;消费方归元进度 | + +结构冻结(非调参项):序列线性无跳关、关底 Boss 恒为末节点、倒下即冒险终、大奖励三件构成、一冒险一主种子、收束点先清库后宣布的次序。 + +参数联动:恢复比例越厚通关越有余量(对冲杠杆语义归难度曲线与Boss);上限提升抬高下一关开局强度,上调须按难度曲线与Boss的口径重扫通关率带。 + +## 验收标准 + +- 开始新冒险:主种子注入恰一次,生命账本置满,从第 1 关起步,关卡行集加载零诊断。 +- 通关推进:非末关宣布通关后,大奖励恰兑付一次(上限累加、血回满、代币记账),随后开始下一关。 +- 末关通关:只做完成结算——不发上限提升、无下一关;摘要标记已打穿,代币 = 通关数 × 每关记账值。 +- 任意战斗倒下:冒险失败结算;摘要记通关数与止步关卡;账本封闭。 +- 重开:全状态重置(账本、序列位置、库存域空、摘要新生成)并注入新主种子。 +- 生命一致性:每战开始的上参 = 账本当前生命与生效上限;战后账本 = 上报终值;三处写入口均封顶在 [0, 生效上限]。 +- 恢复点:回复 = floor(生效上限 × 恢复比例 ÷ 100) 后封顶;满血腿回复 0 合法。 +- 大奖励覆盖:大奖励后首战的上限入参 = 旧上限 + 上限提升(覆盖值通道);攻击力恒走表值通道。 +- 收束次序:通关宣布到达时库存已被关卡节点地图先行清空;重复的关卡结束宣布被拒绝,账本与摘要零变化。 +- 覆盖义务:冒烟断言——行集内每个战斗与关底节点(关、深)在敌人与棋盘生成的数值表中有精确行;序列关数 = 行集关数。 +- 生效前提未兑现(第二关行缺行):以单关冒险运行(合法态),两关断言显式跳过而非失败。 +- 放弃:战斗中的放弃请求被拒绝;非战斗期放弃按失败同型结算,已获大奖励不追回。 +- 种子域:冒险内零随机流自开,一切随机派生自主种子;同种子同操作序列两局逐位可复现。 + +## 待拍板 + +以下条目存在缺口或已因设计变更失去原义,本文不自行裁决,逐条登记。 + +| 条目 | 现状 | +|---|---| +| 第二关"解锁新元素"的解锁语义 | 原表述绑定雾(雾格已从设计中移除,见[不做清单](../../05-不做清单.md)),第二关解锁什么待定;第二关的暂定层名也仍沿用已移除机制的用字,终稿随第二关内容批重定 | +| 两关序列未生效 | 第二关深度轴行值填充批落地前,两关序列未生效,冒险以单关运行(合法态;扩展批已排 P1) | +| 代币与钥石的关系 | 钥石 = 关底 Boss 掉落的跨局资源(见[游戏概念](../../00-游戏概念.md));本文的代币记账是关卡通关发的另一种记账。两者是否同一资源、如何汇入元进度,归[元进度](元进度.md)定稿 | +| 大奖励数值随难度曲线联动 | 上限提升与恢复比例同通关率带、换算率锚的联动复验,随难度曲线与Boss的调参批执行 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/冒险循环/难度曲线与Boss.md b/design/gdd/systems/冒险循环/难度曲线与Boss.md index adbdfb0a..cd755178 100644 --- a/design/gdd/systems/冒险循环/难度曲线与Boss.md +++ b/design/gdd/systems/冒险循环/难度曲线与Boss.md @@ -1,3 +1,273 @@ # 难度曲线与Boss +> 一句话:难度曲线、期望值带与 Boss 设计 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/c3-difficulty-curve.md + +## 设计目的 + +难度曲线与Boss是全项目难度数值的唯一所有者:敌人多强、成不成群、棋盘多大、奖励多肥、Boss 多硬,这些数字最终都由它定。它不发明机制——生成算法归[棋盘生成](../排雷循环/棋盘生成.md),结算规则归[战斗结算](../战斗循环/战斗结算.md),敌种行为归[敌人系统](../战斗循环/敌人系统.md)——它只决定这些已定稿机制在"第几关、第几战"各自吃到哪一行数值,让玩家一路下探时体感到"越下越险"。 + +它同时是难度的验收基准:把"这一战玩家打得过吗""这一关通起来什么手感"量化成几条允许区间(本文称**带**),调参调没调对,拿带子量一下就知道。玩家不会直接看到本系统的任何东西,但每场战斗的松紧都来自它。 + +## 系统范围 + +边界这样划:本系统管"数值是多少、按什么坐标摆放、拿什么标准验收"。机制怎么运作归各机制文档,表结构归各表 owner,画成什么样归呈现层。它是纯数值系统:运行时零公式、零随机、零界面——战斗进行中发生的一切都由既有机制读表完成,本系统只在设计期与调参期工作。 + +负责: + +| 负责 | 说明 | +|---|---| +| 曲线行值投值 | 敌人、主角、棋盘参数、奖励各类表里"随关卡与深度变化的数值"的取值与摆放(表结构与回填机制归各表 owner) | +| 遭遇数量与攻击浮动 | 每个坐标行的敌人数量区间与攻击浮动宽度(掷定执行归[战斗结算](../战斗循环/战斗结算.md)) | +| 生存链区间模型 | 每战"打不打得过"的三档判定与关级通关恒等式——难度验收的现行模型 | +| 期望值带 | 通关率带、通关余量带、形态带——调参的"正确行为"基准 | +| Boss 设计 | 关底 Boss 的血量锚、数值台阶与行为环配型;精英修饰只留预留位 | +| 调参联动纪律 | 禁独立调参网络与对账重跑义务的登记与执行 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 生成算法与可推理率度量 | [棋盘生成](../排雷循环/棋盘生成.md)(本文只投参数行值,禁反向调用生成) | +| 结算规则、伤害合成与护甲克制矩阵本体 | [战斗结算](../战斗循环/战斗结算.md)(本文只投矩阵数值) | +| 敌种机制、行为环语义与表结构 | [敌人系统](../战斗循环/敌人系统.md)(本文只投行值) | +| 奖励机制、库存与注入机制 | [奖励道具经济](../战斗循环/奖励道具经济.md)(本文只投权重、威力、注入参数) | +| 关卡序列与节点链结构 | [冒险结构](冒险结构.md)与[关卡节点地图](关卡节点地图.md) | +| 元进度解锁内容 | [元进度](元进度.md)(本文只提供换算率接入口) | +| 配置表承载与读取机制 | [数据配置](../表现与支撑/数据配置.md) | +| Boss 登场演出与难度台阶可视化 | [HUD 框架](../表现与支撑/HUD框架.md)、[战斗表现](../战斗循环/战斗表现.md) | + +## 在核心循环中的位置 + +``` +设计期:本系统把(关卡 × 深度)行值写进各数据表 ──▶ 运行时:战斗结算按坐标读表生成战斗 ──▶ 战绩数据回流 ──▶ 调参期:扫描复算带子,越带回滚 +``` + +本系统站在整个循环的幕后:玩家推进关卡时,每场战斗的敌人数量、棋盘规格、奖励质量都来自它摆好的行值;战斗打完的战绩数据又回流给它,作为下一轮调参的依据。它不参与任何一次具体结算,只决定结算时读到的数字。 + +## 核心规则 + +### 曲线雕刻:两条轴定基线,一个修饰位留后手 + +本系统全部数值按两个坐标摆放:关卡序号(第几关)与节点深度(本关第几战)。关与关之间拉大台阶,一场战斗与下一场之间铺小坡度;精英与 Boss 修饰是预留的第三条轴。运行时对这套坐标零计算——每个坐标的行值在设计期直接算好填进表里,游戏只读数。 + +| 轴 | 规则 | 说明 | +|---|---|---| +| 关间台阶(关卡序号) | 每关至少投放一项新内容(新敌种或既有敌种新行为环段),加基准数值跳升 | 台阶必须能归因到看得见的变化,不是纯数字膨胀;投放断档是内容生产缺口,调参修补不了 | +| 关内坡度(节点深度) | 同敌种数值平缓上移,深度也可表达为敌人成群 | 数量是比单体质变更优先的深度表达:保持行为环读数不变、总量受控 | +| Boss 与精英修饰(预留第三轴) | Boss 走最深深度直填行;精英只有字段命名空间预留 | Boss 不走修饰表;修饰乘数表 MVP 为空表、零行为,首个使用场景 = 精英节点(随[关卡节点地图](关卡节点地图.md)定稿联动);数值所有权在本系统,[棋盘生成](../排雷循环/棋盘生成.md)只按表生成 | + +**结论**:关内坡度 = 每深一档,同敌种生命按 5%–20% 线性上移;关间台阶 = 相邻关同敌种基准乘 1.3–1.6。 + +``` +hp_D = round( hp_0 × (1 + s_hp × D) ) s_hp ∈ [0.05, 0.20] +base(L+1) ≈ base(L) × k_L k_L ∈ [1.3, 1.6](仅同敌种延续场景) +``` + +| 变量 | 含义 | +|---|---| +| hp_D / hp_0 | 深度 D 行 / 首行的生命基线 | +| D | 节点深度,Boss = 本关最深深度 | +| s_hp / k_L | 每档增幅 / 关间倍率,域内取值、provisional | + +MVP 行值并不逐式现算,而是按此式量级直填经切片验证过的行(见调参表);敌种切换不受此式约束——台阶值直接定。新敌种登场时基准按其行为环复杂度重定,关间倍率不适用于这种场景。 + +### 生存链区间模型:一场战斗"打不打得过"的三档判定 + +这是难度验收的现行模型,把"这一战玩家打得过吗"量化成两条区间的对比。每场战斗按玩家的**生存供给**(能扛多少伤害)算出一条生存区间,按**击杀需求**(要打出多少输出才能清场)算出一条击杀区间,两区间一比得出绿、黄、红三档结论。它替代了旧的关级供给带。 + +**结论**:绿档(最坏情况也打得过)是教学位的强制要求;黄档(期望占优但有失败分支)是普通战斗的正常形态;红档(最好情况也打不过)是配置事故,涉事行值禁止入表。 + +``` +生存区间 S = [ (进场生命 + 治疗下界) ÷ 受伤峰值 , (进场生命 + 治疗上界) ÷ 受伤谷值 ] +击杀区间 K = [ (敌方总生命 − 一次性伤害上界) ÷ 输出峰值 , (敌方总生命 − 一次性伤害下界) ÷ 输出谷值 ] + +绿档:S 下界 > K 上界 最坏也能过,与运气无关 +黄档:S 期望 ≥ K 期望 + 1(且非绿) 有失败分支,期望占优 +红档:S 上界 ≤ K 下界 最好也打不过,配置事故 +``` + +| 变量 | 含义 | +|---|---| +| 进场生命 | 主角进入本战时的生命;跨战斗持久,归[冒险结构](冒险结构.md)的 HP 账本 | +| 受伤峰值 / 谷值 | 敌方最坏 / 最好一轮的输出(攻击、拍别倍率、伏击附加、减伤、削弱的合计构成见[战斗结算](../战斗循环/战斗结算.md)战斗段) | +| 输出峰值 / 谷值 | 玩家最好 / 最坏一轮的总输出(分量构成同上) | +| 一次性伤害 | 清障炸药一类当场引爆的大额伤害 | + +关级通关恒等式:**一关打下来,玩家总输出 ≈ 全关敌方总生命期望 ×(1 + 缓冲);其中奖励侧贡献的输出占比须落在 [15%, 40%] 带内。** + +``` +基础攻击合计 + 奖励输出合计 ≈ 敌方总生命期望 × (1 + 缓冲) +奖励输出占比 = 奖励侧输出 ÷ 总输出 ∈ [15%, 40%] +``` + +占比过低说明奖励是摆设,过高说明胜负被奖励供给绑架,两头都算失守。缓冲是调参期给定的容忍余量;恒等式用调参期批量扫描的实际战绩逐项对账闭合。区间两端各有一个口径:公式包络口径回答"必过还是必死",实际战绩分位(p10–p90)口径用于日常判定。主角生命跨战斗持久意味着各战区间不独立,联合分布由批量扫描裁决。 + +### 期望值带:三条定稿的验收带 + +单战判定之上还有"整关长什么样"的验收基准。下面三条带是定稿口径;调参后任一条越带都必须回滚或登记,禁止静默出带。带子按模拟口径定义——即调参期批量模拟器的读数口径;真人与模拟者的偏差另行登记标定义务(见「待拍板」)。 + +| 带 | 定稿口径 | 含义 | +|---|---|---| +| 第一关通关率带 | 基线档(无元进度加成)通关率 ∈ [30%, 50%] | 首关要明显吃紧但多数玩家能过;现行扫描读数 60% 越上界,加难扫描未执行(见「待拍板」) | +| 通关余量带 | 通关者通关时剩余生命的 p90 ≤ 13 且 p10 ≥ 3 | **通关余量** = 通关瞬间还剩多少血。余量太肥说明赢得太从容,压生存侧;太瘦说明"剩一两滴血惨胜"成常态,抬治疗供给或恢复点收益 | +| 第一关形态带 | 教学位绿档 + 中段黄档 + Boss 黄档不红 | **形态带**管一关内各战三档判定的排布形状:第一战必须稳过,中段有输的可能,Boss 战紧但不许是配置事故 | + +更高加成档(攻击翻倍、三倍)的通关率带随档位放宽(翻倍档第一关 ≥95%),其机制承载是生存链区间的平移而不是另拍一套数字(平移换算见调参联动一节)。此外另有一条期望承伤占比带(普通场承伤不超过生命上限两成、Boss 场不超过五成,provisional),复验义务随最近的减伤调整批执行。 + +### Boss 设计:食人魔酋长与关底血量锚 + +首发关底 Boss 是食人魔酋长,摆在每关最深深度行上。Boss 约定有三条:位置 = 最深深度直填行,不走修饰表;定位 = 本关最大的单场消耗;行为环 = 专属四拍环且含蓄力拍——蓄力空拍是玩家的规划窗口(行为环语义见[敌人系统](../战斗循环/敌人系统.md))。 + +**结论**:Boss 生命 ≈ 全关普通战斗敌方生命期望合计 × 血量锚比率,比率域 [0.5, 1.1];Boss 攻击基线不低于本关普通战的最高行。 + +``` +boss_hp ≈ round( Σ普通战斗敌方生命期望 × r_boss ) r_boss ∈ [0.5, 1.1] +``` + +| 变量 | 现行值 | 说明 | +|---|---|---| +| Σ普通战斗敌方生命期望 | 153.5(第一关,含数量区间期望) | 全关非 Boss 节点敌方生命合计 | +| r_boss 现值 | 150 ÷ 153.5 ≈ 0.98,带内 | 对应食人魔酋长 150 生命(provisional) | +| 加难走廊 | [1.1, 1.35](对应 Boss 生命 180–207) | 通关率压带的首选杠杆候选;扫描未执行,处 provisional-pending-scan(见「待拍板」) | + +Boss 战的棋盘用本关最大板形(第一关为 12×12),板参数仍受[棋盘生成](../排雷循环/棋盘生成.md)的可推理率绝对锚约束——加难不许加到不可推理。Boss 战胜利即关卡通关,编排归[冒险结构](冒险结构.md);登场仪式感归[战斗表现](../战斗循环/战斗表现.md)。 + +### 护甲克制:本文锁行值,矩阵本体归战斗结算 + +三个首发敌种各配一档护甲类型——地精无甲、熊地精甲、食人魔酋长重甲——构成"无甲 → 甲 → 重甲"的教学梯度:玩家的克制手段随进度逐关解锁。 + +伤害类型对护甲类型的克制倍率矩阵(克制 150% / 无甲 100% / 被对位克制 50%,provisional)是[战斗结算](../战斗循环/战斗结算.md)的甲效表,哪个分量克哪档护甲由它定义,本文不重复。本文只锁两件事:敌种的护甲类型行值(见调参表),以及这份矩阵数值的调参所有权在本系统——敌种护甲变更必须复算 Boss 与普通战的击杀区间。 + +### 调参联动:禁独立调参网络与对账重跑义务 + +本系统是全项目调参旋钮最多的系统,而且几乎每个旋钮都与别的系统咬合:单独拧一个,别人的对账就会破。所以本系统数值处于一张禁独立调参网络里——每次修订必须带着联动方重算,对账不过就回滚或登记,禁止带病前进。 + +| 联动组 | 对方 | 纪律 | +|---|---|---| +| 敌方生命 ↔ 奖励供给 | [奖励道具经济](../战斗循环/奖励道具经济.md) | 单边移动必须走关级通关恒等式的联合检算 | +| 数量区间 ↔ 棋盘密度与惩罚上限 | [棋盘生成](../排雷循环/棋盘生成.md)、[战斗结算](../战斗循环/战斗结算.md) | 成群行上线前强制复算挖掘风险不等式 | +| 密度 ↔ 可推理率 ↔ 生成尝试上限 | [棋盘生成](../排雷循环/棋盘生成.md) | 三元组联动;禁止为难度牺牲可推理率绝对锚 | +| 每轮行动点 ↔ 停手转存规模 | [行动经济](../排雷循环/行动经济.md) | 联动评估记录归本文,调参所有权在行动经济 | +| 削弱强度 ↔ 当量锚 | [增益状态](../战斗循环/增益状态.md)、[战斗结算](../战斗循环/战斗结算.md) | 联动值禁独立调参,修订须重跑锚对照 | +| 护甲类型 ↔ 充能分量 ↔ 克制矩阵 | [战斗结算](../战斗循环/战斗结算.md) | 敌种护甲变更须复算击杀区间 | + +五条经济契约的对账由[战斗结算](../战斗循环/战斗结算.md)闭合验收,其中挖掘风险不等式与清图支配性两条的现行验算已破线或存在缺口(现状见其「待拍板」),重跑义务落在本系统的下一次调参批执行——这是本系统当前最优先的调参义务。完美排雷乘数的调参权在本系统。 + +元进度接口预留:**结论——元进度解锁对难度的影响,以生存链区间的平移换算率接入;换算率数值未定,结构位归[元进度](元进度.md)定稿。** 现行量级估算:生命上限 +10 ≈ 多撑约 1 轮、攻击翻倍 ≈ 击杀区间约减半(provisional)。元进度定稿前,本系统不为它预留任何数值行。 + +## 依赖与输出 + +本系统的上下游即它的联动网络:对上是一批"机制归别人、数值归我"的表,对下是消费难度坐标与验收带的冒险侧。这张表就是删除任何一方时的影响面清单。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 全部数值表的承载、加载校验与类型化读取;本文只投值不改结构 | +| 上游 | [敌人系统](../战斗循环/敌人系统.md) | 敌人表与主角表的字段语义与回填;本文投曲线行值与数量区间、攻击浮动宽度 | +| 上游 | [棋盘生成](../排雷循环/棋盘生成.md) | 棋盘参数表的键与字段语义;本文投参数行值;禁反向调用生成 | +| 上游 | [奖励道具经济](../战斗循环/奖励道具经济.md) | 奖励表与奖励配置表的机制与回填;本文投权重、威力、档位、注入参数 | +| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 五条经济契约对账结论是本文的调参约束输入;结算侧数值(充能、矩阵、完美乘数、参考敞口)投值归本文 | +| 上游 | [行动经济](../排雷循环/行动经济.md) | 每轮行动点表值的联动观测;调参所有权在对方 | +| 下游 | [冒险结构](冒险结构.md) | 关卡序列的难度排布消费期望值带;通关率带是其大奖励与恢复点强度的标定基准 | +| 下游 | [关卡节点地图](关卡节点地图.md) | 节点深度语义与精英节点形态联动(未设计——Boss = 最深深度行约定即预留接口) | +| 下游 | [元进度](元进度.md) | 区间平移换算率是其解锁强度的换算接入口(结构位预留) | +| 下游 | [增益状态](../战斗循环/增益状态.md) | 状态强度行值的联动评估(禁独立调参) | +| 下游 | [战斗表现](../战斗循环/战斗表现.md)、[HUD 框架](../表现与支撑/HUD框架.md) | "何时变难"的数据面(新敌种登场、Boss 行);呈现义务归对方 | + +## P0 最小闭环 + +1. 设计期:按两条轴把行值直填敌人、主角、棋盘参数、奖励各数据表——运行时零公式,游戏只读表。 +2. 冒险推进到战斗节点,[战斗结算](../战斗循环/战斗结算.md)发起战斗:开战时按行值的数量区间与攻击浮动,用封闭随机流掷定本战实际值(教学位与新敌种首遇位固定不掷)。 +3. 各表按坐标行值实例化敌人与棋盘,整场战斗按既有机制运作——本系统不在场。 +4. 战斗产出实际战绩(承伤、输出、治疗、通关余量),供调参期消费。 +5. 调参期批量扫描复算:通关率带、三档区间判定、通关余量带、输出占比带、关级恒等式。 +6. 越带或红档 → 回滚行值或登记「待拍板」;禁止静默出带、禁止带病前进。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 第二关深度轴行值(敌人表与棋盘表 D1–D4) | 内容与数值同批,随第二关内容扩展填充;填齐前冒险按单关运行(合法态) | +| P1 | 加难杠杆扫描落带 | 候选杠杆已登记(血量锚走廊、群战上探、注入衰减 0.6),扫描未执行;落带前现行行值维持 provisional-pending-scan | +| P1 | 挖掘风险不等式与清图支配性对账重跑 | 两条对账现行破线 / 缺口,义务落在本文调参批(现状见[战斗结算](../战斗循环/战斗结算.md)「待拍板」) | +| P1 | 真人通关率修正系数标定 | 带按模拟口径定义;试玩批次实测真人显著强于模拟者,系数待后续试玩批次定量 | +| P1 | 完美策略档的结构性加难杠杆 | 数值杠杆对完美档已被实测证伪,结构候选未裁决(见「待拍板」) | +| P2 | 精英节点完整语义与修饰乘数表首行 | 随[关卡节点地图](关卡节点地图.md)定稿联动;首个使用场景 = 精英节点 | +| P2 | 区间平移换算率定稿 | 元进度接入口,随[元进度](元进度.md)定稿 | +| P2 | 全局作用域变异的投放计划 | 机制框架归[地形变异](../排雷循环/地形变异.md),投放计划归本文,随关卡扩展 | + +## 调参表 + +本系统是全项目行值最多的系统,本表只收关键行。数值纪律:正文定规则与取值域,行值进数据表——切片数据表位于 `prototypes/dungeon-sweeper-vertical-slice/data/tables/`(enemy、board_gen、hero、reward 等);已锁数值以 [registry 的对应条目](../../../registry/entities.yaml) 为准。 + +首发行值几乎全部 provisional,其中加难相关数值处于 provisional-pending-scan(扫描未执行);完整行集读表,不在此整表搬运。 + +敌人表行值(第一关五行 + 第二关锚行,全部 provisional): + +| 坐标 | 敌种(数据键) | 生命 | 攻击(浮动区间) | 数量 | 行为环 | 护甲 | +|---|---|---|---|---|---|---| +| 第一关 D0(教学位) | 地精 goblin | 24 | 7 [4,10] | 固定 1 | 攻击 | 无甲 | +| 第一关 D1 | 地精 goblin | 13 | 5 [2,8] | [2,3] | 攻击 | 无甲 | +| 第一关 D2(首遇固定) | 熊地精 bugbear | 40 | 9 [6,12] | 1 | 攻击/蓄力/重击 | 甲 | +| 第一关 D3 | 熊地精 bugbear | 18 | 6 [3,9] | [2,3] | 攻击/蓄力/重击 | 甲 | +| 第一关 D4(Boss) | 食人魔酋长 ogre_chief | 150 | 9 [6,12] | 1 | 攻击/攻击/蓄力/重击 | 重甲 | +| 第二关 D0(锚行) | 熊地精 bugbear | 30 | 7 [4,10] | 1 | 攻击/蓄力/重击 | 甲 | + +重击倍率全员 2(provisional);单轮伏击授予上限 4(已定稿)。攻击浮动开战时掷定一次、整战持久;数量区间同流掷定、教学位与首遇位豁免。 + +主角表与棋盘参数表(provisional): + +| 表 | 行值 | +|---|---| +| 主角表 | 生命上限 50 · 基础攻击 6 | +| 棋盘参数(第一关 D0/D1) | 10×10 · 雷密度 0.25 · 可推理率目标 0.88 · 生成尝试上限 16 | +| 棋盘参数(第一关 D2–D4,含 Boss) | 12×12 · 雷密度 0.25 · 可推理率目标 0.88 · 生成尝试上限 24 | + +战斗侧与奖励侧的关键投值(机制归对方、数值所有权本文,全部 provisional): + +| 参数 | 现行值 | 说明 | +|---|---|---| +| 血量锚比率 r_boss | 0.98(带内) | 带 [0.5, 1.1];加难走廊 [1.1, 1.35] 待扫描 | +| 伤害A(开格充能)每格 / 单轮封顶 | 1 / 8 | 充能机制归[战斗结算](../战斗循环/战斗结算.md) | +| 伤害B(标中充能)每雷 | 2 | 同上 | +| 克制矩阵 | 克制 150 / 无甲 100 / 被对位克制 50 | 消费归[战斗结算](../战斗循环/战斗结算.md) | +| 完美排雷乘数 | 200(翻倍) | 调参权本文 | +| 当量参考敞口 | 12 | 变更触发全量对账重跑 | +| 注入概率初值 / 衰减 | 0.4 / 0.5(加难候选 0.6) | 注入机制归[奖励道具经济](../战斗循环/奖励道具经济.md) | +| 清障炸药威力区间 | 25–55(中点 40) | 清图槽当场引爆 | +| 状态强度 | 增伤 +50 / 减伤 −30 / 削弱 −65 / 伏击 +3(每层) | 联动评估归本文,禁独立调参 | + +## 验收标准 + +- 坐标行齐备:任一战斗节点(关卡 × 深度)在敌人表与棋盘参数表都恰有精确行;缺行在调参期冒烟断言拦截——缺行是调参事故,不是运行时事件。 +- 零红档:全部行集经区间扫描,不存在"最好情况也打不过"的战斗组合。 +- 教学位绿档:第一关第一战与各新敌种首遇位的区间判定为绿档。 +- 形态带成立:第一关形态 = 教学位绿 + 中段黄 + Boss 黄不红。 +- 通关率带:基线档通关率 ∈ [30%, 50%]——现行读数 60% 越上界,属已登记待执行项,扫描落带前不得视为达标。 +- 通关余量带:通关者剩余生命 p90 ≤ 13 且 p10 ≥ 3。 +- 恒等式闭合:关级通关恒等式逐项对账闭合,残差 <5%(provisional 阈值);奖励输出占比 ∈ [15%, 40%]。 +- Boss 锚在案:每个 Boss 行的血量锚比率记录在案且落在现行带内;越带须登记,不静默变更。 +- 联动可审计:任何行值修订在调参日志留有对应联动组的联合检算记录;越带必须回滚或登记——禁止静默出带、禁止带病前进。 +- 零运行时公式:运行时对难度零计算——同一种子同坐标必读同表值,难度差异全部来自表行。 + +## 待拍板 + +以下条目存在缺口、冲突或验算失义,本系统不自作裁决,逐条登记。 + +| 条目 | 现状 | 建议归属 | +|---|---|---| +| 基线通关率越带,加难杠杆扫描未执行 | 现行扫描读数 60%,越 [30%, 50%] 上界。三类杠杆候选已登记:血量锚走廊 r_boss [1.1, 1.35](Boss 生命 180–207)、群战上探、注入衰减 0.5 → 0.6;扫描步未执行。落带前全部现行行值维持 provisional-pending-scan | 本文调参批,扫描执行与[棋盘生成](../排雷循环/棋盘生成.md)工具交付联动 | +| 完美策略档的结构性加难杠杆 | 零加成的完美策略模拟通关率 100%、几乎满血通关——承伤带对这类高端玩家档位已无分辨力,数值杠杆族被实测证伪。结构候选(承伤硬地板、削弱饱和语义等)未裁决 | 本文提案,用户裁决 | +| 真人通关率标定 | 试玩批次 1 实测真人显著强于模拟者(真人 100% vs 模拟 80%);带按模拟口径定义,真人修正系数待后续试玩批次定量 | playtest 批次 | +| 雾相关供给验算失义 | 原供给与对账验算含雾板分层、雾成本负担比等输入分量,随雾格自设计中移除(见[不做清单](../../05-不做清单.md))整体失义;重跑对账须以现行输入重建判据 | 本文调参批,与挖掘风险不等式、清图支配性重跑同批 | +| 第二关深度轴行值未填充 | 第二关仅有 D0 锚行,D1–D4 敌人行与棋盘行待填;这是两关序列生效的前提,填齐前冒险按单关运行(合法态) | 本文,随第二关内容批 | +| 第二关的新内容投放缺口 | 曲线规则要求每关至少投放一项新内容;三敌种已全部在第一关登场,原表述中第二关的"解锁新元素"绑定已移除的雾格——第二关投放什么待定,现行口径填不上 | 本文提案,用户裁决 | +| 区间平移换算率数值未定 | "生命上限 +10 ≈ 多撑约 1 轮、攻击翻倍 ≈ 击杀区间约减半"是量级估算(provisional);作为元进度接入口,数值待实测标定 | 随[元进度](元进度.md)定稿 | +| 速杀退化预警阈值未定 | 高加成档速杀低难度行是成长兑现的合法形态、不做修复,但"战斗结束未开资格格占比"预警的阈值与联动调参未定(登记见[奖励道具经济](../战斗循环/奖励道具经济.md)「待拍板」) | 本文调参批 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/战斗循环/增益状态.md b/design/gdd/systems/战斗循环/增益状态.md index 1153c43b..d4cab584 100644 --- a/design/gdd/systems/战斗循环/增益状态.md +++ b/design/gdd/systems/战斗循环/增益状态.md @@ -1,3 +1,242 @@ # 增益状态 +> 一句话:增益/减益状态的容器、叠层与衰减 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/b3-status-effect.md + +## 设计目的 + +战斗里有一类效果不在当场一次性用掉,而要管上几次结算:挖开安全格拿到的主角增益、标中旗带来的怪物削弱、踩雷喂给怪物的增强,都是这类。本文把它们统称"状态":发给主角的叫增益,发给敌人的负面效果叫减益;惊动巢穴喂给怪物的增强同样是状态——三个方向共用一本账。 + +增益状态就是这本账:一个容器收下全部状态,用同一套规矩管理——发入、叠层(同一种效果重复拿到时层数加一)、衰减(每次结算后剩余次数减一,减到零效果消失)、清空(战斗结束全部清除)。没有它,几类效果得各写一套计时逻辑,结算明细也无法逐行指回"这效果是我哪步棋带来的"。容器管机制、不管数值从哪来:某个效果该多大,由各收益系统的表去定,容器只照章入账、按次衰减。 + +## 系统范围 + +边界这样划:容器只管"效果存进来之后"的一生——受理、存续、倒数、清空。效果"该不该发、发几次"由战斗结算在轮末兑现时裁决,容器只记账;"发进来之后在伤害公式里怎么用"是战斗结算的消费侧规则;"画成什么样"归呈现层。 + +负责: + +| 负责 | 说明 | +|---|---| +| 状态实例生命周期 | 授予受理、存续、到期移除、战斗结束清空;寿命以一场战斗为界 | +| 时限、叠层、衰减语义 | 按"结算次数"倒数、同名效果按表行策略合并、先兑付后衰减(见核心规则) | +| 归因记录 | 每笔状态随身携带来源类别、来源格、第几轮,供结算明细逐行指认 | +| 状态表的回填责任 | 状态定义表的字段与 MVP 内容行在本系统定稿;表本体经[数据配置](../表现与支撑/数据配置.md)承载 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 事实产生与授予裁决(去重、恰好一次) | [战斗结算](战斗结算.md) | +| 效果在结算公式里的用法(乘除侧读法、地板、作用顺序) | [战斗结算](战斗结算.md) | +| 增益与削弱档位的当量对照验收 | [奖励道具经济](奖励道具经济.md)与[战斗结算](战斗结算.md) | +| 固定值量纲(伏击)的定义与惩罚上限 | [敌人系统](敌人系统.md) | +| 状态栏、图标、明细行的呈现 | [HUD 框架](../表现与支撑/HUD框架.md) | + +## 在核心循环中的位置 + +``` +扫雷阶段:挖格 / 插旗 / 踩雷 ──(事实流)──▶ 战斗结算(轮末逐行兑现)──(授予 / 查询兑付 / 衰减)──▶ 增益状态 ──▶ 效果落进结算公式 +``` + +增益状态站在轮末结算这一段,是战斗结算身后的状态仓库:扫雷攒下的因里,凡是"要管上几次结算"的那部分都存在它这里。扫雷事实不直接进容器——战斗结算每轮把事实兑换成状态发入,兑付时再来读生效清单。 + +## 核心规则 + +### 一个容器管三向:三类效果同账本 + +主角的增益、敌方受到的削弱、敌方自带的增强——三个方向的效果在容器里是同一种东西,都叫状态实例(容器里的一份效果,带层数与剩余次数),走同一套受理、合并、倒数、清除的语义。踩雷的惩罚与标中旗的收益共用同一本账,玩家能在同一种读法下看到雷的两面:一边喂强敌人,一边拆它的皮。 + +容器四条硬规矩: + +| 规矩 | 含义 | +|---|---| +| 寿命 = 一场战斗 | 战斗开始时容器为空,结束全部清空,不跨到下一场战斗 | +| 跨轮跨图延续 | 同一场战斗里换新雷图、弃图刷新都不清空——状态跟着战斗走,不跟图走 | +| 全程零随机 | 授予、合并、衰减、列举顺序全部确定,可回放 | +| 敌方侧共享 | 对敌效果一律对全体存活敌人生效,层数全体共享一份(单体寻址是后置扩展位) | + +举证:本节为容器结构规则,无计算。 + +### 授予只在结算时发生:事实换状态的唯一入口 + +状态只在轮末结算时发入容器。挖掘期的挖格、插旗、踩雷都不直接改容器——棋盘只上报"发生了什么"的事实,战斗结算在每轮结算时把事实统一兑换成状态发进来。这个授予入口是唯一的:棋盘和奖励背包都没有直通通道。 + +每笔状态随身携带归因记录:来源类别四选一、来自哪个格子、发生在第几轮。结算明细因此能逐行回答"这效果是我哪步棋带来的"。 + +| 来源类别 | 什么时候发生 | 发给谁 | +|---|---|---| +| 安全格 | 挖开安全格拿到增益 | 主角 | +| 标中旗 | 轮末旗判定标中(巢穴被控制) | 敌方,削弱 | +| 踩雷 | 挖开惩罚格、惊动巢穴 | 敌方,增强 | +| 清图奖励 | 清图奖励槽含增益时 | 随行定,路径归[奖励道具经济](奖励道具经济.md)定稿 | + +容器是只记账、不裁决的仓库:上游叫它施加几次,它就入账几次。同一笔事实被重复转化两次,就入两层——它不去重、不合并事实,"事实到授予恰好一次"由战斗结算保证。同轮多笔授予按调用方给定的次序先后入列,容器保证入账顺序稳定可读。 + +状态一经发入立即生效,没有"待生效"中间态——授予它的那轮结算就是它的第一次兑付。 + +举证:本节为授予路径与记账规则,无计算。 + +### 同名状态再拿到:叠层、刷新、并存 + +同一种状态还没消失又拿到一份,怎么合并由状态表每行的合并策略字段说了算,共三种。合并在授予那一刻由容器完成;多个状态在结算里按什么先后起作用,是战斗结算的编排——两件事互不干扰。 + +| 合并策略 | 重复授予时发生什么 | 说明 | +|---|---|---| +| 叠加 | 层数加一;剩余结算次数不动——只有首次授予定钟 | MVP 四行全部用叠加 | +| 刷新 | 剩余结算次数重置为该实例首次授予时的初始值,层数不变 | MVP 无内容行,语义已就位 | +| 并存 | 新建一份独立实例,两份各算各的 | 同上 | + +叠加是纯加法:几层就是几倍的行值。叠到行上限后再授予同款会被拒绝,容器一个字不变;但这份奖励不会被无声吞掉——结算明细多一行"溢出未生效"(满层后白拿的那份,如实留痕),连来源一起写明,玩家看得到"这层白拿了"。浪费诚实、可规划。 + +无论重复来自玩家直接踩出的格子,还是连锁展开自动开出的奖励格,都走同一个授予入口、同样产生溢出行、同样留痕。 + +举证:本节为合并分支规则,无计算——满层判定就是一次"层数等于上限"的比较。 + +### 剩余次数怎么倒数:按结算次数衰减 + +每个状态实例自带一个倒数计数——剩余结算次数(本文说的"衰减"就是它逐次递减、归零消失)。它不承诺"活几轮",而是数"经历过几次轮末结算":每轮结算先让状态起作用,随后计数减一,减到零状态即被移除。持续 1 的状态就是"一次性":在授予它的那轮结算里生效一次,轮末消失。MVP 四行内容全部是一次性;将来跨轮持续的增益,寿命由表行初始值表达,给几就活几次结算。 + +``` +一轮结算:查询生效清单 → 逐行兑付(层数 × 行值)→ 轮末衰减(全部实例剩余次数 −1)→ 归零实例移除 +``` + +| 要点 | 内容 | +|---|---| +| 计数单位 | 结算次数——全部状态唯一的时限单位,玩家读到的"还剩几次"就是规划素材本身 | +| 每轮时序 | 先兑付、后衰减:战斗结算兑付完才做减一,每轮结算恰减一次 | +| 归零即移除 | 减到零的实例当轮销毁,不留零值实例 | +| 停手照减 | 停手不挖的轮、弃图刷新的轮也照常算一次结算——没有"不结算就不掉次数"的免费延时 | +| 全清兜底 | 战斗结束通知到达即全实例清空;战斗最后一轮是否还做衰减判定归战斗结算的编排次序,两种次序终态相同 | + +举证:本节为衰减时序规则,无计算。 + +### 幅度与量纲:容器只做加法,换算归结算 + +容器对每个状态只记两件数值的事:幅度(一个整数)和量纲(百分比还是固定值)。百分比量纲的叠层是纯加法——两层 +50% 合计 +100 个百分点,不是 1.5 的平方;固定值量纲几层就乘几。 + +**结论**:容器输出的有效值 = 层数 × 行值,原样给出、不封顶不保底;把百分比合计换算成乘数、并在 −100 个百分点处设地板,是[战斗结算](战斗结算.md)的消费侧规则——地板保证减益不会把属性打到绝对负值,最低压到"归零"为止。 + +``` +有效值 = 层数 × 行值(量纲标签随值原样输出,不进乘法) +``` + +两个现行例子读起来是这样: + +| 例子 | 容器输出 | 消费侧读法 | +|---|---|---| +| 削弱叠两层 | −130 个百分点(越出单行取值域,原样输出) | 压在地板 −100% 上:敌方攻击当轮归零 | +| 主角减伤叠两层 | −60 个百分点 | 不触地板:承伤读作 0.4 倍 | + +容器还有一条快照纪律:实例的幅度、初始次数、量纲在授予那一刻从表行拷贝。战斗中配置表即使被重载,已授予实例不受任何影响,只影响后续授予。 + +### 现在有哪些状态:MVP 四行内容 + +MVP 阶段状态表恰有四行:两个主角增益(挖安全格拿)、两个敌方效果(踩雷的增强、标中旗的削弱)。四行全部是一次性、全部用叠加合并;数值全部 provisional(临时值,过锚验收后才定稿)。 + +| 字段 | 取值 | 说明 | +|---|---|---| +| effect_id | 文本,全表唯一 | 状态标识 | +| display_name | 文本 | 界面与结算明细用名 | +| target_side | hero / enemy | 作用侧 | +| magnitude | 整数 | 幅度:百分比行 ∈ [−100,100] 且非 0;固定值行 ≥ 1 | +| unit | percent / flat | 百分比修正 / 固定值 | +| duration_settlements | 整数 [1,99] | 授予时初始剩余结算次数(1 = 一次性) | +| stack_policy | stack / refresh / independent | 同名再授予的合并策略 | +| max_stack | 整数 [1,16] | 叠层上限,仅叠加策略消费 | + +| 状态 | 效果一句话 | 发给谁 | 幅度(现行值) | 叠层上限 | 来源类别 | +|---|---|---|---|---|---| +| attack_up 增伤 | 主角攻击提升 | 主角 | +50%(provisional) | 2 | 安全格 | +| defense_up 减伤 | 主角承伤降低 | 主角 | −30%(provisional) | 2 | 安全格 | +| ambush 伏击 | 敌方攻击附带额外伤害 | 敌方 | +3 固定值/层(provisional) | 16 | 踩雷 | +| weaken 削弱 | 敌方攻击被削弱 | 敌方 | −65%(provisional,取值域 [60,85]) | 16 | 标中旗 | + +削弱行是当量锚在容器侧的数据落点:标中旗的收益折算成统一价值后,必须严格高于最低档主角增益——"标中旗必须比随便挖一格更值",否则没人愿意插旗。这条锚的契约归[行动经济](../排雷循环/行动经济.md),对照验收归[战斗结算](战斗结算.md);伏击行的固定值量纲定义与惩罚上限锚归[敌人系统](敌人系统.md)。 + +## 依赖与输出 + +本系统接面很窄:一个调用方(战斗结算),外加数据与呈现侧的软依赖。下表就是删除任何一方时的影响面清单。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 调用方 | [战斗结算](战斗结算.md) | 五个入口的唯一调用方:战斗开始(开账)、授予(唯一进货口)、查询生效清单(兑付消费)、轮末衰减、战斗结束(清空);事实转授予、兑付作用顺序、换算与地板都在它一侧 | +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 状态表的字段定义承载与统一读取;本系统是该表的回填责任方 | +| 相邻 | [排雷玩法](../排雷循环/排雷玩法.md) | 棋盘事实的事件源头;与本容器零直接接口——事实一律经战斗结算转化 | +| 相邻 | [行动经济](../排雷循环/行动经济.md) | 契约相邻、无运行时接口:五条经济契约在本侧的数据落点就是状态表行值 | +| 下游 | [敌人系统](敌人系统.md) | 伏击行固定值量纲的定义方与惩罚上限锚的验收方 | +| 下游 | [奖励道具经济](奖励道具经济.md) | 清图奖励含增益时经授予入口进入;增益与削弱档位的锚验收方之一 | +| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 状态栏数据源;有利/有害极性呈现、无状态时空槽隐藏、状态到图标的映射,三义务归口 | + +容器对外是一组封闭的被动入口,全部布尔或计数返回:战斗开始(开账)、授予(唯一进货口)、查询生效清单(只读,按授予先后排列)、轮末衰减(返回本轮移除数)、战斗结束(全清回空)。它不发任何事件、不做任何界面动作——呈现刷新点在战斗结算编排完成之后。 + +## P0 最小闭环 + +1. 战斗结算通知战斗开始:容器开账,空容器进入可用状态。 +2. 轮末结算时,战斗结算把这一轮的扫雷事实兑换成授予:挖开安全格给主角上增益、标中旗削弱敌人、踩雷给敌方上增强——授予入口是唯一进货口。 +3. 容器按表行合并策略受理(新建 / 叠一层 / 刷新),实例立即生效并携带归因记录。 +4. 战斗结算查询生效清单,逐行兑付进结算公式(有效值 = 层数 × 行值)。 +5. 兑付完做轮末衰减:全部实例剩余次数减一,归零移除——先兑付、后衰减。 +6. 战斗外授予、未知状态、满层授予一律被拒且容器不变;满层的"溢出未生效"行归战斗结算的结算明细。 +7. 战斗结束通知到达:全实例清空、容器回空,不跨到下一场战斗。 + +## P1 / P2 后置 + +后置不等于删除:以下条目保留在案,复活任何一条都走本文修订流程。 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 刷新、并存两类合并策略的首批内容行 | 语义已定义、容器已承载;MVP 四行全用叠加,这两类暂无实际内容,首批上线时随批补验收 | +| P1 | 清图奖励含增益的授予路径 | 来源类别已预留;内容与档位归[奖励道具经济](奖励道具经济.md)定稿 | +| P1 | 单体寻址扩展位 | 现行对敌效果一律全体共享;首个"只作用于其中一个敌人"的效果上线时给实例加目标字段 | +| P2 | 驱散 / 延时 / 转移接口 | 状态一旦生效,玩家没有任何手段摘掉、延后或挪给别人——省掉一整类界面复杂度是明确的设计决定;要加属于新增接口的修订,不是调参 | +| P2 | 敌人词条引用状态(免疫 / 抗性) | 预留位;随[敌人系统](敌人系统.md)的内容批裁决 | +| P2 | 随关卡成长的效果行 | 状态表是定义表、不是进度成长表;需要时走加表列的修订 | + +## 调参表 + +状态表为定义表,键 = 状态标识;已锁数值以 [registry 的 status_effect 条目](../../../registry/entities.yaml) 为准,四行数值全部 provisional。 + +| 参数 | 取值域 | 现行值 | 说明 | +|---|---|---|---| +| attack_up 幅度 | 百分比 [−100,100] 且非 0 | +50(provisional) | 增伤;当量锚的参照对象(最低档主角增益) | +| defense_up 幅度 | 百分比 [−100,100] 且非 0 | −30(provisional) | 减伤;叠满两层 −60 个百分点 | +| ambush 幅度 | 固定值 ≥ 1 | +3(provisional) | 伏击;量纲定义见[敌人系统](敌人系统.md) | +| weaken 幅度 | 百分比取值域 [60,85],取负生效 | −65(provisional) | 削弱;须过"标中旗锚"对照 | +| 四行初始剩余次数 | 整数 [1,99] | 1 / 1 / 1 / 1(provisional) | 一次性语义;拉长 = 恢复跨轮延续、规划变简单 | +| 四行叠层上限 | 整数 [1,16] | 2 / 2 / 16 / 16(provisional) | 仅叠加策略消费;调低 = 重复奖励更容易变溢出 | + +非调参的冻结项:三类合并策略语义、两种量纲语义、来源类别枚举、"先兑付后衰减"时序、拒绝原子性、零随机——改动走本文修订流程,不走调参。 + +联动纪律:增伤与削弱是当量锚的两端;减伤与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的承伤预期联动;削弱的单轮层数上限受[行动经济](../排雷循环/行动经济.md)的每轮行动点约束。这些联动值禁止独立调参,修订须重跑锚对照并同步 registry。 + +## 验收标准 + +- 容器寿命可答:战斗开始时为空;除战斗结束清空外没有任何入口能清空容器;战斗未开始或已结束时的授予一律被拒且容器不变。 +- 三向同构:主角增益与敌方两类效果共用同一套受理、合并、倒数、清除语义,不存在第二套计时逻辑。 +- 授予即生效:状态发入当轮结算即兑付第一次,无"待生效"中间态。 +- 只记账不去重:同一事实被转化两次授予,入账两层——去重责任在战斗结算。 +- 叠层不减钟:叠加只加层数,剩余次数保持首次授予定下的轨迹不变。 +- 满层拒绝原子且留痕:叠满后再授予返回失败、容器逐字不变;结算明细多一行"溢出未生效"(含来源)。 +- 先兑付后衰减:每轮结算恰做一次衰减,归零实例当轮移除;停手轮、弃图刷新轮照常衰减。 +- 合成不收口:容器输出的有效值恒等于层数 × 行值,越出百分比域不封顶不保底;地板在战斗结算侧。 +- 快照抗重载:已授予实例的数值在战斗中不受配置表重载影响,只影响后续授予。 +- 确定性回放:同一授予序列驱动两个独立容器实例,生效清单(含排列顺序)与衰减轨迹逐项相同。 +- 表实一致:配置表字段与 registry 的 status_effect 条目逐字段一致。 + +## 待拍板 + +以下条目存在缺口或尚未闭合的裁决;本系统不自行裁决,逐条登记。 + +| 条目 | 内容 | +|---|---| +| 叠层不续命的读感 | 同种状态叠层只加层数、剩余次数不动("重复拿同款不续命")。旧体系把这条登记为试玩证伪项(配套教学口径"同轮拿满优于跨轮叠"),实测是否读得懂、要不要改成叠层顺带续命,尚未执行、尚未裁决 | +| 削弱档位的最终数值 | 削弱取值域 [60,85] 与投值 −65 来自旧体系裁决;"标中旗必须比随便挖一格更值"的当量终值由[战斗结算](战斗结算.md)与[奖励道具经济](奖励道具经济.md)共裁,尚未闭合 | +| 单体寻址的接口扩展位 | 对敌效果现行一律全体存活敌人共享一份层数;将来若要"只削弱其中一个",需要给实例加目标寻址字段——扩展位已预留,首个单体效果上线时补列,并随之裁决归集与呈现语义 | +| 空刷新的可见性 | 刷新类策略在剩余次数已满时再授予是合法空操作(返回成功、无任何变化),与"溢出不静默吞"的诚实原则存在张力;MVP 无刷新类内容行,首批刷新行上线时随批裁决 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/战斗循环/奖励道具经济.md b/design/gdd/systems/战斗循环/奖励道具经济.md index 7f451d32..4d9bb607 100644 --- a/design/gdd/systems/战斗循环/奖励道具经济.md +++ b/design/gdd/systems/战斗循环/奖励道具经济.md @@ -1,3 +1,284 @@ # 奖励道具经济 +> 一句话:奖励产出、道具库存与使用窗口 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/b4-reward-item-economy.md + +## 设计目的 + +奖励道具经济是战斗域的奖励层:挖开的格子给什么、值多少、什么时候发、发到哪去,由它统一裁决。世界观上,奖励是前人探险者遗落在地牢里的物件——玩家在淘东西,不是在领系统发放的补偿。它守住三件事:每张图的每格都有货可淘(结构保证,不靠逐次掷运气);好东西留给会规划的人(可选类道具是整个关卡的资产);发出去的每一样都能在结算明细里指回挖开的哪一格。缺了这一层,挖格没有收益语言,"扫雷攒因、战斗结果"的兑现就断在最后一环。 + +## 系统范围 + +边界这样划:本系统管"奖励是什么、身份怎么摇定、怎么入库、玩家什么时候能用";发奖与兑付的编排归[战斗结算](战斗结算.md),增益本体归[增益状态](增益状态.md),画成什么样归[HUD 框架](../表现与支撑/HUD框架.md)。本系统零界面、除摇号外零随机:同一串操作驱动两个实例,结果逐位相同。 + +负责: + +| 负责 | 说明 | +|---|---| +| 奖励类型封闭枚举 | 五种类型(三种即时、两种可选);表里出现清单外的类型,数据加载直接拒绝 | +| 装板期身份预分配 | 每张图装上时一次摇定全部格子身份与清图身份;只读、无重摇 | +| 奖励表与奖励配置表 | 两张数据表的承载归[数据配置](../表现与支撑/数据配置.md),内容由本系统回填 | +| 可选类供给 | 战斗首件保证加逐图递减注入;另有按板保底断言(现行默认关闭) | +| 关卡域库存 | 伤害道具与强效治疗包的背包:入库、查询、窗口选用消耗、关卡末清空 | +| 窗口数据面 | 库存投影与"现在用有没有效果"的可用性预判组装;窗口本身的编排归战斗结算 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 结算段序与逐行兑付编排 | [战斗结算](战斗结算.md) | +| 增益的叠层、衰减与时限 | [增益状态](增益状态.md) | +| 敌人数据、目标顺位与血量查询 | [敌人系统](敌人系统.md) | +| 棋盘侧的奖励资格事实 | [排雷玩法](../排雷循环/排雷玩法.md)(经战斗结算转化,两系统无直接接口) | +| 辅助道具的背包与使用 | [辅助道具](../排雷循环/辅助道具.md) | +| 节点奖励与关卡大奖励 | [关卡节点地图](../冒险循环/关卡节点地图.md)与[冒险结构](../冒险循环/冒险结构.md) | +| 数值投值与曲线 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| 表结构定义与加载机制 | [数据配置](../表现与支撑/数据配置.md)(本系统只回填内容) | +| 一切界面与呈现 | [HUD 框架](../表现与支撑/HUD框架.md) | + +## 在核心循环中的位置 + +``` +装板 ──(一次摇号定全图身份)──▶ 挖掘期(身份恒定可读,只揭晓不发奖)──▶ 轮末授予段 ──▶ 道具使用窗口 ──▶ 道具段 ──▶ 战斗段 +``` + +本系统横跨挖掘期与轮末结算的头部:装板时全图奖励身份一次摇定;挖掘期只揭晓身份,轮末授予段(结算里逐格发放奖励的段落)把当轮拾取兑现——即时类当场生效,可选类进背包等玩家在窗口里挑时机。授予段与窗口之后的段序编排归[战斗结算](战斗结算.md)。 + +## 核心规则 + +### 装板期一次摇号:每格必有货,身份绝不翻悔 + +每张雷图装上时——玩家挖第一下之前——本系统对这张图做且只做一次摇号(像开奖一样一次摇定全部身份):按固定顺序给图上所有够格出奖励的格子逐一摇出各自带什么,同一次摇出清图奖励(开完全部安全格时发的那份),写进这张图的身份映射表(哪格带什么货的对照表)。 + +随机只发生在这一次摇号里:之后挖到哪格只是揭晓早已定好的身份,发奖、用道具都不再掷任何骰子。"每格必有货"因此是结构保证——不存在逐次重掷,也不存在查询时现算。部分奖励行的威力是区间值,具体数值也在这次摇号里一并摇定,之后恒定不变。 + +够格出奖励的是挖格事件里带奖励资格事实的安全格;开局初始展开白送的格子恒不带货(见[排雷玩法](../排雷循环/排雷玩法.md))。没挖开的格子在界面上不显示里面是什么——这是[不做清单](../../05-不做清单.md)的裁定;结构上身份已定、随时可查,预读类道具桥接的边界登记于待拍板。 + +| 摇号纪律 | 含义 | +|---|---| +| 恰一次 | 新图装好后、开挖前摇一次;已摇过的图再调摇号直接拒绝 | +| 专属随机流 | 摇号消费一条名为 reward_roll 的专属随机数流,与其他系统的随机互不干扰;同种子同操作序列必然摇出同一张身份表,可逐位回放 | +| 只读无重摇 | 映射就绪后只读;"重摇一下"的接口不存在,要加就是修订本文档,不是调参数 | + +``` +装板 ──▶ 一次摇号(格子批 + 清图批尾)──▶ 只读映射(同图跨轮不变) +换图或战斗结束 ──▶ 映射随之失效:未拾取的身份一并丢弃,不发奖、不进结算 +``` + +举证:本节为流程与状态规则,无计算。 + +### 两级奖励:即时类当场兑现,可选类入包择时 + +奖励系统发出的一切只从五种类型里出,按交付方式分两级:即时类在发奖那一刻当场兑现,不进背包、不用玩家选,默认占大头;可选类更强,先放进关卡背包,由玩家在道具使用窗口自己挑时机用,占小头。玩家看到的包装是"前人探险者的遗落物";宝箱一类呈现只绑定可使用道具类奖励(归 HUD 框架)。 + +| 类型 | 级别 | 玩家拿到什么 | 兑付方式 | +|---|---|---|---| +| 临时增益 | 即时 | 一层增伤或减伤 | 授予段当场挂进[增益状态](增益状态.md)的容器,只活当次结算;叠层已满则这份奖励不生效 | +| 群体伤害 | 即时 | 全体存活敌人各吃一笔固定伤害 | 当场逐个兑现,受击即死;场上没有存活敌人则零兑付 | +| 小额治疗 | 即时 | 主角小额回血,不超上限 | 当场回血;满血时零兑付 | +| 伤害道具(俗称"刀") | 可选 | 更强、可囤可择时的伤害件 | 入关卡背包,窗口选用后在道具段按固定顺位打敌 | +| 强效治疗包 | 可选 | 稀缺的强治疗 | 入关卡背包,窗口选用回血;满血时禁选、不消耗 | + +设计意图:可选类数量少但更强;治疗整体供给变少、决策价值变高——治疗是稀缺奖励。类型清单是封闭的:想加第六种类型等于修订本文档,不是调参数。 + +凡"发了但没生效"——增益挂满层、满血捡到即时治疗、场上无敌可打——一律在结算明细里明写一行"奖励未生效",不给任何折算补偿,也不静默消失。把拾取的奖励改成即时生效同样在禁止之列:绕过轮末结算的统一兑付,玩家就指不出"这个果是哪步因结出来的"。 + +举证:本节为类型枚举与兑付语义,无计算。 + +### 道具使用窗口:当轮拾取当轮可用,一次只选一件 + +每轮结算发完全部奖励之后、增益减益结算之前,弹出道具使用窗口:背包里有可选类道具时,玩家至多选用一件用掉,或者跳过。当轮刚捡的刀当轮就能用,不必等到下一轮。 + +``` +授予段(发放奖励,即时类当场兑付) + ──▶ 道具使用窗口(至多选一件,或跳过) + ──▶ 增益减益段 ──▶ 道具段(选用件在此生效)──▶ 战斗段 +``` + +| 窗口规则 | 含义 | +|---|---| +| 单件制 | 一次窗口至多选用一件;想一次用多件是改规则,不是调参数 | +| 可用性预判 | "现在用有没有效果"随窗口数据一起呈现:满血时治疗包直接禁选并说明原因;守卫判定归[战斗结算](战斗结算.md),禁选件不会被消耗 | +| 跳过恒合法 | 不选任何东西永远合法;背包为空时窗口可以整个不弹(呈现归 [HUD 框架](../表现与支撑/HUD框架.md)) | +| 用掉不可逆 | 选定即承诺:同一件道具不能选第二次;已选的刀即使出手时已无存活敌人,也照常消耗并记"已消耗未生效"行 | + +道具段排在战斗段之前,这造就了本作标志性的择时:先把敌人削进"死亡即不动手",敌人的重击就永远不会落地——"重击拍前用刀"由此成立。窗口里玩家的每次选择还会记入结算回放:重放一场战斗时,窗口选了什么和挖了哪格一样是输入的一部分。 + +举证:本节为窗口流程与守卫规则,无计算。 + +### 库存是关卡的资产:跨战斗延续,关卡末清空 + +可选类道具的背包属于整个关卡,不属于某一场战斗:换了地图、打完一场战斗,包里的东西都还在;整个关卡打完——无论输赢——才一次性清空。"囤刀待机、看准整个关卡里最好的时机再拍"因此成立:可选类道具是关内资产,不是"这场不花就没了"的消耗品。 + +| 库存规则 | 含义 | +|---|---| +| 来源可归因 | 每件道具记着从哪个格子的哪一轮捡到,结算能指回具体的因 | +| 数量无上限 | 稀缺感靠掉落权重控制,不靠背包容量;囤积是合法策略 | +| 清空恰一次 | 关卡结束由上层编排清空一次,重复清空被拒绝;清空伴随可见反馈(呈现归 HUD 框架) | + +``` +授予入库 ──▶ 在库(跨轮、跨图、跨战斗延续) + 窗口选用 ──▶ 已用(不可逆,仍可只读查询) + 关卡结束(无论输赢)──▶ 在库与已用全部清空 +``` + +战斗道具背包与辅助道具背包是两个正交容器:互不混装,寿命相同(都活到关卡结束)。辅助道具那一侧的背包与使用规则归[辅助道具](../排雷循环/辅助道具.md),本文只管自己这一侧。 + +举证:本节为生命周期规则,无计算。 + +### 恒定表值:刀是刀,增益是增益 + +道具的伤害与治疗是固定表值,不吃任何百分比增减益修正;增攻类增益只乘主角的基础攻击,永远不乘刀。增益叠得再厚,一把刀还是打它表上写的那个数——这条原则防的是乘法叠加失控,也让每个数字可学:玩家见过一次,就永远知道这把刀有多疼。 + +**结论**:道具伤害恒等于表值;治疗不超过血量上限;增攻只作用于基础攻击。 + +``` +伤害道具:D = power(恒定表值) +治疗: hp' = min(hp + power, max_hp) +增攻收益:基础攻击 × (1 + 增幅) ← 唯一消费面是主角先手攻击,不乘刀 +``` + +| 变量 | 含义 | 来源 | +|---|---|---| +| power | 道具威力,表值而非掷出的值 | 奖励表(区间行在摇号时已定具体值) | +| hp / max_hp | 主角当前血量与血量上限 | [敌人系统](敌人系统.md)的查询面 | + +满血使用治疗包被拒绝且不消耗——守卫拦在扣道具之前;缺血少于回复量时部分回复合法,超出上限的部分舍去。伤害道具的目标是固定顺位最前的存活敌人(顺位归[敌人系统](敌人系统.md)),一次性消耗。 + +### 清图奖励必发,首件保底,加载兜底 + +把一张图的雷全部清完时,结算发一份清图奖励:身份早在装板摇号时与格子奖励同批摇好。"清图奖励大于零"是数据加载时强制保证的——奖池里至少要有一行有实际价值的内容,不存在空奖。可选类道具的供给由机制保证而非格子概率:每场战斗开始时第一件必出,之后逐图递减注入。 + +| 清图奖励规则 | 含义 | +|---|---| +| 恒非空 | 清图奖池加载时校验至少一行有实际价值(伤害不小于 1,或增益引用非空),违例加载致命 | +| 可含即时增益 | 清图槽允许放增益行;兑付时若已满层,零兑付并记"奖励未生效"行(合法例外) | +| 图类型差异化是预留插槽 | 现行只有默认槽;按图类型换奖池的结构位已留,待[棋盘生成](../排雷循环/棋盘生成.md)的图类型词表落定后启用 | + +可选类供给:基础刀、进阶刀、强效治疗包三行不进格子权重池,由供给机制注入——每场战斗开始时第一件保底必出;此后每张新图按一个逐图减半的注入概率补充(初值 0.4、每图乘 0.5,概率永不为零)。标定目标是平均每场战斗约获得一件,全部 provisional,投值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)。 + +另有一道按板保底断言:一张图的资格格里带伤害道具的数量低于下界时,整批草稿弃用、沿同一条随机流重摇;重摇超过上限(默认 32 次)即致命报错——那说明权重配置坏了。现行下界默认为 0,即断言关闭:刀保底的语义已由首件保证取代,断言结构保留备用。 + +| 加载护栏 | 拦什么 | 命中后果 | +|---|---|---| +| 池空检查 | 每个奖励池至少一行权重为正 | 加载期致命 | +| 清图正当量 | 清图池至少一行有实际价值 | 加载期致命 | +| 增益引用有效 | 增益行的效果引用必须在[增益状态](增益状态.md)表里存在 | 加载期致命 | +| 零伤害后闸 | 保底关闭时,全池仍须至少一行活着的伤害道具行 | 加载期致命——防"零伤害世界"静默上线导致不可通关 | +| 供给闸 | 保底开启时,格子池须有威力不低于下界的活伤害行 | 加载期致命 | + +## 依赖与输出 + +本系统被两侧夹住:事实与数值从上游来,调用与呈现往下游去。下表就是删除任何一方时的影响面清单。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 奖励表与奖励配置表的 schema 承载与加载校验通道;本系统是两表的回填责任方 | +| 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 间接:挖格是否带奖励资格的事实经[战斗结算](战斗结算.md)转化而来,两系统无直接接口 | +| 上游 | [棋盘生成](../排雷循环/棋盘生成.md) | 图类型标签作清图差异化插槽的上下文(静态恒定) | +| 上游 | [增益状态](增益状态.md) | 增益行的效果引用指向其状态表(悬空加载致命);施加动作经战斗结算调用 | +| 下游 | [战斗结算](战斗结算.md) | 唯一调用方:摇号、授予、入库、查询、窗口组装、映射退役与库存清空全由其编排;窗口锚点挂在它的结算段序上 | +| 下游 | [敌人系统](敌人系统.md) | 伤害道具的默认目标取其固定顺位;道具段先于战斗段构成"先刀后重击"的窗口 | +| 下游 | [行动经济](../排雷循环/行动经济.md) | 其经济契约的对账以本系统的奖励表行值为原材料;换算与闭合验收归[战斗结算](战斗结算.md) | +| 下游 | [冒险结构](../冒险循环/冒险结构.md) | 关卡结构是库存生命周期的容器;"关卡结束"事件与关卡末剩余道具的处理归其域 | +| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 权重、档位、威力、池内容与保底注入参数的调参所有权(全部 provisional) | +| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 呈现义务归其:已开格与库存奖励身份常读、道具使用窗口呈现、结算明细四类行、清图奖励行强调、关卡末清空反馈 | +| 下游 | [辅助道具](../排雷循环/辅助道具.md) | 相邻:辅助道具的背包与使用归其管;辅助道具类别进入本系统掉落池属预留结构位(启用走修订) | +| 下游 | [教学引导](../表现与支撑/教学引导.md) | "拾取—囤刀—窗口选用"闭环与"关卡末库存清空"的教学口径来源 | + +负空间:本系统不订阅事件、不画界面、除摇号外不用任何随机数;何时调接口、按什么顺序调,全归[战斗结算](战斗结算.md)。 + +## P0 最小闭环 + +1. 战斗结算装上新图后、玩家开挖前调用一次摇号:全图格子身份与清图身份摇定,映射进入只读。 +2. 玩家挖掘:挖开的格子当场揭晓身份;已开格与背包道具的身份随时可读。 +3. 轮末授予段逐格发放:即时类当场兑现(增益挂状态、群体伤害逐个结算、小额回血),可选类入库并记来源。 +4. 清图轮兑付清图奖励,恒非空。 +5. 道具使用窗口弹出:玩家至多选用一件或跳过(当轮拾取当轮可用;满血治疗包禁选)。 +6. 道具段执行选用件:刀按固定顺位打敌、治疗包回血不超上限;战斗段"重击拍前用刀"成立。 +7. 战斗结束:板级映射退役,库存原样带入下一场战斗。 +8. 关卡结束(无论输赢):库存一次性清空并给出可见反馈,进入下一关。 + +## P1 / P2 后置 + +后置不等于删除:以下条目保留在案,复活任何一条都走本文修订流程。 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 清图池按图类型差异化 | 默认槽之外的结构位已留;待[棋盘生成](../排雷循环/棋盘生成.md)的图类型词表落定 | +| P1 | 未开格奖励身份的呈现深度(类别 / 档位 / 完整身份) | 结构前提已备(身份摇定即可查);与推理的界线未拍板,见待拍板 | +| P1 | 增攻增益行是否入默认内容池 | 内容决策,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| P1 | 单次结算道具获取上限(结构位,默认关) | 启用即限制、过低锁死胜局;归难度曲线与Boss 实测裁决 | +| P2 | 关卡末剩余道具折算或继承 | 折算点在关卡末;归[冒险结构](../冒险循环/冒险结构.md)(Alpha) | +| P2 | 窗口触发政策候选(仅可选件触发 / 常驻库存条非模态) | 现行有库存恒弹窗;待窗口摩擦实测数据 | +| P2 | 音频挂钩(拾取音 / 使用音 / 清图奖励音 / 负反馈聚合音) | 归[音频](../表现与支撑/音频.md),Alpha | +| P2 | 内容名录扩展(新奖励行) | 机制与内容分离;现行行集收窄,扩展随内容批 | + +## 调参表 + +两张表的承载归[数据配置](../表现与支撑/数据配置.md),内容由本系统回填,数值全部 provisional 归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);现行行值以 [registry 的 reward_table 与 reward_config 条目](../../../registry/entities.yaml) 为准。 + +奖励配置表(单行全局): + +| 参数 | 域 | 现行值 | 说明 | +|---|---|---|---| +| active_p0 | float [0,1] | 0.4(provisional) | 首件之后每张新图的注入概率初值;标定目标 = 平均每场战斗约得一件 | +| active_decay | float (0,1] | 0.5(provisional) | 注入概率逐图减半(0.4、0.2、0.1、…),永不为零;加难杠杆候选 0.6 | +| k_dmg | int [0,999] | 0(provisional) | 按板伤害保底下界;0 = 断言关闭(现行口径,刀保底语义由首件保证取代) | +| n_draft | int [1,999] | 32(provisional) | 保底重摇上限,超过即致命报错 | +| p_min | int [1,999] | 8 | 保底开启时格子池伤害行的威力下界(即默认最低刀威力) | + +注:奖励配置表现行登记还有一个档位过滤门限字段,其过滤对象随旧地形设计移除而失义,登记于待拍板,不列为现行可调项。 + +默认内容行(奖励表,值 provisional;五行的威力是区间,摇号时于下阶与上阶间一次摇定,区间中点即原定值——期望不漂移): + +| 奖励 | 类型 | 威力 | 池权重 | 档位 | 所在池 | +|---|---|---|---|---|---| +| 增伤增益 | 即时 | —(不消费) | 20 | 2 | 格子池 | +| 减伤增益 | 即时 | —(不消费) | 16 | 2 | 格子池 | +| 群体伤害 | 即时 | 4 | 16 | 1 | 格子池 | +| 小额治疗 | 即时 | 2–6 | 15 | 1 | 格子池 | +| 基础刀 | 可选 | 5–11 | 60 | 1 | 注入池 | +| 进阶刀 | 可选 | 10–22 | 30 | 2 | 注入池 | +| 强效治疗包 | 可选 | 6–18 | 10 | 2 | 注入池 | +| 清障炸药(清图槽专属的当场引爆) | 即时 | 25–55 | 1 | 2 | 清图槽 | + +清障炸药对全体存活敌各吃一笔大额伤害,不入库、不占可选类供给。格子池只出即时类(权重合计 67);可选类三行由注入机制承载(见核心规则)。 + +结构冻结(改动走本文修订流程,不走调参):五类封闭枚举与两级交付、装板期预分配且无重摇、恒定表值不吃修正、满层零兑付无折算、库存关卡域、窗口单件制、清图恒非空、除摇号外零随机。 + +## 验收标准 + +- 每格必有货:装板摇号后,每个资格格恰有一个奖励身份、清图槽恰有一个身份;同图跨轮查询结果逐字相同。 +- 恰一次与确定性:摇号对每张新图恰发生一次,重复调用被拒绝且映射不变;同一条随机流轨迹驱动两套实例,映射、库存与使用回执逐位相同。 +- 保底重摇与致命:按板保底开启而首稿不达标时,整批弃用、沿同流重摇,达标才提交;重摇超过上限时进程报错退出。 +- 首件保证:每场战斗开始后玩家必获得第一件可选类道具;此后注入概率按表值递减但永不为零。 +- 未生效可见:满层增益、满血即时治疗、无存活敌的群体伤害,各自在结算明细记"奖励未生效"行,零折算、零补偿。 +- 满血守卫:满血时强效治疗包在窗口禁选;缺血时使用回血不超上限,且道具被消耗。 +- 窗口纪律:一次窗口至多选用一件;跳过恒合法;已选件在无存活敌时照常消耗并记"已消耗未生效"行;同一件不能选用第二次。 +- 库存生命周期:战斗结束与换图都不动库存;关卡结束(无论输赢)一次性清空在库与已用件;清空后一切入库与使用请求被拒绝。 +- 恒定表值:同一件伤害道具在有无增攻增益下打出的伤害相同;增攻只改变主角基础攻击的计算结果。 +- 加载护栏:池空、清图池无正当量、增益引用悬空、全池无活伤害行——任一命中即加载报错中止;默认内容加载通过。 +- 类型封闭:表里出现五类之外的类型或未知池标签,加载拒绝。 +- 表实一致:两张数据表字段与 registry 的 reward_table / reward_config 条目逐字段一致。 + +## 待拍板 + +以下条目存在冲突、缺口,或已因设计变更失去原义;本文不代为裁决,逐条登记。 + +| 条目 | 现状与失义原因 | 建议归属 | +|---|---|---| +| 奖励预读与推理的边界 | 预读允许到什么深度未定:[不做清单](../../05-不做清单.md)裁定未开格不显示奖励身份、允许恢复推理原料类道具;现役预读道具探宝罗盘(预读 3×3 窗口内未开格的奖励身份,归[辅助道具](../排雷循环/辅助道具.md))为窄域,更深的呈现(未开格身份常显等)与推理保护之间的界线待拍板 | [辅助道具](../排雷循环/辅助道具.md)定稿批与[HUD 框架](../表现与支撑/HUD框架.md) | +| 雾格相关定价约束三条失义 | 旧体系三条定价约束——雾内档位下界、清图奖励锚随雾成本上浮、雾板净当量优势带上界——随雾格于 2026-09-14 从设计中移除(见[不做清单](../../05-不做清单.md))整体失义;奖励配置表的档位过滤门限 t_fog_min(登记默认 2)过滤对象随之消失。清图锚是否需按图类型或难度上浮、优势带上界是否重建,均未定 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) 调参批 | +| 速杀退化预警 | 战斗结束时未开资格格占比过高即警:供给过剩使战斗提早结束,奖励身份零发放,奖励系统饿死自己的高光时刻;阈值与联动调参未定 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| 窗口摩擦预警 | 窗口跳过率、单次结算平均明细行数未设阈值;结构性缓解已内置(库存只收可选类、窗口单件制),保留观测 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| 连锁批量授予的溢出吸收 | 一条大连锁一次给出大量奖励资格,超出增益叠层上限时如何处理(折算、顺延或显式接受)未定;与[排雷玩法](../排雷循环/排雷玩法.md)待拍板同源 | [战斗结算](战斗结算.md)与[增益状态](增益状态.md)条目化 | +| 关卡末剩余道具的折算或继承 | 未选用件在关卡末直接清空,是否改为折算回复或继承下一关,未定(Alpha) | [冒险结构](../冒险循环/冒险结构.md) | +| 窗口触发政策 | 现行有库存恒弹窗;"仅可选件触发""常驻库存条非模态"两个候选待窗口摩擦实测后裁决 | [HUD 框架](../表现与支撑/HUD框架.md) | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/战斗循环/战斗结算.md b/design/gdd/systems/战斗循环/战斗结算.md index 75aacd5e..4bfab720 100644 --- a/design/gdd/systems/战斗循环/战斗结算.md +++ b/design/gdd/systems/战斗循环/战斗结算.md @@ -1,3 +1,279 @@ # 战斗结算 +> 一句话:轮末结算的编排与逐行兑现 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/b1-settlement.md + +## 设计目的 + +玩家在雷图上做的每个决策——挖开的格、插中的旗、踩到的雷——都不会立即生效,而是等轮末由本系统逐行兑换成战斗结果。战斗结算是战斗域的编排与结算中枢:每轮怎么收场、收益怎么折成数值、胜负怎么判定,全部由它编排和裁决。[核心循环](../../01-核心循环.md)里那句"自动战斗不是过场,是阅卷"说的就是它——每一行结算都能指回玩家刚才的哪一步棋。 + +它还是战斗域内唯一的跨系统调用发起方:敌人、状态、奖励、棋盘各系统彼此不直接调用,一切编排从这里走。没有这个枢纽,扫雷攒下的因没有兑付面,战斗的果也无法归因。 + +## 系统范围 + +边界这样划:本系统管"编排与兑现"——从轮末触发到胜负判定的每一步,以及把扫雷事实折算成战斗数值的全部口径。事实怎么产生归[排雷玩法](../排雷循环/排雷玩法.md),花多少钱归[行动经济](../排雷循环/行动经济.md),数值表本体归[数据配置](../表现与支撑/数据配置.md),画成什么样归[HUD 框架](../表现与支撑/HUD框架.md)。 + +负责: + +| 负责 | 说明 | +|---|---| +| 轮次编排 | 战斗开始序列、每轮七段结算、五种出口分发(继续 / 换图 / 挖掘期刷新 / 战斗结束 / 关卡结束) | +| 结算触发与段序 | 轮末自动触发一次整轮结算;七段顺序为冻结结构,改动走文档修订而非调参 | +| 明细流水协议 | 结算中的每件事逐行留档并标注来源,是呈现、回放对账、数据导出共读的唯一数据源 | +| 收益对照表 | 一张效果档位对照表归一全部收益的折算口径(详见核心规则) | +| 伤害与治疗边界 | 修正池合成与封顶、溢杀丢弃、治疗封顶、死亡判定时机 | +| 跨系统调用唯一发起方 | 战斗域内对敌人 / 状态 / 奖励 / 棋盘的调用只从本系统发出 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 棋盘事实的产生与棋盘面规则 | [排雷玩法](../排雷循环/排雷玩法.md) | +| 行动点价目、停手与刷新扣费 | [行动经济](../排雷循环/行动经济.md) | +| 棋盘怎么生成 | [棋盘生成](../排雷循环/棋盘生成.md) | +| 单位血量递减、行动环与存活判定 | [敌人系统](敌人系统.md) | +| 增益/减益状态的容器、叠层与效果实例 | [增益状态](增益状态.md) | +| 奖励行值、权重档位与库存内容 | [奖励道具经济](奖励道具经济.md) | +| 关卡序列、关卡大奖励与失败 | [冒险结构](../冒险循环/冒险结构.md) | +| 界面呈现与结算动画 | [HUD 框架](../表现与支撑/HUD框架.md)与[战斗表现](战斗表现.md) | + +## 在核心循环中的位置 + +``` +挖掘期:玩家挖格 / 插旗 / 停手 ──(事实流 + 账本扣费)──▶ 战斗结算(轮末七段兑现)──▶ 胜负 / 换图 / 冒险推进 +``` + +本系统站在"扫雷结束、结果揭晓"的那一段:挖掘期它只安静缓冲[排雷玩法](../排雷循环/排雷玩法.md)上报的事实流,不做任何兑付;轮末把这一轮攒下的因逐行兑现成战斗的果。再往下游,胜负去向交[冒险结构](../冒险循环/冒险结构.md)接手,明细交[HUD 框架](../表现与支撑/HUD框架.md)呈现。 + +## 核心规则 + +### 轮末七段结算:一轮从收场走到判定 + +玩家行动点花完、主动停手,或开完整张图时,[行动经济](../排雷循环/行动经济.md)宣布本轮结束,本系统随即自动发起一次整轮结算。结算严格按七段固定顺序执行;核心相对次序"增益减益先于道具、道具先于战斗"不变——先合成修正再动刀,任何结局都能归因。 + +``` +① 授予段 → ② 道具使用窗口 → ③ 增益/减益段 → ④ 道具段 → ⑤ 战斗段 → ⑥ 衰减段 → ⑦ 判定段 +``` + +| 段 | 干什么 | +|---|---| +| ① 授予段 | 把挖掘期缓冲的事实分批兑换:踩雷、奖励格、旗判定、清图奖励(详见授予段一节) | +| ② 道具使用窗口 | 全流程唯一玩家输入点:从库存至多选一件道具,或跳过 | +| ③ 增益/减益段 | 把主角与敌人身上的活跃效果一次性合成本结算的修正池(同侧百分比修正的加总桶) | +| ④ 道具段 | 执行窗口选中件:伤害道具按恒定表值打顺位最前存活敌;治疗包按表值回复 | +| ⑤ 战斗段 | 主角先手攻击一次,随后敌人按行序逐个还手(详见战斗段一节) | +| ⑥ 衰减段 | 移除到期的临时效果;每轮恰好一次,含末轮——清图奖励先兑付、效果后衰减 | +| ⑦ 判定段 | 先判主角倒下(负),再判敌人清空(胜),都不满足则继续下一轮 | + +结算本体是纯逻辑步骤流:零随机、零界面依赖、禁止动画等待。触发只读行动经济的相位读数与轮末标记,这条消息有棋盘路径和停手路径两个发射源,到达先后不承载语义。这些性质共同保证结算完全可回放:同样的种子、同样的事件序列加窗口选择序列,跑出的步骤流逐行相同——录像回放与断言复测都建立在它上面。唯一的随机例外是战斗开始时掷骰定敌方实际数量,它发生在结算步骤流之外。 + +举证:七段为流程编排,无计算;段序常量存配置表,加载时校验与定稿顺序完全一致,不一致拒绝启动。 + +### 明细流水:每一行都能指回你刚才的哪一步棋 + +结算过程中每一件事都写一行明细,每行标注来源——哪个安全格、哪面旗、哪颗雷、清图奖励。这份流水是结算明细屏(玩家逐行查看决策兑现结果的界面)的数据源,也是回放对账与数据导出共读的唯一契约。行型封闭为 13 类,不允许私自增加。 + +| 行型 | 什么时候写 | +|---|---| +| 效果行 | 增益/减益段每条效果一行:本次授予贡献值与池合成值分列,防误读 | +| 伤害行 | 每次伤害一行:目标、伤害分量、修正终值、击杀标记 | +| 治疗行 | 治疗生效一行:封顶后的真实回复量 | +| 道具行 | 道具入库或生效一行 | +| 溢出未生效行 | 踩雷超出伏击上限,超出的每颗一行 | +| 奖励未生效行 | 满层拒收、满血治疗等合法例外一行 | +| 已消耗未生效行 | 道具消耗了却没产生效果(防御分支) | +| 使用被拒行 | 满血选用治疗包被窗口拒绝 | +| 标旗未中行 | 旗插空的零值归因行,每颗雷只记一次 | +| 蓄力行 | 敌人本拍蓄力不动手(攒下一击)时记一行 | +| 衰减行 | 到期临时效果移除一行 | +| 判定行 | 胜 / 负 / 继续各一行;终局判定行同时是胜负画面的数据锚 | +| 高光行 | 完美排雷成立时一行,只记实际有效兑付 | + +每行还携带公共字段:来源类别、来源格、轮次、显示名、数值,以及可空的高光标记(用于强调标中旗、清图奖励这类值得高亮的结果)。没生效也要留痕:四类"未生效 / 被拒"行如实记录合法例外,呈现时聚合计数,不逐行刷屏。任何一行找不到来源即断言失败——宁可报错,也不让"合并到看不出来源"的呈现混过数据层。 + +举证:本节为行协议约定,无计算。 + +### 收益对照表:所有收益共用同一把尺子 + +挖格给主角增益、标旗给敌人削弱、踩雷给敌方强化、清图给奖励——来源不同、形态不同,但玩家必须能回答"挖这一格值不值",所以全部收益用一张效果档位对照表归一换算。折算单位是当量:1 当量等于 1 点主角生命的期望净变化。这张表是[行动经济](../排雷循环/行动经济.md)五条经济契约第一条"单一当量"的载体;本系统是全部五条契约的唯一对账责任方(契约本体见该文档,对账现状见「待拍板」)。 + +**结论**:单一线性换算全源共用,禁止分源改率;百分比效果按"每个结算的瞬时当量"口径折算。 + +``` +flat 与道具类(伤害道具、治疗、伏击): E = 表值本身 +percent 类(每结算、每层): E = |层数 × 行值| ÷ 100 × 参考敞口 +完美排雷的清图奖励: E = 奖励表值 × 完美乘数 ÷ 100 +``` + +| 变量 | 含义 | 现行值 | +|---|---|---| +| E | 效果折算当量(主角生命点) | — | +| 参考敞口 | 折算百分比效果所用的代表性伤害敞口,配置值 | 12(provisional) | +| 层数 × 行值 | 单条效果的叠层数与行值,读[增益状态](增益状态.md)的实例数据 | 行值归该系统 | +| 完美乘数 | 完美排雷给清图奖励的乘数,配置值 | 200,即翻倍(provisional) | + +### 授予段兑付:挖到的、标中的、踩到的、清掉的各归各账 + +授予段把挖掘期缓冲的事实分三批兑换,每格受理、每雷转化、每旗判定恰好一次。踩雷的兑换产物叫伏击:玩家踩到的雷变成敌人的先手强化,敌人在本结算还手时攻击附带额外伤害。清图批的兑付发生在道具使用窗口之前,所以清图奖励里的道具当轮就能选用。 + +| 批 | 兑付 | +|---|---| +| 挖格批 | 踩到的雷逐颗转化为伏击;带奖励资格的安全格按类别分流(见下表) | +| 旗判定批 | 标中则敌方削弱当轮生效,每颗雷的资格只兑一次;标空则零兑付,只记"标旗未中"归因行 | +| 清图批 | 清图奖励恰好发一次;完美排雷追加第二份同身份兑付 | + +| 奖励类别 | 兑付方式 | 拒绝语义 | +|---|---|---| +| 增益 | 进入[增益状态](增益状态.md)的容器,本结算生效 | 叠层已满时拒收,记"奖励未生效"行 | +| 即时全体伤害 | 当场对全体存活敌各扣表值生命 | 当场兑付,不入库存、不进窗口 | +| 即时治疗 | 主角按表值回复并封顶上限 | 满血时零兑付,记"奖励未生效"行 | +| 战斗道具 / 治疗包 | 入关卡库存 | 在道具使用窗口选用时兑付 | + +伏击有上限:本轮踩雷数超出上限时,只有上限内生效,超出的逐颗记"溢出未生效"行。伏击聚成一个池,本结算里多个敌人共享同一池值、互不消耗,且只活一轮、轮末清零。 + +标中资格认雷不认旗:兑付资格以雷格实例为键——拔旗重插不恢复、同一颗雷跨轮不重复兑付;换图后新雷是新实例,资格自然重置。同一面旗一直插在雷上,每轮都会重新上报标中,去重是本系统的职责。 + +完美排雷全有或全无:一张板零误标且至少标中一面旗,清图奖励加倍(现行倍数为翻倍,provisional)。完美计数从装板起算、换图重置;高光行只记实际有效兑付(首份加被接受的第二份),首份即零兑付则高光行不发。标中旗的兑付行自带高光标记,与完美排雷的独立高光行构成两个强制高光检查点。 + +举证:兑付数值全部读配置表,本节无新公式;完美乘数的入账换算见收益对照表一节。 + +### 战斗段与胜负判定:谁先动手、怎么扣血、怎么定胜负 + +战斗段是兑现的最后一刀。主角的基础攻击恒存在——这是项目拍板:若基线为零,百分比增益乘上去永远是零,增益系统就空转了。攻击力域 [1, 999]、0 于加载期拒绝,现行值 6(provisional)。顺序固定:主角先手攻击顺位最前的存活敌人(道具段的默认目标与之同源),随后按行序逐个存活敌人还手;每个敌人依次走"查攻击、结算伤害、推进行动环"三步且恰好推进一次,主角不在推进范围。主角中途倒下,剩余敌人全部停手,直接进判定段。 + +主角先手攻击由三个分量逐项取整后相加:基础分量(攻击力经增益修正,可被池封顶压到零)、伤害A、伤害B。后两者是挖掘期充能的附加伤害: + +| 充能池 | 累积时机 | 换算与上限 | +|---|---|---| +| 伤害A | 本轮每挖开一个安全格 | 每格表值,单轮封顶(现行每格 1、封顶 8,provisional;每格 0 即机制关闭) | +| 伤害B | 每面首次标中的旗(与削弱兑付同批判定、每雷只计一次) | 每雷表值,不封顶——行动点预算天然限界(现行每雷 2,provisional) | + +两池都是挖掘期累积、本结算战斗段一次性消费、轮末清零——跨轮零存量。三个分量各自查甲效表(伤害类型对敌方护甲类型的克制倍率表)后取整相加:克制乘 150%、无甲 100%、被对位克制 50%(现行矩阵,provisional)。主角增益只修正基础分量,充能分量不吃百分比修正。 + +**结论**:先合成、再取整、全程非负;溢杀丢弃、治疗封顶、死亡即时判定。 + +``` +敌方一次攻击 = floor( 裸伤害 × 主角防御乘数 × 敌方输出乘数 );伏击为后置加法,不进乘区 +乘数 = 1 + 池合成值 ÷ 100;池内加算、每池独立封顶 ±100 百分点 → 乘数域 [0, 2] +治疗量 = min( 当前生命 + 表值, 生命上限 ) +``` + +| 边界 | 规则 | +|---|---| +| 修正池封顶 | 同侧百分比修正加算后每池独立收口 ±100 百分点;乘数可为 0——敌人输出归零、主角本结算免伤,是合法设计态而非异常 | +| 零值伤害 | 合成后为 0 时不调扣血接口,改写零值伤害行——免伤与零输出必须可见 | +| 溢杀 | 一刀超出目标剩余生命的部分丢弃:不转移给下一个敌人、不存续、无负生命中间态 | +| 治疗 | 生命不溢出上限;满血选用治疗包在窗口即被拒、不消耗 | +| 死亡判定 | 生命归 0 即倒下;敌人受击即死;主角倒下战斗段立即短路;判定段先判主角、再判敌人(防御性次序) | +| 胜负 | 敌人全灭判胜;主角倒下判负;都不满足则继续下一轮 | + +举证:裸伤害与存活集由[敌人系统](敌人系统.md)供给,池合成值由[增益状态](增益状态.md)供给,表值由[数据配置](../表现与支撑/数据配置.md)供给。 + +### 轮次生命周期:换图、刷新、战斗结束与关卡收束 + +七段跑完,判定段给出方向,本系统据此推进战斗状态,并把结果发回上游: + +``` +判定段结果 + ├─ 继续(敌未清、主角活着)→ 通知"同图继续" → 下一轮开轮 + ├─ 换图(本轮清图)→ 旧板退役 → 生成新板 → 装板 → 奖励预分配恰一次 → 通知"换图" → 下一轮开轮 + ├─ 战斗结束(胜 / 负)→ 清理敌人与状态 → 发出战斗结束信号 → 休眠,等下一场战斗 + └─ 关卡结束(上层显式调用)→ 清空两个背包,给出可见反馈 +``` + +停手与耗尽收轮的回合恒为同图继续;换图指令只允许出现在清图轮,其他轮发换图属于程序错误、立即上抛。库存以关卡为界:战斗结束不清库存,战斗道具与辅助道具跨战斗延续;关卡结束时两个背包一次性清空,清空前先返回快照计数,作为"剩余道具随关卡结束清空"的可见反馈。 + +挖掘期刷新是玩家在挖掘中途主动换图,经[行动经济](../排雷循环/行动经济.md)扣费:扣费成功后按"旧板退役、生成新板、装板、奖励预分配恰一次"编排,本轮不打断——没有结算段、没有轮次结束。储备不足被拒是玩家决策的合法结果,不是编排错误。刷新图不发清图奖励,完美排雷计数随装板重置。 + +战斗开始按固定序列开张:关上配置热重载的闸门、打开增益状态容器、掷骰定敌方实际数量、生成敌人、装板并预分配奖励恰一次、发开轮通知。上一关的大奖励(如血上限提升)经战斗开始入参的覆盖值通道生效,内容归[冒险结构](../冒险循环/冒险结构.md)。 + +举证:本节为编排流程,无计算。 + +## 依赖与输出 + +本系统是战斗域的调用枢纽:对上游是全调用面,对下游供数据源。这张表就是删除任何一方时的影响面清单。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 结算配置表(段序、当量、封顶、充能与甲效参数)的承载与读取,本系统是回填责任方;战斗中热重载被闸门拒绝 | +| 上游 | [行动经济](../排雷循环/行动经济.md) | 轮末两字段消息的接收方;回发换图指令、结算完成与战斗结束通知;挖掘期刷新经它扣费;五条经济契约的对账责任方 | +| 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 订阅其三事件流(挖开格、旗判定、轮次结束);换图时调用装板与退役 | +| 上游 | [棋盘生成](../排雷循环/棋盘生成.md) | 换图时调用其生成接口 | +| 上游 | [敌人系统](敌人系统.md) | 单位接口全调用面:生成、查询、扣血、推进、默认目标、伏击授予、清场 | +| 上游 | [增益状态](增益状态.md) | 状态容器接口全调用面:开域、授予、读值、衰减、闭域 | +| 上游 | [奖励道具经济](奖励道具经济.md) | 奖励与库存接口:预分配、入库、投影、关卡末清库 | +| 上游 | [冒险结构](../冒险循环/冒险结构.md) | 战斗触发、遭遇上下文与主角入参覆盖值(provisional,MVP 冒烟直供) | +| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 明细流水是结算明细屏与道具窗口的统一数据源;未生效类行须带形状冗余防误读 | +| 下游 | [战斗表现](战斗表现.md) | 结算步骤流是战斗动画回放的脚本源 | +| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 五条经济契约的对账结论是其调参约束输入(对账现状见「待拍板」) | + +## P0 最小闭环 + +1. 战斗开始序列跑完(关闸门、开容器、掷骰定敌数、生成敌人、装板并预分配奖励、发开轮通知),进入第一轮挖掘期。 +2. 挖掘期本系统只缓冲事实流,不做任何兑付。 +3. 轮末自动触发七段结算,触发与事件到达序无关。 +4. 授予段三批兑现:雷转伏击、安全格按类别分流、旗兑削弱或标旗未中行、清图发奖励(完美翻倍)。 +5. 窗口段玩家至多选一件道具或跳过,选择序列记入回放。 +6. 增益合成、道具生效、主角先手加逐敌还手、衰减恰好一次。 +7. 判定段先主角后敌人:继续通知同图、清图换图续轮、胜负走战斗结束清理(库存不清)。 +8. 明细流水全程落行,供呈现、回放与导出。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 标错(控制失败)惩罚落地 | 惩罚方案未定案(见「待拍板」);当前"标旗未中"行只是归因痕迹,无惩罚 | +| P1 | 深度高光形态(标中旗即时动画、音画同步) | 数据面标记与当轮兑付已落,表现形态归[战斗表现](战斗表现.md)与美术 | +| P1 | 冒险侧真实供给接线 | 遭遇上下文与跨战斗生命供给在[冒险结构](../冒险循环/冒险结构.md)定稿前以入参直供 | +| P2 | 回放切点续玩 | 依赖[存档序列化](../表现与支撑/存档序列化.md)的快照能力实现 | + +## 调参表 + +结算用到的全部数值——当量、封顶、乘数、段序常量、充能与甲效参数——都存结算配置表,代码里零数值字面量;改数值就是改表回填。表值以快照进结算,战斗中途改表不生效。已锁字段与数值以 [registry 的 settlement_table 条目](../../../registry/entities.yaml) 为准。 + +| 参数 | 域 | 现行值 | 说明 | +|---|---|---|---| +| 参考敞口 | int [1, 999] | 12(provisional) | 当量折算的代表性敞口;变更须重跑全部对账 | +| 完美乘数 | percent {100, 200} | 200(provisional) | 100 为仅高光、无第二份;域外加载拒绝 | +| 伤害A每格 / 单轮封顶 | int ≥ 0 | 1 / 8(provisional) | 封顶 0 表示不封顶;每格 0 表示机制关闭 | +| 伤害B每雷 | int ≥ 0 | 2(provisional) | 无封顶,行动点预算天然限界 | +| 甲效矩阵 | percent | 克制 150 / 无甲 100 / 被对位克制 50(provisional) | 键集结构冻结,数值归调参 | +| 段序常量 | 固定七段 | 结构冻结 | 加载期恒等校验,违例拒绝启动 | +| 池封顶 | ±100 百分点 | 结构冻结 | 乘数域随之 [0, 2] | +| 取整方向 | 向下取整 | 结构冻结 | 单一规则,非调参项 | + +全部可调参数归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)所有(均为 provisional),且处于禁独立调参的联动网络中:每次调参须重跑收益对照表与五条经济契约对账。 + +## 验收标准 + +- 七段全序:任一轮结算的明细行按七段顺序排列;窗口段恒在案,零选择记跳过。 +- 触发与到达序无关:同一轮末的两条结束消息按任意先后驱动,结算步骤流逐行相同。 +- 每事实恰一次:每格受理、每雷转化、每旗判定恰好一次;重复投递不改变结果。 +- 伏击守恒:踩雷超出上限时兑付数等于上限,超出部分逐颗记"溢出未生效"行;多敌共享同一伏击池值。 +- 完美排雷:零误标且至少一面标中时第二份兑付恰一次并发高光行;出现误标或零标中则无高光;计数换图重置。 +- 窗口单件:一次提交多件只受理首件;满血治疗包被拒且不消耗;空库存记跳过。 +- 战斗段次序:主角先手后逐敌"查攻击、结算伤害、推进"各恰一次;主角倒下立即短路,剩余敌人不行动。 +- 数值边界:合成后零伤害不扣血、写零值行;溢杀丢弃不转移;治疗封顶不溢出;全程无负值。 +- 出口分发:先判主角倒下(负)再判敌清空(胜);停手与耗尽轮恒同图,清图轮才允许换图。 +- 关卡收束:关卡结束清空两个背包恰一次并返回清空前计数;战斗结束不清库存。 +- 可回放:同种子同输入两遍步骤流逐行相同;结算路径零随机、零界面等待。 +- 无来源即炸:每行明细都能指回一个来源事实;找不到来源即断言失败。 + +## 待拍板 + +以下条目存在缺口、对账未闭合或已因设计变更失去原义;本系统不自作裁决,逐条登记。 + +| 条目 | 现状与失义原因 | 建议归属 | +|---|---|---| +| 挖掘风险不等式对账破线 | 归档记录现行值链(防御增益时长 1、行值 −30、现行难度曲线)下两参考板形首版验算破线,多敌满配深度破线;破线已升格为曲线级约束,相关参数处禁独立调参联动网络;对账须在难度曲线调参批重跑 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md)提案,本系统闭合共裁 | +| 清图支配性保守地板缺口 | "推到底清图不吃亏"的对账未闭合:非完美板形的清图期望收益低于"挖完确定格就弃图刷新";已裁"清图非严格支配"为设计态,保守地板当量缺口仍在案;对账须在难度曲线调参批重跑 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md),奖励量级联动[奖励道具经济](奖励道具经济.md) | +| 对账输入的雾相关分量失义 | 原对账输入含雾成本负担比、雾板分层等分量,随雾格移除(见[不做清单](../../05-不做清单.md))失义;重跑对账时需以现行输入重建判据 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| 标错(控制失败)惩罚 | 惩罚方案未定案;落地前标空只判"不中",无额外后果 | 数值归[敌人系统](敌人系统.md),兑付归本系统 | +| 连锁批量奖励的溢出处理 | 一条大连锁给出的奖励超出叠层上限时如何处理未定(现行按显式接受、零补偿执行) | [奖励道具经济](奖励道具经济.md)与本系统条目化 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/战斗循环/战斗表现.md b/design/gdd/systems/战斗循环/战斗表现.md index 04d02905..f38b151e 100644 --- a/design/gdd/systems/战斗循环/战斗表现.md +++ b/design/gdd/systems/战斗循环/战斗表现.md @@ -1,3 +1,141 @@ # 战斗表现 -> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 B5) +> 一句话:战斗动画与演出(旧体系未单独成文) +> 状态:范围草案(待设计) +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,散见于归档索引) + +## 设计目的 + +战斗表现管的是"轮末结算怎么被看见":伤害数字、受击反馈、敌人退场、连锁演出。它不产生任何数值,只负责把战斗结算已经决定的事演出来。这游戏的卖点是"扫雷攒下的因,逐行兑现成战斗的果"——兑现若只是一瞬数字跳动,玩家就感受不到"我算对了"。 + +本文目前只做两件事:划清范围边界;收拢上游已经登记下来的呈现义务,作为将来的输入清单。动画风格、镜头语言、演出节奏一概未定,且须先过一屏样张才有资格定(见"前置美术测试是硬前置")。 + +一句翻译说明:旧体系把本系统概括为"结算画面 → 战斗动画、伤害数字"。战斗屏常驻双舞台裁决之后,结算不再是独立画面,本文按现行口径把范围理解为"在既有呈现上叠加动画密度"。 + +## 系统范围 + +边界这样划:战斗屏上"发生什么、摆在哪里、是什么意思"已经由两份现行文档定稿——屏级呈现形态归 [战斗屏 UX 规格 battle.md](../../../ux/battle.md),视觉基调与剪影色彩归 [美术圣经 art-bible](../../../art/art-bible.md)。本文只负责"这些东西怎么动",而且是排期靠后的打磨项(见 [不做清单](../../05-不做清单.md):战斗动画演出是 MVP 内的打磨项,一律排后)。 + +负责: + +| 负责 | 说明 | +|---|---| +| 动画与演出的设计 | 在既有呈现语义之上,设计受击、弹道、退场、连锁等动画的密度与节奏(类别见输入清单,方案未定) | +| 演出资产终稿 | 敌人受击反馈、死亡表现、顺位标记三类资产的终稿(数据面已由敌人系统锁定,程序化占位先行) | +| 一屏样张的组织 | 正式设计前的硬前置:用一张样张锁定角色剪影、动画方案、战斗空间 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 屏级呈现形态与呈现语义(五区布局、敌人卡、明细带、高光行) | [battle.md](../../../ux/battle.md) 与 [HUD 框架](../表现与支撑/HUD框架.md),本文只引用 | +| 视觉基调、剪影哲学、色彩与图标键契约 | [art-bible](../../../art/art-bible.md),本文只引用 | +| 结算逻辑与逐行流水本身 | [战斗结算](战斗结算.md) | +| 敌种视觉状态的数据面(哪个敌种有几态、什么姿态) | [敌人系统](敌人系统.md) | + +## 在核心循环中的位置 + +``` +扫雷段 ──▶ 轮末结算段(战斗结算逐行兑现)──▶ 冒险推进 + ▲ + └─ 战斗表现:贴在结算段上的动画层,不产生数值,只让兑现被看见、被归因 +``` + +战斗表现不是循环里独立的一段,而是贴在轮末结算上的呈现层。它消费战斗结算的逐行流水,把每行兑现演出来;挖掘期的棋盘呈现与本系统无关,归 HUD 框架与 battle.md。 + +## 核心规则(已确证的范围边界与已知约束) + +本系统尚未设计,本节只收现行材料能确证的边界与约束;其余问题见文末「待设计问题清单」。 + +### 不另起场景:在既有呈现上叠加动画密度 + +战斗屏是挖掘与结算两种形态共用的同一张屏:常驻双舞台(白话:战斗画面与扫雷图同屏常驻,像同一块屏上的两个舞台),结算期不切换场景,裁决与理由见 [battle.md 布局决策 1](../../../ux/battle.md)。所以战斗表现的工作不是另做一个战斗场景,而是在既有呈现上叠加动画密度与演出——这是本系统范围边界的第一条。 + +"发生什么"与"怎么动"因此分了工:敌人死亡是血条归零后灰化加碎裂退场、禁止瞬间消失,结算明细带逐行滚动,完美排雷与标中旗有高光行强调——这些呈现语义已由 battle.md 与 HUD 框架定稿,本文不复述。本文将来承接的只是其上的动画密度:受击反馈、弹道、退场动画等类别。 + +资产侧同理,这也是双舞台带来的管线约束:若舞台形态悬而未决,同一份角色资产可能因舞台不同而重画。现行解法是剪影跨舞台通用——角色剪影按"棋盘、结算画面与任一战斗舞台通用"设计,不为舞台未决问题付重画成本(art-bible §3.1)。 + +### 收拢上游已登记的呈现输入 + +以下条目在上游定稿或概念拍板时已登记为将来由战斗表现承接的呈现义务。本文只收拢成输入清单,不展开设计: + +| 输入 | 登记处 | 将来要做的 | +|---|---|---| +| 受击反馈 / 死亡表现 / 顺位标记 | [敌人系统](敌人系统.md)的资产需求下限三类(终稿归样张批,呈现语义已归 battle.md) | 终稿资产与动画兑现;死亡不得瞬消 | +| 敌种姿态资产定稿 | battle.md 意图线索映射目录(数据面已锁:首发两敌种,一态与三态) | 把已锁的姿态清单做成终稿资产 | +| 溢出未生效行的呈现 | [增益状态](增益状态.md)定稿时登记(数据源是[战斗结算](战斗结算.md)的明细协议) | 让这类行在演出中可读、不被吞掉 | +| 效果来源格的可读化 | 同上(候选形态:缩略图或格子高亮,坐标不直接呈现) | 把"效果来自哪一格"翻译成玩家可读的演出 | +| 坍塌显形的连锁动画 | [游戏概念](../../00-游戏概念.md)的概念层拍板——坍塌显形是[连锁展开](../排雷循环/排雷玩法.md)的玩家可见名,与音频方向同批配对登记 | 连锁展开触发时的连锁演出 | +| 高光兑现的演出强化 | 完美排雷与标中旗强调的机制及呈现位已由战斗结算与 battle.md 定稿 | 在既有高光行呈现之上加强演出密度 | +| 伤害数字 | 归档索引中本系统的旧范围一句话即含"伤害数字" | 落点未定:预告上格原则与"敌人不占格、兑现发生在战斗画面区"如何相容,见待设计问题清单 | + +### 前置美术测试是硬前置 + +正式设计本文之前,必须先做一次"战斗表现美术测试":用一屏样张(一张按候选方案画成的试验图)锁定角色剪影、动画方案、战斗空间三件事。这是旧体系评审登记的排期硬前置,不是建议;battle.md 也登记了该测试须按双舞台布局出样。样张未过,不启动任何终稿资产与动画设计。 + +两项相邻裁定已有结论,设计时直接继承:敌人卡在 battle.md 里先按卡片式起草,卡片式对站桩式留给样张裁决;art-bible 的图标键契约已冻结,动画设计不必等图标终稿。 + +### 演出服从信息与可读性 + +两条现行硬约束,将来任何动画方案都不得越过。其一,数字可读性高于氛围:挖掘期画面无杂音,动画不得遮挡数字、不得在挖掘期抢焦;结算期的色彩与能量走向以 art-bible 第 2 节为权威。其二,结算逐行兑现是信息载体:battle.md 已承诺不可整体跳过、只提供减动效选项(时长减半或直达终态,逐行兑现可加速不可省略),本文将来兑现其动画侧。 + +## 依赖与输出 + +| 方向 | 系统 / 文档 | 接口要点 | +|---|---|---| +| 上游 | [战斗结算](战斗结算.md) | 逐行流水与明细协议——演出时间轴的数据源 | +| 上游 | [HUD 框架](../表现与支撑/HUD框架.md) | 五区布局、战斗画面区(五区中的 B 区)演出区结构、敌人卡与明细带呈现语义——本文在其上叠加密度 | +| 上游 | [敌人系统](敌人系统.md) | 资产需求下限三类与敌种姿态数据面——数据已锁,本文出终稿 | +| 上游 | [art-bible](../../../art/art-bible.md)(现行权威) | 剪影、色彩、图标键契约、各阶段氛围——表现侧约束 | +| 上游 | [battle.md](../../../ux/battle.md)(现行权威) | 屏级呈现形态与呈现语义 | +| 协作 | [音频](../表现与支撑/音频.md) | 坍塌显形动画与音效方向系同批配对登记,将来对位设计(挂点未定) | + +## P0 最小闭环 + +MVP 不要求本文的闭环:不做清单把战斗动画演出列为 MVP 打磨项排后。MVP 期战斗的最低存在感由已定稿的呈现语义承载——受击闪白、死亡禁瞬消、高光行强调等已随 battle.md 与 HUD 框架落位,属于"会动但没演出"的状态。 + +本文正式开工的最小集合排在垂直切片(归档索引对本系统的里程碑登记口径):先过一屏样张,再把敌人资产下限三类的终稿替换程序化占位(白话:先用代码画的临时图形顶着,终稿后补),让已定稿的呈现语义动起来。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 输入清单各项的演出化:伤害数字、溢出行呈现、来源格可读化、坍塌显形连锁动画 | 依赖样张锁定的动画方案,逐项排期 | +| P1 | 高光兑现的演出强化 | 机制与呈现位已定,只欠密度 | +| P2 | Boss / 精英遭遇变体的专属演出密度 | battle.md 已有其呈现语义,动画密度后置打磨 | +| P2 | 减动效档的完整适配 | 选项已承诺,完整分档随演出定稿 | + +## 调参表 + +暂无本系统自有的参数。已定的呈现常量(如明细带尺寸、过渡时长)归 battle.md 与 [HUD 框架](../表现与支撑/HUD框架.md);本文将来新增的动画节奏参数随设计定稿再登记。 + +## 验收标准 + +待设计。方向性判据(供未来定稿参考): + +- 样张先于生产:一屏样张未过审,任何终稿资产与动画方案不得进入生产。 +- 挖掘期零打扰:结算演出只发生在结算期;挖掘期不因动画新增运动元素,数字可读性不受影响。 +- 因果可读:玩家看完一段兑现演出,能说出这一行结算来自他刚才的哪一步操作。 +- 死亡可辨:敌人死亡瞬间可辨识,不存在"敌人凭空消失"的观感。 +- 可访问:逐行兑现不可被整体跳过;减动效档下全部演出有时长减半或直达终态的通路。 + +## 待拍板 + +| 条目 | 内容 | +|---|---| +| 敌人卡形态 | 卡片式还是站桩式(无框立绘加底座)——battle.md 按卡片式起草并登记给样张裁决;本文的动画方案随之而定 | +| 样张验收标准未成文 | 美术测试只登记了三个锁定物(角色剪影 / 动画方案 / 战斗空间),尚无一份成文的验收标准可对照执行(可参照 art-bible 格子样张的成文验收做法),正式组织测试前须补 | + +## 待设计问题清单 + +1. 动画的技术载体:逐帧像素动画、程序化补间,还是混合——随样张锁定的"动画方案"一并裁决。 +2. 伤害数字画在哪、怎么叠:棋盘格上(预告上格原则的方向)还是战斗画面区,与逐行明细如何对应。 +3. 演出速度档位:逐行兑现的加速与跳过交互(约束:信息载体不可整体跳过)。 +4. 来源格可读化的形态二选一:缩略图还是格子高亮(登记时两者并列,未裁决)。 +5. 坍塌显形连锁动画与音效的挂点协同,安排在哪个批次合并设计。 + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档线索整合为范围草案(旧体系未单独成文) | diff --git a/design/gdd/systems/战斗循环/敌人系统.md b/design/gdd/systems/战斗循环/敌人系统.md index bffbd640..b2f7d195 100644 --- a/design/gdd/systems/战斗循环/敌人系统.md +++ b/design/gdd/systems/战斗循环/敌人系统.md @@ -1,3 +1,252 @@ # 敌人系统 +> 一句话:敌人数据、行为环、意图呈现 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/b2-enemy-system.md + +## 设计目的 + +敌人系统回答战斗里四个问题:对面是谁、有多强、接下来要干什么、怎么被打死。它同时管主角和敌人的数据面——双方共用同一套受伤与死亡的接口,所以它也是踩雷代价的收件人:惊动巢穴喂给怪物的每一分优势,最终都落在它管的血量上。没有它,惩罚没有落点、胜负没有主体、难度曲线没有施加对象。 + +它向玩家兑现三条承诺。威胁可推测:读怪物的姿态就知道它下一招要干什么。强弱有来处:它强是我踩雷喂的,它弱是我插旗拆的。越下越险:深层敌人更凶,是下探氛围的可见刻度。反向护栏只有一条——威胁绝不能是无源暗账,玩家说不出"它为什么变强、这一拳为什么这么重",就是本系统失职。 + +## 系统范围 + +边界这样划:本系统是战斗单位的"数据与语义层"——单位有哪些数值、行为怎么轮转、挨打之后状态怎么变,都归这里;什么时候结算、一笔伤害最终算多少,归战斗结算编排;增益层数存放在哪,归增益状态;画成什么样,归 HUD 框架与战斗表现。本系统编排被动:自己从不主动做事,零随机、不碰界面、不订阅事件,一切等战斗结算来调。 + +负责: + +| 负责 | 说明 | +|---|---| +| 单位数据与接口 | 主角与敌人共用的血量、存活、行为环指针;对外的"查状态"与"受动作"两组能力 | +| 两张单位表的定义与回填 | 敌人表与主角表的字段、取值域、表值回填(表本体的承载与读取归数据配置) | +| 行为环语义 | 拍的枚举、推进与死亡冻结规则、跨轮次跨图延续 | +| 目标顺位规则 | 敌方打谁、玩家与道具默认打谁的固定顺位 | +| 伏击词条量纲 | 每层伏击附加多少伤害、单轮授予上限的表值 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 结算编排与伤害消费(何时调用、伤害合成、死亡判定时机、护甲克制矩阵) | [战斗结算](战斗结算.md) | +| 状态层数的存放与衰减(伏击层池、削弱层池) | [增益状态](增益状态.md) | +| 奖励内容与掉落 | [奖励道具经济](奖励道具经济.md) | +| 棋盘规则(挖格、插旗、惊动巢穴等事实的发生) | [排雷玩法](../排雷循环/排雷玩法.md) | +| 遭遇构成(何时开战、坐标与数量怎么定)与跨战斗血量保留 | [关卡节点地图](../冒险循环/关卡节点地图.md) | +| 单位数值曲线与难度修饰 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| 呈现(线索映射清单、顺位与血条、受击与死亡演出) | [HUD 框架](../表现与支撑/HUD框架.md) 与 [战斗表现](战斗表现.md) | +| 配置表的 schema 与读取机制 | [数据配置](../表现与支撑/数据配置.md) | + +## 在核心循环中的位置 + +``` +战斗开始:战斗结算按遭遇坐标调本系统生成单位 ──▶ 每轮轮末结算:读拍兑付 → 受击 → 推进 ──▶ 敌全灭 / 主角归零,回流战斗结算判胜负 +``` + +敌人系统站在"战斗兑现"这一段的单位层。上游是战斗结算的编排调用,以及经它转化而来的棋盘事实(踩了雷、插了旗);下游回给战斗结算两样东西——胜负判定素材和带来源的伤害分量。 + +## 核心规则 + +### 主角与敌人共用同一套受伤与死亡规则 + +战斗场上恰有两类单位:主角一个,敌人若干。它们共用同一套"身体语义"——每个单位有当前血量与血量上限,挨打血量往下减,减到 0 即死亡。本系统只如实记账并提供查询;"这一下最终算多少伤害、何时算死"的裁决归[战斗结算](战斗结算.md)。主角血量归零是失败判定素材,敌人全部归零是胜利判定素材,判定本身同样归战斗结算。 + +单位的一生只有四态: + +| 状态 | 怎么进入 | 此时会发生什么 | +|---|---|---| +| 未上场 | 单位刚创建、还没开战 | 无任何作用,唯一出口是开战时被实例化 | +| 存活 | 开战时按表值(敌人)或血量入参(主角)生成 | 可被指定目标、按行为环出招、计入全灭判定 | +| 已死亡 | 血量归 0(判定时机归战斗结算) | 移出顺位、不再出招;不可逆(MVP 无复活);死亡记录保留只读可查 | +| 已消亡 | 战斗结束统一清场 | 逻辑失效:查询返回空、作用接口拒绝;唯一出口是下一场重新生成 | + +两条不变式贯穿始终:血量恒在 0 与上限之间;战斗内敌人只减不增。举证:本节为状态语义,无计算。 + +### 开战生成:主角数据行与一场 1–3 个同敌种单位 + +战斗开始时,编排方给出遭遇坐标(关卡序号 + 节点深度),本系统据此在敌人表里精确匹配一种敌种,把本战实际数量的敌人生成出来——每场战斗 1 到 3 个敌人,全部同种同属性,来自同一行表值;战斗中敌人只减不增,不做召唤、增援、分裂。主角同时以当前血量入参生成,血量越界(高于上限或不超过 0)整单拒绝、不留半实例。 + +生成拿到的是当时的表值快照:开战那一刻把数值抄一份,之后改表不影响已生成的单位。若数量或攻击基线配成了区间,由战斗结算用封闭随机流在开战时掷定一次后传入确定值——本系统自身始终零随机;掷定后整场持久,攻击基线不逐拍重掷(数字要可读)。 + +| 规则 | 含义 | +|---|---| +| 敌方效果对全体生效 | 场上敌人全同种,范围效果作用于所有存活敌人是天然兼容的默认;"只打某一个"的单体寻址暂不开放(见 P1) | +| 每个坐标只出一种敌种 | 敌人表按(关卡序号 × 节点深度)存放,同一坐标的行集内敌种唯一,违规加载期报错止动;同关随深度换敌种合法 | +| 主角数据行 | 主角战斗数值单独放一张全局单行表:生命上限、基础攻击力两字段(见调参表) | +| 基础攻击恒存在 | 基础攻击不许配 0(配置为 0 加载期拒绝)——零基线乘任何百分比增益恒为零,"胜利路径恒有"的保障从数据层杜绝死锁 | +| 先手攻击不是行为环拍 | 每次结算战斗段主角先手攻击顺位最前的存活敌人,这是固定动作;奖励侧的道具与增益是基础攻击之外的规划面伤害,归[奖励道具经济](奖励道具经济.md) | + +首发敌种共三种,名字是玩家可见专名:地精、熊地精、食人魔酋长(末者为首发关底 Boss)。 + +| 敌种 | 行为环 | 护甲类型 | 现行定位 | +|---|---|---|---| +| 地精 | 攻击(单拍环) | 无 | 首发杂兵;教学位节点固定 1 只 | +| 熊地精 | 攻击 / 蓄力 / 重击(三拍环) | 甲 | 首发主力;重击倍率 2 | +| 食人魔酋长 | 攻击 / 攻击 / 蓄力 / 重击(四拍 Boss 环) | 重甲 | 首发关底 Boss;重击倍率 2 | + +护甲类型(无 / 甲 / 重甲)与伤害类型的克制结算矩阵归[战斗结算](战斗结算.md),本系统只提供每个敌种的护甲类型数据。举证:生成与护甲为数据面规则,无计算。 + +### 行为环:敌人按排好的剧本轮流出招,走到哪一拍零随机 + +每种敌人有一条行为环——一份排好的出招剧本,"拍"就是环里的一格行动。战斗开始时指针指向环首,之后每轮轮末结算恰推进一拍:先把当前拍的招打出去,再走一格(先作用后推进);环尾回环首;跨轮次、跨雷图延续,除战斗结束清场外没有任何重置入口。全程零随机,走到哪一拍由结算次数唯一决定——这正是"读怪"可以学会的原因。 + +死亡即从环上摘除:轮到它之前被打死,本拍不出手、指针就地冻结(MVP 无复活,永久冻结);行动完成后才死,则这一拍已打出、也已推进。其余存活敌人照常轮转。同种敌人永远同拍——它们都从环首出发、每场结算各推进一次。主角没有行为环,对主角调用环接口一律拒绝。 + +每次结算内"读当前拍 → 兑付 → 受击 → 推进"的调用次序由战斗结算钉死:推进必须放在受击之后,次序颠倒就会读到下一拍。 + +| 拍 | 状态 | 语义 | +|---|---|---| +| 攻击 | 启用 | 对主角造成基线攻击点伤害 | +| 蓄力 | 启用 | 空拍不兑付——威胁的"预备动作",也是玩家的规划窗口;不兑付伏击 | +| 重击 | 启用 | 基线攻击 × 重击倍率 | +| 自防 / 强化 / 妨害 / 召唤 | 预留 | 配进表会被校验拒绝(加载期报错);启用走本文修订,不是调参 | + +举证:**当前拍 = 环序列按步数取模,行动完成后步数加一。** + +``` +当前拍 = 环[步数 mod 环长] 开战时步数 = 0(指向环首) +行动完成后步数 + 1 轮到前被杀 → 步数冻结(死亡即不动手) +``` + +### 伏击:每踩一颗雷,敌方全体多叠一层附加伤害 + +玩家挖开惩罚格(雷格在玩家侧的叫法,首发类型是怪物巢穴)就是惊动巢穴:敌方全体获得一层"伏击"——敌方侧的增益词条。一层伏击 = 敌人每次攻击类行为(攻击或重击)额外附加 3 点固定伤害,按主角血量点数计。伏击只活一轮:轮末结算清零,没有跨轮存量。单轮授予有上限(现行 4 层):上限内逐颗叠加,达到上限后多踩的雷不生效,但逐颗记一行"溢出未生效"结算明细——惩罚不静默蒸发。 + +上限 4 是对"单轮连踩 5–8 颗雷"灾难轮的反灾难护栏;单轮踩雷数天然受每轮行动点预算约束(现行 8 点),这是上限默认值的结构背景。上限配 0 表示该敌种免疫伏击:每颗雷都记明细、都可见、都无效。 + +| 细则 | 含义 | +|---|---| +| 附加是后置加法 | 伏击不进重击倍乘,倍率只乘基线伤害 | +| 蓄力拍零兑付 | 蓄力不出手、不读伏击层——本轮喂的伏击若逢敌人全是蓄力拍,一点不兑现(读怪的奖励) | +| 层池共享不消耗 | 同一次结算多个敌人读同一层数,不均分、不先到先得 | +| 当轮授予当轮兑付 | 授予发生在兑付之前:本轮踩的雷,若该轮有攻击拍,当轮就生效 | +| 溢出可见 | 生效层数 = min(当轮新踩雷数, 上限),其余逐颗记"溢出未生效"明细 | + +举证:**攻击拍伤害 = 基线 + 层数 × 3;重击拍伤害 = 基线 × 倍率 + 层数 × 3;蓄力拍恒为 0。** + +``` +攻击拍:伤害 = atk + 3 × L L = 当轮伏击层数(表值 3 provisional,量纲已定稿) +重击拍:伤害 = atk × 倍率 + 3 × L +蓄力拍:伤害 = 0 不读伏击层 +生效层数 L = min(当轮新踩雷数, 单轮上限) 溢出 = 雷数 − L,逐颗记明细 +``` + +验算(表值 provisional,读数见调参表):熊地精基线 9、倍率 2、4 层伏击的重击拍 = 9 × 2 + 12 = 30;若把伏击塞进倍乘会算出 (9 + 12) × 2 = 42——后置加法由此判别。 + +### 目标顺位与意图线索:打谁不用选,下一招靠看图推测 + +敌方一侧没有选择可言:所有存活敌人各自按当前拍作用于主角,主角是敌方唯一目标。玩家与道具一侧用固定顺位:单体效果默认打生成序最前的存活敌人,它死了顺延到下一个;范围效果打全体存活敌人,同样无需选择。场上只有一个敌人时,顺位与范围自然重合,是合法退化不是错误。顺位必须对玩家可读——"下一个被打的是谁"要能推测出来。 + +意图呈现走"视觉推测":界面不直接预告敌人下一拍的行为与数值——威胁靠看图读出来,它弓起背,下一拍就是重击。即将执行的一拍在挖掘期(玩家花行动点挖格的阶段)全程亮出;精确数字只在轮末结算明细里兑现。线索映射以敌种为键、每一局恒定、禁止重掷——一旦重掷,"读怪"就退化成"猜怪"。首发敌种最长三拍环,学习成本刻意压低。 + +本系统只锁下面这张数据面规格;线索映射清单与视觉规格归[HUD 框架](../表现与支撑/HUD框架.md),姿态与受击死亡演出归[战斗表现](战斗表现.md)。 + +| 规格 | 含义 | +|---|---| +| 图像与行为一一对应 | 同一敌种的同一行为恒同一视觉状态(如熊地精蓄力拍 = 弓背蓄力姿态) | +| 形态暗示强度 | 敌种长相承载强度档位与环长的直觉编码("大个子多半有重击"式) | +| 映射每局恒定 | 以敌种为键,跨局不重掷 | +| 数字只在明细 | 预告面是图像,数字面是结算明细 | +| 预告时序锁定 | 呈现的是即将执行的一拍,挖掘期全程可见;结算时不另播意图动画 | + +举证:本节为顺位与呈现数据面规则,无计算。 + +## 依赖与输出 + +本系统编排被动:全部调用集中在战斗结算,棋盘事实(踩雷、插旗)经它转化后才作用于单位;本系统零随机、零界面、零事件订阅。下表就是删除任何一方时的影响面清单。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [战斗结算](战斗结算.md) | 唯一编排调用方:开战生成、结算内查询/受击/推进的次序由它钉死;踩雷到伏击施加的转化(每颗雷恰一次)也由它编排 | +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 敌人表与主角表的 schema 承载与类型化读取;本系统是两表的回填责任方 | +| 相邻 | [增益状态](增益状态.md) | 伏击词条的量纲与作用域由本系统定稿并登记;层数容器与轮末衰减归它,层数由战斗结算读出后作参数传入——运行时零直接调用 | +| 下游 | [战斗结算](战斗结算.md) | 胜负判定素材(敌全灭 / 主角归零)与伤害分量(基线 + 伏击)的供给方;护甲克制矩阵归它 | +| 下游 | [奖励道具经济](奖励道具经济.md) | 固定顺位是道具伤害的默认目标规则;基础攻击恒在,奖励侧是基础攻击之外的规划面伤害 | +| 下游 | [关卡节点地图](../冒险循环/关卡节点地图.md) | 遭遇构成(何时开战、坐标与数量怎么定)归它;跨战斗血量是否保留归冒险循环裁决 | +| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 两表曲线数值与遭遇分布的调参所有权归它;难度修饰施加点在行值快照之前(MVP 零修饰) | +| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 线索映射清单、单位顺位与血条、敌方增益层数的呈现归它(引用不转述) | +| 下游 | [战斗表现](战斗表现.md) | 行为环视觉状态(蓄力姿态等)、受击与死亡表现的呈现归它(引用不转述) | + +对外接口只有两组能力:查状态(血量 / 当前拍 / 顺位 / 存活)与受动作(受击 / 推进 / 消亡)。什么时候调、按什么顺序调,全归战斗结算。 + +## P0 最小闭环 + +1. 战斗开始:战斗结算按遭遇坐标调本系统生成单位——读表快照实例化本战数量的敌人(指针指向环首),主角以血量入参生成。 +2. 挖掘期踩雷:事实经战斗结算转化为伏击施加——每颗雷恰一次、上限截流、溢出逐颗记账。 +3. 每轮结算:主角先手攻击顺位最前的存活敌人;每个存活敌人读当前拍兑付(攻击 / 重击附加伏击,蓄力空拍)。 +4. 受击上报、血量递减;归 0 即移出顺位、指针冻结(死亡即不动手)。 +5. 存活敌人各推进一拍(先作用后推进,环尾回环首)。 +6. 敌全灭或主角归零,回流战斗结算作胜负判定素材。 +7. 战斗结束:全部单位消亡、不跨战斗,下一场重新生成。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 预留行为拍(自防 / 强化 / 妨害 / 召唤)启用 | 拍枚举封闭——启用是本文修订,不是调参;排垂直切片 / Alpha | +| P1 | 敌种名录扩容与投放节奏 | 投放节奏是关卡命脉,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md);排垂直切片 / Alpha | +| P1 | 单体寻址("只打某一个敌人"的目标指定) | 首个单体效果上线时随批裁决归集语义与呈现 | +| P1 | 蓄力拍的音频前摇 | 读招的第二通道,垂直切片可选项 | +| P2 | 敌人图鉴 / 列表界面 | 首发名录学习成本低,名录扩容时再议 | +| P2 | 精英 / Boss 遭遇编码位 | 现表键结构没有编码位,改键随[关卡节点地图](../冒险循环/关卡节点地图.md)定稿强制核对(见待拍板) | + +## 调参表 + +配置表共两张,参数域如下;首发行值全部 provisional、曲线调参所有权归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md),已锁数值以 [registry 的 enemy 与 hero 条目](../../../registry/entities.yaml) 为准。 + +敌人表(按关卡坐标存放,每坐标行集恰一敌种): + +| 参数 | 取值域 | 现行值 | 说明 | +|---|---|---|---| +| unit_count | [1, 3] | 1(provisional) | 遭遇数量区间下界;教学位节点固定不掷 | +| unit_count_max | [unit_count, 3],可省略 | 缺省 = 定值 | 数量区间上界;开战时在区间内掷定本战实际数量 | +| atk_min / atk_max | [0, 999] 可选配对 | ±3 浮动(provisional) | 攻击基线区间:开战掷定一次、整战持久;缺省 = 定值行 | +| armor_type | {无, 甲, 重甲},缺省无 | 地精无 / 熊地精甲 / 酋长重甲 | 克制结算归[战斗结算](战斗结算.md) | +| hp | [1, 999] | provisional | 单位生命基线(难度修饰前) | +| atk | [0, 999] | provisional | 攻击基线;0 合法 = 纯伏击伤敌种 | +| heavy_multiplier | [1, 16] | 2(provisional) | 无重击拍的敌种不消费,非校验项 | +| pattern | 环长 [1, 8] | 三敌种见核心规则 | 校验域 = 攻击 / 蓄力 / 重击;预留值拒绝 | +| advantage_per_round_cap | [0, 16] | 4(定稿) | 单轮伏击授予上限;0 = 免疫伏击;也是扫雷经济侧对账的惩罚上限供给值 | + +主角表(单行全局): + +| 参数 | 取值域 | 现行值 | 说明 | +|---|---|---|---| +| max_hp | [1, 999] | provisional(出处待查) | 主角生命上限 | +| atk | [1, 999] | 6(原型锚 provisional) | 基础攻击;配 0 加载期拒绝——基础攻击恒在 | + +三敌种现行行值(全部 provisional,出处 registry):地精教学位 24 生命 / 7 攻击 ×[1,2] 固定 1 只、群行 13/5 ×[2,3];熊地精 40/9 ×1、群行 18/6 ×[2,3]、深层锚行 30/7;食人魔酋长 150/9 ×1。 + +结构冻结(非调参项,修订走本文流程):行为拍枚举封闭、死亡即不动手、先作用后推进、伏击层池共享读法、附加后置加法、伏击按主角血量点计量纲、固定顺位、每坐标恰一敌种、零随机。联动纪律:单轮上限 × 攻击基线(支配边界联动)、数量 × 上限(单结算上界双线性)、倍率 × 攻击(重击拍支配)禁止独立调参,联调须重跑方向性预检并同步 registry(见待拍板)。 + +## 验收标准 + +- 开战生成:按遭遇坐标精确匹配一行,实例化数量与数值投影同行值快照;主角以血量入参,越界(高于上限或不超过 0)拒绝且不留半实例。 +- 行为环确定性:初拍恒为环首;任意推进序列后当前拍 = 环[步数 mod 环长];环长 1 恒同一拍;同种多敌全程同拍;除战斗结束清场外无任何重置入口。 +- 死亡即不动手:轮到前被杀——本拍不出手、指针冻结;行动完成后才死——已出招已推进;对已死亡单位上报受击被拒绝且状态不变。 +- 伏击读值:攻击拍读值 = 基线 + 层数 × 3;重击拍 = 基线 × 倍率 + 层数 × 3(与"伏击进倍乘"的错算可判别);蓄力拍恒为 0;同层数多敌读值一致、读值前后单位状态零变化。 +- 伏击授予与溢出:生效层数 = min(雷数, 上限),且生效 + 溢出 = 雷数(零静默蒸发);上限 4 时踩 6 颗雷生效 4、溢出 2;上限配 0 时全部记溢出且全部无效。 +- 目标顺位:多敌时单体目标恒为生成序最前存活者,杀最前后顺延;杀至空返回空;单敌时顺位与范围效果重合。 +- 快照抗改表:实例化后修改敌人表,已生成单位的数值投影与行为环逐字不变;新实例才用新表值。 +- 表校验:越域值、预留拍、同坐标第二敌种均在加载期报错止动;域内合法极端(攻击基线 0、上限 0)不拒;主角表恰一行、攻击配 0 拒绝。 +- 零随机回放:同一动作与受击序列驱动两个独立实例,存活投影、逐单位拍轨迹、顺位返回序列逐项相同。 +- 表实一致:两张配置表字段与 registry 的 enemy / hero 条目逐字段一致。 + +## 待拍板 + +以下条目存在冲突、缺口或未验证项,本系统不自作裁决,逐条登记。 + +| 条目 | 现状 | 建议归属 | +|---|---|---| +| 单拍行为环的体验验证 | 地精恒定出手、无自然空窗的单拍环是否站得住,登记为预注册试玩验证项(playtest 证伪项),至今未执行 | 难度曲线与Boss 与本文共裁 | +| 伏击量纲与上限的联动复核 | 附加值 3 为 provisional(量纲已定稿);上限与量纲、攻击基线存在联动,联调前须重跑方向性预检并同步 registry | 战斗结算对账闭合时裁决 | +| 零伤害 / 无威胁组合的跨字段护栏 | 主角基础攻击为 0 已被域下界杜绝;残余退化 = 敌种行攻击基线 0 且上限 0 → 无威胁敌(内容调参禁区);跨表量级护栏(基线 × 倍率上界对主角生命上限域)的归属未定 | 实现期 ADR 与[数据配置](../表现与支撑/数据配置.md) | +| 标错惩罚的数值 | [排雷玩法](../排雷循环/排雷玩法.md)已登记:控制失败(标空)的惩罚候选"敌方伏击 +1"未定案;落地前标空只判不中 | 数值归本文,兑付归[战斗结算](战斗结算.md) | +| 同深度第二敌种与精英 / Boss 编码位 | 现键结构(关卡序号 × 节点深度 × 敌种)无编码位;混编遭遇下伏击上限取哪行值未定义——现行结构恒单行值 | 随[关卡节点地图](../冒险循环/关卡节点地图.md)定稿改键一并裁决 | +| 敌方攻击区间的正式侧落文 | registry 已登记攻击基线区间(开战掷定、整战持久),归档文档未含此字段;正式侧文档与 registry 修订批随对应 ADR 同批待落 | 数据配置接口漂移通道 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/排雷循环/地形变异.md b/design/gdd/systems/排雷循环/地形变异.md index c1fad4d4..0ab40d0c 100644 --- a/design/gdd/systems/排雷循环/地形变异.md +++ b/design/gdd/systems/排雷循环/地形变异.md @@ -1,3 +1,144 @@ # 地形变异 +> 一句话:格子的非雾变异(岩浆/冰冻等,待定);雾格已从设计中移除 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/a4-terrain-variation.md + +## 设计目的 + +地形变异是一个定义层的框架:它允许给棋盘上的格子挂上"变异"标记(比如岩浆、冰冻),让某片格子在基础扫雷规则之外多一层玩家在挖掘中可遭遇的偏离。没有这个框架,关卡之间的差异只能靠雷的数量单调缩放,"每关解锁新元素"的推进感和越深越险的地貌变化都无处安放。 + +变异带来的行为改变发生在数据侧:格子只是多携带一条数据,读取到它的系统按数据行动,规则本体一个分支都不加。首批变异类型目前只登记了名字(岩浆、冰冻),机制分化未定;本定稿只固化框架本体与配套约束,不为任何类型编造机制——这是自上一版设计压缩改写后的诚实现状。 + +## 系统范围 + +边界这样划:地形变异只管"变异是什么、以什么形式存在、遵守什么纪律"。变异摆在哪、摆多大归棋盘生成;挖格、插旗、连锁展开怎么执行归排雷玩法。现行状态下它没有任何机制已定稿的变异内容,是一套"框架就位、内容待定"的系统。 + +负责: + +| 负责 | 说明 | +|---|---| +| 变异框架本体 | 变异类型清单的登记结构:要加一类变异,就在清单里加一行声明,不改代码 | +| 数据侧行为约定 | 变异是格子的只读数据,随图生成、随图消亡;读取方按数据行动 | +| 零特判原则 | 禁止任何系统为变异改写扫雷规则本体——框架的承重约束(见核心规则) | +| 布置接口结构位 | 变异在棋盘生成期布置;布置约束与参数待定稿,结构位保留 | +| 反制道具配套义务 | 未来每定稿一类变异,随批配至少一件反制道具(义务在本系统,道具本体归辅助道具) | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 布置算法与参数(摆几个、多大、摆哪) | [棋盘生成](棋盘生成.md) | +| 挖格、插旗、连锁展开的规则本体 | [排雷玩法](排雷玩法.md) | +| 反制道具的效果、时效与定价 | [辅助道具](辅助道具.md) | +| 数值表本体与读取机制 | [数据配置](../表现与支撑/数据配置.md) | +| 界面呈现 | [HUD 框架](../表现与支撑/HUD框架.md) | +| 教学口径 | [教学引导](../表现与支撑/教学引导.md) | + +## 在核心循环中的位置 + +``` +棋盘生成 ──(生成期布置:格子携带变异数据)──▶ 扫雷阶段:读取方按数据行动 +``` + +地形变异站在棋盘生成与排雷玩法之间:棋盘生成在生成期决定哪片格子带变异,玩家在挖掘中遭遇它。它自己不下达任何指令——挖格、插旗、连锁展开仍按排雷玩法的规则执行,变异的全部影响都经由格子数据产生。 + +## 核心规则 + +本节只写现行存活的内容,即变异框架本体;首批变异类型机制定稿前,以下规则不含任何具体类型的玩法行为。 + +### 变异框架与类型清单 + +每种变异是配置表里的一行具名声明。框架自身不含任何运行时逻辑——变异带来的行为改变,发生在"读取方读到什么数据、按什么约定行动"的交集里;定义行只声明数据,不写处理代码。要加一类变异,就在清单里加一行声明,而不是改代码。 + +变异的生命周期是随图生灭:变异是棋盘格的只读属性,在棋盘生成期布置、随棋盘实例存在;清图换图或战斗结束时随图消亡。生效期没有任何运行时写入,也没有跨图存续——新图重新布置。 + +清单现行登记两个类型名,都只有名字: + +| 类型名 | 现状 | +|---|---| +| 岩浆 | 仅登记名字,机制未定(provisional;出处为游戏概念文档的存疑项登记) | +| 冰冻 | 仅登记名字,机制未定(provisional;出处同上) | + +清单结构在归档期曾有完整字段定义(标识、解锁关号、作用域、信息规则、布置约束、地形主题、反制道具清单),其中"信息规则"与"布置约束"两个字段的取值语义绑定具体变异类型,字段集是否沿用随首批类型定稿一并拍板(历史登记见调参表指向的 registry 条目)。 + +### 零特判原则(承重约束) + +变异不得改写扫雷规则本体:挖格、插旗、连锁展开的判定与执行不增加任何变异分支,代码里不允许出现"这格带某变异所以就……"。这是框架的承重约束——它保证每加一类变异都不需要回头修改规则本体,玩家面对的也始终是同一套扫雷规则,而不是一套到处开洞的例外。 + +交互全部走数据侧:规则本体只读取格子数据并按数据行动,变异的全部影响经由数据与读取方之间的约定产生。若未来某类变异的机制确实需要规则本体做出区分,那是一次同时修订排雷玩法与本文的正式变更,不是框架默认允许的能力。 + +### 生成期布置接口(结构位) + +变异在棋盘生成阶段布置:生成新雷图时决定本图是否携带变异、带在哪些格子上,玩家在挖掘中遭遇。本系统只声明"变异在生成期布置"这个接口位置;布置约束(变异允许落在什么格子上)与布置参数(摆几个、多大、摆哪)未定稿,将与首批变异类型的机制一起拍板,归属棋盘生成的管线预留段。定稿前,棋盘生成不为变异做任何额外工作。 + +### 反制道具配套义务 + +未来每定稿一类变异,必须随批配套至少一件反制道具(针对该变异、给玩家提供应对手段的道具),不让任何变异成为只亏不赚的纯税。这条配套义务的归属方是本系统;"反制"作为道具的一个维度,由辅助道具的五维度框架承接,反制道具的具体效果、时效与定价都归辅助道具定稿。 + +## 依赖与输出 + +依赖面很窄:上游只有数据承载与布置结构位,下游是对读取方与配套道具的义务声明。这张表同时是删除概念时的影响面清单。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 变异类型清单的表结构承载与统一读取;本系统是清单内容的回填责任方 | +| 上游 | [棋盘生成](棋盘生成.md) | 生成期布置的结构位(管线预留段);布置约束与参数待定稿 | +| 下游 | [排雷玩法](排雷玩法.md) | 零特判义务的承接方:执行逻辑不按变异分支,只按格子数据行动 | +| 下游 | [辅助道具](辅助道具.md) | 反制道具配套义务的承接方(五维度框架的"反制"维度) | +| 相邻 | [行动经济](行动经济.md) | "地形成本修饰"价目钩子(不同格子不同价)暂缓启用,待本系统首批变异定稿后重议(见该文档 P1/P2 后置) | + +## P0 最小闭环 + +P0 阶段本系统不产出任何可玩内容:变异类型清单为空,没有机制已定稿的变异,所有雷图都是无变异的普通图。P0 只承诺一件事——框架就位且惰性: + +``` +变异类型清单为空 ──▶ 棋盘生成按普通图出图 ──▶ 挖掘全程读不到变异数据 +``` + +1. 清单为空是合法状态:配置加载零错误、零警告,游戏行为与不存在本系统时完全一致。 +2. 框架就位指清单的登记结构与读取通道可用,向清单加入一行类型即应生效、不需要改动代码;首批类型定稿前不建行、不写任何变异处理代码。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 首批变异类型(岩浆/冰冻)机制定稿并建行 | 名字已登记、机制分化未定;定稿批随批配至少一件反制道具 | +| P1 | 全局作用域变异(精英/Boss 图整图生效的变异形态) | 作用域语义未定稿,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| P2 | "地形成本修饰"价目钩子启用 | 由行动经济持有;启用须随首批变异定稿,与行动经济重议按格定价的接口 | + +## 调参表 + +本系统现行没有可调参数。归档文档曾为变异表登记过参数与行内容(如首类变异的解锁关号、地形主题标签),它们未随本定稿迁移;是否以新变异类型重定、如何重定,见「待拍板」。 + +变异表的结构历史(字段定义、反制道具回填现状、条目归属)见 [registry 的 variation_table 条目](../../../registry/entities.yaml)。该条目目前仍把归档文档登记为事实源,本系统首批类型定稿后应改指本文并同步重定内容。 + +## 验收标准 + +- 空清单合法:变异类型清单为空(即现行状态)时,配置加载零错误、零警告,游戏行为与无本系统时完全一致。 +- 零特判(负验收):排雷玩法的挖格、插旗、连锁展开执行路径中不存在任何按变异类型分支的代码;本系统自身代码零玩法数值字面量、零随机数调用。 +- 数据生命周期:格子携带的变异是只读数据——随图生成、随图消亡,生效期零运行时写入,无跨图存续。 +- 配套义务闭环:任何一类变异的定稿批,若不含至少一件反制道具的定稿条目,验收不通过。 + +## 待拍板 + +以下条目出自上一版设计,内容绑定了已被移除的雾格,随移除失义。本文不为它们编造替代机制,只逐条登记失义原因与建议归属,待归属系统修订时处理。条目中的「可推理率」是棋盘生成的生成质量参数(一张雷图能靠逻辑推理而非猜测解出的程度)。 + +| 条目 | 失义原因 | 建议归属 | +|---|---|---| +| 雾区布置约束族(雾区只允许布置在非 0 安全格——区内无雷、无 0 格;出生区及其初始展开可达域永不含变异等生成期硬约束) | 约束谓词绑定雾格的格类构造;岩浆/冰冻的布置约束未定,不能默认沿用 | [棋盘生成](棋盘生成.md) | +| 承重数学(雾区厚度不大于 2——等价于任意 3×3 窗口非全雾;雾面积占比不大于 8 倍雷密度的必要上界;占比与可推理率下限的联动参数) | 全部由"雾格 = 非 0 安全格"的结构推论导出,前提随雾移除失效 | [棋盘生成](棋盘生成.md) | +| 雾占比上限 0.25(生成参数域的占比校验,结构冻结值) | 校验对象是雾面积占比,对象已不存在 | [棋盘生成](棋盘生成.md) | +| 可推理率"剔除雾格"双向净效应建模(雾边线索减少的减项与雾边推理锚的增项两边都算,禁单向补偿) | 建模对象是雾格对可推理率的扰动;未来变异若扰动信息量,须重新建模 | [棋盘生成](棋盘生成.md) | +| 清图预算的雾增量核算(链不可达雾格数 × 挖格单价,计入清图总预算的设计期核算) | 增量分子是雾格的挖掘成本,雾移除后分子失义 | [棋盘生成](棋盘生成.md),联动[战斗结算](../战斗循环/战斗结算.md) | +| 雾板两态验算与两条方向性护栏(支配性不等式须雾板/无雾板分别验算;雾板净当量优势带上界、防刷新钓鱼护栏) | 验算与护栏都以"雾板"这一图类型为对象 | [战斗结算](../战斗循环/战斗结算.md) | +| 雾板三条定价硬约束(雾内奖励档位下界、清图奖励锚随雾成本上浮、雾板优势带上界) | 三条都以雾板为定价对象 | [奖励道具经济](../战斗循环/奖励道具经济.md) | +| 雾图例条目、首遇一次性提示、已开雾格底色残留(tint)与雾区全开完成信号等呈现义务 | 呈现对象全是雾格本身 | [HUD 框架](../表现与支撑/HUD框架.md) | +| 雾教学条目("雾区无雷"口径、雾内插旗警示、连锁止于雾界的解释等) | 教学对象是雾机制 | [教学引导](../表现与支撑/教学引导.md) | +| registry 变异表的反制道具回填值 [probe_dust](显影尘,玩家可见道具名;现行效果定义为雾区显影) | 显影尘是雾的反制道具,随雾失义待重定;名称暂按登记保留 | [辅助道具](辅助道具.md) | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/排雷循环/排雷玩法.md b/design/gdd/systems/排雷循环/排雷玩法.md index f99d96da..2d2ac49c 100644 --- a/design/gdd/systems/排雷循环/排雷玩法.md +++ b/design/gdd/systems/排雷循环/排雷玩法.md @@ -1,3 +1,257 @@ # 排雷玩法 +> 一句话:挖格、插旗、连锁展开等扫雷规则本体 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/a2-minesweeper-rules.md + +## 设计目的 + +排雷玩法是扫雷规则本体:玩家在地牢厅室里做的每个动作——挖格、插旗、移动——都由它裁决,并把发生的事实如实上报给全项目。它不决定每个动作花多少钱(账本归[行动经济](行动经济.md)),也不决定收益怎么兑现成战斗效果(归[战斗结算](../战斗循环/战斗结算.md))——它只保证棋盘上的事实真实、顺序确定:数字从不说谎,每个拒绝有据可查。没有它,[棋盘生成](棋盘生成.md)生成的板没有发生地,战斗结算也没有事实来源。 + +玩家看到的说法略有不同:雷格叫**惩罚格**(首发类型是怪物巢穴——惊动则怪物倾巢而出占得先机)、插旗叫**控制**(标中则巢穴废置、怪物被削弱)、连锁展开叫**坍塌显形**(挖穿薄壳,整片塌陷露出)、标错叫**控制失败的失控反噬**。本文对内沿用机制名"挖、旗、雷格"。 + +## 系统范围 + +边界这样划:一个动作"碰棋盘"的部分全归这里——合不合法、执行后格子变成什么样、翻开了哪些格、旗立在哪;"花多少钱"归行动经济,"兑现成什么战斗效果"归战斗结算,"画成什么样"归 HUD 框架,"格子怎么生出来"归棋盘生成。本系统自己不含任何玩法数值、零随机、也不认界面:同一张板、同一份动作序列,必然得到逐位相同的结果。 + +负责: + +| 负责 | 说明 | +|---|---| +| 全部棋盘面规则 | 动作合法性(相邻、开未开、旗位)、连锁展开、数字提示、旗的棋盘状态、清图判定(安全格是否全部开完) | +| 开局初始展开 | 装板事务:结构前提校验、免费展开出生开阔地、小人落位 | +| 单一结算入口 | 玩家意图只从批次结算入口进,按固定语义序仲裁 | +| 三种对外事件 | 挖开格、旗判定、轮次结束——全项目的事实流源头 | +| 拒绝原因清单 | 每个被拒动作带可辨原因,供呈现层区分"棋盘面非法 vs 资源不足" | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 行动点价目与扣费 | [行动经济](行动经济.md) | +| 棋盘怎么生成、可推理性保证 | [棋盘生成](棋盘生成.md) | +| 轮次编排与收益兑现 | [战斗结算](../战斗循环/战斗结算.md) | +| 奖励内容与档位 | [奖励道具经济](../战斗循环/奖励道具经济.md) | +| 界面呈现 | [HUD 框架](../表现与支撑/HUD框架.md) | + +## 在核心循环中的位置 + +``` +扫雷阶段:玩家每帧提交一个意图 ──▶ 排雷玩法(棋盘裁决)──(三种事件:事实流)──▶ 战斗结算(轮末兑现)──▶ 冒险推进 +``` + +排雷玩法站在"扫雷"这一段,是全项目的事件源头:它只外发事件、从不订阅任何下游。战斗结算订阅事件流,在轮末把这一轮扫雷攒下的因逐行兑现成战斗的果。 + +## 核心规则 + +### 挖、插旗、拔旗、移动:每个动作怎么才算合法 + +玩家对棋盘只做四件事:挖未开格、插旗、拔旗,以及移动小人(玩家摆在棋盘上的探险者棋子)。前三个是付费动作,各花 1 点行动点(每轮的决策预算,账本归[行动经济](行动经济.md));本文只管棋盘面这一半,总纲只有一条:付费动作只能作用于小人周围一圈 8 格(8 向相邻)之内。 + +移动不花行动点:点任何已开格,小人沿已探明区一次走到位,"已探明区"包括踩过的雷格残址。点击已开格的唯一含义就是移动——本作没有经典扫雷里"双击数字格一键翻开周围"的 chord(双击快开),每一格的兑现都必须花行动点。 + +挖已插旗的格会被直接拒绝:想改主意,必须先花 1 点拔旗、再花 1 点挖。这条拒绝是故意的——旗是"别挖这里"的承诺,不让玩家零成本反悔。 + +| 动作 | 合法对象 | 棋盘面拒绝情形 | +|---|---|---| +| 挖 | 8 向相邻、未开、无旗 | 不相邻 / 已开过 / 有旗(须先拔旗) | +| 插旗 | 8 向相邻、未开、无旗 | 不相邻 / 已开过 / 已有旗 | +| 拔旗 | 8 向相邻、带旗 | 不相邻 / 无旗可拔 | +| 移动 | 任意已开格,且能只经已开格连通到达 | 目标未开 / 无连通路径 | + +每个被拒动作都带一个可辨的拒绝原因;原因只能取自一份固定清单,清单外没有别的来源。三个来源互不混淆:棋盘面非法(上表各情形,细因彼此数据可分——"须先拔旗"和"不相邻"必须是两个可区分的原因)、资源不足(判定权在行动经济)、相位不对(本轮已收尾,不收动作)。玩家看到的文案归[HUD 框架](../表现与支撑/HUD框架.md)。 + +``` +一个意图进来 + ├─ 棋盘面判定(本系统):不相邻?开过了?旗位不对?── 任一命中 → 拒绝,状态不变 + ├─ 扣费(行动经济):点数不够 → 拒绝(资源不足),状态不变 + └─ 都过 → 执行:改棋盘、上报事实 +移动免费直达,不经扣费。 +``` + +举证:本节全部为合法性判定与流程,无计算。 + +### 挖开空地整片塌开:数字提示与连锁展开 + +每个已开安全格都亮着一个数字,恒等于它周围 8 格里的雷数。这条"数字恒真"是全部推理的地基:数据层从不说谎,呈现层怎么遮掩都不改真值——任何让数字失真的实现都在禁止之列。 + +挖开一个数字为 0 的格(周围一圈没有雷)时,它周围未插旗的安全格免费连锁全开,一路递推到没有新的 0 格为止——这就是连锁展开,玩家看到的是"坍塌显形":挖穿一层薄壳,整片松动的地面塌陷露出。连锁格只花首格挖掘的 1 点,照常计入清图进度(清图 = 开完全部安全格),奖励资格(挖开这格能不能拿到奖励)也照常。 + +连锁遇到旗就停:旗格不被链开,也不给更远的格当传播跳板。旗花 1 点行动点,正是玩家亲手买下的"链阻断器"——对一片不敢确定的地,提前插一面旗,塌方到它为止。 + +清图在每次挖完成后判定;插旗、拔旗、移动都不改已开格,永远不会触发清图。 + +| 连锁展开的性质 | 含义 | +|---|---| +| 免费 | 只扣首格的 1 点,连锁翻开的格不另收费 | +| 计入清图进度 | 连锁开的格照常算进"全部安全格开完"的判定 | +| 奖励资格照常 | 连锁开出的安全格与单挖的安全格同权 | +| 遇旗即止 | 旗格不入链、不作传播跳板;旗留在原地,轮末照常判定 | + +``` +挖开 0 格 → 翻开周围 8 向未插旗的安全格 → 新开格里还有 0 格吗? + ├─ 有 → 对每个新 0 格重复上一行 + └─ 没有 → 连锁结束(整段只花首格 1 点) +``` + +举证:连锁是纯粹的格面翻开闭包(flood fill),无计算。 + +### 每张新图白送一片开阔地:开局初始展开 + +每装上一张新图,本系统在同一个事务里免费翻开出生 3×3(小人出生的那片安全区),加上与它连成一片的开阔地——凡是与出生区连通的 0 格地带全部亮起。展开完成后,小人落在出生 3×3 的中心格。这片初始展开每次装板只发生一次,跨轮不重放;换新图时按新板重来。 + +初始展开守四条铁律: + +| 铁律 | 含义 | +|---|---| +| 免费 | 不扣行动点,账本零写入 | +| 计入清图进度 | 剩余安全格从这片开完后起算 | +| 无奖励 | 这些格不发奖励,下游不得记入奖励 | +| 只在装板时发生一次 | 跨轮不重放,防止"每轮白送一遍" | + +装板时本系统还当场校验生成产物的结构前提:出生区内无雷、数字恒真、初始展开没有大到直接吞掉全图。任一不过就拒绝装板并报出诊断,绝不停带病运行;这些前提的正常保证由[棋盘生成](棋盘生成.md)负责,本校验只是消费侧的最后一道闸。 + +``` +装上新图 → 校验结构前提 ── 违例 → 拒绝装板并报出诊断 + → 免费翻开出生 3×3 及其连通开阔地(无奖励、计入清图) + → 小人落位出生 3×3 中心格 +``` + +举证:本节为装板流程与静态校验,无计算。 + +### 踩过的雷能走:已引爆雷格的通行规则 + +挖开雷格不是死亡,是事实上报:轮次不结束,雷格从此算已开——小人能站上去,也能穿过它继续挖。挖开后的雷格不计清图进度(图不是靠踩雷清的)、不能再挖、不能再插旗;同一轮连挖多颗雷,每颗都是独立的事实,逐颗上报。 + +因此挖已知雷成了一条"有价捷径":花 1 点行动点、给敌方送去优势,换来一条穿行的近路。它既是玩家主动抄近路的权衡,也是棋盘被挖残时的兜底通路。惊动巢穴的代价在轮末结算兑现,归[战斗结算](../战斗循环/战斗结算.md)。 + +| 已引爆雷格的格态 | 行为 | +|---|---| +| 可通行 | 移动可以经过、可以站立;穿越仍按移动规则找已开区路径 | +| 不计清图 | 不算安全格,"全部安全格开完"的判定不认它 | +| 不可再操作 | 不能再挖,也不能插旗 | +| 事实已上报 | 轮次不结束;惩罚由战斗结算在轮末兑现 | + +举证:本节为格态规则,无计算。 + +### 旗立得住、也带不走:旗的生命周期与换图重置 + +旗是棋盘状态的一部分,不是背包里的实物:插上的旗跨轮保留、随图存续,没有数量上限。每次轮次结束(行动点耗尽、玩家停手或清图时),本系统对当时在场的每一面旗如实上报一条判定——旗下是雷记标中(玩家看到巢穴被控制、怪物被削弱),不是雷记标空;旗一直插在雷上,就每轮如实重复上报标中,去重是[战斗结算](../战斗循环/战斗结算.md)的事,本系统只报事实。插旗、拔旗本身不发事件,界面反馈走调用返回值。旗不参与清图判定,但带旗的格没挖开就照常挡着——全图标旗一格不挖,永远清不了图。 + +标空就是标错,玩家读到的是控制失败的失控反噬——反噬目前没有定案,见「待拍板」。 + +换图时旗全量消失,两条路径待遇不同:清图换图发生在轮末,旧旗先走完当轮判定、再随旧图清空;挖掘期刷新换图不打断当轮,旧旗没等到判定就失效——零兑付,插旗花的行动点也不返还。战斗结束、整板退役时同样清空。 + +| 旗的结局 | 时机 | 发生什么 | +|---|---|---| +| 留在图上 | 跨轮 | 原样保留,每轮轮末重复判定 | +| 随清图消失 | 轮末换图 | 先完成当轮判定,再随旧图清空 | +| 随刷新消失 | 挖掘期换图 | 未判定即失效:零兑付、行动点不返还 | +| 随战斗结束消失 | 整板退役 | 与板一同清空 | + +``` +插旗(1 点,界面即时反馈)→ 旗立在未开格上,跨轮保留 +每次轮次结束 → 逐旗判定,如实上报(标中 / 标空) +换图(清图或刷新)或战斗结束 → 旗随旧图全量消失 +``` + +举证:本节为状态生命周期规则,无计算。 + +### 一帧一个意图、对外只有三种事件:批次仲裁与事件面 + +玩家每帧只提交一个意图,全部意图经同一个批次结算入口进入本系统——这是唯一的结算入口,保证任何情况下只有一种结算顺序。批次是整体事务:先按固定语义序重排(能清图的挖最优先、停手次之、其余殿后,同类内按提交顺序),再逐个执行;轮次结束条件第一次成立处定出赢家,其后的意图全部丢弃。丢弃不等于被拒:拒绝是本来就不合法,丢弃是来不及了——零棋盘效果、零扣费、零事件。单意图帧下正常玩不出批次竞争,这套仲裁是防御性兜底。 + +| 批次语义序 | 类别 | 说明 | +|---|---|---| +| 最先 | 能清图的挖 | 执行后图即全开的挖——防止"耗尽优先"把清图高光结算成最差结局 | +| 次之 | 停手 | 玩家主动收轮 | +| 其余 | 普通挖、插旗、拔旗、移动 | 同类内按提交顺序 | + +对外,本系统只发三种事件、不订阅任何东西;事件集合封闭,增删事件就是接口修订: + +| 事件 | 何时发 | 内容 | +|---|---|---| +| 挖开格 | 每开一格(初始展开、连锁、单挖各算) | 哪格、安全还是雷、数字、经哪条路开的、有无奖励资格(初始展开的格恒无) | +| 旗判定 | 每次轮次结束时逐旗一条 | 哪面旗、标中还是标空 | +| 轮次结束 | 每轮恰一条 | 这轮怎么结束的(清图 / 耗尽)、下一轮换不换图的建议 | + +这套"只发不收"是全项目唯一允许的下游反向接线:订阅方被动接收事实,本系统零依赖下游、不知道谁在听。战斗结算订阅事件流、轮末逐行兑现收益;停手路径的轮次结束事件由[行动经济](行动经济.md)直发,本系统不重复发。 + +``` +一批意图到达 + → 按语义序重排(能清图的挖 > 停手 > 其余,同类按提交序) + → 逐个执行,轮次结束第一次成立处定赢家,其后意图丢弃 + → 收轮:先把旗判定逐条报完,再报轮次结束 +``` + +举证:本节为事务顺序与接口封闭规则,无计算。 + +## 依赖与输出 + +本系统对上游只有两张依赖,对下游只发事件流;下面这张表就是删除任何一方时的影响面清单。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [棋盘生成](棋盘生成.md) | 棋盘产物的消费方;装板时校验结构前提(出生区无雷、数字恒真等),违例拒绝装板 | +| 上游 | [行动经济](行动经济.md) | 唯一扣费入口:本系统判棋盘面后请账本扣费,绝不自行扣减;挖成后上报连锁规模与清图事实;停手意图经批次入口转交 | +| 下游 | [战斗结算](../战斗循环/战斗结算.md) | 三事件的订阅方、轮末兑现方;换新图指令由它回发 | +| 下游 | [奖励道具经济](../战斗循环/奖励道具经济.md) | 本系统只上报"这格有无奖励资格"的事实;奖励内容与档位不经本系统 | +| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 呈现义务归 HUD 框架 | + +## P0 最小闭环 + +最小闭环只保留跑通"装板—挖—收轮—兑现—换图"必需的规则: + +1. 战斗开始装上新图:校验结构前提,违例拒绝;初始展开免费翻开出生开阔地,小人落位。 +2. 玩家每帧提交一个意图:挖(判棋盘面,请账本扣 1 点,开格加连锁并逐格上报)、插旗拔旗(1 点,旗入棋盘,零事件)、移动(免费,已开区一次走到位)。 +3. 被拒动作带可辨原因、状态不变;批次内轮次结束首次成立处定赢家,其后意图丢弃。 +4. 收轮:先报完在场旗的逐条判定,再报轮次结束(停手路径由行动经济直发)。 +5. 战斗结算订阅事件流逐行兑现;清图或刷新换图时按它回发的指令装新图,旧板旗全量失效,回到第 1 步。 + +## P1 / P2 后置 + +后置不等于删除:以下条目保留在案,复活任何一条都走本文修订流程。 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 标错(控制失败)惩罚落地 | 惩罚方案未拍板(见「待拍板」);落地前标空只判"不中",无额外后果 | +| P2 | 探测类道具的查询接口 | 接口归[辅助道具](辅助道具.md)定稿,本系统不预写 | +| P2 | 地形变异接入的格面规则 | 地形变异尚未定稿;接入时走本文修订流程 | + +## 调参表 + +本系统无自有参数:价目与每轮点数见[行动经济](行动经济.md)的调参表,棋盘形态见[棋盘生成](棋盘生成.md)。连锁免费、移动免费、无 chord、批次语义序、三种事件封闭都是冻结设计而非参数——改动走本文修订流程,不走调参。 + +## 验收标准 + +每条都可单独验证:构造给定局面,执行动作,核对结果。 + +- 数字恒真:任意已开安全格的数字恒等于其 8 向相邻雷数;出生区无雷、数字恒真、初始展开不吞全图三条结构前提任一不满足时,装板被拒绝。 +- 初始展开恰等:装板后翻开的格集合恰为"出生 3×3 加连通开阔地"——不止 3×3,也不外扩一圈;全程免费、无奖励、计入清图进度;跨轮不重放。 +- 连锁免费且遇旗即止:一次触发连锁翻开任意多格,扣费恒为 1 点;旗格不被链开、不作传播跳板;连锁格计入清图进度、奖励资格照常。 +- 挖有旗格被拒:拒绝原因可辨("须先拔旗"与"不相邻"数据可分),棋盘与行动点余额不变。 +- 已引爆雷格可通行:挖雷后轮次不结束,小人可站、可经已开区穿行续挖;雷格不计清图、不可再挖再插旗。 +- 移动合法且预览同源:目标未开或无已开区连通路径时拒绝;路径预览与实际执行逐格相同;移动免费、零事件。 +- 批次仲裁与到达序无关:同一批意图按任意顺序提交,结束路径与结算结果一致;赢家定出后其余意图丢弃——零棋盘效果、零扣费、零事件,且丢弃区别于拒绝。 +- 收轮事件序:先报完全部旗判定,再报轮次结束;轮次结束每轮恰一条,停手路径由行动经济直发、本系统不双发。 +- 拒绝三源可辨:棋盘面非法、资源不足、相位不对三类原因互异可判定;任何拒绝零副作用。 +- 换图重置:清图换图时旧旗先判定后消失;刷新换图时旧旗未判定即失效、零兑付、行动点不返还;新板旗为空、初始展开按新板重来。 +- 确定性回放:同一张板、同一份意图序列驱动两次,事件流逐条逐位相同(本系统零随机)。 + +## 待拍板 + +以下条目存在冲突、缺口或已因设计变更失去原义;本系统不自作裁决,逐条登记。 + +| 条目 | 现状与失义原因 | 建议归属 | +|---|---|---| +| 标错(控制失败)的惩罚 | 未定案:候选为"敌方伏击 +1";旧体系留有原型实测义务,至今未执行。落地前标空只判"不中",无额外后果 | 数值归[敌人系统](../战斗循环/敌人系统.md),兑付归[战斗结算](../战斗循环/战斗结算.md) | +| 连锁开雾格、雾内旗恒不中 | 雾格已整体从设计中移除([不做清单](../../05-不做清单.md)第一条),两条规则失去作用对象;连锁与旗判定的现行口径已按"全部安全格"改写进正文 | 无需恢复;地形变异若定稿再议 | +| 开格事件携带变异标记、板持生成期快照 | 原为雾变异设计的透传与抗热重载机制,随雾格移除失去承载对象;未来地形变异是否复用"随格只读标记"未定 | [地形变异](地形变异.md)定稿时裁决 | +| 四格态呈现中的两个雾态 | 旧呈现要求四种格态一眼可辨,其中两个是雾态,随雾格移除失义;剩余"已开 / 未开"两态的呈现要求归 HUD 框架 | [HUD 框架](../表现与支撑/HUD框架.md) | +| 连锁批量奖励的溢出吸收 | 一条大连锁一次给出大量奖励资格,超出增益叠层上限时如何处理(折算、顺延或显式接受)未定 | [战斗结算](../战斗循环/战斗结算.md)与[奖励道具经济](../战斗循环/奖励道具经济.md)条目化 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/排雷循环/棋盘生成.md b/design/gdd/systems/排雷循环/棋盘生成.md index 42dfb62f..534ecf0a 100644 --- a/design/gdd/systems/排雷循环/棋盘生成.md +++ b/design/gdd/systems/排雷循环/棋盘生成.md @@ -1,3 +1,252 @@ # 棋盘生成 +> 一句话:棋盘怎么生成、怎么保证可推理可通关 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/a1-board-generation.md + +## 设计目的 + +棋盘生成是全项目扫雷图的唯一生产者:战斗结算每要一张新图,它就按关卡序号与节点深度对应的参数行,确定性造出一张可推理、可通关的雷图。它在生成时刻就作出质量承诺——玩家只会输给自己选的赌(比如终局不得不猜的一格),不会拿到大面积无解的局;这是核心循环里"推理的确定性"卖点的生成端保障。同种子同参数必产同图,回放、测试、复盘都能精确复现——确定性既是卖点,也是调试工具。 + +## 系统范围 + +边界这样划:本系统管"图从哪来、生成时承诺什么质量"。图上的动作怎么执行归[排雷玩法](排雷玩法.md),什么时候换图归[战斗结算](../战斗循环/战斗结算.md)编排,数值定多少归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)(本系统只提供参数表给数值落点),变异内容是什么归[地形变异](地形变异.md)(本系统只留结构位,并在生成期执行对方的约束)。本系统是个无状态的生产者:进参数与种子,出棋盘与指标,自己不留任何记忆。 + +负责: + +| 负责 | 说明 | +|---|---| +| 五阶段确定性生成管线 | 读参数 → 布雷 → 变异布置 → 生成-验证 → 产出上报;顺序冻结,不调换、不跳步 | +| 棋盘生成参数表 | 全项目第一张按进度键(关卡序号 × 节点深度)回填的配置表;表结构归本系统定 | +| 可推理率度量与达标判定 | 生成时刻的质量承诺,含计算口径与定义版本号 | +| 出生区与反退化保证 | 出生 3×3 无雷无变异、最小安全格数、开局白给板拒绝、清图可达性 | +| 加载期参数校验 | 参数域、布雷数下限、可行性与成本闸校验;违例加载期致命 | +| 生成期指标集产出 | 实测可推理率、实际雷数等,供调参与下游对账 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 挖掘、插旗、连锁展开的执行 | [排雷玩法](排雷玩法.md) | +| 换图时机与轮次编排 | [战斗结算](../战斗循环/战斗结算.md)(本系统纯被调用) | +| 难度数值定多少 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md)(调参所有权在对方) | +| 变异内容与解锁节奏 | [地形变异](地形变异.md)(本系统只消费其候选池门控) | +| 奖励内容与图类型差异化插槽 | [奖励道具经济](../战斗循环/奖励道具经济.md) | +| 界面呈现 | [HUD 框架](../表现与支撑/HUD框架.md) | +| 配置表承载与读取机制 | [数据配置](../表现与支撑/数据配置.md)(本系统是该表的回填责任方) | + +## 在核心循环中的位置 + +``` +棋盘生成 ──(雷图 + 生成指标)──▶ 扫雷(排雷玩法 × 行动经济)──▶ 轮末结算(战斗结算)──▶ 换图请求 ──▶ 回到棋盘生成 +``` + +本系统站在每场战斗"扫雷"一段的最上游:战斗结算发起换图请求,它交出图与指标,扫雷段在图上展开,清完或主动换掉再回来要下一张。它是纯被调用方,不主动发起任何事。 + +## 核心规则 + +### 五阶段管线:一次调用跑完五步,同种子必产同图 + +每次生成都是一次纯粹的函数调用——输入关卡序号、节点深度和随机种子,输出一张完整棋盘加一组生成期指标。调用按固定五步跑完,顺序冻结: + +``` +生成(关卡序号, 节点深度, 种子) → 棋盘 + 生成期指标集 + ① 参数解析 ─── 读对应参数行,生成开始时单次读取并快照 + ▼ + ② 布雷 ─────── 雷数 N = round(雷密度 × (宽×高 − 9))(先定数;9 = 出生 3×3 恒排除) + │ 在"全格 − 出生 3×3"范围均匀布雷 + │ 开局免费展开域外扩一圈,圈内的雷移除(只减不增、不重投、无迭代) + ▼ + ③ 变异布置 ─── 消费地形变异的候选池门控;池空或约束无解 → 静默跳过,产出无变异图 + ▼ + ④ 生成-验证 ── 实测可推理率;不达标在同一张图的随机数配额内重试,至上限按出口分发 + ▼ + ⑤ 产出上报 ─── 交出棋盘 + 生成期指标集 +``` + +生成期间的每一次随机取数——布雷、变异、重试——都从本图专属的一条"棋盘生成随机流"按固定顺序取:一张图只开一条流、用到底,重试不开新流;流之外零随机,全局随机函数一律禁用。参数行开始时一次快照,配置表中途热重载不影响进行中的生成。管线本身无状态——这些合起来就是"同种子同参数必产同图"的根基。 + +各阶段的失败都有明确语义,全部失败路径都不让玩家卡死(本节为纯流程规则,无计算;数值与校验式见后续各节): + +| 阶段 | 失败情形 | 语义 | +|---|---|---| +| 参数解析 | 行缺失或域违例 | 加载期校验已拦,运行期不会失败 | +| 布雷 | 雷数为 0 | 不会发生(零雷板加载期已拒) | +| 变异布置 | 布置约束无解 | 静默跳过变异,产物合法,实际达成数随指标上报 | +| 生成-验证 | 重试耗尽 | 按三分支出图(见"生成重试与成本闸") | +| 产出 | —— | 无失败路径,交出棋盘与指标 | + +### 出生区安全与反退化布雷:脚下无雷、废板不出厂 + +玩家开局站在棋盘上的 3×3 出生区,开局不花行动点就能看到一片区域——出生 3×3 加上从它出发经连锁展开(翻到八邻无雷的格时整片免费翻开的机制,玩家可见名"坍塌显形")免费带出的格,下文称**开局免费展开域**。本规则保证两件事:其一,脚下永远安全——出生区与开局免费展开域内恒无雷、恒无变异;其二,流出的每张图都可正常游玩——零雷板、安全格寥寥的板、开局白给的板、带孤岛安全格的板,都在生成期被拦下或整张弃用。 + +**结论**:雷数先定数、再落位;零雷板与安全格不足的参数组合在加载期就被拒绝。 + +``` +布雷数 N = round(mine_density × (board_width × board_height − 9)) (9 = 出生 3×3 恒排除) +下限校验:N ≥ 1(零雷板加载期拒绝) +计数可行:board_width × board_height − N ≥ min_safe_count(加载期校验) +产物断言:实际安全格数 ≥ min_safe_count;实际雷数 ≤ N(先布后删只减不增) +``` + +| 符号 | 含义 | +|---|---| +| mine_density | 雷密度参数,与图尺寸解耦 | +| board_width / board_height | 图尺寸参数 | +| min_safe_count | 最小安全格数下限参数——对冲"图上没几格安全、随便挖挖就清图领奖励"的刷奖励打法 | +| N | 该参数行每张图的目标雷数 | + +| 反退化规则 | 内容 | +|---|---| +| 先布后删 | 先把 N 颗雷在"全格 − 出生 3×3"上布完,再把开局免费展开域外扩一圈内的雷移除——只减不增、不重投、无迭代,必然终止且可复现;实际雷数与 N 的差额随指标观测 | +| 出生区安全 | 出生 3×3 与开局免费展开域内恒无雷、恒无变异;外扩一圈内禁变异、可有雷 | +| 开局白给板拒绝 | 开局免费展开域不得覆盖全部安全格——等于即退化板,尝试弃用重试;运行期另有同义兜底不变式,归[排雷玩法](排雷玩法.md) | +| 清图可达性 | 每个安全格都必须能从出生区沿安全格八向连通走到;带孤岛安全格的板判非法,不进降级候选 | + +清图可达性与可推理率是两道独立的闸:合法性先查、质量分后算——一张"分高但通不了"的图没有意义。另一条推理前提也由本系统保证:数字恒真,每个非雷格的数字恒等于它的八邻雷数,整局推理都建立在这句话上。 + +### 可推理率承诺:生成时就担保玩家算得对 + +可推理率(inferability)回答一个问题:这张图上有多少安全格,玩家不靠赌、纯凭逻辑就能挖开?它是整张图的"不靠赌占比":把开局免费展开、连锁展开、数字推导三种通道能确定挖开的安全格数,除以安全格总数。生成端承诺每张图实测占比不低于该行及格线——玩家可以输给自己选的赌,但不会拿到一张大面积无解的图。 + +**结论**:每张图生成时实测可推理率,实测值 ≥ 该行及格线;及格线取值域 [0.85, 1],域下限 0.85 是"不许纯猜局"的绝对锚(结构冻结——调整走文档修订,不是调参)。 + +``` +可推理率(图) = 不靠赌能确定挖开的安全格数 ÷ 安全格总数 +不靠赌揭示闭包:从开局免费展开域出发,交替应用两条规则直到不再新增—— + ① 连锁:翻到 0 格(八邻无雷的数字格)→ 其八邻安全格全部计入 + ② 推导:与已揭示区八向相邻的安全格,求解器凭可见数字能唯一断定其非雷 → 计入 +``` + +| 口径 | 内容 | +|---|---| +| 与玩家信息同步 | 评分模拟只看玩家能看见的盘面:没开的格看不见,雷位不许偷看 | +| 三通道计入 | 免费展开、连锁、推导挖开的格都算"不靠赌";免费展开格同时计入分子与分母 | +| 次序无关 | 先连锁还是先推导,闭包结果相同——分数与玩家的操作顺序无关 | +| 版本防漂移 | 指标输出带定义版本号(当前 1);改推理定义 = 文档修订 + 黄金图向量重制,版本号随之跳变 | + +推理规则域 solver_rules 冻结为 single_subset(单点规则加子集消减——经典扫雷式确定性推理:凭单个数字、以及两组数字的差能唯一断定的格)。它是可推理率定义的一部分,不是调参项;放宽或收紧它都等于改"算得对"的定义,须走文档修订。 + +### 生成重试与成本闸:重试有上限、降级必上报 + +一张图生成后先实测可推理率,不达标就在同一张图的随机数配额内重试——不开新图、不换种子。重试不是无限的:总取数规模受成本闸约束,且禁止拿真实耗时当逃生阀——否则同一颗种子在快慢机器上会产出不同的图,"同种子同图"就不成立了。 + +**结论**:重试次数与图尺寸联合受成本闸约束。 + +``` +成本闸:max_gen_attempts × board_width × board_height ≤ 16384 (provisional 量级护栏,正式值待实现期定) +``` + +| 出口 | 何时走 | 发生什么 | +|---|---|---| +| 达标即出 | 重试中出现合法且达标的图 | 出最早达标的那张,不追求全场最高分 | +| 接受最优 | 重试耗尽,有合法图但无一达标 | 出合法图中可推理率最高的一张(并列取最早)+ 强告警 + 降级标记 | +| 接受最不坏 | 重试耗尽且一张合法图都没有 | 按确定性劣度排序出最不坏的一张 + 最高级告警 + 非法产物标记 | + +最后一条出口是诚实降级:玩家永不卡死——哪怕找不到合法板也照常出图;但绝不静默——非法产物标记随指标集上抛,由[战斗结算](../战斗循环/战斗结算.md)编排、经 [HUD 框架](../表现与支撑/HUD框架.md)诚实告知玩家(提示、补偿还是回退,呈现细节归下游)。运行期安全网兜住体验,质量红线靠调参期批量断言守住:非法产物严格零容忍、低于及格线的板数严格为零——两层不许互相折算。 + +每次尝试先过合法性关——清图可达、安全格数达标、结构不变式全过——再谈质量分;非法尝试弃用重试。合法性闸在质量评分之前,质量分不得掩盖功能残废。 + +### 图类型标签与第三轴预留:主题恒定、Boss 板有座位 + +每张图带一组图类型标签(board_biome 字段;biome 即图的主题、题材)。同关卡同深度的所有图,主题静态恒定——不存在逐图重掷主题的接口,"不会上钓鱼的当"是结构保证而非文案。现行值只有占位 {"dungeon"}(provisional):标签词表尚未定稿,定稿前只校验非空,定稿后补域校验。这组标签是表现侧换色板与[奖励道具经济](../战斗循环/奖励道具经济.md)图类型差异化插槽的数据源。本节为数据约定,无计算。 + +参数表的键是关卡序号 × 节点深度,难度沿这两条轴雕刻;精英与 Boss 修饰是预留的第三条轴。本系统不定任何修饰数值,只锁定落点约定——这也是[关卡节点地图](../冒险循环/关卡节点地图.md)与[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)两份文档的输入: + +| 约定 | 内容 | +|---|---| +| Boss 板 | 各关最深深度行即 Boss 行——关底 Boss 恒为该关最后节点 | +| 字段命名空间 | 参数表预留 elite_ / boss_ 前缀字段,语义归上述两文档定稿 | +| 改键退路 | 若未来节点形态使精英性无法由现有键唯一确定,走[数据配置](../表现与支撑/数据配置.md)的改键通道修订 | + +## 依赖与输出 + +本系统对外只有一个生成入口和一份指标集,自己不发起任何调用。下面的依赖清单同时是影响面清单:删改本系统的某个概念时,按行逐个通知。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 参数表承载、类型化读取与加载期校验通道;棋盘生成随机流的种子派生(每图开一次流) | +| 上游 | [地形变异](地形变异.md) | 变异候选池门控:本系统消费其约束并在生成期强制执行(MVP 内容待定,恒空池) | +| 下游 | [排雷玩法](排雷玩法.md) | 棋盘产物消费方;开局免费展开由对方执行,展开域口径按双方登记的回验条款对齐 | +| 下游 | [战斗结算](../战斗循环/战斗结算.md) | 换图调用方与指标对账方;零合法板的玩家侧诚实告知由其编排 | +| 下游 | [行动经济](行动经济.md) | 单向事实依赖:P(安全)(挖掘目标格为安全格的概率)是对方挖掘风险不等式的概率锚,锚值由本系统供给——实测可推理率分布的低分位值,不是及格线参数 | +| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 参数数值所有权方;只按表调参,禁反向调用生成 | +| 下游 | [关卡节点地图](../冒险循环/关卡节点地图.md) | 第三轴 Boss 板落点约定的共同输入 | +| 下游 | [奖励道具经济](../战斗循环/奖励道具经济.md) | board_biome 作图类型上下文(行参数静态恒定) | + +| 对外接口 | 形态 | +|---|---| +| 生成入口 | 生成(关卡序号, 节点深度, 种子) → 棋盘 + 生成期指标集;无状态纯函数 | +| 生成期指标集 | 实测可推理率(带定义版本号)、实际雷数与安全格数、重试次数、降级/非法产物标记 | + +措辞登记(防口径混写):可推理率是整图级的"不靠赌占比",生成侧口径;P(安全) 是单格认知概率,决策侧口径——免赌集内 P(安全) 恒为 1,风险全部收缩到剩余盲猜集。本系统供给前者,不定义后者。 + +## P0 最小闭环 + +1. 战斗结算以(关卡序号,节点深度)调用生成,本系统开一条棋盘生成随机流。 +2. 读取并快照参数行(加载期校验已通过)。 +3. 先定数布雷、先布后删;出生区安全与反退化不变式全过。 +4. 变异布置消费候选池门控;候选池为空则产出无变异图。 +5. 实测可推理率,不达标在流内重试至上限,按三分支出图。 +6. 交出棋盘 + 指标集:排雷玩法消费棋盘,战斗结算消费指标对账——循环闭合于下一次换图请求。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 调参期批量断言工具全量交付(逐行数百样本;可推理率零违例、及格线下限、非法产物零容忍、难度方向 advisory 与分位报告) | 调参期离线工具域;冒烟只载缩样 | +| P1 | 与战斗结算的接线断言(图内重试不当作新流事件、对账消费实测分布) | 断言登记在对方验收清单 | +| P1 | 与排雷玩法的展开域回验集成 | 回验两臂登记在对方文档,集成随对方排期 | +| P2 | 推理域扩展(solver_rules 启用其他规则集或新增信息源) | 改可推理率定义 = 文档修订,MVP 冻结 | +| P2 | 生成异步化与成本闸正式值定稿 | 实现期决策,随性能预算批 | +| P2 | 变异布置内容接入(岩浆/冰冻类地形变异) | 结构位已预留;内容与解锁归地形变异定稿 | + +## 调参表 + +参数行以(关卡序号 × 节点深度)为键;已锁数值以 [registry 的 board_gen_table 条目](../../../registry/entities.yaml) 为准。第一关、第二关的深度 0 参考行只是表结构自洽性证明,全部 provisional——曲线数值归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的调参所有权。 + +| 参数 | 域 | 现行值 | 说明 | +|---|---|---|---| +| board_width / board_height | int [8, 64] | 10×10 / 12×12(provisional 参考行) | 图尺寸 | +| mine_density | float (0, 0.5] | 0.10 / 0.12(provisional) | 雷密度,与尺寸解耦 | +| inferability_target | float [0.85, 1] | 0.95 / 0.92(provisional) | 可推理率及格线;域下限 0.85 绝对锚 | +| solver_rules | enum {single, single_subset} | single_subset(冻结,非调参) | 推理规则域 | +| min_safe_count | int [1, 999] | 50 / 60(provisional) | 最小安全格数下限 | +| max_gen_attempts | int [1, 32] | 16(provisional) | 生成-验证重试上限;受成本闸联合约束 | +| board_biome | StringSet 非空 | {"dungeon"}(占位,provisional) | 图类型标签;词表定稿前只校验非空 | + +结构冻结(非调参项):键结构与每关深度 0 锚行、五阶段顺序、solver_rules、可推理率的合法信息源枚举、及格线域下限 0.85、成本闸常数 16384(provisional,调整走文档修订)、先布后删语义。 + +## 验收标准 + +- 确定性复现:同参数行同种子生成两遍,格状态与指标集逐位相同;换种子产物不全同。 +- 出生区安全:出生 3×3 与开局免费展开域内零雷零变异;外扩一圈内零变异(可有雷)。 +- 数字恒真:每个非雷格的数字恒等于其八邻雷数。 +- 布雷纪律:N ≥ 1、实际雷数 ≤ N、实际安全格数 ≥ min_safe_count。 +- 无开局白给板:开局免费展开域 ≠ 全部安全格,违例尝试弃用重试。 +- 可通关:每个安全格都能从出生区沿安全格八向连通到达;合法性闸先于质量评分。 +- 及格线:每张图实测可推理率 ≥ 该行及格线;任何行及格线 ≥ 0.85。 +- 重试有界:实际重试次数落在 [1, max_gen_attempts];同一次生成内的重试不开新随机流。 +- 成本闸:max_gen_attempts × 宽 × 高 > 16384 的行加载期被拒;玩法代码零墙钟依赖、零全局随机函数。 +- 降级诚实:零合法板照常出图,必带非法产物标记与最高级告警;进程不死锁,玩家界面得到诚实告知。 +- 加载期校验:布雷数下限、计数可行性、标签非空等违例组合加载期致命。 +- 黄金图回归:手工核验小板集的可推理率输出与登记整数对逐位相等(整数对比对,禁浮点容差);换生成参数(推理定义、信息源、定义版本号)必须重制向量并入版本库。 +- 表实一致:配置表字段定义与 registry `board_gen_table` 条目一致;两条已失义字段的清理登记见「待拍板」。 + +## 待拍板 + +雾格机制已整体移除(见[不做清单](../../05-不做清单.md)),下列归档条目随之失去依附对象,本文一律不装载,去留与归属待拍板: + +| 条目 | 失义原因 | 建议归属 | +|---|---|---| +| 雾参数两字段(fog_region_count / fog_target_ratio)、雾占比绝对上限 0.25 与雾域跨字段校验 | 依附已移除的雾格机制;registry `board_gen_table` 条目(只读)仍载有这两字段 | registry 条目修订:owner 改指本文档时同步清理字段与校验 | +| 双判据与 inferability_core(剔除雾格后的可推理率) | 判据的分子分母都绑定雾格集,本体失义;现行规则已回归单一判据(可推理率 ≥ 及格线) | registry 条目的指标与批量断言口径同步修订 | +| 雾相关生成约束(雾区仅落非 0 安全格、3×3 窗口非全雾、初始展开不触雾) | 全部以雾格集为载体 | 随机制移除废弃;地形变异若定稿出类似结构约束,在其文档重立 | +| 雾致清图预算增量(Δbudget_fog 与 fog_burden_ratio 两指标) | 计算对象是连锁不可达的雾格 | 废弃;行动经济清图支配性对账若需同类量,以地形变异的新载体重立 | +| 黄金图向量中的 core 整数对 | 依附双判据的第二腿 | 向量协议下次重制时一并清理 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/排雷循环/行动经济.md b/design/gdd/systems/排雷循环/行动经济.md index 2c3a54b3..c784170f 100644 --- a/design/gdd/systems/排雷循环/行动经济.md +++ b/design/gdd/systems/排雷循环/行动经济.md @@ -166,7 +166,7 @@ |---|---|---| | P1 | 储备池跨战斗携带开关 | 现行每场战斗清零(防滚雪球);是否解禁连刷策略,等实测数据说话 | | P1 | 清图奖励按图类型差异化 | 结构位已预留,内容归奖励道具经济的表设计 | -| P2 | 地形成本修饰(不同格子不同价) | MVP 价目均匀是有意简化;钩子已预留,待非雾地形变异定稿 | +| P2 | 地形成本修饰(不同格子不同价) | MVP 价目均匀是有意简化;钩子已预留,待地形变异首批类型定稿 | | P2 | 行动点耗尽的教学提示 | 规则已定"0 点即收轮";若新手困惑,加提示不改规则,归教学引导 | ## 调参表 diff --git a/design/gdd/systems/排雷循环/辅助道具.md b/design/gdd/systems/排雷循环/辅助道具.md index 65163367..075a6fb7 100644 --- a/design/gdd/systems/排雷循环/辅助道具.md +++ b/design/gdd/systems/排雷循环/辅助道具.md @@ -1,3 +1,197 @@ # 辅助道具 +> 一句话:扫雷侧辅助道具(显影、探测类) +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/a5-minesweeper-aux-items.md + +## 设计目的 + +挖掘期玩家偶尔会撞上"推理断头"的时刻:数字读不出下一格的把握,或者面前一片格子不知道哪格有货。辅助道具就是挖掘期的信息与行动力市场——它们是地牢里前人探险者留下的遗落物,从战斗奖励里捡来,在挖掘的关键时刻主动花掉:买回一点推理原料、提前看见惩罚格或奖励的身份,或者干脆给当轮加行动点。买情报的代价是真实的:产出道具的那个格子就出不了战斗奖励,花在一张图上的情报在弃图时一并沉没。道具零随机——它不掷骰子,只把棋盘上已经存在的事实交给玩家。 + +## 系统范围 + +边界这样划:辅助道具管四件事——道具本体怎么定义、从哪获取、怎么使用、信息存在哪。它不管道具掉不掉、掉多少(归掉落池的归口),不管行动点怎么扣(归账本),也不自己画界面。本系统的边界锚是[不做清单](../../05-不做清单.md)的一条裁定:允许"恢复推理原料"类道具(显影、预读),不允许道具替代推理。 + +负责: + +| 负责 | 说明 | +|---|---| +| 道具定义表 | 六件道具的字段定义:名称、维度、效果组合、目标形态、数值;承重护栏在加载期校验中强制 | +| 五维度框架与覆盖检查 | 每件道具至少归入一个维度;加载后自动检查每个维度至少有一件可用道具 | +| 关卡域库存 | 辅助道具的关卡背包:跨轮、跨图、跨战斗延续,关卡结束清空;与战斗道具背包是两个独立容器 | +| 使用规则与目标校验 | 什么时候能用、目标合不合法、失败分几级、哪一级不消耗 | +| 板级叠加层 | 道具信息的自持容器:按效果分类的格集,随图消亡、不回写棋盘 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 掉落池权重与档位、掉多少 | [奖励道具经济](../战斗循环/奖励道具经济.md)(数值 provisional 归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)) | +| 授予路由与使用编排的调用权 | [战斗结算](../战斗循环/战斗结算.md) | +| 行动点账本与加量过账 | [行动经济](行动经济.md) | +| 棋盘规则本体与动作执行 | [排雷玩法](排雷玩法.md) | +| 定义表承载与加载机制 | [数据配置](../表现与支撑/数据配置.md)(本系统是该表的回填责任方) | +| 界面呈现与使用交互 | [HUD 框架](../表现与支撑/HUD框架.md) | + +## 在核心循环中的位置 + +``` +战斗奖励(掉落池)──开格授予──▶ 关卡域库存 ──挖掘期使用──▶ 叠加层信息 / 行动点加量 ──▶ 继续挖格决策 +``` + +本系统站在排雷循环"挖掘期"的内侧:道具从战斗奖励里来,被玩家在挖掘途中花掉,产出的信息与行动点立刻回到"下一格挖哪"的决策里。它全程不碰轮末结算——效果即时可见,结算明细里没有道具行。 + +## 核心规则 + +### 道具帮什么忙:五维度归类与覆盖检查 + +每件道具必须标出它帮玩家哪类忙,归入五个维度之一或多个。维度是内容自查清单,不是运行时逻辑:游戏加载数据后自动检查每个维度至少有一件可用道具(掉落权重为正),保证玩家不管陷入什么困境都有得选;运行时完全不读这个标签,代码零维度分支。 + +| 维度 | 帮什么忙 | 现行承载 | +|---|---|---| +| 信息 | 恢复推理原料——把棋盘上已有、玩家暂时看不到的信息还给玩家(俗称"显影") | 暂无有效承载:显影尘(信息类道具)与地穴全图卷(全图级稀有道具)效果待重定,见待拍板 | +| 风险 | 标出惩罚格位置(真视——替玩家完成"这格有没有雷"的判断) | 探巢摆钟(圈定 3×3 窗口标出其中惩罚格)、爆破工兵包(组合效果之一) | +| 行动 | 给当轮行动点加量 | 工兵令(当轮行动点 +2)、爆破工兵包(+4) | +| 规划 | 预读未挖开格子的奖励身份 | 探宝罗盘(圈定 3×3 窗口,显示窗口内未开格子的奖励身份) | +| 反制 | 对抗地形变异(框架契约:地形变异每建一种新类型,至少配一件反制道具) | 暂无有效承载,见待拍板 | + +### 直接代答必须窄域:真视的范围护栏 + +凡是"直接告诉你惩罚格在哪"的效果(下文称真视),一次最多照亮 3×3 的窗口,任何道具都不允许全图看雷。全图级范围只留给恢复推理原料类的效果——显影、预读这类把已有事实交还玩家的信息,允许大范围(原则上被允许,见不做清单的边界锚)。这条限制写进数据校验:任何真视类道具的目标域字段超过 3×3,加载数据时直接报错拒绝——护栏由加载期强制,不靠运行时拦截。 + +**道具的收益在"少赌",不在"单赌更安全"**:信息类道具不改变棋盘,只减少玩家必须盲赌的次数。真视把 k 格移出盲挖候选域——这 k 格从"要赌"变成"必避或必旗"的确定决策;情报类道具抬高棋盘可推理率,收缩"只能赌"的格子池。单次盲赌的命中率会随格子池收缩而上升,这是正常读数——收益按"赌的次数变少、期望踩雷下降"计,不按单次命中率计。 + +``` +残余盲赌安全格数 n_s = (1 − ι) × |S| +单次盲赌踩雷概率 P(雷) = |M| ÷ (|M| + n_s) +``` + +| 变量 | 含义 | 来源 | +|---|---|---| +| ι | 棋盘可推理率(不必赌、可直接推理开挖的格子占比) | [棋盘生成](棋盘生成.md)的板级实际值 | +| \|M\| / \|S\| | 板上惩罚格数 / 安全格数 | 棋盘事实 | +| n_s | 推理覆盖之外、只能盲赌的安全格数 | 上式派生 | + +设计意图一句话:恢复推理的效果可以大,代替推理的效果必须小而贵——花钱全图看雷,等于把扫雷换成走格子。定量当量换算归[战斗结算](../战斗循环/战斗结算.md)的效果对照表,MVP 不入表。 + +### 道具从哪来:掉落池获取与关卡域库存 + +道具不卖、不合成,唯一来路是战斗奖励:辅助道具作为一个奖励类别进入掉落池,权重与档位归[奖励道具经济](../战斗循环/奖励道具经济.md)管,本系统只定义道具本体。玩家挖开带道具的格子时,[战斗结算](../战斗循环/战斗结算.md)把道具路由进辅助道具的关卡背包——它和战斗道具背包是两个独立容器,互不混装,寿命相同:都活到关卡结束,无论输赢,关卡末同批清空。 + +每件道具记录它从哪个格子的哪一轮被捡到,来源可归因;用一件少一件、不能反悔;背包不设上限,稀缺完全由掉落权重控制——按默认权重,辅助道具期望约每板 1.7 件、稀有件约每六板一件(provisional 读数,随权重联动)。本节无计算,供给读数见调参表。 + +### 什么时候怎么用:挖掘期发起,战斗结算编排 + +使用动作在挖掘期发起:轮次进行中的任意时点都行。结算阶段用不了——那个窗口属于战斗道具,两个"用道具"的入口在时间上错开,互不冲突。发起之后由战斗结算编排受理,按固定次序走四步: + +``` +发起使用 ─▶ ① 相位检查(非挖掘期 → 拒绝) + ─▶ ② 目标校验(不合法 → 全链拒绝、零消耗) + ─▶ ③ 逐效果应用(先空间效果,后加行动点) + ─▶ ④ 消耗道具(不可逆,回执交呈现层) +``` + +所有会失败的情况都被前两步拦下,后两步在合法输入下不会失败——"产生效果"和"消耗道具"永远成对发生。带两个效果的稀有道具,施加顺序钉死为先空间效果、后加行动点;定义表里效果的书写顺序不承载运行时语义。 + +用道具不扣行动点:成本在获取时已经付过——捡到它的那个格子没出战斗奖励;挖格、插旗的价格不受任何影响。道具只产生信息与行动点、不产生动作:系统没有任何自动使用入口——不会自动替你挖,也不会自动替你插旗。真视尤其要说清:它是信息不是保护,被标出的惩罚格挖开照样惊动;靠真视插旗仍花 1 点行动点,标中收益照走既有结算路径。本节纯流程,无计算。 + +### 信息住在哪:板级叠加层,随图消亡 + +道具产生的信息不写进棋盘,而是记入独立的板级叠加层——按效果分类的格集(现行有效的是真视格集与预读格集)。叠加层只记"哪些格要额外显示":数字永远读棋盘真值,奖励身份永远读奖励表,行动点走行动经济的账本,本系统不持有任何一份副本。这带来一条承重设计:排雷玩法的代码里没有任何一行"为了辅助道具"而写的判断——叠加层是派生信息层,零回写任何其他系统的状态。 + +叠加层随图消亡:清图换新图、花储备换新图的弃图刷新(见[行动经济](行动经济.md))、战斗结束,三者任一发生叠加层即清空,已花道具不返还——在一张图上花的情报随这张图沉没,这是设计意图不是疏漏。效果即时可见:使用发生在挖掘期,信息当场改变棋盘呈现,不进轮末结算明细。本节纯流程,无计算。 + +### 边缘与零信息:两条受理裁定 + +边缘受理:3×3 目标窗口的中心格贴边或贴角、窗口探出板外时,使用照常受理,按窗口与棋盘的交集结算——贴角剩 4 格、贴边剩 6 格。这是拍板过的体验规则:点在边缘不该吃"这格不能用"的闭门羹;交集只会比完整窗口小,窄域护栏只缩不扩。 + +零信息目标不消耗:对零信息目标使用不可用,分两级裁定——整张图都没东西可看(板级零信息)时,背包里这件道具直接置灰、使用入口禁用,根本选不了;单个位置没东西可看(点击级零信息)时,那一次点击被拒绝、给可辨认的提示。两种情况道具都留在背包:点错了不扣道具,挖掘期的手滑不该受罚。两条补充裁定:真视恒可用(零雷窗口等于"这 9 格没雷",信息非空);组合效果道具的判据取"或"——任一效果有信息即可用,所以爆破工兵包因加行动点恒可用。本节纯流程,无计算。 + +## 依赖与输出 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [奖励道具经济](../战斗循环/奖励道具经济.md) | 辅助道具作为奖励类别进入掉落池;权重、档位与投放归其管 | +| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 授予路由与使用编排的唯一调用方:四步固定次序的受理,叠加层与库存的清空也由它编排 | +| 上游 | [行动经济](行动经济.md) | 加行动点效果经其账本入口入账;使用道具本身不过账本、零扣费 | +| 上游 | [排雷玩法](排雷玩法.md) | 目标校验与信息呈现读取棋盘只读面;对侧代码零本系统分支 | +| 上游 | [地形变异](地形变异.md) | 反制维度的对抗对象:每种变异类型建行时按框架契约配至少一件反制道具(现行内容批待定稿) | +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 道具定义表的 schema 承载与加载校验通道;本系统是该表的回填责任方 | +| 下游 | [HUD 框架](../表现与支撑/HUD框架.md) | 库存条常读、使用交互与目标拾取、叠加层信息呈现、关卡末清空反馈 | +| 下游 | [教学引导](../表现与支撑/教学引导.md) | 教学候选:"买情报"闭环与"真视不是保护"的措辞口径(非阻塞) | +| 双向 | 各对侧系统 | 旧体系遗留 21 项跨系统义务(编排入口、呈现义务、表值回填等)逐项挂在对侧修订批核销,清单全文见 registry 辅助道具条目的 obligations 字段 | + +负空间:本系统不监听事件、不画界面、不用随机数、不写任何其他系统的数据;信息只来自三个既有事实源——棋盘真值、奖励身份、行动点账本。 + +## P0 最小闭环 + +1. 每张图开出前,掉落池已定好哪些格子带辅助道具(归奖励道具经济)。 +2. 玩家挖开这样的格子,战斗结算把道具路由进关卡域库存,记录来源格与轮次。 +3. 挖掘期玩家选中道具与目标发起使用,战斗结算按上文四步编排受理。 +4. 呈现层重查刷新:玩家看到情报或行动点入账,继续挖格决策。 +5. 换图、弃图刷新或战斗结束时叠加层随图清空;关卡结束(无论输赢)时库存同批清空。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 道具使用的动效与音频反馈 | 表现打磨项后置;音频排 Alpha | +| P1 | "买情报"闭环教学与"真视不是保护"口径 | 归教学引导,Alpha 里程碑,非阻塞 | +| P1 | 信息类道具的战斗当量入战斗结算效果对照表 | 间接效应的定量换算,调参期扩列,MVP 不入表 | +| P2 | 地形变异新类型(岩浆/冰冻等)的反制道具 | 随变异建行批,按框架契约每变异至少一件 | + +## 调参表 + +道具定义表与掉落权重的全部数值均为 provisional,归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)调参;现行登记值以 [registry 的 `a5_aux_items` 条目](../../../registry/entities.yaml) 为准,表 schema 归[数据配置](../表现与支撑/数据配置.md)承载、本系统回填。 + +| 道具 | 稀有度 | 维度 | 效果 | 目标形态 | 数值 | 池权重/档位 | +|---|---|---|---|---|---|---| +| 探宝罗盘 | 常规 | 规划 | 奖励预读 | 3×3 窗口 | — | 4 / t2 | +| 工兵令 | 常规 | 行动 | 当轮行动点加量 | 无目标 | +2 | 5 / t2 | +| 探巢摆钟 | 常规 | 风险 | 惩罚格真视 | 3×3 窗口 | — | 4 / t2 | +| 爆破工兵包 | 稀有 | 行动 + 风险 | 行动点加量 × 3×3 真视组合 | 3×3 窗口 | +4 | 1 / t3 | +| 显影尘 | 常规 | 信息 + 反制 | 待重定(见待拍板) | 待重定 | — | 5 / t2 | +| 地穴全图卷 | 稀有 | 信息 + 规划 | 待重定(全图预读半边仍成立,见待拍板) | 全图 | — | 1 / t3 | + +两件稀有道具的定位读数:双维组合加数值跳档。爆破工兵包的 +4 锚定"半轮预算"(每轮行动点默认 8,见[行动经济](行动经济.md);两者调参联动复核);稀有件供给读数约每六板一件(provisional)。 + +结构冻结(非调参项,改动走本文修订流程):真视窄域护栏、零信息目标不消耗、边缘窗口照常受理、使用零行动点成本、库存关卡域、用后不可逆、零随机。 + +playtest 预警(预注册,归难度曲线与Boss): + +| 预警 | 指标与读法 | +|---|---| +| 道具依赖 | 用了道具的轮次占比超过 50% 即警——扫雷决策被外包给道具 | +| 预读覆盖 | 预读格占开格前决策数过高即警——预读在替代推理,与上条联读 | +| 加点节奏 | 加行动点道具使用后,停手转存率异常上行即警——加点沦为刷储备的工具 | + +## 验收标准 + +- 护栏强制:任何标出惩罚格的道具定义,目标域字段超过 3×3 时数据加载直接报错拒绝;现行六件道具加载通过。 +- 覆盖检查:加载后自动检查五个维度各有至少一件掉落权重为正的道具;按现行内容,信息与反制两维度报缺(见待拍板)。 +- 两包正交:捡到辅助道具不进战斗道具背包;两包寿命相同,关卡结束(无论输赢)同批清空。 +- 使用窗口:非挖掘期的使用请求被拒绝且不消耗;挖掘期任意时点可发起。 +- 零消耗拒绝:目标不合法(例如点在已挖开的格子上)时道具不消耗、库存不变、反馈可辨认;板级零信息时图标置灰、入口禁用。 +- 边缘受理:3×3 窗口中心格贴板角时照常受理,按窗口与棋盘的交集(角 4 格)结算并正常消耗。 +- 顺序钉死:组合道具先空间效果、后加行动点;任何合法使用中"产生效果"与"消耗"成对发生。 +- 使用零扣费:使用前后,除加量道具自身的入账外行动点读数不变;挖格与插旗价格不受影响。 +- 随图消亡与不可逆:换图、弃图刷新、战斗结束时叠加层清空且已花道具不返还;同一件道具不能使用第二次。 +- 零随机与零特判:同一操作序列重放两遍,库存与叠加层投影逐位相同;排雷玩法代码中无为本系统而写的分支。 + +## 待拍板 + +以下条目源自旧体系的部分效果绑定在已被移除的地形变异类型"雾格"上,按既定口径(名称保留、效果待重定,见[游戏概念](../../00-游戏概念.md))降级登记于此;本文不代为设计新效果。 + +| 条目 | 失义原因 | 建议归属 | +|---|---|---| +| 显影尘效果重定 | 原效果"显影"为恢复雾下推理原料(雾格数字显影,时效本图持续);雾格已于 2026-09-14 从设计中移除(见[不做清单](../../05-不做清单.md)),效果整体失义。名称按登记保留,不另起名 | 辅助道具内容重定批(信息维度载体) | +| 地穴全图卷效果重定 | 原效果为全图显影 × 全图预读的组合:预读半边不涉雾、仍然成立;显影半边随雾格移除失义。重定需拍板:保留为纯全图预读,还是另配信息半边 | 辅助道具内容重定批(随批) | +| 反制维度承载失义 | 反制维度的唯一承载是显影尘,经由地形变异"雾"行的反制道具绑定(绑定值 [probe_dust]);雾行移除后绑定悬空。"每变异至少一件反制道具"的框架契约本身不受影响 | 地形变异新类型建行批,与显影尘重定批合流 | +| 维度覆盖检查破缺 | 信息、反制两维度现行无有效承载道具,加载后的覆盖检查在现行六件内容上无法通过。需拍板:检查对失义维度临时豁免,还是加速重定补齐 | 辅助道具内容重定批(含数据校验面) | +| 失义道具的掉落投放 | 获取与可用性本就解耦(可先捡后用);显影尘与地穴全图卷效果待重定期间是否继续进掉落池投放,未定 | 奖励道具经济的奖励池修订批 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/表现与支撑/HUD框架.md b/design/gdd/systems/表现与支撑/HUD框架.md index 37c9b859..e69cd843 100644 --- a/design/gdd/systems/表现与支撑/HUD框架.md +++ b/design/gdd/systems/表现与支撑/HUD框架.md @@ -1,3 +1,262 @@ # HUD框架 +> 一句话:界面布局与呈现层契约 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/d1-hud-framework.md + +## 设计目的 + +HUD框架把各玩法系统产生的事实变成玩家看得见、点得动、归因得了的界面。玩家对它的正确感觉是"一块干净的玻璃":看见的每一步都是真的,结算的每一行都能指回自己刚才的哪步棋,界面绝不替玩家思考、不静默改判、不用装饰伪装逻辑差异。 + +它同时是全项目唯一自带画面的表现层系统:不含任何玩法状态与玩法数值,显示的一切从上游现读现显;玩家改变游戏状态的操作它只递话、不执行。少了它,排雷玩法的动作没有落点,战斗结算的明细流水没有读者。 + +## 系统范围 + +边界这样划:本系统管"怎么呈现、怎么翻译输入、弹层怎么排队"。一个动作合不合法、结果算什么意思,归排雷玩法、行动经济、战斗结算等上游裁定;画面具体长什么样、组件落在哪一像素,屏级权威是 [battle.md](../../../ux/battle.md)——本文只锁系统级契约。 + +负责: + +| 负责 | 说明 | +|---|---| +| 战斗屏五区布局 | 五区系统级契约与常驻组件呈现形态;棋盘格尺寸定值档与装板校验 | +| 输入翻译 | 鼠标操作翻译成意图批次、一帧内整批提交;悬停预承诺与可挖域指示 | +| 提示体系 | toast 轻提示与一次性提示;拒绝反馈的呈现映射 | +| 模态覆盖层家族 | 图例面板、明细回看、胜负终局共用的层级纪律 | +| 订阅与载荷契约 | 呈现层订阅纪律、信号载荷的消费侧断言 | +| 程序化占位 | 美术终稿前的代码占位策略与图标键挂接 | +| 游玩遥测 | 拒绝、刷新尝试、窗口选择等观测行,写入试玩日志供调参取数 | +| 可访问性基线 | 字号、对比、闪烁、减动效、纯鼠标的验收底线 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 任何玩法状态与玩法数值 | 各玩法系统;数值表本体归[数据配置](数据配置.md) | +| 合法性判定与机制语义裁定 | [排雷玩法](../排雷循环/排雷玩法.md)、[行动经济](../排雷循环/行动经济.md)、[战斗结算](../战斗循环/战斗结算.md) | +| 屏级布局与动画时长的像素级裁决 | [battle.md](../../../ux/battle.md) | +| 美术终稿与动画密度 | [art-bible](../../../art/art-bible.md)与[战斗表现](../战斗循环/战斗表现.md) | +| 音频、教学内容、本地化文本生产 | [音频](音频.md)、[教学引导](教学引导.md)、[设置与本地化](设置与本地化.md) | +| 任何随机消费 | 无——呈现层零随机 | + +## 在核心循环中的位置 + +``` +玩家输入(挖掘期鼠标操作)──▶ HUD框架翻译成意图批次 ──▶ 排雷玩法受理 / 战斗结算兑现 ──▶ 明细流水与动作回执 ──▶ HUD框架就地刷新 +``` + +HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻译官,结算期它是流水的播音员。它不产生任何玩法事实,只负责把玩家的操作递进去、把结果画出来。 + +## 核心规则 + +本章六节:前三节定画面的骨架与进出规则(屏、弹层、刷新),后三节定数据与资产怎么进来(载荷、占位、底线)。 + +### 战斗屏五区双舞台:挖掘与结算同屏不切场景 + +战斗屏是 MVP 唯一的玩法屏,采用"双舞台"布局——战斗画面与扫雷图两块区域同屏常驻、互不顶替:挖掘期敌人在上方待机可见,轮末结算在原地逐行展开,全程不切换场景。"扫雷的因"与"战斗的果"因此永远摆在一起,因果不需要玩家凭记忆拼接。 + +五区各管一块: + +| 区 | 位置与尺寸 | 管什么 | +|---|---|---| +| A 关卡进度条 | 全宽 28px 顶栏 | 节点链步进与当前位置 | +| B 战斗画面 | 全宽 252px | 英雄卡、敌人卡、轮次阶段指示、结算明细带 | +| C 角色信息 | 左下 240×520 | 生命 / 攻击 / 储备数据框、状态效果槽、小人立绘 | +| D 扫雷图 | 中下约 760×520 | 行动点条与按钮组、棋盘本体、toast 槽 | +| E 道具栏 | 右下 280×520 | 库存常读列表;窗口态在原位点亮 | + +分区尺寸与组件落位的像素级裁决归 [battle.md](../../../ux/battle.md);五区结构与双舞台常驻是结构冻结项,修订走文档修订而非调参。 + +**结论**:棋盘格边长取两档定值——12×12 的板用 36px、10×10 的板用 45px([battle.md](../../../ux/battle.md) 拍板值);下式不推导这两档,只在装板时校验"定值塞得进扫雷图区",违例立即报错中止。 + +``` +可行性校验(装板期断言): + floor( min(棋盘区宽 − 水平边距, 棋盘区高 − 行动点条高 − 垂直边距) ÷ N ) ≥ 该档定值 + 且该档定值落在 [30, 45] px +数字字号 = max(18, ceil(格边长 × 0.5)),像素字体按整数倍缩放 +``` + +| 变量 | 含义 | 现行值 | +|---|---|---| +| N | 棋盘边长格数 | 10 或 12([棋盘生成](../排雷循环/棋盘生成.md)的两档尺寸) | +| 定值档 | 12×12 → 36px;10×10 → 45px | 结构冻结 | +| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 1280×800 下 760 / 476(520 减行动点条 44) | +| 边距 | 水平 / 垂直 | 各 16px | + +1280×800 下实算:可用高度 460px,12×12 得 38 ≥ 36、10×10 得 46 ≥ 45,两档都通过。棋盘数字直接显示排雷玩法给的真值——呈现层禁止自己算数字,这是"数据层从不说谎"在呈现侧的镜像。 + +### 提示与弹层:轻提示随起随消、重弹层排队进出 + +界面弹出的东西分两族。toast(从棋盘区上缘内侧浮出的轻提示条)是非模态的:弹出期间玩家照常操作棋盘,约 2.5 秒自动消退、不劫持输入。模态覆盖层(弹出期间挡住下方操作、要先处理才能继续的那种弹层)则相反,图例面板、结算明细回看、胜负终局画面都属于这族。 + +| 弹出物 | 模态性 | 进出规则 | +|---|---|---| +| toast | 非模态 | 自动消退 2.5 秒,不打断挖掘 | +| 图例面板 / 明细回看 / 胜负终局 | 模态 | 同一张登记序栈:统一入栈出栈、后开置顶、关闭逐层恢复 | +| 道具窗口 | 非模态(不入栈) | 道具栏原位点亮;激活期间锁定棋盘区输入 | + +两条纪律横跨两族。其一,"第一次遇到"类提示(本作没有双击快开、挖不相邻格要先走近)走 toast,每场冒险至多弹一次。其二,拒绝反馈不属于一次性族——每次被拒都要可感知,且图标与文案双通道冗余(不靠颜色单独承载);棋盘面拒绝(动作不合棋盘规则,目标格边框闪)与资源面拒绝(行动点或储备不足,数字脉冲)必须可区分。图例面板恒可随时打开回看,不设解锁门。 + +### 呈现层订阅纪律:界面不自持状态、订阅面只留两条线 + +呈现层不自持任何玩法状态——它不记账、不缓存玩法数值,画面上的每个数字都是触发时刻从上游现读的。全部刷新触发只来自两类通道:核心信号与动作回执。这条纪律是切片时期两起"界面在核心对象销毁后回读崩溃"的结构性防线。 + +订阅面刻意收窄:呈现层直接订阅的信号只有战斗结算的明细流水(逐行结算事件)与关卡节点地图的推进信号(见[关卡节点地图](../冒险循环/关卡节点地图.md))。排雷玩法与行动经济的消息一律经组合根(全项目唯一的核心装配与接线点:玩家写操作的唯一入口、界面消息的中转站)转发,或走命令式回执。 + +命令式刷新面如实登记——这些数据源不发通知或只发部分通知,界面刷新绑定在"动作调用返回"或"结算编排完成"的时点上,由组合根重查只读面后就地更新: + +| 数据面 | 刷新时点 | +|---|---| +| 棋盘(旗、小人位置) | 意图批次调用返回后重查 | +| 行动点 / 储备 | 每次写路径回执后重读 | +| 状态效果 | 绑定结算编排完成时点 | +| 库存 | 写路径回执后重查 | + +就地更新指只改变化的字段、不整块重建界面——整块重建会把敌人卡死亡灰化这类就地状态吞掉。 + +### 信号载荷契约:消息带着当场就能用的数据来 + +核心发给呈现的每份消息都必须"呈现当下就能用",三条规则: + +1. **销毁前捕获**:终局与死亡的呈现数据(血条归零、卡体灰化、终局判定行)在核心对象销毁之前就已写进明细流水与快照。 +2. **载荷自包含**:每行明细自带来源、数值、目标——界面不做反推、不回查容器补数据。 +3. **禁回读生命周期态**:"战斗还在不在"只准问封装好的只读查询,禁止读核心对象的内部状态位。 + +为什么这样定:核心对象销毁后,指向它的引用随时失效或返回空数据,"先销毁再补读"的时序在切片里崩过两次。载荷自包含还有一条可验收的推论——终局画面只消费流水与快照即可逐像素复现,这条断言进验收标准。 + +配套一条总纪律:消费的每份跨系统载荷,字段清单先写成消费侧断言(缺字段、多字段都算失败——信号参数没有运行时类型检查,断言是唯一防线)。逐字段 schema 底稿见旧版参考归档的载荷表;现行口径须回各上游系统文档的对外契约逐项对齐,缺口见「待拍板」。 + +### 程序化占位与图标键:先用代码画顶着、占位也要过硬指标 + +美术终稿未到位的面(砖面、敌像、图标、徽章、立绘)用程序化图形先行占位:色值直接取 [art-bible](../../../art/art-bible.md) 的冻结色板,形状按其形状语言用代码绘制。占位不是免检通行证——数字可读性硬指标(1–8 全档对格底对比 ≥4.5:1、半倍缩放可辨、纹带不侵入数字字形区)对占位同样适用;格子样张批不阻塞本系统其余验收。 + +图标用"图标键"挂接——哪个数据行配哪枚图标的固定对照表:效果、奖励、格面类型、敌种各自的数据表主键直接作图标键,一键一枚专属纹样。视觉侧依据与键集清单归 [art-bible](../../../art/art-bible.md) §4.6;映射一经冻结全局恒定、跨局禁重掷,键集扩容走该节修订,禁止运行时换图。映射表里查不到的键按错误处理:立即断言加"?"占位纹样与诊断,禁止静默显示空图标。 + +### 可访问性基线:看得清、不闪、纯鼠标玩得通 + +以下基线是验收底线,不是打磨项: + +| 基线 | 要求 | +|---|---| +| 对比度 | 全部数字对格底 ≥4.5:1 | +| 色弱安全 | 无信息仅靠色相承载;格态在灰度截图下可逐格分类 | +| 字号下限 | 棋盘数字 ≥18px、明细正文 ≥14px、tooltip ≥13px(1280×800 基座) | +| 闪烁 | 无每秒超过三次的闪烁 | +| 减动效 | 提供全部动画时长减半或跳终态的开关;结算逐行兑现是信息载体——可加速、不可整体跳过 | +| 输入 | 全部操作纯鼠标可完成 | +| 中文字体 | 随包内置并设为默认——运行时默认字体无中文字形 | + +按钮文案以 4 个汉字为宽度上限(「停手」「跳过」等),译成西文不破版。正式的分层方案(文本缩放、色盲模式、按键重映射)待专项文档定稿,见 P1 后置。 + +## 依赖与输出 + +上游读数与下游输出见下表;呈现层零直调玩法系统写接口——写路径唯一入口是组合根。 + +| 方向 | 系统 | 接口要点 | +|---|---|---| +| 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 棋盘只读投影(格态、数字、旗、小人)与移动路径查询;玩家意图批次经组合根提交 | +| 上游 | [行动经济](../排雷循环/行动经济.md) | 行动点 / 储备 / 相位只读值;刷新入口可用性预判加返回值兜底 | +| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 明细流水是结算明细带与道具窗口的统一数据源;窗口选择提交 | +| 上游 | [敌人系统](../战斗循环/敌人系统.md) | 英雄与敌人的只读投影(血量、顺位、当前拍、存活) | +| 上游 | [增益状态](../战斗循环/增益状态.md) | 状态投影经战斗结算呈现面取得,零直读 | +| 上游 | [奖励道具经济](../战斗循环/奖励道具经济.md) | 库存查询与奖励身份投影经战斗结算取得,零直读 | +| 上游 | [关卡节点地图](../冒险循环/关卡节点地图.md) | 节点链、当前节点、跨战斗生命携带的读数;胜利后推进 | +| 下游 | [战斗表现](../战斗循环/战斗表现.md) | 交付五区布局、明细带呈现位、敌人卡呈现语义;它只叠加动画密度与演出 | +| 下游 | [音频](音频.md) | 挂点事件源(明细行类型流、toast 触发);MVP 无音频 | +| 下游 | [教学引导](教学引导.md) | toast 与图例面板两个承载位——教学内容装进这两个容器 | +| 下游 | [设置与本地化](设置与本地化.md) | 中文字体随包、按钮宽度、术语表等契约的消费方 | + +呈现义务来源清单——各上游系统点名要本系统兑付的呈现义务,一行一条;规则本体以对方文档为准: + +| 义务来源 | 本系统兑付的呈现义务 | +|---|---| +| [排雷玩法](../排雷循环/排雷玩法.md) | 已开 / 未开格态一眼可辨;悬停预承诺与可挖域常驻指示;移动路径预览即合法性指示;每次拒绝可感知且棋盘面细因可区分;停手被改判可感知 | +| [行动经济](../排雷循环/行动经济.md) | 行动点与储备常显;储备清零反馈;棋盘面与资源面拒绝可区分;刷新入口与代价可读 | +| [战斗结算](../战斗循环/战斗结算.md) | 四类未生效明细行的呈现;道具使用窗口呈现;高光行强调;关卡末库存清空反馈 | +| [敌人系统](../战斗循环/敌人系统.md) | 意图线索映射成文且全局恒定;单位顺位与血条可读;敌方共享层数各卡同值 | +| [增益状态](../战斗循环/增益状态.md) | 状态栏常显;无状态时整排槽隐藏;有利 / 有害极性呈现不看数值符号 | +| [奖励道具经济](../战斗循环/奖励道具经济.md) | 已开格与库存的奖励身份常读;窗口至多选用一件;禁用件带原因 | +| [辅助道具](../排雷循环/辅助道具.md) | 库存条常读;使用交互与目标拾取;板级叠加层信息呈现 | +| [棋盘生成](../排雷循环/棋盘生成.md) | 零合法板的诚实告知(数据面经战斗结算上抛,本系统只管提示形态) | + +## P0 最小闭环 + +1. 进入战斗屏:五区同屏就绪,半秒内首格可点。 +2. 挖掘期鼠标操作经单意图帧整批提交(唯一写路径,经组合根)。 +3. 回执链:组合根重查只读面,界面字段级就地刷新。 +4. 轮末进入结算:棋盘区锁输入,明细带展开逐行兑现(战斗结算流水驱动)。 +5. 窗口锚点:道具栏原位点亮,选用或跳过后回结算流。 +6. 终局呈现(胜利 / 失败)伴随状态全清与储备清零反馈。 +7. 关卡末库存清空反馈后进下一节点或返回。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 远格点击自动"先移动再挖"复合意图 | 移动免费高频,两击摩擦先经实测验证再裁 | +| P1 | Gamepad 焦点序 | 纯鼠标已覆盖 MVP 全部操作 | +| P1 | 可访问性正式分层(文本缩放 / 色盲模式 / 按键重映射) | 待可访问性专项文档定稿 | +| P1 | 相邻域屏(节点奖励 / 关卡结算)完整屏形态 | 归后续 UX 文档;MVP 以覆盖层反馈承载 | +| P2 | 提示一次性作用域升级为存档级"一生一次" | 归[存档序列化](存档序列化.md)与[元进度](../冒险循环/元进度.md)后重议 | +| P2 | 调试面板退役 | 正式侧归元进度;诊断按钮保留为调试设施 | +| P2 | 探测类辅助道具的显影呈现面 | 接口归[辅助道具](../排雷循环/辅助道具.md)定稿批 | +| P2 | 音频挂点出声 | MVP 无音频,归[音频](音频.md) | + +## 调参表 + +本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。 + +| 参数 | 域 | 现行值 | 说明 | +|---|---|---|---| +| toast_display_ms | 每条提示 | 2500 | 过长挡节奏,过短读不完拒绝原因 | +| move_slide_ms | 每次移动 | ≤150(provisional) | 推荐值,移动手感留实测复核 | +| board_install_fade_ms | 每次装板 | 200 | 换图淡入时长 | +| clear_celebration_ms | 每次清图 | 3000–5000 | 上限约束:三五秒即收 | +| font_min_board / font_min_detail / font_min_tooltip | 1280×800 基座 | 18 / 14 / 13 px | 可访问性基线 | +| reduce_motion_scale | 每段动画 | 0.5 或跳终态 | 减动效开关系数 | +| detail_band_height | 结算明细带 | 24 / 84 px | 摘要 / 实时流两态高度 | + +结构冻结(非调参项,改动走文档修订):五区布局与分区尺寸、双舞台常驻、窗口原位激活、单意图帧纪律、弹层层级纪律、图标键映射契约、程序化占位策略、订阅纪律。性能预算为引用值:同屏 draw calls < 200、进入战斗屏 500ms 内可交互。 + +## 验收标准 + +以下判据逐条可测,全部通过才算闭环达标。 + +- 五区无遮挡、无重叠、无内容裁切(棋盘全部格子与数字完整可见),分区尺寸与 battle.md 布局表一致;同屏 draw calls < 200;进入战斗屏 500ms 内首格可点。 +- 两档板装板后格边长取定值档(36 / 45px)且可行性校验通过;数字字号不低于下限、整数倍缩放无模糊。 +- 已开 / 未开格态在灰度截图下可逐格分类;已引爆雷格"可通行可读"(已开底加巢穴纹、可作移动目标)。 +- 悬停光标三语义(移动 / 挖 / 旗)随目标切换并高亮目标格;悬停已开格画出合法路径(不可达不显示);可挖域常驻呼吸微光。 +- 一帧内意图整批到达,停手点击终结当帧收集。 +- 每次拒绝可感知:棋盘面、资源面、相位三类各有呈现且前两类可区分;停手被改判(本轮已清图)玩家可感知;拒绝反馈图标加文案双通道。 +- 结算逐行实时滚出且每行带来源标注;未生效类行聚合计数并带形状冗余;零值行不被吞;效果行的单次贡献与池合成值分示、禁相加误读。 +- 高光三档:标中旗行金框、清图奖励行金框、完美排雷全屏喝彩级——庆祝不打在空兑现上(首份即零兑付则不发高光)。 +- 道具窗口原位点亮、至多选一件、禁用件带原因、空库存不弹窗、提交的是窗口条目位置。 +- 状态槽显示图标加层数加剩余结算次数,悬停见来源;极性按键级表呈现(金满框 / 红缺框),空态整排隐藏、数据框上移补位;战斗结束全清有微文案。 +- 敌人卡:意图徽标是下一拍预告且挖掘期全程可见、映射跨局恒定、顺位可读、血量数字可读、敌方共享层数各卡同值;死亡灰化加碎裂退场(禁止瞬间消失)且就地更新不丢灰化态。 +- 终局:胜利金蜡封、失败暮蓝氛围层(明度不变);储备清零与状态全清两反馈不合并、时序不倒挂,关卡末库存清空反馈随后到达。 +- 任一模态层打开时遮挡物隐藏或输入锁定、关闭逐层恢复;tooltip 与明细行等动态区固定槽高、换行裁剪不推挤布局。 +- 终局呈现只消费流水与快照:核心对象销毁后呈现层对生命周期状态零回读;终局后重放渲染与实时渲染一致。 +- 消费的每份载荷逐字段断言通过(缺字段、多字段都算失败)。 +- 字号下限成立;无每秒超三次闪烁;减动效开启时时长减半或跳终态(结算兑现降速不跳过);全程纯鼠标可玩;中文渲染无缺字。 +- 呈现层零随机调用;切片临时名零残留。 + +## 待拍板 + +以下条目或随设计变更失去原义、或存在登记缺口;本系统不自作裁决,逐条登记。 + +| 条目 | 失义原因 / 现状 | 建议归属 | +|---|---|---| +| 雾图例条目 | 旧图例面板的"迷雾 = 无雷盲区"恒在条目,随雾格机制移除整体失义 | 未来非雾地形变异定稿时由[地形变异](../排雷循环/地形变异.md)提新条目,[教学引导](教学引导.md)承接内容 | +| 雾首遇一次性提示 | 旧三要点首遇提示随雾格移除失义;一次性提示的触发框架保留待新内容 | [地形变异](../排雷循环/地形变异.md)提出、[教学引导](教学引导.md)承接 | +| 四格态中的两个雾态 | 旧"四种格态一眼可辨"要求中两个是雾态,随雾格移除失义;现行已收窄为已开 / 未开两态 | 两态口径已落本文,失义部分无需恢复 | +| 雾纹带与已开雾格 tint 残留 | 雾纹理双通道资产规格与残留染色随雾格移除失义 | [地形变异](../排雷循环/地形变异.md)——未来非雾变异的纹带沿用形状通道重定 | +| 雾区全开合并域完成信号 | "整片雾区开完只报一次"的信号单元随雾格移除失义 | [地形变异](../排雷循环/地形变异.md)——若未来变异需要同类信号再议 | +| 敌种线索键集差异 | 切片临时敌名与文档冻结键集(蛆虫 / 伏击兽)不一致,映射表以文档键集为锚 | [敌人系统](../战斗循环/敌人系统.md)修订批对齐 | +| 未开格类型徽章呈现时机 | [art-bible](../../../art/art-bible.md) §4.6.3(提案已拍板待实施)要求未开格呈现家族类型徽章;[奖励道具经济](../战斗循环/奖励道具经济.md)现行锁定 MVP 只在已开格呈现——两口径未对齐 | [奖励道具经济](../战斗循环/奖励道具经济.md)极性提案实施批与本文共裁 | +| 呈现只读面契约登记缺口 | 终局快照、战斗存活查询、库存计数、奖励身份查询等呈现面函数已随切片实现,现行[战斗结算](../战斗循环/战斗结算.md)文档未登记对应对外契约 | [战斗结算](../战斗循环/战斗结算.md)修订批补登记 | +| 轮内已用刷新次数读数缺口 | 刷新按钮"本轮剩 N 次"文案所需的读数在[行动经济](../排雷循环/行动经济.md)无只读口,客户端无法现读 | [行动经济](../排雷循环/行动经济.md)补只读观测量 | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/表现与支撑/存档序列化.md b/design/gdd/systems/表现与支撑/存档序列化.md index d2cc9d5f..7cb4e0a1 100644 --- a/design/gdd/systems/表现与支撑/存档序列化.md +++ b/design/gdd/systems/表现与支撑/存档序列化.md @@ -1,3 +1,123 @@ # 存档序列化 -> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 D3) +> 一句话:存档契约与版本迁移 +> 状态:范围草案(待设计) +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,散见于归档索引) + +## 设计目的 + +本系统管的是"关掉游戏之后,玩家的东西还在不在"。序列化(本文含义:把游戏运行中的数据写成可存盘的档案,下次启动再原样读回来)与版本迁移(本文含义:游戏更新后,旧版本写下的存档要能被新版本继续读懂,必要时把旧结构改写成新结构)合起来,就是"存档契约"这门生意的全部。 + +这件事是[核心循环](../../01-核心循环.md)里"存档在变厚"那条故事线的底层承载:钥石攒进存档、倒下也不丢——写在纸面上就是本系统的职责。本文是范围草案:只收拢现行材料能确证的范围边界与已知约束,存档格式、字段、读写时机与迁移方案一概未定,见文末「待设计问题清单」。 + +## 系统范围 + +边界这样划:本系统只管存档的技术契约面——什么算一份完整的档案、何时读写、旧档怎么跟着版本走。至于存进去的**内容**归谁定(钥石算什么、摘要记什么),那是各内容系统的口径,本文照单承载,不替任何人定义进度。 + +负责: + +| 负责 | 说明 | +|---|---| +| 存档契约 | 存档的域划分与读写约定——域单位已由客户登记(见核心规则),字段与格式未设计 | +| 版本迁移 | 游戏更新后旧存档的兼容与改写策略——只立项,未设计 | +| 读写时机 | 何时写盘、何时读回——只立项,未设计 | +| 元进度的持久化承载 | 归档登记的职责口径:"元进度持久化框架"——钥石与解锁进度由本系统落盘 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 存进去的内容口径(钥石怎么得、能换什么) | [元进度](../冒险循环/元进度.md)——本系统只承载,不定义 | +| 冒险摘要记哪几件事 | [冒险结构](../冒险循环/冒险结构.md)——本系统只消费其快照域标识 | +| 数值配方本体(所有玩家一致的表) | [数据配置](数据配置.md)——表是配方,存档是玩家进度,两者分离(见核心规则) | +| 局内数值的持久化 | 无——局内资源全部单局清零,现行没有局内数值需要入档(见核心规则的反面清单) | + +## 在核心循环中的位置 + +``` +游玩中攒下的进度事实(钥石到手 / 冒险结算)──▶ 存档序列化写盘 ──(下次启动读回)──▶ "存档在变厚"被兑现 +``` + +存档序列化不占核心循环里的一段,它贴在"死亡重开"出口的外侧:局内胜负归零时,它保证玩家攒下的东西不跟着归零。核心循环把"存档在变厚"讲成玩家重开的理由之一,本系统就是那条理由的底层承载。 + +## 核心规则(已确证的范围边界与已知约束) + +本系统尚未设计,本节只收现行材料能确证的边界与约束;格式、字段、时机等全部问题见文末「待设计问题清单」。 + +### 基础层身份:无上游依赖的承载方 + +归档依赖分层为本文登记的身份是:基础层系统、无上游依赖、里程碑 Alpha,登记职责一句话是"元进度持久化框架"。这个身份有两条现行推论。其一,本系统不依赖任何玩法系统就能工作——它是被动的承载方,将来任何系统要把数据活过单局,都向本系统登记持久化归属,而不是本系统去追认每个系统。其二,登记职责虽从元进度起家,现行文档树上点名本系统的客户已经不止一户(见下一节)。 + +### 承接已登记的两户客户 + +现行文档里明确把数据托付给本系统的有两家,构成本系统目前确定的存档内容输入: + +| 客户 | 存什么 | 权威口径 | +|---|---|---| +| [元进度](../冒险循环/元进度.md) | 钥石(击杀关底 Boss 取走的永久资源)与解锁进度 | 钥石口径的权威在[游戏概念](../../00-游戏概念.md)与[元进度](../冒险循环/元进度.md),本文引用不展开 | +| [冒险结构](../冒险循环/冒险结构.md) | 快照域(域单位 = 一次冒险:主种子 + 各随机流计数器);冒险摘要(含本局主种子)供重开对照与复盘 | 域单位与摘要口径见[冒险结构](../冒险循环/冒险结构.md)的依赖表,本文照单承载 | + +表里的快照(本文含义:把某一刻的完整局面记录下来,供之后复盘与回放)由冒险结构定域,本文只管把它存取可靠。两户都是"生产方定内容、本系统管承载"的分工:元进度把钥石永不丢失立为它自己的验收判据,本系统作为承载方,将来的读写设计以不破坏这条判据为硬约束——档案写坏、读不回来,等于把玩家的钥石弄丢。 + +### 存什么:进度与配方分家,局内资源不入档 + +第一条边界:数据表与存档分家。表是配方,所有玩家一致;存档是玩家进度,每人不同。由此推出一条已知约束:存档只记进度事实(得了什么、解锁了什么),不得把数值配方内置进存档——数值改版后,旧存档仍能按加载时的数据表解释。这条边界从"数值单一事实源在数据表"的现行纪律直接推出,细节以[数据配置](数据配置.md)定稿口径为准(该文档并行写作中)。 + +第二条边界是反面清单:局内资源不入存档。行动点、储备行动点、道具库存、生命账本全部单局清零——各归各的系统管,现行没有任何局内数值需要持久化。这条边界已有登记在案的先例:储备行动点(玩家停手时把剩余行动点存入的池子,现行每场战斗清零)若未来开放跨战斗携带,按行动经济的归档登记口径,须修订其池规则并向本系统登记持久化归属,禁止静默超域;该开关的现行状态见[行动经济](../排雷循环/行动经济.md)的后置清单与[不做清单](../../05-不做清单.md)。 + +## 依赖与输出 + +本系统没有上游——这是归档依赖分层的登记口径,也是基础层身份的另一半:它先于一切玩法系统存在,供所有人存取。已登记的下游与协作: + +| 方向 | 系统 / 文档 | 接口要点 | +|---|---|---| +| 下游 | [元进度](../冒险循环/元进度.md) | 钥石与解锁进度的持久化承载方;对方以"钥石不丢"为验收,本系统以不破坏它为约束 | +| 下游 | [冒险结构](../冒险循环/冒险结构.md) | 快照契约域单位 = 冒险(主种子 + 随机流计数器);冒险摘要含主种子,供复盘 | +| 协作 | [数据配置](数据配置.md) | 表与档分家:数值口径永远以加载时的表为准;边界细节以其定稿口径为准 | + +## P0 最小闭环 + +MVP 不要求本系统的闭环:归档把本系统排在 Alpha 里程碑,与元进度同批(见[不做清单](../../05-不做清单.md):先把单局循环做扎实)。MVP 期没有存档,单局循环完整成立。Alpha 期最小闭环的方向跟着元进度的最小集走:钥石与解锁进度能写入存档、下次启动原样读回、数值表更新后旧档仍能读。快照与复盘域是否进首批交付,随元进度批排期裁决(见待拍板)。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 快照与复盘的持久化承接 | 域单位已由冒险结构登记为冒险;是否随 Alpha 首批落地见待拍板 | +| P2 | 多存档槽位 | 单档还是多档未定,见待设计问题清单 | +| P2 | 损坏处理与兜底策略 | 只立项未设计,见待设计问题清单 | + +## 调参表 + +暂无本系统自有的参数。存档格式、写盘时机、迁移策略都未设计,没有可调的现行值;将来若有(例如写盘频率一类),随设计定稿再登记。 + +## 验收标准 + +待设计。方向性判据(供未来定稿参考): + +- 钥石不因存档丢失:本系统的写入、读回与迁移,不得破坏[元进度](../冒险循环/元进度.md)验收标准中的钥石不丢判据。 +- 改版不弃档:数据表数值更新后,既有存档仍能被读懂并继续游戏,不要求玩家重开。 +- 零玩法依赖可验证:本系统的读写与迁移,能在不运行任何玩法系统的前提下独立验证。 +- 域界干净:单局清零的资源(行动点、储备行动点、道具库存等)不出现在存档内容清单里。 + +## 待拍板 + +| 条目 | 内容 | +|---|---| +| 存档契约条目的登记方式 | 内容归生产方、承载归本文的方向已定,但"存档里每个域由谁登记、登记在哪"没有成文——归档曾把存档结构整体记在元进度名下,现行元进度文档又把读写与迁移指给本文;域级契约的持有方式随本文设计批与元进度批联合裁决 | +| 快照域是否进 Alpha 首批 | 归档把本系统整体排 Alpha,但快照与复盘(主种子与随机流计数器的落盘)是否随首批交付,待元进度批排期时一并裁决 | + +## 待设计问题清单 + +1. 存档内容清单:除两户已登记的输入外,还有哪些系统的哪些数据需要入档?逐项登记持久化归属。 +2. 存档时机:何时写盘(每次结算、每枚钥石到手、退出时),写盘失败怎么办? +3. 版本迁移策略:迁移发生在哪一步(读档时、启动时),迁移失败怎么处理? +4. 存档槽位与多存档:单档还是多档,槽位与元进度账本如何对应? +5. 损坏处理:档案读不开时的玩家侧表现与数据兜底,是否保留备份。 +6. 冒险摘要的持久化归属:摘要在进程内存活即可,还是必须写入存档(重开对照跨进程是否成立)? + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档线索整合为范围草案(旧体系未单独成文) | diff --git a/design/gdd/systems/表现与支撑/教学引导.md b/design/gdd/systems/表现与支撑/教学引导.md index 558c9d09..b964ded1 100644 --- a/design/gdd/systems/表现与支撑/教学引导.md +++ b/design/gdd/systems/表现与支撑/教学引导.md @@ -2,7 +2,7 @@ > 一句话:新手教学与提示 > 状态:范围草案(待设计) -> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 D5) +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,散见于归档索引) ## 设计目的 diff --git a/design/gdd/systems/表现与支撑/数据配置.md b/design/gdd/systems/表现与支撑/数据配置.md index cfb6e9fd..055e7542 100644 --- a/design/gdd/systems/表现与支撑/数据配置.md +++ b/design/gdd/systems/表现与支撑/数据配置.md @@ -1,3 +1,223 @@ # 数据配置 +> 一句话:数值表与单一事实源管线 +> 状态:已定稿(自旧体系迁移) > 旧版参考:../../../archive/gdd-2026-09-14/d2-data-config.md + +## 设计目的 + +本系统是全部玩法数值的家。没有它,数字散落在代码里:调一次难度要翻改多处代码,战斗无法用固定种子复现,自动化测试也无从谈起。 + +它把两件事做成项目级纪律:其一,数字只写在数据表里、经统一读取口发放——改数值就是改表里的数,不动代码;其二,随机数只从封闭的具名通道发放——同种子必同局,这是全部回放与自动化测试的地基。它是玩家永远不该注意到的地基:不制造任何情绪,但失职会直接摧毁"可调、可测、可复现"这条信任底线。 + +## 系统范围 + +边界这样划:本系统管"数字放在哪、怎么装载校验、从哪读、随机从哪来"。各表的数值定成多少、玩法公式怎么算,归各回填责任方系统(回填:由归属系统把定稿数值填进表里,表结构先于数值存在);画成什么样归 HUD 框架,存档怎么存归存档序列化。本系统自身没有任何玩家可见行为。 + +负责: + +| 负责 | 说明 | +|---|---| +| 全部数值表的结构与数据 | 表结构类(声明每列的类型、取值域与默认值)与数据文件成对交付;结构先行,数值由各回填责任方回填 | +| 全局读取口与随机服务 | 两个进程级单例:类型化读取口(代码标识符 ConfigDB)与封闭随机流服务(代码标识符 RngService) | +| 加载、校验与热重载管线 | 启动加载、fail-fast 校验、调试构建热重载的状态管理 | +| 进度坐标查行 | 进度键表(跟着冒险进度成长的表)按(关卡序号 × 节点深度)两维坐标解析取行 | +| 表清单与对账 | 表路径固定、清单封闭;表实与 registry 逐字段对账 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 各表数值定值与玩法公式 | 各回填责任方(清单见核心规则的表清单),平衡总归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| 存档格式与版本比较逻辑 | [存档序列化](存档序列化.md),本系统只出版本常量与随机快照契约 | +| 界面呈现 | [HUD 框架](HUD框架.md) | +| 随机用途的设计合理性 | 消费方系统自证(随机须有界、可见或可推理),新增随机走增流通道 | + +## 在核心循环中的位置 + +``` +进程启动:加载 + 校验全绿 ──▶ 全局读取口 / 随机服务 ──▶ 被全部玩法系统读取(循环路径之外) +``` + +本系统不在"扫雷—结算—推进"的循环路径上,是全员的地基:启动时把全部表校验装载就绪,之后每个系统从这里读自己的表、按事件取随机号。主种子在冒险开始时由[冒险结构](../冒险循环/冒险结构.md)注入随机服务。 + +## 核心规则 + +### 单一事实源:数字只写在表里,取数只走一个口 + +单一事实源(本文含义:每个玩法数值只有一处权威载体,其余一律引用它)落到两条禁令上。第一,玩法代码零数值字面量:凡是设计师要调的数字,只存在于 data/tables/ 下的数据表里,代码里写死玩法数值即评审阻塞项。 + +第二,取数只走一个口:全部系统经全局读取口的类型化属性读数(读出来就是带类型的值,例如每轮行动点就是行动经济表里那个整数字段),禁止绕过它自己加载表文件或长期缓存副本——副本绕过校验,热重载换新值时它也不知情。 + +表结构与数据成对交付:结构定义先行(每个字段带类型、取值域与默认值),本系统先建齐全部占位表,具体数值由回填责任方按其系统文档回填——先有格子,后填数字。表结构零界面依赖:本系统代码不引用任何界面类,无窗口的命令行模式(headless)下也能跑完整战斗,自动化测试才有载体。 + +一句话总结这条规则:改数值 = 改表回填,不动代码;表不变,行为逐位相同。仅调试构建存在两个额外通道:从命令行注入的根目录加载测试夹具表;调试覆盖值可临时改读数、不回写表文件,正式构建结构性不存在覆盖源。 + +现行表集合如下(表结构类名供代码标识与工具链检索): + +| 表 | 载什么 | 回填责任方 | +|---|---|---| +| 行动经济表 `ActionEconomyTable` | 每轮行动点、动作价目、停手与刷新门槛 | [行动经济](../排雷循环/行动经济.md) | +| 棋盘生成参数表 `BoardGenTable` | 板尺寸、雷密度、可推理率目标等(进度键表) | [棋盘生成](../排雷循环/棋盘生成.md) | +| 变异表 `VariationTable` | 变异类型清单(现行空清单,合法态) | [地形变异](../排雷循环/地形变异.md) | +| 敌人表 `EnemyTable` | 敌种基线数值、遭遇数量区间、护甲类型、行为环(进度键表) | [敌人系统](../战斗循环/敌人系统.md) | +| 主角表 `HeroTable` | 主角生命上限与基础攻击 | [敌人系统](../战斗循环/敌人系统.md) | +| 状态效果表 `StatusEffectTable` | 增益/减益效果定义行 | [增益状态](../战斗循环/增益状态.md) | +| 奖励表 `RewardTable` | 奖励条目、类别、权重与档位 | [奖励道具经济](../战斗循环/奖励道具经济.md) | +| 奖励配置表 `RewardConfigTable` | 奖励供给控制参数(单行全局) | [奖励道具经济](../战斗循环/奖励道具经济.md) | +| 结算表 `SettlementTable` | 结算段序、当量参考敞口、封顶与克制矩阵(单行全局) | [战斗结算](../战斗循环/战斗结算.md) | +| 辅助道具表 `AuxItemTable` | 辅助道具定义行 | [辅助道具](../排雷循环/辅助道具.md) | +| 难度表 `DifficultyTable` | 难度修饰乘数(占位空表) | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | +| 关卡表 `LevelTable` | 逐关节点链与层名 | [冒险结构](../冒险循环/冒险结构.md) | +| 冒险表 `AdventureTable` | 关卡大奖励与代币记账(单行全局) | [冒险结构](../冒险循环/冒险结构.md) | +| 元进度表 `MetaTable` | 元进度字段(占位,键结构未定) | [元进度](../冒险循环/元进度.md) | + +举证:本节为数据纪律约定,无计算。违规检测 = 静态扫描加人工复核,随各表回填定稿与里程碑检查执行。 + +### 封闭随机流:随机只从一个服务按名取,同种子必同局 + +全项目的随机数只经随机服务的封闭命名流发放。封闭随机流(本文含义:随机通道清单封闭,只含登记过的具名消费者;新增通道必须改代码并通过评审)是对"随机即失控"的制度化设防:玩法代码禁止自建随机源、禁止调用全局随机函数。目的只有一个——同一条主种子(master_seed,一场冒险的随机源头数字,由冒险结构在冒险开始时注入,仅全流计数器归零时受理)驱动下,相同决策序列必然跑出相同结果,这是回放、审计与自动化测试共同的立足点。 + +现行流清单与取号时机: + +| 流名 | 消费方 | 用途:何时取号 | +|---|---|---| +| board_gen | [棋盘生成](../排雷循环/棋盘生成.md) | 每次生成新雷图(换图时)取号,布雷随机全部由此流供给 | +| reward_roll | [奖励道具经济](../战斗循环/奖励道具经济.md) | 每次装板时的奖励预分配批(格子奖励批 + 清图奖励批)取号 | +| encounter | [战斗结算](../战斗循环/战斗结算.md) | 每场战斗实例化取号,掷骰决定敌方实际数量 | + +取数有两个入口。玩法代码用取号入口:每调用一次,该流计数器加一并派生新种子,同一事件内共享同一实例。测试与预览用纯函数入口:按指定序号计算种子、不推计数器——预览不污染正式序列。种子由登记的派生公式计算,纯函数、跨引擎版本恒定,并登记了可复算的黄金向量。 + +生命周期:进程启动后流待命(未注入主种子就取数,致命中止,禁止默认种子兜底)→ 冒险开始注入主种子 → 冒险中按事件取号(计数器只增不重置)→ 冒险结束流保留供复盘。续玩与复盘的快照 = 主种子加各流计数器,由[存档序列化](存档序列化.md)消费;快照切出须发生在没有在用取号实例的时刻。要新增随机用途(含战斗内随机),必须走增流通道:改代码加流并通过评审——清单封闭是刻意的设卡。 + +举证:派生公式、实现规约与黄金向量登记见 [registry 的 stream_seed_derivation 条目](../../../registry/entities.yaml),本文不转载。 + +### fail-fast 校验:宁可启动失败,不带病运行 + +数据出错的处置只有一条铁律:致命中止,无软回退——错误数值上线比崩溃更伤信任底线。fail-fast(本文含义:校验不通过宁可立即中止,也不带着错误数据继续运行)按两个时机分开承载:加载期错误先收集后统一报错,一次看全所有错再中止;运行期错误当场致命,两者处置分开。 + +| 错误类别 | 什么情况 | 处置 | +|---|---|---| +| 加载期校验错误 | 字段越界、类型不符、表为空、缺入口锚行、重复键、权重和为零、悬空引用、段序违例 | 收集后统一报错,致命中止并输出错误清单 | +| 运行期致命 | 进度坐标越域请求、未设主种子就取随机数 | 不分构建走致命错误路径;无窗口模式进程非 0 退出 | + +``` +进程启动 ──▶ 逐表加载 ──▶ 逐表校验 ──┬─ 全部通过 ──▶ 就绪:类型化读数可读 + └─ 任一错误 ──▶ 输出错误清单,致命中止 +``` + +热重载(不重启进程、当场重新加载表文件的调试手段,仅调试构建)单独一套处置:战斗进行中的重载请求被闸门拒绝(闸门由[战斗结算](../战斗循环/战斗结算.md)在战斗开始时置位、结束复位),重载校验失败时保留旧表继续运行并给出错误清单——不杀调试会话,这是全部规则里唯一的软着陆。调试构建之外,加载与校验在任何构建形态一律致命。随机服务的状态线独立于表加载:重载成败都不触碰主种子与计数器。 + +举证:本节为处置纪律约定,无计算。校验双通道(正式通道致命、测试通道收集供冒烟逐类断言)与夹具注入为实现参照,登记见 [registry 的 config_db 条目](../../../registry/entities.yaml)。 + +### 悬空引用校验:跨表引用指到的键必须存在 + +一张表的字段引用另一张表的键时(例如奖励表某行声明自己授予某个增益效果,效果键必须真的在状态效果表里存在),加载期做存在性校验;指到不存在的键即悬空引用(本文含义:A 表填了 B 表的键,而 B 表里没有这个键),致命中止。这条校验防的是"改了 A 表忘了 B 表":删掉或改名一个键,所有指向它的引用当场暴露,而不是运行期才以莫名行为呈现。现行已激活的引用链有两条:奖励表的效果键与结算表的效果池映射键,都精确指向状态效果表。 + +举证:本节为校验纪律约定,无计算。逐表引用字段的登记见各回填责任方文档与 registry。 + +### 进度坐标查行:跟着冒险进度成长的表带两维坐标 + +跟着冒险进度成长的表(难度、生成参数、敌人配置)每行带(关卡序号 × 节点深度)两维坐标——难度曲线的雕刻轴从第一天就留在表结构层,而不是散落各处的魔法数字。解析规则两条:其一,进度坐标就近取用,无精确行时取不超过请求坐标的最近已有行并留一条警告(警告按"哪张表、缺哪维、停在哪个键"去重,是开发期异常信号而非审计工具);其二,实体键精确匹配,那一行没有这个名字就是悬空引用,直接致命中止——进度可以就近近似,"是哪种敌人"不能近似,身份近似会静默改变遭遇构成。 + +三条配套边界。每关必须含深度 0 的锚行(关卡入口行),缺失即加载期致命,防止入口请求静默落到深处行造成难度突刺。请求越域(关卡序号小于 1 或深度为负)在进入解析前致命中止。没有兜底行、没有外推:超过表范围的成长外推归[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)的公式职责,本系统只解析到最近已有行——解析永不发明数据。 + +表键本身不是永久契约:当现有键定不了新的内容形态(例如某种节点形态无法由现有键唯一确定),走本文的改键修订通道,并在 registry 同批登记。 + +举证:解析为查表逻辑,无计算;难度审计由离线的曲线导出工具承担(见 P1 / P2 后置)。 + +### 与 registry 的分工:表载活值,registry 登记事实与归属 + +[registry](../../../registry/entities.yaml) 是跨系统事实的唯一登记处:它登记"哪个实体归哪个系统所有、哪些字段与值已锁定",数据表载的是活值——调参就改表。两处不一致时,任何一边都不允许默默改值:冲突必须显式提出,修订走回填责任方的文档修订批并在 registry 同批登记。 + +对账口径:每张表定稿回填时,表结构与已锁字段须与其 registry 条目逐字段一致,各系统文档的验收标准都含这条"表实一致";对不上就是缺陷,不是可容忍的漂移。本系统对 registry 只读:条目的值只能由归属系统(回填责任方)的修订批改动。 + +举证:本节为对账约定,无计算。 + +## 依赖与输出 + +本系统是地基层:对上游无依赖,对下游是全项目的读数面与随机面。这张表就是删除任何一方时的影响面清单。 + +| 方向 | 对象 | 接口要点 | +|---|---|---| +| 上游 | 无 | 地基层,不依赖任何玩法系统 | +| 下游 | 全部玩法系统 | 唯一取数路径:全局读取口的类型化属性读取([排雷玩法](../排雷循环/排雷玩法.md)等无独立接口面的系统经本行消费) | +| 下游 | [棋盘生成](../排雷循环/棋盘生成.md) | 生成参数表承载与加载校验;board_gen 流取号 | +| 下游 | [行动经济](../排雷循环/行动经济.md) | 行动经济表承载 | +| 下游 | [地形变异](../排雷循环/地形变异.md) | 变异表承载(空清单合法态) | +| 下游 | [敌人系统](../战斗循环/敌人系统.md) | 敌人表与主角表承载 | +| 下游 | [增益状态](../战斗循环/增益状态.md) | 状态效果表承载;悬空引用校验的被指方 | +| 下游 | [奖励道具经济](../战斗循环/奖励道具经济.md) | 奖励表与奖励配置表承载;reward_roll 流取号 | +| 下游 | [战斗结算](../战斗循环/战斗结算.md) | 结算表承载;热重载闸门置位与复位;encounter 流取号 | +| 下游 | [辅助道具](../排雷循环/辅助道具.md) | 辅助道具表承载 | +| 下游 | [冒险结构](../冒险循环/冒险结构.md) | 关卡表与冒险表承载(登记现状见「待拍板」);主种子注入入口 | +| 下游 | [难度曲线与Boss](../冒险循环/难度曲线与Boss.md) | 难度表承载(占位);进度坐标查行的消费方 | +| 下游 | [元进度](../冒险循环/元进度.md) | 元进度表占位承载 | +| 下游 | [存档序列化](存档序列化.md) | 表结构版本常量;随机快照契约(主种子 + 各流计数器) | +| 下游 | [HUD 框架](HUD框架.md) | 调试热重载完成通知(仅调试构建) | +| 外发 | 无订阅 | 本系统不订阅任何玩法事件 | + +## P0 最小闭环 + +1. 结构先行:交付全部表结构类与占位表(含键结构),先有格子。 +2. 各回填责任方按系统定稿顺序回填数值。 +3. 进程启动:逐表加载、逐表校验,错误收集后统一报错;全绿进入就绪态。 +4. 全部系统经全局读取口读数,无第二取数路径。 +5. 冒险开始注入主种子,三条封闭流按各自事件取号。 +6. 调试构建热重载即改即验:战斗中被闸门拒绝,结束后手动再触发。 +7. 无窗口冒烟脚本跑通加载、校验、取数、派生全链路,退出码 0。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 战斗级可回放集成测试(同主种子同动作序列,步骤流逐行相同) | 需战斗域载体,随[战斗结算](../战斗循环/战斗结算.md)回放验收兑现 | +| P1 | 难度曲线导出工具(无窗口导出行解析矩阵供比对) | 难度审计的离线载体,[难度曲线与Boss](../冒险循环/难度曲线与Boss.md)期交付物 | +| P2 | 正式包构建的致命表现验证与调试覆盖结构性不存在验证 | 挂首次正式导出检查清单 | +| P2 | 进度键表的调试覆盖行寻址语法 | 调试覆盖现只支持单行全局表字段,行寻址登记为后续扩展 | +| P2 | 编辑器内表文件热重载自动化 | 低优先,未指派 | + +## 调参表 + +本文是表的管理者,不是数值的 owner:各表的玩法参数与现行值见各回填责任方文档的调参表,已锁数值以 [registry](../../../registry/entities.yaml) 为准。本系统自有的是管线常量——它们决定管线怎么运转,绝大多数冻结、非调参项: + +| 参数 | 现行值 | 说明 | +|---|---|---| +| 表路径清单 | data/tables/ 固定(调试注入根除外) | 冻结:散装路径破坏单点访问 | +| 表结构版本常量 `SCHEMA_VERSION` | 实现期定(MVP = 1,provisional) | 全部表结构携带版本字段;高于当前支持的版本拒读,比较逻辑归[存档序列化](存档序列化.md) | +| 随机流清单 | 封闭三流(board_gen / reward_roll / encounter) | 冻结清单;增流 = 改代码 + 评审,有意设卡 | +| 进度坐标解析策略 | 就近取已有行 + 警告;无兜底行、无外推 | 冻结:引入静默外推会掩盖难度断档 | +| 入口锚行校验 | 写死开 | 非调参项;重议走文档修订流程 | +| 调试覆盖开关 | 仅调试构建,默认关 | 正式构建结构性不存在;覆盖值永不回写表文件 | + +## 验收标准 + +- 干净检出:无窗口冒烟脚本从干净检出启动,表清单内全部表加载成功且表目录无清单外文件;任一失败输出错误清单并退出非 0。 +- 校验类别全覆盖:越界、文件缺失、空表、缺锚行、重复键、权重和为零、悬空引用各有一份测试夹具,逐类断言错误类别。 +- 致命真的会死:任一致命夹具经正式通道加载,进程非 0 退出,而非仅"校验器能发现"。 +- 黄金向量:随机派生纯函数对登记向量逐个复算相等;同输入恒同输出;同流同序号重复调用恒等。 +- 计数器纪律:连续取号跨模拟关卡切换,计数器单调不重置;热重载成败都不改变主种子与计数器。 +- 就近解析:请求无精确行时返回不超过请求坐标的最近行并留一条警告,同类警告去重;精确命中零警告。 +- 越域与未播种:坐标越域在进入解析前致命中止;未设主种子就取随机数致命中止,无默认种子兜底。 +- 热重载门:战斗中重载被拒绝且读数不变、不发通知;门未置位时新值可读且通知恰一次;校验失败保留旧表停留就绪态。 +- 版本常量在位:表结构版本常量存在且全部表结构携带版本字段(高版本拒读判定归存档序列化)。 +- 零字面量、零第二路径:静态扫描加人工复核确认玩法代码无数值字面量、无读取口之外的表加载、无全局随机函数调用。 +- 零界面依赖:本系统代码不引用任何界面类,无窗口实跑通过(静态扫描与实跑两项合成判定)。 +- 表实一致:各表结构与已锁字段和 registry 对应条目逐字段一致。 + +## 待拍板 + +以下条目存在缺口或已因设计变更失去依附对象;本系统不自作裁决,逐条登记。 + +| 条目 | 现状与失义原因 | 建议归属 | +|---|---|---| +| 棋盘生成参数表的雾字段与雾校验清理 | 表内两个雾参数字段(fog_region_count / fog_target_ratio)、雾占比绝对上限与雾域跨字段校验,随雾格机制移除而失义;registry 的棋盘生成表条目(只读)仍载有这些字段与校验 | 随[棋盘生成](../排雷循环/棋盘生成.md)清理批删除字段与校验,registry 条目同步修订 | +| 变异表旧字段集是否沿用 | 归档的字段集(信息规则、布置约束、反制道具绑定等)取值语义绑定具体变异类型;现行空清单下字段集沿用与否未定 | [地形变异](../排雷循环/地形变异.md)首批类型定稿批 | +| 关卡表与冒险表未入表清单 | 两表已在 registry 登记由本文承载、[冒险结构](../冒险循环/冒险结构.md)回填,但尚未建结构占位、未纳入加载清单(归档表清单之外的新增表) | 表结构类与加载清单登记随冒险结构定稿批建账 | +| 元进度表键结构未定 | 占位表只登记了归属,键结构待元进度定稿 | [元进度](../冒险循环/元进度.md) | + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档 GDD 压缩改写 | diff --git a/design/gdd/systems/表现与支撑/设置与本地化.md b/design/gdd/systems/表现与支撑/设置与本地化.md index ca13cc52..24b1308d 100644 --- a/design/gdd/systems/表现与支撑/设置与本地化.md +++ b/design/gdd/systems/表现与支撑/设置与本地化.md @@ -1,3 +1,135 @@ # 设置与本地化 -> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 D6) +> 一句话:设置项与多语言 +> 状态:范围草案(待设计) +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,散见于归档索引) + +## 设计目的 + +本文管两件不改变玩法、但影响"能不能舒服玩"的事。一是设置项:给玩家几个自己能调的开关,比如把动画放慢或直接看到结果。二是本地化(白话:把游戏里的全部文字翻译成其他语言,并保证换了语言之后字体和排版仍然正常显示)。这两件事都不碰核心循环的任何规则——没有本文,游戏照样完整可玩;有了本文,更多玩家才能按自己的方式玩。 + +本文是范围草案:只收拢现行材料能确证的范围边界与已知约束。设置项全集、界面形态、语言清单一概未定,全部留在文末的待设计问题清单里。 + +## 系统范围 + +边界这样划:设置与本地化只管"开关清单"和"文字翻译生产"这两本账。某个开关拨了之后画面怎么变,归定下那条呈现规则的文档;文案写了什么意思,归提供文案的各系统——本文只负责把开关收拢到一处、把文字生产成玩家所选的语言。 + +负责: + +| 负责 | 说明 | +|---|---| +| 设置项清单与语义 | 收拢全游戏的可调选项;目前能确证的输入见核心规则一节,全集待设计 | +| 减动效开关 | 可访问性基线已承诺的选项:开启后动画有时长减半或直达终态的通路 | +| 音量控制入口 | 音量在设置里调(接口位,白话:给对方预留的接入位置;生效侧归音频系统) | +| 多语言生产流程 | 全部玩家可见文案的翻译生产与语言切换——教学引导已在"不负责"表登记归本文 | +| 调试面板退役后的常规设置 | 切片调试面板 TunePanel 正式版退役,其常规设置部分归本文(见核心规则) | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 呈现语义与可访问性基线本体(字号下限、闪烁上限、纯鼠标可玩等) | [HUD 框架](HUD框架.md) | +| 逐行结算的呈现规则 | [battle.md](../../../ux/battle.md) 与 [HUD 框架](HUD框架.md),本文只引用 | +| 减动效开启后动画怎么演 | [战斗表现](../战斗循环/战斗表现.md)——本文提供开关,动画侧兑现归对方 | +| 音量调节对声音怎么生效 | [音频](音频.md)——接口位,以对方定稿口径为准 | +| 文案内容本体(教学条目、界面用语等写了什么) | 各系统文档——本文只做翻译生产,不改含义 | +| 数值调试工具(TunePanel 的另一半去向) | [元进度](../冒险循环/元进度.md) | +| 设置界面的布局与呈现 | [HUD 框架](HUD框架.md) | +| 存档的读写与版本迁移 | [存档序列化](存档序列化.md)——设置怎么存见待拍板 | + +## 在核心循环中的位置 + +``` +排雷 → 结算 → 下探(一场冒险)──▶ 循环之外:玩家打开设置调开关、换语言 +``` + +设置与本地化不在循环里占一段,而是包在循环外面的一层:它不产生任何数值,也不改变任何规则的判定结果。它服务的是循环之外的两个动作——调开关、换语言。 + +## 核心规则(已确证的范围边界与已知约束) + +本系统尚未设计,本节只收现行材料能确证的边界与约束;其余问题见文末「待设计问题清单」。 + +### 排期:全项目最靠后的打磨项之一 + +设置与本地化在[不做清单](../../05-不做清单.md)里被点名为 MVP 内的打磨项,一律排后——先验证核心循环,再谈打磨。归档索引给本系统的里程碑登记是"完整愿景",在全部二十个子系统的设计顺序里排在最后:这是全项目最靠后的系统之一。 + +排期靠后不等于地位游离。归档的依赖分层把本系统登记为基础层系统:无上游依赖,也登记为可以晚设计的叶子系统——没有任何系统的设计以本文为前提。反过来,[HUD 框架](HUD框架.md)定稿时把键位映射表等交付物列为对本文的输入(见下节),本文将来定稿时要接收这些已经落位的材料。 + +### 已承诺的设置项:目前的输入清单 + +以下是目前能确证将来要进设置的条目。本文只收拢登记,不展开每项的交互形态: + +| 输入 | 登记处 | 将来要做的 | +|---|---|---| +| 减动效开关 | [HUD 框架](HUD框架.md)的可访问性基线与 [battle.md](../../../ux/battle.md)的呈现承诺;[战斗表现](../战斗循环/战斗表现.md)已登记承接其动画侧 | 提供开关:开启后全部动画有时长减半或直达终态的通路。呈现侧的约束以 battle.md 与 HUD 框架为权威,本文不复述 | +| 音量控制入口 | 归档对本系统的常规分工登记;[音频](音频.md)并行写作中,尚未登记此分工 | 在设置里提供音量入口,生效口径以音频文档定稿为准 | +| 键位映射表 | [HUD 框架](HUD框架.md)定稿登记的交付物输入(全键族) | 如何转化成设置项(比如是否允许改键)待设计 | +| 结算风味词 | 归档概念层增补批随巢穴隐喻换轴登记("封印 / 镇 / 反制"一类类型风味词),只登记了存在、各归各的时机 | 内容与形态未定,本文只登记这条输入在 | + +### TunePanel 退役分流:本文是接收方之一 + +TunePanel 是切片期顺手做出的调试面板,正式版要退役。归档在 HUD 框架定稿登记里记下了退役功能的分流去向:数值调试的部分归[元进度](../冒险循环/元进度.md)的设计批,常规设置的部分归本文。本文只如实登记这条分流,不预设"常规设置"里具体有什么;将来面板退役时,本文按这份分工接收属于自己的那一半。 + +### 本地化的范围判断:文本量天然有限 + +[教学引导](教学引导.md)定稿时已把"文案的多语言生产"登记进它的不负责表,归本文——这是本文本地化职责的现行登记处。范围判断有一条现行事实打底:本项目不做重叙事,世界观只做碎片点缀(见[不做清单](../../05-不做清单.md)),游戏文本量天然有限。所以本地化要翻译的是一份小体量的文案集,不是长篇叙事文本;做哪些语言、流程怎么走,见待设计问题清单。 + +## 依赖与输出 + +| 方向 | 系统 / 文档 | 接口要点 | +|---|---|---| +| 上游 | [HUD 框架](HUD框架.md) | 可访问性基线(减动效选项的出处)与键位映射表等交付物输入;设置界面的呈现契约 | +| 上游 | [教学引导](教学引导.md) | 教学文案的多语言生产(对方"不负责"表登记归本文) | +| 上游 | [音频](音频.md) | 音量控制的生效侧——接口位,以对方定稿口径为准 | +| 协作 | [战斗表现](../战斗循环/战斗表现.md) | 减动效的分工:本文提供开关,动画侧的分档兑现归对方 | +| 下游 | 各系统文档 | 各系统只对文案本体负责,翻译生产与语言切换统一归本文 | +| 待定 | [存档序列化](存档序列化.md) | 设置的持久化是否走存档——随存档还是独立存储,见待拍板 | + +## P0 最小闭环 + +MVP 不要求本系统的闭环:[不做清单](../../05-不做清单.md)把设置与本地化列为打磨项一律排后,里程碑排在完整愿景。P0 的语义因此是一条硬边界:只有单一语言、没有任何设置项的游戏,就是完整可玩的 MVP。MVP 期的呈现由已定稿的语义直接承载——减动效的呈现承诺已随 battle.md 落位,只是玩家还没有开关可拨。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 已承诺设置项落位:减动效开关、音量控制入口 | 上游已承诺,随打磨期先落这两项 | +| P1 | 多语言生产流程与首批语言清单 | 生产流程未定:文案怎么管理、谁负责校对 | +| P2 | 设置项全集(画面 / 键位 / 可访问性 / 语言各类别) | 全集无来源,待设计问题清单裁决后展开 | +| P2 | 结算风味词输入的承接 | 归档只登记了存在,各归各的时机 | + +## 调参表 + +暂无本系统自有的参数。字号下限、动画时长档位等呈现常量归 [HUD 框架](HUD框架.md)与 [战斗表现](../战斗循环/战斗表现.md)的调参表;本文定稿时再登记自己的参数。 + +## 验收标准 + +待设计。方向性判据(供未来定稿参考): + +- 零依赖成立:不启用本系统时,核心循环的全部现行验收照常通过。 +- 开关可感:开启减动效后,动画有时长减半或直达终态的通路;逐行结算不可被整体跳过。 +- 换语言不破相:切换语言后,界面不出现缺译、占位符残留或文字溢出。 +- 文案可追责:每条玩家可见文案都进入生产流程,新文案漏翻时能被检查出来。 + +## 待拍板 + +| 条目 | 内容 | +|---|---| +| 设置的持久化归属 | 设置项随存档走还是独立存储,与存档序列化的关系未定;待对方文档定稿后对齐口径 | +| 音量控制的分工口径 | 入口归本文、生效侧归音频只是现行接口位;音频文档并行写作中,最终以其定稿口径为准 | +| 文案定稿权与翻译流程的分工 | 教学引导的待设计问题清单已登记"教学文案定稿权归属,以及与本地化流程的分工",两边共担,裁决时须对齐 | + +## 待设计问题清单 + +1. 设置项全集:画面、键位、可访问性、语言各类别各收哪些项——目前有来源的只有减动效与音量入口两条。 +2. 设置持久化(对应待拍板首条):随存档还是独立存储,存成什么。 +3. 语言清单与字体覆盖:做哪些语言,字体对相应字符集的覆盖怎么保证。 +4. 文案生产流程:文本键(每条文案在工程里的唯一编号,机器据此找到译文)怎么管理、谁负责校对、翻译在流程的哪一步介入。 +5. 设置界面的入口与形态:从哪里打开、什么时刻可以打开——与 HUD 框架协作定。 +6. 键位映射表是否转化为改键设置项。 + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档线索整合为范围草案(旧体系未单独成文) | diff --git a/design/gdd/systems/表现与支撑/音频.md b/design/gdd/systems/表现与支撑/音频.md index ca1af357..6c1db9cc 100644 --- a/design/gdd/systems/表现与支撑/音频.md +++ b/design/gdd/systems/表现与支撑/音频.md @@ -1,3 +1,143 @@ # 音频 -> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 D4) +> 一句话:音乐音效方向与实现 +> 状态:范围草案(待设计) +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,散见于归档索引) + +## 设计目的 + +玩家每次挖格、惊动巢穴、每轮结算、每场胜负,画面都会给出反馈;音频给这些时刻补上听觉通道——音乐定地牢的氛围,音效确认操作与兑现。它不产生任何数值、不承载任何规则语义:声音永远跟着已经发生的事走,是贴在循环各段上的纯反馈层。 + +本文是范围草案:音频的顶层方向(风格、正式与占位的取舍口径)归[美术音频方向](../../04-美术音频方向.md),该文档现行口径是方向未定稿、MVP 阶段用占位音效即可——本文只引用、不代定。全文只做三件事:划清范围边界;收拢排期双轨这条最重要的排期事实;收拢已登记的挂点输入。 + +## 系统范围 + +边界这样划:音频只管"什么时刻出什么声音"的方向与实现。本文把"声音跟着哪个事件响"叫作挂点(白话:挂点就是一个游戏事件,事件发生时声音跟着响)。挂点由上游系统与呈现层登记,本文是这些登记的消费方;声音之外的一切——界面设施、动画、音量开关——各归各家。 + +负责: + +| 负责 | 说明 | +|---|---| +| 四个基础反馈位 | 挖掘、踩雷、结算、胜利——归档登记给本系统的范围下限 | +| 挂点清单的正式化 | 把已登记的挂点候选逐个定成音效成品(什么声音、什么优先级、怎么混——均未设计) | +| 音乐方向与场景编排 | 哪些场景配音乐、场景之间怎么衔接——方向未定稿,随正式音频批设计 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 挂点的呈现机制(toast 提示条、结算明细带等界面设施) | [HUD 框架](HUD框架.md)——本文只消费其登记的事件 | +| 结算明细行本身(挂点的事件源数据面) | [战斗结算](../战斗循环/战斗结算.md) | +| 坍塌显形的连锁动画(与音效配对的另一半) | [战斗表现](../战斗循环/战斗表现.md) | +| 音量控制入口 | [设置与本地化](设置与本地化.md)——入口归对方,生效侧在本系统(口径以双方定稿为准) | +| 音频顶层风格的正式定稿 | [美术音频方向](../../04-美术音频方向.md)——本文只引用 | + +## 在核心循环中的位置 + +``` +扫雷段(挖格、插旗、惊动巢穴的即时反馈)──▶ 轮末结算段(逐行兑现的结算反馈)──▶ 终局(胜负反馈) + 音频不是循环里的一段,而是贴在循环各段上的听觉反馈层 +``` + +音频不出现在循环的任何一环里:它贴在每个环节上,让"挖了、踩了、兑现了、赢了"在画面之外还有一条听觉通道。挖掘期的反馈跟着棋盘事件走,结算期与终局的反馈跟着[战斗结算](../战斗循环/战斗结算.md)的明细流水(结算中每一件事逐行留档、标注来源的协议)走。 + +## 核心规则(已确证的范围边界与已知约束) + +本系统尚未设计,本节只收现行材料能确证的边界与约束;其余问题见文末「待设计问题清单」。 + +### 排期双轨:临时先响,正式后做 + +本系统最重要的排期事实是双轨:临时先响、正式后做。MVP 阶段无音频——正式音频与教学引导等并列为 MVP 内的打磨项,一律排后(见[不做清单](../../05-不做清单.md)),呈现层只把挂点留好、不出声。临时音效(白话:先用能响的占位音效顶着,不代表最终品质)已从本系统范围拆出、挂垂直切片里程碑(归档决策登记口径)。正式音乐与音效排 Alpha——前置是核心循环验证完成,顶层口径见[美术音频方向](../../04-美术音频方向.md),本文只引用。 + +双轨对本文的含义:设计可以晚做,登记不能不留。挂点先留是归档《HUD 与界面框架》定稿时登记下的义务——将来音效从哪些事件触发,若不在呈现层定稿时收拢好,正式开工就得回改上游。下一节就是这份已登记的输入。 + +### 四个基础反馈位 + +归档索引对本系统的范围登记只有一句话:挖掘、踩雷、结算、胜利反馈。这四个反馈位回答的是"这游戏至少得有哪几个声音"的下限问题。前两位发生在挖掘期、跟着棋盘事件走;后两位发生在轮末,跟着战斗结算的明细流水走——胜利反馈的触发点就是流水里的终局判定行(该行同时是胜负画面的数据锚)。 + +| 反馈位 | 游戏里的时刻 | +|---|---| +| 挖掘 | 玩家挖开一格 | +| 踩雷 | 挖到惩罚格、惊动巢穴——本轮的负面转折 | +| 结算 | 轮末逐行兑现的过程 | +| 胜利 | 判定获胜的终局时刻 | + +### 已登记的挂点输入清单 + +将来音效从哪里触发,上游定稿时已经登记了一批候选。本节只把它们收拢成一张输入清单——它是正式设计时"要做哪些声音"的起点;每个挂点配什么声音、什么优先级,一概未定。前五条来自归档《HUD 与界面框架》定稿时收拢的音频挂点清单,后三条来自各系统自己的定稿登记。 + +| 挂点输入 | 来源登记 | 说明 | +|---|---|---| +| 明细行类型流 | 挂点清单;数据面是[战斗结算](../战斗循环/战斗结算.md)的明细流水协议 | 结算中每件事逐行留档,行型封闭为 13 类——每种行型天然是一个音效挂点候选(伤害、治疗、道具、判定、高光等) | +| toast 提示触发 | 挂点清单(toast 提示条本体归 [HUD 框架](HUD框架.md)) | toast(棋盘区上缘浮出、自动消退的非模态提示)弹出时的拒绝、提示类短音候选 | +| 负反馈聚合单次 | 挂点清单 | 未生效、被拒类负反馈聚合为一次响,不逐行连响——呈现侧已按聚合计数防轰炸,音频侧对齐 | +| 开格拾取按奖励类别区分 | 挂点清单 | 呈现侧按奖励类别分色,音频侧对应按类别区分拾取音的听感 | +| 清图奖励专属音 | 挂点清单 | 清图奖励行是轮末的仪式峰值,要有专属的音 | +| 坍塌显形连锁音效 | [游戏概念](../../00-游戏概念.md)的概念层拍板 | 与[战斗表现](../战斗循环/战斗表现.md)的连锁动画同批配对登记,本文承接音效半边(见下节) | +| 蓄力拍的音频前摇 | [敌人系统](../战斗循环/敌人系统.md)的后置登记 | 敌人蓄力那拍的声音预告,作为读招的第二通道,登记为垂直切片可选项 | +| 道具使用的音频反馈 | [辅助道具](../排雷循环/辅助道具.md)的后置登记 | 道具使用的反馈音,表现打磨项后置,排 Alpha | + +### 坍塌显形:与连锁动画配对的音效半边 + +坍塌显形是连锁展开的玩家可见名——挖穿薄壳后,整片松动的地面塌陷露出。概念层拍板时,它的连锁动画(归[战斗表现](../战斗循环/战斗表现.md))与连锁音效方向(归本文)是同批配对登记的:一条连锁塌下去,画面与声音要对得上拍,将来须对位设计。对本文的约束只有一条:连锁音效不单独拍板,设计与批次跟连锁动画绑定(批次未定,见待拍板)。 + +## 依赖与输出 + +归档依赖分层把本系统划在打磨层,只依赖排雷玩法与战斗结算两个上游;本系统是叶子系统——只消费、不输出,没有任何系统的设计以本文为前提。 + +| 方向 | 系统 / 文档 | 接口要点 | +|---|---|---| +| 上游 | [排雷玩法](../排雷循环/排雷玩法.md) | 棋盘事件——挖掘与踩雷两个反馈位的触发源 | +| 上游 | [战斗结算](../战斗循环/战斗结算.md) | 明细流水(13 类行型)——结算、胜利反馈与全部明细挂点的事件源 | +| 上游 | [HUD 框架](HUD框架.md) | toast 提示触发;挂点先留的登记处(MVP 不出声) | +| 协作 | [战斗表现](../战斗循环/战斗表现.md) | 坍塌显形连锁动画与音效同批配对登记,将来对位设计(挂点未定) | +| 输出 | 无 | 叶子系统:纯反馈层,无对外接口 | + +## P0 最小闭环 + +本系统 MVP 不要求最小闭环:[不做清单](../../05-不做清单.md)把正式音频列为 MVP 内的打磨项一律排后,登记口径就是 MVP 无音频——呈现层把挂点留好、不出声。声音第一次出现是在垂直切片:从本系统拆出的临时音效先让关键反馈响起来([敌人系统](../战斗循环/敌人系统.md)登记的蓄力拍音频前摇是这一档的已知候选之一),具体覆盖哪些挂点未逐项登记,见待拍板。正式音频的最小集合排在 Alpha:四个基础反馈位与挂点清单全部出声。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 正式音效:四个基础反馈位与挂点清单全部出声 | 正式音频排 Alpha——MVP 打磨项排后 | +| P1 | 坍塌显形连锁音效 | 须与[战斗表现](../战斗循环/战斗表现.md)的连锁动画对位设计,批次未定 | +| P1 | 蓄力拍音频前摇 | [敌人系统](../战斗循环/敌人系统.md)登记为垂直切片可选项,读招的第二通道 | +| P1 | 道具使用音频反馈 | [辅助道具](../排雷循环/辅助道具.md)登记,表现打磨项排 Alpha | +| P2 | 音乐方向与场景编排 | 顶层口径:等核心循环验证后再定 | + +## 调参表 + +暂无本系统自有的参数。本文将来新增的混音分层、挂点优先级类参数,随正式设计定稿再登记。 + +## 验收标准 + +待设计。方向性判据(供未来定稿参考): + +- 挂点先留:正式音频接入前,挂点事件源(明细行类型流、toast 触发等)已在呈现层登记可用——接入零上游改动。 +- 双轨可替换:临时音效与正式资产走同一批挂点,替换不回改上游。 +- 四位可辨:挖掘、踩雷、结算、胜利四类反馈听感互相可区分。 +- 负反馈不轰炸:未生效、被拒类反馈聚合为单次,不逐行连响。 +- 类别可辨:开格拾取按奖励类别听感可区分,清图奖励有专属音。 + +## 待拍板 + +| 条目 | 内容 | +|---|---| +| 坍塌显形的对位批次 | 连锁音效与连锁动画同批配对登记,但合并设计的批次两文均未约定——排期时须与[战斗表现](../战斗循环/战斗表现.md)协调 | +| 临时音效的覆盖清单 | 垂直切片期临时音效覆盖哪些挂点、怎么验收,归档登记只有里程碑没有清单——动工前须补一份覆盖口径 | + +## 待设计问题清单 + +1. 音乐方向与场景编排:哪些场景要音乐(战斗、冒险、菜单等),场景之间怎么衔接切换。 +2. 音效清单成品与优先级:把挂点候选逐个定成正式音效——哪些先做、哪些合并、哪些不做。 +3. 混音与总线方案:音乐与音效怎么分层、相对音量关系怎么定。 +4. 与减动效选项的关系:呈现侧已承诺减动效——音频侧是否配对应的减噪、动态范围收缩,未拍板。 +5. 四个基础反馈位之外的基础音效(插旗、移动、道具窗口等)尚未见挂点登记——是否补登记、归谁提出,未定。 + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v0.1 | 2026-09-15 | 自归档线索整合为范围草案(旧体系未单独成文) |