Sala 24/7

Equipas, capitães e escolha

As regras do PickController: equipas sempre iguais, capitães, rotação do campeão, AFK e comandos.

O PickController da sala 24/7 monta e rotaciona as equipas. Tudo é calculado a partir de maxTeamSize (N), e o objetivo central é que nenhuma partida comece desequilibrada (nada de 2v1, 3v1 ou 3v4).

A regra de ouro: equipas sempre iguais

Antes de cada partida, o controlador calcula quantas equipas usar e de que tamanho:

text
equipas usadas = min(número de equipas do modo, jogadores disponíveis)
tamanho m    = min(N, ⌊jogadores disponíveis / equipas usadas⌋)

Quem sobra espera no spec. Alguns exemplos com football (2 equipas) e N = 2:

Jogadores disponíveisPartidaEspera no spec
1solo0
21v10
31v11
42v20
52v21

Antes de enviar cada startGame, o controlador ainda confere as equipas reais da sala contra o esperado. Se alguém trocou de equipa no último instante, ele corrige e tenta novamente, em vez de iniciar errado.

Capitães e escolha

  1. O 1º jogador vai para o azul e o para o vermelho: eles são os capitães.
  2. Os seguintes esperam no spec, sem interromper a partida.
  3. Quando o spec completa as equipas, a partida pára e o capitão da equipa com menos jogadores (empate: o azul) escolhe escrevendo o número do jogador no chat, sem nenhum comando, dentro de 30 s. Sem resposta, escolhe o primeiro da lista.
  4. Se sobrar um único candidato, ele entra sozinho, sem escolha.
text
Ana (blue), digite o número do jogador que quer escolher:
Disponíveis: 1 - Carla, 2 - Diego

Com N = 3 e 6 jogadores, os capitães alternam: azul, vermelho, azul, e o último candidato entra sozinho.

Fim da partida: quem vence fica no azul

Ao fim de cada partida, um jogador em campo informa o vencedor com !win blue ou !win red (sem resposta em 20 s, o azul segue). Então:

  1. O equipa perdedora inteira vai para o fim da fila do spec.
  2. O vencedor sempre fica no azul: se o vermelho ganhou, ele inteiro é movido para o azul.
  3. O primeiro da fila vira capitão do vermelho e escolhe os demais entre os jogadores do spec.

Exemplo com N = 2 e um jogador extra à espera (Eva):

text
azul: Ana, Carla    vermelho: Bruno, Diego    spec: Eva
> vermelho vence
azul: Bruno, Diego  vermelho: Eva (capitã)    spec: Ana, Carla
> Eva digita: 2  (Carla)
azul: Bruno, Diego  vermelho: Eva, Carla      spec: Ana

Quando alguém sai no meio da partida

A partida pára para nunca continuar desequilibrada. Se há gente no spec, ela repõe a vaga (com escolha do capitão, se houver opção). Sem reposição, as equipas são reequilibradas: quem passa do tamanho volta ao início da fila e a partida reinicia, por exemplo em 1v1.

AFK

SituaçãoO que acontece
!afk no specO jogador fica AFK: não é escolhido nem completa equipas
!afk novamenteSai do AFK e volta ao fim da fila
!afk em partida, de quem está a jogarRecusado: quem joga não pode ficar AFK
!afk entre partidas, de quem estava em campoVai para o spec como AFK e a vaga é reposta
12 s sem se mexer nem falar, em partidaSó é avisado; vai para o AFK ao fim da partida

As mensagens do bot seguem o formato o jogador X agora está afk! e o jogador X saiu do afk!.

Comandos

ComandoQuem usaO que faz
!afkqualquer jogadorAlterna AFK
<n> (só o número)capitão da vezEscolhe o jogador nº n da lista (!pick <n> continua aceito)
!win blue · !win redjogador em campoInforma o vencedor
!start · !stopjogador em campoInicia ou pára a partida (!stop segura o reinício até o próximo !start)
!pingqualquer jogadorResponde Pong!

Proteções

  • Equipas bloqueadas. O bot chama room.lockTeams(): jogadores não trocam de equipa sozinhos.
  • Reversão como reserva. Se mesmo assim alguém sair da equipa ou entrar em um por conta própria, o controlador reverte ou trata como saída.
  • Comandos só de quem joga. !start, !stop e !win de espectadores são recusados.
  • Outros modos. Nos modos de 4 equipas (classic, arrows...), a primeira equipa é fixo e os demais rotacionam a cada partida, com as mesmas regras de tamanho igual.

Como isso é testado

O controlador corre contra uma sala falsa que imita o servidor (eco de trocas de equipa, início e fim de partida assíncronos). Além de dezenas de cenários, um fuzz executa centenas de sequências aleatórias de entradas, saídas, !afk, escolhas, !win, trocas de equipa e comandos, e verifica a cada partida iniciada que as equipas são iguais, não passam de N e não têm AFK em campo, e que no fim todos os jogadores estão na equipa que o controlador registrou.