サイファーの日記

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

実機でのSOS乱数

今回はかけら氏が作成された仲間呼び乱数調整(SOS乱数)用ツールの使い方を説明します。

はじめに

SOS乱数はもともと海外で研究が進んでいました*1が、今年に入ってから実機でも可能であることが分かりました。特にポケモンの瞬きによって現在の消費数が特定できるようになったのが大きいです。

SOS乱数は基本的に64bitのSFMTと32bitのSFMTの両方を操作して行います。メインの前者は個体値や色違いの調整に必要で、いつものようにタイトル画面の針から初期seedを特定します。後者はスロットやレベル、V固定箇所などに関わってきますが、こちらの初期seed(SOS seed)は戦闘中の野生ポケモンの行動を元に特定することになります。

スロットもレベルも気にせず、適当に光らせたいのであればSOS seedの特定はしなくても一応可能です。ただし、仲間の呼びやすさを示すBCR(Base Call Rate)が低い種族だと難しくなるのであまりお勧めはしません。今回は両方を操作することを前提に説明していきます。ちなみに、SOSバトルはシンクロの処理が通常と異なっていたり、野生ポケモンのPP管理が必要だったりするので事前にその辺を調べておくとよいです。かけら氏の記事にPTのサンプルが載っているので、それも参考にしてみてください。

ツールは8日のかけら氏の記事に置いてあります。

手順

手順① SOS seed特定の準備

まず、SOS seedを特定する前にセットアップを行います。呼び出し元のBCRに対応した16GBのDBを作成する必要があるので、PCの容量に十分な空きがあるかどうか事前に確認しておいてください。「SOSシード検索」タブを開き、エンカウント設定を適切なものに合わせてから計算ボタンを押します。するとDBを作成するか聞かれるので、はいを選択。作成が完了するまで結構時間がかかるので寝る前に開始したりするとちょうどいいかもしれません。作成が完了するとポップアップが出てきます。

ちなみにBCRが同じ種族であれば作成したDBを使いまわせます。ただし異なる場合は追加で+16GBのDBが必要です。例えばタツベイミニリュウは同じBCR9なので問題ないが、ダダリン(BCR3)もやりたい場合は更に作成する必要があります。


手順② SOS seedの特定

セットアップが終わったら、実際の調整に入っていきます。いつものようにタイトルの針でSFMT(64bit)の初期seedを求め、目的の種族にどうにかして遭遇。現状では計算の都合上みっけポンを使ったり、釣りであればレアスポットを利用することはできません。遭遇できたら最初のターンにビビリだまを使用します。そして「SOSシード検索」タブのエンカウント設定を適切なものに合わせ、ポケモンの行動欄にターンごとの行動を記録していきます。条件にもよりますが計算量的に30ターン以上は記録した方がよさそうです。ちなみに特定中に仲間呼びが成功した場合、呼び出し補正の都合上すぐ次のターンで倒す必要があります

十分に記録して計算ボタンを押したらプログレスバーが進み、seedの候補が出てきます。候補が複数出てしまった場合、それ以降のターンの行動記録を追加し再び計算すれば絞り込めます。もし全く候補が出てこなかった場合、記録のミスや消費の不具合、および自然発生Vの補正処理(5連鎖以上続いた場合)のいずれかが原因として考えられます。消費の不具合というのは遭遇した場所によってターンごとの消費数が通常と異なる現象のことです。メレメレ海のヒドイデやシェードジャングルのメラルバ*2などで確認。

上の画像のように複数出てしまった場合は、34ターン目以降の行動も追加でいくつか選択して計算すればOK


手順③ 目標消費数(メイン+SOS)の検索

SOS seedが求まったらそこを右クリックし「結果を選択する」を表示させてクリック。「個体検索」タブのSOS設定に移動します。まず、何連鎖以降のHPバーが何色の時に目的の個体を呼ばせたいのか等を設定します。「消費数」はBCR9で30連鎖以上させた後に行う場合、300~400消費くらいが最小値になると思われます。最大値についてはヒドイデなどは500、低出現率のボーマンダなどは800もあれば十分だと思います。すぐ下の「目標の消費数」と好みによって使い分けてください。

次に検索範囲に移り、タイトルで特定したSFMT(64bit)のseedと消費数範囲を設定します。個体値を気にせず光らせるだけであれば数千消費の範囲で大体見つかります。そして個体情報で欲しい個体値や種族などを設定します。ここまで入力し終えたら計算ボタンを押して結果を出力します。今のところ目標となるSOS消費数だけに着目しておけばよいです。左から2番目の消費数については後で行う瞬きの観測時に必要です。


