久々となった本日のFC改造のモルモットは「エンディングまで泣くんじゃない」MOTHERです。 といっても、あまりやる気がないので、楽勝モードのコードのみ探します。 まずは経験値。 数値サーチで主人公の経験値の最下位バイトが7451番地だと判明したので、 on writeでブレイクポイントを仕掛けて戦闘をします。 すると早速ブレイク。 DB78 ldy #$11 DB7A clc DB7B lda $49 DB7D adc($38),y DB7F sta($38),y <<ここでブレイク DB81 iny DB82 lda $4A DB84 adc($38),y DB86 sta($38),y DB88 iny DB89 lda $4B DB8B adc($38),y DB8D sta($38),y DB8F bcc $DB9D DB91 ldy #$11 DB93 lda #$FF DB95 sta($38),y DB97 iny DB98 sta($38),y DB9A iny DB9B sta($38),y DB9D ldy #$10 DB9F lda($38),y DBA1 jsr $DC24 なにやら下の方に、FFをガシガシ書き込んでいる箇所が見えますね。 そこで、直前の分岐命令"bcc $DB9D"(90 0C)を"bcc $DB91"(90 00)に書き換えて、 分岐を潰してみます。 そして戦闘を終了させると…見事経験値が16777215になりました! …ってレベルとくっついちゃってるよ、あーあ。 続いて所持金、これもサクッと数値サーチでアドレス7410番地と判明。 on writeでブレイクを仕掛けて、とりあえず金を預けたり、売ったり買ったりしてみたんですが、 よくよく考えたらこのゲーム、所持金が変動する前に、過不足が判定されてしまうため、 ストアと連動していません。 というわけで、唯一上限判定が行われているであろう、戦闘終了後預金最大にターゲットを切り替えます。 預金のアドレスは、数値サーチで7412番地だと分かるので、ここにon writeでブレイクを仕掛けます。 DCF5 clc DCF6 lda $4C DCF8 adc $7400,x DCFB sta $7400,x <<ここでブレイク DCFE lda $4D DD00 adc $7401,x DD03 sta $7401,x DD06 lda #$00 DD08 adc $7402,x DD0B sta $7402,x DD0E bcc $DD1B DD10 lda #$FF DD12 sta $7400,x DD15 sta $7401,x DD18 sta $7402,x DD1B rts 流石HAL研。プログラムも分かり易い。 DD12~DD18番地で0xFFを書き込んでいるので、直前の"bcc $DD1B"(90 0B)を "bcc $DD10"(90 00)に書き換えます。 戦闘をしてCDを見に行くと…見事預金残高が16777215$になりました。 引き出すのは面倒だけど、まぁ仕方ないでしょう(~減らないにするとね、行数が増えるの…) さて、次はおなじみ雑魚敵出ないをサーチ開始っ。 と言いたいところなのだが、さて一体どこから手をつけたものか。 とりあえず、敵の出そうな場所を行ったり来たりしてみると、15番地の数値が切り替わっているようなので、 on readでブレイクポイントを仕掛けてみる。 が、しかし、フレームごとに十数回ブレイクしてしまうため、話にならない。 そこで別の手がかりを探したのだが、テレポート移動してみたり、色々見てみてもイマイチつかめない。、 仕方がないのでゼロページをながめてみる。 と、少なくとも敵が出現した瞬間には24番地がインクリメントされている(その他の場合もある)らしい事を発見。 さっそくon writeでブレイクを仕掛けると… 9540 ldx $15 9542 lda $95A0,x 9545 bne $954B 9547 sta $24 <<ここでブレイク 9549 beq $9595 ブレイクした場所はいい。問題はその上の"lda $15"!! なんと先ほどチェックしようとアタリをつけた15番地を参照しているのである。これは怪しい。 さて、念のためその次でテーブル参照されている95A0番地以降を見てみると… 00 00 00 00 00 00 00 00 00 00 00 0C 11 E8 26 2D 34 3D 43 4D 55 5D 65 00 00 00 00 00 6C 74 7C 00 00 00 00 00 00 00 00 00 00 E0 00 00 8D 95 9C A7 00 AD 00 00 B5 BD C5 CD 00 00 D6 00 00 00 DC 00 ここで、対応表を作ってみると… マイホーム 1B=00 マイホーム周辺 01=00 マザーズデイ 02=00 マザーズデイ周辺 0B=0C サンクスギビング 03=00 サンクスギビング南 0F=2D デパート 22=00 ホーリーローリーマウンテン 35=BD と言う風に、敵のでない場所ではAレジスタに0x00が代入されている(おそらく敵の出現テーブルだろう) ということは、"lda $95A0,x"(BD A0 95)を"lda $95A0"(AD A0 95)にすれば、常に0x00が代入され、 敵が出現しなくなるはずである。 結果は見事成功。やれやれである。 さて、先ほど雑魚敵出ないのサーチ課程で、テレポート移動をためしたのだが、 その際、1F番地が移動速度であることが発覚。ついでなのでこれも調べてみる。 on readでブレイクポイントを仕掛けてみると、 EAA1 ora $1F <<ここでブレイク EAA3 sta $E7 面倒なので"ora $1F"(05 1F)を"ora #$1F"(09 1F)にしてみると、移動速度が超高速に! しかし副作用として町の人の動きまで超高速に(笑) まぁ、馬鹿コードの範疇と言うことで。 それでは暗号化します。 戦闘終了後経験値16777215 FC0466DA 戦闘終了後預金16777215 FCCEDB64 雑魚敵出ない AD82F366 超高速移動 A5806DC2