From 6edc14f3fd2f570837624f82912a56d6fa64e60c Mon Sep 17 00:00:00 2001 From: Yuto Nishida Date: Sun, 7 Dec 2025 23:27:03 -0800 Subject: [PATCH] [2nub] Only allow happy division of roles --- experimental/2nub/src/server/gameState.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/experimental/2nub/src/server/gameState.ts b/experimental/2nub/src/server/gameState.ts index e6af946..c8604cf 100644 --- a/experimental/2nub/src/server/gameState.ts +++ b/experimental/2nub/src/server/gameState.ts @@ -1,4 +1,4 @@ -import { GameState, Player, StateLobby, StateNight } from '../types'; +import { GameState, Player, RoleId, StateLobby, StateNight } from '../types'; interface PlayerSocketMapping { gameId: string; @@ -300,7 +300,23 @@ class GameStateManager { } } - const [unshuffledCenterCards, remainingRoles] = chooseN(game.state.ruleset.roleOrder, 3); + /** + * Selects 3 center cards such that the role distribution is "happy". + * A "happy" role distribution is one where: + * - There are either 0 or 2 "50/50 duo cop" roles among players + */ + const divideRolesHappily = (roleOrder: RoleId[]) => { + while (true) { + const [unshuffledCenterCards, remainingRoles] = chooseN(game.state.ruleset.roleOrder, 3); + + const count5050DuoCopInPlayers = remainingRoles.filter(roleId => roleId === '50/50 duo cop(sane)' || roleId === '50/50 duo cop(insane)').length; + if (count5050DuoCopInPlayers === 0 || count5050DuoCopInPlayers === 2) { + return [unshuffledCenterCards, remainingRoles]; + } + } + } + + const [unshuffledCenterCards, remainingRoles] = divideRolesHappily(game.state.ruleset.roleOrder); const centerCards = shuffle(unshuffledCenterCards); const playerIdsByWakeupOrder: Player["id"][][] = []; -- 2.54.0