Skip to content

Repository files navigation

POV

POV é um party game de percepção: os jogadores tentam descobrir em que ponto de uma escala entre dois extremos opostos cai a dica dada por um deles.

Ver no ar · Estudo de caso

Tela de uma rodada do POV: medidor semicircular com o ponteiro, os segmentos de pontuação 2-3-4-3-2 e a carta de escala Feio/Bonito

Como funciona

O estado de cada sala vive no Convex. convex/schema.ts define as tabelas rooms (o alvo secreto da rodada fica em round.target), players e guesses (um palpite por jogador por rodada). A query que alimenta a tela, getRoomView em convex/rooms.ts, só devolve o alvo real para quem é o Dono do POV ou depois que a rodada entra em fase de revelação; para os outros jogadores o campo chega como null até lá.

A sincronização é em tempo real: o cliente usa convex-svelte com queries e mutations reativas (src/lib/online/room.svelte.ts), manda um heartbeat a cada 8 segundos para saber quem está conectado, e envia o palpite de cada jogador ao Convex a cada 125ms enquanto ele arrasta o ponteiro (updateGuess em convex/round.ts). Quando todos os jogadores que não são o Dono travam o palpite, lockGuess dispara a revelação sozinho.

O medidor (src/lib/meter/Meter.svelte, geometria em src/lib/meter/geometry.ts) não é um slider contínuo: o ponteiro se move em 24 posições fixas (STEPS), encaixa sempre na mais próxima (snap) e a pontuação da rodada sai da distância entre essas posições (scoreFor, 0/2/3/4 pontos). Cada troca de posição dispara um clique sintetizado em Web Audio e uma vibração (src/lib/audio/clicks.ts), para que o ponteiro se comporte como uma peça mecânica em vez de um controle de formulário.

Rodar local

npm install
npm run test
npm run check

npm run dev sozinho não sobe o jogo. O cliente Convex é inicializado incondicionalmente na raiz do app, com setupConvex(import.meta.env.VITE_CONVEX_URL) em src/App.svelte, e a própria convex-svelte lança um erro se essa URL não for uma string. Confirmei isso rodando npm run dev num clone limpo, sem .env.local: a página carrega em branco, sem nenhum elemento na árvore de acessibilidade. É preciso npx convex dev com um projeto Convex configurado (o comando gera o .env.local com VITE_CONVEX_URL) antes de a aplicação conseguir montar.

Estado

npm run test (vitest): 7 arquivos, 29 testes, todos passando. npm run check (svelte-check): 264 arquivos, 0 erros, 0 avisos.

Não configurei um deployment Convex próprio para levar o npm run dev do zero até o fim, porque isso criaria um projeto novo. Sem esse passo, o que ficou confirmado é a suíte de testes e a checagem de tipos passando limpas, e que a versão publicada em produção é jogável: testei uma rodada local até a revelação pelo link acima.

Licença

AGPL-3.0 (LICENSE). Mantém o código aberto e impede que um terceiro pegue o servidor e feche o jogo como serviço próprio.

About

POV: party game web sobre ponto de vista. Os jogadores tentam descobrir onde uma dica cai numa escala entre dois extremos opostos. Svelte 5 + Convex, com estetica retro-psicodelica e sensacao de jogo de tabuleiro fisico. Inspirado no jogo Sintonia (Wavelength).

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages