裏CHUNSOFT > ゲーム解析入門 > 4.道具を落とす確率のバグ修正

4.道具を落とす確率のバグ修正

道具を落とす確率のバグを修正してみましょう。 このバグは、次の命令で道具の落としやすさを読み込む際に、レベル毎に分岐していないのが原因です。

02017C	22 5F F6 C3  JSL $03F65F     ; $00 = (乱数)
020180	A5 00        LDA $00         ; "A" = $00
020182	29 3F        AND #$3F        ; "A" = "A" and 3F (00〜3Fの乱数を作る)
020184	DF E2 96 C2  CMP $0296E2+"X" ; "A" - (種族"X"レベル1の道具の落としやすさ)
020188	B0 17        BCS #$17        ; 上の結果が非負のとき道具を決める処理を飛ばす

レベル毎に分岐する処理は長くなるので、02E000以降の空き領域に入れることにして、バグの核心である020184を、02E000へのジャンプ命令で上書きすることにします。

020184  20 00 E0     JSR $E000       ; 02E000にジャンプ
020187  EA           NOP             ; 何もしない

対象となるモンスターのキャラ番号はこの時点で"Y"に入っていて、レベルも既にメモリに書き込まれているので、それを読み込んで、その値毎に分岐することにします。

02E000  48           PHA             ; "A"をスタックに待避
02E001  B9 19 86     LDA $8619+"Y"   ; "A" = キャラ番号"Y"のレベル
02E004  C9 01        CMP #$01        ; "A" - 01
02E006  D0 06        BNE #$06        ; 上の結果が00でなければ02E00Dへ
02E008  68           PLA             ; 乱数をスタックから"A"に戻す
02E009  DF E2 96 C2  CMP $0296E2+"X" ; "A" - (種族"X"レベル1の道具の落としやすさ)
02E00D  60           RTS             ; 020188へ戻る
02E00E  C9 01        CMP #$02        ; "A" - 02
02E010  D0 06        BNE #$06        ; 上の結果が00でなければ02E017へ
02E012  68           PLA             ; 乱数をスタックから"A"に戻す
02E013  DF 22 9C C2  CMP $029C22+"X" ; "A" - (種族"X"レベル2の道具の落としやすさ)
02E017  60           RTS             ; 020188へ戻る
02E018  68           PLA             ; 乱数をスタックから"A"に戻す
02E019  DF 62 A1 C2  CMP $02A162+"X" ; "A" - (種族"X"レベル3の道具の落としやすさ)
02E01D  60           RTS             ; 020188へ戻る

従って次のように変更すれば良いです。

変更前
020180 A5 00 29 3F DF E2 96 C2 B0 17 AF EE D5 7E C9 08
……
02E000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02E010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
変更後
020180 A5 00 29 3F 20 00 E0 EA B0 17 AF EE D5 7E C9 08
……
02E000 48 B9 19 86 C9 01 D0 06 68 DF E2 96 C2 60 C9 01
02E010 D0 06 68 DF 22 9C C2 60 68 DF 62 A1 C2 60 FF FF

2010年8月8日更新

裏CHUNSOFT > ゲーム解析入門 > 4.道具を落とす確率のバグ修正