Guide to Card Components and Parameters

Discussion in 'Card Hunter General Chat' started by Kalin, Sep 2, 2018.

  1. Kalin

    Kalin Begat G'zok

    Aloyzo's Arsenal #26 has this restriction:
    This guide is an attempt to at least list what those building blocks are.

    One of things that makes collectible card games popular is that the cards themselves can modify the rules, or even create new rules. Which is very exciting for players, especially when cards interact with each other. But it also makes the game complicated to implement, since the programmers don't want to have to hardcode every single card. So they try to factor out common features, and have each card say which features it uses and with what settings and modifiers. In Card Hunter the features are called Components and the modifiers are Parameters ("Params").

    I do not have access to the actual code, but we do have access to the master card database which is a HUGE spreadsheet (833 rows by 54 columns) that tells the game everything about what a card does and what it looks like. Each card can have up to five components and multiple parameters for each (not sure if there's a limit) and general parameters that apply to the whole card.

    Fun fact: two cards do not have any components at all! One is available to players, the other one ... well, I suspect the programmers looked at the card text and said "No."

    I'm going to start with looking at those general parameters, which are mostly things like if/when the card can be played, is it part of a card pool, and does it count towards hand size. The others are things I would have expected to be linked to specific components instead.

    Card parameters (column AK "Params"):
    alliedOccupantsOnly (Cleansing Presence)
    dontProvokeTurn (Target won't turn to face you. Used by bashes, team moves, whirls, etc.)
    enemyOccupantsOnly (Laser Barrage)
    ignoreHalt (Warp Run)
    ignoreStun (Shrug It Off)
    endRoundCount=0 (Free Card)
    form (will be detached when another form is attached)
    meal (Morsel, maybe they wanted multiple types of meals?)
    noActionPoint (Free Action)
    overload (laser malfunction card pool)
    playerRelative (terrain that distinguishes between allies and enemies)
    spirit (form card pool)
    terrainOnly (I think this means the trigger is only active when attached to a square)
    trait (does not include card draw)
    unplayable (like blocks and armors)
    vampire (form card pool)
    werewolf (form card pool)
    zombie (form card pool)
    Last edited: Sep 2, 2018
  2. Kalin

    Kalin Begat G'zok

    Card components start in column AA for Component1 and end in column AJ for Params5. This list includes components from all five slots, in alphabetical order, in the following format:

    component name, "text of example card", example card (note)
    + parameter (note)
    + parameter (example card)

    Note that some components just select targets for later components. Most parameters are optional. And I haven't yet researched how exactly it decides when to activate the different triggers.

    AcidLeakComponent, "When you play an Acid card, create and attach an Acid Blast card to a random occupied square.", Acid Leak
    + attachedOnly
    + cardName=_____
    + damageType=_____ (that triggers the effect)

    ActivateTriggerComponent, "Trigger all start of round effects within 5 squares.", Accelerate Time
    + includeTerrain
    + includeInHand
    + hideOnResolve
    + keyword=_______
    + range=N
    + selfControlled (Instant Burn)

    AdaptComponent, "When you take damage, create a new card that grants you Immunity to that damage type and attach it to yourself.", Adaptable
    + inHand

    AddTargetComponent, "When you play a Magic card with a duration that targets a single character, that card also targets the two closest allies of that target.", Contagion
    + addNumber=N (number of extra targets)
    + attackType=____
    + hasDuration (only triggers on cards that create attachments)
    + targetAlly
    + targetEnemy

    AdjacentEndMoveComponent (follows a MoveComponent)
    + adjacentDiscard (Elven Trickery)
    + attachToSelf (Prowl)
    + damageForEnemies=N (Dangerous Maneuver)
    + discardCardType=_____
    + discardNumber=N (these two from Elven Trickery)
    + drawsPerEnemy=N (Positioning Move)
    + enemiesOnly
    + movePoints=N
    + slide (these two from Muscle Through)

    AffectAdjacentComponent, "Do 2 Crushing Melee damage to every enemy adjacent to you at the start of this Move.", Smashing Spin
    + enemiesOnly
    + includeInstigator (Warp Run)
    + range=N (Radioactive Pulse)
    + unordered (Battery Explosion)

    AffectAdjacentTargetComponent, "Target character and each adjacent character.", Spreading Laser

    AffectRandomComponent, "Attach to Binwin if possible. If not, attach to a random ally.", Friendly Fire
    + targetName=_____ (will target named char)
    + alliesOnly
    + excludeSelf
    Roulette has no parameters.

    AffectRandomSquareComponent, "Target a random square in range and sight.", Attack The Darkness
    + burst=N

    AlliesComponent, "Heal 5 to your ally with the least health. Ties are resolved in favour of the closest.", Help The Weak
    + adjacentToEnemy (Retreat)
    + excludeGroup=true (both kinds of "Team" cards)
    + includeInstigator
    + includeInstigator=true
    + lowestHealth

    AnvilStrikeComponent, "If the target is adjacent to blocking terrain, this Attack does 5 fewer points of damage", Wild Spark
    + extraDamage=N (N can be negative)

    AttachedCardCountDamageComponet, "At the start of each round, take 3 Psychic Magic damage for each Attack card in your hand.", Blind Rage
    + attackTypeToInflict=_____
    + blockedByArmor=false
    + cardType=_____ (count these cards)
    + damagePerCard=N
    + damageTypeToInflict=______
    + excludeCardType=______ (count every card except these)
    + triggerID=N

    AttachedDamageComponent (Burning and other attachment damage)
    + ageCount=N (Doom)
    + attachedOnly (Friendly Fire)
    + blockedByArmor=false (used when damage type is Poison)
    + damage=N
    + damageType=______
    + formDamage=N (Flaring Torch)
    + kill (Doom)

    AttachedDamageOccupantComponent (terrain)
    + damage=N
    + damageType=____
    + enemiesOnly (Laser Beacon)
    + radius=N
    + triggerID=N
    + zoomTrigger (????)

    AttachedDamageOnDeathComponent, "When any other character dies, deal 5 Crushing Melee damage to all adjacent characters.", Mindless Battlerage
    + attackType=_____
    + damage=N
    + damageType=_____
    + radius=N
    + selfTrigger (Festering Guts)

    AttachedDestoyOccupantArmorComponent, "At the start of each round, occupant discards all armor cards", Acid Blast
    + cardType=_____

    AttachedDiscardComponent, "At the start of each round discard one card", Holy Insight
    + discardNumber=N

    AttachedDiscardOnDeathComponent, "When any other character dies, you must discard your hand.", Superstitious

    AttachedDiscardOnPlayComponent, "Each time target plays a damaging Attack, Frenzy 3 and they discard their oldest card.", Savage Curse
    + cardType=None (!!)
    + triggerID=N
    + triggerID2=N

    AttachedDrawComponent, "At the start of each round, target draws a card.", Accelerated Thought
    + drawNumber=N
    + triggerID=N

    AttachedDrawOnDamagedComponent, "Whenever target takes damage from an enemy card, target character draws a card.", Martyr Blessing
    + attached
    + copy (Retaliatory Mutation)
    + drawNumber=N
    + enemyControlledCard

    AttachedDrawOnPlayComponent, "When you play a Holy card targeting an ally other than yourself, draw a card.", Altruism
    + damageTypes=_____
    + discardOnExactRoll
    + targetOtherAllies

    AttachedDrawRandomAtStartComponent, "At the start of each round, create a random Spirit card in your hand.", Medium's Garb
    + altTrigger
    + param=______ (form name, may also work with types or keywords)

    AttachedDrawTypeOnDamagedComponent, "When you take damage from an enemy card, draw a card. Discard that card unless it is a Move card. Repeat until you have drawn a Move card or drawn two cards.", Elven Maneuvers
    + attached
    + cardType=_____
    + count=N
    + enemyControlledCard
    + limit=N

    AttachedExtraDamageComponent, "Whenever a <u>Burning</u> card you control burns, it does 1 additional damage.", Kindler
    + damageTypes=_____
    + extraDamage=N
    + penetrating (Hot Flames)
    + srcAttachedToTarget
    + srcControlledCards

    AttachedHealComponent, "Attach to target. At the start of each round, Heal 3.", Healing Blessing
    + attachedOnly
    + healAmount=N

    AttachedHealOccupantComponent, "at the start of each round Heal 5 all characters within 1 square", Healing Beacon
    + healAmount=N
    + radius=N
    + triggerID=N

    AttachedHealOnDeathComponent, "When you die, all allies within three squares Heal 8.", Death Meld
    + healAmount=N
    + includeAllies
    + selfTrigger

    AttachedImmuneToTerrainComponent, "<u>You are not affected by terrain attachments other than blocking terrain.", Hover

    AttachedModifyTriggerComponent, "Whenever target rolls a die, subtract one from it", Bad Luck
    + triggerPenalty=N

    AttachedMoveAllyComponent, "When you play a Move card, also Push 1 your nearest ally.", Vanguard
    + attachedOnly
    + movePoints=N

    AttachedOccupantAttachRandomComponent, "at the start of each round do 2 Radiation damage and attach a random Handicap card to each character within 1 square", Radioactive Goo
    + cardType=______
    + triggerID=N

    AttachedOccupantCantBlockComponent, "Target may not block while in Mud", Mud Pit

    AttachedOccupantDrawComponent, "at the start of each round, occupant Heals 2 and draws a card", Bless
    + drawNumber=N

    AttachedPresenceComponent, "At the start of each round, discard all cards attached to adjacent allies then Heal 1 those allies.", Holy Presence
    + alliesOnly
    + destroyAttachments
    + healAmount=N
    + radius=N

    AttachedRandomMoveComponent, "whenever an enemy within 1 square moves under their own control, make that move randomly", Hypnotic Beacon
    + radius=N

    AttachRandomComponent, "Create a random Handicap card and attach it to the target.", Radiation Bolt
    + cardType=____
    + count=N (Genetic Engineering)
    + param=_____ (Walpurgis Night)

    AttachToGroupComponent, "Attach this card to yourself and a copy to every ally in your group.", Mass Invisibility

    AttachToRandomSquareComponent, "Target square and 2 random squares within 3 become Irradiated terrain", Radioactive Spray
    + copies=N
    + distance=N

    AttachToSelfComponent, "Attach this card to yourself.", Force Field

    + enemiesOnly (Illusory Barrier)
    + entryCost=N (-1 for Difficult, 1 for Open, Beacons don't use)

    + cardName=____ (when different card, Spark Of Undeath)
    + hideOnResolve
    Last edited: Sep 2, 2018
    gurel2, Robauke and Sir Veza like this.
  3. Kalin

    Kalin Begat G'zok

    BleedingComponent, "Target may not gain health.", Open Wound

    BlightComponent, "At the start of each round, create and attach a random Handicap card to each adjacent enemy.", Blight
    + attachedOnly
    + cardType=_____
    + enemiesOnly

    + additionalEffectDamageMax=N (Subtle Parry)
    + additionalEffectFilterTypes=____ (attack types)
    + additionalEffectKeyword=_____ (Pushback Parry)
    + additionalEffectsUntargeted (Auto Block)
    + allAround (Eyes Everywhere)
    + attachRandomForm (Shifting Block)
    + attachToInstigator (Icy Block)
    + attachToSelf (Hit The Deck)
    + attackerDiscard (Perfect Block)
    + attackTypes=_____
    + cardType=_____ (Cause Fumble)
    + damageMax=N (Flimsy Block)
    + damageMin=N (Desperate Block)
    + damageSelf=N (Jarring Block)
    + defendOther
    + defendRange=N
    + drawBlocked (Defender's Block)
    + drawSelf (Barrior Of Hate)
    + healSelf=N (Absorbing Block)
    + modifyKeep=0 (Auto Block)
    + moveAttacker=N (Pushback Parry)
    + moveSelf=N (Acrobatic Flip)
    + onlyWhenFatal (Lifesaving Block)
    + pickUpCard (Duck)
    + randomDraw1AttackType=______
    + randomDraw1FilterAttackTypes=______
    + randomDraw1DamageType=_____
    + randomDraw2AttackType=______
    + randomDraw2FilterAttackTypes=______
    + randomDraw2DamageType=_____ (all six of these are from Laser Block)
    + reflect (Reflect Missile)
    + selfDamageType=_____ (Jarring Block)

    BlockLOSTerrainComponent, (Illusion and Smoke terrain)
    + enemiesOnly
    + LOSOnly
    + throughOnly

    BlockModAddComponent, "Subtract 3 from Block rolls against Arcane cards you play.", Spark Generator
    + damageType=_____
    + blockMod=N (negative to make Hard to Block)

    BlockTerrainComponent, "Target square becomes Wall Terrain (Wall Terrain is blocked).", Pillar Of Stone

    + radius=N (required)

    + attackType=______
    + cardType=______
    + blockTerrainTrigger (Large Weapon)
    + enemyTriggerDistance=N (Defensiveness)

    ClumsyComponent, "You cannot turn to face your target when playing cards, and you do not turn to face attackers.", Clumsy

    + dontPickFacing (Charged Laser Barrage)
    + noLOS (Thunderblast)

    ControlMoveComponent, "When an enemy within 5 spaces plays a Move card, you control the destination of that Move. Discard this card.", Maze Of The Mind
    + discardRoll=N (I guess in case they wanted a version with partial Keep)
    + range=N

    CopyTerrainComponent, "Attach a copy of each terrain attachment to every adjacent square that does not already have a terrain attachment.", Blooming Ground
    (This follows an EverySquareAttachmentComponent, so it may be possible to Bloom a single tile.)

    + add=N (extra damage, can be negative)
    + addPenetration (Frenzy Aura)
    + addUnblockable (Surestrike Blessing)
    + altTrigger
    + attachedOnly
    + attackTypes=_____
    + damage=N (Fiery Fists)
    + damageType=_____
    + hasComponentParam=_____ (Impaler)
    + nameFilter=_____ (Strong Chop)
    + negateForEnemies (Word Of God)

    DamageAfterMoveComponent, "Target takes 2 Slashing damage for each square they move.", Path Of Knives
    + attached
    + damagePerSquare=N
    + damageType=______

    DamageAtStartComponent, "At the start of each round, take 1 point of Arcane damage.", Arcane Feedback
    + damage=N
    + damageType=____

    + AttachToTargetComponent (Numbing Blowdart, might be a bug)
    + attackType=_____ (Smashing Spin)
    + damage=N (Jim's Magic Missile)
    + damagePerAttachment=N (Inquisitor's Strike)
    + damagePerCard=N (Impetuous Blast)
    + damageType=____
    + enemiesOnly (Four-Headed Bite)

    DamageMultiplyComponent, "Double the damage of any Melee Attack you play.", All Out Attack
    + attackType=_____
    + cardType=_____
    + multiplier=N

    DamageOnMoveComponent, "When you play a Move card, take 4 Arcane damage.", Unstable Bolt
    + damage=N
    + inflictDamageType=_____

    + actorDistance=N (Loner)
    + actorName=____ (Birthday Present)
    + attackType=_____
    + blockedByArmor=false (Dreadfully Ill)
    + damage=N
    + damagePerActor=N (Loner)
    + damageType=_____
    + unpreventable=true (Demonic Revenge)

    DamageToHealComponent, "When another card would damage you, Heal that amount instead.", Negative Energy Being
    + attachedOnly

    + damageType=_____ (used by Flaring Laser but not Pulverizings)
    + instigatorDamage=N (Predictable Stab)
    + targetDamage=N

    DaylightComponent, "If a character in those squares has a Form card attached, they take 4 unpreventable damage. Otherwise, they Heal 4.", Daylight
    + attackType=_____
    + damage=N
    + damageType=_____
    + healAmount=N
    + unpreventable

    DecreaseAgeComponent, "Add one to the duration of all terrain attachments.", Everlasting Ground
    + extension=N

    DestroyAttachmentsComponent, "Discard all cards attached to target character.", Purging Strike

    DestroyEnemyAttachmentsComponent, "Discard all attached cards belonging to other players.", Disenchant

    DestroyTerrainAttachmentsComponent, "Discard terrain attachments in your square and all adjacent squares.", Cleansing Presence
    + drawOnDestroy=N (Cleansing Ray)

    DetachOnControllerDeathComponent, Taunt

    DiscardAtStartComponent, "At the start of each round, discard your oldest card other than this.", Arcane Curse
    + discardNumber=N

    + attackType=_____ (Forgetfulness)
    + cardType=_____
    + number=N (if absent, discards all matching cards)

    DiscardComponent, "then they discard their oldest card.", Vampire's Kiss

    DiscardImmediateByTypeComponent, "Target Immediately discards their oldest Armor card.", Melt Armor
    + cardType=______
    + discardNumber=N

    DiscardImmediateComponent, "Immediately discard the oldest revealed card in target's hand.", Small Pseudopod Strike (discards revealed cards only)
    + discardNumber=N

    DiscardRandomlyComponent, "Target discards a random card.", Perplexing Ray
    + discardNumber=N (not used by radiation attacks)

    DiscardRevealedComponent, "Targets discards the two oldest revealed cards in their hand.", Mind Drain
    + discardNumber=N
    + unrevealed (Memory Loss)

    DiscardThenDrawComponent, "All other allies may discard up to two cards and then draw the same number.", Leadership
    + freeDraw
    + maxDiscards=N

    DiscardToOpponentComponent, "A random opponent shuffles this card into their deck.", Traveling Curse

    DiscardTypeWhenDamagedComponent, "Whenever you take damage, you discard your oldest Magic card.", Mind Leak
    + attached
    + attackType=______
    + number=N

    DiscardWhenBlockedComponent, "If this Attack is blocked, discard your oldest card.", Clumsy Chop

    DisacrdWhenDamagedComponent, "Whenever target takes damage, discard their oldest card.", Dastardly Curse
    + attached
    + discardNumber=N

    DiscardWhenPlayedComponent, "Discard your 4 oldest cards.", Resurrect
    + discardNumber=N
    + optional (Controlled Overswing)

    + attackType=____ (Spell Skill)
    + cardType=_____ (Inspiring Presence)
    + count=N (number of cards to keep)
    + discardType (Totem Charge)
    + limit=N (how deep to search, not used by Pathfinding)
    + reshuffle

    DrawCardTypeTriggerComponent, "At the start of each round, draw a card. If that card isn't a Magic card discard it. Repeat until you have drawn a Magic card or 6 cards.", Wizard's Hat
    + attackType=_____
    + count=N
    + limit=N
    + reshuffle
    + altTrigger

    + drawNumber=N

    DrawOnResolveComponent (basically every Trait)
    + notVsGM (Obvious Maneuver)

    DrawOnTargetedComponent, "Whenever an enemy in front of you plays a Magic or Projectile card affecting you, draw a card.", Quick Reactions
    + attackTypes=____
    + cardTypes=_____
    + enemiesOnly (all existing cards have this)
    + restoreActionPoints (Simian Reflexes)

    DrawRandomComponent, "Create a random Magic Laser Attack and put it in your hand.", Pull The Trigger
    + attackType=____
    + cardType=____
    + damageType=____
    + param=_____ (Howl)

    DrawTempComponent, "Create a Block card (Block any, 4+) and put it in target's hand.", Block, Soldier!
    + cardName=______

    DrawTempOnMoveComponent, "When you play a non-Step Move card or attack with a Step Attack, create an Unreliable Block card in your hand.", Wind Dancer
    + attachedOnly
    + cardName=______
    Last edited: Sep 2, 2018
    gurel2, Robauke and Sir Veza like this.
  4. Kalin

    Kalin Begat G'zok

    EdibleComponent, "When you die, the nearest enemy eats you (create a Morsel card in their hand).", Edible
    + enemiesOnly (I can't help wondering what happens if you leave this off)

    + altTrigger
    + attachedOnly (Icy Block)
    + encumber=N

    EnlargeComponent, "When you play a Magic card that targets a single character or square add Burst 1 to it (or add 1 to existing Burst).", Enlarge
    + attackType=______

    + alliesFirst (Elvish Scamper)
    + excludeAllies (Brainhook)
    + excludeEnemies (Scatter!)
    + excludeSelf (Redecorate)
    + hasLOS (Flash Of Agony)
    + hideOnResolve
    + notRace=____ (Elvish Insight)
    + race=____ (Dwarven Battle Cry)
    + within=N (Firestorm)

    EveryActorsSquareComponent, "All squares occupied by characters become Lava Terrain", Volcano
    + filter=allies (Bless)

    EverySquareAttachmentComponent, "Add one to the duration of all terrain attachments.", Everlasting Ground

    EverySquareComponent, "Add one to the duration of all attachments.", Time Snap

    FixedLinearComponent, "Linear Diagonal.", Bishop Blast
    + diagonal
    + orthogonal
    (Queen Blast!)

    GroupComponent, "All other allied groups draw a card.", Raise The Alarm
    + excludeOwnGroup=true
    + includeAllies=true

    + altTrigger (Hit The Deck)

    HealAddComponent, "Add 1 to the amount initially healed when you play an Assist with Heal.", Healing Spirit
    + add=N
    + hasComponent=______

    + healAmount=N (required)

    HealOnAllyDamageComponent, "When an ally takes damage from an enemy card, you Heal 2.", Investigate
    + enemyControlledCard
    + healAmount=N

    HealOnDamageComponent (vamp attacks)
    + damagePerHeal=N
    + healAllies (Avenging Touch)
    + healPerDamage=N (Vampire's Kiss)

    HealToDamageComponent, "When another card would Heal you, take that much damage instead.", Negative Energy Being
    + attached

    HealWhenDiscardedComponent, "If this card is discarded, Heal 2.", Toughened Hide Strips
    + healAmount=N

    ImmobileComponent, "You cannot be moved or placed in a new location by enemy cards.", Immovable

    ImpassableTerrainComponent, "Target three unocccupied adjacent squares become Water Terrain (Water Terrain is impassable).", Flash Flood

    InvisibleComponent, "You may not be targeted.", Invisibility

    LinearComponent Deadly Spark

    ModifyBlockInHandComponent, "When this card is in hand, you may not Block.", Battleaxe Chop

    ModifyBlockRollComponent (modifies attempts to block this card)
    + mod=N (Hard to Block uses negative numbers, Reaching Swing uses 3)

    ModifyCardRetentionComponent, "You retain one more card at the end of each round.", Forward Thinking
    + modify=N (extra cards, can be negative)

    + minHealthPercent=N (Bloodied Block)
    + selfTrigger (Wounded Block)
    + triggerBonus=N
    + triggerPenalty=N (Massive Chop)
    + triggeringCardType=______ (Chain Harness)

    MoveAtStartComponent, "At the start of each round, you Move 1", Dimensional Traveller
    + freeMove
    + ignoreEncumber (Slippery)
    + teleport

    + altTrigger
    + attachedOnly (Wings Of Faith)
    + fly
    + excludeSteps
    + moveBoost=N (extra distance)
    + teleport

    + charge
    + fly
    + endAdjacentToBlocking (Cautious Sneak)
    + flankingMove
    + freeMove
    + manualFacing (Leap)
    + postMoveRandom=N (Telepod Jaunt)
    + teleport

    MoveDamageComponent (charges)
    + adjacent (Rumbling Charge)
    + damagePerUnit=N

    MoveHealSelfComponent, "At the end of this Move, Heal 1 for every square you are distant from your starting square.", Healing Dash
    + healPerUnit

    + cardTypes=____ (all examples use Attack)
    + discardRoll=N (Skip)
    + enemiesOnly
    + movePoints=N (distance, required)
    + mustMoveBack (Jump Back)
    + teleport
    + triggerRoll=N (Skip)

    MoveRandomlyComponent, "Place all characters on a random unoccupied square.", Hurricane
    + facing (set random too)
    + hideOnResolve
    + range=N (Maze)

    + audioKey=______ (Violent Spin)
    + fly (Telekinesis)
    + freeMove (Scuttle, Team!)
    + ignoreEncumber
    + movePoints=N (distance)
    + mustMoveAway (attacker doesn't control)
    + ownerControls (Elvish Scamper)
    + slide (don't change facing, I think)
    + targetInstigates
    + teleport (Teleport Other)

    MoveWhenDamagedComponent, "When you take damage from an enemy card, you Move 2.", Vengeance
    + altTrigger
    + enemyControlledCard
    + inHand
    + movePoints=N (distance)

    + distance=N (between targets)
    + numberTargets=N
    + penetrating (Jump Spark)

    OverloadComponent (mostly Erratic Damage)
    + overload=N (Minor = 3, Major = 6)
    + overloadMove (Rocket Dash)

    PickUpWhenBlockedComponent, "If this Attack is blocked, take it back into your hand instead of discarding it.", Unstoppable Chop

    PivotComponent, "Change your facing.", Spin Around
    + anticlockwise (Reverse Rotate)
    + clockwise (Scan)

    ProhibitAttachmentsComponent, "If a card would be attached to you, discard that card instead.", Arrogant Armor
    + altTrigger
    + enemiesOnly
    + reflect (Mystical Wyrmhide)

    RandomMoveTargetComponent, "Move target two squares randomly then set its facing randomly.", Ooze Maze
    + movePoints=N

    ReplaceAttachmentsComponent, "Discard each card attached to target then attach an equal number of random Handicap cards.", Destructive Purge
    + cardType=______
    + replaceCardType=_____ (Gene Therapy)
    + hideOnResolve

    ReplaceDrawComponent, "Whenever you would draw a card from your deck, instead create a random Zombie card in your hand.", Zombie Form
    + altTrigger
    + attached
    + param=_____ (which Form)

    RestrictPlayComponent, "You may not play Attack cards.", Fright
    + attackTypes=_____ (I'm Here About The Job)
    + cardTypes=_____

    ResurrectComponent (Mass Reanimate has this component twice)
    + initialHealth=N
    + noScore (Reanimate)

    ReturnOnKillComponent, "If this Attack kills the target, return it to your hand.", Laser Cutdown

    ReturnToHandTriggerComponent, "When you play a Magic card, put a copy of that card in your hand.", Memorisation
    + attackType=________

    + affectsInstigator
    + attackType=_____ (Brain Burn)
    + attackTypeToApply=_____
    + cardType=______ (Ouch!)
    + damagePerCard=N
    + damageTypeToApply=______

    RevealHandComponet, "Reveal the target's hand.", Inquisition Bolt
    + selfReveal (Obvious Maneuver)
    Last edited: Sep 2, 2018
    gurel2, Robauke and Sir Veza like this.
  5. Kalin

    Kalin Begat G'zok

    ScanComponent, "If any enemies are affected by this Attack, every other allied group draws a card and every other ally turns to face the affected enemies and may act again this round.", Scan

    SelfDestroyAttachmentsComponent, "Discard all cards attached to you.", Shrug It Off
    + encumber (Pathfinding)
    + handicap (Lateral Thinking)

    + cardTypes=____ (Dropped Guard)
    + damageTypes=______ (Drained Battery)

    SelfDiscardOldestComponent, "Discard your oldest card.", Fumble
    + discardNumber=1

    SelfDrawAdjacentEnemyComponent, "If an enemy is adjacent to you when you start this Move, draw a card.", Escaping Run
    + drawNumber=N

    SelfDrawComponent, "Draw a card.", Lateral Thinking
    + drawNumber=N

    SelfDrawDiscardComponent, "Draw three cards. Discard one and keep the others.", Inspirational Thinking
    + discardNumber=N
    + drawNumber=N

    SelfMoveComponent, "then you Move 1.", Pressing Bash
    + movePoints=N

    SelfTargetComponent Howl

    SelfTargetSquareComponent Daylight
    + radius=N (burst)

    SetActionPointsComponent, "Target may act again this round.", Energize

    SpawnComponent (Spawn Elementals has this component twice)
    + fullHealthOnly (Spawn Elemental)
    + groupName=____ (required)

    SpawnOnDamageComponent, "When you take damage, spawn a Slice Beast in a random unoccupied adjacent square. (Max 5 Slice Beasts at a time.)", Made Of Cake
    + altTrigger
    + groupName=_______
    + inHand

    SqueamishComponent, "When you play a card, you may not target a character whose health is less than or equal to the base damage of that card.", Squeamish

    + fly (Nimble Strike)
    + movePoints=N (required)

    + attachedOnly (Too Horrible)

    SwapComponent, "Choose two target characters; exchange their positions.", Swap

    SwapFigureComponent, (Forms)
    + figure=_____ (Galvanic/Ethereal/Lycanthropic/Vampiric)

    TalentedHealerComponent, "Whenever you play a Heal card add <u>Cantrip</u> to that card and Heal 2 yourself.", Talented Healer
    + keyword=_____
    + healAmount=N (heal bonus)

    TargetActorComponent (basically any Assist, Utility, or Attack that does not deal damage)
    + alliesOnly (Battlefield Training)
    + allowInstigatorTarget (Purge)
    + behindOnly (Boo!)
    + disallowInstigatorTarget (Martyr Blessing)
    + exactTargetCount (Redistribute)
    + numberTargets=N (Healing Rays)
    + uniqueTargets=false (Jim's Magic Missile)
    + uniquetargets=true (Redistribute)

    + acidSquaresPerDamage=N (Hex Of Dissolution)
    + behindOnly (Backstab)
    + damageFromBehind=N (Sneaky Bloodsuck, just the extra damage)
    + damagePerAlly=N (Mob Attack)
    + damagePerAttackerCard=N (Totem Blast)
    + damagePerCard=N (Punishing Bolt)
    + damagePerDiscard=N (Ancient Grudge)
    + damagePerRevealedCard=N (Devastating Blow)
    + disallowInstigatorTarget (Spark Of Undeath)
    + discardThreshold=N (Ancient Grudge)
    + forceArmorDiscard (Sundering Strike)
    + formDamage=N (Flaring Torch)
    + maxDistance=N (used with damagePerAlly)
    + numberTargets=N (Gusts Of War)
    + penetrating
    + reduceDamagePerCard=n (Psychic Blast)
    + uniqueTargets=false (Double Axe To The Face)
    + uniqueTargets=true (unneccessary?)

    + distance=N (between target squares, all existing cards are 1 except Dual Laser Beacon which doesn't have this parameter)
    + numberSquares=N
    + unoccupied (Flash Flood)

    TauntComponent, "That character may only target the character or group who played this card.", Taunt

    ThreeSixtyComponent, "Damages every adjacent character.", Impetuous Slash
    + forward (Crushing Sweep)

    TransferAttachmentsComponent, "Attach all cards attached to target character to another target character.", Redistribute

    TransferCardComponent, "Remove a random card from target's hand and place it in your hand.", Steal
    + fromBehind (Pickpocket)

    TransferSelectedCardComponent, "Target an ally. Select a card and give that card to target.", Battlefield Training
    + dontReveal
    + mayDecline=true (Advanced Battlefield Training, second use of component)

    TrapDamageComponent, "When an enemy moves next to you, do 6 Melee Slashing damage to them.", Ready To Strike
    + attackType=______
    + damage=N
    + damageType=______
    + enemiesOnly

    + age (Force Field)
    + alliesHealAmount=N (Holy Armor)
    + altTrigger
    + attachedOnly (Adapted To Acid)
    + attackTypes=________ (Shimmering Aura)
    + capDamage=N (Cushioning Armor)
    + closestAllyDrawNumber=N (Inspiring Armor)
    + damageAttacker=N
    + damageAttackerAttackTypes=_______
    + damageAttackerDamageType=_______ (these three used by Spiked Mail)
    + damageAttackerPenetrating (Barbed Platemail)
    + damageReduction=N (most invulnerable affects have this set to 0)
    + damageTypes=______ (only used by Amorphous Body which also has invulnerableDamageTypes)
    + destroyAttachments
    + destroyAttackerAttachments (these two used by Antimagic Skin)
    + discardRoll=N (Arcane Aura)
    + drawTempAttackTypes=_______
    + drawTempName=______ (name of card drawn)
    + drawTemp2AttackTypes=_______
    + drawTemp2Name=______ (name of card drawn, these four parameters used by Mimetic cards)
    + enemyControlledCard (Sacred Shroud)
    + excludeDamageTypes (Monstrous Hide)
    + invulnerable (Leathery Hide)
    + invulnerableDamageType=_____ (Resistant Hide)
    + moveOnArmor
    + mustMoveBack (these two on Crude Plates)
    + selfDrawNumber=N (Toughness)
    + untargeted (component only triggers on untargeted damage)
    + weakBehind (Weakened Armor)

    TriggeredDamageAttackerComponent, "Attacker takes 5 Crushing damage.", Feedback Blast
    + damage=N
    + damageType=_____
    + triggerID=N

    TriggeredExtraDamageComponent, "When you take damage, take an additional 2 points of damage.", Unfortunate Surge
    + attachedOnly (Vulnerable)
    + damageAdd=N
    + damageTypes=_____

    TriggeredHealComponent, "If you take damage, Heal yourself 3.", Boosted Heal
    + attachedOnly
    + excludeDamageTypes=______ (Troll Regeneration)
    + healAmount=N
    + inHandOnly

    TripComponent, "If an adjacent enemy plays a Move card, cancel that move.", Reactive Trip

    Okay, that's everything, you can comment now.
  6. Sir Veza

    Sir Veza Farming Deity

    Wow, very elucidating, yet mind boggling to me. Thanks, @Kalin !
    (What to do, what to do...?)
  7. Kalin

    Kalin Begat G'zok

    Now for some bad news..

    Cards that are hardcoded (component is named after the card and has no parameters):
    * Clumsy
    * Blooming Ground
    * Immovable
    * Invisibility
    Maze Of The Mind/Mind Muddle (only range and keep chance can be modified)
    Reactive Trip
    * Redistribute
    * Scan/Reverse Scan
    * Squeamish
    * Taunt

    * Starred cards have a separate component to determine which chars/squares are affected.

    You can still change stuff that appears outside the card text box.
    Short Swap
    Silver, Rare, Utility
    Magic Arcane
    Range 2
    Choose two target characters; exchange their positions.

    Silver, Rare, Attack
    Melee Sonic
    Range 1, Damage --
    Attach to target. That character may only target the character or group who played this card. Duration 2.
    Did you know that Elvish does not have a word for "underwear"?
    ParodyKnaveBob, Sir Veza and Maniafig like this.
  8. Flaxative

    Flaxative Party Leader Staff Member

    This is awesome, thanks Kalin.

    For the record, some of these parameters are less flexible than they might seem at a glance. I don't have a specific example in mind, but I am pretty sure some have hard-coded switches—so they'll do one thing if the parameter is set to X, and a different thing if it's set to Y, and then they'll break if it's set to anything else.
  9. Kalin

    Kalin Begat G'zok

    Yeah, Erratic Damage seems to only accept 3 or 6 for its parameter, and you probably shouldn't try to use anything other than a Form with ReplaceDrawComponent ("overload" might work if you wanted someone to draw nothing but malfunctions).

    Some things that probably would work, if you didn't care about balance:
    Beacon Factory
    Trait. Attach this card to yourself. Duration 2.
    When you play an Electrical card, create and attach a Laser Beacon card to a random occupied square.

    (The "random occupied square" is hardcoded, unfortunately.)

    Vampire Assassin
    Trait. Attach this card to yourself. Duration 3.
    Whenever you play a Penetrating card add Cantrip to that card and Heal 2 yourself.
    ParodyKnaveBob and SceoMyntan like this.
  10. Kalin

    Kalin Begat G'zok

    Now that we've seen what the building blocks are, let's look at specific cards to see how they combine to make a complete card.

    I'm going to start with Blocks because in a way they're the simplest type of card: there's only one block component, every Block uses it, and they don't use any other components (hybrid Blocks have other components for the non-Block features).

    On the other hand, this component is the most complicated because it needs lots of parameters to do everything Blocks do in this game. Parameters with "___Type" are generally filters that determine when it triggers, and anything that sounds like an action will only happen if the trigger roll succeeds.

    So there's our BlockComponent, with three parameters. The first one limits this Block to just Melee attacks, the second lets the defender move themself when successful, and the the third lets the defender move the attacker when successful.

    It took six parameters, but we managed to do everything with just one component. We have two random card creation effects here: if you block a Melee attack create a Melee Laser card, if you block Magic or Projectile create a Magic Laser card. (I don't know if the order of parameters makes any difference.)

    Even though there are only three parameters, this manages to be rather complex. First, the Block only triggers on Melee attacks. If it blocks an attack with the keyword "Step" then it also lets the defender move the attacker 2.

    BlockComponent is one of the few components that can see keywords, though many other components can see card type, attack type, and/or damage type.

    There's no keyword for "untargeted" so they needed a special parameter for it. And "Keep" is actually implemented as a roll: cards you aren't supposed to keep need a roll of 8. (One of these days I'm going to test if stacking harnesses will let me keep a Rusty Armor.)

    Not as complicated as you might expect: you can block for other allies, within range 3, and the target of the attack draws a card if the block is successful.

    So.. what about hybrids?
    There's the "moveSelf" parameter again, and this card has a second component so it can be played as a Move card.


    I mentioned above that Blocks are simple because they only need one component. Attack, Assist, and Utility cards need a targeting component to say which characters/squares are affected.

    The first component says we're targeting a single character (range specified elsewhere, normal LOS rules), second component says to discard 2 cards that have the attack type Magic (discard effects always discard oldest unless they say "random"). Then finally a Block limited to Magic.
    (Note that hybrid cards always list their types in alphabetical order: Block before Move, Attack before Block.)
    Testlum, Flaxative, Sir Veza and 2 others like this.

Share This Page