なるほどえたきちのブログじゃねーの

チラ裏雑記帳

ポケモン過去作の解析とか乱数調整とかそこら辺。不定期更新。

このブログについて

ポケモン第三世代を中心に真偽不明の情報や、作成したツールを纏めたりするブログです。
殆どがROMデータ解析系の記事なのでそれなりの知識がある方向けです。
こちらのコメントはほぼ見てないので、何か聞きたいことがあればTwitterの方に連絡して頂けると内容次第で反応します。

当ブログはリンクフリーです。

 

ポケモン第三世代
 ■ROMハック関連
  ◆CartRAM取扱メモ
  ◆流れ解説

 ■バグ関連
  ◆【Em】任意コード実行
  ◆【LG】任意コード実行
  ◆【Em】バイナリエディタの導入
  ◆【Em】システムハック
  ◆【Em】セーブデータコピー
  ◆【Em】ふしぎなカード捏造【Part1】【Part2】
  ◆【Em】任意コード実行によるROM吸出し

 ■乱数調整
  ◆【Em】ID調整

ポケモン第五世代
 ■乱数調整
  ◆ 【BW/BW2】全28バージョンパラメータ纏め

ポケモン第六世代
 ■乱数調整
  ◆【XY】ID調整
  ◆【ORAS】ID調整

ポケモン第八世代
 ■乱数調整
  ◆レイド柱のSeed特定ツール

◯他ゲー
 ■モンハンライズ
  ◆護石リセマラ自動化ツール

◯ハード関連
 ■Nintendo Switch
  ◆画像認識マクロ作成ツール

◯外部リンク
 ■Twitter
  ◆@_3z8

 ■Mail
  ◆yu_gen_00@yahoo.co.jp

 ■GoogleDrive
  ◆作ったツール纏め

モンスターハンターライズ 護石リセマラ自動化ツール

護石スナイプしてやろうと思ったけどダンプしたコード読むのがめんどくさくなったので代わりに自動化ツール作りました。
取り敢えず当記事ではツールの使い方だけ纏めておこうと思います。
最初の2行書いた時点でかなりめんどくさくなってるのでかなり大雑把な纏めとなりますが悪しからず。

先に言っておきますが自動化ツールである都合上多少の相性問題っぽいのはあるかもしれないです。(操作のラグとかドライバ周りとか)
此方で再現できない問題については基本的に対応見送るので、上手くいったらラッキーくらいに思っておいてください。

注意:
当ツールの動作確認に使用したMHRiseのバージョンは2.0となります。
今後のバージョンでの動作保証は出来かねますのでご了承下さい。

drive.google.com
f:id:BZL:20210509164807p:plain

使い方

0:事前設定

必要なもの:
キャプチャーボード
CSR製チップ内蔵のBluetoothドングル
64bitのWindowsOS

Switch/モンハン側の設定:
[Switch]本体設定->テレビ出力->テレビの解像度 - 1080p
[Switch]本体設定->テレビ出力->RGBレンジ - フル
[Switch]本体設定->テレビ出力->画面の大きさ - 100%
[モンハン]オプション->DISPLAY->明るさ - 50%
[モンハン]オプション->SAVE DATA->オートセーブの設定 - オートセーブしない

1:映像

適当に繋げてるキャプボ選んで接続ボタン押すだけです。

2:無線接続セットアップ

Bluetoothドングルを使用する場合はドライバの置換が必要となります。
接続したBluetoothドングルを選択し、インストールボタンを押すとドライバの置換が完了します。
注意点として、ここでドライバ置換を行ったドングルは他のBluetooth機器との接続には使用できなくなります。
元のドライバに戻す場合はデバイスマネージャーから手動で操作してください。
f:id:BZL:20210509165029p:plain

3:コントローラー接続

Bluetoothドングルを使用する場合はそのままでおk。
マイコンを使用する場合は適切なCOMポートを選択してください。
書き込むhexファイルはNX2用のアレです。
モンハン起動中であればそのまま待っているだけで接続画面に移行するはずです。
接続画面に自動移行しない場合は[ホーム]→[コントローラー]→[持ちかた/順番を変える]の待機画面でも接続可能です。
接続後はPCに接続しているゲームパッドからSwitchの操作が行えます。多分。
f:id:BZL:20210509165503p:plain
f:id:BZL:20210509165514p:plain

