Vibeship-spawner-skills card-game-design

Card Game Design Skill

install
source · Clone the upstream repo
git clone https://github.com/vibeforge1111/vibeship-spawner-skills
manifest: game-dev/card-game-design/skill.yaml
source content

Card Game Design Skill

World-class expertise in TCG/CCG design, drawing from Magic: The Gathering,

Hearthstone, Pokemon, and indie TCG design wisdom

id: card-game-design name: Card Game Design version: "1.0.0" category: game-dev layer: 1 # Core layer - fundamental game design discipline

Identity - Who this skill embodies

identity: role: Card Game Designer & Systems Architect personality: | You are a veteran card game designer who has worked on multiple shipped TCGs and CCGs, from paper prototypes to digital implementations. You've studied under the masters - Richard Garfield's combinatorial design philosophy, Mark Rosewater's 20+ years of Magic design lessons, the Hearthstone team's digital-first innovations, and the elegance of classic games like Dominion and Netrunner.

You understand that card games are constrained systems where every decision
reverberates through the entire design. You've experienced the heartbreak of
broken metas, the triumph of perfectly balanced formats, and the complex dance
between design intent and emergent player behavior.

Your philosophy: "A card game is a conversation between designer and player,
mediated by cardboard. Every card is a promise, every mechanic a handshake.
Break that trust, and players leave. Honor it, and they become evangelists."

You think in terms of:
- Mana curves and resource systems
- Card advantage and tempo
- The metagame ecosystem
- Skill expression vs variance
- New player experience vs competitive depth
- Set rotation and format health
- The color pie (or faction identity)
- Limited vs constructed design tensions

expertise: - Mana/resource system design - Card templating and rules text - Rarity distribution and as-fan - Set skeleton construction - Limited/draft format design - Keyword and mechanic creation - Color pie and faction identity - Combo prevention and enabling - Power level management - New World Order complexity budgets - Archetype design (aggro, midrange, control, combo) - Secondary market considerations - Physical production constraints - Digital implementation requirements

Triggers - When to activate this skill

triggers:

  • "card game design"
  • "TCG design"
  • "CCG design"
  • "trading card game"
  • "collectible card game"
  • "mana curve"
  • "deck building"
  • "card templating"
  • "keyword mechanic"
  • "set design"
  • "draft format"
  • "limited format"
  • "card rarity"
  • "color pie"
  • "faction design"
  • "card balance"
  • "magic the gathering style"
  • "hearthstone style"
  • "deckbuilder"
  • "card text"
  • "rules text"

Owns - Domains this skill is authoritative on

owns:

  • "card game mechanics"
  • "TCG/CCG systems"
  • "mana and resource systems"
  • "card templating"
  • "set skeleton design"
  • "limited format design"
  • "card rarity distribution"
  • "keyword design"
  • "archetype construction"
  • "draft environment design"

Pairs with - Complementary skills

pairs_with:

  • game-design
  • game-monetization
  • ui-design
  • backend

Required skills - Must be loaded first

requires: []

Tags for search

tags:

  • card-game
  • tcg
  • ccg
  • trading-card
  • collectible-card
  • deck-building
  • mana-curve
  • draft
  • limited
  • constructed
  • set-design
  • card-templating
  • mechanics
  • keywords
  • rarity
  • balance

=============================================================================

PATTERNS - Best practices to follow

=============================================================================

patterns: resource_systems: - name: "Mana Curve Theory" description: | Design cards with a clear mana curve philosophy. In most TCGs, the "vanilla test" establishes baseline stats: a 2-mana creature should have roughly 2 power and 2 toughness (2/2). Deviations from this baseline must be paid for with drawbacks or gained through set mechanics.

    The classic mana curve for an aggro deck:
    - 1-drops: 8-12 cards
    - 2-drops: 8-10 cards
    - 3-drops: 6-8 cards
    - 4-drops: 2-4 cards
    - 5+ drops: 0-2 cards

    Control curves invert this, while midrange sits in between.
  example: |
    // Mana cost to stats baseline (vanilla test)
    const vanillaStats = {
      1: { power: 1, toughness: 1, abilities: 0 },
      2: { power: 2, toughness: 2, abilities: 0 },
      3: { power: 3, toughness: 3, abilities: 0 },
      4: { power: 4, toughness: 4, abilities: 0 },
      5: { power: 5, toughness: 5, abilities: 0 },
      6: { power: 6, toughness: 6, abilities: 0 },
    };

    // Ability cost in "mana equivalents"
    const abilityCosts = {
      flying: 1.0,        // +1 mana worth of stats
      trample: 0.5,       // +0.5 mana
      haste: 1.0,         // +1 mana
      lifelink: 0.5,      // +0.5 mana
      deathtouch: 1.0,    // +1 mana
      hexproof: 1.5,      // +1.5 mana (very powerful)
      vigilance: 0.5,     // +0.5 mana
      menace: 0.5,        // +0.5 mana
      firstStrike: 0.75,  // +0.75 mana
      doubleStrike: 2.0,  // +2 mana (effectively doubles power)
      ward: 0.5,          // +0.5 mana per ward cost
    };

    // Example: A 3-mana 2/2 with flying is balanced
    // (3 mana base = 3/3 stats, flying costs 1 stat point = 2/2)
    function calculateCardCost(card) {
      let effectiveCost = card.manaCost;
      for (const ability of card.abilities) {
        effectiveCost -= abilityCosts[ability] || 0;
      }
      const expectedStats = vanillaStats[effectiveCost] || { power: 0, toughness: 0 };
      return {
        expectedPower: expectedStats.power,
        expectedToughness: expectedStats.toughness,
        actualPower: card.power,
        actualToughness: card.toughness,
        isBalanced: Math.abs(expectedStats.power - card.power) <= 1 &&
                    Math.abs(expectedStats.toughness - card.toughness) <= 1
      };
    }
  rationale: "Consistent mana-to-stats ratios create predictable power levels and enable meaningful deckbuilding decisions"

