La Corte é uma experiência premium de blefe e influência inspirada nas mecânicas de Coup. O projeto roda localmente no navegador, com bots, salas na rede local e uma direção de arte original de intriga renascentista.
- Partidas de 2 a 6 jogadores; na home, a partida local permite escolher de um a cinco bots.
- Salas multiplayer por código curto e links no formato
/sala/SW8X4. - Salas privadas sincronizadas por Supabase Realtime, com cadeiras vinculadas ao Supabase Auth.
- Renda, Ajuda Externa, Imposto, Roubo, Troca, Assassinato e Golpe.
- Influências, moedas, eliminação, turnos e vitória.
- Contestações de alegações contra bots; bots também podem contestar alegações do jogador.
- Bloqueios de Ajuda Externa, Roubo e Assassinato na experiência contra bots.
- Cartas reveladas com retratos e memória pública das influências perdidas.
- Crônica da corte, com os eventos mais recentes e contexto dentro dos modais de decisão.
- Relógios por fase com jogada conservadora automática para jogadores ausentes.
- Reconexão, retomada da cadeira e promoção automática de anfitrião sem expor as mãos privadas.
- Sons sintetizados para turno, alerta de tempo e resultado, com mute persistente.
- Chat cifrado da mesa com provocações rápidas, histórico, contador e proteção contra spam.
- Tema escuro e tema claro “pergaminho imperial”, persistidos no navegador.
- Interface responsiva e assets originais: cenário noturno/diurno, cinco personagens e favicon.
- Apresentação 3D jogável como visão padrão da partida, carregada sob demanda, com a mesma partida autoritativa e opção de voltar à mesa 2D.
Pré-requisito: Node.js 20.19 ou superior, ou Node.js 22.12 ou superior.
npm install
npm run devAbra http://localhost:5173, ou use o endereço exibido pelo Vite no terminal.
Partidas novas e retomadas abrem na mesa 3D. O salão usa o mesmo motor de regras e a mesma partida da mesa 2D; o WebGL apenas projeta e encena o estado já decidido. O painel da Corte permite alternar para a mesa 2D sem perder sala, crônica ou relógio. A HUD oferece ações, decisões, crônica, chat multiplayer e reações efêmeras sem revelar influências privadas dos adversários.
Os assets e módulos 3D são importados somente quando a partida padrão começa ou quando o jogador alterna do 2D para o 3D; visitar a home ou permanecer em 2D não inicializa o salão. Depois de carregada, a cena é preservada entre atualizações da partida e descartada ao voltar ao 2D. Dia e noite usam a mesma preferência da interface 2D.
A vitrine de modelos fica em /lab/modelos e mostra uma peça por vez, com os
parâmetros de cada uma. O laboratório técnico fica em /lab e não avança uma partida. Para liberar
seu botão, configure VITE_CORTE_3D_LAB_KEY e visite uma vez:
http://localhost:5173/?labKey=SUA_CHAVE
A chave da URL é consumida, removida do endereço e a permissão fica registrada
no localStorage do navegador. Em desenvolvimento, quando a variável não está
definida, a chave padrão é corte-lab. Benchmark, perfis gráficos e câmeras
manuais existem somente no laboratório. A arquitetura e a barreira de sigilo
estão em docs/tabletop-engine.md.
Para abrir em outro dispositivo na mesma rede, execute npm run dev:lan, descubra o IP da máquina anfitriã e compartilhe, por exemplo:
http://10.0.0.43:5173
O firewall do sistema pode pedir autorização para conexões de entrada.
Esse acesso por HTTP serve para a interface e para partidas contra bots. As
salas multiplayer cifram as visões privadas com SubtleCrypto, que os
navegadores só liberam em contexto seguro — localhost ou HTTPS. Para testar
salas em outro dispositivo, use um túnel HTTPS (por exemplo ngrok ou
cloudflared) ou um certificado local confiável apontando para o dev server.
- Informe seu nome na tela inicial.
- Escolha Criar sala.
- Compartilhe Copiar link da sala com os demais jogadores.
- Quem abrir o link entra no fluxo com o código já preenchido.
- O anfitrião inicia a partida quando houver pelo menos dois jogadores.
Os links seguem o padrão:
http://SEU-IP:5173/sala/SW8X4
As salas online são hospedadas pelo navegador do anfitrião: é ele quem guarda o estado completo, embaralha o baralho e envia a cada jogador uma visão cifrada contendo apenas a própria mão. Duas consequências práticas:
- O anfitrião tem acesso técnico a todas as mãos (DevTools ou armazenamento da sessão), como quem embaralha um baralho físico poderia espiar as cartas.
- A entrada continua sem cadastro visível, mas cada cadeira é um usuário anônimo
do Supabase Auth. O banco vincula cadeira, conexão e chave de cifra a
auth.uid(); o remetente dos Broadcasts é injetado por uma RPC, não aceito do payload do navegador.
RLS restringe Broadcast e Presence aos membros do canal privado. Isso impede que alguém apenas imite o ID de outra cadeira, mas não transforma o host em um servidor confiável: o formato atende partidas casuais. Jogo competitivo com desconhecidos ainda exige tirar regras, sorteio e snapshots autoritativos do cliente, por exemplo para um servidor ou Edge Function.
O objetivo é ser o último jogador com influência. Cada jogador começa com duas influências e duas moedas; em uma partida de dois jogadores, quem começa recebe apenas uma moeda. Nas revanches, o vencedor anterior começa.
| Ação | Efeito | Pode ser bloqueada |
|---|---|---|
| Renda | Recebe 1 moeda | Não |
| Ajuda Externa | Recebe 2 moedas | Duque, por qualquer rival |
| Imposto | Alegue Duque e receba 3 moedas | Contestável |
| Roubo | Alegue Capitão e retire até 2 moedas de um alvo | Capitão ou Embaixadora, pelo alvo |
| Troca | Alegue Embaixadora e troque influências | Contestável |
| Assassinato | Alegue Assassina, pague 3 moedas e elimine uma influência | Condessa, pelo alvo |
| Golpe | Pague 7 moedas e elimine uma influência | Não |
Com 10 moedas ou mais, o Golpe é obrigatório. Uma alegação de personagem pode ser um blefe e pode ser contestada. Quem perde uma contestação revela uma influência; se a alegação era verdadeira, a carta volta ao baralho e é substituída.
npm test
npm run checkOs testes cobrem o motor genérico de Coup, códigos de sala, presença, retomada da cadeira, eleição e migração de host, reconstrução da partida, chat, validação dos envelopes de rede, criptografia das visões privadas, projeção segura da mesa 3D, acesso ao laboratório, benchmark e reações.
app.js Orquestração da aplicação, partidas e transportes
src/game/ Regras, bots e reconstrução autoritativa
src/rooms/ Sala, Auth, presença, sessão, chat e continuidade
src/lib/secure-channel.js Criptografia das visões privadas no Broadcast
src/lib/tabletop/ Projeção, compositor e ferramental específicos do 3D
src/ui/ Views HTML compartilhadas e interface da mesa 3D
packages/tabletop-stage/ Motor WebGL comum, sem regras ou tema de Coup
assets/ Cenários, personagens, ações, vozes e favicon
test/ Testes de regras, salas, segurança e apresentação
O que dentro dessa estrutura é motor reaproveitável por outros jogos da equipe e o que é Coup nativo está mapeado em MOTOR-COMPARTILHADO.md.
O projeto usa Vite e pode ser publicado diretamente na Vercel. Adicione estas variáveis de ambiente no projeto, para os ambientes Production, Preview e Development:
VITE_SUPABASE_URL=https://SEU-PROJETO.supabase.co
VITE_SUPABASE_PUBLISHABLE_KEY=sb_publishable_sua-chave-publica
Projetos antigos que ainda usam VITE_SUPABASE_ANON_KEY continuam
compatíveis, mas a chave publicável é a opção atual recomendada. Após salvar as
variáveis, faça um novo deploy. A rota /sala/* já possui rewrite para a
aplicação e as salas usam Supabase Realtime. Nunca configure uma chave secreta
ou service_role na Vercel ou no navegador.
Antes de usar o multiplayer no projeto Supabase:
- Em Authentication > Providers, habilite Anonymous Sign-Ins.
- Aplique todos os arquivos de
supabase/migrations/na ordem do nome, pelo SQL Editor, ou executesupabase db pushem um projeto ligado à CLI. As migrations posteriores corrigem a entrada na sala, autorizam o Broadcast da RPC e habilitam recuperação de estado e ACK de jogadas; aplicar somente a primeira deixa o cliente e o banco incompatíveis. - Em Realtime Settings, desabilite o acesso público a canais. A aplicação já assina
la-corte:*comprivate: true, e a migration permite Broadcast/Presence somente aos membros autenticados. - Faça o deploy e valide criar, entrar, reconectar e promover o anfitrião em duas sessões de navegador.
Sem as migrations e o login anônimo habilitado, salas online falham de forma fechada; partidas locais e contra bots continuam disponíveis. Usuários anônimos contam como usuários Auth e devem entrar na política de retenção/limpeza do projeto se a aplicação ganhar uso contínuo.
La Corte é um projeto não oficial inspirado na estrutura de blefe de Coup. As artes da interface e dos personagens neste repositório são originais e não reutilizam ilustrações comerciais do jogo.
