案例拆解 · Case Study
这一页是什么:一个完整案例的拆解(Case Study)——回答的是「一整套机制是怎么拼起来的」。它不要求你从头读到尾:每道功能后面都有一行「想深入了解」,指向对应字段的完整定义。只想先做一个小改动,请去看 常见修改 · Cookbook;完全没接触过 CD2,从 新手入门 开始。
提取方式:json.load(open(p, encoding="utf-8"), strict=False) 读取;下文所有 JSON 片段都是按原文 span 原样切出的,未补全、未美化(保留了原文的空格与排版习惯)。
只读分析:本页只做拆解分析,未改动作者的原始工作文件。
下面用的是一个真实存在、能在游戏里跑起来的难度:Hazard 9 · 物竞天择。它用到的 CD2 能力比较全面——动态取值、变量池、波次生成、敌人描述符、底层属性都用上了。
为什么拿它当样本:这个难度是本站作者自己做的,并且已经在游戏里实测跑过。拿自己的东西拆解有两个好处:一是讲解不会猜错——每一处为什么这么写,都是设计时就定下来的,不用靠猜别人的意图;二是每一段都能跑——你照着抄不会碰上「看着是对的、进游戏却不生效或者直接报错」这类问题。
这里写的不是「这个难度多好玩」,而是「它想实现某个效果时,具体是怎么拼出来的」。每一步都给出对应的真实代码,你可以照着改。源文件:Hazard 9 · 物竞天择 · v0.18.13(JSON,210 KB)
怎么读这页:这页按由浅入深排,建议从头顺着看——①~④ 各只用到一个到几个原语,学会了再看 ⑤⑥ 这两套系统。第一遍只看每个功能的流程条、「它做了什么」和精简骨架;「实现拆解」是你动手写类似功能时的对照参考,可以整节跳过。
按目标查案例
不知道从哪一节开始,就先看这张表:左边是你想实现的效果,中间是对应的功能,右边是这类需求通常会用到的原语。
| 我想做什么 | 先看哪一节 | 通常会用到的原语 |
|---|---|---|
| 让一个数值自己累加、记账 | 功能 ① | Accumulate · Delta |
| 一次性事件 → 拉成一个持续窗口 | 功能 ② | TriggerOnChange · TriggerFixedDuration |
| 在关键时刻采样一次并保持住 | 功能 ③ | LockFloat · Max |
| 按阶段发奖励、播报 | 功能 ④ | Sequence · TriggerTimer |
| 满足条件才出现的兜底机制(是 / 否) | 功能 ⑤ | 状态评估 · 是 / 否选择单位 |
| 按玩家表现动态换怪池 | 功能 ⑥ | Sequence · 怪物池分发 |
| 计时 / 冷却 / 延迟 | 功能 ② ④ ⑤ ⑥ | StopWatch · TriggerTimer · TriggerDelay |
字段的完整含义不在本页:顶层模块查 模块,条件与计算查 Mutator,敌人控制项查 敌人配置。
功能索引
六个功能按由浅入深排列:①~④ 是单个原语的用法,⑤⑥ 是把很多原语拼成一套系统。
| 功能 | 一句话 | 难度 |
|---|---|---|
| ① 硝石经济改造 | 关掉地图硝石,改用一本自己记的账 | ★ |
| ② 勘探者无人机 | 击杀换一个 20~30 秒的开关 | ★★ |
| ③ 锁血 | 把回血上限钉在当前血量上 | ★★★ |
| ④ 阶段评级 → 三种啤酒 | 每阶段发一次奖 | ★★★★ |
| ⑤ 生态重置 | 兜底救援 · 是/否选择 | ★★★★★ |
| ⑥ 物竞天择 | 判断玩家水平 → 决定怪池 → 避免连续同怪池 | ★★★★★★ |
阅读前需要知道的事
- 六个功能按「由浅入深」排列,不是按在难度里的重要性排的。 顺序是 ① 硝石经济 → ② 勘探者无人机 → ③ 锁血 → ④ 阶段评级与三种啤酒 → ⑤ 生态重置 → ⑥ 物竞天择(难度见上面的功能索引表)。前四个是单个原语的用法,后两个是把很多原语拼成一套系统。
- ② 和 ③ 共用同一个开关(Vars.医疗无人机):② 用它开回血与减伤,③ 用它锁血。不是两个无人机,是一个变量的两组下游——这本身就是一个要学的点(见 ③ 的第 4 步)。
- 两套互不干扰的评价系统:⑥ 选怪池用的是三条布尔判定(有效 KPM / 死亡率 / 资源采集量);④ 的阶段评级用的是 Sequence 阶梯 + 锁存。两者分开,别混。
- 编号即池名(⑥ 用):怪池用 0~4 五个编号表示,映射关系由 Messages 里的播报数组给出,可交叉验证:0=[乘胜追击]、1=[养虎为患]、2=[鱼龙混杂]、3=[以战养战]、4=※[最后通牒]※。
功能 ① · 硝石经济改造
它做了什么
地图本来会长硝石,作者把产出关掉,改成自己记一本账:每击杀一种「固定单位」就往账上记点数,而点数还乘着一个会自己往上涨的倍率——杀得越密,硝石攒得越快。账上每满 60 点就送一次免费补给,最多 6 次,每叫一次补给再扣掉一次。「免费」不是打折,是把补给要花的硝石直接乘 0。
| 读取 | 固定单位击杀事件 / 地图时间 / 补给调用次数 / 存入资源 |
| 判断 | 硝石存量每跨过 60 的整数倍 → 免费补给次数 +1 |
| 输出 | Resupply.Cost 指向变量 → 还有免费次数时整个成本为 0 |
想深入了解:模块硝石倍率 NitraMultiplier模块补给 ResupplyMutator累加 AccumulateMutator变量 Delta
精简骨架
- ① 断源
- NitraMultiplier、{"Var":"补给硝石量"}
- 地图硝石归零,补给成本换成变量引用
- ② 记账
- Accumulate、Delta、EnemiesKilled、Multiply
- 单位点数 × 增益,逐帧累加成硝石存量
- ③ 加倍率
- Accumulate、ByTime、固定怪池
- 击杀 +0.01 / 每秒 +0.000417,1~5 封顶
- ④ 计数
- Sequence、Floor、TriggerOnChange(RiseOnly)、TriggerDelay
- 每满 60 硝石 +1 次,调用补给 -1 次
- ⑤ 结算
- Multiply、IfFloat、ByMissionType
- 还有免费次数时成本乘 0
- ⑥ 播报
- SelectFromArray、Join
- 面板显示 0/6 … 6/6
实现拆解
① 关掉地图硝石,把补给成本换成变量引用
这一步在算什么:先把两个入口铺好:地图硝石产出关掉,补给成本改成读变量。
① · 详解:公式与推演
NitraMultiplier: 0 只解决了「没有硝石」,没解决「硝石从哪来」,所以必须另建账本。补给这一侧的关键在于 Resupply 里只有一个 Cost 字段,而且它的值不是数字,是 {"Var":"补给硝石量"}。把成本换成变量引用之后,任何读取补给成本的地方都自动跟着变量走,不必在 Resupply 里写条件分支——一处改、处处生效。
① · 关掉地图硝石 + 补给成本指向变 · 7 行 · 点击展开
// ===== 顶级键 NitraMultiplier:地图硝石产出被直接关闭 =====
0
// ===== 顶级键 Resupply:补给成本只有一个 Cost 字段,且指向变量 =====
{
"Cost": {"Var":"补给硝石量"}
}② 硝石存量:Accumulate + Delta 的记账法
这一步在算什么:造一个只往上加的账本——把「累计击杀数」转成「这一帧新增的击杀数」。
| 来源单位 | 每只点数 |
|---|---|
| ED_ShootingPlant / _Spawn / _Acid、ED_BarrageInfector / _lobber | 5 |
| ED_Nitra-Goldbug | 8 |
| ED_HydraWeed、ED_Spring_HydraWeed | 15 |
| 五种勘探者(功能 ② 的那五个 ED) | 20 |
| ED_Glyphid_Nitra_ExploderKing | 30 |
② · 详解:公式与推演
Delta 把「累计击杀数」换成「这一帧新增的击杀数」,于是每次击杀只入库一次点数。这就是事件累加器的标准写法,后面所有「击杀计数」都在复用它。五个来源各自用 Multiply(点数, Delta(EnemiesKilled)) 加权后 Add 到一起,外层 Accumulate 配 Initial:0、Min:0,账本不允许出现负数。
顺带一个容易看错的点:Vars.硝石采集量 累加的也是 Delta(硝石存量),而不是 DepositedResource("Nitra")——变量名和实际含义并不一致,阶段评级(功能 ④)用的是它。
② · 硝石存量:Accumulate · 88 行 · 点击展开
// ===== Vars.硝石存量(Float):五种来源点数 × 硝石获取增益,Accumulate 累加 =====
{
"Type":"Float",
"Value":{
"Mutate":"Accumulate",
"Initial": 0,
"Value":{
"Mutate":"Add",
"A":{
"Mutate":"Multiply",
"A": {
"Mutate":"Multiply",
"A": 5,
"B": {"Var":"硝石获取增益"}
},
"B":{
"Mutate":"Delta",
"Value":{
"Mutate":"EnemiesKilled",
"EDs":[
"ED_ShootingPlant",
"ED_ShootingPlant_Spawn",
"ED_ShootingPlant_Acid",
"ED_BarrageInfector",
"ED_Barrageinfector_lobber"
]
}
}
},
"B":{
"Mutate":"Multiply",
"A": 8,
"B":{
"Mutate":"Delta",
"Value":{
"Mutate":"EnemiesKilled",
"EDs":[
"ED_Nitra-Goldbug"
]
}
}
},
"C":{
"Mutate":"Multiply",
"A": 15,
"B":{
"Mutate":"Delta",
"Value":{
"Mutate":"EnemiesKilled",
"EDs":[
"ED_HydraWeed",
"ED_Spring_HydraWeed"
]
}
}
},
"D":{
"Mutate":"Multiply",
"A": 20,
"B":{
"Mutate":"Delta",
"Value":{
"Mutate":"EnemiesKilled",
"EDs":[
"ED_Prospector",
"ED_InhibitProspector",
"ED_WaveEnhanceProspector",
"ED_MedicSupplyProspector",
"ED_ProjectileSlowerProspector"
]
}
}
},
"E":{
"Mutate":"Multiply",
"A": 30,
"B":{
"Mutate":"Delta",
"Value":{
"Mutate":"EnemiesKilled",
"ED":"ED_Glyphid_Nitra_ExploderKing"
}
}
}
},
"Min": 0
}
}③ 硝石获取增益:击杀与时间双驱动
这一步在算什么:账本的点数还要乘一个自己会涨的倍率:击杀越密,涨得越快。
③ · 详解:公式与推演
A 项是 0.01 × Delta(EnemiesKilled, EDs:{"Var":"固定怪池"}),B 项是 0.000417 × Delta(ByTime)。固定怪池 是一份 ByMissionType 的三套 ED 名单(Default / Escort / Salvage),所以「哪类单位算固定单位」可以按任务类型分别改。Initial:1 保证没有加成时倍率是 1 而不是 0,Max:5 封顶,避免长局收益失控。
③ · 硝石获取增益 + 固定怪池名单 · 82 行 · 点击展开
// ===== Vars.硝石获取增益(Float):击杀 +0.01 / 每秒 +0.000417,Initial 1、Max 5 =====
{
"Type":"Float",
"Value":{
"Mutate":"Accumulate",
"Value": {
"Mutate":"Add",
"A":{
"Mutate":"Multiply",
"A": 0.01,
"B":{
"Mutate":"Delta",
"Value":{
"Mutate":"EnemiesKilled",
"EDs":{"Var":"固定怪池"}
}
}
},
"B":{
"Mutate":"Multiply",
"A": 0.000417,
"B":{
"Mutate":"Delta",
"Value":{
"Mutate":"ByTime"
}
}
}
},
"Initial": 1,
"Max": 5
}
}
// ===== Vars.固定怪池(Strings,相关):被 硝石获取增益 用作 EnemiesKilled 的 EDs 名单 =====
{
"Type": "Strings",
"Value": {
"Mutate": "ByMissionType",
"Default": [
"ED_ShootingPlant",
"ED_ShootingPlant_Spawn",
"ED_ShootingPlant_Acid",
"ED_BarrageInfector",
"ED_Barrageinfector_lobber",
"ED_CaveLeech",
"ED_TentaclePlant",
"ED_SpiderSpawner",
"ED_JellyBreeder",
"ED_JellyBreeder_RockpoxPlague",
"ED_FacilityTurret_Burst_SN",
"ED_Prospector"
],
"Escort":[
"ED_ShootingPlant",
"ED_ShootingPlant_Acid",
"ED_ShootingPlant_Spawn",
"ED_BarrageInfector",
"ED_Barrageinfector_lobber",
"ED_CaveLeech",
"ED_SpiderSpawner",
"ED_JellyBreeder",
"ED_JellyBreeder_RockpoxPlague",
"ED_FacilityTurret_Burst_SN",
"ED_Prospector"
],
"Salvage": [
"ED_ShootingPlant",
"ED_ShootingPlant_Acid",
"ED_ShootingPlant_Spawn",
"ED_BarrageInfector",
"ED_Barrageinfector_lobber",
"ED_CaveLeech",
"ED_SpiderSpawner",
"ED_JellyBreeder",
"ED_JellyBreeder_RockpoxPlague",
"ED_FacilityTurret_Burst_SN",
"ED_Prospector",
"ED_HydraWeed"
]
}
}④ 免费补给次数:Sequence 既是计数器也是上限
这一步在算什么:每满 60 点换一次免费补给,最多 6 次;每叫一次补给扣掉一次。
| 分支 | 条件 |
|---|---|
| A | 开局 15–18 秒窗口(TriggerOnce 包住,只给一次) |
| B | SecondaryFinished 次要任务完成 |
| C | 每存入 120 单位金或压缩金(Floor(Divide(…, 120))) |
| D | 生态重置激活 |
| E | 玩家阶段表现锁定 == 6(每个阶段周期只放行一次) |
| F | 每满 60 硝石:TriggerOnChange(RiseOnly, Floor(硝石存量 / 60)) |
| G | 推车任务开局 12 秒 |
④ · 详解:公式与推演
Sequence 定义状态集合,Next 加分、Previous 减分、Repeat:false 封顶;变量自己不记录「为什么加减」,两个方向都由外部事件驱动。Next 一共 A–G 七个加分口,硝石只是其中一条:
F 分支用的是 Floor 上升沿,不是取模加去重标记:存量 0→59 时 Floor 恒为 0 不触发,跨过 60 的那一瞬间变成 1 触发一次,120 时变成 2 再触发一次。一个 Floor 就替代了「余数判断 + 去重锁存」。
Previous 里的 TriggerDelay N:0.5 是必须的:Resupply.Cost 在调用补给那一刻被读取,如果先扣次数,最后一次免费补给会被算成收费。延迟 0.5 秒再扣,读成本时次数还没掉。
④ · 免费补给次数:Next 七个加分 · 104 行 · 点击展开
// ===== Vars.免费补给次数(Float):Sequence 0..6;Next 有 A–G 七个加分口,F 分支才是「每满 60 硝石 +1」 =====
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1,2,3,4,5,6],
"Next":{
"Mutate":"Or",
"A":{
"Mutate":"TriggerOnce",
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"DuringMission",
"StartingAt": 15,
"StoppingAfter": 18
}
}
},
"B":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{"Mutate":"SecondaryFinished"}
},
"C":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"Floor",
"Value":{
"Mutate":"Divide",
"A":{
"Mutate":"Add",
"A": {
"Mutate": "DepositedResource",
"Resource": "Gold"
},
"B": {
"Mutate": "DepositedResource",
"Resource": "Compressed Gold"
}
},
"B": 120
}
}
},
"D":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{"Var":"生态重置激活"}
},
"E":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"玩家阶段表现锁定"},
"==": 6,
"Then": true,
"Else": false
}
}
},
"F":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"Floor",
"Value":{
"Mutate":"Divide",
"A":{"Var":"硝石存量"},
"B": 60
}
}
},
"G":{
"Mutate":"ByMissionType",
"Default": false,
"Salvage":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"DuringMission",
"StartingAt": 12
}
}
}
},
"Previous":{
"Mutate":"TriggerDelay",
"N": 0.5,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{"Mutate":"ResuppliesCalled"}
}
},
"Repeat": false
}
}⑤ 补给硝石量:免费是乘 0,不是减免
这一步在算什么:「免费」的实现是把成本乘 0,而不是去改成本数字。
⑤ · 详解:公式与推演
补给硝石量 等于基础量乘以 IfFloat(免费补给次数 > 0, Then:0, Else:1)。它不是「免费时降价」,而是把成本整体乘 0。基础量本身按任务类型走:Default:60,推车任务再按 ByEscortPhase 分档 60 / 50 / 40 / 35 / 30 / 30。用乘 0 掩码而不是在 Resupply 里写分支,好处是补给成本始终只有一个变量引用,任何读它的地方都自动生效。
⑤ · 补给硝石量:用乘法当免费开关 · 27 行 · 点击展开
// ===== Vars.补给硝石量(Float):基础量 × IfFloat(免费补给次数>0, 0, 1) —— 用乘法当免费开关 =====
{
"Type":"Float",
"Value":{
"Mutate": "Multiply",
"A": {
"Mutate":"ByMissionType",
"Default": 60,
"Escort":{
"Mutate":"ByEscortPhase",
"Default": 60,
"FinalEventA": 50,
"FinalEventB": 40,
"FinalEventC": 35,
"FinalEventD": 30,
"Finished": 30
}
},
"B":{
"Mutate":"IfFloat",
"Value":{"Var":"免费补给次数"},
">": 0,
"Then": 0,
"Else": 1
}
}
}⑥ 面板播报:数组长度必须与 Sequence 同步
这一步在算什么:把计数器播成 0/6 … 6/6——数组长度必须和 Sequence 同步。
⑥ · 详解:公式与推演
Messages[1] 把 免费补给次数 交给 SelectFromArray,数组就是 ["0/6","1/6",…,"6/6"]。播报用的是文本,Sequence 用的是数字,两者之间没有任何强制绑定——改上限时 Sequence 长度和这个数组长度是必须同步改的两处。同一条消息里还播报了 满血复活次数(0/3)与 生态重置次数(0/1),索引同样的同步规则。
⑥ · 面板播报:免费补给 0/6 … · 30 行 · 点击展开
// ===== Messages[1](相关):免费补给次数在面板上的播报 =====
{
"Message": {
"Mutate":"Join",
"Values":[
"● 免费补给:",
{
"Mutate":"SelectFromArray",
"Select": {"Var": "免费补给次数"},
"Array": ["0/6","1/6","2/6", "3/6","4/6","5/6","6/6"]
},
" | 满血救援",
{
"Mutate":"SelectFromArray",
"Select": {"Var": "满血复活次数"},
"Array": ["0/3","1/3","2/3","3/3"]
},
" | 生态重置",
{
"Mutate":"SelectFromArray",
"Select":{"Var":"生态重置次数"},
"Array":["0/1","1/1"]
},
"●"
]
},
"Type": "Delux",
"Sender": "【资源面板】:",
"SendOnChange": true
}功能 ② · 勘探者无人机
它做了什么
地图上会随机刷出五种「勘探者」,打死哪一只就触发哪一条增益,各持续 20~30 秒。最方便的一只直接关掉「恒压潮」这个刷怪闸门;另外两只改的是全局倍率(敌方伤害 ×0.8、敌方弹速 ×0.5)。它教的是一件事:一次性事件要先用 TriggerFixedDuration 拉成一个「窗口」,下游才能持续读到它。
| 读取 | 击杀事件 EnemiesKilled / 某单位最近是否出现过 |
| 判断 | TriggerOnChange 取上升沿 → 用 TriggerFixedDuration 开 20~30 秒窗口 |
| 输出 | 一个 Boolean 开关 → 闸门变量 / 条件乘子 |
想深入了解:敌人生成器 SpawnerMutator变化触发 TriggerOnChangeMutator固定持续时间 TriggerFixedDuration
精简骨架
- ① 抽签
- RandomChoice、Weights、EnemiesRecentlySpawned
- 从 6 个候选里随机抽一个老练单位
- ② 边沿
- EnemiesKilled、TriggerOnChange(RiseOnly)
- 击杀瞬间转成一个 true
- ③ 开窗
- TriggerFixedDuration、TriggerSustain
- 把瞬间延长到 20 / 30 秒
- ④ 效果
- Not+Or、If、Multiply、{"Var":…}
- 停恒压潮 / 全队回血 / 减伤 / 弹速减半
- ⑤ 单位
- Base:"ED_Prospector"、Materials
- 五个勘探者靠 Base 继承,只覆盖外观与抗性
实现拆解
① 这五个勘探者从哪来
这一步在算什么:这五个勘探者不是手刷的,是一张权重表抽出来的。
① · 详解:公式与推演
ED_StationaryMatrix 的 CustomVeterans 用 RandomChoice 配 Weights:第一个权重是 IfFloat(EnemiesRecentlySpawned(ED_PlantBreeder, Seconds:30) > 0, 0, 999)——最近 30 秒出现过就置 0,等于给 PlantBreeder 一个 30 秒的排他冷却;后五个 0.2 等权。MaxSpawnCount:2、MinSpawnCount:0 决定了它一局能出几只。
这里要更正一处常见说法:是 5 个勘探者,不是 4 个。Vars.特殊单位ID 里是五项(ED_Prospector、ED_MedicSupplyProspector、ED_ProjectileSlowerProspector、ED_InhibitProspector、ED_WaveEnhanceProspector),其中 ED_Prospector 是基类,其余四个都以 Base:"ED_Prospector" 继承它,只覆盖 DisplayName、Resistances 与 Materials。
① · 刷出源头:ED_Stationa · 48 行 · 点击展开
// ===== Enemies.ED_StationaryMatrix(相关):固定单位 + 五种勘探者在这里随机刷出 =====
{
"Base":"ED_Spider_Drone",
"CustomVeterans":{
"Mutate":"RandomChoice",
"Choices":[
"ED_PlantBreeder",
"ED_Prospector",
"ED_MedicSupplyProspector",
"ED_InhibitProspector",
"ED_WaveEnhanceProspector",
"ED_ProjectileSlowerProspector"
],
"Weights":[
{
"Mutate":"IfFloat",
"Value":{
"Mutate":"EnemiesRecentlySpawned",
"ED":"ED_PlantBreeder",
"Seconds": 30
},
">": 0,
"Then": 0,
"Else": 999
},
0.2,
0.2,
0.2,
0.2,
0.2
]
},
"MaxSpawnCount": 2,
"MinSpawnCount": 0,
"DifficultyRating": 100
}
// ===== Vars.特殊单位ID(Strings):五个勘探者的 ED 名单 =====
{
"Type":"Strings",
"Value":[
"ED_ProjectileSlowerProspector",
"ED_InhibitProspector",
"ED_Prospector",
"ED_MedicSupplyProspector",
"ED_WaveEnhanceProspector"
]
}② 击杀边沿 → 30 秒窗口
这一步在算什么:一次性的击杀事件,先拉成一个 30 秒的持续窗口。
② · 详解:公式与推演
EnemiesKilled 读的是累计击杀数,TriggerOnChange(RiseOnly) 取它的上升沿,等于「刚刚发生了一次击杀」。TriggerFixedDuration(N:30, In:边沿) 把这一瞬间拉长成 30 秒的窗口。医疗无人机 就是最干净的例子:一个 Boolean 变量就是一个 30 秒的 true,下游各自去读它。
三种 Trigger 的分工要分清:TriggerOnChange(RiseOnly) 是边沿,只在击杀瞬间为真;TriggerFixedDuration(N) 是定时窗,事件后维持 N 秒;TriggerSustain(N) 的精确语义在这份文件里没有定义(未能确认),从用法看它包的也都是击杀边沿(30 秒 / 10 秒),行为与 TriggerFixedDuration 接近。
Boolean 变量在这里当「效果总线」用:加新效果不需要动 医疗无人机,只要在下游再接一处 If(医疗无人机, …, 1) 即可。
② · 击杀边沿 → 30 秒窗口:医疗 · 16 行 · 点击展开
// ===== Vars.医疗无人机(Boolean):击杀 ED_MedicSupplyProspector → true 30 秒 =====
{
"Type":"Boolean",
"Value":{
"Mutate":"TriggerFixedDuration",
"N": 30,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"EnemiesKilled",
"ED":"ED_MedicSupplyProspector"
}
}
}
}③ 效果一:用闸门变量停掉恒压潮
这一步在算什么:窗口被一个「总闸门」读取:闸门是并联条件取反,默认开、被事件关。
③ · 详解:公式与推演
火把-Torch 是 Not(Or(A..H)) 结构。A 是生态重置的 60 秒窗口,B 是抑制无人机,C–H 是各种任务形态(钻电梯、防守、撤离、常规潮、PE 倒计时、恐惧)。B 分支 TriggerSustain(N:30, In:TriggerOnChange(RiseOnly, EnemiesKilled:ED_InhibitProspector)) 为真时整条 Or 为真,Not 之后 火把-Torch 取 false,引用它的 WaveSpawners[5]、[8] 的 Enabled.A 直接断开。
这就是闸门型变量的标准写法:默认开,被事件关。要加第九个停潮条件,只需在 Or 里加一个键,不必碰任何 WaveSpawners。
③ · 效果一:火把-Torch 闸门 · 43 行 · 点击展开
// ===== Vars.火把-Torch(Boolean):整个变量都在这(1,150 字符)。真正涉及抑制无人机的是 B 分支;A 分支是生态重置,C–H 是任务形态 =====
{
"Type":"Boolean",
"Value":{
"Mutate":"Not",
"Value":{
"Mutate":"Or",
"A":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerFixedDuration",
"N": 60,
"In":{"Var":"生态重置激活"}
},
"Then": true,
"Else": false
},
"B":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerSustain",
"N": 30,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly":true,
"In":{
"Mutate":"EnemiesKilled",
"ED":"ED_InhibitProspector"
}
}
},
"Then": true,
"Else": false
},
"C":{"Mutate":"DuringDrillevator"},
"D":{"Mutate":"DuringDefend"},
"E":{"Mutate":"DuringExtraction"},
"F":{"Mutate":"DuringGenericSwarm"},
"G":{"Mutate":"DuringPECountdown"},
"H":{"Mutate":"DuringDread"}
}
}
}④ 效果二、三:条件乘子
这一步在算什么:另外两只勘探者改的是全局乘子:敌伤 ×0.8、弹速 ×0.5。
④ · 详解:公式与推演
敌人伤害 是一条 Multiply 链,共 10 个乘子 A–J。与勘探者相关的是两个:D 是恒压·增幅器,TriggerFixedDuration(N:20, In:击杀边沿) → Then:0.8,20 秒内敌方伤害 ×0.8;E 是 Condition:{"Var":"医疗无人机"} → Then:0.5。注意这两个乘子里,E 与功能 ③ 共用同一个开关。
敌人发射物速度 是一条 7 个乘子的链,F 是弹速·抑制器,TriggerSustain(N:30, …) → Then:0.5。同样都是「击杀 → 增益」,D 用 20 秒的 TriggerFixedDuration,F 用 30 秒的 TriggerSustain,两个窗口原语在一节里都用上了。
④ · 效果二、三:敌人伤害 D / E · 45 行 · 点击展开
// ===== Vars/敌人发射物速度/Value/F(逐字切片,仅此分支) =====
{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerSustain",
"N": 30,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"EnemiesKilled",
"ED":"ED_ProjectileSlowerProspector"
}
}
},
"Then": 0.5,
"Else": 1
}
// ===== Vars/敌人伤害/Value/D(逐字切片)—— 恒压·增幅器击杀后 20s,敌方伤害 ×0.8 =====
{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerFixedDuration",
"N": 20,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"EnemiesKilled",
"ED":"ED_WaveEnhanceProspector"
}
}
},
"Then": 0.8,
"Else": 1
}
// ===== Vars/敌人伤害/Value/E(逐字切片)—— 医疗无人机为真时 ×0.5 =====
{
"Mutate":"If",
"Condition":{"Var":"医疗无人机"},
"Then": 0.5,
"Else": 1
}⑤ Else 必须显式写 1,颜色只是 Materials
这一步在算什么:条件乘子必须写 Else,漏了整条链归零;颜色只是外观,逻辑只认 ED id。
⑤ · 详解:公式与推演
链上所有条件乘子都是 "Then": 0.5, "Else": 1 这种成对写法。Else 一旦漏掉,整条 Multiply 链会归零——「增益没生效」就变成「敌人完全没伤害」,这是这种写法唯一的、也是致命的坑。
颜色不是逻辑输入。逻辑只认 ED id,Materials 只影响外观。可以确证的只有两项:绿是医疗补给勘探者(M_Vanity_Headwear_Bavarian_Green + M_Uplink_Light_Green_Blink),红是恒压·增幅器(M_SpaceRig_MetalRed01_WS + M_SpaceRig_LightMachinery_RedBlink01)。ED_ProjectileSlowerProspector 与 ED_InhibitProspector 的 Materials 数组逐字相同(都是 M_Crystal_BlueGlow02 加三个 M_GlowPoint_DD_Red),基类 ED_Prospector 既没有 Materials 也没有 DisplayName,所以「白」指谁、两个蓝色单位如何区分,文件里没有依据(未能确认)。另外这些 id 有拼写错误(Prospector),引用时必须照抄。
⑤ · 五个勘探者的单位定义 · 124 行 · 点击展开
// ===== Enemies/ED_Prospector(基类,被其余四者 Base 引用) =====
{
"CanBeUsedForConstantPressure": false,
"CanBeUsedInEncounters": false,
"DifficultyRating": 100,
"MaxSpawnCount": 1,
"MinSpawnCount": 0,
"Resistances":{
"DamageMultiplier": 25
},
"Movement":{
"MaxPawnSpeed": 0.01
},
"Direct": {
"Float:AlarmDuration": 5,
"Float:ReinforcementDelay": 0,
"Float:ReinforcementCooldown": 15,
"Float:CooldownDuration": 15
},
"DropResource":{
"Resource": "RedSugar",
"Amount": 50
}
}
// ===== Enemies/ED_MedicSupplyProspector(绿:医疗,DisplayName 写作「锁血时间」) =====
{
"DisplayName":"锁血时间",
"IsBossFight": true,
"Base":"ED_Prospector",
"Resistances":{
"DamageMultiplier": 35
},
"Movement":{
"MaxPawnSpeed": 0.01
},
"Direct":{
"Float:AlarmDuration": 5,
"Float:ReinforcementDelay": 0,
"Float:ReinforcementCooldown": 15,
"Float:CooldownDuration": 15
},
"Materials":[
"M_Vanity_Headwear_Bavarian_Green",
"M_Uplink_Light_Green_Blink"
]
}
// ===== Enemies/ED_ProjectileSlowerProspector(蓝:弹速抑制) =====
{
"DisplayName":"弹速·抑制器",
"IsBossFight": true,
"Base":"ED_Prospector",
"Resistances":{
"DamageMultiplier": 35
},
"Movement":{
"MaxPawnSpeed": 0.01
},
"Direct":{
"Float:AlarmDuration": 5,
"Float:ReinforcementDelay": 0,
"Float:ReinforcementCooldown": 15,
"Float:CooldownDuration": 15
},
"Materials":[
"M_Crystal_BlueGlow02",
"M_SpaceRig_DarkGlass01_WS",
"M_Facility_Light_Lines",
"M_GlowPoint_DD_Red",
"M_GlowPoint_DD_Red",
"M_GlowPoint_DD_Red"
]
}
// ===== Enemies/ED_InhibitProspector(恒压抑制;Materials 与弹速抑制器逐字相同) =====
{
"DisplayName":"恒压·抑制器",
"IsBossFight": true,
"Base":"ED_Prospector",
"Resistances":{
"DamageMultiplier": 35
},
"Movement":{
"MaxPawnSpeed": 0.01
},
"Direct":{
"Float:AlarmDuration": 5,
"Float:ReinforcementDelay": 0,
"Float:ReinforcementCooldown": 15,
"Float:CooldownDuration": 15
},
"Materials":[
"M_Crystal_BlueGlow02",
"M_SpaceRig_DarkGlass01_WS",
"M_Facility_Light_Lines",
"M_GlowPoint_DD_Red",
"M_GlowPoint_DD_Red",
"M_GlowPoint_DD_Red"
]
}
// ===== Enemies/ED_WaveEnhanceProspector(红:恒压增幅) =====
{
"DisplayName":"恒压·增幅器",
"IsBossFight": true,
"Base":"ED_Prospector",
"Resistances":{
"DamageMultiplier": 35
},
"Movement":{
"MaxPawnSpeed": 0.01
},
"Direct":{
"Float:AlarmDuration": 5,
"Float:ReinforcementDelay": 0,
"Float:ReinforcementCooldown": 15,
"Float:CooldownDuration": 15
},
"Materials":[
"M_SpaceRig_MetalRed01_WS",
"M_SpaceRig_LightMachinery_RedBlink01"
]
}功能 ③ · 锁血
它做了什么
打死医疗补给勘探者后 30 秒内,全队血量不会再掉到 70% 以下,而且回血更快、受伤后立刻回、敌人打你只算一半。实现只用一个公式:Max(0.7, LockFloat(Lock = 医疗无人机, Value = DwarvesHealth))。关键在 LockFloat 会「采样一次然后保持住」,锁的正是开门那一瞬间的血量。
| 读取 | 全队血量比例 DwarvesHealth,开门瞬间采样一次 |
| 判断 | Max 取「锁到的血量」与 70% 里更高的那个 |
| 输出 | 接管全局回血上限 HealthRegenerationMax,再改写三处参数 |
想深入了解:Mutator锁定浮点数、锁定布尔值、锁定字符串Mutator最大值 MaxMutator团队生命值比例 DwarvesHealth模块矮人属性 Dwarves
精简骨架
- ① 触发
- EnemiesKilled、TriggerOnChange(RiseOnly)、TriggerFixedDuration
- 击杀医疗补给勘探者 → 30 秒 true
- ② 采样
- LockFloat(Lock)、DwarvesHealth
- 门开时锁存一次全队血量比例
- ③ 下限
- Max
- 与 0.7 取大,合并成一次运算
- ④ 接管
- If、{"Var":"锁血"}、DifficultySetting.HealthRegenerationMax
- 用锁存值替换全局回血上限
- ⑤ 加码
- Multiply、{"Var":"医疗无人机"}
- 速率 ×100、延迟 ×0、敌伤 ×0.5
实现拆解
① 核心公式
这一步在算什么:整节就一个公式:Max(0.7, LockFloat(Lock = 医疗无人机, Value = DwarvesHealth))。
① · 详解:公式与推演
① · 核心公式与开关:锁血 + 医疗无 · 34 行 · 点击展开
// ===== Vars.锁血(Float):核心公式 —— Max(0.7, LockFloat(Lock=医疗无人机, Value=DwarvesHealth)) =====
{
"Type":"Float",
"Value":{
"Mutate":"Max",
"Values":[
0.7,
{
"Mutate":"LockFloat",
"Lock":{"Var":"医疗无人机"},
"Value":{
"Mutate":"DwarvesHealth"
}
}
]
}
}
// ===== Vars.医疗无人机(Boolean):同一个开关,功能二/功能三共用 =====
{
"Type":"Boolean",
"Value":{
"Mutate":"TriggerFixedDuration",
"N": 30,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"EnemiesKilled",
"ED":"ED_MedicSupplyProspector"
}
}
}
}② LockFloat 当采样保持器
这一步在算什么:LockFloat 的两种接法,以及它为什么能当「采样保持器」。
② · 详解:公式与推演
LockFloat 以顶层原语出现在全文 15 个变量里,只有两种接法。接 Lock(布尔门控采样,只在门开的那段取值)的有 3 处:锁血、生态重置怪池选择、敌人倍数;接 Update(周期刷新,每次刷新取一次样)的有 12 处:60s内硝石采集量、1分钟内倒人数量、每分钟击杀量、玩家阶段表现锁定、本阶段生成量、本阶段击杀数、本阶段补给调用次数、本阶段死亡率、本阶段资源采集量、偶数阶段锁存、奇数阶段锁存、上期实际怪池。
两种接法的共同点是「不刷新就保持」,用来对抗局内数值抖动。同一个原语还能顺手做滑动窗口:60s内硝石采集量 = Subtract(硝石采集量, LockFloat(硝石采集量, Update:TriggerTimer 60))——当前累计减去 60 秒前的采样,得到的就是最近 60 秒的增量。功能 ④ 的 玩家阶段表现锁定 正是 Update 接法的例子。
③ 从「回血上限」到「血量下限」
这一步在算什么:游戏里没有「血量下限」参数,所以只能临时抬高「回血天花板」。
③ · 详解:公式与推演
游戏里没有「血量下限」这个参数。锁血的做法是把 HealthRegenerationMax 临时改成 Max(0.7, 当前血量):回血只能回到上限以内,所以上限不低于 0.7 就等于血量不会掉到 0.7 以下;血量原本高于 0.7 时,上限被抬到锁定瞬间的血量,于是血量被钉在当前水平。理解这一点,功能 ④ 里 Then:4、Then:25 那套倍率才有意义——它们改的是回血强度,而锁血改的是回血天花板。
③ · 接入全局参数的两个引用点 · 5 行 · 点击展开
// ===== DifficultySetting.HealthRegenerationMax:锁血接入全局回血上限的唯一入口 =====
{"Var":"残血后最大回血比例"}
// ===== Dwarves.RegenHealthPerSecond:回血速率接入点(同样只是一个变量引用) =====
{"Var":"每秒恢复生命值"}③ · 回血上限总表:残血后最大回血比例 · 56 行 · 点击展开
// ===== Vars.残血后最大回血比例(Float):Condition/Then 两个字段就是锁血路由;Else 里混着功能四的杀手黑啤与红岩爆破手 =====
{
"Type":"Float",
"Value":{
"Mutate":"If",
"Condition":{"Var":"医疗无人机"},
"Then":{"Var":"锁血"},
"Else":{
"Mutate": "Multiply",
"A": 0.25,
"B": {
"Mutate": "If",
"Condition": {
"Mutate":"Or",
"A":{"Var":"治愈核心事件"},
"B":{
"Mutate":"TriggerFixedDuration",
"N": 20,
"In":{"Var":"红岩爆破手·技能激活"}
},
"C":{
"Mutate":"IfFloat",
"Value":{"Var":"杀手黑啤·回血次数"},
">": 0,
"Then":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerFixedDuration",
"N": 5,
"In":{"Var":"杀手黑啤·效果触发"}
},
"Then": true,
"Else": false
},
"Else": false
}
},
"Then": 4,
"Else": 1
},
"C":{
"Mutate":"SelectFromArray",
"Select":{"Var":"搜救任务·敌人压制等级"},
"Array":[1,1.5,2,3,4]
},
"D":{
"Mutate":"Select",
"Select":{"Var":"Boss击杀等级"},
"Default": 1,
"Lv.Ⅰ": 4,
"Lv.Ⅱ": 4,
"Lv.Ⅲ": 4
}
}
}
}④ 同一个开关的另外三处下游
这一步在算什么:同一个开关要接四处下游,才凑齐锁血 + 回血 + 免延迟 + 减伤。
| 下游变量 | 分支内容 | 效果 |
|---|---|---|
| 每秒恢复生命值 | D:If(医疗无人机, 100, 1) | 回血速率 ×100,上限被迅速拉满 |
| 受伤恢复延迟 | D:If(医疗无人机, …, 0) 的延迟项 | 受伤后不再等待,立即开始回血 |
| 敌人伤害 | E:If(医疗无人机, 0.5, 1) | 敌方伤害 ×0.5 |
④ · 详解:公式与推演
同一个布尔要接 4 个下游才凑齐「锁血 + 回血 + 免延迟 + 减伤」。这说明 CD2 里没有「给玩家加一个 buff」这种原语,一个增益必须逐个改写系统参数;也顺带解释了为什么 残血后最大回血比例、每秒恢复生命值、受伤恢复延迟 三个变量的结构几乎完全一样。
开关与效果也因此彻底解耦:想把 30 秒改成 45 秒,只改 医疗无人机 的 N 就行,不必碰 锁血;锁血 只在 Lock 的上升沿采样一次。
④ · 另外三处下游:回血速率 / 受伤 · 18 行 · 点击展开
// ===== Vars/每秒恢复生命值/Value/D(逐字切片)—— 医疗无人机 → ×100 =====
{
"Mutate":"If",
"Condition":{"Var":"医疗无人机"},
"Then": 100,
"Else": 1
}
// ===== Vars/受伤恢复延迟/Value/B/Condition/D(逐字切片)—— 医疗无人机 → 延迟项被乘 0 =====
{"Var":"医疗无人机"}
// ===== Vars/敌人伤害/Value/E(逐字切片,与功能二同一处)—— 医疗无人机 → 敌方伤害 ×0.5 =====
{
"Mutate":"If",
"Condition":{"Var":"医疗无人机"},
"Then": 0.5,
"Else": 1
}功能 ④ · 阶段评级 → 三种啤酒
它做了什么
每过一个阶段,mod 按你这一阶段的表现给一个 0~6 的评级,换算成酒名播报出来,并解锁对应的「啤酒」奖励:评级 4 给 5 秒回血,评级 5 给 20 秒回血 + 减伤,评级 6 给 20 秒无敌 + 清图。评级每阶段只采样一次,中途不许跳档。
| 读取 | 每分钟击杀 / 硝石采集效率 / 1 分钟内倒人数 / 团队状态评估 |
| 判断 | Sequence 加减分 → 0~6 档 → LockFloat 每阶段锁一次 |
| 输出 | 三套啤酒技能,各自用 Sequence 存次数、TriggerTimer 攒次数 |
想深入了解:Mutator序列 SequenceMutator秒表 StopWatchMutator定时触发 TriggerTimer
精简骨架
- ① 评级
- Sequence、InitialOffset、Reset、TriggerDelay
- 每阶段按表现加减分,0–6 档
- ② 防抖
- LockFloat(Update)
- 每阶段只采样一次评级
- ③ 播报
- SelectFromArray、TriggerDelay
- 评级数字映射成酒名
- ④ 杀手黑啤
- TriggerFixedDuration、TriggerTimer、TriggerCooldown、Floor+Divide
- 16 秒充能 → 最多 3 次 5 秒回血
- ⑤ 红岩爆破手
- TriggerOnce、And、Multiply
- 61 秒内每 15 秒 +1,最多 4 次;20 秒减伤
- ⑥ 昏迷黑啤
- 伤害抑制因子、WaveSpawners[3]、ED_Destroyer
- 0.45 阈值 → 20 秒无敌 + 清图
实现拆解
① 评级:Sequence + Reset 的周期状态机
这一步在算什么:评级是一个 0~6 的阶梯,每阶段重算一次。
① · 详解:公式与推演
Sequence [0..6] 是等级全集,Next 加分、Previous 减分、Repeat:false 封顶。InitialOffset:3 让新阶段从中间档起算,Reset = TriggerDelay(3, 轮转阶段周期Boolean) 在阶段切换信号出现 3 秒后才归零,避开换阶段瞬间的数值毛刺。加分项里最讲究的是第三条:1 分钟内倒人 ≤3 且计时器 ≥58 秒——用任务计时器把开局那一段排除掉,否则刚落地那几秒会被当成「表现优秀」。
① · 评级锁定与团队状态阈值输入 · 49 行 · 点击展开
// ===== Vars.玩家阶段表现锁定(Float):LockFloat(Update=轮转阶段周期Boolean),每阶段锁一次评级 =====
{
"Type":"Float",
"Value":{
"Mutate":"LockFloat",
"Value":{"Var":"玩家阶段表现等级评估"},
"Update":{"Var":"轮转阶段周期Boolean"}
}
}
// ===== Vars.团队状态评估(Float):Min(钢铁与倒地权重 + 血量与护盾权重 + 弹药×0.2, 倒地≥3 时 0.20) =====
{
"Type":"Float",
"Value":{
"Mutate": "Min",
"Values":[
{
"Mutate": "Add",
"A": {"Var":"钢铁与倒地权重"},
"B": {
"Mutate": "Add",
"A": {"Var":"血量与护盾权重"},
"B": {
"Mutate": "Multiply",
"A": {"Mutate": "DwarvesAmmo"},
"B": 0.2
}
}
},
{
"Mutate": "IfFloat",
"Value": {
"Mutate": "Subtract",
"A": {"Mutate": "DwarvesDown"},
"B": {
"Mutate": "Min",
"Values": [
{"Mutate": "IWsLeft"},
2
]
}
},
">=": 3,
"Then": 0.20,
"Else": 1.0
}
]
}
}② 防抖:每阶段只采样一次
这一步在算什么:加一层锁存,让评级在阶段中途不许跳档。
② · 详解:公式与推演
玩家阶段表现锁定 用 LockFloat(Update:轮转阶段周期Boolean):Update 接法只在阶段信号到来时刷新一次,阶段中途评级怎么波动都不影响锁定值。所有啤酒判断读的都是锁定值(玩家阶段表现锁定 == 4/5/6),不是瞬时评级。这是「每阶段发一次奖」能成立的前提——不锁定的话,评级会在阈值上下反复穿越,奖励就会重复发放。
③ 酒名播报
这一步在算什么:把 0~6 档播成酒名——数组下标就是评级数字。
③ · 详解:公式与推演
Messages[6] 的 Message 就是 SelectFromArray(玩家阶段表现锁定, [...]),Send = TriggerDelay(2, 轮转阶段周期Boolean),即换阶段 2 秒后播报。数组下标就是评级数字,所以改档位数必须同时改 Sequence 和这个数组。Messages[2] 是常驻面板(危机庇护 0/1、连杀回血 0/3、补给增幅 0/4),Messages[3]、[4]、[5] 分别是三套技能的倒计时。
③ · 三种啤酒的播报 · 207 行 · 点击展开
// ===== Messages[2](Delux)【啤酒增益】面板:危机庇护 0/1、杀手黑啤回血 0/3、红岩补给增幅 0/4 =====
{
"Message":{
"Mutate":"Join",
"Values":[
" ● 危机庇护次数:",
{
"Mutate":"SelectFromArray",
"Select":{"Var":"昏迷黑啤·危机庇护次数"},
"Array":["0/1","1/1"]
},
" | 连杀回血次数:",
{
"Mutate":"SelectFromArray",
"Select":{"Var":"杀手黑啤·回血次数"},
"Array":["0/3","1/3","2/3","3/3"]
},
" | 补给增幅次数:",
{
"Mutate":"SelectFromArray",
"Select":{"Var":"红岩爆破手·补给增幅次数"},
"Array":["0/4","1/4","2/4","3/4","4/4"]
},
" ●"
]
},
"Sender":"【啤酒增益】:",
"SendOnChange": true,
"Type":"Delux"
}
// ===== Messages[3](Developer)【回血增益】"剩余:5s" =====
{
"Message":"剩余:5s",
"Sender":"【回血增益】",
"Send": {
"Mutate":"IfFloat",
"Value":{"Var":"杀手黑啤·回血次数"},
">": 0,
"Then":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerDelay",
"N": 0.5,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{"Var":"杀手黑啤·效果触发"}
}
},
"Then": true,
"Else": false
},
"Else":false
},
"Type":"Developer"
}
// ===== Messages[4](Developer)【回血+减伤】红岩爆破手 20 秒倒计时 =====
{
"Message":{
"Mutate":"Join",
"Values":[
"剩余:",
{
"Mutate":"Sequence",
"Sequence":["20","15","10","5"],
"Repeat": false,
"Reset":{
"Mutate":"TriggerDelay",
"N": 30,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{"Var":"红岩爆破手·技能激活"}
}
},
"Next":{
"Mutate":"TriggerTimer",
"N": 4.5,
"Enable":{
"Mutate":"TriggerFixedDuration",
"N": 20,
"In":{"Var":"红岩爆破手·技能激活"}
}
}
},
"s"
]
},
"Sender":"【回血+减伤】",
"Send": {
"Mutate": "Or",
"A": {
"Mutate": "TriggerOnce",
"Reset": {
"Mutate":"TriggerDelay",
"N": 50,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{"Var":"红岩爆破手·技能激活"}
}
},
"In": {"Var": "红岩爆破手·技能激活"}
},
"B": {
"Mutate": "TriggerTimer",
"N": 5,
"Enable": {
"Mutate": "TriggerFixedDuration",
"N": 16,
"In": {"Var": "红岩爆破手·技能激活"}
}
}
},
"Type":"Developer"
}
// ===== Messages[5](Streamer)【无敌】昏迷黑啤 20 秒倒计时 =====
{
"Message":{
"Mutate":"Join",
"Values":[
"剩余时间:",
{
"Mutate":"Sequence",
"Sequence":["20","15","10","5"],
"Repeat": false,
"Next":{
"Mutate":"TriggerTimer",
"N": 4.5,
"Enable":{
"Mutate":"TriggerFixedDuration",
"N": 15,
"In":{"Var":"昏迷黑啤·危机庇护激活"}
}
},
"Reset":{
"Mutate":"TriggerDelay",
"N": 20,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{"Var":"昏迷黑啤·危机庇护激活"}
}
}
},
"s"
]
},
"Sender":"【无敌】",
"Send": {
"Mutate":"Or",
"A":{
"Mutate":"TriggerOnce",
"Reset":{
"Mutate":"TriggerDelay",
"N": 20,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{"Var":"昏迷黑啤·危机庇护激活"}
}
},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{"Var":"昏迷黑啤·危机庇护激活"}
}
},
"B":{
"Mutate":"TriggerTimer",
"N": 5,
"Enable":{
"Mutate":"TriggerFixedDuration",
"N": 15,
"In":{"Var":"昏迷黑啤·危机庇护激活"}
}
}
},
"Type":"Streamer"
}
// ===== Messages[6](Streamer)评级 → 酒名播报(0=叶子情人特调 … 6=昏迷黑啤) =====
{
"Message":{
"Mutate":"SelectFromArray",
"Select":{"Var":"玩家阶段表现锁定"},
"Array":[
"[叶子情人特调]",
"[亚肯黑啤]",
"[黑锁啤酒]",
"[油头精酿]",
"[杀手黑啤]",
"[红岩爆破手]",
"[昏迷黑啤]"
]
},
"Sender":">> 玩家阶段表现评估 <<",
"Send":{
"Mutate":"TriggerDelay",
"N": 2,
"In":{"Var":"轮转阶段周期Boolean"}
},
"Type":"Streamer"
}④ 杀手黑啤(==4):5 秒回血
这一步在算什么:评级 4:16 秒充能窗口里每 5 秒攒一次,最多 3 次。
④ · 详解:公式与推演
杀手黑啤·次数充能 = TriggerFixedDuration(16, IfFloat(锁定 == 4)):阶段开头有 16 秒充能窗口。杀手黑啤·回血次数 = Sequence [0,1,2,3],Next = TriggerTimer(5, Enable:充能)——窗口内每 5 秒 +1,最多 3 次;Previous = TriggerDelay(5, TriggerFixedDuration(1, 效果触发))——效果触发后 1 秒开窗,再延迟 5 秒才扣掉一次。
杀手黑啤·效果触发 = TriggerCooldown(20, And(团队状态评估 ≤ 0.75, TriggerOnChange(RiseOnly, Floor(EnemiesKilled / 50)))):团队状态不佳且每击杀满 50 只触发一次,20 秒冷却。触发后 5 秒内,每秒恢复生命值 的 C 条件成立 → ×25、残血后最大回血比例 的 Then 由 1 变 4、受伤恢复延迟 乘 0。三处下游用的是同一份条件切片,只是各自乘的数字不同。
④ · 杀手黑啤:16 秒充能 + 5 · 124 行 · 点击展开
// ===== Vars.杀手黑啤·次数充能(Boolean):评级 ==4 → 16 秒充能窗口 =====
{
"Type":"Boolean",
"Value":{
"Mutate":"TriggerFixedDuration",
"N": 16,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"玩家阶段表现锁定"},
"==": 4,
"Then": true,
"Else": false
}
}
}
// ===== Vars.杀手黑啤·回血次数(Float):Sequence 0..3,Next=TriggerTimer 5s / Enable=次数充能 =====
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1,2,3],
"Next":{
"Mutate":"TriggerTimer",
"N": 5,
"Enable":{"Var":"杀手黑啤·次数充能"}
},
"Previous":{
"Mutate":"TriggerDelay",
"N": 5,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{"Var":"杀手黑啤·效果触发"}
}
},
"Repeat": false
}
}
// ===== Vars.杀手黑啤·效果触发(Boolean):TriggerCooldown 20s ×(团队状态 ≤0.75 且 每 50 杀) =====
{
"Type":"Boolean",
"Value":{
"Mutate":"TriggerCooldown",
"N": 20,
"In":{
"Mutate":"And",
"A":{
"Mutate":"IfFloat",
"Value":{"Var":"团队状态评估"},
"<=": 0.75,
"Then": true,
"Else": false
},
"B":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"Floor",
"Value":{
"Mutate":"Divide",
"A":{"Mutate":"EnemiesKilled"},
"B": 50
}
}
}
}
}
}
// ===== Vars/残血后最大回血比例/Value/Else/B/Condition/C(逐字切片)—— 杀手黑啤:次数 > 0 且 触发后 5 秒内,上限 ×4 =====
{
"Mutate":"IfFloat",
"Value":{"Var":"杀手黑啤·回血次数"},
">": 0,
"Then":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerFixedDuration",
"N": 5,
"In":{"Var":"杀手黑啤·效果触发"}
},
"Then": true,
"Else": false
},
"Else": false
}
// ===== Vars/每秒恢复生命值/Value/B/Condition/C(逐字切片)—— 同一条件的回血速率分支,Then 为 25 =====
{
"Mutate":"IfFloat",
"Value":{"Var":"杀手黑啤·回血次数"},
">": 0,
"Then":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerFixedDuration",
"N": 5,
"In":{"Var":"杀手黑啤·效果触发"}
},
"Then": true,
"Else": false
},
"Else": false
}
// ===== Vars/受伤恢复延迟/Value/B/Condition/C(逐字切片)—— 同一条件的延迟分支,Then 为 0 =====
{
"Mutate":"IfFloat",
"Value":{"Var":"杀手黑啤·回血次数"},
">": 0,
"Then":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerFixedDuration",
"N": 5,
"In":{"Var":"杀手黑啤·效果触发"}
},
"Then": true,
"Else": false
},
"Else": false
}⑤ 红岩爆破手(==5):20 秒回血 + 50% 减伤
这一步在算什么:评级 5:61 秒窗口里每 15 秒攒一次,还要本阶段用过补给。
⑤ · 详解:公式与推演
红岩爆破手·补给增幅次数 = Sequence [0,1,2,3,4],Repeat:false。Next = TriggerTimer(15, Enable: TriggerOnce(Reset:轮转阶段周期Boolean, In: TriggerFixedDuration(61, IfFloat(锁定 == 5))))——评级 5 的 61 秒窗口内每 15 秒 +1,最多 4 次;TriggerOnce 加 Reset 保证每个阶段周期只开一次这道门,Previous = TriggerDelay(20, 双评估技能激活) 在技能结束后 20 秒回退一次。
双评估技能激活 = And(团队状态评估 ≤ 0.75, {"Var":"补给消耗次数"}),而 补给消耗次数 是 TriggerCooldown(50, TriggerOnChange(RiseOnly, ResupplyUsesConsumed)),即 50 秒内用过补给。红岩爆破手·技能激活 = IfFloat(补给增幅次数 > 0, Then: If(双评估技能激活), Else: false)。激活期间 敌人伤害 的 B 分支 ×0.5(20 秒减伤 50%),同时三处回血下游的 B 分支把回血 ×25、上限 ×4、延迟 ×0。
⑤ · 红岩爆破手:补给增幅次数与双评估 · 81 行 · 点击展开
// ===== Vars.红岩爆破手·补给增幅次数(Float):Sequence 0..4,Next 每 15 秒 +1,Previous 在双评估成立 20 秒后 -1 =====
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1,2,3,4],
"Repeat": false,
"Next":{
"Mutate":"TriggerTimer",
"N": 15,
"Enable":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 61,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"玩家阶段表现锁定"},
"==": 5,
"Then": true,
"Else": false
}
}
}
},
"Previous":{
"Mutate":"TriggerDelay",
"N": 20,
"In":{"Var":"双评估技能激活"}
}
}
}
// ===== Vars.红岩爆破手·技能激活(Boolean):次数 > 0 且 双评估技能激活 =====
{
"Type":"Boolean",
"Value":{
"Mutate":"IfFloat",
"Value":{"Var":"红岩爆破手·补给增幅次数"},
">": 0,
"Then":{
"Mutate":"If",
"Condition":{"Var":"双评估技能激活"},
"Then": true,
"Else": false
},
"Else":false
}
}
// ===== Vars.红岩爆破手·技能激活(Boolean):次数 > 0 且 双评估技能激活 =====
{
"Type":"Boolean",
"Value":{
"Mutate":"IfFloat",
"Value":{"Var":"红岩爆破手·补给增幅次数"},
">": 0,
"Then":{
"Mutate":"If",
"Condition":{"Var":"双评估技能激活"},
"Then": true,
"Else": false
},
"Else":false
}
}
// ===== Vars.补给消耗次数(Boolean):TriggerCooldown 50s on ResupplyUsesConsumed,双评估的第二个输入 =====
{
"Type":"Boolean",
"Value":{
"Mutate":"TriggerCooldown",
"N": 50,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{"Mutate":"ResupplyUsesConsumed"}
}
}
}⑥ 昏迷黑啤(==6):20 秒无敌 + 清图
这一步在算什么:评级 6:无敌是把一个乘子变成 0,清图是刷一只一出生就自爆的单位。
⑥ · 详解:公式与推演
昏迷黑啤·危机庇护次数 = Sequence [0,1];Next = TriggerFixedDuration(1, IfFloat(锁定 == 6)),Previous = TriggerDelay(21, TriggerFixedDuration(0.5, IfFloat(团队状态评估 ≤ 0.45)))——极度危急持续一段、再过 21 秒才消耗一次。昏迷黑啤·危机庇护激活 = And(团队状态评估 ≤ 0.45, 危机庇护次数 > 0)。
它进入 伤害抑制因子 的 A 分支:TriggerFixedDuration(20, In:危机庇护激活)。伤害抑制因子 是 If(Or(A, B:25 秒生态重置, C:Destroyer 刷出后 10 秒), Then:0, Else:1),输出的 0 就是 敌人伤害 的 G 乘子——整条伤害链归零 20 秒,这就是无敌。同时 WaveSpawners[3](Name:"清场机制")的 Enabled.B 等于 TriggerDelay(1, TriggerFixedDuration(0.8, 危机庇护激活)),刷出 Enemies.ED_Destroyer(DisplayName:"清图大自爆"、Heal:-9999 让它一出生就死、死亡爆炸 RadialDamage:66666 / DamageRadius:20000 / MinDamagePct:1),这就是清图。「清图」本身没有独立的变量名,由这一个刷怪条目与这一只单位共同承担;若另有所指,未能确认。
两档阈值把三种啤酒分开:红岩要 团队状态评估 ≤ 0.75 且本阶段用过补给,昏迷黑啤要 ≤ 0.45。同一个 团队状态评估 被复用成分档依据,调阈值就是在调「哪种酒更容易出现」。
一条洞见:无敌是把一个乘子变成 0,不是加抗性。好处是自动覆盖所有伤害类型;代价是它和功能 ② 的减伤共用同一条 Multiply 链——伤害抑制因子 取 0 时,勘探者的 0.8 与 0.5 也一起被乘掉。这是隐含耦合,改动前要意识到。
另一条洞见:播报窗口与技能窗口的数字是手工凑的。Messages[4] 的 Reset 用 TriggerDelay(30, …)、Send/B/Enable 又是 16,Messages[5] 里写的是 15,与技能本身的 20 秒并不同源。改技能时长必须逐个核对 Messages[3]、[4]、[5],不能只改一处。
⑥ · 昏迷黑啤:危机庇护次数与伤害抑制 · 64 行 · 点击展开
// ===== Vars.昏迷黑啤·危机庇护次数(Float):Sequence 0..1,Next 看评级 ==6,Previous 看团队状态 ≤0.45 =====
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1],
"Repeat": false,
"Next":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"玩家阶段表现锁定"},
"==": 6,
"Then": true,
"Else": false
}
},
"Previous":{
"Mutate":"TriggerDelay",
"N": 21,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"团队状态评估"},
"<=": 0.45,
"Then": true,
"Else": false
}
}
}
}
}
// ===== Vars.昏迷黑啤·危机庇护激活(Boolean):团队状态 ≤0.45 且 次数 > 0 =====
{
"Type":"Boolean",
"Value":{
"Mutate":"And",
"A":{
"Mutate":"IfFloat",
"Value":{"Var":"团队状态评估"},
"<=": 0.45,
"Then": true,
"Else": false
},
"B":{
"Mutate":"IfFloat",
"Value":{"Var":"昏迷黑啤·危机庇护次数"},
">": 0,
"Then": true,
"Else": false
}
}
}
// ===== Vars/伤害抑制因子/Value/Condition/A(逐字切片)—— 昏迷黑啤分支 =====
{
"Mutate": "TriggerFixedDuration",
"N": 20,
"In": {"Var":"昏迷黑啤·危机庇护激活"}
}⑥ · 清图机制与清图单位 · 48 行 · 点击展开
// ===== WaveSpawners[3]「清场机制」:Enabled.B 由 昏迷黑啤·危机庇护激活 驱动,Enemies 只有一个 ED_Destroyer =====
{
"Name":"清场机制",
"Enabled":{
"Mutate":"Or",
"A":{
"Mutate":"TriggerDelay",
"N": 1,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.8,
"In":{"Var":"生态重置激活"}
}
},
"B":{
"Mutate":"TriggerDelay",
"N": 1,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.8,
"In":{"Var":"昏迷黑啤·危机庇护激活"}
}
}
},
"Enemies":["ED_Destroyer"],
"Difficulty": 33,
"Interval": 0.5,
"Distance": 6000,
"Locations": 1
}
// ===== Enemies.ED_Destroyer:DisplayName 直接叫「清图大自爆」,Heal -9999 让它秒死,死亡爆炸半径 20000 / 伤害 66666 =====
{
"Base":"ED_Spider_ExploderTank",
"DisplayName":"清图大自爆",
"DifficultyRating": 100,
"MinSpawnCount": 0,
"MaxSpawnCount": 1,
"Heal": -9999,
"Direct":{
"Int:NumClusterBombs": 0,
"Float:CarveDiameter": 0,
"Float:DamageDeathExplosion.RadialDamage": 66666,
"Float:DamageDeathExplosion.DamageRadius": 20000,
"Float:DamageDeathExplosion.MaxDamageRadius": 20000,
"Float:DamageDeathExplosion.MinDamagePct": 1
}
}功能 ⑤ · 生态重置
它做了什么
全队被打得很惨、而兜底次数还没用掉时,图上会刷出两颗悬停的石头当「是 / 否」按钮。打爆绿灯就启动兜底:清场、换一套怪池 150 秒、给 25 秒无敌,免费补给与满血复活各 +1。打爆红灯、或者干脆不管,就当没发生过。
| 读取 | 团队状态评估 / 生态重置次数 / 危机庇护是否占用 |
| 判断 | 状态 ≤ 0.4 且还有次数 → 刷出「是 / 否」单位 |
| 输出 | 生态重置激活 → 一整套兜底效果 |
想深入了解:Mutator锁定浮点数、锁定布尔值、锁定字符串模块怪池 PoolsMutator非零判断 Nonzero
精简骨架
结构完整保留,长数组 / 长表达式缩写。
- ① 检测
- 生态重置条件检测
- And(团队状态评估 ≤ 0.4, 生态重置次数 == 1, Not(危机庇护次数 > 0))
- 生态重置次数
- Sequence [1,0],Repeat false;用掉进冷却,300 秒或完成次要任务后恢复
- ② 锁存
- 生态重置激活
- LockBoolean —— 判定"哪一只被打爆":绿灯 150 秒 / 红灯 166 秒(否决窗口 16 秒)
- ③ 换池
- 生态重置怪池选择
- LockFloat 166 秒;RandomChoice([0,1,2,3,4]) —— 只摇一次
- 生态重置·反弹增强
- 激活 60 秒后 → 1.1(敌人全属性 +10%)
- ④ 效果
- 免费补给次数
- Next.D += 生态重置激活 → 补给 +1
- 满血复活次数
- Next.B += 生态重置激活 → 复活 +1
- 伤害抑制因子
- = 0 的其中一路:25 秒@生态重置激活 → 25 秒无敌
- 火把-Torch
- Not(Or(60 秒@生态重置激活, …)) → 停潮 60 秒
- ⑤ 刷怪
- WaveSpawners
- "生态重置选择"(刷是/否)/ "生态重置持续时间" / "清场机制"(ED_Destroyer)
- Enemies
- ED_Yes / ED_No(悬停"智能石头")/ ED_Destroyer(清场,自毁爆炸 66666 伤害)
实现拆解
① 前置:条件检测
这一步在算什么:判断「现在该不该弹兜底」:状态够差、次数还有、庇护没占用。
① · 详解:公式与推演
- 团队状态评估 = Min(钢铁与倒地权重 + 血量与护盾权重 + 全队弹药×0.2, 三倒以上则 0.20)(见功能 ⑥ 附录 H)。
- 生态重置条件检测 = 团队状态评估 <= 0.4 AND 生态重置次数 == 1 AND NOT(昏迷黑啤·危机庇护次数 > 0)。注意第三项在原文里写作 "Mutate":"IfFloat"(小写 f),是源文件原样。
- 生态重置次数 是一个 Sequence [1,0](InitialOffset 1,Repeat false):Next = 生态重置激活 持续 1s、Previous = Or(击杀 ED_Yes 后延迟 300s, SecondaryFinished 持续 1s)。即:用掉一次后进入冷却,冷却 300 秒或完成一个次要任务就恢复——这正对应作者描述里的「四:次要完成奖励」。
- ⚠️ (未能确认):Sequence 的 InitialOffset 取址语义无法从源文件判定。若按"索引"解释则初值 = Sequence[1] = 0(必须先激活过一次才满足 ==1,存在自举疑问);若按"从末尾起算"解释则初值 = 1(一开始就可用,使用后归 0、完成次要任务后恢复),后者与 Previous 里挂 SecondaryFinished、以及 "有剩余次数才触发" 的设计一致。两种解释下 ==1 都表示"可用"。
① · 核心 Vars · 142 行 · 点击展开
// Vars.生态重置条件检测 —— 团队状态<=0.4 且 次数==1 且 昏迷黑啤庇护未占用
{
"Type":"Boolean",
"Value":{
"Mutate":"If",
"Condition":{
"Mutate":"And",
"A":{
"Mutate":"IfFloat",
"Value":{"Var":"团队状态评估"},
"<=": 0.4,
"Then": true,
"Else": false
},
"B":{
"Mutate":"IfFloat",
"Value":{"Var":"生态重置次数"},
"==": 1,
"Then": true,
"Else": false
},
"C":{
"Mutate":"IfFloat",
"Value":{"Var":"昏迷黑啤·危机庇护次数"},
">": 0,
"Then": false,
"Else": true
}
},
"Then": true,
"Else": false
}
}
// Vars.生态重置次数 —— Sequence[1,0]:激活后切换;击杀ED_Yes满300s 或 次要任务完成 后恢复
{
"Type": "Float",
"Value": {
"Mutate":"Sequence",
"Sequence":[1,0],
"Repeat": false,
"InitialOffset": 1,
"Next":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{"Var":"生态重置激活"}
},
"Previous":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"Or",
"A":{
"Mutate":"TriggerDelay",
"N": 300,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly":true,
"In":{
"Mutate":"EnemiesKilled",
"ED":"ED_Yes"
}
}
},
"B":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{"Mutate":"SecondaryFinished"}
}
}
}
}
}
// Vars.生态重置激活 —— LockBoolean:杀 ED_Yes → 真 150s;杀 ED_No → 锁 166s(长 16s)
{
"Type":"Boolean",
"Value":{
"Mutate":"LockBoolean",
"Lock": {
"Mutate": "TriggerFixedDuration",
"N": 166,
"In": {
"Mutate": "TriggerOnChange",
"RiseOnly": true,
"In": {
"Mutate": "EnemiesKilled",
"ED": "ED_No"
}
}
},
"Value": {
"Mutate": "TriggerFixedDuration",
"N": 150,
"In": {
"Mutate": "TriggerOnChange",
"RiseOnly": true,
"In": {
"Mutate": "EnemiesKilled",
"ED": "ED_Yes"
}
}
}
}
}
// Vars.生态重置怪池选择 —— LockFloat 锁 166s,随机摇 0~4 号池(一次定死)
{
"Type": "Float",
"Value": {
"Mutate": "LockFloat",
"Lock": {
"Mutate":"TriggerFixedDuration",
"N": 166,
"In":{"Var":"生态重置激活"}
},
"Value": {
"Mutate":"RandomChoice",
"Choices": [0,1,2,3,4],
"Weights": [1,1,1,1,1]
}
}
}
// Vars.生态重置·反弹增强 —— 激活满 60s 后敌人属性 ×1.1
{
"Type":"Float",
"Value":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerDelay",
"N": 60,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 60,
"In":{"Var":"生态重置激活"}
}
},
"Then": 1.1,
"Else": 1
}
}② 激活锁存:生态重置激活(是/否的判定核心)
这一步在算什么:打爆绿灯 = 是、红灯 = 否;用锁存把结果固定住。
② · 详解:公式与推演
- 类型 LockBoolean,两个字段:
- Value = TriggerFixedDuration(150, TriggerOnChange(RiseOnly, EnemiesKilled ED_Yes))
- Lock = TriggerFixedDuration(166, TriggerOnChange(RiseOnly, EnemiesKilled ED_No))
- 判定不是"按了哪个按钮",而是"哪一只被击杀":EnemiesKilled 带 ED 参数可读"指定单位死亡计数",TriggerOnChange(RiseOnly) 捕捉它的上升(= 该单位被击杀)。
- 超时:Lock 166 秒 vs Value 150 秒,锁定窗口比"是"的有效窗口长 16 秒。设计意图:ED_Yes 出生 6 秒后会自毁,ED_No 也会在"是"被击杀 5 秒后自毁,两个窗口都会在短时间内过去;把"否"的锁定期多留 16 秒,可以保证"否"的决定压过"是"的残留窗口,不会在最后 16 秒里被翻盘。
② · 相关 WaveSpawners · 66 行 · 点击展开
// WaveSpawners[1]「生态重置选择」—— 生成是/否选择单位;TriggerCooldown 150s 防重复
{
"Name":"生态重置选择",
"Enabled":{
"Mutate":"TriggerCooldown",
"N": 150,
"In":{"Var":"生态重置条件检测"}
},
"Enemies":["ED_Yes","ED_No"],
"Locations": 1,
"Diversity": 2,
"Distance": 2000,
"Difficulty": {
"Mutate":"ByMissionType",
"Default": 100,
"Salvage": 66
},
"Alert": false,
"Interval": 0
}
// WaveSpawners[2]「生态重置持续时间」—— 激活后 1.5s 窗口内启用,刷出「【生态重置】已激活」标记单位
{
"Name":"生态重置持续时间",
"Enabled":{
"Mutate":"TriggerFixedDuration",
"N": 1.5,
"In":{"Var":"生态重置激活"}
},
"Enemies":["ED_Phase·Special"],
"Difficulty": 33,
"Interval": 1,
"Distance": 6000,
"Locations": 1
}
// WaveSpawners[3]「清场机制」—— 激活 0.8s 后再延迟 1s 刷"清图大自爆";昏迷黑啤的危机庇护也共用它
{
"Name":"清场机制",
"Enabled":{
"Mutate":"Or",
"A":{
"Mutate":"TriggerDelay",
"N": 1,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.8,
"In":{"Var":"生态重置激活"}
}
},
"B":{
"Mutate":"TriggerDelay",
"N": 1,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.8,
"In":{"Var":"昏迷黑啤·危机庇护激活"}
}
}
},
"Enemies":["ED_Destroyer"],
"Difficulty": 33,
"Interval": 0.5,
"Distance": 6000,
"Locations": 1
}③ 随机换池:生态重置怪池选择
这一步在算什么:激活瞬间摇一次 0~4,然后锁住不再抖动。
③ · 详解:公式与推演
- LockFloat,Lock = TriggerFixedDuration(166, 生态重置激活),Value = RandomChoice([0,1,2,3,4], 等权)。采样发生在锁存触发的那一刻,因此整个 150 秒只摇一次,不会每帧抖动;166 秒后解锁并重新可摇。
- 它被 最终生效怪池 以最高优先级引用(Condition = 生态重置激活),所以重置期间怪池被完全接管。
③ · 相关 Enemies · 121 行 · 点击展开
// Enemies.ED_Yes —— 绿灯"是":HealthRaw 200,Heal 出生 6s 后 -10000 自毁;电/爆/内/辐/毒/穿 抗性为 0
{
"Base":"ED_FlyingSmartRock",
"DisplayName":"生态重置选择·是",
"IsBossFight": true,
"Rarity": 5,
"HealthRaw": 200,
"Heal":{
"InitialRate": 0,
"SwitchAfter": 6,
"FinalRate": -10000
},
"DifficultyRating": 100,
"MaxSpawnCount": 1,
"MinSpawnCount": 1,
"Resistances":{
"FireDamageMultiplier": 1,
"CorrosiveDamageMultiplier": 1,
"ElectricDamageMultiplier": 0,
"ColdDamageMultiplier": 1,
"KineticDamageMultiplier": 1,
"PhysicalDamageMultiplier": 1,
"ExplosionDamageMultiplier": 0,
"InternalDamageMultiplier": 0,
"RadiationDamageMultiplier": 0,
"PoisonDamageMultiplier": 0,
"PiercingDamageMultiplier": 0
},
"Movement":{
"MaxPawnSpeed": 0.01
},
"Materials":["","M_Uplink_Light_Green_Blink_Off"]
}
// Enemies.ED_No —— 红灯"否":HealthRaw 200,Heal = 若"是"被击杀满 5s 则 -1000 自毁,否则 0
{
"Base":"ED_FlyingSmartRock",
"DisplayName":"生态重置选择·否",
"IsBossFight": true,
"DifficultyRating": 100,
"Rarity": 10,
"HealthRaw": 200,
"Heal":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerSustain",
"N": 5,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{"Mutate":"EnemiesKilled","ED":"ED_Yes"}
}
},
"Then": -1000,
"Else": 0
},
"MaxSpawnCount": 1,
"MinSpawnCount": 1,
"Resistances":{
"FireDamageMultiplier": 1,
"CorrosiveDamageMultiplier": 1,
"ElectricDamageMultiplier": 0,
"ColdDamageMultiplier": 1,
"KineticDamageMultiplier": 1,
"PhysicalDamageMultiplier": 1,
"ExplosionDamageMultiplier": 0,
"InternalDamageMultiplier": 0,
"RadiationDamageMultiplier": 0,
"PoisonDamageMultiplier": 0,
"PiercingDamageMultiplier": 0
},
"Movement":{
"MaxPawnSpeed": 0.01
},
"Materials":["","M_Uplink_Light_Red_Blink_Off"]
}
// Enemies.ED_Destroyer —— 清图大自爆:Heal -9999,死亡爆炸 66666 伤害 / 20000 半径 / MinDamagePct 1
{
"Base":"ED_Spider_ExploderTank",
"DisplayName":"清图大自爆",
"DifficultyRating": 100,
"MinSpawnCount": 0,
"MaxSpawnCount": 1,
"Heal": -9999,
"Direct":{
"Int:NumClusterBombs": 0,
"Float:CarveDiameter": 0,
"Float:DamageDeathExplosion.RadialDamage": 66666,
"Float:DamageDeathExplosion.DamageRadius": 20000,
"Float:DamageDeathExplosion.MaxDamageRadius": 20000,
"Float:DamageDeathExplosion.MinDamagePct": 1
}
}
// Enemies.ED_Phase·Special —— 重置期间的"已激活"标记单位:全抗性 0、Heal -10、死亡后刷 ED_Phase·Special-2
{
"Base":"ED_Spider_Drone",
"IsBossFight": true,
"DisplayName":"【生态重置】已激活",
"DifficultyRating": 100,
"HealthRaw": 1000,
"Heal": -10,
"Spawner":{
"ED": "ED_Phase·Special-2",
"OnDeathCount": 1
},
"Resistances":{
"FireDamageMultiplier": 0,
"CorrosiveDamageMultiplier": 0,
"ElectricDamageMultiplier": 0,
"ColdDamageMultiplier": 0,
"KineticDamageMultiplier": 0,
"PhysicalDamageMultiplier": 0,
"ExplosionDamageMultiplier": 0,
"InternalDamageMultiplier": 0,
"RadiationDamageMultiplier": 0,
"PoisonDamageMultiplier": 0,
"PiercingDamageMultiplier": 0
}
}④ 清场 / 无敌 / 补给 / 复活 / 延迟反弹
这一步在算什么:一次性把七项兜底效果全部挂上去。
| 效果 | 实现位置 | 机制 |
|---|---|---|
| 清场 | WaveSpawners[3]「清场机制」 + Enemies.ED_Destroyer | 激活后 0.8s 再延迟 1s,刷 ED_Destroyer(Heal: -9999 自毁式死亡爆炸 66666 伤害/20000 半径) |
| 换池 150s | WaveSpawners[2]「生态重置持续时间」 | TriggerFixedDuration 1.5s in 生态重置激活:激活后 1.5 秒窗口内启用该刷怪条目,刷出 ED_Phase·Special(显示名「【生态重置】已激活」,全抗性 0、Heal:-10 的标记单位) |
| 25s 无敌 | Vars.伤害抑制因子 | TriggerFixedDuration 25 in 生态重置激活 → 因子取 0,被 敌人伤害.G、环境伤害.B、友军伤害.B、摔落伤害.C 相乘 |
| 免费补给 +1 | Vars.免费补给次数 | Next.D = TriggerFixedDuration 1s in 生态重置激活 |
| 复活次数 +1 | Vars.满血复活次数 | Next.B = TriggerFixedDuration 0.5s in 生态重置激活 |
| 停潮 60s | Vars.火把-Torch | Not(Or(TriggerFixedDuration 60 in 生态重置激活, …));该布尔被 WaveSpawners[5][8][9][10] 的 Enabled 引用,为 false 时这些潮停刷 |
| 60s 后反弹 +10% | Vars.生态重置·反弹增强 | TriggerDelay 60 in TriggerFixedDuration 60 in 生态重置激活 → 1.1,被 6 处属性相乘 |
④ · 奖励与善后 Vars · 283 行 · 点击展开
// Vars.免费补给次数 —— Sequence[0..6],Next.D 在激活时 +1(作者描述:免费补给*1)
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1,2,3,4,5,6],
"Next":{
"Mutate":"Or",
"A":{
"Mutate":"TriggerOnce",
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"DuringMission",
"StartingAt": 15,
"StoppingAfter": 18
}
}
},
"B":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{"Mutate":"SecondaryFinished"}
},
"C":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"Floor",
"Value":{
"Mutate":"Divide",
"A":{
"Mutate":"Add",
"A": {
"Mutate": "DepositedResource",
"Resource": "Gold"
},
"B": {
"Mutate": "DepositedResource",
"Resource": "Compressed Gold"
}
},
"B": 120
}
}
},
"D":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{"Var":"生态重置激活"}
},
"E":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"玩家阶段表现锁定"},
"==": 6,
"Then": true,
"Else": false
}
}
},
"F":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"Floor",
"Value":{
"Mutate":"Divide",
"A":{"Var":"硝石存量"},
"B": 60
}
}
},
"G":{
"Mutate":"ByMissionType",
"Default": false,
"Salvage":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"DuringMission",
"StartingAt": 12
}
}
}
},
"Previous":{
"Mutate":"TriggerDelay",
"N": 0.5,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{"Mutate":"ResuppliesCalled"}
}
},
"Repeat": false
}
}
// Vars.满血复活次数 —— Sequence[0..3],Next.B 在激活时 +1(作者描述:满血复活次数*1)
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1,2,3],
"Repeat": false,
"Next":{
"Mutate":"Or",
"A":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{"Var":"满血复活币"}
},
"B":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{"Var":"生态重置激活"}
}
},
"Previous":{
"Mutate":"If",
"Condition":{
"Mutate":"LockBoolean",
"Value":{
"Mutate":"TriggerOnChange",
"FallOnly": true,
"In":{"Mutate":"IWsLeft"}
},
"Lock":{
"Mutate":"TriggerFixedDuration",
"N": 12,
"In":{
"Mutate":"TriggerOnChange",
"FallOnly": true,
"In":{"Mutate":"IWsLeft"}
}
}
},
"Then": false,
"Else":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{"Mutate":"DwarvesRevives"}
}
}
}
}
// Vars.伤害抑制因子 —— 激活后 25s 内取 0(= 25s 无敌),另有昏迷黑啤 20s、清场单位存活 10s 两个来源
{
"Type":"Float",
"Value":{
"Mutate":"If",
"Condition":{
"Mutate":"Or",
"A":{
"Mutate": "TriggerFixedDuration",
"N": 20,
"In": {"Var":"昏迷黑啤·危机庇护激活"}
},
"B":{
"Mutate":"TriggerFixedDuration",
"N": 25,
"In":{"Var":"生态重置激活"}
},
"C":{
"Mutate":"TriggerSustain",
"N": 10,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{
"Mutate":"EnemiesRecentlySpawned",
"Seconds": 9999,
"EDs":[
"ED_Destroyer",
"ED_DestroyerOFtheWorld"
]
}
}
}
},
"Then": 0,
"Else": 1
}
}
// Vars.火把-Torch —— 激活后 60s 内取反(false),用于停掉非原版自然潮/恒压潮
{
"Type":"Boolean",
"Value":{
"Mutate":"Not",
"Value":{
"Mutate":"Or",
"A":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerFixedDuration",
"N": 60,
"In":{"Var":"生态重置激活"}
},
"Then": true,
"Else": false
},
"B":{
"Mutate":"If",
"Condition":{
"Mutate":"TriggerSustain",
"N": 30,
"In":{
"Mutate":"TriggerOnChange",
"RiseOnly":true,
"In":{
"Mutate":"EnemiesKilled",
"ED":"ED_InhibitProspector"
}
}
},
"Then": true,
"Else": false
},
"C":{"Mutate":"DuringDrillevator"},
"D":{"Mutate":"DuringDefend"},
"E":{"Mutate":"DuringExtraction"},
"F":{"Mutate":"DuringGenericSwarm"},
"G":{"Mutate":"DuringPECountdown"},
"H":{"Mutate":"DuringDread"}
}
}
}
// Vars.昏迷黑啤·危机庇护次数 —— 条件检测的第三项来源:该次数 > 0 时不允许生态重置
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1],
"Repeat": false,
"Next":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"玩家阶段表现锁定"},
"==": 6,
"Then": true,
"Else": false
}
},
"Previous":{
"Mutate":"TriggerDelay",
"N": 21,
"In":{
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"团队状态评估"},
"<=": 0.45,
"Then": true,
"Else": false
}
}
}
}
}
生态重置·反弹增强 被以下 6 处以属性乘数引用(逐字段片段,位置为所在变量的字段名):
// Vars.敌人伤害.I / 敌人移速.L / 敌人发射物速度.D
"I":{"Var":"生态重置·反弹增强"}
"L":{"Var":"生态重置·反弹增强"}
"D":{"Var":"生态重置·反弹增强"}
// Vars.普通敌人抗性.E / 精英敌人抗性.F / Boss单位抗性.F
"E":{"Var":"生态重置·反弹增强"}
"F":{"Var":"生态重置·反弹增强"}⑤ 玩家可见播报
这一步在算什么:用两条播报让玩家知道发生了什么。
⑤ · 玩家可见播报 · 28 行 · 点击展开
// Messages[16] —— 激活 0.5s 时播报:即将清场 + 当前重置为哪个池 + 已获得的奖励
{
"Message":{
"Mutate":"Join",
"Values":[
"▲ 生态重置已触发!即将清除场上所有不锁血的单位!!! | 当前阶段已经“重置”为:",
{
"Mutate": "SelectFromArray",
"Select": {"Var": "最终生效怪池"},
"Array":[
"[乘胜追击]",
"[养虎为患]",
"[鱼龙混杂]",
"[以战养战]",
"[最后通牒]"
]
},
" | 已获得: 补给 * 1 + 满血复活次数 * 1 + 25s无敌 | "
]
},
"Type":"Streamer",
"Sender":"【任务控制中心】",
"Send": {
"Mutate":"TriggerFixedDuration",
"N": 0.5,
"In":{"Var":"生态重置激活"}
}
}⑤ · 附:是/否的实现
- 生:WaveSpawners[1]「生态重置选择」 同时刷出 ED_Yes 与 ED_No 各 1 只(Locations:1、Diversity:2、Distance:2000,难度只有 100/66,很容易打)。两只都继承 ED_FlyingSmartRock,MaxPawnSpeed 0.01(悬停不移动),HealthRaw 200,抗性里把 电/爆炸/内部/辐射/毒/穿透 全设为 0(= 免疫),只留 火/腐蚀/冰冻/动能/物理 = 1——也就是说只能用常规枪械与火/酸/冰伤害打死,ED_Destroyer 的清场大爆炸也炸不掉这两颗石头(ExplosionDamageMultiplier: 0)。
- 辨:靠 Materials 的第二项提示灯区分——是 = M_Uplink_Light_Green_Blink_Off(绿),否 = M_Uplink_Light_Red_Blink_Off(红)。
- 选:没有 UI 菜单。判定条件是 TriggerOnChange(RiseOnly, EnemiesKilled ED=ED_Yes / ED_No),即 "哪一只单位的死亡计数上升"就代表选了哪一边:
- 上升的是 ED_Yes → 生态重置激活 的 Value 触发 → 真 150 秒 → 执行重置;
- 上升的是 ED_No → Lock 触发 → 把该布尔锁 166 秒 → 否决。 - 收尾:ED_Yes 的 Heal 是 {InitialRate:0, SwitchAfter:6, FinalRate:-10000},出生 6 秒后自动掉血自毁(避免场上一直留着没被选的石头);ED_No 的 Heal 是条件式——一旦"是"被击杀且持续 5 秒,ED_No 也开始 -1000/s 自毁。两者都会自己消失,不留残余单位。
- 超时(Lock 比 Value 长多少):Lock = 166 秒、Value = 150 秒,差 16 秒。这是刻意的"否决窗口":ED_Yes 6 秒就会自毁、ED_No 在"是"死后 5 秒也会自毁,两个判断事件都挤在开头十几秒内;把"否"的锁定期设为比"是"的有效期长 16 秒,就能保证"否"的决定在时间上完全覆盖"是"的残留窗口,玩家不会在最后几秒被判成"是"。同理 生态重置怪池选择 也用 166 秒锁存,保证整个重置过程池子是同一个、不会中途重摇。
⑤ · 附:细节与待确认
| 事项 | 说明 |
|---|---|
| 初始次数 | 生态重置次数 = Sequence [1,0] + InitialOffset 1 的取址语义无法从源文件判定,详见上文「1. 前置」的 ⚠️。 |
| LockBoolean / LockFloat 的字段名 | 原文里同一类锁存有时用 Update(如 本阶段击杀数、上期实际怪池、玩家阶段表现锁定),有时用 Lock(如 生态重置激活、生态重置怪池选择)。这两个是不同的字段、语义不同,源文件按需选用,不是笔误。 |
| Direct 字段 | 形如 "Float:DamageDeathExplosion.MaxDamageRadius",类型前缀 + 点号路径,指向游戏底层的具体属性。 |
| 自毁是否计入 EnemiesKilled | ED_Yes 靠 Heal 掉血自毁。"自毁是否会被 EnemiesKilled 记为一次击杀"这一点无法从本 JSON 判定,但它决定了"玩家不操作时算不算默认选了是"——(未能确认)。 |
功能 ⑥ · 物竞天择
它做了什么
每过一个阶段,mod 会看你这阶段打得怎么样——击杀效率、死亡率、采矿量,还有你叫了几次补给。据此从 5 套怪池里挑一套换上;同一套不会连着出现两次;选中的池子会发给全图所有出怪器。
| 读取 | 本阶段击杀数 / 死亡 / 采集量 / 补给调用次数 |
| 判断 | 有效 KPM 高或低 → 5 套怪池的映射表 |
| 输出 | 最终生效怪池编号 → 单位名数组 → 全局敌人池 |
想深入了解:模块怪池 PoolsMutator已击杀敌人数量 EnemiesKilledMutator已呼叫补给次数 ByResuppliesCalledMutator近期生成敌人计数 EnemiesRecentlySpawned
精简骨架
结构完整保留,长数组 / 长表达式缩写。
- ① 前置
- 轮转阶段周期
- Floor(ByTime ÷ ByMissionType(Default 180, Mining: ByPlayerCount[300,270,240,210]))
- 轮转阶段周期Boolean
- TriggerOnChange(RiseOnly) —— 阶段切换瞬间的脉冲,全篇节拍
- ② 判断
- 本阶段击杀数 / 本阶段生成量 / 本阶段补给调用次数 / 本阶段死亡率 / 本阶段资源采集量
- 同一个模板:本阶段X = X累计 − LockFloat(X累计, Update = 阶段脉冲)
- 击杀比率 / 弹药效率因子 / 高有效KPM判定 / 高死亡率判定 / 高资源采集量判定
- 由上面 5 个统计量折算出的三条布尔判定
- ③ 决定
- 选择逻辑:物竞天择
- 三条判定 → 0~4 号怪池(映射表见步骤③)
- ④ 双锁存
- 阶段奇偶判定
- Modulo(轮转阶段周期, 2)
- 偶数阶段锁存 / 奇数阶段锁存
- 各在自己的阶段边沿采样"选择逻辑"
- 上一阶段表现
- 交叉取用:偶数阶段读奇数锁存、奇数阶段读偶数锁存
- 阶段一·怪池 / 当前生效怪池 / 上期实际怪池
- 首阶段用随机池,之后用"上一阶段表现"
- ⑤ 疲劳转换
- 连续同怪池计数
- 只有 0 / 2 两个取值(并非累加)
- 疲劳转换怪池
- SelectFromArray(上一阶段表现) → [2,0,3,1,4]
- ⑥ 最终怪池
- 最终生效怪池
- 生态重置 > 疲劳转换 > 当前池(优先级见步骤⑤)
- 怪池选择
- 5 套 ED_ 名单(共 109 个),SelectFromArray(最终生效怪池)
实现拆解
① 前置:时间定周期
这一步在算什么:把游戏时间切成一个个「阶段」,并给出阶段切换的那一瞬间。
① · 详解:公式与推演
- 轮转阶段周期 = Floor(ByTime ÷ ByMissionType(Default 180, Mining: ByPlayerCount[300,270,240,210])) → 阶段序号 0,1,2,…。
- 轮转阶段周期Boolean = TriggerOnChange(RiseOnly, 轮转阶段周期) → 阶段切换瞬间的脉冲。全篇的"本阶段 X"、"阶段初清零"、"阶段末锁存"都以它为节拍。
- 所有 本阶段X 的写法都是同一个模板:X = 累计量 − LockFloat(累计量, Update=轮转阶段周期Boolean)。LockFloat 在触发瞬间采样并保持,所以减掉的正是"阶段开始那一刻的累计值"。
① · 前置:阶段时钟 · 44 行 · 点击展开
// Vars.任务阶段时间 —— 与"轮转阶段"不同的另一套计时:默认 240s、搜救 180s(被「搜救任务·人工自然潮」当作阶段长度用)
{
"Type":"Float",
"Value":{
"Mutate":"ByMissionType",
"Default": 240,
"Salvage": 180
}
}
// Vars.轮转阶段周期 —— 阶段序号 = Floor(任务时间 ÷ 阶段长度),默认 180s,采矿按人数 300/270/240/210
{
"Type":"Float",
"Value":{
"Mutate":"Floor",
"Value":{
"Mutate":"Divide",
"A":{"Mutate": "ByTime"},
"B":{
"Mutate": "ByMissionType",
"Default": 180,
"Mining": {
"Mutate": "ByPlayerCount",
"Values": [
300,
270,
240,
210
]
}
}
}
}
}
// Vars.轮转阶段周期Boolean —— 阶段切换瞬间的上升脉冲,全篇用它做阶段初锁存/清零
{
"Type":"Boolean",
"Value":{
"Mutate":"TriggerOnChange",
"RiseOnly": true,
"In":{"Var":"轮转阶段周期"}
}
}② 判断:三条布尔判定 + 一个效率因子
这一步在算什么:先算四个「本阶段」统计量,再折算成三条 true/false 判定。
| 变量 | 判定式 |
|---|---|
| 击杀比率 | 本阶段击杀数 ÷ 本阶段生成量 |
| 弹药效率因子 | 阶段内发生过危险局面 → Clamp(1.15 − 0.0334×本阶段补给调用次数, Min 1.05);否则 → Clamp(1 − 0.025×本阶段补给调用次数, Min 0.95) |
| 高有效KPM判定 | 击杀比率 × 弹药效率因子 >= 0.8 |
| 高死亡率判定 | 本阶段死亡率 >= 0.6(死亡率 = 本阶段 战斗有效死亡加权计算 的增量) |
| 高资源采集量判定 | 本阶段资源采集量 >= 1(资源量 = 硝石存入量/100 + 黄金存入量×0.03 的累计) |
② · 详解:公式与推演
- 阶段内危险局面触发检测 是一个 Sequence [0,1]:团队状态评估 <= 0.4 时切到 1,阶段切换时 Reset。它只用来放宽/收紧 弹药效率因子。
- 补给调用次数是"惩罚项":调用补给越多,弹药效率因子 越低(每次 −0.025,危险局面下每次 −0.0334),于是"靠补给堆过去"的队伍 KPM 判定会掉下来。
② · 判断 1:四个"本阶段"统计量 · 75 行 · 点击展开
// Vars.本阶段生成量 —— 本阶段刷出的敌人数量(EnemiesRecentlySpawned 9999s 窗口 − 阶段初锁存)
{
"Type":"Float",
"Value":{
"Mutate":"Subtract",
"A":{
"Mutate": "EnemiesRecentlySpawned",
"Seconds": 9999
},
"B":{
"Mutate": "LockFloat",
"Update": {"Var":"轮转阶段周期Boolean"},
"Value": {
"Mutate": "EnemiesRecentlySpawned",
"Seconds": 9999
}
}
}
}
// Vars.本阶段击杀数 —— 本阶段击杀数
{
"Type":"Float",
"Value":{
"Mutate":"Subtract",
"A":{"Mutate": "EnemiesKilled"},
"B":{
"Mutate": "LockFloat",
"Update": {"Var":"轮转阶段周期Boolean"},
"Value": {"Mutate": "EnemiesKilled"}
}
}
}
// Vars.本阶段补给调用次数 —— 本阶段呼叫补给次数(处罚项)
{
"Type":"Float",
"Value":{
"Mutate":"Subtract",
"A":{"Mutate":"ResuppliesCalled"},
"B":{
"Mutate": "LockFloat",
"Update": {"Var":"轮转阶段周期Boolean"},
"Value": {"Mutate": "ResuppliesCalled"}
}
}
}
// Vars.本阶段死亡率 —— 本阶段"战斗有效死亡加权"的增量
{
"Type":"Float",
"Value":{
"Mutate":"Subtract",
"A":{"Var":"战斗有效死亡加权计算"},
"B":{
"Mutate": "LockFloat",
"Update": {"Var":"轮转阶段周期Boolean"},
"Value": {"Var":"战斗有效死亡加权计算"}
}
}
}
// Vars.本阶段资源采集量 —— 本阶段资源采集量的增量
{
"Type":"Float",
"Value":{
"Mutate":"Subtract",
"A":{"Var":"资源采集量"},
"B":{
"Mutate": "LockFloat",
"Update": {"Var":"轮转阶段周期Boolean"},
"Value":{"Var":"资源采集量"}
}
}
}② · 判断 2:三条布尔判定 · 103 行 · 点击展开
// Vars.击杀比率 —— 击杀数 ÷ 生成量
{
"Type": "Float",
"Value": {
"Mutate": "Divide",
"A": {"Var": "本阶段击杀数"},
"B": {"Var": "本阶段生成量"}
}
}
// Vars.阶段内危险局面触发检测 —— Sequence[0,1]:团队状态评估<=0.4 时置 1,阶段切换时 Reset
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1],
"Repeat": false,
"Next":{
"Mutate":"IfFloat",
"Value":{"Var":"团队状态评估"},
"<=": 0.4,
"Then": true,
"Else": false
},
"Reset":{"Var":"轮转阶段周期Boolean"}
}
}
// Vars.弹药效率因子 —— 危险局面下 1.15−0.0334×补给次数(下限1.05),否则 1−0.025×补给次数(下限0.95)
{
"Type":"Float",
"Value":{
"Mutate":"IfFloat",
"Value":{"Var":"阶段内危险局面触发检测"},
"==": 1,
"Then":{
"Mutate":"Clamp",
"Value":{
"Mutate":"Add",
"A": 1.15,
"B":{
"Mutate":"Multiply",
"A":{"Var":"本阶段补给调用次数"},
"B": -0.0334
}
},
"Min": 1.05
},
"Else":{
"Mutate":"Clamp",
"Value":{
"Mutate":"Add",
"A": 1,
"B":{
"Mutate":"Multiply",
"A":{"Var":"本阶段补给调用次数"},
"B": -0.025
}
},
"Min": 0.95
}
}
}
// Vars.高有效KPM判定 —— 击杀比率 × 弹药效率因子 >= 0.8
{
"Type":"Boolean",
"Value":{
"Mutate": "IfFloat",
"Value": {
"Mutate":"Multiply",
"A":{"Var": "击杀比率"},
"B":{"Var":"弹药效率因子"}
},
">=": 0.8,
"Then": true,
"Else": false
}
}
// Vars.高死亡率判定 —— 本阶段死亡率 >= 0.6
{
"Type":"Boolean",
"Value":{
"Mutate": "IfFloat",
"Value": {"Var": "本阶段死亡率"},
">=": 0.6,
"Then": true,
"Else": false
}
}
// Vars.高资源采集量判定 —— 本阶段资源采集量 >= 1
{
"Type":"Boolean",
"Value":{
"Mutate": "IfFloat",
"Value": {"Var": "本阶段资源采集量"},
">=": 1,
"Then": true,
"Else": false
}
}③ 决定:选择逻辑:物竞天择 → 双锁存
这一步在算什么:三条判定 → 0~4 号怪池;再用奇偶双锁存让评价延迟一个阶段生效。
| 高有效KPM | 高死亡率 | 高资源采集量 | 结果编号 | 池名 |
|---|---|---|---|---|
| ✔ | ✔ | — | 2 | [鱼龙混杂] |
| ✔ | ✘ | ✔ | 4 | ※[最后通牒]※ |
| ✔ | ✘ | ✘ | 3 | [以战养战] |
| ✘ | ✔ | — | 0 | [乘胜追击] |
| ✘ | ✘ | — | 1 | [养虎为患] |
双锁存(偶数/奇数阶段锁存)——这是这一功能最关键的一段:
| 锁存 | Update 条件 | 采样时机 |
|---|---|---|
| 偶数阶段锁存 | 阶段奇偶判定 == 0 | 只在偶数阶段起点写一次 |
| 奇数阶段锁存 | 阶段奇偶判定 == 1 | 只在奇数阶段起点写一次 |
③ · 详解:公式与推演
选择逻辑:物竞天择 是一张纯函数映射表(KPM 高 = 高有效KPM判定):
- 阶段奇偶判定 = Modulo(轮转阶段周期, 2),即阶段序号的奇偶。
两条锁存的写法完全相同,只有 Update 条件不同:
模板:锁存 = LockFloat(Value = 选择逻辑:物竞天择, Update = 条件)
- 上一阶段表现 = 阶段奇偶判定 == 0 ? 奇数阶段锁存 : 偶数阶段锁存 —— 交叉取用:偶数阶段读"奇数锁存"、奇数阶段读"偶数锁存"。
- 因为每个锁存只在"自己那一类阶段"的起点被写一次,所以本阶段读到的必然是上一个阶段采到的定级;两个锁存交替承担"上一期"的角色,就避免了单个锁存在阶段内被反复覆盖导致刷怪中途变池。效果等价于:怪池跟着上一阶段的表现走。
- 首阶段例外:当前生效怪池 = 轮转阶段周期 == 0 ? 阶段一·怪池 : 上一阶段表现,阶段一·怪池 = RandomChoicePerMission([0,1,2,3], 等权),即开局在 4 个池里随机一个(不含 4 号最后通牒)。
③ · 决定 1:选择逻辑:物竞天择 + · 143 行 · 点击展开
// Vars.选择逻辑:物竞天择 —— 三维判定 → 0/1/2/3/4 号怪池
{
"Type": "Float",
"Value":{
"Mutate":"If",
"Condition":{"Var":"高有效KPM判定"},
"Then":{
"Mutate":"If",
"Condition":{"Var":"高死亡率判定"},
"Then": 2,
"Else": {
"Mutate":"If",
"Condition":{"Var":"高资源采集量判定"},
"Then": 4,
"Else": 3
}
},
"Else":{
"Mutate":"If",
"Condition":{"Var":"高死亡率判定"},
"Then": 0,
"Else": 1
}
}
}
// Vars.阶段奇偶判定 —— 阶段序号 mod 2
{
"Type":"Float",
"Value":{
"Mutate":"Modulo",
"A":{"Var":"轮转阶段周期"},
"B": 2
}
}
// Vars.偶数阶段锁存 —— 只在偶数阶段采样"选择逻辑:物竞天择"并保持(双锁存之左半)
{
"Type": "Float",
"Value": {
"Mutate": "LockFloat",
"Update": {
"Mutate": "IfFloat",
"Value": {"Var": "阶段奇偶判定"},
"==": 0,
"Then": true,
"Else": false
},
"Value": {"Var": "选择逻辑:物竞天择"}
}
}
// Vars.奇数阶段锁存 —— 只在奇数阶段采样"选择逻辑:物竞天择"并保持(双锁存之右半)
{
"Type": "Float",
"Value": {
"Mutate": "LockFloat",
"Update": {
"Mutate": "IfFloat",
"Value": {"Var": "阶段奇偶判定"},
"==": 1,
"Then": true,
"Else": false
},
"Value": {"Var": "选择逻辑:物竞天择"}
}
}
// Vars.上一阶段表现 —— 交叉取用:偶数阶段读奇数锁存、奇数阶段读偶数锁存
{
"Type": "Float",
"Value": {
"Mutate": "IfFloat",
"Value": {"Var": "阶段奇偶判定"},
"==": 0,
"Then": {"Var": "奇数阶段锁存"},
"Else": {"Var": "偶数阶段锁存"}
}
}
// Vars.阶段一·怪池 —— 开局(阶段0)用的池:每局随机的 0~3 号池,等权
{
"Type":"Float",
"Value":{
"Mutate":"RandomChoicePerMission",
"Choices":[0,1,2,3],
"Weights":[1,1,1,1]
}
}
// Vars.当前生效怪池 —— 阶段0 用"阶段一·怪池",之后用"上一阶段表现"
{
"Type": "Float",
"Value": {
"Mutate": "IfFloat",
"Value": {"Var":"轮转阶段周期"},
"==": 0,
"Then": {"Var":"阶段一·怪池"},
"Else": {"Var":"上一阶段表现"}
}
}
// Vars.上期实际怪池 —— 阶段切换瞬间记下"刚刚生效的池",供同池检测比较
{
"Type": "Float",
"Value": {
"Mutate": "LockFloat",
"Update": {
"Mutate": "TriggerOnChange",
"In": {"Var":"轮转阶段周期"},
"RiseOnly": true
},
"Value": {"Var":"当前生效怪池"}
}
}
// Vars.连续同怪池计数 —— 名字是计数,实际只有 0/2:2 表示"本阶段与上期同池"
{
"Type": "Float",
"Value": {
"Mutate": "IfFloat",
"Value": {"Var":"轮转阶段周期"},
"<": 1,
"Then": 0,
"Else": {
"Mutate": "IfFloat",
"Value": {"Var":"上一阶段表现"},
"==": {"Var":"上期实际怪池"},
"Then": 2,
"Else": 0
}
}
}
// Vars.疲劳转换怪池 —— 按上一阶段表现查表轮换:0→2、1→0、2→3、3→1、4→4
{
"Type": "Float",
"Value": {
"Mutate": "SelectFromArray",
"Select": {"Var": "上一阶段表现"},
"Array": [2, 0, 3, 1,4]
}
}④ 决定:疲劳转换(避免连续同怪池)
这一步在算什么:发现连续两个阶段用了同一池,就换成另一个池。
这一节也是「三式一模板」:
| 变量 | 作用 | 关键点 |
|---|---|---|
| 上期实际怪池 | 阶段切换瞬间记下"刚刚实际用的是哪个池" | LockFloat(Update = TriggerOnChange(RiseOnly, 轮转阶段周期)) |
| 连续同怪池计数 | 判断是否连续两阶段同池 | 名字叫"计数",但 JSON 里没有累加,只有 0 / 2 |
| 疲劳转换怪池 | 同池时换到另一个池 | SelectFromArray(Select = 上一阶段表现, Array = [2,0,3,1,4]) |
疲劳转换的映射是固定轮换,可以直接背下来:
| 上一阶段表现 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 换成 | 2 | 0 | 3 | 1 | 4 |
⑤ 改变:最终生效怪池 → 分发
这一步在算什么:把编号展开成 5 套敌人名单,发给所有读取它的地方。
⑤ · 详解:公式与推演
最终生效怪池 的优先级是:
- 生态重置激活 == true → 用 生态重置怪池选择(功能 ⑤ 的强制换池,最高优先级);
- 否则 连续同怪池计数 >= 2 且 上一阶段表现 < 4 → 用 疲劳转换怪池;
- 否则 → 用 当前生效怪池。
最后 Vars.怪池选择 = SelectFromArray(Select = 最终生效怪池, Array = [5 套完整 ED_ 名单]) 把编号变回单位名数组;Pools.EnemyPool 的 Add 直接指向 怪池选择,所以全局原住民虫群也被这个池子接管。
⑤ · 改变:最终生效怪池 与 怪池选择 · 163 行 · 点击展开
// Vars.最终生效怪池 —— 优先级:生态重置覆盖 > 疲劳转换 > 当前生效怪池
{
"Type":"Float",
"Value":{
"Mutate":"If",
"Condition":{"Var":"生态重置激活"},
"Then":{"Var":"生态重置怪池选择"},
"Else":{
"Mutate": "If",
"Condition": {
"Mutate": "And",
"A": {
"Mutate": "IfFloat",
"Value": {"Var": "连续同怪池计数"},
">=": 2,
"Then": true,
"Else": false
},
"B": {
"Mutate": "IfFloat",
"Value": {"Var": "上一阶段表现"},
"<": 4,
"Then": true,
"Else": false
}
},
"Then": {"Var": "疲劳转换怪池"},
"Else": {"Var": "当前生效怪池"}
}
}
}
Vars.怪池选择(5 套完整怪池,逐字原文,共 3970 字符):
// Vars.怪池选择 —— 编号 → 5 套实体 ED_ 名单:[乘胜追击][养虎为患][鱼龙混杂][以战养战]※[最后通牒]※
{
"Type": "Strings",
"Value": {
"Mutate":"SelectFromArray",
"Select":{"Var":"最终生效怪池"},
"Array":[
[
"ED_Spider_Grunt",
"ED_Jelly_Spawn",
"ED_Spider_Swarmer",
"ED_Spider_Grunt_Attacker_Elite",
"ED_Spider_Grunt_Guard_Elite",
"ED_Spider_Tank",
"ED_Spider_Tank_Elite",
"ED_Spider_ShieldTank",
"ED_Spider_Spitter",
"ED_Spider_Buffer",
"ED_Spider_Lobber",
"ED_Spider_ExploderTank_Elite",
"ED_Spring_HydraWeed",
"ED_Spider_Tank_Boss_Weak",
"ED_Spider_Boss_Heavy_Weak",
"ED_Spider_Boss_TwinB_Weak",
"ED_Woodlouse",
"ED_BossBreeder"
],
[
"ED_Spider_Grunt",
"ED_Spider_Swarmer",
"ED_Jelly_Spawn",
"ED_Spider_Grunt_Attacker_Elite",
"ED_Spider_Grunt_Guard_Elite",
"ED_Spider_Tank",
"ED_Spider_Tank_Elite",
"ED_Spider_Exploder",
"ED_Mactera_Shooter_Normal",
"ED_Mactera_TripleShooter_Elite",
"ED_Spider_Shooter_Elite",
"ED_Spider_Stalker",
"ED_Spider_RapidShooter_Elite",
"ED_Bomber_Explosive",
"ED_Spider_ShooterQueen",
"ED_Spider_Boss_TwinA_Weak",
"ED_Spider_Boss_TwinB_Weak",
"ED_StalkerBreeder",
"ED_Summer_TerMinator",
"ED_BossBreeder"
],
[
"ED_Spider_Grunt",
"ED_Spider_Swarmer",
"ED_Jelly_Spawn",
"ED_Spider_Grunt_Attacker_Elite",
"ED_Spider_Grunt_Guard_Elite",
"ED_Spider_Tank",
"ED_Spider_Tank_Elite",
"ED_Spider_ShieldTank",
"ED_Spider_Stalker",
"ED_Spider_RapidShooter_Elite",
"ED_Grabber",
"ED_Spider_Buffer",
"ED_Spider_Stinger",
"ED_Bomber_Explosive",
"ED_Woodlouse",
"ED_Spider_Exploder",
"ED_Spider_Lobber",
"ED_Spider_Spitter",
"ED_Mactera_Shooter_Normal",
"ED_Mactera_TripleShooter_Elite",
"ED_Crawler",
"ED_Spider_Shooter_Elite",
"ED_Spider_Tank_Boss_Weak",
"ED_Spider_Boss_Heavy_Weak",
"ED_Spider_Boss_TwinA_Weak",
"ED_Spider_Boss_TwinB_Weak",
"ED_Spider_ShooterQueen",
"ED_BossBreeder"
],
[
"ED_Spider_Grunt",
"ED_Spider_Swarmer",
"ED_Jelly_Spawn",
"ED_Spider_Grunt_Attacker_Elite",
"ED_Spider_Grunt_Guard_Elite",
"ED_Spider_Tank",
"ED_Spider_Tank_Elite",
"ED_Spider_ShieldTank",
"ED_Spider_Buffer",
"ED_Crawler",
"ED_Bomber_Explosive",
"ED_WardenBreeder",
"ED_Spider_Tank_Boss_Weak",
"ED_Spider_Boss_Heavy_Weak",
"ED_Spider_Boss_TwinB_Weak",
"ED_BossBreeder"
],
[
"ED_Spider_Grunt",
"ED_Spider_Swarmer",
"ED_Jelly_Spawn",
"ED_Spider_Grunt_Attacker_Elite",
"ED_Spider_Grunt_Guard_Elite",
"ED_Spider_Tank",
"ED_Spider_Tank_Elite",
"ED_Spider_ShieldTank",
"ED_Spider_Stalker",
"ED_Spider_RapidShooter_Elite",
"ED_Grabber",
"ED_Spider_Buffer",
"ED_Spider_Stinger",
"ED_Bomber_Explosive",
"ED_Woodlouse",
"ED_Spider_Exploder",
"ED_Spider_Lobber",
"ED_Spider_Spitter",
"ED_Mactera_Shooter_Normal",
"ED_Mactera_TripleShooter_Elite",
"ED_Spider_Shooter_Elite",
"ED_Spider_Tank_Boss_Weak",
"ED_Spider_Boss_Heavy_Weak",
"ED_Spider_Boss_TwinA_Weak",
"ED_Spider_Boss_TwinB_Weak",
"ED_Spider_ShooterQueen",
"ED_BossBreeder"
]
]
}
}⑤ · 分发:全局敌人池 · 6 行 · 点击展开
// Pools.EnemyPool —— 全局原住民敌人池 = 清空后直接加入"怪池选择"
{
"Clear": true,
"Add": {"Var": "怪池选择"},
"Remove": []
}⑥ 并行评价:玩家阶段表现等级评估
这一步在算什么:同一套评级也是功能 ④ 的主角,这里只补它另外三个下游。
⑥ · 另一套并行评价:玩家阶段表现等级 · 143 行 · 点击展开
// Vars.玩家阶段表现等级评估 —— Sequence[0..6] 阶梯,InitialOffset 3;好表现→Next,差表现→Previous,阶段切换 Reset
{
"Type":"Float",
"Value":{
"Mutate":"Sequence",
"Sequence":[0,1,2,3,4,5,6],
"InitialOffset": 3,
"Reset":{
"Mutate":"TriggerDelay",
"N": 3,
"In":{"Var":"轮转阶段周期Boolean"}
},
"Repeat": false,
"Next":{
"Mutate":"Or",
"A":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"每分钟击杀量"},
">=": 180,
"Then": true,
"Else": false
}
}
},
"B":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{"Var":"硝石采集效率判定"}
}
},
"C":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"And",
"A":{
"Mutate":"IfFloat",
"Value":{"Var":"1分钟内倒人数量"},
"<=": 3,
"Then": true,
"Else": false
},
"B":{
"Mutate":"IfFloat",
"Value":{
"Mutate":"StopWatch",
"Enable":true,
"Reset":{"Mutate":"TriggerTimer","N":60}
},
">=": 58,
"Then": true,
"Else": false
}
}
}
}
},
"Previous":{
"Mutate":"Or",
"A":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"And",
"A":{
"Mutate":"IfFloat",
"Value":{"Var":"每分钟击杀量"},
"<": 90,
"Then": true,
"Else": false
},
"B":{
"Mutate":"IfFloat",
"Value":{
"Mutate":"StopWatch",
"Enable":true,
"Reset":{"Mutate":"TriggerTimer","N":61}
},
">=": 60,
"Then": true,
"Else": false
}
}
}
},
"B":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"救援队友速度"},
">=": 20,
"Then": true,
"Else": false
}
}
},
"C":{
"Mutate":"TriggerOnce",
"Reset":{"Var":"轮转阶段周期Boolean"},
"In":{
"Mutate":"TriggerFixedDuration",
"N": 1,
"In":{
"Mutate":"IfFloat",
"Value":{"Var":"1分钟内倒人数量"},
">=": 6,
"Then": true,
"Else": false
}
}
}
}
}
}
// Vars.玩家阶段表现锁定 —— 阶段切换时锁存评级(0~6),供奖励/加成/阶段评级使用
{
"Type":"Float",
"Value":{
"Mutate":"LockFloat",
"Value":{"Var":"玩家阶段表现等级评估"},
"Update":{"Var":"轮转阶段周期Boolean"}
}
}⑦ 附录:判断链用到的底层指标
这一步在算什么:前面那些统计量,原始数据从哪来。
⑦ · 附录:判断链用到的底层指标 · 293 行 · 点击展开
// Vars.团队状态评估 —— Min(钢铁与倒地权重+血量与护盾权重+弹药×0.2, 三倒以上则0.20)
{
"Type":"Float",
"Value":{
"Mutate": "Min",
"Values":[
{
"Mutate": "Add",
"A": {"Var":"钢铁与倒地权重"},
"B": {
"Mutate": "Add",
"A": {"Var":"血量与护盾权重"},
"B": {
"Mutate": "Multiply",
"A": {"Mutate": "DwarvesAmmo"},
"B": 0.2
}
}
},
{
"Mutate": "IfFloat",
"Value": {
"Mutate": "Subtract",
"A": {"Mutate": "DwarvesDown"},
"B": {
"Mutate": "Min",
"Values": [
{"Mutate": "IWsLeft"},
2
]
}
},
">=": 3,
"Then": 0.20,
"Else": 1.0
}
]
}
}
// Vars.钢铁与倒地权重 —— 倒地人数(扣掉铁票)查表 [0.45,0.2,0.05,0,0]
{
"Type":"Float",
"Value":{
"Mutate": "SelectFromArray",
"Select": {
"Mutate": "Clamp",
"Value": {
"Mutate": "Subtract",
"A": { "Mutate": "DwarvesDown" },
"B": {
"Mutate": "Min",
"Values": [
{"Mutate":"IWsLeft"},
2
]
}
},
"Min": 0,
"Max": 4
},
"Array": [0.45, 0.2, 0.05, 0, 0]
}
}
// Vars.血量与护盾权重 —— 全队血量(按护盾比例封顶) × 0.35
{
"Type":"Float",
"Value":{
"Mutate": "Multiply",
"A": {
"Mutate": "IfFloat",
"Value": {"Mutate": "DwarvesDown"},
">": 0,
"Then": {"Mutate": "DwarvesHealth"},
"Else": {
"Mutate": "IfFloat",
"Value": {"Mutate": "DwarvesShield"},
">=": 0.4,
"Then": {
"Mutate":"IfFloat",
"Value":{"Mutate":"DwarvesHealth"},
">": 0.6,
"Then": 0.6,
"Else": {"Mutate":"DwarvesHealth"}
},
"Else": {
"Mutate": "IfFloat",
"Value": {"Mutate": "DwarvesShield"},
">=": 0.2,
"Then": {
"Mutate":"IfFloat",
"Value":{"Mutate":"DwarvesHealth"},
">": 0.3,
"Then": 0.3,
"Else": {"Mutate":"DwarvesHealth"}
},
"Else": {"Mutate": "DwarvesHealth"}
}
}
},
"B": 0.35
}
}
// Vars.战斗有效死亡加权计算 —— 倒地/铁票变化的加权累计(被"本阶段死亡率"差分)
{
"Type":"Float",
"Value":{
"Mutate":"Clamp",
"Value":{
"Mutate":"Accumulate",
"Initial": 0,
"Value":{
"Mutate":"Add",
"A":{
"Mutate":"Multiply",
"A":{
"Mutate":"Delta",
"Value":{"Mutate":"DwarvesDowns"}
},
"B":{
"Mutate":"SelectFromArray",
"Select":{"Mutate": "IWsLeft"},
"Array":[0.20, 0.16, 0.13, 0.10, 0.08]
}
},
"B":{
"Mutate":"Multiply",
"A":{
"Mutate":"Delta",
"Value":{"Mutate":"IWsLeft"}
},
"B":{
"Mutate":"SelectFromArray",
"Select":{"Mutate": "IWsLeft"},
"Array":[0.35,0.3,0.25,0.2,0]
},
"C": -1
}
}
}
}
}
// Vars.资源采集量 —— 硝石存入量/100 + 黄金存入量×0.03 的累计
{
"Type": "Float",
"Value": {
"Mutate": "Accumulate",
"Initial": 0,
"Value": {
"Mutate": "Add",
"A": {
"Mutate": "Divide",
"A": {
"Mutate": "Max",
"Values":[
0,
{
"Mutate": "Delta",
"Value": {
"Mutate": "DepositedResource",
"Resource": "Nitra"
}
}
]
},
"B": 100
},
"B": {
"Mutate": "Multiply",
"A": {
"Mutate": "Delta",
"Value": {
"Mutate": "DepositedResource",
"Resource": "Gold"
}
},
"B": 0.03
}
}
}
}
// Vars.每分钟击杀量 —— 60s 滚动窗口击杀数(供表现等级评估用)
{
"Type":"Float",
"Value":{
"Mutate":"Subtract",
"A":{"Mutate":"EnemiesKilled"},
"B":{
"Mutate":"LockFloat",
"Update":{
"Mutate":"IfFloat",
"Value":{
"Mutate":"StopWatch",
"Enable":true,
"Reset":{"Mutate":"TriggerTimer","N": 62}
},
">=": 60,
"Then": true,
"Else": false
},
"Value":{"Mutate":"EnemiesKilled"}
}
}
}
// Vars.1分钟内倒人数量 —— 60s 滚动窗口倒地次数(供表现等级评估用)
{
"Type":"Float",
"Value":{
"Mutate":"Subtract",
"A":{"Mutate":"DwarvesDowns"},
"B":{
"Mutate":"LockFloat",
"Value":{"Mutate":"DwarvesDowns"},
"Update":{
"Mutate":"TriggerTimer",
"N": 60
}
}
}
}
// Vars.硝石采集量 —— 硝石存量增量累计
{
"Type":"Float",
"Value":{
"Mutate":"Accumulate",
"Initial": 0,
"Value":{
"Mutate":"Max",
"Values":[
0,
{
"Mutate":"Delta",
"Value":{"Var":"硝石存量"}
}
]
},
"Min": 0,
"Max": 9999
}
}
// Vars.60s内硝石采集量 —— 硝石采集量的 60s 增量
{
"Type":"Float",
"Value":{
"Mutate":"Subtract",
"A":{"Var":"硝石采集量"},
"B":{
"Mutate":"LockFloat",
"Value":{"Var":"硝石采集量"},
"Update":{
"Mutate":"TriggerTimer",
"N": 60
}
}
}
}
// Vars.硝石采集效率判定 —— 60s 内采集硝石 >= 120
{
"Type":"Boolean",
"Value":{
"Mutate":"IfFloat",
"Value":{"Var":"60s内硝石采集量"},
">=": 120,
"Then": true,
"Else": false
}
}
// Vars.救援队友速度 —— 有人倒地时 0.5/s 累积(上限30),无人倒地时 -10/s
{
"Type":"Float",
"Value":{
"Mutate":"Accumulate",
"Initial": 0,
"Value":{
"Mutate":"IfFloat",
"Value":{"Mutate":"DwarvesDown"},
">": 0,
"Then": 0.5,
"Else": -10
},
"Min": 0,
"Max": 30
}
}⑥ · 附:33 处引用清单
源文件里 最终生效怪池 共出现 34 次:1 次是 Vars 里的定义键名,其余 33 处为引用,分布在 Enemies(7) / WaveSpawners(7) / Vars(13) / Messages(6) 四个区块。
| 位置 | 用途 |
|---|---|
| Enemies「ED_Spider_Tank_Boss_Weak」→ MaxSpawnCount.Select | 弱化版 Boss 坦克的场上最大数量按池取 [1,1,2,2,2] |
| Enemies「ED_Spider_Boss_Heavy_Weak」→ Rarity.Select | 弱化版重装无畏的刷新权重按池取 [35,0,40,40,40](池1 为 0 = 不刷) |
| Enemies「ED_Spider_Boss_TwinA_Weak」→ MaxSpawnCount.Select | 弱化版强弩无畏数量按池取 [0,2,1,0,1] |
| Enemies「ED_Spider_Boss_TwinA_Weak」→ Rarity.Select | 弱化版强弩无畏权重按池取 [0,35,30,0,30] |
| Enemies「ED_Spider_Boss_TwinB_Weak」→ MaxSpawnCount.Select | 弱化版重斧无畏数量按池取 [1,2,2,2,1] |
| Enemies「ED_Spider_Boss_TwinA_M」→ MaxSpawnCount.Select | 双子变异体(强弩)数量按池取 [3,1,1,1,2] |
| Enemies「ED_Spider_Boss_TwinB_O」→ MaxSpawnCount.Select | 双子变异体(重斧)数量按池取 [3,1,1,1,2] |
| WaveSpawners[4]「阶段信息显示 + 切换阶段计时」→ Enemies.Select | 每阶段刷 1 只"阶段标记单位",名单 [ED_Phase·1 … ED_Phase·5] 按池索引取 |
| WaveSpawners[5]「生态扰动-Boss恒压」→ Difficulty.Select | Boss 恒压强度按池取 [1600,1100,1000,900,1300] |
| WaveSpawners[5]「生态扰动-Boss恒压」→ Enemies.Select | Boss 恒压的具体 Boss 名单按池切换 |
| WaveSpawners[9]「搜救行动·自然潮补偿」→ Difficulty.Min/Max.Select | 自然潮难度区间按池取 [4000..]/[4200..](两处引用) |
| WaveSpawners[10]「搜救任务·人工自然潮」→ Difficulty.Min/Max.Select | 人工自然潮难度区间按池取 [4000..]/[4200..](两处引用) |
| Vars「乘胜追击」→ Value.Select | 只有池 0 与池 4 才把 乘胜追击·狂暴增益 × 小猪·乘胜追击 乘进敌人属性,其余池为常量 1 |
| Vars「乘胜追击·基础加成」→ Value.Select | 同上,按池决定基础加成是否生效 |
| Vars「乘胜追击·基础加成」→ Value.Array[0]/[4].Next.Enable.Value | 数组第 0/4 项内部再用 IfFloat(最终生效怪池 == 0 / == 4) 控制 2.5s 递增计时器(两处引用) |
| Vars「养虎为患·小单位」→ Value.Value.A.Select | 按池取 [-1,0.00125,-1,-1,0.00125]:只有池 1、池 4 允许小单位成长(−1 = 抑制) |
| Vars「养虎为患·小单位进化」→ Value.Condition.A/B.Value | 按池判断 ==1 / ==4,决定小单位是否进化(两处引用) |
| Vars「养虎为患·Boss单位」→ Value.Value.A.Select | 按池取 [-1,0.00083333,-1,-1,0.00083333]:只有池 1、池 4 允许 Boss 单位成长 |
| Vars「养虎为患·伤害加成」→ Value.Value.A.Select | 按池取 [-1,0.0079166,-1,-1,0.0079166]:只有池 1、池 4 累积伤害加成 |
| Vars「以战养战」→ Value.Select | 只有池 3、池 4 才把 以战养战·激烈加成 × 小猪·以战养战 乘进敌人属性 |
| Vars「怪池选择」→ Value.Select | 核心:编号 → 5 套实体 ED_… 名单 |
| Vars「自然潮点数Min」→ Value.A.Select | 自然潮点数下限按池取 [4000,4500,6200,3800,6200] |
| Vars「自然潮点数Max」→ Value.A.Select | 自然潮点数上限按池取 [4200,4700,6400,4000,6400] |
| Messages[7]【乘胜追击】→ SendOnChange.Select | 播报开关按池取 [true,false,false,false,true](只在池 0/4 播) |
| Messages[8]【养虎为患】→ Send.B.Select | 播报开关按池取 [false,true,false,false,true](只在池 1/4 播) |
| Messages[9]【养虎为患】→ Send.B.Select | 同上(伤害系数 +30% 档) |
| Messages[11]>> 物竞天择 << → Message.Values[1].Select | 播报当前池名 [乘胜追击][养虎为患][鱼龙混杂][以战养战]※[最后通牒]※(本报告池名映射的依据) |
| Messages[11]→ Send.B.A.Value | IfFloat(最终生效怪池 == 4):最后通牒时不重复播报 |
| Messages[16]→ Message.Values[1].Select | 生态重置播报里回显"已经重置为哪个池" |
附:Pools.EnemyPool.Add = {"Var":"怪池选择"} 属于间接引用(怪池选择 的上游就是 最终生效怪池),所以全局原住民虫群、Enemies 条目的权重/数量、Boss 恒压名单、自然潮点数、奖励强度、播报文案全都被同一个编号驱动。