Lobisomem por Uma Noite — Monstros
Jogo multiplayer online, mobile-first e 100% em pt-BR.
3 a 7 jogadores · uma noite · um monstro entre vocês.
Recriação online do jogo de dedução social Lobisomem por Uma Noite: Monstros: cada celular é uma tela secreta, a noite é guiada por narração, e a lógica das cartas roda só no servidor — ninguém vê a carta alheia.
Arte pixel em
public/art/é original (inspirada no estilo do jogo físico). Não redistribuímos scans das cartas oficiais.
| Time | Papéis |
|---|---|
| Aliados | Aldeão, Bruxa, Caçador, Vampiro |
| Lobisomens | Lobisomem (1 ou 2, conforme o número de jogadores) |
| Mortos-vivos | Múmia, Esqueleto |
| Zumbi | Zumbi (assume outro papel à noite — em si não vence) |
| Jogadores | Lobisomem | Caçador | Bruxa | Vampiro | Zumbi | Múmia / Esqueleto | Aldeão |
|---|---|---|---|---|---|---|---|
| 3 | 1 | 1 | 1 | 1 | 1 | 1 (um dos dois) | 0 |
| 4 | 2 | 1 | 1 | 1 | 1 | 1 (um dos dois) | 0 |
| 5 | 2 | 1 | 1 | 1 | 1 | ambos | 0 |
| 6 | 2 | 1 | 1 | 1 | 1 | ambos | 1 |
| 7 | 2 | 1 | 1 | 1 | 1 | ambos | 2 |
(Tabela oficial Monstros. Com 7 jogadores os 2 aldeões têm artes distintas — roupa verde vs. preta com arado — para a discussão poder diferenciá-los.)
| Papel | Ação |
|---|---|
| Caçador | Esconde uma carta do centro sem olhar. Se for lobisomem, isso só conta depois da votação (ver vitória) |
| Bruxa | Olha a carta de um jogador; também vê o cemitério (só o verso — espaço vazio = Caçador já agiu) |
| Lobisomem | Reconhece os outros lobisomens e olha o centro só no turno dele (depois vira de novo) |
| Zumbi | Remove uma carta do centro, assume o papel e executa a ação dele |
| Vampiro | Troca a própria carta com a de outro jogador ou do cemitério, em segredo |
| Aldeão / Múmia / Esqueleto | Dormem (olhos fechados — não veem o cemitério) |
- Alguém cria a sala e compartilha o código de 4 letras.
- Cada um recebe uma carta secreta; 3 cartas ficam no centro.
- Noite (~1m40s) — narração chama cada papel na ordem (Caçador → Bruxa → Lobisomem → Zumbi → Vampiro). O centro só aparece quando alguém age.
- Discussão (5–10 min) — blefem, acusem, mentam. Cartas removidas somem do centro.
- Votação — quem tiver mais votos, morre. Empate: todos com o máximo morrem. Se cada jogador receber exatamente 1 voto, a discussão recomeça.
- Resultado — a carta do Caçador é revelada e o time vencedor é anunciado.
- Um morto-vivo (múmia ou esqueleto) morreu → Mortos-vivos vencem (mesmo se o Caçador escondeu lobisomem)
- Um lobisomem morreu → Aliados vencem
- O Caçador escondeu um lobisomem e a vila não executou o Caçador → Aliados vencem
- Caso contrário → Lobisomens vencem (inclui executar o próprio Caçador)
O Zumbi em si nunca vence — só o papel que ele assumiu à noite.
- Next.js 16 (App Router, TypeScript, Tailwind CSS 4) na Vercel
- Supabase — Postgres + Realtime (broadcast de “estado mudou”)
- Motor puro e testável em
lib/game/ - Mutações só via API routes com service role (server-authoritative)
Cliente (UI pt-BR)
│ POST /api/rooms/...
▼
Next.js route handlers ──service_role──► Supabase Postgres
│ │
└── HTTP broadcast "update" ──► Realtime ──► clientes refetch view pessoal
app/
page.tsx # Home: criar / entrar
sala/[code]/page.tsx # Lobby → Noite → Discussão → Voto → Resultado
api/rooms/ # create, join, start, action, vote, advance…
components/phases/ # Telas de cada fase
lib/game/ # Engine, roles, timeline (+ testes)
lib/api/ # Room store + views personalizadas
public/art/ # Pixel art HD original
supabase/schema.sql # Tabela rooms + RLS
Pré-requisitos: Node 20+, projeto Supabase.
npm install
cp .env.example .env.local
# Preencha as 3 variáveis (URL, publishable key, secret key)
# Aplique supabase/schema.sql no SQL Editor do Supabase
npm run dev| Variável | Uso |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
URL do projeto |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY |
Frontend (só Realtime) |
SUPABASE_SECRET_KEY |
Somente servidor — nunca no browser |
LIVEKIT_URL |
WebSocket LiveKit Cloud (wss://…) |
LIVEKIT_API_KEY / LIVEKIT_API_SECRET |
Tokens de voz (somente servidor) |
npm test # motor do jogo
npm run lint
npm run buildJogadores entram numa sala LiveKit no lobby e mantêm áudio/vídeo pela discussão, votação, resultado e de volta ao lobby. O microfone liga automaticamente; a câmera é opcional. A sessão só fecha quando a próxima noite começa (ou ao sair da sala).
- Crie um projeto em LiveKit Cloud.
- Copie URL, API Key e API Secret para
.env.local/ Vercel. - Redeploy. Sem essas variáveis, a UI mostra que a voz não está configurada.
A narração oficial está em public/audio/monster.m4a
(~1m38s), com legendas sincronizadas em lib/game/timeline.ts.
Ordem da noite: Caçador → Bruxa → Lobisomem → Zumbi → Vampiro → amanhecer.
Se o arquivo sumir, o app cai para síntese de voz pt-BR do navegador.
Música ambiente (lobby / home, em loop baixo):
public/audio/background.mp3 — some quando a
partida começa.
O app é uma Progressive Web App: manifesto, ícones, tema escuro e service
worker (public/sw.js) com shell offline. Multiplayer ainda precisa de internet;
a tela /offline aparece se a navegação falhar sem rede.
No celular, um popup oferece instalar na tela inicial (Android: botão que abre o instalador nativo; iOS: passos do Safari). Ao abrir pelo ícone instalado, outro popup oferece ativar notificações.
iPhone / iPad (Safari): Compartilhar → Adicionar à Tela de Início.
Android (Chrome): botão do popup ou menu → Instalar app.
Desktop (Chrome/Edge): ícone de instalar na barra de endereço.
No next dev o SW não registra (evita conflito com HMR). Use ?sw=1 para
testar localmente, ou rode npm run build && npm start.
O projeto de produção está em https://lobisomem-monstros.vercel.app.
Para outro ambiente:
- Importe o repo na Vercel.
- Configure as 3 variáveis (Production + Preview).
- Aplique
supabase/schema.sqlno Supabase.
Inspirado no jogo de tabuleiro Lobisomem por Uma Noite: Monstros (e na série
One Night Ultimate Werewolf). Este repositório não é afiliado aos
detentores da marca. A implementação e a arte pixel em public/art/ são
originais.
Veja CONTRIBUTING.md.
MIT — código e arte original deste repositório.
