Beispiel #1
0
        /// <summary>
        /// The affected stickers for a particular slice mask.
        /// There is one sticker list per slice.
        /// </summary>
        public List <StickerList> AffectedStickersForSliceMask(int mask)
        {
            if (Earthquake)
            {
                return(AffectedStickers);
            }

            List <StickerList> result = new List <StickerList>();

            foreach (int slice in SliceMask.MaskToSlices(mask))
            {
                if (slice > AffectedStickers.Count)
                {
                    continue;
                }
                result.Add(AffectedStickers[slice - 1]);
            }
            return(result);
        }
Beispiel #2
0
        /// <summary>
        /// Grabs all the circles the apply to a given slicemask.
        /// </summary>
        public CircleNE[] CirclesForSliceMask(int mask)
        {
            // For earthquake puzzles, return all circles for now.
            if (Earthquake)
            {
                return(Circles);
            }

            int        count   = this.Circles.Length;
            List <int> indexes = new List <int>();

            foreach (int slice in SliceMask.MaskToSlices(mask))
            {
                if (slice > NumSlices)
                {
                    continue;
                }

                int index1 = slice - 2;
                if (index1 >= 0 && index1 < count)
                {
                    indexes.Add(index1);
                }

                int index2 = slice - 1;
                if (index2 >= 0 && index2 < count)
                {
                    indexes.Add(index2);
                }
            }

            indexes = indexes.Distinct().ToList();
            indexes.Sort();
            List <CircleNE> result = new List <CircleNE>();

            foreach (int i in indexes)
            {
                result.Add(this.Circles[i]);
            }
            return(result.ToArray());
        }
Beispiel #3
0
        /// <summary>
        /// Scramble.
        /// </summary>
        /// <param name="numTwists"></param>
        public void Scramble(int numTwists)
        {
            System.Random rand = new System.Random();
            List <IdentifiedTwistData> allTwistData = m_puzzle.AllTwistData;

            if (allTwistData.Count == 0)
            {
                return;
            }

            bool earthquake = m_puzzle.Config.Earthquake;

            for (int i = 0; i < numTwists; i++)
            {
                m_currentTwist = new SingleTwist();
                m_currentTwist.IdentifiedTwistData = allTwistData[rand.Next(allTwistData.Count)];
                m_currentTwist.LeftClick           = rand.Next(2) == 1;

                // Try to avoid repeats of last (suggested by Melinda).
                IdentifiedTwistData last = m_twistHistory.AllTwists.Count == 0 ? null : m_twistHistory.AllTwists.Last().IdentifiedTwistData;
                if (last != null && allTwistData.Count > 2)
                {
                    while (last == m_currentTwist.IdentifiedTwistData)
                    {
                        m_currentTwist.IdentifiedTwistData = allTwistData[rand.Next(allTwistData.Count)];
                    }
                }
                else
                {
                    m_currentTwist.IdentifiedTwistData = allTwistData[rand.Next(allTwistData.Count)];
                }

                TwistData td          = m_currentTwist.IdentifiedTwistData.TwistDataForStateCalcs.First();
                int       numSlices   = td.NumSlices;
                int       randomSlice = rand.Next(numSlices);
                if (!earthquake)
                {
                    randomSlice += 1;
                }
                m_currentTwist.SliceMask = SliceMask.SliceToMask(randomSlice);

                if (earthquake)
                {
                    int       choppedSeg   = m_currentTwist.SliceMask * 2;
                    Vector3D  lookup       = td.Pants.TinyOffset(choppedSeg);
                    Vector3D  reflected    = td.Pants.Hexagon.Segments[choppedSeg].ReflectPoint(lookup);
                    TwistData tdEarthQuake = m_puzzle.ClosestTwistingCircles(reflected);

                    m_currentTwist.IdentifiedTwistDataEarthquake = tdEarthQuake.IdentifiedTwistData;

                    // Fix scrambing here.
                    m_currentTwist.SliceMaskEarthquake = tdEarthQuake.Pants.Closest(reflected) / 2;
                }

                // Apply the twist.
                FinishRotate(updateStatus: false);
            }

            m_twistHistory.Scrambles += numTwists;

            InvalidateAllAndUpdateStatus();
        }