手順④ 目標SOS消費数まで消費

「リスト表示」タブに移動し、消費数の最大値に先ほどの目標消費数を入力します。「相手のHP」については一旦赤を選んでおいてください。「仲間呼び」のチェックは最後のターンに仲間呼びをされた場合に入れます。今のところ、仲間呼びが失敗した場合にのみ入れておけばいいです。成功した場合(理由は後述)やそもそも仲間を呼ばなかった場合は不要です。

そして「リスト出力」にチェックを入れて計算すると各消費数ごとの行動などが表示されるので、目標消費数のところで右クリックし、「経路を表示」をクリックして確認します。「到達不可能」と表示されたらその消費数では仲間が呼ばれないのでできません。到達可能であれば麻痺を回復する消費数とその後とるべき行動が表示されます。とりあえず麻痺を回復する消費数の手前まで進めていく必要があるため、「連続リスト」にチェックを入れて結果を出力します。そうすると今後のターンで相手がどういった行動をとり、消費がどう進んでいくのかがリストとして表示されます。

ゲーム内で呼び出し元にみねうちをします。仲間がいる場合、そちらを倒すより先にやってください。仲間呼びが成功した場合でもチェックを入れなかったのは、このために連続補正が入らないからです。すると、毎ターン連続リストの表示通りに相手が行動をとると思います。このままリストを見ながら麻痺を回復する消費数の手前まで進めていきます。PP管理のためのしゅうかくスキルスワップやヒメリのみトリックは、相手が仲間を呼んでこなかったターンに行うと混乱しなくて済むと思います。

ただし、時々自然発生Vの補正処理によって消費数がズレて現在消費数を見失います。その場合は、まず左下の欄にポケモンの行動をいくつか入力します。検索設定に現在の連鎖数(入力中に成功した連鎖も加える)を設定し、「消費数検索」にチェックを入れます。また、行動を入力する直前のターンの行動に応じて「仲間呼び」にもチェックを入れます。そして計算すれば現在消費数が求まるので、結果を右クリックして選択します。ちなみに結果は入力した行動の数だけ出てきます。これで再び連続リストを見ながら消費を進められるようになります。

目標消費数の付近まで消費したら、呼び出し元を麻痺状態にします。場に野生ポケモン状態異常で1匹だけ存在する場合、SOS消費数は毎ターン1ずつ進みます*3。この状態で麻痺を回復する消費数に辿り着くまでターンを経過させます。毎ターン特に何も起こらないので数取器でカウントするのがおすすめです。辿り着いたら、じょうかやクラボトリックを使用して呼び出し元の麻痺を回復します。その後は先ほど表示された経路の通りに行動してください。


手順⑤ 目標消費数(メイン)まで消費

目標消費数でおきみやげ、いのちがけをしたら戦闘の場に残された野生ポケモン一体の瞬きを観測していきます*4。この時点でスロットやレベル等は確定しているので、ここは色違いや個体値関連を調整する部分になります。

まず「瞬き検索」タブに移動し、SFMT(64bit)の初期seedを入力。NPCポケモンにもチェックを入れます。NPC数は0です。消費数の最小値は大体どのくらい消費したかが分かれば、それを入力してください。参考として約30分間戦闘を続けていると、少なくとも40000消費はされているようです。最大値はそこから+30000消費あれば十分だと思われます。

次に、検索設定の「開始」ボタンをクリックしてからポケモンの瞬きのタイミングに合わせてシフトキーを押していきます。上記の消費範囲なら大体11個くらい入力すれば現在消費数が絞り込めます。候補が2つ以上出た場合、妥当な方を右クリックして「消費数を選択する」をクリックしてください。



そうしたら「目標の消費数」にチェックを入れ、「個体検索」タブで求めた消費数を入力して計算ボタンを押します。BlinkTimerが起動できるようになるので開き、終了時オフセットを設定してから開始ボタンを押します。人それぞれのタイマー補正の癖にもよりますが、自分の環境ではオフセット22あたりで安定しました。

