ポケモンコロシアムの乱数解析
#ポケモンコロシアム #解析
ボルグの部屋の不定消費を調べる過程で乱数解析の環境がかなり整ったので、まとめておきます。日本版の情報なので他のリージョンだとアドレスが違うかもしれません。
雑多になってきたので分離しました
https://scrapbox.io/PokemonCoAnalysis/
使用したソフト
Dolphin 開発版 5.0-11707
安定版だとメモリにbreakpointが仕掛けられないので非常に不便。
開発版でもバージョンによってはbreakpoint周りが正常に動作しないものがある可能性がある。
乱数処理の基本事項
アルゴリズムはLCG(線形合同法)。所謂標準randとも、GBAで採用されている加算定数を0x6073に変えたものとも違い、$ S_{n+1} = {\rm 0x343FD} * S_n + {\rm 0x269EC3}という式で更新される。
乱数を整数値(0x0 ~ 0xFFFF)で取得する場合と浮動小数(float)で取得する場合がある。前者はrand = seed >> 16、後者はrand_f = (seed >> 16) / 65536.0で乱数を得る。
seedが格納されているメモリのアドレスは$80464360。
小数レジスタf0 ~ f31はDolphinのregisterビュアーではdouble型64bitで表現されているが、実際は内部ではfloat型32bitで扱われているので注意。
table:LCG関数のアドレス
801a98a8 浮動小数で乱数を返すLCG関数。返り値はf1に格納される。
801a9904 整数値で乱数を返すLCG関数。返り値はr3に格納される。
800de8f0 push/popを含めた小数値LCG関数呼び出し。
800de8ac 小数値乱数を2回発生させ、その和 - 1.0を返す。
800de960 push/popを含めた整数値LCG関数呼び出し。
最悪ここまでの情報があれば乱数処理の解析はできる。
個体生成関連
性格決定は無いので、ダークポケモンのPID生成にループは発生しない。
ダミーHID生成にbreakpointを仕掛けてseedを書き換えれば任意の個体が生成できる。
table:LCG呼び出しアドレス
8012790c 敵トレーナーのTID生成
80127914 敵トレーナーのSID生成
80121914 仮HID生成(使われない)
8012191c 仮LID生成(使われない)
801219a0 HAB個体値生成
801219f0 SCD個体値生成
80121aec 特性(いわゆる"XD特性"の決定)
80121bf8 HID生成
80121c00 LID生成
不定移動NPC
table:LCG呼び出しアドレス
80180a38 移動方向決定 2π * rand_fで、0=真下から逆時計回り
80180dec 待機時間決定 800de8acを呼び出してる。5.0 + 3.0*r 秒待機する。
不定消費関連
ボルグのフロア基準で書きます。他のマップでは事情が違う可能性が大。
ボルグのフロアの不定消費の詳細はこちら。
table:LCG呼び出しアドレス
801712fc カウンタの加算処理(メイン/サブ問わず)
80171ed4 メインカウンタ繰り上げ発生直後に入る
80171c40 サブカウンタ繰り上げ発生直後に入る 泡のサイズ?
80171ed4 サブカウンタ繰り上げ発生直後に入る 泡の位置?
80170704 サブカウンタ繰り上げ発生直後に入る 用途わからん
8016d8d4 サブカウンタ繰り上げ発生直後/発生した30F後のフレームの頭に入る 用途わからん
8016d8fc サブカウンタ繰り上げ発生直後/発生した30F後のフレームの頭に入る 用途わからん
8016d924 サブカウンタ繰り上げ発生直後/発生した30F後のフレームの頭に入る 用途わからん
8016dc20 サブカウンタ繰り上げが発生した次のフレームの頭
8016e600 サブカウンタ繰り上げ発生直後/発生した40F後のフレームの頭に入る
--- ---
80170c3c サブカウンタ初期値取得
801720b0 カウンタ繰り上げ発生直後に入る
table:内部カウンタの関係のアドレス
基準アドレス 次に動くカウンタのアドレス
基準アドレス + 0x8 カウンタの係数
基準アドレス + 0xc カウンタ
基準アドレス + 0x4c 発生している泡の数のカウンタ
基準アドレス + 0x10 (サブカウンタ)寿命(16bit)
たぶんね。
その他
table:LCG呼び出しアドレス
8011fd44 なつき判定
801dac44 瞬き判定
table:addr
8096cfe0 瞬きカウンタ
8096ce40 瞬きカウンタ(この付近で色々変わる)
804667c8 動作中のカウンタの個数
table:瞬き関係の処理
801dabd4 瞬きカウンタ加算
table: battle
800de928 戦闘突入エフェクト。2回入る。
800de930 戦闘突入エフェクト。2回入る。
table:不明
801ce3b8 新規セーブファイル作成時、歩くごとに入る消費
https://www.youtube.com/watch?v=FO1niS33XsE
サブカウンタが余分に生える問題について。
新しいカウンタはmain1の子になる(それまでいた子との間に割り込む形になる)。
生えるタイミングは? 繰り上げ発生から下記フレーム経過後の処理の先頭。
table:
main1 20F 30F
main2 10F -
main3 20F 30F
main4 10F -
main5 20F 30F
main6 10F -
サブカウンタの繰り上げ発生で煙オブジェクトが発生、20F後に煙が消えるっぽい。
従属する煙が消えるまではサブカウンタは生き続ける。
イルカちゃんの中にあるデータのIDは56201 34891