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

GIF do DOOM rodando no browser enquanto o cubo mágico GAN controla o personagem

O fluxo é:

  1. Cubo detecta rotação

  2. Biblioteca emite R, U', etc.

  3. Aplicação mapeia movimentos para teclas:

    • R → mover para direita
    • U → frente
    • F → atirar
  4. Evento de teclado é disparado no canvas do js-dos

  5. 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