TrioOnline
Jogo de cartas em tempo real para a turma, à prova de quem tenta espiar.
- 36
- cartas num baralho embaralhado por semente
- 20
- ticks por segundo na máquina de estados
Stack: TypeScript · Colyseus · Next.js · Zustand · Prisma · PostgreSQL · Redis · Turborepo · Kubernetes
Estado: Em uso entre amigos
GitHubPor dentro: TrioOnline
Fiz para jogar com os amigos e acabei tratando como engine de verdade. Se a disputa é entre amigos, ninguém pode ganhar por bug, por lag ou abrindo o DevTools.
O que eu quis resolver
Partidas que se repetem byte a byte
Proibi Math.random() e Date.now() no core. O baralho de 36 cartas é embaralhado com Fisher-Yates sobre um gerador Park-Miller semeado pelo servidor, o tempo corre em ticks e cada ação vira um evento imutável: reaplicar o log numa engine vazia devolve o mesmo estado.
O cliente não sabe o que não pode ver
Carta virada para baixo trafega com valor nulo; o número só sai do servidor no patch que a revela. A semente nunca deixa o servidor, e cada comando leva um número de sequência, então um pacote reenviado de outro turno é descartado.
Uma fila por sala
Dois cliques no mesmo instante não viram race condition: todo comando entra numa fila FIFO da sala no Colyseus e é processado um de cada vez, com a máquina de estados conferindo a fase antes de aplicar.