読者です 読者をやめる 読者になる 読者になる

K3の住民

最近はレア社のゲームについては書いていませんが、一応レア社のゲームが一番好きな人です。『雪圀』で"圀"は"国"とほぼ同義ですが、国ではありませんって当たり前か(笑)。

SMW「ハナちゃん無限増殖バグ」の謎を徹底的に推察してみた。

(いみがない)

意味は無いですが、ただ単にスーパーマリオワールド(以降SMW)に存在するバグ
「ハナちゃん無限増殖バグ」について、何故起こるのかを推察するだけの記事です。


最初にこのバグについて紹介しましょう。

スーパーマリオワールド ~無限のスコア~

以上の動画がバグの内容です。このように、ハナちゃんだけ踏みまくるとバグって
謎の無限増殖が可能になる、と言うものです。

先ず、何故他の敵には起こらないのにハナちゃんだけには起こるのか。ここが今回
のミソと言っても良いでしょう。
ハナちゃんは踏まれると怒るだけで、やられません。踏まれた後は、スコアが増え
ません。ここがポイントです。
ここでハナちゃん以外の敵を踏んだときと同じような処理にすると、怒っている
状態でもスコアが増えるようになってしまい簡単に無限増殖が可能となってしまい
ます。つまり、ハナちゃん以外の敵とハナちゃんは踏んだときの処理を別々にする
必要があります。よってハナちゃんを踏んだときだけのプログラムを間違えても
おかしくないわけです。
その間違えた部分がスコアを一定以上増やさない処理です。SMWは残機数が増え
始めると獲得スコア数がそれ以上上昇しなくなります。しかしハナちゃんを踏んだ
ときの処理ではそれを書くのを忘れてしまった為に、本来1UP→1UP→1UPであるのが
1UP→2UP→3UPと言う感じになってしまっています。

次に何故残機数が増え始めて5回目以降ハナちゃんを踏むとただのコインになって
しまうのでしょうか。これは踏み続けて1UPする処理の正体がコインを100枚入手
したという処理である為では無いかと思われます。恐らくコインの上限は511枚
((2^9)-1 = 511)でそれを超えるとオーバーフローになってしまいます。
オーバーフローになってしまうと普通はマイナスになりますが、コインのデータ型
は多分符号無しなのでマイナスになることは無いでしょう。一定以上機数を増殖する
とコインに変化するのはこれが原因だと思います。
ハナちゃんを踏み続けているとき獲得するスコアは2倍になります。ただ単に2倍に
なるのでは無く、上1桁が8以上だと初期スコアの10倍が獲得スコアとなります。
ここで、スコアが10000以上であったとき1UPするとすると、増える残機の法則性
も辻褄が合うのです。先ずこのバグでは1UP→2UP→3UPと増える残機数が増えます。
この次は4UPだと思われるでしょう。ところが、その次は5UPです。それについては
ちゃんとした理由がありますので、それを解説していきましょう。先ずハナちゃんの
スコア加算は100から始まり、そこから2倍されていきます。ですから、このように
計算されるはずです。

m,nの初期値が0であるとすると、
ハナちゃんのスコア = (100 * 10^m * 2^n)
その後nは+1される。
ここで、nが3以上になると、mが+1され、nが0になる。

プログラミング的にはべき乗するための関数を一つ作る必要がありますが、
今回はそれとは話が違いますので、省略します。
機数が増える処理も同じように思われます・・・が、大幅に異なります。機数増殖の
条件は最初は10000以上であり、以降は20000*nであると仮定します。加算される
スコアの変数をscrとすると、

nの初期値が0であるとすると、
機数増殖の条件(最初):   n <= 0, scr >= 10000
その後、nは+1される。

機数増殖の条件(二回目以降):n >= 1, scr >= 20000 * n
その後、nは+1される。

となります。ここで、5UPするには、

20000 * 4 = 80000

となり、加算されるスコアが80000以上で無ければならないことが分かります。
ここで、先程の加算するスコアを増やす計算で照らし合わせてみると、4UPは不可能
であること分かります。以下にそれをまとめた表を示す。

表 「機数増殖処理の条件」と「加算スコア増分処理」の比較
機数増殖の条件1000020000400006000080000
加算スコア数100002000040000  80000

最後にオーバーフローを起こしたことによるコインの処理はどうなっているかはここ
は流石バグと言うべきか挙動が未知数です。恐らくコインとは別の何かを参照して
いるのかと思われますが何故か5枚からスタートし、2倍されていって・・・を繰り
返すと、取得枚数が増えたり減ったりするようになるので、よく分かりません。
また、何故かコインが取得した枚数分加算され続ける処理になりますが、恐らく
100*n枚のとき以外に一気に取らないように処理しているのが原因かと思われます。


以上です。どこかのサイトで、「何故ハナちゃんだけそうなるのかが分からない」
というのを見かけたのを思い出したので、適当に作ってみました。この記事は推察
でしかありませんが、理論的に説明出来ないという悩みは無くなったのでは、と
思います。

今回はこれくらいにしときます。