ポケモンコロシアムの解析
使用したソフト
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後のフレームの頭に入る
table:内部カウンタの関係のアドレス
基準アドレス 次に動くカウンタのアドレス
基準アドレス + 0x8 カウンタの係数
基準アドレス + 0xc カウンタ
基準アドレス + 0x4c 発生している泡の数のカウンタ
基準アドレス + 0x10 (サブカウンタ)寿命(16bit)
たぶんね。
その他
table:LCG呼び出しアドレス
8011fd44 なつき判定
801dac44 瞬き判定
table:addr
8096cfe0 瞬きカウンタ
8096ce40 瞬きカウンタ(この付近で色々変わる)
table:瞬き関係の処理
801dabd4 瞬きカウンタ加算
801dac54 瞬きが発生したら通るところ
table:手持ち順
8022ecec 調べてない 直前に1回入る
8022ed7c 残りn匹決めるとき、%nで前から位置を見て枠を埋めていく。