最近、なぜか乱数調整の記事を読む人が多いので…。しかも、一番読まれている記事がHG・SSの乱数 ということになるとブラック・ホワイトもやらなくてはと思っているぐらいです。
ということで、期待にこたえてブラック・ホワイトの乱数調整について触れたいと思います。おさらいとしてエメラルドと第4世代の乱数は次のように生成されます。
- エメラルド
![]()
- 乱数のSeed値は常に一定(0x00000000)で、時間経過(1/60秒ごと)により消費する。
- 第4世代(DPt、HG・SS)
![]()
- DSの内蔵時計に基づいてSeed値が決定し、ゲーム中の行動によって消費する。
ブラック・ホワイトはというと個体値を生成する乱数と性格値を生成する乱数は別物でゲームを起動したときに初期Seedが決定されるが、Cギアを起動したときに個体値を生成する乱数のみリセットされるみたいです。
ちなみに、性格値を生成する乱数や個体値を生成する乱数は起動時に52バイトの値をSHA-1というハッシュ関数を使って得られた64bitのうちの上位32bitが性格値を生成する乱数に下位32bitが個体値を生成する乱数に用いられるが52バイトの値というのが曲者でどのように生成されるか今のところ分かりません。
ところが、Cギアを起動した場合、個体値を生成する乱数に限り再計算されてしまい。その場合、DSの内蔵時計に依存した値にMACアドレスを加算したものになります。なお、時計に依存した値は第4世代のときと同じなんです。ということは仮にDSの内蔵時計をyy/mm/dd hh:min:secに依存した値を0xABCDEFGHとすると
AB=mm×dd+min:sec
CD=hh
FEGH=yy-2000+ゲーム開始からの起動時間(F)
となり、これに MACアドレスの下位3バイトを加算したものが新しいSeed値ということになります。
次に乱数の消費だけど、第4世代と違ってNPCの行動や草むらなどの野生のポケモンが出る場所に踏み入っても消費されることはありません。実はこれこそが乱数調整の余地があるということを意味しているのかなと思います。なお、128歩ごとで手持ちのポケモンの数だけ消費されることは分かっています。
つまり、ブラック・ホワイトでは個体値のみ乱数調整ができるということになるというわけ。なお、性格値を調整することはできないが、シンクロの特性を持ったポケモンを先頭にすればある程度調整することはできます。ということで、実際に乱数調整に踏み切ってみようと思います。今回はさびたコイルさんのBWroop を使います。
まずは初期seed絞り込みで狙いたい個体値が出る初期seedを検出します。(図1)なお、初期設定では最大消費回数が30となっているが、NPCや野生のポケモンが出る場所に踏み入っても消費されないのでここは0でOKです。また、検出する際にフリーズする場合もあるのでこの場合は範囲を狭めておくといいと思います。
次に検出された初期seedを初期seed確認リストの狙うraw初期seedの欄に記入して計算をクリックすれば目標となるCギアの起動時間が検出されます。後はDSの内蔵時計を弄って指定された時間にCギアを起動すればOKらしいが、自分もやったことがないのでこれ以上のことは分かりません。
という具合にこれについては今後も情報を出したいと思います。
(2010/10/17 7:58 追記)