Example #1
0
        public Osb(string aCode)
        {
            code = aCode;

            string[] lines = aCode.Split(new string[] { "\n" }, StringSplitOptions.None);

            // substitute variables in the code before looking at the event part
            List <KeyValuePair <string, string> > substitutions = new List <KeyValuePair <string, string> >();

            ParserStatic.ApplySettings(lines, "Variables", aSectionLines =>
            {
                foreach (string line in aSectionLines)
                {
                    if (line.StartsWith("$"))
                    {
                        substitutions.Add(new KeyValuePair <string, string>(
                                              line.Split('=')[0].Trim(),
                                              line.Split('=')[1].Trim()));
                    }
                }
            });

            string substitutedCode = aCode;

            foreach (KeyValuePair <string, string> substitution in substitutions)
            {
                substitutedCode = substitutedCode.Replace(substitution.Key, substitution.Value);
            }

            string codeResult = substitutedCode.ToString();

            string[] linesResult = codeResult.Split(new string[] { "\n" }, StringSplitOptions.None);

            backgrounds = GetEvents(linesResult, new List <string>()
            {
                "Background", "0"
            }, anArgs => new Background(anArgs));
            videos = GetEvents(linesResult, new List <string>()
            {
                "Video", "1"
            }, anArgs => new Video(anArgs));
            breaks = GetEvents(linesResult, new List <string>()
            {
                "Break", "2"
            }, anArgs => new Break(anArgs));
            sprites = GetEvents(linesResult, new List <string>()
            {
                "Sprite", "4"
            }, anArgs => new Sprite(anArgs));
            storyHitSounds = GetEvents(linesResult, new List <string>()
            {
                "Sample", "5"
            }, anArgs => new StoryHitSound(anArgs));
            animations = GetEvents(linesResult, new List <string>()
            {
                "Animation", "6"
            }, anArgs => new Animation(anArgs));
        }
Example #2
0
 private List <TimingLine> GetTimingLines(string[] aLines)
 {
     // find the [TimingPoints] section and parse each timing line
     return(ParserStatic.ParseSection(aLines, "TimingPoints", aLine =>
     {
         string[] args = aLine.Split(',');
         return TimingLine.IsUninherited(args) ? new UninheritedLine(args) : (TimingLine) new InheritedLine(args);
     }).ToList());
 }
Example #3
0
 private List <HitObject> GetHitobjects(string[] aLines)
 {
     // find the [Hitobjects] section and parse each hitobject until empty line or end of file
     return(ParserStatic.ParseSection(aLines, "HitObjects", aLine =>
     {
         string[] args = aLine.Split(',');
         return
         HitObject.HasType(args, HitObject.Type.Circle)        ? new Circle(args, this) :
         HitObject.HasType(args, HitObject.Type.Slider)        ? new Slider(args, this) :
         HitObject.HasType(args, HitObject.Type.ManiaHoldNote) ? new HoldNote(args, this) :
         (HitObject) new Spinner(args, this);
     }).ToList());
 }
Example #4
0
        public Beatmap(string aCode, float?aStarRating = null, string aSongPath = null, string aMapPath = null)
        {
            code     = aCode;
            songPath = aSongPath;
            mapPath  = aMapPath;

            string[] lines = aCode.Split(new string[] { "\n" }, StringSplitOptions.None);

            generalSettings    = ParserStatic.GetSettings(lines, "General", aSectionLines => new GeneralSettings(aSectionLines));
            metadataSettings   = ParserStatic.GetSettings(lines, "Metadata", aSectionLines => new MetadataSettings(aSectionLines));
            difficultySettings = ParserStatic.GetSettings(lines, "Difficulty", aSectionLines => new DifficultySettings(aSectionLines));
            colourSettings     = ParserStatic.GetSettings(lines, "Colours", aSectionLines => new ColourSettings(aSectionLines));

            // event type 3 seems to be "background colour transformation" https://i.imgur.com/Tqlz3s5.png

            backgrounds = GetEvents(lines, new List <string>()
            {
                "Background", "0"
            }, anArgs => new Background(anArgs));
            videos = GetEvents(lines, new List <string>()
            {
                "Video", "1"
            }, anArgs => new Video(anArgs));
            breaks = GetEvents(lines, new List <string>()
            {
                "Break", "2"
            }, anArgs => new Break(anArgs));
            sprites = GetEvents(lines, new List <string>()
            {
                "Sprite", "4"
            }, anArgs => new Sprite(anArgs));
            storyHitSounds = GetEvents(lines, new List <string>()
            {
                "Sample", "5"
            }, anArgs => new StoryHitSound(anArgs));
            animations = GetEvents(lines, new List <string>()
            {
                "Animation", "6"
            }, anArgs => new Animation(anArgs));

            timingLines = GetTimingLines(lines);
            hitObjects  = GetHitobjects(lines);

            if (generalSettings.mode == Mode.Standard)
            {
                // Stacking is standard-only.
                ApplyStacking();

                starRating = aStarRating ?? (float)StandardDifficultyCalculator.Calculate(this).Item3;
            }
        }
Example #5
0
        /*
         *  Parser Methods
         */

        private List <T> GetEvents <T>(string[] aLines, List <string> aTypes, Func <string[], T> aFunc)
        {
            // find all lines starting with any of aTypes in the event section
            List <T> types = new List <T>();

            ParserStatic.ApplySettings(aLines, "Events", aSectionLines =>
            {
                foreach (string line in aSectionLines)
                {
                    if (aTypes.Any(aType => line.StartsWith(aType + ",")))
                    {
                        types.Add(aFunc(line.Split(',')));
                    }
                }
            });
            return(types);
        }
Example #6
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;
            }
        }
Example #7
0
 /// <summary> Returns on which layer the storyboard sample will play (e.g. Fail or Pass). </summary>
 private Layer GetLayer(string[] args) =>
 ParserStatic.GetEnumMatch <Layer>(args[2]) ?? Layer.Unknown;
Example #8
0
 /// <summary> Returns the local origin of the sprite, determining around which point it is transformed
 /// (e.g. TopLeft, Center, or Bottom). </summary>
 private Origin GetOrigin(string[] args) =>
 ParserStatic.GetEnumMatch <Origin>(args[2]) ?? Origin.Unknown;