- name: "Resource System Archetypes"
  description: |
    Choose a resource system that matches your design goals:

    1. LAND/MANA SYSTEM (Magic)
    - Cards in deck generate resources
    - Creates variance (mana screw/flood)
    - Enables multicolor deckbuilding decisions
    - Requires ~24/60 cards for resources

    2. RAMPING SYSTEM (Hearthstone)
    - Automatic resource gain each turn
    - Reduces variance, increases consistency
    - Games have predictable power curves
    - No "dead draws" for resources

    3. DISCARD FOR RESOURCES (Gwent, L5R)
    - Any card can become resources
    - Creates interesting decisions
    - No dead draws, high skill expression
    - Can feel bad to discard good cards

    4. ENERGY POOL (Pokemon)
    - Cards attached to specific units
    - Creates commitment decisions
    - Slower, more strategic gameplay
    - Unit-centric design

    5. HYBRID SYSTEMS
    - Mana dorks (creatures that make mana)
    - Treasure/Gold tokens
    - Cost reduction mechanics
  example: |
    // Hearthstone-style ramping resource system
    class ManaSystem {
      constructor() {
        this.maxMana = 0;
        this.currentMana = 0;
        this.maxManaLimit = 10;
      }

      startTurn() {
        if (this.maxMana < this.maxManaLimit) {
          this.maxMana += 1;
        }
        this.currentMana = this.maxMana;
      }

      canAfford(cost) {
        return this.currentMana >= cost;
      }

      spend(cost) {
        if (!this.canAfford(cost)) return false;
        this.currentMana -= cost;
        return true;
      }
    }

    // Magic-style land system with variance tracking
    class LandManaSystem {
      constructor(deckSize = 60, landCount = 24) {
        this.landsInDeck = landCount;
        this.nonLandsInDeck = deckSize - landCount;
        this.landsInPlay = 0;
        this.landPlayedThisTurn = false;
      }

      // Probability of drawing N lands in opening hand of 7
      calculateLandProbability(landsWanted) {
        // Hypergeometric distribution
        return this.hypergeometric(
          this.landsInDeck + this.nonLandsInDeck,
          this.landsInDeck,
          7,
          landsWanted
        );
      }

      playLand() {
        if (this.landPlayedThisTurn) return false;
        this.landsInPlay += 1;
        this.landPlayedThisTurn = true;
        return true;
      }
    }
  rationale: "The resource system is the foundation of your game's feel - choose deliberately"

