Skip to content

Instantly share code, notes, and snippets.

@shakna-israel
Last active February 7, 2026 15:01
Show Gist options
  • Select an option

  • Save shakna-israel/1e27e67731fe15cbe6d4c35a6e4eb24b to your computer and use it in GitHub Desktop.

Select an option

Save shakna-israel/1e27e67731fe15cbe6d4c35a6e4eb24b to your computer and use it in GitHub Desktop.
Card Game

Vengent

version 2

A fast-paced card game.

Goal

Be the last player with cards left.

You win by attacking your opponent's cards now, or by "tagging" them with Curses that hurt them at the start of the next battle.


Setup

Decks: You may decide to either have a 52-card deck for each player, or randomly divide one deck between players.


Getting Started (First Battle)

Who Goes First

Both players shuffle their decks.

Both players draw one card from their deck.

The card with the highest Attack number goes first for the entire battle. Both cards are reshuffled into the deck.

If tied, redraw until there's a winner.

Draw Your Hand

Draw 3 cards for the start of battle, then draw 2 more for the round. (5 cards total for Round 1).

Running Out

If you run out of cards to draw, shuffle your discard pile and use it as your new deck.

After Win

After winning a battle, note the Attack value of your rightmost card.

Add this value to your blessing pool for the next battle.


Start of Battle (After First Battle)

Before anyone takes a turn, you must handle the Blessings and Curses from the last battle.

Every card in your hand starts with 20 Health.

1. Winner's Blessing

After winning a battle, note the Attack value of your rightmost card. Add this value to your blessing pool for the next battle.

2. Apply Curses

Curses hit your left-most card first.

If that card's health hits 0, it is discarded.

If there is still damage left, it moves to the next card.

If you lose all your cards here, you lose the game.

3. Apply Blessings

Add all your blessing pool to your right-most card's health.

4. Reset Pools

All blessing and curse values are expended. They reset to 0 for this battle.

5. New Battle Setup

  • Discard all remaining cards from the previous battle

  • Shuffle all your cards (deck + discard pile) to form a new deck

  • Determine who goes first (same process as first battle)

  • Draw your starting hand (3 cards + 2 cards = 5 total)


Each Round (Turn)

Draw Phase

Draw 2 cards at the start of your turn.

Action Phase

You must play every card in your hand. Each card does one of the following:

1. Attack

Deal damage to any enemy card you choose.

  • Calculation: Attack × Impact

  • Effect: Target card loses the calculated value of Health. If Health reaches 0, it is discarded.

  • After: Discard this card, draw 1 card

2. Bless

Save extra health for your next battle.

  • Requirement: Card must have "blessing" type

  • Calculation: Attack + Impact

    • If face card, add 5 (total: Attack + Impact + 5)
  • Effect: Add result to your blessing pool

  • After: Discard this card, draw 1 card

3. Curse

Send "delayed" damage to hit the enemy at the start of the next battle.

  • Requirement: Card must have "curse" type

  • Calculation: Attack + Impact

    • If face card, add 5 (total: Attack + Impact + 5)
  • Effect: Add result to enemy's curse pool

  • After: Discard this card, draw 1 card

4. Discard

Send a card to your discard pile and add to your blessing.

  • Requirement: Any card can be discarded

  • Calculation: Attack + Impact

    • If face card, subtract 5 (total: Attack + Impact - 5)

    • If calculation is less than zero, treat it as zero (-3 becomes 0)

  • Effect: Add result to your blessing pool

  • After: Discard this card, draw 1 card

Hint: Face cards are only useful for Blessing or Cursing.

Card Health: Damage persists only while a card is in your hand. If discarded and later redrawn, it returns with full 20 Health.

You cannot skip your turn.


Hand Size Growth

  • Battle start: 5 cards

  • After Round 1: 7 cards (drew 2, played 5 and drew 5)

  • After Round 2: 9 cards (drew 2, played 7 and drew 7)

  • Continues growing by 2 each round


Losing a Battle

You lose the battle when, at the end of your turn, your deck is empty AND you have no cards in hand.

You can always freely surrender and skip to the next battle. Lose the round to win the war.


Winning the Game

A Battle ends when only one player has cards left or everyone else surrenders.

