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