
2026/08/04 22:24
2026 年にニンテンドー 64 ゲームを作る方法
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Xibalba 64 は、Modretro の M64 向けの物理カートリッジとして発売される「Wolfenstein 3D」風 FPS で、オリジナルコンソール時代以降、N64向けに物理メディアとして公開された新ゲームとしては 2 作目となります。プロジェクトは 2010 年に開発された「high_impact」JavaScript エンジンを 2 年前に C に移植し、コード変更なしでプラットフォームおよびレンダリング向けのモジュラー型バックエンドを実現しました。Libdragon を MIPS CPU、RDP、RSP のハードウェア抽象化に用いることで、ゴールデンアイ 007 が実機では達成できなかった安定した 60 FPS を実現しました。これには、レイキャスティングによる可視領域のクイリングと、N64 の 4 KB テクスチャ制限を尊重しつつ 64 ビットの描画コールに 17 つの四角形(quad)を詰め込むようなレンダリング最適化が含まれます。レベルエディタは JSON ファイルをバイナリ構造体にコンパイルし、コンソール側での解析を避けることで読み込み時間を短縮しました(約 100 ms の削減)。サウンドはリアルタイムプレイがコストが高いため Opus デコードを採用できなかったことから、4 ビット VADPCM フォーマットで実装されており、ROM の 32 MB のうち約 31 MB を占めています。開発中の正確な RSP/RDP テストには Ares エミュレータの推奨使用がありますが、発売前にメモリ帯域制限を検証するには USB-C を介した SummerCart64 が必須です。開発クレジットは Giovanni Bajo(Libdragon)、Max Bebök(Tiny3D)、および N64brew ディスカードコミュニティに属します。将来のエンジンオープンソース化に関する開発者からのメールを受け取り、Modretro は迅速な出版に合意しました。ボックスアートは以前 Sierra Germanyのパッケージングを手がけた友人によって作成されました。このリリースは、現代の技術がレガシーハードウェアの制限を克服できるとの実証であり、レトロ互換エコシステムの強化と FPS ジャンルの新コンテンツ創出を促進します。
本文
『Xibalba 64』開発記:JavaScript エンジンの C 移植から N64 用ゲームまで
2026 年 8 月 4 日(火)、**『Xibalba 64』**は Modretro 社より、M64(現代における N64 リメイク機)向けカートリッジとして正式に発売されました。
- 作品概要: 『ウルフェンシュタイン 3D』に似た視点型アクションシューティングゲーム(FPS)。
- 歴史的背景: コンソールの商業的生命を終えた後、物理メディアで新作 N64 タイトルが発表された例は極めて稀です(2002 年の『Tony Hawk's Pro Skater 3』以来、約 20 年ぶりの事例)。
- Modretro 社との連携: Bitmap Bureau の『Xeno Crisis』の成功を受け、同社から物理メディアとしての発売決定がなされました。カートリッジ、パッケージング、マニュアルを備え、完全な商業作品としてリリースされています。
Modretro.com の紹介ページより詳細をご覧ください。
エンジンについて:high_impact
開発の根幹を支えるのが、私が 2010 年に制作した JavaScript 製ゲームエンジン「Impact」です。その後、趣味半分で C 言語へ再実装され、現在は「high_impact」と呼ばれています。
Impact と high_impact の概要
- Impact (旧): 2D アクションゲーム向けに設計されたシンプルながら堅牢な JavaScript エンジン(タイルシート処理、背景マップ、スプライト、衝突検知対応)。
- high_impact: 2 年前の「面白かったから」という直感で C 言語へ移植。現在はプラットフォームバックエンド概念を導入し、多様なデバイスに対応しています。
- デフォルトバックエンド:
またはSDL2
をコンパイルオプションで選択可能。Sokol - モジュール化されたレンダリング: ソフトウェアレンダラー、OpenGL、Metal (iOS/macOS) などが追加可能です。
- デフォルトバックエンド:
N64 向けの実装
- Libdragon 統合: 「N64 用の SDL」と呼ばれる高機能なライブラリ「Libdragon」を導入し、新しいプラットフォームバックエンドを構築しました。
- スプライト描画、三角形描画、音声出力、コントローラー入力などに対応。
- ゲームロジックのコード変更は最小限で済みましたが、パフォーマンス調整が必要でした(_naive_方式の初期実装)。
N64 ハードウェアと開発環境
N64 は独特なアーキテクチャを持ち、開発には特殊な知識とツールの組み合わせが求められます。
N64 ハードウェアの特殊性
- CPU: 93MHz の MIPS CPU(ビッグエンディアン)。
- コプロセッサ (RCP):
- RDP (Reality Display Processor): 固定機能グラフィックプロセッサ。
- RSP (Reality Signal Processor): プログラム可能ベクトルプロセッサ。
- 両者は「リアリティコプロセッサ(RCP)」として物理パッケージに搭載されています。
開発環境とツール链
- Libdragon: N64 ROM 構築に必要なコンパイラ一式を提供する標準的なライブラリ。
- ※「preview」ブランチの使用が推奨されます。「stable」ブランチは更新が遅すぎて事実上使用不能です。
- エミュレータと実機検証の両立:
- Ares エミュレータ: RDP/RSP が完全に実装され、特に RSP のタイミング制御も正確に再現されています(ただし、メモリアクセス帯域制限などの「有難い遅延」は依然として実機のみで検証可能)。
- SummerCart64 (実機): 開発には USB-C ポート経由での ROM アップロード機能を備えた本物の N64 カートリッジが必要です。安価な選択肢(AliExpress など)でも機能しますが、基板構成に注意が必要です。
- 低遅延出力設定 (Linux 環境):
- PC と N64 を USB で接続し、10 ドルのアナログキャプチャカードでデスクトップ表示を実現。
との調整により低遅延な出力を達成しました。mpv
ゲーム内容と技術的拡張
JavaScript 版『Xibalba』から N64 版への変遷には、2D から 3D への拡張や物理演算の再構築が含まれます。
3D 化のためのデータ構造変更
high_impact は元々 2D エンジンですが、『Xibalba 64』は 3D グローバルな環境です。
entity_t の定義を拡張し、3 次元座標情報を扱えるようにしました。
typedef struct { float x, y; } vec2_t; // union を用いて、vec2 と vec3 で互換性を確保 typedef union { vec2_t xy; struct { float x, y, z; }; } vec3_t; typedef struct { // ... vec3_t pos; // 現在位置 (x, y, z) vec3_t vel; // 速度ベクトル // ... } entity_t;
- 機能:
のvec3_t
プロパティを引数として渡すことで、2D 系関数も利用可能にします(例:.xy
)。trace(collision_map, entity->pos.xy, ...) - 内部構造の直接アクセス:
など、匿名ユニオン内の値にも直接アクセス可能です。entity->pos.z
レベルコンパイラと JSON → C 変換
レベルデータは JSON ファイル形式で管理されていますが、N64 で直接読み込むと約 100ms のオーバーヘッドが発生するため、ビルド時に C 構造体に変換するコンパイラを開発しました。
- 出力フォーマット: N64 向けにはビッグエンディアン、x86/WASM 向けにはリトルエンディアンで記述し、プラットフォーム間で互換性を確保。
- レベル構造体の例:
typedef struct { uint16_t magic; uint16_t entities_len; uint16_t map_width; uint16_t map_height; // エンティティリスト struct { uint16_t type_id; uint16_t x, y; uint16_t settings_len; // ... 設定値 (name, target, size など) } entities[entities_len]; // マップデータ(衝突判定、床、壁、天井、照明) uint16_t collision_map[map_width * map_height]; uint16_t floor_map[map_width * map_height]; uint16_t wall_map[map_width * map_height]; uint16_t ceiling_map[map_width * map_height]; uint16_t light_map[map_width * map_height]; } level_t;
レベルエディタの拡張
元々の HTML 単体ファイルを大幅に強化しました。
- 機能追加: ライトマップ対応、エンティティ表示のボックス化、設定説明の充実。
- 仕組み: 「ソース・オブ・ザ・トゥルース」である C ソースコードを読み込み、自動的にエンティティタイプや設定を抽出します。
レンダリングと最適化
N64 の制約(4KB のテクスチャメモリ、64x64 ピクセル制限)の中で 60 FPS を達成するための高度な最適化が施されています。
RSP と RDP の連携
- 課題: Libdragon は独自マイクロコードで描画処理を加速しますが、RDP 直接呼び出しでは非効率的です。
- 解決策: Tiny3D ライブラリを採用し、RSP に描画コールを提出し、専用マイクロコードで処理させる手法を取りました。
テクスチャメモリ管理とバッチ処理
- 制約: 4KB の極小メモリ、64x64 ピクセルの制限、厳しいテクスチャアップロードコスト。
- 最適化方針:
- レベルタイルの描画順序を細かく制御し、テクスチャアップロード回数を最小化。
- 同じテクスチャを持つ三角形を 64 ビット単位のコールとして集約(バッチ処理)。
typedef union render_call { uint64_t packed; // ハッシュ化用フィールド uint32_t hashable; // パーソナルフィールド uint64_t ident : 46; struct { uint64_t translucent : 1; // 半透明フラグ uint64_t texture_index : 9; // テクスチャ ID uint64_t x : 10; // 開始 X uint64_t y : 10; // 開始 Y uint64_t w : 8; // 幅 uint64_t h : 8; // 高さ uint64_t vbi : 14; // Vertex Buffer Index uint64_t len : 4; // クアッド数 }; } render_call_t;
レイカスティング(Raycasting)によるセクタ判定
- 課題: ポータルシステムはオーバードロウを起こしたため、より軽量なアプローチが必要でした。
- 実装: ゲーム全体を覆う320 本のビームを射出し、通過したタイルをビットマップとして記録。
- 視野角(320 ピクセル)を再帰的に二分木で分割。
- 2 つのビームが同じタイルに到達するまで細分化する処理を行う。
- スカイボックス: 通過したタイルの天井がない場合は、単一テクスチャを用いた地平線沿いの描画を実装。
テクスチャアップロード回数の削減(4 ビットカラー)
- タイルシートを 1 つの列にまとめ、可能な限り4 ビットインデックスカラーを使用。
- これにより、テキストチャメモリアー fitting できるピクセル数を増やし、連続したメモリエリアでの処理を実現しました。
成果: すべての最適化により、60 FPS を安定して維持(スプリットスクリーンでも滑らか)。対照的に『ゴールデンアイ 007』は頻繁にフレームレートが低下することが知られています。
音声と音楽
- サウンドトラック: 友人のアンドレアス・ローシェ氏による制作。Bandcamp で全曲聴取可能。
- ゲーム内プレイヤー: シングルプレイキャンペーンで解錠可能な組み込みプレイヤーを搭載。
音声デコード技術の限界と突破
- 制約: カートリッジ容量の厳しさから、高品質な音声には大きな計算コストが必要。
- 画期的な解決策: Libdragon メンテナーであるジョバンニ・バージョ氏により、RSP で加速されたOpus デコーダーが実装されました(N64 発売からの約 16 年後の技術)。
- ※リアルタイム使用は依然として高負荷なため、現在は簡易的な4 ビット VADPCMを採用。
- 現状: ROM の 32MB 中約 31MB が音声・音楽に消費されています。
- 将来性: 『Xibalba 64』リリース後、空間・品質・複雑性のバランスを改善する新たな圧縮フォーマットの開発に取り掛かっています。
発売と販売について
Modretro 社は既存の Game Boy クローンマシン「Chromatic」の制作で知られ、ホビスト開発者の新作出版に積極的です。M64 の発表を受け、リリースへ至りました。
開発プロセス
- 契約: 官僚的な手続きは最小限。オープンソース化権利などを認めるとの要望も快く受け入れられました。
- ハードウェア対応: プレプロダクション段階の M64 を入手しましたが、謳い文句通りの動作で、ゲーム側の変更は不要でした。
- パッケージとマニュアル:
- パッケージアート:シエラ社の過去のタイトルデザイン経験を持つ友人が担当し、90 年代風の素晴らしい仕上がりになりました。
- マニュアル:テキスト・イラストを Modretro に提供し、印刷用レイアウトを完了。
成果と感謝
- 販売実績: 発売数日で非常に良い結果を見せています(完全な「退職」の道ではありませんが、素敵な休暇資金としては十分です)。
- 感謝の意:
- Libdragon: ジョバンニ・バージョ氏
- Tiny3D: マックス・ベボーク氏
- N64brew Discord コミュニティ
- Modretro チーム
リソース:N64 開発への推奨ツール集
新しい開発者の方へ、以下のリソースをぜひご活用ください。
- n64.dev – N64 開発に関するすべてを集めたコレクション。
- N64brew Discord – 支援的なコミュニティ。多くのライブラリ開発者が在籍。
- Libdragon – N64 向けシステムライブラリ(事実上の標準)。
- Tiny3D – シンプルで高速な 3D グラフィックスライブラリ。
- Pyrite64 – 3D ゲーム作成用のビジュアルエディタとランタイム。