public static void Execute(Beatmap beatmap) { try { var tuples = new List <Tuple <string, string, List <KeyValuePair <string, string> > > >(); groupYmlContextLines(readAllLinesFromFile(beatmap.FullPath.Replace(".dat", ".yml")), tuples, beatmap.SongInfo.FullFolderPath); var walls = new List <ObjectData>(); var events = new List <EventData>(); var firstTuple = tuples.First(); if (firstTuple.Item1.Invariant("default")) { var defaultGenerator = new WallGenerator(); var generatorList = new List <WallGenerator>(); Global.Instance.Logger.Info("Setting all generators"); setGenerators(tuples, generatorList, defaultGenerator); var wallList = new List <Wall>(); var eventList = new List <Event>(); Global.Instance.Logger.Info("Generating nodes"); foreach (var wallGenerator in generatorList) { wallList.AddRange(wallGenerator.GenerateWallsFinalized()); eventList.AddRange(wallGenerator.GenerateEventsFinalized()); } Global.Instance.Logger.Info("Converting nodes to objects"); walls.AddRange(wallList.Select(t => t.GenerateObstacle()).OrderBy(t => t.Time)); events.AddRange(eventList.SelectMany(t => t.GenerateEvent()).OrderBy(t => t.Time)); if (defaultGenerator.FlipOuterProps) { var eventsChanged = new int[5][] { new int[2] { 0, 0 }, new int[2] { 0, 0 }, new int[2] { 0, 0 }, new int[2] { 0, 0 }, new int[2] { 0, 0 } }; for (var i = 0; i <= 4; i++) { var highestProp = (int)defaultGenerator.GetType().GetProperties().First(f => f.Name.Invariant($"HighestProp{i}")).GetValue(defaultGenerator); var lowestProp = (int)defaultGenerator.GetType().GetProperties().First(f => f.Name.Invariant($"LowestProp{i}")).GetValue(defaultGenerator); var evHigh = events.Where(t => t.Type == i && t.CustomData.PropID == highestProp).ToArray(); var evLow = events.Where(t => t.Type == i && t.CustomData.PropID == lowestProp).ToArray(); foreach (var ev in events) { if (ev.Type == i && ev.CustomData.PropID == highestProp) { ev.CustomData.PropID = lowestProp; eventsChanged[i][0]++; } else if (ev.Type == i && ev.CustomData.PropID == lowestProp) { ev.CustomData.PropID = highestProp; eventsChanged[i][1]++; } } } Global.Instance.Logger.Info($"Changed {eventsChanged.SelectMany(t => t).Sum()} events where:{Environment.NewLine}{string.Join(Environment.NewLine, eventsChanged.Select((t, i) => $"{i} type had {t[0]} highs changed and {t[1]} lows changed."))}"); } } else if (firstTuple.Item1.Invariant("mergeFiles")) { var jObjects = new List <JObject>(); foreach (var file in firstTuple.Item3.Find(t => t.Key.Invariant("files")).Value.Split(',')) { jObjects.Add(JObject.Parse(File.ReadAllText(Path.Combine(beatmap.SongInfo.FullFolderPath, file)))); } foreach (var fileJObject in jObjects) { var eventObjects = fileJObject["_events"].ToEvent(); var eventOverlap = eventObjects.Where(e => events.Any(es => e.Time.Within(es.Time, timeConst))).ToArray(); if (eventOverlap.Length > 0) { foreach (var overlappedEvent in eventOverlap) { Global.Instance.Logger.Log(LogLevel.Warn, $"Found event overlap with constraint of {timeConst} event data:{overlappedEvent}"); } } eventObjects.CheckZoomCountEven(); events.AddRange(eventObjects); } } var jObject = JObject.Parse(File.ReadAllText(beatmap.FullPath)); var oldObstaclesPath = getOldPath(beatmap, "Obstacles"); var oldEventsPath = getOldPath(beatmap, "Events"); if (walls.Any()) { Global.Instance.Logger.Info("Writing wall objects and storing old objects"); using (var s = File.OpenWrite(Path.Combine(oldObstaclesPath, $"{DateTime.Now:yy-MM-dd hh.mm.ss}.obstacles.json"))) using (var sw = new StreamWriter(s)) using (var writer = new JsonTextWriter(sw)) { var serializer = new JsonSerializer { Formatting = Formatting.None }; serializer.Serialize(writer, jObject["_obstacles"]); } jObject["_obstacles"] = walls.ToJArray(); } if (events.Any()) { Global.Instance.Logger.Info("Writing event objects and storing old objects"); using (var s = File.OpenWrite(Path.Combine(oldEventsPath, $"{DateTime.Now:yy-MM-dd hh.mm.ss}.events.json"))) using (var sw = new StreamWriter(s)) using (var writer = new JsonTextWriter(sw)) { var serializer = new JsonSerializer { Formatting = Formatting.None }; serializer.Serialize(writer, jObject["_events"]); } jObject["_events"] = events.ToJArray(); } beatmap.EventCount = jObject["_events"].Children().Count(); beatmap.ObstacleCount = jObject["_obstacles"].Children().Count(); beatmap.NoteCount = jObject["_notes"].Children().Count(); Global.Instance.Logger.Info("Writing finalized file"); using (var s = File.OpenWrite(beatmap.FullPath)) using (var sw = new StreamWriter(s)) using (var writer = new JsonTextWriter(sw)) { var serializer = new JsonSerializer { Formatting = Formatting.None }; serializer.Serialize(writer, jObject); } } catch (Exception e) { Global.Instance.Logger.Error(e, e.Message); } Global.Instance.Logger.Info($"Compleated Run {++beatmap.GenCount} of {beatmap.SongInfo.SongName}, {beatmap.Difficulty}{beatmap.BeatmapSet.CharacteristicString}"); }