スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【ポケモンFRLG】ポケセンでの再描写による乱数消費

本記事は、Pokémon RNG Advent Calendar 2016 21日目の記事になります。



TASVideosのPokémon Center’s extra RNG cycleについて。
簡単に説明すると、ポケセン内で画像の再描写が行われると、それ以降、1[F]で乱数が2消費されるというもの。
ポケセンLCGと呼ばれているものです。

このポケセンLCG状態で戦闘に突入すると1[F]で乱数が4消費ノイズ消費と合わせると1[F]で乱数が314消費になります。

このポケセンLCGを使って乱数消費することをポケセン消費と呼ばれています。
現状、このポケセン消費の使いどころは、乱数調整をしたいポケモンがポケセンから近く、TV消費では待機時間が短い場合のみ使用価値があります。
ポケセンから近く、TV消費を使う程待機時間は長くない、孵化乱数が一番使えるでしょうか?

更に限定的な場面と言えば、ポケセン内で乱数調整をする必要がある、3番道路で買えるコイキングと徘徊乱数でしょう。

ポケセンLCGを解除する方法はリセット以外には見つかっていません。
逆に言えば、一度ポケセンLCGにしてしまえば、通常と同じように乱数調整出来るのでTV消費有乱数に比べて求められる精度は低くなると考えることもできます。

さて、現状での実用化についていくつかあげましたが、検証次第では更なる実用化もされる可能性もあります。
特に注目されているのが、ポケセンLCG状態でのmethodズレに関してです。
通常より多く乱数消費されるポケセンLCG状態では、ポケモンの個体生成に影響が出る可能性があるからです。

残念ながら固定シンボルのmethodズレは確認出来ていませんが、試行回数が足りていません。そして、野生に関しては未検証です。
今後の検証次第でしょう。

スポンサーサイト

【ポケモンFRLG】初期SEEDの生成

本記事は、Pokémon RNG Advent Calendar 2016 11日目の記事になります。



記事内容はリクエストのあったFRLGの初期SEEDについて。
戯言程度に。
軽く見流す程度の記事になるので過度な期待はしないでください。

といっても、2009年の時点で初期SEEDの生成や仕組みは割れており、調べれば出てくるので生成については多く語ることはありません。
基本的な事は全てsmogonの最初に書いてあるので各自参照。

ざっくり説明すれば、FRLGの初期SEEDはTimerの値から生成されており、そのTimerはGBAのCPUクロック数依存であるという事。
GBAのCPUクロック数についてはこちらを参照。

さて、GBAのCPUクロック数依存であり、その値の情報も出ているのであれば、1[F]辺りに進むTmerの値を計算出来るだろう。
まず、この段階に至らず、好き勝手言ってる輩が多い時点で察するところはあるのだが。

計算すると、1[F]辺りに進むTimerの値がピッタリ割り切れないことが分かるだろう。
1[F]毎に進むTimerの値が均一でない理由がコレで分っただろう。

ここに関わっている可能性があるキー入力や設定等が追加されるが、コレは条件を揃えればあまり意識しなくてよい。設定は初期SEED決定までの間に変動することはなく、キー入力も初期SEED決定前から決定までの入力時間が一定である為である。
また、意識したところでこれらの操作で、意図的にTimerの値を制御するのはほぼ不可能である。

さて、適当に生成について書いたが、ここで疑問に思う事はないだろうか。

1[F]辺りに進むTimerの値が均一でなくても、再現性をとることは極めて簡単なのである。
このことから、1[F]辺りに進むTimerの値は均一ではないが、何らかの法則に基づいて、決まった値だけ進んでいることが分かるだろう。

この何らかの法則を解明できれば、出る可能性のある初期SEEDの予測が可能になると考えられないだろうか?
何故、出る可能性があるなのかは、キー入力や設定等が含まれるからである。

恐らく、端数を機械的に計算しているだけであり、なんとなく思うところはあるのだが、データ不足なのでこれ以上は何も言えない。

多くのデータを集めれば結論は出るのだが、実機での調査になる為、かなり難しい話になる。
まず、初期SEEDの生成位置が明確に分からない為、初期SEEDを生成位置順に並べるのも難しい。

なにより、おしえテレビ内のノイズ消費を利用した、TV消費有乱数が確立された今では初期SEEDの数がそれほど要らない
JPN版であれば初期SEEDを共有すれば十分な数が集まる

という事もあり、初期SEEDについてこれ以上どうこうする必要はないのである。
何より、出る可能性のある初期SEEDである為、期待が出来ない。

もしそれでも初期SEEDに求めるのであれば、1[F]毎に最低30回位データをとり、最低10000[F]程度の範囲のデータを提供されれば考えます。

それだけのデータがあれば、それこそTV消費有乱数と初期SEED共有した方が良いと思いますが。
初期SEEDに夢を見るのはいい加減やめましょう。

【ポケモンFRLG】おしえテレビを利用した乱数の高速消費

情報は間違っている可能性があります。ご利用は計画的に。

以前におしえテレビ内のポケモンを光らせる検証をしたとき、おしえテレビのチャンネル選択時のLCGの処理が違うという記事を上げましたが、それは誤りという指摘を受けました。

本記事の情報は、やつなさんによる情報が含まれています。
予め、許可を取っていると同時に、記事をお願いしますと頼まれました。

詳しく調べず、誤った情報を流した事を謝罪すると同時に、細かい検証を行い、指摘してくださったやつなさんに感謝します。



取り敢えず、以前の誤った情報のおさらいから
おしえテレビを起動し、チャンネル選択画面の間に、LCGが通常とは異なるものになるという事でした。

SEED = SEED * 0x4A9EEACD + 0x63FD404B

これがそのLCGでしたね。

これを利用できないかと長らく考えてましたが、LCGが変化するとなると計算も調整も厄介で扱いにくいという事で、思考が止まっていました。
ここまで誤った情報のおさらい。
ここから、本編です。





RTAの為にエンカウント乱数の検証を開始し、その中でLCGの監視を始めた結果、おしえテレビLCGが存在しないことが判明するという、検証してたら別の検証になってた乱数検証勢あるあるから事は始まる。




LCGが変化しているのではなく、単純にチャンネル選択画面で謎の消費が大量に挟まっていたという事。
ですが、謎の消費が挟まって、おしえテレビLCGという規則的な計算式が出るのは奇妙ですね。
謎の消費が大量に挟まって尚、規則的な計算式になるという事は、消費が一定であり、安定しているであろうという仮説は容易に立てられるでしょう








やつなさんの調査結果とおしえテレビLCGから、消費数が313[F]一定。仮説道理、消費数が一定であることが証明されましたね。
要するに仕組みは戦闘乱数の進みと全く同じです。
戦闘乱数が通常の2倍なのに対して、おしえテレビは通常の313倍なので、物凄く消費数ですね。

さて、今まではLCGが変化するという事を考えて実用化を目指していましたが、単純に倍速で一定数、乱数消費がされると考えれば実用化が容易です。

と言っても、計算は複雑な事をしていますが、動きは結局同じことなので、私の頭が固いか知識不足なだけです


やはり、考え方の問題。

何故、こんな消費が行われているのかという話になりますが、恐らく背景のノイズが原因と言う話になっています。
実際はどうなのか知りませんが、知ったところで意味はないでしょう。

やつなさんはこの消費の事をノイズ消費と呼んでいます。

ここまで、エミュレーターでの情報です。
後は実機で実用化が出来るかが問題ですね。こちらもやつなさんが一晩でやってくれました。





実機の結果もエミュレーターと同じようですね。



さて、実機で実用化するにはどうですればいいでしょうか?
単純にフレーム合わせの回数が1回増えるだけです。簡単ですね?
私もやつなさんも簡単な事で現実的だと言っているので超簡単。

単純に一定数で大量消費されているだけなので、実際の乱数調整も言う程、複雑にはなりません。

初期SEEDの再現性をとって、一定にするのは当たり前として軽く色々説明を。

まず、一定数で大量消費されているだけなので、予め決めたある時間内で、予め決めた時間だけおしえテレビを起動すれば、起動するタイミングは一定にする必要はありません

このおしえテレビを起動して大量消費することをやつなさんはTV消費と呼んでいます。

つまり、初期SEED決定後、300[F]経ってから、TV消費を1000[F]、500[F]後にエンカウントするのと、初期SEED決定後、600[F]経ってから、TV消費を1000[F]、200[F]後にエンカウントするのは同じという事です。

予め決めた時間内に一定時間、TV消費するだけなので、エメタイマーが終わった瞬間に別のエメタイマーを始めるという事もありません。

ただし、TV消費で1[F]でもズレれば313[F]分ズレたことになるので、エメタイマーの設定の調整は厄介です。

また、ファイヤーはファイヤーズレ、フリーザーはフリーザーズレ、NPCが存在するMAPでの野生のポケモンは注意が必要です。
と言っても、おしえテレビをバックから起動すれば、同時に回避できるので特に問題はありません。

313倍で消費される為、TV消費1秒(60[F])で18,780消費
TV消費10分(36,000[F])で11,268,000消費が可能になります。

実際に個体検索してみれば分かりますが、10,000,000[F]もあれば性格一致5UVどころか、性格一致6UV、理想(理論値)個体がソコソコな数がヒットします

単純に現実的に積れる個体が増えた為、光る高個体のポケモンも積りやすくなっているのも注目点です。
EmでID調整ができない為、光る高個体のポケモンを積もり難いというのをTIDSEEDで間接的に解決した事と同じですね。

Twitterでは、XD乱数のやり方をFRLGで実現するやり方もまとめましたが、流石にこちらは現実的ではない上に、一部のポケモンでしか使えないので説明は省きます。

【ポケモンEm】TID生成を利用した初期SEED変更

情報は間違っている可能性があります。ご利用は計画的に。

BVコピーの知識を前提としています。

Emの初期SEEDは0x0で固定というのは有名な話です。
この初期SEEDをどうにか0x0以外の値にすることができれば、乱数列が変化し、普通では数ヶ月単位の待機時間でも、数時間単位の待機時間で済む可能性がありますね。(勿論、逆もあり得ます。)

BVコピーの記事でも説明しましたが、通信対戦時は1PのSEEDを共有します。
そして、通信終了後には、共有する直前のSEEDに戻ります。

その為、BV保存が行えるEm同士でないと、BVコピーはできないのです。



EmのTIDとSIDの生成方法をご存知でしょうか。

EmのTIDはTN選択時に動いているTimerの値から生成されています。
一方、SIDはTIDを初期SEEDとした通常乱数から生成されています。

このTIDを初期SEEDとした通常乱数に目を付けました。

実は、SID決定後もこのTIDを初期SEEDとした通常乱数のまま冒険がスタートします。この状態はリセットを行わない限り維持されます


この画像からTIDは53111であることが分かりますね。これを16進数法に直すと0xCF77となります。
個体値やPIDから初期SEEDは先ほどの0xCF77から生成された個体と判定できました。Emの本来の初期SEEDの0x0では該当する個体はいませんでした

さて、これで最初から初めてリセットを1回もしていない状況なら、初期SEEDを0x0以外にすることが可能ということが分かりましたね。

このTIDを初期SEEDとした通常乱数のことをTIDSEEDとでも呼んでおきましょうか。

このTIDSEEDを維持した状態のROMを1P側とし対戦を行い、BVコピーをすれば、初期SEEDを0x0以外にすることが可能なわけです。

BV保存は、Em同士であれば可能で、バトルパスを片方が持っていなかったとしても、しっかり保存することができます。

BVコピーTIDSEEDを合わせることで、初期SEEDを0x0以外にすることが可能と分かりましたね。



TID厳選をすることで、待機時間を大幅に減らすことも可能になりましたね。
と言っても、TID厳選で大幅に時間を費やしては意味がないので……

実はFRLGのTIDとSIDの生成法もEmと同じです。
もしかしたら、何かに使えるかもしれませんね。

通信対戦は、図鑑をもらった直後から可能なので、BVコピーまでの時間が短いのも良い点ですね。

BVコピーとTIDSEEDを上手く使う為には、Emを複数個所持するのが良さそうですね。

【ポケモンEm】BV保存と通信対戦

情報は間違っている可能性があります。ご利用は計画的に。

Em同士で対戦するとBV保存が可能なわけですが、そのBVを使って乱数をするとどうなるかを検証しました。
大分前に疑問に思い、仕様から結果も予想出来ていたのですが、忘れていました。

検証は全て通信ケーブルで行い、シングルバトルでの結果です。ただ、仕様上ワイヤレスアダプターで行っても、ダブルバトルやマルチバトルで行っても結果は変わらないと思います。



通信対戦時にも当然乱数が使われています。そして、乱数値は共有しないと双方で結果が変わってしまい、ゲーム進行に影響が出てしましますね。
初代ではバグで双方の乱数値が上手く共有できずに双方で結果が変わり、疑似フリーズ状態になったり通信エラーが発生することがあったりします。

その為、通信対戦のBVはどちらのプレイヤーも同じSEEDが保存されることになります。

ここから私はこう思いました。
通信を始める前にBV再生でSEEDを呼び出し、対戦でそのSEEDを共有し、もう片方のROMでその対戦をBV保存すれば、SEEDをコピーできるのでは?

Gen IIIでは1P(親)の通常SEEDを共有するのです。

というわけで、実際にやってました。

1Pは対戦前にBV再生でSEEDを呼び出してから通信対戦画面に、2Pは起動後すぐに通信対戦画面に移りました。
適当に対戦し、2PのみBV保存を行い通信対戦を終了。
その後、先ほどの通信対戦のBVを再生して野生ポケモンにエンカウントしたところ、1PのROMに保存されていたSEEDが保存できていることが確認できました。

正確には、対戦が始まるまでに少し時間があるので、保存されていたSEEDより後のSEEDが保存されているのですが、どうでもいいですね。

予想道理、BVのSEEDを他のROMにコピーすることができました

BV自体をコピーしているわけではないですが、BVコピーとでも言っておきましょう。

