DOOM no Cubo Mágico!?
Usei um cubo mágico Bluetooth da GAN como controle para jogar DOOM no browser — e funcionou. Veja como Web Bluetooth, BLE e js-dos tornaram isso possível.
Se existe uma regra não escrita da internet, ela é simples:
Se algo tem um processador, alguém já tentou rodar DOOM nele.
Já rodaram DOOM em:
- calculadora
- geladeira
- teste de gravidez
- impressora
- tratores
- displays aleatórios
Então eu pensei:
E se eu jogasse DOOM com um cubo mágico?
E assim nasceu o Scooby-Doom.
🎮 O experimento
A ideia era simples:
- Rodar DOOM no browser
- Conectar um cubo inteligente via Web Bluetooth
- Transformar rotações físicas em eventos de teclado
- Jogar de verdade
Mas não foi tão simples.
🧊 Mas por que um cubo mágico Bluetooth existe?
Eu usei um GAN 356 i3, um cubo inteligente da GAN.
Esse tipo de cubo possui:
- Sensores internos de rotação
- Acelerômetro
- Conectividade Bluetooth Low Energy (BLE)
- Bateria recarregável
Eles existem principalmente para:
- Treinamento de speedcubers
- Análise de tempo e precisão
- Estatísticas de resolução
- Aulas interativas
A própria GAN tem aplicativo oficial para registrar solves, acompanhar métricas e minha parte favorita:
Jogar ranked de Cubo Mágico!!! Sim meus amigos, eu estou lutando pra sair do Bronze!
Mas dava para fazer outra coisa:
Usar o cubo como dispositivo de entrada física para um jogo.
🧠 Arquitetura do projeto
Vamos ao que interessa.
O projeto tem três camadas principais:
Cubo físico
↓
Web Bluetooth
↓
cube-helper-web (lib)
↓
Scooby-Doom (aplicação)
↓
js-dos (emulação do Doom)
🔌 O problema real: Web Bluetooth não é trivial
Trabalhar diretamente com cubos inteligentes no browser envolve:
- Web Bluetooth API
- Permissões explícitas do usuário
- Eventos BLE
- Streams RxJS
- Protocolos específicos do dispositivo
- Gerenciamento de lifecycle de conexão
- Ruído e reconexão
Mesmo usando libs de baixo nível como gan-web-bluetooth, a aplicação ainda precisa lidar com:
- Formato de eventos específico
- Transformação de dados
- Acoplamento com RxJS
- Estrutura interna do dispositivo
Isso quebra completamente a separação de responsabilidades.
Foi aí que nasceu a biblioteca.
📦 A biblioteca: @lfgf/cube-helper-web
Eu criei uma camada intermediária extremamente focada:
Um adaptador fino que transforma complexidade BLE em eventos semânticos simples.
Instalação:
npm install @lfgf/cube-helper-web
Uso:
import { connectGanCubeMoves, type CubeMove } from "@lfgf/cube-helper-web";
const conn = await connectGanCubeMoves();
const unsubscribe = conn.onMove((data: CubeMove) => {
console.log("Move:", data.move, "at", data.ts);
});
// ... quando terminar:
unsubscribe();
await conn.disconnect();
A API é intencionalmente mínima:
type CubeConnection = {
onMove(cb: (m: { move: string; ts: number }) => void): () => void;
disconnect(): Promise<void>;
};
O que ela faz:
- Conecta via Web Bluetooth
- Escuta eventos do cubo
- Normaliza movimentos (
R,U',F2) - Remove dependência de RxJS da aplicação
- Expõe callback simples
É um adapter intencionalmente pequeno.
A aplicação não sabe nada sobre BLE. Só sabe que recebe movimentos.
🕹️ O Scooby-Doom
A aplicação em si usa:
- Vite
- TypeScript
- js-dos (para rodar DOOM no navegador)
- Web Bluetooth

O fluxo é:
-
Cubo detecta rotação
-
Biblioteca emite
R,U', etc. -
Aplicação mapeia movimentos para teclas:
- R → mover para direita
- U → frente
- F → atirar
-
Evento de teclado é disparado no canvas do js-dos
-
Doom responde
Surpreendentemente jogável, com alguns ajustes, como o tempo de pressão das teclas com base em giros.
O maior desafio foi:
- Mapear rotação física para ter um gameplay decente
- Ajustar sensibilidade
🤔 Por que Doom?
Porque Doom virou uma espécie de benchmark cultural da programação.
Rodar DOOM virou sinônimo de:
“Isso aqui é programável.”
Mas aqui tem um detalhe diferente:
Não é só rodar. É usar um hardware físico como controle criativo.
Isso transforma o projeto em algo híbrido:
- Web
- Hardware
- Emulação
- API moderna do navegador
🔐 Sobre limitações
Web Bluetooth exige:
- Chrome ou Edge (Chromium)
- HTTPS ou localhost
- Permissão explícita do usuário
- Seleção manual do dispositivo
Isso é uma restrição do modelo de segurança do browser.
E honestamente? Faz sentido.
🎯 O que esse projeto mostra
Mais do que “rodar Doom com um cubo”, ele demonstra:
- Integração hardware + browser
- Abstração de protocolo BLE
- Design de API minimalista
- Separação de responsabilidades
- Engenharia orientada a experimento
E talvez o mais importante:
Dá para usar dispositivos físicos como input criativo no browser moderno.
[INSERIR LINK INTERNO PARA o post sobre testes com IA (Antigravity)]
🧩 Conclusão
A web moderna permite coisas que há poucos anos pareceriam absurdas.
Hoje é possível:
- Conectar um cubo mágico real
- Traduzir movimentos físicos para comandos digitais
- Emular um jogo dos anos 90
- Rodar tudo isso em uma página estática
E se você tiver um cubo mágico inteligente da GAN, pode testar você mesmo.
Porque, afinal:
Se dá para rodar DOOM via Web Bluetooth… por que não controlar com um cubo mágico?
Confira a gameplay no link abaixo: https://www.youtube.com/watch?v=5njxVpny8bw
A página com o jogo está disponível em: https://lfgf.dev/scoobydoom