かけらの記録ノート

かけらの記録ノート

主にポケモンの乱数について語るブログ

【チャンネル乱数】タイトルデモを利用した乱数調整

この記事では、ポケモンチャンネルでの乱数調整における新しい消費方法について提案します。

・はじめに
今までのポケモンチャンネルにおける乱数調整では、消費の微調整にタイトル画面の表示による消費が使われていました。
ジラーチを受け取るまでの過程で、必ずタイトルを経由しなければならないため、乱数調整を行うにあたってはこの消費を考慮する必要があります。
どのような仕組みかは以前に記事に書きましたが、再計算を伴う処理になっているため、シードに展開が現れるようになります。(これは受け取ることのできるジラーチの個体の範囲を狭めていたりしてとてもごみカスです。)
さらに、この再計算自身によって通常の契機では理論上到達不可能な個体が存在してしまいます。それらは「ペイント」による消費によってのみ到達可能でした。しかし、ペイントを使って消費を行うと、シードが固定値によって初期化されてしまうため、現実的な時間で調整することは困難です。

そこで、ポさんがタイトルデモを見ることで消費が発生することを発見しました。
これはタイトル画面の表示による消費とは独立して消費が行われるため、再計算を回避して目標のシードにたどり着くことが可能です。これを調査し実用化に成功したので、この記事で簡単な仕組みとやり方について紹介します。

・デモ消費について
ポケモンチャンネルでは、タイトル画面で放置することによって、本編で見ることのできるチャンネルのデモが流れます。これを見ることで、固定または不定値の消費が発生します。

見るチャンネルによって消費数は異なり、中にはセーブデータ依存による処理も含まれます。これを再現するためには各自で調査を行う必要があります。
セーブデータの進行度によって流れるチャンネルの種類が変わり、ジラーチを受け取ることのできるクリア済みのデータでは合計10種類のデモが存在します。
それぞれの説明を以下に示します。

・チャンネルデモの種類
・PNNN
コダックがニュースを紹介する番組です。

消費数は固定値で、2回に分けて合計4消費されます。

・ゼニゼニショッピング
ゼニガメが商品のプロモーションを行う番組です。

このチャンネルではセーブデータ依存の不定消費が起こります。
消費に組み込むには独自に調査が必要ですが、無視しても大体の個体には影響はありません。
これについては、初期化直後のセーブデータを使うことで回避することができます。ただし、その場合だと閲覧可能なチャンネルが制限されるため、消費の自由度が下がります。

item_list = []
while(len(item_list) < self.roll):
    shop = (RNG.Advance(1) >> 16) * 0x4 >> 16
    if(shop == 3):
        while(len(item_list) < self.roll3):
            item = (RNG.Advance(1) >> 16) * 0x5b >> 16
            frame += 1
            if(self.Item3[item].get() and  item not in item_list):
                item_list.append(item)
        break
    else:
        item = (RNG.Advance(1) >> 16) * 0x5b >> 16
        frame += 1
        if(self.Item[item].get() and  item not in item_list):
            item_list.append(item)

上のコードに含まれるroll、roll3、item、item3がセーブデータ依存で変化します。
これらは初期化直後のデータでは、固定値となります。

    self.item = [0x17,0x18,0x19,0x1b,0x1c,0x24,0x2c,0x3b,0x44,0x45,0x46,0x47]
    rand_list = []
    while(len(rand_list) < 2):
        r = (RNG.Advance(1) >> 16) * 0x5b >> 16
        if(r in self.item and r not in rand_list):
            rand_list.append(r)

こちらでは商品の種類による分岐が起こらず、値も固定です。
簡略化していますが、上のコードと同じ内容です。

ムチュール★エクササイズ
ムチュールがエクササイズする番組です。

消費数は固定値で、2回に分けて合計2消費されます。

・クイズソーナンス
ソーナンスによるクイズ番組です。

消費は不定で、以下の処理が行われます。

rand_list = []
while(len(rand_list) < 3):
    r = (RNG.Advance(1) >> 16) * 0x17 >> 16
    if(r not in rand_list):
        rand_list.append(r)

ドーブルびじゅつかん
ドーブルによるお絵描き番組です。

消費は不定で、以下の処理が行われます。

