Exemplo n.º 1
0
		void player_CardsDiscarding(object sender, CardsDiscardEventArgs e)
		{
			if (!e.Cards.Contains(this.PhysicalCard) || e.GetAction(TypeClass.Alchemist) != null ||
				(e.FromLocation != DeckLocation.InPlay && e.FromLocation != DeckLocation.SetAside && e.FromLocation != DeckLocation.InPlayAndSetAside))
				return;

			if (e.Cards.Any(c => c.CardType == TypeClass.Potion))
				e.AddAction(TypeClass.Alchemist, new CardsDiscardAction(sender as Player, this, String.Format("Put {0} on your deck", this.PhysicalCard), player_Action, false));
		}
Exemplo n.º 2
0
		internal void player_Action(Player player, ref CardsDiscardEventArgs e)
		{
			e.Cards.Remove(this.PhysicalCard);
			Card thisCard = null;
			if (player.InPlay.Contains(this.PhysicalCard))
				thisCard = player.RetrieveCardFrom(DeckLocation.InPlay, this.PhysicalCard);
			else
				thisCard = player.RetrieveCardFrom(DeckLocation.SetAside, this.PhysicalCard);
			player.AddCardToDeck(thisCard, DeckPosition.Top);
		}
Exemplo n.º 3
0
		internal void player_DiscardHand(Player player, ref CardsDiscardEventArgs e)
		{
			CardMovementCollection cardsToMove = (CardMovementCollection)e.Data;

			// Discard Hand
			this.AddCardsInto(DeckLocation.Discard,
				this.RetrieveCardsFrom(DeckLocation.Hand, c =>
					cardsToMove[c].CurrentLocation == DeckLocation.Hand && cardsToMove[c].Destination == DeckLocation.Discard));

			e.HandledBy.Add(this);
		}
Exemplo n.º 4
0
		public void Discard(DeckLocation fromLocation, Predicate<Card> match, int count, CardsDiscardAction discardAction)
		{
			CardCollection matchingCards = this.ResolveDeck(fromLocation)[match];
			if (count >= 0 && count < matchingCards.Count)
			{
				matchingCards.RemoveRange(count, matchingCards.Count - count);
				if (matchingCards.Count != count)
					throw new Exception("Incorrect number of cards found!");
			}
			if (matchingCards.Count == 0)
				return;

			if (CardsDiscarding != null)
			{
				CardsDiscardEventArgs cdea = null;
				List<Object> handledBy = new List<Object>();
				Boolean actionPerformed = false;
				Boolean cancelled = false;
				do
				{
					actionPerformed = false;

					cdea = new CardsDiscardEventArgs(fromLocation, matchingCards);
					cdea.Cancelled = cancelled;
					cdea.HandledBy.AddRange(handledBy);
					CardsDiscarding(this, cdea);

					handledBy = cdea.HandledBy;
					matchingCards = cdea.Cards;
					cancelled |= cdea.Cancelled;

					OptionCollection options = new OptionCollection();
					IEnumerable<Tuple<Type, Type>> cardTypes = cdea.Actions.Keys;
					foreach (Tuple<Type, Type> key in cardTypes)
						options.Add(new Option(cdea.Actions[key].Text, cdea.Actions[key].IsRequired));

					if (options.Count > 0)
					{
						if (discardAction != null && !cdea.HandledBy.Contains(this))
						{
							cdea.AddAction(this.GetType(), discardAction);
							options.Add(new Option(discardAction.Text, true));
						}

						options.Sort();
						Choice choice = new Choice(String.Format("You are discarding {0}", Utilities.StringUtility.Plural("card", matchingCards.Count)), options, this, cdea);
						ChoiceResult result = this.MakeChoice(choice);

						if (result.Options.Count > 0)
						{
							CardsDiscardAction action = cdea.Actions.First(kvp => kvp.Value.Text == result.Options[0]).Value;
							cdea.Data = action.Data;
							action.Method(this, ref cdea);
							actionPerformed = true;
							handledBy = cdea.HandledBy;
							matchingCards = cdea.Cards;
							cancelled |= cdea.Cancelled;
						}
					}

				} while (CardsDiscarding != null && actionPerformed);

				if (cancelled)
					return;
			}

			this.RetrieveCardsFrom(fromLocation, matchingCards);
			if (CardsDiscard != null)
			{
				CardsDiscardEventArgs cdea = null;
				List<Object> handledBy = new List<Object>();

				cdea = new CardsDiscardEventArgs(fromLocation, matchingCards);
				cdea.HandledBy.AddRange(handledBy);
				CardsDiscard(this, cdea);

				handledBy = cdea.HandledBy;
				matchingCards = cdea.Cards;
			}
			this.AddCardsInto(DeckLocation.Discard, matchingCards);

			if (CardsDiscarded != null)
			{
				CardsDiscardEventArgs cdea = null;
				List<Object> handledBy = new List<Object>();
				Boolean actionPerformed = false;
				do
				{
					actionPerformed = false;

					cdea = new CardsDiscardEventArgs(fromLocation, matchingCards);
					cdea.HandledBy.AddRange(handledBy);
					CardsDiscarded(this, cdea);
					handledBy = cdea.HandledBy;

					OptionCollection options = new OptionCollection();
					IEnumerable<Tuple<Type, Type>> cardTypes = cdea.Actions.Keys;
					foreach (Tuple<Type, Type> key in cardTypes)
						options.Add(new Option(cdea.Actions[key].Text, false));

					if (options.Count > 0)
					{
						options.Sort();
						Choice choice = new Choice(String.Format("You discarded {0}", Utilities.StringUtility.Plural("card", matchingCards.Count)), options, this, cdea);
						ChoiceResult result = this.MakeChoice(choice);

						if (result.Options.Count > 0)
						{
							cdea.Actions.First(kvp => kvp.Value.Text == result.Options[0]).Value.Method(this, ref cdea);
							actionPerformed = true;
						}
					}

				} while (CardsDiscarded != null && actionPerformed);
			}
		}
