新手入门 · Getting Started

这一页只做一件事——把你从「完全不懂 CD2」带到「改出第一个生效的数字,并且知道下一步去哪」。它不替代 Reference。

一、CD2 是什么

CD2(Custom Difficulty 2)是《深岩银河》的一个模组,它让你自己定义一个难度:虫量、敌人种类与行为、补给成本、光照、矮人属性……都能改。

它不是在原版难度上再加一级,而是把决定难度的那些参数交到你手上。你写的东西是一份 JSON 文本,通过游戏里的 CD2 面板使用。

二、一个 CD2 就是一份 JSON

不写 BaseHazard 时,基准就是你「在任务里选的那个官难」——不是固定 Hazard 5。

所以一份最小、但真的能干点事的难度长这样:

json
{
    "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 步)

  1. 装好 CD2 与加载器 —— 获取方式见 资源页 · 获取 CD2,安装方式见 FAQ · 我该如何使用它
  2. 打开游戏里的 CD2 面板(ModHub)—— 见 基础部分 · CD2 界面
  3. 复制一个最小文件:Hazard 5x2 示例——就是 Hazard 5 + 敌人翻倍 + 补给 60 硝石
  4. 只改一个数字:挑 EnemyCountModifier 里的一个数字改大或改小——它是按人数排列的数组,改的时候每个元素都要动 —— 见 模块 · 难度设置
  5. 点 Save 保存;难度名取顶层 Name 字段
  6. 进游戏验证 —— 没变化就去 为什么没生效 · 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 里的值。也有作者手工改过的档不遵循这个倍率。

六、第一次测试

七、早点学会 Vars,会省下很多时间

⭐ 准备自己写机制时,建议尽早认识——它不是「高级内容」,而是一个早点养成会省事的习惯。

为什么值得学:当你的 CD2 开始出现「先算一个值,再让另一个地方用这个值」的逻辑时,Vars 能把这些中间状态集中起来,而不是把所有东西塞进一大串 Mutator。

它能帮你什么:

你什么时候真正需要它:

你现在在做的事需要 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