internal void Trash(DeckLocation location, CardCollection cards) { if (cards.Count == 0) return; TrashEventArgs tea = null; if (Trashing != null) { do { tea = new TrashEventArgs(this, cards); Trashing(this, tea); Boolean isAnyRequired = false; List<String> options = new List<String>(); IEnumerable<Type> cardTypes = tea.Actions.Keys; foreach (Type key in cardTypes) { options.Add(tea.Actions[key].Text); isAnyRequired |= tea.Actions[key].IsRequired; } if (options.Count > 0) { options.Sort(); Choice choice = new Choice(String.Format("You are trashing {0} cards", cards.Count), null, cards, options, this, tea, false, isAnyRequired ? 1 : 0, 1); ChoiceResult result = this.MakeChoice(choice); if (result.Options.Count > 0) tea.Actions.First(kvp => kvp.Value.Text == result.Options[0]).Value.Method(this, ref tea); } } while (Trashing != null && tea.HandledBy.Count > 0); } this.MoveToTrashStart(location, cards); if (CurrentTurn != null) CurrentTurn.Trashed(cards); if (Trashed != null) { List<Object> handledBy = new List<Object>(); Boolean actionPerformed = false; do { actionPerformed = false; tea = new TrashEventArgs(this, cards); tea.HandledBy.AddRange(handledBy); Trashed(this, tea); handledBy = tea.HandledBy; IEnumerator<Player> enumerator = this._Game.GetPlayersStartingWithEnumerator(this); while (enumerator.MoveNext()) { Boolean isAnyRequired = false; List<String> options = new List<String>(); IEnumerable<Type> cardTypes = tea.Actions.Keys; foreach (Type key in cardTypes) { if (enumerator.Current == tea.Actions[key].Player) { options.Add(tea.Actions[key].Text); isAnyRequired |= tea.Actions[key].IsRequired; } } if (options.Count > 0) { options.Sort(); Choice choice = new Choice(String.Format("{0} trashed {1}", this == enumerator.Current ? "You" : this.ToString(), Utilities.StringUtility.Plural("card", cards.Count)), null, cards, options, this, tea, false, isAnyRequired ? 1 : 0, 1); ChoiceResult result = enumerator.Current.MakeChoice(choice); if (result.Options.Count > 0) { tea.Actions.First(kvp => kvp.Value.Text == result.Options[0]).Value.Method(enumerator.Current, ref tea); actionPerformed = true; } } } } while (Trashed != null && actionPerformed); } cards.TrashedBy(this); Lose(cards); if (TrashedFinished != null) { tea = new TrashEventArgs(this, cards); TrashedFinished(this, tea); } cards.RemovedFrom(location, this); }