Exemplo n.º 5
0
		void player_CardsDiscarding(object sender, CardsDiscardEventArgs e)
		{
			if (!e.Cards.Contains(this.PhysicalCard) || e.GetAction(TypeClass.Herbalist) != null || e.HandledBy.Contains(this) ||
				(e.FromLocation != DeckLocation.InPlay && e.FromLocation != DeckLocation.SetAside && e.FromLocation != DeckLocation.InPlayAndSetAside))
				return;

			if (e.Cards.Any(c => (c.Category & Cards.Category.Treasure) == Cards.Category.Treasure))
				e.AddAction(TypeClass.Herbalist, new CardsDiscardAction(sender as Player, this, "Put a Treasure on your deck", player_Action, false));
		}
Exemplo n.º 6
0
		internal void player_Action(Player player, ref CardsDiscardEventArgs e)
		{
			Choice choice = new Choice("Select a treasure to place on your deck", this, e.Cards.Where(c => (c.Category & Category.Treasure) == Cards.Category.Treasure), player);
			ChoiceResult result = player.MakeChoice(choice);
			if (result.Cards.Count > 0)
			{
				e.Cards.Remove(result.Cards[0]);
				if (player.InPlay.Contains(result.Cards[0]))
					player.RetrieveCardFrom(DeckLocation.InPlay, result.Cards[0]);
				else
					player.RetrieveCardFrom(DeckLocation.SetAside, result.Cards[0]);
				player.AddCardToDeck(result.Cards[0], DeckPosition.Top);
			}

			e.HandledBy.Add(this);
		}
Exemplo n.º 7
0
		void player_CardsDiscarding(object sender, CardsDiscardEventArgs e)
		{
			if (e.FromLocation != DeckLocation.InPlay && e.FromLocation != DeckLocation.SetAside && e.FromLocation != DeckLocation.InPlayAndSetAside)
				return;

			if (e.HandledBy.Contains(this))
				return;

			if (e.Cards.Contains(this._SetAsideCardInPlay))
			{
				e.AddAction(TypeClass.Prince, this._SetAsideCardInPlay.CardType, new CardsDiscardAction(sender as Player, this, String.Format("Set aside {0}", this._SetAsideCardInPlay), player_DiscardAction, true) { Data = this._SetAsideCardInPlay });
			}
			else
			{
			}
		}
Exemplo n.º 8
0
		internal void player_DiscardAction(Player player, ref CardsDiscardEventArgs e)
		{
			if (_CardsDiscardingEventHandler != null)
				this._TurnStartedPlayer.CardsDiscarding -= _CardsDiscardingEventHandler;

			Card cardToSetAside = e.Data as Card;
			e.Cards.Remove(cardToSetAside);
			if (player.InPlay.Contains(this._SetAsideCardInPlay))
				player.RetrieveCardFrom(DeckLocation.InPlay, cardToSetAside);
			else
				player.RetrieveCardFrom(DeckLocation.SetAside, cardToSetAside);
			this._SetAsideCard = cardToSetAside;
			player._Game.SendMessage(player, this, this._SetAsideCard);
			this._SetAsideCardInPlay = null;

			player.PlayerMats[TypeClass.PrinceSetAside].Refresh(player);

			e.HandledBy.Add(this);
		}
