ろいしんぶろぐ

乱数調整とか

ポケモンXY国際孵化の色違い判定について

※現状仮説段階でしかないので読み物程度に思ってください。 

 ※XYでのパッチールの模様は性格値とは別の値で決まっていることが後にわかったので少し書き直しました。(2014/3/21)

 

題名通りXYの国際孵化での色判定について、です。

 

前提としてXYの通常の色判定

1.TSV…トレーナーの表IDと裏IDをxorしたものの上位12bit

2.PSVポケモンの性格値を上下16bitずつに分けてxorしたものの上位12bit

3.TSV=PSVを満たせば色違いになる

これが正しいものとして話をすすめていきます。

 

国際孵化の事象を観察する上で新猫さんによるパッチールの国際孵化の事例を使用しました。

 

f:id:Blastoise_X:20131218003447j:plain

f:id:Blastoise_X:20131218003458j:plain

 

上:国内孵化

下:国際孵化

どうも同じ模様で色の成否が異なっているようです。

 

第5世代まではパッチールの模様が性格値から決められていたので今作もそうなっていると仮定すると同じ性格値で色の成否が異なるという結果になっています。

 XYのパッチールの模様は性格値とは別の値によって決められているので、この仮定が成り立ちませんでした。

 

このパッチールパッチールペインタDPt版で再現してみました。

f:id:Blastoise_X:20131218010335j:plain

性格値C707F0C4ぐらいかなと予想できます。

これを上下に分けてxorしてみると0x37C3となって新猫さんのTSV3568(0xDF0X)と異なっています。

 

ここからが本題

0x37C3と3568(0xDF0)を2進数で表記してみました。

 

0x37C3…0011011111000011

0xDF0  …110111110000

 

0x37C3の3~14bitの部分が0xDF0と一致しました。

 

これが偶然じゃないとすれば、今回の国際孵化での色判定は性格値からPSVを算出する場所を1bitずつずらしていって色になればそこで終了となっている可能性がありそうです。

わかりにくいと思うので書き方を変えるとこんな感じです。

for(i=4;i>=0;i--){

PSV=(HID^LID)>> i  mod 0x1000

}

この判定法なら1性格値で判定は最大5回まで行われることになりますね。まぁ妥当な確率ではないかと思います。

 

国際孵化の補足ですが、この色固定の最中に親を変えて調査した新猫さんの結果で、

日本ROMで海外言語を選択したトレーナーのポケモンを親に使用しても色違いが産まれたことから、

言語のみを海外に変えたポケモンと純日本産の組み合わせでも国際孵化の判定になる

ことがわかっています。

 

Special thanks

新猫さん

 

 

(追記)

プルナレフ氏の協力のもと、孵化に用いられる乱数列を固定した状態で国内孵化と国際孵化を切り替えたときに個性が変わるのかという実験を行いました。

 

供試個体

JPNゴース♀   HBCDS(赤い糸) 

JPNゴース♂   HBCDS(かわらずの石) 

ENGゴース♂   HBCDS(かわらずの石)

 

方法

♀を育て屋に預けた状態でレポートを書き、JPN♂を預けて1つ目の卵の個体値、個性を確認したのち、セーブせずにリセット

次にENG♂を預けて1つ目の卵の個性を確認し、固定してある卵を破棄する。

この作業を10回繰り返した結果

 

1回目 

日 HCDS 昼寝をよくする 

英 HCDS 昼寝をよくする 

2回目 

日 HCDS ものおとにびんかん

英 HCDS ものおとにびんかん

3回目 

日 HBCS うたれづよい 

英 HBCS うたれづよい

4回目 

日 HBCD イタズラがすき

英 HBCD イタズラがすき

5回目 

日 HBDS うたれづよい 

英 HBDS うたれづよい 

6回目 

日 HBDS うたれづよい 

英 HBDS うたれづよい

7回目 

日 HBCS うたれづよい 

英 HBCS うたれづよい 

8回目 

日 BCDS うたれづよい 

英 BCDS うたれづよい 

9回目 

日 HBCS 昼寝をよくする 

英 HBCS 昼寝をよくする

10回目 

日 HBDS 昼寝をよくする

英 HBDS 昼寝をよくする

 

以上のようになり、全ての試行で個性が一致している。

この個体値と個性の組み合わせで、全てが偶然一致する確率は約10万分の1程度なので、個性は変わらないものとみなしてもよさそう。

個性が過去作同様に性格値から算出されていると仮定すると、国際孵化の場合でも性格値の変更がないものと考えられる。

前述のパッチールの模様も考慮すると、今作のマスダメソッドは性格値の再計算を行わずにもとの性格値での色判定が緩められる、との解釈が妥当ではないかと考えられる。

 

 

追々記

完全なソースがないのだけれど、どうもパッチールの模様と性格値に関係性がなくなったらしい。

模様と性格値関係なかったらマスダメソッドも5th以前のものでいいはずだけれど個性が変わらなかったのは少し不思議。

性格値は残ってるけど色判定だけが別の32bitの値として分かれたって考えるのがいいのかもしれない。

いずれにしろアナログ解析はこれ以上厳しいので海外の解析待ち。

 

追検証を行ったのでこちらもご覧ください

XY孵化検証の続き - ろいしんぶろぐ

第五世代戦闘乱数のお話

ポケモン第五世代の戦闘時における技の命中、急所、追加効果の発生などを決定するために使われる疑似乱数列は第五世代での性格値乱数列と同じ方式のLCGを用いて順次計算されている。

 

戦闘乱数決定のために使われる乱数列をB(n)とすると

例えば、技の命中判定は

(B(n)>>32)*100>>32

