Hatena::ブログ(Diary)

おしゃれボールはステータス Twitter

2099-12-07 トップ記事

くずひこと申します。

このブログでは主にポケモン3世代4世代5世代、(6世代)、7世代乱数について扱う予定です。
応用乱数が主になるので少々難易度が高いものが多いです。
基本的な乱数は出来るという前提で記事を書いている場合が多いので、ご注意ください。

至らぬところもありますがこのブログが誰かの役に立てれば幸いです。

※勝手にリンクをしている部分があります。支障がありましたら申し付けください、ただちに対処いたします。

各記事へのリンク
3g
楽なEmのSID特定
RS釣り乱数
RS孵化乱数

4g
ポケトレ使用乱数1(seed把握)
ポケトレ使用乱数2(ポケトレ限定ポケ)
ポケトレ使用乱数3(テーブル固定)
ポケトレ使用乱数4-part1(光る揺れ)
ポケトレ使用乱数4-part2(2連鎖)
ポケトレ使用乱数4-part3(3連鎖以上)
サファリ乱数

5g
色夢ウォーグル乱数
砂埃・揺れ草・水上泡乱数

6g
6g乱数に関する分かっていることのまとめ

7g
SM孵化乱数に関するあれこれ
SM孵化乱数
自然発生色違いからTSVを求める
SM固定乱数に関するあれこれ

その他
ペラップの鳴き声を聞くことのメリットについて
TSV・PSVとは何か

2017-01-18

SM固定乱数に関するあれこれ

もはや更新することはないだろうと思っていたのに固定乱数実用化一歩手前まで来てました。
現状ツールを自作できる人しか出来ません。

・参考文献
smogan様(海外サイト) SFMT RNG in Sun&Moon
ただの雑記byさき様 サンムーン固定乱数仕組み
ろいしんブログ様 SM乱数調整における初期seed確認方法の提案

三つの参考文献に必要なことは全て書いてありわざわざ私が語ることはほぼないのですが一応。


Q1.固定乱数孵化乱数は別物って話じゃなかった?

A1.野生ポケモンに使用される乱数生成法がSFMTだと判明しました。



Q2.初期seed調整はどうするの?

A2.決定方法が不明なので調整できません。引いたseedを確認して目標個体までの消費数を検索して頑張るしかありません。



Q3.現在seedはどうやって確認するの?

A3.QRスキャン時やゲーム起動時に表示される時計の針、手持ち画面でポケモンをタッチしたときの反応などの観測データから総当たりで検索します。
 この際、総当たりするデータ量がすさまじく多いため、あらかじめ数十GB~数TBデータベースを作成しておくことが望ましいです。


O4.現在seedを検索で分かったとして目標個体までどうやって大量消費するの?

A4.主人公の瞬き判定が一秒間に30回入るためそれで消費できます。
 NPCや地形などでも消費が入るらしい。もしかしたらペラップでも出来るかも?



Q5.色違いもできるの?

A5.性格値の決定方法が判明すれば可能。



Q6.固定シンボルだけじゃなくて野生やヌルもできるの?

A6.野生の場合は出現ポケモン決定方法の解明が必要だがそのうち出来そう。



Q7.どうやってやればいい?

A7.ツールが公開されるのを待ちましょう。1TBほどのHDDが必要になるかもしれません。

2016-12-25

自然発生色違いからTSVを求める

7世代で色違い乱数を行うにあたって必要なTSVを求めます。

TSVを求める方法には大まかに二通りあります。
1.孵化で出た色違いの個体のPSVを求める。
2.セーブデータ(バトルビデオ)を解析する。

ここでは1の方法について述べます。

前記事→TSV・PSVとは何かにて、色違いの個体におけるPSVとTSVは一致していると記載しました。
ここでは国際孵化で色違いが出るまでタマゴを割り続け、出た色違いのPSVを求めることを目標とします。


用意するもの
国籍の違うコイキング♂♀
・現在seedを特定済みのSM
SM孵化乱数ツール(私が使っているのはくあん様のSMHachingRNGTool)
・光るおまもり(あると楽)


まず今作の孵化スキーム(個体決定の処理の順番のようなもの)について簡単に解説を。

今作は
(二ドラン♂♀、バルビートイルミーゼ判定)

性格判定

(性格遺伝判定)

特性遺伝判定

(パワー系遺伝判定)

遺伝箇所判定

基礎個体値決定

暗号化定数決定

仮PID決定

(性格値再計算)

(ボール遺伝判定)

