WAVE 情報
各 WAVE 情報
それぞれの WAVE の全情報を司る WAVE シードはゲームシードから初期化されます。
def setWaveMgr(self):
    self.rnd.init(self.mGameSeed)
    self.rnd.getU32()  # 乱数を一回消費
    self.mWaveMgr = [
        WaveMgr(0, self.mGameSeed),
        WaveMgr(1, self.rnd.getU32()),
        WaveMgr(2, self.rnd.getU32()),
    ]
WAVE1 のシード初期化ミス
ここで WAVE1 の WAVE シード初期化を誤っているためにインデックスバグが発生しています。
各イベント発生率
| かけだし | はんにんまえ | いちにんまえ | じゅくれん | たつじん | |
|---|---|---|---|---|---|
| イベントなし | 100% | 75% | 75% | 75% | 75% | 
| ラッシュ | - | 8.3% | 6.25% | 4.17% | 4.17% | 
| キンシャケ探し | - | - | - | 4.17% | 4.17% | 
| グリル発進 | - | 8.3% | 6.25% | 4.17% | 4.17% | 
| ハコビヤ襲来 | - | - | - | 4.17% | 4.17% | 
| 霧 | - | 8.3% | 6.25% | 4.17% | 4.17% | 
| ドスコイ大量発生 | - | - | 6.25% | 4.17% | 4.17% | 
各イベント・潮位を計算するアルゴリズムは以下の通り。
def getWaveInfo(self):  # WAVEの情報を計算する
    mEventProb = [18, 1, 1, 1, 1, 1, 1]
    mTideProb = [1, 3, 1]
    self.rnd.init(self.mGameSeed)  # WAVE情報を求めるために初期化
    for wave in range(3):
        sum = 0
        for event in range(7):
            if  wave > 0
                and self.mEvent[wave - 1] != 0
                and self.mEvent[wave - 1] == event:
                continue
            sum += mEventProb[event]
            if (self.rnd.getU32() * sum >> 0x20) < mEventProb[event]:
                self.mEvent[wave] = event
        sum = 0
        for tide in range(3):
            if tide == 0 and 1 <= self.mEvent[wave] and self.mEvent[wave] <= 3:
                continue
            sum += mTideProb[tide]
            if (self.rnd.getU32() * sum >> 0x20) < mTideProb[tide]:
                self.mTide[wave] = 0 if self.mEvent[wave] == 6 else tide
