パワーアップ!パワーブレイザー

FCPARに最初から搭載済みの改造コードや、新たに本などで発表される改造コードを見ると、「無敵」「ゾンビ」のような改造コードが多くないでしょうか?
改造できるデータが4バイト分しかないということで、やむを得ないのかもしれませんが、 単純な無敵化コードはゲームが面白くなくなるのであまり好きではありません。
そこで今回は、「最小(4バイト以内)の改造で最大の効果」を目指しました。


序文

パワーブレイザーとは、主人公がブーメランを武器に戦うアクションゲームです。
初めの6ステージの攻略順を選べたり、敵にロボット系が多かったりと、おそらくポストロックマンを狙っていたのでしょう。
・・・しかし、ゲームを遊んでみると、意外と先に進むのが難しいと思われる方も居るはずです。

以下は、私なりに考えてみた、ゲームの難易度を上げている要因です。

・その1:ジャンプ力の小ささ

計測してみると、主人公のジャンプ力は最高32ピクセルにまで到達しています。 また、走りながらジャンプをした場合、最高点到達までは横方向(X軸方向)に32ピクセル進むようです。
簡単に言うと、「横に32ピクセル隔たり、上に32ピクセル隔たった斜め上にあるブロックに乗り辛い」ということです。
ゲーム中、足場を飛び移ったりする際、この「斜め32x32」ジャンプを使う場面が何回かあるのですが、かなりギリギリから踏み出さないと失敗します。
せめて、ジャンプ力が1.5倍程度なら・・・



・その2:初期状態のブーメランの飛距離の小ささ

ブーメラン「パワーブレイザー」ですが、ゲームタイトルになっているだけあり、単純に投げて戻ってくるだけではなく、かなり凝った動き方をします。
ブーメランが戻ってくる時に敵に当たるように投げてみてください。不思議な動きで敵の体力を削ってくれるはずです。
このブーメランの軌跡をうまく操ることこそ、このゲームの真骨頂・・・のはずなのですが、初期状態では飛距離がなんとも小さいため、初めは狙うのが難しいです。
なお、ブーメランの飛距離はパワーアップアイテムを取る事で伸ばせます。パワーアップアイテムは倒した敵が落としますが、アイテムの出現率はかなり低めです。

・その3:体力の低さ

理由その1、その2により、空中を軽快に飛んでくるような敵キャラと戦う場合、慣れないとなぶり殺しにされます。
特に、幾つかの面の開幕から出現する飛び跳ねている敵(ステップ・モンキー)は、ザコとは思えないスピード・ジャンプ力・パワーで初心者を苦しめるでしょう。 また、ザコ敵の弾も、このようなタイプのゲームにしてはかなり早めです。


これらのことから、「このゲームを遊び辛いのはゲームが悪いからだ!俺のせいではない!」と、数年間どこかにしまって置きました。
しかし、このパワーブレイザー、音楽がなかなか良いのです。
調べてみると、作曲者は「YAMAKO」、なんとファミコンの「火の鳥鳳凰編 我王の冒険」「キングコング2」「エスパードリーム」、MSX「ゴーファーの野望」などの作曲者と同じだと!どれも昔に熱心に遊んだゲームでした。いやー、どおりで耳に心地良いわけだ。幼少期からの刷り込みってやつですね。

今回は、プロアクションロッキー(FCPAR)を使って上の問題点をなんとかできないか、やってみました。


解析


エミュレータを使い、パワーブレイザーを解析してみます。
解析にはNNesterJとG-NESを併用します。


ジャンプ力アップ

メモリのうち、ジャンプに直接関わってくるのは以下の2箇所です。

・$04A0・・・主人公のy座標
・$04E0・・・ジャンプしたときのy座標の増分値

これら2つの値に注目しつつジャンプしてみましょう。
ジャンプ直後、$04E0には0FCH(10進数で-4)が格納されますが、値が増加しつづけ、ジャンプの頂点では0になります。
その後も増加は止まらず、最初にジャンプした高度に戻る時には、04H(10進数で4)になっているはずです。

トレースログで$04E0の値を変化させている部分を追っていきます。すると、$04E0の初期値を設定している部分は、

 $9B8C ldy #$FB

であることが判りました。Yレジスタに0FBHを入力し、この後、Yレジスタの内容を$04E0に代入しています。
この0FBHの値を色々変えてジャンプしてみます。0FAHの時、ジャンプ力が1.5倍ぐらいになるはずです。


ブーメランの飛距離(1) FCPARのゼロページ制限について


ゲーム中ではパワーアップアイテムでブーメラン飛距離を伸ばせるので、ゲーム開始時から複数個のパワーアップアイテムを取った状態にする方法を探しました。

パワーアップアイテムを取った個数(パワーレベル)は、

・$005E

に格納されているようです。
ただし、このアドレスについてのFCPARの改造コードを作成してみても、効果はありませんでした。

ファミコンのCPUである6502は、$0000〜$00FFのアドレスに対して、レジスタを介さずに直接、参照・値の代入・増減を行うことが可能です。 興味がある方は「ゼロページアドレッシング」という用語について調べてみてください。

恐らく、FCPARはROMカセットとファミコンの間で、

 「ファミコンのアドレスバスにセットされたアドレスを確認して、そのアドレスが改造対象ならば、改造後の値をファミコンに返す」

