Skip to content
Development
Skill

/card-game

Build a card game: card data, deck/hand/discard zones, draw/shuffle/reshuffle, a turn structure, costs, and effect resolution. Use for a deckbuilder, TCG/CCG, or roguelike deckbuilder.

From plugin
awesome-gamedev-agent-skills
6.3k77 skills

Claude Code

$ npx -y skills add gamedev-skills/awesome-gamedev-agent-skills --skill card-game --agent claude-code

SKILL.md

card-game.SKILL.md
name: card-game
description: >
  Designs card games and deckbuilders in any engine: cards as data with one effect interpreter,
  deck zones, a trigger stack and seeded shuffles. Use for a Slay the Spire- or Balatro-like or a
  TCG, or cards that duplicate or streaky shuffles. Pair with the engine skill for card data and
  hand UI (`godot-resources`, `godot-ui-control`, `unity-scriptableobjects`). Not for grid
  crawlers (`roguelike`).

Card game

Owns the rules engine of a card game: zones, draw, costs, effect resolution, rewards and balance math, including the run structure of a roguelike deckbuilder. Engine skills supply the data assets and UI.

When to use

  • The core objects are cards moving between zones: deckbuilder, roguelike deckbuilder,

TCG/CCG, solitaire, poker-hand scorer, card battler.

  • Designing costs, draw, rewards, triggers, enemy intents or a scoring formula, or fixing

cards that duplicate, vanish or resolve in the wrong order.

**When not to use:** grid dungeon runs (`roguelike`); board games with matching or pushing rules (`puzzle`); an RPG with a small card minigame (start in `rpg`).

Workflow

1. **Name the reference game and fix the frame.** Write the numbers down before any card: deck size, hand size, draw per turn, resource per turn, what happens to the hand at end of turn, copy limits. Reference frames are in the table below. 2. **Model zones and cards as data.** Every card instance has a unique id and lives in exactly one zone. Card text maps to a list of ops for one interpreter (Pattern 1). 3. **Pick the resolution model:** a stack (last in resolves first, for response-heavy TCGs) or a queue (first in first, simpler for PvE deckbuilders). Write the order for simultaneous triggers (active player first, then by timestamp). 4. **Write a power budget** for one resource and price every card against it (below). 5. **Build the reward loop** (deckbuilders): after each fight offer 3 cards, pick 1 or skip, with rarity weighted by act; give removal at shops or events. 6. **Check it.** Write and run these as tests and report the results:

  • 10,000 random legal turns with a bot: after every action each card id appears in exactly

one zone and the total count never changes;

  • shuffle uniformity: shuffle a 4-card deck 24,000 times; each of the 24 orders should

land near 1,000 (a chi-square statistic above about 41 at 23 degrees of freedom means bias, p < 0.01);

  • same seed and same inputs replay to the same final state hash;
  • a trigger loop (A draws when B is drawn, B when A) stops at the depth cap with a log line;
  • a greedy bot plays the starter deck for 1,000 turns; print damage and block per turn and

size the first enemies from it (about 3-4 turns of starter damage is a common start).

Reference frames

| Game | Deck | Hand and draw | Resource | End of turn | |------|------|---------------|----------|-------------| | Slay the Spire | 10-card starter (Ironclad: 5 Strike, 4 Defend, Bash) | draw 5 | 3 energy | discard hand | | Balatro | 52 playing cards | hand size 8, play up to 5 | 4 hands, 3 discards per blind | redraw to 8 | | Hearthstone | 30 cards | hand cap 10, extra draws are destroyed | mana 1 to 10, +1 per turn | keep hand | | Magic: the Gathering | 60+ constructed, 40+ limited, max 4 copies | 7-card opening hand, draw 1 | lands | discard to 7 |

Balatro's run is 8 antes of three blinds (small 1x, big 1.5x, boss mostly 2x the ante's base score). Slay the Spire's enemies show their next action (intent), which is what makes a PvE card game a planning puzzle rather than a guess. Copy the idea, never the cards.

Power budget and deck math

  • **Budget per resource.** Pick a baseline and price everything against it. Slay the Spire's

starters set 1 energy = 6 damage (Strike) or 5 block (Defend), and an upgrade adds about half again (Strike+ deals 9). Rares may exceed the budget; zero-cost cards need a drawback or a small effect.

  • **Every added card dilutes the deck.** The chance a specific single card is in a 5-card

hand is 5/deck size: 50% in a 10-card deck, 33% at 15, 25% at 20. That is why skipping a reward or removing a Strike is often the strongest pick, and why removal belongs in the reward economy.

  • **Copies in constructed.** A 4-of in a 60-card deck is in the opening 7 about 40% of the

time and in the first 10 cards about 53% (hypergeometric). Use the same formula to tune any draw consistency.

  • **Cycle time** is deck size / draw per turn: a 10-card deck drawing 5 sees every card every

2 turns. Draw and deck thinning shorten it; that is where infinite combos come from.

  • **Scoring pipelines** (Balatro-style): fix the order and write it down, for example base

chips, then added chips, then added mult, then multiplying mult, applied left to right in slot order. Additive and multiplicative stages in the wrong order change scores by orders of magnitude.

Pattern 1: zones, draw and play

# Pseudocode. One zone per card instance; moving = remove from one list, append to another.
def draw(player, n):
    for _ in range(n):
        if not player.draw_pile:
            if not player.discard:
                return on_empty_draw(player)    # deck-out loss, fatigue, or simply stop
            player.draw_pile = player.discard; player.discard = []
            shuffle(player.draw_pile, player.rng)            # seeded Fisher-Yates (refs §6)
        card = player.draw_pile.pop()
        if len(player.hand) >= HAND_CAP:
            move(card, to=player.discard); log("burned", card)   # define overdraw explicitly
        else:
            player.hand.append(card)

def play(card, player, targets):
    if player.energy < cost(card) or not legal(card, targets):
        return False                                         # nothing changed yet
    player.energy -= cost(card)
    move(card, frm=player.hand, to=player.limbo)             # in play while resolving
    for op
Read more
@gamedev-skills
Ships withawesome-gamedev-agent-skills

<img src="docs/assets/awesome-gamedev-agent-skills-banner.png" width="820" alt="awesome-gamedev-agent-skills — game-dev skills for AI coding agents.

Stars on GitHub

Momentum

stars in total
6.3k
Star history of gamedev-skills/awesome-gamedev-agent-skills on GitHub, a chart by star-history.com

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills11d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about card-game.

Which coding agents can use card-game?
card-game installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.