Text-based Combat Tracking for D&D on Discord

by Mike Shea on 20 July 2020

Since all of my in-person games have moved online in 2020 I've become fascinated with the best practices for playing D&D online. While there are many solutions out there, I've found that playing D&D over Discord offered the easiest setup for players and the easiest prep and play time for me as the dungeon master.

I've been running combat almost exclusively in the theater of the mind while playing online. Online programs like Roll 20 and Fantasy Grounds offer excellent virtual tabletops for online play and many groups love and swear by these tools. I find they take more work than I'm willing to put in as a lazy dungeon master. I like things simple. I'll take screen captures of Dyson maps and paste them into the text chat of Discord instead of using a virtual tabletop. This style isn't for everyone but it works well for me.

In pure theater of the mind combat it's easy for players to lose track of what's going on. Who is where? Who is next to who? How many are left? Who is grouped up? How many can I hit with grease? Can I reach them with a move action? These questions must be constantly and continually addressed by the players and the DM during theater of the mind combat. It removes agency from the players and that can be frustrating.

Abstract maps are an excellent way to handle these questions and still keep the flexibility and fluidity of theater of the mind combat. There isn't a great way to do this in my Discord-only style of online play however.

Until my wife and I came up with the following idea: text-based battle maps.

What if you could visualize combat in D&D using only text? What would that look like? How could it work? It works if we think about combat not on a 2d grid but in a one dimensional line. For a great example of one-dimensional combat, take a look at the excellent computer RPG Darkest Dungeon. Here's what combat in Darkest Dungeon looks like.

Combat is all in a line with front-line combatants and back-line combatants. We can simulate this style of combat in a simple text list that we paste into Discord's text channel so people can get a general idea where they're positioned.

We can also use Fate-style zones to identify specific locations if there are more than one in a single battle. Let's look at an example.

A Quick Example of Text-based Combat

When we write out a one-dimensional battle map in text, it looks like this:

**Eastern Doorway**
Iron Mohawk Animated Armor 12
_Sabre_
Brass Animated Armor 16
_Banner_
---
**Northern Hallway**
One-eye Gnoll 4
Purple Fur Gnoll 4
_Shane_
---
**Southern Doorway**
_Arwin_
_Zarantyr_
_Shift_

When this Markdown text is rendered in Discord, it looks like this:

Eastern Doorway
Iron Mohawk Animated Armor 12
Sabre
Brass Animated Armor 16
Banner
---
Northern Hallway
One-eye Gnoll 4
Purple Fur Gnoll 4
Shane
---
Southern Doorway
Arwin
Zarantyr
Shift

Our Markdown text lets us bold locations and italicizing characters. We separate "zones" with a "---" which represents a distance of about 20 to 30 feet or so, about a move action. Characters grouped up in a single location are considered within 5 to 10 feet of one another and can generally move around within that zone without taking an opportunity attack. Areas of effect can hit some number of creatures within a zone depending on the size and the situation.

DMs can keep this text-based battle map in a text editor outside of Discord and use it to track damage and status effects. As the battle moves on they update it and re-paste it into Discord so everyone can see the current situation.

Here's another example with a whole ton of crawling claws. We can group up a lot of monsters into a single group with a "Nx" where N is the number of monsters.

Dark Doorway
Royce
Alder
Hiccup
50x Crawling Claws
---
Charnel Pit
25x Crawling Claws
Kraul
25x Crawling Claws

We can use some simplified horde rules to run a battle like this. For example, we can assume about one in five crawling claws hit when they attack or save when hit with an area of effect.

Here's a battle in which the characters are surrounded by trolls.

Western Embankment
3x Trolls
---
Central Island
Lux
Hadrian
Odelle
Coratash
---
Eastern Embankment
3x Trolls

We can use the character positioning to determine who's in the middle of the group (Hadrian and Odelle) and who's outside waiting to face the oncoming trolls (Lux and Cratash).

Markdown Map Syntax

These one-dimensional text-based battle maps use the following Markdown-based syntax:

The Character Marching Order

Our simplest group representation can represent the marching order of the characters. Here's the example marching order for a group of characters.

Banner
Sabre
Shane
Xi
Shift
Zarantier

We can keep this in our text editor and paste it and pin it in Discord so everyone knows who is where while exploring. When the characters get attacked, we add monster names to the top of the list. Here our group ran into a pair of ogres.

Ogre
Ogre
Banner
Sabre
Shane
Xi
Shift
Zarantier

Understanding Groups

If the characters split up into multiple groups with distance between them, we can split up the group and note the locations of the area. Here's a single-room example where the party is all together.

Vault Gallery
Animated Armor
Animated Armor
Banner
Sabre
Shane
Xi
Shift
Zarantier

We can assume that any character directly above or below a creature is considered within 5 feet. It's likely that the second one down is also within 5 feet. Thus either animated armor can attack either Banner or Sabre but not Shane, Xi, Shift, or Zarantier. Characters can move around to offer more attacks. We can assume that creatures can move around in the list to surround their foes. If they move two slots away from an enemy, they likely take an opportunity attack. Here the animated armors have waded in to get to the middle line:

Vault Gallery
Banner
Animated Armor
Sabre
Animated Armor
Shane
Xi
Shift
Zarantier

Now the second animated armor can likely hit Xi and Shane. Perhaps the back-line characters wanted to get away from the animated armors. We can represent this with distance by separating groups with "---". We assume this represents roughly 25 feet; enough to traverse with a move.

Vault Gallery
Banner
Animated Armor
Sabre
Animated Armor
Shane
---
Xi
Shift
Zarantier

