public static BeatmapTraits CalculateTraitsWithMods(BeatmapTraits nomodTraits, Mods mods, GameMode mode) { // No mods - just return base traits if (mods == Mods.None) { return(nomodTraits); } // Not standard - return base traits (no idea how those mods work) if (mode != GameMode.Standard) { return(nomodTraits); } return(new BeatmapTraits( nomodTraits.MaxCombo, // doesn't change AdjustDuration(nomodTraits.Duration, mods), AdjustTempo(nomodTraits.Tempo, mods), nomodTraits.StarRating, // can't calculate AdjustApproachRate(nomodTraits.ApproachRate, mods), AdjustOverallDifficulty(nomodTraits.OverallDifficulty, mods), AdjustCircleSize(nomodTraits.CircleSize, mods), AdjustDrain(nomodTraits.Drain, mods) )); }
public void CalculateTraitsWithMods(BeatmapTraits nomodTraits, Mods mods, GameMode mode, BeatmapTraits expectedTraits) { // Act var traits = BeatmapTraitsLogic.CalculateTraitsWithMods(nomodTraits, mods, mode); // Assert traits.Should().BeEquivalentTo(expectedTraits, o => o.Using <double>(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, 0.01)).WhenTypeIs <double>()); }
public async Task <Beatmap> GetBeatmapAsync(string beatmapId, GameMode gameMode) { // Try to get from cache first var cached = _cacheService.RetrieveOrDefault <Beatmap>($"Beatmap-{beatmapId}"); if (cached != null) { return(cached); } // Get var url = $"https://osu.ppy.sh/api/get_beatmaps?k={ApiKey}&m={(int) gameMode}&b={beatmapId}&limit=1&a=1"; var response = await GetStringAsync(url); // Parse var beatmapJson = JToken.Parse(response).First; // Extract data var id = beatmapJson["beatmap_id"].Value <string>(); var setId = beatmapJson["beatmapset_id"].Value <string>(); var creator = beatmapJson["creator"].Value <string>(); var lastUpdate = beatmapJson["last_update"].Value <DateTime>(); var artist = beatmapJson["artist"].Value <string>(); var title = beatmapJson["title"].Value <string>(); var version = beatmapJson["version"].Value <string>(); var maxCombo = beatmapJson["max_combo"].Value <int?>() ?? 0; // can be null sometimes var duration = TimeSpan.FromSeconds(beatmapJson["hit_length"].Value <double>()); var bpm = beatmapJson["bpm"].Value <double>(); var sr = beatmapJson["difficultyrating"].Value <double>(); var ar = beatmapJson["diff_approach"].Value <double>(); var od = beatmapJson["diff_overall"].Value <double>(); var cs = beatmapJson["diff_size"].Value <double>(); var hp = beatmapJson["diff_drain"].Value <double>(); var traits = new BeatmapTraits(maxCombo, duration, bpm, sr, ar, od, cs, hp); var result = new Beatmap(id, setId, gameMode, creator, lastUpdate, artist, title, version, traits); // Save to cache _cacheService.Store($"Beatmap-{beatmapId}", result); return(result); }