Monster CR Scaler (2014) – How it works
This page documents the exact steps and formulas used by the Monster CR Scaler for the 2014 ruleset. The goal is transparency so you can understand, audit, and adapt the results at your table.
Inputs
- Source monster stat block: name, size/type, current
challenge_rating, andstats(AC, HP, STR/DEX/CON/INT/WIS/CHA). - Optional action list used to estimate DPR from damage expressions (e.g.,
1d6+2). - Target CR (supports fractional CRs 1/8, 1/4, 1/2 and CR 1–30).
- Optional bonuses:
acEquipment,acRace, and per-abilityabilityScoreBonus.
CR row lookup
We look up two rows from the internal 2014 CR matrix: one for the source CR and one for the target CR. Each row contains reference values like proficiency bonus, expected AC, HP, attack bonus, DPR, and save DC.
Implementation: findCRRow(cr) picks the highest row with row.cr ≤ cr.
Damage per round (DPR) estimation
If the monster has actions with damage strings, we estimate average damage for each action and sum:
- For each token like
X d Y(e.g.,2d6), expected value =X × (Y + 1) / 2. - An optional flat modifier
±Nis added once to that action’s total. - Non-dice numbers are parsed as a flat value where possible.
The per-action averages are summed and rounded to nearest integer. If no actions are provided, we use 1.
HP scaling
HP is scaled proportionally from the source monster’s HP to the target row’s expected HP:
hpScale = tgtRow.hp / max(1, srcHP)
finalHP = round(srcHP × hpScale), with a minimum of 1.
AC scaling
- Compute raw delta:
Δ = tgtRow.ac − srcAC. - Apply at most ±2 points toward the target:
finalAC_raw = clamp(srcAC + sign(Δ) × min(2, |Δ|), 5, 30). - Then apply user-supplied bonuses:
finalAC = finalAC_raw + acEquipment + acRace(each optional).
Ability score scaling (STR/DEX/CON/INT/WIS/CHA)
We scale ability scores by modifier steps, not by raw points:
- Compute CR difference:
crDiff = targetCR − sourceCR. - Increase the ability modifier by
floor(crDiff / 2)steps. Example: from CR 1 to CR 5,crDiff=4⇒+2modifier steps. - Map the new modifier back to the nearest canonical score using the standard “score ⇒ modifier” table.
- Apply any per-ability bonus (
abilityScoreBonus), then clamp to the 1–30 range.
HP and AC are explicitly excluded from this loop since they are handled by the formulas above.
Attack bonus advice
We provide a suggested attack bonus to help you tune actions:
- Determine the best attack ability modifier:
atkAbilityMod = max(mod(STR), mod(DEX))for the scaled stats. - Compute how the matrix’s baseline attack bonus changes:
attackDelta = tgtRow.atkb − srcRow.atkb. - Adjust for the change in the monster’s own attack stat mod (scaled vs. source):
atkAbilityMod − srcAtkMod. - Suggested:
finalAttackBonus = round(srcRow.atkb + attackDelta + atkAbilityMod − srcAtkMod).
Save DC advice
Suggested save DC starts from the target row’s DC and shifts with the monster’s INT modifier change (as a simple spellcasting‑style proxy):
finalSaveDC = tgtRow.save_dc + (mod(INT_scaled) − mod(INT_source))
DPR reference scale
We also report scaling factors to help you retune damage:
srcDPR: estimated from the input actions.tgtDPR: matrix value for target CR.dprScale = tgtDPR / max(1, srcDPR)
Bounds and clamps
- AC is clamped to 5–30 after all adjustments.
- Ability scores are clamped to 1–30.
- HP has a minimum of 1.
Fractional CRs and ranges
The scaler supports CR 1/8, 1/4, 1/2 and 1–30. Internally, target/source rows are selected by ≤ logic, so a non‑listed CR value will use the nearest lower row.
Randomness note
The in‑app 2014 CR matrix spans the DMG ranges and includes some randomized values for AC/HP/DPR within official bands to avoid singular results. The production app uses the real matrix; you can always override outcomes via the bonuses described above.
CR Matrix Reference
These are the complete baseline stat expectations used for scaling.
| Challenge Rating | Proficiency Bonus | Armor Class | Hit Points | Attack Bonus | Damage per Round | Save DC |
|---|---|---|---|---|---|---|
| 0 | 2 | 12 | 1 | +1 | 1 | 10 |
| 1/8 | 2 | 12 | 7 | +3 | 3 | 10 |
| 1/4 | 2 | 13 | 15 | +3 | 5 | 11 |
| 1/2 | 2 | 13 | 30 | +4 | 9 | 12 |
| 1 | 2 | 13 | 30 | +4 | 9 | 12 |
| 2 | 2 | 13 | 45 | +4 | 15 | 13 |
| 3 | 2 | 13 | 60 | +5 | 21 | 13 |
| 4 | 2 | 14 | 75 | +5 | 27 | 14 |
| 5 | 3 | 15 | 130 | +6 | 33 | 15 |
| 6 | 3 | 15 | 145 | +6 | 39 | 15 |
| 7 | 3 | 15 | 160 | +6 | 45 | 15 |
| 8 | 3 | 16 | 180 | +7 | 51 | 16 |
| 9 | 4 | 16 | 200 | +7 | 57 | 16 |
| 10 | 4 | 17 | 220 | +7 | 63 | 16 |
| 11 | 4 | 17 | 245 | +8 | 69 | 17 |
| 12 | 4 | 17 | 260 | +8 | 75 | 17 |
| 13 | 5 | 18 | 280 | +8 | 81 | 18 |
| 14 | 5 | 18 | 300 | +9 | 87 | 18 |
| 15 | 5 | 18 | 325 | +9 | 93 | 18 |
| 16 | 5 | 18 | 350 | +10 | 99 | 18 |
| 17 | 6 | 19 | 400 | +10 | 105 | 19 |
| 18 | 6 | 19 | 450 | +10 | 111 | 19 |
| 19 | 6 | 19 | 500 | +11 | 117 | 19 |
| 20 | 6 | 19 | 550 | +11 | 123 | 19 |
| 21 | 7 | 19 | 600 | +12 | 129 | 20 |
| 22 | 7 | 19 | 650 | +12 | 135 | 20 |
| 23 | 7 | 19 | 700 | +13 | 141 | 20 |
| 24 | 7 | 19 | 750 | +13 | 147 | 21 |
| 25 | 8 | 19 | 800 | +14 | 153 | 21 |
| 26 | 8 | 19 | 850 | +14 | 159 | 21 |
| 27 | 8 | 19 | 900 | +15 | 165 | 22 |
| 28 | 8 | 20 | 950 | +15 | 171 | 22 |
| 29 | 9 | 20 | 1000 | +16 | 177 | 22 |
| 30 | 9 | 21 | 1100 | +17 | 183 | 23 |
Based on 5e 2014 DMG and 2024 Update guidelines with minor range smoothing.