で計算される値が技の命中率より小さいとき、技が命中する。

 

急所にあたるかどうかは

(B(n)>>32)*16>>32

で判定され、急所ランクが上がっていないときは(B(n)>>32)*16>>32=0ならば急所に当たるという判定が出る。

 

 

一般にB(n-1)で技を出した際の処理の流れは

B(n)  命中判定

B(n+1) 急所判定

B(n+2) ダメージ乱数

B(n+3) 追加効果判定

という風に決定され、必中技など判定に乱数を必要としない技ではB(n)で急所判定が行われるなど順に前に詰めて判定が為される。

 

この処理の順番を知っていると今後起こるであろうことは予測することができる。

 

調整例について

初期seed:A0CCD3D9C34306CD

で戦闘に入ったとき乱数列上位32bitと100分率の並びは

1 F51EB9FD 95
2 C598EBDB 77
3 76D8A53B 46
4 35C762E3 21
5 165FA8AD 8
6 53FDC974 32
7 D606FACB 83
8 31D768F3 19

という形であり、ここから予測できることは

・B(1)が95なので、ターンの最初に出される技の命中が95以下の場合外れる

・B(4)が21なので、最初に出した技の命中が100で追加効果が3割以上の場合、追加効果が発生する

・B(5)が8なので、こおりのキバ(ひるみ、氷漬けの効果判定が2つ)が使われた場合、2つ目の効果が発動する

などが挙げられる。

戦闘乱数と言うぐらいなら乱数を3つ消費して一撃技を撃てば当たるだろ、と思うかもしれないが、現状戦闘中に技使用以外で乱数を進める方法は見つかっていないので”戦闘乱数”から想像するようなことは対人戦ではほぼ不可能。

 

じゃあ戦闘開始時の初期seedを調整すればいい、となるがこの初期seedの決定方法は複雑で、

kaphotics氏によれば起動時の初期seed決定のようにSHA-1ハッシュ化を行っているようだが、メッセージデータが異なっているらしく通常の方法では算出できない。

ktxad氏のブログ2011年2月27日の記事によるとタッチスクリーンの押されている座標らしき値も使われているかもしれないので、実機での調整はほぼ不可能という認識。

 

ということで、戦闘乱数はなんだかよく分からないし乱数調整もできないという結論。

 

Twitterとかで戦闘乱数使ってるぜとか言ってる人は情報ください。

 

【追記】

Kaphotics先生に色々教えてもらいました。

戦闘乱数の初期seed決定には調整できない要素を2~3含んだメッセージデータを使ってました。それが何かを書くことはしません。

エミュレータ以外での初期seedの調整は事実上不可能なので、狙った初期seedを出すという調整はできません。

また、仮に初期seedが調整できたとしても、Wi-Fi対戦時には何らかの要因で初期seedが変更され別の初期seedで戦闘が進む場合があります。pokecheckでいう"broken"状態です。

こうなってしまうと例え初期seedを知ったところで、全く無意味な値に為り下がるため、戦闘乱数調整はできません。"broken"の原因についてはKaphotics氏も分からないとのこと。

 

結論:

戦闘乱数なんてできないからマトモにバトルしようネ~♪

アベニューについて

・日付が変わったとき、または日付が変わって最初に起動したとき

大量発生の場所

JAの翌日の客

JAの翌日のくじ引きの商品(2回目の商品も決まっている)

 

ーーーーーーーー

オフセット計算して初回起動時のLCG消費を調べてみたけど大量発生場所決定以外に消費はなかった

MTについてはまだ調べてない

ーーーーーーーー

 

・JAに入ったとき

客を案内するときのセリフ

客を案内して連鎖するかどうか

くじ引き屋を建てる客の商品

 

ーーーーーーーー

ここの客の商品決定がdoraraさんの検証と食い違ってる…?

自分で調べて検証した情報じゃないので詳細は不明

ーーーーーーーー

 

・くじ引き屋の商品決定の割り当ての分母は8192?付近

 

ーーーーーーーー

予想としては1等が当たる確率がランク1では1/8192でランクが上がるごとに

分子が増えていきランク10では10/8192になりそう

ーーーーーーーー

 

・ランク上げたときの商品に関しては同じ乱数値を使ってるらしくうまく調整すればランクを上げた全ての店で1等を貰うことは可能らしい

 

 

 

一応、今持ち得る情報はこんな感じ

この記事を情報交換の場に使ってもらっても構いませんよ(ゲス顔

 

おまじないパワー+,++使用時エンカウントスロット

 

 

 

おまじないパワー+++なんてまだ出てないよ!って方のために

f:id:Blastoise_X:20130704223557j:plain

 

若干未検証の部分が残ってるけどいくつかのデータから推測するにこんな感じ

波乗り、釣りに関してはめんどくさいので調べてない

 

+++の場合と違って性格値の再計算はされないので注意

ホワイトフォレスト野生乱数

White Forest  Encounter Slots

 

0 Initial

1 Skip

2 Sync

3 ESV

4 PID

5 Nature

6 (Item)

 

ESV

2nd 0-49

1st 50-99

 

3人以上については未検証

 

ツール上げました→白森乱数専用ツールWF - ろいしんぶろぐ

謎の1スキップに対する仮説

BW、BW2をはじめから始めたとき、チンチラ用PID決定とTID/SID決定の間に必ず1消費が挟まる

 

チンチラのIDとか性格用かなと思ってたけど、

ID調整を行うときの乱数消費動作がTN決定時にいいえを選択することからこの動作と何らかの関係があると考えると

 

こいつがあやしい

f:id:Blastoise_X:20130407234721j:plain

続きを読む