Files
gplan-2/design/gdd/analysis/c2-adventure-structure.md
T
DKChan 85841f52be docs(gdd): 13 份系统 GDD 迁移为 design/analysis 两件套 v2
- design 件只装结论:v2 骨架(设计目的/系统范围/核心循环/领域章节/依赖与输出/P0 闭环/P1·P2 后置/调参表/GWT 验收/版本历史),AC/EC/OQ/义务台账编号全部保留
- 新建 design/gdd/analysis/ 13 份推演件:候选取舍/公式推导/数值锚定论证/已裁决争议按问题节组织,文末附去向映射表(零丢失审计)
- v1 原文备份于 design/gdd/legacy-2026-09-14-v1/(13 份)
- systems-index 文档树补 analysis 目录导航行
- gdd_lint 全量 PASS(14 文件 0 不通过);迁移零裁决——19+1 项待拍板已登记各 analysis 开放问题区
2026-09-14 20:39:11 +08:00

18 KiB
Raw Blame History

C2 冒险结构 设计推演

状态:concluded · 本文只装"为什么"——design/gdd/c2-adventure-structure.md 只收本文的结论。 修订时新增问题节,不删旧节(历史即依据)。 本文由 v1(lean 全文,2026-09-14)两件套迁移而来:原文的公式推导过程、数值锚定论证、候选取舍、体验锚点论证与已裁决争议按问题归位;文末附开放问题、历史审计与去向映射(零丢失审计表)。

问题一:冒险骨架为什么是"N=2 线性序列 + 死亡即终",序列为什么必须被内容覆盖锁死?

广度分析

  • 候选 A:维持切片现状(单关 N=1)——收益是零新增内容即可运行;代价是承载不了 P4"不断下探更险的层"的序列感,也没有 P1 要的冒险级对照物("这局我到第几层"没有坐标)。
  • 候选 B:线性序列 MVP N=2(L1 地牢基线 → L2 雾解锁 + 数值台阶)——收益是用最小内容批同时给出可感知难度台阶(通关率带下移 + 雾解锁 + 数值跳升)与冒险级坐标;代价是 N=2 生效前提 = C3 L2 深度轴行值(enemy/board_gen 的 (2, D1–D4))填充批,未落地期只能以 N=1 合法态运行。
  • 候选 C:更长或带分支/跳关的序列——收益是逼近愿景单局 20–40 分钟(OQ1);代价是扩关 = 内容批(链行 + 敌我数值 + 变异解锁同批落),MVP 期内容缺口风险最大,且跳关/回头路与 MVP 线性语义冲突。序列扩展走修订批,不许静默加回。

深度分析

序列覆盖义务把"冒险长度"从运行时问题变成内容生产问题:冒险关数 ⊆ 表内容覆盖,运行时战斗表 floor 兜底属 D2 既有语义,C2 不产生越界请求、玩家不可达越界关——越界关卡 = 内容生产缺口,必须在冒烟期被断言拦下(行集内每个 battle/boss 节点 (L,D) 在 enemy/board_gen 两表有精确行 + 序列关数断言,D2 跨表校验复用),而不是运行期被兜底吞掉。关卡行缺失同理是序列配置事故、fail-fast 处置,与战斗表 floor 兜底分属两层。

难度总闸在 N:P_run = Π P(L_i) 是乘法合成——N=2 合成带 [6%, 20%](L1 [30,50]% × L2 [20,40]%,L3+ [10,25]% 预留)对应 Roguelike"多数局止步中途"的体感;每加一关带再乘一次,所以扩关节奏必须用真人单关时长数据裁决(OQ1),不能拍脑袋加关。链模板(battle D0/D1 → reward → battle D2/D3 → rest → boss D4,7 节点 5 战斗深度)与深度标号规则(前序战斗节点计数、Boss = Dmax、reward/rest 不占深度不查战斗表)让 L1/L2 同构复用、加关只动内容批不动结构。

综合判断

