Skip to main content

Common Card Patterns

GCS ยท Recipes

Node-by-node recipes for the classic card archetypes: strike, block, status application, card draw, multi-hit, area damage, and conditional payoffs.

For card authors who know the FlowGraph basics and need reusable node chains rather than a theory refresher.

Each recipe states the card text it produces, then the node chain and the settings that matter. Every node named here is a built-in; type it into the Add Node search and it appears. Adapt the numbers and the presentation, keep the structure.

Two demo cards already ship most of these patterns. Open Poison Arrow (strike plus status) and Rapid Fire (multi-hit with random targets) in the Hunter set for a live reference.

Poison Arrow in the FlowGraph editor: On Card Played runs Deal Damage, a Play Effect group, then Change Status


Strikeโ€‹

Card text: "Deal 6 damage to the selected enemy."

On Card Played โ†’ Deal Damage

  1. Set the card's Target Mode to SingleEnemyUnit so the player aims the card.
  2. Leave the damage node's Target on Opponent. In a card graph that resolves to the enemy the card was played on.
  3. Type the number into Amount, or feed the port from an Operator node when the value is computed.

Deal Damage reports the damage that actually landed, after armor, on its Dealt output. Follow-up nodes can react to the real number instead of the printed one; the demo Poison status pipes Dealt straight into its floating text.

tip

Ticking Ignore Armor makes the hit bypass armor entirely. Poison in the demo uses it so the turn-start tick always hurts.


Blockโ€‹

Card text: "Gain 5 armor."

On Card Played โ†’ Change Armor

  1. Set Target Mode to Self or None; there is nothing to aim.
  2. On Change Armor, keep Target on Self and Mode on Delta, then set Amount to 5.

Set mode overwrites the current value instead of adding to it; reserve it for "set your armor to X" wording. Whether armor survives into the next turn is a battle rule on the encounter (the demo resets it at every turn start), not something the card decides.


Apply a statusโ€‹

Card text: "Apply 2 Poison."

On Card Played โ†’ Change Status

  1. Pick the status from the node's Status dropdown. The list comes from your status database, so there is nothing to type and nothing to mistype.
  2. Keep Mode on Delta and set Amount to 2. A negative amount removes stacks, and Set forces an exact count.
  3. Point Target at Opponent for a debuff, Self for a buff.

Poison Arrow runs exactly this after its damage step: hit first, then two stacks of Poison, each beat with its own effect group.

How those two stacks combine with stacks already on the target (add up, keep the higher count, or replace) is the status asset's Stack Rule, not the card's decision. The card only offers stacks; the status decides what they become.


Draw cardsโ€‹

Card text: "Draw 2 cards."

On Card Played โ†’ Draw Cards

Set Mode to Count and Count to 2. The other mode, ToHandLimit, keeps drawing until the hand is full and matches "fill your hand" wording. Downstream nodes should read the Drawn output rather than assume the count, because the hand-size rule can cut a draw short.


Multi-hitโ€‹

Card text: "Deal 3 damage 4 times, hitting a random enemy each time."

This is the demo card Rapid Fire, verbatim:

Rapid Fire in the FlowGraph editor: a Loop with count 4 deals damage to one random enemy per pass

On Card Played โ†’ Loop (Count 4), whose Body runs Deal Damage (Amount 3). The damage node's Target port is fed by Random Elements (Count 1), which reads from All Enemies.

Rapid Fire's own Target Mode is AllEnemyUnits: the card sprays the whole field, so the player is never asked to aim.

Each loop pass is a separate damage application, so anything that reacts per hit (armor, Thorns, damage hooks) triggers four times. That is usually what multi-hit text implies. For a multi-hit that stays on one chosen enemy, drop the random chain: switch Target Mode to SingleEnemyUnit and leave the damage target on Opponent.


Area damageโ€‹

Card text: "Deal 6 damage to all enemies."

On Card Played โ†’ Deal Damage with Target switched to AllEnemies. One node, every living enemy.

Set the card's Target Mode to AllEnemyUnits or None. Forcing the player to select a single target for a card that hits everyone reads as a bug.


Conditional payoffโ€‹

Card text: "If the target is Marked, draw a card."

Build the check from Get and Operator nodes, then split control with Branch:

  1. Unit Status Stacks reads how many Marked stacks the target carries.
  2. Condition compares that number against 0.
  3. Branch takes the comparison on its Condition input and routes control to True or False.
  4. Put Draw Cards on the True branch. Leave False unconnected unless the text promises a fallback.

The check reads the stacks at the moment Branch runs. If the same card applied Marked one node earlier in its own chain, those fresh stacks already count. Marked ships in the demo status database, so you can test this card in a Hunter encounter without authoring a new status first.


Discard or exhaustโ€‹

Card text: "Choose a card in your hand. Exhaust it, then gain 2 armor."

On Card Played โ†’ Choice โ†’ (OnChosen) Move Cards โ†’ Change Armor

  1. Feed the Choice node's Options input from Card Piles with its pile set to Hand, and write the instruction the player sees into Prompt.
  2. The battle pauses while the player picks. Control resumes down OnChosen, and the picked cards come out of the Chosen output.
  3. Wire Chosen into Move Cards and set the destination pile to Exhaust (or Discard).
  4. Finish with Change Armor, as in the Block recipe.

Allow Skip adds a skip button and routes control through the Skipped branch instead. Decide what skipping means before you ship the card; an empty Skipped branch silently does nothing.


Card text checklistโ€‹

Read the finished text against the graph before moving on:

  • "Selected enemy" promises aiming, so Target Mode must be SingleEnemyUnit.
  • "All enemies" promises no aiming: AllEnemyUnits or None.
  • Name piles precisely. Draw pile, discard pile, and hand are three different places.
  • State the condition before the payoff, in the order the player evaluates it.
  • Printed numbers drift away from node values over time. Description tokens can inject the live value into the text; see Card types, tags and tokens.