Flow、Operator、Intent 与 Event 节点
GCS · Built-In Node Library
Flow 节点决定执行流向。Operator 节点计算、比较、过滤和选取值。Intent 模式、事件触发和 Group 补齐这一套。
面向在入口和最终 Action 之间搭建逻辑的图作者。本页覆盖 Add Node 菜单的 Flow、Operator、Intent、Event 和 Group 五个组。它们放在一起,是因为这些节点都不直接改变战斗状态。它们只负责路由执行或转换数值,并把结果交给 Action 节点。
Rapid Fire 在一张小图里同时使用了两类节点。Loop 是 Flow 节点:让循环体运行四次。Random Elements 是 Operator:每一轮从 All Enemies 集合里挑一个敌人,作为目标传给 Deal Damage。

Flow 节点
| 节点 | 用途 | 输入与设置 | 输出 | 常见搭配 | 何时避免 |
|---|---|---|---|---|---|
| Sequence | 按顺序运行多个控制输出 | Outputs | Step0、Step1,按数量递增 | 多段式卡牌效果 | 后面的步骤依赖条件;用 Branch 或 Switch |
| Branch | 走 True 或 False 路径 | Condition | True、False | Condition、Logic、Hook | 需要两个以上的结果;用 Switch |
| Switch | 按整数或字符串 case 路由 | Kind、CaseValues、输入 On | 每个 case 一个输出,外加 Default | 卡牌类型、队伍、意图、回合数 | 是/否条件就够了;用 Branch |
| Gate | 仅在允许时继续 | Allow | Out | 可选效果、守卫条件 | 需要单独的 false 路径行为;用 Branch |
| Loop | 固定次数运行循环体 | Count | Body、Done、Index | 重复伤害、重复抽牌、缩放效果 | 想对集合的每个元素跑一遍;用 Foreach |
| Foreach | 对集合的每个元素运行一次 | Kind、输入 Collection | Body、Done、Index、Element(当前元素) | 逐目标表现、逐卡处理 | 集合型动作一步就能做完同样的事 |
| While | 条件为 true 时持续运行 | Condition | Body、Done | 有明确停止条件的少见脚本逻辑 | 次数已知;用 Loop |
| Wait | 延迟表现流程 | Mode(Seconds 或 Animation)、Seconds、AnimationId | Out | VFX 时机、动画节拍 | 玩法状态必须等一个可靠的异步结果 |
| Delayed Trigger | 把行为安排到之后的回合阶段 | DelayTurns、TickPhase、CancelOnSourceDeath | Body、Done | 延迟状态效果、倒计时攻击 | 效果就该在当前执行路径里发生 |
| Choice | 让玩家从集合中选择 | Kind、Prompt、Count、Mode、AllowSkip | OnChosen、Skipped | 抓取、选牌、选目标机制 | 选择可以自动决定 |
数字与布尔 Operator
| 节点 | 用途 | 输入与设置 | 输出 | 常见搭配 | 何时避免 |
|---|---|---|---|---|---|
| Math Binary | 组合两个数字 | Kind、A、B、Op(Add/Sub/Mul/Div/Mod/Min/Max/Pow) | Result | 伤害缩放、费用变化、Hook 写入 | 只是清理一个数字;用 Math Unary 或 Clamp |
| Math Unary | 变换一个数字 | Kind、A、Op(Neg/Abs/Sign/Sqrt/Floor/Ceil/Round) | Result | 取整、绝对值、符号 | 涉及两个输入;用 Math Binary |
| Clamp | 把数字限制在最小值和最大值之间 | Kind、Value、Min、Max | Result | 防止负伤害、给缩放封顶 | 值本来就该超出范围 |
| Condition | 比较两个值 | A、B、Op(Greater/GreaterEqual/Less/LessEqual/Equal/NotEqual/In) | Result | Branch、Gate、Hook 规则 | 比较的是对象身份;用 Ref Equal |
| Logic | 组合布尔值 | A、B、Op(And/Or/Xor/Not) | Result | 复合分支规则 | 一个 Condition 已经能表达规则 |
| Ref Equal | 检查两个引用是否为同一个对象 | A、B、Op(Equal 或 NotEqual) | Result | "是不是这张卡/这个单位/这个状态实例"的检查 | 比较的是文本、数字、标签或分类;用 Condition |
| Convert | 把值转换成 Int、Float、Bool 或 String | A、To | Result | 事件参数、文本与数字之间的桥接 | 来源已经输出需要的类型 |
| Select | 按条件在两个值中二选一 | Condition、IfTrue、IfFalse、Kind | Result | 内联兜底值、Hook 计算 | 不同路径需要不同副作用;用 Branch |
| Constant | 提供固定值,或数据库支持的下拉选项 | Kind、值字段、可选实体字段 | Result | 复用的常量、下拉式卡牌/状态/标签值 | 值直接写在消费节点的字段上更清楚 |
| Random | 产生随机值 | Kind、Min、Max、Probability | Result | 概率分支、随机缩放 | 要从集合里随机选元素;用 Random Elements |
集合 Operator
| 节点 | 用途 | 输入与设置 | 输出 | 常见搭配 | 何时避免 |
|---|---|---|---|---|---|
| Count | 统计单位、卡牌或状态集合 | Kind、输入 Collection | Result | 连击缩放、手牌数检查 | 只关心是否为空;用 Is Empty |
| Is Empty | 检查集合是否为空 | Kind、输入 Collection | Result | Branch、兜底效果 | 需要具体数量 |
| Filter | 保留符合可见条件的条目 | Kind、单位/卡牌/状态各自的过滤字段 | Result | All Enemies、Card Piles、状态集合 | 已有更精确的来源可以直接用 |
| Contains | 检查集合是否包含特定条目 | Kind、Collection、Value | Result | 守卫、成员判断 | 比较的是标签这类分类;用 Condition 或 Filter |
| Take | 保留顶部或底部 N 个条目 | Kind、Count、From | Result | 有序牌堆、已排序集合 | 想要随机选取;用 Random Elements |
| Pick Element | 取第一个、最后一个或指定下标的元素 | Kind、By、Index | 被选中的元素 | 过滤后的单目标动作 | 动作应该作用于每个元素 |
| Random Elements | 不放回地随机选取条目 | Kind、Count、输入 Collection | Result | 随机目标卡或敌人 | 要的是加权敌人意图;用 Weighted Random Pattern |
| Shuffle | 打乱集合顺序 | Kind、输入 Collection | Result | 从临时列表随机抽取 | 指的是运行时抽牌堆;用 Shuffle Draw Pile |
| Sort | 排序集合 | Kind、单位/卡牌/状态排序字段、Order | Result | 最低 HP 目标、最高费用卡 | 来源顺序本身有意义 |
| Exclude | 从一个集合中剔除另一个集合的条目 | Kind、源集合、剔除集合 | Result | "除目标外的所有敌人"效果 | 普通 Filter 就能表达规则 |
| Merge Collections | 合并两个集合 | Kind、两个集合输入 | Result | 多来源目标集 | 必须去重;合并后再过滤或剔除 |
| Make Collection | 用单独的槽位拼一个集合 | Kind、SlotCount、槽位输入 | Result | 手工挑选的目标集 | 某个选择器已经返回了集合 |
Filter 的字段是面向玩家的条件,不是代码。单位过滤覆盖队伍、标签、层级、状态、HP 高于或低于某值、是否存活。卡牌过滤覆盖类型、稀有度、关键字、标签、费用高于或低于某值。状态过滤覆盖类型和标签。
Intent 节点
Intent 节点只在敌人图里有意义。模式节点决定敌人预告哪一种行动;每个 Leaf Intent 挂着预览图标和敌人回合实际执行的行为。
| 节点 | 用途 | 输入与设置 | 输出 | 常见搭配 | 何时避免 |
|---|---|---|---|---|---|
| Leaf Intent | 声明一个预览意图并运行它的行为 | Intent | Out、Intent、Target | 顺序、阈值或随机模式 | 节点需要在子分支之间做选择;用模式节点 |
| Sequence Pattern | 按固定顺序选择意图分支 | RepeatCounts | 各步骤分支 | 行动可预测的敌人 | 阶段型敌人;用 HP Threshold Pattern |
| HP Threshold Pattern | 按当前 HP 百分比选择分支 | Thresholds | 阈值分支加默认分支 | Boss 阶段切换 | 行为应该随机 |
| Weighted Random Pattern | 按权重选择分支 | Weights | 加权分支 | 行动难以预测的敌人 | 套路必须可读且固定 |
| Once Per Battle | Body 只运行一次,之后始终走 Done | 无 | Body、Done | 一次性 Boss 招式 | 应该按节奏重复;用 Every N Turns |
| Every N Turns | 每 N 回合运行一次 Body | N | Body、Done | 周期性敌人行动 | 应该只触发一次;用 Once Per Battle |
demo 敌人 Mire Reaper 把这套模式词汇装进了同一张图。On Enemy Behavior Start 接入一个 HP Threshold Pattern,HP 跌破阈值后敌人切换到另一套打法。每套打法是一个 Weighted Random Pattern,在多个 Leaf Intent 之间掷骰,每个叶子再串上这手预告招式要执行的 Action 和 FX 节点:

Event 与 Group 节点
| 节点 | 用途 | 输入与设置 | 输出 | 常见搭配 | 何时避免 |
|---|---|---|---|---|---|
| Raise Internal Event | 发送带可选参数的命名 GCS 事件 | EventName、参数绑定 | 无 | On Internal Event、Event Arg | 直接拉一根控制线更简单 |
| Raise GES Event | 发送 Game Event System 事件 | GES 事件 GUID、参数的类型/来源/值、发送者的类型/来源/值 | 无 | On GES Event、使用 GES 的项目 | 没有安装 GES 桥 |
| Group | 把可复用图逻辑包在暴露端口后面 | GroupName、Body、ExposedParams | Group 暴露的端口 | 重复出现的图片段 | 逻辑只跑一次,分组反而藏住了它 |
可读性规则
图被阅读的次数通常多于被编辑的次数。把设计意图对应到标准结构:
| 图想说的是…… | 优先用 |
|---|---|
| "如果这是真的,就做这个。" | Condition → Branch |
| "对每个选中的目标做这件事。" | 集合来源 → Foreach |
| "从几个命名 case 里选一个。" | Switch |
| "先算出一个数字,再应用它。" | 数学节点 → Action 的输入端口 |
| "改掉某个 Hook 的值。" | Hook 入口 → Operator → Write Hook |
| "敌人预告一手行动。" | Intent 模式 → Leaf Intent |