ピーえぬのブログ

適当に書いています

エメラルド 改造日記その3 バトルフロンティアでこころのしずく解禁

サムネ

題して ~プロジェクト Soul Dew~
昔からやってみたかった、フロンティアでこころのしずくを解禁しようという記事。
改造日記ゆえ例によって話が長いので要点だけ知りたい人は結論へ。そのうち差分としてRSのタワーでも解禁する予定。

RS版タワーはここをクリック

そもそもの仕様

こころのしずくとは、みなみのことうで出現するラティオス/ラティアスが持っているアイテムで、ラティオス/ラティアスに持たせると特攻および特防が1.5倍になる。ただしバトルタワー(RS)やバトルフロンティア(E)では効果が発揮されない。

南の孤島に行くにはむげんのチケットが必要なので、通常プレイで入手はできない。貴重なアイテムにも思えるが、エメラルドに限っては伝説をゲットするまで何度でも復活する仕様なので、泥棒やトリックを使って何個でも入手できるとか。

本題であるフロンティア周りの挙動で肝心なのは、心の雫を持たせたポケモンを出場させること自体は可能だということ。つまりフロンティアでは効果が無効になるプログラム処理がされているということになる。

戦闘形式について

となると当然プログラム上では戦闘形式を識別していることになる。戦闘バリエーション豊かなエメラルドにおいては野生戦やトレーナー戦、通信対戦などはもちろん、フロンティアの7つの施設ごとの内部プログラム上の戦闘形式がある。

これらの戦闘形式を表すデータは戦闘になる度にRAMアドレスの0x02022C90に4Byteで記録される。値の一部を掲載する。

0x00000004 野生
0x0000000C トレーナー戦
0x0000080C ルネシティ開かずの間(没データ)
0x00000084 サファリゾーン
0x0000002E 通信バトルシングル
0x0000010C バトルタワー
0x0000010D バトルタワータブル
0x0004000C アリーナ
0x00200004 ピラミッド野生
0x0020000C ピラミッドトレーナー
0x0001000C ドーム
0x0001000D ドームダブル
0x0008000C ファクトリー
0x0002000C パレス
0x0002000D パレスダブル
0x0000010C チューブトレーナー
0x00100004 チューブ野生
0x0000810D チューブダブル
基本的にダブルバトルはシングル+1hになっている。ルネシティの開かずの間はバトルタワーと同じバトル形式だが異なる点は心の雫が使用可能なところか。

エミュレーター上でRAMの値を書き換えることで戦闘形式を変更できる。トレーナー戦でポケモンを捕まえたり(ただしダメタマゴ化したりする)、逃げたりも可能。フロンティアで経験値や賞金の獲得もできる。

戦闘形式を変更することでフロンティア内でも心の雫を有効にできるのだが、弊害が多い。アリーナやパレスなどの特殊な戦闘形式は崩れてしまう。これでは変更で代替にはならない。

改造の前に

色々調べているうちに、心の雫の効果はダメージ計算のプログラムで処理されていることがわかった。ROMアドレス内に装備アイテムの効果を定義したテーブルが存在しているわけではない。というわけで逆アセンブリなどで解析していく。

最終的に大きく役立ったツール等はこの辺りだろうか。

  • Visual Boy Advance M(VBA-M)
  • AbilityPlus(FR)の改造資料
  • FEBuilder

アセンブリではdisarmやDISARM customized to GBAが有名らしいが、今回はFEBuilderを使用。ファイアーエンブレムというゲームの改造ツールであるものの、GBAROMの逆アセンブリ機能が優れていておりLDRはポインタをトレースした状態で出力できるので解析が捗った。EMのROMでも問題なく出力できたが念のためdisarmやDISARM customized to GBAでの出力結果と比較したほうが良い。

AbilityPlusの改造資料では事細かにダメージ計算上に使用されているデータが載っているので、改造する前に一度でも目を通す価値アリ。

いざ改造へ

蓋を開ければ一月ぐらいかかった大プロジェクトに。しかし上記のツール達と出会ってからは急速に進んだ。

改造資料によると持ち物によって効果を発揮するアイテムにはIDが割り振られており心の雫は#0x22である。#0x220x02022C90を参照しているデータで検索をかけたところヒットした箇所があった。RAMアドレス上の0x080692D0~0x0806933A(ROMの0x000692D0から)おそらくここだろう。0x08069304までが攻撃側の特攻に関する計算で、0x08069306からが防御側の特防に関する計算だと思われる。ほとんど解読していないが、わかった点のみ解説。特攻側と特防側でほぼ同じなので特攻側のみ。

0x08692D2 2822 cmp r0, #0x22で攻撃側の持ち物が心の雫(#0x22)かどうかのチェックをして、0x08692D4で分岐。

0x080692D60x02022C90を読み込み戦闘形式をチェックして、0x080692E0で分岐。

0x080692E20xFFFFFE69を読み込み、0x080692F0で分岐。0xFFFFFE69ラティアスの内部番号0197を符号反転させたデータで、心の雫の対象指定をしているアドレスの値だそう。

全体の流れではアイテムのチェック->戦闘形式のチェック->ポケモンのチェックとなっている。なので戦闘形式のチェック後の分岐を骨抜きにしてやればいいはず。分岐の異動先を直下のアドレスに変更してやる。直下のラベルはFF。

変更前
0x080692E0 D111 bne #0x08069306
変更後
0x000692E0 D1FF bne #0x080692E2

特防の処理もほぼ同じで、0x08069316をD1FFに変更するだけ。
デバッグしたところフロンティア内で心の雫が正しく効果を発揮していることを確認できた。コードを完全に解読しているわけではないので他に弊害が出る可能性も0ではない。ここのコードは心の雫関連にしか使わないと思われるので大丈夫だと思うが。

応用すればこころのしずくの対象ポケモンを全てにすることもできる。ちなみにこの先のコードはパールルの専用アイテムのしんかいのキバの処理が続いているよう。しんかいのキバやしんかいのウロコの対象を全体に拡張させたりもできる。次号の記事で紹介する。

結論

ROMをバイナリエディタで開き、次の箇所の値をFFに書き換える。

0x0692E0 11->FF
0x069316 11->FF

PARコードも作成した。プレイ中は常にONでも構わない。

E68C414D F4CA94B6
F99F2375 0CE0E484

ラティの真の力を解き放とう。




改造コード集へ
pn.hateblo.jp