見出し画像

メダロット1の解析

こんばんは。チョコボの不思議なダンジョン2やメダロットのRTA走者です。
実は走れる手札のひとつ、初代メダロットの解析にも手を出してみたのでそのレポートです。

GBのCPU

もちろんご存知ですよね?そう、Z80です。GBといえば初代ポケモンがあるんだからそのCPUやバグの研究も進んでいるので他のゲームハードに比べて認知度はあるのではないでしょうか。
また、そうしたポケモンバグ界隈の発展のおかげでGB作品を解析するにあたっての手引きのような位置づけでもあると筆者は考えます。データの持ち方や命令の意味が分からなかったらポケモンを解析してみる。やることがなくなったらポケモンバグを見てみる。
ポケモンバグ界隈には多大なるリスペクトをお送りします。

メモリマップを探る

ソフトの吸出し、エミュレータの環境構築はもう慣れたものです。詳しく知りたい方いらっしゃればコメントください。
とにもかくにもやることはメモリの中身、特にSRAMの解剖です。メダル、パーツ、アイテム、セッティング。ポケモンに比べればデータ量は少ないのかな?というイメージ。それぞれのデータがどこに格納されているのかを探ります。

調べ方

とりあえずは既存のチートコードからアタリをつけていきます。
メダロットのチートコードその1
メダロットのチートコードその2
その2がとっても役に立ちました。おおよそのメモリの場所が分かったのでそこからは自分で値を変えたりして裏を取ったり変化するタイミングを見たり、まぁ手慣れたものですね。

転機

筆者はこの初代メダロットを走っていると先述しましたが、同じくこのゲームを走られている走者さんも居る訳でして。その走者さんが「ロボトルエンドの仕組みってどうなっているんだろう」とぼやいていました。前々からそのようなことは言われていたのですが、筆者のきまぐれに響いたので次の題材はこれだと決めました。

土壌の違う箇所での調査

今まではメダロットのセッティング画面やメダル一覧画面で解析したりゴソゴソやっていたわけですが、ロボトル(戦闘)中のことを調べるので少し行き詰まりを見せました。
というのも、ポケモンでは容量削減の都合上、マップ移動中に使っているメモリに対して戦闘のときはそこを間借りして戦闘用の値を格納したりといったことがあるのです。もしも同様のことがメダロットでも起こっているのであれば「このメモリは既に調査済みだから、戦闘中の情報は絶対に他の場所に書き込まれるはずだ」みたいな考えはとても危険であるというわけです。
なのでまっさらな気持ちでロボトル中のメモリを覗いた訳ですがまぁ分からない。セーブデータ的役割のSRAMなのか描画に関わるVRAMなのかどこを見れば良いかもイマイチ掴めなかった訳です。

切り札はアイデア

プログラムや解析なんて愚直にやればどうとでもなりますが、それをいかに効率的に進めるかは考え方、すなわちアイデアです。
ロボトルエンドの仕組みをやみくもに探してもどうにもならないと思い、どうにかアプローチを変えられないかと考えたところ、設定で戦闘時間を変えられることを思い出しました。設定で切り替えられるということはロボトルエンドを判定するにあたって一度はこの設定を読み込んでいるのでは。
早速この設定値のメモリを突き止め、このメモリを監視することにしました。幸いにも使用していたエミュレータ(bgb)ではwriteやreadのbreakが使用できたのでかなりスムーズに解析できました。おかげでロボトル中にその設定値を何度も読み込んでいることが分かりました。
そこからはbreakで止まった周辺の命令を読んでどのような処理なのか細かい部分を探ります。
bgbで逆アセンブルした命令文にはストア命令が無かったり、レジスタが多くなかったりとやはりPSに比べて読みやすいなと感じました。
結果を言えば「おそらくこうだろう」という解析結果は得られました。やはり解析を始めた今年の初めに比べれば確実にレベルアップしています。
以下に解析結果をまとめます。

ロボトルエンドの解析結果

・充填放熱中のみにカウントされるゲーム内カウントが存在する
・約0.5秒間隔でカウントアップ
・カウントが上限に達して次の行動が終了したらロボトルエンド
・カウントが上限に達した瞬間(充填放熱中)にはロボトルエンドにならない

・カウント上限は
 短い→約12.5秒(25カウント)

 普通→約17.5秒(35カウント)  で達する
・1カウント(約0.5秒)はおおよそシャトルランの半分を走る程度
 ランク0,レベル0カブトメダル、純正メタビーにて検証
 最初のヤンマ戦、山の中フィールドのザコ戦
 (↓画像箇所で1カウント)

※「行動」とは、なにもしない、攻撃、索敵、防御、トラップが該当(検証済み)
 全ては検証していないがおそらく応援や回復、全ての行動に該当

解析の動機と走者熱

今回感じたこととしては、ゲームの腕がそこまで上手くない自分は第一線を走り続ける走者となるには中々難しいというところ。
しかし
そんな第一線で走る走者さんをサポートしたいという気持ちは大きい。だからこそこうして解析をしている、できている。おそらくここが自分の性に合っているのだと思う。今後もこうして解析を行ってRTAの手助けをしていきたい。
もちろん自分が走るためでもある。誰かのために動くのは動機づけとしてかなり有効ではあるが自分に見返りが無いとどこかで心が壊れてしまうかもしれないから健全に解析していきたい。

この記事が気に入ったらサポートをしてみませんか?