定案:MVP N=2 线性序列(无跳关、无回头路),死亡即冒险终;通关 = Boss 战胜利(C3 Boss 通关编排归属 C1/C2 域——game-concept 冒险语义承接);序列覆盖由冒烟断言 + D2 跨表校验承接;A4 雾 unlock_level=2 是 L2 台阶的内容面(序列难度排布消费);扩关节奏归 OQ1(playtest 批次 2 后,C2 + C3)。

问题二:HP 为什么一条血走完整个冒险、恢复为什么只留恢复点与大奖励两个显式口?

广度分析

  • 候选 A:每关开始回满(切片现状)——收益是关卡间难度解耦、无需账本;代价是"Boss 前把血囤满"的囤积决策消失,P3 塌掉,冒险没有资源压力曲线。
  • 候选 B:跨战斗 HP 账本 + 两个显式回血口——收益是血成为冒险内唯一带得走的资源、恢复点位置 = 决策压力点;关卡切换零结算、账本收支四口(置满/交出/收回/入账)结构简单可测;代价是要给 C1 增 report_battle_end / heal_clamped 两个上报口,并经 begin_battle 覆盖值通道供值。
  • 候选 C:大奖励改部分恢复——收益是削弱对满血口径的强依赖;代价是 C3 逐关通关率带按每关满血开局校准,大奖励血回满正是该口径跨关成立的闭合件——改部分恢复则 F1 合成式整体失效、须改口径;否决,仅在 OQ2 大奖励形态扩展时重审。

深度分析

跨战斗 HP 持久性归 C1/C2 是已锁事实——B2 单位接口以初始 hp 入参、零变更,C2 以账本兑现自己那半边;B4 关内库存跨战斗延续与账本同构。三套跨战斗生命周期口径对齐:buff 战斗域清(B1)、RAP 战斗域清(A3)、库存关卡域清(C1 收束点)、血冒险域延续——冒险内无跨关遗留物,冒险层账本与摘要是唯一跨关状态。

clamp 边界:账本三写口全部 clamp [0, max_hp_eff];恢复点满血触发回 0 合法(账本静默——无明细行协议,与战斗域"奖励未生效"族不同层);defeat 腿 = 0 与"死亡即冒险终"闭合,不存在"带着 0 血进下一战"的中间态。max_hp_eff = HeroTable.max_hp + Σ大奖励提升——恢复比例 rest_heal_pct 随上限加成同步放大,防止高上限档恢复失效(切片 30 转正 provisional,数值复验归 C3)。

综合判断

定案:F2 账本结算式——战后回写 / 恢复点比例回血(floor(max_hp_eff × rest_heal_pct ÷ 100))/ 大奖励回满三写口全 clamp;血条跨关只降不自动回。切片"每关开始 HP 回满"转正改写为跨关延续,恢复只来自恢复点节点与大奖励两个显式口。依据链:B2 hp_persistence 归 C1/C2、B1 begin_battle 覆盖值入参、B4 关内延续同构。

问题三:关卡大奖励为什么是三件固定构成、为什么末关不兑付、为什么不进库存?

广度分析

  • 候选 A:发进背包的物品——与库存裁决冲突:库存生命周期 = 关卡域,收束点已清空,跨关携带违背"关卡末清库"既定语义;且奖励内容/库存语义归 B4/C3,C2 不碰库存域。否决。
  • 候选 B:三件固定(上限 +10 / 血回满 / 代币 +10/关)——上限提升经 begin_battle 覆盖值通道传入后续每战(hero 表运行期不可变,覆盖值是唯一合法提升通道);回满与 C3 满血开局校准口径闭合(问题二);代币给 C4 一个干净入账位(levels_cleared 乘子)。
  • 候选 C:三选一 / 攻击型 / 通关加成等扩展形态——MVP 无元进度消费面;AdventureTable 扩列结构位已留,随 C4 元进度设计(OQ2),通关加成位预留不启用(裁决归 C4)。

深度分析

末关不兑付的机理:上限提升只对"下一战"有收益,末关通关后没有下一战可受益——此时兑付是死数值,还虚增摘要口径;代币照记(乘子是 levels_cleared,不受影响)。

