サイファーの日記

過去作の乱数について書きます

六世代乱数の基本的なやり方

この記事はPokémon Past Generation Advent Calendar 2023 71日目の記事です。

 



 

まえがき

六世代乱数は実践のハードルが高いというイメージがありますが、実際には初期seedの特定が困難であるという点に集約されると思います。実際、日本で実機で行う人が現れた頃には初期seedの特定にかなりの時間がかかっていました。

しかし、その後に優れた手法やツールが整備され、より効率的になっています!今回はそれらのツールを使って6世代乱数を行う方法を解説していきます。

ただ、TinyMT関連や孵化等については話がややこしくなるのでここでは説明しません。MTがメインの固定シンボルや配達員についてのみ。

初期seedの仕組み

六世代の初期seedは時間変数とセーブ変数を加算し、その下位32bitを用います。時間変数は大雑把に言えば、ある基準時間からタイトルでAを押すまでに経過したミリ秒(1/1000秒)時間によって1ずつ増えていきます。例えば、10000ms後で0xAAAAAAAAならその5ms後には0xAAAAAAAFとなります。セーブ変数の方はレポートを書く度に変動します。

それで、セーブ変数はレポートしない限り変わらないので管理は楽ですが、時間変数は放っておくとどんどん変化していくので管理が大変です。後述する「seedおもいだし」というツールではボタン1クリックで楽に管理でき、時間をだいぶ置いた後でもすぐに基準seedを特定できる。

準備するもの

ツール
・seedおもいだし*1
・化石ポケモン個体値検索GEN6*2
・poke6-seed-finder
・6genSeedSearch
・3DSRNGTool
・CCTimer

下4つのツールは乱数調整ディスコードのツール一覧に置かれています。

ゲーム内
ふしぎなアメ10個程度
・薬(化石ポケモン個体値検索GEN6を使用する場合)
ひみつのコハク2個
・化石復元所の前でレポートを書く
・手持ちに空きを2つ以上つくる

コハクについては他の化石でも構わないが、こちらの方が少し作業が楽になる。バッグの中に別の種類の化石があると、復元時に選択肢が出てしまい手間取るので自分はボックスのポケモンに持たせたりしている。

ふしぎなアメは回復ポケットの一番上に置くと十字キーを入力する手間が省ける。

手順① 基準seedの総当たりと管理

セーブ変数が変動するので手順①以降~乱数成功までレポートを挟まないこと!

準備が整ったらタイトル画面( press start button の文字が現れる画面)でAを押すと同時に、seedおもいだしの基準seed管理欄の「時刻を取得」を押す。すると「基準時刻」に現在の時刻が表示される。

この時、ゲーム内では続きから始めるの画面に移動する。そしたらAを連打してプテラを連続で2匹受け取る。poke6-seed-finderはフレーム範囲を設定してプテラの能力値を探索するので、ほんの少しも遅れることがないように連打する必要はありません。プテラを2匹受け取ったら化石ポケモン個体値検索GEN6を使って、両者の個体値を完璧に特定する。

特定し終わったらpoke6-seed-finderで今回の初期seedを総当たりによって求める。このseedを使って乱数調整を行うことはしません。ある時刻にタイトルでAを押したらどの初期seedが生成されるかを知るための手がかり(いわゆる基準seed)となります。

入力は、IVs of Wilds1に1番目に受け取った、IVs of Wilds2に2番目に受け取ったプテラ個体値を半角スペースで区切りながら行う。既に仮の数値が入力されているはずですが、それらは削除してから入力します。Frames of Wilds1,Frames of Wilds2はそのタイミングでプテラを受け取ったであろうフレーム範囲になる。XYなら順に700-1000,1700-2000、ORASなら600-900,1500-1800もあれば十分だと思います。Seed rangeはそのまま。

全て正しく入力してからEnterを押すと、基準seedの総当たりが始まる。以前のツールよりも速く計算できるようです。ここまでできたら、ソフトを終了させたり、電源を切っても問題ありません。

基準seedが求まったらseedおもいだしの方にそれを入力(今回は説明のため、適当に0x0とする)。基準seed管理欄の「0x」の右にあるテキストボックスです。そして、保存ボタンの左隣の部分に適当な名前(今回は「data1」とする)を入力して、保存ボタンを押す。保存内容を確認してOKを押す。

手順② 初期seedの特定

以上で基準seedの特定と管理が完了しました。ここからは実際の乱数調整に入っていきます。化石ポケモン個体値検索GEN6とpoke6-seed-finderは乱数成功までもう使いません。seedおもいだしと6genSeedSearch、3DSRNGToolとCCtimerの4つのツールは使うので起動しておきます。

まず、準備として下の画像のように基準seed計算欄の「F9」2つにチェックを入れておく。また、CCTimerの「Setting」でFramerate「Custom」を選択→59.841Hz/sに変更する*3。変更し終わったら「CountUpTimer」に切り替える。

そうしたら、ソフトを起動してタイトル画面でAを押すと同時にF9キーを押す。すると手順①で記録した時刻と今回の時刻の差分から現在の基準seedが取得され、クリップボードにコピーされます。CCTimerもキーに反応してカウントアップを始める。F9キーがどうしても使えない人は、基準seed計算欄の「時刻を取得」→「計算」を順に押していけば同様のことが行われます。この場合、タイマー起動との兼ね合いもあるので、時刻を取得した後にできるだけ早くAを押し、それと同時にタイマーをクリックで起動する。

