FCドラクエ4のカジノと逃げる8回のバグが起きた仕組み

Author:
Video game controller, isolated on white background

ファミコンのドラクエ4には二つ大きなバグがありました。
カジノで特定のコインを購入すると4Gで買えるというバグと、
ボス戦で逃げるを8回行うと攻撃がすべて会心の一撃になるというバグ。

この二つのバグ、起きる原因は同じなのです。
それを説明していきましょう。

コンピューターの世界は、すべて0と1で表現されます。
高校くらいで2進数って習ったでしょうか。
あれと同じ原理ですね。
3は11、4は100、5は101、6は110と表現されているのです。

ドラクエ4のコインの枚数も、2進数で管理されていましたが、
24ビットしか用意されていなかったのですね。
すなわち1が最大24個までしか入らない。
で、1が24個並ぶといくつになるでしょうか。


正解は16777215。
これをカジノのコイン1枚20Gで割ると、838860.75枚。
すなわち、838860枚までは表現できるのだけど、
838861枚になると入りきらなくなってしまいます。

オーバーフローと呼ばれる現象です。

この時、実際のデータは24ビットから変わらないので、
先頭に入る1がクリアされてしまいます。
すなわち、1000000000000000000000100というデータの先頭1が消え、
価格は100となり、4Gで購入できてしまうのです。

これがカジノバグの原因です。


そして、8回逃げるバグも同様の理由で起こります。

ドラクエ4は、4回逃げると必ず逃げられるようになっています。
そのため、逃げた回数を表す値は2ビット(0~3)しか用意されていません。

オーバーフローが起こった場合、隣のブロックが書き換わってしまうことがあります。
たとえば「スライム」というデータが隣に並んでいた場合、
「スライメ」とかになってしまいます。

この時、隣に並ぶブロックは以下のようになっています。
時の砂を使ったフラグと力がみなぎったフラグが入っています。


というわけで、4回逃げた場合時の砂を使えなくなり、
8回逃げると会心の一撃が出るようになるのです。

C言語を使うプログラマーだとこの手のバグ出しやすいので気をつけましょー。

Share on Facebook
Pocket