Ninguém espera sozinho: conheça os frequentadores
Abrir uma sala significava esperar sozinho até desistir. Agora doze frequentadores com nomes reais, personalidades fixas e ritmo humano ocupam as cadeiras vazias.

Em palavras simples
Até esta atualização, nada entrava numa sala criada por você. Você escolhia um modo, abria a mesa e esperava — quase sempre sozinho. Os números das seis semanas anteriores são diretos:
| O que medimos | Resultado |
|---|---|
| Salas abertas por um jogador que nunca começaram | 38 |
| Espera média antes de desistir | ~3,2 horas |
| Uma sala que encheu 4/4 e mesmo assim não começou | esperou 2 dias |
| Partidas concluídas com mais de um humano | 46 de 231 |
Agora a mesa se enche sozinha. Entre vinte segundos e quatro minutos depois de você abrir a sala, alguém senta. Uma dúzia de frequentadores circula pelo saguão — apelidos comuns, nada de RoboBaron — e cada um é o mesmo jogador toda vez que você o encontra:
- uma personalidade fixa: o mesmo adversário sempre joga com cautela, ou sempre dá lances altos demais;
- uma data de entrada e um nível de experiência que não foram inventados hoje de manhã;
- um ritmo próprio — pensam de um a seis segundos, e não dois cravados como um metrônomo;
- de vez em quando uma frase curta no chat em vez de uma figurinha;
- nenhum selo de "bot" na sala de espera, porque na mesa eles se comportam como jogadores.
Eles também aparecem no ranking, o que é o correto se vão jogar partidas de verdade — mas com um teto diário rígido do que podem ganhar, de modo que sobem como um jogador comum, sem farmar a tabela.
Para os mais técnicos
Os doze personagens são provisionados de forma idempotente quando o servidor de jogo inicia e marcados com um valor que a tabela de perfis já aceitava — então o recurso inteiro chegou sem nenhuma migração de banco e sem mudar qualquer regra do jogo.
O preenchimento é um tick do agendador, não um temporizador por sala. Cada atraso vem de um aleatório com semente na sala e na cadeira, ancorado num carimbo de tempo guardado no banco, de modo que reiniciar o servidor retoma exatamente o mesmo cronograma em vez de sortear atrasos novos:
// scheduler.ts — seeded per (room, seat), anchored on a DB timestamp
const rng = createRng(`${game.id}:fill:${seat}`);
const isLastSeat = freeSeats === 1;
const delayMs = isLastSeat
? rng.int(LAST_SEAT_MIN_MS, LAST_SEAT_MAX_MS) // 3-8 min: leave room for a human
: rng.int(SEAT_MIN_MS, SEAT_MAX_MS); // 20 s - 4 min
if (Date.now() - Date.parse(game.created_at) < delayMs) continue;| Ajuste | Valor |
|---|---|
| Atraso para ocupar uma cadeira | 20 s – 4 min, com semente por cadeira |
| Última cadeira | 3 – 8 min |
| Início automático com a mesa cheia e parada | 3 min |
| Tempo de reflexão do bot | 1 – 6 s, ajustado por personagem |
| XP dos personagens | no máximo um prêmio por dia UTC |
Três defeitos só apareceram com o sistema rodando, e nenhum teste unitário teria pego qualquer um deles: salas cheias ficavam de fora da consulta de candidatas do preenchimento, então o início automático nunca via justamente o caso para o qual existe; a espera de reflexão era indexada por partida e não por bot, de modo que uma pausa num turno também travava o lance daquele mesmo bot até ele ser passado automaticamente para fora da própria janela; e uma partida iniciada pelo servidor não acordava os agendadores do modo ocioso, o que deixava 11,6 segundos entre o início e o primeiro lançamento de um bot em vez de 49 milissegundos.