时点约束"收束清库之后、下一关开始之前"不可换:清库(B1 level_clear)在收束点已由 C1 触发,大奖励若插在清库前会被关卡域清空吞掉。上限 +10 的值锚是 C3 区间平移换算率(+10hp ≈ +1 轮)——回满 + 上限共同抬开局强度,上调须 C3 重扫 L2 通关率带;累加语义(每关一份,N=2 冒险至多一次)让多次兑付不产生重复歧义。

综合判断

定案:三件固定构成;F3 记账式 tokens = levels_cleared × token_per_level,通关与中途死亡同式、差异只在 run_completed 标记;末关不兑付;不进背包不占库存域。依据链:B4 库存关卡域裁决、C3 区间平移换算率锚、C4 记账位。

问题四:失败重开为什么是全新冒险、放弃为什么同失败型、种子域单位为什么是冒险?

广度分析

  • 候选 A:关卡重试 / 检查点——直接违背 game-concept"死亡则冒险结束"已锁语义。否决。
  • 候选 B:重开 = 全新一轮(新种子 / 第 1 关 / 满血 / 空手)——每局是新局面而非同一关复读(P1 锚点);保留面只有冒险摘要(坐标对照),清零面 = 账本 / 库存 / 种子域,Roguelike 重开纯度最高。
  • 候选 C:切片逐关播种 + 逐关重置——切片无冒险层的历史简化:逐关播种使冒险不可复现(快照契约域单位 = master_seed + 三流计数器对不上),转正改写为冒险域单种子、关卡间 RNG 连续。

深度分析

放弃同失败型:差异只在 run_completed 标记与"玩家主动";已到手的保留(已获大奖励不追回)——追回需要回滚大奖励三件,复杂度全在边界上且无体验收益。战斗中拒绝受理(战斗域单事务在飞),入口呈现仅非战斗期可达;MVP 无 UI 入口,语义预留归 OQ4 / D1。

种子接线:注入时点 = 冒险开始恰一次,冒险内雷图生成 / 奖励抽取 / 遭遇掷骰全部派生自该种子、冒险内不重置;重开种子与上局相同是合法态(熵源小域)——约束在通道而非值:种子生成禁走玩法随机通道、冒险内计数器随 reseed 归零,生成器归属归实现期 ADR(OQ3)。零流消费(RngService open_stream 零命中)让"冒险可复现域"有静态可验的判据(AC-8 静态扫描)。

综合判断

定案:死亡即冒险终(无关卡重试、无检查点);重开 = 全新一轮,保留面 = 摘要、清零面 = 账本/库存/种子域;放弃同失败型、非战斗期受理;一次冒险一粒种子、冒险 = 快照契约域单位(D3 复盘消费 master_seed)。依据链:game-concept 死亡即终、A3 RAP 战斗域生命周期、registry rng_service 快照契约 + D3 消费方。

问题五:C1/C2 编排边界为什么收束点在 C1、C2 为什么零直调?

广度分析

  • 候选 A:C2 直调 B1 战斗/清库——冒险层同时侵入战斗域与库存域,收束点语义分裂:库存清空触发源不唯一,时序归属扯皮。否决。
  • 候选 B:收束点在 C1(先调 B1 level_clear、再向 C2 宣布 level_end)——库存关卡域清空触发源唯一(C1 收束点),C2 零战斗域直调、零库存域直调,只守账本写口与收束监听。
  • 候选 C:收束点在 C2——C2 需要监听战斗内部状态才能判收束,跨层反向依赖,违背"C1 拥有关内行进"的切分。

深度分析

先例转正:切片 level_runner 的关卡域生命周期切两半——冒险域(序列推进 / HP 账本 / 大奖励 / 重开 / 种子)归 C2 侧新 owner,关内行进与节点兑付触发归 C1。B1 出口分发既定语义"关卡结束 = 上层显式调用"由 C1 收束点承接。