4:マクロ

実行したいマクロを選びます。以上。

各マクロの説明

リセマラ厳選

村の中であればどこからでも開始可能です。
錬金に使用する素材は1ページ目から無差別に放り込んでいく感じなので素材に余裕のある方向けです。
検索条件の設定は勘でなんとかしてください。

マクロの内容
 マカ錬金(幽玄)を50個分セット
  ↓
 闘技ラー10周
  ↓
 護石確認
  ↓
 検索条件に設定した護石があればセーブして最初に戻る、無ければセーブせずリセット
  ↓
 護石を1個分セット
  ↓
 闘技ラー1周
  ↓
 護石確認後セーブしてリセット、最初に戻る

テーブル記録用

ほぼ自分用、普通に遊ぶ分には必要ないかも?
ひたすら錬金して出現したおまもりをcsvに記録していくだけのマクロです。
村の中であればどこからでも開始可能です。

マクロの内容
 マカ錬金(幽玄)を50個分セット
  ↓
 闘技ラー10周
  ↓
 護石確認、シートに記録して最初に戻る

所持おまのシート出力

装備Boxを開き、護石のみでフィルタリングしてから1ページ目の左上にカーソルを合わせてからスタートです。
装備Box内の護石を全て読み込んでcsv出力します。
また、ここで出力されたcsvは泣きシミュの護石インポートにそのまま使用可能です。(2021/05/09時点)

f:id:BZL:20210509170829p:plain
f:id:BZL:20210509171040p:plain

最後に

生成と乱数列の遷移が分かれば多分ツール作るので良い感じの情報があったら起こしてください。

関係ないですがNX2の更新と鯖の再起動しておきました。
NX2で作れるレベルのマクロはこっちに追加する気ないので作った人は適当に共有してあげると喜ぶ人がいると思います。

色違いデオキシスゲット!

簡単で
す!
因みにこれを実行するとセーブデータが消えるので注意
まず初めに 以下の記事の通りにバグポケモン0x085Fをゲットする。
bzl.hatenablog.com
以下の通りにボックス名を変更する。
赤字の「ヘ」「ベ」はカタカナです!

ボックス ボックス名
ボックス1 『 みオむけいオぅ』
ボックス2 『アれめつい l』
ボックス3 『9ぇつい9ぇせも』
ボックス4 『アひか…や l』
ボックス5 『コエエシエねミ』
ボックス6 『アねあぃ l』
ボックス7 『ッやコエエシエ』
ボックス8 『アねミァゆ l』
ボックス9 いクスあぃコエ』
ボックス10 『アエシエ l』
ボックス11 『クオ k』

ボックス名を変えた後にバグポケモン0x085Fの様子を見るとソフトが自動でリセットされる。

再開すると警告文が出ますが無視してください。
ボックスを確認するとレベル1の色違いデオキシスがいます。

結果
デオキシスゲット!

【Nintendo Switch】予算1500円で画像認識マクロ環境を実現する

この記事はPokémon RNG Advent Calendar 2020 13日目の記事です。
本当は色々細かく書きたかったのですが、リアルが色々忙しくなってしまったので簡潔に纏めます。
(ハック関連のアレソレ?知らんな)

概要



記事名の通りです。
本当にそのまんまなので特に話すことはありません。
以上。

つまり...どういうことだってばよ

1500円程度で用意できる機器と自作ツールで画像認識マクロが使えるようになりました。
具体的には、最近話題の1000円キャプボとそこら辺に売ってるBluetoothドングルの2点セットで環境が整います。
Bluetoothドングルは相性問題があるらしいので運が悪いともう少し高くなってしまうかもしれません...
それでも大抵はマイコンを使用するよりも安上がりなはずです。
記事執筆時点ではAmazonの最安値1399円で機器が揃えられるようです。
安物故出品情報がコロコロ変わる為、ここではURL等の紹介は行いません。
まあ適当に調べれば出てくると思います。

BluetoothってUbuntu入れたりするやつ?準備めんどくさいなぁ

WindowsOS単体で動くようになりました。
設定もツール側のボタンポチポチするだけなので(多分)簡単です。
但し、ドライバの置き換えを行うので他にBluetoothバイスを使用している方には少し向かないかも?

そもそも画像認識マクロとは

