跳到正文

一个编号波次是一批预定动作。在这些动作创建任何僵尸之前,普通无尽先构建波次方案:有多少波、哪些是旗帜边界,以及每波普通阵容可以花费多少点数。显示关卡数决定这套共同框架。

01 / 输入

共同的输入

16 个标准世界都列出了 DangerRoomJitteredWaveGenerator。它们提供不同的僵尸池,但普通描述构建器从共享 DangerRoomPropertySheet 读取点数参数,而不是读取生成器对象自身的点数声明。11共享输入普通描述构建器读取共享 DangerRoomPropertySheet 中的点数字段。响应设置函数将服务器提供的数值写入同一个对象。生成器自身的声明属于另一组字段,不是这个构建器使用的点数输入。0x101ab68400x101d6db00

世界仍然重要:它提供基础僵尸、可选类型池,以及额外设计器。摩登世界、复兴时代、蒸汽时代和童话森林甚至声明了局部波次增量 20,但这个构建器并不读取该局部字段。公式仍以共享增量为输入。

示例设置为:起始点数 100、每波固定增量 30、随关卡增长的增量 5。波次数设置为 MinWaveCount = 5、MaxWaveCount = 15、WaveAddEach = 1 和 WaveAddInterval = 10:每十个显示关卡数增加一波。

令 LL 表示显示关卡数,ww 表示从零开始的波次索引。已存进度值为 L−1L-1。在示例安排中,5 的倍数会选择 Boss 文件。因此,下方的普通关卡视图覆盖 L∈{1,…,149}L\in\{1,\ldots,149\} 中满足 L mod 5≠0L\bmod5\ne0 的关卡。22使用哪个关卡数?供设计器使用的读取函数返回已存进度值加一。文件名辅助函数在显示关卡数可被共享 BossInterval 整除时选择 Boss 变体,其内置值为 5。已检查的胜利后继续分支只在下一个关卡数小于 150 时加载关卡。因此交互示例提供 1–149 中的普通关卡数;这个客户端分支不能确立通用的服务器准入规则。0x101d6ca840x101d4a4e80x101c360dc

02 / 长度

一共有多少波?

N(L)=min⁡(15,  5+⌊L10⌋)N(L)=\min\left(15,\;5+\left\lfloor\frac{L}{10}\right\rfloor\right)

第 1–9 关的计算结果为 5 波,第 36 关为 8 波,第 49 关为 9 波。公式在第 100 关达到 15 波上限;由于该关卡数选择 Boss 文件,第 101 关才是首个达到上限的普通关卡。此后点数预算继续增长。33波次数与旗帜间隔描述构建器使用 MinWaveCount、MaxWaveCount、WaveAddEach 和 WaveAddInterval。已检查的构造函数默认值分别是 6、15、1 和 5。本指南采用收到的实际游玩波次设置 5、15、1 和 10。在得到的 5–15 波范围内,目标分组数在少于 7 波时为 1,少于 12 波时为 2,其余为 3。得到的间隔等于波次数除以目标分组数,再向上取整。0x101ab68400x101d4a7e8

图版 1.1第 1 至 149 关每个显示关卡数的 N(L);5 的倍数选择 Boss 文件,在基线上留作空缺。第 36 关有 8 波。

03 / 预算

基础增长规律

对于 w=0,…,N(L)−1w=0,\ldots,N(L)-1,定义增量 Δ\Delta 与基础预算 PP:

Δ(L)=30+5L,P(L,w)=100+Δ(L)w.\begin{aligned} \Delta(L)&=30+5L,\\ P(L,w)&=100+\Delta(L)w. \end{aligned}

同一关卡内的基础预算构成等差数列。增大 LL 会改变其斜率;第一波仍然是 100 点。44基础预算共享构造函数提供 StartingPoints = 100、BasePointIncrementPerWave = 30 和 BasePointIncrementPerLevel = 5。描述构建器根据从零开始的波次索引,逐次增加合并后的每波增量。0x101ab68400x101d4a7e8

04 / 重音

旗帜边界与最终波

在 5–15 波范围内,目标分组数 gg 决定常规旗帜间隔 ss:3

