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