キャプボ経由でPCにNSの画面を取り込み、画面内の情報からマクロの内容を分岐させる...といった感じです。
分かりやすい例としては自動色厳選辺りが挙げられますね。

よく分からないので取り敢えずツール触らせてくれ

こちらにうpしておきました。
drive.google.com

以降は普通に解説するだけの内容となります。

使い方



大枠は旧版NX Macro Controllerと変わっていませんが、マクロの書式や細かい仕様等にかなりの変更が加えられています。
大まかには以下の通り。(見落としあるかも)

  • マクロの記述方式をテキストタイプに変更
  • 時間管理をより細かく行えるように変更
  • キーボードの他にゲームコントローラーが使用できるように
  • キーボードの割り当てを変更できるように
  • マイコンを使用した制御の他、Bluetoothによる無線通信に対応

また、作ったマクロデータを簡単に他者と共有する為の手段として、マクロ共有サーバーへの接続が行えるようになっています。
(但し完全に個人での管理なので十分なサポートの提供は難しいと考えてください)
知識0から3日程度で作ったので完全にやっつけ実装ですが、マクロのアップロード/ダウンロード、アップロードされたマクロデータの検索、DL数等に応じた検索結果のソート機能等、必要最低限の機能は多分備わっていると思います。
知らんけど

NSとの接続(Bluetooth)

1. - 「ツール」→「無線接続セットアップ」を選択し、ドライバ置き換え用ダイアログを開く
2. - ドライバを置き換えたいBluetoothドングルを選択し、「インストール」ボタンを押す
3. - インストール完了後にPC再起動
4. - NS側の画面をコントローラのペアリング待機画面にする
5. - 「ツール」→「接続」→「Bluetooth無線接続」を選択する
6. - 暫く待つとNS側に仮想コントローラが認識される
7. - PCに接続したキーボード又はコントローラで操作し、NS側が反応すれば成功

NSとの接続(マイコン)

1. - 「マイコン書き込みファイル」内の.hexファイルから手持ちのマイコンに合ったものを選び、書き込む
2. - PCとNSをマイコン経由で有線接続
3. - 「ツール」→「接続」からマイコンのポートを選択
4. - PCに接続したキーボード又はコントローラで操作し、NS側が反応すれば成功

マクロで使用できるコマンド

後々れどめ辺りにも纏めます
Press
ボタン押下
例:
Press(A, 0.1) - Aボタンを0.1秒押す
Press(A, X, 0.5) - AボタンとXボタンを0.5秒同時押し

Wait
全てのキーを離した上でウェイト
例:
Wait(0.8) - 0.8秒待機

ImgCmp, Not
画像認識分岐
例:
ImgCmp(dummy)
{
Press(A, 0.1) - 画像認識成功時
}
Not
{
Press(B, 0.1) - 画像認識失敗時
}

Snipping
静止画の保存
例:
Snipping(80, 50, 1000, 900) - X座標80,Y座標50を位置を始点として横幅1000,縦幅900でキャプチャ

Loop
指定回数ループ
例:
Loop(5) - 5回ループ
{
...
}

Loop() - 無限ループ
{
...
}

Stop
マクロの終了

開発動機


  • BluetoothによるWindowsOS内でのNS本体制御が何か上手くいってしまったのでそれを使ったツールを作りたかった
  • 旧NX Macro Controllerの設計が色々と適当だったので少し見直しを掛けたかった
  • Webアプリ的なものに手を出してみたかった
  • 昔勉強したDB管理周りの知識を実際のツール制作で使ってみたかった

開発において使用したもの


エメラルドID調整の調査記録

サムネは魔除けです。
この記事はPokémon RNG Advent Calendar 2020 6日目の記事です。

エメラルドID調整の手順そのものについては数ヶ月前に上げているので、調査の詳細に興味のある方向けの記事となります。
まあ調査記録といっても当時の記憶の書き起こしだしそこまで厳密には纏めてないけどね。
めんどくさいので画像も特にないです。
すごく読みづらいと思いますが何卒ご容赦下さい。
それと調査にあたってROMHackやマジコンを利用している為、苦手な方はブラウザバック推奨です。

また、筆者は乱数調整にあまり詳しい人間ではないので細かい所で「ん?」と思う所があるかと思いますがどうか生温かい目で見てあげてください。
文句言われてもスルーするので言うだけ無駄です。

