ろいしんぶろぐ

乱数調整とか

第五世代戦闘乱数のお話

ポケモン第五世代の戦闘時における技の命中、急所、追加効果の発生などを決定するために使われる疑似乱数列は第五世代での性格値乱数列と同じ方式の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氏も分からないとのこと。

 

結論:

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