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.

Region assignment in the CS2 Regional Standings is determined by the nationalities of the active roster’s players — not by the organization’s home country, sponsorship region, or team name. The system identifies the most recent stable lineup, maps each player’s country to one of three regional groups, and assigns the team to the region where the plurality of players belong. A team can satisfy multiple regions simultaneously and will appear in all matching regional standings.

The three regions

The standings recognize three regions, each with an internal index:
IndexRegionCountry groups
0EuropeEU, MENA
1AmericasNA, SA
2AsiaAS, OC
Africa (AF) is a special case — it has no direct regional index and is handled as a lowest-priority group in the plurality calculation.
// util/region.js
var regionPriority = [ 3, 2, 1 ]; // [ Europe, Americas, Asia ]
Europe has the highest priority (3), Americas is second (2), and Asia is third (1). Priority is used to break ties: if two regions have the same number of players, the higher-priority region wins.

Determining the active roster

The active roster is built from the team’s most recent matches. The logic considers up to 10 matches and identifies players who appeared in at least 5 of those matches:
// team.js — setActiveRoster()
this.teamMatches.forEach( ( tm, idx ) => {
    if ( idx < 10 ) {
        // track each player's appearance count and most recent match
    }
} );

// include only players with >= 5 appearances
if ( recentPlayers[id].totalMatches >= 5 && rosterCount < 5 ) {
    activeRoster[rosterCount] = recentPlayers[id];
    rosterCount += 1;
}
Up to 5 players are included in the active roster, selected by recency of their most recent match appearance.

Plurality region assignment

setPluralityRegion() maps each active player’s nationality to a regional index, then picks the region with the most representatives:
// team.js — setPluralityRegion()
setPluralityRegion() {
    let players = this.activeRoster;
    let teamCountries = players.map( el => el.countryIso );
    let regionAssignment = [0, 0, 0]; // EU, AMER, ASIA
    let lowPriorityRepresentation = 0;

    teamCountries.forEach( el => {
        if ( el !== 'world' ) {
            if ( Region.getCountryRegion(el) > -1 )
                regionAssignment[ Region.getCountryRegion(el) ] += 1;
            else
                lowPriorityRepresentation += 1;
        }
    });

    // assign low-priority players (e.g. AF) to the lowest-represented region
    let lowestPriorityRepresented = 1;
    if ( lowPriorityRepresentation < players.length )
        lowestPriorityRepresented = Math.min(
            ...regionAssignment.map( (el, idx) => el > 0 ? Region.getRegionPriority(idx) : Infinity )
        );
    regionAssignment[ Region.getRegionIdxFromPriority( lowestPriorityRepresented ) ] += lowPriorityRepresentation;

    // pick the region(s) with the highest count, break ties by priority
    let maxRegionalRepresentation = Math.max( ...regionAssignment );
    let region = regionAssignment.map( (el, idx) => el === maxRegionalRepresentation ? Region.getRegionPriority(idx) : 0 );
    region = region.map( el => el === Math.max( ...region ) ? 1 : 0 );

    this.region = region;
}
The result stored in team.region is a three-element binary array, for example:
ValueMeaning
[1, 0, 0]Team assigned to Europe only
[0, 1, 0]Team assigned to Americas only
[0, 0, 1]Team assigned to Asia only

Country-to-region mapping

getCountryRegion() in region.js maps ISO country codes to regional indices:
// util/region.js
function getCountryRegion( playerCountry ) {
    let record = regionMap.filter(
        el => el.countrycode.toLowerCase() === playerCountry.toLowerCase()
    )[0];
    let region = record.region;

    if ( region === 'EU' || region === 'MENA' ) return 0;  // Europe
    if ( region === 'NA' || region === 'SA'   ) return 1;  // Americas
    if ( region === 'AF'                      ) return -1; // low priority
    return 2;                                               // AS, OC → Asia
}
Notable groupings:
  • Europe (0): All EU countries plus MENA (Middle East and North Africa) — including eg, sa, ae, tr, il, and others.
  • Americas (1): NA (North America and Caribbean) plus SA (South America).
  • Asia (2): AS (continental Asia) plus OC (Oceania including au, nz).
  • Low priority (-1): AF (sub-Saharan Africa). These players are assigned to whichever region already has the fewest representatives on the roster.

Regional standings eligibility

The applyRanking() function in ranking.js iterates all three region indices and assigns a regional rank to any team that has region[r] === 1:
// ranking.js — applyRanking()
regions.forEach( r => {
    let regionalRank = 0;
    teams.forEach( t => {
        if ( t.satisfiesRankingCriteria === true && t.region[r] === 1 ) {
            regionalRank += 1;
            t.regionalRank[r] = regionalRank;
        }
    });
});
A team also needs at least 5 matches played (matchesPlayed >= 5) to satisfiesRankingCriteria and appear in any ranking.
A team whose active roster spans multiple regions — for example, if players are split evenly between EU and Americas — will have region = [1, 1, 0] after tie-breaking by priority. Such a team appears in both the European and Americas regional standings with independent regional rank numbers.

Build docs developers (and LLMs) love