はじめるまえにこのブロマガはただ理論を書いていてマニアックな人以外にはおもしろくない内容だと思うので次の記事を待つのをおすすめするのです
ていうか自分FF勢じゃないのでもっと詳しい人いたら教えて下さい
調査環境
Retrode2
通常プレイクリアしたFF6データ
純正SFCコントローラー
snes9x ver.1.51
きっかけは最近ST実演会でた~ひゅさんが砂漠でいいエンカが出ず狩りに苦戦しているところで大昔に聞いたFF6の仕様を思い出したからなんですが
それは電池は抜かずともエンカ再現ができるというもの
せっかくRetrode2持ってるのに使わないのはもったいないので自分のデータを用いて調べることに
ちなみにRetrodeの使い方に関してはブイハチさんのブログを参考にさせていただきました
まずそもそものエンカの仕組みを知らねばならんということで解析でお馴染みの遠藤さんのサイトを参考にしまして仕様のお勉強から
まあ難しいことが書いてありますが要するに乱数生成ルーチンで生成された乱数の大きさでエンカのパターンが決まるというもの
遠藤さんのサイトでも例に上がっているフィガロ周辺では
モンスターパーティ
A
00~4f80/256 (31.25%) デザートソーサー 2
B
50~9f80/256 (31.25%)アラクラン 3
C
a0~ef80/256 (31.25%)デザートソーサー, アラクラン 2
D
f0~ff16/256 (6.25%)デザートソーサー, アラクラン 3
となるそうな
んでもってこの乱数の生成に用いられているメモリがあるらしいとのこと
そこで重要そうなメモリの位置を生成ルーチンからピックアップしてみました
7E1FA2 = 現在の乱数テーブル位置
7E1FA3 = 加算値
おもにこの2つのメモリが用いられて乱数が作られているらしい
乱数テーブルは256通りの数字(16進数のFFまで)がランダムに並べられていてそれが1戦闘ごとに1つずつ進むので毎回エンカする内容が変わる
加算値も256通りあり、乱数テーブルに数字を加算するので乱数テーブルの位置が一緒でも加算値によりエンカ内容が変わる(加算値は乱数テーブルが一周するまで移動しない)
よってエンカ内容は256×256=65536のパターンをぐるぐる回っていることになるということ
つまり次のエンカ内容はシミュレーターでも作れば一応予想は可能であるが、乱数は移動できないのでまあ知ったところで通常プレイぐらいにしか使えないってのが残念な所
さらにサイトによると初期加算値と乱数テーブル位置はランダムであり通常はそこからシミュレートして現在地を見つける必要があるらしいのです
(ちなみに固定敵、獣が原はエンカウント方式が異なるので注意)
しかしここでメモリビュアーを見ていたところ初期加算値の移動に法則性があることに気が付きました
まずロード直後はふたつのメモリが同じであること
そして”初期加算値がロードするたびに+Eされている”ということです
(正確にはロード画面で+1されロードすると+Dされる
これは、はーしぇさんのブログに記されている半リセでエンカテーブルが変わる原因)
はじめはなにかほかに要因があるのかと思いセーブやロードするデータ選択等様々な試行を繰り返した所どうやら全てのセーブデータで同じ初期加算値を共有しロードするたびに+Eされていくようです(ニューゲームも例外ではない)
+Eしていくことを前提として考えるとちょうど128回で1周します
つまり初期加算値は 128通り 256通りあり、ロード直後のエンカパターンは 128通り 256通りしかない
12月21日追記:半リセ利用すれば1だけずらせるので256とおりですね多分
2018年10月20日追記:リセット後のロードの際には共有している加算値の値と乱数テーブル位置は同値になる
裏を返せば”128回ロードすれば同じエンカパターンに出会える”ということです
ここまで来たらエンカパターンを再現するしかねえといきごみ乱数生成ルーチンをみたんですが全く理解できない(アセンブラ言語勉強しとくんだった・・・)
ということでツイッターに救援を求めた所Maruさんが解読してくれました!
ほんとありがとうございました!
それをもとに実際に解析した乱数テーブルとエンカパターンから詳細な式を求めた所おそらく次のような式で乱数を生成してるとわかったしだいです
(乱数テーブルの値 + (加算値 + rounddown(乱数INDEX/ 256)* 23)mod256
ただここで気になる人もいるでしょう
そうエンカまでの歩数によるエンカズレですね
これが補正できないんじゃどこまでRTAでエンカパターンを信用していいのかわからない
なんとちょうど私が視聴していた動画にその解説がのっていました
それは現在おやつさんが投稿している
ひたすら楽してFF6シリーズ
のPart26です!(大ファンです)
どうやら同じような乱数テーブルと加算値から乱数生成ルーチンで乱数を作り出し、危険値と比べてエンカウント判定がなされているらしいとのこと
そしてその乱数テーブルはエンカ判定のあるマスを1マス歩くごとに1つ移動し、危険値は歩くごとに増加する模様
この情報を元にメモリを調査した所なんと歩数加算値の初期値とエンカ決定の加算値の初期値が一致していることが発覚
7E1FA1 = エンカ判定のテーブル位置
7E1FA4 = エンカ判定の加算値
つまり”エンカウントの内容とエンカウントするまでの歩数の乱数はロードのパターンでは変化しない”
ということがわかったわけです
しかしこれだけではエンカウントまでの時間は決定しません
大事なのはエンカするまでの時間に直結する危険値です
危険値の値もおやつさんの動画を見ると以下のメモリに格納されているのがわかります
7E1F6E~F = 危険値
この値は電源を切って付け直すと55に固定されていることからニューゲームを選んだ時点ではエンカまでの”最初のエンカウントまでの歩数もロードのパターン依存”であるといえます
それはすなわち”エンカウントする可能性のあるマップで全く同じ歩き方をすればエンカウントを再現することができる”ということです
(ちなみにこれには落とし穴があったので次の検証編で紹介します)
すごい遠回りになりましたがまとめると
RTAでニューゲームではじめる場合エンカパターンは 128通り 256通りあり128回ロードすれば同じパターンを引けるということですね
この調査をいままでの電池なし再現にあてはめると納得の行くところがいくつもあり、エンカ再現は記憶されているはずの加算値と乱数テーブルが常に0からはじまっているとしたら同じなのも当たり前ですね
また、加算値の動くタイミングがわかったことで半リセットなるものの正体もわかりました
次回はFF6でこれを用いてどんなことができるかというのを模索してみた検証編でございます
今回の調査にあたって以下のサイト、動画を参考にさせていただきました
この場を借りてお礼を申し上げます
参考サイト
Retrode2の使い方
ブイハチの徒然なる日常 2nd season
http://buihachi.blog.fc2.com/blog-entry-37.html
解析データ全般
Index of /~s-endo/
http://s-endo.skr.jp/ff6rndenc.html
電池抜き再現のやり方
はーしぇの気ままな日常
http://ameblo.jp/fhsoal/entry-11952643335.html
参考動画エンカウントシステム解析
ひたすら楽してFF6 part26
http://www.nicovideo.jp/watch/sm23920956