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:
| Tier | Corruption | You take | You deal |
|---|---|---|---|
| Stable | 0 to 24 | ×1.00 | ×1.00 |
| Tainted | 25 to 49 | ×1.06 | ×1.05 |
| Corrupted | 50 to 74 | ×1.18 | ×1.12 |
| Overloaded | 75 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 modelCorruption
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
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:
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:
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.0func _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.0In 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
- CodingQuests course code: 2D Roguelike Loot & Corruption lessons 4 and 5 (upgrade costs, Corruption tiers, Glass Blade), read on 31 October 2026
- Supergiant Games, Hades: the Welcome to Hell update notes (Pact of Punishment and Heat)
- Design discussions of the same question: Cursed items on item-based RLs? on the Roguelike Temple forums and How to handle cursed items? on BGDF. We found little public developer discussion of this topic, so it is our own pick from the backlog.
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.

