Beispiel #1
0
        /// <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));
        }