WAVE 情報
ゲームシードを受け取っても、 それだけでWAVEの内容がすべて決まるわけではありません。 ゲームで実際に採用された乱数状態に加え、 ステージや難易度、プレイ中の状況が計算に関わります。
ここでは11.3.0の実行ファイル、ステージデータ、 保存したプライベートバイトの通信から分かったことを説明します。 必要なステージとJobTypeのIDは別表にまとめました。
ゲームシード
ゲームシードは32ビットの値4個で構成される128ビットの入力です。 4個の値が各WAVEに一つずつ対応するわけではありません。
ホストから参加側へ送られたWAVE開始前の設定には、 ゲームシード、ステージ、JobType、難易度が含まれていました。 一方、抽選で実際に使う乱数状態を、ここでは 実効シーンシードと呼びます。
通信で届いたゲームシードを実効シーンシードとして採用する処理は 実行ファイルで確認しました。ただし、保存したプレイで その処理が使われたかは確かめられていません。 そのため、通信のゲームシードだけを使った計算は、 まだ実プレイの確定予測とは言えません。
イベントと潮位
通常のWAVEではまずイベントを抽選し、 選ばれたイベントに応じた候補から潮位を抽選します。 候補の重みや使用条件は難易度とステージの設定で変わり、 Rustでもこの順序と抽選処理を再現しています。
抽選後に人数などの条件で値を書き換える経路もあります。 そのため、抽選で作った生成値と、 実際のWAVEへ渡す適用値を分けて扱います。 たとえば確認したプライベートバイトの経路では、 参加者が1人以下のとき、適用するイベントは0になります。
次はtools/salmon-wave-lookahead/src/wave.rsの関数を使う部分例です。 イベントと潮位の抽選順序だけを示し、 候補作成と適用時の変更は含みません。
rust
use salmon_wave_lookahead::wave::{
draw_event, draw_tide, Candidate, WaveRng,
};
fn draw_wave(
rng: &mut WaveRng,
events: &[Candidate; 9],
tides_for_event: impl FnOnce(u8) -> [Candidate; 3],
) -> (u8, u8) {
let event = draw_event(rng, events);
let tide = draw_tide(rng, &tides_for_event(event));
(event, tide)
}ブキとスペシャル
プライベートバイトではスペシャルを内部プレイヤー番号へ割り当て、 その後に支給ブキの表を作る処理があります。 どちらも実効シーンシードと候補の設定が分かれば計算できます。
ただし、内部番号と実際の参加者の対応や、 候補となるブキ・スペシャルの最終状態は未確認です。 保存パケットだけから仲間への実際の支給内容は確定できません。
オオモノの出現
通常・霧・ドスコイ大量発生では オオモノの名目上の出現時刻と件数を計算できます。 実際の出現には、その時点の敵の数や、 使える出現地点などの条件が加わります。
通常の出現地点の候補はステージ、潮位、 湧く方向によって変わります。 条件が揃った項目は方向と地点を順に追跡できますが、 ゲームシードだけで全出現地点を確定できる段階ではありません。 ハコビヤの地点選択にはゲーム中の時刻と地点の使用状況も関わります。
出現直後にオオモノを倒す理想的なWAVEを仮定しても、 同じ時刻の生成要求は順に処理されます。 直前の処理結果が次の要求に影響する場合は、 撃破を先に反映して計算することはできません。
パケットとの対応
保存通信から、敵の種類と生成要求位置を読み取れました。 一部のオオモノの座標は ステージデータにある出現地点の候補と整合しました。
生成要求位置は、敵が出現するときに指定された座標です。 移動中の現在位置を示す値ではありません。 また、座標が候補地点と一致したことは、 ゲームシードから出現地点を事前に予測できた証明ではありません。
通信で読める敵・アイテム・仲間の情報は プレイ中の通信で説明します。
先読みできる範囲
| 内容 | 現在分かっていること |
|---|---|
| イベント・潮位 | 実効シーンシードと設定が分かれば生成値を計算できます。適用値には人数などの条件が加わります。 |
| ブキ・スペシャル | 候補と内部番号の対応を与えれば計算できます。実際の支給結果との照合は未完了です。 |
| オオモノの予定 | 一部のイベントで名目上の時刻と件数を計算できます。 |
| 湧く方向・地点 | 実行時の候補と敵の状態が分かる項目から追跡できます。 |
| 現在位置・金イクラ | この予測器からは得られません。通信とゲーム中の更新を別に追う必要があります。 |
対象は11.3.0です。 別のバージョンや、まだ追えていないゲーム中の処理まで 同じ結果になるとは確認していません。