public static ScoreInfo LoadScoreIntoOsu(OsuGameBase osu, ScoreInfo score, ArchiveReader archive = null) { // clone to avoid attaching the input score to realm. score = score.DeepClone(); var scoreManager = osu.Dependencies.Get <ScoreManager>(); scoreManager.Import(score, archive); return(scoreManager.Query(_ => true)); }
private Task <PerformanceAttributes> getPerfectPerformance(ScoreInfo score, CancellationToken cancellationToken = default) { return(Task.Run(async() => { Ruleset ruleset = score.Ruleset.CreateInstance(); ScoreInfo perfectPlay = score.DeepClone(); perfectPlay.Accuracy = 1; perfectPlay.Passed = true; // calculate max combo // todo: Get max combo from difficulty calculator instead when diffcalc properly supports lazer-first scores perfectPlay.MaxCombo = calculateMaxCombo(playableBeatmap); // create statistics assuming all hit objects have perfect hit result var statistics = playableBeatmap.HitObjects .SelectMany(getPerfectHitResults) .GroupBy(hr => hr, (hr, list) => (hitResult: hr, count: list.Count())) .ToDictionary(pair => pair.hitResult, pair => pair.count); perfectPlay.Statistics = statistics; // calculate total score ScoreProcessor scoreProcessor = ruleset.CreateScoreProcessor(); scoreProcessor.HighestCombo.Value = perfectPlay.MaxCombo; scoreProcessor.Mods.Value = perfectPlay.Mods; perfectPlay.TotalScore = (long)scoreProcessor.GetImmediateScore(ScoringMode.Standardised, perfectPlay.MaxCombo, statistics); // compute rank achieved // default to SS, then adjust the rank with mods perfectPlay.Rank = ScoreRank.X; foreach (IApplicableToScoreProcessor mod in perfectPlay.Mods.OfType <IApplicableToScoreProcessor>()) { perfectPlay.Rank = mod.AdjustRank(perfectPlay.Rank, 1); } // calculate performance for this perfect score var difficulty = await difficultyCache.GetDifficultyAsync( playableBeatmap.BeatmapInfo, score.Ruleset, score.Mods, cancellationToken ).ConfigureAwait(false); // ScorePerformanceCache is not used to avoid caching multiple copies of essentially identical perfect performance attributes return difficulty == null ? null : ruleset.CreatePerformanceCalculator(difficulty.Value.Attributes, perfectPlay)?.Calculate(); }, cancellationToken)); }
public void TestDeepClone() { var score = new ScoreInfo(); score.Statistics.Add(HitResult.Good, 10); score.Rank = ScoreRank.B; var scoreCopy = score.DeepClone(); score.Statistics[HitResult.Good]++; score.Rank = ScoreRank.X; Assert.That(scoreCopy.Statistics[HitResult.Good], Is.EqualTo(10)); Assert.That(score.Statistics[HitResult.Good], Is.EqualTo(11)); Assert.That(scoreCopy.Rank, Is.EqualTo(ScoreRank.B)); Assert.That(score.Rank, Is.EqualTo(ScoreRank.X)); }