Exemplo n.º 1
0
        public static string GetCodeFromDeck(List <CardCodeAndCount> deck)
        {
            string result = Base32.Encode(GetDeckCodeBytes(deck));

            return(result);
        }
Exemplo n.º 2
0
        public static List <CardCodeAndCount> GetDeckFromCode(string code)
        {
            List <CardCodeAndCount> result = new List <CardCodeAndCount>();

            byte[] bytes = null;
            try
            {
                bytes = Base32.Decode(code);
            }
            catch
            {
                throw new ArgumentException("Invalid deck code");
            }

            List <byte> byteList = bytes.ToList();

            //grab format and version
            int format  = bytes[0] >> 4;
            int version = bytes[0] & 0xF;

            byteList.RemoveAt(0);

            if (version > MAX_KNOWN_VERSION)
            {
                throw new ArgumentException("The provided code requires a higher version of this library; please update.");
            }

            for (int i = 3; i > 0; i--)
            {
                int numGroupOfs = VarintTranslator.PopVarint(byteList);

                for (int j = 0; j < numGroupOfs; j++)
                {
                    int numOfsInThisGroup = VarintTranslator.PopVarint(byteList);
                    int set     = VarintTranslator.PopVarint(byteList);
                    int faction = VarintTranslator.PopVarint(byteList);

                    for (int k = 0; k < numOfsInThisGroup; k++)
                    {
                        int card = VarintTranslator.PopVarint(byteList);

                        string setString     = set.ToString().PadLeft(2, '0');
                        string factionString = IntIdentifierToFactionCode[faction];
                        string cardString    = card.ToString().PadLeft(3, '0');

                        CardCodeAndCount newEntry = new CardCodeAndCount()
                        {
                            CardCode = setString + factionString + cardString, Count = i
                        };
                        result.Add(newEntry);
                    }
                }
            }

            //the remainder of the deck code is comprised of entries for cards with counts >= 4
            //this will only happen in Limited and special game modes.
            //the encoding is simply [count] [cardcode]
            while (byteList.Count > 0)
            {
                int fourPlusCount   = VarintTranslator.PopVarint(byteList);
                int fourPlusSet     = VarintTranslator.PopVarint(byteList);
                int fourPlusFaction = VarintTranslator.PopVarint(byteList);
                int fourPlusNumber  = VarintTranslator.PopVarint(byteList);

                string fourPlusSetString     = fourPlusSet.ToString().PadLeft(2, '0');
                string fourPlusFactionString = IntIdentifierToFactionCode[fourPlusFaction];
                string fourPlusNumberString  = fourPlusNumber.ToString().PadLeft(3, '0');

                CardCodeAndCount newEntry = new CardCodeAndCount()
                {
                    CardCode = fourPlusSetString + fourPlusFactionString + fourPlusNumberString, Count = fourPlusCount
                };
                result.Add(newEntry);
            }

            return(result);
        }
Exemplo n.º 3
0
 public static string GetCodeFromDeck(IEnumerable <CardCodeAndCount> deck)
 {
     return(Base32.Encode(GetDeckCodeBytes(deck)));
 }