示例#1
0
        public IDeck Transform(IDeck input)
        {
            Deck result = new Deck();

            ICardEdition minimal = cardDb.Editions.First();

            foreach (var c in input.Sections.SelectMany(s => input[s]))
            {
                var minEd = cardDb.GetEarliestEditionOfCard(c.Name);
                if (minEd.CompareTo(minimal) > 0)
                {
                    minimal = minEd;
                }
            }

            foreach (var s in input.Sections)
            {
                var sa = result.EnsureSection(s);
                foreach (var c in input[s])
                {
                    sa.Add(cardDb.CardByName(c.Name, cardDb.GetLatestEditionForCard(c.Name, minimal)));
                }
            }


            return(result);
        }
示例#2
0
        static MtgJsonReaderTest_M10()
        {
            Dictionary <string, ICardRules> rules = new Dictionary <string, ICardRules>();
            MtgJsonSetReader reader = new MtgJsonSetReader(GetPathForEdition("M10"), rules);

            cards   = reader.Cards.ToArray();
            edition = reader.Edition;
        }
示例#3
0
 public ICardEdition GetLatestEditionForCard(string name, ICardEdition latestAllowedEdition = null)
 {
     if (!CardPrintingsByName.TryGetValue(name, out List <ICardEdition> list))
     {
         return(null);
     }
     return(latestAllowedEdition == null?list.Last() : list.Last(l => l.CompareTo(latestAllowedEdition) <= 0));
 }
        private void RemoveFromReferential(ICardInCollectionCount cardInCollectionCount)
        {
            //No call to private ICardEdition GetCardEdition(int idGatherer) because call in CheckReferentialLoaded()
            ICardEdition cardEdition = _cardEditions.GetOrDefault(cardInCollectionCount.IdGatherer);

            if (_allCardInCollectionCount.TryGetValue(cardEdition.IdCard, out IList <ICardInCollectionCount> list))
            {
                list.Remove(cardInCollectionCount);
            }
        }
        private void InsertInReferential(ICardEdition cardEdition)
        {
            if (_fakeGathererId > cardEdition.IdGatherer)
            {
                _fakeGathererId = cardEdition.IdGatherer;
            }

            _cardEditions.Add(cardEdition.IdGatherer, cardEdition);
            _cacheForAllDbInfos = null;
        }
示例#6
0
        public IEdition GetEdition(int idGatherer)
        {
            using (new ReaderLock(_lock))
            {
                ICardEdition cardEdition = GetCardEdition(idGatherer);
                if (cardEdition == null)
                {
                    return(null);
                }

                return(_editions.FirstOrDefault(e => e.Id == cardEdition.IdEdition));
            }
        }
示例#7
0
        public ICard GetCard(int idGatherer)
        {
            using (new ReaderLock(_lock))
            {
                ICardEdition cardEdition = GetCardEdition(idGatherer);
                if (cardEdition == null)
                {
                    return(null);
                }

                return(_cardsbyId.GetOrDefault(cardEdition.IdCard));
            }
        }
        private ICardInCollectionCount GetCardCollection(int idCollection, int idGatherer, int idLanguage)
        {
            using (new ReaderLock(_lock))
            {
                ICardEdition cardEdition = GetCardEdition(idGatherer);

                if (_allCardInCollectionCount.TryGetValue(cardEdition.IdCard, out IList <ICardInCollectionCount> list))
                {
                    return(list.FirstOrDefault(cicc => cicc.IdCollection == idCollection && cicc.IdGatherer == idGatherer && cicc.IdLanguage == idLanguage));
                }
                return(null);
            }
        }
        private ICollection <ICardInCollectionCount> GetCardCollection(int idCollection, int idGatherer)
        {
            using (new ReaderLock(_lock))
            {
                ICardEdition cardEdition = GetCardEdition(idGatherer);

                if (_allCardInCollectionCount.TryGetValue(cardEdition.IdCard, out IList <ICardInCollectionCount> list))
                {
                    return(list.Where(cicc => cicc.IdCollection == idCollection && cicc.IdGatherer == idGatherer).ToArray());
                }
                return(null);
            }
        }
示例#10
0
        public int GetIdGatherer(ICard card, IEdition edition)
        {
            if (card == null || edition == null)
            {
                return(0);
            }

            CheckReferentialLoaded();
            using (new ReaderLock(_lock))
            {
                ICardEdition cardEdition = _cardEditions.Values.FirstOrDefault(ce => ce.IdCard == card.Id && ce.IdEdition == edition.Id);
                return(cardEdition == null ? 0 : cardEdition.IdGatherer);
            }
        }
示例#11
0
        public IEnumerable <IPrintedCard> CardsByName(string name, int amount, string code = null)
        {
            ICardEdition edition = code == null?GetLatestEditionForCard(name) : GetEditionByCode(code);

            if (null == edition || !CardsInEdition[edition].TryGetValue(name, out List <IPrintedCard> list))
            {
                throw new KeyNotFoundException("Card not found in database: " + name + " | " + code);
            }
            int len = list.Count;

            for (int i = 0; i < amount; i++)
            {
                yield return(list[selectVariant.Next(len)]);
            }
        }
