かけらの記録ノート

かけらの記録ノート

主にポケモンの乱数について語るブログ

【7世代乱数】瞬きを利用した乱数調整

この記事はPokémon Past Generation Advent Calendar 2022 23日目の記事です。
温めていたやつを公開します。
adventar.org

7世代のフィールド上では、常に高速で消費が起こっており、これが瞬きの判定に使われていることは有名です。

サンムーン固定乱数仕組み : ただの雑記byさき

今までに確立された乱数調整では、瞬きの消費を考慮して待機時間の計算を行い、目標の個体とエンカウントする、という方法でした。しかし、このやり方では、複数npcがいる場合だと正確に目標を狙うことができないという欠点があります。これは、フィールドに遷移するときの不定消費によって乱数がずれるため、フレーム当たりの瞬きの順序が不定になるためです。この辺の説明は難しいので、解説サイトに丸投げします。
pokerng.forumcommunity.net
このずれは、直接瞬きを観測することによって解消することができます。瞬きの順序を考慮した消費の系列(TimeLine)を特定することで、引くことのできる個体を正確に予測ができるようになります。ただし欠点があり、エンカウント直前にカットインが入る固定シンボルは、不定消費を挟むため、その処理を考慮しなければ正確な計算ができません。3DSRNGtoolで考慮されてたかわ忘れました!されてたら問題ない。そもそもnpc1ごときで瞬きを使う必要性がないが。
ついでにTimeLeapという概念について説明します。ダイバージェンス1%で時をかけそうな雰囲気がありますが、だいたいその通りで、TimeLineの系列の間に不定消費を挟むことで、目標のTimeLineに到達する手法のことを指します。要はTimeLineの調整です。

そんな感じで、瞬きを考慮して乱数調整を行うことができるツールを作ったので、主な使い方について説明します。

  • 7genBlinkSearch

drive.google.com

2022 12-23

  • 後悔

今回は例として、npcが4である配達員乱数を行っていきます。

  • 準備

ゲーム内では、オハナタウンのポケモンセンターで所定の場所でセーブしておきます。主人公の瞬きが見えることが重要です。

  • TimeLineの特定

初期シードを求めたあと、従来の7世代乱数と同様にQRスキャンに入って針から消費数を特定します。消費数が分かったら、ツールの一番左の枠に入力できる「シード」と「消費数」にここで求められている初期シードと消費数を入力しておきます。

真ん中左の瞬きの設定に移ります。検索範囲はデフォルトのままで良いです。これは上で指定した消費数から瞬きの観測を始めるまでの待機フレームの範囲を表しています。デフォルトでは余裕を持って10000Fとしていますが、さらに短くても構いません。
ゲーム内でQRスキャンを閉じてフィールドに戻ります。そして、配布ポケモンを受け取る直前の画面まで進めてから主人公の瞬きを観測していきます。

下の「開始」ボタンをクリックして、主人公が瞬きをするのと同時に「shiftキー」を入力して瞬きを記録します。ここらへんはCoと同じ。7世代では2回連続で瞬きをする場合がありますが、これも1回とカウントしてください。
うまく入力ができたら、「Timelineを計算」をクリックします。うまく入力ができていればResultが表示されます。

ここでうまく結果が出ない場合は、npc数の設定が間違っている場合があります。入力ミスがないか確認するか、もう一度特定し直してみてください。また、入力する瞬きが極端に少ない場合、間違った結果を表示する場合があります。余裕を持って入力してください。

  • オフセットの特定

まず初めに、Coでおなじみのオフセットを求めます。仕組み的には大体同じで、空白時間を考慮する意味合いです。
真ん中右のタイマーの設定に進みます。まずは、求めたTimelineが正しいかを検証します。「目標の消費数」を適当な数字に設定して右のタブに進み、「計算」を押します。そうするとタイマーが有効になるので、「BlinkTimer」を起動します。ここでタイマーの音と主人公の瞬きが一致していれば正しいTimelineを求められていることが分かります。

