Skip to main content

Domain-neutral D&D 5e (2024) rules & character-sheet computation engine: a data-driven DAG of formulas (ability mods, proficiency, spell DC/slots, HP, AC).

Project description

dndwright

A domain-neutral D&D 5e (2024) rules & character-sheet computation engine — formulas as data, not code.

PyPI Python versions CI License: MIT Typed

dndwright computation graph: ability scores, level, class and equipment flow through ability modifiers and proficiency bonus to saves, skills, spell DC/attack, spell slots, HP, AC and initiative

A character sheet is modelled as a directed acyclic computation graph — nodes are values, edges are dependencies, and formulas are data (a JSON-serialisable DSL), not code. Pure Python (pydantic + stdlib), no application or framework coupling: map your own character data in, read computed stats out.

⚠️ Early development (alpha). The API is still moving and may change between minor versions while at 0.x. Usable today — pin a version if you depend on it.

Install

pip install git+https://github.com/sligara7/dndwright.git
# or, for local development:
pip install -e ".[dev]"

Quickstart

from dndwright import evaluate_character

sheet = evaluate_character({
    "ability_scores": {"strength": 8, "dexterity": 14, "constitution": 14,
                       "intelligence": 18, "wisdom": 12, "charisma": 10},
    "class_data": {"class_name": "wizard"},
    "species_data": {"name": "Human", "speed": 30},
    "level": 5,
})

sheet["proficiency_bonus"]    # 3
sheet["ability_modifiers"]    # {"intelligence": 4, "dexterity": 2, ...}
sheet["spellcasting_type"]    # "full_caster"
# ...plus armor_class, hit_points, hit_dice, initiative, saves, features, ...

Lower level — assemble typed inputs and evaluate against the ruleset:

from dndwright import DND_5E_2024_RULESET, assemble_character_inputs, evaluate, apply_modifiers
from dndwright.rules.components import ClassMechanics

inputs   = assemble_character_inputs(class_mechanics=..., ability_scores={...}, level=5)
computed = apply_modifiers(evaluate(DND_5E_2024_RULESET, inputs), inputs)

Command line

Installing the package also installs a dndwright command (no Python required):

dndwright eval character.json          # character JSON → computed sheet (or '-' for stdin)
dndwright graph --format mermaid        # export the computation DAG (mermaid|dot)
dndwright content magic_items           # dump bundled content (omit category to list)
dndwright validate ruleset.json         # check a ruleset (built-in if omitted)

Rolling dice

A self-contained, typed dice engine (dndwright.dice) — deterministic by default:

from dndwright.dice import DiceEngine

eng = DiceEngine(seed=42)               # reproducible (stdlib RNG)
eng.roll("4d6kh3").total                # keep highest 3 of 4
eng.roll("1d20", advantage=True)        # -> ExpressionResult
eng.roll_attack(modifier=5, target_ac=15).is_hit
eng.roll_damage("2d8", is_critical=True)  # crit doubles the dice

# unpredictable production rolls (no NumPy dependency):
import secrets
DiceEngine(rng=secrets.SystemRandom())

Why a computation graph?

Derived character values form a dependency DAG: ability scores → modifiers → proficiency → save DCs / spell slots / AC / HP. dndwright represents that DAG explicitly and stores the formulas as data (FormulaSpec: an op + args), so the rules are inspectable, testable, and serialisable — not buried in imperative code. DND_5E_2024_RULESET is a 135-node graph.

What's inside

Component What it does
evaluate_character One call: character data dict → fully computed sheet.
DND_5E_2024_RULESET The 135-node 5e-2024 computation DAG (formulas as data).
evaluate / assemble_character_inputs / apply_modifiers The lower-level engine.
Ruleset / ComputationNode / FormulaSpec / NodeType The DAG schema.
validate_ruleset / assert_valid_ruleset Static integrity check for a ruleset (unknown ops, cycles, dangling refs) — catch authoring errors before evaluation.
to_mermaid / to_dot Render the computation DAG as Mermaid or Graphviz DOT — see the dependency graph.
dndwright.dice Typed dice engine: parse/roll 5e expressions, attacks, saves, damage, stat arrays.
dndwright.rules.components Typed inputs (ClassMechanics, SpeciesMechanics, …).
dndwright.rules.lookup_tables SRD-derived rules tables (hit dice, spell slots, AC, saves).

API stability

The public API is exactly dndwright.__all__, pinned by tests/test_api_contract.py. Versioning follows SemVer; at 0.x minor versions may break, with every change recorded in CHANGELOG.md.

Credits & license

MIT licensed (see LICENSE). The rules tables encode game mechanics derived from the D&D System Reference Document 5.2 (© Wizards of the Coast, CC-BY-4.0); see NOTICE. Not affiliated with or endorsed by Wizards of the Coast. Contains no PHB/DMG/MM content.

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

dndwright-0.4.0.tar.gz (127.0 kB view details)

Uploaded Source

Built Distribution

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

dndwright-0.4.0-py3-none-any.whl (119.0 kB view details)

Uploaded Python 3

File details

Details for the file dndwright-0.4.0.tar.gz.

File metadata

  • Download URL: dndwright-0.4.0.tar.gz
  • Upload date:
  • Size: 127.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dndwright-0.4.0.tar.gz
Algorithm Hash digest
SHA256 ee30e71386b015bac91b73909a509f6766ba857ce09300d50c5bd2b8e4ae9b54
MD5 a6ea16972cd264eb5665f9096483e621
BLAKE2b-256 ab152bdd3117b818ffdf6b74ae777baa2cb629de5d21ac7bf25821da803ddadc

See more details on using hashes here.

Provenance

The following attestation bundles were made for dndwright-0.4.0.tar.gz:

Publisher: publish.yml on sligara7/dndwright

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

File details

Details for the file dndwright-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: dndwright-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 119.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dndwright-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6e279974fc3683691ff1de41d0624b950667362230c0a3f8da45a2434bdd057f
MD5 34c8288e4b69dd2a80034f5d991bad71
BLAKE2b-256 52ef88ff9ad865caec2e1e1eefb9b995a1e4d58496eaa3ed24552275e35e2e20

See more details on using hashes here.

Provenance

The following attestation bundles were made for dndwright-0.4.0-py3-none-any.whl:

Publisher: publish.yml on sligara7/dndwright

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