-- スプラトゥーン攻撃力計算機 v1.1 -- twitter @acple -- 自身の攻撃ギア数と相手の防御ギア数を与えると実際のダメージ値を計算します。 -- 実ダメージは攻撃ギア値と防御ギア値から算出した実際に相手に与えるダメージ値を表します。 -- ブキ毎のリミッター値設定も反映しています。 -- 確定数変化防御値は指定した攻撃ギア値に対して確定数が変化する防御ギア値を表します。 -- ギアパワー値は メインギア数 * 10 + サブギア数 * 3 で算出されるものです。 -- Nothingは確定数を減らせる防御値が存在しないことを表します。 -- この計算式では、極小の誤差が発生します。 -- おそらく、計算途中の丸め処理や、浮動小数の処理系の違いによるものと思われます。 -- 単精度での演算や計算途中での切り捨て処理など、いくつかの計算パターンを試しましたが、 -- 現時点で全ての誤差を埋めるパターンは見つかりませんでした。 -- もし視認できる範囲で誤差を全て消すことが出来たとしても、 -- 目に見えない誤差が存在する可能性は残ります。 -- この計算式に適用している係数や、計算手法自体は正しいものであると思われます。 -- 確認可能な全てのブキとギアパワーの組み合わせで誤差がほぼ発生しないことは確認していますが、 -- あくまで参考程度としてよろしくお願いします。 -- もしその他計算違いや誤差の処理方法などを見つけた場合、報告いただけると助かります。 module Main ( main ) where import Data.List (intercalate) -- ↓イカの4つを好きな値に変更してね↓ -- -- 自分のメイン攻撃ギア数 mainAttackGear = 1 -- 自分のサブ攻撃ギア数 subAttackGear = 2 -- 相手のメイン防御ギア数 mainDefendGear = 1 -- 相手のサブ防御ギア数 subDefendGear = 0 -- ↑-------書き換えここまで--------↑ -- -- イカは出力用コード mainAttackGear :: Int subAttackGear :: Int mainDefendGear :: Int subDefendGear :: Int Double -- 基本攻撃力 ++ " ブキ: " ++ name ++ " }" where atk = gearPower mainAttackGear subAttackGear def = gearPower mainDefendGear subDefendGear weapons :: [Weapon] weapons = [ Weapon "わかばシューター" 28.0 , Weapon "スプラシューター" 36.0 , Weapon "プライムシューター" 42.0 , Weapon "プロモデラー" 24.5 , Weapon "N-ZAP85" 28.0 , Weapon ".52ガロン" 52.0 , Weapon ".96ガロン" 62.0 , Weapon "ジェットスイーパー" 31.0 , Weapon "デュアルスイーパー" 28.0 , Weapon "シャープマーカー" 26.0 , Weapon "ボールドマーカー" 38.0 , Weapon "L3リールガン" 29.0 , Weapon "ホットブラスター" 125.0 , Weapon "ブラスター爆風外周" 50.0 , Weapon "ラピッドブラスター" 80.0 , Weapon "ラピッド爆風外周" 25.0 , Weapon "スプラチャージャー" 160.0 , Weapon "スクイックリン" 140.0 , Weapon "リッター3K" 180.0 , Weapon "ノーチャージャー" 40.0 , Weapon "バケットスロッシャー" 70.0 , Weapon "スロッシャー根元" 40.0 , Weapon "バレルスピナー" 28.0 , Weapon "ボム" 180.0 , Weapon "ボム爆風外周" 30.0 , Weapon "クイックボム直撃" 25.0 , Weapon "クイック爆風(近)" 35.0 , Weapon "クイック爆風(遠)" 20.0 , Weapon "チェイス爆風(近)" 80.0 , Weapon "チェイス爆風(遠)" 20.0 , Weapon "スプラッシュシールド" 50.0 , Weapon "スプリンクラー" 30.0 , Weapon "スーパーショット" 150.0 , Weapon "ダイオウイカ" 160.0 ] main = do hSetEncoding stdout utf8 print weapons -- イカは計算式 -- ギアパワー値を返す gearPower mainGear subGear = mainGear * 10 + subGear * 3 -- 実ダメージを返す calculateDamage dmg atk def = limiting (limitDamage dmg) (dmg * rate atk def) where limiting Nothing result = result -- ダメージの変動率を返す rate atk def = 1.0 + correct (calculatePower atk - calculatePower def) where correct x | x < 0 = x / 1.8 -- ギアパワーの補正率を返す -- 攻撃力のリミット値を返す limitDamage x | 100.0 <= x = Nothing -- 攻撃の確定数を返す -- 攻撃の確定数を減らせる防御値を返す happyDefendPower dmg atk | 58 <= count = Nothing -- 各防御値に対する実ダメージのリストを返す -- 小数点第n位までで切り捨てを行った値を返す floorN = roundWith floor -- 小数点第n位までで切り上げを行った値を返す ceilingN = roundWith ceiling -- 小数点第n位までで偶数丸めを行った値を返す roundN = roundWith round -- 指定した丸め関数を使用し小数点第n位までで丸めを行った値を返す where x = 10 ^ n
Standard input is empty
自攻撃ギアパワー: 16, 敵防御ギアパワー: 10 { ブキ: わかばシューター, 基本攻撃力: 28.0, 実ダメージ: 29.309392, 確定数変化防御値: Nothing } { ブキ: スプラシューター, 基本攻撃力: 36.0, 実ダメージ: 37.683504, 確定数変化防御値: Just 42 } { ブキ: プライムシューター, 基本攻撃力: 42.0, 実ダメージ: 43.964088, 確定数変化防御値: Nothing } { ブキ: プロモデラー, 基本攻撃力: 24.5, 実ダメージ: 24.9, 確定数変化防御値: Nothing } { ブキ: N-ZAP85, 基本攻撃力: 28.0, 実ダメージ: 29.309392, 確定数変化防御値: Nothing } { ブキ: .52ガロン, 基本攻撃力: 52.0, 実ダメージ: 54.431728, 確定数変化防御値: Just 27 } { ブキ: .96ガロン, 基本攻撃力: 62.0, 実ダメージ: 64.899368, 確定数変化防御値: Nothing } { ブキ: ジェットスイーパー, 基本攻撃力: 31.0, 実ダメージ: 32.449684, 確定数変化防御値: Nothing } { ブキ: デュアルスイーパー, 基本攻撃力: 28.0, 実ダメージ: 29.309392, 確定数変化防御値: Nothing } { ブキ: シャープマーカー, 基本攻撃力: 26.0, 実ダメージ: 27.215864, 確定数変化防御値: Just 27 } { ブキ: ボールドマーカー, 基本攻撃力: 38.0, 実ダメージ: 39.777032, 確定数変化防御値: Nothing } { ブキ: L3リールガン, 基本攻撃力: 29.0, 実ダメージ: 30.356156, 確定数変化防御値: Nothing } { ブキ: ホットブラスター, 基本攻撃力: 125.0, 実ダメージ: 130.8455, 確定数変化防御値: Nothing } { ブキ: ブラスター爆風外周, 基本攻撃力: 50.0, 実ダメージ: 52.3382, 確定数変化防御値: Just 17 } { ブキ: ラピッドブラスター, 基本攻撃力: 80.0, 実ダメージ: 83.74112, 確定数変化防御値: Nothing } { ブキ: ラピッド爆風外周, 基本攻撃力: 25.0, 実ダメージ: 26.1691, 確定数変化防御値: Just 17 } { ブキ: スプラチャージャー, 基本攻撃力: 160.0, 実ダメージ: 167.48224, 確定数変化防御値: Nothing } { ブキ: スクイックリン, 基本攻撃力: 140.0, 実ダメージ: 146.54696, 確定数変化防御値: Nothing } { ブキ: リッター3K, 基本攻撃力: 180.0, 実ダメージ: 188.41752, 確定数変化防御値: Nothing } { ブキ: ノーチャージャー, 基本攻撃力: 40.0, 実ダメージ: 41.87056, 確定数変化防御値: Nothing } { ブキ: バケットスロッシャー, 基本攻撃力: 70.0, 実ダメージ: 73.27348, 確定数変化防御値: Nothing } { ブキ: スロッシャー根元, 基本攻撃力: 40.0, 実ダメージ: 41.87056, 確定数変化防御値: Nothing } { ブキ: バレルスピナー, 基本攻撃力: 28.0, 実ダメージ: 29.309392, 確定数変化防御値: Nothing } { ブキ: ボム, 基本攻撃力: 180.0, 実ダメージ: 188.41752, 確定数変化防御値: Nothing } { ブキ: ボム爆風外周, 基本攻撃力: 30.0, 実ダメージ: 31.40292, 確定数変化防御値: Nothing } { ブキ: クイックボム直撃, 基本攻撃力: 25.0, 実ダメージ: 26.1691, 確定数変化防御値: Just 17 } { ブキ: クイック爆風(近), 基本攻撃力: 35.0, 実ダメージ: 36.63674, 確定数変化防御値: Just 30 } { ブキ: クイック爆風(遠), 基本攻撃力: 20.0, 実ダメージ: 20.93528, 確定数変化防御値: Just 17 } { ブキ: チェイス爆風(近), 基本攻撃力: 80.0, 実ダメージ: 83.74112, 確定数変化防御値: Nothing } { ブキ: チェイス爆風(遠), 基本攻撃力: 20.0, 実ダメージ: 20.93528, 確定数変化防御値: Just 17 } { ブキ: スプラッシュシールド, 基本攻撃力: 50.0, 実ダメージ: 52.3382, 確定数変化防御値: Just 17 } { ブキ: スプリンクラー, 基本攻撃力: 30.0, 実ダメージ: 31.40292, 確定数変化防御値: Nothing } { ブキ: スーパーショット, 基本攻撃力: 150.0, 実ダメージ: 157.0146, 確定数変化防御値: Nothing } { ブキ: ダイオウイカ, 基本攻撃力: 160.0, 実ダメージ: 167.48224, 確定数変化防御値: Nothing }