Exemplo n.º 9
0
		void player_CardsDiscarding(object sender, CardsDiscardEventArgs e)
		{
			Player player = (Player)sender;
			// Only allow this if no cards were bought this turn
			// We set this up right now because this action happens regardless of whether or not the card is "lost track of"
			if (e.Cards.Contains(this.PhysicalCard) && player.CurrentTurn.CardsBought.Count == 0 && 
				(e.FromLocation == DeckLocation.InPlay || e.FromLocation == DeckLocation.SetAside || e.FromLocation == DeckLocation.InPlayAndSetAside))
				_ShouldBeTrashed = true;

			if (e.GetAction(TypeClass.Hermit) != null || !_ShouldBeTrashed)
				return;

			e.AddAction(TypeClass.Hermit, new CardsDiscardAction(sender as Player, this, String.Format("Trash {0}", this.PhysicalCard), player_Action, true));
		}
Exemplo n.º 10
0
		internal void player_Action(Player player, ref CardsDiscardEventArgs e)
		{
			e.Cards.Remove(this.PhysicalCard);
			if (player.InPlay.Contains(this.PhysicalCard))
				player.Trash(player.RetrieveCardFrom(DeckLocation.InPlay, this.PhysicalCard));
			else if (player.SetAside.Contains(this.PhysicalCard))
				player.Trash(player.RetrieveCardFrom(DeckLocation.SetAside, this.PhysicalCard));

			player.Gain(player._Game.Table.SpecialPiles[TypeClass.Madman]);

			e.HandledBy.Add(this);
			_ShouldBeTrashed = false;
		}
Exemplo n.º 11
0
		internal void player_DiscardTunnel(Player player, ref CardsDiscardEventArgs e)
		{
			player.AddCardInto(DeckLocation.Revealed, this);
			player.RetrieveCardFrom(DeckLocation.Revealed, this);
			player.Gain(player._Game.Table.Gold);
			e.HandledBy.Add(this);
		}
Exemplo n.º 12
0
		void player_CardsDiscarded(object sender, CardsDiscardEventArgs e)
		{
			Player player = sender as Player;

			// Already being processed or been handled -- don't need to process this one
			if (e.GetAction(TypeClass.Tunnel) != null || e.HandledBy.Contains(this))
				return;

			if (e.Cards.Contains(this.PhysicalCard) && player.Phase != PhaseEnum.Cleanup)
				e.AddAction(TypeClass.Tunnel, new CardsDiscardAction(this.Owner, this, String.Format("Reveal {0}", this.PhysicalCard), player_DiscardTunnel, false));
		}
Exemplo n.º 13
0
		internal void player_DiscardAction(Player player, ref CardsDiscardEventArgs e)
		{
			Card cardToTopDeck = e.Data as Card;
			e.Cards.Remove(cardToTopDeck);
			if (player.InPlay.Contains(cardToTopDeck))
				player.RetrieveCardFrom(DeckLocation.InPlay, cardToTopDeck);
			else
				player.RetrieveCardFrom(DeckLocation.SetAside, cardToTopDeck);
			player.AddCardToDeck(cardToTopDeck, DeckPosition.Top);

			e.HandledBy.Add(cardToTopDeck);
		}
Exemplo n.º 14
0
		void player_CardsDiscarding(object sender, CardsDiscardEventArgs e)
		{
			Player player = (Player)sender;
			foreach (Card card in _CardsToTopDeck)
			{
				if (e.GetAction(TypeClass.Scheme, card.CardType) != null || player.ResolveDeck(e.FromLocation)[c => c == card].Count == 0)
					continue;

				e.AddAction(TypeClass.Scheme, card.CardType, new CardsDiscardAction(player, this, String.Format("Put {0} on your deck", card), player_DiscardAction, true) { Data = card });
			}
		}
Exemplo n.º 15
0
		void player_CardsDiscarding(object sender, CardsDiscardEventArgs e)
		{
			if (!e.Cards.Contains(this.PhysicalCard) || e.GetAction(TypeClass.Treasury) != null || e.HandledBy.Contains(this) ||
				(e.FromLocation != DeckLocation.InPlay && e.FromLocation != DeckLocation.SetAside && e.FromLocation != DeckLocation.InPlayAndSetAside))
				return;

			// Only allow this if no Victory cards were bought this turn
			if (!((sender as Player).CurrentTurn.CardsBought.Any(c => (c.Category & Cards.Category.Victory) == Cards.Category.Victory)))
				e.AddAction(TypeClass.Treasury, new CardsDiscardAction(sender as Player, this, String.Format("Put {0} on your deck", this.PhysicalCard), player_Action, false));
		}