O que é super mario street e como ele funciona na prática
Você provavelmente já viu esse termo circulando em fóruns de ROM hacking e comunidades de Speedrun. A coisa mais confusa no começo é que existem várias ferramentas e projetos diferentes que usam nomes parecidos. super mario street é um projeto que pega a engine original do Super Mario Bros para NES e a reconstrói num motor moderno, permitindo criar levels customizados sem depender do FCEUX ou dos tools clássicos de desenvolvimento. Os arquivos que você encontra online vêm em formatos variados. Alguns são builds completas para Windows, outros são códigos-fonte que você precisa compilar com SDL2 e uma série de bibliotecas que costumam falhar se você tiver uma versão antiga do GCC instalada. O projeto usa uma abordagem baseada em grids que são exportadas em JSON, mas o editor não lê todos os campos que a documentação menciona. Eu descobri isso depois de passar duas horas tentando fazer um blocos especiales aparecer no jogo e ele simplesmente sumir.
Diferença entre super mario street e outros tools de ROM hacking
A maioria das pessoas que começa nesse meio vai direto para o Lunar Magic ou o SMW Randomizer. super mario street segue uma lógica completamente diferente porque ele não modifica o ROM original. Em vez disso, ele implementa um subset dos assets e mecânicas originais em C++ com renderização via OpenGL. Isso significa que colisão, física e sprite updates acontecem num loop separado, não num emulador. O problema prático é que essa separação quebra algumas coisas que qualquer desenvolvedor de ROM hack conhece bem. A tabela de cores paleta do NES tem 64 entradas, mas o overlay moderno só carrega 32. Quando você tenta usar tiles que dependem de paletas alternadas, o visual fica com cores erradas ou completamente transparentes. A solução mais simples é exportar seus levels usando apenas a paleta padrão do primeiro mundo. Se precisar usar paletas alternativas, tem que ajustar manualmente o arquivo de configuração do shader antes de compilar.
Como baixar e instalar o projeto
Vá até o repositório oficial no GitHub, procure por releases e baixe a versão mais recente para o seu sistema operacional. O build pré-compilado para Windows já vem com as DLLs necessárias embutidas, então não precisa instalar nada extra. Para Linux, o processo é mais trabalhoso porque depende do pkg-config estar configurado corretamente. Na maioria das distribuições Debian-based, rodar sudo apt-get install libsdl2-dev libgl1-mesa-dev resolve, mas em Arch você vai precisar do pacote sdl2_image também. Depois de extrair o arquivo, abra a pasta e execute o bário executável. O editor abre com um level vazio e uma toolbar lateral. A interface é minimalista demais na minha opinião, mas funciona. Os comandos principais são: tecla E para editar tiles, B para colocar blocos, H para ativar hints de grid e Ctrl+S para salvar o projeto em formato .sms. Esse último formato é só um JSON compactado com coordenadas de sprites, configurações de música e parâmetros de física personalizados.
Criando um level do zero
Comece escolhendo o tileset certo. O projeto traz quatro conjuntos padrão: Overworld, Underground, Water e Castle. Cada um tem seus próprios tiles de parede, chão e objetos interativos. Selecione o Overworld se estiver criando um stage normal, mas evite misturar tilesets dentro do mesmo level porque a engine não lida bem com transições de paleta no meio do mapa. Para posicionar blocos, clique no tile desejado na toolbar e arraste pelo grid. Use a opção Snap to Grid no menu View para manter tudo alinhado. Se você deixar algo fora da grade, o collision system pode falhar silenciosamente durante o runtime, o que geralmente resulta em personagem caindo pelo mapa ou ficando preso em paredes invisíveis. Isso já me aconteceu diversas vezes e o debug demora porque a engine não faz log de colisão por padrão.
Inimigos e power-ups ficam numa aba separada chamada Entities. Você pode arrastar Goombas, Koopas e question blocks diretamente pro stage. Cada entidade tem propriedades editáveis como velocidade, direção e respawn timer. O question block padrão dá Super Mushroom, mas você pode mudar o output para Fire Flower ou Star Power alterando o campo item_type no arquivo JSON do level. Se quiser um bloco que dê moeda, define o tipo como coin_trigger e a engine gera uma animação simples de moeda subindo.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Exportando e testando seu stage
Quando o level está pronto, pressione F5 para compilar. A primeira compilação demora entre 30 segundos e 2 minutos dependendo da máquina. Builds subsequentes com poucas alterações levam cerca de 8 segundos. Se houver erro no arquivo JSON, o compilador para e mostra a linha problemática na janela de saída. Às vezes o erro é uma vírgula faltando ou um número negativo onde só é aceito inteiro positivo. Corrija e compile de novo. O build gerado é um executável standalone que roda o level exatamente como ele aparece no editor. Aqui tem uma pegadinha que quase ninguém menciona: a renderização no editor pode ser ligeiramente diferente da build final em resoluções específicas. Se você testou apenas na janela do editor e o level ficou bom, espere uma diferença de alguns pixels na build quando rodar em tela cheia. A correção é ajustar a escala do stage nas configurações do projetoele antes de exportar, senão os buracos podem ficar milímetros mais largos no jogo final.
Problemas comuns e soluções
O primeiro problema que a maioria das pessoas encontra é som. O editor requer que você coloque arquivos WAV na pasta audio/do projeto, mas o formato precisa ser 44100Hz mono 16-bit. Se o arquivo estiver em stereo ou com taxa diferente, a engine ignora o som e o nível roda em silêncio total. Eu descobri isso porque passei uma tarde inteira achando que estava fazendo algo errado no código, quando na verdade era só o formato do arquivo de áudio. Outro ponto é a dificuldade de collision em escadas. A engine original do SMB tem uma lógica específica de step height que verifica se há terreno a menos de 8 pixels acima do personagem. No super mario street, essa verificação foi reescrita mas não replica exatamente o comportamento original, então escadas anguladas podem fazer o personagem pular sozinho ou travar em degraus que deveriam ser subíveis. O workaround que eu uso é desenhar escadas em formato de degraus completos sem ângulos parciais, o que evita a maior parte desses problemas.
Se você tentar usar sprites customizados importando imagens PNG diretamente, a engine converte automaticamente usando a paleta disponível. Isso gera perda de qualidade em muitos casos porque a conversão não suporta transparência alpha nem redução de cor avançada. Para sprites customizados de qualidade, o recomendado é usar a paleta de cores exatamente como ela existe no NES, limitando-se aos tons disponíveis. O resultado final fica mais fiel e compatível.
Comunidade e recursos adicionais
O Discord do projeto é o lugar mais ativo para tirar dúvidas. Tem um canal específico para troubleshooting técnico onde desenvolvedores mais experientes ajudam com problemas de compilação e build. Se você precisa de tilesets extras ou templates de stage prontos, há um repositório separado chamado sms-assets que contém contribuições da comunidade organizadas por tema e dificuldade. Quem quer ir além do básico pode estudar o código-fonte aberto. A arquitetura é bem documentada nos comentários do código e facilita muito entender como a engine processa inputs, calcula física e renderiza frames. A compilação a partir do fonte exige ter GLFW3 instalado além das bibliotecas já mencionadas, e o build do cmake precisa ser rodado com flags específicas se você quiser ativar o profiler integrado.
A longo prazo, super mario street se mostrou uma alternativa viável para quem quer criar conteúdo sem depender de emulação ou de ferramentas desatualizadas. A curva de aprendizado é mais íngreme que a de tools visuais tradicionais, mas a flexibilidade que ele oferece compensa quando você entende como a engine funciona por baixo dos panos. A maioria dos problemas que aparecem no começo tem solução conhecida na comunidade, então não adianta travar nos primeiros erros. Teste, leia os logs, ajuste e continue construindo.