Files
gplan-2/design/gdd/systems/冒险循环/关卡节点图生成.md
T

9.6 KiB
Raw Blame History

关卡节点图生成

一句话:一关的节点图从哪来——生成器按参数长出一张合法图 状态:现行为 v1.5

设计目的

固定模板的图太小:第一关一条链零选择,第二三关网状但岔路兑付差不多,「可选节点太少」换画法解决不了。本文把图的来源换成参数化生成——图更大、岔口更多、每条路通向不同的东西,走哪条路决定打谁;规模随关卡推进生长,层高、宽度、节点数逐关递增且增幅变大。改形态=改参数不改代码。

系统范围

负责:

负责 说明
图从哪来 按本关参数档长出一张节点图,交付给关卡节点地图
产出规格 什么算一张合法的图——产出约束的唯一陈述处
生成参数 五个旋钮、三套关卡参数档与生长曲线
节点类型配比 节点类型分布怎么掷、商店位这类摆放约束

不负责:

不负责 归谁
图怎么走、每类节点到达时兑付什么 关卡节点地图
节点上具体摆什么料(敌人行集、奖励内容) 敌人系统、冒险结构等各 owner 文档
图的画面呈现与多终点标记 level-map、HUD 框架
生成算法本身 代码——本文只给产出规格与执行边界,图怎么长出来是实现的事

在核心循环中的位置

冒险结构 ──开始关卡(关卡序号+参数档)──▶ 关卡节点图生成:长出本关的图
    ──图交付──▶ 关卡节点地图:选路推进 ──关卡结束──▶ 冒险结构

生成站在冒险结构与关卡节点地图之间:接「第几关、用哪套参数档」,交「一张合法图」。图一旦交付生成即退场,走图的事全归关卡节点地图。

核心规则

图的规格:什么算一张合法的图

合法图是一张岔路发散式道路系统:主路+支路,宽度由分叉自然长出,多终点时提前承诺归属。产出约束六条,每张产出图都必须满足:

约束 内容
道路系统 图=主路+支路;除岔口节点(两条以上去路的节点)外每个节点恰一条去路;岔口去路 2–3 条
宽度=分叉生长 不摆平行层;同深度节点数由岔口自然长出,至宽度上限为止(上限读参数档,见参数契约)
层高=沿路步数 入口到终点的最长路径步数;第一关 ≥6,逐关递增且增幅变大
出口归属锁定 多终点时由大岔口把图分成互不连达的分支区域,各区域只通向自己的终点;每个终点前一层节点的去路集合恰含一个终点——选路=提前承诺打谁
战斗节点保底 奖励/恢复/商店占位后战斗节点量不被挤没(保底数进参数档,见参数契约)
多终点深度互异 多终点(多 Boss 节点)必须落在互异的节点深度;同一节点深度出现两个终点即判产出无效——共深会让「走哪条路打谁」落空

节点深度的算法:自入口沿路走到该节点的最长路径步数;多入口时取距任一入口的最长路径。不用最短路径——合流节点或多入口图上取最短,会让某些出边指向深度不增甚至更浅的节点,破坏「连线只朝前进方向」的无环判据。

结构铁律:连线只朝前进方向(无环);入口、终点都可多个(个数=参数档),每条路径恰好从一个入口出发、恰好到达一个终点。

执行边界(实现只须遵守这几条,怎么长图是代码的事):

边界 内容
不合格产出禁止进玩法 产出不过产出规格即无效,无效图绝不上给玩家
无兜底图 不设固定兜底图——软回退一律禁止
参数无解即中止 参数档本身给不出合法图=配置错误,致命中止
同种子同图 同种子+同参数档产出同一张图;随机只经统一随机流服务

生成参数:五个旋钮与三套关卡参数档

旋钮 管什么
层深 图有多高(沿路步数)
分支密度 岔口多少、宽度长多快
配比 节点类型分布(见下节)
入口个数 图从几个点进场
出口个数 图通向几个终点(1=单出口;2 及以上=多出口+归属锁定;大岔口自第二关起进入参数档,第一关出口恒为 1)

每关一套参数档(L1/L2/L3),生成器只吃参数档、不认关卡号。生长曲线:层高、宽度、节点总数、路径长度逐关递增且增幅变大;决策点密度逐关递增;第一关即含岔口——第一关也要有选择。单链是分支密度取下限的合法退化形态,不作为三关参数档的取值。

