From ad2928e084a3eccb430358cd80444cb4bfeb5831 Mon Sep 17 00:00:00 2001 From: VariableVince <24507472+VariableVince@users.noreply.github.com> Date: Sat, 7 Jun 2025 01:50:15 +0200 Subject: [PATCH] Duo partner SP always same: randomize players before team assignment (#1051) ## Description: See report here: https://discord.com/channels/1284581928254701718/1378762423175221319 In Singleplayer Teams > Duos, your duo partner will be the same every time. In World map for example, it will always Norway. Fix: randomizing Nation players before their team assignment. This is done for all Team modes in Singleplayer and Multiplayer. Other behaviour is unchanged. Clan-players keep their own assignment logic, and Human non-clan player assignment stays the same. The human in singleplayer Duos mode lands in Team 1 everytime but with a different Nation as other team member. BEFORE ![Before SP Duos modal](https://github.com/user-attachments/assets/78628b06-d621-4203-86ae-046e081a46fb) ![Before SP Duos always Team 1](https://github.com/user-attachments/assets/6e7ec19c-b1e5-4642-beb9-93b723a27618) ![Before SP Duos always Team 1 always Norway team member](https://github.com/user-attachments/assets/34794d16-ce90-43ca-a5c2-9827e7c944f5) AFTER ![After SP Duos Team 1 random duo partner](https://github.com/user-attachments/assets/5a1d7d6a-74f2-472f-a0ff-ad94e9ae80bd) ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced - [x] I understand that submitting code with bugs that could have been caught through manual testing blocks releases and new features for all contributors ## Please put your Discord username so you can be contacted if a bug or regression is found: tryout33 --- src/core/game/TeamAssignment.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/core/game/TeamAssignment.ts b/src/core/game/TeamAssignment.ts index 8cd09f9b6..1ec1bb566 100644 --- a/src/core/game/TeamAssignment.ts +++ b/src/core/game/TeamAssignment.ts @@ -1,4 +1,6 @@ -import { PlayerInfo, Team } from "./Game"; +import { PseudoRandom } from "../PseudoRandom"; +import { simpleHash } from "../Util"; +import { PlayerInfo, PlayerType, Team } from "./Game"; export function assignTeams( players: PlayerInfo[], @@ -56,7 +58,19 @@ export function assignTeams( } // Then, assign non-clan players to balance teams - for (const player of noClanPlayers) { + let nationPlayers = noClanPlayers.filter( + (player) => player.playerType === PlayerType.FakeHuman, + ); + if (nationPlayers.length > 0) { + // Shuffle only nations to randomize their team assignment + const random = new PseudoRandom(simpleHash(nationPlayers[0].id)); + nationPlayers = random.shuffleArray(nationPlayers); + } + const otherPlayers = noClanPlayers.filter( + (player) => player.playerType !== PlayerType.FakeHuman, + ); + + for (const player of otherPlayers.concat(nationPlayers)) { let team: Team | null = null; let teamSize = 0; for (const t of teams) {