フィールド上で発生する鳴き声処理についての調査結果
はじめに
フィールドでたまに発生するポケモンの鳴き声(101番道路にいるとたまにポチエナの鳴き声がするみたいなやつ)の処理が気になったのでちょっと調べてみました。正直あまり有用ではない鳴き声の処理を忘れないようメモしておきます。
事前にわかっていたこと
・そのMAPにいるポケモンの鳴き声のみする(エンカウントテーブル参照?)
・特性:むしのしらせのポケモンが「てもち」の先頭にいると、野生のポケモンの鳴き声がよく聞こえる(ポケットモンスターエメラルド公式完全クリアガイドより一部改変して引用)
鳴き声の発生判定
結論から言うと、解析によりこのようにわかりました。
鳴き声がする直前にLCGが3回コールされる
— Rosenwaldt (@Rosenwaldt_) February 14, 2019
乱数関係なさそう
むしのしらせも見てみるか
ポケモンが出現するマップに移動するとき、1→1→2→1と消費タイミングが分かれていて、複数のフレームに「連続しては」跨っていないようだ
— Rosenwaldt (@Rosenwaldt_) March 19, 2019
(R%1200 +1200)Fが次の鳴き声までの間隔
— 夜綱@3genSearch v2.4.1 (@sub_827) May 5, 2019
つまりは通常時1200~2400Fごとに1回鳴き声の判定が行われて、特性:むしのしらせのポケモンが「てもち」の先頭にいるとその半分(600~1200F)ごとに1回判定が行われるようです。確かに攻略本に書いてある通り鳴き声がよく聞こえるようになってますね。これが1→1→2→1の最後の1消費の部分ですね。ではその前の2消費は何に使われているか調査しました。2消費のうちの1つは 鳴き声の定位決定。
%88に+212してる(212〜299の乱数を発生させてる)
— 夜綱@3genSearch v2.4.1 (@sub_827) May 5, 2019
212に近いほど左から、299に近いほど右から鳴き声が聞こえます。もう1つは音量決定でした。
2個目は%30
— 夜綱@3genSearch v2.4.1 (@sub_827) May 5, 2019
50〜79を発生させてる
— 夜綱@3genSearch v2.4.1 (@sub_827) May 5, 2019
というわけで2消費で鳴き声の内容を決めていたわけです。
鳴き声の種類判定
発生判定を調査中...
調査に適したマップがないので、スロットの内容変更するか
— Rosenwaldt (@Rosenwaldt_) February 14, 2019
そらのはしら1Fで試しましたが、スロット0の鳴き声しかしないですね
— Rosenwaldt (@Rosenwaldt_) February 14, 2019
聴き取りやすいように御三家や3鳥を割り当ててみましたが、フシギバナが延々と吠えている
どうやら1種類のポケモンの鳴き声のみを永遠と鳴らし続けているらしいです。んー...さすがにこれはおかしくないですか????
というわけで、考えられることを列挙。
・鳴き声処理の3消費に鳴き声の種類判定は含まれていなさそう→鳴き声の種類は何かを契機に変化(鳴き声の種類を保存しているアドレスがあって、それが更新されるタイミングがあるはず)
・鳴き声の種類はそのMAPに出現するポケモンの種類のみ→エンカウントテーブルを参照してそう
・エンカウントテーブルはMAPごとに決まっていて、MAP遷移時に変化する
・単純にポケモンにエンカウントしたら変化する可能性
そして実機調査...
エンカウントしてもずっとポチエナなので関係なさそう
— K.I.S (@koishi_556514) March 19, 2019
マップ更新してみます
バッグ開いたり、自転車乗ったりした程度では変化なさそう
— K.I.S (@koishi_556514) March 19, 2019
MAP遷移が濃厚
マップ移動して戻ってきたら鳴き声がナゾノクサ(スロット1or3)に変化
— K.I.S (@koishi_556514) March 19, 2019
思った通りMAP遷移で鳴き声が変化しました。MAP遷移時に謎の消費がいくつかあったらしいので、そのうちの1つだと思われます。
まとめ
・鳴き声処理の順番は、定位決定→音量決定→間隔決定
・定位は212~299の88種類
・音量は50~79の30種類
・鳴き声間隔は1200~2400F(むしのしらせ時600~1200F)
・鳴き声の種類はMAP遷移時、エンカウントテーブルを参照してそう?(処理は未検証)
最後に
私の興味本位の実用性のない調査に付き合っていただいたRosenwaldt先生、夜綱先生、ありがとうございました。おかげで私の手を汚さずに済みました(?)