各イベント発生率詳細
たつじん以上の場合のみを記載する。
| 干潮 | 通常 | 満潮 | 合計 | |
|---|---|---|---|---|
| イベントなし | 15% | 45% | 15% | 75% | 
| ラッシュ | - | 3.125% | 1.041% | 4.167% | 
| キンシャケ探し | - | 3.125% | 1.041% | 4.167% | 
| グリル発進 | - | 3.125% | 1.041% | 4.167% | 
| ハコビヤ襲来 | 0.833% | 2.5% | 0.833% | 4.167% | 
| 霧 | 0.833% | 2.5% | 0.833% | 4.167% | 
| ドスコイ大量発生 | 4.167% | - | - | 4.167% | 
ドスコイ大量発生は干潮でしか発生しないため、干潮の夜イベントが発生した段階で 71.43%の確率でドスコイ大量発生となる。
潮位
| 潮位 | 干潮 | 通常 | 満潮 | 
|---|---|---|---|
| 確率 | 20% | 60% | 20% | 
どのキケン度においても潮位は通常が 60%、干潮と満潮がそれぞれ 20%となる。
キケン度で変化するパラメータ
湧き方向回数
| 湧き方向変化回数 | 400 | 500 | 1000 | 
|---|---|---|---|
| 称号 | たつじん 0 | たつじん 100 | たつじん 600 | 
| シャケ | 10 回 | 8 回 | 10 回 | 
| オオモノシャケ | 8 回 | 6 回 | 8 回 | 
| 変化タイミング | 10 秒 | 12 秒 | 10 秒 | 
たつじん以上では湧き方向変化回数は 8 回か 10 回のどちらかです。四人の評価レート合計がピッタリ 1600 のときか 4000 以上のときに 10 回になります。
変化のタイミングはおよそ 10 秒と 12 秒になります。
シャケの湧き方向タイミングがオオモノよりも二回多いのは最後のオオモノが湧いてから、ザコシャケの湧き方向だけが変化するタイミングが二回あるためです。
ラッシュ
| ラッシュ | 400 | 500 | 1000 | 
|---|---|---|---|
| 称号 | たつじん 0 | たつじん 100 | たつじん 600 | 
| キンシャケ出現サイクル | 20 | 20 | 20 | 
| ザコシャケスピード倍率 | 2.8 | 3 | 3.5 | 
ラッシュのターゲットが変わるのは、湧き方向が変わるタイミングと全く同じです。
キンシャケ探し
| キンシャケ探し | 400 | 500 | 1000 | 
|---|---|---|---|
| 称号 | たつじん 0 | たつじん 100 | たつじん 600 | 
| シャケ同時存在数 | 32 | 32 | 32 | 
| ザコシャケ同時存在数 | 20 | 24 | 48 | 
キンシャケ探しはキケン度でザコシャケの同時出現数だけが変化します。
つまり、たつじん以上であればキケン度が低ければ低いほどザコシャケ・タマヒロイが出現しないため納品数が増えることになります。
グリル発進
| グリル発進 | 400 | 500 | 1000 | 
|---|---|---|---|
| 称号 | たつじん 0 | たつじん 100 | たつじん 600 | 
| 二体目出現秒数 | 40 | 30 | 10 | 
| インターバル時間 | 3 | 3 | 3 | 
| スピード倍率 | 1.9 | 2.1 | 2.3 | 
キケン度が上がるとグリルの移動速度と、二体目出現までの間隔が短くなります。グリルをたおしてから再出現するまでの秒数はどのキケン度でも 3 秒です。
ハコビヤ襲来
| ハコビヤ襲来 | 400 | 500 | 1000 | 
|---|---|---|---|
| 称号 | たつじん 0 | たつじん 100 | たつじん 600 | 
| 射出間隔 | 50F | 50F | 50F | 
| 降下速度 | 1.2 | 1.5 | 2.0 | 
| 出現回数 | 2 | 3 | 3 | 
| 母艦のライフ | 2200 | 2500 | 3500 | 
ハコビヤ襲来イベントでは、ハコビヤの降下速度とクーラーボックスからの出現回数と母艦のライフだけが変化します。
なので、キケン度が低いからシャケコプターの数が少ないということはありません。どのキケン度でも 50F に一回シャケコプターが射出されるので 100 秒(6000F)で 120 体のシャケコプターが出現する計算になります。
霧
| 霧 | 400 | 500 | 1000 | 
|---|---|---|---|
| 称号 | たつじん 0 | たつじん 100 | たつじん 600 | 
| キンシャケ出現間隔 | 5 | 5 | 5 | 
霧はキケン度によって変化するパラメータはありません。
5n 体目のオオモノシャケがキンシャケに変化するため、5, 10, 15, 20 体目がキンシャケになります。
よってノルマが 21 以上であれば四体出現しますが、それ以下だと三体しか出現しないことになります。
キンシャケのドロップ数
キンシャケがドロップする金イクラの数は以下のアルゴリズムで計算されます。
__int64 __fastcall sub_4A7BD0(__int64 this, __int64 a2)
{
  *(this + 2640) = sead::Random::getU32((this + 0x724)) / 0x55555556;
  return sub_4643F4(this, a2);
}
| キンシャケドロップ数 | 1 | 5 | 10 | 
|---|---|---|---|
| 場合の数 | 1431655767 通り | 1431655767 通り | 1431655762 通り | 
| 確率 | 0.33333333372% | 0.33333333372% | 0.33333333255% | 
PRNG に偏りがないのであれば 10 個ドロップする確率は約 33.33%となります。また、キンシャケドロップ数はキンシャケをたおすタイミングを変えることで変化させることができます。
四体全てのキンシャケが 10 個ドロップする確率は約 1.23%となります。
ドスコイ大量発生
ドスコイ大量発生はキケン度によって変化するパラメータはありません。
シャケの湧き方向
全てのステージにおいて 1, 2, 3 の三つの湧き方向が存在しています。
偏り
湧き方向 1 は 100%二連続しないことが解析からわかっています。
ちなみに、湧き方向変化計算アルゴリズムの Swift コードは以下の通り。
湧き方向アルゴリズムについて
ようやく重い腰を上げて完全解析に挑みました。
private func getEnemyAppearId(random: UInt32, lastAppearId: UInt8) -> UInt8 {
    let w6 = lastAppearId == 1 ? 2 : 3
    let x8 = UInt8((UInt64(random) &* UInt64(w6)) >> 0x20)
    switch lastAppearId {
        case 0, 3:
        	return x8 + 1
        case 1:
        	return x8 + 2
        case 2:
        switch x8 {
            case 0:
            	return 1
            case 1:
            	return 3
            case 2:
            	return 2
            default:
            	return 0
        }
        default:
        	return 0
    }
}
湧き方向確率
| 湧き方向 | 1 | 2 | 3 | 
|---|---|---|---|
| 初手 | 2/9(0.2222) | 7/18(0.3888) | 7/18(0.3888) | 
| 全体 | 1/4(0.25) | 3/8(0.375) | 3/8(0.375) | 
各ステージの湧き方向
全て覚える必要はありませんが、どの方向は二連続しないかは覚えておくと良いでしょう。
| 湧き方向 | 色 | 
|---|---|
| 1 湧き | 緑 | 
| 2 湧き | 赤 | 
| 3 湧き | 青 |