Maintaining Drop Picker Rosters Across Six Battle Royales
The gaming randomizers on BoltQuickTools cover Fortnite, Warzone, PUBG, Apex Legends, Marvel Rivals, CS2, Dota 2, League of Legends, Deep Rock Galactic, Elden Ring, and Helldivers 2. People sometimes ask whether I pull data from an API. I do not. Every roster is hand-maintained, and there is a real reason for that.
This post is a behind-the-scenes look at how I keep these tools accurate, what the fair-pick algorithm actually does, and the small mistakes that took me months to notice. If you have ever wondered why your fortnite picker stopped having Tilted Towers, this is the answer.
Why I do not use third-party APIs
The naive plan, when I started, was to call community-maintained APIs like Fortnite-API or PUBG's official endpoints and let the picker stay current automatically. I built a prototype that did exactly that for the Fortnite drop picker. It worked for two weeks, then broke when the API maintainer's rate limit changed, then broke again when the response schema changed, then died when the upstream service went down for a long weekend. Tools that depend on third-party APIs are tools that fail when those APIs fail.
The other problem is that "current POIs" is fuzzier than it sounds. The official map includes named landmarks that nobody actually drops at, and excludes loot spots that the community has named informally. A roster that mirrors the official data feed is technically correct and practically wrong. I want the picker to reflect how people actually play, which means a human has to maintain the list.
The patch-day workflow
When Epic ships a Fortnite chapter update, here is what happens on my end:
- I watch the patch trailer the day it drops. Patch trailers are the only marketing material that actually tells you which POIs are new, renamed, or removed.
- I cross-check community wikis and the official patch notes for missed locations.
- I play three or four games in the new chapter to verify which POIs are hot, medium, and quiet. The tier list cannot be derived from the patch notes; it has to come from real lobbies.
- I update the roster JSON inside
fortnite-drop-picker.html, push to the static site, and bump the cache-bust.
The whole loop is usually under two hours, and I do it within the first 24 hours of a major patch. Smaller balance patches that do not move POIs do not need an update. Mid-chapter map shifts (Epic loves these) do.
The fair-pick algorithm, demystified
Every randomizer on the site uses the same fair-pick algorithm, with per-tool tuning. Here is what it actually does, in plain English:
If you do a pure uniform random pick from a list of N items, you will see clusters. Roll a fair 10-sided die 30 times and you will hit the same number three times in a row at least once, more often than feels intuitive. For a drop picker, that means three matches in a row at the same POI. The fairness algorithm reduces those clusters.
The implementation is a weighted random where each item starts at weight 1. After an item is rolled, its weight drops to ~0.3 for the next roll, then recovers along a curve. Items that have not been rolled this session have weights above 1. The result is closer to a shuffled deck than a fair coin.
// roughly what the picker does, simplified
function pickWithFairness(items, history) {
const weights = items.map(item => {
const lastSeen = history.lastIndexOf(item);
if (lastSeen === -1) return 1.5; // never picked this session
const recency = history.length - lastSeen;
return Math.min(1.5, 0.3 + recency * 0.15);
});
return weightedRandom(items, weights);
}
The session counters at the bottom of each picker tool reflect this state. If you keep rolling without resetting, you will see the variance flatten out over twenty or so picks. If you reset with C, all weights return to 1 and the next roll is purely uniform.
Mistakes I made early on
Trademark text in metadata
The first version of the Fortnite picker had "Fortnite" in the page title without a disclaimer. Epic does not chase down fan tools at the level of small static sites, but I do not want to be the test case. Every gaming tool page now carries an explicit "this is a fan-made utility and is not affiliated with [publisher]" line in the SEO content. The trademark belongs to the publisher; I just make a randomizer for it.
Hard-coded "current chapter" labels
My first patch update missed a label that said "Chapter 4 Season 2" hard-coded in the heading. The tool kept working, but the label was wrong for months until a reader emailed me. Lesson: anything that references the current season has to live in one place in the file so I can update it with a single find-and-replace.
Treating all maps as one roster
The Warzone picker originally rolled across all four maps as one list, which meant you could roll a Verdansk POI in a Rebirth match. That was useless. I now have separate rosters per map and only roll within the active map tab. Small change, big usability fix.
How the rosters break down today
- Fortnite: ~25 POIs in the current chapter, split into Hot, Medium, and Quiet tiers based on lobby behavior.
- Warzone: ~50 POIs total across Verdansk, Urzikstan, Rebirth, and Fortune's Keep.
- PUBG: ~70 POIs across seven maps. The largest roster on the site.
- Apex Legends: every legend organized by class.
- Marvel Rivals: full hero roster split by Vanguard / Duelist / Strategist.
- CS2 weapons: every purchasable weapon, split by category.
- Dota 2: full hero roster split by primary attribute.
- League: champions sorted by primary role.
- Elden Ring: weapons, classes, and an estus rule, for build-randomizer runs.
- Helldivers 2: stratagems and primary/secondary/throwable.
- Deep Rock Galactic: full per-class weapon list.
What I will not add
People ask about Valorant, Rainbow Six Siege, and Overwatch 2 fairly often. I have not added them because the meta is volatile enough that maintaining accurate rosters would consume more time than I want to spend. If a game gets enough requests and the meta is stable, I will revisit. Otherwise, the existing randomizers are the lineup.
If you find a stale roster
This is the most useful thing readers can do for me: if you spot a missing or renamed location after a patch and I have not updated it yet, email [email protected]. I usually fix it within the same evening. The accuracy of these tools depends entirely on the community sending corrections faster than I can play the patches.