- Nintendo 64向けのスーパーマリオ64デコンパイルプロジェクトをベースに、PlayStation(PSX) 専用へ移植したバージョン
- DualShock振動対応、固定小数点演算への変換、レンダリング最適化など、PS1ハードウェア向けの大規模な修正を含む
- グラフィックプリプロセッサ、テクスチャ圧縮、アニメーションメモリ最適化などの性能改善機能を追加
- 一部のカメラ制御が未完成、衝突やクラッシュの問題、音楽をビルドできないなど、多数の既知のバグが存在
- 古典ゲームのプラットフォーム間移植実験として、レガシーコンソール開発とリバースエンジニアリング研究において意義ある事例
プロジェクト概要
- このコードは Super Mario 64 (J/U/E/SH) 完全デコンパイル版のフォークで、対象は PSXとPC(デバッグ用) のみ
- Nintendo 64向けビルドは、すでにサポートしていない
- 現時点では 米国版(US) ROMのみビルド可能
- ゲームのビルドには元のアセットは含まれておらず、正規ROMからのアセット抽出が必要
主な機能
- DualShock™互換グラフィックを追加し、元の「Rumble Pak Compatible」表記を模倣
- DualShockの大型モーター向けアナログ振動信号と小型モーター向けデジタル信号の両方をサポート
- PSX向けの低精度ソフトフロート実装により、浮動小数点演算の性能低下を最小化
- 固定小数点演算でコードを置き換え、PSX標準の16ビット整数ベクトル・行列を使用
- レンダーグラフワーカーを簡素化して書き直し
- ポリゴン分割(最大2倍) により大型ポリゴン問題を緩和
- RSPディスプレイリストをJIT方式でカスタム形式へ変換し、処理速度を向上
- ディスプレイリストプリプロセッサで不要な命令を削除し、メッシュを最適化
- マリオのアニメーション圧縮(580,632 → 190,324バイト)およびVRAMへの直接配置
- カスタムプロファイラと4bppテクスチャエンコーダを追加
- PSXの透明度の制限を考慮し、六角形の影に置き換え
- (予定) 右アナログスティックによるカメラ回転およびGoddardサブシステムの再実装
既知の問題
- 浮いている木、一部アニメーションが動作しない、またはクラッシュする
- 音楽をビルドできない、効果音の欠落または異常音
- カメラ制御が未完成、特定レベル進入時にクラッシュ
- エンディングシーケンスの読み込み失敗、ラキトゥが登場しない、ポールが動作しない
- テクスチャ個別読み込みによる長いロード時間、PSXの限界によるテクスチャの歪み
- グラフィックプリプロセッサの改善が必要、一部テクスチャの描画エラー、タイトル画面が未完成、ポーズメニューが動作しない
ビルド方法
Linux
mipsel-none-elf-gcc ツールチェーンをインストール後、リポジトリをクローン
baserom.us.z64 ファイルをルートディレクトリに配置
- (任意)
.local フォルダにサウンドトラック .wav ファイル(0〜37)を追加
make 実行時にISOイメージを生成 (build/us_psx/sm64.us.iso)
- ベンチマーク版(
make BENCH=1)はISOなしでELF/EXEのみ生成し、8MB RAM PSX が必要
Windows (未検証)
- MSYS2 をインストール後、
mingw-w64 パッケージを構成
mipsel-none-elf-gcc をインストールし、sm64-psx リポジトリをクローン
baserom.us.z64 ファイルを配置して make を実行
- ビルド成果物はLinuxと同じパスに生成
トラブルシューティング
- gccが認識されない場合、誤ったMSYS2環境を起動していないか確認
- baserom.us.z64が見つからない場合、ファイル位置を確認
- Makefileが見つからない場合、ディレクトリパスを確認
- パッケージエラーの場合、
pacman -Syu および pacman -Su で更新
- mipsel gccの動作確認は
mipsel-none-elf-gcc -v コマンドで検証
- プラットフォームを切り替える際は
make -C tools clean でツールの再コンパイルが必要
プロジェクト構成
actors: オブジェクト動作、Geoレイアウト、ディスプレイリスト
assets: アニメーションおよびデモデータ
src: ゲーム中核のCソース (オーディオ、エンジン、ゲーム、メニュー、移植部など)
textures, text, levels: グラフィックおよびレベルデータ
tools: ビルドツール
lib: N64 SDKコードを含む
貢献
- Pull Request を歓迎
- 大きな変更の前には Issueを登録して議論 することを推奨
1件のコメント
Hacker Newsのコメント
この移植が気に入ったなら、GBAでSM64を完全に新規実装したプロジェクトも面白いかもしれない
YouTube動画を見る
関連記事: The Impossible Port – Super Mario 64 on the Game Boy Advance
N64でもかなり相性が良さそうで、いつかSummerCart64を手に入れて試してみたい
それでも完成まで持っていったのは本当に見事だ
本当に驚くべき成果だ
昔は両方のコンソールを持っていたが、この移植を見ると、N64が1996年当時の**「家庭内SGI」感をどれだけうまく再現していたかを改めて感じる
日本版の輸入N64でMario 64を初めて見たときの衝撃はいまでも鮮明に覚えている
PSXのWipeoutのようなゲームが別の方向へ進化していた時代の多彩なゲーム環境**を思い出す
「Tessellation(最大2倍)」で大きなポリゴンの問題を減らすとしているが、動画では依然としてテクスチャの歪みがかなり目立つ
おそらく2倍では足りないか、レベルジオメトリを作り直す必要がありそうだ
おそらく浮動小数点演算をソフトウェアで処理しているので、perspective-correct mappingはフレームレートに負担が大きそうだ
今後実装されれば、大きなポリゴンを分割してテクスチャ座標の制限問題も解決される予定だ
PS1時代の初期3Dの粗さがまだ残っている
動作映像やスクリーンショットがあるのか気になる。GitHubにない理由は理解できるが
YouTubeリンク
YouTubeリンク
テクスチャの歪みがあると不満を言う人は多いが、それでもこれは本当に驚異的な作品だ
Kazeに触れないわけにはいかない
彼は何年にもわたってMario 64をさまざまな形で最適化してきた人物で、レトロゲームとプログラミングの交差点に興味があるならぜひ見るべきだ
KazeのYouTubeチャンネル
こんなに早く現実になるとは思わなかった
関連動画を見る
PS1にKaze並みの知識を持つ人がいるなら、Mario 32のようなプロジェクトも可能かもしれない
最近は逆コンパイルプロジェクトが爆発的に増えているが、その背景が気になる
たとえば decomp.me のようなツールが代表的だ
こうしたツールは既存バイナリと正確に一致するコードを再構成できるようにし、新しいプロジェクトを素早く立ち上げられるようにしている
さらに、コンソールSDK APIを模倣する移植レイヤーの登場も一因だ
ただし完全一致のためには、古いツールチェーンの異常な挙動を再現しなければならないなど、膨大な労力が必要になる
最近はDreamcast移植も登場し、Star Fox 64やMario Kart 64も複数プラットフォームへ移植されている
関連リスト: awesome-game-decompilations
スクリーンショットがないのは残念だ
「ついに、Super Mario 32だ」