Monday, March 20, 2023

Gigantic Attack -- Resolving Combat in One Roll

 So tonight I'm going to be writing the first draft of a mechanic that is meant to replace an entire combat round with a single roll.

I first had the idea back when I was recording Go Die in a Hole with Nick from Papers and Pencils.  It's a little podcast (4 episodes!) where we run through dungeons as quickly as we can, in order to analyze them.  Because the focus is on analyzing the dungeon, we don't really care about combat, and so we eventually abstracted combat to a single d6 roll.

I mostly just treated the d6 as an oracle--1 is pretty bad, 6 is pretty good.  I just made up numbers and it seemed to work okay.  I've been DMing for a while, so I sorta know how bad a "pretty bad" round is.

It has the following design goals:

  • to discard individual actions--the party fights as a single unit, and makes a single roll together
  • to give similar outcomes compared to most OSR games
    • similar damage per round
    • similar damage spread
    • similar chances of victory against opponents
    • similar number of rounds of combat (but much faster)
  • to be compatible with current OSR standards 
    • e.g. swords deal 1d6, level 1 fighter has +1 or +2 to hit, etc
  • to have sufficient granularity where a +1 to hit makes a (small) difference
    • but not much more granularity than that
I've spent the last couple of hours playing with spreadsheets, and I think I have something workable.  I'm giving up on the "single d6" and changing it to "one d6 roll per side" because it's hard to map all the outcomes to a single d6 in a way that feels intuitive.  I do want this mechanic to feel intuitive when it is used.

Anyway, first let's talk about combat in general.  (If you don't have time for all this shit, just scroll down to GiganticAttack).

Why Have Combat Rolls Anyway?


Combat occupies a weird place in the tabletop game.  More than any other aspect, we like to break down combat into little pieces.  Combats are broken down into rounds, rounds are broken down into turns for every single person and every single monster.

We don't do this for overland travel.  DMs typically make a single roll for the party (navigation, etc) for a single day of travel.  This is weird, because a traveler probably makes more decisions over the course of that day than a fighter does in 6 seconds of combat--but maybe not interesting decisions?

#1 - We like to model combat at a granular, round-by-round level because we see each round of combat as an opportunity to make an interesting decision.

When there aren't any interesting decisions to make on each round of combat, it gets boring very fast.  "I attack.  I attack again.  I attack again.  We win."  (See also: dynamism.)  I'll talk more about this in a second, when we talk about the combat loop.

#2 - The stakes are also higher in combat than they are in overland travel.  When traveling, the worst case scenario is (often) taking longer to reach your destination.  In combat, the worst case scenario is always death.

In a game where the party was lost in the desert, completely out of water, and there was a real risk of death, the DM would probably zoom in for this reason.  There would be discussions about killing hirelings, opportunities to spend resources (potions) for advantages, etc.  

#3 - There's also a good bit of cultural momentum here.  Combat is granular because combat has always been granular.

Could we abstract or remove combat?

Yes, absolutely.  Many people (myself included) have argued that good combat is not as interesting as good dungeoneering.  That's another philosophy that is close to being an OSR standard.

Making attack rolls is usually not as interesting as poisoning the crocodiles (removing the need for attack rolls).  In combat, your options tend to be more limited (attack, cast spells, run away--and you only have 6 seconds to do it) but when dungeoneering (and preparing for a combat) you have far more interesting options.

So there is room to have an abstracted combat system.  Someone will be interested in it, at least in theory.  We just want to make sure that we keep #1 and #2 in the mechanic as well.  We want to give the players opportunities to make interesting decisions (#1) and we want the players to feel like they have ownership of the consequences--no one dies off-screen, so to speak (#2).

The Gameplay Loop


All parts of the game basically boil down to the same gameplay loop.

1. The DM presents information, rolling dice if needed.
2. The players make decisions and roll dice.
3. Repeat.

What separates good gameplay from bad gameplay is how meaningful, interesting, informed, and impactful those decisions are.  And that's it.  If you can do that, then you've written a good game (with shockingly few asterisks).

Good combat has all of those things.  

That's about as far as I can go with generalized theory.  I'm going to start piling on the generalizations and assumptions now--forgive me.

A good combat is about 3 rounds long.  By the end of the third round, one side has surrendered, fled, or died.  It opens with the DM giving everyone information and allowing players to make their decisions.  Each side loses about 1/3 of their health.  If the players are losing, they'll have two rounds to flee or turn it around, typically through either a clever scheme or by depleting a resource (spells, bombs, etc).

