需要って何ですか? というわけで(何がだ)オバケのQ太郎ワンワンパニックを無敵にしてブイブイいわせ… ようかと思ったんですが、今確認したら既にAR誌で公開されてやがるのね。 しかーし、このコード使ってみると分かるんだけど、敵に当たるとぷるぷる音が鳴ってうるさい! なので自力で探してみます。 早速毎度おなじみゼロページをぼーっと見つめるパターンで行きます。 幸いなことに、このゲーム一応無敵アイテムがあるので、それを取りつつ眺めていると、 0x67番地の数値が、無敵を取った瞬間増えて、その後減り続け、0になると無敵が切れることを視認。 適当に固定すると無敵になったので間違いないでしょう。 0x67番地にon readでブレイクポイントを仕掛けると、何もせずに速攻ヒット。 8FE2 lda $67 <ここでブレイク 8FE4 beq $9007 何も考えずに分岐を潰してみたところ、確かに無敵にはなったんだけど、点滅がうざい。 そして致命的なことに、ごくまれに無敵が切れてしまう(爆 と言うわけで、別の手を考えてみる。 要は接触判定を潰せばいいので、無敵中に敵に体当たりをして、その上で0x67番地のon readブレイクポイントを見てみると… かかりました。 D507 lda $67 <ここでブレイク D509 bne $D517 ここを強制分岐にしてしまえば接触判定をスルーできると思われるので、 "lda $67"(A5 67)を"lda #$67"(A9 67)に書き換えると…見事無敵化しました。点滅もしません。ぷるぷる鳴りません(笑) というわけでこれを暗号化すると 無敵(接触音無し) A61786B0 でまぁ後はパワー減らないなんかはARに載ってるので事が足りるので別に構わないんだけど、 これだけでは物足りないので、ちょっとひねくれたコードを探してみようと思う。続きは明日。 -- 以下8月19日追加 -- さて予告したひねくれコードです。 このゲーム、特に高次面になると電柱や木などの障害物がやたら邪魔になってきます。 オバケなんですから、このぐらい通り抜けたいですよね? というわけで障害物無視コードを探します。 まず下準備として自キャラのX座標を特定します。 これは普通にゼロページを眺めていれば、0x42番地がそうだと特定できると思います。 で、ここからのサーチ手順なのですが、まずこの0x42番地にon readでブレイクポイントを仕掛けて、 「実行」を連打し、ブレイクするアドレスを全て控えます。 すると、0x8A16番地と0xD354番地で各一回、0x8CA5番地で6回ずつの周期でブレイクしていました。 さてここからが本番。 こんどは障害物に当たった状態で、障害物の方に向かって歩きつつ(動けない)、 さっきと同じように、0x42番地にon readでブレイクポイントを仕掛けて「実行」を連打します。 すると、一カ所だけさっき控えた場所とは違う場所でブレイクがかかります。 8B46 clc 8B47 adc $42 <ここでブレイク 8B49 sta $15 8B4B jsr $8D06 8B4E cmp #$59 8B50 bcc $8B55 8B52 jmp $8BF2 となっています。 方向キー押下時のみ通過するプログラムという事で、障害物の当たり判定がこの近くにあることは容易に予想できます。 そこで、今現在障害物を通過しようとしていることをふまえて「ステップ」を押してプログラムをトレースしていきます。 途中2階層ほどサブルーチンに潜りますが無視して続けると、どうやら0x8B50番地の分岐命令を通過し、 次の行で0x8BF2にジャンプさせられています。 そこで、現在と逆の状況にするために、この分岐命令を生かそうと思ったのですが上手い手を思いつかなかったので、 次のジャンプ命令を"jmp $8BF2"(4C F2 8B)から"jmp $8B55"(4C 55 8B)に変えてみます。 すると、ジャンプ中に触れたときこそ下にたたき落とされるものの、 歩行中は完全に障害物を無視して通過できるようになりました。 が、飛行中は真横にしか通過できません。これはちょっと不便なので、Y座標に関しても同様の方法で調べてみます。 まず自キャラのY座標は、ゼロページから0x40番地と特定できたので、X座標の時と同じ手順でふるい分けをしてみると、 8B08 clc 8B09 adc $40 <ここでブレイク 8B0B sta $14 8B0D lda $42 8B0F clc 8B10 adc #$08 8B12 sta $15 8B14 jsr $8D06 8B17 cmp #$59 8B19 bcc $8B1E 8B1B jmp $8BF2 という箇所が引っかかりました。 前出のX座標の時と非常に構造が似通っているので、同じように"jmp $8BF2"(4C F2 8B)を"jmp $8B1E"(4C 1E 8B)に変えてみます。 すると今度は飛行中自由に障害物の中を動けるようになりました。 なのでこれらを暗号化して 障害物無視して通過可能 64F6B716 042545DA となります。 需要のないクソゲー解析にお付き合いいただきありがとうございました(笑)