アイテムドロップの判定に使われる乱数は以下の64bitの線形合同法です
u64 seed;
u32 rand(u32 max) {
seed = seed * 0x5d588b656c078965 + 0x0000000000269ec3;
return ((seed >> 32) * max) >> 32;
}
初期seedはゲーム起動時に決まります。 上位32bitは0で固定。 下位32bitはVCOUNTレジスタの値と1フレームごとに進むカウンタ?を足した値になります。
僕の環境のDeSmuMEだと0x000000f6、実機だと0x0000010cばかり出ました。 同じ環境だとほぼ一定の値になると考えてよさそうです。
タイトル画面(オープニングムービーが終わった後)中は時間経過で勝手に乱数が進みます。 「続きから」を押した画面では進みません。連打で起動した場合だいたい20ぐらい消費します。
選手バインダー画面で選手を開いたときに1消費、選手が動いたときに2消費します。 開いたときと動いたときの1つ目の消費は恐らく次にアニメーションするまでの時間かなと思います。 動いたときの2つ目の消費はrand(2)で、0なら靴をとんとんさせるアニメーション、1なら照れるようなしぐさのアニメーションです。 これを使って初期seedと消費数を特定することができます。
ゴールモーションのおかげで乱数消費数を把握しながら戦闘を進める必要がなくなりました。
- リセット
- 選手バインダーで初期seedと消費確認
- 狙いのアイテムがドロップできる消費数を確認
- 試合終了間際必殺技でゴールを決める
- リプレイ時のゴールモーションで現在消費数を確認して、狙いの消費数まで進める
- あとは乱数消費されないようにコマンドバトルを発生させずに試合終了まで待つ
ツール: http://oupo.github.com/tools/inazuma3-drop.html
アイテムドロップのデータには以下が3つ設定されています
- アイテムID
- ドロップする確率
戦闘終了時にドロップ判定がされます。 アイテムIDが0でなければ、(rand(100) < 確率)のときドロップします。
これ以外の消費がある可能性ももちろんあります
戦闘開始時に4つ消費します (ミニバトルではなし)
- 基本的に4消費
- スキル クリティカル!持ちだとさらに1つ消費
- こちらも相手も2人以上の場合、さらに1つ消費
- トータルテクニックでは(勝っていた or 負けていた)けれど逆転した場合、さらに2つ消費
- 勝った側が(スライディングや突破などで)ボールをキープできなかった場合、さらに4つ消費
メモリ内容を見たりせずにトータルテクニックで勝っていたかどうかを判別する方法はまだ分かりません。
キックオフ以外で「選手の位置をかえられます」状態になったとき(ファールやオフサイド、ボールがタッチラインの外に出たときなど)42消費します。コーナーキックのときは消費しないようです。
つづけるを選んだときに座標が変わる選手の数?*2消費します。座標が変わる選手の数は8~11のときが多いみたいです。
必殺タクティクスが発動したとき、両方タクティクスを発動した場合は22、そうでなければ11消費します。
ボールの競り合いがあったとき2消費します
ボールを蹴ったときやシュートを打ったときに1消費することがあります。条件はオフサイドになるような選手がいることのようです。(その方向に蹴ったかは関係なく)
オフサイドになる選手が複数いる場合、その人数分消費。
ファールなどからの再開で蹴りだすときは人数分*2?
-
ノーマルシュート・ループシュート・ボレーシュート・ヘディング・無人ゴールシュートを使ったときや使われたとき1消費(リプレイ時にも消費)
-
ゴールが決まったときに3消費
-
リプレイ時のゴールの中に入るモーションで1消費 (消費の調整に使えそう)
-
ノーマルキャッチ・パンチングで1消費
-
転がってきたり飛んできたボールをキーパーがキャッチするモーションのときも1消費
ゴールの中に入るモーションの消費はrand(2)で0なら左から右にゴールが決まるモーション、1なら右から左にゴールが決まるモーションです
- ミスのときは1か3消費。パワーダウンやブロックのときは3消費。
- 2消費(セリフを言う選手の決定)
- クリアポイントのばらつきのために1消費
- アイテムドロップ処理(0~3消費)
- 熱血ポイントのばらつきのために1消費
- 友情ポイントのばらつきのために1消費