De volta à mesa com um toque
A tela de resultado já pode recomeçar a mesma partida, e a Partida rápida coloca você numa sala que já está enchendo em vez de abrir outra vazia.

Em palavras simples
O melhor momento para começar uma partida é o segundo em que a anterior termina. A prova estava na nossa mão e nós a desperdiçávamos: entre os jogadores que voltavam para uma segunda partida, mais da metade começava dois minutos depois do fim da primeira — e tudo o que oferecíamos naquele instante era um link para o saguão, onde era preciso escolher modo, escolher número de lugares, criar uma sala e esperar.
Agora a tela de resultado tem um botão Jogar de novo. Um toque e você está numa partida nova: o mesmo modo, o mesmo número de lugares, as cadeiras vazias já ocupadas e a partida já rolando. Sem saguão e sem nada para configurar.

A Partida rápida é a outra metade do mesmo problema, no saguão. Antes era um botão que não fazia nada. Agora ela coloca você na melhor sala aberta do modo que escolheu: primeiro uma criada por uma pessoa real, depois a que está mais perto de começar e, por fim, a que espera há mais tempo. Só se realmente não houver nada para entrar é que ela abre uma sala para você.
Para os mais técnicos
A revanche não acrescenta nenhum endpoint novo no servidor. Ela faz exatamente o que um jogador faz à mão — criar a sala, sentar os bots um a um (a chamada escolhe a próxima cadeira livre, então fazê-las em paralelo disputaria a mesma), e depois começar — e cada passo é autorizado como o jogador, de modo que toda regra de uma sala criada por você vale aqui também.
Isso importa por causa de quem aperta o botão. Nove de cada dez saídas de uma primeira partida são desistências, não falências, então o caso comum é alguém deixando uma partida que continua rolando para os outros. Funciona porque quem já saiu de uma partida deixa de contar como estando em uma: uma regra lançada por outro motivo há um ano e que hoje é o que torna o botão de revanche legal.
A Partida rápida guarda sua decisão numa função pura, testável sem saguão e sem banco de dados. O modo é um filtro, não uma preferência: cair numa partida Clássica de meia hora depois de escolher Blitz seria pior do que esperar um instante.
// lib/lobby/quickMatch.ts — which open room to try, in order
.sort((a, b) => {
// 1. a human host: pool the people who are actually online
if (a.creator_is_bot !== b.creator_is_bot) return a.creator_is_bot ? 1 : -1;
// 2. fewest free seats: a nearly-full room starts sooner
const freeA = a.max_players - a.player_count;
const freeB = b.max_players - b.player_count;
if (freeA !== freeB) return freeA - freeB;
// 3. oldest: whoever has waited longest gets company first
return Date.parse(a.created_at) - Date.parse(b.created_at);
});A lista ordenada completa é devolvida em vez de uma única escolha, porque a contagem de lugares é um retrato momentâneo: quem chama desce a lista até que uma entrada realmente funcione, e é isso que evita que duas pessoas disputando a última cadeira acabem as duas sozinhas.
