Skip to main content

High-performance card game environment

Project description

Essence Wars

A deterministic strategy card game engine

Try in ColabQuick StartFeaturesProject StructureDocumentationContributing


Try it in Google Colab

Want to build an AI agent for Essence Wars? Jump right in — no setup required:

Notebook Description
Open In Colab Quickstart — Explore the game engine, play games, see the API
Open In Colab Train a PPO Agent — Build and train a neural network to play
Open In Colab Evaluate & Benchmark — Test agents against built-in bots

What is Essence Wars?

Essence Wars is a strategic two-player card game engine with a focus on:

  • Perfect Information (Engine) — The core engine is fully open: bots and ML agents see all cards, hands, and decks. In the desktop UI, opponent hands are hidden for a more natural play experience. Victory comes from outthinking your opponent, not luck.
  • Deterministic Execution — Seeded RNG ensures every game is reproducible.
  • Lane-Based Combat — Creatures occupy board positions, creating spatial strategy alongside card selection.

Gameplay

Features

Desktop Application

Full-featured Tauri desktop client with Human vs AI, Spectator mode, Replays, and Deck Builder.

Main Menu Spectator Mode Deck Builder

Test Lab 🧪

Built-in QA test harness for verifying game mechanics. Each scenario pre-loads the right deck, bot, and seed — one click to reproduce any mechanic interaction.

Test Lab

Scenarios are grouped by mechanic (Ambush, Flanking, Level-Up, Overload, Prepare, Ritual) with both Player-side and Opponent-side variants, so you can verify a mechanic from either perspective. Adding a new scenario is a single .toml file drop — no recompile needed.

AI & Machine Learning

  • Multiple Bot Types — Random, Greedy (28 tunable weights), MCTS, Alpha-Beta search
  • Python ML Framework — Gymnasium/PettingZoo environments, PPO, AlphaZero, Game Transformer
  • Training Infrastructure — Callbacks, experiment tracking, W&B integration

Claude Code Integration

Play Essence Wars directly in Claude Code via MCP (Model Context Protocol):

  • Natural language game control
  • AI move recommendations with analysis
  • Live game visualization in Tauri UI (Launch the Essence Wars UI App, and ask Claude to sync, watch her play the game live in the App!)

Quick Start

Play the Desktop App

# Clone and build
git clone https://github.com/christianWissmann85/essence-wars
cd essence-wars
cargo build --release

# Launch the UI
cd crates/essence-wars-ui
pnpm install && pnpm tauri:dev

Train Your Own AI Agent

The fastest way to get started is the Colab notebooks above. For local development:

# Install Python package
uv pip install essence-wars[train]

# 1. Train a PPO agent
uv run python python/scripts/training/ppo.py --timesteps 500000

# 2. Export to ONNX (the training script prints the exact command to use)
uv run python -m essence_wars.agents.export_onnx \
  experiments/ppo/<your_run>/best_model.pt \
  ~/.essence-wars/agents/my_agent.onnx

# 3. Play against it in the CLI
cargo run --release --bin arena -- \
  --bot1 greedy --deck1 architect_fortify \
  --bot2 "neural:$HOME/.essence-wars/agents/my_agent.onnx" --deck2 archon_burst \
  --games 100

Exported .onnx agents in ~/.essence-wars/agents/ are also automatically available in the desktop app's bot selection menu. See the Python README for the full guide.

Play via Claude Code (MCP)

Add to your .mcp.json:

{
  "mcpServers": {
    "essence-wars": {
      "command": "./target/release/essence-wars-mcp"
    }
  }
}

Then in Claude Code: "Start a game with the Iron Wall deck against Swarm Aggro"

Project Structure

essence-wars/
├── crates/
│   ├── cardgame/           # Core game engine (Rust)
│   ├── essence-wars-ui/    # Desktop app (Tauri + Svelte)
│   └── essence-wars-mcp/   # MCP server for Claude Code
├── python/                 # ML agents & training (PyTorch)
├── data/
│   ├── cards/              # Card definitions (YAML)
│   ├── decks/              # Deck definitions (TOML)
│   └── weights/            # Bot weight files
└── docs/                   # Documentation
Component Description README
cardgame High-performance game engine, bots, CLI tools README
essence-wars-ui Cross-platform desktop client README
essence-wars-mcp MCP server for Claude Code README
python ML agents, training, benchmarking README

