From 4737a8cc5f16e5905d9b4ba9ca8f437dcd7ef773 Mon Sep 17 00:00:00 2001 From: Josh Harris Date: Tue, 4 Aug 2026 13:28:34 +0100 Subject: [PATCH 1/2] feat(ranked): explain clan/friend pairing on the ranked mode screen Players had no way to know that queuing with a clanmate or friend is meant to put them on the same team, or why it sometimes doesn't. Add a note under the mode cards covering the pairing precedence and the rating gap past which a pair is split. Worded for team modes generally rather than 2v2 specifically, so it still reads correctly as more team gamemodes are added. The ELO threshold is interpolated from a constant mirroring MAX_GROUPED_ELO_DIFF in the matchmaking API, so retuning it is a one-line change on each side. Co-Authored-By: Claude Opus 5 (1M context) --- resources/lang/en.json | 1 + src/client/components/RankedModal.ts | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/resources/lang/en.json b/resources/lang/en.json index c4a63d43ab..c53eb0d0d9 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -1172,6 +1172,7 @@ "coming_soon": "Coming Soon", "ranked_1v1_title": "1v1", "ranked_2v2_title": "2v2", + "ranked_pairing_note": "In team modes, clanmates and friends in the queue are placed on the same team where possible. Friends are paired first, then clanmates. If your ratings differ by more than {maxEloDiff} ELO you'll be matched separately to keep games fair.", "ranked_title": "Ranked", "teams_count": "{teamCount} teams", "teams_of": "{teamCount} teams of {playersPerTeam}", diff --git a/src/client/components/RankedModal.ts b/src/client/components/RankedModal.ts index d377546fe9..076fc3c3c2 100644 --- a/src/client/components/RankedModal.ts +++ b/src/client/components/RankedModal.ts @@ -8,6 +8,11 @@ import { translateText } from "../Utils"; import { BaseModal } from "./BaseModal"; import { modalHeader } from "./ui/ModalHeader"; +// Mirrors MAX_GROUPED_ELO_DIFF in the matchmaking API: past this rating gap a +// queued clan/friend pair is split and both players are matched on their own. +// The API owns the real value — keep the two in step when tuning it. +const MAX_GROUPED_ELO_DIFF = 500; + @customElement("ranked-modal") export class RankedModal extends BaseModal { protected routerName = "ranked"; @@ -134,6 +139,11 @@ export class RankedModal extends BaseModal { "", )} +

+ ${translateText("mode_selector.ranked_pairing_note", { + maxEloDiff: MAX_GROUPED_ELO_DIFF, + })} +

`; } From f1eb6732f352d75edb87c22ae7a9db5918678a25 Mon Sep 17 00:00:00 2001 From: Josh Harris Date: Tue, 4 Aug 2026 15:15:08 +0100 Subject: [PATCH 2/2] refactor(ranked): drop the ELO figure from the pairing note MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The threshold lives in the matchmaking API, which is a separate repo, so the client had no way to import it and carried its own literal instead. That literal would silently go stale the moment the matchmaker is retuned, leaving the note telling players a number that is no longer the rule — and the repo already has a convention against hardcoding API-owned values on the client. Describe the behaviour qualitatively instead. The note stays correct whatever the threshold is, and the value keeps a single home in the API. Co-Authored-By: Claude Opus 5 (1M context) --- resources/lang/en.json | 2 +- src/client/components/RankedModal.ts | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/resources/lang/en.json b/resources/lang/en.json index c53eb0d0d9..507571da02 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -1172,7 +1172,7 @@ "coming_soon": "Coming Soon", "ranked_1v1_title": "1v1", "ranked_2v2_title": "2v2", - "ranked_pairing_note": "In team modes, clanmates and friends in the queue are placed on the same team where possible. Friends are paired first, then clanmates. If your ratings differ by more than {maxEloDiff} ELO you'll be matched separately to keep games fair.", + "ranked_pairing_note": "In team modes, clanmates and friends in the queue are placed on the same team where possible. Friends are paired first, then clanmates. If your ratings are too far apart you'll be matched separately to keep games fair.", "ranked_title": "Ranked", "teams_count": "{teamCount} teams", "teams_of": "{teamCount} teams of {playersPerTeam}", diff --git a/src/client/components/RankedModal.ts b/src/client/components/RankedModal.ts index 076fc3c3c2..c69764bf04 100644 --- a/src/client/components/RankedModal.ts +++ b/src/client/components/RankedModal.ts @@ -8,11 +8,6 @@ import { translateText } from "../Utils"; import { BaseModal } from "./BaseModal"; import { modalHeader } from "./ui/ModalHeader"; -// Mirrors MAX_GROUPED_ELO_DIFF in the matchmaking API: past this rating gap a -// queued clan/friend pair is split and both players are matched on their own. -// The API owns the real value — keep the two in step when tuning it. -const MAX_GROUPED_ELO_DIFF = 500; - @customElement("ranked-modal") export class RankedModal extends BaseModal { protected routerName = "ranked"; @@ -140,9 +135,7 @@ export class RankedModal extends BaseModal { )}

- ${translateText("mode_selector.ranked_pairing_note", { - maxEloDiff: MAX_GROUPED_ELO_DIFF, - })} + ${translateText("mode_selector.ranked_pairing_note")}

`;