两文件是流水线流程件而非游戏描述件,此前住在 design/gdd/ 造成三处不适配: gdd_lint 必须为它们逐条关掉体裁规则、格式权威却写在 doc-conventions §12、 与同族的 roadmap(在仓库根)分居两处。迁到根后按 roadmap.md 的无编号风格改名。 - 迁出:design/gdd/06-待办清单.md → 待办清单.md;07-体验验证清单.md → 体验验证清单.md - 指向改写 53 个文件:GDD 各系统文档指路存根、四份规约、02 根索引、README/roadmap/AGENTS - 两份清单自身 74 处出站链接按新基址重指(../art → design/art、systems → design/gdd/systems) - gdd_lint:待办/体验验证两文件的 R1/R3/R5/R7 豁免行随迁删除(已脱离扫描面),后门表清零 - pipeline_gate 默认路径、log_analysis/render_gate 称谓、repo_structure_audit 根文件白名单同步 - 保护面补写:两份清单列入实现批禁写清单(AGENTS 两类批条 / process-conventions §12 / 架构文档域表), 条目状态只由流水线各段推进 - 范围外未动(用户令「全不碰」):reports/ 与 design/research/ 的 22 处历史指向、game/ 两处注释
19 KiB
关卡节点地图
一句话:单关内的节点图选路与推进 状态:已定稿
设计目的
一关不是一场战斗,而是由关卡表配置的一组节点(本文含义:关卡内移动的步进单位,画在图上就是一个格)连成的一张节点图。玩家从一个入口出发,在每个路口看着几条路选一条走——这条路上有要打的仗、有开奖励的房间、有能歇脚的篝火——最后所有路线汇到关底 Boss。关卡节点地图管的就是这张图上的"走":怎么选路、走到每种节点上发生什么、Boss 分出胜负后怎么把这一关的结局交回去。
用循环的层次说:冒险是外层骨架,关卡是中循环,战斗是小循环。本文管中循环——图怎么编排、怎么走、每类节点到达时触发什么;一场战斗内部发生什么全部归小循环(战斗结算与敌人系统),本文把控制流移交给它之后就不再看里面。它是冒险结构(序列、大奖励、重开)与战斗循环(结算与敌人)之间的行进层。
系统范围
边界这样划:图上有哪些节点(具体摆什么、摆几个)是关卡表的内容,归冒险结构;本文管图怎么走、走到每步发生什么,以及一张关卡表行集要满足什么结构规则才算合法的图。战斗内部的一切(敌人怎么配、几只、什么技能池、踩雷负向怎么兑)归战斗循环文档(原"伏击怎么叠"随 2026-09-20 八型批伏击退役改述);本文只负责把"第几关、哪个节点"递过去。
负责:
| 负责 | 说明 |
|---|---|
| 节点图结构规则 | 什么算一张合法的关卡节点图(唯一编号、唯一入口、唯一终点、不可回头)——结构校验的规则面 |
| 选路与行进 | 玩家亲手选路前进;兑付后确认、零自动推进(交互形态定稿) |
| 节点兑付触发 | 行进到各类型节点时触发对应兑付:战斗移交、奖励入库、恢复请求、商店覆盖层开闭 |
| 战斗发起组装 | 组装定位信息(关卡序号 + 节点编号),移交战斗结算开战 |
| 关卡收束点 | Boss 战胜利或英雄死亡时定局:先调战斗结算的关卡收束清空库存,再向冒险结构宣布关卡结束 |
不负责:
| 不负责 | 归谁 |
|---|---|
| 关卡序列与图上摆哪些节点(行集内容、关数) | 冒险结构 |
| 关卡大奖励、跨战斗生命、失败重开 | 冒险结构 |
| 战斗内部的一切:敌人配置、数量、技能池、踩雷负向 | 敌人系统与战斗结算 |
| 同场多敌种(同一节点配多种敌人)的表结构与取值口径 | 敌人系统(战斗侧改键批) |
| 节点奖励件的分类与凭证定义 | 奇物(提升池构成与库存归冒险结构) |
| 敌我数值曲线与遭遇投放节奏 | 难度曲线与Boss |
| 节点图的画面呈现、方块地牢观感 | HUD 框架 |
在核心循环中的位置
冒险结构 ──开始关卡──▶ 关卡节点地图:节点图选路推进(战斗 / 奖励 / 恢复 / 商店 → 关底 Boss)──关卡结束──▶ 冒险结构
核心循环里"关卡:节点链逐节点推进"这一段就是本系统在跑:它从冒险结构接过一关,把玩家沿图送到关底 Boss,再把结局交回去。图上每场战斗都由本系统发起移交;战斗内部的事不归它管。
核心规则
关卡的形状:分支节点图与五类节点
一关内部是一张有方向的节点图:节点之间用连线(本文含义:节点之间允许前进的通道)连接,玩家沿连线从一个节点走到下一个节点。图有三条结构铁律:连线只朝前进方向(没有回头路,整张图无环);图有一个唯一的入口节点;关底 Boss 恒为全图唯一的终点——所有路线最终都汇到它,打赢它这一关就通了。违反任何一条的行集是配置违约,加载期拦截。
图上只有五种节点,封闭枚举,扩类一律走文档修订:
| 节点类型 | 机制承诺 |
|---|---|
| 战斗 | 携带节点编号;行进至此开战(兑付见下节);胜利后回到选路 |
| Boss | 恒为图终点;行进至此开 Boss 战;胜利即关卡收束点 |
| 奖励 | 行进至此触发节点奖励(兑付见下节);反馈呈现后回到选路 |
| 恢复 | 行进至此向冒险结构发治疗封顶回报;反馈呈现后回到选路 |
| 商店 | 行进至此打开商店覆盖层,用 GP(战斗掉落的冒险内货币)购买属性提升;离开后兑付确认回选路;不携带战斗行。v1.5 兑付换代(pool 模式现行):进店从共享池抽 3 展示、买 1 后三件全重抽(未买不保留)、货架买空=空架合法态。v1.6(2026-10-04 P-C2+Q2 裁/MC-1):新增独立刷新——基础免费 0 次(天赋/营地侧刷新次数增益位预留)+ GP 付费刷新 ceil(20×1.8^已付费刷) provisional;重抽=共享池同源(shop_draw 同签),推翻本行旧「无独立刷新动作——重抽绑购买」口径;库存与定价归冒险结构共享池节 |
商店房的编排规则(2026-09-20 用户拍板):每关恰 1 个商店房,位置 = 关底 Boss 前一位——哈迪斯式的"决战前最后一个补给点":买到的属性还有整段战斗可消费,错过的成长也没有第二家店可补。Boss 前一位同时是必经位:图拓扑收束使所有入口→Boss 的路径都穿过它,成长保底成为图结构事实而非玩家自觉。这条位置约束不由加载校验承载——图合法性六检零新增,商店房的"每关恰 1 + 必经"由冒烟断言把关。
每个节点在关卡内领一个节点编号(本文含义:关卡内不重复的序号,用来当战斗的定位地址;数据键沿用切片字段 node_depth)。Boss 的编号恒为全图最大——"最深处的房间是关底"这条直感由此保留。单链特例:一张每步只有一条连线的图就是一条链,此时节点编号等于它前面走过的战斗场数。第一关行集就是单链特例,切片代码零改动运行;分支图行集已落地(v1.0.1 起;模板池见关卡节点图生成)。
呈现侧口径(2026-09-17 用户拍板):节点图的画面表达走方块地牢观感——节点画成地牢房间的方块、连线画成通道——但逻辑拓扑就是本文的节点图,不产生任何额外选路或探索语义。关卡画面本体即节点链进度的呈现载体(选路覆盖层的常驻形态,节点态直接读图:已过暗金 / 当前金 / 候选下一跳通道亮金 / Boss 封印黑描边(旗朱→封印紫→封印黑 #000000,2026-09-28 用户拍板现行)),不另设进度条组件;视觉规格归 HUD 框架。
商店覆盖层呈现(呈现 spec:design/gdd/ux/shop.md v1.0,2026-09-30;v1.5 注记——pool 模式货架面=共享池三选一同构卡〔进店抽 3/买 1 全重抽/空架售罄态〕,与三选一奖励同一交互语言;legacy 固定三件面随对照模式保留。v1.5-a 注记(2026-10-04 用户裁):库存余量就近 库存余量不呈现(货架卡不带「库存余 N/∞」字样——库存语义仍在共享池令牌库,仅呈现退役;独立刷新机制另见待办清单「商店独立刷新机制」条):兑付 = 打开商店覆盖层(模态)——货架卡陈列、GP 余额读数、购买/离开;离开后兑付确认回选路。本节锁编排面(何时开/何时关/回选路),呈现细节归 spec;定价数值归难度曲线与Boss(shop.tres)。
行进与选路:兑付后确认,选路就是行进
结论:关卡里没有一次自动前进——每一步都是玩家亲手走出来的。关卡画面(节点图,选路覆盖层的常驻形态)是单关内的常驻枢纽:关卡开始即呈现,此后每次兑付结束都回到它再选路。
行进的完整循环如下:
关卡开始 → 呈现节点图选路停点(关卡画面;入口不自动进入,第一次选路就是"出发")
→ 玩家选一条连线 → 到达所选节点 → 节点兑付(开战 / 发奖 / 回血)
→ 兑付反馈呈现 → 玩家确认 → 返回关卡画面(战后回图)
→ 再选路……直到 Boss 分出胜负
两条纪律:
| 纪律 | 内容 |
|---|---|
| 兑付后确认 | 到达节点立即兑付,不设"进入前确认"步;兑付反馈呈现完,玩家确认才回图。战斗节点的确认挂在战斗总结结算上(呈现 spec:design/gdd/ux/settlement-summary.md),奖励/恢复节点挂在兑付反馈覆盖层上,商店节点挂在商店覆盖层的离开动作上——复用既有呈现位,零新增交互范式 |
| 零自动推进 | 确认之后回到关卡画面的选路口:岔路口玩家选一条连线,单链路口确认"继续"。选了才走;不选就停在图上 |
Boss 兑付(胜利或英雄死亡)触发关卡收束点,此后不再有选路——关卡已定局,后续流程归冒险结构。
节点兑付:把控制流移交给小循环
人话阶段:节点兑付就是"走到这个房间里,这个房间的事开始发生"。本文按节点类型触发兑付,然后把属于别家领域的事交还给别家——本文自始至终不生产任何数值。
| 类型 | 兑付动作 |
|---|---|
| 战斗 / Boss | 组装定位信息(关卡序号 + 节点编号),移交战斗结算开战;战斗结果(胜负与战后生命)经战斗结果上报回流冒险结构(契约语义归冒险结构,本文不复述) |
| 恢复 | 向冒险结构发治疗封顶回报(载荷 = 该关恢复比例,读本关配置行);按比例回血并封顶的执行归冒险结构 |
| 奖励 | 触发节点奖励兑付:提升三选一(与通关三选一共享同一令牌库——七种令牌洗牌不放回抽 3 点选一件,池耗即上限;见下节) |
| 商店 | 打开商店覆盖层(pool 模式:进店抽 3〔shop_draw 封闭流恰一 scope〕+买 1 全重抽;legacy 对照模式:商品陈列读商店表);购买即时生效、经共享池写统一冒险加算区(与关卡大奖励同一笔——库存语义归冒险结构,本文不复述);离开覆盖层即兑付确认。商店房不携带战斗行:零敌人、零棋盘、零战斗初始化 |
遭遇构成的编排面——本文对"放什么敌人"的全部职责只有三条:
- 行进到战斗或 Boss 节点,兑付动作就是开战:本文递出定位信息,移交战斗结算。
- 定位信息只有两样:关卡序号 + 节点编号。战斗侧拿编号查表、配敌、掷数量、跑技能池、兑踩雷负向——一切战斗内部初始化归战斗循环文档(原"叠伏击"随 2026-09-20 八型批伏击退役改述),图的初始化不为战斗初始化做任何决定。
- 本文不预掷任何战斗数值、不读敌人数量;教学位节点同样掷骰、没有结构豁免("任何掷骰结果下都稳过"的保证是难度曲线与Boss的数值责任)。
第二关的"新内容 = 既有池新技能"(技能池构成已定稿入敌人系统技能池节)投放时,改的是战斗侧行里引用的技能池内容——节点图结构原样不动,本文无需为投放留任何新结构位。
节点奖励 = 提升三选一(迭代 10 追加批——用户 2026-10-01 拍板:与通关三选一共享同池):奖励节点到达即开三选一(呈现 = 提升三选一覆盖层共用面,spec:node-reward.md v2.0)——从提升池七种(攻击/生命上限/护甲/GP 袋/行动点件/恢复件/刷新件)按同一令牌库洗牌不放回抽 3(同 kind 去重、同 reward_pick 封闭流),玩家点选一件兑付(选中踢池、未选回池;秘宝件已随迭代 11 第①批出池,满位替换子交互随之不再触发)。件获取次数计数与令牌库为冒险级单例——两渠道同一令牌库合计消耗。原「秘宝投放渠道三选一」(迭代 7 拍板②丙过渡形态)顺带退役;秘宝局外同调件形态已随同调实施批落地(迭代 11 第①批;原提案 §9,git 57da58c 已退役)。「池空直通」为合法态——池耗即枯竭,空库 = 零候选合法态直通(见冒险结构令牌池节)。
关卡收束点:先清库、后宣布
关卡收束点(一关就此定局的时点)有两个触发:Boss 战胜利(通关),或主角在任意一场战斗倒下(失败)。收束点的动作次序固定,不可换:
关卡收束点(Boss 战胜利 或 英雄死亡)
① 调战斗结算的关卡收束:清空关卡域库存
② 向冒险结构宣布关卡结束(携带结果)
本文与冒险结构之间按接口契约四件套(开始关卡 / 战斗结果上报 / 治疗封顶回报 / 关卡结束)全款承接——语义权威在冒险结构的「与关卡节点地图的边界」一节,本文不复述其载荷细节。本文对战斗域与库存域零直调:清库存只经战斗结算的关卡收束接口,绝不亲手做。
依赖与输出
这张表就是删除任何一方时的影响面清单。
| 方向 | 系统 / 文档 | 接口要点 |
|---|---|---|
| 上游 / 下游 | 冒险结构 | 接口契约四件套(开始关卡 / 战斗结果上报 / 治疗封顶回报 / 关卡结束)+ 收束点次序语义:向下接开始关卡,向上报战斗结果、恢复请求与关卡结束 |
| 上游 | 奇物 | 节点奖励件的分类、凭证与持有语义(提升池构成与共享池库存归冒险结构) |
| 上游 | 敌人系统 | 定位信息的消费方:本文递出关卡序号 + 节点编号,按编号生成单位归它 |
| 上游 | 难度曲线与Boss | 敌我数值曲线与遭遇投放节奏的调参所有权;本文零数值 |
| 上游 | 数据配置 | 商店表(商品行 / GP 掉落参数 / 价格参数)的承载与统一读取;商店覆盖层的商品与定价数据源 |
| 下游 | 战斗结算 | 两个调用入口的发起方:战斗发起组装(定位信息)、关卡收束(清库) |
| 下游 | HUD 框架 | 节点图呈现(方块地牢观感;关卡画面节点态即节点链进度呈现载体)、当前位置与选路口、兑付反馈覆盖层的数据源 |
P0 最小闭环
- 从冒险结构接收开始关卡(关卡序号、当前生命、生效上限),加载本关节点图并呈现选路停点(关卡画面),玩家在图上选出第一跳,行进自所选节点开始(入口节点不自动进入)。
- 每节点兑付完成并确认后返回关卡画面,玩家再选路前进;岔路选一条、单链点继续;零自动推进。
- 战斗 / Boss 节点:组装关卡序号 + 节点编号,移交战斗结算开战;战斗结束向冒险结构上报战斗结果。
- 奖励节点:触发节点奖励兑付 = 提升三选一(与通关三选一共享令牌库);恢复节点:向冒险结构发治疗封顶回报;商店节点:打开商店覆盖层,购买即时生效,离开后兑付确认。
- Boss 战胜利或任意战斗倒下 = 关卡收束点:先调战斗结算的关卡收束清库,再宣布关卡结束。
- 第一关行集 = 单链特例(图的最简形态),切片按单链运行零改动;分支图行集与图版实现已落地(v1.0.1 起)。
P1 / P2 后置
后置项逐条列出;复活任何一条都走本文修订,不许静默加回。
| 优先级 | 内容 | 后置原因 |
|---|---|---|
| P2 | 精英节点与精英遭遇 | 不设编码位——精英以内容方式承载(某编号节点配强敌行集);与难度曲线、战斗侧批联动设计。精英怪设定已登记预留(迭代 10 奖励重构批:同立绘+附加特征标记+数值更强、钥石掉 1 个预留——实装随怪物批,本文件行集零改动) |
| P2 | 事件类节点候选 | 商店房已随 2026-09-20 GP+商店房批落地(v1.1),"商人类撞抽象货币红线"的旧注记由不做清单的现行条款替代;事件类节点仍无内容系统承载;扩类一律走文档修订 |
调参表
暂无本系统自有的参数——选路与行进无数值可调。图结构合法性(唯一编号、唯一入口、唯一终点、无环)是规则不是参数,由加载校验强制;链上节点构成归冒险结构的关卡表,战斗数值归难度曲线与Boss。
验收标准
- 图合法:行集通过加载校验——节点编号关卡内唯一、入口唯一、Boss 为唯一终点、连线无环、所有节点沿连线可达 Boss;违规配置加载期致命。
- 行进自主:从入口到 Boss 的每一次前进都由玩家选路发起(含关卡开始后的第一跳——关卡开始停在图上,入口节点不自动进入);不存在任何自动推进路径;倒下时行进终止。
- 兑付移交:每场开战调用携带(关卡序号 + 节点编号),与节点图上该节点位置一致;每场战斗结束恰一次战斗结果上报。
- 兑付后确认:战斗节点的继续确认挂战斗总结结算(settlement-summary.md),奖励/恢复挂兑付反馈覆盖层;到达与兑付之间无确认步。
- 恢复兑付:治疗封顶回报载荷 = 该关恢复比例(读关卡配置行);满血回复 0 是合法状态(执行语义归冒险结构)。
- 奖励兑付:奖励节点兑付恰触发一次;池空直通空态合法,现行 = 提升三选一(与通关三选一共享令牌库)取一件按件类兑付(spec:node-reward.md v2.x;兑付路由归冒险结构提升池节)。
- 商店房编排:每关恰 1 个商店房、Boss 前一位必经位(所有入口→Boss 路径都穿过它)——由冒烟断言把关,图合法性校验零新增检查;商店房不携带战斗行;行进至此打开商店覆盖层、离开后兑付确认回选路。
- 收束有序且唯一:关卡清库发生在关卡结束宣布之前;每关恰宣布一次关卡结束;Boss 胜 = 通关、倒下 = 失败。
- 四件接口全款:与冒险结构登记的开始关卡、战斗结果上报、治疗封顶回报、关卡结束逐件对上,不另起平行通道。
- 单链特例合法:单链行集(每步恰一条连线)是合法图形态;第一关按单链运行,切片零改动。
- 呈现只读:节点图结构、当前位置、可选下一节点对呈现层只读可见(读数契约归 HUD 框架)。
待办
本系统待办条目已统一收编至 待办清单,本节不再逐条登记。