人気ブログランキング | 話題のタグを見る

特殊モンスターハウスのモンスター出現率のバグ

web拍手で指摘を頂いたのですが、特殊モンスターハウスに出現するモンスターの出現率が、開発者の意図したようにはなっていないようなので、調べてみました。
その他のROMイメージ改造で、次のように書きました。

039764以降 種族データのオフセット
03976E以降 種族データ
039792以降 種族データのサイズ

本来の設定は次の通りです。バイナリエディタで確認しながら見て下さい。

どろぼう:ガマラ,ガマラ,ガマラ,ガマラ,ぬすっトド,ぬすっトド,ぬすっトド,ぬすっトド
ドレイン:吸引幼虫,吸引幼虫,くねくねハニー,くねくねハニー,まわるポリゴン,まわるポリゴン
1ッ目:吸引幼虫,吸引幼虫,ぴーたん,ぴーたん,ゲイズ,ゲイズ,アイアンヘッド,アイアンヘッド
ゴースト:死の使い,死の使い,エーテルデビル,エーテルデビル,パコレプキン,パコレプキン,セルアーマー,セルアーマー
パワー:ナイフゲータ,アイアンヘッド,タウロス,デブータ,火炎入道,キグニ族

しかし、データを読み込むプログラム(03973B以降)にバグがあります。これは書き換え版でも修正されていません(書き換え版ではアドレスがずれています)。
種族データのオフセットが2バイトずつなので、それを読み込む為に引数である$00(特殊モンスターハウスの種類)を2倍にして"X"に入れ、LDA $039764+"X"としてオフセットを読み込みます。
この後、0~7の乱数を発生させて$039792+"X"と比較して、前者が後者以上だと乱数生成をやり直すようになっているのですが、2倍にされた"X"を1/2倍する処理を忘れています。その結果、種族データのサイズとして読み込まれるデータは1バイトずつ飛び、次のプログラム(039797以降)にまではみ出してしまいます。
更に、種族データのサイズは1バイトずつなのにも拘わらず、比較する時点で2バイトモードを1バイトモードにするのを忘れています。その結果、この比較処理は意味がなくなり、本来6バイト分しか用意されていないドレイン、パワーハウスのデータは2バイトはみ出してしまいます。
それでも、不幸中の幸いと言うか、偶然にもドレインハウスの次の2バイトは1ッ目ハウスの吸引幼虫*2、パワーハウスの次の2バイトは種族データのサイズである08 06(種族データと見なすと火炎入道、デブータ)なので、意図しないモンスターが出たりはしません。だから気付かれなかったのしょう。
ということで、実際は次の表から等確率で選択ということになり、出現する種族に偏りが出ます。それにしても、あまりにも初歩的なミスの連続なのですが、よく大した不具合が起こりませんでしたね。

どろぼう:ガマラ,ガマラ,ガマラ,ガマラ,ぬすっトド,ぬすっトド,ぬすっトド,ぬすっトド
ドレイン:吸引幼虫,吸引幼虫,くねくねハニー,くねくねハニー,まわるポリゴン,まわるポリゴン,吸引幼虫,吸引幼虫
1ッ目:吸引幼虫,吸引幼虫,ぴーたん,ぴーたん,ゲイズ,ゲイズ,アイアンヘッド,アイアンヘッド
ゴースト:死の使い,死の使い,エーテルデビル,エーテルデビル,パコレプキン,パコレプキン,セルアーマー,セルアーマー
パワー:ナイフゲータ,アイアンヘッド,タウロス,デブータ,火炎入道,キグニ族,火炎入道,デブータ
by oyasen | 2010-07-04 14:51 | 改造・解析
<< web拍手への返信 その8 スプライトの圧縮 >>