This sets up a second group of characters with distance between them and the first group. The animated armors can't get to Xi, Shift, or Zarantier without taking opportunity attacks from Banner, Sabre, and Shane.

Using Locations as "Zones"

With this style of combat representation we can separate specific locations in an area. Each location is its own "zone", a roughly 25 foot square area. Some battle areas will have multiple locations. Generally, while moving, characters can move around within a zone or move from one zone to another. We use location names to give players an in-game representation of the location of their characters. Here's an example of a situation with three zones:

Flying Discs
Gnoll
---
Aerial Docks
Gnoll
Gnoll
---
Northern Vault Doorway
Banner
Sabre
Shane
Xi
Shift
Zarantier

One gnoll is flying about 60 feet away from the northern door on a flying disc. Two other gnolls left their discs and are on the docks about 25 feet away from the northern door. The characters are all at the northern door in their marching order.

As combat moves forward, characters and creatures will move from one zone to another. Some characters will move up and engage the gnolls on the docks. The gnoll on the disc is hit with a blast that knocks him off his disc and down onto the towers of Sharn a thousand feet below. Now the battle looks like this:

Aerial Docks
Gnoll
Banner
Gnoll
Sabre
Shane
---
Northern Vault Doorway
Xi
Shift
Zarantier

As the battle moves on we edit our text version of the markdown map in a text editor and paste it back into Discord to show the current situation. Copying and pasting from our text editor to Discord is fast and easy.

We can use a series of "---"s to represent even longer distances. Let's say a gnoll sniper on a flying disc is purposefully staying away from the group:

Flying Disc
Gnoll
---
---
Aerial Docks
Gnoll
Banner
Gnoll
Sabre
Shane
---
Northern Vault Doorway
Xi
Shift
Zarantier

The gnoll on the further flying disc is 50 to 60 feet way or so in this representation. Hard to reach, particularly when flying through the air.

Player-Identified Monster Characteristics

When we first start out we can define monsters by their generic name like "shadowfey skeleton". When a character first inflicts damage to them we can ask the player to define a notable physical characteristic of that enemy to define them better within the context of the game. This is a great way to get the players into the fiction of the game and better define targets for other players. When the player identifies such a characteristic we can rename the monster in our text-based battle map and paste it into the text chat so everyone can see it. After a few rounds of combat, our map might look like this:

Aerial Docks
Manticore 14
Loop-Earring Gnoll 7
Banner
One-eyed Gnoll 11
Sabre
Shane
---
Northern Vault Doorway
Xi
Shift
Zarantier

Tracking Damage

As a DM, we already need some way to track monster damage. We can use this same text-based battle map to track damage and can let our players know how much has been inflicted. The example above shows that the loop-earring gnoll has taken 7 damage and the one-eyed gnoll has taken 11.

If we want to get fancy and run large numbers of monsters, we can group monsters together in a single line of text and track damage done to the whole group. Every time the group takes enough damage to kill a single monster, we remove one of the monsters. Here the characters are getting attacked by a horde of skeletons:

Dark Doorway
16x Skeletons 7
Royce
Alder
Hiccup
---
Charnel Pit
25x Crawling Claws
Kraul
25x Crawling Claws

Instead of rolling dice for all of these monster hordes, we can use our horde rules and assume that one-in-four of them succeeds on an attack or saving throw. If they're particularly weak, this might be one-in-five to one-in-ten instead.

Adjudicating Areas of Effect

We can use the representation of zones and groups to help adjudicate areas of effect. In this example, two gnolls are grouped up at the aerial dock:

Aerial Dock
Gnoll
Gnoll
---
Northern Doorway
Shane Husk
Xi
Shift
Zarantier

Shane Husk moves up to the aerial dock and targets the two gnolls with thunder wave, potentially sending them off the edge and into the night air above Sharn. One of them fails and is sent soaring. The other held his ground but took six damage. Now it looks like this:

Aerial Dock
Gnoll 6
Shane Husk
---
Northern Doorway
Xi
Shift
Zarantier

Hang On with a Loose Grip

This text-based battle map isn't intended to be a perfect representation of what is going on. It's a loose and general representation. Both you and your players need to hang onto this with a loose grip. Keep it flexible, use your verbal descriptions to clarify the situation, and change it as needed. Don't get too wrapped around the "rules" for this battle map. It's imperfect. Treat it thusly.

A Quick, Flexible, and Imperfect Tactical Solution

For players seeking the full tactical experience that 5e can offer with a two-dimensional grid, this isn't going to give it to them. You can mimic some level of tactics with this system. Who is within 5 feet of who, who is grouped up, who is in what location, how far away is someone; that sort of thing can be generally represented but that's not the same as seeing how many skeletons you can hit with a fireball template on a 2d grid.

The intent of this simplified text-based combat map is to help players get a general feel for the situation in a battle while running narrative theater-of-the-mind-style combat. It's meant to be fast, simple, easy, and usable in just about any text-chat (although the Markdown rendering in Discord helps). It doesn't solve every solution for representing combat but it serves well where it serves.

Try it out and see what you think.

Related Articles

New to Sly Flourish? Start here, subscribe to the weekly newsletter, join the Sly Flourish Discord server, or support Sly Flourish on Patreon!

Check out Mike's books including Return of the Lazy Dungeon Master, the Lazy DM's Workbook, Fantastic Adventures, and Fantastic Adventures: Ruins of the Grendleroot.

Support Sly Flourish by using these links to purchase the D&D Essentials Kit, Players Handbook, Monster Manual, Dungeon Master's Guide, or dice from Easy Roller Dice.

Send feedback to mike@mikeshea.net.