みなさん、こんにちは。ぽけ太です。
今回はパワポケ9のスペースキャプテン編における惑星の決定メカニズムについてご紹介します。
ワームホール貿易で最大効率を生み出すことができる”ゲフェン-パストール”の初期シード(DSの起動時間)も公開予定なので、興味のある方はぜひ最後までご覧ください。
始めに
今回の内容は、パワポケ9の内部解析の結果を含みます。ゲームの内部解析に抵抗のある方はブラウザバックをお願いします。
また、本記事は内部解析を行うまでアセンブリ言語の知識ゼロだった筆者が、逆アセンブルで読み取った内容を簡易的にまとめたものになります。
有識者からすると内容に矛盾を感じる部分も多くあると思いますが、あくまで素人の調査結果として流していただけば幸いです(明らかな間違いに関してはご指摘いただければ修正します)。
惑星配置の決定メカニズム
パワポケ9裏サクセスの惑星配置は、新規データの作成時に32bitの内部状態を持つ乱数(小さい乱数)によって決定されることが既知でした(参考: ポッチャマ…でも分かるパワポケ9裏サクセス選手育成動画.pwpk9-1)。
これまでは”小さい乱数によって惑星配置が決定される”というところまでは分かっていたものの、”どのように小さい乱数を使用して惑星配置を決めているのか?”というところはわかっていませんでした(公開されていなかっただけかもしれません)。
しかしながら、今回の内部解析によって、
- 惑星配置をシャッフルする回数を決定する
- シャッフルの対象となる2つの惑星を決定する
- ペラヘブンの配置を決定する
- ウインダストの配置をシャッフルする
という4段階で小さい乱数が使用されることが明らかになりました。
以下、この4段階についての詳細を説明していきます。
1. 惑星配置をシャッフルする回数を決定する
スペースキャプテン編の惑星の初期配置は以下の通りです。
この初期配置から小さい乱数により選ばれた2つの惑星の位置を入れ替えることで惑星をシャッフルしていきます。
この時、シャッフルする回数自体も小さい乱数により決められています。スペースキャプテン編の新規データ作成時に小さい乱数が1回消費され、その時の乱数を用いてシャッフルする回数を決定します。
具体的なシャッフル回数は、【50+[50×小さい乱数(0以上1未満として)]】となります([]は床関数を表しています)。すなわち、最低50回、最高99回の間からシャッフル回数が選ばれるわけです。
2. シャッフルの対象となる2つの惑星を決定する
シャッフル回数が決まったら、次はシャッフルの対象となる2つの惑星を決定します。
これはシャッフル回数に到達するまでのアルゴリズムとなっており、以下の様に2つの惑星を決定してその位置を入れ替えていきます。
- 小さい乱数を消費し、その時の乱数を用いて1つ目の惑星を決定する
- 小さい乱数を消費し、その時の乱数を用いて2つ目の惑星を決定する
- 1つ目の惑星と2つ目の惑星の位置を入れ替える
- ①に戻る
実際に決定されるのは惑星の位置であり、小さい乱数を【5+[11×小さい乱数(0以上1未満として)]】に当てはめて得られる位置の惑星を入れ替えます([]は床関数を表しています)。
上記の式から分かるかと思いますが、初期配置で1~4に該当する惑星(ルナリング、ペラヘブン、ワームホールA、ワームホールB)はシャッフルの対象にはなりません。
このフェーズがスペースキャプテン編の惑星配置に多様性を持たせている一番の要因になります。
3. ペラヘブンの配置を決定する
惑星のシャッフルが完了したら、次はペラヘブンの位置を入れ替えます。
手順としてはまず、小さい乱数を消費し得られる乱数を【[4×小さい乱数(0以上1未満として]】に当てはめて0以上4未満の整数値(0、1、2,3)を取得します([]は床関数を表しています)。
そして、得られた整数値を基にペラヘブンの惑星配置が決定されます。具体的には、0ならば2の位置、1ならば5の位置、2ならば7の位置、3ならば13の位置となります。
ペラヘブンの配置がルナリングに隣接する配置(6の位置を除く)になるのは上記の理由です。ペラヘブンの初期配置は2の位置ですが、小さい乱数の値が0.25未満であれば配置換えはおこりません。
4. ウインダストの配置をシャッフルする
ペラヘブンの配置が決定したら、最後はウインダストの配置をシャッフルします。
なぜウインダストだけ?と思うかもしれませんが、この理由はよくわかりません。乱数でランダムに惑星を選んでいるわけではなくウインダスト固定です。心当たりのある方はぜひ教えてください。
ウインダストのシャッフルはペラヘブンと概ね同じです。まずは小さい乱数を消費し、その時の乱数を【[7×小さい乱数(0以上1未満として]】に当てはめて0以上7未満の整数値(0、1、2,3, 4, 5, 6)を取得します([]は床関数を表しています)。
そして、得られた整数値を基にウインダストの惑星配置が決定されます。具体的には、0ならば10の位置、1ならば7の位置、2ならば11の位置、3ならば13の位置、4ならば14の位置、5ならば8の位置、6ならば9の位置、となります。
ウインダストの配置で面白いところは配置可能な位置が他の惑星よりも1つ少ないところです。
ルナリング、ペラヘブンを除く他の惑星と同様に、ルナリングの位置(1)、ワームホールの位置(3, 4)、ペラヘブンが配置し得る位置(2, 5, 7, 13)はもちろんのこと、何故かルナリングの真上の位置(6)にも配置される可能性がゼロです。こちらも心当たりのある方はぜひ教えてください。
以上がパワポケ9裏サクセスの惑星配置決定メカニズムです。今回の解析から、小さい乱数を最低103回、最高201回消費して惑星を決めていることが分かりました。
有益な初期シードの公開
逆アセンブルから得られた計算式をPythonで記述して、ワームホール貿易がゲフェン-パストールとなるような初期シード(DSの起動時間)を求めました。
全部で979個の初期シードが見つかったため本当にゲフェン-パストールになっているかは確認出来ていませんが、DS実機で3、4個試したところ一致していたので公開したいと思います。
正確には”ルナリング-ペラヘブンの距離が4”という条件も付けくわえていますが、どうせ距離5だったらリセットするのでいいですよね。
スプレッドシートのリンクを張り付けておくので興味のある方はご参照ください。
※2023/09/09追記
スプレッドシートにDS実機で可能な全シードの惑星配置を追加しました。初期配置の番号振りに従っているので照らし合わせてご使用ください。
最後に
今回は、パワポケ9裏サクセスの惑星配置決定メカニズムについて解説しました。
アセンブル言語の理解に時間はかかりましたが、惑星配置のメカニズム解明はパワポケ乱数の目標としていたとこともあるので達成できてよかったです。
引き続き内部解析を進めてパワポケ乱数を解明していこうと思います。