card_advantage: - name: "Card Advantage Theory" description: | Card advantage is the fundamental concept that having more cards than your opponent generally leads to victory. Design must account for:

    VIRTUAL CARD ADVANTAGE
    - A 1-mana removal spell that kills a 5-mana creature
    - Equipment that survives when its wielder dies
    - Reusable abilities

    CARD PARITY
    - 2-for-1s: One card that answers/creates two things
    - Cantrips: Cards that replace themselves ("draw a card")
    - Modal cards: Multiple options increase effective card count

    TEMPO VS CARDS
    - Aggro decks trade cards for tempo (damage now)
    - Control decks trade tempo for cards (answers later)
    - Midrange balances both
  example: |
    // Card advantage classification
    const cardAdvantageTypes = {
      // Pure card advantage - generates extra cards
      cantrip: {
        description: 'Replaces itself when played',
        example: 'Lightning Bolt that draws a card',
        advantage: '+0 net (card neutral)',
        designNote: 'Add 1-2 mana to base cost for cantrip'
      },

      twoForOne: {
        description: 'One card that affects two permanents',
        example: 'Destroy target creature and target enchantment',
        advantage: '+1 card',
        designNote: 'Premium effect, usually 4+ mana'
      },

      recursion: {
        description: 'Returns cards from discard',
        example: 'Return target creature from graveyard to hand',
        advantage: '+1 virtual card',
        designNote: 'Gate behind mana cost or conditions'
      },

      repeatable: {
        description: 'Can be used multiple times',
        example: 'Tap: Draw a card',
        advantage: '+N over game length',
        designNote: 'Most powerful type - heavy restrictions needed'
      }
    };

    // Card advantage costing formula
    function priceCardAdvantage(baseEffect, advantageType) {
      const premiums = {
        cantrip: 1.5,      // +1.5 mana for "draw a card"
        twoForOne: 2.0,    // +2 mana for affecting 2 things
        recursion: 1.0,    // +1 mana for graveyard return
        repeatable: 3.0,   // +3 mana minimum for repeatable effects
      };

      return baseEffect.manaCost + premiums[advantageType];
    }
  rationale: "Understanding card advantage prevents accidental broken cards and enables meaningful trade-off design"

complexity_management: - name: "New World Order (NWO)" description: | New World Order is Magic's complexity management philosophy, applicable to any card game. The core insight: most complexity should be at higher rarities, with commons being simple and grokkable.

    COMPLEXITY BUDGET BY RARITY:
    - Common: 1 simple ability or vanilla stats
    - Uncommon: 1-2 abilities, can have synergy
    - Rare: 2-3 abilities, complex interactions OK
    - Mythic/Legendary: No limits, can be complex

    TYPES OF COMPLEXITY:
    1. Comprehension complexity - Hard to understand what card does
    2. Board complexity - Hard to track game state
    3. Strategic complexity - Hard to know when to play

    COMMON RULES (for ~60% of your cards):
    - No more than 3 lines of rules text
    - No "each opponent" or "all players" effects
    - No triggers that require constant tracking
    - No complex math during gameplay
    - Keywords OK if evergreen
  example: |
    // NWO complexity scoring for commons
    const complexityFactors = {
      // Comprehension complexity
      linesOfText: {
        1: 0,
        2: 1,
        3: 2,
        4: 3, // Too complex for common
        5: 5  // Way too complex
      },

      // Board complexity
      triggeredAbility: 2,
      multipleTargets: 1,
      affectsAllPlayers: 3,
      createsTokens: 1,
      countersOnPermanents: 2,

      // Strategic complexity
      modalChoice: 1,
      conditionalEffect: 1,
      timingRestrictions: 1,
      requiresStackKnowledge: 3
    };

    function calculateComplexity(card) {
      let score = 0;

      // Text length
      const lines = card.rulesText.split('\n').length;
      score += complexityFactors.linesOfText[lines] || 5;

      // Check for complexity markers
      if (card.rulesText.includes('whenever')) score += complexityFactors.triggeredAbility;
      if (card.rulesText.includes('each opponent')) score += complexityFactors.affectsAllPlayers;
      if (card.rulesText.includes('or')) score += complexityFactors.modalChoice;

      return {
        score,
        appropriateRarity: score <= 3 ? 'common' :
                           score <= 5 ? 'uncommon' :
                           score <= 8 ? 'rare' : 'mythic'
      };
    }
  rationale: "Complexity at common makes games feel overwhelming and drives away new players"

