Math Forumlas for D&D
From Drinking and Dragons
A compilation of important formulas derived from d20 System sources.
Most of these are well known, but posted here as a reference.
Ability Modifiers
modifier = ability / 2 – 5
or modifier = (ability – 10) / 2 , round down.
- Division is rounded down.
- Ability should be 0 or greater.
Bonus Spells
bonus = (ability – (spellLevel + 1) * 2) / 8
- Division is rounded down, to 0 minimum.
- 0-level spells receive no bonuses.
- If the ability is less than 10+spellLevel, no spells of that level can be cast.
- Ability should be 0 or greater.
- SpellLevel should be between 1 and 9.
Base Attack Bonus
goodAttacks = classLevel * 1
normAttacks = classLevel * 3 / 4
poorAttacks = classLevel * 1 / 2
- Division is rounded down.
- ClassLevel should be greater than 0.
Saving Throws
goodSave = classLevel / 2 + 2
poorSave = classLevel / 3
- Division is rounded down.
- ClassLevel should be greater than 0.
Skill Max Ranks
inClassMax = characterLevel + 3
crossClassMax = (characterLevel + 3) / 2
- Division is not rounded.
- CharacterLevel should be greater than 0.
Spell Cost
cost = spellLevel * casterLevel * 10
- 0-level spells count as ½ spell level.
- SpellLevel should be between 1 and 9.
- CasterLevel should be greater than 0.
Treasure and Character Wealth
Neither the treasure tables, nor NPC or PC wealth tables, appear to follow a regular formula.
Speed
encumberedSpeed = baseSpeed * 0.7
- Rounding is done to the nearest multiple of 5.
- BaseSpeed should be greater than 0.
- (Note: The FAQ expands movement table in way that breaks any formula.)
Encumbrance
if strength 10, then: maxLoad = strength * 10
if strength > 10, then: maxLoad = 1.1487 ^ (strength - 10) * 100
- Rounding is done to the nearest multiple of 5, 10, 20, or 40 (in steps of 5 strength).
- Other modifiers may be made per the d20 System for character size, number of legs, etc.
- Light load is 1/3 the max load; medium load is 2/3 the max load (round down).
- (Note: 1.1487 approximates 104)
- Strength should be greater than 0.
Movement
movePerHour = speed / 10
movePerDay = speed / 10 * 8
- Terrain modifiers may apply to these figures.
- Speed should be greater than 0.
Experience Points
requiredXP = level * (level – 1) * 500
- (Note each level requires an added level * 1000 XP to advance through it.)
- Level should be greater than 0.
Challenge Ratings
Fractional CR 1/2 1/3 1/4 1/6 1/8 1/10
Integral CR -1 -2 -3 -4 -5 -6
- For the following formulas, fractional CRs may be converted to negative integers as above.
- ChallengeRating should be a fraction as above.
Encounter Levels
EL = challengeRating + 2 * ln(number) / ln(2)
- (Note that ln(number) / ln(2) = log2 (number).)
- ChallengeRating should be an integer.
- Number should be greater than 0.
Experience Awards
CD = challengeRating – partyLevel
if CD is even, then: award = partyLevel * 2 ^ (CD / 2) * 300
if CD is odd and CD < 0, then: award = partyLevel * 2 ^ ((CD+1) / 2) * 200
if CD is odd and CD > 0, then: award = partyLevel * 2 ^ ((CD-1) / 2) * 450
- No award is given if |CD| > 7.
- PartyLevels of 1 or 2 are treated as 3, except when the CR is 1 or 2.
- (Note that the first “CD is even” case can be used as an approximation for all cases.)
- (The second case is basically x2/3 the first.)
- (The last case is basically x3/2 the first.)
- ChallengeRating should be an integer.
- PartyLevel should be greater than 0.