Skip to main content

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.

Before head-to-head match results are applied, every team receives a seeded starting rank value between 400 and 2000. This seed is derived from four performance factors that capture a team’s historical achievements — prize winnings, quality of opponents beaten, breadth of opponents beaten, and LAN performance. Seeding ensures that teams enter the Glicko rating phase with a rank that reflects their real-world standing, even before any head-to-head adjustments are made.

Seeding factors

Four factors feed into the seed calculation. Each is a normalized value between 0 and 1, computed from the team’s match history. The ownNetwork factor exists in the codebase but currently carries a coefficient of 0, so it has no effect on the seed.
// ranking.js
const SEED_MODIFIER_FACTORS = {
    bountyCollected: 1,
    bountyOffered:   1,
    opponentNetwork: 1,
    ownNetwork:      0,   // currently unused
    lanFactor:       1
};
FactorCoefficientWhat it measures
bountyCollected1Quality of opponents beaten (weighted by their prize winnings)
bountyOffered1The team’s own prize winnings
opponentNetwork1Breadth of quality opponents beaten
ownNetwork0Number of distinct opponents defeated (unused)
lanFactor1LAN event wins
See the scoring factors page for how each factor is computed in detail.

Seed value formula

The seed value for a team is the weighted average of its active factors:
// ranking.js — calculateSeedModifierValue()
function calculateSeedModifierValue( modifiers ) {
    let sumCoeff = 0;
    let scaledMods = 0;
    for( let factor in SEED_MODIFIER_FACTORS ) {
        sumCoeff   += SEED_MODIFIER_FACTORS[factor];
        scaledMods += SEED_MODIFIER_FACTORS[factor] * modifiers[factor];
    }
    sumCoeff = sumCoeff === 0 ? 1 : sumCoeff;
    return scaledMods / sumCoeff;
}
With the current coefficients (three active factors each with weight 1), the seed value is:
seedValue = (bountyCollected + bountyOffered + opponentNetwork) / 3

Mapping seed values to rank range

Once every team’s raw seed value is computed, the values are linearly remapped from the observed minimum–maximum range into the fixed rank window of 400–2000:
// ranking.js
const MIN_SEEDED_RANK = 400;
const MAX_SEEDED_RANK = 2000;

// For each team:
team.rankValue = remapValueClamped(
    team.seedValue,
    minSeedValue,   // lowest raw seed across all teams
    maxSeedValue,   // highest raw seed across all teams
    MIN_SEEDED_RANK,
    MAX_SEEDED_RANK
);
This is equivalent to:
rankValue = 400 + ((seedValue - min) / (max - min)) × 1600
The team with the highest combined factor score is assigned rank 2000; the team with the lowest is assigned rank 400. All other teams land proportionally between those bounds.

Seeding in context

1

Calculate per-team factors

For each team, compute bountyCollected, bountyOffered, opponentNetwork, ownNetwork, and lanFactor from match history. Each factor is normalized to [0, 1].
2

Compute weighted seed value

Apply SEED_MODIFIER_FACTORS coefficients to get a single scalar seed value per team.
3

Remap to rank range

Linearly scale all seed values into the [400, 2000] window. This seeded rank becomes the team’s starting point in the Glicko rating phase.
4

Run head-to-head matches

The Glicko algorithm processes matches in chronological order, adjusting each team’s rank up or down from its seeded starting value.
Only the top 10 results are counted for each factor (controlled by bucketSize = 10 in team.js). This means playing in low-stakes or low-quality matches never hurts a team’s seed — at worst, a weak result simply doesn’t displace one of the top 10.

Build docs developers (and LLMs) love