Why your level-ups feel random: pick one of three, rarity and three more roguelike upgrade tricks
Five tricks for a roguelike upgrade system, shown side by side: pick one of three, rarity weights, synergies, reroll and banish, and no dead picks. With a copyable Claude Code skill.

What we asked“Make a web page that demonstrates the roguelike upgrade system tricks (pick one of three, rarity, synergy, reroll and banish, no dead picks) one at a time, so anyone can see and feel each one within a few seconds. For each one, show the same short moment side by side: without it on the left, with it on the right, playing in a loop, with a caption that says what just happened and a replay button. Where it helps, let me play the moment myself. It will sit inside a blog post about 720 pixels wide, so it has to look good at that width and on a phone. Also make each one viewable alone with ?trick=<id>&solo, using these ids: pick-three, rarity-weights, synergy, reroll-banish, no-dead-picks. Show a level-up screen with cards the player can click, and on the left side draw upgrades uniformly at random from the whole pool. Use the internet freely for better results: free CC0 art, fonts or small libraries (for example Kenney's CC0 assets) are welcome; download anything you use into this folder so the page works without outside links, and list each item with its licence and source in CREDITS.md.”
What happened
- Loaded the upgrades skill
- Downloaded Kenney's CC0 1-Bit icon pack for the upgrade icons
- Wrote the upgrade engine once, shared by the page and a simulation script
- Built five tabs, one trick at a time, each with a without and a with panel playing the same moment, a caption for each panel and a Replay button
- Added Play it, which turns both panels into a level-up screen you can click
- Kept the left side drawing upgrades uniformly at random from the whole pool
In a roguelike, the level-up screen is the decision the player makes most often. If it hands out something random, or offers three cards that don’t fit, every level-up feels like a coin toss. Five tricks turn it into a real choice. Each demo below plays the same level-up twice: on the left, upgrades are drawn uniformly at random from the whole pool; on the right, one trick is on. The caption under each panel says what just happened. Play it turns both panels into level-up screens you can click yourself.
1. Pick one of three
Offer three different upgrades and let the player skip. Each card shows its icon, its rarity and the exact change, like “Fire rate +15%” or “Lv 2 → 3”, so the player compares numbers, not names. Slay the Spire lets you choose one of three cards after a fight, or skip the reward (Slay the Spire Wiki), and most of the genre uses that shape. In our demo, the left side just gives you Quickdraw, which does nothing for your fire build. The right side offers Quickdraw, Fire Bolt and Haste, and you take Fire Bolt.
2. Rarity weights, with a pity rule
Roll each card’s rarity from weights, so rare cards are rare. Slay the Spire’s normal fights use common 60%, uncommon 37%, rare 3%, and every common card rolled raises the rare chance by 1 point until a rare shows up and resets it (Slay the Spire Wiki). That rule is often called “pity”: bad luck can’t go on forever. Color the cards by rarity so a rare is an event. In our demo, drawn uniformly, rares are 4 of the 19 upgrades, so one showed up in 4 of 8 level-ups and none felt special. On the right, the rare chance climbs from 3% to 14%, and a gold Chrono Glass finally appears on level-up 7.
3. Synergy
Tag every upgrade (fire, orbit, crit, speed), and make upgrades that share a tag with what the player owns twice as likely. Then add a few combo upgrades that only appear once the player owns both halves. Hades does this with Duo boons, which need boons from two different gods (Hades Wiki). Mark synergies on the card so the player sees why it’s there. In our demo, only 2 of 6 cards on the left fit the fire and orbit build. On the right, 5 of 6 do, and owning Fire Bolt and Orbit Blades unlocks the Inferno Orbit combo.
4. Reroll and banish
Give a way out of a bad offer. A reroll draws three new cards. A banish removes one upgrade from the pool for the rest of the run, so it never shows up again. Vampire Survivors has both (Reroll, Banish, Vampire Survivors Wiki). About two of each per run is a good start; they should feel precious. In our demo, nothing fits on either side. The left is stuck. The right banishes Haste (the pool goes from 19 to 18), rerolls, and finds Wildfire for the fire build.
5. No dead picks
Before you offer anything, drop what can’t help right now: upgrades that are already maxed, upgrades for weapons the player doesn’t have, anything missing its requirement. Hades’ Legendary boons work this way: they’re only offered once you have the boons they need (Hades Wiki). If fewer than three are left, fill the gap with something always useful, like healing or gold. In our demo, late in a run, all three cards on the left do nothing. On the right, 17 useless upgrades are dropped first, and a heal fills the last slot. In the session’s simulation of 1,000 runs with random picks, 44% of plain three-card offers held at least one dead card; with this filter, none did.
Don’t overdo it
Each trick makes the choice better, and each one can also take the choice away:
- Too much synergy and every offer is the same three cards. Doubling the weight is enough; the player should still see something new.
- Too many rerolls and the player just rerolls until the perfect card appears. Two per run makes each one a decision.
- Keep rares rare. The pity rule is there for bad luck, not to hand out a rare every few level-ups.
Weights and pity rules are a kind of planned luck. For more on that, see fair randomness in games.
Add it to your game
- Copy the skill at the end of this page into your project.
- Ask your agent: “My level-ups feel random. Make the upgrade choices interesting.”
- Play it, then tune in plain words: “Rare cards show up too often.”
Art in the demos: 1-Bit Pack by Kenney (CC0). Font: Pixelify Sans by Stefie Justprince (SIL Open Font License 1.1).
The skill that made it work
This is the whole skill we gave Claude Code. Copy it into your project and ask your agent to make your level-ups interesting. Every trick sits behind its own switch, and the last step makes it simulate 1,000 runs and count dead picks.
- Find where the game hands out upgrades: level-ups, chests, shops, rewards after a fight. List each upgrade and what makes it useful.
- Put every trick behind one named switch in a single settings object, all on by default, so each can be compared with a plain random pick.
- pick-three. Offer three different upgrades, never two of the same, and let the player skip. Each card shows the name, an icon, its rarity and the exact change ("Fire rate +20%", "Level 2 to 3").
- rarity-weights. Roll each card's rarity from weights, for example common 60, uncommon 37, rare 3 (Slay the Spire's odds in normal fights), with better odds after elites and bosses. Add a pity rule: every common rolled raises the rare chance by 1 point, and a rare resets it. Color cards by rarity.
- synergy. Tag every upgrade (fire, crit, orbit, speed). Double the weight of upgrades that share a tag with ones the player owns, and add a few combo upgrades that only appear once both halves are owned, like Hades' Duo boons. Mark synergies on the card.
- reroll-banish. Give a few rerolls (redraw all three) and banishes (remove one upgrade from the pool for the rest of the run), as Vampire Survivors does. About 2 of each per run is a good start.
- no-dead-picks. Before offering, drop anything that can't help right now: maxed upgrades, upgrades for weapons the player doesn't have, anything missing its requirement. If fewer than three are left, fill with a fallback such as healing or gold.
- Measure it. Simulate 1,000 runs with random picks, tricks on and off. Report offers that contained a dead pick (should be 0) or a duplicate (0), the longest streak without a rare (should be capped by pity), and the share of picks that matched an owned tag (should rise with synergy on).
Save it as .claude/skills/upgrades/SKILL.md in your project. Or connect your agent and type /aigamedev: it loads this skill with its reference files and the results from this post.

