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

发布时间:2026/9/15 20:08:31

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/9/15 20:08:31

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

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

2026/9/15 20:38:34

不用SDK,用cURL直连REST API高效获取A股行情数据

做量化回测的人应该都有过这种感受:明明只是想要日K线数据,却被官方 SDK 绑得死死的。最初我用 AlphaFeed 也是走"装 SDK→配环境→调封装方法"的老路,直到一次线上环境部署,官方 SDK 对目标系统的兼容性出了问题&#…

2026/9/15 20:38:34

网络与IO问题排查实战:从现象到根因的联合诊断思维

网络和IO问题,越往后学越会发现它们总是手牵手出现。客户端日志报一句"stream disconnected before completion",很多人第一反应是"网络断了",结果抓包一看,服务端磁盘队列早就爆了,线程卡在读写里…

2026/9/15 20:38:34

uni-app购物小程序从0到1完整开发实战指南

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

2026/9/15 20:38:34

二分查找与递归算法实战:核心原理与优化技巧

1. 二分查找与递归算法核心精要作为算法工程师日常工作中最高频的两大基础技术,二分查找和递归算法构成了解决复杂问题的基石组合。我曾参与过多个大型系统的性能优化项目,其中超过60%的算法优化案例都涉及这两种技术的灵活运用。本文将分享四种最具代表…

2026/9/15 20:38:34

相场法模拟枝晶生长:从MATLAB代码到凝固模拟实战

这些年我在材料计算这条路上折腾下来,发现一个特别有意思的现象:很多刚接触凝固模拟的同行,一上来就盯着分子动力学或者第一性原理,反而把最容易上手、最出效果的相场法给跳过了。更可惜的是,还有人觉得相场法必须上Fo…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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