Your roguelike hands out "+20% damage" upgrades. A player takes five of them. Is their damage now double, or two and a half times what it was? Both answers are reasonable, and your code has already picked one, possibly without you noticing. The choice decides whether a build stays in check or runs away from you.
This is part 3 of a series on loot and upgrades.
Two ways to apply the same bonus
Take a 20-damage hit. That is the quick slash in the 2D roguelike course. Give it two +25% bonuses.
Additive: add the percentages, then apply them once. 25% + 25% is 50%, and 20 × 1.5 is 30.
Multiplicative: apply each one to whatever is already there. 20 × 1.25 is 25, then 25 × 1.25 is 31.25.
With two bonuses the gap is small, and that is why it slips by unnoticed. The gap grows with every bonus. Slide the picks up below.
Stack the same bonus two ways
Interactive modelAdditive
40
next pick: +10%
Multiplicative
49.8
next pick: +20%
- Additive
- Multiplicative
Starting from a 20-damage hit. Additive: 20 × (1 + 5 × 0.20) = 40. Multiplicative: 20 × 1.205 = 49.8. The next pick adds +10% to the additive build but always +20% to the multiplicative one. Additive bonuses shrink in value as they pile up. Multiplicative ones snowball.
A simplified model of the idea, for seeing how it behaves. It is not engine code.
The worked numbers: five picks of +20%
| Picks | Additive | Multiplicative |
|---|---|---|
| 0 | 20 | 20 |
| 1 | 24 | 24 |
| 2 | 28 | 28.8 |
| 3 | 32 | 34.56 |
| 4 | 36 | 41.47 |
| 5 | 40 | 49.77 |
After five picks, additive damage has doubled and multiplicative damage is close to two and a half times. Ten picks go further: 60 against about 124.
The number that matters: the next pick
Look at how much the sixth +20% pick adds:
- Additive: from 40 to 44. That is 10% more damage, not 20%. The bonus is 20% of the base, and the build is already twice the base.
- Multiplicative: from 49.77 to 59.72. That is 20% more damage, exactly as the card says.
That is the whole difference. Under additive stacking, each new bonus is worth a little less than the last one, relative to what you already have. Players can feel it: the tenth "+20%" barely moves the number. Under multiplicative stacking every bonus is worth its full face value, forever, so stacks keep accelerating.
Neither is wrong. They suit different jobs.
Which to use, and when
Additive is the safe default for common bonuses that players will stack a lot. Growth stays linear, so you can predict the strongest build and balance against it. The Stats & Leveling course on CodingQuests stacks its percent bonuses this way. Its stat formula is (base_value + _flat_modifiers) * (1.0 + _percent_modifiers), so two +25% bonuses give ×1.5.
Multiplicative suits rare, build-defining bonuses, the ones that should feel big. The 2D roguelike course stores Swift Boots as a multiplier, move_speed_mult *= 1.12. Its lesson spells out the result: two pairs give 1.2544 rather than 1.24, because multipliers compound.
Two pots, used together, give you both. Put common bonuses in an additive pot, and rare ones in a multiplicative pot applied on top. Path of Exile players call these "increased" and "more". Unreal Engine's Gameplay Ability System offers both too. Its MultiplyAdditive option adds multipliers first ("50% + 50% = 100%"), and its MultiplyCompound option multiplies them ("1.5 * 1.5 = 2.25").
What big games learned the hard way
Multiplicative pots can quietly break a game's balance. In Diablo IV's 1.2.0 patch, Blizzard wrote that builds using Critical Strike Damage and Vulnerable Damage had been "disproportionately powerful". The stats sat in separate pots that multiplied with everything else, and the patch made new sources additive instead.
Riot made the opposite kind of move in League of Legends. They replaced cooldown reduction, which grew stronger with every point and needed a cap, with Ability Haste. Their reason: "every amount of Ability Haste you buy has the same impact, rather than an exponential one".
The lesson is the same both times. Know which way each bonus stacks before players find out for you.
Where stacking goes wrong
Flat bonuses in the wrong order. Add flat bonuses before percentages, or percentages miss them. With +8 flat and +25%, (20 + 8) × 1.25 is 35. 20 × 1.25 + 8 is only 33. The 2D roguelike course computes weapon damage as (QUICK_DAMAGE + bonus) * mult, flat first.
Removing a multiplier by subtracting. Taking off a ×1.2 bonus means dividing by 1.2. Better still, keep a list of active bonuses and recompute from scratch, so rounding never drifts.
Percent of what? "+20%" of the base and "+20%" of the current value are different bonuses. Decide which, and write it on the card.
Negative percentages. Additive pots can go below zero. Five −25% debuffs make −125%, and damage turns negative. Clamp the total, or make debuffs multiplicative, so ×0.75 five times stays above zero.
In Godot: three small functions
Additive: one pot, applied once.
func damage_additive(base: float, flat: float, percents: Array[float]) -> float: var total_percent := 0.0 for p in percents: total_percent += p return (base + flat) * (1.0 + total_percent)Multiplicative: each bonus multiplies the running total.
func damage_multiplicative(base: float, flat: float, percents: Array[float]) -> float: var damage := base + flat for p in percents: damage *= 1.0 + p return damageTwo pots: the additive pot first, then each multiplier on top.
func damage_two_pots(base: float, flat: float, increased: Array[float], more: Array[float]) -> float: var total_increased := 0.0 for p in increased: total_increased += p var damage := (base + flat) * (1.0 + total_increased) for m in more: damage *= 1.0 + m return damagePercentages are written as fractions: 0.25 means +25%. With a 20 base, +8 flat and four +25% bonuses, Godot 4.7.2 returns 56 additive and 68.359375 multiplicative. Two +50% "increased" bonuses and one +25% "more" give 50.
Calculating from a list each time, rather than editing one stored number, makes removing a bonus trivial: take it out of the list. For a full stat system with modifiers tagged by source, see How to build an RPG stat system in Godot 4.
Build it next
Stats & Leveling System
A quest on CodingQuests: 8 interactive lessons that build one part of a game in Godot, in your browser, checked as you go.
The Stats & Leveling System quest builds the additive version as a reusable Stat resource. Lesson 2 adds flat and percent modifiers and the formula above, and lesson 3 gives every character a stats component. Both are free.
It has no multiplicative pot. For compounding upgrades in a real game, the 2D roguelike's Loot & Corruption quest stores multipliers like Swift Boots in its member lesson 4.
- Lesson 2: ModifiersFree
- Lesson 3: The StatsComponentFree
Lessons 1 to 4 are free to open, no account needed. Guild Hall, the membership, opens the other 4.
FAQ
What is the difference between additive and multiplicative damage bonuses?
Additive bonuses are added together and applied once: +20% and +20% make +40%. Multiplicative bonuses each multiply the result: ×1.2 and ×1.2 make ×1.44. The gap grows with every bonus, because multiplicative bonuses compound.
Should damage upgrades stack additively or multiplicatively?
Use additive stacking for common bonuses players take many of, so growth stays predictable. Use multiplicative stacking for rare, powerful bonuses that should feel big. Many games keep two pots and apply the additive one first.
Why do my percentage upgrades feel weaker the more I take?
They stack additively. Each +20% is 20% of the base, but your damage is already above the base, so each new bonus adds a smaller share of your current damage. That is often the intended way to keep power in check.
Sources and testing
- Epic Games, Unreal Engine GameplayModOp (MultiplyAdditive and MultiplyCompound)
- Blizzard, Diablo IV patch 1.2.0 notes
- Riot Games, Preseason 2021: champion class and item goals
- CodingQuests course code: Stats & Leveling lesson 2 (the stat formula) and 2D Roguelike Loot & Corruption lessons 4 and 5 (
*= 1.12,(QUICK_DAMAGE + bonus) * mult), read on 31 October 2026 - Developer questions this answers: How to best deal with percentage from gear and skills when stacking and Stat Multipliers: from Base Value or Iterative on Game Development Stack Exchange
How this was tested. The three GDScript functions were run in Godot 4.7.2 (headless, on Windows) on 31 October 2026, and the results quoted above are what Godot returned. The demo uses the same formulas, ported to the browser. It is a model of the arithmetic, not a fight.

