Sala 24/7

Times, capitães e escolha

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

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

A regra de ouro: times sempre iguais

Antes de cada partida, o controlador calcula quantos times usar e de que tamanho:

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

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

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

Antes de enviar cada startGame, o controlador ainda confere os times reais da sala contra o esperado. Se alguém trocou de time no último instante, ele corrige e tenta de novo, 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 os times, a partida pára e o capitão do time com menos jogadores (empate: o azul) escolhe digitando 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 time perdedor inteiro 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 esperando (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 desbalanceada. Se há gente no spec, ela repõe a vaga (com escolha do capitão, se houver opção). Sem reposição, os times são rebalanceados: 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 times
!afk de novoSai do AFK e volta ao fim da fila
!afk em partida, de quem está jogandoRecusado: 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

  • Times travados. O bot chama room.lockTeams(): jogadores não trocam de time sozinhos.
  • Reversão como reserva. Se mesmo assim alguém sair do time 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 times (classic, arrows...), o primeiro time é fixo e os demais rotacionam a cada partida, com as mesmas regras de tamanho igual.

Como isso é testado

O controlador roda contra uma sala falsa que imita o servidor (eco de trocas de time, 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 time e comandos, e verifica a cada partida iniciada que os times 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 no time que o controlador registrou.