日替わりの乱数
だんだん投げやりになってきたのでどこか間違っていると思います。
くじ番号などの一部の日替わりの要素で使われる乱数は、
セーブデータにシードが保存されていて、リセットしても毎回同じ結果が出るようになっています。
この日替わりの乱数の初期シードは、
ゲーム開始時のオーキド博士の話が終わった時にメルセンヌ・ツイスタで乱数を発生させ、
これに0x6C078965をかけて1を足したものが初期シードとなります。
関係ないですがトレーナーIDも同時に決定されます。
メルセンヌ・ツイスタが使われるのは初期シードを決めるときだけで、
日付が変わった時の乱数の更新は、
現在のシードに0x6C078965をかけて1を足したものを新しいシードとする計算を繰り返します。
この日替わりの乱数の現在のシードは、
連続した当たりのくじ番号が3日分くらいあれば特定できると思います。
特定してもあまり意味が無いような気がしますが、
今後発生する日替わりの要素が事前に予測できるので何かの目安にはなるかもしれません。
もしかしたらなにかのきっかけで値が突然変化することがあるかもしれません。
--------------------------------------
日替わり処理のメモ(調べかけ)
不明なのが多いですが、
なかなか見当もつかないので諦めてしまいました。
・日付更新時に専用の乱数を使って値を更新するもの
1.くじ番号
日替わりの乱数に0x41C64E6Dをかけて0x3039を足したものの上位2バイトがくじ番号となります。
くじ番号は出てくる値が大きいので逆算するのに使えると思います。
個体値からシードを調べるのと同じ要領で良いと思いますが、2重に逆算しないといけないので少し面倒です。
計算式のメモ
くじ番号を日替わりのシードに戻す
0xEEB9EB65 * seed + 0xFC77A683
くじ番号からはseedの下位2バイトがわからないので総当たりで辻褄が合うものが出てくるまで計算します
日替わりのシードを一日分巻き戻す
0x9638806D * seed + 0x69C77F93
ゲーム開始から最初に日付を跨ぐまでの間は通常の乱数でくじ番号が決まっているので注意が必要です。
2.大量発生
20種類が定義されていて、日替わりの乱数を20で割った余りに対応するものが大量発生となります。
乱数の性質からか、連続した日付での出現の順番にグループのような規則が発生しているようです。
3.不明1
正体不明です。雰囲気からするとバトルタワー関連かな?という気がします。
日替わりの乱数に0x5D588B65をかけて1を足したものを使用します。
4.不明2
日替わりの乱数を初期シードとして通常の乱数を動かすことがあるかもしれない。
・日付更新時に通常の乱数を使用する物
1.からておうのタケノリとの再戦までの日数
まずは1〜6の乱数を発生させ、これを記録します。
日付が更新されるごとにこれを-1していき、0の時にタケノリに電話をすると再戦のフラグが立ちます。
0のときに日付が更新されると、再度1〜6の乱数を発生させて次への再戦フラグまでの日数として設定します。
0以外だった時は1を引くだけで乱数は発生しないようです。
2.アオイのあいことば
通常の乱数を30で割った余りを使用します
3.不明
2〜100の値を生成している?DPのころからあるようだけど、なんだろう
もちろん他にもまだまだあると思います
だんだん投げやりになってきたのでどこか間違っていると思います。
くじ番号などの一部の日替わりの要素で使われる乱数は、
セーブデータにシードが保存されていて、リセットしても毎回同じ結果が出るようになっています。
この日替わりの乱数の初期シードは、
ゲーム開始時のオーキド博士の話が終わった時にメルセンヌ・ツイスタで乱数を発生させ、
これに0x6C078965をかけて1を足したものが初期シードとなります。
関係ないですがトレーナーIDも同時に決定されます。
メルセンヌ・ツイスタが使われるのは初期シードを決めるときだけで、
日付が変わった時の乱数の更新は、
現在のシードに0x6C078965をかけて1を足したものを新しいシードとする計算を繰り返します。
この日替わりの乱数の現在のシードは、
連続した当たりのくじ番号が3日分くらいあれば特定できると思います。
特定してもあまり意味が無いような気がしますが、
今後発生する日替わりの要素が事前に予測できるので何かの目安にはなるかもしれません。
もしかしたらなにかのきっかけで値が突然変化することがあるかもしれません。
--------------------------------------
日替わり処理のメモ(調べかけ)
不明なのが多いですが、
なかなか見当もつかないので諦めてしまいました。
・日付更新時に専用の乱数を使って値を更新するもの
1.くじ番号
日替わりの乱数に0x41C64E6Dをかけて0x3039を足したものの上位2バイトがくじ番号となります。
くじ番号は出てくる値が大きいので逆算するのに使えると思います。
個体値からシードを調べるのと同じ要領で良いと思いますが、2重に逆算しないといけないので少し面倒です。
計算式のメモ
くじ番号を日替わりのシードに戻す
0xEEB9EB65 * seed + 0xFC77A683
くじ番号からはseedの下位2バイトがわからないので総当たりで辻褄が合うものが出てくるまで計算します
日替わりのシードを一日分巻き戻す
0x9638806D * seed + 0x69C77F93
ゲーム開始から最初に日付を跨ぐまでの間は通常の乱数でくじ番号が決まっているので注意が必要です。
2.大量発生
20種類が定義されていて、日替わりの乱数を20で割った余りに対応するものが大量発生となります。
乱数の性質からか、連続した日付での出現の順番にグループのような規則が発生しているようです。
3.不明1
正体不明です。雰囲気からするとバトルタワー関連かな?という気がします。
日替わりの乱数に0x5D588B65をかけて1を足したものを使用します。
4.不明2
日替わりの乱数を初期シードとして通常の乱数を動かすことがあるかもしれない。
・日付更新時に通常の乱数を使用する物
1.からておうのタケノリとの再戦までの日数
まずは1〜6の乱数を発生させ、これを記録します。
日付が更新されるごとにこれを-1していき、0の時にタケノリに電話をすると再戦のフラグが立ちます。
0のときに日付が更新されると、再度1〜6の乱数を発生させて次への再戦フラグまでの日数として設定します。
0以外だった時は1を引くだけで乱数は発生しないようです。
2.アオイのあいことば
通常の乱数を30で割った余りを使用します
3.不明
2〜100の値を生成している?DPのころからあるようだけど、なんだろう
もちろん他にもまだまだあると思います
逆アセンブラ、デバッガには何を使っていますか?