Exemple #1
0
		public void AddRange(Player player, IEnumerable<Card> cardCollection, DeckPosition deckPosition)
		{
			switch (deckPosition)
			{
				case DeckPosition.Top:
					_Cards.InsertRange(0, cardCollection.Reverse());
					break;
				case DeckPosition.Bottom:
					_Cards.AddRange(cardCollection);
					break;
			}
			this.Sort();

			if (cardCollection.Count() > 0)
			{
				if (_AsynchronousChanging)
				{
					if (_AsynchronousPileChangedEventArgs == null)
						_AsynchronousPileChangedEventArgs = new PileChangedEventArgs(player, PileChangedEventArgs.Operation.Added, cardCollection);
					else
						_AsynchronousPileChangedEventArgs.AddedCards.AddRange(cardCollection);
				}
				else if (PileChanged != null)
				{
					lock (PileChanged)
					{
						PileChangedEventArgs pcea = new PileChangedEventArgs(player, PileChangedEventArgs.Operation.Added, cardCollection);
						PileChanged(this, pcea);
					}
				}
			}
		}
		internal void AddRange(Cards.CardCollection cards)
		{
			_Cards.InsertRange(0, cards);
			this.Sort();

			if (_AsynchronousChanging)
			{
				if (_AsynchronousPileChangedEventArgs == null)
					_AsynchronousPileChangedEventArgs = new PileChangedEventArgs(null, PileChangedEventArgs.Operation.Added, cards);
				else
					_AsynchronousPileChangedEventArgs.AddedCards.AddRange(cards);
			}
			else if (PileChanged != null)
			{
				PileChangedEventArgs pcea = new PileChangedEventArgs(null, PileChangedEventArgs.Operation.Added, cards);
				PileChanged(this, pcea);
			}
		}
		void DiscardPile_PileChanged_CaptureLostTrack(object sender, PileChangedEventArgs e)
		{
			if (e.OperationPerformed == PileChangedEventArgs.Operation.Reset)
				return;
			List<Card> cards = new List<Card>(_LostTrackStack.Keys);
			foreach (Card card in cards)
			{
				// Check to see if the card we're tracking is available (we can only look at the top card)
				// If it isn't the top card, then we've lost track of it.
				if (!_LostTrackStack[card] && this.DiscardPile[c => c == card].Count == 0)
					_LostTrackStack[card] = true;
			}
		}
		private void _Player_PileChanged(object sender, PileChangedEventArgs e)
		{
			if (this.Dispatcher.CheckAccess())
			{

				// This sometimes has an Enumeration exception -- can't figure out how to Lock it properly
				if (e.Player != null)
					try { lVictoryPoints.Content = e.Player.VictoryPoints.ToString(); }
					catch { lVictoryPoints.Content = "0"; }

				Deck deck = sender as Deck;
				Boolean visible = this.IsUIPlayer || (e.Player != null && e.Player.Phase == DominionBase.Players.PhaseEnum.Endgame);

				switch (deck.DeckLocation)
				{
					case DeckLocation.Hand:
						cardHand.ExactCount = true;
						cardHand.IsCardsVisible = visible;
						cardHand.Phase = e.Player.Phase;
						cardHand.PlayerMode = e.Player.PlayerMode;
						cardHand.CardSize = e.Player.Phase == PhaseEnum.Endgame ? CardSize.Text : CardSize.Medium;
						cardHand.IsVPsVisible = e.Player.Phase == PhaseEnum.Endgame ? true : false;
						cardHand.Pile = deck;
						if (visible)
							svPlayerDisplay.ScrollToTop();
						break;

					case DeckLocation.Revealed:
						cardRevealed.ExactCount = true;
						cardRevealed.IsCardsVisible = true;
						cardRevealed.Phase = PhaseEnum.Action;
						cardRevealed.PlayerMode = PlayerMode.Waiting;
						cardRevealed.CardSize = CardSize.Small;
						if (e.Player.Revealed.Count > 0)
							bInPlayRevealedDivider.Visibility = cardRevealed.Visibility = System.Windows.Visibility.Visible;
						else
							bInPlayRevealedDivider.Visibility = cardRevealed.Visibility = System.Windows.Visibility.Collapsed;
						cardRevealed.Pile = deck;
						break;

					case DeckLocation.InPlay:
						cardInPlay.ExactCount = true;
						cardInPlay.IsCardsVisible = true;
						cardInPlay.Phase = PhaseEnum.Action;
						cardInPlay.PlayerMode = PlayerMode.Waiting;
						cardInPlay.CardSize = CardSize.Small;
						cardInPlay.Pile = deck;
						if (e.Player.PlayerUniqueId != _Player.UniqueId && e.Player.Phase != DominionBase.Players.PhaseEnum.Endgame)
							svPlayerDisplay.ScrollToVerticalOffset(cardHand.ActualHeight + cardDiscard.ActualHeight);

						break;

					case DeckLocation.SetAside:
						cardSetAside.ExactCount = true;
						cardSetAside.IsCardsVisible = true;
						cardSetAside.Phase = PhaseEnum.Action;
						cardSetAside.PlayerMode = PlayerMode.Waiting;
						cardSetAside.CardSize = CardSize.Small;
						if (deck.Count > 0)
							bSetAsideDivider.Visibility = cardSetAside.Visibility = System.Windows.Visibility.Visible;
						else
							bSetAsideDivider.Visibility = cardSetAside.Visibility = System.Windows.Visibility.Collapsed;
						cardSetAside.Pile = deck;

						break;

					case DeckLocation.Deck:
						cardDeck.ExactCount = this.IsUIPlayer;
						cardDeck.IsCardsVisible = false;
						cardDeck.Phase = PhaseEnum.Action;
						cardDeck.PlayerMode = PlayerMode.Waiting;
						cardDeck.CardSize = CardSize.Small;
						cardDeck.Pile = deck;
						break;

					case DeckLocation.Discard:
						cardDiscard.ExactCount = false;
						cardDiscard.IsCardsVisible = true;
						cardDiscard.Phase = PhaseEnum.Action;
						cardDiscard.PlayerMode = PlayerMode.Waiting;
						cardDiscard.CardSize = CardSize.Small;
						if (e.Player.DiscardPile.Count > 0)
							bDeckDiscardDivider.Visibility = cardDiscard.Visibility = System.Windows.Visibility.Visible;
						else
							bDeckDiscardDivider.Visibility = cardDiscard.Visibility = System.Windows.Visibility.Collapsed;
						cardDiscard.Pile = deck;
						break;

					case DeckLocation.Private:
						cardPrivate.ExactCount = true;
						cardPrivate.IsCardsVisible = visible;
						cardPrivate.Phase = PhaseEnum.Action;
						cardPrivate.PlayerMode = PlayerMode.Waiting;
						cardPrivate.CardSize = CardSize.Small;
						if (e.Player.Private.Count > 0)
							bRevealedLookingAtDivider.Visibility = cardPrivate.Visibility = System.Windows.Visibility.Visible;
						else
							bRevealedLookingAtDivider.Visibility = cardPrivate.Visibility = System.Windows.Visibility.Collapsed;
						cardPrivate.Pile = deck;
						break;

					case DeckLocation.PlayerMat:

						if (sender.GetType() == DominionBase.Cards.Seaside.TypeClass.IslandMat)
						{
							CardCollectionControl cccIsland = dpMatsandPiles.Children.OfType<CardCollectionControl>().SingleOrDefault(ccc => ccc.Name == "cardIsland");
							if (cccIsland == null)
							{
								if (dpMatsandPiles.Children.Count > 0)
								{
									Border bDiv = new Border();
									bDiv.BorderThickness = new Thickness(2);
									bDiv.BorderBrush = Brushes.Black;
									DockPanel.SetDock(bDiv, Dock.Left);
									dpMatsandPiles.Children.Add(bDiv);
								}
								cccIsland = new CardCollectionControl();
								cccIsland.Name = "cardIsland";
								cccIsland.Padding = new Thickness(0);
								DockPanel.SetDock(cccIsland, Dock.Left);
								//cccIsland.Background = Brushes.AliceBlue;
								cccIsland.PileName = "Island Mat";
								cccIsland.CardSize = CardSize.Text;
								dpMatsandPiles.Children.Add(cccIsland);
							}
							cccIsland.ExactCount = true;
							cccIsland.IsCardsVisible = true;
							cccIsland.Phase = PhaseEnum.Action;
							cccIsland.PlayerMode = PlayerMode.Waiting;
							cccIsland.Pile = deck;
						}
						else if (sender.GetType() == DominionBase.Cards.Seaside.TypeClass.NativeVillageMat)
						{
							CardCollectionControl cccNativeVillage = dpMatsandPiles.Children.OfType<CardCollectionControl>().SingleOrDefault(ccc => ccc.Name == "cardNativeVillage");
							if (cccNativeVillage == null)
							{
								if (dpMatsandPiles.Children.Count > 0)
								{
									Border bDiv = new Border();
									bDiv.BorderThickness = new Thickness(2);
									bDiv.BorderBrush = Brushes.Black;
									DockPanel.SetDock(bDiv, Dock.Left);
									dpMatsandPiles.Children.Add(bDiv);
								}
								cccNativeVillage = new CardCollectionControl();
								cccNativeVillage.Name = "cardNativeVillage";
								cccNativeVillage.Padding = new Thickness(0);
								DockPanel.SetDock(cccNativeVillage, Dock.Left);
								//cccNativeVillage.Background = Brushes.AliceBlue;
								cccNativeVillage.PileName = "Native Village Mat";
								cccNativeVillage.CardSize = CardSize.Text;
								dpMatsandPiles.Children.Add(cccNativeVillage);
							}
							cccNativeVillage.ExactCount = true;
							cccNativeVillage.IsCardsVisible = visible;
							cccNativeVillage.Phase = PhaseEnum.Action;
							cccNativeVillage.PlayerMode = PlayerMode.Waiting;
							cccNativeVillage.Pile = deck;
						}
						else if (sender.GetType() == DominionBase.Cards.Promotional.TypeClass.PrinceSetAside)
						{
							CardCollectionControl cccPrinceSetAside = dpMatsandPiles.Children.OfType<CardCollectionControl>().SingleOrDefault(ccc => ccc.Name == "cardPrinceSetAside");
							if (cccPrinceSetAside == null)
							{
								if (dpMatsandPiles.Children.Count > 0)
								{
									Border bDiv = new Border();
									bDiv.BorderThickness = new Thickness(2);
									bDiv.BorderBrush = Brushes.Black;
									DockPanel.SetDock(bDiv, Dock.Left);
									dpMatsandPiles.Children.Add(bDiv);
								}
								cccPrinceSetAside = new CardCollectionControl();
								cccPrinceSetAside.Name = "cardPrinceSetAside";
								cccPrinceSetAside.Padding = new Thickness(0);
								DockPanel.SetDock(cccPrinceSetAside, Dock.Left);
								cccPrinceSetAside.PileName = "Set Aside";
								cccPrinceSetAside.CardSize = CardSize.Text;
								dpMatsandPiles.Children.Add(cccPrinceSetAside);
							}
							cccPrinceSetAside.ExactCount = true;
							cccPrinceSetAside.IsCardsVisible = true;
							cccPrinceSetAside.CardSize = CardSize.Small;
							cccPrinceSetAside.Phase = PhaseEnum.Action;
							cccPrinceSetAside.PlayerMode = PlayerMode.Waiting;
							cccPrinceSetAside.Pile = deck;
						}

						break;
				}
			}
			else
			{
				this.Dispatcher.BeginInvoke(new EventHandler<PileChangedEventArgs>(_Player_PileChanged), System.Windows.Threading.DispatcherPriority.Normal, sender, e);
			}
		}
		void otherPlayer_CardsHand_PileChanged(object sender, PileChangedEventArgs e)
		{
			if (e.OperationPerformed == PileChangedEventArgs.Operation.Added)
			{
				// We can add red-backed cards (Stash) to the known cards when added to a player's hand
				KnownPlayerHands[e.Player.PlayerUniqueId].AddRange(e.AddedCards.Where(c => c.CardBack == CardBack.Red));
			}
			else if (e.OperationPerformed == PileChangedEventArgs.Operation.Removed)
			{
				foreach (Card card in e.RemovedCards.Where(c => c.CardBack == CardBack.Red))
				{
					if (KnownPlayerHands[e.Player.PlayerUniqueId].Contains(card))
						KnownPlayerHands[e.Player.PlayerUniqueId].Remove(card);
				}
			}
		}
		void otherPlayer_CardsRevealed_PileChanged(object sender, PileChangedEventArgs e)
		{
			KnownPlayerHands[e.Player.PlayerUniqueId].AddRange(e.AddedCards);
		}
        private void _Player_PileChanged(object sender, PileChangedEventArgs e)
        {
            if (this.Dispatcher.CheckAccess())
            {
                // This sometimes has an Enumeration exception -- can't figure out how to Lock it properly
                if (e.Player != null)
                {
                    try { lVictoryPoints.Content = e.Player.VictoryPoints.ToString(); }
                    catch { lVictoryPoints.Content = "0"; }
                }

                Deck    deck    = sender as Deck;
                Boolean visible = this.IsUIPlayer || (e.Player != null && e.Player.Phase == DominionBase.Players.PhaseEnum.Endgame);

                switch (deck.DeckLocation)
                {
                case DeckLocation.Hand:
                    cardHand.ExactCount     = true;
                    cardHand.IsCardsVisible = visible;
                    cardHand.Phase          = e.Player.Phase;
                    cardHand.PlayerMode     = e.Player.PlayerMode;
                    cardHand.CardSize       = e.Player.Phase == PhaseEnum.Endgame ? CardSize.Text : CardSize.Medium;
                    cardHand.IsVPsVisible   = e.Player.Phase == PhaseEnum.Endgame ? true : false;
                    cardHand.Pile           = deck;
                    if (visible)
                    {
                        svPlayerDisplay.ScrollToTop();
                    }
                    break;

                case DeckLocation.Revealed:
                    cardRevealed.ExactCount     = true;
                    cardRevealed.IsCardsVisible = true;
                    cardRevealed.Phase          = PhaseEnum.Action;
                    cardRevealed.PlayerMode     = PlayerMode.Waiting;
                    cardRevealed.CardSize       = CardSize.Small;
                    if (e.Player.Revealed.Count > 0)
                    {
                        bInPlayRevealedDivider.Visibility = cardRevealed.Visibility = System.Windows.Visibility.Visible;
                    }
                    else
                    {
                        bInPlayRevealedDivider.Visibility = cardRevealed.Visibility = System.Windows.Visibility.Collapsed;
                    }
                    cardRevealed.Pile = deck;
                    break;

                case DeckLocation.InPlay:
                    cardInPlay.ExactCount     = true;
                    cardInPlay.IsCardsVisible = true;
                    cardInPlay.Phase          = PhaseEnum.Action;
                    cardInPlay.PlayerMode     = PlayerMode.Waiting;
                    cardInPlay.CardSize       = CardSize.Small;
                    cardInPlay.Pile           = deck;
                    if (e.Player.PlayerUniqueId != _Player.UniqueId && e.Player.Phase != DominionBase.Players.PhaseEnum.Endgame)
                    {
                        svPlayerDisplay.ScrollToVerticalOffset(cardHand.ActualHeight + cardDiscard.ActualHeight);
                    }

                    break;

                case DeckLocation.SetAside:
                    cardSetAside.ExactCount     = true;
                    cardSetAside.IsCardsVisible = true;
                    cardSetAside.Phase          = PhaseEnum.Action;
                    cardSetAside.PlayerMode     = PlayerMode.Waiting;
                    cardSetAside.CardSize       = CardSize.Small;
                    if (deck.Count > 0)
                    {
                        bSetAsideDivider.Visibility = cardSetAside.Visibility = System.Windows.Visibility.Visible;
                    }
                    else
                    {
                        bSetAsideDivider.Visibility = cardSetAside.Visibility = System.Windows.Visibility.Collapsed;
                    }
                    cardSetAside.Pile = deck;

                    break;

                case DeckLocation.Deck:
                    cardDeck.ExactCount     = this.IsUIPlayer;
                    cardDeck.IsCardsVisible = false;
                    cardDeck.Phase          = PhaseEnum.Action;
                    cardDeck.PlayerMode     = PlayerMode.Waiting;
                    cardDeck.CardSize       = CardSize.Small;
                    cardDeck.Pile           = deck;
                    break;

                case DeckLocation.Discard:
                    cardDiscard.ExactCount     = false;
                    cardDiscard.IsCardsVisible = true;
                    cardDiscard.Phase          = PhaseEnum.Action;
                    cardDiscard.PlayerMode     = PlayerMode.Waiting;
                    cardDiscard.CardSize       = CardSize.Small;
                    if (e.Player.DiscardPile.Count > 0)
                    {
                        bDeckDiscardDivider.Visibility = cardDiscard.Visibility = System.Windows.Visibility.Visible;
                    }
                    else
                    {
                        bDeckDiscardDivider.Visibility = cardDiscard.Visibility = System.Windows.Visibility.Collapsed;
                    }
                    cardDiscard.Pile = deck;
                    break;

                case DeckLocation.Private:
                    cardPrivate.ExactCount     = true;
                    cardPrivate.IsCardsVisible = visible;
                    cardPrivate.Phase          = PhaseEnum.Action;
                    cardPrivate.PlayerMode     = PlayerMode.Waiting;
                    cardPrivate.CardSize       = CardSize.Small;
                    if (e.Player.Private.Count > 0)
                    {
                        bRevealedLookingAtDivider.Visibility = cardPrivate.Visibility = System.Windows.Visibility.Visible;
                    }
                    else
                    {
                        bRevealedLookingAtDivider.Visibility = cardPrivate.Visibility = System.Windows.Visibility.Collapsed;
                    }
                    cardPrivate.Pile = deck;
                    break;

                case DeckLocation.PlayerMat:

                    if (sender.GetType() == DominionBase.Cards.Seaside.TypeClass.IslandMat)
                    {
                        CardCollectionControl cccIsland = dpMatsandPiles.Children.OfType <CardCollectionControl>().SingleOrDefault(ccc => ccc.Name == "cardIsland");
                        if (cccIsland == null)
                        {
                            if (dpMatsandPiles.Children.Count > 0)
                            {
                                Border bDiv = new Border();
                                bDiv.BorderThickness = new Thickness(2);
                                bDiv.BorderBrush     = Brushes.Black;
                                DockPanel.SetDock(bDiv, Dock.Left);
                                dpMatsandPiles.Children.Add(bDiv);
                            }
                            cccIsland         = new CardCollectionControl();
                            cccIsland.Name    = "cardIsland";
                            cccIsland.Padding = new Thickness(0);
                            DockPanel.SetDock(cccIsland, Dock.Left);
                            //cccIsland.Background = Brushes.AliceBlue;
                            cccIsland.PileName = "Island Mat";
                            cccIsland.CardSize = CardSize.Text;
                            dpMatsandPiles.Children.Add(cccIsland);
                        }
                        cccIsland.ExactCount     = true;
                        cccIsland.IsCardsVisible = true;
                        cccIsland.Phase          = PhaseEnum.Action;
                        cccIsland.PlayerMode     = PlayerMode.Waiting;
                        cccIsland.Pile           = deck;
                    }
                    else if (sender.GetType() == DominionBase.Cards.Seaside.TypeClass.NativeVillageMat)
                    {
                        CardCollectionControl cccNativeVillage = dpMatsandPiles.Children.OfType <CardCollectionControl>().SingleOrDefault(ccc => ccc.Name == "cardNativeVillage");
                        if (cccNativeVillage == null)
                        {
                            if (dpMatsandPiles.Children.Count > 0)
                            {
                                Border bDiv = new Border();
                                bDiv.BorderThickness = new Thickness(2);
                                bDiv.BorderBrush     = Brushes.Black;
                                DockPanel.SetDock(bDiv, Dock.Left);
                                dpMatsandPiles.Children.Add(bDiv);
                            }
                            cccNativeVillage         = new CardCollectionControl();
                            cccNativeVillage.Name    = "cardNativeVillage";
                            cccNativeVillage.Padding = new Thickness(0);
                            DockPanel.SetDock(cccNativeVillage, Dock.Left);
                            //cccNativeVillage.Background = Brushes.AliceBlue;
                            cccNativeVillage.PileName = "Native Village Mat";
                            cccNativeVillage.CardSize = CardSize.Text;
                            dpMatsandPiles.Children.Add(cccNativeVillage);
                        }
                        cccNativeVillage.ExactCount     = true;
                        cccNativeVillage.IsCardsVisible = visible;
                        cccNativeVillage.Phase          = PhaseEnum.Action;
                        cccNativeVillage.PlayerMode     = PlayerMode.Waiting;
                        cccNativeVillage.Pile           = deck;
                    }
                    else if (sender.GetType() == DominionBase.Cards.Promotional.TypeClass.PrinceSetAside)
                    {
                        CardCollectionControl cccPrinceSetAside = dpMatsandPiles.Children.OfType <CardCollectionControl>().SingleOrDefault(ccc => ccc.Name == "cardPrinceSetAside");
                        if (cccPrinceSetAside == null)
                        {
                            if (dpMatsandPiles.Children.Count > 0)
                            {
                                Border bDiv = new Border();
                                bDiv.BorderThickness = new Thickness(2);
                                bDiv.BorderBrush     = Brushes.Black;
                                DockPanel.SetDock(bDiv, Dock.Left);
                                dpMatsandPiles.Children.Add(bDiv);
                            }
                            cccPrinceSetAside         = new CardCollectionControl();
                            cccPrinceSetAside.Name    = "cardPrinceSetAside";
                            cccPrinceSetAside.Padding = new Thickness(0);
                            DockPanel.SetDock(cccPrinceSetAside, Dock.Left);
                            cccPrinceSetAside.PileName = "Set Aside";
                            cccPrinceSetAside.CardSize = CardSize.Text;
                            dpMatsandPiles.Children.Add(cccPrinceSetAside);
                        }
                        cccPrinceSetAside.ExactCount     = true;
                        cccPrinceSetAside.IsCardsVisible = true;
                        cccPrinceSetAside.CardSize       = CardSize.Small;
                        cccPrinceSetAside.Phase          = PhaseEnum.Action;
                        cccPrinceSetAside.PlayerMode     = PlayerMode.Waiting;
                        cccPrinceSetAside.Pile           = deck;
                    }

                    break;
                }
            }
            else
            {
                this.Dispatcher.BeginInvoke(new EventHandler <PileChangedEventArgs>(_Player_PileChanged), System.Windows.Threading.DispatcherPriority.Normal, sender, e);
            }
        }
		internal CardCollection Retrieve(Player player, Predicate<Card> match, int count)
		{
			CardCollection matching = _Cards.FindAll(match);
			if (count >= 0 && count < matching.Count)
			{
				matching.RemoveRange(count, matching.Count - count);
				if (matching.Count != count)
					throw new Exception("Incorrect number of cards drawn!");
			}
			_Cards.RemoveAll(c => matching.Contains(c));

			if (matching.Count > 0)
			{
				if (_AsynchronousChanging)
				{
					if (_AsynchronousPileChangedEventArgs == null)
						_AsynchronousPileChangedEventArgs = new PileChangedEventArgs(player, PileChangedEventArgs.Operation.Removed, matching);
					else
						_AsynchronousPileChangedEventArgs.AddedCards.AddRange(matching);
				}
				else if (PileChanged != null)
				{
					PileChangedEventArgs pcea = new PileChangedEventArgs(player, PileChangedEventArgs.Operation.Removed, matching);
					PileChanged(this, pcea);
				}
			}
			return matching;
		}
Exemple #9
0
		public void Refresh(Player player)
		{
			PileChangedEventArgs pcea = new PileChangedEventArgs(player, PileChangedEventArgs.Operation.Reset);
			if (_AsynchronousChanging)
			{
				_AsynchronousPileChangedEventArgs = pcea;
			}
			else if (PileChanged != null)
			{
				PileChanged(this, pcea);
			}
		}