private bool SelectDelveTargets(ActivationParameters parameters) { if (!Card.Has().Delve) { return(true); } var spec = new IsValidTargetBuilder().Is.Card().In.YourGraveyard(); var tp = new TargetValidatorParameters( isValidTarget: spec.IsValidTarget, isValidZone: spec.IsValidZone) { MinCount = 0, MaxCount = Card.HasXInCost ? int.MaxValue : Card.GenericCost, Message = "Select cards to exile for delve.", MustBeTargetable = false }; var validator = new TargetValidator(tp); validator.Initialize(Game, Card.Controller); var dialog = ShowSelectorDialog(validator, null); if (dialog.WasCanceled) { return(false); } parameters.DelveTargets.AddRange(dialog.Selection.Cast <Card>()); return(true); }
private Card SelectAuraTarget(Card card) { var validatorParameters = new TargetValidatorParameters { IsValidTarget = p => card.CanTarget(p.Target), IsValidZone = p => p.Zone == Zone.Battlefield, Message = "Select aura target.", }; var validator = new TargetValidator(validatorParameters); validator.Initialize(Game, D.Controller, D._p.OwningCard); var selectTargetParameters = new SelectTargetParameters { Validator = validator, CanCancel = true, Instructions = D._p.Instructions }; var dialog = Ui.Dialogs.SelectTarget.Create(selectTargetParameters); Ui.Shell.ShowModalDialog(dialog, DialogType.Small, InteractionState.SelectTarget); if (dialog.WasCanceled) { return(null); } return(dialog.Selection[0].Card()); }
private bool SelectConvokeTargets(ActivationParameters parameters) { if (!Card.Has().Convoke) { return(true); } var spec = new IsValidTargetBuilder() .Card(c => c.CanBeTapped && c.Is().Creature&& c.Controller == Card.Controller) .On.Battlefield(); var tp = new TargetValidatorParameters( isValidTarget: spec.IsValidTarget, isValidZone: spec.IsValidZone) { MinCount = 0, MaxCount = null, Message = "Select creatures to tap for convoke.", MustBeTargetable = false }; var validator = new TargetValidator(tp); validator.Initialize(Game, Card.Controller); var dialog = ShowSelectorDialog(validator, null); if (dialog.WasCanceled) { return(false); } parameters.ConvokeTargets.AddRange(dialog.Selection.Cast <Card>()); return(true); }
protected override void ExecuteQuery() { var tp = new TargetValidatorParameters { MinCount = 0, MaxCount = null, Message = "Select attackers." } .Is.Card(c => c.CanAttack && c.Controller == D.Controller) .On.Battlefield(); tp.MustBeTargetable = false; var validator = new TargetValidator(tp); validator.Initialize(Game, D.Controller); var selectParameters = new SelectTargetParameters { Validator = validator, CanCancel = false, TargetSelected = target => Ui.Publisher.Publish( new AttackerSelected { Attacker = target.Card() }), TargetUnselected = target => Ui.Publisher.Publish( new AttackerUnselected { Attacker = target.Card() }) }; var dialog = Ui.Dialogs.SelectTarget.Create(selectParameters); Ui.Shell.ShowModalDialog(dialog, DialogType.Small, InteractionState.SelectTarget); Result = dialog.Selection.ToList(); }
protected override void ExecuteQuery() { ChosenCards chosenCards = null; while (true) { chosenCards = new ChosenCards(); var validatorParameters = new TargetValidatorParameters { IsValidTarget = p => D._p.Validator.IsValidCard(p.Target.Card()), IsValidZone = p => p.Zone == D._p.Zone && p.ZoneOwner == D.Controller, MinCount = D._p.MinCount, MaxCount = D._p.MaxCount == null ? null : (Value)D._p.MaxCount.Value, Message = D._p.Text, }; var validator = new TargetValidator(validatorParameters); validator.Initialize(Game, D.Controller, D._p.OwningCard); var selectTargetParameters = new SelectTargetParameters { Validator = validator, Instructions = D._p.Instructions }; var dialog = Ui.Dialogs.SelectTarget.Create(selectTargetParameters); Ui.Shell.ShowModalDialog(dialog, DialogType.Small, InteractionState.SelectTarget); foreach (Card card in dialog.Selection) { chosenCards.Add(card); if (card.Is().Aura&& D._p.AurasNeedTarget) { var auraTarget = SelectAuraTarget(card); if (auraTarget == null) { continue; } chosenCards.Add(auraTarget); } } break; } Result = chosenCards; }
protected override void ExecuteQuery() { var validatorParameters = new TargetValidatorParameters( isValidTarget: p => D._p.Cards.Contains((Card)p.Target), isValidZone: p => p.Zone == D._p.Cards[0].Zone && p.ZoneOwner == D.Controller) { MinCount = 0, MaxCount = D._p.Cards.Count, Message = D._p.SplitText, }; var validator = new TargetValidator(validatorParameters); validator.Initialize(Game, D.Controller); var selectTargetParameters = new SelectTargetParameters { Validator = validator, Instructions = "(Press enter when done.)" }; var selectDialog = Ui.Dialogs.SelectTarget.Create(selectTargetParameters); Ui.Shell.ShowModalDialog(selectDialog, DialogType.Small, InteractionState.SelectTarget); var positiveGroup = selectDialog.Selection.Select(x => (Card)x).ToList(); var negativeGroup = D._p.Cards.Where(x => !positiveGroup.Contains(x)).ToList(); if (positiveGroup.Count > 1) { var orderDialogPositive = Ui.Dialogs.CardOrder.Create(positiveGroup, D._p.PositiveText); Ui.Shell.ShowModalDialog(orderDialogPositive, DialogType.Large, InteractionState.Disabled); positiveGroup.ShuffleInPlace(orderDialogPositive.Ordering); } if (negativeGroup.Count > 1) { var orderDialogNegative = Ui.Dialogs.CardOrder.Create(negativeGroup, D._p.NegativeText); Ui.Shell.ShowModalDialog(orderDialogNegative, DialogType.Large, InteractionState.Disabled); negativeGroup.ShuffleInPlace(orderDialogNegative.Ordering); } Result = new Split(new IEnumerable <Card>[] { positiveGroup, negativeGroup }); }
protected override void ExecuteQuery() { var parameters = new TargetValidatorParameters( isValidTarget: p => D._p.Filter(p.Target.Card()), isValidZone: p => p.ZoneOwner == CardsOwner && p.Zone == Zone.Hand) { MinCount = D._p.Count, MaxCount = D._p.Count, Message = String.Format("Select {0} card(s) to discard.", D._p.Count), }; var targetValidator = new TargetValidator(parameters); targetValidator.Initialize(Game, D.Controller); var dialog = Ui.Dialogs.SelectTarget.Create(new SelectTargetParameters { CanCancel = false, Validator = targetValidator }); Ui.Shell.ShowModalDialog(dialog, DialogType.Small, InteractionState.SelectTarget); Result = dialog.Selection.ToList(); }
protected override void ExecuteQuery() { var result = new ChosenAttackers(); var availableMana = D.Controller.GetAvailableManaCount(); while (true) { var attackerSpec = new IsValidTargetBuilder() .Is.Card(c => c.CanAttack && c.Controller == D.Controller && c.CombatCost <= availableMana) .On.Battlefield(); var attackerTarget = new TargetValidatorParameters( isValidTarget: attackerSpec.IsValidTarget, isValidZone: attackerSpec.IsValidZone) { MinCount = IsValidAttackerDeclaration(result) ? 0 : 1, MaxCount = 1, Message = "Select an attacker.", MustBeTargetable = false }; var validator = new TargetValidator(attackerTarget); validator.Initialize(Game, D.Controller); var selectAttacker = Ui.Dialogs.SelectTarget.Create(new SelectTargetParameters { Validator = validator, CanCancel = false, Instructions = IsValidAttackerDeclaration(result) ? null : "(Additional attackers required.)" }); Ui.Shell.ShowModalDialog(selectAttacker, DialogType.Small, InteractionState.SelectTarget); if (selectAttacker.Selection.Count == 0) { break; } var attacker = (Card)selectAttacker.Selection[0]; if (result.Any(a => a.Card == attacker)) { availableMana += attacker.CombatCost; Ui.Publisher.Publish( new AttackerUnselected { Attacker = attacker }); result.Remove(attacker); continue; } Card planeswalker = null; if (Planeswalkers.Count > 0) { var planeswalkerSpec = new IsValidTargetBuilder() .Is.Card(c => c.Is().Planeswalker&& c.Controller == D.Controller.Opponent) .On.Battlefield(); var planeswalkerTarget = new TargetValidatorParameters( isValidTarget: planeswalkerSpec.IsValidTarget, isValidZone: planeswalkerSpec.IsValidZone) { MinCount = 0, MaxCount = 1, Message = "Select a planeswalker to attack", MustBeTargetable = false }; var planeswalkerValidator = new TargetValidator(planeswalkerTarget); planeswalkerValidator.Initialize(Game, D.Controller); var selectPlaneswalker = Ui.Dialogs.SelectTarget.Create(new SelectTargetParameters { Validator = planeswalkerValidator, Instructions = "(or press enter to attack the opponent)." }); Ui.Shell.ShowModalDialog(selectPlaneswalker, DialogType.Small, InteractionState.SelectTarget); if (selectPlaneswalker.Selection.Count > 0) { planeswalker = (Card)selectPlaneswalker.Selection[0]; } } availableMana -= attacker.CombatCost; Ui.Publisher.Publish( new AttackerSelected { Attacker = attacker }); result.Add(attacker, planeswalker); } Result = result; }
protected override void ExecuteQuery() { var result = new ChosenBlockers(); var lureAttackers = Combat.Attackers .Select(x => x.Card) .Where(x => x.Has().Lure) .ToList(); while (true) { var blockerTarget = new TargetValidatorParameters { MinCount = IsValidBlockerDeclaration(result, lureAttackers) ? 0 : 1, MaxCount = 1, Message = "Select a blocker." } .Is.Card(c => c.CanBlock() && c.Controller == D.Controller) .On.Battlefield(); blockerTarget.MustBeTargetable = false; var blockerValidator = new TargetValidator(blockerTarget); blockerValidator.Initialize(Game, D.Controller); var selectBlocker = Ui.Dialogs.SelectTarget.Create(new SelectTargetParameters { Validator = blockerValidator, CanCancel = false, Instructions = IsValidBlockerDeclaration(result, lureAttackers) ? null : "(Additional blockers required.)" }); Ui.Shell.ShowModalDialog(selectBlocker, DialogType.Small, InteractionState.SelectTarget); if (selectBlocker.Selection.Count == 0) { break; } var blocker = (Card)selectBlocker.Selection[0]; if (result.ContainsBlocker(blocker)) { result.Remove(blocker); Ui.Publisher.Publish(new BlockerUnselected { Blocker = blocker }); continue; } var attackerTarget = new TargetValidatorParameters { MinCount = 1, MaxCount = 1, Message = "Select an attacker to block." } .Is.Card(c => { // if any attacker has lure, we must block it if (lureAttackers.Any(x => x.CanBeBlockedBy(blocker)) && !c.Has().Lure) { return(false); } return(c.IsAttacker && c.CanBeBlockedBy(blocker)); }) .On.Battlefield(); attackerTarget.MustBeTargetable = false; var attackerValidator = new TargetValidator(attackerTarget); attackerValidator.Initialize(Game, D.Controller); var selectAttacker = Ui.Dialogs.SelectTarget.Create(new SelectTargetParameters { Validator = attackerValidator, CanCancel = true, Instructions = "(Press Esc to cancel.)" }); Ui.Shell.ShowModalDialog(selectAttacker, DialogType.Small, InteractionState.SelectTarget); if (selectAttacker.WasCanceled) { continue; } var attacker = (Card)selectAttacker.Selection[0]; Ui.Publisher.Publish(new BlockerSelected { Blocker = blocker, Attacker = attacker }); result.Add(blocker, attacker); } Result = result; }