案例拆解 · 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 秒的开关★★
③ 锁血把回血上限钉在当前血量上★★★
④ 阶段评级 → 三种啤酒每阶段发一次奖★★★★
⑤ 生态重置兜底救援 · 是/否选择★★★★★
⑥ 物竞天择判断玩家水平 → 决定怪池 → 避免连续同怪池★★★★★★

阅读前需要知道的事

  1. 六个功能按「由浅入深」排列,不是按在难度里的重要性排的。 顺序是 ① 硝石经济 → ② 勘探者无人机 → ③ 锁血 → ④ 阶段评级与三种啤酒 → ⑤ 生态重置 → ⑥ 物竞天择(难度见上面的功能索引表)。前四个是单个原语的用法,后两个是把很多原语拼成一套系统。
  2. ② 和 ③ 共用同一个开关(Vars.医疗无人机):② 用它开回血与减伤,③ 用它锁血。不是两个无人机,是一个变量的两组下游——这本身就是一个要学的点(见 ③ 的第 4 步)。
  3. 两套互不干扰的评价系统:⑥ 选怪池用的是三条布尔判定(有效 KPM / 死亡率 / 资源采集量);④ 的阶段评级用的是 Sequence 阶梯 + 锁存。两者分开,别混。
  4. 编号即池名(⑥ 用):怪池用 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 / _lobber5
ED_Nitra-Goldbug8
ED_HydraWeed、ED_Spring_HydraWeed15
五种勘探者(功能 ② 的那五个 ED)20
ED_Glyphid_Nitra_ExploderKing30
② · 详解:公式与推演

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 包住,只给一次)
BSecondaryFinished
次要任务完成
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))。

① · 详解:公式与推演

Max(0.7, LockFloat(Lock = 医疗无人机, Value = DwarvesHealth)),两个输入、一次运算。用 Max 而不是 Clamp 或 If,是把「下限 70%」与「保持当前血量」合并成一次运算,既不写分支,也不需要按血量变化重算。

① · 核心公式与开关:锁血 + 医疗无 · 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 半径)
换池 150sWaveSpawners[2]「生态重置持续时间」TriggerFixedDuration 1.5s in 生态重置激活:激活后 1.5 秒窗口内启用该刷怪条目,刷出 ED_Phase·Special(显示名「【生态重置】已激活」,全抗性 0、Heal:-10 的标记单位)
25s
无敌
Vars.伤害抑制因子TriggerFixedDuration 25 in 生态重置激活 → 因子取 0,被 敌人伤害.G、环境伤害.B、友军伤害.B、摔落伤害.C 相乘
免费补给 +1Vars.免费补给次数Next.D = TriggerFixedDuration 1s in 生态重置激活
复活次数 +1Vars.满血复活次数Next.B = TriggerFixedDuration 0.5s in 生态重置激活
停潮 60sVars.火把-TorchNot(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":"生态重置激活"}
      }
    }
⑤ · 附:是/否的实现
  1. 生: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)。
  2. 辨:靠 Materials 的第二项提示灯区分——是 = M_Uplink_Light_Green_Blink_Off(绿),否 = M_Uplink_Light_Red_Blink_Off(红)。
  3. 选:没有 UI 菜单。判定条件是 TriggerOnChange(RiseOnly, EnemiesKilled ED=ED_Yes / ED_No),即 "哪一只单位的死亡计数上升"就代表选了哪一边:
    - 上升的是 ED_Yes → 生态重置激活 的 Value 触发 → 真 150 秒 → 执行重置;
    - 上升的是 ED_No → Lock 触发 → 把该布尔锁 166 秒 → 否决。
  4. 收尾:ED_Yes 的 Heal 是 {InitialRate:0, SwitchAfter:6, FinalRate:-10000},出生 6 秒后自动掉血自毁(避免场上一直留着没被选的石头);ED_No 的 Heal 是条件式——一旦"是"被击杀且持续 5 秒,ED_No 也开始 -1000/s 自毁。两者都会自己消失,不留残余单位。
  5. 超时(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",类型前缀 + 点号路径,指向游戏底层的具体属性。
自毁是否计入 EnemiesKilledED_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])

疲劳转换的映射是固定轮换,可以直接背下来:

上一阶段表现01234
换成20314

⑤ 改变:最终生效怪池 → 分发

这一步在算什么:把编号展开成 5 套敌人名单,发给所有读取它的地方。

⑤ · 详解:公式与推演

最终生效怪池 的优先级是:

  1. 生态重置激活 == true → 用 生态重置怪池选择(功能 ⑤ 的强制换池,最高优先级);
  2. 否则 连续同怪池计数 >= 2 且 上一阶段表现 < 4 → 用 疲劳转换怪池;
  3. 否则 → 用 当前生效怪池。

最后 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.SelectBoss 恒压强度按池取 [1600,1100,1000,900,1300]
WaveSpawners[5]「生态扰动-Boss恒压」→ Enemies.SelectBoss 恒压的具体 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.ValueIfFloat(最终生效怪池 == 4):最后通牒时不重复播报
Messages[16]→ Message.Values[1].Select生态重置播报里回显"已经重置为哪个池"

附:Pools.EnemyPool.Add = {"Var":"怪池选择"} 属于间接引用(怪池选择 的上游就是 最终生效怪池),所以全局原住民虫群、Enemies 条目的权重/数量、Boss 恒压名单、自然潮点数、奖励强度、播报文案全都被同一个编号驱动。