Projeto

Em Produção — o jogo multiplayer que satiriza o dia a dia dev

Jogo web multiplayer 2D em tempo real que satiriza um time de software: Dev, Ops, QA, Designer, RH e Gerente correndo pelo escritório para fechar a sprint entre mini-games, incidentes, sabotagem e a temida Release Night.

Criador e desenvolvedor

Ficha Técnica

Papel

Criador e desenvolvedor

Stack

typescriptphasersocket.ionodejsmultiplayergame dev
Código privado — o case abaixo detalha a arquitetura e as decisões técnicas.

Em Produção é um jogo web multiplayer 2D que satiriza o dia a dia de um time de desenvolvimento: cada jogador assume um papel — Dev, Ops, QA, Designer, RH ou Gerente — e circula por um escritório completando tasks de sprint via mini-games, enquanto lida com incidentes escalando, bloqueadores ("o café acabou", "build quebrado"), sabotagem entre colegas e a gloriosa Release Night final. Tasks incluem clássicos como centralizar div, funciona na minha máquina e deploy na sexta.

O conceito

É um "Among Us de escritório de software": partidas em salas, papéis sorteados, sprints com timer de 3 minutos, votação de performance entre sprints (com direito a warning, suspensão e demissão → vira espectador) e um desfecho calculado — SUCCESS, ROLLBACK ou DISASTER — baseado nas tasks críticas entregues e nos incidentes deixados pra trás.

Arquitetura

Cliente-servidor autoritativo: o servidor é a fonte da verdade (spawn de tasks, escalação de urgência, scoring, fases); o cliente Phaser renderiza e envia inputs. O contrato inteiro do protocolo é tipado num pacote compartilhado — cliente e servidor importam os mesmos tipos, então dessincronia de payload vira erro de compilação.

Visão de componentes:

Fluxo de uma partida:

Decisões técnicas que valem a pena contar

Dependências cross-player como mecânica de colaboração. A task do Dev pode bloquear a do QA — de propósito. O gerador de sprint aplica regras de dependência ligando tasks de categorias diferentes e tenta empurrar dependente e dependência para jogadores distintos, forçando comunicação. O desbloqueio é tolerante (libera por id exato ou por categoria concluída), evitando deadlock de sprint.

Reconexão sem banco de dados. Todo o estado vive em memória no servidor. Um refresh de página não pode destruir a partida: um sessionId estável no localStorage permite o rejoin, o jogador desconectado fica "cinza" por 30 segundos antes de ter as tasks redistribuídas, e salas vazias em jogo têm TTL de 2 minutos antes do garbage collection.

Incidentes que escalam sozinhos. Cada item interativo é uma máquina de estados com timer próprio: normal → alerta → erro → crítico. A lógica de escalação é desacoplada do transporte via callback — o gerenciador de estado não sabe que Socket.io existe.

Ritmo que escala com a mesa. Partida de 2 jogadores não pode durar o mesmo que uma de 8: número de sprints, duração da release e quantidade de tasks (4 × jogadores, entre 4 e 12) são declarativos, definidos por tabela de formato por contagem de jogadores.

Stack

TypeScript · Phaser 3 · Socket.io · Node + Express · monorepo pnpm com pacote shared de tipos · Vite · Web Audio API (SFX procedural) · GitHub Actions + Railway · editor de mapa visual próprio.

Status

Jogável e avançado: lobby, avatares, sprints, 20+ mini-games, incidentes, sabotagem, votação e release funcionando. Em aberto: tasks colaborativas simultâneas (deploy exigindo Dev + Ops juntos, code review pareado) e mapas adicionais — a arquitetura já suporta múltiplos via registry.

Curtiu o projeto?

Se quiser conversar sobre esse projeto, arquitetura ou uma oportunidade de trabalho, é só me chamar. 🚀

contato@racoelho.com.br
Racoelho

Conteúdo sobre desenvolvimento, tecnologia e desafios de programação para impulsionar sua carreira em tech.

Conecte-se

© 2024- 2026 Racoelho. Todos os direitos reservados.

v3.0.19 • Build: 2026-04-17