たまにはメジャー物にも挑戦。今回のなまにえ(何故か変換できない)は、 ファイアーエムブレム~暗黒竜と光の剣~ で行きます。 ただし、アタシこのシリーズ基本的に嫌いなので、文章中毒を吐きまくっています。 ファンの方は、読まない方が吉かもしれません。 (認めたくはないが)一応シミュレーションなので無限行動を探してみる。 とりあえず、手近にいたカインとセットでアベルという、ひねりも何もないユニットの経験値を数値サーチ。 すると0x6AE6番地と判明。 その周辺のアドレスを眺めながら移動、待機などを繰り返すと、0x6AF3番地が行動終了時に0x01に変化しているのを確認。 ここにon writeでブレイクポイントを仕掛ける。 すると C211 lda ($00),y [$7706] C213 sta ($02),y [$6AF3] <<ここでブレイク どうやら一時0x7706番地に格納されているようである。 さらに調べてみると、全てのキャラで選択時に一旦0x7706番地にバッファリングしているようだ。 なので、今度はここにブレイクポイントを仕掛け、行動を終了させてみると、 BE18 lda #01 BE1A ldy #12 BE1C sta ($74),y [$7706] <<ここでブレイク どう考えても0xBE18番地のlda命令が怪しいので、ここを"lda #01"(A9 01)から"lda #00"(A9 00)に変更してみると、 ユニットカラーは行動終了後の褐色に変化するものの、再度選択すれば無事行動可能になった。 念のため、敵ターンに回してみるが、敵の方は複数回行動をしてくる様子はないので、これを採用。 暗号化して、 ユニット無限行動 FCE103D0 --以下9月8日追加-- 次は武器の耐久力を減らないようにしようかと。 前回、戦闘開始時にバッファリングが行われる事を確認したので、0x7700近辺を調べてみると、 0x770B番地が1個めのアイテムの耐久力らしい。 なのでここにon writeでブレイクポイントをしかけて攻撃してみる。すると、 B924 lda $0324 B927 ldy #$17 b929 sta ($00),y [$770B] <<ここでブレイク あれ?0x0324番地からロードした値をそのままストアしてるって事は、さらに別に一時待避されているということか。 なので今度は、0x0324番地にon writeでブレイクポイントをしかけて攻撃してみる。 が、ブレイクがかかるのは0x770B番地に値が書き込まれた後。何故?? とここで、以前二親等の人(そのいち)が、SFC版の聖戦の系譜について話をしていたときに、 「FEシリーズは、戦闘が開始された時点で結果が既に決まっており、負けたのを見てリセットしても無駄」 といっていたのを思い出し、コマンド決定直後からブレイクポイントを有効にしてみると、 CF03 dec $0324 <<ここでブレイク CF06 bne $CF10 CF08 lda #$01 CF0A sta $0358 CF0D sta $047E CF10 rts 見事にヒット。 後にlda命令があるので、aレジスタは使っても構わないだろうから "dec $0324"(CE 24 03)を"lda $0324"(AD 24 03)に書き換えてテスト。 上手くいった…と思ったんだが"つえ"に効果がないというクリティカルなミスが。 仕方がないので再度0x0324番地にon writeでブレイクポイントをしかけてつえを使ってみる。 D284 lda $0324 D287 bmi $D296 D289 dec $0324 <<ここでブレイク D28C bne $D296 D28E lda #$01 D290 sta $0358 D293 sta $047E D296 rts と、ほぼ同じパターン。よって書き換えパターンも同じ。 後は暗号化して 武器減らない ADEEDD20 つえ減らない ADEEBF06 さて、実は減らない対象はもう一つある。移動中のアイテムだ。 とりあえず、マニュアルとかいう、ぱっと見て何の効果があるんだかわかりにくいアイテムを持たせて、 0x770B番地にon writeでブレイクポイントをしかける。 963A lda ($74),y [$770B] 963C bmi $9652 963E sec 963F sbc #$01 9641 sta ($74),y [$770B] <<ここでブレイク これは簡単"sbc #$01"(E9 01)を"sbc #$00"(E9 00)に換えるだけ。 …と思ったんだが、なんと恐ろしいトラップが。 なんと、戦闘ウィンドウの呼び出しプログラムに 963F lda #$01 という箇所があり、上記の書き換えではこの部分まで書き換えてしまい暴走してしまう。ちきしょう。 仕方がないので"sta ($74),y"(91 74)を"lda ($74),y"(B1 74)に書き換えてみる。 今度こそ成功。 ちなみにこの手のオーバーレイ回避の可否は、GNES上では同アドレスでもバンクが違うと書き換わらないので非常に判りにくい。 必ず実機で確認しないといけない部分ではある。 コードはこちら アイテム減らない 429290AE --以下9月12日追加-- 今度はレベルアップ関連。一番最初に出した経験値のアドレスと行動済みフラグの場所の差分から、 経験値のバッファアドレスは0x76F9番地だと判るので、ここにon writeでブレイクポイントを仕掛けて攻撃を行う。 B8FB lda $032A,x [$032B] B8FE sta ($00),y [$769F] <<ここでブレイク まぁ、耐久力の件で予想はしてたし。 というわけで、再度0x032B番地にon writeでブレイクポイントを仕掛けて攻撃を行う。 D015 lda $030E D018 sta $032B <<ここでブレイク D01B lda $030F D01E cmp #$64 D020 bcc $D027 D022 lda #$64 D01B sta $030F ブレイクがかかった場所はとりあえず置いておいて、注目はその後。 このゲームは経験値100でレベルアップするシステムになっており、それを考慮すると、 0x64(100)という値での上限チェックは非常に怪しい。 そこで試しに"bcc $D027"(90 05)を"bcc $D022"(90 00)に書き換えてみる。 しかし、この場合敵を倒した場合には経験値が100入手できるが、倒しきれない場合はそのままになってしまう。 よってさらに調査を続行。 D0A0 lda $030E D0A3 clc D0A4 adc $030F D0A7 sta $032B <<ここでブレイク D0AA cmp #$64 D0AC bcc $D115 D0AE inc $0329 D0B1 lda $032B D0B4 sec D0B5 sbc #$64 D0B7 sta $032B ここだけ見ると0xD0ACの分岐を潰せば毎回レベルアップが出来そうに思えるが、 それだと経験値が100を超えない場合に下の"sbc #$64"でおかしな事になってしまう。 なので、今度は直前で加算されている(入手経験値と思われる)0x030F番地にon writeでブレイクポイントを仕掛けて攻撃を行う。 が、結論から書くと、どう足掻いても一行での書き換えは無理っぽいので、 "bcc $D115"(90 67)を"bcc $D0AE"(90 00)に書き換えて妥協。 経験値不足でも無理矢理レベルアップ FC7E9824 さて次はパラメータの成長率を叩いてみる。初心者殺しトラップのジジイを今こそ有効に使うのだ。 経験値のバッファリングアドレス0x032Bの周辺を見てみると、各パラメータが0x032C~0x0331あたりに格納されているようなので、 ここにまとめてon writeでブレイクポイントを仕掛ける。 D0EA lda ($06),y [$????] D0EC cmp #$0A D0EE beq $D0F6 D0F0 cmp $48 D0F2 beq $D112 D0F4 bcc $D112 D0F6 ldy #$00 D0F8 lda ($04),y [$0318] D0FA clc D0FB adc $035E D0FE cpx #$06 D100 beq $D10A D102 cmp #$14 D104 bcc $D110 D106 lda #$14 D108 bne $D110 D10A cmp #$34 D10C bcc $D110 D10E lda #$34 D110 sta ($08),y [$032F] <<ここでブレイク D112 dex D113 bpl $D0C1 D115 rts さて、このストア命令を飛び越える分岐というのは、0xD0F2、0xD0F4番地の分岐命令であり、 ここを無効化すれば常にパラメータが成長しそうである。 で、具体的にどうするかというと、滅多なことでは変動しないオーバーフローフラグを使って、 0xD0EE番地を"beq D0F6"(F0 06)から"bvc D0F6"(50 06)に書き換える。 無事ジジイもパラメータがガンガン上がるようになって一安心。 というわけで暗号化して パラメータ成長率100% 6A9AC8E8