最終脆弱探検家ことスペランカーです。 既にデバッグモードという凶悪なコードが公開されていますが、正直遊んでいてつまらないので、 一工夫してとりあえず、落ちても死なないを探すことにします。 このゲーム、地に足を着いていない状態で、ある一定ドット数落下すると死亡という判定のようなので、 まず自キャラのy座標を調べます。 ゼロページを眺めてみると、どうも4D番地がy座標のようです。 さらに眺めてみると、96番地も4D番地と同じ数値を取っていますが、ジャンプしたときに、 4D番地は変化するのに対し、96番地は変化していません。 ということで、どうやら96番地が「最期に地に足がついていた」y座標のようですので、 ここにon readでブレイクポイントを仕掛けてみると、 何もしていないのにいきなりヒット。 8A43 lda $4D 8A45 sec 8A46 sbc $96 <<ここでブレイク 8A48 tax 8A49 lda $4E 8A4B sbc $97 8A4D bcc $8A56 8A4F cpx #$0D 8A51 bcc $8A56 8A53 jsr $9536 思い切り予想通りです。 この場合、キャリーフラグが0の時は現在座標が「最期に地に足がついていた」座標より小さい(=上)ということになるので、 8A48番地の"tax"(AA)を"clc"(18)に変更すると… スタート地点のエレベータから垂直落下しても死ななくなりました。 が、今度は上れなくなり、どのみちクリア不能になってしまいます。 そこで、今度は空中ジャンプのコードを探します。 と思って、ジャンプ中かどうかのフラグを探そうと思ったのですが、どうにも上手くいきません。 そこで考え方を変えてジャンプ時には必ずy座標が変化することをふまえ、 現在のy座標である4D番地への書き込みからプログラムをさかのぼるべく、on writeでブレイクポイントを仕掛けると… 何もしていないのに8A5B番地と8B1D番地でブレイクがかかります。が、ここは前項で調べたアドレスに近い、 8A5B番地の方をまず調べてみます。 トレーサでさかのぼってみると、通常時とジャンプの下降中とで、 8A1A jsr $8E25 8A1D beq $8A43 8A1F jsr $8CAD ここの分岐命令で、下降中に分岐が発生しているので、試しに分岐を潰してみる("beq $8A43"(F0 24)を"beq $8A43"(F0 00))と… ちょっと妙だけど、空中ジャンプが出来るようになりました。 ちょっと妙というのは、ジャンプの頂点まで達すると、方向キーを入れない限り垂直落下します。 逆方向に入力すれば、方向転換も出来ます。 また、下降中には銃やダイナマイトを使うことも出来ます。 おそらくこれは、分岐を潰したせいで、下降時から強制的に地上判定になり、下に足場がないため落下している……ちょっとまて。 地上判定になり続けているって事は、もしかして上の落ち死に回避コードいらないんじゃ… 思い切り不要でした(爆) ここの書き換えだけで落ち死にも回避可能です。が、上のコードが無駄だったかというとそうでもなく、 上のアドレスが見つかっていなければ、以下のアドレスを特定するのは困難だったでしょうから、 そういう意味ではプロトタイプコードになりますね。 このコードを暗号化するとこちらになります。 落下死回避&空中ジャンプ FC07EDC2 なお、このコードを使用した状態で、岩と天井の間に挟まれると身動きが取れなくなります。 挟まれ型が甘ければ、コードスイッチをOFFにすればはじき出されますが、 完全に挟まってしまった場合は、死なないと抜けられないので、岩を無理に飛び越えるのは止めましょう。