using Newtonsoft.Json; using Newtonsoft.Json.Converters; using RhythmBase.Components; using RhythmBase.Converters; using RhythmBase.Events; using RhythmBase.Exceptions; using RhythmBase.Settings; namespace RhythmBase.Utils { /// /// Static class providing utility methods. /// public static class Utils { /// /// Converts Xs patterns to string form. /// /// List of patterns. /// String representation of patterns. public static string GetPatternString(Patterns[] pattern) => string.Join("", pattern?.Select(p => p switch { Patterns.None => "-", Patterns.X => "x", Patterns.Up => "u", Patterns.Down => "d", Patterns.Banana => "b", Patterns.Return => "r", _ => throw new ConvertingException($"Invalid pattern: {p}") }) ?? throw new ConvertingException($"Cannot write pattern.")); /// /// Gets the JSON serializer settings for the specified level and settings. /// /// The level to serialize. /// The settings for reading or writing the level. /// JSON serializer settings. public static JsonSerializerSettings GetSerializer(this RDLevel rdlevel, LevelReadOrWriteSettings settings) { JsonSerializerSettings EventsSerializer = new() { ContractResolver = new RDContractResolver() }; IList converters = EventsSerializer.Converters; converters.Add(new PanelColorConverter(rdlevel.ColorPalette)); converters.Add(new ColorConverter()); converters.Add(new ConditionalConverter()); converters.Add(new CharacterConverter()); converters.Add(new ConditionConverter(rdlevel.Conditionals)); converters.Add(new TagActionConverter(rdlevel, settings)); converters.Add(new CustomDecorationEventConverter(rdlevel, settings)); converters.Add(new CustomRowEventConverter(rdlevel, settings)); converters.Add(new CustomEventConverter(rdlevel, settings)); converters.Add(new BaseRowActionConverter(rdlevel, settings)); converters.Add(new BaseDecorationActionConverter(rdlevel, settings)); converters.Add(new BaseEventConverter(rdlevel, settings)); converters.Add(new BookmarkConverter(rdlevel.Calculator)); converters.Add(new StringEnumConverter()); return EventsSerializer; } /// /// The default beats per minute. /// public const float DefaultBPM = 100f; /// /// The default crotchets per bar. /// public const int DefaultCPB = 8; } }