[Hack] ExeFSでMap Forceを実装

Map Forceとは

ステージを強制的に変更するコードのこと。

正確に言うと、プラベでランダムステージを選択すると強制的に指定したステージに切り替わります。

サーモンランのマップでナワバリバトルしたり、そういう事ができます。

有名なのはZewia氏によるもので、以下のものが知られている。

// 4.4.0
// Map Force [Zewia]
@enabled
01474394 807182D2
00365420 09000014

これは4.4.0向けのコードなので、当然4.6.0では動作しません。

ちなみにExeFSとLFSの違いは以下の記事で簡単に解説してあります。

LFSでの実装

有名なのがOatmealDome氏が移植されていないスプラトゥーンのステージをスプラトゥーン2向けに変換することでリリースしようという試みがあります。

去年の12月くらいに全ステージリリースするって言ってから結構経ったのですが、移植は順調なんでしょうか?

ちなみにLFSによるステージ移植は単純なレイヤー変換やマテリアル変換というめんどくささもあるのでかなり難しいです。

ただ、ググればなんかいろいろ移植している人の動画が見つかる気がします。

ExeFSでの実装

さて、Zewia氏のコードはランダム選択時にステージIDを強制的に変更するものでしたが、それとは違うアプローチでMap Forceを実現した方が現れました。

// 4.6.0
// ShootingRange Replacements [AmazingChz]
@enabled
023B318E XXXX

Urchin Underpass = 466C645F4372616E6B30305F567373000000000000

なんと今までLFSで実装していた試し打ち場の置換をExeFSで実行しようという試みです。

何故これが正しく想定通りの動作をするかは実行ファイルをGHIDRAで分析するとすぐに分かりました。

.rodata:00000000023B3164 aFldTutorialsho DCB "Fld_TutorialShow01_Ttr",0
.rodata:00000000023B317B aFldTutorial00T DCB "Fld_Tutorial00_Ttr",0
.rodata:00000000023B318E aFldShootingran DCB "Fld_ShootingRange_Shr",0

この付近はこんなデータが格納されているので、要するに試し打ち場を指定されたときに参照するファイル名を変更してやろうというものですね。

バカ正直な実装ですが、自分ではちょっと思い浮かばなかったです。

4.6.0だと0x239B240から参照テーブルがあります

実際にやってみた

旧ガンガゼ野外音楽堂も選択できるということでやってみました。

確かに動作しました。

ということは、旧バッテラストリートや旧Bバスパークでも遊べたりするのでは????

公開されたテキストファイルには旧バッテラストリートのコードが載っていなかったので自作(いうほど何もしていない)しました。

// Old The Reef
// ShootingRange Replacements [AmazingChz]
@enabled
023B318E 466C645F446974636830315F567373000000000000
新バッテラストリート

ちなみに旧バッテラストリートはこんな感じです。

旧バッテラストリートの方が好きなんだよなあ…

ちなみにコードは以下の通り、データがないとクラッシュするかもしれないので各自頑張って “Fld_Ditch01.Nin_NX_NVN.szs”のファイルを用意してくれ!!

しかしこれ、よく見たらIPSwitchの最初期に全く同じコードが載っていたような気がしますね…