わずか「40KB」のファミコンゲームを作るための方法

任天堂が1983年に発売したファミリーコンピュータは数々の名作ゲームを生み出しましたが、これらは現在のゲームとは比べものにならないほど低画質であり、データ容量もかなり少なく抑えられています。そんなファミコン向けにゲームを製作しようと考えると、わずか40KBほどにデータを収める必要があるそうで、そのための秘訣をゲームデベロッパーのMorphcat Gamesが解説しています。
How we fit an NES game into 40 Kilobytes - YouTube

8ビット風のレトロゲームが映る画面

コントローラーから、プレイしているのは海外版ファミコンのNESであることがわかります。

そんなファミコンおよびNESは、ゲームのデータ容量が40KB程度しかありません。スマートフォンのストレージが数GBの時代に「40KB」と言われてもピンとこない人もいるかと思いますが……

MP3の音楽データでいえば、わずか2秒分に相当します。

今から35年前に日本で発売されたファミコンゲームのデータ容量はわずかこれっぽっちしかなかったわけです。

あの名作ゲーム「スーパーマリオブラザーズ」も40KBしかありませんでした。さまざまなゲーム機で登場しているゲームなので、1度はプレイした経験があるという人も多いはずですが、これがまさかわずか40KBのデータで構成されているとは想像だにしません。

そんなファミコン向けに新しくゲームを開発しようと考えたのが、ゲームデベロッパーのMorphcat Games。構想したゲームの種類はラン&ガン、そしてマルチプレイにも対応できるようにすることを目指したそうです。

NESのカセットを解体すると、中に基板やメモリがあります。

ファミコンはCPUに「6502」を採用していました。カセットROMの40KBという容量は、8KBがキャラクターデータが入った「CHR-ROM(charcter ROM)」、残りの32KBがコードやその他データの入った「PRG-ROM(Program ROM)」です。

8KBの中に収める必要があるデータは、動きのある「スプライト」と「背景」の2つに分けることが可能。「スプライト」と「背景」のデータは、どちらも8×8ピクセルのドット絵を256種記録することができると考えておけばOK。

画面左の16×16の256マスがスプライトを保存できる容量とすると、1マス当たり画面右の8×8マス分のピクセル絵を記録可能で……

このピクセル絵を4つ合成することで1つのキャラクターを表現することが可能になります。これがメタスプライト。

ファミコンでは各スプライトごとに4つの色を指定できるようになっているので、色情報をメタスプライトに反映させれば、以下のようにカラーバリエーションを用意することもできます。

しかし、ファミコンには「同じ水平線上には8つまでしかスプライトを表示できない」という技術的な制限が存在しており、以下のようにキャラクターを4人+敵キャラクターを表示してしまうと、同一水平線上にスプライトが10個存在してしまい、表示できなくなってしまうという問題があります。

そこで、Morphcat Gamesはキャラクターをメタスプライトで表示するのではなく、スプライト単位で表示することに決めます。

すると、4人プレイ時でも同一水平線上には敵を含めても5つのスプライトしか存在せず、技術的な制限を気にすることなくゲームをプレイできるようになります。

スーパーマリオブラザーズを例にすると、メタスプライトでキャラクターを表現するとマリオのグラフィックだけでスプライトに割けるデータ容量の3分の1程度を占めてしまうのですが……

Morphcat Gamesが取った「1つのスプライトで1キャラクターを表現する」という方法ならば、主人公となるキャラクターのデータ容量を以下のよう大幅に減少させることが可能。

アクションもののゲームで重要になってくる敵キャラクター。これももちろんスプライトの中に含まれます。さすがに敵キャラクターはプレイヤーが操作するキャラクターよりもサイズが大きく、メタスプライトを4つ合わせたビッグメタスプライトで表現されています。

この敵キャラクターは、以下のように15種類の絵で表現されており……

これをそのまま保存しようとすると、スプライトに割り振られたデータ容量をオーバーしてしまうことは確実。

そこで、以下のように敵キャラクターを縦に3分割して……

各パーツ毎に差分をチェックします。15種類あった敵キャラクターの絵ですが、頭部分だけで見ると差分は3通り。

