僵尸 出现 在 哪里
可选范围、选行历史与放置顺序。
约 3 分钟
僵尸最初抽中的行,可以与它最终可见的行不同。普通动作先创建整批实体,再应用间距、发出基础位置事件,随后继续子类位置处理。行历史记录较早的抽取;之后的移动不会重写它。
一批 实体 变为 空间 队列
普通随机间距动作按指令顺序创建实体,再对已创建实体执行间距处理。对于五行 Board 上共同的右侧入场路径,
其中 是从零开始的行索引, 是场景入口偏移, 统计同一动作中此前分配到该行的实体数量。每个动作从全新的计数器开始,因此独立旗帜动作不会继续普通阵容的间距计数。
这创建的是水平距离,而非按固定计时逐条释放指令。宽度甚至可以反转预期的空间顺序。在场景偏移为零时,某行中第一个宽度为 270 的 air_ 起始 X 为 1090–1119;随后宽度为 42 的 skycity 加上 80 单位增量后,起始 X 为 942–971。尚未发生移动,后面的指令就已经更接近草坪。11创建、宽度与每动作间距普通随机间距动作先创建整批实体,再应用各行间距。自定义偏移向量为空时,使用默认增量 80,加上 0–29 的整数抽取。右侧入场的初始 X 在场景结果上加上 HitRect.mWidth。十五个标准场景使用共同入口方法;黑暗时代有条件地选择符合要求的墓碑捷径,否则回退到共同方法。0x1014c40c00x1014c47e80x1014c544c0x1023aa5b8
黑暗时代可以改用符合条件的墓碑捷径 X 减去 50 作为场景入口,再加上宽度与随机间距。普通声明初始没有墓碑,并且没有启用已声明的墓碑设计器;只有实际存在符合条件的捷径,该分支才适用。这里均为游戏坐标。
资格 条件 提供 基础 候选 行
指令 Row = 5 请求随机选择器;Row = 6 复用前一行。固定行值 0–4 使用另一分支。下列条件属于随机选择,并不适用于所有可能的后续放置:
- 行位于
Board.范围内,并已启用。rowCount - 锚点满足
Grid。Extents. mY - 1 <= row - 场景条件接受该行与精确僵尸类型。
属性构造器将 Grid 默认为 (1, 1)。较大的 Y 范围限制锚点行,并不直接定义碰撞框或伤害覆盖。
海盗港湾普通木板声明位于从零开始的行 [1, 3]。场景条件检查名称,因此不能把规则推广到所有看起来会飞的类型。未来世界将 disco_ 排除在最外侧行之外。其他标准场景条件在这个阶段接受所有行,但共同的 Board 与范围条件仍然适用。22资格条件与零端点共同谓词检查行数、启用状态、GridExtents.mY 和场景条件。海盗港湾使用精确类型名检查;未来世界限制 disco_mech 的最外侧行。零权重记录仍保留在采样器中。其包含边界的累积比较,在抽取值恰为零时可以选择第一条零权重记录,受控原生辅助函数检查证实了这一点。0x101595f3c0x1014fd55c0x1015110100x10156ac7c
先 有 基础 权 重 , 再看 选择 历史
对于某行保存的时间戳 ,令 。其基础权重为
时间戳初始为 FLT_,因此全新 Board 上的合格行使用权重为 1 的分支。追踪到的小推车写入要求 Wave,而普通无尽列出的是 Wave。这个时间戳不会随每次普通生成而重置。
归一化为 。令 为距最近一次和再前一次选择的计数器。对于 ,历史调整在代数上为
更小的 得到零调整权重。下一次抽取的名义份额为 。两个计数器初始都为零。选定一行之后,更新顺序为:
- 对每个基础权重为正的行,同时递增两个计数器。
- 对选中行,将递增后的 复制到 ,再令 。
因此,合格但未选中的行从 变为 ,选中行则变为 。计数器按选择次数推进,不按秒。33历史计数器,而非生成计时器Board 构造器将两个历史计数器初始化为零。采样器以 float32 运算调整归一化基础权重,选择后更新符合条件的行历史。正文给出其代数形式与舍入后的名义份额。独立时间戳初始为 FLT_MAX;追踪到的小推车写入要求 WaveGeneratorModule,而标准普通无尽使用 WaveManagerModuleProperties。0x10156ab200x10156aba00x10157f4180x1016246ac
当五行同等符合条件时,前两次抽取的各行权重相等。第三次抽取前,若此前选过两个不同行,它们各占 5.88%,未选行各占 29.41%;若连续选择同一行,该行占 4.76%,其他行各占 23.81%。视图可以重建这些状态,并比较地形限制。
- 第 1 行a 2 · b 229.41%
- 第 2 行a 1 · b 25.88%
- 第 3 行a 2 · b 229.41%
- 第 4 行a 0 · b 25.88%
- 第 5 行a 2 · b 229.41%
零权重不会移除记录。采样器使用 draw <= cumulative weight,因此恰为零的抽取值可以接受第一条记录,即使它不符合资格。2
基础 事件 先 执行 , 子 类 随后 完成
应用随机间距时,整批实体已经存在于 Board 僵尸列表中。设置实体位置之后,执行其位置钩子。基础钩子同步发出 OnZombie,子类代码可以在之后继续运行。
活动的球果训练家幽林马法阵,可以把符合条件的新实体移动到 ,即玩家视角第 9 列、第 3 行。它响应新加入事件,而不是按半径反复拉取所有已有僵尸。目标位置固定,不取自马的位置。
回调允许运行时小型/中型体型,并有状态、标记、Zomboss、精英及精英免疫排除条件。检查的是运行时体型,而非精灵图看起来的大小。普通首领状态与精英状态不同,回调也不直接检查普通首领状态。44幽林马的加入 Board 事件基础位置钩子同步发出 OnZombieAddedToBoard。活动法阵接受运行时为小型/中型且通过标记、状态与精英检查的实体,并写入固定目标位置。它既不重新抽取加权行,也不重写行历史。本地化将 animnuts 命名为球果训练家,将马命名为幽林马。国王/渔夫的子类代码在基础事件之后继续执行。0x100ccab7c0x100cd9ea00x1019958d4
国王和渔夫随后进行各自的同类占用扫描。它们能看到同一新批次中其他实体的当前坐标,包括尚未最终确定的位置。
当前行不可用时,辅助函数打乱剩余候选并选择一个。成功放置使用最后一列,X 为 744。扫描没有“仅存活对象”筛选:死亡或等待移除的对象,在从 Board 列表中删除前仍可能占用行。
没有剩余行时,新实体被拒绝。普通国王路径进入 ZS_Die,渔夫则立即发起移除。两者都不会选择较早对象作为替代牺牲者、创建重试或退还生成指令。两者仍能到达普通掉落检查,且拒绝发生在初始波次生命值快照之前。55相近的行扫描,不同的自身处理两个钩子都扫描 Board 僵尸列表中的同类对象,包括新创建的批次。渔夫排除当前对象;国王不排除。两者都不是仅扫描存活对象。没有可用行时,普通国王处理进入 ZS_Die,渔夫带该标记的分支则立即请求移除。两者都会到达基础掉落处理,也都不会重试或退还生成指令。0x10238803c0x10151e4ec0x1023893000x101520cac
法 阵 只有 一个 共享 生命 周期
Board 保留共享法阵,而非每匹马各有一个。首次创建确定目标位置与是否存在装扮附加效果。具备该效果时,被接受的新实体还会收到眩晕请求,其引用会被保留;这不会绕过正常的状态免疫机制。
随包序列为开始动画、15 秒循环、结束动画。重复激活会以新的 15 秒重新开始循环,不会把时间加到旧剩余时长上。复用保留捕获引用,也不改变首次创建时的装扮效果。
清理会清除追踪的眩晕状态,但没有保存原始坐标,也不会恢复位置。它同样不会持续把已捕获僵尸移回法阵。特别是,之后成功的国王/渔夫放置可以覆盖法阵位置,而最初抽中的行仍保留在历史记录中。66共享法阵刷新,不叠加首次创建确定法阵目标位置与装扮附加效果。之后的激活复用共享法阵,重新开始 15 秒循环,保留被捕获对象的引用。清理会清除追踪的眩晕状态,但没有保存可供恢复的原始位置。起始与结束动画独立于计时循环。0x100ccab7c0x100ccb0a40x100cda0cc
注释
每条论断的依据:代码路径,以及追踪到它的原生地址。
- 1
创建、宽度与每动作间距
普通随机间距动作先创建整批实体,再应用各行间距。自定义偏移向量为空时,使用默认增量 80,加上 0–29 的整数抽取。右侧入场的初始 X 在场景结果上加上 HitRect.mWidth。十五个标准场景使用共同入口方法;黑暗时代有条件地选择符合要求的墓碑捷径,否则回退到共同方法。
0x1014c40c00x1014c47e80x1014c544c0x1023aa5b8 - 2
资格条件与零端点
共同谓词检查行数、启用状态、GridExtents.mY 和场景条件。海盗港湾使用精确类型名检查;未来世界限制 disco_mech 的最外侧行。零权重记录仍保留在采样器中。其包含边界的累积比较,在抽取值恰为零时可以选择第一条零权重记录,受控原生辅助函数检查证实了这一点。
0x101595f3c0x1014fd55c0x1015110100x10156ac7c - 3
历史计数器,而非生成计时器
Board 构造器将两个历史计数器初始化为零。采样器以 float32 运算调整归一化基础权重,选择后更新符合条件的行历史。正文给出其代数形式与舍入后的名义份额。独立时间戳初始为 FLT_MAX;追踪到的小推车写入要求 WaveGeneratorModule,而标准普通无尽使用 WaveManagerModuleProperties。
0x10156ab200x10156aba00x10157f4180x1016246ac - 4
幽林马的加入 Board 事件
基础位置钩子同步发出 OnZombieAddedToBoard。活动法阵接受运行时为小型/中型且通过标记、状态与精英检查的实体,并写入固定目标位置。它既不重新抽取加权行,也不重写行历史。本地化将 animnuts 命名为球果训练家,将马命名为幽林马。国王/渔夫的子类代码在基础事件之后继续执行。
0x100ccab7c0x100cd9ea00x1019958d4 - 5
相近的行扫描,不同的自身处理
两个钩子都扫描 Board 僵尸列表中的同类对象,包括新创建的批次。渔夫排除当前对象;国王不排除。两者都不是仅扫描存活对象。没有可用行时,普通国王处理进入 ZS_Die,渔夫带该标记的分支则立即请求移除。两者都会到达基础掉落处理,也都不会重试或退还生成指令。
0x10238803c0x10151e4ec0x1023893000x101520cac - 6
共享法阵刷新,不叠加
首次创建确定法阵目标位置与装扮附加效果。之后的激活复用共享法阵,重新开始 15 秒循环,保留被捕获对象的引用。清理会清除追踪的眩晕状态,但没有保存可供恢复的原始位置。起始与结束动画独立于计时循环。
0x100ccab7c0x100ccb0a40x100cda0cc