概要



ポケットモンスターエメラルド自体は16年程前に発売されたそれなりに古いゲームで、殆どの要素において乱数調整方法が確立されていたが、トレーナーIDの決定に関しては1年くらい前まで調整不可能とされていた。
この記事では、不可能とされていた理由やその後調整できるようになった経緯等について適当に解説する。(正しく解説できる自信はない)

解説



まずはエメラルドのトレーナーID決定処理について。

// 名前入力開始
static void NameInStart(u8 type, u8* buff, u16 work0, u16 work1, u32 work2, pFunc rec_proc)
{

	Namein = (NAME_IN*)AllocMemory(sizeof(NAME_IN));
	if (Namein == NULL){
		MainProcChange(rec_proc);
		return;
	}

	Namein->name_type = type;
	Namein->arg_work0 = work0;
	Namein->arg_work1 = work1;
	Namein->arg_work2 = work2;
	Namein->set_name_buf = buff;
	Namein->rec_proc  = rec_proc;

	// 主人公名の決定時間を乱数のタネとする
	if(type == NAMEIN_HERO)
	{
		RandomTimerStart();
	}


	MainProcChange(InitNameInTask);
}
 
// 名前入力終了
static u8 NameInEnd(void)
{
	if (FadeData.fade_sw == 0){
		// 時間計測終了
		if (Namein->name_type == NAMEIN_HERO)
		{
			RandomTimerEnd();
		}

		MainProcChange(Namein->rec_proc);
		DelTask(CheckTaskNo(NameInMainTask));
		BMPWIN_SysExit();
		MEM_RELEASE(Namein);
	}
	return 0;
}

名前入力画面への遷移時にタイマーを開始し、名前決定後に経過時間をそのままトレーナーIDとして使用するという非常に単純な処理である。
ちなみにこの処理はFRLGでも使用されている。

「入力に掛かった時間がTIDになるならその入力時間を調整すれば任意のトレーナーIDが引けるのでは?」と思うかもしれないがこの「入力時間の調整」がとても難しい。
エメラルドの実行環境であるゲームボーイアドバンスはマルチスレッドに対応していない為、裏で何かしらのタスクを処理したい場合は割り込み処理を利用して実装することが多い。
割り込み処理の実行中はメインタスクの処理が停止するが、その前にセットされたハードウェアタイマーはそのまま動き続ける。
これが「入力時間の調整」を難しくしている原因となる。

この時裏で割り込み処理によって動いている処理とは何か?
BGMの再生処理である。

ゲームボーイアドバンスには先代のゲームボーイが持っていたチャンネルに加えて8bitのPCMが追加されており、サンプリングされた音源をそのまま再生できるようになっている。
これによってソフトウェアによって生成された合成音声を再生し、擬似的に同時発音数を増やすことに成功している。
ちなみにポケットモンスターエメラルドにおいて使用されているサウンドドライバは任天堂純正のMusicPlayer2000である。(Sappyとも呼ばれる。こちらの方が親しみのある名前だろうか?)
この「ソフトウェアによる音声合成」が中々に曲者で、BGMの再生位置によって合成するデータ量が大きく変動する為、処理に要するCPUサイクル数にムラが生じやすい。
ハードウェアタイマーのスタート/ストップの起点となるVBLANK割り込みから当該処理までのステップ数は一定だが、途中で割り込んでくる音声合成処理によって経過時間が変動してしまうのである。
しかし、逆に言えばBGMの再生位置と経過時間の管理によってトレーナーIDの調整が可能である、ということになる。

理論的な説明は以上の通り。後は全て力技で解決します。

ここまで分かったら「BGMの再生位置(OP開始からの経過時間)」と「名前入力画面内での経過時間」を渡してIDを概算できるようにしたい。
今回はハードウェアタイマーのスタート/ストップ処理のそれぞれに対応した「BGMの再生位置」と「処理実行までのクロック数」を紐付けたテーブルを作成する。