rand_list = []
while(len(rand_list) < 3):
    r = (RNG.Advance(1) >> 16) * 0x37 >> 16
    if(r not in rand_list):
        rand_list.append(r)
rand_list = []
while(len(rand_list) < 2):
    r = (RNG.Advance(1) >> 16) * 0x23 >> 16
    if(r not in rand_list):
        rand_list.append(r)
rand_list = []
while(len(rand_list) < 2):
    r = (RNG.Advance(1) >> 16) * 0x3d >> 16
    if(r not in rand_list):
        rand_list.append(r)
RNG.Advance(1)

ヤドン天気予報

ヤドンによる天気予報の番組です。ゲーム内で見ることによってフィールドの天候が変わります。
このチャンネルは特殊で、初回に見るときと2回目以降に見るときでアニメーションの内容が異なり、消費も変化します。
また、セーブデータ依存でフィールドが異なり、フィールドによっても消費が変わります。

ただしこちらはゼニガメのように細かい場合分けは起こらず、4種類存在するフィールドによってのみ契機が変わるため、大掛かりな調査の必要はありません。
現在2つのフィールドにのみ対応しています。
※これは、デモにおけるフィールドの変更契機が不明なためです。何を契機としているかは分かりませんが、ゲーム内でチャンネルを見たり、日を跨いだりすることでまれに変わるようです。調査の必要があります。
・モエギそうげん初回
消費数は固定値で、2回に分けて合計2消費されます。
・モエギそうげん2回目以降

sleep = (RNG.Advance(1) >> 16) * 5 >> 16 == 0
if(sleep):
    RNG.Advance(1)
RNG.Advance(1)

・スオウかいがん初回
消費数は固定値で、2回に分けて合計4消費されます。
・スオウかいがん2回目以降

RNG.Advance(1)
sleep = (RNG.Advance(1) >> 16) * 5 >> 16 == 0
RNG.Advance(1)
if(sleep):
    RNG.Advance(1)
RNG.Advance(1)

2回目以降では、アニメーション内でヤドンが寝ているかの判定が行われていて、寝ていた場合だと追加で1消費が起こります。

・タマゴなにかな?
ラッキーによるタマゴの中身を当てる番組です。

消費数は固定値で、3消費されます。

ポケモンあまるかな?
画面に映るポケモンの数が奇数か偶数かを当てる番組です。

消費は起こりません。

メリープぼくじょう
牧場を駆け抜けるメリープの数を数える番組です。

このチャンネルもヤドンと同様に、初回と2回目以降で消費が変わります。
・初回
消費数は固定値で、3消費されます。
・2回目以降
消費数は固定値で、10回に分けて11消費されます。
また、冒頭の2消費目の乱数値によってアニメの開始時に寝ているポケモンが変わります。

RNG.Advance(1)
poke = "ヤドン" if RNG.Advance(1) >> 31 == 0 else "カビゴン"

・ムチュムチュランキング
ムチュールによる格付け番組です。

消費は起こりません。

以上の10種類のチャンネルデモが存在していて、チャンネル開始直前のノイズが走る画面でr(10)により決定されます。
ただしこの時、同じ番組が被らないように、直前のチャンネルと同じ場合は再計算が起こります。これを意図的に利用することでシードの調整の幅が広がります。
また、チャンネルデモは5回流れると、間に再度アニメーションを挟みます。これはチャンネルデモを中断した場合でも継続されるため、実際に消費を行うときに注意する必要があります。
分かりにくいので例を挙げてみます。
通常ではデモを5回見るとその次の5回の間にアニメーションを挟みます。しかし、デモを2回見て一度タイトルに戻った場合、次にデモを3回見るととアニメーションが流れます。
デモの番組の調整を行う場合は5回ごとに区切って行うと効率が良いです。本番の調整を行う場合は、タイマーを考慮してデモが5回流れる状態にしておく必要があります。

・初期化済みのセーブデータについて
初期化済みのセーブデータを用いることで、セーブデータ依存の処理を固定させることができます。よって、調査の必要なしにゼニガメを消費に組み込むことが可能です。
クリア済みのデータとは別のメモリーカードを用意して、そちらに初期化直後のデータを作成します。
開始直後のデータとなるので、消費に使えるチャンネルの数が10から4つに減ります(上から4つ)。消費の計算の自由度が多少下がるため候補が少なくなると思われますが、こちらではゼニガメによる計算エラーがなくなるため、あまり影響はありませんでした。
計算結果にもよりますが、乱数調整を行う際は安定性の面からも初期化済みのデータを用いて行うのを推奨します。

