HGSS捕獲乱数
HGSS捕獲乱数です。
4thの捕獲処理は戦闘開始時に決定される一時的なseedを使っているので、同様にやれば戦闘乱数も実は簡単にできます。
実際の調整動画
以下、詳細な解説です。
捕獲率
B=(((最大HP×3-現在HP×2)×捕捉率×捕獲補正)÷(最大HP×3))×状態補正
G=000FFFF0÷(4√(00FF0000÷B))
0000~FFFFの乱数を発生させて、それが4回ともG以下なら捕獲成功。 3回以下ならその回数だけ揺れて捕獲失敗。
ポケモンWikiによると4thの捕獲判定はこのような計算がされているらしい。
最も捕まえにくい条件は捕捉率3のポケモンがHP最大で状態異常にもなっていないとき。
このときのGを小数点以下切捨てで計算するとG=0x4103になるけど、4乗根が実際どのように計算されているのかわからないので、4乗根を小数点以下切り上げで計算したG=0x3FFFを安全のため使用することにした。
判定回数は4回なので4回とも乱数値がGより小さくなる確率は1/256。わぁ低い。
戦闘seed
oupoさんの調査によると、戦闘開始時に初期seedが決定されて、r[12]でゆびをふるの技決定がされるらしい。
r[1]~r[11]は何に使われているかわからないけど、爪判定とかその他諸々に使われているらしい。用途不明でも回数が固定なら調べる必要性はあまりない。
実際に調整する前の調査段階でr[12]以外が指振り判定に使われた場合がなかった。出ない技が選ばれたときは除くけど。
モンスターボールを投げるのは2ターン目になる予定なので2ターン目の指振りでどこまで消費されているか調べたところ、1ターン目の技ごとの命中判定などとは別に用途不明の乱数が15個消費されていた。
じゃあ2ターン目の開始時に捕獲判定を満たす乱数の並びが来るように調整すればいいね、って思ったけれど相手の選択する技が事前にわからないと正確な消費数が算定できない!
ということで
野生ポケモンの技選択
どこかに情報書いてないかなーって思って探してみたけど見つからない。
TASVideosに割りと戦闘関係の情報が載ってたけれど相手の技選択は書いてない。TASさんは相手に行動させないからしょうがないか。
仕方ないので実機で調査していると、戦闘開始時のseedごとに選ばれる技が決まっているような気がする。
なのでデータを少し取って推測するとr[7] mod4 の値で決定されていると考えて矛盾がなかった。
これのせいで最初に狙っていた、指を振るできあいだめを出してからの
はりキッスは はりきっている!
っていうネタが駄目になりました…。
2ターン目以降の技決定については調べてないけどきっと誰かが調べてくれるでしょう。
実際の調整
以上のことをふまえて、条件に合う初期seedを検索すると0xba130a69が見つかった。
後は実際に戦闘に入ってみて指を振るで出た技から初期seedを推定、誤差を修正して初期seedを合わせていき、狙いの技が出たら捕獲。という流れで完了。
指振りで出た技から初期seedを推定するにはoupoさんのものひろい補助ツールが便利だった。近くに見つからなかったら大体秒がずれているので2ターン目の指振りの技とか見ながら初期seedを推定しましょう。
レベルアップ直前のポケモンがいたら下画面のボールが揺れるのに乱数が使われるらしいけど今回は調べてない。
多分メリットよりデメリットのほうが大きいから、揺れないように調整しておいたほうがいいと思う。
実用化に向けて
今回は捕獲乱数自体を目的にしていたので比較的待機時間が短くて調整しやすい初期seedを選んだのだけど、「眠りポケに話しかけてたら待機時間過ぎてそう」とか「理想個体と両立できないなら意味ねーじゃん」みたいな声が聞こえてきました。
忙しくてまだ検証できていませんが、適当にプログラムを書いて調べたところ、おそらく理想個体との両立が可能です。
実際には削り無し状態異常無しでやる必要はないので、戦闘開始付近のリストをあらかじめ作成しておいて指を振るの結果から戦闘seedを特定し、その後の行動を最適化するという方法であればいくらでもできると思います。
この考えでいくと諸々の都合上トゲキッスの技構成は(ゆびをふる/しんそく/はどうだん/げんしのちから)になりそうです。
理由はまぁ、各自で考えてください。どうしても知りたい人はコメントでも。
ツールとかは誰かが作ってくれるんじゃないかな()
僕のはgmツールすぎて他の人が使えたもんじゃないので・・・
その他の世代について
第3世代はご存知の通り戦闘中にも乱数が進むので戦闘中に待機すれば可能だろうけど成功する確証がないので多分やりません。
第5世代は初期seedの決定がほんのりややこしいので、かなり調査しないと厳しそうです。調査するほどのモチベーションが出たらこっそりやります。
第6世代は持ってないので厳しいです。持ってたら調べたんやけどなー惜しいなーもっったいないなー正直無謀です。
参考
ここら辺のページを参考にしました。
ktxadのブログ : わざ - livedoor Blog(ブログ)
ゆびをふるで出た技でseedを特定してみようという試み - oupoの日記
情報収集とかで見てたところ
関数が呼ばれたときに呼び出し元アドレスを出力する補助プログラム - oupoの日記