こちらはPokémon Past Generation Advent Calendar 2023の14日目の記事となります。
突然ですが皆さんはダンバル系統の捕捉率をご存じでしょうか。
そう、伝説のポケモンと同等の"3"ですね。
詳しい処理は省略しますが、HP最大で状態異常になっていない捕捉率3のポケモンに対して補正がかからないボールを投げた時の捕獲率はおよそ256分の1になります。
話は変わりますが、HGSSのサファリゾーンにはダンバルとメタングが出現します。
サファリゾーンなので逃走判定があり、ボールも30個しか用意されていないので個体乱数を成功後が鬼門という珍しいタイプの乱数調整を楽しめます。(楽しめるとは)
前置きが長くなりましたが今回はいじっぱりC抜け5V色メタングに遭遇し、一つ目のサファリボールで捕獲する乱数調整に挑戦していきます。
1.個体検索
まずは個体を検索します。使用するツールは4genSearchと乱数調整汎用ツールです。
まずは4genSearchのseed検索タブで欲しい個体値を入力、ここはまあいたって普通ですね。
続いて初期seed検索タブを使います。先ほどのリストの中から実際に欲しい個体のseed列をコピーし、消費数やフレームの上限を許容できる範囲まで広げます。
今回の場合は4300Fですね。(別のC個体値ならもっと短いフレームで出現します。)
次に乱数調整汎用ツールを起動し、初期SEED入力、エンカウント種類を「サファリ」に変更、シンクロ・メロボを使用するものに変更、個体決定方法を「サファリ系」に変更、目標性格値を入力、リスト表示を適宜調整し「表示ボタン」をクリックします。
☆マークのついている行が目標性格値を満たしている個体です。(本来ならもっと星マークがあるはずですが運が悪すぎますね。)
消費数を表す一番左の数値の一つ右の数値が"スロット"となります。今回なら3ですね。
サファリゾーンのスロットは特殊な仕様になっており、ブロックを置くことで出現するようになったポケモンが元のスロットを上から順に侵食するようになっています。
サファリゾーン・解析情報 - ポケットモンスターハートゴールド ソウルシルバー 攻略Wiki - atwiki(アットウィキ)
岩場の効果値が56以上になるようにブロックを配置するとヨーギラスとルナトーンが必ず出現するのがお分かりになるでしょうか。この場合ヨーギラスがスロット0、ルナトーンがスロット1、メタングがスロット2となるのでスロットが0と1の行は使用不可と言うことになります。
逆に今回の例と同じスロット3でメタングを出現させるためにはどうすればいいでしょうか。
スロット0にレアコイルかリーシャンが出現する条件を満たすと、ヨーギラスがスロット1、ルナトーンがスロット2、メタングがスロット3で出現します。このように適宜に調整してスロットを合わせましょう。
目標個体が定まったらID調整を行い(今回手順は省略します)、エリア値を上げます。一つのエリアにブロックは30個しか置けないので効果値56で出現するメタングは出現しないのですが、エリアを入れ替えないように何日も設置し続けることでブロックの効果に倍率がかかるようになります。
ここで言う「何日も設置」はリアル時間なのでDSの時間を変えても意味がないです。メタングの出現は最低30日、最も時間のかかるタツベイの場合110日かかります。こんなに待っていられないので、以下の裏技を使います。
2.エリア値上げ
この裏技は無印DS、及びDSliteでしか使用できません。リアルの方でプラスドライバーを用意しましょう。
まずはエリア値を上げたいエリアをカスタムしてからセーブします。この時ブロックは設置しなくても大丈夫です。
DS背面にあるネジを外すとバッテリーがあらわになります。バッテリーを10秒間ほど外し、DS内部を放電しきってから元に戻して起動すると初期設定画面が表示されます。
名前と色の設定は適当に行い、カレンダーの設定を2099年12月31日23時59分にします。誕生日も適当に設定して大丈夫です。
日付が変わり、2000年1月1日になったのを確認したらゲームを起動し、レポートを書きます。この時にお好みで24時間で結実するきのみ*1をきのみプランターに埋めると安心できます。
そしてこのまま24時間待ちます。この時DS本体の時刻を変更する・対象のROMを別のDSで遊ぶという二つの行為を絶対にしないでください。
24時間後、再びセーブします。きのみを埋めた方は実がなっているのを確認し、収穫はしないでください。
セーブ終了後、再びDSのバッテリーを外します。また2099年12月31日23時59分に時刻を設定し、今度は日付が変わる前にROMを起動します。
きのみを植えた方はきのみが消滅していたら成功です。
ブロックを設置し狙いのポケモンが出現するのを確認しましょう。
3.個体乱数
実際に個体乱数を行います。使用するツールはChatotToolと任意のタイマー、ゲーム内でシンクロ要員とペラップ二体とあまいかおり要員を用意します。
以下の動画の音声を音量最大にしたスマホから流し、DSのマイクと密着させペラップのおしゃべりに記録します。
起動時刻を計算ボタンを押し、画面が遷移したら初期seedを入力し空白時間を345Fにします。
計算ボタンを押すと起動時間が計算されます。更にそのまま確定ボタンを押すとメインウィンドウにそれが反映されます。サファリゾーンゲート内でレポートをしていると思うので事前消費数は徘徊の数、フレーム範囲は自分に合ったものを入力し、初期seed確認をします。
やることは至って簡単、ペラップの鳴き声の工程が一つ前と比べて高いか低いかを入力するだけです。初期seedが合っていることを確認したらゲーム内ではサファリに入場し草むら前で待機、ツール上ではリストをダブルクリックします。
草むらに入るまでにもなつき消費やエンカウント消費が入っているので消費数再特定ボタンを押します。
このような画面になるので検索範囲の上限を20くらいにして同じく高低を入力、現在位置が分かったら確定を押して戻ります。
デフォルトで827になっている目標消費数を変更したら残りの消費を行います。ペラップの鳴き声を慣らすたびにツールの「しばく👊」ボタンを押しましょう。「声帯」にチェックを入れるとツールからも同じ声がして楽しいです。
ペラップをしばき終えたらあまいかおりを使用。目標のポケモンが出てきたらひとまず個体乱数は成功です。
3.捕獲乱数
はい、ここからが鬼門です。以下、32bitの切り捨てられていない乱数列をr[n]、上位16bitのみを切り出した乱数列をs[n]とします。
そもそも戦闘時に使われる乱数は通常のLCGともMTとも独立したLCGを使用しています。更新は通常と同じ
r[n+1] = r[n] * 0x41c64e6d + 0x6073
の式で行われ、初期seedの生成は戦闘開始時に通常の初期seedと同様の方法で行われます。
初期seedをまともに確認する手段はゆびをふるくらいしかないのでまず普通の野生ポケモンで練習し、実際にサファリで導入するという風になります。(ただし通常マップとサファリで明らかにズレが発生したのであまり参考にはならないかも)
ゆびをふるで普通に野生戦に突入し先制した場合はs[12]で決定されます。
第四世代までの技の総数が467個なのでs[12] % 0x1d3 + 1で決定、
ただし出現しないように除外される技
- カウンター
- ものまね
- ゆびをふる
- オウムがえし
- わるあがき
- スケッチ
- どろぼう
- まもる
- みちづれ
- みきり
- こらえる
- ねごと
- ミラーコート
- きあいパンチ
- このゆびとまれ
- てだすけ
- トリック
- ねこのて
- よこどり
- ほしがる
- フェイント
- さきどり
- まねっこ
- すりかえ
- おしゃべり
の場合は再計算されます。参考↓
ktxadのブログ : わざ - livedoor Blog(ブログ)
次に捕獲に使用される乱数ですが、こちらは初ターン即投げの場合s[12]~s[15]までが使用されます。これに関してはほとんどポケモンwikiに書いてあるものと同じ処理です・
まずBを求める。
B=(((最大HP×3-現在HP×2)×捕捉率×捕獲補正率)÷(最大HP×3))×状態異常補正
Bが255以上なら捕獲確定。
捕捉率:捕獲するポケモンの捕まえやすさ。捕捉率一覧を参照。
捕獲補正率:ボールの捕まえやすさ。捕獲補正率を参照。
ハートゴールド・ソウルシルバーでのみ、ぼんぐりから作られるボール (ガンテツボール) は、ボールの捕獲補正率ではなくポケモンの捕捉率に補正をかける。このときボールによる捕獲補正率は1に設定される。捕捉率は最大でも255。たとえば元々捕捉率255のコラッタは全く捕まえやすくならないことになる。
状態異常補正:
こおり・ねむりなら2。
どく・まひ・やけどなら1.5。
ルビー・サファイアでのみもうどくになっても補正はかからない。ファイアレッド・リーフグリーン/エメラルド以降はどくと同じく1.5。
捕獲が確定しなかった場合、次にGを求める。G=1044480÷√√(16711680/B)
除算と平方根は計算後に逐一小数点後を切り捨てる。
0~65535の乱数を4回発生させて、それが4回ともG未満なら捕獲成功。G以上の乱数があった時点で失敗が確定し、それ以降揺れ判定は行われない。捕獲成功率は (G / 65536)4 (%) と表せる。この計算式では65535が出ると必ず捕獲が失敗することになるが、そもそもBが255になれば揺れ判定は行われずに捕獲は成功する。
サファリでボールを投げる場合、捕捉率3でHP最大かつボール補正や状態異常なしなのでBの値は1となります。Bを1とした場合、Gは1044480÷63=16579になるはずですが、実際には16643(0x4103)となるようです。なぜこうなるのか分かる方は教えてください
2024年1月2日追記:こちらのツイートの計算式が正しいようです(計算結果も合う)
wikiの捕獲処理を参考に手元で計算してみて微妙に合わないとこあるな~とずっと首傾げてたんだけど、もしかしてこの辺間違いじゃない?違うかな pic.twitter.com/ca2rBZWGJ2
— りぷて (@lpt_voltecker) 2024年1月1日
そして、上にも書いているようにG以上の数値が出た時点で乱数消費が中断されます。つまり、ボールを投げ続けた場合の揺れ回数のリストを作る時にもちゃんとループ処理を作る必要があるわけです。
次に逃げに使用する乱数についてですが、1ターン目はs[7]、2ターン目以降は前ターンの最後の揺れ判定で使った乱数から三つ後の乱数を使用します。s[n] % 255がポケモン毎に設定された逃走率以下の時に逃走が成功します。なんで256じゃなくて255で割ってんの
メタングはこの値が60、それに対しダンバルは90なので実はメタングの方が捕まえやすいです。
2ターン目のボールは逃げ判定から五つ後の乱数から使用、以下ループしていきます。
この情報をもとに、ゆびをふるをした時に出る技とボールをひたすら投げ続けた場合に何回揺れて何ターン目で逃げるかを出力するツールを作りました。クソコードすぎるので配布する気はありません、ご了承ください。
本当は個体乱数の情報を入力し、そこから許容できる待機フレーム数を入力することで一発捕獲可能な初期seedを出力するツールも作ったのですが
こちらに関してはフレームカウントが60fpsではなさそうな挙動や秒ズレを修正するのがあまりにも難しいといった事情により使う意味がほぼなくなってしまいました。適当な待機フレームで出た技か揺れ回数から初期seedを特定し、そこから最も近い捕獲可能seedに近づけていくというのが現実的です。
フレームカウントに関してですが、一回暗転する度にかなりカウントがストップするので必ず同じ動作で戦闘を行いましょう。また、ペラップで初期seedを確認するとその動作だけで合計四回も暗転が発生してしまうので「徘徊で初期seed確認することのデメリット」を理解している人は徘徊で初期seedを確認することを推奨します。
実際に成功した事例を紹介します。まず、待機時間10496Fで揺れ回数が2→0→0→0→0→0→0→1→0→0→0→0→0→1→逃げという非常に特徴的な初期seedを引きました。これを検索してみると0xFC11235Cだということが分かりました。
この周辺に捕獲可能な初期seedがあるか探してみると0xFC112338、つまり36フレーム前が存在しました。が、少しでもフレームを減らすと秒が変わってしまい初期seedの上二桁が変わってしまうことが分かっていました。そこで先ほど説明した暗転を逆利用します。実際に余分にバッグを一回開閉した場合0xFC112305、87フレーム手前の初期seedを引きました。なのでタイマーを約50Fほど増やし微調整してみると…
無事一発捕獲に成功しました。サファリボールの残り個数が29個になっています。
一例の流れの動画がこちらです。(広告を付けていないのでお気軽にご視聴ください)
4.終わりに
ツールを公開していないので尻すぼみ感が半端ないですが、ひとまず戦闘乱数及び捕獲乱数の実態について紹介することが出来ました。正直サファリ以外では実用性がないですし、サファリでも調整に時間がかかりすぎて手動で粘った方がいいですが物好きな方は真似してみてください。誰かまともなツールと初期seed調整ツールを作ってくださいお願いします
本日配信の藍の円盤からダンバル系統が解禁されるので一応そういう意味での需要があるのですかね…?ちなみに個人的にはサファボメタングは似合っていないと思っています、変な乱数調整をやりたかったので題材として選択しただけです
明日の記事はハンターさんの「海外勢との三世代交流レポ」となります。最近第三世代モチベがまた湧き上がっているので楽しみです。
参考にしたサイト
ktxadのブログ : わざ - livedoor Blog(ブログ)
ゆびをふるで出た技でseedを特定してみようという試み - oupoの日記