ここで、セーブデータを作成する際の注意点について述べます。
「New Game」でゲームを開始した直後にアニメが流れます。

その後、会話を進めていくとセーブを要求されます。そこで20$もらえます。

この段階ではまたセーブデータが固定されないので注意してください。
もう少し話を進めると、ピカチュウがやってきます。そして、博士から「Note Pad」が貰えます。

この段階で自由に行動ができるようになるため、ここでセーブをします。ここでセーブをして初めて固定が完了となります。
ここで作成した初期化済みのメモリーカードを利用することで、ツール上で「初期化済み」にチェックを入れた状態の消費を行うことができます。
ただし、このデータではジラーチを受け取ることができないため消費にのみ利用して、実際に受け取る場合にはメモリーカードを差し替える必要があります。

・乱数調整のやり方
ここまでの仕組みを利用して、実際に乱数調整を行ってみます。
ツールにはDDJCとChannelDemoSearch v0.90を使用します。
drive.google.com

①目標個体の検索
DDJCを用いて、狙う個体の開始時シードを求めます。

求めたシードを「ジラーチ検索」タブのシード欄に入力し、計算をクリックします。

初期化済みと通常の場合を検索して、猶予時間が長い方を使用してください。出力された結果を見ながらその通りにセットアップを行っていきます。直前に見たチャンネルを事前に指定されたものになるようにして、必要であればヤドンメリープをあらかじめ視聴しておく必要があります。
うまく結果が表示されない場合は、デモによって到達できない個体となります。その場合は、ゼニガメのセットアップを行うか、ヤドンのフィールドを変えることで結果がヒットする場合があります。

②チャンネルのセットアップ
まず初めに、「スペシャル検索」タブで最初に流れるチャンネルを決定します。
上でチャンネルの決定方法について説明しましたが、ゲーム内ではあらかじめ直前に見たチャンネルが保存されており、次にチャンネルを視聴する際には同じものが流れないように再計算されるようになっています。
ゲームを始めた直後の場合、直前のチャンネルは初期シードから1消費された乱数値から決定されます。タイトル消費の仕様によって、これをあらかじめ予測することは困難です。
ただし、一度もデモを見ていない場合に限り、スペシャルでの消費を行うことで再設定が可能です。
スペシャル検索タブに現在のシードと適当なチャンネルを入力し、検索をします。

結果に出力された回数タイトル消費を行い、その後スペシャルによる消費を行うことで直前のチャンネルを任意のものにすることができます。

ヤドンメリープが未視聴で良い場合はこれでセットアップは完了です。
そうでない場合は「チャンネル検索」タブで必要なチャンネルを検索して、細かい調整を行っていきます。
ヤドンもしくはメリープの視聴が必要な場合は、ここで検索しながら視聴します。

事前に上で適当に直前のチャンネルを決定しておき、それを入力します。そして、見たいチャンネルを選び、検索をします。
指定した数タイトル消費を行った後、もう一度タイトルに戻って放置することで目標のチャンネルが流れます。目標のチャンネルが終わり、ノイズが始まると同時にタイトルに戻ることで、終了時シードの状態になります。
これを繰り返して再生回数が合計で5回となるまでに必要なチャンネルを視聴します。ここで、最後の5回目に流れるチャンネルを指定されたものになるようにします。
ヤドンメリープの指定と最後に見るチャンネル以外はどのチャンネルを見ても問題はありません。

⓷タイトルシードの調整
現在のシードが指定された開始時シードの直前になるまで消費を行います。
「シード調整」タブを利用して、必要回数のタイトル消費を行うことで調整を行います。
ここで、目標となる開始タイトルシードの一つ手前になるまで消費を行います。

上の画像でいうところの、Continue→NewGame→Option→Specialと表示され、シードが0xc2fdaaf2になる状態まで消費を行います。
次のタイトルの表示で開始タイトルシードに達する状態です。ここまで準備ができたら、Optionに入った状態で待機します。
これですべてのセットアップが完了です。

④デモの視聴とタイマーの調整
ジラーチ検索」タブの「DemoTimer」を起動します。

そして、ゲーム内でBボタンを押してタイトルに戻ると同時にEnterキーを押すことでタイマーを起動します。
タイマーの譜面に合わせてゲーム内のBGMが流れるように左右矢印キーでタイミングの調整を行います。
初期化済みのデータでデモを再生している場合は、デモが始まるまでの間にクリア済みのデータが入っているメモリーカードに差し替えます。
タイトルに戻った時にデータの再読み込みが行われるため、デモが流れている間は初期化済みのデータを参照するため問題はありません。
タイマーの譜面はデモが始まる直前まで続きます。その後、デモのアニメーションと消費に合わせて譜面が流れます。
ここで注意なのですが、冒頭のアニメーションが終わる時間が不定で、およそ半分の確率で50F早く終わることがあります。よって、デモの開始が50F早まることがあります。
原因は不明です。フシギダネに祈りましょう。もし早く終わった場合はrshiftキーを押すことで大体の調整を行うことができます。余裕がある場合は、さらにそこから左右矢印キーで微調整を行ってください。
DemoTimerは「リスト表示」タブで練習できるので、適当なシードで使用感を試しておくと良いかもしれません。

ジラーチを受け取る!!!
タイマーが終了すると同時にSTARTボタンでタイトルに戻ります。ここでタイトルの表示順が目標個体の終了時表示順と一致しているかを確認してください。一致していればおそらく成功です。そのままジラーチを受け取ってください。


これらの手順は事前に大量消費を行ったうえで、従来の受け取り調整の段階で行うことを想定しています。ゲーム内で余計な行動をしたり、セーブデータを上書きしてしまうとツール通りの結果が出力されない場合があるので注意してください。

ここからはおま〇けです。
ゼニガメのセットアップ
ゼニガメの消費は、未初期化データではセーブデータ依存で変わるため、独自の調査が必要です。
その調査を補助する機能が「ゼニガメ検索」タブになります。ゼニガメを視聴した後のチャンネルから消費数を絞り込み、内部値の推論を行います。
まず初めに現在シードを入力して、検索します。

指定した回数タイトルを見たあとにデモを流し、指定された再生回数のときにゼニガメが流れます。
検索結果をダブルクリックすることでシードが選択されます。
そしてデモを見た後、ゼニガメの直後に流れる番組を2つ記録します。そしてデモを5回見終わったらタイトルに戻ります。
「商品を検索」をクリックして、記録したチャンネルを上から入力し、計算をクリックします。

いくつか結果が出ることがありますが、その中で商品の数はある程度少ないものが正しい結果です。
ほとんどないと思いますが、もし同じような結果が複数出た場合はスルーするようにします。
途中でチャンネルの再計算が発生した場合はうまく結果が出ないことがあるので注意してください。
うまく結果が出たら、右クリックメニューから「シードを選択する」をクリックします。
計算の途中でゼニガメによるエラーが起きていなかった場合、自動でシード欄に現在のタイトルシードと、直前のチャンネルが入力されます。
その後に、履歴に追加するか聞かれるので、「はい」を選択します。ここで仮想的な内部状態の更新がされます。
これらを繰り返すことで、内部状態の絞り込みを行っていきます。

ここで、内部状態にあたる商品リストを見てみましょう。

ここで、青であらわされているのが確定した商品です。緑であらわされているのは不確定だが視聴済みの商品です。赤であらわされているのが未視聴の商品です。
これらをすべて青にすることでゼニガメを完全に扱えるようになります。すべて埋めなくても、埋めた分だけエラーの数を減らすことができます。
緑のものは、商品の個数が確定した後に「再計算」を行うことで青になることがあります。

内部状態の絞り込みを行っていくと、途中で個数が確定します。まずは、これを目標に進めていきます。
個数が確定した場合は、ツールの「再計算」ボタンを押すことで、一部の不確定の商品を確定させることができます。
すべての商品を埋めるためには、おそらく100回以上ゼニガメを視聴する必要があります。


およそ30回の試行で品目4の個数が確定

とても非人道的なのでおすすめしませんが、どうしても結果が出ない場合などあれば挑戦してみてください...