public override void Play(Player player)
        {
            base.Play(player);

            // Perform attack on every player
            IEnumerator <Player> enumerator = player._Game.GetPlayersStartingWithEnumerator(player);

            enumerator.MoveNext();             // skip active player
            while (enumerator.MoveNext())
            {
                Player attackee = enumerator.Current;
                // Skip if the attack is blocked (Moat, Lighthouse, etc.)
                if (this.IsAttackBlocked[attackee])
                {
                    continue;
                }

                if (attackee.CanDraw)
                {
                    Card card = attackee.Draw(DeckLocation.Revealed);
                    attackee.DiscardRevealed();

                    if ((card.Category & Cards.Category.Victory) == Cards.Category.Victory)
                    {
                        attackee.Gain(player._Game.Table.Curse);
                    }
                    else
                    {
                        Supply supply = null;
                        if (player._Game.Table.Supplies.ContainsKey(card))
                        {
                            supply = player._Game.Table[card];
                        }
                        if (supply != null && supply.CanGain() && supply.TopCard.Name == card.Name)
                        {
                            Choice choice = new Choice(String.Format("Who should receive the copy of {0}?", card), this, new CardCollection()
                            {
                                card
                            },
                                                       new List <string>()
                            {
                                player.ToString(), attackee.ToString()
                            }, player);
                            ChoiceResult result = player.MakeChoice(choice);
                            if (result.Options[0] == player.ToString())
                            {
                                player.Gain(supply);
                            }
                            else
                            {
                                attackee.Gain(supply);
                            }
                        }
                    }
                }
            }
        }
Beispiel #2
0
 public Choice(String text, Card cardSource, Supply supply, Player playerSource, int minimum, int maximum)
     : this(text, cardSource, new CardCollection() { cardSource }, ChoiceType.Cards, playerSource, null, false, false, minimum, maximum)
 {
     _Cards = new CardCollection();
     foreach (Type cardType in supply.CardTypes)
     {
         if (!supply.CanGain(cardType))
         {
             continue;
         }
         ((CardCollection)_Cards).Add(Card.CreateInstance(cardType));
     }
 }
Beispiel #3
0
		/// <summary>
		/// Tries to gain the specified cardType from the specified supply into the location and position of the deck specified
		/// </summary>
		/// <param name="supply">The supply pile to gain from</param>
		/// <param name="cardType">The card type we're trying to gain</param>
		/// <param name="location">The deck the card should go into</param>
		/// <param name="position">The position into the deck the card should go</param>
		/// <param name="isBought">Indicating whether or not the card was bought</param>
		/// <returns>True if the card was actually gained, False otherwise</returns>
		public Boolean Gain(Supply supply, Type cardType, DeckLocation location, DeckPosition position, Boolean isBought)
		{
			if (supply.CanGain(cardType))
			{
				Card supplyCard = supply[cardType].First();
				CardGainEventArgs cgea = CardGainCheckAllowed(supplyCard, location, position, isBought);
				if (!cgea.Cancelled)
					return this.Gain(supply.Take(cardType), cgea.Location, cgea.Position, cgea.Bought);
				else
				{
					CardGainFinish(supplyCard, cgea.Location, cgea.Position, cgea.Bought, cgea.Cancelled, cgea.IsLostTrackOf);
					return false;
				}
			}
			return false;
		}
Beispiel #4
0
		public Choice(String text, Card cardSource, Supply supply, Player playerSource, int minimum, int maximum)
			: this(text, cardSource, new CardCollection() { cardSource }, ChoiceType.Cards, playerSource, null, false, false, minimum, maximum)
		{
			_Cards = new CardCollection();
			foreach (Type cardType in supply.CardTypes)
			{
				if (!supply.CanGain(cardType))
					continue;
				((CardCollection)_Cards).Add(Card.CreateInstance(cardType));
			}
		}