タイマーがスタートし、瞬きのタイミングで音が鳴りますが、フレームレートの都合上少しずつズレていきます。その都度「早める」「遅らせる」を複数回クリックして補正を行ってください。そもそも瞬きとタイマーの音が全く一致しない場合、TimeLineが間違っています。クリアを押した後に再び瞬きを入力する、消費数の範囲を変えるなどして特定し直してください。前述したように候補が2つ以上出てしまっていた場合、もう一方の候補に選択し直すのも有効です。そして、タイマーのカウントが0になったらAを押して手持ちからポケモンを繰り出します。

タイマーが0になるまでこの画面で待機


失敗時の対処

ここでSOS消費数が合っていれば、野生ポケモンがスロット、レベル等がその消費数のものと一致した仲間を呼び出します。瞬きで調整した通常の消費数も合っていれば、色違いや個体値等も思った通りになります。もしSOS消費数がうまく合わなかった場合は、自然発生Vによる補正処理による消費ズレが原因の一つとして考えられます。ただ、最初の内は些細なミスをしている可能性もあるので適当なSOS消費数を狙って何度か練習するとよいです。

メインの消費数が合わなかった場合は3DSRNGToolで消費数のズレを確認します。野生乱数タブの「乱入バトル」にチェックを入れ、Consider Delayは外し、NPC数を0にした状態に設定します。そして「Seed」にSOS seed、「Frame」にSOS消費数、「Chain Length」に連鎖数を入力して検索します。連鎖数については、V固定数に応じた一定の数であれば厳密に設定する必要はありません。

今回引いた個体の消費数が見つかったら元のツールの「オフセットを計算」にチェックを入れ、「目標の消費数」の右側に入力して計算します。例えばオフセットが2と表示された場合、今回の終了時オフセット + 2としたものを今後は使用してください。

補足

一部に瞬きをしない、見づらい種族がいます。その場合の瞬き観測ですが、手持ちのヤドキングなどの一部のポケモン(背中側から観測できる)を使えば以下の手順で一応可能です。ただし、呼ばれた仲間が場にいる場合に限ります。

ジュゴンのなかまづくりやマナフィスキルスワップ等で呼び出し元の特性をうるおいボディにする。
②レベルアップ直前のヤドキング(こうこうのしっぽ所持)に交代し、シンクロ等を適用したい場合はその特性を所持する仲間へスキルスワップを行う。次のターンで呼び出し元にあくびをうつ。その次のターンであまごいをする。
③仲間を攻撃技で一撃で倒してレベルアップする。
ヤドキングの頭部の巻貝の瞬きを観測して目標消費数まで消費する。タイマーのカウントが0になったタイミングでレベルアップのメッセージを飛ばす。
⑤雨で呼び出し元が眠りから覚めて、SOS消費数に応じた行動をする。

この画面でヤドキングの瞬きを観測する

回りくどいですが、このようにして野生ポケモンの瞬き判定を考慮しなくてもTimeLineの特定ができます。ただし、事前に仲間が呼ばれていないと不可能なので任意のSOS消費数に辿り着くには少し工夫が要りそうです。起きているポケモンが2匹以上存在する時の瞬き処理が分かれば、もう少しシンプルになるかもしれません。

あとがき

ここまで読んでいただき、ありがとうございました。ぶっちゃけた話、手順がかなりややこしいのでどうしても欲しい個体がいる人にしかおすすめできません。

これを調査したのはランクマ用にレベル50止めできるカイリューウルガモスを捕獲したくなったのがきっかけです。ただ自作のプログラムではSOS消費の管理はできても、瞬き処理の方がややこしくて停滞していました*5。しかし、かけら氏が実装されたツールは瞬きタイマーが備わっており、その面でも不足がありません。興味のある人はやってみてください。



レベル50で怒りの粉を使えるのは7世代産まで(らしい)

*1:Bambo-Rambo氏の解説記事に詳しいです。

*2:メラルバに関しては仲間呼びが成功した時の消費数だけがおかしく、そもそも呼ばなかった時と呼び出しが失敗した時は大丈夫でした。

*3:ちなみに、場に野生ポケモンが2匹いる間はターンが経過してもSOS消費数は進みません。

*4:おきみやげやいのちがけをしたポケモンの大きさによってこの場面のカメラ位置が異なります。場合にもよりますが、ヒトモシのような小さいポケモンの方が相手の瞬きを捉えやすかったです。

*5:ポケモンの瞬きは基本的に(乱数値 % 120 + 130 + 1)フレーム後に発生するが主人公の瞬きの影響を受けるため、多少複雑になっています。