O problema do Chrome Dino que ninguém conta
O dinossauro grande de borracha é basicamente o jogo do T-RX do Chrome que aparece quando a internet cai. Todo mundo conhece a mecânica: aperta espaço, o bichinho corre, desvia de cactos e puxões de cabeça. A maior parte das pessoas pensa que é só isso mesmo. Mas tem uma camada bem mais útil que a maioria ignora. Eu comecei a mexer com o código-fonte do jogo porque precisava criar um simulador interno para treinar um agente de RL. O que descobri mudou completamente como vejo aquela pegadinha do navegador.
Como funciona o dinossauro grande de borracha por baixo do capô
O jogo é construído com Canvas 2D puro. Nada de WebGL, nada de engines. O source original pode ser encontrado inspecionando o elemento no DevTools do Chrome, na aba Sources. O arquivo se chama dino.js e fica em chrome-untrusted://component_resources/gfx/mouse_mail/. Isso significa que você pode baixar, modificar e rodar localmente sem depender de nada externo. O loop principal roda em requestAnimationFrame. A cada frame, ele atualiza a posição do dinossauro, dos obstáculos e checa colisão usando AABB (Axis-Aligned Bounding Box). Simples assim. A lógica de colisão é baseada em caixas retangulares, o que é uma limitação importante que vou explicar depois.
A velocidade do jogo aumenta progressivamente. O multiplicador começa em 1.0 e sobe 0.00007 a cada frame. Isso é linear, não exponencial, então o jogo nunca fica impossível de verdade — ele só fica mais rápido até um ponto onde os reflexos humanos simplesmente não acompanham mais.
Método para rodar uma versão modificada localmente
A maneira mais direta é baixar o source completo e abrir em um servidor local simples. Eu uso um script Python de uma linha porque é mais rápido do que configurar qualquer coisa pesada.
python -m http.server 8080
Depois disso, abre o index.html no navegador e pronto. O jogo roda sem necessidade de internet, sem extensão nenhuma, sem bloat. O que a maioria das pessoas não sabe é que dá para injetar código customizado usando a Console do DevTools enquanto o jogo está rodando. Eu fiz uma vez um mod que adicionava um modo noturno mudando apenas as cores do Canvas. O patch levou cerca de 40 linhas e levou uns 15 minutos para ficar funcional. Sem framework, sem build step.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Se quiser algo mais estruturado, tem o projeto chrome-dino no GitHub que já vem com patches prontos para speed run, modo infinito, e até variations de obstáculos. Mas o legal é que você não precisa de nada disso. O código tá aí dentro do navegador, basta olhar.
O detalhe que ninguém menciona sobre o dinossauro grande de borracha
A detecção de colisão por AABB é o maior defeito do jogo. O hitbox do T-RX é muito maior do que o sprite visual. Isso significa que em algumas situações o jogo marca colisão quando não há sobreposição real. Eu passei duas tardes debugando isso porque meu agente de RL estava falhando em jumps que pareciam perfeitamente seguros. A solução foi ignorar o hitbox nativo e implementar um sistema próprio baseado em pixel-perfect com threshold de transparência. O canvas do jogo já exporta os dados de pixel via getImageData. Com isso, você verifica apenas os pixels não-transparentes do dinossauro contra os dos obstáculos. O resultado é muito mais preciso. Claro, fica mais lento. Mas pra simulação o ganho vale o custo.
Outro problema real: o jogo original tem um seed fixo para a geração de obstáculos. Isso significa que a sequência de cactos e pterodáctilos é sempre a mesma em cada partida. Parece inocente, mas se você estiver construindo um benchmark ou testando agentes, isso distorce completamente os resultados. O workaround que eu usei foi sobrescrever a função generateObstacle com uma versão que usa Math.random() em vez do seed interno. Achei essa informação em um issue aberto no repositório do Chromium, então não é teoria minha — é algo que outros desenvolvedores já bateram a cabeça.
Limitações reais que todo mundo esquece
O jogo original não foi feito para ser modificado. O código é denso, mal comentado, e escrito num estilo antigo de JavaScript que mistura IIFEs com variáveis globais. Se você tentar fazer alterações profundas, especialmente em funcionalidades que tocam no loop principal de renderização, vai notar que pequenas mudanças causam efeitos colaterais estranhos. Já vi gente tentar adicionar power-ups e o jogo simplesmente parar de renderizar os sprites porque a ordem de chamada das funções quebrava o timing do frame. Além disso, o Chrome atualiza o source do jogo periodicamente. O que funcionava numa versão pode parar de funcionar na próxima. Se você estiver mantendo um projeto dependente disso, precisa verificar isso de tempos em tempos. Não é algo crítico, mas é um ponto de fragilidade que ninguém avisa.
Se o objetivo for apenas jogar ou estudar o código de forma pontual, não tem problema. Se for construir algo que depende do jogo como base, considere partir para um fork ou reimplementação. Há projetos como dino-game e chrome-dino-runner que já fazem essa separação de forma mais limpa, com TypeScript e estrutura modular. O trade-off é que você perde a fidelidade exata ao original, mas ganha manutenção. O link direto para o source oficial do Google não existe como download formal. O acesso mais confiável é via DevTools > Sources, procurando por dino.js no árvore de recursos. Tem também o repositório do Chromium no GitHub com o arquivo em chrome/browser/resources/mouse_mail/dino/, que é a fonte mais recente disponível publicamente.
Em resumo, o dinossauro grande de borracha é muito mais do que uma distração quando a internet cai. O código-fonte exposto, a mecânica previsível e a possibilidade de modificação via console fazem dele um laboratório acessível pra quem quer brincar com JavaScript, IA ou game development sem precisar baixar nada. Só tenha em mente os problemas de hitbox e seed antes de confiar nos resultados que o jogo fornece nativamente.