Skip to main content
Coding Quests
The Scroll Library
Visual Explainers

Additive vs Multiplicative Upgrades: How Stacking Changes Your Numbers

October 31, 20267 min read
Part 3 of 4: Loot, rewards and upgrades, explained

How weighted drops pick an item, how to offer several rewards without repeats, and how stacking and cursed upgrades change a run.

  1. 1.Weighted loot tables
  2. 2.Several rewards, no repeats
  3. 3.Additive vs multiplicative upgrades
  4. 4.Risk-reward upgrades

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 model

Additive

40

next pick: +10%

Multiplicative

49.8

next pick: +20%

  • Additive
  • Multiplicative
020406080100120012345678910picks taken0 picks, additive: 200 picks, multiplicative: 201 picks, additive: 241 picks, multiplicative: 242 picks, additive: 282 picks, multiplicative: 28.83 picks, additive: 323 picks, multiplicative: 34.64 picks, additive: 364 picks, multiplicative: 41.55 picks, additive: 405 picks, multiplicative: 49.86 picks, additive: 446 picks, multiplicative: 59.77 picks, additive: 487 picks, multiplicative: 71.78 picks, additive: 528 picks, multiplicative: 869 picks, additive: 569 picks, multiplicative: 103.210 picks, additive: 6010 picks, multiplicative: 123.812460

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%

PicksAdditiveMultiplicative
02020
12424
22828.8
33234.56
43641.47
54049.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.

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

GDScript
func damage_multiplicative(base: float, flat: float, percents: Array[float]) -> float:
var damage := base + flat
for p in percents:
damage *= 1.0 + p
return damage

Two pots: the additive pot first, then each multiplier on top.

GDScript
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 damage

Percentages 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

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.

upgradesstatsgame designroguelikegodot

Stop reading. Start building.

Build a roguelike in Godot from the first lesson. The first quest, the player controller, is free from start to finish. Later quests in the same game add combat, enemies, rooms, loot and upgrades.

Free, and no card needed. Built by a real person, with new quests every month.

Get the next Godot build in your inbox

New quests, project breakdowns, and game-dev tips.

You'll get emails from CodingQuests with Godot tips, new tutorials, course updates, and occasional offers. Unsubscribe anytime. Privacy Policy

Written by Omar

We teach Godot 4 by making you build complete systems: inventories, save systems, action roguelike controllers, enemy AI. The scrolls are free. The quests are where it sticks.