ATO's blog

メモとか日記とか

ボムラッシュ大好きなイカのためのスペシャル増加量アップとスペシャル減少量ダウンの効率的な積み方

f:id:ato1234:20160328223555p:plain
(追記)計算してくれるツールを作りました。
理屈はどうでもいいよって人はこちらをどうぞ。
atolog.hatenablog.com

はじめに

スペシャル増加量アップとスペシャル減少量ダウンのギアをガン積みする前提で、どの割合で積むのが一番効率がいいかを調べてみました。
ボムラッシュ限定ではなく、スペシャルが重要な武器でも役立つかもしれません。

誰が相手でも絶対に死なない自信のある強者はスペシャル減少量ダウンは要らないのでスペシャル増加量アップを積んでください。
誰が相手でも確実にインクの海に沈む自信のあるイカは頑張って生きてください。

スペシャル増加量アップ

f:id:ato1234:20160328221332p:plain

スペシャルゲージの増加量がアップします。

計算式

x = [メイン] * 10 + [サブ] * 3

として

X = ((0.99 * x) - (0.09 * x)^2) / 100
[必要ポイント] = [デフォルト必要ポイント] / (1 + X)

ギアパワー検証 - スプラトゥーン(Splatoon) for 2ch Wiki*より引用。

スペシャル減少量ダウン

f:id:ato1234:20160328222921p:plain

プレイヤーがやられた時の
スペシャルゲージの減少量が
少なくなります。

計算式は

x = [メイン] * 10 + [サブ] * 3
[減少率] = 0.5 - ((0.99 * x) - (0.09 * x)^2) / 60

と推測される。
メイン3サブ9の場合この減少率はマイナスになるが、0として計算される。
ゲージMAX時に死亡した際に再チャージに必要な塗りポイントは

[デフォルト必要ポイント] * [減少率]

ギアパワー検証 - スプラトゥーン(Splatoon) for 2ch Wiki*より引用。

調べ方

上記を元に、ある程度スペシャルが溜まった状態で死亡した後、次にスペシャルが使用可能になるまでに必要な塗りポイントが少ないギア構成を探します。

この時、必要な塗りポイントは
P = スぺ増を加味したスペシャル発動までに必要なポイント
D = スぺ減を加味したスペシャル減少率
N = 死亡直前に溜まっていたスペシャルゲージの割合
X = 死亡後、スペシャルが使用可能になるまでに必要なポイント
とおくと、
X=P-P*N*(1-D)
で計算できるので、前述の式と合わせてNを0から1まで0.01刻みで変化させたときに必要な塗りポイントの平均が最も小さいものを、効率のいいギア構成であるとして求めることにします。

プログラム

rubyで適当にイカのようなプログラムを書きます。

# デフォルトのスペシャルゲージ最大値
DEF_MAX_SP_GAUGE = 180 #ボムラッシュ

# スペシャルゲージ最大値を計算
def calc_sp_gauge(dsg, scu)
  dsg / (1 + ((0.99 * scu) - (0.09 * scu) ** 2) / 100)
end

# スペシャルゲージ減少量を計算
def calc_save_rate(sps)
  [0, 0.5 - ((0.99 * sps) - (0.09 * sps) ** 2) / 60].max
end

# 死亡した後スペシャル再使用までに必要なポイントを計算
def calc_point(dsg, scu, sps, n)
  csg = calc_sp_gauge dsg, scu
  csr = calc_save_rate sps
  csg - csg * n * (1 - csr)
end

# 死亡した後スペシャル再使用までに必要なポイントの平均を計算
def calc_average_point(dsg, scu, sps)
  arr = []
  (0..100).each do |i|
    arr << calc_point(dsg, scu, sps, i*0.01)
  end
  ave = arr.inject(:+) / arr.size
  dev = Math.sqrt arr.map{|a|(a-ave)**2}.inject(:+)/arr.size
  [ave, dev]
end

# 指定した数のギアをスぺ増、スぺ減に使用した際に一番効率がいい組み合わせを返す(57表記)
def get_best_combination(gear_num)
  resscu = 0
  ressps = 0
  resave = 999
  resdev = 999
  (0..gear_num).each do |scu|
    sps = gear_num - scu
    spave, spdev = calc_average_point DEF_MAX_SP_GAUGE, scu, sps
    
    if spave < resave
      resscu = scu
      ressps = sps
      resave = spave
      resdev = spdev
    end
    #puts "#{scu},#{sps},#{spave},#{spdev}"
  end
  [resscu, ressps, resave, resdev]
end

x = get_best_combination ARGV[0].to_i
puts "スぺ増:#{x[0]}, スぺ減:#{x[1]}, 平均必要ポイント:#{x[2]}, 標準偏差:#{x[3]}"

結果

スぺ増:19, スぺ減:38, 平均必要ポイント:82.93899430387997, 標準偏差:42.20804533423444

スペ増、スぺ減のみで固める前提ですが、最も効率がいいギア構成が計算できました。
ちなみに構成を変えて計算した結果を全てグラフに出力するとこんな感じになります。*1
スぺ増を増やすと必要ポイントの平均値は増えますが、バラつきは少なくなるようです。
f:id:ato1234:20160329014607p:plain

もう少し実用的な構成の場合

流石に全てのギアをスペシャル関連に割り振るのは実用性的な意味でもウニ的な意味でも厳しいので、他にも使うギアの数を変えて何パターンか計算した結果を載せておきます。
参考にしてください。*2

ギアの数 構成
9 スぺ増:0, スぺ減:9, 平均必要ポイント:122.6
19 スぺ増:2, スぺ減:17, 平均必要ポイント:111.1
29 スぺ増:6, スぺ減:23, 平均必要ポイント:101.5
38 スぺ増:9, スぺ減:29, 平均必要ポイント:94.4

最後に

以上、計算とか考察とかはかなり適当なので「ここおかしいよ!」というところがあったら教えてください。

*1:横軸はスペシャル増加量アップの数。スペシャル減少量ダウンの数は57-スぺ増

*2:ギアの数は全て57表記です。結果が実現不可能な数値(2とか)の場合はその近辺という事でお願いします。