private void LoadBeatmapFromFile(string beatmapPath) { // Load osu beatmap var convertBeatmap = ReadBeatmap(beatmapPath); beatmap = (OsuBeatmap) new OsuBeatmapConverter(convertBeatmap).Convert(); var processor = new OsuBeatmapProcessor(beatmap); processor.PreProcess(); processor.PostProcess(); // Calculate difficulty var workingBeatmap = new PpWorkingBeatmap(convertBeatmap); calculator = new OsuDifficultyCalculator(new OsuRuleset(), workingBeatmap); var diffAttributes = calculator.Calculate(new Mod[] { }); var aim = (Aim)diffAttributes.Skills[0]; aimStrainTimes = aim.StrainTimes; aimStrainValues = aim.StrainValues; aimStrainPeakTimes = aim.strainPeakTimes; aimStrainPeaks = aim.strainPeaks; aimStrainPerObjectValues = aim.StrainPerObjectValues; (denseAimStrainTimes, denseAimStrainValues) = plotter.CalculateDenseStrainValues(aim.StrainTimes, aim.StrainValues); // Plot aim strain PerfStopwatch.Start("Aim Strain Graph"); aimStrainPlot.plt.Clear(); plotter.InitAimStrainGraph(aimStrainPlot.plt); plotter.PlotFullAimStrainGraph( aimStrainPlot.plt, aimStrainPeakTimes, aimStrainPeaks, denseAimStrainTimes, denseAimStrainValues, aimStrainTimes, aimStrainPerObjectValues); aimStrainPlot.Render(); PerfStopwatch.Stop(); Text = $"bmviewer - {convertBeatmap}"; // Update GUI controls // TODO: Use events to update values timeUpDown.Minimum = (int)beatmap.HitObjects.First().StartTime - 1000; trackBar1.Minimum = (int)beatmap.HitObjects.First().StartTime - 1000; timeUpDown.Maximum = (int)beatmap.HitObjects.Last().StartTime + 10000; trackBar1.Maximum = (int)beatmap.HitObjects.Last().StartTime + 10000; // Set initial game time SetGameTime((int)beatmap.HitObjects.First().StartTime - 1000); stopwatchStartTime = gameTime; }
public Beatmap(string code, double?starRating = null, string songPath = null, string mapPath = null) { this.code = code; this.songPath = songPath; this.mapPath = mapPath; string[] lines = code.Split(new string[] { "\n" }, StringSplitOptions.None); generalSettings = ParserStatic.GetSettings(lines, "General", sectionLines => new GeneralSettings(sectionLines)); metadataSettings = ParserStatic.GetSettings(lines, "Metadata", sectionLines => new MetadataSettings(sectionLines)); difficultySettings = ParserStatic.GetSettings(lines, "Difficulty", sectionLines => new DifficultySettings(sectionLines)); colourSettings = ParserStatic.GetSettings(lines, "Colours", sectionLines => new ColourSettings(sectionLines)); // event type 3 seems to be "background colour transformation" https://i.imgur.com/Tqlz3s5.png backgrounds = GetEvents(lines, new List <string>() { "Background", "0" }, args => new Background(args)); videos = GetEvents(lines, new List <string>() { "Video", "1" }, args => new Video(args)); breaks = GetEvents(lines, new List <string>() { "Break", "2" }, args => new Break(args)); sprites = GetEvents(lines, new List <string>() { "Sprite", "4" }, args => new Sprite(args)); samples = GetEvents(lines, new List <string>() { "Sample", "5" }, args => new Sample(args)); animations = GetEvents(lines, new List <string>() { "Animation", "6" }, args => new Animation(args)); timingLines = GetTimingLines(lines); hitObjects = GetHitobjects(lines); if (generalSettings.mode != Mode.Standard) { return; } // Stacking is standard-only. ApplyStacking(); if (starRating != null) { this.starRating = starRating.Value; } else { DifficultyAttributes attributes = new OsuDifficultyCalculator(this).Calculate(); difficultyAttributes = attributes; this.starRating = attributes.StarRating; } }