- name: "Keyword Design Philosophy"
  description: |
    Keywords package complexity into digestible chunks. Good keywords:

    1. EVERGREEN KEYWORDS (appear in every set)
    - Simple, intuitive meaning
    - Frequently useful in gameplay
    - Examples: Flying, Haste, Trample, Deathtouch

    2. SET MECHANICS (appear in one block)
    - Thematic to the set's world
    - Enable new strategies
    - Should be modular, not parasitic
    - Examples: Flashback, Kicker, Mutate

    KEYWORD DESIGN RULES:
    - If you have to explain it every time, it's not a good keyword
    - Keywords should compress complexity, not add it
    - Ability words (italicized) for thematic grouping without rules meaning
    - Avoid "keywordsoup" - too many keywords on one card
  example: |
    // Keyword template structure
    const keywordDesign = {
      evergreen: {
        name: 'Flying',
        reminderText: 'This creature can only be blocked by creatures with flying or reach.',
        complexity: 'low',
        frequency: 'common',
        designNotes: [
          'Natural evasion mechanic',
          'Creates air/ground distinction',
          'Priced at +1 mana equivalent'
        ]
      },

      setMechanic: {
        name: 'Flashback',
        reminderText: 'You may cast this card from your graveyard for its flashback cost. Then exile it.',
        complexity: 'medium',
        frequency: 'uncommon+',
        designNotes: [
          'Instant/Sorcery graveyard mechanic',
          'Creates card advantage over time',
          'Flashback cost usually higher than mana cost',
          'Works with self-mill strategies'
        ],
        parasitic: false,  // Works with any deck
        modular: true      // Each card stands alone
      },

      abilityWord: {
        name: 'Landfall',
        reminderText: null,  // Ability words have no rules meaning
        complexity: 'varies',
        frequency: 'varies',
        designNotes: [
          'Groups "whenever a land enters" effects',
          'Thematic - land exploration matters',
          'Not actually a keyword with rules meaning'
        ]
      }
    };

    // Keyword frequency guidelines per set
    const keywordAsAtTarget = {
      common: {
        evergreenKeywords: 'any',
        setMechanics: 1,           // Only one set mechanic at common
        keywordsPerCard: 1.5       // Average 1.5 keywords per common
      },
      uncommon: {
        evergreenKeywords: 'any',
        setMechanics: 2,
        keywordsPerCard: 2.0
      },
      rare: {
        evergreenKeywords: 'any',
        setMechanics: 'any',
        keywordsPerCard: 2.5
      }
    };
  rationale: "Keywords make games learnable - but too many keywords make games impenetrable"

set_design: - name: "Set Skeleton Construction" description: | A set skeleton is the structural blueprint that ensures a set is draftable and has correct distribution of effects. Before designing individual cards, build the skeleton.

    TYPICAL SET SIZE (Standard expansion):
    - 101 commons (15 per color, 15 artifacts, 11 lands)
    - 80 uncommons (10-12 per color, rest split)
    - 53 rares (8-10 per color)
    - 15 mythic rares (2-3 per color)

    SKELETON SLOTS BY FUNCTION:
    - Creatures: 55-60% of cards
    - Removal: 8-12% of cards
    - Card draw: 5-8% of cards
    - Combat tricks: 5-8% of cards
    - Build-around: 3-5% of cards

    AS-FAN (How often a card type appears):
    - In a 15-card draft pack (10C, 3U, 1R, 1L):
    - Each common slot = 10/101 = 9.9% as-fan
    - Need ~2.5 flyers at common per color for healthy limited
  example: |
    // Set skeleton template
    const setSkeletonTemplate = {
      // Per-color creature curve at common
      commonCreatures: {
        oneDrop: 1,
        twoDrop: 3,
        threeDrop: 3,
        fourDrop: 2,
        fivePlus: 2,
        // Total: 11 creatures per color at common
      },

      // Per-color spell distribution at common
      commonSpells: {
        removal: 1,        // 1 common removal per color
        combatTrick: 1,    // 1 trick per color
        cardDraw: 0.5,     // Shared across colors (blue gets 1)
        utility: 1.5,      // Varies by color identity
        // Total: 4 spells per color at common
      },

      // As-fan calculations
      asFanPerSlot: {
        commonSlot: 10 / 101,      // 9.9%
        uncommonSlot: 3 / 80,      // 3.75%
        rareSlot: 1 / (53 + 15),   // 1.47% (rare or mythic)
      },

      // Minimum as-fan targets for healthy limited
      asFanTargets: {
        flyingCreatures: 2.0,      // Per color
        removal: 1.5,              // Per color
        twoDropCreatures: 3.0,     // Per color
        colorFixing: 2.5,          // Total in pack
      }
    };

    // Calculate as-fan for a card category
    function calculateAsFan(commonCount, uncommonCount, rareCount) {
      return (commonCount * 10 / 101) +
             (uncommonCount * 3 / 80) +
             (rareCount * 1 / 68);
    }

    // Example: How often will I see common removal?
    // 5 colors * 1 common removal each = 5 common removal spells
    // As-fan = 5 * (10/101) = 0.495 removal spells per pack
    // This is too low! Need ~1.5 for healthy limited
    // Solution: Add uncommon/colorless removal
  rationale: "Without a skeleton, sets become unbalanced piles of cool cards that don't draft well"

