新手入门 · Getting Started
这一页只做一件事——把你从「完全不懂 CD2」带到「改出第一个生效的数字,并且知道下一步去哪」。它不替代 Reference。
一、CD2 是什么
CD2(Custom Difficulty 2)是《深岩银河》的一个模组,它让你自己定义一个难度:虫量、敌人种类与行为、补给成本、光照、矮人属性……都能改。
它不是在原版难度上再加一级,而是把决定难度的那些参数交到你手上。你写的东西是一份 JSON 文本,通过游戏里的 CD2 面板使用。
- 获取方式:见 资源页 · 获取 CD2
- 安装方式、以及和其它模组的兼容问题:见 FAQ · 我该如何使用它 与 FAQ · 与 MEV/DEA 等扩展模组兼容吗
二、一个 CD2 就是一份 JSON
- 文件的顶层字段就是各种模块:
Caps、Resupply、DifficultySetting、Pools、Enemies…… - 没有填写的配置项不会归零,而是从基准难度取默认值。基准难度由
DifficultySetting.BaseHazard指定;
不写 BaseHazard 时,基准就是你「在任务里选的那个官难」——不是固定 Hazard 5。
- 顶层
Name决定这份难度保存后叫什么名字。 - 所以「只写自己想改的那几个字段」是常见写法:其余全部沿用基准难度。
所以一份最小、但真的能干点事的难度长这样:
{
"Name": "My First CD2",
"DifficultySetting": {
"EnemyCountModifier": 2
}
}这就是「一个难度 + 一个简单修改」:把当前基准难度的全局敌人数量倍率设成 2。 (这里没有写 BaseHazard,所以基准就是你进游戏时选的那个官难。)
→ 字段与格式的完整规则:基础部分 · CD2 难度文件要求
三、入门时,可以先把 CD2 理解成两部分
| 你写下的是 | 谁负责 | |
|---|---|---|
| 基础配置(静态) | 「这个值是多少」 | Module · Pool · Enemy |
| 动态逻辑(会变) | 「这个值怎么算、什么时候变」 | Mutator · Trigger · WaveSpawner |
这是学习用的模型,不是严格的 API 分类——但它能解释你 90% 的困惑。
先静态、再动态。 大部分入门时的挫败感,都来自还没试过「改一个数字」,就直接去写动态逻辑。 等你真的开始写动态逻辑,有一件工具值得尽早认识:Vars(见第七节——它不是高级内容,而是早点养成会省事的习惯)。
四、五个词就够了
| 术语 | 它管什么 | 去哪看 |
|---|---|---|
Module模块 | 一个功能板块:补给、虫量上限、光照、矮人属性…… | 模块 |
Enemy / Descriptor | 某类敌人的配置 / 描述:血量、速度、抗性、外观等 | 敌人配置Direct |
Pool怪池 | 哪些敌人可以出现、按什么权重出现 | 模块 · 怪池 |
Mutator | 让某个值跟着游戏条件变化:加减乘、判断、按人数…… | Mutators |
WaveSpawner | 主动安排一波敌人:何时、在哪、多少、什么怪 | 波次生成器 |
正式术语保持英文原名,中文只负责解释用途。字段、Descriptor、Mutator 的名字一律照抄原文——不要给字段自己编中文代码名。
五、第一次修改(6 步)
- 装好 CD2 与加载器 —— 获取方式见 资源页 · 获取 CD2,安装方式见 FAQ · 我该如何使用它
- 打开游戏里的 CD2 面板(ModHub)—— 见 基础部分 · CD2 界面
- 复制一个最小文件:Hazard 5x2 示例——就是 Hazard 5 + 敌人翻倍 + 补给 60 硝石
- 只改一个数字:挑
EnemyCountModifier里的一个数字改大或改小——它是按人数排列的数组,改的时候每个元素都要动 —— 见 模块 · 难度设置 - 点
Save保存;难度名取顶层Name字段 - 进游戏验证 —— 没变化就去 为什么没生效 · Debug
> x2 是什么意思? 难度名里的 x2 指的是把基础档的 EnemyCountModifier 每个元素乘 2,不是把某个数字换成 2。实测:Hazard_6 的 [0.95, 1.05, 1.35, 1.65] ×2 = [1.9, 2.1, 2.7, 3.3],正是 Hazard_6x2_60_Nitra 里的值。也有作者手工改过的档不遵循这个倍率。
六、第一次测试
- 先 Save,再进游戏。 不建议进游戏之后再切难度。
- 想确认某个值到底是多少,可以用
Vars+Watch把它显示在界面上。 - 改完没有任何变化 → 直接进 为什么没生效 · Debug。
七、早点学会 Vars,会省下很多时间
⭐ 准备自己写机制时,建议尽早认识——它不是「高级内容」,而是一个早点养成会省事的习惯。
为什么值得学:当你的 CD2 开始出现「先算一个值,再让另一个地方用这个值」的逻辑时,Vars 能把这些中间状态集中起来,而不是把所有东西塞进一大串 Mutator。
它能帮你什么:
- 看得见:把想验证的表达式接进一个变量,打开
Watch,它的值就直接显示在游戏 UI 上。关键在于:代码一旦写错,这个变量会什么都不显示——「屏幕上找不到它」本身就是明确的报错信号。 - 写得短:变量定义一次,之后就能在任何接受同类型值的地方用
{"Var": "变量名"}引用。把重复出现的表达式抽成一个变量,代码会短很多,日后要改也只需要改一处。 - 连得通:所有变量在同一时刻统一更新,因此不同模块里读到的值始终一致,可以用来做模块之间通信。
你什么时候真正需要它:
| 你现在在做的事 | 需要 Vars 吗 |
|---|---|
| 只改一个数字(虫量、补给、上限) | 不需要,跳过也没关系 |
| 开始写动态机制(按人数、按时间、按阶段变) | 建议尽早认识 |
| 写复杂的 Mutator / Trigger / WaveSpawner | 会越来越有价值 |
用 Vars 最值得养成的习惯是「先观察,再继续写」:写逻辑 → 把关键中间值放进 Vars → 用 Watch 看它 → 确认它按预期变化 → 再写下一层。改完没生效时,这条习惯也是 Debug 里最先推荐你做的一步。
一个限制:变量之间不能形成循环依赖(细节见 Reference,新手阶段不用去画依赖图)。
你现在不需要把 Vars 的全部细节学完。 先知道它能保存 / 共享值、并且可以用 Watch 观察它,就够开始用了;需要深入时再查:
→ 完整语法与字段:模块 · 全局变量池 Vars → 三种用法、限制与示例:Debug 页 · 一、先用 Vars + watch 字段把逻辑调通
八、接下来去哪
推荐顺序——这是路线,不是门槛,卡住或想跳都可以:
改一个数字 → 改虫量上限 / 怪池 / 敌人 → 简单 Mutator(按人数、按时间)→ 条件逻辑(If / IfFloat)→ Trigger(条件 → 触发 → 持续)→ WaveSpawner(主动安排一波)→ Vars + Mutators + Trigger 组合
九、三条出路
| 你现在想做什么 | 去哪 |
|---|---|
| 动手做一次具体改动 | 常见修改 · Cookbook |
| 查某个字段到底怎么用 | Reference · 查表(模块 / Mutators / 敌人配置…) |
| 改了没生效 | 为什么没生效 · Debug |
| 想看一整套机制怎么拼起来 | 案例拆解 · Case Study |