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)); }
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()); }
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()); }
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; } }
/* * 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); }
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; } }
/// <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;
/// <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;