跳到主要内容

入口与 Hook

GCS · FlowGraph Authoring

入口在某件事发生后启动一张图;Hook 让图在 GCS 提交某个值之前改写它。本页收录全部 33 个入口和 18 个 Hook,附触发时机、输出与宿主。

创作时可以把这一页作为时机索引。先选对入口或 Hook,再继续搭建后续节点。

入口和 Hook 是 FlowGraph 的时机语言。放任何其他节点之前,先决定行为该从什么时候开始,以及它是响应一个时机,还是改写一个值。

FlowGraph 窗口中的 Poison 状态行为图,状态宿主的入口驱动它的每回合效果

demo 的 Poison 状态是典型的状态宿主图:On Turn Start 入口按状态自身的层数结算伤害,表现跟在后面。状态是 GCS 中反应能力最强的宿主,这也是下面的表格大多列着它的原因。


入口还是 Hook?

你想要……
在某个战斗时机发生后响应入口
在 GCS 提交某个值之前改变它Hook
驱动敌人的回合On Enemy Behavior Start 加 Intent 模式节点
从一张图触发另一张图Raise Internal EventOn Internal Event
桥接到 GESRaise GES EventOn GES Event

入口更容易推理,因为它运行时事件已经结束。Hook 需要更谨慎:它处在一次仍可能被其他 Hook 修改或取消的计算之中。


谁能监听什么

每个宿主只拿到对它有意义的入口,Add Node 菜单会强制执行这一点。卡牌响应自己的牌堆生命周期和回合边界,状态响应大多数发生在单位身上的事件,敌人只有一个启动回合的入口。

宿主可用时机点
Card七个卡牌入口、On Turn StartOn Turn EndOn Draw Pile Shuffled、两个事件入口、全部 Hook
Status战斗、回合、阶段、伤害、HP、护甲、能量、状态、单位入口,外加 On Card Drawn、两个事件入口、全部 Hook
EnemyOn Enemy Behavior Start、两个事件入口、Intent 模式节点

如果某个行为需要当前宿主用不了的入口(例如"这张卡在任何单位死亡时触发"),把它实现为状态,让卡牌去施加那个状态。


一个回合里入口在哪触发

一个玩家回合加敌方阶段,按触发顺序:

有两个细节需要特别注意。第一回合没有抽牌阶段,因为起手牌在战斗开始时就已抽好。敌方阶段里每个敌人都有自己的行动顺序:它身上的状态先触发 On Turn Start,它经由 On Enemy Behavior Start 行动,然后它的状态触发 On Turn End。所以挂在敌人身上的 Poison 在该敌人自己的行动步 tick,而不是在玩家回合 tick。


战斗与回合入口

这些入口都不输出数据,只提供时机。

入口宿主何时触发用于
On Battle StartStatus战斗开始时触发一次开场 buff、初始变量、首回合设置。每回合逻辑交给 On Turn Start
On Battle EndStatus战斗结束时触发一次,无论胜负收尾和战斗结束效果。胜负画面属于场景 UI,不属于图
On Turn StartCard, Status状态上:持有单位自己的回合开始时。卡牌上:玩家回合开始时,对手牌里的每张卡各触发一次能量变化、状态 tick、每回合计数
On Turn EndCard, Status状态上:持有单位自己的回合结束时。卡牌上:玩家回合结束、手牌被弃掉之前,对手牌里的每张卡各触发一次回合结束伤害、衰减、延迟清理
On Draw PhaseStatus玩家回合开始、每回合抽牌之前。第 1 回合不触发;起手牌在战斗开始时抽取抽牌阶段反应。逐张卡的反应用 On Card Drawn
On Discard PhaseStatus玩家回合结束、手牌被弃掉之前回合结束弃牌反应
On Draw Pile ShuffledCard弃牌堆被重新洗回抽牌堆时洗牌反应、遗物式机制

卡牌入口

每个卡牌入口都输出涉事的 Card,下游节点可以经 Card Info 读它的费用或类型。全部是卡牌宿主;唯一状态也能监听的是 On Card Drawn