まずはタイマーストップ処理用のテーブル作成手順を紹介する。
BGMの再生処理を潰したROMを用意し、1フレームずつ名前入力の経過時間をズラしながら出現するトレーナーIDを確認する。
すると、1フレームにつき18752値が増えていた。
16777216(GBAのCPUクロック数) / 59.7275(リフレッシュレート) = 280896.002....
280896 % 65536 = 18752
なので、計算上でもこの結果はまあまあ正しそう。
後は未改造ROMで取得できたトレーナーIDと比較して音声合成処理によって生じたサイクル数のズレを記録していく。
この時、名前入力画面へ遷移する際のBGMの再生位置は固定するようにする。

次はタイマースタート処理用のテーブル作成手順。
名前入力画面遷移後にBGM再生処理が停止するようHackを施したROMを用意し、名前入力画面へ遷移する際のBGM再生位置を1フレームずつズラしながら出現するトレーナーIDを確認する。
この時、名前入力画面へ遷移した後の経過時間は固定するようにする。
その後、BGMの再生処理を潰したROMで同じ操作を行い、トレーナーIDの差分を取る。
この差分がタイマースタート処理実行までに発生した音声合成処理によるズレとなる。

後は記録した差分を2つ合わせた値と実際の値のズレを基準値とし、[基準値 + タイマースタートのズレ + タイマーストップのズレ = ID]が成り立つようにする。
かなりの荒技になってしまうが、一応これでエメラルドのIDの予測ができるようになった。

最後に



以上がポケットモンスターエメラルドのID調整を行うにあたっての調査内容です。
少し頭のいい方なら「もう少しスマートなやり方あるだろ!アレをソレしてこうして...」とツッコミたくなってしまうと思いますが、突っ込まれた所で基本スルーするつもりなので心の内にしまっておいて頂けると幸いです。

明日はpo氏が何か書くそうです。
当記事執筆時点では「何も考えていません。」とのことですが何が上がってくるんでしょう?
楽しみにしていますね。

【BW/BW2】全28バージョンパラメータ纏め

5世代海外版ROMのパラメータについて、適当に調べてもNazo値くらいしか見つからなかった為、海外版ROMを所持している方々と協力して全28バージョンの具体的なパラメータ調査を行った。なんと私は日本版BWすら持っていません

まずは無印BW。
Nazoはほぼ既出だが、スペインブラックのみ誤った情報が出回っているので注意。

Nazo値計算法:
Nazo1:(Nazo1)
Nazo2:(Nazo1 + 0xFC)
Nazo3:(Nazo1 + 0xFC)
Nazo4:(Nazo1 + 0x148)
Nazo5:(Nazo1 + 0x148)

バージョン名
Nazo1
VCount
Timer0
日本ブラック
0x02215F10
0x60
0xC79~0xC7A
日本ホワイト
0x02215F30
0x5F
0xC67~0xC69
韓国ブラック
0x022167B0
0x60
0xC84~0xC85
韓国ホワイト
0x022167B0
0x60
0xC7B~0xC7C
北米ブラック
0x022160B0
0x60
0xC7B~0xC7C
北米ホワイト
0x022160D0
0x60
0xC7E~0xC80
ドイツブラック
0x02215FF0
0x5F
0xC77~0xC78
ドイツホワイト
0x02216010
0x60
0xC7A~0xC7B
フランスブラック
0x02216030
0x5F
0xC73~0xC74
フランスホワイト
0x02216050
0x5F
0xC6E~0xC6F
スペインブラック
0x02216070
0x60
0xC86~0xC87
スペインホワイト
0x02216070
0x5F
0xC70~0xC71
イタリアブラック
0x02215FB0
0x5F
0xC6A~0xC6B
イタリアホワイト
0x02215FD0
0x60
0xC7B~0xC7C

次はBW2。
こちらもNazoは既出。
VCountズレという新たな概念の存在するバージョンがある為注意。

Nazo値計算法:
Nazo1:(Nazo1)
Nazo2:(Nazo2)
Nazo3:(Nazo3)
Nazo4:(Nazo3 + 0x54)
Nazo5:(Nazo3 + 0x54)

