/// <summary> /// 使用指定的<seealso cref="CatchBeatmap"/>和要使用的Mod初始化CatchDifficultyCalculator /// </summary> /// <param name="beatmap"></param> /// <param name="mods"></param> public CatchDifficultyCalculator(CatchBeatmap beatmap, ModList mods) { Beatmap = beatmap; Mods = mods; foreach (var diff in beatmap.Difficulty) { var scala = diff.Key == "CircleSize" ? 1.3 : 1.4; diff.Value = AdjustDifficulty(diff.Value, mods, scala); } foreach (var hitObject in Beatmap.CatchHitObjects) { var catchHitObj = (CatchHitObject)hitObject; HitObjectsWithTicks.Add(catchHitObj); if (catchHitObj.BaseHitObject.HitObjectType == HitObjectTypes.JuiceStream || catchHitObj.BaseHitObject.HitObjectType == HitObjectTypes.Slider) { HitObjectsWithTicks.AddRange(catchHitObj.Ticks); HitObjectsWithTicks.AddRange(catchHitObj.EndTicks); } } TimeRate = Mods.TimeRate; PlayerWidth = 305 / 1.6 * ((102.4 * (1 - 0.7 * (Beatmap.Difficulty.CircleSize - 5) / 5)) / 128) * 0.7; HitObjectsWithTicks.ForEach(hitObject => DifficultyHitObjects.Add(new CatchDifficultyHitObject(hitObject, PlayerWidth * 0.4))); UpdateHyperDashDistance(); DifficultyHitObjects.Sort((x, y) => Math.Abs(x.HitObject.Offset - y.HitObject.Offset) == 0 ? 0 : x.HitObject.Offset > y.HitObject.Offset ? 1 : -1); CalcStrainValues(); Stars = Math.Pow(CalcDifficulty(), 0.5) * Constants.StarScalingFactor; }
/// <summary> /// 使用要计算的谱面和要使用的Mod初始化pp计算器 /// </summary> /// <param name="beatmap"></param> /// <param name="mods"></param> public CatchPerformanceCalculator(CatchBeatmap beatmap, ModList mods) { Beatmap = beatmap; Mods = mods; DifficultyCalculator = new CatchDifficultyCalculator(beatmap, mods); }