冰與火之舞(adofai)判定公式

公式
提前 = ((打擊角度 - 參考角度) * ±1(是否旋轉(zhuǎn)) * 180.0 / π) ≤ -(Max(60.0, Max(默認難度初始判定區(qū)間/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm))
太快 = -(Max(60.0, Max(默認難度初始判定區(qū)間/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm)) < ((打擊角度 - 參考角度) * ±1(是否旋轉(zhuǎn)) * 180.0 / π) ≤ -(Max(45.0, Max(0.03/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm))
稍快 = -(Max(45.0, Max(0.03f/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm)) < ((打擊角度 - 參考角度) * ±1(是否旋轉(zhuǎn)) * 180.0 / π) ≤ -(Max(30.0, Max(0.02/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm))
完美 = -(Max(30.0, Max(0.02f/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm)) < ((打擊角度 - 參考角度) * ±1(是否旋轉(zhuǎn)) * 180.0 / π) ≤ (Max(30.0, Max(0.02/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm))
稍慢 = (Max(30.0, Max(0.02f/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm)) < ((打擊角度 - 參考角度) * ±1(是否旋轉(zhuǎn)) * 180.0 / π) ≤ (Max(45.0, Max(0.03/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm))
太慢 = (Max(45.0, Max(0.03f/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm)) < ((打擊角度 - 參考角度) * ±1(是否旋轉(zhuǎn)) * 180.0 / π) ≤ (Max(60.0, Max(默認難度初始判定區(qū)間/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm))
失敗 = ((打擊角度 - 參考角度) * ±1(是否旋轉(zhuǎn)) * 180.0 / π) > (Max(60.0, Max(默認難度初始判定區(qū)間/飚速模式倍數(shù), 0.025) * 音高 * 180 / 60.0 * bpm))?
解釋:
打擊角度-參考角度:玩家操作的球和目標磚塊之間的角度差(弧度制)
±1(是否旋轉(zhuǎn)):如果這個磚塊有旋轉(zhuǎn)事件則*-1,否則*1
* 180.0 / π:把弧度制轉(zhuǎn)為角度制
Max(a,b):取a,b中較大的一個
默認難度初始判定區(qū)間:寬判:0.091;標判:0.065;嚴判:0.04
飚速模式倍數(shù):默認為1.0,如2.8倍此值就是2.8
/?60.0 * bpm:把beats/min(每分鐘節(jié)拍數(shù))轉(zhuǎn)為beats/sec(每秒鐘節(jié)拍數(shù))
音高默認=1
上述的bpm為等效bpm,也就是當前磚塊bpm*飆速倍數(shù)
相關源代碼(注釋為自己寫的)
public static HitMargin GetHitMargin(float hitangle, float refangle, bool isCW, float bpmTimesSpeed, float conductorPitch)
{
float num = (hitangle - refangle) * (float)(isCW ? 1 : -1);
HitMargin result = HitMargin.TooEarly;
float num2 = num;
num2 = 57.29578f * num2;
double adjustedAngleBoundaryInDeg = scrMisc.GetAdjustedAngleBoundaryInDeg(HitMarginGeneral.Counted, (double)bpmTimesSpeed, (double)conductorPitch);
double adjustedAngleBoundaryInDeg2 = scrMisc.GetAdjustedAngleBoundaryInDeg(HitMarginGeneral.Perfect, (double)bpmTimesSpeed, (double)conductorPitch);
double adjustedAngleBoundaryInDeg3 = scrMisc.GetAdjustedAngleBoundaryInDeg(HitMarginGeneral.Pure, (double)bpmTimesSpeed, (double)conductorPitch);
? ? ? ?/*
? ? ? ?adjustedAngleBoundaryInDeg = Math.Max(60.0, Mathf.Max(默認難度初始判定區(qū)間/飚速模式倍數(shù), 0.025f) * 音高 * π / 60.0 * bpm);
? ? ? ?adjustedAngleBoundaryInDeg2 = Math.Max(45.0, Mathf.Max(0.03f/飚速模式倍數(shù), 0.025f) * 音高 * π / 60.0 * bpm);
? ? ? ?adjustedAngleBoundaryInDeg3 = Math.Max(30.0, Mathf.Max(0.02f/飚速模式倍數(shù), 0.025f) * 音高 * π / 60.0 * bpm);
? ? ? ?*/
if ((double)num2 > -adjustedAngleBoundaryInDeg)
{
result = HitMargin.VeryEarly;
}
if ((double)num2 > -adjustedAngleBoundaryInDeg2)
{
result = HitMargin.EarlyPerfect;
}
if ((double)num2 > -adjustedAngleBoundaryInDeg3)
{
result = HitMargin.Perfect;
}
if ((double)num2 > adjustedAngleBoundaryInDeg3)
{
result = HitMargin.LatePerfect;
}
if ((double)num2 > adjustedAngleBoundaryInDeg2)
{
result = HitMargin.VeryLate;
}
if ((double)num2 > adjustedAngleBoundaryInDeg)
{
result = HitMargin.TooLate;
}
return result;
}
public static double GetAdjustedAngleBoundaryInDeg(HitMarginGeneral marginType, double bpmTimesSpeed, double conductorPitch)
{
float num = 0.065f;
if (GCS.difficulty == Difficulty.Lenient)
{
num = 0.091f;
}
if (GCS.difficulty == Difficulty.Normal)
{
num = 0.065f;
}
if (GCS.difficulty == Difficulty.Strict)
{
num = 0.04f;
}
bool isMobile = ADOBase.isMobile;
num = (isMobile ? 0.09f : (num / GCS.currentSpeedTrial));
float num2 = isMobile ? 0.07f : (0.03f / GCS.currentSpeedTrial);
float a = isMobile ? 0.05f : (0.02f / GCS.currentSpeedTrial);
? ? ? ?//num(最寬松,可能為太快太慢)=默認難度初始判定區(qū)間/GCS.currentSpeedTrial
? ? ? ?//num2(可能為稍快稍慢)=0.03f/GCS.currentSpeedTrial
? ? ? ?//a(可能為完美)=0.02f/GCS.currentSpeedTrial
? ? ? ?//currentSpeedTrial應該是飚速模式
num = Mathf.Max(num, 0.025f);
? ? ? ?//避免過低bpm導致反向高bpm補償
num2 = Mathf.Max(num2, 0.025f);
? ? ? ?//避免過低bpm導致反向高bpm補償
double num3 = (double)Mathf.Max(a, 0.025f);
? ? ? ?//避免過低bpm導致反向高bpm補償
? ? ? ?/*
num = Mathf.Max(默認難度初始判定區(qū)間/GCS.currentSpeedTrial, 0.025f);
num2 = Mathf.Max(0.03f/GCS.currentSpeedTrial, 0.025f);
num3 = Mathf.Max(0.02f/GCS.currentSpeedTrial, 0.025f);
? ? ? ?float double 亂用是吧
? ? ? ?*/
double val = scrMisc.TimeToAngleInRad((double)num, bpmTimesSpeed, conductorPitch, false) * 57.295780181884766;//180/π=57.29
double val2 = scrMisc.TimeToAngleInRad((double)num2, bpmTimesSpeed, conductorPitch, false) * 57.295780181884766;
double val3 = scrMisc.TimeToAngleInRad(num3, bpmTimesSpeed, conductorPitch, false) * 57.295780181884766;
? ? ? ?/*
? ? ? ?val=Mathf.Max(默認難度初始判定區(qū)間/GCS.currentSpeedTrial, 0.025f) * conductorPitch * π / 60.0 * bpmTimesSpeed
? ? ? ?val2=Mathf.Max(0.03f/GCS.currentSpeedTrial, 0.025f) * conductorPitch * π / 60.0 * bpmTimesSpeed
? ? ? ?val3=Mathf.Max(0.02f/GCS.currentSpeedTrial, 0.025f) * conductorPitch * π / 60.0 * bpmTimesSpeed
? ? ? ?*/
double result = Math.Max((double)GCS.HITMARGIN_COUNTED, val);
? ? ? ?//GCS.HITMARGIN_COUNTED被賦值的三個函數(shù)最終都未被使用,因此取初始值60f
double result2 = Math.Max(45.0, val2);
double result3 = Math.Max(30.0, val3);
? ? ? ?/*
? ? ? ?result = Math.Max(60.0, Mathf.Max(默認難度初始判定區(qū)間/飚速模式倍數(shù), 0.025f) * 音高 * π / 60.0 * bpm);
? ? ? ?result2 = Math.Max(45.0, Mathf.Max(0.03f/飚速模式倍數(shù), 0.025f) * 音高 * π / 60.0 * bpm);
? ? ? ?result3 = Math.Max(30.0, Mathf.Max(0.02f/飚速模式倍數(shù), 0.025f) * 音高 * π / 60.0 * bpm);
? ? ? ?這123的 起變量名不要num1 val2 result3!!血壓已經(jīng)起來了
? ? ? ?*/
if (marginType == HitMarginGeneral.Counted)
{
return result;
}
if (marginType == HitMarginGeneral.Perfect)
{
return result2;
}
if (marginType == HitMarginGeneral.Pure)
{
return result3;
}
return result;
}
public static double TimeToAngleInRad(double timeinAbsoluteSpace, double bpmTimesSpeed, double conductorPitch, bool shrinkMarginsForHigherPitch = false)
{
double num;
/*if (shrinkMarginsForHigherPitch)
{
num = timeinAbsoluteSpace;
}
else
{*/
num = timeinAbsoluteSpace * conductorPitch;
//}
return num * 3.1415927410125732 / scrMisc.bpm2crotchet(bpmTimesSpeed);
? ? ? ?//num = timeinAbsoluteSpace * conductorPitch * π / 60.0 * bpmTimesSpeed
}
public static double bpm2crotchet(double bpm)
{
return 60.0 / bpm;
}