バージョン名
Nazo1
Nazo2
Nazo3
VCount
Timer0
日本ブラック2
0x0209A8DC
0x02039AC9
0x021FF9B0
0x82
0x1102~0x1108
日本ホワイト2
0x0209A8FC
0x02039AF5
0x021FF9D0
0x82
0x10F5~0x10FB
韓国ブラック2
0x0209B60C
0x0203A4D5
0x02200750
0x82
0x10EF~0x10F4
韓国ホワイト2
0x0209B62C
0x0203A501
0x02200770
0x81
0x10E4~0x10E9
北米ブラック2
0x0209AEE8
0x02039DE9
0x02200010
0x82
0x1102~0x1108
北米ホワイト2
0x0209AF28
0x02039E15
0x02200050
0x82
0x10F2~0x10F6
ドイツブラック2
0x0209AE28
0x02039D69
0x021FFF50
0x81~0x82※1
0x10E5~0x10EC※1
ドイツホワイト2
0x0209AE48
0x02039D95
0x021FFF70
0x82
0x10E5~0x10ED
フランスブラック2
0x0209AF08
0x02039DF9
0x02200030
0x82
0x10F4~0x10F8
フランスホワイト2
0x0209AF28
0x02039E25
0x02200050
0x82
0x10EC~0x10F0
スペインブラック2
0x0209AEA8
0x02039DB9
0x021FFFD0
0x82
0x1101~0x1106
スペインホワイト2
0x0209AEC8
0x02039DE5
0x021FFFF0
0x82
0x10EF~0x10F4
イタリアブラック2
0x0209ADE8
0x02039D69
0x021FFF10
0x82~0x83※2
0x1107~0x110D※2
イタリアホワイト2
0x0209AE28
0x02039D95
0x021FFF50
0x82
0x10FF~0x1104
※1 ドイツブラック2
Timer0の値が0x10E5~0x10E8の場合はVCount-0x81、0x10E9~0x10ECの場合はVCount-0x82となる。
※2 イタリアブラック2
Timer0の値が0x1107~0x1109の場合はVCount-0x82、0x1109~0x110Dの場合はVCount-0x83となる。
Timer0-0x1109に限りVCount-0x82とVCount-0x83の両パターンが存在する。

【ポケモンXY】ID調整

事の発端はこちら。
 ↓
sina-poke.hatenablog.com


XYのID調整に成功したので適当に調整手順等を纏めます。
(元々纏める気なかったけど)




疑似乱数周りの仕組み



IDの決定自体はORASと同様にTinyMTが用いられており、初期seedも同様に起動時刻によって決まっている。
但し、OP内でキャラクターオブジェクトのまばたきによる不定消費が発生している為、ORASと同様の手順ではseedの特定が難しい。
ここで使用されているまばたき処理は以下の通り。
(滅茶苦茶単純である)

u32 _counter;

void init()
{
	_counter= 0x021E - ((rand() * 0xB4) >> 0x20) << 0x01);
}

void next()
{
	_counter--;
	if (_counter == 0)
	{
		init();
	}
}

また、名前入力画面に遷移した際の1消費以外にその他消費は行われていない模様。
OP内ではキャラクターの数が変動する箇所があり、これによって時間あたりのおおよその消費速度が変化する。
キャラクター数の変動の仕方は以下の通り。


1人 (博士)
 ↓
2人 (博士,メェークル?)
 ↓
1人 (博士)
 ↓
3人 (博士,男主人公,女主人公)
 ↓
文字入力画面 (まばたき判定停止)
 ↓
3人 (博士,男主人公,女主人公)
 ↓
4人 (博士,男主人公,女主人公,選んだ方の主人公)


また、OPの最後に現れる主人公は名前確定時にまばたきカウンタのリセットを行っているよう。
名前確定→まばたきカウンタリセットまでの空白時間は主人公の性別によって異なっている。


ID調整方法の考察



TinyMTの初期seedはORASと同様に決定されている為、TinyMTを元に生成された値を観測することができれば32bitの総当たりによって初期seedの特定が可能となる。
但し、ID決定までの消費数が不定である都合上ORASと同じ手法は使えない。(使えたとしてもミリ秒ゲー以上の難易度になるが)
ID決定以外の乱数消費には「キャラクターのまばたき処理」があり、これは「まばたきのインターバル」という形で乱数値を使用する。
その為、今回はキャラクターのまばたきの長さを利用して32bitの総当たりを行い、現在seedを求める。
キャラクターが1人である状態なら、「現在seed」と「1人のキャラクターが持つまばたきカウンタの値」の2つを得ることで乱数値の制御が可能となる。
シーンの切り替わりによって新たに登場するキャラクターのまばたき処理についても、前述した2つの値が分かっていれば「シーン切り替わりの契機となる操作タイミング」を管理するだけで制御可能。
その為、今回の乱数調整では「キャラクターが1人である状態からまばたきのインターバルを複数記録して現在seedを特定した後、3DSの操作タイミングを管理することによって後に現れるキャラクターのまばたき処理を全て制御する」といった形でOP中の乱数消費を再現する。

