Esempio n. 1
0
        private void createSampleHand(int handSize, CardRepository cardRepository)
        {
            SampleHand.Clear();

            Shuffle();

            for (int i = 0; i < handSize; i++)
            {
                draw(cardRepository);
            }

            SampleHand.SetOrder(SampleHand.CardsIds
                                .OrderBy(id => cardRepository.CardsById[id].Cmc)
                                .ThenBy(id => cardRepository.CardsById[id].TypeEn)
                                .ThenBy(id => cardRepository.CardsById[id].Color)
                                .ToList());

            lock (DataSource)
            {
                DataSource.Clear();
                DataSource.AddRange(SampleHand.CardsIds.Select(id => cardRepository.CardsById[id]));
            }

            DeckChanged?.Invoke(
                listChanged: true,
                countChanged: true,
                card: null,
                touchedChanged: false,
                changedZone: CurrentZone,
                changeTerminatesBatch: true);
        }
Esempio n. 2
0
        public void LoadDeck(CardRepository cardRepository)
        {
            if (!cardRepository.IsLoadingComplete.Signaled)
            {
                return;
            }

            lock (DataSource)
            {
                DataSource.Clear();

                Card getCard(string id) =>
                cardRepository.CardsById[id];

                if (CurrentZone.HasValue)
                {
                    DataSource.AddRange(Deck.CardsIds.Select(getCard));
                }
                else
                {
                    DataSource.AddRange(MainDeck.CardsIds.Union(SideDeck.CardsIds).Union(MaybeDeck.CardsIds).Select(getCard));
                }
            }

            DeckChanged?.Invoke(
                listChanged: true,
                countChanged: true,
                card: null,
                touchedChanged: false,
                changedZone: CurrentZone,
                changeTerminatesBatch: true);
        }
Esempio n. 3
0
        public void Draw(CardRepository cardRepository)
        {
            if (!cardRepository.IsLoadingComplete.Signaled || CurrentZone != Zone.SampleHand)
            {
                return;
            }

            var drawn = draw(cardRepository);

            if (drawn == null)
            {
                return;
            }

            TouchedCard = drawn;

            lock (DataSource)
                if (!DataSource.Contains(drawn))
                {
                    DataSource.Add(drawn);
                }

            DeckChanged?.Invoke(
                listChanged: SampleHand.GetCount(drawn.Id) == 1,
                countChanged: true,
                card: drawn,
                touchedChanged: true,
                changedZone: CurrentZone,
                changeTerminatesBatch: true);
        }
Esempio n. 4
0
        public void ApplyReorder(Card cardDragged, Card cardBelowDragged)
        {
            // possible if some keyboard shortcuts (e.g. undo / redo or paste)
            // modified the deck while dragging the card
            if (!Deck.Contains(cardDragged))
            {
                return;
            }

            var cards   = getReorderedCards(cardDragged, cardBelowDragged);
            var cardIds = getReorderedIds(cardDragged, cardBelowDragged);

            lock (DataSource)
            {
                DataSource.Clear();
                DataSource.AddRange(cards);
            }

            Deck.SetOrder(cardIds);

            DeckChanged?.Invoke(
                listChanged: true,
                countChanged: false,
                card: null,
                touchedChanged: false,
                changedZone: CurrentZone,
                changeTerminatesBatch: true);
        }
Esempio n. 5
0
        public void Clear()
        {
            switch (CurrentZone)
            {
            case Zone.SampleHand:
                SampleHand.Clear();
                break;

            case Zone.Side:
                SideDeck.Clear();
                break;

            case Zone.Main:
                MainDeck.Clear();
                SideDeck.Clear();
                break;

            default:
                return;
            }

            lock (DataSource)
                DataSource.Clear();

            DeckChanged?.Invoke(
                listChanged: true,
                countChanged: true,
                card: null,
                touchedChanged: false,
                changedZone: CurrentZone,
                changeTerminatesBatch: true);
        }
Esempio n. 6
0
        public void Add(Card card, int increment, Card at = null, Zone?zone = null, bool changeTerminatesBatch = true)
        {
            var specificZone = zone ?? CurrentZone ?? Zone.Main;
            var deckZone     = getDeckZone(specificZone);

            int previousCount = deckZone.GetCount(card.Id);

            var count = (previousCount + increment)
                        .WithinRange(
                card.MinCountInDeck(),
                card.MaxCountInDeck());

            if (increment > 0)
            {
                add(card, at, newCount: count, zone: specificZone);
            }
            else if (increment < 0)
            {
                remove(card, newCount: count, zone: specificZone);
            }

            var previousTouchedCard = TouchedCard;

            // reducing the amount of cards in deck when there is already 0 leads to removing last touched mark from card
            if (previousCount == 0 && increment < 0)
            {
                TouchedCard = null;
            }
            else
            {
                TouchedCard = card;
            }

            bool listChanged    = previousCount == 0 || GetCount(card) == 0;
            bool countChanged   = previousCount != GetCount(card);
            bool touchedChanged = previousTouchedCard != TouchedCard;

            DeckChanged?.Invoke(
                listChanged,
                countChanged,
                card,
                touchedChanged,
                CurrentZone,
                changeTerminatesBatch);
        }
Esempio n. 7
0
        public void Add(Card card, int increment, Zone?zone = null, bool changeTerminatesBatch = true)
        {
            var specificZone = zone ?? Zone;
            var deckZone     = getDeckZone(specificZone);

            int previousCount = deckZone.GetCount(card.Id);

            var count = (previousCount + increment)
                        .WithinRange(
                card.MinCountInDeck(),
                card.MaxCountInDeck());

            if (increment > 0)
            {
                add(card, newCount: count, zone: specificZone);
            }
            else if (increment < 0)
            {
                remove(card, newCount: count, zone: specificZone);
            }

            var previousTouchedCard = TouchedCard;

            // уменьшение количества карты, которой в колоде уже 0 приводит к снятию отметки о последнем прикосновении
            if (previousCount == 0 && increment < 0)
            {
                TouchedCard = null;
            }
            else
            {
                TouchedCard = card;
            }

            bool listChanged    = previousCount == 0 || GetCount(card) == 0;
            bool countChanged   = previousCount != GetCount(card);
            bool touchedChanged = previousTouchedCard != TouchedCard;

            DeckChanged?.Invoke(
                listChanged,
                countChanged,
                card,
                touchedChanged,
                Zone,
                changeTerminatesBatch);
        }
Esempio n. 8
0
        public void LoadDeck(CardRepository cardRepository)
        {
            if (!cardRepository.IsLoadingComplete)
            {
                return;
            }

            lock (DataSource)
            {
                DataSource.Clear();
                DataSource.AddRange(Deck.CardsIds.Select(id => cardRepository.CardsById[id]));
            }

            DeckChanged?.Invoke(
                listChanged: true,
                countChanged: true,
                card: null,
                touchedChanged: false,
                changedZone: Zone,
                changeTerminatesBatch: true);
        }