9.6 KiB
关卡节点图生成
一句话:一关的节点图从哪来——生成器按参数长出一张合法图 状态:现行为 v1.4
设计目的
固定模板的图太小:第一关一条链零选择,第二三关网状但岔路兑付差不多,「可选节点太少」换画法解决不了。本文把图的来源换成参数化生成——图更大、岔口更多、每条路通向不同的东西,走哪条路决定打谁;规模随关卡推进生长,层高、宽度、节点数逐关递增且增幅变大。改形态=改参数不改代码。
系统范围
负责:
| 负责 | 说明 |
|---|---|
| 图从哪来 | 按本关参数档长出一张节点图,交付给关卡节点地图 |
| 产出规格 | 什么算一张合法的图——产出约束的唯一陈述处 |
| 生成参数 | 五个旋钮、三套关卡参数档与生长曲线 |
| 节点类型配比 | 节点类型分布怎么掷、商店位这类摆放约束 |
不负责:
| 不负责 | 归谁 |
|---|---|
| 图怎么走、每类节点到达时兑付什么 | 关卡节点地图 |
| 节点上具体摆什么料(敌人行集、奖励内容) | 敌人系统、冒险结构等各 owner 文档 |
| 图的画面呈现与多终点标记 | level-map、HUD 框架 |
| 生成算法本身 | 代码——本文只给产出规格与执行边界,图怎么长出来是实现的事 |
在核心循环中的位置
冒险结构 ──开始关卡(关卡序号+参数档)──▶ 关卡节点图生成:长出本关的图
──图交付──▶ 关卡节点地图:选路推进 ──关卡结束──▶ 冒险结构
生成站在冒险结构与关卡节点地图之间:接「第几关、用哪套参数档」,交「一张合法图」。图一旦交付生成即退场,走图的事全归关卡节点地图。
核心规则
图的规格:什么算一张合法的图
合法图是一张岔路发散式道路系统:主路+支路,宽度由分叉自然长出,多终点时提前承诺归属。产出约束六条,每张产出图都必须满足:
| 约束 | 内容 |
|---|---|
| 道路系统 | 图=主路+支路;除岔口节点(两条以上去路的节点)外每个节点恰一条去路;岔口去路 2–3 条 |
| 宽度=分叉生长 | 不摆平行层;同深度节点数由岔口自然长出,至宽度上限为止(上限读参数档,见调参表) |
| 层高=沿路步数 | 入口到终点的最长路径步数;第一关 ≥6,逐关递增且增幅变大 |
| 出口归属锁定 | 多终点时由大岔口把图分成互不连达的分支区域,各区域只通向自己的终点;每个终点前一层节点的去路集合恰含一个终点——选路=提前承诺打谁 |
| 战斗节点保底 | 奖励/恢复/商店占位后战斗节点量不被挤没(保底数进调参表) |
| 多终点深度互异 | 多终点(多 Boss 节点)必须落在互异的节点深度;同一节点深度出现两个终点即判产出无效——共深会让「走哪条路打谁」落空 |
节点深度的算法:自入口沿路走到该节点的最长路径步数;多入口时取距任一入口的最长路径。不用最短路径——合流节点或多入口图上取最短,会让某些出边指向深度不增甚至更浅的节点,破坏「连线只朝前进方向」的无环判据。
结构铁律:连线只朝前进方向(无环);入口、终点都可多个(个数=参数档),每条路径恰好从一个入口出发、恰好到达一个终点。
执行边界(实现只须遵守这几条,怎么长图是代码的事):
| 边界 | 内容 |
|---|---|
| 不合格产出禁止进玩法 | 产出不过产出规格即无效,无效图绝不上给玩家 |
| 无兜底图 | 不设固定兜底图——软回退一律禁止 |
| 参数无解即中止 | 参数档本身给不出合法图=配置错误,致命中止 |
| 同种子同图 | 同种子+同参数档产出同一张图;随机只经统一随机流服务 |
生成参数:五个旋钮与三套关卡参数档
| 旋钮 | 管什么 |
|---|---|
| 层深 | 图有多高(沿路步数) |
| 分支密度 | 岔口多少、宽度长多快 |
| 配比 | 节点类型分布(见下节) |
| 入口个数 | 图从几个点进场 |
| 出口个数 | 图通向几个终点(1=单出口;2 及以上=多出口+归属锁定;大岔口自第二关起进入参数档,第一关出口恒为 1) |
每关一套参数档(L1/L2/L3),生成器只吃参数档、不认关卡号。生长曲线:层高、宽度、节点总数、路径长度逐关递增且增幅变大;决策点密度逐关递增;第一关即含岔口——第一关也要有选择。单链是分支密度取下限的合法退化形态,不作为三关参数档的取值。
节点类型配比:类型分布怎么掷、内容归谁
配比是生成旋钮:战斗/奖励/恢复/商店各占多少由参数档定,生成器掷出分布落在图上成为节点类型;配比只管非终点节点,终点恒为 Boss、不进配比。节点类型在可见范围内对玩家公开(可见性规则归关卡节点地图)——看得见的类型才谈得上提前规划。
摆放约束(四条):
| 约束 | 内容 |
|---|---|
| 商店位 | 每个终点前一位恰一家商店——每名玩家一局必经恰一家店 |
| 岔路取舍·下一跳 | 一个岔口分出的各条去路,下一节点类型互不相同——下一跳必在可见范围,是决策的可见锚(实现侧已兑现:候选集强制豁免类型可见性) |
| 岔路取舍·支路构成 | 一个岔口分出的各条支路,整条支路的节点类型构成互不相同——每条支路至少有一个别的支路没有的类型(例:一路有恢复节点、一路有奖励节点) |
| 支路互异上限=出口数 3 | 商店与 Boss 每条支路必有,可供支路互斥的类型只剩战斗/奖励/恢复三类——一条链上的岔口最多切出 3 条互异支路,故出口个数取值域为 1–3(见生成参数旋钮表) |
内容归各 owner:战斗节点打谁=敌人系统按深度带配池;奖励/恢复/商店的兑付语义=关卡节点地图与各 owner 文档。
扩展节点类型位:现行四类之外预留扩展位,内容未设计、登记见待办清单「扩展节点类型」条。扩展通道四步=加枚举类型+落兑付实现+调生成配比+走本文档修订。
依赖与输出
| 方向 | 系统 / 文档 | 接口要点 |
|---|---|---|
| 上游 | 冒险结构 | 开始关卡给出关卡序号与本关参数档 |
| 下游 | 关卡节点地图 | 图的消费方:选路、兑付、加载校验(结构规则以本文产出规格为准) |
| 协作 | 敌人系统 | 战斗节点遭遇按深度带配池,遭遇坐标=关卡序号+深度带;多终点各配 Boss 行 |
| 协作 | 难度曲线与Boss | 图规模(节点数/战斗量)进它的投放节奏账;深度带配池的难度坡归它,本文零数值 |
| 上游 | 数据配置 | 参数档数据的承载与统一读取,数值事实源=data/tables |
| 协作 | level-map | 呈现只读:图形态随参数变化,画布自适应;多终点各带 Boss 标记 |
调参表
数值事实源=data/tables;本表只留取值域与设计意图。
| 参数 | 取值域 | 设计意图 | 状态 |
|---|---|---|---|
| 层深 L1 | ≥6(步) | 第一关不再是零选择短链——够长才有岔口与取舍 | 已锁下限 |
| 层深 L2/L3 | >前一关且增幅变大 | 后期关显著更长,推进感随冒险加深 | provisional |
| 岔口去路数 | 2–3 | 每次取舍在 2–3 条里选:少了没选择,多了不过脑 | 已锁 |
| 岔口取三去路概率 | percent [0, 100] | 允许三去路的岔口中,实际长出第三条去路的比例——控制宽图出现频率 | provisional |
| 同深度节点宽度上限 | int [2, 6] | 同一深度最多并排几个节点;岔口生长到此即止,不再加宽 | provisional |
| 填充交替起始 | percent [0, 100] | 恢复/奖励节点交替填充时,先放恢复节点的概率(50 为对称) | provisional |
| 分支密度 | 待定值 | 一局遇到多少次取舍(目标量级=一局十几次,待设计验证) | provisional |
| 入口个数 | 1 起 | 多入口给「从哪进场」的第一层选择 | provisional |
| 出口个数 | L1 恒 1;L2/L3 1–3 | 多终点让「走哪条=打谁」成立;大岔口自第二关起 | 已锁范围 |
| 配比 | 四类占比合计 1,战斗保底优先 | 攻击性/兑付/恢复的节奏配比 | provisional |
| 战斗节点保底数 | ≥ 调参值 | 成长位不挤没战斗——战斗是本作核心量 | provisional |
| 商店数 | =出口数 | 每局决战前恰一次补给,成长保底是结构事实 | 已锁 |
| 图包络 | ≤ 屏预算(1280×800 下约 10 层×8 槽) | 超预算只许限参数档,禁改画布冻结公式 | 已锁 |
验收标准
| 判据 | 内容 |
|---|---|
| 产出合格 | 任意参数档产出的图必过产出约束六条+结构铁律;任意入口出发的任意路径都恰好到达一个终点 |
| 生长递增 | L1/L2/L3 读数:最长路径步数与节点总数均逐关递增;节点总数增幅 Δ(L2→L3)>Δ(L1→L2) |
| 归属锁定 | 多出口图每个终点前一层节点的去路集合恰含一个终点;各分支区域互不连达 |
| 必经恰一店 | 任意入口→终点路径经过且恰经过一家店 |
| 岔路取舍 | 任意岔口各去路下一节点类型互不相同;各条支路的节点类型构成互不相同 |
| 可复现 | 同种子+同参数档=同一张图 |
| 无软回退 | 不存在兜底图路径;参数无解即致命中止 |
| 战斗保底 | 任意合法产出的战斗节点数 ≥ 保底数 |