キャラクターのまばたきのインターバルは最長542F(約9秒)、最短でも184F(約3秒)である為、時間あたりの消費速度はかなり遅めである。
また、まばたき以外の不定消費が存在していない為、消費速度を踏まえると操作精度が余程低くない限りは消費数がズレる可能性は低い。

調整にあたっての理論的な説明っぽいのは以上の通り。
これらの作業を簡潔に行う為のツールを作成したので使い方を適当に紹介する。
DL:https://drive.google.com/drive/folders/1Apjkju68iaVenfu5R_UdKpgxnhuAjlgU?usp=sharing


基準seedの特定



o3DSではラグの影響で消費の進む速度に若干の遅れが生じるようです。
このツールはラグの考慮を一切行っていない為、極力n3DSを使用して乱数調整を行うことを推奨します。

OP開始後、この画面まで進めておく。
f:id:BZL:20200831192143p:plain
6genTidSearchを起動し、[XY]→[基準seed検索]タブを開く。
初回は『全範囲探索』を選択し、その後OP内のプラターヌのまばたきに合わせて『瞬き』ボタンを押してまばたきの空白時間を記録する。
(数分間見つめ合ってるとちょっとロマンチックな雰囲気になってくる)
まばたきの空白時間を10個程記録したら検索を開始する。
2回目以降の検索を行う際は『基準seedから探索』を選択し、前回特定した初期seedを入力する。
f:id:BZL:20200831192345p:plain
seedが見つかった後、セルをダブルクリック又は『seedを選択』を押しておく。
f:id:BZL:20200831193052p:plain

目的のIDの検索



ID検索タブを開き、許容する消費数と目標IDを入力して検索を開始する。
ここで目標のIDが見つからなかった場合はリセットし、再度seedを特定する。
(複数候補の検索したかったら3DSRNGTool使ってね)
f:id:BZL:20200831193613p:plain

まばたきズレの補正



目標IDが出現するseedであった場合は消費数管理タブを開く。
『瞬き調整』内の開始ボタンを押すとプラターヌの瞬きに合わせて音が鳴るようになる。
但し、目視でまばたきを観測している都合上、実際のまばたきタイミングとはズレが生じている。
ここではその誤差の補正を行っていく。
基本的にはプラターヌのまばたきより遅く音が鳴っている為、『早める』を押してズレを縮めていく形となる。
プラターヌのまばたきと鳴る音のタイミングが一致したらこの手順は終了。
f:id:BZL:20200831194400p:plain

まばたき消費制御



ツール内で主人公の性別を選択する。
その後、以下のシーンでAボタンを押すのと同時に『ステップ(F9)』を押して消費の制御を行っていく。
また、名前確定時を待機フレームの始点としている為、CCTimerを使用している場合はF9キーを使用することを推奨する。


>> 主人公の性別選択
f:id:BZL:20200831194839p:plain
>> 名前入力画面
f:id:BZL:20200831194740p:plain
>> 名前決定
f:id:BZL:20200831194755p:plain
>> 名前確定
f:id:BZL:20200831194804p:plain


操作終了後はこの画面で待機を行う。
f:id:BZL:20200831195539p:plain

消費範囲を指定後、『計算』を押してリスト出力を行う。
ハイライト部分は「現段階でAボタンを押すと引くことのできるID」となっている。
f:id:BZL:20200831195510p:plain
f:id:BZL:20200831195214p:plain

出力されたフレーム数に合わせて待機を行い、出現したIDを確認する。
目標のIDが無事に引けていれば成功。
f:id:BZL:20200831200210p:plain

あとがき



XYの方は特に纏める予定はなかったのですが、任せられてしまったのでこちらも書くことにしました。
以前纏めたORASと比較すると手順は若干ややこしいものの、狙ったIDを引きやすいのでNN目的でID調整を行う方はこちらの方が都合良いかもしれませんね。
これを応用するとフィールド上でTinyMTのseedが特定できるようですが使い道がよく分からない...