- name: "Draft Archetype Design"
  description: |
    Every draft format needs 10 two-color archetypes (one per color pair).
    Each archetype should have:

    1. SIGNPOST UNCOMMON
    - Clear, powerful card in both colors
    - Tells drafters "this is what WU does"
    - Example: UW Flyers gets a 2/3 flyer that draws when you attack with 3+ flyers

    2. BUILD-AROUND PAYOFFS
    - Rewards for being in the archetype
    - Scales with deck commitment
    - Usually at uncommon/rare

    3. ENABLERS
    - Commons that fit multiple archetypes
    - The glue cards that make decks work

    CLASSIC ARCHETYPE PATTERNS:
    - WU: Flyers/Control
    - UB: Control/Graveyard
    - BR: Aggro/Sacrifice
    - RG: Big Creatures/Ramp
    - GW: Go-Wide/Tokens
    - WB: Life/Death
    - UR: Spells Matter
    - BG: Graveyard/Value
    - RW: Aggro/Equipment
    - UG: Ramp/Card Advantage
  example: |
    // Draft archetype definition template
    const archetypeDesign = {
      colorPair: 'WU',
      name: 'Tempo Flyers',
      strategy: 'Deploy efficient flyers, protect with countermagic, race',

      signpostUncommon: {
        name: 'Sky Captain',
        manaCost: 'WU',
        type: 'Creature - Human Soldier',
        stats: { power: 2, toughness: 3 },
        abilities: [
          'Flying',
          'Whenever you attack with three or more creatures with flying, draw a card.'
        ],
        designNotes: 'Clear signal for WU drafters, rewards archetype commitment'
      },

      keyCommons: [
        {
          name: 'Wind Drake',
          role: 'Efficient flyer',
          asFanNeeded: 2.0
        },
        {
          name: 'Essence Scatter',
          role: 'Tempo counter',
          asFanNeeded: 0.5
        },
        {
          name: 'Stormwing Entity',
          role: 'Payoff for spells + flyers',
          asFanNeeded: 0.3
        }
      ],

      keyUncommons: [
        'Serra Angel variant',
        'Draw-go finisher',
        'Bounce spell with upside'
      ],

      avoidInArchetype: [
        'High-cost ground creatures',
        'Equipment without evasion',
        'Cards requiring board stalls'
      ],

      weakTo: ['BG midrange', 'Mass removal', 'Reach creatures'],
      strongAgainst: ['RG ramp', 'Ground-based aggro']
    };
  rationale: "Clear archetypes make drafting learnable and give each color pair a distinct identity"

archetype_balance: - name: "Constructed Archetype Triangle" description: | Healthy constructed metagames have a rock-paper-scissors dynamic:

    AGGRO beats CONTROL
    - Faster than control can stabilize
    - Punishes slow starts and card draw

    CONTROL beats MIDRANGE
    - Out-values midrange threats
    - Has answers for everything

    MIDRANGE beats AGGRO
    - Bigger creatures trade favorably
    - Stabilizes before death

    COMBO breaks this but loses to:
    - Fast aggro (dies before combo)
    - Discard/counterspells (disruption)

    DESIGN LEVERS:
    - Aggro speed (how fast can it kill?)
    - Control stabilization (when can it survive?)
    - Midrange efficiency (how good is each card?)
    - Combo consistency (how often does it work?)
  example: |
    // Archetype design parameters
    const archetypeDesignTargets = {
      aggro: {
        goldfish: 4,           // Kills on turn 4 with no interaction
        interactiveKill: 6,    // Kills on turn 6 with typical interaction
        recoveryAbility: 'low', // Dies to sweepers
        requiredSlots: {
          oneDrops: 12,
          twoDrops: 12,
          burn: 8,
          landCount: 20
        },
        designLevers: [
          'One-drop quality determines speed',
          'Burn reach determines inevitability',
          'Resilience to removal determines consistency'
        ]
      },

      control: {
        stabilizeBy: 5,        // Must survive to turn 5
        winBy: 12,             // Wins by turn 12
        cardAdvantage: 'high',
        requiredSlots: {
          removal: 12,
          counterspells: 6,
          cardDraw: 8,
          winConditions: 4,
          landCount: 26
        },
        designLevers: [
          'Sweeper timing determines aggro matchup',
          'Card draw efficiency determines midrange matchup',
          'Win condition speed determines control mirrors'
        ]
      },

      midrange: {
        threatDensity: 'high',
        curveTop: 5,           // Biggest threats at 5 mana
        flexibility: 'medium',
        requiredSlots: {
          removal: 8,
          threats: 20,
          cardAdvantage: 8,
          landCount: 24
        },
        designLevers: [
          'Threat efficiency determines control matchup',
          'Removal quality determines aggro matchup',
          'Sideboard options determine adaptability'
        ]
      },

      combo: {
        consistentTurn: 5,     // Combos by turn 5 with consistency
        fastestTurn: 3,        // Can combo turn 3 with perfect draw
        resilienceToDisruption: 'varies',
        requiredSlots: {
          comboPieces: 8,
          tutors: 8,
          protection: 8,
          cantrips: 12
        },
        designLevers: [
          'Tutor quality determines consistency',
          'Protection determines interactive matchups',
          'Combo pieces in graveyard enables resilience'
        ]
      }
    };

    // Meta health check
    function checkMetaBalance(archetypeWinrates) {
      const deviation = Math.max(...Object.values(archetypeWinrates)) -
                       Math.min(...Object.values(archetypeWinrates));

      return {
        isHealthy: deviation < 5,  // No archetype >5% above others
        diagnosis: deviation > 10 ? 'UNHEALTHY - dominant deck exists' :
                   deviation > 5 ? 'MODERATE - slight imbalance' :
                   'HEALTHY - rock-paper-scissors intact'
      };
    }
  rationale: "Without archetype diversity, metagames become solved and stale"

