跳到主要内容

目标与选择

GCS · Core Concepts

目标选择由三部分组成:卡牌文本承诺什么、玩家选中什么、FlowGraph 在运行时解析出什么。本页定义这些语义。

适用于创作任何涉及“选中的敌人”“所有敌人”“随机卡牌”等目标或集合的效果。

当有效目标不止一个时,目标选择会直接影响结算结果。例如多个敌人同时在场时,每张卡牌都必须明确自己的目标来源:

Coven of Wax 战斗,三个敌人各自在头顶预告自己的意图

目标选择连接卡牌文本、玩家输入和 FlowGraph 结算。卡牌文本、字段和节点名称应使用一致词汇,避免用户误解目标范围。

卡牌目标模式

卡牌目标模式描述玩家输入:卡牌离开手牌前,玩家是否需要选择目标。四个模式中只有 SingleEnemyUnit 需要点击目标。

模式需要点击?实际发生什么
None这张牌不带选中目标直接打出,目标完全由图中的单位来源和卡牌来源决定
SingleEnemyUnit玩家必须先选中一个存活敌人,牌才能打出。被点中的敌人成为选中目标,图通过 Opponent 读到它
AllEnemyUnits这张牌对准所有存活敌人。图里配合使用 AllEnemies,节点命中的集合才和玩家预期一致
Self这张牌对准玩家单位。图里配合使用 Self

在代码中,GCSApi.RequiresTarget 只对 SingleEnemyUnit 返回 true。拖拽指向 UI 可使用该判断决定是否显示瞄准箭头。

卡牌目标模式描述玩家输入;FlowGraph 目标来源描述节点运行时解析出的目标。两者需要配合:一张 SingleEnemyUnit 卡牌在图中使用 Opponent 时,会命中玩家选中的敌人。常见错误是把 AllEnemyUnits 卡牌的伤害节点仍指向 Opponent,导致卡牌文本像 AoE,结算时却只命中一个敌人。


单位来源

作用于单位的节点使用 UnitSource。解析规则是精确的,所以卡牌文本可以做出精确的承诺:

来源解析结果
Self正在运行这张图的单位:玩家卡牌上是玩家,状态上是持有者,敌人行为图上是正在行动的敌人
Opponent行动方是玩家时(玩家卡牌,或玩家持有的状态):如果这张牌点选过目标且它还活着,就是那个被点中的敌人;否则是第一个存活敌人。行动方是敌人时:玩家单位
AllEnemies所有存活敌人。死亡敌人一律排除
AllUnits玩家单位加所有存活敌人。死亡单位同样排除

格挡、治疗、自身 buff 使用 Self。定向攻击中选中的敌人使用 Opponent。AoE 卡牌使用 AllEnemies

Target 端口优先于下拉框

节点的 Target 端口接上连线后,单位由连线提供,TargetSource 下拉框会被忽略。常规情况使用下拉框;端口用于接收选择器链计算出的目标。


卡牌来源

作用于卡牌的节点使用 CardSource

来源含义
ThisCard当前正在结算的卡牌实例
HandPile当前手牌
DrawPile抽牌堆
DiscardPile弃牌堆
ExhaustPile消耗(exhaust)堆
AllPiles四个战斗牌堆合在一起:手牌、抽牌堆、弃牌堆、消耗堆

卡牌文本需要准确区分来源。"抽牌堆"不等于"所有卡牌";"手牌"指节点运行时的手牌,包括同一回合内较早抽到的牌。


选择器节点

当目标由作者规则决定,而不是由玩家点击决定时,用选择器缩小集合。Filter 保留匹配元素(语义是"过滤出",不是"过滤掉"),Sort 排序,Pick ElementTakeRandom Elements 将集合缩减为需要的元素。典型搭法:

  • HP 最低的敌人:All EnemiesFilter(Alive)接 Sort(HP)接 Pick Element
  • 手牌中随机两张:手牌集合接 Random Elements,数量设 2;
  • 按类型、稀有度、关键词、标签或费用阈值过滤卡牌;
  • 按阵营、标签、阶级、携带的状态、HP 百分比或存活状态过滤单位

由图决定目标时使用选择器;由玩家决定目标时使用卡牌目标模式。


没有有效目标

内置动作节点遇到空目标时会跳过执行。每个节点先解析自己的目标,排除死亡或缺失单位,然后对剩余目标继续执行;如果没有剩余目标,则不产生效果。一个指向 AllEnemiesDeal Damage 在没有存活敌人时不会造成伤害,也不会阻塞战斗。

“无目标则跳过并继续”是默认行为。但当空目标情况会影响玩家理解时,应显式处理条件,不要依赖静默跳过:

  • 在动作前接 Condition,走 BranchGate
  • 写进卡牌文本("如果存在有效敌人……");
  • 设计备用行为,避免依赖节点的静默跳过。

文本写法建议

用玩法语言写卡牌描述,不要用来源枚举语言:

推荐写法避免写法
对选中的敌人造成 8 点伤害Deal 8 to Opponent.
获得 6 点护甲Apply armor to Self.
从你的抽牌堆抽 2 张牌Move 2 card refs.
对所有敌人施加 2 层 BurnAdd status to unit collection.

实现层可以使用 UnitSourceCardSource 和选择器。卡牌文本只描述玩家实际体验到的效果。