跳到主要内容

常见状态模式

GCS · Recipes

六类状态原型背后的节点链:持续伤害、属性增益、属性减益、伤害吸收、反伤和控制。每个配方都是演示里真实存在的状态,可以直接打开对照。

面向需要搭建状态体系的作者:参考 Poison、Strength、Thorns、Buffer、Silence 这些已验证的图。

状态是挂在单位身上的规则:它跨回合存在、对发生的事做出反应,还能在数值落地前改写它。制作一个状态分为两部分:资产字段决定层数如何表现,Behavior 图决定状态实际行为。下面每个模式都在演示状态数据库里存在,可以边看本页边打开对应图。

FlowGraph 编辑器中的演示 Poison 状态:On Turn Start 把层数接入无视护甲的 Deal Damage,随后是 Play Effect 组


层数行为写在资产上

Workbench 的 Status 模式里有三个字段控制叠层,全都不需要节点:

字段选项玩家体验到的效果
Stack RuleAdditive / Max / Replace新施加的层数叠加、保留较大值,或直接覆盖当前层数
Max Stacks-1 或正数上限-1 表示不封顶;设了上限就会把超出的部分静默截掉
Decay RulePerTurn / Never每回合自动掉一层,或一直保留直到被移除

动图之前先把这三项定下来。经典状态行为里有一半("层数每回合衰减""最多叠三层")纯粹是资产配置。


持续伤害(Poison)

状态文本:"At the start of your turn, take 1 damage per stack, ignoring armor, then lose 1 stack."

演示 Poison 的资产配置:减益开启,Stack Rule Additive,Decay Rule PerTurn,Max Stacks -1。图就是上面那张截图:

On Turn StartDeal Damage,起作用的是三处设置:

  1. TargetSelf。在状态图里,Self 指携带这个状态的单位,不管它是谁。
  2. Amount 不是手填的,而是来自 Status InfoStacks 输出,也就是当前层数。这个节点的 Status 字段留空时,读的就是图所属的那个状态。接了线的端口永远压过字段里手填的数字。
  3. Ignore Armor 开启,让毒伤对满护甲的单位也照扣不误。

注意缺了什么:图里没有"掉一层"的节点。那件事由资产上的 Decay Rule PerTurn 负责。演示里的 Burn 是同一副骨架,改用 On Turn End 在回合结束时结算;Bleed 则把入口换成 On Attack Taken,持有者每挨一次攻击就痛一次。


属性增益(Strength)

状态文本:"Your attacks deal 1 extra damage per stack."

改数值的增益自己不打伤害,它在数值经过时拦截并改写,靠的是 Hook 入口:

Damage Dealt HookMath BinaryWrite Hook

  1. Damage Dealt Hook 在持有者即将造成伤害时触发,把待结算的数值放在 Value 输出上。
  2. Math Binary(Add)把这个值和 Status InfoStacks 相加。
  3. Write Hook 提交调整后的数字,这一击就打得更重。

演示 Strength 的 Decay Rule 是 Never,增益会一直留到被其他规则移除为止。


属性减益(Weak、Vulnerable)

减益就是同一条 Hook 链换个方向。通过 Damage Dealt Hook 压低持有者打出去的伤害,或通过 Damage Taken Hook 抬高它受到的伤害。选 Hook 时问一句"改的是谁的数值":Hook 永远属于持有者,所以"这个单位打人变轻"和"这个单位挨打变疼"都是挂在这个单位身上的状态。

做减法时,结果先过一个 Clamp 再进 Write Hook。不然减益叠大了会把伤害减成负数,等于给目标回血。

演示里有个值得留意的设计:Weak 和 Vulnerable 用一个 Constant 做固定幅度的调整,没有去读 Status InfoStacks。多叠的层数只延长持续时间,不加深惩罚。两种缩放方式都成立,关键是卡面文本要和你接的那种对得上。


伤害吸收(Buffer)

状态文本:"Each stack prevents 1 HP of loss, then is consumed."

HP Loss HookMath Binary 计算链 → Write Hook,再加一个 Change Status 烧掉层数:

  1. HP Loss Hook 拦截 HP 损失,待结算数值在 Value 上。
  2. 数学节点算出层数能吸收多少、剩下多少。
  3. Write Hook 提交削减后的损失,Change Status(负数 Amount,目标 Self)消耗掉用掉的那几层。

凡是"用自身层数抵消传入数值"的状态,都可以采用这个模式。


反伤(Thorns)

状态文本:"When you take damage, deal 1 damage per stack to the attacker."

反应型状态用普通 Entry 而不是 Hook,因为它是对事件做出回应,不是改写数值:

On Damage TakenDeal Damage

  1. On Damage Taken 在持有者挨打后触发,把攻击者放在 Source 输出上。
  2. Source 连进伤害节点的 Target 端口,反弹就会命中攻击来源,而不是某个写死的目标。
  3. Amount 照旧来自 Status InfoStacks
注意

反弹出去的也是伤害。如果两个单位都带反伤类状态,在 Play Mode 里让它们互殴一次,用 Monitor 的 Flow tab 确认这场往来按你的预期收场。


控制状态(Silence)

状态文本:"Cannot play Skill cards. Lose 1 stack each turn."

控制效果否决一个决定,而不是改一个数字。演示 Silence 的图:

Card Playable HookCard InfoConditionBranchCancel Hook

  1. Card Playable Hook 在战斗判断一张卡能否打出时触发,候选卡在 Card 输出上。
  2. Card Info 读出这张卡的 TypeCondition 拿它和一个设为 SkillConstant 比较。
  3. True 分支上的 Cancel Hook 否决这次出牌。只要状态还在,这张卡就留在手牌里打不出去。

Silence 文本里"每回合掉 1 层"那一半照旧由 Decay Rule PerTurn 提供,不需要任何节点。演示里其他几个"锁"各自拉了不同的闸,而不是重复这套否决:Stunned 用 On Turn StartSkip Next Turn 让持有者整个回合跳过(Max Stacks 为 1,叠不上去);Frozen 通过 Damage Dealt Hook 压低打出的伤害;Restricted 通过 Draw Count Hook 削减抽牌数。想印什么效果文本,就拉对应的那道闸。


状态制作检查清单

  • 显示名称说清了规则吗?至少不能和规则矛盾。
  • 是增益还是减益?IsDebuff 决定 UI 怎么呈现它。
  • 新施加时是叠加、取最大还是覆盖?这是 Stack Rule 的事,不是图逻辑。
  • 层数要不要每回合衰减?这是 Decay Rule 的事,不是节点。
  • 行为需要哪一半:Entry(响应事件)、Hook(改写数值),还是两者都要?
  • 玩家能看到图标和真实变化的层数吗?测试对局时在 Monitor 的 Unit tab 里确认。