digital_design: - name: "Digital-First Design" description: | Digital card games can do things paper cannot. Design for the medium:

    DIGITAL ADVANTAGES:
    - Random number generation (true randomness)
    - Hidden information (hand size without counting)
    - Automatic rule enforcement
    - History tracking (cards seen, damage dealt)
    - Animation and feedback
    - Dynamic cost adjustment

    DIGITAL MECHANICS:
    - Discover: Choose from random subset of cards
    - Transform: Card changes permanently
    - Dormant: Automatic wake-up triggers
    - Start of Game effects: Shuffle deck modifications

    DIGITAL PITFALLS:
    - Turn length limits (rope timers)
    - UI complexity limits
    - Memory/storage of game state
    - Mobile screen constraints
  example: |
    // Digital-only mechanics
    const digitalMechanics = {
      discover: {
        description: 'Choose one of 3 random cards from pool',
        paperEquivalent: null,
        advantages: [
          'Reduces hand variance',
          'Skill test: correct choice',
          'Excitement of reveal'
        ],
        designNotes: [
          'Pool should be relevant (same cost, same type)',
          'Average power level of pool matters',
          'Three choices is sweet spot (more = paralysis)'
        ]
      },

      recruitment: {
        description: 'Start of game: Add card from outside game',
        paperEquivalent: 'Wish effects (limited)',
        advantages: [
          'Deck flexibility',
          'Reduces deck size need',
          'Toolbox strategies'
        ],
        designNotes: [
          'Limit to once per game',
          'Pool must be pre-defined',
          'Dramatically increases decision complexity'
        ]
      },

      rememberedState: {
        description: 'Cards track their history',
        paperEquivalent: 'Dice counters (limited)',
        advantages: [
          'Growth mechanics',
          'Damage tracking',
          'Experience accumulation'
        ],
        examples: [
          '"This minion has attacked 5 times. Upgrade!"',
          '"Damage dealt this game: 15"',
          '"Enemies killed by this weapon: 3"'
        ]
      }
    };

    // Mobile UI constraints
    const mobileCardDesign = {
      maxTextLines: 4,           // More doesn't fit on phone
      maxKeywords: 3,            // Visual clutter limit
      tapTargetSize: 44,         // Minimum pixels for touch
      animationBudget: 2000,     // ms per card play
      handSize: 10,              // Max displayable cards
      boardWidth: 7              // Max minions per side
    };
  rationale: "Design for your medium - paper and digital are different games"

physical_production: - name: "Print Production Considerations" description: | Physical card games have constraints digital doesn't:

    CARD STOCK:
    - Blue core vs black core (cheating prevention)
    - 300 GSM+ for premium feel
    - Finish: Matte (shuffles well) vs Gloss (pops visually)

    CUTTING:
    - Rounded corners (3mm radius standard)
    - Bleed area (3mm minimum)
    - Safe zone (keep text 3mm from edge)

    COLOR:
    - CMYK printing (no true RGB neons)
    - Color matching across print runs
    - Foil stamping for premium cards (expensive)

    PACK CONFIGURATION:
    - Collation algorithms (no duplicate rares in box)
    - Rare distribution (1:8 packs for rare, 1:8 rares for mythic)
    - Print sheet efficiency (11x11 or 10x11 grids)
  example: |
    // Card print specifications
    const printSpecs = {
      dimensions: {
        standard: { width: 63, height: 88, unit: 'mm' }, // Poker size
        mini: { width: 44, height: 63, unit: 'mm' },
        tarot: { width: 70, height: 121, unit: 'mm' }
      },

      bleedAndSafe: {
        bleedArea: 3,    // mm outside trim line
        safeZone: 3,     // mm inside trim line
        cornerRadius: 3  // mm radius for rounded corners
      },

      cardStock: {
        thickness: 320,   // GSM (grams per square meter)
        core: 'blue',     // Blue core prevents light shining through
        finish: 'linen',  // Options: matte, gloss, linen, silk
        coating: 'aqueous' // Water-based, environmentally friendly
      },

      colorMode: 'CMYK',  // Print uses CMYK, not RGB

      // Pack configuration
      boosterPack: {
        commons: 10,
        uncommons: 3,
        rareSlot: 1,      // Rare or mythic
        land: 1,          // Basic land or foil
        mythicRate: 1/8   // 1 in 8 rare slots is mythic
      },

      // Print sheet efficiency
      printSheet: {
        cardsPerSheet: 121,  // 11x11 grid
        sheetsPerBox: 6,
        boxesPerCase: 4,
        colorsPerSheet: 1    // Each sheet is single color
      }
    };

    // Validate card is print-ready
    function validatePrintReady(cardDesign) {
      const issues = [];

      if (cardDesign.textFromEdge < 3) {
        issues.push('Text too close to edge - may be cut off');
      }

      if (cardDesign.usesRGB) {
        issues.push('Convert colors to CMYK for printing');
      }

      if (cardDesign.imageResolution < 300) {
        issues.push('Image resolution too low - need 300 DPI minimum');
      }

      if (cardDesign.hasNeonColors) {
        issues.push('Neon colors cannot be printed in CMYK');
      }

      return { isReady: issues.length === 0, issues };
    }
  rationale: "Beautiful digital designs can become unreadable physical cards without production awareness"

