Esempio n. 1
0
        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)
                       ));
        }
Esempio n. 2
0
        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>());
        }
Esempio n. 3
0
        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);
        }