謎の消費2(個体生成の最後か最初か不明)

となっています。詳細はろいしんブログ様→ポケモンSM乱数調整について

ここで今回注目すべきは(性格値再計算)の位置。タマゴから生まれたポケモンの性格値はこの位置で決定していることになります。
性格値を決定した後に行われる消費はボール遺伝判定と謎の消費の3消費のみ。
ということは色違いが生まれた次のseedから4つ遡れば性格値決定の場所が特定できる理屈になります。


step1 色違いを探す
コイキング二匹を何も持たせず預け屋に預け、タマゴを作り続けます。
タマゴは拒否せず受け取り続けるようにします。
国際孵化と光るおまもりの併用が理想ですが、国際孵化もしくは光るおまもりのみでも色違いが出るまで粘れるのであれば問題ありません。
ただし、国際孵化と光るおまもりどちらかがないとTSVは特定できません。注意しましょう。

無事色違いが生まれたら、そのままもう一つタマゴを受け取り、詳細な個体情報をメモします。
色違いが連続孵化を始めてから何匹目で生まれたかを記録し次に進みます。



step2 性格値を探す
SM孵化乱数ツールを起動。連続受け取りリストを出力します。
色違いが出た位置の消費数を確認します。

次に個体検索のタブで色違いが出た消費数付近のリストを出力します。
実際に色違いの次に生まれた個体が、本来次に生まれるべき消費数の上0~7行のどこかにあるはずです。
見つけたら、更にそこから消費数を3遡ります(※使用するツールによって差があります ここではSMHachingRNGTool)。
遡った欄の乱数列の項目が今回の目標とする色違いの個体の性格値です。


例えば色違いの次の個体が消費数50だったならば性格値は消費数47の乱数列、消費数1000だったならば性格値は消費数997の乱数列となります。


step3 TSVを計算する
TSV=PSV→(性格値上4桁)xor(性格値下4桁)の二進数上位12bit
で求めます。windowsの備え付けの電卓に16進数計算機能がありますので活用してください。
10進数に変換すれば特定終了です。各ツールに入力して色検索にご活用ください。


※最新のバージョンだとそもそもPSVが表示されているので計算過程はカットできるようになりました。


おまけ

錆びたコイル様のツールには「効率よく色違いを探す」機能が実装されているようです。
既にTSV候補ではないと分かった乱数列をなるべく飛ばして未判定の乱数列を上手く潰していけるようにマネジメントしてくれるもののようですね。


質問はコメントかツイッターにて。
ツイッターの方が迅速に対応可能です。

2016-12-23

TSV・PSVとは何か

6世代、7世代乱数方面の話題においてよく名前を見聞きする「TSV」「PSV」という単語についてやや突っ込んだ話をしていきます。
同時に5世代以前の話にも通じる色違いについての話に少し触れていきます。誰か既に書いてそうな内容だけど。

2進数と16進数の最低限の知識がある人向けです。

※コメントでご指摘頂いたbit表記、桁表記の誤りを修正しました。(2017/1/18)



・色違いの判定について

ポケモンの各個体には「性格値」と呼ばれる値が設定されています。
性格値は便宜上16進数8桁で用いられることが多いです。2進数で表す場合32bitです。

色違いの判定に用いる計算式は以下。
(TID)xor(SID)xor(性格値上4桁)xor(性格値下4桁)≦15(5世代以前は7)

TID、SIDはそれぞれ「表ID(TrainerID TID)」「裏ID(ShinyID SID)」のこと。
また、TIDとSIDは16進数4桁・2進数32bitで表されますが、これをさらに10進数に変換したものが馴染み深いと思います(6世代以前でトレーナーカードに表示されているもの)。

7世代ではトレーナーカードに表示されるIDが6桁に変更されましたが、これは計算式が変更されただけで今までと仕様上の違いはありません。
計算式は以下。
ID = (SID + TID * 65536) mod 1000000


・色判定式の解釈

前項で出た色違い判定式
(TID)xor(SID)xor(性格値上4桁)xor(性格値下桁)≦15
について細かく考えていきます。

計算に用いる4つの項の内、TIDとSIDはロム毎に存在する固有の数値であり定数です。
ということは、(TID)xor(SID)の部分は予め計算しておきロム依存の数値として一つにまとめることが可能です。これを仮にAとしましょう。
更に(性格値上位4bit)xor(性格値下位4bit)の部分はポケモンの個体それぞれに依存する値のため、こちらも予め計算できそうです。こちらをBとします。

つまり、色判定式を
{(TID)xor(SID)}xor{(性格値上4桁)xor(性格値下4桁)}≦15
(ロムに依存する16進数4桁の値A)xor(個体に依存する16進数4桁の値B)≦15
と変形します。

xorは排他的論理和のことで、2進数各bitを比較して一致していなければ1を、一致していれば0を返す演算
左辺でxor演算をした最終結果が15以下であるということは即ち下位4bitまでで収まる数字であればよいということで、言い換えると
終結果の上位12bitが0であれば色違い判定を通過することになります。
よってAの上位12bitとBの上位12bitが一致していること」が色違いになる条件です。



・TSVとPSV

色違い判定で必要なのはAの上12桁とBの上12桁ですので、下4桁は必要ありません。
下4桁をカットして12bitの値としたものがTSV(TrainerShinyValue)とPSV(PokemonShinyValue)の正体です。
決して色違いの仕様が大きく変わったわけでも、新たに数値が実装されたわけでもありません。
6世代以降急速にこれらの単語の知名度が上がったのはSV孵化法というものが広まったときに、こちらの方が便利だったからでしょう。
2進数や16進数で扱うのは面倒ですので、通常は10進数(0~4095)で表します。


一応まとめておくと
TSV→(TID)xor(SID)の上位12bit
PSV→(性格値上4桁)xor(性格値下4桁)の上位12bit
色違いの個体に限り(TSV)=(PSV)

これで自力でTSV、PSVを計算できますね。
7世代乱数ではTSVを求めるためにまず色違いが出るまで孵化をし、PSVを計算する手法をとります。
乱数列の出力リストから性格値に用いられる値を探し、PSVを計算することになります。
その方法はいずれまた。

追記:書きました→自然発生色違いからTSVを求める

2016-12-21

SM孵化乱数

SM孵化乱数に成功しましたので記事にします。

前記事→SM孵化乱数に関するあれこれを読んでおくことをおススメします。

・参考文献(読んでおくことを強くおススメします)
ろいしんブログ様 SM孵化仕組み検証
ろいしんブログ様 ポケモンSM乱数調整について
ぽよノート様 SM孵化の乱数列生成アルゴリズムについて
ぽよノート様 Tiny Mersenne twisterの逆算
oupoの日記様 出力関数が線形な場合のTinyMTにおいて連続する4つの乱数値からstateを得る
ただの雑記byさき様 SM孵化乱数列を計算する


用意するもの
SM孵化乱数ツール(後述)
国籍と性格の違うコイキング♂♀(個体値をそれぞれ特定していると尚よい)(ボールが違うと尚よい)
赤い糸
・変わらずの石2個
・目的の個体を孵化するための親(乱数の下準備を済ませてから調達も可能)



SM孵化乱数ツールについて
2016/12/21時点で私が認識している限り三人ほどツールを公開していらっしゃいます。
本記事ではくあん様のSM孵化乱数ツール(DL先SM孵化乱数調整ツール)を用いて説明することにします。


※本記事ではver1.15aに対応しています。更新の内容によっては作業が楽になっている部分がありますのでよく確認してください。


step1 現在seedを特定する
今作の乱数ではDS本体の時間を変更して初期seedを調整するという作業ができませんので、まずは自分のロムの現在のseedを求めることから始めます。

預け屋にコイキング2匹を預けます。この時、両方に変わらずの石を持たせます。

次に、以下の手順を繰り返します。
1.タマゴができたら受け取りを拒否(破棄)する。
2.即座にレポートを書く。
3.タマゴができたら受け取り、孵化させる。
4.産まれた個体の性格をメモする。(必要ではないですが性別・ボールもついでにメモするとミスが減ります)
5.レポートを書かずにリセット。

1~5を127回繰り返します。127匹分のコイキングの性格を確認することができたら終了です。
この作業が最も今作乱数の大変な部分であり、ミスが多発するポイントとなっています。

確認した性格から現在seedを求めます。
さき様のSM孵化乱数列検索ツール(WEB版)に性格を入力します。
このとき、♂親から遺伝した性格を0♀親から遺伝した性格を1として127桁の0と1の羅列にして入力します。

参考までに私が実際に入力した形式は以下
0100011101101101001111110000000000110111010111011110101110010110011011000001110010111101111010111111111101100000101111110101011

性格確認にミスがなければ検索結果に16進数8桁の数字が4つ出たはずです。これらが現在seedとなるので確実にメモしましょう。
私の場合は以下
35c26e3a 69a19f86 e26b7726 26269592

