Skip to content

ZoltyMat/dnd

Repository files navigation

Asverra — D&D 5e Campaign with GitHub Copilot as DM

A fully structured D&D 5e campaign played via GitHub Copilot Chat. Copilot acts as the Dungeon Master, using MCP servers for D&D rules lookup and persistent memory across sessions.

Character: Drak'Thar — Half-Orc Paladin (Oath of Vengeance), Level 3
World: Asverra — a dark fantasy homebrew setting
Primary Quest: Hunt down and destroy Garek Shatterbone before his ritual opens a portal to the plane of Acheron. 47-day countdown.


How to Play

Starting a Session

  1. Open a new GitHub Copilot Chat window in VS Code (not inline chat — use the Chat panel)
  2. Make sure the MCP servers are active (check .vscode/mcp.json)
  3. Copy the contents of prompts/start-session.md and paste it into chat
  4. The DM (Copilot) will read the memory files, recap the last session, and drop you into the world
  5. Play by describing Drak'Thar's actions in plain English

During Play

  • Actions: Just describe what you want to do. The DM will tell you what to roll and what the DC is.
  • Dice: Use node scripts/dice-roller.js 1d20+6 for logged rolls, or say "roll for me" and Copilot will narrate
  • Rules questions: Ask the DM in-character or type [DM mode: question] to step outside the narrative
  • Combat: paste prompts/combat.md to set up a fight properly
  • Resting: paste the relevant section from prompts/rest.md

Ending a Session

When you're done, paste the contents of prompts/end-session.md. Copilot will:

  • Update all memory files
  • Write a session log
  • Confirm what changed in the world

Then use the automated session manager:

node scripts/end-session.js

This will validate the character sheet, check memory updates, commit with proper format, and optionally push.

Or manually: git add -A && git commit -m "Session [N]: [brief description]" && git push


Automation & Scripts

This campaign includes automation tools for validation and workflow management.

Session Manager

node scripts/end-session.js

Automated workflow that:

  • ✅ Validates character sheet
  • ✅ Checks memory file updates
  • ✅ Creates/verifies session log
  • ✅ Commits with proper format
  • ✅ Optionally pushes to remote

Character Validator

node scripts/validate-character.js

Validates Drak'Thar's character sheet against D&D 5e rules:

  • Level/proficiency bonus match
  • XP correct for level
  • HP within range
  • Spell slots match Paladin progression

Dice Roller

# Basic roll
node scripts/dice-roller.js 2d6+4

# With advantage
node scripts/dice-roller.js 1d20 --advantage

# With context logging
node scripts/dice-roller.js 8d6 --context "Fireball damage"

Features:

  • Cryptographically secure RNG
  • Advantage/disadvantage support
  • Auto-logs all rolls to rolls.jsonl
  • Natural 20/1 detection

CI/CD

GitHub Actions automatically validates on every commit:

  • Character sheet rules
  • Session numbering
  • Memory files exist
  • MCP server builds

See scripts/README.md for full documentation.


Workspace Structure

dnd/
├── .github/
│   └── copilot-instructions.md    # DM persona, memory protocol, rules system
├── .vscode/
│   └── mcp.json                   # MCP server configuration
├── characters/
│   └── party/
│       └── drakthar.md            # Full character sheet — update after every session
├── campaign/
│   ├── world/
│   │   ├── lore.md                # World history, pantheon, The Sundering
│   │   ├── geography.md           # Regions, cities, dungeon locations
│   │   └── factions.md            # The four major factions and their goals
│   └── npcs/
│       ├── allies.md              # Potential allies with motivations and secrets
│       └── antagonists.md         # Garek Shatterbone and his lieutenants
├── sessions/
│   ├── session-000-prologue.md    # Opening scene — start here for Session 1
│   └── [session logs added here]
├── memory/
│   ├── recent-events.md           # Rolling log of last ~3 sessions (DM reads at session start)
│   ├── world-state.md             # Current faction status, NPC locations, active threats
│   └── lessons-learned.md         # Drak'Thar's injuries, oaths, relationships, DM continuity notes
├── rules/
│   ├── srd-reference.md           # Key 5e rules cheat sheet
│   ├── paladin-oath-of-vengeance.md  # Full subclass reference for Drak'Thar
│   └── house-rules.md             # Deviations from RAW
├── prompts/
│   ├── start-session.md           # Paste this to begin a session
│   ├── end-session.md             # Paste this to close a session and save memory
│   ├── combat.md                  # Paste this when entering combat
│   ├── rest.md                    # Short/long rest procedures
│   └── level-up.md                # Level 4 and Level 5 instructions
├── mcp-servers/
│   └── dnd-mcp/                   # heffrey78/dnd-mcp — 40+ D&D tools via Open5e API
└── README.md

MCP Servers

Three MCP servers are configured at .vscode/mcp.json:

Server Purpose
dnd-5e 40+ tools: spell lookup, monster stat blocks, encounter builder, character tools. Uses Open5e API (no key required).
memory Knowledge graph for persistent NPC, location, and event memory across sessions. Uses @modelcontextprotocol/server-memory.
filesystem Read/write access to all campaign files. Uses @modelcontextprotocol/server-filesystem.

The dnd-mcp server is pre-built at mcp-servers/dnd-mcp/dist/index.js. If you need to rebuild: cd mcp-servers/dnd-mcp && npm install && npm run build


Campaign Status

Current Level 3
Current XP 900 / 2,700 (Level 4)
Days Until Ritual 47
Last Session Prologue (not yet played)
Primary Threat Garek Shatterbone — Fort Ashgrasp

Lore Summary

Asverra is a continent still recovering from the Sundering — a cataclysm 200 years ago when the Valdrian Empire tried to bind the god Acheron as a power source. Acheron destroyed himself to break free, cracking the sky (the Scar), vaporizing the capital (the Maw), and shattering divine contact for generations.

Drak'Thar's clan, the Skullmoor, were massacred three years ago by the Iron Claw Marauders, led by the half-fiend warlord Garek Shatterbone. Drak'Thar survived. He swore a divine Oath of Vengeance. He's been moving through the Ashfields hunting Claw soldiers ever since.

Now he's found out Garek is 47 days from opening a permanent portal to the plane of Acheron — an infinite army from a dimension of endless war.

The math is simple. Stop the ritual. Kill Garek. Finish the oath.

None of it is simple.


Git Workflow

After each session:

git add -A
git commit -m "Session [N]: [one-line description of what happened]"
git push

The session log created by prompts/end-session.md and all memory file updates will be included.

About

D&D 5e campaign in Asverra — played with GitHub Copilot as DM. Includes world lore, character sheets, session logs, and MCP server config.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors