/// <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); }
/// <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()); }
/// <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(); }