/// <summary> /// Returns the next flag after a layer rotation /// </summary> /// <param name="rotationLayer">Rotation layer</param> /// <param name="direction">Rotation direction</param> /// <returns>Next cube flag</returns> public static CubeFlag NextCubeFlag(CubeFlag flag, CubeFlag rotationLayer, bool direction = true) { CubeFlag nextFlag = CubeFlag.None; if (CountFlags(flag) == 1) { if (CubeFlagService.IsXFlag(rotationLayer)) { if (rotationLayer == CubeFlag.LeftSlice) { direction = !direction; } if (!direction && !IsXFlag(flag)) { flag = CubeFlagService.GetOppositeFlag(flag); } switch (flag) { case CubeFlag.FrontSlice: nextFlag = CubeFlag.TopLayer; break; case CubeFlag.MiddleSlice: nextFlag = CubeFlag.MiddleLayer; break; case CubeFlag.BackSlice: nextFlag = CubeFlag.BottomLayer; break; case CubeFlag.TopLayer: nextFlag = CubeFlag.BackSlice; break; case CubeFlag.MiddleLayer: nextFlag = CubeFlag.MiddleSlice; break; case CubeFlag.BottomLayer: nextFlag = CubeFlag.FrontSlice; break; default: nextFlag = flag; break; } } else if (CubeFlagService.IsYFlag(rotationLayer)) { if (rotationLayer == CubeFlag.BottomLayer) { direction = !direction; } if (!direction && !IsYFlag(flag)) { flag = CubeFlagService.GetOppositeFlag(flag); } switch (flag) { case CubeFlag.FrontSlice: nextFlag = CubeFlag.LeftSlice; break; case CubeFlag.MiddleSlice: nextFlag = CubeFlag.MiddleSliceSides; break; case CubeFlag.BackSlice: nextFlag = CubeFlag.RightSlice; break; case CubeFlag.LeftSlice: nextFlag = CubeFlag.BackSlice; break; case CubeFlag.MiddleSliceSides: nextFlag = CubeFlag.MiddleSlice; break; case CubeFlag.RightSlice: nextFlag = CubeFlag.FrontSlice; break; default: nextFlag = flag; break; } } else if (CubeFlagService.IsZFlag(rotationLayer)) { if (rotationLayer == CubeFlag.BackSlice) { direction = !direction; } if (!direction && !IsZFlag(flag)) { flag = CubeFlagService.GetOppositeFlag(flag); } switch (flag) { case CubeFlag.TopLayer: nextFlag = CubeFlag.RightSlice; break; case CubeFlag.MiddleLayer: nextFlag = CubeFlag.MiddleSliceSides; break; case CubeFlag.BottomLayer: nextFlag = CubeFlag.LeftSlice; break; case CubeFlag.LeftSlice: nextFlag = CubeFlag.TopLayer; break; case CubeFlag.MiddleSliceSides: nextFlag = CubeFlag.MiddleLayer; break; case CubeFlag.RightSlice: nextFlag = CubeFlag.BottomLayer; break; default: nextFlag = flag; break; } } } return(CubeFlagService.ExceptFlag(nextFlag, CubeFlag.None)); }