接口契约四件套(start_level / report_battle_end / heal_clamped / level_end)+ 战斗发起组装权是 C1 GDD 强制输入——C2 在 C1 之前设计,边界措辞即 C1 接口基线,C1 定稿须全款承接核对(门禁评审项)。战斗发起组装:深度取链位、关卡序号与血条取 C2 下放、hero_atk 走表值通道(MVP 冒险内不提升攻击)。防御双层:英雄死亡但战斗判定胜利为结构不可达(B1 判定 hero 先判),cleared 收束另有账本 hp > 0 防御断言——不依赖运行时序的单点正确。

综合判断

定案:C1 拥有关内一切行进与收束点,C2 只接结果;四件套 + 组装权成文为契约表(design 领域六);对侧义务全款列入 design 依赖与输出的活契约台账(C3 L2 行值批 / D2 种子注入入口 + AdventureTable 建表 / B1 begin_battle 入参供给方转正 / C1 全款承接核对 / C4 远期消费 / registry 三条目登记)。

开放问题(原文 OQ 全量,编号不动)

# 悬案 owner 时机
OQ1 冒险长度扩展节奏——MVP N=2(约 15–25 分钟)vs 愿景单局 20–40 分钟;扩关 = 内容批,节奏按真人单关时长数据定 C2 + C3 playtest 批次 2 后
OQ2 大奖励形态扩展(三选一 / 攻击型 / 通关加成)——AdventureTable 扩列结构位已留,设计随 C4 元进度 C2 + C4 C4 GDD
OQ3 master_seed 生成源(熵源通道禁走玩法随机——种子值生成器归属) D2 / 实现期 ADR 实现期
OQ4 放弃入口呈现与受理细节(仅语义已定:非战斗期受理、同失败型结算) D1 D1 / UX 批
OQ5 L2 display_name 表现层命名(provisional 名"第二层 · 雾漫巢径"——风格对齐 L1"苔藓回廊") C2 表现层 L2 内容批

迁移校验说明:未发现原文内部或原文与 registry 之间的数值/规则冲突;无新增待拍板项。唯一迁移副作用:registry hero_override_parameter_passing.adr_status 引用"C2 GDD 规则 3/4"作为 HP 账本供值的定义源——v2 迁移后 C2 规则改为领域内编号(对应现 design 领域三规则 1 与领域四规则 1–2),该跨文档编号引用失真,registry 修订归 owner 批处理(本迁移批禁碰 registry)。

附录 A:历史审计(自 v1 正文迁入,非现行规则)

  • 复核注记(v1 定稿时):v1 solo 出稿 → 经 /design-review(--solo 快速审批)APPROVED(0 blocking / 3 recommended——recommended 随下次修订批执行);专员/总监代理未咨询——生产前人工复核保留。评审日志:design/gdd/reviews/c2-adventure-structure-review-log.md。
  • 状态沿革:v1 出稿时状态头 In Design → v1.1 评审通过同步为 Approved(零规则变更),详见 design 件版本历史。
  • C2 是结构系统——运行时零新增公式;F1 为设计期工具式、F2/F3 为账本结算式,全部数值 provisional,调参所有权见 design 调参表(v1 数值节导语,随迁)。

附录 B:去向映射(零丢失审计表)

