かけらの記録ノート

かけらの記録ノート

主にポケモンの乱数について語るブログ

【コロシアム乱数】調べたもののまとめ

※エミュでしか検証していないため、実機の結果とは異なる可能性があります
・瞬き処理について
ポケモンコロシアムでは画面上にポケモンが表示されている場合、そのポケモンが描画がされている間、各フレームごとに瞬きの判定を行っています。計算処理は以下の通りです。

class Blinker:
    def __init__(self, interval=4):
        self.counter = 1
        self.interval = interval
        self.break_time = 0
        self.threshold = 0

    def next(self, RNG):
        if(self.break_time > 0):
            self.break_time -= 1
            return False
        self.counter += 2
        if(self.counter < 10):
            return False
        elif(self.counter < 60):
            self.set_threshold()
        elif(self.counter < 180):
            self.threshold = 0.0166667
        else:
            self.threshold = 1
        rand = (RNG.Advance(1) >> 16) / 0x10000
        if(rand <= self.threshold):
            self.counter = 0
            self.break_time = self.interval
            return True
        return False

    def set_threshold(self):
        f0 = 0.0166667
        f2 = 50
        f1 = 2
        f3 = self.counter - 10
        f2 = f3 / f2
        f1 = f1 - f2
        f31 = f2 * f1
        f31 = f31 * f0
        self.threshold = f31

ここで引数に設定されているintervalはソフトの国籍およびポケモンの種類ごとに異なっていて、ムウマを例にすると、日本版では4、欧州版では5となっています。これは(おそらく)瞬きを描画する間のクールタイムで、瞬きが長いポケモンオーダイルプラスルで確認済み)では1大きくなります。また、一部のポケモンでは瞬きをしないことが確認されていて(ブラッキーイノムーカポエラーキマワリなど)、ポケモンが表示されていてもこの瞬きによる消費が発生しないようです。

ポケモンバトル中も表示されているポケモン1匹につきこの式から瞬きの判定がされていますが、これだけではなく、(おそらく)表示されているトレーナーの瞬きの判定も追加で行われています。こちらはポケモンとは異なり、クールタイムが10に設定されるようです(欧州版60Hzでは11)。ミルタンクのトレーナーでは2つ、アブソル、ヘルガートロピウスのトレーナーでは1つ(おそらく主人公のみ)存在します。1Fあたり、このトレーナーの瞬きの判定に加えて表示されているポケモンの瞬きの判定が行われます。実際には技のエフェクトによる乱数消費などを含めると瞬きの間隔はずれていってしまいますが、対戦終了後の賞金の画面ではこれらの消費しか行われないため、頑張れば瞬きによるseedの特定ができます。

ダークポケモン表示中の乱数の消費速度
ポケモンXDでは、リバース状態のダークポケモンを表示することで約4000/sの速度で消費を進めることができることが分かっていますが、コロシアムではダークポケモンを表示している間、およそ17000/sの速度で消費されていることが確認されています(po氏による情報提供)。
f:id:sina_poke:20200322200921p:plain
欧州版コロシアム(50Hz)では以下のような結果になりました。

スナッチリスト 17146.6/s
ステータス 15497.4/s

日本版だともう少し多いと思われます。XDではリバース状態にすることで消費の速度は上がるようでしたが、コロシアムのハイパー状態では速度に変化はありませんでした。また、ポケモンによってエフェクトの大きさに違いがありますが、どのポケモンでも同じ速度で消費されていることが分かりました。とにかくバトルよりも断然高速に消費ができるのでおすすめです。

スナッチリストを開いたときの消費
ポケモンコロシアムでは、スナッチリストを開くと7消費されます。その消費の内訳は以下のとおりです。

Rn+1 dummy
Rn+2 dummy
Rn+3 IVs(HAB)
Rn+4 IVs(SCD)
Rn+5 XDAbility
Rn+6 HID
Rn+7 LID

一般的なポケモンの生成処理が走っているのが分かります。ここで注意なのですが、なぜかここで生成されるポケモンにはID0(TID&SID=0)で色回避ルーチンが作動します。ごくまれに7消費ではなく9消費になってしまう。とても低い確率なので気にする必要はないと思いますが、よく分からないずれが起きたらこいつのせいかもしれません。

・ローガンの繰り出すピカチュウの生成
コワップのカポエラーの生成が終わったあとに性別が♂固定で生成されます。生成時に設定されたIDで色回避ルーチンが走るので色違いは不可能のようです。

・ギンザルのプラスルの生成
性別の固定もなく通常の生成ですが、TIDの生成がされないため強制消費は2となります。TID:37149、SID:00000で色回避ルーチンが働くため、色違いは不可能です。ミラーボ戦後にseedを特定、調整することで乱数調整ができます。

・欧州版でのフィールド上の不定消費について
夜綱さんによってフィールド上の不定消費が解析されましたが、日本版とは違い、欧州版では待機時間が異なることが分かりました。欧州版(50、60Hz問わず)では、描画が6回に1度、日本版で描画2回分の処理が走ります。よって日本版と比べると描画回数あたり7/6倍で消費が進みます。この処理が走るタイミングを調整することは不可能で、手持ちの画面を閉じる動作によって完全にランダムになってしまうため運が悪いと1/6で目標の個体がスキップされてしまいます。フレームを合わせても1/6で失敗してしまいますが、普通にできると思います。しかし、安定を求めるなら日本版の方が良いです。

戦闘乱数ツールはホウオウの検証が終わったら公開するのでもう少しかかります。