ついに来ましたお題「ファミコン」!
実はここ 1〜2週間くらいファミコン自体にハマって、寝る前にスマホでファミコンを調べたりしてました。
きっかけはこの動画で、わずか 40kb (mp3 でいうと2秒)のデータ量で4人同時のアクションゲームを作ってしまうということに驚いて、どのように実装されているのか、ファミコンの仕様自体がどうなってるのか気になって追ってたりしてました。
英語ですが、動画で親切に教えてくれてるので興味があれば是非見てみて下さい!
と、前置きはこれくらいにして、みなさまドラクエやってますか?
ストーリー良し、音楽良し、キャラクター良しのあのドラクエです。
私はRPGといえばドラクエで全作やってきましたが、特に子供の頃にやったドラクエ(ドラクエ5くらいまでかな)については特に思い入れが強いです。
今回はその思い入れの強いドラクエ4で有名な裏技 "8逃げ" を題材に、システム系の問題でたまに聞くオーバーフローについて説明してみようと思います。
※ 8逃げ:ボス戦中に8回逃げると、以後全ての攻撃が会心の一撃になるという裏技
何故8逃げが題材かというと、8逃げ自体は想定されていた裏技ではなくオーバーフローで引き起こされたバグだからです。このため8逃げが発生する仕組みを追うことでオーバーフローを理解できる算段です。
ということでまずは逃げるを行うとデータ上はどのような動きがあるのか追ってみましょう。
簡単にエクセルでメモリのイメージ図を作ってみました(※ あくまでイメージ)。
ドラクエ4 では逃げる回数によって逃走率を変える仕組みが備わっています。
・1〜2回目: 50%
・3回目: 75%
・4回目: 100%
メモ:通常戦闘では上記の通り4回目で必ず逃げてしまうため、8逃げを行う場合は逃げることができないボス戦で行う必要があります。
そのため何回逃げたかを把握する必要があり、それをメモリ上で管理しています。
たとえば3回逃げた場合は、1のフラグと2のフラグを立てて(1+2 = 3)のように表現しています。
もう一度逃げると桁が繰り上がり、下記の状態となります。
そのまま7回目まで逃げると(4+2+1 = 7)で下記の状態になります。
では、さらにもう一度逃げるとどうなるでしょうか?
はい、シンプルにそのまま桁が繰り上がります。
逃げる回数を管理しているメモリ領域からはみ出る状態になります。この事象がオーバーフローとなります。
では何故こうなると会心の一撃が出続けるのかということですが、実はここのメモリ領域はパルプンテの「ちからがみなぎってきた」状態を管理しています。
この「ちからがみなぎってきた」というのは、みなさま御存知の通り「戦闘中ずっと会心の一撃がでる」といった効果のもので、裏技の事象に繋がります。
といったところで説明終わりです。
この通りオーバーフローはカッコいい名前は付いていますが、発生している内容自体は「制限入れずに加算してたら管理外のメモリ領域までいっちゃった!」というものすごくシンプルな事象です。
特にファミコン時代はメモリは高価で少しの領域も無駄にできなかったため、ギュウギュウにメモリを使っていたので発生しやすかったのかと思います。ただ、ドラクエ4についてはもう一つの有名なバグ "838861" についても同様にオーバーフローバグが原因なので、少しデバッグが足りていなかったのかもしれないです。
当時は何も考えずに、ただただ会心の一撃がずっとでるといったことに夢中でしたが、大人になってからその原因が分かり納得するといった流れはなんとも言えない感覚になります(笑)
ぜひみなさまも昔のゲームを振り返ってみてはどうでしょうか。
昔できなかったゲームをクリアするのも結構楽しいのでおすすめです!
説明では逃げた回数と話してましたが、実は4の位は「ときのすな」を使った場合に利用されるメモリ領域です
このため、わざわざ8回逃げなくても、"ときのすな”を使ってから4回逃げれば同様にオーバーフローを引き起こすことが可能です。
また、このバグは後期に発売されたバージョンでは修正されているらしいので、試す場合は初期バージョンのものをお使い下さい(説明書の最終ページの右下に第2版と記載されているのが後期バージョンです)
未だにファミコンソフトは処分できずに持ってます。これは捨てられない、、
※ このアカウントが作成した記事にトークンは付与されません
※ このアカウントが作成した記事は人気記事に表示されません