二十年ほど前に全国のファミコン少年少女たちを絶望の淵に叩き込んだ漢のゲーム、バンゲリング ベイ。 ようやく再評価されてはじめてはいるが、なにせ難しい。 というわけで、コンボイスピリッツよろしく、改造で何とかしてしまおう。 まずは、工場の耐久力をどうにかしたい。 のだが、数値サーチや変動サーチをしても、ヒットしてくれない。 なので、プログラムからサーチすることにする。 まず、工場の残存数のアドレスを探すと、これは0x0262番地に0x23〜0x2C(0〜9の数字のキャラクタコード)で格納されている。 なので、ここにon writeでブレイクポイントを仕掛けて工場を爆撃する。 何度か爆撃すると、0xD6C8番地でプログラムがブレイクする。 D68E tax D68F dec $0698,x [$????] D692 bpl $D675 D694 lda $0280,x [$????] D697 clc D698 adc #$08 D69A sta $0287 D69D lda $035E,x [$????] D6A0 adc #$00 D6A2 sta $0365 D6A5 lda $02EF,x [$????] D6A8 clc D6A9 adc #$08 D6AB sta $02F6 D6AE lda $03CD,x [$????] D6B1 adc #$00 D6B3 sta $03D4 D6B6 jsr $DDDB D6B9 lda #$7C D6BB sta $0443 D6BE lda #$04 D6C0 sta $0521 D6C3 lda #$32 D6C5 sta $04B2 D6C8 dec $0262 <<ここでブレイク さてここで普通に考えれば、工場を攻撃した場合、数値が減ると思われる。 そう思ってみると、ここで見えている中で、減算処理を行っているのは0xD68F番地の"dec $0698,x"であり、トレーサを見てもこの命令は通過している。 そこで、0x0698番地の近辺を重点的に調べてみると、0x06A7〜0x06AC番地の6バイトに工場の耐久力が格納されており、 初期値は0x0Aで一度爆撃するたびに2回づつデクリメントされるが、かなり速いペースで回復し、またある程度回復すると0x0Cに戻るという妙な仕様のため数値が増えたり減ったりしていたので、なかなかサーチに引っかからなかったということのようだ。 ちなみに、自機死亡時に突っ込んだ場合は、完全に当たれば14回デクリメントされる。 で、工場だが、耐久力が0x00の時にダメージが入ると破壊できる。 ということはつまりネガティブフラグによって分岐している0xD692番地の分岐が、工場が破壊されるかどうかの分岐で、結果として"bpl $D675"(10 E1)を"bpl $D694"(10 00)に書き換えれば、工場を一撃で破壊できる。 余談。 敵戦艦だが、一定時間ごとに0xBB番地がインクリメントされていて、ここが0x0Fになると「WARNING」がでる。で、0x17になると出航する。 ここ造船中の戦艦を爆撃すると0xBB番地の数値が減り、0x0F未満になると戦艦も消えるのだが、ここでさらにドックを爆撃すると0x01まで減らすことができる。 結構時間稼ぎにはなると思う。 で、戦艦の耐久力は0xBC番地で、初期値は0x0F。ここにon writeでブレイクポイントを仕掛けて出港させてみる。 D284 lda #$0F D286 sta $BC <<ここでブレイク 0xD284番地の"lda #$0F"(A9 0F)を"lda #$00"(A9 00)に書き換えれば一撃で沈む。 さてこのゲーム、一旦加速すれば十字キーに触らなくても減速しないのだが、逆に↓キーを押して減速しようとすると、なかなか止まらないので個人的にはやりにくい。 というわけで、減速性能をよくしてみる。 ゼロページを眺めていると、自機の速度は0x11番地だとわかるので、ここにon writeでブレイクポイントを仕掛けて減速してみる。 E6E5 lda $D4 E6E7 beq $E6FF E6E9 lda $50 E6EB lsr a E6EC bcc $E6F0 E6EE inc $B6 E6F0 lsr a E6F1 bcc $E6F5 E6F3 dec $B6 E6F5 lsr a E6F6 bcc $E6FA E6F8 dec $11 <<ここでブレイク E6FA lsr a E6FB bcc $E6FF E6FD inc $11 E6FF rts さて、ロードされている0x50番地はコントローラの情報で、各方向ごとに加減算が行われている。 でもって、現在デクリメント命令で1づつ減らされているところを一気に減らしたい。 停止時の速度は当然0なわけで、そこからさらに減算すれば値は0xFFになる。 ここでブレイクしたときのレジスタの値を見てみると、うまい具合にYレジスタがちょうど0xFFになっているので、0xE6F8番地"dec $11"(C6 11)を"sty $11"(84 11)に書き換えると、うまくいった。 かなり減速しやすくなった。 さてあとは「マイク」。 必殺のマイクアドレス0x4016番地にon readでブレイクポイントを仕掛ける。 何度も同じところでブレイクしまくるが、思い出したようにユニークなアドレスがヒット。 D036 lda $4016 <<ここでブレイク D039 and #$04 D03B cmp $E1 D03D beq $D04A D03F sta $E1 はい決まり。 さてこれをどこに肩代わりさせるかだけど、普通にⅡコントローラでいいか。マイクの0x04と↓がいっしょだし。 というわけで0xD036番地の"lda $4016"(AD 16 40)を"lda $0051"(AD 51 00)に変更して完成。 工場一撃必殺 FCEDF85C 戦艦一撃必殺 FC768B68 ブレーキ強化 F546F45E マイクの代わりにⅡコンの下で招集(ボタンを押したときと放したときに反応) 6FC16E00 FCB6EB1C ※すべてaltバージョン -- 以下 三月二十日追加 -- ウチにあるアクションリプレイ誌のバックナンバーを探してみたら、一応バンゲリング ベイのコードはあったんだけど、 ダメージふえない ★1 ★1 得点が入らなくなります。 ちょっとまてなんだそのクソコードは。 だったらアタシが修正してやるッ!! ということで、サーチしてみる。 まずは、得点とダメージのワークアドレスを探す。 格納方式は、工場の残存数と同じ0x23〜0x2C(0〜9の数字のキャラクタコード)で、ダメージは0x024C〜0x024Eの3バイト、得点はは0x0268〜0x026Dの6バイトに格納されている。 なので、この範囲にon writeでブレイクポイントを仕掛け、それぞれの値を変動させて、トレーサでさかのぼる。 最初は得点獲得。 E64F E651 E65F E661 E663 E5F1 E5F2 E5F5 E5F6 E5F8 E60D E60E E610 E61D <<ここでブレイク 次は被ダメージ。 E5C9 E5CB E5D1 E5D3 E5E9 ↑ここまで違う E5F1 ↓ここから同じ E5F2 E5F5 E5F6 E5F8 E60D E60E E610 E61D <<ここでブレイク ということで、同じルーチンを呼び出している違う番地が現れたので、このうち被ダメージの方の呼び出しだけを潰せば、得点の加算を阻害せずにダメージを無効化できる可能性が高い。 それぞれの呼び出し箇所を見てみると、得点加算の0xE663番地は"bne $E5F1"というただの分岐命令、被ダメージの0xE5E9番地は"jsr $E5F1"というサブルーチン呼び出しになっている。 このサブルーチン呼び出しを"rts"命令に飛ばしてやればよい。 至近の0xE5EE番地がちょうど"rts"命令なので、"jsr $E5F1"(20 F1 E5)を"jsr $E5EE"(20 EE E5)に書き換えれば、ダメージだけ受けなくなる。 ただし、駐機場で敵機に直撃された場合は死ぬ。が、死ぬ手段がないのもどうかと思うんで、これはこのままでいいだろう。 ダメージふえない・修正版 91FB8498 あと、どうでもいいことだけど、アクションリプレイ誌の掲載コードでは、アタシの持ってるロムは、別バージョンではないらしい。 -- 以下 三月二十日追加 -- 別バージョンを手に入れたぞー。 というわけで調べてみる。 ワークアドレスはaltの物と同じようなので、前のと同じようにブレイクポイントを仕掛けてみる。 工場残存数 D692 tax D693 dec $0698,x [$????] D696 bpl $D679 D698 lda $0280,x [$????] D69B clc D69C adc #$08 D69E sta $0287 D6A1 lda $035E,x [$????] D6A4 adc #$00 D6A6 sta $0365 D6A9 lda $02EF,x [$????] D6AC clc D6AD adc #$08 D6AF sta $02F6 D6B2 lda $03CD,x [$????] D6B5 adc #$00 D6B7 sta $03D4 D6BA jsr $DDDF D6BD lda #$7C D6BF sta $0443 D6C2 lda #$04 D6C4 sta $0521 D6C7 lda #$32 D6C9 sta $04B2 D6CC dec $0262 <<ここでブレイク 戦艦耐久力 D288 lda #$0F D28A sta $BC <<ここでブレイク 自機の速度 E6E9 lda $D4 E6EB beq $E703 E6ED lda $50 E6EF lsr a E6F0 bcc $E6F4 E6F2 inc $B6 E6F4 lsr a E6F5 bcc $E6F9 E6F7 dec $B6 E6F9 lsr a E6FA bcc $E6FE E6FC dec $11 <<ここでブレイク E6FE lsr a E6FF bcc $E703 E701 inc $11 E703 rts マイク D03A lda $4016 <<ここでブレイク D03D and #$04 D03F cmp $E1 D041 beq $D04E D043 sta $E1 得点獲得 E653 E655 E663 E667 E5F5 E5F6 E5F9 E5FA E5FC E611 E612 E614 E621 被ダメージ E5CD E5CF E5D5 E5D7 E5ED ↑ここまで違う E5F5 ↓ここから同じ E5F6 E5F9 E5FA E5FC E611 E612 E614 E621 えーと、要するに、全部アドレスが+0x04ずれた「だけ」。 なので速攻でコード化する。 altじゃない版コード 工場一撃必殺 FCEDF3DE 戦艦一撃必殺 FC7680E8 ブレーキ強化 F546FFDC ダメージふえない・修正版 7EE86A4C マイクの代わりにⅡコンの下で招集(ボタンを押したときと放したときに反応) 6FC16580 FCB6E09E