という動作をしているのではないでしょうか。

だとすれば、6502の特性上、$0000〜$00FFのアドレスは、アドレスバスに値をセットせずに参照を行えるので、 FCPARにとっては改造データを送り出すタイミングが掴めない事となります。
このことから、FCPARはアドレス$0100〜$FFFFまでのメモリ書き換えにしか対応できないのではないか、と思われます。


ブーメランの飛距離(2) パワーレベルの増加

FCPARがゼロページ書き換えが行えないのであれば、他の手段を探すしかありません。

$005Eは、ゲームスタートの時点では0が代入されています。その後、ゲーム中にパワーアップアイテムを取得する度に、

 inc $5E

によって、1づつ値が増加しているようです。
今度はG-NESを使い、「タイトル画面→ステージ選択→ステージが始まったら一回ジャンプ」までを、トレースログを出力しつつ実行してみます。
(ジャンプは必要ないかもしれません。これは、ゲーム開始処理の中でパワーレベルを初期化している個所を特定するため、 「ゲーム開始時の初期化処理完了→プレイヤーの入力を受け付け開始」のタイミングを調べたいからです。)
そしてその中で、$005Eに対して書き込みを行っている個所を探します。
検索する文字列は、「$005E」「sta $5E」のどちらかになるはずです。

まず見つかったのは、「$005E」に対して0を代入している処理だったのですが、 この部分は、$005Eのみではなく他のアドレスに対しても一括でゼロクリアを行うルーチンのようです。 そのため、$005Eに限って初期値を変更するのは難しそうです。

次に、

 $C462 sta $5E

が見つかりました。 ただし、この処理も、他のアドレスに対して同じAレジスタ値の代入を行っていて、$005Eに限って 値を変更するのは難しいようです。

他に手はないかと思い、さらに調べてみたのですが、先ほどの$C462の処理は、ゲーム開始までに計2回、実行されていることがわかりました。 それでは、この部分を

 $C462 sta $5E
  ↓
 $C462 inc $5E

と、代入処理を1増加する処理に換えてみてはどうでしょうか?
(マシン語で言うと、「85 5E」を「E6 5E」に変更)
試してみると、見事、ブーメランを最初からパワーアップさせることに成功しました!

この改造により、ゲーム開始直後からブーメランのレベルは2(パワーアップを2つ取った状態)になるようです。
ブーメランレベルの最高値は3らしく、そこから考えると微妙ですが、まあ、飛距離が伸びたことは間違いないのでOKとしました。


体力増強


最後に、体力の低さについても対策を考えます。
メモリビュアーを見つつ適当にダメージを受けていると、体力を格納している個所が見つかります。

・$0490・・・主人公の体力

ゲーム開始からのトレースログを取ると、体力を初期設定している部分は以下の部分のようです。

 $CA09 lda #$10
 $CA0B sta $0490

ここで、$CA0Aの010Hを、2倍した020Hと変えれば、体力は2倍になります。
ちなみに、この部分を改造してゲームを開始すると、確かに体力は2倍になるのですが、ボス戦で死んだ後、なぜか体力は改造前の値010Hに戻ってしまいました。
どうも、体力を010Hに初期化するルーチンは、プログラム中に複数存在しているようです。余裕があったら、同様な$0490の初期化処理を探してみてください。
(ただし、今回作成する改造コードで3バイトを使ってしまうため、FCPARでは残り1バイトしか改造できません)


改造コード生成
書き換えるアドレス、書き換え後の値、書き換え前の値から、改造コードを生成します。
生成方法の詳細はこちらをご覧下さい。

・「ジャンプ力アップ」
 09B8DH番地の0FBHを、0FAHに書き換え→9B8DFAFB(平文)→22671C58(FCPARコード)

・「ブーメランパワーアップ」
 0C462H番地の085Hを、0E6Hに書き換え→C462E685(平文)→CD458886(FCPARコード)

・「スタート時体力2倍」
 0CA0AH番地の010Hを、020Hに書き換え→CA0A2010(平文)→FDDAE912(FCPARコード)

大事なことを言い忘れていました!!
ステージセレクトの右上の面、「エネルギー開発センター」面の途中、「ジャンプ力アップ」パッチを有効にしていると絶対に越えられない場面があります。 頭上に逆さトゲトゲがある場面で、ジャンプした際に上のトゲトゲにぶつかって即死してしまうのです。

でも大丈夫!その場面についたら、慌てずにFCPAR本体のスイッチを下に切り替え、一時的にパッチを切り離してください。
その場面を越えたらスイッチを元に戻し、パッチを再度有効にします。FCPARって良く考えてあるなあ。


終わりに
この改造コードにより、念願の「パワーブレイザーの全ての音楽を聴く事」が達成できました。

それにしてもワイリーステージ(最終面)はあっさりしすぎじゃないでしょうか?
やはりロックマンは凄いゲームだったなあ、と、パワーブレイザーとは別のゲームの偉大さを再認識してしまいました。

あ、でも音楽は本当にサイコーなんですって!


参考にしたサイト・コンテンツ
・kommander氏による、「GAME KOMMANDER」パワー・ブレイザーのページから、各種情報を引用しました。



トップへ戻る