Cataclysm-DDA Megacity Mod 设计蓝图解读:无限都市的生成机制与生存压力设计

发布时间:2026/11/14 23:15:17

Cataclysm-DDA Megacity Mod 设计蓝图解读:无限都市的生成机制与生存压力设计 Cataclysm-DDA Megacity Mod 设计蓝图解读无限都市的生成机制与生存压力设计【免费下载链接】Cataclysm-DDACataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA导读Megacity 是 Cataclysm-DDA大灾变黑暗之日官方仓库中的一个全城市总转换total_conversion模组整个世界被一座没有尽头的巨型城市覆盖没有原野、森林与河流玩家从避难所Evac Shelter出发后等待他的只有钢与混凝土的地狱。本文以模组作者 Renech 在 data/mods/Megacity/TODO.md 中留下的开发规划为主线结合 data/mods/Megacity/modinfo.json 的实际配置与 src/overmap_city.cpp、src/regional_settings.cpp、src/overmap_worldgen.cpp 等源码实现逐条拆解这个模组如何造出一座无限都市以及如何让玩家被困在这座都市里的设计思路读完你可以理解 CDDA 区域生成region settings与超大地图overmap城市铺设机制的底层原理并看清该模组已实现与待开发的功能边界。一、模组定位一个没有出口的世界modinfo.json中对模组的描述是The presidents dead and the city stretches on. Whether you walk for 24 hours or 24 days, there is only more city. There is no escape from this steel and concrete hell.总统已死城市无尽延伸。无论你走 24 小时还是 24 天前方只有更多的城市。在这钢与混凝土的地狱中无处可逃。这段描述与 TODO 中这不是阈限空间liminal space只是一座足够大的、近乎无限的城市刻意不给任何超自然解释的定位完全一致——模组坚持用纯粹的地图生成逻辑而非魔法设定来制造囚笼感。在模组目录中Megacity 的全部内容只有两个文件modinfo.json 与 TODO.md没有新增任何建筑、物品或怪物 JSON。这意味着整个模组完全依靠覆写copy-from原版默认区域设置来改变世界形态是一个配置驱动的模组范例。其MOD_INFO声明了关键信息category: total_conversion——总转换类模组会彻底改变世界生成形态dependencies: [dda]——依赖原版基础模组conflicts——与aftershock_exoplanet、backrooms、tropicata、classic_zombies、Isolation_Protocol、innawood、no_hope等模组冲突这些模组同样会替换区域/地形生成逻辑二者无法共存。二、无限都市是如何生成的modinfo.json 三层结构拆解Megacity 的世界生成由modinfo.json中三段相互关联的 JSON 结构驱动对应 CDDA 世界生成的三层抽象维度dimension→ 区域布局region layout→ 区域设置region settings。2.1 维度与区域布局整个世界只有一种区域{ type: dimension, id: Default, region_layout: default }, { type: dimension_region_layout, id: default, generation_mode: UNIFORM, uniform_region: mega_mega_city }第一个对象把默认维度Default的区域布局region_layout指定为default第二个对象定义了该布局的生成方式generation_mode: UNIFORM即整个世界地图统一使用mega_mega_city这一个区域设置。从源码 src/overmap_worldgen.h 可以看到regions_generation_mode目前支持四种模式模式说明UNIFORM动态生成整个维度只有一个区域MANUAL_VORONOI静态生成用 JSON 布置区域点再由 Voronoi 图划分区域RANDOM动态生成每张 overmap 从区域集合中随机挑选ANGLES动态生成把世界地图按角度等分成扇形区域对应实现dimension_region_layout_generator_uniform::generate_dynamic只有一行核心逻辑见 src/overmap_worldgen.cppplaced_regions.emplace( current_om, uniform_region )——无论请求哪张 overmap都返回同一个区域mega_mega_city。这就是走到天涯海角也只有城市的机制基础。2.2 区域设置抹掉一切非城市地形{ type: region_settings, id: mega_mega_city, copy-from: default, place_swamps: false, rivers: null, ocean: null, forests: null, lakes: null, highways: null, cities: mega_mega_city_settings, feature_flag_settings: { extend: { whitelist: [ FAKE_UNUSED_FLAG ] } } }这段配置以copy-from: default继承原版默认区域设置然后逐一覆写place_swamps: false——不生成沼泽rivers、ocean、forests、lakes、highways全部设为null——从世界生成管线中移除河流、海洋、森林、湖泊与高速公路。这直接落实了 TODO 中每个格子都被填满零原野、零森林、零非城市建筑的目标同时没有河流也是 TODO 中口渴压力可能更有效这一设计的前提cities指向自定义的城市设置mega_mega_city_settings。在 src/regional_settings.cpp 的region_settings::load中可以看到forests、rivers、lakes、ocean、highways等字段都以optional(...)方式解析值为null时对应可选区域不会生效从而被整体跳过生成。2.3 城市设置无限都市的核心参数{ type: region_settings_city, id: mega_mega_city_settings, copy-from: default, is_megacity: true, city_size: 16, city_spacing: 0, shop_radius: 200, shop_sigma: 0, park_radius: 0, park_sigma: 0 }对照 src/regional_settings.h 中region_settings_city的结构体默认值可以清楚地看出每个参数的用意参数原版默认值Megacity 值含义is_megacityfalsetrue开启巨型都市专用铺设逻辑city_size816城市基准半径overmap 格子数并作为 megacity 分支的判定输入city_spacing40城市间距0 意味着城市彼此紧贴地图覆盖率接近 100%shop_radius30200商铺区相对市中心的分布半径shop_sigma200商铺区分布的正态标准差0 时取消随机波动park_radius shop_radius0公园分布半径0 表示市中心无公园park_sigma 100 - shop_radius0公园分布标准差0 时公园完全消失关于city_spacing: 0src/overmap_city.cpp 的注释给出了一张城市间距 × 城市大小 → 每张 overmap 城市数量的对照表当city_spacing 0、city_size 16时单张 overmap 上会生成约 31 个城市地图覆盖率约 99%——这就是零空隙城市的空间基础。三、源码级的巨型都市铺设is_megacity 分支TODO 的第 1 条写道需要更好的城市放置方式让城市真正重叠、每个格子都被填满零原野、零森林、零非城市建筑。而当前实现是通过is_megacity分支完成的。在 src/overmap_city.cpp 的overmap::place_cities()中当city_settings.is_megacity为真时走的是完全独立于常规城市随机铺设的代码路径把每张 overmap尺寸为OMAPX × OMAPY按四等分取点得到 4 个等距的象限城市锚点{OMAPX/4, OMAPY/4}、{OMAPX/4, OMAPY*3/4}、{OMAPX*3/4, OMAPY/4}、{OMAPX*3/4, OMAPY*3/4}再补上正中央的{OMAPX/2, OMAPY/2}作为第 5 个锚点每个锚点先用ter_set( selected_point, oter_road_nesw )铺设一条十字路口作为城市起点并登记进city_tiles每座城市的tmp.size 40——代码注释明确指出数值越大填充越满但性能会因城市相互叠加铺设而急剧恶化40 是当前能保持可玩性的取值5 个锚点各自生长出的城市在 overmap 上互相重叠、填满整张地图随后由flood_fill_city_tiles()src/overmap_city.cpp把被城市包围的非城市区域也并入city_tiles。这正是 TODO 中所说城市彼此重叠、每格都被填满的当前实现方式TODO 也坦诚地记录了它的缺陷——目前只是以牺牲性能为代价的近似方案未来希望找到真正的、可负担的完全填充算法。四、TODO 路线图逐条解读从无尽城市到求生压力TODO.md 本质上是作者对未来开发方向的清单。以下逐条结合源码说明其意图与实现现状。4.1 商业区与郊区的再平衡TODO 第 2 条需要更好地处理商业区与郊区的关系。目前郊区过于庞大我想要被大片高层与商业建筑包围的小块郊区。更新我已让郊区消失但这好坏参半需要调整 sigma 值让城市中极偶尔地出现小块郊区。这条 TODO 直接对应shop_radius、shop_sigma、park_radius、park_sigma四个参数。在 src/overmap_city.cpp 的overmap::pick_random_building_to_place()中int shop_normal shop_radius; if( shop_sigma 0 ) { shop_normal std::max( shop_normal, static_castint( normal_roll( shop_radius, shop_sigma ) ) ); }其逻辑是用normal_roll(shop_radius, shop_sigma)做一次正态分布抽样得到本城的商业延伸距离shop_normal当某建筑位置到市中心的归一化距离town_dist shop_normal时放商铺 park_normal时放公园否则放住宅。当前模组把shop_radius拉到 200、shop_sigma设为 0意味着全城范围都按商业区处理town_dist的取值区间由trig_dist(...) * 100 / max(town.size, 1)决定见 src/overmap_city.cpp其上限不会超过 100因此 200 的半径实际上覆盖全城——这就是郊区已全部消失的机制原因。TODO 提出的下一步是给shop_sigma一个很小的正值让正态分布偶尔抽到较小的shop_normal从而在极小概率下漏出一小块住宅/郊区地带。4.2 逼迫玩家持续迁徙的鞭子TODO 第 3 条需要某种鞭子迫使玩家不断向城市中未探索的新区域迁徙。被困在无尽城市里只有当你真的被困住时才有意思。如果你杀光了方圆一英里内的所有东西然后翘着脚坐着那就毫无意义了。可能的手段完全禁用农业食物压力肯定是一种方式。口渴压力可能更有效因为这里没有河流。这条设计意图是 Megacity 的核心生存哲学无限都市不是末日乐园而是资源枯竭的监狱。TODO 明确表示这不是寻找魔法或异世界解释而是纯粹通过资源稀缺制造张力并且刻意不给任何解释。从配置现状看目前模组尚未实现农业禁用与食物/水资源压力modinfo.json 中没有相关覆写属于明确的待办范畴。4.3 移除一切无限水源TODO 第 4 条移除任何无限水源以增强口渴压力。包括后院泳池、带水格的公园等。这不包括单纯的净水。这条同样处于规划中状态。其目标是配合 4.2让水成为玩家持续向外推进的硬性驱动——因为 TOD/rivers: null已确保地图上没有河流天然水源一旦被清空玩家就必须不断向城市深处探索寻找新的供水点。4.4 更混乱的城市与路障TODO 第 5 条更混乱的城市、街道上的路障等目的是让载具旅行刻意变得困难。这大概可以直接进入原版 DDA所以先提交到那里。TODO 作者在此给出了明确的贡献建议这类城市混乱化改动街道路障、残骸等并不局限于 Megacity 模组适合直接作为 PR 提交给原版游戏vanilla DDA让所有玩家受益。这也呼应了仓库 CONTRIBUTING.md 中常规的开源贡献流程。五、配套设置避难所起点与场景黑名单为了让玩家在纯城市世界中有一个合法出生点modinfo.json还做了两处配套处理{ id: FAKE_UNUSED_FLAG, type: json_flag, name: , //COMMENT: Fake flag used for an empty whitelist. }, { type: overmap_special, id: Evac Shelter, copy-from: Evac Shelter, //COMMENT: Oops! Not so unused now, are you? Well we need to spawn somewhere, so this will have to do. For now., extend: { flags: [ FAKE_UNUSED_FLAG ] } }, { type: SCENARIO_BLACKLIST, subtype: whitelist, scenarios: [ evacuee ] }定义了一个空 flagFAKE_UNUSED_FLAG把它加入区域设置的feature_flag_settings.whitelist——因为当前区域没有其他可选地物需要用这个空白名单维持特征系统的合法性用copy-from扩展原版 Evac Shelter避难所这个 overmap 特殊建筑并打上该 flag保证它能在巨型都市中被生成成为玩家唯一的出生/庇护点用SCENARIO_BLACKLIST的whitelist子类型把出生场景锁定为 evacuee避难者避免其他场景引用不存在的出生地形导致生成失败。作者在注释里也承认这是暂时的权宜之计Well we need to spawn somewhere, so this will have to do. For now.未来会替换成更正式的出生方案。六、如何体验 Megacity 模组Megacity 已内置在 Cataclysm-DDA 仓库的 data/mods/Megacity 目录中无需单独下载。安装与体验方式如下从当前仓库构建游戏参见仓库根目录 README.md 的构建说明Linux 下通常执行make或使用 CMake构建产物为cataclysm-tiles等启动游戏进入新世界/New World创建界面在模组Mods列表中勾选Megacity分类为 total_conversion属于世界形态替换类模组选择 evacuee避难者场景开始游戏进入世界后你会发现地图上没有任何森林、河流、湖泊与高速公路只有连绵不绝的城市街区你可以通过调试菜单Debug Menu观察 overmap 上city_tiles的覆盖情况验证每个格子都是城市的生成效果。需要注意由于它是总转换模组且与多个替换世界地形的模组存在conflicts声明请勿与其他冲突模组同时启用城市生成采用 5 锚点重叠铺设在低性能机器上首次生成世界时可能较慢源码注释已提示性能随填充度恶化。七、结语一份活着的设计文档Megacity 的 TODO.md 与绝大多数项目文档不同——它不是使用说明而是一份作者公开的开发路线图与设计哲学声明从城市完全填充到商业区/郊区再平衡从禁农业、缺水的资源压力设计到路障化城市的原版化建议每条都直接映射到 modinfo.json 的具体参数与 src/overmap_city.cpp 等源码分支。它也诚实标注了哪些想法已经实现如 sigma 归零消除郊区、哪些仍待解决如真正的完全填充算法、农业禁用、水源清理。对模组作者而言这份文档示范了先定玩法目标、再落实到区域参数、最后反馈到源码机制的设计闭环对 CDDA 玩家而言理解这些参数就等于掌握了 region_settings 系统中如何用一份 JSON 重塑整个世界的能力。【免费下载链接】Cataclysm-DDACataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/13 5:57:06

AI出海合规实战:GDPR罚款与知识产权诉讼的技术防御路径

1. 这不是法务PPT,是AI出海团队每天要拆解的生存题“中国AI企业出海”这六个字,现在听上去像一句行业口号,但落到具体项目里,它背后是一张张被GDPR罚单压得喘不过气的财务报表,是一封封来自加州北区法院的知识产权诉讼…

2026/11/14 23:12:16

2026河南最新政策下报个班考电工证难吗?别再被坑了!

2026河南最新政策下报个班考电工证难吗?别再被坑了! 你是不是正为找工作发愁,听说电工证是硬门槛,但又担心自己能不能考上?尤其是在河南,2026年的政策更新后,很多新规对报考流程和考试内容都有影响。别担心,这篇内容就是为像你这样急需特种作…

2026/11/14 23:12:16

工地太忙根本没时间复习考试 电工证培训都干什么多久拿证

工地太忙根本没时间复习考试 电工证培训都干什么多久拿证 工地太忙根本没时间复习考试,这是很多特种作业人员的真实写照。尤其是像电工证这样的证书,不仅关系到能否上岗,还直接影响到薪资待遇和职业发展。但问题是,很多人不知道电工证培训到底都干什么,…

2026/11/14 23:12:16

从化高压电工证多少钱?转岗电工怎么快速拿到证上岗

从化高压电工证多少钱?转岗电工怎么快速拿到证上岗 找工作碰壁,简历被拒,原因就在这张证没拿到。最近在周口打工的张师傅,干了五年工地杂工,终于等到一个电工岗位,结果面试官一句话就把他拦住了:“你有高压电工证吗?”张师傅一脸懵,这证他连听都没听…

2026/11/14 23:07:05

工地太忙根本没时间复习考试 电工证为啥6年作废郑州报考避坑指南

工地太忙根本没时间复习考试 电工证为啥6年作废郑州报考避坑指南 工地太忙根本没时间复习考试,你是不是也经常因为工期紧、任务重,把电工证的复习和考试抛在脑后?别以为电工证不重要,它不仅是你从事特种作业的“通行证”,更是你职业生涯的“护身符”。…

2026/11/13 22:33:32

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/14 0:06:39

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来 之前考的证在外省能不能转过来?这个问题我太熟悉了,作为一名干了十几年的特种作业证书办理从业者,每年都会遇到不少像你一样在外地考了证,回来却发现无法直接使用的学员。别急,今天我就…

2026/11/14 0:06:39

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,你不是一个人。在信阳浉河区,很多刚进入工地的电工都面临这样的困境:工作强度大,时间碎片化,根本没有系统复习考试的机会。但电工证是上岗的硬门槛,…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