原文(v1)节/表 落点
头部(状态/版本/作者/承载支柱/一句话/复核注记) design 头部(状态/版本/一句话/推演件)+ 设计目的定位段(支柱);复核注记 → 本文附录 A
速览·定位 / 拥有(7 项) / 不拥有(6 项) design 设计目的定位段 + 系统范围(负责/不负责两清单,归属括注保留)
速览·上游输入 / 下游输出 design 依赖与输出主表对应行接口要点
速览·硬约束(零随机/序列覆盖/死亡即终/不碰库存域) 领域一不变式 3(零流消费)+ 领域五规则 4(单一种子注入点)+ 领域二规则 2(序列覆盖)+ 领域五规则 1(死亡即终)+ 领域六规则 3(不碰库存域)
体验锚点表(4 行:P4/P3/P1/锚点时刻) design 设计目的编号承诺 1–4(关键词与机制承诺逐条保留)
全局流程·冒险生命周期字符画 design 核心循环与冒险生命周期(等义压缩重排,全部分支与标签保留)
全局流程·出口分发表(4 行) design 核心循环出口分发表(原文保留)
核心规则 1(冒险骨架)+ 依据 design 领域二规则 1;依据链 → 本文问题一综合判断
核心规则 2(序列覆盖)+ 依据 design 领域二规则 2 + 细则表;依据链(D2 跨表校验 / C3 期望表与 OQ1 / A4 unlock_level=2)→ 本文问题一
核心规则 3(HP 账本)+ 依据 design 领域三规则 1–2;依据链(B2 hp_persistence / B1 begin_battle 入参 / B4 关内延续同构)→ 本文问题二
核心规则 4(大奖励)+ 依据 design 领域四规则 1–3 + 构成表;依据链(B4 库存关卡域 / C3 平移换算率 / C4 记账位)→ 本文问题三
核心规则 5(失败重开)+ 依据 design 领域五规则 1–3;依据链(game-concept 死亡即终 / A3 RAP 生命周期)→ 本文问题四
核心规则 6(种子接线)+ 依据 design 领域五规则 4–5;依据链(registry rng_service 快照契约 / D3 消费方)→ 本文问题四
核心规则 7(C1-C2 编排边界)+ 依据 design 领域六规则 1–3 + 契约表;依据链(B1 出口分发 / level_runner 先例转正)→ 本文问题五
规则 2 细则表(5 行) design 领域二首表(原文保留)
规则 4 细则表(3 行) design 领域四构成表(原文保留)
规则 7 细则表(接口契约 6 行) design 领域六契约表(原文保留)
枚举·冒险结果(3 值)/ 关卡收束结果(2 值) design 领域一"结果与收束枚举"合并表
枚举·冒险摘要(5 字段) design 领域一冒险摘要表(原文保留)
F1(结论/推导/变量/验算) design 领域二 F1(结论 + 表达式 + 变量表 + 验算表原文保留);推导论证 → 本文问题一深度分析
F2(结论/推导/变量/验算) design 领域三 F2(原文保留);口径与边界论证 → 本文问题二
F3(结论/推导/变量/验算) design 领域四 F3(原文保留);末关不兑付机理与扩展取舍 → 本文问题三
状态表(3 态)+ 不变式(5 条) design 领域一状态表 + 不变式规则 1–3(hp ∈ [0, max_hp_eff] 并入不变式 1)
边界情况表(11 行) 逐行内联:末关 Boss 胜利 → 领域四规则 3 + 领域一;start_level 越界 → 领域二规则 4;内容缺口 → 领域二规则 3;level_end 重复宣布 → 领域一不变式 2;恢复点满血 → 领域三规则 4;上限已有加成 → 领域四规则 2;战斗中放弃 → 领域五规则 3;死亡但判胜 → 领域一不变式 4;重开种子相同 → 领域五规则 5;跨关遗留物 → 领域三规则 2;关卡行缺失 → 领域二规则 4("对齐 C3 边界情况表 / B1 判定段"两处依据 → 本文问题一/问题五)
依赖表(上游 6 行 / 下游 5 行) design 依赖与输出主表(原文保留,B1 上下游两行分开保留)
跨 GDD 义务清单(7 行) design 依赖与输出·跨 GDD 义务台账表(活契约,原文保留)
Tuning Knobs(5 行 + 非 knob 冻结清单 + knob 交互) design 调参表(knob 列改 owner 列,域/默认/说明保留,provisional 标注)+ 表下两行注记;交互机理 → 本文问题二/三
验收标准 AC-1–13 design 验收标准 GWT 表(编号与内容不动)
开放问题 OQ1–5 本文开放问题区(编号不动)
版本历史 v1 / v1.1 design 版本历史(原行保留)+ 追加 v2 迁移行