The Mathematics of Difficulty in Shadowdark
Table of Contents
Generating Player Character Statistics Traditional Method Anydice Code Results At least 14 Method AnyDice Code Results Adjusting DCs vs Advantage & Disadvantage Flat rolls vs Standard DCs Anydice Code Adding in Advantage & Disadvantage Direct Probabilities Change in Probabilities Anydice Code Probability of Success with Advantage Probability of Success with Disadvantage Probability Change given Advantage Probability Change given Disadvantage Conclusion Adjusting DCs Advantage & Disadvantage How can we use this? The other day I was having a discussion in the Shadowdark Discord about dice maths, so I decided to dive in and take a look. Because of the d20 vs DC core mechanic, the maths turns out quite different to other OSR games.
In Shadowdark there are two main “dials” the game master can use to adjust the difficulty of a check. Those are:
- Adjusting the DC between:
- Easy (DC 9)
- Normal (DC 12)
- Hard (DC 15)
- Extreme (DC 18)
- Granting advantage or disadvantage
These adjustments are made on top of the bonuses & penalties the PCs already have from their stats, class talents, and magic items.
I have thus set out to answer the following question: What is the mathematical difference between adjusting a DC, and granting advantage/disadvantage
Key Take-Away
Adjusting a DC applies a linear shift to a check’s baseline difficulty and affects everyone equally — advantage and disadvantage best represent situational circumstances and they disproportionately impact characters based on their pre-existing bonuses & penalties.
Generating Player Character Statistics
Before we can determine the difference between adjusting DCs or granting advantage/disadvantage, we first have to work out what effects the different methods of character generation in Shadowdark have on player statistics and their bonuses & penalties.
Shadowdark has 6 core stats: strength, dexterity, constitution, intelligence, wisdom & charisma. In shadowdark, as in many other OSR games, these stats are generated by rolling 3d6 six times and placing them, in order, into the six core stats. This is what I’m going to call the traditional method.
Beyond the traditional method, Shadowdark also offers an optional rule which allows players to discard all of their stats & roll again if all six of them are below 14. This is what I’m going to call the at least 14 method.
I want to compare the outcomes of these two methods of stat generation, to identify the following:
- What you can expect the average stat of a PC to be.
- What you can expect a PC’s highest stat to be
- What you can expect a PC’s lowest stat to be
Traditional Method
For the traditional method, this is pretty easy to work out. We just need to calculate the following:
- Average Stat: Expected value of 3d6
- Highest Stat: The expected value of the highest die across every permutation of the roll 6×(3d6)
- Lowest Stat: The expected value of the lowest die across every permutation of the roll 6×(3d6)
AnyDice can make this sort of calculation easy. In the end we get a curve that looks like this:

Code & Data
Anydice Code
output 6@(6d(3d6)) named "Average lowest stat"
output 3d6 named "Average stat"
output 1@(6d(3d6)) named "Average highest stat"Results
| 3d6 | Lowest Stat | Average Stat | Highest Stat |
|---|---|---|---|
| 3 | 2.75% | 0.46% | 0.00% |
| 4 | 7.86% | 1.39% | 0.00% |
| 5 | 14.15% | 2.78% | 0.00% |
| 6 | 19.42% | 4.63% | 0.00% |
| 7 | 21.20% | 6.94% | 0.00% |
| 8 | 18.10% | 9.72% | 0.03% |
| 9 | 10.56% | 11.57% | 0.25% |
| 10 | 4.40% | 12.50% | 1.28% |
| 11 | 1.28% | 12.50% | 4.40% |
| 12 | 0.25% | 11.57% | 10.56% |
| 13 | 0.03% | 9.72% | 18.10% |
| 14 | 0.00% | 6.94% | 21.20% |
| 15 | 0.00% | 4.63% | 19.42% |
| 16 | 0.00% | 2.78% | 14.15% |
| 17 | 0.00% | 1.39% | 7.86% |
| 18 | 0.00% | 0.46% | 2.75% |
This gives us a result that shows the following means for each stat:
| Stat | Mean Stat | Associated Bonus |
|---|---|---|
| Average | 10.5 | +0 |
| Lowest | 6.77 | -2 |
| Highest | 14.23 | +2 |
This means that, using the traditional method, we can expect a PC to average +0 in their stats, expect their highest stat bonus to be +2, and their lowest to be -2.
At least 14 Method
The at least 14 method is actually significantly harder to calculate, as we need to be able to exclude from our averages any result where every stat is under 14. It turns out this is still possible to do in anydice with custom functions, and the resulting curve is as follows:

Code & Data
AnyDice Code
function: validatedaverage D:s {
if (1@D <= 13) {
result: d{}
}
result: d D
}
function: validatedmax D:s {
if (1@D <= 13) {
result: d{}
}
result: 1@D
}
function: validatedmin D:s {
if (1@D <= 13) {
result: d{}
}
result: 6@D
}
output [validatedmin 6d(3d6)] named "Average lowest stat (at least one stat ≥ 14)"
output [validatedaverage 6d(3d6)] named "Average stat (at least one stat ≥ 14)"
output [validatedmax 6d(3d6)] named "Average highest stat (at least one stat ≥ 14)"Results
| 3d6 | Lowest Stat | Average Stat | Highest Stat |
|---|---|---|---|
| 3 | 2.47% | 0.42% | 0.00% |
| 4 | 7.11% | 1.25% | 0.00% |
| 5 | 12.98% | 2.49% | 0.00% |
| 6 | 18.28% | 4.16% | 0.00% |
| 7 | 20.79% | 6.23% | 0.00% |
| 8 | 18.85% | 8.73% | 0.00% |
| 9 | 11.91% | 10.39% | 0.00% |
| 10 | 5.45% | 11.22% | 0.00% |
| 11 | 1.75% | 11.22% | 0.00% |
| 12 | 0.36% | 10.39% | 0.00% |
| 13 | 0.04% | 8.73% | 0.00% |
| 14 | 0.00% | 10.62% | 32.43% |
| 15 | 0.00% | 7.08% | 29.71% |
| 16 | 0.00% | 4.25% | 21.64% |
| 17 | 0.00% | 2.12% | 12.03% |
| 18 | 0.00% | 0.71% | 4.20% |
This gives us mean stats that look like:
| Stat | Mean Stat | Associated Bonus |
|---|---|---|
| Average | 10.96 | +0 |
| Lowest | 6.93 | -2 |
| Highest | 15.26 | +2 |
While this table makes the results look pretty similar to those generated with the traditional method, there are actually still some really important differences:
- A PC’s highest stat is always 14 or higher. While this still gives us an average of +2 for a PC’s highest stat, it increases their chances of having at least a +3 from 24.75% with the traditional method, to 37.86% with the at least 14 method — that’s an increase of 13.11%.
- Because of the extra peak in the curve for the average stat, a player is more likely to get a 14 for any given stat than they are a 12 or 13. Accordingly, their probability of getting a +1 in any given stat from 37.5% to 43.9% — a 6.4% bump.
With the at least 14 method, we can still expect a PC to average +0 in any given stat, and for their highest & lowest stats to be +2 & -2 respectively, however they are significantly more likely to have a +3 in their highest stat when compared to the traditional method.
Adjusting DCs vs Advantage & Disadvantage
Now that we know what we can expect the average PC’s stats to be, we can use those stats (-2, +0, +2) as a baseline to calculate the probability of them succeeding against the standard DCs.
Flat rolls vs Standard DCs
Shadowdark’s 4 standard DCs are:
- Easy (DC 9)
- Normal (DC 12)
- Hard (DC 15)
- Extreme (DC 18)
And the probability of success vs each of those DCs with the bonuses & penalties from earlier is shown below.
| Bonus or Penalty / DC | -2 | +0 | +2 |
|---|---|---|---|
| 9 | 50% | 60% | 70% |
| 12 | 35% | 45% | 55% |
| 15 | 20% | 30% | 40% |
| 18 | 5% | 15% | 25% |
Code
Anydice Code
loop A over {9, 12, 15, 18} {
loop B over {-2, 0, +2} {
output 1d20 + B >= A named "[B] vs DC [A]"
}
}As a step up or down along the standard DCs is a ±3 (±15%) jump, it increases or decreases the chances of a PC’s success linearly.
We also know that a player trying to succeed against a Normal DC (12) with their best stat is more likely than not to succeed; With their worst stat, they’re more likely than not to fail.
Adding in Advantage & Disadvantage
It is often said that advantage is roughly equal to a +5 bonus, and disadvantage a -5 penalty; while this sometimes gets close, the reality is actually far more complicated. The benefit or drawback of advantage & disadvantage are highly situational, and have wildly different effects on the probability depending on the stat bonuses already in play as well as the DC in question.
There are two ways to look at the impacts of applying advantage or disadvantage:
- Direct Probabilities. We can look directly at the probability of success vs a DC, with bonuses; or
- Change in Probabilities. We can look at the change in chances of success vs a DC, with bonuses
We will look at direct probabilities first, because they are needed to calculate the change in probabilities.
Direct Probabilities
We can, again, use AnyDice to help us calculate these probabilities, and get the following results:

When you have advantage, stepping up & down between DCs does not result in a linear change in probability; instead probability changes on a curve that drops off faster and faster as DCs increase.
Interestingly, the curve is different depending on the static bonuses & penalties being applied — the worse a PC’s penalty, the faster their chances of success drop when stepping up through DCs. This means that the worse a PC’s penalty, the less impactful advantage is for them. On the other hand, the greater a PC’s bonus, the more impactful advantage is for them.
For example, given an Easy (DC 9) check with advantage, a +2 bonus only increases your chances of success by 7%. Without advantage, that +2 would increase your chances by 10%. Conversely, the same +2 bonus vs an Extreme (DC 18) check confers a whopping 16% increase in your chances of success.
When we take a look at disadvantage, we see the exact same pattern just in reverse; PCs with big penalties are more negatively impacted, and PCs with big bonuses are less negatively impacted.

Change in Probabilities
Instead of looking at the probability of success given advantage or disadvantage, we can instead look at how your probability of success changes, when compared to a flat roll without advantage or disadvantage. We can then use that change in probability to approximate an equivalent bonus to advantage at different DCs — This isn’t to say that advantage should be equated to bonuses, but it does help us get a better understanding of the impacts of advantage.

Here we see the same pattern we saw earlier — the higher your bonus, the more impactful advantage is for you. We also continue to see that advantage becomes less and less helpful the higher the DC gets. Given a bonus of +0 vs an Easy (DC 9) check, advantage increases a PCs chances of success by 24% (roughly equivalent to a +5 in a flat roll), but against an Extreme (DC 18) check, advantage only increases the PC’s chances by 12.75% (Roughly equivalent to a +3 bonus).
This effect becomes even more pronounced if you start with a -2 penalty instead of a +0 bonus. In this case, advantage only gives a 4.75% increase to the PC’s chances of success vs an Extreme (DC 18) check — less than a +1 bonus.
This pattern exists because Advantage & Disadvantage increase your chances of getting a higher or lower number, but they never increase the maximum or minimum number that you can roll. As the DC increases for a check, and a PC gets greater and greater penalties, their chances of success even if they roll really well go down. For example, if a PC has a penalty of -4 vs an Extreme (DC 18) check then even a 20 on the dice cannot beat the DC, and thus advantage is useless in this situation. The same is true if you go the other way too, the lower the DC and the higher the bonus, the less impact advantage has — we just don’t see this as clearly in Shadowdark as there are no DCs under 9 (but you can still see the beginnings of this in the chart between DC 9 and DC 12, where the effectiveness of advantage seems to flip)
And for disadvantage, we once again see the exact same patterns but mirrored:

Above a DC 9, advantage is disproporionately helpful to PCs with higher bonuses, and disadvantage is disproporionately harmful to PCs with greater penalties.
Given all of this information, we can calculate a rough equivalence between advantage & disadvantage for different DCs, and different static bonuses/penalties:
| Bonus or Penalty / DC | -2 | +0 | +2 |
|---|---|---|---|
| 9 | ±5 | ±5 | ±4 |
| 12 | ±5 | ±5 | ±5 |
| 15 | ±3 | ±4 | ±5 |
| 18 | ±1 | ±3 | ±4 |
Evidently, while a lot of these numbers do hover around the ±5 mark, it is a lot more complicated than that.
Code & Data
Anydice Code
loop A over {9, 12, 15, 18} {
loop B over {-2, 0, +2} {
output 1@2d20 + B >= A named "Advantage [B] vs DC [A]"
output 2@2d20 + B >= A named "Disadvantage [B] vs DC [A]"
}
}Probability of Success with Advantage
| Bonus or Penalty / DC | -2 | +0 | +2 |
|---|---|---|---|
| 9 | 75.00% | 84.00% | 91.00% |
| 12 | 57.75% | 69.75% | 79.75% |
| 15 | 36.00% | 51.00% | 64.00% |
| 18 | 9.75% | 27.75% | 43.75% |
Probability of Success with Disadvantage
| Bonus or Penalty / DC | -2 | +0 | +2 |
|---|---|---|---|
| 9 | 25.00% | 36.00% | 49.00% |
| 12 | 12.25% | 20.25% | 30.25% |
| 15 | 4.00% | 9.00% | 16.00% |
| 18 | 0.25% | 2.25% | 6.25% |
Probability Change given Advantage
| Bonus or Penalty / DC | -2 | +0 | +2 |
|---|---|---|---|
| 9 | 25.00% | 24.00% | 21.00% |
| 12 | 22.75% | 24.75% | 24.75% |
| 15 | 16.00% | 21.00% | 24.00% |
| 18 | 4.75% | 12.75% | 18.75% |
Probability Change given Disadvantage
| Bonus or Penalty / DC | -2 | +0 | +2 |
|---|---|---|---|
| 9 | -25.00% | -24.00% | -21.00% |
| 12 | -22.75% | -24.75% | -24.75% |
| 15 | -16.00% | -21.00% | -24.00% |
| 18 | -4.75% | -12.75% | -18.75% |
Conclusion
So what is the mathematical difference between adjusting a DC, and granting advantage/disadvantage?
Adjusting DCs
Adjusting DCs is a clean, linear way to increase or decrease a PC’s chances at success. Each step along the standard DCs goes up or down by 15%, and your chances increase by that 15% across the board, regardless of any other bonuses you have.
A change in DC represents a change in difficulty that benefits or hinders everyone equally, regardless of skill.
Advantage & Disadvantage
Fundamentally, advantage & disadvantage aren’t fair — Advantage helps players with high stats far more than it helps players with low stats, and disadvantage hinders players with low stats far more than it hinders players with high stats.
Advantage & disadvantage are a poor representation of repeatable skill, and come much closer to representing situational edge or obstacle, where a PCs ability to capitalise on that edge, or work around that obstacle is tempered by their pre-existing stat bonuses.
How can we use this?
There’s been a fair amount of discussion about when to use advantage/disadvantage and when to adjust DCs up or down a step, and I think this really helps give some guidance on this. The way I interpret the maths here is as follows:
- Pre-existing skill or some innate competence is best represented by adjusting DCs.
- Situational leverage, or a circumstantial leg-up that still requires skill to capitalise on is best represented by advantage.