一度現在seedを特定したロムでは、孵化をする場合にはタマゴをいくつ受け取りいくつ拒否したかという詳細な情報を全て記録しておかなければならないことに注意してください。





step2 乱数列の確認
SM孵化乱数ツールを起動します。

個体検索タブを開き、検索範囲のボックスに先ほど求めた現在seedを入力。
消費数は0~150、その他ボックスの国際孵化にチェックを入れリストを出力します。

孵化リストが出力されたはずです。
step1の作業のときに性別をメモしていた人は、リストの0~127付近を確認すれば性別の並びが一致していることが確認できます。
ただし、ツールで出力された消費0~127の位置と実際の並びとは多少ズレがあるはずです。
これは孵化の仕様が完全に解明されていないこと、ツールの作成者がそれぞれ違うために統一した処理がなされていないことや、孵化スキームにおいて性格遺伝判定が最初でないこと等が原因です。
なのでまずはこのズレを修正します。


step1で用いたコイキングに今度は変わらずの石を持たせずに預け屋に預けます。
step1の作業を終えてタマゴができてしまっている場合は受け取らずに拒否して持ち物を回収してください。

一つタマゴが出来たら孵化させ、性格を確認します。この性格が出力したリストの消費数122~127付近にあったらその位置が正しい現在の位置だった場所です。
タマゴを一つ受け取ったことで更に消費が発生しているので、リストにある「受け取り消費」の数字分あなたのロムは消費が進んでいます。
例えば、タマゴの性格が消費数125の位置と一致していて、その欄の受け取り消費が20となっていた場合現在の消費数は125+20=145です。
次のタマゴの個体は消費数145の欄と一致します。
このことを理解し、自分のロムが今消費数いくつなのか、それを確認するにはどのような手順を踏めばいいのか、これらを把握しておけばもはや乱数調整は成功したも同然となります。

ちなみに出力したリストと全く結果が合わない、一致する箇所が見当たらない場合は設定のミスまたは性格確認でのミスの可能性が高いためしっかり確認してください。





step3 狙いの個体を孵化させる
あとは自分の狙いの個体が消費数いくつで生まれるのか検索をかけ、その消費数まで乱数を消費してタマゴを作るだけです。
あらかじめロムのTSV(色違い判定に用いるもの)を特定していれば色違いで検索をかけることも可能です。
ここでは消費数の調整の話をしておきます。

本作で孵化乱数の消費が発生するのは
タマゴを拒否する→1消費
タマゴを受け取る→15~50消費ほど(ツールで確認可能)
の以上2パターンです。
これ以外の消費方法は現在発見されておりません。
よってこの二つを組み合わせて目的の消費まで行く必要があります。

必要消費が少なく30程度で済む場合は、30個タマゴを拒否するなり、タマゴを一つ受け取ったときの消費をリストで確認して残りを拒否で消費するなりで容易に達成できます。
ただし、色違いを狙うとなると話は別で、数千消費がザラにあります。

ここで使うのがツールに実装されている連続孵化リストのタブ。
こちらのタブでは、「タマゴを拒否せずに連続で受け取っていく場合の連続個体リスト」を出力できます。
消費数もしっかり表記されているため、こちらのリストを上手く使えば消費数を調整しやすくなります。

実際の例でいきますと、私は消費7108の個体を狙う場合に、連続孵化リストを確認しながら219個タマゴを受け取り7080消費を行いました。
このあたりは個人の匙加減や親の都合で変動するので、ツールを使いこなしリストと睨めっこしながら決めてください。

ちなみにタマゴ受け取りの消費数は
赤い糸を持たせたり、国際孵化や光るおまもり所持で増え、
メタモンを親にしたり、パワー系を持たせると減ります。

※Sn様のツールだと自動で受け取り数、拒否数を計算してくれる機能が実装されているようです。

目的の消費数まで到達したらタマゴを受け取り乱数調整は終了となります。
終わったら、最終的に消費数いくつまで乱数が進んだかを記録しておいてください。次の孵化ではそこから消費がスタートします。

成功画像です↓



step1で求めた現在seed 35c26e3a 69a19f86 e26b7726 26269592からカウントして25842消費の個体です。

次は色孵化をするための下準備において記事にする予定です。

質問はコメントかツイッターにて。
ツイッターの方が迅速に対応可能です。
また、本記事では詳細な説明を敢えて省いた部分がありますが、冒頭の参考文献を読んでいただければ基本的に自己解決できるものばかりです。