Pokémon RNG Advent Calendar 2018 14日目の記事です。

Pokémon RNG Advent Calendarに今回初めて参加させていただきました。
早速ですが記事タイトルの通り、野生個体のメソッドについて知見等を書いてみようと思います。

前書き

キャプチャ
ともしび山でメソッド4のむじゃき6Vポニータ♂を狙っていたとき、実際に出現した個体を捕獲してみるとメソッド1だった、ということが何度かありました。
ろいしんさんの記事では、再計算回数が30を超えるとメソッドずれが起こりやすいということです。

ただ、再計算回数がごく少ない場合にメソッドずれが起こるケースがどれほどあるのか、そういうケースでのずれはどういう理由で起こるのか、はっきりとしたことはわかっていませんでした。
何気なくトキワの森で捕まえたキャタピーが再計算回数0のメソッド2だったという経験もあり、プレイヤーにはどうすることもできない領域なのだろうと半ば諦めていたのです。

が、ある日気まぐれから、ファイアレッドで甘い香りを使わずにエンカウントした個体群(ボックス2,3個分)を確認していたところ、メソッド1が少ないことに違和感を覚えました。
当然気になるので、甘い香りでエンカウントした個体も数十体捕獲し確認したところ、メソッド1が大半でした。

実機で捕獲したサンプルのメソッドとPID再計算回数を載せておきます。
サファイア:ニューキンセツ(奥)
通常エンカウント
M1:0,1,2,3,3,4,4,5,5,5,5,6,6,6,6,6,7,8,8,8,9,9,11,11,12,13,14,16,19,21,22,24,25,25,26,27,31,42
M4:26,38,38,40,40,41,43,46,59,63,68,82
M2:84,90,121
あまいかおり
M1:0,1,2,2,3,4,5,5,5,6,6,8,8,8,9,10,10,12,14,14,14,15,15,19,20,20,22,22,22,23,27,27,30,34,35,37,39,45,46
M4:44,48,55,57,63,80,80,88
M2:98,98,146


ファイアレッド:ハナダのどうくつ(1F)
通常エンカウント
M1:0,0,0,1,2,2,2,4,4,4,6,7,8,8,8,9,10,14
M4:1,1,4,4,4,5,9,10,10,11,11,11,12,16,18,21,22,23,23,24,24,25,26,29,38,41,44,44,50
M2:55,56,57,58,70,81,85
あまいかおり
M1:0,0,0,0,0,0,2,3,3,4,4,5,5,7,8,8,8,8,10,10,10,10,10,10,12,15,15,15,17,18,19,19,20,20,25,26,29,34,35,43
M4:44,45,45,45,53,55,60,64
M2:90,95,97,134


エメラルド:ニューキンセツ(奥)
通常エンカウント
M4:0,1,1,2,2,2,2,3,3,3,4,4,4,4,4,5,6,6,10,11,11,12,12,12,14,14,18,18,19,20
M2:13,16,17,19,19,24,25,26,26,27,27,29,36,36,41,43,45,46,47,47,54,55,56,59,64,64,68,74
あまいかおり
M1:0,1,5
M4:0,1,2,3,3,4,5,5,6,6,6,8,9,9,9,11,11,13,13,14,17,18,20,20,21,21,24,25,25,25,28,29,29,30
M2:36,39,43,50,50,53,61,62,77,79,109,123
通常エンカウント/シンクロ成功
M1:7
M4:1,3,7,8,16,22
M2:14,20,25,32,71
通常エンカウント/シンクロ失敗
M4:0,1,3,5,7,8,8,8,10,10,10,13,15,24
M2:9,13,22,24,25,26,29,29,31,35,36,37,39,50,74,82
あまいかおり/シンクロ成功
M1:6
M4:1,4,5,6,8,8,25,33
M2:42
あまいかおり/シンクロ失敗
M1:2,5
M4:0,2,2,3,3,9,9,10,10,14,14,15,16,30,31,32
M2:42,43,52,52,60,73

メソッドずれの原因


GBAでは「描画」(VRAM領域のメモリ内容に従って画面のドットの色を変えるハードの作業)が終わる(VCOUNT:0x04000006という、水平ラインの描画本数を数えるカウンタが0xA0に達する)と直ちにVertical Blank (VBLANK) 期間となり次の「描画」に備えるのですが、第3世代ではVBLANK移行時の割り込み処理で、他に何も乱数を用いた処理が行われなくとも乱数生成器が1回呼び出されるように仕組まれています。これが「描画1回(=1フレーム/画面1コマ更新)につき1消費」という基本仕様のことですね。

ポケモンの個体作成もこのVBLANK中に行われていますが、ソフトに実装されているMOD関数が非効率なために、PID(性格値)生成時の再計算に必要以上の時間(サイクル数)がかかってしまい、再計算回数が多いケースではHAB個体値かSCD個体値の生成が完了する前にVBLANKが終わってしまい生成が一時中断、次のVBLANKで処理を再開し結果的にメソッド4や2になる、というのがこれまでに判明していたことです。

他の要因

エンカウント判定処理

実はエンカウント処理の有無も、メソッドずれを引き起こす要因だったのです。

