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