- Uma versão portada exclusivamente para PlayStation (PSX) com base no projeto de decompilação de Super Mario 64 para Nintendo 64
- Inclui grandes modificações adaptadas ao hardware do PS1, como suporte à vibração DualShock, conversão para matemática de ponto fixo e otimizações de renderização
- Adiciona melhorias de desempenho, como pré-processador gráfico, compressão de texturas e otimização de memória de animações
- Há vários bugs conhecidos, como controle de câmera incompleto, problemas de colisão e crashes e impossibilidade de compilar a música
- Um experimento de portabilidade entre plataformas de um jogo clássico, sendo um caso relevante para desenvolvimento em consoles legados e pesquisa em engenharia reversa
Visão geral do projeto
- Este código é um fork da versão completamente decompilada de Super Mario 64 (J/U/E/SH), voltado apenas para PSX e PC (para depuração)
- Builds para Nintendo 64 não são mais suportadas
- No momento, só é possível compilar a ROM da versão americana (US)
- A build do jogo não inclui os assets originais, sendo necessário extrair os assets de uma ROM legítima
Principais recursos
- Adição de gráficos compatíveis com DualShock™, imitando a indicação original “Rumble Pak Compatible”
- Suporte tanto a sinais analógicos de vibração para o motor grande do DualShock quanto a sinais digitais para o motor pequeno
- Implementação de soft float de baixa precisão para PSX, minimizando a perda de desempenho em operações de ponto flutuante
- Substituição de código por matemática de ponto fixo, usando vetores e matrizes inteiros de 16 bits, padrão no PSX
- Simplificação e reescrita do render graph walker
- Subdivisão de polígonos (até 2x) para reduzir problemas com polígonos grandes
- Conversão de RSP display lists para um formato customizado via JIT, acelerando o processamento
- Pré-processador de display lists para remover comandos desnecessários e otimizar meshes
- Compressão das animações do Mario (580.632 → 190.324 bytes) e colocação direta na VRAM
- Adição de profiler customizado e codificador de texturas 4bpp
- Substituição por sombras hexagonais levando em conta as limitações de transparência do PSX
- (Planejado) rotação da câmera com o analógico direito e reescrita do subsistema Goddard
Problemas conhecidos
- Árvores flutuando, algumas animações não funcionam ou causam crash
- Impossibilidade de compilar a música, efeitos sonoros ausentes ou com som incorreto
- Controle de câmera incompleto, crash ao entrar em certos níveis
- Falha ao carregar a sequência final, Lakitu não aparece, pole não funciona
- Tempos de carregamento longos por causa do carregamento individual de texturas, distorção de texturas devido às limitações do PSX
- O pré-processador gráfico precisa de melhorias, erros de renderização em algumas texturas, tela de título incompleta, menu de pausa não funciona
Como compilar
Linux
- Instale a toolchain
mipsel-none-elf-gcc e depois faça o clone do repositório
- Coloque o arquivo
baserom.us.z64 no diretório raiz
- (Opcional) Adicione arquivos
.wav da trilha sonora (0~37) na pasta .local
- Ao executar
make, uma imagem ISO será gerada (build/us_psx/sm64.us.iso)
- A versão de benchmark (
make BENCH=1) gera apenas ELF/EXE, sem ISO, e requer PSX com 8 MB de RAM
Windows (não testado)
- Instale o MSYS2 e configure os pacotes
mingw-w64
- Instale
mipsel-none-elf-gcc e faça o clone do repositório sm64-psx
- Coloque o arquivo
baserom.us.z64 e execute make
- Os artefatos de build serão gerados no mesmo caminho do Linux
Solução de problemas
- Se o gcc não for reconhecido, verifique se o ambiente correto do MSYS2 está sendo executado
- Se o
baserom.us.z64 estiver ausente, confira a localização do arquivo
- Se o Makefile não for encontrado, verifique o caminho do diretório
- Em caso de erro de pacote, atualize com
pacman -Syu e pacman -Su
- Para confirmar se o mipsel gcc está funcionando, use o comando
mipsel-none-elf-gcc -v
- Ao trocar de plataforma, é necessário recompilar as ferramentas com
make -C tools clean
Estrutura do projeto
actors: comportamento de objetos, layouts geométricos, display lists
assets: animações e dados de demo
src: código-fonte principal em C do jogo (áudio, engine, jogo, menus, port etc.)
textures, text, levels: dados gráficos e de fases
tools: ferramentas de build
lib: inclui código do SDK do N64
Contribuição
- Pull Requests são bem-vindos
- Antes de mudanças grandes, é recomendado abrir uma Issue e discutir primeiro
1 comentários
Comentários do Hacker News
Se você gostou desse port, talvez também ache interessante o projeto que reimplementa totalmente o SM64 no GBA
Ver vídeo no YouTube
Artigo relacionado: The Impossible Port – Super Mario 64 on the Game Boy Advance
Parece que também combinaria bem com o N64, e algum dia quero arrumar um SummerCart64 para testar
Ainda assim, é realmente incrível que tenham conseguido terminar
É uma conquista realmente impressionante
Eu tinha os dois consoles na época, e ver esse port me faz perceber de novo como o N64 capturava bem aquela vibe de “SGI em casa” em 1996
Ainda lembro vividamente do impacto de ver Mario 64 pela primeira vez num N64 importado do Japão
Isso me faz lembrar do ecossistema variado de jogos daquela época, quando títulos como Wipeout no PSX seguiam por um caminho bem diferente
Dizem que “Tessellation (até 2x)” reduz o problema dos polígonos grandes, mas no vídeo a distorção de textura ainda é bem forte
Talvez 2x não seja suficiente, ou então seja preciso refazer a geometria das fases
Provavelmente porque estão fazendo operações de ponto flutuante via software, então perspective-correct mapping deve pesar demais no frame rate
Quando isso for implementado mais à frente, os polígonos grandes devem ser subdivididos, o que também resolverá o problema do limite das coordenadas de textura
Ainda permanece aquela aparência bruta do 3D inicial da era PS1
Fiquei curioso se há algum vídeo de execução ou capturas de tela. Entendo por que não está no GitHub
Link do YouTube
Link do YouTube
Muita gente está reclamando da distorção de textura, mas ainda assim isso é um trabalho realmente impressionante
Não dá para deixar de mencionar o Kaze
Ele vem otimizando o Mario 64 de várias formas há anos, e vale muito a pena acompanhar se você se interessa pela interseção entre jogos retrô e programação
Canal do Kaze no YouTube
Eu não imaginava que isso se tornaria realidade tão rápido
Ver vídeo relacionado
Se existir alguém com o nível de conhecimento do Kaze sobre PS1, talvez um projeto como Mario 32 também seja possível
Ultimamente houve uma explosão de projetos de decompilação, e fiquei curioso sobre o motivo
Um exemplo bem representativo é o decomp.me
Essas ferramentas permitem reconstruir código que corresponde exatamente ao binário original, o que ajuda novos projetos a começarem rapidamente
O surgimento de camadas de portabilidade que imitam as APIs dos SDKs dos consoles também contribuiu
Ainda assim, é preciso um esforço enorme, inclusive para reproduzir comportamentos anômalos de toolchains antigas a fim de obter correspondência perfeita
Recentemente também saiu um port para Dreamcast, e Star Fox 64 e Mario Kart 64 também foram portados para várias plataformas
Lista relacionada: awesome-game-decompilations
Uma pena não ter capturas de tela
“Finalmente, Super Mario 32”