見出し画像

【ポケモンXD】ついにあのファイヤーの乱数調整ができるようになりました!【瞬き】

わそー像、建立。

はじめに

この記事はPokémon Past Generation Advent Calendar 2023 6日目の記事です。

今年はポケモコロシアム発売20周年でしたね。20年経った今でも乱数調整界隈において時代の最先端を走り続けているのがポケモンコロシアムと、その続編であるXDです。ギンザルさんによってツールが公開されてから10年(!?)経つわけですが、今年もまた新たな発見がありました。難攻不落・3世代乱数最後の砦とまで言われた、あのXDファイヤーの乱数調整が可能になったのです! また同時に、その手法を転用することでコロシアムの一部ポケモンの乱数調整も非常に簡単になりました。この記事では、XDファイヤーの乱数調整が開拓されるまでの軌跡をまとめました。

これまでのXDファイヤー

XDストーリーのラスボス・デスゴルドが最終戦の先発として繰り出してくるのがファイヤーとサイドンです。デスゴルド戦は直前のダークルギア戦からの連戦になります。ポケモンXDでは敵が一度でもバトルに繰り出したダークポケモンの個体情報が固定されてしまうという厄介な仕様があるため、先発のファイヤーとサイドンの乱数調整をするとなるとダークルギア戦を跨いで乱数を調整する必要があるのですが、XDの戦闘画面では技エフェクトなどによって大量の乱数が使われ、まったく安定しません。そのような不安定な消費を制御してほぼピンポイントを狙う必要があります。それに加えてデスゴルド戦が終わるとエンディングに突入し、捕まえた個体を確認することもできずにセーブされてしまうので、成否の確認を戦闘中に行う必要があるという面倒くささもあります。それらを乗り越えて乱数調整を成功させた方もいなかったわけではないのですが、数えても片手で足りるほどしか例がありませんでした。

革命前夜

5/30深夜~5/31

わそー氏が戦闘後の進化画面でポケモンが瞬きしていることに目を付けました。この時点ではキルリア→サーナイトで調査しており、ほぼ絶え間なくseedが動き続けていたため、そこまでの盛り上がりがあったわけではありませんでした。

しかし、ゴクリンを進化させてみたところ、キルリアのときとは違い、瞬きのたびにseedが止まっていることがわかりました。キルリア→サーナイトで調査していたときの激しい消費は、進化前・進化後両方のモデルの瞬き処理が動き続けていることによるものだったのです。つまり、進化前は瞬きをしておらず、進化後のみ瞬きをするゴクリン→マルノームなら瞬きからのseed特定が可能なはず…! と、ここでXDファイヤー乱数が現実味を帯びてきました。
XDでポケモンの瞬きからseed特定を行うツールとして、既にOpenBlinkというツールがありました。開発者にコンタクトを取ってアルゴリズムの解説と移植許可をいただき、さっそくファイヤー用のツールを実装を始めたのですが、XDの瞬き処理を乱数調整に組み込むには、解決しなければならない問題がありました。
瞬きを見てseedを特定する手法は、ポケモンコロシアムの乱数調整では手法の確立以来、ムウマがコロシアム乱数のマスコットになるほどに普及した手法になっています。XDの瞬き判定もほぼコロシアムと同じなのですが、『1/60秒単位で処理されている画面の更新が、1/60秒よりわずかでも短い間隔で行われてしまった場合、瞬き判定がスキップされる』という仕様が加わっています。スキップが発生するかどうかはハードウェア依存なので制御のしようがありません。ファイヤーの乱数調整を行うにあたっては、seedを特定した後、目的のseedまでの消費も瞬きだけで行うので、この不確定さを乗り越える必要がありました。

6/3

不確定さをどうするかは後で考えることにして、ひとまずはコロシアム用の瞬き観測ツールを改造してXD用のseed特定ツールを作成しました。そしてエミュレータを使った実験により、進化画面で瞬きからseed特定できることが実証されました。
しかし同時に、観測される瞬きの間隔が理論上考えられる最大値を超えて長くなる事象も確認されました。この事象の原因を特定するための調査が始まりました。