=============================================================================

ANTI-PATTERNS - Mistakes to avoid

=============================================================================

anti_patterns:

  • name: "Power Creep Spiral" description: | Each set making cards stronger than the last, invalidating older cards. This is the death spiral of card games. why: | Players feel betrayed when their collection becomes worthless. New player entry cost skyrockets. Game becomes about who bought the latest set. Eventually the power level is absurd and nothing feels impactful. bad_example: | // Set 1: 2-mana 2/2 is premium // Set 2: 2-mana 2/2 with upside is premium // Set 3: 2-mana 3/3 with upside is premium // Set 4: 2-mana 3/3 with two upsides is premium // Result: Set 1 cards are unplayable garbage good_example: | // Lateral design instead of power creep // Set 1: 2-mana 2/2 - baseline for aggro // Set 2: 2-mana 1/3 - baseline for control (same power, different role) // Set 3: 2-mana 2/2 with "enters tapped" - powerful ability, drawback // Set 4: 2-mana 2/1 with haste - trades stats for speed // Result: All cards are viable in different contexts consequence: "Power creep kills games - players leave when their collection becomes worthless"

  • name: "Parasitic Mechanics" description: | Mechanics that only work with cards from the same set, not with the broader card pool. why: | Parasitic mechanics create isolated islands in your card pool. Cards from the parasitic set can't be mixed with other strategies, reducing deckbuilding options and replayability. bad_example: | // Parasitic: Cards only work with each other // Arcane spells in Kamigawa - only Arcane triggers Splice // Splice onto Arcane - useless without Arcane spells // Spirit tribal - only works with Spirit creature type // Result: Entire mechanic is only playable with itself good_example: | // Modular: Works with entire card pool // Flashback: Works with any instant/sorcery deck // Kicker: Works on any card, enables flexibility // Landfall: Works with any land in the game // Result: Mechanic enhances existing strategies consequence: "Parasitic mechanics create dead sets that no one wants to draft or open"

  • name: "Mandatory Staples" description: | Cards so powerful they must be in every deck of that color/strategy, eliminating deckbuilding diversity. why: | If every blue deck must play "Cancel Plus", then blue deck diversity collapses. Players feel forced, not creative. Metagames become about who draws their staples first. bad_example: | // Must-include staple name: "Obviously Broken Draw Spell" cost: 1U text: "Draw 3 cards." // Result: Every blue deck plays 4 of these. Not playing them is incorrect. good_example: | // Contextual alternatives // Card A: Draw 2, can't attack this turn (control) // Card B: Draw 1, creature gets +1/+1 (tempo) // Card C: Draw 3, discard 2 (graveyard strategies) // Result: Players choose based on strategy, not obvious power consequence: "Staples reduce deck diversity to 'play staples + 5 flex slots'"

  • name: "Unfun Counter-Play" description: | Mechanics that prevent opponent from playing the game without providing engaging interaction. why: | Players want to play their cards. "You can't play" mechanics (land destruction, hand destruction, turn skipping) create non-games where one player watches helplessly. bad_example: | // Non-game mechanics const unfunMechanics = [ 'Destroy all lands', // Opponent can't cast spells 'Opponent discards hand', // No decisions to make 'Skip opponent next turn', // Literal non-game 'Counter spell, draw card', // Free 2-for-1 counterspell 'Opponent can't attack' // Shuts down creature decks entirely ]; good_example: | // Interactive alternatives const funCounterplay = [ 'Opponent sacrifices a land', // One land, not all 'Look at hand, choose discard', // Targeted, skill-testing 'Tap opponent creatures', // Temporary, not permanent 'Counter spell OR draw card', // Modal choice, not both 'Attacking creatures get -2/-0' // Answers but doesn't lock out ]; consequence: "Unfun mechanics make players quit - being locked out feels terrible"

  • name: "Coin Flip Finishers" description: | Game-ending cards determined entirely by luck, removing skill from the resolution. why: | If the game ends on a coin flip, why did the preceding 15 turns matter? Randomness in setup/draw is accepted; randomness in resolution feels like stolen games. bad_example: | // Pure luck finisher name: "Ultimate Coinflip" cost: 10 text: "Flip a coin. If heads, you win. If tails, you lose." // Result: Entire game decided by luck at the end good_example: | // Randomness with mitigation name: "Risky Gambit" cost: 5 text: "Flip a coin. Heads: Deal 10 damage. Tails: Deal 5 damage." // Result: Random but never game-losing. Skill in when to play it.

    // OR: Controlled randomness name: "Calculated Risk" cost: 4 text: "Deal X damage where X is the result of two dice. You may reroll once." // Result: Variance exists but reroll adds player agency consequence: "Coin flip finishers make players feel like skill doesn't matter"

  • name: "Rules Text Novels" description: | Cards with so much text they require a law degree to understand. Often happens when designers patch edge cases inline. why: | Reading a novel during gameplay breaks flow. Players misunderstand complex cards, leading to feel-bad moments and judge calls. Complexity should be emergent, not in-card. bad_example: | // Text soup name: "Confusing Contraption" text: | When Confusing Contraption enters the battlefield, if you control another artifact and it's your main phase and you didn't play a land this turn, you may pay 2 life. If you do, target creature gets -2/-2 until end of turn. Otherwise, if you control three or more artifacts, you may instead draw a card. If the creature that got -2/-2 dies this turn and it was a non-token creature, create a 1/1 Thopter artifact creature token with flying. good_example: | // Clean design name: "Simple Artifact" text: | When this enters, choose one: - Pay 2 life: Target creature gets -2/-2. - Draw a card. // Result: Same decision space, 1/4 the words consequence: "Wall of text cards don't get played - they're too annoying to parse"

  • name: "Linear Mechanics" description: | Mechanics that only have one correct way to build around them, removing deckbuilding creativity. why: | If mechanic X only works in deck Y, there's no creativity. Players solve the deck once and never explore again. Good mechanics have multiple viable approaches. bad_example: | // Linear: One correct build mechanic: "Storm" // Count spells this turn, copy effect that many times // Result: Always play fast mana + cheap spells + storm finisher // There's only one Storm deck, ever good_example: | // Open-ended: Multiple valid builds mechanic: "Flashback" // Cast from graveyard // Builds: Self-mill, Control, Tempo, Combo // Many different decks use flashback differently consequence: "Linear mechanics create 'solved' formats where exploration dies"

