public static List <Card> GetOpeningCards(long state, bool player, bool noRare = false)
        {
            int zellCard  = 105;
            int rareLimit = 10;

            int[] levels = { 1, 2, 4, 5 };


            CardRng     cardRng = new CardRng(state, SearchType.First);
            List <Card> cards   = new List <Card>();

            List <Card> allCards = CreateCardTable();

            if (cardRng.State % 100 < rareLimit)
            {
                cards.Add(allCards.Single(s => s.ID == zellCard));
            }

            while (cards.Count < 5)
            {
                int  level = levels[cardRng.State % levels.Length];
                long row1  = cardRng.State % 11;
                cardRng.GetNextState();
                long cardIndex = (level - 1) * 11 + row1;
                cards.Add(allCards.Single(s => s.ID == cardIndex));
            }


            return(cards);
        }
        public static CardRng BeginManip(string[] args)
        {
            ParseArguments(args);
            CardRng rng = new CardRng(InputArguments.FirstState.ToInitialState(), args.Length > 1 ? SearchType.First : SearchType.Recovery);

            if (args.Length > 1)
            {
                for (int i = 0; i < InputArguments.Count; i++)
                {
                    rng.GetNextState();
                }
            }

            StartScan(rng.State, SearchType.Counting);

            return(rng);
        }
        public static List <CardFormation> CreateOpeningTable(long from, long to, QuistisPattern pattern, SearchType type = SearchType.First, int increment = 0)
        {
            long size = to + 1;

            List <long> rngStateArray = new List <long>();

            switch (type)
            {
            case SearchType.First:
                //CardRng cardRng = new CardRng(null, SearchType.First);
                break;

            case SearchType.Counting:
                CardRng cardRng  = new CardRng(pattern.ToInitialState(), SearchType.Counting);
                long    maxIndex = InputArguments.Count.Value + Settings.CountingWidth;

                for (int i = 0; i < maxIndex; i++)
                {
                    cardRng.GetNextState();
                    rngStateArray.Add(cardRng.State + increment);
                }
                break;
            }

            int[] offsetArray = new int[Settings.CountingWidth];
            switch (type)
            {
            case SearchType.Counting:
                offsetArray = new int[Settings.CountingWidth];
                for (int i = 0; i < offsetArray.Length; i++)
                {
                    offsetArray[i] = i - Settings.CountingWidth / 2;
                }
                break;
            }



            int index = -1;
            List <CardFormation> formations = new List <CardFormation>();

            for (int i = 0; i <= to; i++)
            {
                if (i < from || i > to)
                {
                    continue;
                }

                foreach (int offset in offsetArray)
                {
                    var rngState = (rngStateArray[i] + offset) & 0xffff_ffff;
                    formations.Add(new CardFormation
                    {
                        Cards  = GetOpeningCards(rngState, true),
                        Index  = index,
                        Offset = offset
                    });
                }
            }

            //foreach (int offset in offsetArray)
            //{
            //    index++;
            //    long rngState = rngStateArray[index] + offset & 0xffff_ffff;
            //    formations.Add(new CardFormation
            //    {
            //        Cards = GetOpeningCards(rngState, true),
            //        Index = index,
            //        Offset = offset
            //    });
            //}



            return(formations);
        }