/// <summary> /// Transforms the layer move /// </summary> /// <param name="rotationLayer">Transformation layer</param> /// <returns>Transformed layer move</returns> public IMove Transform(CubeFlag rotationLayer) { bool switchDir = CubeFlagService.IsYFlag(rotationLayer) && this.Layer.HasFlag(CubeFlag.MiddleSlice) || CubeFlagService.IsXFlag(rotationLayer) && this.Layer.HasFlag(CubeFlag.MiddleLayer) || CubeFlagService.IsZFlag(rotationLayer) && this.Layer.HasFlag(CubeFlag.MiddleSliceSides); LayerMove newMove = new LayerMove(CubeFlagService.NextCubeFlag(this.Layer, rotationLayer, true), this.Direction ^ switchDir, this.Twice); return(newMove); }
/// <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)); }