程序化生成
目录
简介
本文件系统性梳理 Cataclysm-DDA 的程序化生成体系,覆盖世界种子与随机数生成、确定性算法、overmap 地形与噪声层、子地图与地图生成、资源与物品生成、以及可扩展的生成器框架。文档以循序渐进的方式呈现,既适合初学者快速上手,也为高级开发者提供深入的技术细节与优化建议。
项目结构
围绕“世界—overmap—子地图—地图”的层级,程序化生成由以下模块协同完成:
- 世界工厂:负责世界初始化、选项加载与保存、模组管理。
- 随机数与确定性:统一的 PRNG 引擎、时间种子、哈希种子与确定性序列。
- Overmap 生成:基于噪声层与地形类型规则,生成大世界地形、河流、湖泊、海洋、道路等。
- 地图生成:在 overmap 基础上,按地形类型选择 mapgen 函数,生成子地图与内部布局。
- 子地图与空间索引:子地图合并、旋转镜像、场与光源维护、车辆与生物生成。
- 资源与物品:基于物品组与生成率的确定性生成策略。
图表来源
- src/worldfactory.cpp
- src/overmap.cpp
- src/mapgen_functions.cpp
- src/mapgen.cpp
- src/submap.cpp
- src/rng.cpp
章节来源
- src/worldfactory.cpp
- src/overmap.cpp
- src/mapgen_functions.cpp
- src/mapgen.cpp
- src/submap.cpp
- src/rng.cpp
核心组件
- 世界工厂与世界选项
- 世界保存、加载、模组列表管理;世界选项通过 options 系统持久化。
- 随机数与确定性
- 默认使用线性同余引擎,首次调用以高精度时间作为种子;支持外部设置种子;提供均匀/正态/指数/卡方等分布与确定性序列。
- Overmap 与噪声层
- 多种噪声层(森林、冲积平原、湖泊、海洋)组合生成地形;支持连续跨 overmap 的噪声。
- 地图生成器
- JSON 与内置函数双轨并行;按地形类型选择 mapgen 函数;分阶段执行(移除、地形、家具、默认、嵌套、变换、势力归属、区域)。
- 子地图与空间索引
- 子地图合并、旋转镜像、场与光源维护、车辆与生物生成缓存。
章节来源
- src/worldfactory.h
- src/rng.h
- src/overmap_noise.h
- src/mapgen.h
- src/submap.cpp
架构总览
下图展示从世界到地图生成的关键交互路径与职责边界:
图表来源
- src/worldfactory.cpp
- src/overmap.cpp
- src/overmap_noise.cpp
- src/mapgen.cpp
- src/submap.cpp
详细组件分析
世界种子系统与随机数生成
- 种子来源
- 首次调用随机函数时,使用高精度时钟作为种子;可通过接口显式设置种子,确保可复现。
- djb2 哈希用于世界名等字符串到整型的映射,便于作为部分随机源的种子输入。
- 确定性序列
- 提供独立于全局状态的确定性整数序列生成,便于测试与调试。
- 分布与概率
- 均匀、正态、指数、卡方分布;概率判断与骰子模拟;带小数的“概率取整”策略保证期望正确。
图表来源
- src/rng.cpp
- src/rng.cpp
- src/rng.cpp
- src/rng.cpp
- src/rng.cpp
章节来源
- src/rng.cpp
- src/rng.cpp
- src/rng.cpp
- src/rng.cpp
- src/rng.cpp
Overmap 生成与地形类型分布
- 噪声层
- 森林噪声、冲积平原噪声、湖泊噪声、海洋噪声分别控制不同地表特征的分布与连续性。
- 通过多频次叠加与缩放,形成自然过渡与局部细节。
- 地形类型与连接规则
- 基于 overmap 本地坐标与全局 base 点,保证跨 overmap 的噪声连续。
- 道路/地铁/河流等线性地形根据方向数组与连接规则生成。
- 河流/湖泊/海洋
- 使用噪声层与阈值判定;结合路径生成算法构建蜿蜒水系。
图表来源
- src/overmap_noise.h
- src/overmap_noise.cpp
章节来源
- src/overmap_noise.h
- src/overmap_noise.cpp
- src/overmap.cpp
地图生成算法与确定性流程
- 生成入口与上下文
- map::generate 接收 overmap 坐标、时间点、是否保存结果等参数;为每个子网格准备子地图,必要时填充统一地形。
- 地图生成阶段
- 阶段顺序:移除、地形、家具、默认、嵌套、变换、势力归属、区域。
- 每个阶段对 mapgendata 中的 map、地形、家具、陷阱、辐射、字段、生物、物品等进行操作。
- 地形函数与内置生成器
- 通过注册表将 overmap terrain 类型映射到具体生成函数(如森林、河流、地铁、海岸、峡谷边缘等)。
- 支持 JSON 描述的地图片段(jmapgen),按阶段应用到地图。
图表来源
- src/mapgen.cpp
- src/mapgen.h
- src/mapgen_functions.cpp
章节来源
- src/mapgen.cpp
- src/mapgen.h
- src/mapgen_functions.cpp
子地图创建与空间索引机制
- 子地图生命周期
- 生成前先填充统一地形(若 overmap 指定),再绘制具体布局;支持覆盖层合并与叠加。
- 空间索引与数据结构
- 子地图内部采用 SoA 结构存储地形、家具、光源、物品、场、陷阱、辐射等;提供旋转镜像与合并逻辑。
- 字段与光源
- 维护场数量与光源计数,合并时累加或覆盖;支持物品发光项的光源更新。
图表来源
- src/submap.cpp
- src/submap.cpp
章节来源
- src/submap.cpp
- src/submap.cpp
资源与物品生成规则
- 物品组与生成率
- 基于物品组(item_group)与生成率(spawn_rate)进行概率判定;类别生成率小于1时按概率取样,大于等于1时至少一次,并额外按次数取样。
- 生成位置与有效性
- 在指定矩形范围内随机采样有效位置;对不可放置区域(如无地板、破坏项、密封容器)进行过滤。
- 生成器示例
- 地图生成器中对“道路缺陷”“土壤”等场景使用随机分布与物品组生成。
章节来源
- src/map_extras.cpp
- src/mapgen.cpp
依赖关系分析
- 低耦合高内聚
- RNG 与地图生成解耦,通过接口注入;overmap 与 mapgen 通过注册表解耦。
- 关键依赖链
- worldfactory → overmap → mapgen → submap
- overmap → overmap_noise → simplexnoise
- mapgen → mapgendata → map
图表来源
- src/rng.cpp
- src/worldfactory.cpp
- src/overmap.cpp
- src/overmap_noise.cpp
- src/simplexnoise.cpp
- src/mapgen.cpp
- src/mapgendata.cpp
- src/submap.cpp
章节来源
- src/rng.cpp
- src/worldfactory.cpp
- src/overmap.cpp
- src/overmap_noise.cpp
- src/simplexnoise.cpp
- src/mapgen.cpp
- src/mapgendata.cpp
- src/submap.cpp
性能考量
- 噪声计算
- 多层噪声叠加与缩放会增加计算量;建议在 overmap 初始化时缓存噪声结果,避免重复计算。
- 地图生成阶段
- 分阶段执行减少一次性复杂度;尽量将昂贵操作(如路径/连通性检查)限制在必要区域。
- 子地图合并
- 合并时逐格扫描与字段累加是主要开销;可考虑批量更新与惰性求值。
- 随机数
- 频繁调用随机函数会引入抖动;对确定性要求高的场景应集中播种与重用随机序列。
故障排查指南
- 生成不一致
- 检查是否显式设置了种子;确认世界名与模组列表未改变;核对 overmap 生成参数与噪声层配置。
- 过程卡顿
- 关注噪声层与路径生成的循环次数;适当降低噪声层数或采样频率。
- 地图异常
- 检查 mapgen 阶段顺序与参数一致性;验证覆盖层合并逻辑与 Z 层依赖。
- 物品未生成
- 核对生成率与类别生成率;确认目标区域可放置且未被过滤。
章节来源
- src/overmap.cpp
- src/mapgen.cpp
- src/submap.cpp
结论
CDDA 的程序化生成体系以“确定性 + 可扩展 + 渐进式阶段化”为核心设计,通过噪声层与地形函数的组合实现自然感地形,借助 JSON 与内置函数的双轨机制满足多样化的生成需求。配合子地图的空间索引与合并策略,系统在可维护性与性能之间取得平衡。建议在实际开发中优先保证种子与参数稳定,合理利用噪声缓存与阶段化生成,以获得最佳体验。
附录
- 生成参数配置要点
- overmap 噪声层参数(层数、持续性、缩放)影响地貌细节与连续性。
- 地图生成器阶段权重与条件需与地形类型匹配,避免冲突。
- 物品生成率与类别生成率需结合游戏节奏调整。
- 自定义生成器开发指南
- 新增地形类型:在 overmap 与 mapgen 注册表中添加映射。
- 新增 JSON 地图片段:遵循 jmapgen 规范,按阶段声明操作与条件。
- 新增内置生成函数:实现 mapgen_function 接口并在注册表中绑定。
- 测试与验证:使用确定性序列与固定种子进行回归测试。
章节来源
- src/mapgen.h
- src/mapgen_functions.h
- src/overmap.cpp