入口宿主何时触发用于
On Card DrawnCard, Status抽牌把卡送进手牌时,每张卡一次抽到触发、抽牌计数
On Card PlayedCardGCS 接受这次出牌时。卡牌的主要效果就写在这里卡牌自己的效果。想改费用或可打出性,用 Hook
On Card DiscardedCard卡牌被弃掉时,无论来自回合结束弃牌还是弃牌效果弃牌协同
On Card ExhaustedCard卡牌被消耗时:带 Exhaust 的卡被打出、带 Ethereal 的卡在回合结束、或效果直接消耗它消耗协同和清理
On Card RetainedCard卡牌跨过回合结束留在手牌时,无论因为 Retain 关键词还是保留整手牌的战斗规则保留协同
On Card Added To HandCard效果在抽牌步之外把卡创建或移入手牌时生成卡牌反应。抽到的卡用 On Card Drawn
On Card Added To DeckCard效果把卡加进抽牌堆时构筑和召唤卡牌反应

伤害、HP、护甲和单位入口

这些全部是状态宿主:该做出反应的单位携带一个状态,图就写在状态上。输出里的 Source 是造成变化的单位,Target 是承受变化的单位。

入口输出何时触发用于
On Damage DealtAmount, Source, Target持有者造成的伤害落地之后。Amount 是实际穿透的伤害出手后的追击:吸血、命中附带效果。想提高伤害本身,用 Damage Dealt Hook
On Damage TakenAmount, Source, Target持有者受到任何来源的伤害之后荆棘、反击、受击反应。想减免伤害,用 Damage Taken Hook
On Attack TakenAmount, Source, Target攻击命中持有者之后。状态 tick 等非攻击伤害不触发只对攻击生效的反应
On HP GainedAmount, Source, Target持有者被治疗之后治疗反应。想改治疗量,用 HP Gain Hook
On HP LostAmount, Source, Target持有者损失 HP 之后,无论是否来自伤害流血、献祭反应
On Armor GainedAmount, Source, Target持有者获得护甲之后获得护甲协同
On Armor LostAmount, Source, Target持有者损失护甲之后破甲反应
On Unit SpawnedUnit单位被召唤上场之后召唤反应
On Unit DiedWas Kill, Source, Target每次死亡触发两轮:死者身上的状态先跑一轮,Was Kill 为否;击杀者身上的状态再跑一轮,Was Kill 为是。Source 是击杀者,Target 是死者死者侧的亡语、击杀侧的奖励。一个状态同时处理两侧逻辑时,按 Was Kill 分支

能量与状态入口

同样是状态宿主。

入口输出何时触发用于
On Energy GainedAmount玩家获得能量之后获得能量反应。想改数值,用 Energy Gain Hook
On Energy SpentAmount玩家消耗能量之后消耗反应和计数。想改卡牌费用,用 Card Cost Hook
On Status InflictedStatus, Stacks, Source, Target持有者向其他单位施加状态之后施加方效果:"每当你施加减益"。想改层数,用 Inflict Status Hook
On Status ReceivedStatus, Stacks, Source, Target状态落到持有者身上之后接收方反应
On Status ExpiredStatus, Target持有者身上的状态自然耗尽时,层数或持续时间归零过期效果
On Status RemovedStatus, Stacks, Target持有者身上的状态被效果移除时:净化、驱散驱散反应,与自然过期区分
On Status Stacks ChangedStatus, Stacks, Target持有者身上某状态的层数变动时,增减都算。Stacks 是新的层数"叠到 5 层"这类阈值效果

敌人与事件入口

入口输出宿主何时触发
On Enemy Behavior StartEnemy每张敌人图的根。GCS 用它选出敌人预告的意图,并在敌方阶段轮到该敌人行动时再次运行它
On Internal EventEvent Arg 读取全部战斗中任何地方运行了同名 EventNameRaise Internal Event
On GES EventEvent Arg 读取全部指定的 Game Event System 事件被触发时,无论来自 GCS 内外

Mire Reaper 敌人图:On Enemy Behavior Start 接 Weighted Random Pattern,在多个 Leaf Intent 分支间抽选

demo 的 Mire Reaper 展示了敌人图的形状:On Enemy Behavior Start 接一个 Weighted Random Pattern,每条分支以 Leaf Intent 收尾,预告敌人下回合的执行内容。