Remember, the gameplay loop doesn't see numbers.  We just want to make sure that the combat situation changes enough-but-not-too-much each round.

If everyone loses too much health % per round, the players don't have opportunities to react, make plans, and spend resources.

If no one loses enough health % per round, the fight seems like it drags on forever, with people just making endless attack rolls while grinding down the enemy health bars.

Our goal is to hit that sweet spot.

At low levels, PCs (and monsters) tend to be more fragile.  Combat tends to last 2-3 rounds.  At higher levels, it can take longer.

The Simplest Case

Let's consider a quartet of level 4 characters fighting a quartet of level 1 bandits.  Everyone has 4 HP, +1 to hit, leather armor (AC 12), and has weapons that deal 1d6 damage.

Well, everyone has exactly a 50% chance to hit.  With four attackers on each side, that's an average of 7 damage per side per round.

4 attacks * 3.5 average damage * 50% accuracy = 7 damage.

Damage per round will go down as combatants are killed, so the second and third rounds will not deal 7 damage on average.  It'll be lower.  So, speaking very broadly, this is approximates our desired combat.

So how do we turn this into a single dice roll?

Let's talk about relative standard deviation (RSD) first.

Average, Range, and RSD


Whenever you talk about a bell curve, you need to talk about the average and the RSD.  Consider

30d6 compared to 3d6 x 10.

They're both bell curves.  They both have the same average.  They both have the same max and the same min.  But these bell curves are not the same.  They have different standard deviations.

the heights aren't normalized, but you can still see that 30d6 is skinnier.

The 30d6 is a much skinner bell curve than the 3d6x10 curve.  Even though they both have the same average (105), 30d6 has a standard deviation of 9.35, while 3d6x10 has a standard deviation of 29.58.  Since we know that 95% of all results fall within 2 standard deviations, we can say that:

95% of 30d6 results fall within 86 - 124.
95% of 3d6x10 results fall within 46 - 164, a much wider range.

Why do I bring this up?  Because whatever we end up replacing the combat round with needs to have a similar spread of damage, not just the same average.

So what is the average damage of our 4-vs-4 match from above?  (This is four attack rolls, each with a 50% chance to hit for 1d6 damage, with all of the damaged summed into one pile.)  It looks like this:


Not a bell curve.  There's a bunch of zeros (since it's possible for all 4 attacks to miss) and some asymmetry coming from the overlaying the 1d6 result (only one hit) on top of the 2d6, 3d6, and 4d6 result.  (Since this is basically just a 1d6, 2d6, 3d6, and 4d6 curve laid on top of each other).  The RSD is 61% (standard deviation divided by average is 61%--the standard deviation is printed in the top right corner). 

RSD is useful to see how much variance there is, proportionately.  Since not every probability curve has the same average, we divide by the average to make them comparable.  (For example, 3d6 and 3d6x10 both have the same RSD, since all the randomness came from the same place: 3d6.)

If we average this across three rounds of combat, though, it looks much more like a bell curve:


Which does look like a bell curve.  (You don't need a bell curve to be incorporated into a single roll.  Enough flat rolls will always produce a bell curve.)

What about if our 4 characters were fighting armored enemies (AC 17) instead of leather-clad bandits?  They'd only hit on a 16-20, or a 25% of hitting.  Since this is half of their previous hit rate, we'd expect them to deal half as much damage on average.


Even further from a bell curve.  The 0 (chance of everyone missing) is much larger now.  In fact, 37.5% of the time, no one will land a hit.  The 3d6 and 4d6 curve (where 3 or 4 people hit) are now so unlikely that the 1d6 and 2d6 curves dominate the probability shape.  The RSD is a whopping 99%.

Just to be a completionist, let's look at what it would look like if the players had a 75% chance to hit:


Ah, you can barely tell this isn't a perfect bell curve.  RSD = 40%.  Much less variability compared to the other two, since there is a much smaller chance of everyone missing their attacks.  (All those zeroes really impact the standard deviation.)

AverageSDRSD
SIM 75%10.54.2440%
SIM 50%74.2661%
SIM 25%3.53.4899%

So, what do we do with this?

Well, we want to make a mechanic (really a function) that accepts as inputs:
  • everyone's average weapon damage
  • everyone's attack bonus
  • all enemies' ACs
and outputs 
  • a probability distribution like the ones above, with both a similar average and a similar RSD.
The first idea I had was just to take the averages and make a table mapping the outcomes the appropriate percentile.  I think this is valid approach, but it makes it much harder to explain.

Instead I came up with this.  Basically, you calculate the average damage and roll a d6.

1-2:     deal 50% average damage.
3-4:     deal 100% average damage.
5-6:    deal 150% average damage.

as a starting point.

by Rin84

I call it

GIGANTIC ATTACK


First, you need to calculate the individual attack power (AP) of the characters.  
  • Everyone contributes 1 AP per point of attack bonus.
  • Everyone contributes AP equal to the maximum damage of your weapon.
So a fighter with +1 to hit and a 1d6 sword contributes 7 AP.

A fighter with +5 to hit and a 1d8 greatsword contributes 13 AP.

The everyone's AP is summed together into the party's AP.  From now, AP will only be used to referred to the party's AP.  We don't care about individual AP anymore.

When the party makes an attack, everyone states who they are attacking.  Then they roll a single d6 for the entire party.  They deal damage according to the table below.

RollDamageRounding
112.5% APdown
212.5% APup
325% APdown
425% APup
537.5% APdown
637.5% APup

Damage is applied first to the player's target.  Excess damage rolls over onto the next targets with a 2 point tax every time damage rolls over.  For example:
The party does 9 damage to a pair of bandits (4 HP each).  9 damage hits the first bandit, killing him.  The remaining 5 damage is taxed for 2 points, leaving 3.  The 3 damage rolls over onto the second bandit, leaving him with 1 HP remaining.
Things that would normally give advantage to attack rolls give +4 AP.   Disadvantage is -4 AP.

This assumes that enemies are wearing leather.  
  • Unarmored enemies: +6 AP (each attacker gains +1.5 AP)
  • Versus Chain: -6 AP (each attacker loses 1.5 AP)
  • Versus Plate: -12 AP (each attacker loses 3 AP).
Wizards can still cast spells normally (outside of the Gigantic Attack system) but if you wish to fold them into the Gigantic Attack system:
  • The wizard does not provide their regular AP that round.
  • The wizard ignores all enemy armor.
  • The spell provides 20 AP per MD.  
This is because 4 AP = 1 expected damage.  A 1 MD magic missile deals 1d6+1 (average 4.5) damage.  4.5 * 4 gives you 18, which is rounded up to 20 (since spells are usually cast at very opportune times, and tend to be more useful than their straight damage would imply). 

If all enemies are flying, PCs without ranged weapons cannot contribute AP.  If there are a mix of flying and non-flying enemies, all PCs can contribute AP, but the PCs cannot place all damage on flying enemies--it must be split proportionately between flying and ground enemies, since not all players can attack  the flying enemies.

A PC can perform a non-combat action during their turn (e.g. lighting a torch).  They don't contribute their AP during this turn, though.

When enemies attack the players, they calculate their APs and attacks identically.

If a PC is at full health, they cannot be killed in a single round unless the monsters deal more than 2x as much damage as necessary to kill them.  (So if a full health fighter starts at 5 HP, and the monsters deal 9 damage this turn, the fighter will take 4 damage, and then the remaining 5 damage will roll over without any tax.)

Bandit (5 AP)
+1 to hit, 1d6 damage
6 damage + 1 attack - 2 attack penalty* = 5 AP

Goblin (4 AP)
+0 to hit, 1d6 damage
6 damage + 0 attack - 2 attack penalty* = 4 AP

Owlbear (19 AP)
+5 to hit, 1d6/1d6/1d8 damage
6 + 6 + 8 damage + 5 attack - 6 attack penalty*  = 19 AP

Cultist (5 AP)
+1 to hit, 1d6 damage, can cast 2 MD magic missile (40 AP)
6 + 6 + 8 damage + 5 attack - 6 attack penalty*  = 19 AP

*When enemies attack the players, their AP is reduced by the player's armor.  For the average party, this penalty is about -2 AP per attack.  This attack penalty (due to PC armor) has already been baked into the monster stat-blocks above.

Heavy Armor Rule: heavily armored players cannot be one-shotted (from full health) unless the incoming damage is more than 2x enough to kill them.

And lastly, here's a table for you

12.5%12.5%25.0%25.0%37.5%37.5%
APRoll 1d6AvgSDRSD
123456
50112121.20.759%
60112231.51.064%
70112231.51.064%
811223320.841%
91223342.51.038%
101223342.51.038%
111223452.81.347%
121233453.01.343%
131234453.21.342%
141234563.51.749%
151234563.51.749%
162244664.01.641%
172345674.51.738%
182345674.51.738%
192345784.82.144%
202355785.02.142%
212356785.22.141%
222356895.52.545%
232356895.52.545%
243366996.02.441%
2534679106.52.538%
2634679106.52.538%
27346710116.82.943%
28347710117.02.941%
29347810117.22.941%
30347811127.53.344%
31347811127.53.344%
32448812128.03.341%
33458912138.53.339%
34458912138.53.339%
35458913148.83.742%
36459913149.03.741%
374591013149.23.741%
384591014159.54.143%
394591014159.54.143%
40551010151510.04.141%
41561011151610.54.139%
42561011151610.54.139%
43561011161710.84.542%
44561111161711.04.541%
45561112161711.24.541%
46561112171811.54.943%
47561112171811.54.943%
48661212181812.04.941%
49671213181912.54.939%
50671213181912.54.939%

Discussion


Realizing that even a single magic missile (1d6+1 damage) deals more damage than two regular attackers is fairly eye-opening.

Anyway, this system is never going to scale perfectly. It's impossible to reduce ~8 dice rolls into 1 die roll without losing some of the details.  

Having said that, let's see if the distortion is acceptable.

Four Fighters (+1 to hit, 1d6 damage) vs leather (AC 12)
DamageRSD
Original761%
Gigantic Attack741%
Four Fighters (+1 to hit, 1d6 damage) vs chain (AC 14)
DamageRSD
Original5.672%
Gigantic Attack5.542%
Four Fighters (+1 to hit, 1d6 damage) vs plate (AC 16)
DamageRSD
Original4.288%
Gigantic Attack441%
Four Fighters (+5 to hit, 1d6 damage) vs leather
DamageRSD
Original9.844%
Gigantic Attack1241%
Four Fighters (+5 to hit, 1d8 damage) vs leather
DamageRSD
Original12.647%
Gigantic Attack1341%

So, after comparing the two methods, here are the takeaways.
  • Getting another +1 to hit is better in Gigantic Attack.
In general, those +1s and -1s to hit matter more in Gigantic Attack.  It would honestly be better to say that each +1 to hit only contributes 2/3 of an AP.  I don't want to fiddle with it anymore, though.  

Is this an acceptable outcome?  Yes.

The only people who get a big attack bonus are higher-level fighters, and I'm okay with them being more effective in combat. 
  • Wielding a 2-hander (1d8 damage) is still useful, but not as much as it used to be.
I'm fine with this.
  • Players are more effective since they can drop all their damage on a single opponent.  Since excess damage rolls over, damage is never wasted.
This is a pretty big one when you're fighting a bunch of small dudes.  The 2 point tax is meant to represent the average amount of damage that is wasted (via overkill) whenever  you kill an enemy.  This will prevent the players from killing 6 goblins everytime they deal 6 damage.
  • The RSD is lower in Gigantic Attack.
Yes.  This means that the players' attacks will be more reliable.  Fewer high-damage rounds, fewer low-damage rounds.  In most games, it is the players who benefit from more reliable mechanics (not the monsters) since the players are usually the stronger side in a fight.

Think of it this way: if two teams are competing, the stronger team always wins,  unless something unexpected happens.

Higher RSD = unexpected things happen more often.

I have mixed feelings about this change, since I enjoy the chaos that comes out of combat.  It is nice when you have 4 HP left and the dragon misses you, thank god.  That sort of thing will happen less with Gigantic Attack.  (In fact, it's impossible to have a combat round elapse without damage dropping.)

Lots of people have argued for more reliable combat, though, since a combat round where everyone misses is very unsatisfying.  Chris "Into-the-Odd" McDowall has also argued for the same.

And more reliable damage during combat rounds will  hopefully keep the gameplay loop tight and effective (hopefully).

Anyway, if you end up trying this system, let me know how it goes.

And because I can't resist tampering, here's another grid.  This one corresponding to six evenly distributed percentiles (8.3%, 25%, 41.7%, 58.3%, 75%, and 91.7%).  It has the same averages as the table above, but this one has more chaos baked into it (the RSDs are higher).  This one is harder to calculate by hand (you pretty much need to print out this table) but it should match the chaos of regular OSR D&D a little bit closer.

7.8%16.6%22.4%27.6%33.4%42.3%
APRoll 1d6AvgSDRSD
123456
50111221.20.759%
60112231.51.064%
71122231.80.737%
811223320.841%
91122342.21.149%
101223342.51.038%
111223452.81.347%
121233453.01.343%
131234453.21.342%
141234563.51.749%
151234563.51.749%
161344574.01.846%
171345674.32.046%
181345684.52.249%
191345684.52.249%
202346785.02.243%
212356795.32.444%
222456795.52.240%
2324568105.82.645%
2424578106.02.644%
2524678116.32.945%
2624679116.53.046%
2724679116.53.046%
2825689127.03.245%
29256810127.23.346%
30257810137.53.547%
31257910137.73.546%
32257911148.03.949%
33357911148.23.745%
34368911148.53.541%
353681012159.03.944%
363681012159.03.944%
373681012169.24.246%
383691013169.54.345%
393691113169.74.345%
4037911131710.04.444%
4137911141710.24.645%
4237912141810.54.946%
43371012141810.74.845%
44371012151911.05.247%
45371012151911.05.247%
46481013151911.54.942%
47481113162012.05.243%
48481113162012.05.243%
49481114162112.35.545%
50481114172112.55.645%
51481114172212.75.946%
52491214172213.05.744%

8 comments:

  1. >Anyway, if you end up trying this system, let me know how it goes.

    I've done something similar to resolve mass combat situations that come up in my AD&D games. Went back to wargaming roots/rules, where the rules are meant to simulate what you're doing - flatten a lot of chaos and individual actions into one roll.

    I settled on a hybrid of Chainmail and "Book of War" by Dan Collins.

    It's a d6 per10 soldiers vs the armor of the targets. Higher roll means lower AC is hit (I use descending AC). For damage, if it's 10:1 vs 10:1, I'll use Book of War resolution. If it's 10:1 vs. 1:1, then I'll roll a second die for damage type (usually this is missile combat, so d6).

    Been doing that for several years now and it greatly reduces the rolls. The players don't mind and have enjoyed the mass combat aspects of what I do.

    ReplyDelete
  2. I did something similar a few years back. Yours involves more math, but more closely replicates the outcomes of combat in most OSR systems

    https://taylor-lane.itch.io/one-roll-combat

    ReplyDelete
  3. While not exactly the same, this reminds me quite a bit of Tunnels & Trolls.

    ReplyDelete
  4. I played Rolemaster for ages and I can tell you that summing all those values, calculating percentages and those two tables are the kind of thing that drove me away from it and towards DnD.
    Everything that involves even some math is a real tax while playing and running the game.

    ReplyDelete
  5. I love the idea of this, but want to make sure I understand how it works. You say:

    "When the party makes an attack, everyone states who they are attacking. Then they roll a single d6 for the entire party. [...] Damage is applied first to the player's target. Excess damage rolls over onto the next targets with a 2 point tax every time damage rolls over."

    I was at first confused by the plural "everyone" and "they" in conjunction with a single d6 roll and the singular "player's target". Unless I'm misunderstanding, I think it would have been clearer to me, personally, if it had been worded like this:

    "When the party makes an attack, they must choose which enemy will be the primary target. A single d6 is then rolled for the entire party. [...] Damage is applied first to the primary target. Any damage exceeding the target's HP then 'rolls over' onto other targets, with a 2 point tax every time damage rolls over."

    Is this in line with your intentions? I think the first time I read it, the wording lead me to believe each PC should pick their own target, like normal. But this wouldn't work when there is only one damage result that gets applied to one target.

    That leaves the question of a mix of flying and non-flying targets. An example of how to "split proportionately" would be very helpful. Like, let's say my party is attacking rats and bats at the same time. How does that damage get split?

    Thanks for sharing, I'm hoping I can integrate this combat system into my solo play so that I can run bigger parties with faster combat.

    ReplyDelete
    Replies
    1. You said it more clearly than I did.

      I would say that when the party is attacking the rats and bats, they could choose who was damaged first, unless they don't have enough ranged attackers (proportionately) to kill the bats.

      Delete
  6. In two of my diy-roguelike-boardgames I use a combat mechanic, where both parties get their combat results on the same d6. For example the pc has a sword that deals damage on a 1-3, the monster deals damage on 5-6. In that case, you deal a point of damage on 1-3, lose one hp on 5-6 and nothing happens on a 4. There is also the possible combination of you wielding a helbeard that deals damage on 1-4, fighting a monster that does damage on 4-6. In that case, 4 means that both parties get hurt.

    ReplyDelete