图规模无呈现侧上限:关卡画面为卷轴视口呈现,画布随图生长、屏为窗口(呈现规格归 level-map);规模由参数档与生长曲线约束,参数档给不出合法图即致命中止。

节点类型配比:类型分布怎么掷、内容归谁

配比是生成旋钮:战斗/奖励/恢复/商店各占多少由参数档定,生成器掷出分布落在图上成为节点类型;配比只管非终点节点,终点恒为 Boss、不进配比。节点类型在可见范围内对玩家公开(可见性规则归关卡节点地图)——看得见的类型才谈得上提前规划。

摆放约束(四条):

约束 内容
商店位 每个终点前一位恰一家商店——每名玩家一局必经恰一家店
岔路取舍·下一跳 一个岔口分出的各条去路,下一节点类型互不相同——下一跳必在可见范围,是决策的可见锚(实现侧已兑现:候选集强制豁免类型可见性)
岔路取舍·支路构成 一个岔口分出的各条支路,整条支路的节点类型构成互不相同——每条支路至少有一个别的支路没有的类型(例:一路有恢复节点、一路有奖励节点)
支路互异上限=出口数 3 商店与 Boss 每条支路必有,可供支路互斥的类型只剩战斗/奖励/恢复三类——一条链上的岔口最多切出 3 条互异支路,故出口个数至多 3(见生成参数旋钮表)

内容归各 owner:战斗节点打谁=敌人系统按深度带配池;奖励/恢复/商店的兑付语义=关卡节点地图与各 owner 文档。

扩展节点类型位:现行四类之外预留扩展位,内容未设计、登记见待办清单「扩展节点类型」条。扩展通道四步=加枚举类型+落兑付实现+调生成配比+走本文档修订。

依赖与输出

方向 系统 / 文档 接口要点
上游 冒险结构 开始关卡给出关卡序号与本关参数档
下游 关卡节点地图 图的消费方:选路、兑付、加载校验(结构规则以本文产出规格为准)
协作 敌人系统 战斗节点遭遇按深度带配池,遭遇坐标=关卡序号+深度带;多终点各配 Boss 行
协作 难度曲线与Boss 图规模(节点数/战斗量)进它的投放节奏账;深度带配池的难度坡归它,本文零数值
上游 数据配置 参数档数据的承载与统一读取,数值事实源=data/tables
协作 level-map 呈现只读:图形态随参数变化,画布随图生长(卷轴视口呈现,规格归 level-map);多终点各带 Boss 标记

参数契约

本表只留概念面——本系统有哪些参数、各自管什么;取值域与字段契约的单点=数据 schema 层(game/data/schemas/ 的关卡节点图参数结构,域校验执法),现行值=game/data/tables/level_gen_params.tres,provisional 标注随 schema 注释。本文不存取值域。

参数 设计意图(概念面)
层深 图有多高(沿路步数);第一关不再是零选择短链,后期关显著更长,推进感随冒险加深
岔口去路数 每次取舍在少量去路里选:少了没选择,多了不过脑
岔口取三去路概率 允许三去路的岔口中,实际长出第三条去路的比例——控制宽图出现频率
同深度节点宽度上限 同一深度最多并排几个节点;岔口生长到此即止,不再加宽
填充交替起始 恢复/奖励节点交替填充时,先放恢复节点的比例
分支密度 一局遇到多少次取舍(目标量级待设计验证)
入口个数 多入口给「从哪进场」的第一层选择
出口个数 多终点让「走哪条=打谁」成立;大岔口自第二关起
配比 攻击性/兑付/恢复的节奏配比,战斗保底优先
战斗节点保底数 成长位不挤没战斗——战斗是本作核心量
商店数 每局决战前恰一次补给,成长保底是结构事实

验收标准

判据 内容
产出合格 任意参数档产出的图必过产出约束六条+结构铁律;任意入口出发的任意路径都恰好到达一个终点
生长递增 L1/L2/L3 读数:最长路径步数与节点总数均逐关递增;节点总数增幅 Δ(L2→L3)>Δ(L1→L2)
归属锁定 多出口图每个终点前一层节点的去路集合恰含一个终点;各分支区域互不连达
必经恰一店 任意入口→终点路径经过且恰经过一家店
岔路取舍 任意岔口各去路下一节点类型互不相同;各条支路的节点类型构成互不相同
可复现 同种子+同参数档=同一张图
无软回退 不存在兜底图路径;参数无解即致命中止
战斗保底 任意合法产出的战斗节点数 ≥ 保底数