6/6

これまで瞬きの検出はOpenCVを使ってテンプレートマッチングをしていたのですが、マルノームの頭はよく動くため、誤検出を抑えるのに苦労していました。また、OpenCVのファイルサイズがそこそこ大きいのも悩みのタネでした(作業用PCの容量がカツカツな状態が数年続いています…)。それを解決するため、RGB値から特定の色合いのピクセルだけを抜き出して数えることで瞬きをしているかどうかを判定するよう実装を変更しました。

6/9

これまでずっと瞬きを見るポケモンとしてゴクリン→マルノームを使ってきましたが、ヨマワル→サマヨールはより瞬きの観測に適していることが判明しました。『ヨマワルが瞬きしない』『サマヨールの目が大きく、瞬きが見やすい』、『サマヨールがマルノームほど頭を動かさない』だけでなく、直前のダークルギア戦をなるべく速く終わらせるためにも『ゴーストタイプなので隣で大爆発するだけでいい』『XD技の手助けで大爆発の威力を上げられる』と、XDファイヤー乱数のために生まれてきたかのようなポケモンです。

瞬きを観測するための環境は整ったので、ここからはひたすら、エミュレータでサマヨールを映し、瞬きのデータを取りながら、瞬きが大きく延びる現象と格闘しつづけました…。

6/12

データは集まったものの、解決の手立てがなく、Scrapboxに泣き言まで書いていたのですが、一縷の望みを託して実機で瞬きデータを取ったところ、実は瞬きが大きく延びる現象はほとんど発生していないことが判明しました。またエミュレータでも、バージョンを更新したら、実機と同様にほとんど発生しなくなりました。つまりコロシアムと全く同じようにやればよかったのです…!

6/17

XDファイヤー用のツールが完成し、公開されました。
簡単な解説も公開しています → XDファイヤー

6/21

成功者あらわる

ファイヤーだけでなくサイドンも乱数調整できるようになりました。手助けサイドン解禁です。


コロシアム乱数への転用

『進化画面で瞬きを見る』というアイデアが出た直後に、コロシアムでも同じことができないか調査をしました。しかしコロシアムでは進化画面では瞬きが発生しておらず、それに加えて自動的に進化画面が閉じられてしまうため、そのまま同じ手法を転用することはできないとわかり、そこで調査を打ち切っていました。

その後、XDの瞬き調査が行き詰まったあたりで(進化時に技を覚えるポケモンなら選択肢が出るから、勝手に進化画面が閉じられてしまう問題は解決できるのでは…?)と思い、再度コロシアムを開いたのですが、そもそも瞬きをしていないことに気づいてそっ閉じしました。

…と、そこでまたもや、わそー氏が

選択肢で止めるのではなく、技を選択する画面に入れば、しっかり瞬きしていたのです!

これにより、戦闘終了時にベイリーフの瞬きを頑張って見つめる必要があったアブソルやメタグロスなどの乱数調整の難易度が大幅に緩和されました。めでたしめでたし。もうちょっと詳しい解説はこちら

終わりに

以上、今年の3世代アプデ情報でした。ついにGBA対戦に最後のDLCキャラ・XDファイヤーが解き放たれましたね(ヒメグマ? ザングース? 知らんな…)。とはいえ、非人道的な難易度から現実的な難易度にまで落ちたというだけで、已然として他と比べると難易度は高い部類だと思います。乱数調整は魔法では無いので、時間を合わせてちょこちょこっと変な操作をしたらどんな個体でも簡単に出せるというわけではないのです。私自身もまだXDファイヤーは成功させていませんし…。

アドカレは明日もXD乱数のお話らしいです。楽しみですね。

おまけ①

Q. わそー像ってなに?
A. わそー氏の功績を讃えるミーム。やったか!?とアカンか…を何度か繰り返したため、建立と建立中止が二転三転した。

おまけ②


この記事が気に入ったらサポートをしてみませんか?