サイファーの日記

過去作の乱数について書きます

ポケモンスタジアム2の乱数

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

 

1. まえがき

今回は、ニンテンドー64のソフト「ポケモンスタジアム」でジムリーダーの城を攻略した後に貰えるポケモン*1の乱数調整について説明します。この記事では色違い(AAAA)と理想(FFFF)の両方の個体値に対応しています。

今から2年程前に海外の乱数Discordサーバーでlincoln氏が調査されていたので、その情報を参考に日本版の実機でも試してみることにしました。

結論から言うと、とても簡単です。

2. 乱数の生成

個体値

public int DVs()
{
    seed = (((seed << 2) | 2) * ((seed << 2) | 3)) >> 2;
    dvs = seed & 0xFFFF; //16bitの範囲に制限して個体値を取得
    return dvs;
}

同氏の調査によると個体値についてはこのような方法で生成されているようです。

また、初期seedは0x99CDで固定です。*2この点ではエメラルドと似ています。

オーキド博士の瞬き

public int OakBlink()
{
    seed = (((seed << 2) | 2) * ((seed << 2) | 3)) >> 2;
    blink = (((seed & 0x3F) / 3) + 1) * 3 - 1;
    interval = blink - prevblink + 64;
    prevblink = blink; // 次回のために更新
    return interval;
}

後述するオーキド博士の博士の瞬きについてもこのように生成されているようです。自分で少し書き加えたため、おかしい箇所が生じていたらすみません。

3. 手順

3-1. 研究所を選びタイマー開始

初期seedが0x99CDの場合、最も近くて個体値AAAAが5461消費、FFFFが13362消費で生成されるのでそれを狙っていきます。

まず64のリセットボタンを押して再起動し、そのままポケモン研究所にカーソルを合わせます。バトルを行った後などに余計な消費が入っているかもしれないので念のため再起動を行ってください(要調査)。



そしてCCTimerに2770(AAAA)、または6720(FFFF)をセットし、タイマー開始と同時にAを押します。画面がカセット選択画面に遷移します。ちなみにタイマーの設定は60Hz/sにしています。

3-2. カセット選択画面で大量消費

カセット選択画面でタイマー終了まで待機します。この画面では1フレームあたり4つ消費される*3ので大量消費に使えます。タイマーが0になったらAを押します。研究所の中にいる画面に遷移します。

3-3. 瞬きで消費の微調整

研究所の中にはオーキド博士がおり、この人の瞬きで目標消費に確実に近づけていきます。具体的にはオーキドが1回瞬きをするたびに1つ消費されます。

自分は画像のようにPythonでオーキドの瞬きの間隔を記録するプログラムを使って管理しています。



目標消費の20個くらい前からの瞬きの間隔を並べると、30fpsで以下の通りです。

【直前の瞬き】

(AAAAの場合)
25,82,49,88,43,64,64,73,58,49,82,55,73,97,34,40,91,79,49,91,40,64(f)
 
(FFFFの場合)
97,43,88,82,49,25,103,67,64,73,58,49,79,58,73,34,97,40,88,19,112(f)


始めの25f(AAAA)の瞬きは研究所の中に入ってから3~4分くらいで観測できると思います。97f(FFFF)の瞬きの方は、4~5分くらいで観測できるはずです。

オーキドの瞬きは周期がとても短く、2分くらいで1周するので取り違えないように注意してください。

3-4. 目標消費でAを押す

最後の64f(AAAA)、または112f(FFFF)の瞬きを観測してから1秒ほど待ってAを押し、モンスターボールのアイコンを選択します。このくらいのタイミングがちょうどよかったです。アイコンを選択したら個体が生成されるので、後は自由に操作しても大丈夫です。

念のため、目標消費前後の個体は以下の通りです。どちらの目標消費も猶予が2秒以上確保されているので慣れれば失敗しなくなると思います。

【前後の個体】

(AAAAの場合)
5458: CF1F
5459: A2A0
5460: BD21
5461: AAAA
5462: 38E3
5463: 8194
5464: 7E25
 
(FFFFの場合)
13359: 878C
13360: 77FD
13361: 1816
13362: FFFF
13363: 0000
13364: 0001
13365: 000A

4. 余談

カセットとのやり取りに必要な64GBパックですが、接触不良が起きやすいことで有名です。タイミングが悪いとセーブデータも消えるようです。

ケーブルが通る部分の穴を広げてやることでかなり改善したので、よければやってみてください。はんだ付けなどは不要ですが怪我には注意!

(参考動画)

www.nicovideo.jp

5. あとがき

以上がポケモンスタジアム2の乱数調整のやり方です。この記事を書くために必要な調査、情報の公開をしてくださった海外の方に感謝します。

個体値AAAAの方は、成功したら第二世代に送って色違いの姿が確認できます。ポケモンスタジアム金銀では下のような感じになりました。IDが発売年(1999)になっており、特別なアイテム「きのはこ」を持っているのが特徴です。



FFFFの方も載せておきます。御三家の場合はレベルが低いので、レベル100にするバグ技を使うことによって成功したかどうかを確認しやすくなります。もちろん、その後セーブせずにリセットすればバグ技の影響はありません。



今後はポケスタ金銀でも同じことをやってみたいのですが、オーキドの瞬きの仕組みが複雑になっているようで頓挫しています。一応レンタルポケモン個体値からseedの下位16bitは割り出せるのですが、その後に研究所に入るタイミングでまた初期化されるのではないかと勝手に考えています。操作タイミングを一定にしてseedの状況再現をすることも考えましたが、実機ではそれが困難なようです。

カモネギグライガーが未受け取りだよ、という方はぜひ検証に協力して頂けると助かります!(全クリが面倒くさいので...)


5日目は、みが氏による「日本語版RS単体での任意コード実行」になります。エメラルドでの任意コードはよく聞くけど、ルビサファでも出来るようになったのか?

*1:プレゼントされるポケモンフシギダネヒトカゲゼニガメエビワラーサワムラーイーブイ、カブト、オムナイトコダックの計9種類。コダックだけは条件がかなり異なります。

*2:厳密には0x0A6B99CDらしいですが、個体値に関わらない上位16bitは省略しています。

*3:このゲームは30fpsです。そのため1秒で120程度消費されると思われます。