diff --git a/design/gdd/02-系统清单.md b/design/gdd/02-系统清单.md index cfb0edb0..6125f3d2 100644 --- a/design/gdd/02-系统清单.md +++ b/design/gdd/02-系统清单.md @@ -42,6 +42,7 @@ | 文件 | 一句话概要 | 状态 | |---|---|---| | `关卡节点地图.md` | 单关内的节点图选路与推进 | 已定稿 | +| `关卡节点图生成.md` | 单关节点图的逐局随机来源:图模板池、抽签与实例化(实施未开工) | 设计草案·已立项待拍板 | | `冒险结构.md` | 整局冒险的关卡序列、失败与大奖励 | 已定稿·自旧体系迁移 | | `难度曲线与Boss.md` | 难度曲线、期望值带与 Boss 设计 | 已定稿·自旧体系迁移 | | `元进度.md` | 跨局成长(旧体系未单独成文) | 已定稿·已实现(2026-09-21 实现批,数值 provisional 归设计批标定) | @@ -82,6 +83,7 @@ | 战斗循环 | 地图战斗资源 | `REWARD_ITEM_ECONOMY` | b4 | | 战斗循环 | 战斗表现 | `COMBAT_PRESENTATION` | b5 | | 冒险循环 | 关卡节点地图 | `LEVEL_NODE_MAP` | c1 | +| 冒险循环 | 关卡节点图生成 | `NODE_MAP_GENERATION` | —(新立无旧代号) | | 冒险循环 | 冒险结构 | `ADVENTURE_STRUCTURE` | c2 | | 冒险循环 | 难度曲线与Boss | `DIFFICULTY_CURVE` | c3 | | 冒险循环 | 元进度 | `META_PROGRESS` | c4 | @@ -111,3 +113,4 @@ | v0.7 | 2026-09-17 | 关卡节点地图定稿批:`关卡节点地图.md` 状态行改**已定稿**(v1.0——分支节点图形态重开〔用户拍板重开 05 清单路径分支后置裁定〕、四类节点封闭枚举、全节点确认选路、遭遇构成编排面三条、节点奖励=功能道具正式渠道;概要行"节点链"改"节点图";配套 05 清单移除路径分支条目、06 清单三悬案收口 + 两条新增、registry level_table 与术语回填) | | v0.8 | 2026-09-21 | 元进度实现批:`元进度.md` 状态列「范围草案·待设计」→「已定稿·已实现」(2026-09-21 实现批落地,数值 provisional 归设计批标定) | | v0.9 | 2026-09-27 | UX 文档欠账处置批:`ux/` 目录入索引(battle.md / interaction-patterns.md / 新建 level-clear.md);四项欠账处置——player-journey 不建、accessibility-requirements 不另立(改指 HUD框架 基线 + 设置与本地化)、node-reward 挂魔法道具内容重定批(06 登记)、level-clear 建档 | +| v1.0 | 2026-09-27 | 节点图生成立项批(用户拍板立项——06 条目「关卡内结构随机生成」随批改状态):`systems/冒险循环/` 新建 `关卡节点图生成.md` 设计草案 v0.1(图模板/模板池/抽签三概念、三级台阶路线、MC 测量对账条款、五拍板点);文档树补行 + 命名对照表补 `NODE_MAP_GENERATION` 行 | diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 1ab2546c..932ceb8c 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -215,11 +215,11 @@ #### 关卡内结构随机生成(哈迪斯 / 哥布林弹珠式布局变化) -**现状**:用户 2026-09-20 方向性提及(哈迪斯 / 哥布林弹珠式的关卡内布局随机变化)。现行切片关卡为固定流程——节点图行集读关卡表,图版结构不随局随机;本事项未立项、未设计。 +**现状**:用户 2026-09-20 方向性提及布局随机变化(哈迪斯 / 哥布林弹珠式);现行节点图读关卡表固定行集。**2026-09-27 用户拍板立项**,设计文档已交付:[关卡节点图生成](systems/冒险循环/关卡节点图生成.md)——图模板池逐局抽签(N=1 回滚档)+ 三级台阶 + MC 测量对账;实施未开工。五拍板点待定:① L1 是否抽签 ② `node_map` 增流 ③ 实施时点 ④ 首版池规模 ⑤ 抽签时点,荐值见文档拍板点表。 -**归属**:[关卡节点地图](systems/冒险循环/关卡节点地图.md) +**归属**:[关卡节点图生成](systems/冒险循环/关卡节点图生成.md)(设计 owner;行集内容责任方仍为[冒险结构](systems/冒险循环/冒险结构.md),行进与图合法性校验归[关卡节点地图](systems/冒险循环/关卡节点地图.md)) -**状态**:方向观察待立项(2026-09-20 登记防散佚;立项前不展开设计) +**状态**:已立项·设计草案待拍板(2026-09-27) ### 难度曲线与Boss diff --git a/design/gdd/systems/冒险循环/关卡节点图生成.md b/design/gdd/systems/冒险循环/关卡节点图生成.md new file mode 100644 index 00000000..6cf08c6c --- /dev/null +++ b/design/gdd/systems/冒险循环/关卡节点图生成.md @@ -0,0 +1,167 @@ +# 关卡节点图生成 + +> 一句话:单关节点图怎么从固定配置变成逐局随机——图模板池、抽签与实例化 +> 状态:设计草案(2026-09-27 用户拍板立项;五项拍板点待裁决,实施未开工) +> 旧版参考:无(旧体系未单独成文;本事项自 2026-09-20 起登记 [06-待办清单](../../06-待办清单.md)「关卡内结构随机生成」条目) + +## 设计目的 + +现行每关的节点图是关卡表里写死的一行行集——玩家每一局走的是完全相同的图。对照参照游戏:杀戮尖塔每层抽一张新地图,哈迪斯的房间编排逐局变化——布局变化本身就是"再来一局"的驱动力的一部分,而本作这块目前是零。 + +本文立项把单关节点图从固定配置升级为逐局随机。边界先说死:本文只管**图从哪里来**;图怎么走、走到每个节点发生什么、图合法性怎么校验,全部仍是[关卡节点地图](关卡节点地图.md)的现行规则,本设计对它们零改动——生成侧的职责止于"生产一张合法的图",生产出来的图进的是既有校验、既有行进、既有兑付。 + +## 系统范围 + +边界这样划:图模板与模板池是内容资产(与敌人表行、棋盘参数同级的配置内容),抽签是玩法随机(消费主种子派生流),实例化的产物就是关卡表行集——行集内容的责任方仍是[冒险结构](冒险结构.md),本文管的是行集**怎么被生产出来**。 + +负责: + +| 负责 | 说明 | +|---|---| +| 图模板的结构定义 | 一张模板有哪些组成部分、满足什么条件才算一张合法模板 | +| 模板池与关卡表接线 | 每关从哪个池抽、池怎么随关卡表配置 | +| 抽签时机与随机流 | 什么时候抽、消费哪条封闭流、可复现域怎么覆盖 | +| 实例化与校验交接 | 模板落成行集,交给既有的图合法性校验 | +| 台阶路线与测量对账 | 三级台阶的推进条件;模拟读数不被随机污染的口径 | + +不负责: + +| 不负责 | 归谁 | +|---|---| +| 节点图怎么走、选路、兑付触发、收束点 | [关卡节点地图](关卡节点地图.md)(现行规则零改动) | +| 图合法性校验的检查项与算法 | [关卡节点地图](关卡节点地图.md)(LevelTable.validate 现行——生成侧只是它的上游供给方) | +| 池里放几张模板、每张模板里放什么遭遇数值 | [冒险结构](冒险结构.md)(行集内容责任方)与[难度曲线与Boss](难度曲线与Boss.md)(数值所有权) | +| 战斗节点内部的敌人配置与初始化 | 战斗循环(节点编号寻址口径零改动) | +| 节点图的画面呈现 | [HUD框架](../表现与支撑/HUD框架.md)(节点态照旧读图,零新呈现语义) | + +## 在核心循环中的位置 + +``` +冒险结构 ──开始关卡──▶ 关卡节点图生成(抽模板 → 实例化行集)──行集──▶ 关卡节点地图(校验 → 选路行进) +``` + +[核心循环](../../01-核心循环.md)里"关卡:节点链逐节点推进"这一段之前,多了一步"这一关的图是哪张"的抽签——本系统就站在这一步。它向上接冒险结构的开始关卡请求,向下把实例化好的行集交给关卡节点地图;生成之后的一切(校验、行进、兑付、收束)与本系统无关。 + +## 核心规则 + +### 概念三件套:图模板、模板池、图模板抽签 + +**人话阶段**:本系统只有三个概念,弄清它们谁包含谁,整个系统就读懂了。 + +**图模板**(本文含义:一张手工编写的合法节点图骨架——一个节点集合〔每个节点带类型标注与关卡内唯一编号〕加一个连线集合)是内容资产,不是运行期生成物。**实例化**(本文含义:把模板原样照抄落成该关的行集——节点集合与连线进关卡表行,零变换)之后,它就是关卡节点地图要加载的那张图。 + +| 概念 | 一句话定义 | 归谁 | +|---|---|---| +| 图模板 | 手工编写的合法节点图骨架;实例化即行集 | 本文(结构规则);内容归冒险结构 | +| 模板池 | 关卡表逐关行配置的同关可抽模板集合,池大小 N(N≥1) | 本文(规则);配置承载归数据配置 | +| 图模板抽签 | 关卡开始时从池中均匀抽一张 | 本文(时机与流);流基础设施归数据配置 | + +模板池挂在关卡表逐关行上:行集从"单一节点集合"扩为"模板池"。**N=1 的池里只有现行那张图,逐局抽签退化回固定图**——这是**回滚档**(本文含义:任何一关把池缩回一张模板,该关行为就与今日固定配置逐位等价的保险形态)。整个设计因此可增量落地:先全关 N=1,再逐关扩池。 + +抽签消费主种子派生的封闭命名流,流名提案 `node_map`(增流须单独拍板——rng_service 流清单是封闭的,见拍板点②)。 + +**内容纪律**:每张新模板等于一个小内容批——模板里每个战斗与 Boss 节点都必须在敌人与棋盘生成的数值表里有精确行,义务从冒险结构加关纪律的"每关一行集"细化到"每模板一行集";冒烟覆盖义务同批扩为遍历池内全部模板校验,不只抽中的那张。 + +### 抽签时机与可复现 + +**人话阶段**:什么时候抽、抽完怎么保证复盘对得上,是本系统接入现有随机纪律的两件事。抽签时点 = **开始关卡处理内、加载节点图之前**,逐关各抽一次(不是冒险开始一次抽齐三关)——抽签时机贴着"这一关的图要用"的时点,主种子的复现域天然覆盖。 + +``` +冒险结构(开始关卡:关卡序号、当前生命、生效上限) + → 关卡节点图生成:按关卡序号取模板池 → 抽一张(图模板抽签流,恰一 scope) + → 实例化为行集 → 交图合法性校验(关卡节点地图现行,零改动) + → 关卡节点地图加载行集 → 呈现选路停点(现行流程原样续跑) +``` + +可复现域沿用既有口径:主种子 + 各随机流计数器(语义权威归[冒险结构](冒险结构.md)「失败重开与主种子」节,本文不复述)。抽签每次消费恰一个带编号的 scope,计数器随既有快照契约入档——[存档序列化](../表现与支撑/存档序列化.md)零新增域。同主种子同操作序列的两局,逐位同一张图。 + +第一关注记:第一关现行单链模板保持池中唯一(N=1)即天然固定,教学位纪律不需要新机制——是否维持由拍板点①裁决。 + +### 三级台阶路线 + +**人话阶段**:2026-09-21 呈报的三级台阶(图模板抽签 → 骨架固定+属性随机 → 全程序生成)随本批立项成文为正式路线。每一级都比上一级多一点随机,每一级都必须过同样两条不变量:①产物过图合法性校验(检查项口径归关卡节点地图,本文不复述);②商店房"每关恰 1、关底 Boss 前一位必经位"的编排约束在生成侧成立——冒烟断言照旧把关,校验零新增。 + +| 台阶 | 内容 | 前置条件 | +|---|---|---| +| 一:图模板抽签 | 每关模板池 N≥1,逐局从池中抽一张手工模板实例化 | 测量对账条款先行(见下节);每张新模板按内容纪律配齐数值行 | +| 二:骨架固定+属性随机 | 模板拓扑定型,节点类型在**候选槽位**(本文含义:模板给某个可变位列出的允许节点类型集合,实例化时从集合内均匀掷一个——例:某槽位允许{奖励,恢复},掷中哪个就是哪个)内掷定 | 台阶一收口;商店房所在位排除出候选槽位(保必经位) | +| 三:全程序生成 | 读参数(深度、分支密度、节点类型配比)直接构造图,构造失败重掷(重掷预算同棋盘生成 max_gen_attempts 纪律) | 台阶二收口;图合法性校验作最终守门 | + +台阶二的随机量入账:候选槽位掷定消费同一条图模板抽签流的后续 scope,计数器域照旧覆盖,可复现性零损失。台阶三的参数取值域届时随本文修订登记,本草案不预设。 + +### 测量对账:别让随机污染读数 + +**人话阶段**:2026-09-21 呈报暂缓的三理由之一是"污染 MC 读数"——模拟试玩与数值验证的通关率是按固定图测的,图一随机,读数波动就混进了布局差异。本节是消解条款,三条: + +1. **分层出数**:模拟试玩与数值验证工具的读数按「关卡 × 图模板」分层记录;混合池的整体通关率 = 各模板条件通关率的加权平均(权重 = 抽中概率,均匀池即算术平均)。 +2. **基线可比**:基线批(对拍、重投)跑固定模板口径——把池临时缩到 N=1(回滚档)或固定抽签 scope,保证新旧基线在同一张图上对话。 +3. **实施门**:台阶一实施排在[难度曲线与Boss](难度曲线与Boss.md)曲线调参批收口之后——现行行值 provisional 收带前叠加布局随机,归因会失真(拍板点③)。 + +另两条暂缓理由随批消解:**类型集未稳**——五类节点封闭枚举已随商店房批定稿,扩类走文档修订的既有通道对模板同样适用(模板 schema 跟随枚举走);**内容量不足**——台阶一的模板就是内容批,按内容批节奏逐张走,不设批量生产目标。 + +## 拍板点(登记 [06-待办清单](../../06-待办清单.md),随批更新条目) + +| # | 拍板点 | 推荐 | +|---|---|---| +| ① | L1 教学关是否参与抽签 | L1 池 N=1 固定单链(教学位纪律),L2 起抽 | +| ② | `node_map` 随机流增流 | 准——按 rng_service 封闭流增流纪律(改代码 + 金向量补登 + 冒烟断言) | +| ③ | 台阶一实施时点 | 曲线调参批收口后(测量对账条款的实施门) | +| ④ | 首版池规模 | L2/L3 各 2–3 张起步,provisional 随内容批扩 | +| ⑤ | 抽签时点 = 关卡开始逐关抽(本草案口径) | 确认——若改冒险开始一次预抽,随批修订本文 | + +## 依赖与输出 + +这张表就是删除任何一方时的影响面清单。 + +| 方向 | 系统 / 文档 | 接口要点 | +|---|---|---| +| 上游 | [冒险结构](冒险结构.md) | 开始关卡流程是抽签时点的宿主;主种子与派生流的语义权威;行集内容责任方(模板内容归它) | +| 上游 | [数据配置](../表现与支撑/数据配置.md) | 关卡表模板池列的承载与统一读取;`node_map` 流(提案待拍板)与流种子派生公式的基础设施 | +| 上游 | [难度曲线与Boss](难度曲线与Boss.md) | 模板内遭遇数值的所有权;曲线调参批收口是台阶一的实施门 | +| 下游 | [关卡节点地图](关卡节点地图.md) | 实例化行集的供给方;其图合法性校验与全部行进规则零改动 | +| 下游 | [存档序列化](../表现与支撑/存档序列化.md) | 抽签 scope 计数器入既有快照契约(主种子 + 流计数器),零新增域 | +| 下游 | [HUD框架](../表现与支撑/HUD框架.md) | 零新语义——节点态照旧读图,模板差异对呈现层透明 | + +## P0 最小闭环(台阶一实施批) + +1. 关卡表逐关行扩模板池结构(承载归数据配置,schema 细节随实施批定)。 +2. 池内全部模板加载期预校验(违规致命,fail-fast 不变)。 +3. 开始关卡处理内抽签实例化(`node_map` 流恰一 scope)。 +4. 既有图合法性校验照跑零改动;关卡节点地图与战斗侧全链零改动。 +5. 冒烟断言:抽签确定性(同种子逐位同图)、池内全模板校验、N=1 池与现行固定图逐位等价。 + +## P1 / P2 后置 + +| 优先级 | 内容 | 后置原因 | +|---|---|---| +| P1 | 台阶二:骨架固定+属性随机(候选槽位掷定) | 台阶一收口后另批立项;商店必经位的槽位排除规则随批成文 | +| P2 | 台阶三:全程序生成(参数化构造) | 台阶二收口后另批立项;参数取值域与重掷预算随批修订本文 | + +## 调参表 + +本系统无已锁数值。台阶一实施后进表: + +| 参数 | 域 | 现行值 | 说明 | +|---|---|---|---| +| 模板池大小 N | int [1,+∞),关卡表逐关行 | provisional(拍板点④) | N=1 = 回滚档;扩池 = 内容批 | +| 重掷预算(台阶三) | 未立项不设值 | — | 台阶三立项时随本文修订登记 | + +## 验收标准(草案——随拍板点裁决收口,实施批落地时按本节验收) + +- 池内全模板加载期通过图合法性校验,违规致命(校验面不只抽中的那张)。 +- 抽签确定性:同主种子同操作序列逐位同一张图;抽签 scope 可独立回放。 +- 回滚档成立:N=1 池的关卡与现行固定图逐位等价。 +- 商店房编排约束在每张模板上成立:每关恰 1 个商店房、关底 Boss 前一位必经位。 +- 零新面:关卡节点地图行进/兑付/收束断言与战斗侧寻址断言全绿,零改动。 +- 测量分层:模拟读数含「关卡 × 图模板」维度;基线批可固定模板复现。 +- 内容纪律:每张新模板的战斗与 Boss 节点在敌人与棋盘生成的数值表中有精确行(冒烟遍历池内全模板)。 + +## 待办 + +本系统待办条目已统一收编至 [06-待办清单](../../06-待办清单.md)(「关卡内结构随机生成」条目),本节不再逐条登记。 + +## 版本历史 + +| 版本 | 日期 | 说明 | +|---|---|---| +| v0.1 | 2026-09-27 | **设计草案成文(立项批,用户拍板立项——06 条目「关卡内结构随机生成」随批改状态)**:概念三件套(图模板/模板池/图模板抽签,N=1 回滚档)、抽签时机(开始关卡内逐关抽、主种子派生 `node_map` 流提案)、三级台阶路线(抽签→属性随机→全程序)、MC 测量对账三条款(分层出数/基线可比/实施门=曲线调参批后)、五拍板点、依赖表与验收草案。实施未开工;术语入 registry 词汇表随定稿批执行 | diff --git a/design/registry/entities.yaml b/design/registry/entities.yaml index e96b28c5..cc67b38b 100644 --- a/design/registry/entities.yaml +++ b/design/registry/entities.yaml @@ -27,7 +27,7 @@ entities: scope_event_binding: board_gen=每次生成新扫雷图(棋盘生成);reward_roll=每次 board install(格奖励批 + 清图奖励批)(地图战斗资源——2026-09-09 接口漂移改写,原"每次奖励结算 roll 批次";地图战斗资源 Rule 2/AC-1 为契约源);encounter=每次战斗实例化恰一 scope(战斗结算 begin_battle 实例化期、扫雷开始前——unit_count 区间均匀骰,挖掘决策域之外 P1 合规);armor_roll=每次掷点恰一 scope(战斗结算 战斗段吃掷点分量逐次判定——1d20,护甲等级掷点批 2026-09-16);variant_place=每次装板恰一 scope(战斗结算 布置段——地形变异首批类型定稿批 2026-09-20);gp_drop=每场战斗结束的掉落掷定恰一 scope(战斗结算 战斗结束分支——GP+商店房批 2026-09-20) unseeded_access: 致命中止 snapshot_contract: 续玩/复盘快照 = master_seed + 各流 scope 计数器(消费方 存档序列化) - referenced_by: [棋盘生成, 战斗结算, 地图战斗资源, 冒险结构, 存档序列化] + referenced_by: [棋盘生成, 战斗结算, 地图战斗资源, 冒险结构, 存档序列化, 关卡节点图生成] - name: stream_seed_derivation type: formula @@ -49,7 +49,7 @@ entities: reproducibility_claim: 同冒险内同流各 scope 无碰撞 + 跨版本恒定(不做跨 master_seed 全局单射声明) master_seed_int64_min: 致命(abs 恒等回绕→与 0 静默别名) set_master_seed_precondition: 仅全流计数器全零时受理(7 流——2026-09-14 数据配置 漂移批口径 + 2026-09-16 护甲等级掷点批 armor_roll 增流 + 同日敌人技能池批 behavior_roll 增流 + 2026-09-20 地形变异首批类型定稿批 variant_place 增流 + 同日 GP+商店房批 gp_drop 增流) - referenced_by: [棋盘生成, 战斗结算, 地图战斗资源, 冒险结构, 存档序列化] + referenced_by: [棋盘生成, 战斗结算, 地图战斗资源, 冒险结构, 存档序列化, 关卡节点图生成] - name: difficulty_row_resolution type: formula @@ -266,7 +266,7 @@ entities: 关卡收束点: 一关就此定局的时点——Boss 节点战斗胜利(通关)或英雄死亡(失败);关卡节点地图 在收束点先调 战斗结算 关卡清库、再向 冒险结构 宣布关卡结束与结果(冒险结构 首次定义;切片 level_runner 先例转正;2026-09-17 关卡节点地图 v1.0 图版措辞——Boss 节点 = 图唯一终点) 关卡大奖励: 清完一关、进入下一关前的一次性兑付——上限提升 + 血回满 + 钥石入账三件构成,不进背包不占库存域;末关通关不兑付(冒险结构 首次定义;2026-09-17 代币→钥石统一拍板——原「代币记账」即钥石,同一资源两渠道:关卡大奖励入账与 Boss 掉落;game-concept"冒险内大奖励"的落地形态) 永久强化: 跨局成长资源的本作落地名——伴随存档生命周期、可用钥石在营地柜台换取的成长条目集合(元进度定稿批 2026-09-18 用户拍板定名;「元进度 / Meta Progression」保留为系统族名,「营地」为存档内消费枢纽的界面壳非机制实体;「天赋树」同日退役——本作无树形结构,柜台条目为线性清单无分叉无前置;首次定义 元进度 v1.0) - referenced_by: [排雷玩法, 敌人系统, 地图战斗资源, 战斗结算, HUD框架, 魔法道具, art-bible, game-concept, 关卡节点地图, 冒险结构] + referenced_by: [排雷玩法, 敌人系统, 地图战斗资源, 战斗结算, HUD框架, 魔法道具, art-bible, game-concept, 关卡节点地图, 冒险结构, 关卡节点图生成] - name: enemy type: schema_data