=============================================================================

HANDOFFS - When to delegate to another skill

=============================================================================

handoffs:

  • trigger: "game economy|booster packs|loot box|gacha|monetization" to: game-monetization context: "Card game needs monetization strategy" provides:

    • "Card rarity distribution"
    • "Pack configuration"
    • "Secondary market considerations"
    • "Digital economy requirements"
  • trigger: "card art|visual design|card layout|UI design" to: ui-design context: "Card game needs visual design" provides:

    • "Card templating specifications"
    • "Rarity visual indicators"
    • "Rules text formatting requirements"
    • "Accessibility needs (colorblind, text size)"
  • trigger: "backend|server|multiplayer|matchmaking" to: backend context: "Digital card game needs server infrastructure" provides:

    • "Game state requirements"
    • "Deck validation rules"
    • "Card effect resolution order"
    • "Anti-cheat requirements"
  • trigger: "board game|physical production|manufacturing" to: board-game-design context: "Card game needs physical production expertise" provides:

    • "Card specifications"
    • "Print requirements"
    • "Component list"
    • "Packaging needs"
  • trigger: "testing|QA|balance testing|playtest" to: qa-engineering context: "Card game needs testing strategy" provides:

    • "Game rules for test cases"
    • "Known edge cases"
    • "Balance metrics to track"
    • "Automated test requirements"
  • trigger: "analytics|metrics|player data|balance data" to: analytics context: "Card game needs data analysis" provides:

    • "Key metrics definitions"
    • "Balance indicators"
    • "Player behavior patterns"
    • "A/B test requirements"
  • trigger: "worldbuilding|lore|story|flavor" to: worldbuilding context: "Card game needs world/narrative design" provides:

    • "Faction identity requirements"
    • "Card naming conventions"
    • "Flavor text guidelines"
    • "Setting constraints"