public IOsbSpriteCommand ParseCommandLine(string line, int lineNumber, CommandPosition initialPosition) { var values = line.Trim().Split(','); if (string.IsNullOrEmpty(values[3])) { values[3] = values[2]; } var commandType = values[0]; var easing = (OsbEasing)int.Parse(values[1]); var startTime = double.Parse(values[2], CultureInfo.InvariantCulture); var endTime = double.Parse(values[3], CultureInfo.InvariantCulture); switch (commandType) { case "F": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; return(new FadeCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = startValue, EndValue = endValue, Line = lineNumber, }); } case "S": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; return(new ScaleCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = startValue, EndValue = endValue, Line = lineNumber, }); } case "V": { var startX = double.Parse(values[4], CultureInfo.InvariantCulture); var startY = double.Parse(values[5], CultureInfo.InvariantCulture); var endX = values.Length > 6 ? double.Parse(values[6], CultureInfo.InvariantCulture) : startX; var endY = values.Length > 7 ? double.Parse(values[7], CultureInfo.InvariantCulture) : startY; return(new VectorScaleCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = new CommandScale() { X = startX, Y = startY }, EndValue = new CommandScale() { X = endX, Y = endY }, Line = lineNumber, }); } case "R": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; return(new RotateCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = startValue, EndValue = endValue, Line = lineNumber, }); } case "M": { var startX = double.Parse(values[4], CultureInfo.InvariantCulture); var startY = double.Parse(values[5], CultureInfo.InvariantCulture); var endX = values.Length > 6 ? double.Parse(values[6], CultureInfo.InvariantCulture) : startX; var endY = values.Length > 7 ? double.Parse(values[7], CultureInfo.InvariantCulture) : startY; var m = new MoveCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = new CommandPosition() { X = startX, Y = startY }, EndValue = new CommandPosition() { X = endX, Y = endY }, Line = lineNumber, }; m.SetDefaultValue(initialPosition); return(m); } case "MX": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; var mx = new MoveXCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = startValue, EndValue = endValue, Line = lineNumber, }; mx.SetDefaultValue(initialPosition); return(mx); } case "MY": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; var my = new MoveYCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = startValue, EndValue = endValue, Line = lineNumber, }; my.SetDefaultValue(initialPosition); return(my); } case "C": { var startR = byte.Parse(values[4], CultureInfo.InvariantCulture); var startG = byte.Parse(values[5], CultureInfo.InvariantCulture); var startB = byte.Parse(values[6], CultureInfo.InvariantCulture); var endR = values.Length > 7 ? byte.Parse(values[7], CultureInfo.InvariantCulture) : startR; var endG = values.Length > 8 ? byte.Parse(values[8], CultureInfo.InvariantCulture) : startG; var endB = values.Length > 9 ? byte.Parse(values[9], CultureInfo.InvariantCulture) : startB; return(new ColorCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = new CommandColor() { R = startR, G = startG, B = startB }, EndValue = new CommandColor() { R = endR, G = endG, B = endB }, Line = lineNumber, }); } case "P": { var type = GetParameterType(values[4]); return(new ParameterCommand() { Easing = easing, StartTime = startTime, EndTime = endTime, StartValue = type, EndValue = type, Line = lineNumber, }); } default: throw new FormatException($"Invalid Commandtype {commandType} detected"); } }