The Game ends when all but one player is completely wiped out by Curses during the Start of Battle phase.


Card Values

Hint:

  • Red suits (Hearts/Diamonds): Face cards bless, numbered alternate

  • Black suits (Spades/Clubs): Face cards curse, Spades are all curses, Clubs alternate

  • Impact decreases: Hearts (3) > Diamonds (2) > Spades/Clubs (1)

id suit attack impact type face
heart:jack heart 0 4 blessing True
heart:queen heart 0 4 blessing True
heart:king heart 0 4 blessing True
heart:ace heart 0 4 blessing True
heart:2 heart 2 3 blessing False
heart:3 heart 3 3 curse False
heart:4 heart 4 3 blessing False
heart:5 heart 5 3 curse False
heart:6 heart 6 3 blessing False
heart:7 heart 7 3 curse False
heart:8 heart 8 3 blessing False
heart:9 heart 9 3 curse False
heart:10 heart 10 3 blessing False
diamond:jack diamond 0 4 blessing True
diamond:queen diamond 0 4 blessing True
diamond:king diamond 0 4 blessing True
diamond:ace diamond 0 4 blessing True
diamond:2 diamond 2 2 blessing False
diamond:3 diamond 3 2 curse False
diamond:4 diamond 4 2 blessing False
diamond:5 diamond 5 2 curse False
diamond:6 diamond 6 2 blessing False
diamond:7 diamond 7 2 curse False
diamond:8 diamond 8 2 blessing False
diamond:9 diamond 9 2 curse False
diamond:10 diamond 10 2 blessing False
spade:jack spade 0 4 curse True
spade:queen spade 0 4 curse True
spade:king spade 0 4 curse True
spade:ace spade 0 4 curse True
spade:2 spade 2 1 curse False
spade:3 spade 3 1 curse False
spade:4 spade 4 1 curse False
spade:5 spade 5 1 curse False
spade:6 spade 6 1 curse False
spade:7 spade 7 1 curse False
spade:8 spade 8 1 curse False
spade:9 spade 9 1 curse False
spade:10 spade 10 1 curse False
club:jack club 0 4 curse True
club:queen club 0 4 curse True
club:king club 0 4 curse True
club:ace club 0 4 curse True
club:2 club 2 1 blessing False
club:3 club 3 1 curse False
club:4 club 4 1 blessing False
club:5 club 5 1 curse False
club:6 club 6 1 blessing False
club:7 club 7 1 curse False
club:8 club 8 1 blessing False
club:9 club 9 1 curse False
club:10 club 10 1 blessing False

Values are as given by:

import csv

cards = []

suits = ['heart', 'diamond', 'spade', 'club']
face_cards = ['jack', 'queen', 'king', 'ace']

for suit in suits:
  for face in face_cards:
    card = {}
    card['id'] = f'{suit}:{face}'
    card['face'] = True
    card['suit'] = suit
    card['impact'] = 4
    card['attack'] = 0

    if suit in ['heart', 'diamond']:
      card['type'] = 'blessing'
    else:
      card['type'] = 'curse'

    cards.append(card)
  for i in range(2, 11):
    card = {}
    card['id'] = f'{suit}:{i}'
    card['face'] = False
    card['suit'] = suit
    card['attack'] = i

    if i % 2 == 0:
      card['type'] = 'blessing'
    else:
      card['type'] = 'curse'

    if suit == 'spade':
      card['type'] = 'curse'

    if suit == 'heart':
      card['impact'] = 3
    elif suit == 'diamond':
      card['impact'] = 2
    else:
      card['impact'] = 1

    cards.append(card)

keys = [
  'id',
  'suit',
  'attack',
  'impact',
  'type',
  'face',
]

rows = []
prev_suit = False
for card in cards:
  if prev_suit != card['suit']:
    rows.append([])
    rows.append(keys)
  values = []
  for k in keys:
    values.append(card[k])
  
  prev_suit = card['suit']  
  
  rows.append(values)

with open('cards.csv', 'w', newline='') as csvfile:
  writer = csv.writer(csvfile, dialect='excel')
  for row in rows:
    writer.writerow(row)

Copyright && Licensing

Released under CC0 1.0 Universal by James Milne.

Many thanks to my tortured playtesters.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment