# 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.