Modern Dungeons and Dragons (3rd Edition Onwards) have all adopted a unified hit resolution system.

\[\text{d20} + \text{Attack Mod} \ge \text{Armour Class} \implies \text{Hit}\]

Those well versed in gaming history, or experienced in Old-School Systems, will almost certainly be familiar with the older variant of this, introduced in 2nd Edition: THAC0.

\[\text{d20} + \text{Attack Mod} \ge \text{THAC0} - \text{Armour Class} \implies \text{Hit}\]

Those versed in mathematics will notice a significant difference with this sytem. Armour Class essentially acts as a bonus to your attack roll (simmilar to an attackers own Attack Mod). This is more clear as I rewrite it as this equivalent formula.

\[\text{d20} + \text{Attack Mod} + \text{Armour Class} \ge \text{THAC0} \implies Hit\]

This therefore gives us that in older editions, lower armour class was better. This might seem alien to modern gamers, but it does make a sort of sence: "First Class Armour" is better than "Third Class Armour" after all.

So, this gives us two clear different forms of armour class. The modern sort: bigger is better, which is called "Ascending Armour Class"; and the old-school sort: lower is better, which is called "Descending Armour Class".

We'll call these \(a_\uparrow\) and \(a_\downarrow\) from now on to avoid confusion. We're also going to start calling the Attack Modifier \(m\), the THAC0 \(t\) and the d20 Dice roll \(D\) to keep things brief.

\[D + m \ge a_\uparrow \implies \text{Hit} \\ D + m \ge t - a_\downarrow \implies \text{Hit}\]

Unfortunatley for this article to progress, we're going to need to break down that \(m\) a little bit further too. There are three properties that usually contribute to \(m\), the capability of the attacker (a modifier from strength or dexterity) \(m_a\), the experience of the attacker (profficiency bonus, skill bonuses, other things which improve significantly over time) \(m_t\), and the bonus given by any magical weapon \(m_m\). The significant part of this system is that the improvement over time \(m_t\) is not present in older systems, which represent it instead by improving THAC0.

\[D + m_a + m_t + m_m \ge a_\uparrow \implies \text{Hit}\\ D + m_a + m_m \ge t - a_\downarrow \implies \text{Hit}\]

Now we've managed to write the expression out in full, it's clear that as \(m_a+m_m\) is common to both, we can ignore it for our comparison of these systems (for any algebra, assume they are just part of \(D\), we can always bring them out later if we need them). There's also a nice algebra trick we can do, which is to acknowledge we'd probably like to isolate \(a_\downarrow\) on the right hand side of our expression, so that the information the player knows (their own statistics) is on the left, and the information the DM knows (enemy armour class) is on the right. This article isn't going to make any statements about the idea of DMs telling players the enemy AC, we will simply assume it's going to be in the DMs pervue for the time being.

\[D + m_t \ge a_\uparrow \implies \text{Hit}\\ t - D \le a_\downarrow \implies \text{Hit}\]

So, we have essentially got four terms here to play around with. \(m_t, t, a_\uparrow, a_\downarrow\). These four terms are currently organised such that they are related in pairs. For our purposes going forward, I think it's going to be useful to look at ways we can relate things in an unexpected way. First of all, the relationship between \(m_t\) and \(t\). Both are a measure of a persons experience and combat prowess, \(m_t\) increases over time: typically from \(0\). While \(t\) decreases over time, for the oldest editions of D&D this decreases from \(19\). So it might be fair to express the relationship as:

\[0 + t = 19 - m_t\]

With \(0\) being the fact that \(m_t\) starts at \(0\), and \(19\) being the fact that \(t\) starts at \(19\). If you have different values of these for whatever system you are looking at, feel free to make adjustments here.

The next values worth equating are \(a_\uparrow\) and \(a_\downarrow\). We can take advantage of the fact that \(t\) and \(m_t\) should always sum to \(19\) to extrapolate that the same should be true for \(a_\uparrow\) and \(a_\downarrow\), in order to keep the probability to hit the same.

\[t + m_t = a_\uparrow + a_\downarrow = 19\]

We can now use these, and \(D\), to build up four ways to evaluate probability to hit.

\[D + m_t \ge a_\uparrow \implies\text{Hit}\\ D + 19 - t \ge a_\uparrow \implies\text{Hit}\\ t - D \le a_\downarrow \implies\text{Hit}\\ 19 - m_t - D \le a_\downarrow \implies\text{Hit}\]

Of these structures, the most commonly used resolution method other than the two standard ones introduced so far is seen in the final row, rearranged to the following form.

\[D + m_t + a_\downarrow \ge 19 \implies\text{Hit}\]

This system is usually called "Target 20" after the fact it was popularised in a game that had 20 as the base THAC0 rather than 19. This system is particularly elegant, as it allows player to simply add numbers together to resolve hitting. The player can call out the sum of their dice roll and attack bonus, the DM can add the creatures armour class, and comparing with 19 can determine if a hit was achieved. The astute might note that this is equivalent of simply subtracting the \(a_\downarrow\) from \(19\) in order to calculate \(a_\uparrow\), and while this is true, addition is an easier mental model when working with creatures that already have a descending armour class written. Ultimately as a DM, I will likely perform this \(a_\uparrow = 19 - a_\downarrow\) conversion to obtain a single target number, but the equivalence of these systems provides flexibility.

This has another large benefit of compatability. Most monster stat blocks provided in old-school resources will use descending armour class. Especially those written in the era the games were created in (as ascending armour class was not popularised at that time). Using the "Target 19" system allows for using these without any mental conversion. However it eliminates THAC0 which often causes undue confusion for modern players, and allows them to keep their more familiar bonuses to hit.

There is one other system I'd like to look at. It's a form of 'sandwich AC' where your goal is to roll as high as possible without going over. Stated simply.

\[a_\uparrow' < D \le m_t'\]

As before, \(m_t\) represents a value that improves with experience, and \(a_\uparrow\) is an armour value for which higher is better. I have represented these with a \('\) as we are going to need to do a little bit more work to get these values.

For this system, enemy armour values have a minimum of 1 and increase (typically, they may not exceed \(m_t'-1\) to allow a player to always have a chance to hit). The players own "attack bonus" (which is now a roll under target) also needs to start significantly higher. Ultimately, we would like to say an unarmoured foe has a specific armour value we would like to be the base. The worst AC that most systems are designed around is \(a_\downarrow=9\) which is \(a_\uparrow = 10\), as these are the default for an "unarmoured person". Sometimes ACs lower than these occur, but to my knowledge none are present in the 1981 Expert Edition of D&D, and as that's the easiest for me to search I'm going to treat them as a non entity for now.

So, with an ascending AC of 10 base being converted to an ascending AC of 1 base, we need to subtract 9 from all ascending ACs (\(a_\uparrow'=a_\uparrow-9\)) to get this roll between style AC. Alternatively the new \(a_\uparrow'=10-a_\downarrow\). To the best of my knowledge, the most powerful old school monster in the afformentioned version I play is a Greater Elemental, Gold Dragon, or Dragon Turtle, each with an \(a_\downarrow=-2\). This gives them an easily attainable \(a_\uparrow'=12\). Meaning to hit the most powerful creatures, you must roll a 12 or higher, and under another as yet undetermined target number. This range from 1 to 12 seems entirely reasonable to me.

Next, we need to figure out the target roll under number. The simplest way for us to do this is to look at our pre-existing to hit resolution values. In the 1981 edition I run, the best possible \(m_t\) a fighter can have is +9. They can then get a further \(+3\) from their strength and a \(+3\) from a magic weapon, but we'll address this later. Intuitively, it would be nice if the strongest possible fighter had \(m_t'\) of 20: meaning that they are only limited by the opponents armour class. This would be equivalent to \(t=10\) or \(m_t=9\), so therefore we might want to do \(m_t'=m_t+11\). We can't just go with what feels intuitively nice, we want to also capture the rough correct probabilities.

Let's start by looking at a level 1 fighter versus an unarmoured target, using a traditional ascending system to give us \(a_\uparrow\) and \(m_t\).

\[D + m \ge a_\uparrow\\ D + 0 \ge 10\\ D \ge 10\\ \text{55 in 100 chance}\]

Lets contrast this with the system I'm proposing.

\[a_\uparrow' < D \le m_t'\\ 1 < D \le 11\\ \text{50 in 100 chance}\]

It being slightly lower is obvious undesirable. \(+11\) provides such a nice parity of \(20\) being the highest possible a person can acheive however, so I think the more sensible thing to do here is to lose the property I was originally trying to maintain of a 1 always missing, and allow AC to be one lower (meaning to hit an unarmoued target, you simply need to beat your own targer number). With this, we get:

\[a_\uparrow'=a_\uparrow-10=9-a_\downarrow\\ m_t'=m_t+11=30-t\]

This gives us again, with a level 1 fighter versus an unarmoured target.

\[a_\uparrow' < D \le m_t'\\ 0 < D \le 11\\ \text{55 in 100 chance}\]

For a level 14 fighter versus a target in plate mail with a shield

\[D + m \ge a_\uparrow\\ D + 9 \ge 17\\ D \ge 8\\ \text{65 in 100 chance}\\ a_\uparrow' < D \le m_t'\\ 7 < D \le 20\\ \text{65 in 100 chance}\]

It seems our setup works.

Now onto the more difficult task of dealing with those two values we've been ignoring this entire time. \(m_m\) and \(m_a\). Unfortunately, as bigger isn't always better in this system, adding them to \(D\) would be unfairly punishing to the player, and adding them to \(m_t'\) would make them uneccessary to sufficiently advanced adventurers. To resolve this, I would simply leave them as a number of points players can add to their dice roll if they want to. This avoids the issue of them punishing players. The simplest way to state this is that your weapon modifier and strength allow you to increase your roll to hit up to but not above your target number.