目标选择
先确定玩家怎样选择目标,再让 Behavior 使用同一对象或集合完成实际结算
卡牌上的 Target 决定出牌交互,Behavior 中的目标来源决定 Action 实际影响谁,两者必须表达同一范围,否则卡牌可能允许玩家选择一个目标,却在结算时影响另一个对象
Card Target 决定玩家输入
| Target | 玩家操作 | Behavior 的常见目标来源 |
|---|---|---|
None | 不选择单位 | Behavior 自行决定单位、卡牌或无目标规则 |
Single Enemy | 选择一个存活敌人 | Opponent 读取玩家已提交的敌人 |
All Enemies | 不选择单位 | AllOpponents 解析卡牌 Host 对方阵营的全部存活单位 |
Self | 不选择单位 | Self 解析打出这张卡牌的角色 |
Single Ally | 选择一名存活队友,可以选择自己 | Target 读取玩家已提交的队友 |
Other Ally | 选择一名自己以外的存活队友 | Target 读取玩家已提交的队友 |
All Allies | 不选择单位 | AllAllies 解析来源角色一方的全部存活单位 |
Random Ally | 不选择单位 | 运行时从玩家队伍中随机确定一名存活成员,Behavior 通过已提交目标读取结果 |
Random Opponent | 不选择单位 | 运行时从来源角色的对方阵营随机确定一名存活单位,Behavior 通过已提交目标读取结果 |
Any Unit | 选择任意存活玩家或敌人 | Target 读取已提交单位,不限制双方阵营 |
Single Enemy、Single Ally、Other Ally 与 Any Unit 会在提交前显示瞄准箭头和合法单位高亮,其他目标模式由运行时直接确定范围

上图中的卡牌仍处于目标选择阶段,只有玩家点击合法敌人后才会提交出牌,Behavior 使用 Opponent 时会读取这次选择;队友单选与 Any Unit 沿用同一条输入链路并通过 Target 读取已提交单位,友军模式会限制到来源一方,Other Ally 还会排除来源自己
Random Opponent 同样不经过单目标选择,但只会通过 Target 提交一名存活对手;All Enemies 则通过 AllOpponents 提供完整的对方集合,让所有存活敌人收到卡牌文本承诺的范围效果

上图中的 Meteor Strike 对三个存活敌人同时结算 15 点伤害,说明 Card Target、Behavior 目标集合和玩家可见文本保持一致
Unit Source 从当前上下文解析单位
| Source | 解析结果 |
|---|---|
Self | 当前宿主:玩家卡牌中是玩家,Status 中是持有者,Enemy Behavior 中是当前敌人 |
Opponent | 先读取与当前宿主阵营相反且已提交的 Target 或 Attacker,没有可用上下文时再取得对方阵营的第一名存活单位 |
AllUnits | 全部存活玩家成员与全部存活敌人 |
ActivePlayer | 当前被激活且仍然存活的玩家成员 |
AllAllies | 与当前宿主同阵营的全部存活单位,玩家卡牌解析玩家队伍,敌人 Behavior 解析敌方阵容 |
AllOpponents | 与当前宿主不同阵营的全部存活单位,方向随宿主阵营改变 |
AllDeadAllies | 与当前宿主同阵营且已经死亡、仍保留在战斗编制中的全部单位,供复活规则使用 |
Target | 当前卡牌、反应或调用上下文明确提交的单位,不按阵营改写,既可以读取敌人也可以读取队友 |
治疗、护甲和自我 Buff 通常使用 Self,单目标攻击使用 Opponent,阵营范围规则使用 AllAllies 或 AllOpponents,让同一份 Behavior 在玩家或敌方 Host 下都保持正确
已连接端口覆盖节点字段
当节点同时提供 Target 输入端口和 Source 字段时,连线具有更高优先级
Target 端口已连接 -> 使用连线传入的单位或集合
Target 端口未连接 -> 使用 Source 字段从当前上下文解析目标
这项规则允许同一个 Action 先以 Self 作为默认目标,随后通过 Selector 连线改为动态目标,切换端口前应确认原字段不再决定结果
Card Source 读取当前卡牌实例
| Source | 解析结果 |
|---|---|
ThisCard | 当前正在结算的 CardInstance |
HandPile | 当前手牌 |
DrawPile | 当前抽牌堆 |
DiscardPile | 当前弃牌堆 |
ExhaustPile | 当前消耗堆 |
AllPiles | 手牌、抽牌堆、弃牌堆与消耗堆的合并结果 |
这些来源在下游节点执行时读取当前牌堆,因此移动卡牌后再次求值会得到新的集合,需要保留移动前的结果时,应先保存快照
Selector 从集合中选出目标
当目标由规则而不是玩家点击决定时,使用 Selector 依次完成筛选、排序和数量截取
- 用 Filter 保留符合条件的单位或卡牌
- 用 Sort 按 HP、费用或其他数值排序
- 用 Pick、Take 或 Random 取得 Action 需要的对象
-
在 Action 前检查集合是否为空,并用 Branch 进入备用路径
-
在卡牌描述中写清目标限制
-
让失败路径提供可见反馈,或在出牌前阻止不合法操作

上图先从抽牌堆筛选基础攻击牌,再随机选择一张并移入手牌,单位目标也使用同一结构,例如把 AllOpponents 按 HP 升序排序,再取第一个元素,即可得到生命最低的存活对手
空结果不会自动变成备用效果
内置 Action 会跳过空、死亡或不合法的目标,最终集合为空时,Action 不会产生效果,也不会自动选择其他对象
如果空结果不符合卡牌文本或玩家预期,应在 Behavior 中显式处理
Opponent、UnitSource、CardSource 和节点名称用于编辑器配置,不应直接写入玩家可见的卡牌描述,描述应明确表达最终对象,例如“对选中的敌人造成 8 点伤害”“为另一名队友获得 6 点护甲”或“使所有队友恢复 4 点生命”