ファミコンのドラクエ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言語を使うプログラマーだとこの手のバグ出しやすいので気をつけましょー。