Skip to main content
Coding Quests
The Scroll Library
Visual Explainers

How Risk-Reward Upgrades Change a Run

October 31, 20268 min read
Part 4 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

The card says "+25% damage, but take +15% damage". Most players take it, because more damage feels like winning. Some regret it two rooms later. A risk-reward upgrade is a bargain: power now, a cost that shows up later. A good one makes the player think before taking it, and plays out differently depending on what else they own.

This is the last part of a series on loot and upgrades. It uses the Corruption system from the 2D roguelike course, with the course's real numbers, and replays one fight to see what the bargain actually costs.

The course's bargain: Corruption

In the 2D roguelike course, every upgrade costs Corruption, a number from 0 to 100. Sharpened Edge, +8 damage, costs 5. Bulwark, +25 maximum health, costs 8. The cursed Glass Blade, deal ×1.25 damage but take ×1.15, costs 15.

Corruption works in tiers, and each tier changes two multipliers at once:

TierCorruptionYou takeYou deal
Stable0 to 24×1.00×1.00
Tainted25 to 49×1.06×1.05
Corrupted50 to 74×1.18×1.12
Overloaded75 to 100×1.40×1.22

Notice that from Corrupted up, damage taken grows faster than damage dealt. Every tier is a slightly worse trade than the last. That is the risk.

One fight, replayed

Stats on a card do not tell you what a bargain costs. Fights do. So here is one fight, replayed for any build:

  • You have 100 health and swing a 20-damage slash twice a second, as in the course.
  • A wave with 400 health in total chips you for 4 damage a second while any of it is alive.
  • Then a boss slams once, for 50. You cannot dodge it.

The fight is this article's model, not the course's game, so treat the numbers as a teaching example. The upgrades, their Corruption costs and the tiers are the course's own.

One fight, replayed for your build

Interactive model
3Sharpened Edge (+8 damage, 5 Corruption)
0Glass Blade (deal ×1.25, take ×1.15, 15 Corruption)
0Bulwark (+25 max HP, 8 Corruption)

Corruption

15

Stable: take ×1.00, deal ×1.00

Wave cleared in

4.5s

chip damage 18.2 (start: 40.0)

Health left

31.8

slam hits for 50.0 of your 100

TaintedCorruptedOverloaded00 Sharpened Edge: 10.0 health left, Corruption 01 Sharpened Edge: 21.4 health left, Corruption 52 Sharpened Edge: 27.8 health left, Corruption 103 Sharpened Edge: 31.8 health left, Corruption 154 Sharpened Edge: 34.6 health left, Corruption 205 Sharpened Edge: 33.5 health left, Corruption 256 Sharpened Edge: 35.1 health left, Corruption 307 Sharpened Edge: 36.4 health left, Corruption 358 Sharpened Edge: 37.4 health left, Corruption 409 Sharpened Edge: 38.2 health left, Corruption 4510 Sharpened Edge: 32.6 health left, Corruption 5011 Sharpened Edge: 33.2 health left, Corruption 5512 Sharpened Edge: 33.7 health left, Corruption 6013 Sharpened Edge: 34.2 health left, Corruption 6514 Sharpened Edge: 34.6 health left, Corruption 7015 Sharpened Edge: 23.4 health left, Corruption 7516 Sharpened Edge: 23.8 health left, Corruption 8017 Sharpened Edge: 24.1 health left, Corruption 8518 Sharpened Edge: 24.4 health left, Corruption 9019 Sharpened Edge: 24.7 health left, Corruption 9520 Sharpened Edge: 24.9 health left, Corruption 10005101520Sharpened Edges taken

The fight is a model, not the course's game: a wave with 400 health that chips you for 4 damage a second while it lives, then one boss slam of 50. You swing a 20-damage slash 2 times a second with 100 health. The upgrades, Corruption costs and tier multipliers are the course's real numbers. The chart holds your Glass Blades and Bulwarks fixed and asks one question: what if you kept taking Sharpened Edge?

A simplified model of the idea, for seeing how it behaves. It is not engine code.

What the replays show

More power, less chip damage. With no upgrades the wave takes 10 seconds to clear, chips you for 40, and the slam leaves you on 10 health. Four Sharpened Edges cut the wave to under 4 seconds and the chip to about 15. You finish on 34.6.

The fifth pick makes you worse. A fifth Sharpened Edge takes Corruption from 20 to 25: Tainted. The wave dies faster still, but the slam now hits for 53. You finish on 33.5, lower than with four. One more upgrade, one worse result, because of where the threshold sits.

The tiers shape the whole curve. Keep adding Sharpened Edges and health left climbs, dips at each new tier, and climbs again. The best result in this fight is 9 picks, at Corruption 45, finishing on 38.2. The fifteenth pick crosses into Overloaded. The slam jumps to 70, and you drop to 23.4.

Glass Blade is a trap on a small base. On a fresh character, one Glass Blade leaves you on 5.7 health, worse than taking nothing. Two kill you. Its ×1.25 multiplies a small number, your 20-damage slash, while its ×1.15 multiplies the whole slam. Multipliers scale with what they multiply, which is the lesson of part 3.

Bulwark is the answer the design offers. It costs only 8 Corruption and adds 25 health. One Bulwark alone takes you from 10 to 35. Fifteen Sharpened Edges plus one Bulwark finish on 48.4, against 23.4 without it. The risky build works when the player pays for safety on the side, which is a real decision.

What makes a bargain good

The downside lands where the upside cannot reach. In this fight, more damage pays for "take more damage" during the wave and not at all for the slam. If every encounter were pure chip damage, Corruption would nearly always pay for itself, and it would stop being a choice.

Thresholds create moments. A smooth cost is easy to ignore. A tier boundary makes the player stop and count: "one more, or stay Stable?" The course's tiers do this, and the floating "Tainted" text when you cross one makes sure you notice.

The cost is visible. Hidden downsides feel like bugs. Show the number, the tier and the multiplier on the screen, before the choice.

There is a way to manage it. Bulwark here. A cleansing item, a shop, or a later upgrade that rewards high Corruption also count. A downside with no answer is just a penalty.

The upside changes with the build. Glass Blade is bad on a weak slash and better on a strong one. Bargains that depend on the rest of the build make runs play differently.

Hades takes the opt-in version of this idea. Its Pact of Punishment lets players add difficulty, called Heat, in return for rewards, and Supergiant's update notes tie the bounties to Heat thresholds.

Where risk-reward designs go wrong

  • Strictly better or strictly worse. If the bargain always pays, everyone takes it. If it never pays, nobody does. Test it in several encounters, not one.
  • Testing on averages. Average damage per second hides the spikes. In this fight, the risk lives almost entirely in one slam.
  • Stacking downsides silently. Glass Blade's ×1.15 multiplies with Corruption's ×1.40. Two "small" costs make ×1.61. Show the combined number.
  • No tells. If the player cannot see a slam coming, a bigger slam just feels unfair. Readable attacks make risk feel like a choice. The attack telegraphs lab shows why.

In Godot: the Corruption tiers

This is the course's own code from Player.gd, run as written. clampf() keeps Corruption between 0 and the maximum:

GDScript
func add_corruption(amount: float) -> void:
corruption = clampf(corruption + amount, 0.0, max_corruption)
​
func get_corruption_tier() -> String:
if corruption < 25.0:
return "Stable"
elif corruption < 50.0:
return "Tainted"
elif corruption < 75.0:
return "Corrupted"
return "Overloaded"

Two functions turn the tier into multipliers, one for each side of the bargain:

GDScript
func _corruption_taken_mult() -> float:
if corruption >= 75.0:
return 1.4
elif corruption >= 50.0:
return 1.18
elif corruption >= 25.0:
return 1.06
return 1.0
​
func _corruption_damage_mult() -> float:
if corruption >= 75.0:
return 1.22
elif corruption >= 50.0:
return 1.12
elif corruption >= 25.0:
return 1.05
return 1.0

In the course, the damage multiplier goes into the weapon's hitbox and the taken multiplier into the player's hurtbox, so every hit uses the current tier. To try your own balance, change the thresholds and multipliers here, then replay a fight that has both chip damage and one big hit.

Build it next

2D Roguelike: Loot & Corruption

A quest on CodingQuests: 8 interactive lessons that build one part of a game in Godot, in your browser, checked as you go.

The 2D Roguelike's Loot & Corruption quest builds this whole system into a real game. Lesson 3, free, turns an upgrade into data. Lesson 5 adds Corruption, its tiers, the damage-taken multiplier on the hurtbox, and the cursed Glass Blade. Lesson 8 adds the feedback when you cross a tier.

Lessons 5 and 8 are member lessons. The fight on this page is our own model. The course's game has real enemies, so its numbers will differ.

  • Lesson 3: An Upgrade Is DataFree
  • Lesson 5: Corruption: Power and RiskMembers
  • Lesson 8: The BargainMembers

Lessons 1 to 3 are free to open, no account needed. Guild Hall, the membership, opens the other 5.

FAQ

How do you design a risk-reward upgrade?

Give it an upside and a downside that hit different things, such as more damage dealt but more damage taken. Make the cost visible, add thresholds so the choice is felt, and give players a way to manage the risk. Then test it in real encounters with both steady damage and big hits.

Why can a stronger upgrade make my character worse?

Because the downside can outgrow the upside. In tiered systems, crossing a threshold raises every cost at once, so one more upgrade can lose more than it gains. A damage bonus also cannot reduce one unavoidable big hit, while a damage-taken penalty makes it bigger.

What is the difference between a cursed item and a risk-reward upgrade?

A cursed item is usually a pure penalty, or a trap you discover later. A risk-reward upgrade shows its cost up front and pays you for taking it. Players choose it on purpose, which makes the risk a decision instead of a punishment.

Sources and testing

How this was tested. The Corruption functions are the course's own GDScript, run in Godot 4.7.2 (headless, on Windows) on 31 October 2026 at Corruption 0, 24, 25, 49, 50, 74, 75 and 120, which clamped to 100. The fight is a simplified model written for this article: wave health, chip rate, slam damage and attack speed are its assumptions, not measurements from a game. Every number in "What the replays show" comes from that model.

upgradesgame designroguelikebalancegodot

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.