示例#12
0
        private void InsertInReferential(ICardInCollectionCount cardInCollectionCount)
        {
            //No call to private ICardEdition GetCardEdition(int idGatherer) because call in CheckReferentialLoaded()
            ICardEdition cardEdition = _cardEditions.GetOrDefault(cardInCollectionCount.IdGatherer);

            if (!_allCardInCollectionCount.TryGetValue(cardEdition.IdCard, out IList <ICardInCollectionCount> list))
            {
                list = new List <ICardInCollectionCount>();
                _allCardInCollectionCount.Add(cardEdition.IdCard, list);
            }

            if (list.Contains(cardInCollectionCount))
            {
                throw new Exception("Invalid addition");
            }

            list.Add(cardInCollectionCount);
        }
示例#13
0
        public IPrintedCard CardByName(string name, ICardEdition edition, int index = -1)
        {
            if (null == edition)
            {
                return(null);
            }

            if (!CardsInEdition[edition].TryGetValue(name, out List <IPrintedCard> list))
            {
                return(null);
            }
            if (index < 0)
            {
                index = selectVariant.Next(list.Count);
            }
            else
            {
                index = index % list.Count;
            }
            return(list[index]);
        }
示例#14
0
        //Ensembly Get
        public ICollection <ICardAllDbInfo> GetAllInfos(int onlyInCollectionId = -1)
        {
            CheckReferentialLoaded();

            using (new ReaderLock(_lock))
            {
                ICollection <ICardInCollectionCount> collection = null;
                if (onlyInCollectionId != -1)
                {
                    collection = GetCardCollection(onlyInCollectionId);
                }

                if (collection == null && _cacheForAllDbInfos != null)
                {
                    //No filter and no change since last call but recalculate statistics
                    foreach (CardAllDbInfo cardAllDbInfo in _cacheForAllDbInfos.Cast <CardAllDbInfo>())
                    {
                        cardAllDbInfo.SetStatistics(GetCardCollectionStatistics(cardAllDbInfo.Card));
                    }

                    return(_cacheForAllDbInfos.AsReadOnly());
                }

                List <ICardAllDbInfo> ret = new List <ICardAllDbInfo>();
                foreach (ICardEdition cardEdition in _cardEditions.Values)
                {
                    CardAllDbInfo cardAllDbInfo = new CardAllDbInfo();
                    if (collection != null)
                    {
                        if (collection.All(cicc => cicc.IdGatherer != cardEdition.IdGatherer))
                        {
                            continue;
                        }
                    }

                    ICardEdition edition = cardEdition;
                    ICard        card    = _cardsbyId.GetOrDefault(edition.IdCard);
                    cardAllDbInfo.Card            = card;
                    cardAllDbInfo.Edition         = _editions.FirstOrDefault(e => e.Id == edition.IdEdition);
                    cardAllDbInfo.Rarity          = _rarities.Values.FirstOrDefault(r => r.Id == edition.IdRarity);
                    cardAllDbInfo.IdGatherer      = cardEdition.IdGatherer;
                    cardAllDbInfo.IdGathererPart2 = 0;
                    IList <IPrice> prices = _prices.GetOrDefault(cardEdition.IdGatherer);
                    cardAllDbInfo.Prices = prices == null ? new List <IPrice>() : new List <IPrice>(prices);
                    cardAllDbInfo.SetStatistics(GetCardCollectionStatistics(card));
                    if (_cardEditionVariations.TryGetValue(cardEdition.IdGatherer, out IList <ICardEditionVariation> other))
                    {
                        cardAllDbInfo.VariationIdGatherers = other.Select(cev => cev.OtherIdGatherer).ToArray();
                    }
                    else
                    {
                        cardAllDbInfo.VariationIdGatherers = Array.Empty <int>();
                    }

                    cardAllDbInfo.VariationIdGatherers2 = Array.Empty <int>();

                    //For Multipart card
                    if (_multiPartCardManager.HasMultiPart(card))
                    {
                        //This is the reverse side of a recto-verso card no need to do anything
                        if (_multiPartCardManager.ShouldIgnore(card))
                        {
                            continue;
                        }
                        ICard cardPart2 = _multiPartCardManager.GetOtherPartCard(card, GetCard);
                        cardAllDbInfo.CardPart2 = cardPart2;

                        //Be sure to get the other part (Up/Down, Splitted and Adventure have the same gatherer id so no return)
                        ICardEdition cardEdition2 = _cardEditions.Values.FirstOrDefault(ce => ce.IdEdition == edition.IdEdition && ce.IdCard == cardPart2.Id && ce.IdGatherer != edition.IdGatherer);

                        //Verso of Reserse Card and Multi-card
                        if (cardEdition2 != null)
                        {
                            cardAllDbInfo.IdGathererPart2 = cardEdition2.IdGatherer;
                            if (_cardEditionVariations.TryGetValue(cardEdition2.IdGatherer, out IList <ICardEditionVariation> other2))
                            {
                                cardAllDbInfo.VariationIdGatherers2 = other2.Select(cev => cev.OtherIdGatherer).ToArray();
                            }
                        }
                    }

                    ret.Add(cardAllDbInfo);
                }

                //Push in cache in no filter
                if (collection == null)
                {
                    _cacheForAllDbInfos = ret;
                }

                return(ret.AsReadOnly());
            }
        }
示例#15
0
 public IEnumerable <IPrintedCard> CardsByEdition(ICardEdition edition)
 {
     return(edition == null || CardsInEdition.TryGetValue(edition, out MultiMap <string, IPrintedCard> cards) ? Enumerable.Empty <IPrintedCard>() : cards.ManyValues);
 }
示例#16
0
        public IPrintedCard CardByName(string name, string code = null)
        {
            ICardEdition edition = code == null?GetLatestEditionForCard(name) : GetEditionByCode(code);

            return(CardByName(name, edition));
        }