ここから本文です

この知恵ノートを「知恵コレクション」に追加しました。

追加した知恵ノートはMy知恵袋の「知恵コレクション」ページで確認できます。

知恵コレクション」に登録済みです。

再登録しました。

追加に失敗しました。

ノートに戻り、もう一度やり直してください。

すでに1,000件のノートが登録されています。

新しく追加したい場合は、My知恵袋の「知恵コレクション」ページで登録されているノートを削除してください。

追加できませんでした。

ノートは削除されました。

ポケモンBW・BW2のオフセット計算法とブラックシティ住人決定の仕組み

ライターさん(最終更新日時:2013/8/13)投稿日:

  • ナイス!:

    0

  • 閲覧数:15720

印刷用のページを表示する

BW・BW2のオフセット計算法とブラックシティの住人決定法について説明します。

前回の投稿で初心者用の解説記事書くとか言ってた気がしますが、前回以上にマニア向け記事となります。

といっても、多少の調査を加えた上でツールのソースコードやsmogonの内容を解説しているだけです。

乱数調整に関する基礎的な知識を前提にしています。

 

 

この記事での「乱数」は線形合同法で求められる性格値乱数のことを指します。

個体値乱数は今回は関係ありません。

 

まず最初に結果をまとめると次のような処理となります。

 

<BW>

始めから(セーブデータ有り)

SHA1→Rand×1→Probabililty Table(以下PT)×2→チラーミィ用PID→Rand×1(チラーミィ用IDで0/0固定?)→TID/SID→PT×4→表住人×10→裏住人×3

 

始めから(セーブデータ無し)

SHA1→Rand×1→PT×3→チラーミィ用PID→Rand×1→TID/SID→Rand×1→PT×4→表住人×10→裏住人×3

 

 

続きから始める

SHA1→Rand×1→PT×5

 

 

<BW2>

始めから(思い出リンク済みセーブデータ有り)

SHA1→Rand×1→PT×1→Rand×2→PT×1→Rand×2→チラチーノ用PID→Rand×1(チラチーノ用IDで0/0固定?)→TID/SID

 

始めから(思い出リンク無しセーブデータ有り)

SHA1→Rand×1→PT×1→Rand×3→PT×1→Rand×2→チラチーノ用PID→Rand×1→TID/SID

 

始めから(セーブデータ無し)

SHA1→Rand×1→PT×1→Rand×2PT×1Rand×4→PT×1→Rand×2→チラチーノ用PID→Rand×1→TID/SID

 

 

続きから始める(思い出リンク済み)

SHA1→Rand×1→PT×1→Rand×2→PT×4Extra

 

続きから始める(思い出リンク無し)

SHA1→Rand×1→PT×1→Rand×3→PT×4Extra

 

 

以下、これらについて順番に説明していきます。

 

 

①SHA1→Rand×1

錆びたコイルさんの解説ページにある通り、初期seedは起動時刻や各種パラメーターを含む52byteのメッセージデータをSHA-1ハッシュ化という方法で64bitの数に変換します。

この値をS0として、

S[n+1] = S[n] * 0x5D588B656C078965 + 0x269EC3 mod 0x10000000000000000

でseed列を得て、この上位32bitを乱数(Rand)として計算に用います。

bwseedlistやSSS4では、ハッシュ化後に乱数を一つ進めたS1を初期seedとして出力しています。

Rand×nはn回乱数が消費されていることを意味します。

 

 

②Probability Table

次の操作をPTと名付けます。

 

「(R*101)>>32を左から順番に以下の確率テーブルに通し、テーブルの数値以下の場合は次の行に移動します。

テーブルの数値の100までたどり着いた場合は、乱数を消費せずに次の行に移動、もしくはL6まで辿り着いていたら操作を終了します。

 

L1  {  50,100,100,100,100 },
L2  {  50, 50,100,100,100 },
L3  {  30, 50,100,100,100 },
L4  {  25, 30, 50,100,100 },
L5  {  20, 25, 33, 50,100 },
L6  { 100,100,100,100,100 }」

 

PT×nはPT操作をn回行うことを意味します。

これだけだと分かりにくいのでbwseedlistでの初期seed 672C1C3C3D71E125を例として説明します。(R*101)>>32はRNG ReporterのResearch機能を使えば出力できます。

 

Frame Rand R*101>>32  
1 67FA0457 41 L1の50以下→L2へ
2 D6A4EF21 84 L2の50より大きい
3 E3B3421B 89 L2の50より大きい
4 A0C3E2A9 63 L2の100以下→L3の30より大きい
5 50DE87BE 31 L3の50以下→L4へ
6 7BE03615 48 L4の25より大きい
7 D4E8FAEC 83 L4の30より大きい
8 8E51F332 56 L4の50より大きい
9 D15DA049 82 L4の100以下→L5の20より大きい
10 530E4EE6 32 L5の25より大きい
11 27BE3D13 15 L5の33以下→L6へ
12 C6F25ADA 78 L6の100以下→乱数消費しない

 

12番目の乱数は消費されていないので、もう1回PTを行う時や乱数消費をする場合は12番目から始まることとなります。

 

 

③チラーミィ・チラチーノ用PIDとID

  BGrU6FICcAM1OjE.png 

チラーミィ・チラチーノの性格値(PID)を決定しています。

Randの値そのままもしくはxor 0x00010000した値を性格値としています。

チラーミィ用の表ID・裏IDは次の乱数を用いて決定されているようですが、恐らく

(R*0)>>32

という計算により表ID・裏ID共に0となると考えられます。

性格値にID補正はかからないので、xorの有無に関わらず

性格値用乱数の(上位2byte)xor(下位2byte)≦7

を満たせばチラーミィ・チラチーノが色違いとなります。

BWセーブデータ有りで始めからを選択した場合、上の初期seed 672C1C3C3D71E125の続きを例として挙げると、

 

12 C6F26ADA 78 L1の50より大きい
13 7ADACCCD 48 L1の100以下→L2の50以下→L3へ
14 9B50506D 61 L3の30より大きい
15 1BCF0807 10 L3の50以下→L4へ
16 0DA9435A 5 L4の25以下→L5へ
17 0EA5AB18 5 L5の20以下→L6へ
18 72AC72A8 45 L6の100以下→色条件満たす
19 C18140A0 76 チラーミィのID用?

 

となり、アララギ博士が色違いチラーミィを自慢してきます。

 

s572.png

 <追々記>

2013/4/7のろいしんさんの記事より、上記でのチラーミィ・チラチーノのID用に乱数が消費されたという推測は誤りで、アララギ博士の口の動く回数と関係している可能性が高そうです。

これなら、トレーナーの名前決定で「いいえ」を押すと乱数が1進むことも説明がつきます。

 

④TID/SID

(R*FFFFFFFF)>>32の下2byteがTID(表ID)、上2byteがSID(裏ID)となります。

上の例だと20番目の乱数値がEC8CA73Cとなるので、TID42811、SID60556となります。

 

 

⑤表住人・裏住人

表住人・裏住人は同じ方法で決定されます。

先に表住人を10人分決定して、次に裏住人3人分を決定します。

各住人には番号と出やすさが設定されており、ブラックでは以下のようになります。ホワイトでは分かりませんが、基本的な仕組みは同じだと思います。

 

番号 住人 出やすさ
0 シュウサク 20
1 ヒロコ 20
2 タクロウ 20
3 サトコ 20
4 マサオ 20
5 ミキ 20
6 タクマ 20
7 カレン 10
8 トモタカ 20
9 ジュンイチ 10
10 カズホ 20
11 レナ 6
12 カルロス 20
13 ヒロミ 4
14 ツネカズ 1
15 シオリ 20
16 ヒトシ 20
17 ガクト 20
18 ユミコ 20
19 ミホ 20
20 トシノブ 20
21 ソウスケ 10
22 エリザ 20
23 ヒロノリ 20
24 ケン 10
25 サトル 20
26 ローザ 6
27 ヒロアキ 4
28 エミ 20
29 グレース 1

 

住人は

(R*(まだ選ばれていない住人の出やすさの総和α))>>32・・・式A

で得られた数を元にして、次のように決まります。

 

まず、一人目の場合αは462です。

住人を番号順に上から見ていって、式Aの結果が

 

0~19ならシュウサク

20~39ならヒロコ

  ・

  ・

  ・

120~139ならタクマ

140~149ならカレン

150~169ならトモタカ

  ・

  ・

  ・

226~229ならヒロミ

230ならツネカズ

  ・

  ・

  ・

461ならグレース

 

となります。仮に1人目の式Aの結果が149だとします。

この場合1人目の表住人はカレンとなり、αは452となります。

2人目の決定はα=452として、式Aの結果が上の表からカレンを抜いて詰めたものに対応した住人となります。つまり

 

0~19ならシュウサク

20~39ならヒロコ

  ・

  ・

  ・

120~139ならタクマ

140~159ならトモタカ

  ・

  ・

  ・

216~219ならヒロミ

220ならツネカズ

  ・

  ・

  ・

451ならグレース

 

となります。

これを13人分繰り返して住人を決定します。

 

 

⑥Extra

BW2を続きから始めた場合のみにあります。

乱数を3つ生成し、(R*15)>>32の値が3つとも異なれば生成終了、2つ以上同じなら再び乱数を3つ生成し、(R*15)>>32を計算します。これを3つとも異なる値になるまで繰り返します。

 

 

