ろいしんぶろぐ

乱数調整とか

ポケモンSM乱数調整について

この記事は Pokémon RNG Advent Calendar 2016 18日目の記事です。

www.adventar.org

 

 

まずポケモンSMの乱数調整の現状について

 

固定シンボル乱数

全く調査が進んでいません。

再現性がとれないので実機検証による調査もできません。

今後も研究が進むことは恐らくないでしょう。

2016年の末から調査が進み,2017年1月に調整可能になりました。

今後さらに発展することが期待されます。 

 

孵化乱数

ほとんどの調査が終わりました。

乱数列の生成方法,乱数列の処理方法,現在seedの特定方法などなど乱数調整に必要な情報は全て明らかになりました。

今後研究が進んで便利になることがあるかもしれません。

僕もSMを買えば自分で調査をするつもりなので新しい発見があるかもしれません。

 

ポケモンでの乱数の使われ方についてですが,BW2から孵化に関して専用の乱数列が設定されていて,野生ポケモン個体値やその他ゲーム内でのランダムな事象とは独立に計算される,という仕様になっています。

つまり,どんなに野生ポケモンと戦おうがどんなに固定シンボルを厳選しようが孵化用の乱数列は全く影響を受けない,ということです。

このような方式が採用されている以上,孵化用乱数を解明したからといって全く別物の固定シンボル乱数ができるようにはならないです。

 

ということでこの記事では仕様の明らかになった孵化乱数についていくつか書いていきます。

 

 

初期seedの決定方法

わかっていません。

BW2のときは「さいしょからはじめる」でゲームのデータを最初につくったとき(ぼうけんを始めたとき)に孵化用乱数の初期seedが決められていました。

恐らく今作もそのあたりで決まっているんでしょう。

初期seedがわからないならどうやって乱数調整するんだ,と思う方もいるかもしれませんが,実は全く必要ありません。

乱数調整に必要なのは「どこからスタートしたか(初期seed)」ではなく,「今どこにいて(現在seed)」「この先何が起こるか(処理スキーム)」だからです。

しかも今作では一度決定された孵化用乱数列のseedは再設定されないという仕様になっているので,一度現在seedを特定してしまえばその後に起こることは全てわかるというかたちになっています。

 

現在seedの求め方

現在seedを特定する上で必要になるのは「孵化用乱数列上の連続する127個の最下位bit」です。

この127個のbit列を特定するには孵化パズルを解くなり127回タマゴを破棄するなりして頑張ってください。

bit列を特定したらさきさんのwebツールで孵化用seedを求めましょう。

前述の通り孵化用seedの再設定は起きないので,一度seedを特定してしまえば再びseed特定作業が必要になることはありません。

 

処理スキーム

前回の検証記事でだいたい書きましたが,その後の調査で詳細なスキームが判明したのでここでまとめておきます。

 スキームに括弧がついてるものは条件付きで発生するもの。括弧がついてないものは必ず発生するもの。

(ニドラン系列,バルビートイルミーゼ判定)

↓  //満たす場合は乱数mod2で産まれる子の決定(乱数1個消費)

(性別判定)

↓  //♂のみ,♀のみ,性別不明は消費なし。♂♀ある場合は乱数mod252が閾値より小さければ♀(乱数1個消費)

↓  //♂:♀=1:1の場合の閾値は多分126。♂:♀=7:1の場合の閾値は30。それ以外は未検証。

性格決定

↓  //乱数mod25で決定

↓  //かわらずのいしを持っていても乱数1個消費

(性格遺伝判定)

↓  //両親かわらずのいしの場合は乱数mod2でどちらの親から遺伝か決定(乱数1個消費)

↓  //0なら♂親,1なら♀親

 特性遺伝判定

↓  //乱数mod100で判定。メタモンとの相方から遺伝すること以外はBW2での遺伝方式と同じ(乱数1個消費)

(パワー系遺伝判定)

↓  //両親がパワー系を持っている場合は乱数mod2でどちらから遺伝するか判定(乱数1個消費)

遺伝箇所決定手続き

↓  //乱数mod6で遺伝箇所,乱数mod2で遺伝親決定

↓  //通常3箇所,親があかいいとを持っている場合は5箇所決まるまで処理(乱数たくさん消費)

基礎個体値決定

↓  //乱数mod32を6回繰り返して基礎個体値を生成して遺伝箇所で上書き(乱数6個消費)

暗号化定数

↓  //ポケモン個体データ生成のためのおまじない。パッチールの模様はこれ(乱数1個消費)

↓  

仮PID生成

↓  //孵化乱数列とは異なる謎の値を取ってきて仮PID生成(乱数0個消費)

(性格値再計算)

↓  //光るお守りを持っていれば2回,国際孵化の場合は6回,両方なら8回再計算(それぞれ回数分乱数消費)

↓  //色違いを満たすPIDが出ればそこで再計算終了

(ボール遺伝判定)

↓  //両親が同じ種族の場合は乱数mod100が50未満かで判定。両親が同じボールでも判定(乱数1個消費)

↓  //50未満なら♀親から遺伝

その他謎の処理

(乱数2個消費)  //個体処理の前に入るか後に入るか不明

 

となっています。

お守りなどでPID再計算が起こる前の仮PIDは色判定を行わないので,それぞれの再計算で色違いが産まれる確率は

光るお守り:約2倍

国際孵化:約6倍

両方併用:約8倍

となっています。

お守りなし国内孵化の場合は仮PIDで色判定が行われるので色違い確率は1/4096となります。

 

現在seedと処理スキームさえわかれば乱数調整できるので,とりあえずこれで孵化乱数は終わりです。

その他気付いたことがあれば随時追記していきます。

みなさん楽しい孵化乱数ライフをどうぞお送りください。