さて、ここまで来るともう1つ調べたいことが出てきます。

RSやFRLGのSEEDを共有し、通信対戦終了後、バトルフロンティアでBV保存を行えば、Emの初期SEEDを0x0以外で使うことができそうですね。

というわけで、検証してみたのですが……
残念ながら、できませんでした。

通信対戦終了後は通信対戦前のSEED、つまりSEEDを共有する前のSEEDに戻りました。Em同士で対戦し、BV保存を行わなかったときも同様でした。

通信対戦時のSEEDを呼び出せるBV保存だからこそできる技ということですね。

では、通信対戦時に意図的に通信エラーを起こせばいいのでは?とか思ってしまう過激派の人に先に言っておきましょう。それは無理です。
Gen IIIでは通信エラーが起きた場合、電源を落とさないと復帰できないからです。



というわけで、通信対戦BVを利用することで他のROMにSEEDをコピーできることが分かりましたね。RS,FRLGのSEEDなどをコピーできないのは非常に残念ですが、これだけでも十分使えるの活用していきたいですね。
ただ、使う時は通信対戦が始まるまでの時間を考慮することを忘れないようにしましょう。

BVコピー用Emを大量購入しておけば、回収も楽になりそうですね。

【ポケモンFRLG】フリーザーズレ/ファイヤーズレ

情報は間違っている可能性があります。ご利用は計画的に。

FRLGでフリーザー、ファイヤーの乱数に挑戦したことがある人なら苦しめられたであろう、フリーザーズレ、ファイヤーズレについて軽く調べたので、適当に載せておきます。

フリーザーズレとはフリーザーを乱数する際、稀にフレーム数が少しずれること。
ファイヤーズレとはファイヤーを乱数する際、フレーム数が大幅にずれ、安定しないこと。



Gen IIIでは、乱数が1[F]毎に消費しているのは有名な話ですが、乱数を消費する方法はフレーム待機だけではありません。Gen IVやGen Vなどのように、NPCの動きなどでも乱数が消費されます。

なので、NPCがいるところで乱数をしようとすると、NPC消費によってフレーム数が少しずつずれてきます。
ですが、フリーザーのいるMAPやファイヤーのMAPには、見た目上動いているNPCは存在しません。

では、何故ずれるのかと疑問が出てくるわけですが、固定シンボルであるフリーザーとファイヤーもNPCです。なので、データ解析で固定シンボルNPCの設定情報を抜き出して比べてみました。

NPCには、活発に動くNPCとそうでないNPCがいますね?
その活発というものが全てのNPCに設定されているのですが、固定シンボルNPCでファイヤー以外は動かないものに設定されていました。
そして、ファイヤーは動く値に設定されていました。

つまり、何が言いたいかというと見た目上動いてなくても、データ上は方向転換を繰り返しているわけです。

ファイヤーズレの謎消費の原因はファイヤー自体にあったというわけですね。

さて、NPCの活発さの値が違ったのはファイヤーだけでフリーザーはサンダーやミュウツーと同じ値でした。では何故、フリーザーは稀に少しずれるでしょうか?

よくNPCの設定情報を見ていると、どこに使われているかは分かりませんでしたが、ある値がフリーザーだけ他の固定シンボルNPCと違う値が設定されていました。どこに使われているかは分かりませんが、どうやらこの値が謎消費に関わっている気がしますね。
というか、この値以外はサンダーやミュウツーと同じなのでこれが原因と言っていいでしょう。

フリーザーズレの謎消費もフリーザー自体にあったということですね。

さて、ではこのフリーザーズレとファイヤーズレを回避するにはどうしたらいいのでしょうか?
対策は簡単です。
消費待機中はメニューウインドウを出していればいいのです。

Gen IIIではメニューウインドウやメッセージウインドウ等が出ている間はNPCの動きが止まります。(イベント等例外有)
なので、データ起動してから直ぐにStartボタンを押してメニューウインドウをだし、エンカウントの直前で閉じればいいのです。

実際にフリーザーで軽く検証した結果。
41000[F]程度の待機時間の時、待機時間中にメニューウインドウを出している時と、いない時で100[F]程度の差がでました。
これはフリーザー自体が乱数消費に関わっていると見ていいでしょう。

ファイヤーは未検証ですが、フリーザーと同様だと思います。



フリーザーは待機時間が短い場合、乱数消費は誤差の範囲内なのでそこまで気にしなくてもいいと思いますが、待機時間が長くなるならメニューウインドウを出す方がいいでしょう。
ファイヤーは大幅にずれるので、待機時間に関わらずメニューウインドウを出すことをお勧めします。

又、メニューウインドウを出す時間、閉じる時間も一定にした方が良いと思います。
プロフィール

suiren1350

Author:suiren1350
跡地:伝説厨のポケモン日記

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。