/// <summary> /// Responsible for converting a Qua object, to a Map object /// a Map object is one that is stored in the db. /// </summary> /// <param name="qua"></param> /// <param name="path"></param> /// <returns></returns> public static Map FromQua(Qua qua, string path) { var map = new Map { Md5Checksum = MapsetHelper.GetMd5Checksum(path), Directory = new DirectoryInfo(System.IO.Path.GetDirectoryName(path) ?? throw new InvalidOperationException()).Name.Replace("\\", "/"), Path = System.IO.Path.GetFileName(path)?.Replace("\\", "/"), Artist = qua.Artist, Title = qua.Title, HighestRank = Grade.None, AudioPath = qua.AudioFile, AudioPreviewTime = qua.SongPreviewTime, BackgroundPath = qua.BackgroundFile, Description = qua.Description, MapId = qua.MapId, MapSetId = qua.MapSetId, Bpm = qua.GetCommonBpm(), Creator = qua.Creator, DifficultyName = qua.DifficultyName, Source = qua.Source, Tags = qua.Tags, SongLength = qua.Length, Mode = qua.Mode, }; map.LastFileWrite = File.GetLastWriteTimeUtc(map.Path); return(map); }
/// <summary> /// Responsible for converting a Qua object, to a Map object /// a Map object is one that is stored in the db. /// </summary> /// <param name="qua"></param> /// <param name="path"></param> /// <returns></returns> public static Map FromQua(Qua qua, string path, bool skipPathSetting = false) { var map = new Map { Artist = qua.Artist, Title = qua.Title, HighestRank = Grade.None, AudioPath = qua.AudioFile, AudioPreviewTime = qua.SongPreviewTime, BackgroundPath = qua.BackgroundFile, Description = qua.Description, MapId = qua.MapId, MapSetId = qua.MapSetId, Creator = qua.Creator, DifficultyName = qua.DifficultyName, Source = qua.Source, Tags = qua.Tags, SongLength = qua.Length, Mode = qua.Mode, RegularNoteCount = qua.HitObjects.Count(x => !x.IsLongNote), LongNoteCount = qua.HitObjects.Count(x => x.IsLongNote), }; if (!skipPathSetting) { try { map.Md5Checksum = MapsetHelper.GetMd5Checksum(path); map.Directory = new DirectoryInfo(System.IO.Path.GetDirectoryName(path) ?? throw new InvalidOperationException()).Name.Replace("\\", "/"); map.Path = System.IO.Path.GetFileName(path)?.Replace("\\", "/"); map.LastFileWrite = File.GetLastWriteTimeUtc(map.Path); } // ReSharper disable once EmptyGeneralCatchClause catch (Exception) { } } try { map.Bpm = qua.GetCommonBpm(); } catch (Exception) { map.Bpm = 0; } map.DateAdded = DateTime.Now; return(map); }
/// <summary> /// Generate Scroll Velocity points. /// </summary> /// <param name="qua"></param> private void InitializeScrollVelocities(Qua qua) { // Find average bpm var commonBpm = qua.GetCommonBpm(); // Create SV multiplier timing points var index = 0; for (var i = 0; i < qua.TimingPoints.Count; i++) { var svFound = false; // SV starts after the last timing point if (i == qua.TimingPoints.Count - 1) { for (var j = index; j < qua.SliderVelocities.Count; j++) { var sv = new SliderVelocityInfo() { StartTime = qua.SliderVelocities[j].StartTime, Multiplier = qua.SliderVelocities[j].Multiplier * (float)(qua.TimingPoints[i].Bpm / commonBpm) }; ScrollVelocities.Add(sv); // Toggle SvFound if inheriting point is overlapping timing point if (Math.Abs(sv.StartTime - qua.TimingPoints[i].StartTime) < 1) { svFound = true; } } } // SV does not start after the last timing point else { for (var j = index; j < qua.SliderVelocities.Count; j++) { // SV starts before the first timing point if (qua.SliderVelocities[j].StartTime < qua.TimingPoints[0].StartTime) { var sv = new SliderVelocityInfo() { StartTime = qua.SliderVelocities[j].StartTime, Multiplier = qua.SliderVelocities[j].Multiplier * (float)(qua.TimingPoints[0].Bpm / commonBpm) }; ScrollVelocities.Add(sv); // Toggle SvFound if inheriting point is overlapping timing point if (Math.Abs(sv.StartTime - qua.TimingPoints[0].StartTime) < 1) { svFound = true; } } // SV start is in between two timing points else if (qua.SliderVelocities[j].StartTime >= qua.TimingPoints[i].StartTime && qua.SliderVelocities[j].StartTime < qua.TimingPoints[i + 1].StartTime) { var sv = new SliderVelocityInfo() { StartTime = qua.SliderVelocities[j].StartTime, Multiplier = qua.SliderVelocities[j].Multiplier * (float)(qua.TimingPoints[i].Bpm / commonBpm) }; ScrollVelocities.Add(sv); // Toggle SvFound if inheriting point is overlapping timing point if (Math.Abs(sv.StartTime - qua.TimingPoints[i].StartTime) < 1) { svFound = true; } } // Update current index if SV falls out of range for optimization else { index = j; break; } } } // Create BPM SV if no inheriting point is overlapping the current timing point if (!svFound) { var sv = new SliderVelocityInfo() { StartTime = qua.TimingPoints[i].StartTime, Multiplier = (float)(qua.TimingPoints[i].Bpm / commonBpm) }; ScrollVelocities.Add(sv); } } // Sort SV points by start time ScrollVelocities = ScrollVelocities.OrderBy(o => o.StartTime).ToList(); }