Skip to content

Instantly share code, notes, and snippets.

@oyakodon
Created December 12, 2015 03:40
Show Gist options
  • Save oyakodon/9a6f0b5b0716253ba246 to your computer and use it in GitHub Desktop.
Save oyakodon/9a6f0b5b0716253ba246 to your computer and use it in GitHub Desktop.
デレステのアピール値やスコアの計算メソッドをまとめたもの
using System;
namespace CGSS_Calc
{
/// <summary>
/// デレステのアピール値やスコアの計算メソッドをまとめたもの
/// 参考 : http://imascg-slstage-wiki.gamerch.com/%E3%82%A2%E3%83%94%E3%83%BC%E3%83%AB%E5%80%A4%E8%A8%88%E7%AE%97
/// http://imascg-slstage-wiki.gamerch.com/%E3%82%B9%E3%82%B3%E3%82%A2%E8%A8%88%E7%AE%97
/// 式 :
/// アピール値 = { (素のステータス) × (100 + 発揮される効果の和:単位%) × 0.01} の小数点以下を切り上げたもの ←Calc_Api [support = false]
/// サポメンアピール値 = { (アピール値) × 0.5} の小数点以下を切り上げたもの ← Calc_Api [support = true]
///
/// (ノートあたりのスコア) = { (基礎値) × (判定倍率) × (コンボ倍率) × (特技倍率) を小数点以下四捨五入したもの } ← Calc_NpS
/// (基礎値) = (合計アピール値) × (曲係数) ÷ (総ノート数)
/// (判定係数) = { PERFECT:1.0, GREAT :0.7, NICE :0.4,BAD:0.1,MISS:0 }
/// (コンボ倍率) = (境界コンボ数) = { (総ノート数) × (割合) を小数点以下切り下げたもの }
/// 割合 コンボ倍率
/// 0%~ 1.0
/// 5%~ 1.1
/// 10%~ 1.2
/// 25%~ 1.3
/// 50%~ 1.4
/// 70%~ 1.5
/// 80%~ 1.7
/// 90%~ 2.0
/// (特技倍率) = (発動中のスコアアップ系特技の内最も効果の高いもの) × (発動中のコンボボーナス系特技の内最も効果の高いもの)
/// ※ゲストアイドル・サポートメンバーの特技は一切関係し
/// </summary>
public class Calculation
{
/// <summary>
/// アピール値を求める
/// </summary>
/// <param name="stat">ステータス値</param>
/// <param name="effect">発揮される効果の和(%) / 楽曲タイプによる効果(%)</param>
/// <param name="support">サポートメンバー式を... True: 適応する False: 適応しない</param>
/// <returns>小数点以下切り上げを行ったアピール値</returns>
public int Calc_Api(int stat, int effect, bool support)
{
if (support)
{
//サポメンなら
return (int)Math.Ceiling((stat * (100 + effect) * 0.01) * 0.5);
}
else
{
return (int)Math.Ceiling(stat * (100 + effect) * 0.01);
}
}
/// <summary>
/// NpS(ノートあたりのスコア)を計算する
/// </summary>
/// <param name="SongLv">楽曲レベル</param>
/// <param name="judge_Mag">判定倍率</param>
/// <param name="skill_mag">特技倍率</param>
public int Calc_NpS(int SongLv, double judge_Mag, double skill_mag)
{
var score = (Total_Api * Calc_Song_Coef(SongLv) / Total_Notes) * judge_Mag * Calc_Combo_Mag() * skill_mag;
return (int)Math.Round(score, MidpointRounding.AwayFromZero);
}
/// <summary>
/// 曲係数を計算する
/// Coefficient(係数)
/// </summary>
private double Calc_Song_Coef(int SongLv)
{
var coef = 0.0;
#region 曲係数条件分岐
switch (SongLv)
{
case 5: coef = 1.0; break;
case 6: coef = 1.025; break;
case 7: coef = 1.05; break;
case 8: coef = 1.075; break;
case 9: coef = 1.1; break;
case 10: coef = 1.2; break;
case 11: coef = 1.225; break;
case 12: coef = 1.25; break;
case 13: coef = 1.275; break;
case 14: coef = 1.3; break;
case 15: coef = 1.4; break;
case 16: coef = 1.425; break;
case 17: coef = 1.45; break;
case 18: coef = 1.475; break;
case 19: coef = 1.5; break;
case 20: coef = 1.6; break;
case 21: coef = 1.65; break;
case 22: coef = 1.7; break;
case 23: coef = 1.75; break;
case 24: coef = 1.8; break;
case 25: coef = 1.85; break;
case 26: coef = 1.9; break;
case 27: coef = 1.95; break;
case 28: coef = 2; break;
case 29: coef = 2.1; break;
}
#endregion
return coef;
}
/// <summary>
/// コンボ倍率を計算する
/// </summary>
private double Calc_Combo_Mag()
{
var combo_mag = 0.0;
for (var i = 0; i < Combo_Border.Length; ++i)
{
if (Math.Round(Combo_Border[i, 0]) <= Current_Combo)
{
combo_mag = Combo_Border[i, 1];
break;
}
}
return combo_mag;
}
private double[,] Combo_Border;
/// <summary>
/// 境界コンボを計算する(合計ノート数設定後、一回呼び出すこと)
/// </summary>
private void Calc_Combo_Border()
{
#region 境界コンボ定義
Combo_Border = new double[,]
{
{ (Current_Combo * 0.9), 2.0},
{ (Current_Combo * 0.8), 1.7},
{ (Current_Combo * 0.7), 1.5},
{ (Current_Combo * 0.5), 1.4},
{ (Current_Combo * 0.25), 1.3},
{ (Current_Combo * 0.1), 1.2},
{ (Current_Combo * 0.05), 1.1},
{ (Current_Combo * 0.0), 1.0}
};
#endregion
}
/// <summary>
/// 合計アピール値
/// </summary>
private double Total_Api = 0;
/// <summary>
/// 合計ノート値
/// </summary>
private int Total_Notes = 0;
/// <summary>
/// 現在のコンボ数
/// </summary>
private int Current_Combo = 0;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment