Example #1
0
        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;
        }
Example #2
0
        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;
            }
        }