Before the Glicko rating phase runs, four factors are computed for each team and combined into a single seed value. These factors are derived from the team’s match history: which events they participated in, how much prize money they won, who they beat, and whether those matches were played on LAN. Each factor is normalized to a value between 0 and 1 before being combined. All four use the same bucket mechanism — only the top 10 results contribute — to limit the impact of any single outlier result.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/ValveSoftware/counter-strike_regional_standings/llms.txt
Use this file to discover all available pages before exploring further.
Shared mechanics
Two design decisions apply across all four factors: Top-N bucket: Only the best 10 results count toward each factor (bucketSize = 10 in team.js). Results are ranked by their scaled value before slicing.
Age weighting: Each result is multiplied by a timestampModifier from RankingContext.getTimestampModifier(), which linearly remaps match timestamps into [0, 1] based on a configured time window. Recent matches score closer to 1; older matches score closer to 0.
Outlier normalization: Each raw factor total is divided by the 5th-highest value across all teams (rankingContext.setOutlierCount(5)), then clamped to 1. This prevents a single dominant team from compressing everyone else toward zero.
Bounty offered
bountyOffered measures the team’s own prize winnings — how much money the team has earned by finishing in the money at events.
Calculation:
- For each event where the team earned prize money, compute
scaledWinnings = baseWinnings × ageWeight. - Sort all scaled winnings descending and take the top 10.
- Sum those top-10 values.
- Divide by
referenceWinnings(the 5th-highest sum across all rosters) and clamp to 1. - Apply the curve function.
x = 1 (as good as the reference team) the curve returns 1. For x significantly below 1, log10(x) becomes negative and large in magnitude, pulling the output toward 0.
Bounty collected
bountyCollected measures the quality of opponents a team has beaten, weighted by those opponents’ own prize winnings. Beating a team with high bountyOffered is worth more than beating an unknown team.
Calculation:
- For each won match, score it as:
opponent.bountyOffered × ageWeight × stakesModifier. stakesModifier = curveFunction(prizePool / 1,000,000)— events with higher prize pools carry more weight, capped at $1M.- Sort all won-match scores descending, take the top 10.
- Sum the top 10, divide by
bucketSize(10) to get an average. - Apply the curve function.
Opponent network
opponentNetwork measures the breadth of quality opponents a team has defeated. It uses the same pipeline as bountyCollected, but substitutes opponent.ownNetwork in place of opponent.bountyOffered.
ownNetwork for each opponent is:
distinctTeamsDefeated counts only the most recent win against each unique opponent, each scaled by how recently it occurred.
opponentNetwork uses powerFunction (identity) rather than curveFunction, so it is not compressed the way bounty factors are.
LAN wins
lanFactor rewards winning matches played on LAN, weighted by how recently they occurred.
Calculation:
- For each won match, score it as
isLAN × ageWeight(1 if LAN, 0 if online). - Sort descending and take the top 10.
- Sum the top 10, divide by
bucketSize(10) to get a proportion. - Normalize against
referenceLanWins(the 5th-highest LAN score across all teams) and clamp to 1.
Factor summary
| Factor | Source data | Curve applied | Coefficient in seed |
|---|---|---|---|
bountyOffered | Team’s own prize winnings | Yes (curveFunction) | 1 |
bountyCollected | Opponents’ bountyOffered, weighted by stakes | Yes (curveFunction) | 1 |
opponentNetwork | Opponents’ ownNetwork, weighted by stakes | No (powerFunction) | 1 |
ownNetwork | Distinct opponents defeated | No (powerFunction) | 0 (unused) |
lanFactor | LAN wins | No (powerFunction) | 1 |
Every factor uses a top-10 bucket, so participating in more events can only help. A weak result in a low-stakes match will not displace a stronger earlier result because results are sorted before the bucket is applied.