色違いラルトス VS 色違いジグザグマ
初めに
ポケットモンスターエメラルドでは、ミツル君がセンリから借りたジグザグマでラルトスを捕まえるというポケモン捕獲のチュートリアルイベントが存在します。
これは、そのイベントでジグザグマ・ラルトス共に色違いにしようと制作したものの解説になっております。
色違い
乱数調整の前に色違いについて説明する必要があります。少し長くなるので興味ない人は飛ばして下さい。
第三世代のポケモンが色違いになるかの判定は、以下の式を満たすかどうかに関係しています。
判定式:
(ID)xor(裏ID)xor(性格値上位)xor(性格値下位) ≦ 7
*ここに出てくる数値は2Byteで扱う
これを満たす確率を計算すると2^-13、
ここで1/8192という聞きなじみのある数が出てきます。
また、ID、裏ID、性格値という聞きなじみの無い単語が出てきました。
ID
IDはトレーナーカードの裏に書いてある番号のことで、ミナモデパートのIDくじなどでも使われます。
裏ID(隠しID)
第三世代のポケモンではトレーナーID(TID)は32bitで表現され、上位16bitはゲーム上で確認する事ができません。
そのためTID上位は隠しID呼ばれています。
ちなみに前述のIDは、下位TIDはトレーナーカードで見れる通常のIDです。
性格値
性格値はポケモンの性別、性格値、特性、アンノーンの形状などに関係する32bitの値です。
色違い計算では上位、下位それぞれ16bitずつ分けて排他的論理和を取っています。
この記事では乱数調整でこの式を満たすよにしていきます。
乱数調整
乱数調整とは文字通り乱数を調整する事でTASや一部の制限プレイ大好き人間たちがよくやっているやつです。
少し細かい話になりますが状況再現とは少し違います。
第三世代のポケモンでは
f(n+1) = f(n) * 0x41C64E6D + 0x6073
計算過程で32bitを超えた分は切り捨てる
の式で32bitの乱数を生成しています。
いわゆる線形合同法(LCG)というやつです。
32bitの乱数を生成してはいますが基本的に生成された乱数の上位16bitを様々な処理に利用しています。
線形合同法には弱点があり、数値の組み合わせによっては偶数->奇数->偶数…の様に偶奇が交互に出てしまいます。
そしてポケモンでもその性質が出てしまっているのでそれを回避する為にこの様な処理を行っていると思われます。
取り敢えずプログラムを組めば何フレーム後にどの乱数値になっているのか予測する事ができるので今回はそうやって目的のフレームを予測します。
センリのジグザグマ
少し説明が抜けてしまいましたが色違いの判定にはポケモンの性格値と親トレーナーのIDが関わってきます。
この親トレーナーというのは基本的にプレイヤーのことですが交換されたポケモンなどはお友達のIDが使われます。
そしてセンリのジグザグマ、普通に考えればセンリが親なのですがこの場合はプレイヤーが親として色違いの処理がされます。
助かった…
センリのジグザグマまの性格値決定タイミングはトウカジムから出て来て扉が閉まった直後になります。
そして使われる乱数は
1f:ジグザグマの性格値上位
2f:ジグザグマの性格値下位
となるのでこの2fのxorがトレーナIDの差と7以下になるフレームを特定します。
今回トレーナIDは0x5912C8FEなので目的の乱数seedは0x5C64
RNG0: 0x27293A44 ???
RNG1: 0x90E6E767 ???
RNG2: 0x2D7C494E ジグザグマの性格値上位
RNG3: 0xBC955AA9 ジグザグマの性格値下位
ジグザグマの性格値は0xBC952D7Cとなり無事色違いです。
ミツルのラルトス
ラルトスは102番道路の草むらで4%の確率で出てくるレアエンカです。
ですがイベントなので100%出るようになっているので安心。
代わりにミツルが親トレーナーという扱いになっています。
なのでラルトスの性格値とミツルのTIDを同時に調整する必要があります。極めてクソ
調査の結果
0f: ?
1f: ミツルのTID
2f: ミツルのSID
3f: ラルトスのPID(HID)
4f: ラルトスのPID(LID)
ということが分かりました。
これを満たすseedは08211
RNG0: 106AC243 ???
RNG1: C77780FA ???
RNG2: 928A76E5 ミツルのTID
RNG3: AF4CC5F4 ミツルのSID
RNG4: 16B90157 ラルトスのPID(HID)
RNG5: 2B78747E ラルトスのPID(LID)
となりました。
そうは見えないかもしれませんが色違いのジグザグマです
間違いありません
補足
今回はエメラルドを使用しました。
エメラルドでは電源を入れた時の初期乱数が0に固定されています。そのため全く同じ動きをすれば全く同じ結果になります。
これをエメループと人は呼びます。
一応電池の切れたルビー・サファイアなら同じ事が可能です。
ポケモンの乱数ですが戦闘中は2倍の速さで乱数が進みます。
これを使えば待ち時間を短縮出来ますが人間向けではありません。
ミツルのラルトスですが「うわっ!」
で待機している最中NPCがキョロキョロしており乱数を余計に消費してずれます。
なので余程時間がある頭のおかしい人以外は挑戦しない方がいいと思います。
コメント入力