⑦各種ツールの仕様について

現在オフセットを計算できるツールは私の知る限り、offsetKeisan、RNG Reporter、バトルサブウェイ乱数補助ツールの3つがありますが、それぞれ仕様が微妙に異なっています。

 

offsetKeisanではSHA1直後の値、つまり①で言うところのS0を入力する必要があります。BlackCityTrainerKetteiではID決定の一つ前のseedを入力する必要があります。

RNG ReporteではS1の値を入力します。

この二つのツールはS1を1番目としてオフセットの結果を出力します。

それに対してバトルサブウェイ乱数補助ツールでは、S1の値を入力し、S2を1番目としてオフセットの結果を出力します。

 

bwseedlistでのレポ針リストとの整合性を考えると、バトルサブウェイ乱数補助ツールが一番分かり易いと思います。 

offsetKeisanの利点は始めからを選択した時のオフセットも計算できる点です。

bwseedlistで求めたS1からS0を逆算するには

S[n-1] = S[n]  * 0xDEDCEDAE9638806D + 0x9B1AE6E9A384E6F9 mod 0x10000000000000000

を計算すればいいです。

RNG ReporterはBWの徘徊有り、BW2の思い出リンク込みのオフセット計算に対応しています。

徘徊有りは計算結果に1を足しているだけな気がしますが、詳細は分かりません。

 

<追記>

プラスルツールの製作者様が、BW2にも対応したオフセット計算機能を追加してくださりました。ありがとうございます。

実機でのオフセットと異なる結果が出た場合は報告していただけると幸いです。

 

<追々記>

おだんさんがブログで孵化の際のNPC消費にも対応したツールを公開してくださりました。ありがとうございます。

最新版は2013/8/2の記事からダウンロードできます。

また、普通のオフセット計算のツールも2013/4/7の記事からダウンロードできます。

 

もしツール製作者様に質問される場合は、基礎的な事を十分理解した上でお願いします。

 

⑧その他注意事項

最初に書くべきだったかもしれませんが、ここで述べた「オフセット」とは、

続きから始めた場合は「NPCによる性格値乱数消費が無い場所で始め、徘徊や大量発生決定などによる乱数消費が無い場合のゲーム開始時の乱数位置」、

始めからを選択した場合は「主人公のTID/SID決定の一つ手前」のことを指し、初期seedによって固有の値となります。

他サイトで解説されている孵化乱数や配達員乱数などのオフセットと混同しないようにお願いします。

 

NPC以外のゲーム開始時の乱数消費について簡単に補足しますが、あまり検証していません。

徘徊は上で述べた通りです。

大量発生は、その日初めてプレイした時に1もしくはその計算結果が前回の大量発生位置と同じ場合は異なる場所になるまで2以上消費されていると思われます。

BW2のジョインアベニューではレベル1だと乱数消費するNPCはいませんが、ここでセーブして日付が変わった後に起動すると新しく来たファン(恐らくジムリーダーは除く)の数だけセリフ決定用に乱数が消費されています。

offsetKeisanではブラックシティの処理が関係しているとありますが、詳細は不明です。

他にもオフセットに関係する要素があるかもしれません。

 

 

 

かなり分かりにくいと思いますが以上で説明を終わります。

私自身が理数系の知識が高校で止まっているためSHA1の計算などを殆ど理解しておらず検証ができないので、SHA1→Randのくだりなど間違っているところがあれば指摘していただけると幸いです。

これらの情報は以下のツール及びサイトを参考にさせていただきました。

ここにお礼申し上げます。

 

<参考>

offsetKeisan及びソースコード

BlackCityTrainerKettei及びソースコード

ただの雑記byさき:バトルサブウェイ乱数補助ツール

さびたコイルのページ:BW乱数解説、2012年1月13日のツイッター

乱数調整スレ6:468

smogno RNG Research:#770,908,946 RNG Reporter

<画像提供>

ろいしんさん

このノートに関するQ&A

このノートに関するQ&Aは、まだありません。

このノートについて質問する

このノートについてライターの方に質問できます。

※ライターの方から必ず回答をいただけるとは限りません

※別ウィンドウで開きます

この知恵ノートのライター

アップロード写真

グレード知恵ノートのグレード:1-3

dorara32さん

ピックアップ

【iPhone】修理交換の申込方法...
 ※追記※2015/1/30現在iPhone6及び6+が発売されたのを受け、情...
お尻や足の贅肉にさよなら、「...
本にできない「正しい」下半身ダイエットなぜ「本にできない...
知っておきたい無線LANルーター...
知っておきたい無線LANルーターの知識と選び方iPod touchやPS...
本文はここまでです このページの先頭へ