タイミングの調整を行ったら、そのままタイマーが終わるまで待機して、終わると同時に配布ポケモンを受け取ります。
※ツール上で正しいfpsが設定できていないため、長時間待機すると微妙にずれます。なのでなるべく同じ待機時間でタイミングの調整を行って再現性が取れるようにしてください。
受け取った配布ポケモンの消費数を3dsRNGtoolなどを使って検索します。ここでDelayの設定は無効にしておいてください。
ここで出た消費数とツール上の計算結果の一番下に表示された消費数の待機時間の差がオフセットです。※Timelineの関係上、目標の消費数で設定した消費数と同じものになるとは限りません。これを調整するのがTimeLeapと呼ばれる手法になります。
下に進んで、オフセット検査の項に「目標の消費数」->「実際に出た消費数」となるように入力して計算をクリックします。正しく入力されていれば結果が出ます。私の環境では、なんと「0」でした。ほんとか?

こちらのオフセットはCoとは違い、猶予時間は存在しないので1でもずれると失敗します。何度か求めて安定する値を探してください。また、展開があるポケモンだと正しいオフセットを求めるのが困難なので、V固定のないポケモンでオフセットを求めることをおすすめします。
オフセットが安定したら③に進みます。

  • TimeLeap

事前にツール上の「ふしぎなカード」から受け取る配布ポケモンの情報を入力しておきます。※これが正しくないとうまくTimeLeapを行うことができません。

①の項で配達員からポケモンを受け取る直前ではなく、そのひとつ前の画面でTimelineを特定します。

理想個体を行う場合などは、事前に大量消費を行った状態で消費数を入力しておいてください。
うまく求めることができたら、真ん中右の枠で「TimeLeap」を選択して、目標の消費数に欲しい個体の消費数を入力します。※ここで注意として、現在の消費数から目標の消費数までの間隔が短いとうまい具合に候補が出ないことがあります。ツールの操作中も待機が行われていることを考慮して、少し長めにしておくと良いです。
そして計算をクリックします。そうすると、計算結果に消費数が並んだものが出力されると思います。これがTimeLeapを行うことができる消費数です。ここで、消費数がなるべく連続しているところを狙います。これがいわゆる展開のようなもので、猶予フレームになります。npcの活性化状態にもよりますが、前後で4消費未満の消費数が多く連続しているところを探し、その中間あたりを選択したら、右クリックから「消費数を選択する」を押します。

そして、うまく選択した消費数までの計算結果が表示されたら、BlinkTimerでその消費数まで消費を行います。ここでオフセットは事前に求めたものを入力しておいてください。
タイマーが終わると同時にAボタンを入力して画面を進めます。

ここで再度Timelineの特定を行います。そして、目標の消費数を設定して検索を行い、計算結果の最後がうまく目標の消費数と一致していればTimeLeapの成功です。もし一致しなかった場合は待機時間のずれ、もしくはふしぎなカードの設定ミスが考えられます。
一致したら、そのままタイマーが終わると同時にポケモンを受け取ります。目標の個体なら成功です。
sina-poke.hatenablog.com

今回は配達員乱数での説明を行いましたが、この手法が完全に理解できれば他の固定シンボルにも応用することができると思います。検証してくださった有志の方によると、タイプ:ヌルやサトピカ、べベノムなどの乱数調整が簡単になるらしいです。あとついでに、御三家もできるらしい。
このツールはもともと配達員専用みたいな想定で作っていたのですが、いろいろ応用が利くと分かって驚きました。でも、TimeLeapは配達員にしか対応していないので注意してください。

この仕組みをすんごく応用すればSOS乱数が実機でできる可能性があります。調べてないので分からんけど、仕組みはCoの連続戦闘をそのまま使えそう。今のところ興味がないし大変なので調べないが、誰かやってみてはイカがでしょう?

24日目の記事はイカゲームの乱数調整についてだそうです。ギアの乱数調整などが話題になっていたようですが、さらにそこから進歩したとのこと。バイトしかやってないにわかなのであまりありがたみを感じられませんが、仕組みはとても気になります。バイトにもギアを実装してくれ...