Hook 入口

Hook 不等某个时机,它在对应的值正在计算、结果落地之前运行。Hook 通过输出暴露待定的值。要改变它,算出新值后运行 Write Hook;要彻底阻止这次操作,运行 Cancel Hook。Hook 对卡牌图和状态图开放;实践中几乎都写在状态上。

每个 Hook 入口带三个共享设置:

设置含义
Priority多个 Hook 拦截同一个值时按优先级依次运行,"伤害翻倍"和"伤害上限 10"可以刻意排序
ScopeBattle 表示整场战斗生效;Turns 表示限定回合数
TurnsScope = Turns 时 Hook 保持生效的回合数
Hook输出何时介入用于
Damage Dealt HookValue, Source, Target计算持有者造成的伤害时在应用前提高或降低伤害。命中后的反应用 On Damage Dealt
Damage Taken HookValue, Source, Target计算持有者受到的伤害时减伤、易伤、抗性
Attack Taken HookValue, Source, Target计算命中持有者的攻击(不含状态伤害)时攻击专属的减免或放大
HP Gain HookValue, Source, Target计算持有者的治疗量时放大或压制治疗
HP Loss HookValue, Source, Target计算持有者的非伤害 HP 损失时修改献祭式损耗。伤害用伤害类 Hook
Armor Gain HookValue, Source, Target计算持有者即将获得的护甲时Dexterity 式护甲加成
Armor Loss HookValue, Source, Target计算持有者即将损失的护甲时护甲保护
Armor Reset HookValue, Target计算回合开始的护甲重置时Barricade 式跨回合留甲
Energy Gain HookValue计算玩家即将获得的能量时放大能量获取
Energy Spend HookValue计算玩家即将消耗的能量时消耗折扣或加价
Energy Per Turn HookValue计算每回合能量补充时改变能量基线
Inflict Status HookStatus, Stacks, Source, Target计算持有者即将向外施加的层数时放大你施加的减益
Receive Status HookStatus, Stacks, Source, Target计算即将落到持有者身上的层数时状态抗性或易感
Status Damage HookValue, Source, Target计算某个状态 tick 的伤害时。用 Hook 的 Status 字段指定针对哪个状态只调整 Poison 或 Burn 的 tick,不影响攻击伤害
Card Cost HookCard, Value计算一张卡的能量费用时费用折扣与惩罚
Card Playable HookCard, PlayableGCS 检查一张卡能否打出时锁牌,比如 Silence 生效期间
Draw Count HookValue计算即将抽的牌数时多抽或少抽
Hand Size HookValue计算手牌上限时提高或降低手牌上限

Hook 写入模式

一张 Hook 图几乎总是这个形状:

  1. 从 Hook 入口开始,读取 Value(按需再读 SourceTargetCardStatus
  2. ConditionMath BinaryUnit InfoCard Info 算出新值
  3. 运行 Write Hook,数值用 Kind = Int,可打出性用 Kind = Bool
  4. 只有当预期结果是"这件事完全不发生"时,才用 Cancel Hook

实例,"这个单位持有 Plated Armor 层数时,受到的伤害减少 2 点":

  1. Damage Taken Hook
  2. 对 Hook 的 Target 和 Plated Armor 状态使用 Unit Status Stacks
  3. ConditionOp = Greater,与 0 比较
  4. Branch
  5. True 上,Math BinaryValue 减 2
  6. Write HookKind = Int
注意

一张永远走不到 Write Hook 的 Hook 图不会改写任何值。图可以正常执行,VFX 也可以播放,但原值会保持不变。Issues 徽标没有报错而数值没有变化时,先检查这一条。


事件入口模式

内部事件让发送方和接收方保持松耦合:

  1. 发送方运行 Raise Internal Event,设置 EventName 和可选的参数绑定
  2. 接收方的图以同名的 On Internal Event 开始
  3. 接收方用 Event Arg 逐个读取命名值

校验器会标记 EventName 为空的 On Internal Event 入口,所以先把事件命名好。GES 那一对只在行为确实需要跨进 Game Event System 时使用;逻辑留在 GCS 内部时,优先使用内部事件,排查也更直接。