g(N)={1,5≤N<7,2,7≤N<12,3,12≤N≤15,s(L)=⌈N(L)g(N(L))⌉.g(N)=\begin{cases} 1,&5\le N<7,\\ 2,&7\le N<12,\\ 3,&12\le N\le15, \end{cases} \qquad s(L)=\left\lceil\frac{N(L)}{g(N(L))}\right\rceil.

填充预算 BB 为:

B(L,w)={⌊2.5P(L,w)⌋,(w+1) mod s(L)=0  ∨  w=N(L)−1,P(L,w),otherwise.B(L,w)=\begin{cases} \lfloor2.5P(L,w)\rfloor,&(w+1)\bmod s(L)=0\;\lor\;w=N(L)-1,\\ P(L,w),&\text{otherwise}. \end{cases}

当从一开始计数的波号是 ss 的倍数时,就出现一个常规旗帜边界。最后一波即使所在分组更短,也获得较大的预算。这些标记描述波次方案,还没有计算额外的旗帜僵尸。

逻辑“或”很重要:同时属于最终波和常规旗帜边界的波次,只应用一次倍率,而非两次。下一波仍沿用未加成的基础增长规律。55任一边界,一次加成波次转换流程在常规旗帜边界波或最终波上,将基础预算乘以 2.5。即使同时满足两个条件,也只应用一次倍率。乘积使用 float32 运算,再截断为整数。下一波继续沿用未加成的基础增长规律。0x101ce8a54

图版 1.2第 36 关的填充预算:8 波,分 2 组,旗帜间隔 4,每波增加 210 点。第 8 波:B(36, 7) = ⌊2.5 × (100 + 210 × 7)⌋ = 3,925

分步查看

  1. 1基础增长。 每一波在第一波的 100 点之上增加 Δ = 30 + 5L = 210 点:P(L, w) = 100 + Δw。
  2. 2旗帜边界。 8 波分为 2 组,因此 s = 4:波号为 4 的倍数的波次是常规旗帜边界。
  3. 3旗帜波。 常规旗帜边界的预算为 ⌊2.5P⌋;绿色部分是倍率在基础预算之上增加的点数。
  4. 4最终波。 最后一波同样获得较大的预算;若它同时是旗帜边界,也只加成一次。

05 / 下一步

这份计划覆盖什么

普通填充流程按所选种类的 WavePointCost 消耗 BB。它既不是僵尸数量,也不是总生命值上限。无法花出的点数可以剩余;额外首领与独立的旗帜动作在其他环节添加。世界特有的处理还可以替换或补充生成的阵容。66预算支付什么加权填充流程按所选种类的 WavePointCost 消耗点数。额外首领在普通填充完成后追加;旗帜僵尸作为独立动作安装。Eighties 可以在后处理时替换指令,而不重新进行普通预算检查。因此预算描述的是构建中的一个阶段,不是最终僵尸数量,也不是总生命值上限。0x101ce7f080x101c79bec0x101ce4f5c

在旗帜边界或最终波,安装流程可以添加一个独立的旗帜僵尸动作。它有自己的默认间距,不从 BB 中支付成本。世界处理与额外首领同样在不同阶段运行。波次时钟使用的生命值总量,要等这些动作创建并放置实体后才采样。

图版 1.3以种子 1 生成的古埃及第 36 关第 4 波:普通动作的指令,按阵容模型抽取的顺序排列。

分步查看

  1. 1可用种类。 基础种类加上按索引而非权重选出的四个池条目。
  2. 2预算。 第 4 波是旗帜波,填充预算为 1,825 点。
  3. 3加权填充。 在买得起的种类中抽取 8 条指令,直到没有种类买得起;75 点无法花出。
  4. 4预算之外。 本关唯一一次首领尝试成功并选中这一波:首领指令追加在后,不从 B 中支付。旗帜波或最终波还会获得一个独立的旗帜僵尸动作,除非被抑制。
  5. 5生命值小计。 每条指令按其抽取的等级与无尽实战生命值参考计算,并按波次查询的报告方式转换;假设创建修正中性且放置成功,独立的旗帜动作不计入。

下一个问题是游戏如何选择阵容:哪些种类会被选中,它们的成本与权重又如何决定下一只僵尸?

注释

每条论断的依据:代码路径,以及追踪到它的原生地址。

  1. 1

    共享输入

    普通描述构建器读取共享 DangerRoomPropertySheet 中的点数字段。响应设置函数将服务器提供的数值写入同一个对象。生成器自身的声明属于另一组字段,不是这个构建器使用的点数输入。

    0x101ab68400x101d6db00
  2. 2

    使用哪个关卡数?

    供设计器使用的读取函数返回已存进度值加一。文件名辅助函数在显示关卡数可被共享 BossInterval 整除时选择 Boss 变体,其内置值为 5。已检查的胜利后继续分支只在下一个关卡数小于 150 时加载关卡。因此交互示例提供 1–149 中的普通关卡数;这个客户端分支不能确立通用的服务器准入规则。

    0x101d6ca840x101d4a4e80x101c360dc
  3. 3

    波次数与旗帜间隔

    描述构建器使用 MinWaveCount、MaxWaveCount、WaveAddEach 和 WaveAddInterval。已检查的构造函数默认值分别是 6、15、1 和 5。本指南采用收到的实际游玩波次设置 5、15、1 和 10。在得到的 5–15 波范围内,目标分组数在少于 7 波时为 1,少于 12 波时为 2,其余为 3。得到的间隔等于波次数除以目标分组数,再向上取整。

    0x101ab68400x101d4a7e8
  4. 4

    基础预算

    共享构造函数提供 StartingPoints = 100、BasePointIncrementPerWave = 30 和 BasePointIncrementPerLevel = 5。描述构建器根据从零开始的波次索引,逐次增加合并后的每波增量。

    0x101ab68400x101d4a7e8
  5. 5

    任一边界,一次加成

    波次转换流程在常规旗帜边界波或最终波上,将基础预算乘以 2.5。即使同时满足两个条件,也只应用一次倍率。乘积使用 float32 运算,再截断为整数。下一波继续沿用未加成的基础增长规律。

    0x101ce8a54
  6. 6

    预算支付什么

    加权填充流程按所选种类的 WavePointCost 消耗点数。额外首领在普通填充完成后追加;旗帜僵尸作为独立动作安装。Eighties 可以在后处理时替换指令,而不重新进行普通预算检查。因此预算描述的是构建中的一个阶段,不是最终僵尸数量,也不是总生命值上限。

    0x101ce7f080x101c79bec0x101ce4f5c