smogonの2011年7月の投稿には、スロット決定の直前にエンカウントの有無を決定する処理があると書かれています。
つまり通常エンカウントを契機とした個体生成では、現在のVBLANK期間が終了するまでの間(≒1フレーム間)にこなさなければならない処理が1つ増えるため「よりズレやすくなる」ということになります。
0 - Initial
1 - Battle Decision,		 If Sweet Scent, pass		 = Battle
2 - Encounter Slot Value (0-99), via Upper16 %100		 = Slot
3 - Encounter Level (from Slot), via Upper16 %(High-Low+1) + Low = Level
4 - Encounter Nature, 		 via Upper16 %25		 = Nature
R/S: Upper16 %0xB40 < 16*Density
	Restated: 	if (u16%2880)/16 < D	, pass encounter

Modifications (Poccil's Site):    
   1. If the Mach Bike or Acro Bike is used, multiply by 4/5.
   2. If the Black Flute had been used, multiply by 1/2. If the White Flute had been used, multiply by 3/2.
   3. If the first Pokémon in party has a Cleanse Tag, multiply by 2/3.
   4. If the first Pokémon in party has Stench, multiply by 1/2. If the first Pokémon in party has Illuminate, multiply by 2. (In either case, ignore if the Pokémon holds a Cleanse Tag.)
2号館にも同様の記載がありましたね。
※ケアレスミスか元の記述では「0~0B39」となっていますが、正しくは「0~0B3F」です。乱数の上位16ビットを0xB40で割った余りが「発生させた乱数」の意味になります。
A = (エンカウント)*16*補正
Aよりも0~0B390B3Fの範囲で発生させた乱数の方が小さいときにポケモンと出会います。
(エンカウント)は2号館の出現リストのマップ名の直後にある()の中の値です。

上記はルビー・サファイア・エメラルドの仕様です。

エンカウント-ファイアレッド・リーフグリーン(2号館-資料集)
2号館の説明はよくわからん…。
ファイアレッド・リーフグリーンにおける判定は、通常のLCGを用いる第1段階と、定数が0x6073ではなく0x3039のセカンドLCGと歩数を用いる第2段階にわかれています。

セカンドLCGはエンカウント判定のたびに呼び出される静的な乱数です。
通常LCGの初期seedをr[0]とすると、セカンドLCGの初期seedはr[2]の上位16ビットです。
消費タイミングはポケモンが出現しうるタイル上で十字キーを押したとき。
ポケモンが出現しうるタイルに足を踏み入れてからの移動回数次第では、判定の第1段階でエンカウントが成立しなくとも、第2段階ではいずれ必ず成立することになります。
そのため、初期seedの再現性さえ取れていれば、第2段階の判定で成立させるのは容易です。
実際、この初期seedのときは何回移動したらエンカウントするか、ということは何度か試せばわかると思います。

メソッドずれの要因としては、ルビー・サファイア・エメラルドのそれよりも強力です。
判定が2段階に分かれているため、処理に要するサイクル数が多いのでしょう。

エメラルド特有の事情
エメラルド独自の要素として、先頭のポケモンの特性がいかく/じりょく/シンクロ/するどいめ/せいでんき/はりきり/プレッシャー/メロメロボディ/やるき等の場合、個体生成処理に特殊な影響を及ぼします。

先頭のポケモンがこれらの特性を持っているかどうかのチェック処理はどうやらエンカウント毎(少なくともスロット決定以前)に行われているらしく、当然このような処理にも一定の時間(サイクル数)を要します。
エメラルドの野生はメソッド1がごく少なく、PID再計算回数が0に近くてもメソッド4になることが多いです。
ということは、このチェック処理に要するサイクル数はPID再計算回数でいうと数十回とかそういうレベルということが言えそうです。

巷では、エメラルドの野生はメソッド2で生成されるようになっている、などとといわれることがあるようですが、それは間違いです。第3世代において、野生にしろ育て屋のタマゴにしろ、メソッドずれは処理にかかる時間的な理由によって発生する現象であり、各メソッドが別個の生成ルーチンとしてプログラム上区別されているわけではありません。

通常エンカウントで出現させる

通常エンカウントを利用することで、あまいかおり使用時にはメソッド1だった個体がメソッド4で出現する、メソッド4だった個体がメソッド2で出るといったことが容易になると思います。

ただし、ルビー・サファイア・エメラルドではその仕組み上、すべての個体を通常エンカウントで出現させることはできません。

ファイアレッド・リーフグリーンではすべての個体と通常エンカウントが可能で、処理に要するサイクル数がPID再計算でいうとだいたい20~30回分と、あまいかおり使用時とは大きな違いがあるので、有効活用できるかと思います。

試しに前書きにもあるメソッド4の無邪気6Vポニータを通常エンカウントで出現させると、望み通りメソッド4で生成されていました。

まとめ

  • 野生の乱数調整をするときは、3genSearch野生タブの「(PID再計算の)回数」を必ずチェック。
  • あまいかおりを使わない場合と使った場合でもメソッドずれ発生の頻度が違う。
  • エンカウント判定に要するサイクル数もメソッドずれの原因。そしてこれも個体生成スキームの一部。
  • エメラルドでは先頭の特性識別に要するサイクル数が多いようだ。そのせいか他のバージョンと比べて、より少ないPID再計算回数でメソッドずれが起こる。
  • 通常エンカウントを利用して、意図的にメソッドずれさせることもできる


15日目は@mizdraさんです。