Architecture

Architecture Diagram

Essence Wars is organized as a layered Rust monorepo with Python ML bindings on top. From bottom to top:

  • Data Layer — Card definitions (YAML), deck compositions (TOML), and bot weight files live under data/.
  • Foundation Layer — Core types (CardId, PlayerId, Slot), keyword rules (Rush, Guard, Lethal, …), card database, and static config.
  • Core Game EngineGameEngine facade exposes apply_action, get_legal_actions, and is_terminal. State mutations flow through a non-recursive effect queue for deterministic trigger ordering.
  • Client API LayerGameClient wraps the engine with event emission (creature spawned/damaged/killed), state diffing for efficient UI updates, and action history for replays.
  • User Interfaces — Three independent consumers of the same engine: the Tauri/Svelte 5 desktop app, the MCP server (JSON-RPC for Claude Code), and the Python ML bindings (PyO3/FFI for Gymnasium & PyTorch).

For the full design walkthrough see docs/development/architecture.md.


Three Factions

Faction Identity Keywords
Argentum Combine Defense & durability Guard, Shield, Fortify, Piercing
Symbiote Circles Aggressive tempo Rush, Lethal, Regenerate, Volatile
Obsidion Syndicate Burst damage Lifesteal, Stealth, Quick, Charge

Plus Neutral cards and 12 unique Commanders with passive abilities.

Documentation

Game Design

ML & AI

Development

Performance

Metric Value
Random games ~17,000/sec
Greedy bot games ~1,200/sec
MCTS (100 sims) ~27 ms/move
MCTS parallel (8 trees) ~13 ms/move
Alpha-Beta depth 6 ~1.05 ms/move
Engine state clone ~417 ns
State tensor encode ~168 ns
Greedy evaluate ~9.0 ns
Zobrist hash ~11.1 ns
Apply action (attack) ~188 ns
MCTS parallel speedup (8×) ~4.3× (54% efficiency)

Hardware: AMD Ryzen AI 7-350, 32 GB RAM, WSL2 (Ubuntu on Windows 11). Timing figures are hardware-dependent — run cargo bench -p cardgame to measure on your machine. The parallel speedup ratio (4.3×) and balance win-rate metrics are hardware-independent.

Commands

# Build & Test
cargo build --release                    # Full workspace
cargo nextest run --status-level=fail    # Rust tests
uv run pytest python/tests               # Python tests

# Lint
cargo clippy                             # Rust lint
uv run mypy python/essence_wars          # Python types
pnpm run check                           # Svelte/TS (in UI crate)

# Game Tools
cargo run --release --bin arena --       # Bot matches
cargo run --release --bin validate --    # Quick balance check
cargo run --release --bin benchmark --   # Thorough analysis
cargo run --release --bin swiss --       # Tournament mode

Contributing

Contributions are welcome! This project uses:

  • Rust for the core engine and desktop backend
  • Svelte 5 (with runes) for the desktop frontend
  • Python for ML agents and training

Each crate has its own CLAUDE.md with AI-developer context and README.md with human contributor documentation.

Development Setup

# Rust
cargo build --release

# Python (using uv)
uv sync --all-groups
uv run pytest python/tests

# UI (using pnpm)
cd crates/essence-wars-ui
pnpm install
pnpm tauri:dev

Citation

If you use Essence Wars in your research, please cite:

@software{essence_wars,
  title = {Essence Wars: A High-Performance Card Game Environment for RL Research},
  author = {Wissmann, Christian},
  year = {2025},
  url = {https://github.com/christianWissmann85/essence-wars}
}

License

MIT License — see LICENSE for details.


Built with Rust, Svelte, and PyTorch
Designed for humans and AIs alike

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

essence_wars-0.11.5.tar.gz (750.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

essence_wars-0.11.5-cp313-cp313-win_amd64.whl (953.1 kB view details)

Uploaded CPython 3.13Windows x86-64

essence_wars-0.11.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

essence_wars-0.11.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

essence_wars-0.11.5-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

essence_wars-0.11.5-cp313-cp313-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

essence_wars-0.11.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

essence_wars-0.11.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

essence_wars-0.11.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

essence_wars-0.11.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

essence_wars-0.11.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

essence_wars-0.11.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

Details for the file essence_wars-0.11.5.tar.gz.

File metadata

  • Download URL: essence_wars-0.11.5.tar.gz
  • Upload date:
  • Size: 750.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for essence_wars-0.11.5.tar.gz
Algorithm Hash digest
SHA256 1075fa0b014b3d4294e18291e5a33735b5f1812e7ef59ccddeddeb508db2cb5b
MD5 edfb4497a4063e009d8be7f2c7e98654
BLAKE2b-256 6474f2fa87441a93c371f4eec080a4bbc46d599dcad512f1452337557f5abcc2

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5.tar.gz:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b52738e5f827359012fff4b0e548c492e19405a0ce30ff8f733ac9357080bbd6
MD5 435c4caa94db6315991e37a482e1e254
BLAKE2b-256 c3ed38f069c52fdf71162e3282fa96c43cb593efcd5f298c742b6a2dd6bd54e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 594503fd1f0fc59781008c93515e00826402685a7717c7eb9111436a48b69203
MD5 d50e316158f58ae3a9b2e7656a203563
BLAKE2b-256 5d28bb94558402bcce729a32febfde384c3f5662d432569cede304c5b9311783

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 32e1f30b210ace76bc5b9409a8c2b49defce608d4d60b2bd6adbcd292c34c145
MD5 1da1734cd0a19ec168425634f768536b
BLAKE2b-256 3d4ad2b72b2bf9a315d8fa23307fad8bb9f8de567801190193438482f3d9dba4

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9dd32aa6a44e650ee4f4531e0ba5d5048313e6f6171ed8c29ae9e832f01a67c4
MD5 09a6b4739779c6e42ef64ef0a0b06c47
BLAKE2b-256 da46b96dc5e1b1aa8cd30eedefae922f0ae6b7cc6da38cf175f733967fa5d7e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fa31308efa0a3f07ef62b6e2fa145beddaa0a7cad091cb70b3de6f706e633c7e
MD5 468f5c040350bb8ff923207654850a3b
BLAKE2b-256 4b88f21ffcd14084450cdf5748daa3fc0801167c43516091c7be83b5d40a014d

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a38e68480022d0fa11c848faadeef5f7087ba8180986cd11b111d02e99dfc5a7
MD5 a43cdb37594ec409e32a0bf8e6247cab
BLAKE2b-256 d9583e07d98ec75fb7d82115438cb3ac5a6e9fd12a604c624271cdb3a59d2356

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8c4d6e8887a60e7bfc4d6b98ee537079178c95dd279430c14ec49e5a1f917b95
MD5 0ff12c0a160a653a533b9cd9eac354a1
BLAKE2b-256 5a7b3a03e929a93b1a62be489cdee45d65cce0ea3e3913f87869d9fbf2598f59

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a77ca7f9ceddc750cb19c11ef0c75041db101df07202b711e61aa83ecef4f404
MD5 76cf07d716f09c7f2cfb307dc265ae0f
BLAKE2b-256 64bd34251c4e7178dc0f682a1a435704e6050dcdc5988ddf0f08f09e8c5191b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2e0c00dc6093bffa1fad16296983caf6b6935cf939457f6caeffdf39bee399e9
MD5 263ecc6bd0a808e87003ec386583a2e7
BLAKE2b-256 e4bdd3ac381b1800c89012a43d20c1ad07bc48ed294897675c303b0660433c32

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6f811a7f2bf892ce2e6aa3d78960b97742b1accf1985d51da71d8526a1dfe614
MD5 2809a338f8b15ddf4f3a7a95d7f8f72d
BLAKE2b-256 e9bf6ea88d35eed5c5dc238392ab67b13f905c518ddebc330c200e8f4cb047b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file essence_wars-0.11.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for essence_wars-0.11.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f23dd48e9d5d98cb9ce5522d4ff0a1ca48f7a38fd1b75413c248962d9350bdf5
MD5 0893ecab714250c7ca7dbac485b5aa89
BLAKE2b-256 b2d75df9596c11c66262315e57fe78059bcb642178b811ea48fdd8420a291d51

See more details on using hashes here.

Provenance

The following attestation bundles were made for essence_wars-0.11.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on christianWissmann85/essence-wars

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page