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