ゲーム側では続きから始める~プテラ受取までなるべく早く進める。手順①の時とは異なり、受け取るのは1匹のみでOK。

↑基準seed計算欄の「F9」2つにチェック

ただ、ここで取得したseedはまず間違いなく今回実際に引いたものとは異なります。seedはミリ秒単位で変化していき、常人では狙い撃ちは困難だからです。*4また、基準seed計算欄の時刻は余裕を持って実際の時刻より少し早め(デフォルトでは約4秒前)のものを取得しているというのも理由の1つです。

ここから、今受け取ったプテラ1体の能力値を利用して今回の初期seedを完全に絞り込む作業をします。まず、6genSeedSearchの「初期seed検索」タブに移動し、「実数値(化石)」を選択。基準seed欄にクリップボードにコピーされた基準seedを貼り付ける。「種族」はプテラ、「性格」はそのプテラの性格、「レベル」はいじらなくてOK。「消費範囲」はORASであれば600-900あたり?ある程度の早さで受け取っているのであれば、手順①で設定したFrames of Wilds1と同じくらいで十分です。

実数値にはそのプテラのLv20時の能力値を入力する。そうしたら、バッグを開いてプテラにアメを2-4個程度与える。そして、レベルアップ毎にH~Sの順番で上昇値を入力し、追加でレベルアップさせた場合は次の行に移ります。

例えば、下の画像では1行目に21にレベルアップした時のH(+3),A(+2),B(+1),C(+1),D(+2),S(+3)を入力しています。3行分(Lv23まで上げた時)の上昇値があれば十分に候補を絞り切れると思います。2行でもいいかもしれない。

ここまで入力し終わったら検索ボタンを押して初期seedの候補を出す。正しいと思われるseedが見つかったら適宜キャンセルボタンを押してやらないと無尽蔵に候補を計算し続けるので注意!まあ、大半は最初に出てきた候補が正しい初期seedです。不安ならアメを追加で与え、上昇値をもう一行入力するといいです。最後の手順③に向けて、初期seedを右クリックしてコピーしておく。

手順③ 目標フレームまで待機

ここは目標個体のフレームを探して待機時間を決め、実際に待機する最後の段階となります。

コピーした初期seedを3DSRNGToolの右上に貼り付け、ソフトのバージョンも選択しておく。固定なら固定タブに移り、TSV等の設定も行う。配達員なら配達員タブに移り、V固定の数(of Random 31 IVs のところ)を設定。そしてフィルターに移り、個体値や性格など希望の条件を入力し終えたら検索。候補となるフレームを探す。

候補の内、時間的にいけそうだと思ったフレームを選び、CCTimerのOffset上部にあるテキストボックスに入力して、submitボタンを押す。そして、残り時間がある内に配達員ならポケセンまで移動し、「~を受け取った!」のメッセージまで表示して待機しておく。そしてタイマーが0になったらAを押して受け取る。

初回は当然オフセットを考慮していないので目標フレームとはズレが生じます。ズレ調整のためにまず、狙った目標フレームを右クリックして「Set as Target Frame」をクリック。すると「目標消費」欄にその数値がセットされるので、次は今回引いた個体のフレームを検索。「種類」で当該のポケモンの種族を選べば、実数値で探せるのでおすすめです。それらしきフレームを発見できたら、ずれ/Fを見てCCtimerの「Offset」に入力する。

もし、初回のずれ(目標フレームに対する)が「-431」*5と表示されていた場合、オフセットは「431」となります。また、オフセットを「431」に設定している時に「-5」ずれだった場合、次回は「436」です。まあ数フレームずれくらいなら誤差範囲だが...オフセットの設定を終えたら、手順②からもう一回やり直してください。成功した方はお疲れ様でした!

何度やっても微妙にズレる人は、待機時間の長さごとに個別のオフセットを設定してみるのも手です。フレームレートが精確でない以上、時間によって若干ズレることが考えられます。約2万F待機では400になることが多かったが、約3万Fでは410あたりをよく引くようなので場合に応じて使い分けてみるなど...

また、六世代は画面遷移(バッグや手持ちを開く)が行われる瞬間に消費が一定数発生しない仕組みなので、遷移する回数を一定にするのもいいと思います。

参考にしたサイト・記事

・めらめら「進化した六世代乱数調整のやり方」(めらるば氏)

larvesta10.hatenablog.com

・ぽけどころ「6世代乱数のすゝめ」(こいし氏)

taiyaki3gen.hatenablog.com

・RNGWriteups/Gen 6/Initial Seeding.md at master(Admiral-Fish氏)

github.com

*1:

https://drive.google.com/file/d/1rfc8szL5prSwojqBSg21jyOznQfIaett/view

*2:

https://docs.google.com/spreadsheets/d/13sIeK7IjEeKVFOod_JAmq-5q8S9nzQEIWb-kaDQKXBw/edit#gid=276980571

DLおよび自身のドライブにコピーしてご使用ください とのことです。

*3:個人的に調査したORASのフレームレート。シーンによって少し変動するのでお守り程度の役割。

*4:実機六世代乱数において初期seedを自由に選ぶことはかなりハードです。1/1000秒の狙い撃ちは出来ないこともないけど、V固定の少ないポケモンの理想個体が目的の時くらいにしか用いない。

*5:適当に今思いついた数字。