さらに、これをスプライト毎に分解。頭の左端はすべて同じデータなので……

ひとつだけ残しておけばOK。

さらに、左右反転すれば同じ形になるデータも削除していくと……

なんと4つのスプライトで敵キャラクターの頭パーツの動きは表現できてしまいます。

同じ要領で、顔パーツと……

ヒラヒラパーツも無駄なデータを削除します。

すると、敵キャラクターはわずか21個のスプライトで表現することが可能であることが明らかに。

256種類のスプライトしか保存できないことを考えると、かなりのデータの節約になっていることは明らかで、これによりより多くのキャラクターやオブジェクトを追加できるようになります。

続いて、「背景」部分について。

背景を8×8ピクセルの絵を32×32種類使って表現すると……

色情報を含めると960バイトもの要領が必要となります。

しかし、16×16ピクセルの絵を16×16種類使うとなると、240バイト。32×32ピクセルの絵を8×8種類使うとなると、60バイトで済むこととなります。

この要領で、背景の表示に必要となるデータ量を節約。

それでも背景だけで60バイトというのは、ゲーム全体でみるとあまりに大容量すぎるということで……

マップを左右で半分にカットし、鏡のように左右を反転させることでデータを節約するという方法が提案されます。そうすれば、60バイトかかっていたものが30バイトで済むことになるわけですが……

すべてのマップが左右対称では面白みがない、ということで却下されます。

マップを構成する8×8種類の絵(メタメタタイル)は……

1バイト、つまりは8ビットで表現されます。

8ビットというのは0か1の数字8つで表現することが可能。

例えば以下のメタメタタイルは以下のように表現できるわけです。

しかし、背景に使用されているメタメタタイルの数が少ないため、すべての種類を8ビットで表現しても頭の1ビット分が未使用になることに気づきます。

そこで、同一水平線上に配置された4つのメタメタタイルおよび左右反転で表現された鏡写しのメタメタタイルの合計8つの基本位置を以下のように設定した場合……

使われていなかった1ビット×4を使い、背景を横にずらすことで左右対称ではない背景を作り出す、というアイデアをMorphcat Gamesは思いつきます。


そうしてデータを節約しながらも左右対称ではないマップが完成。

ここまでデータを節約したことで、Morphcat Gamesはわずか40KBのゲームにハードモードを追加することが可能になりました。通常のハードモードといえば敵が強くなるなどですが……

Morphcat Gamesは使用する色パレットを変更し、レベルデザインを変更することでハードモードを表現することに決めます。

そして、マップ上の変更を加える部分にだけ焦点を当てることで、マップをいちから作り直す必要をなくすことに成功。

そうしてできあがった、ハードモード用のステージが以下の右のマップ。

こんな感じでMorphcat Gamesがデータを節約しながらも工夫を凝らして作成したNES向けの新作ゲームが「Micro Mages」で、記事作成時点では製品化に向けてクラウドファンディングサイトのKickstarterで出資を募っています。プロジェクトの目標金額は1万5000ユーロ(約190万円)でしたが既に4万ユーロ(約500万円)以上が集まっているので製品化はほぼ確実。8ユーロ(約1000円)の出資でダウンロード版のMicro Magesが入手でき、他にも物理カセットが入手できる出資プランも用意されています。
なお、Micro Magesへの出資は2018年10月5日17時23分までです。
Micro Mages: A new game for the NES by Morphcat Games — Kickstarter

・関連記事
あのファミコンが小型化した「ニンテンドークラシックミニ」レビュー、懐かしさの中で感じるゲームの進化 - GIGAZINE
ロシアにゲーム市場を誕生させた伝説の海賊版ファミコン「Dendy」とは? - GIGAZINE
プログラミング不要で誰でも簡単にファミコンのゲームが作成可能な「NESmaker」 - GIGAZINE
初代「星のカービィ」はキーボードではなくツインファミコンで開発された - GIGAZINE
フィンランド独立100周年を記念した新作ファミコンゲームが登場 - GIGAZINE
・関連コンテンツ
You can read the machine translated English article A way to make NES game of only '40 KB'….