Example #1
0
            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());
            }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
            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();
            }
Example #5
0
            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;
            }
Example #6
0
            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
                });
            }
Example #7
0
            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();
            }
Example #8
0
 public TargetSpecs(TargetValidatorParameters parameters)
 {
     _p = parameters;
 }
Example #9
0
            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;
            }
Example #10
0
 public ZoneSpecs(TargetValidatorParameters p)
 {
     _p = p;
 }
Example #11
0
 public ZoneSpecs(TargetValidatorParameters p)
 {
     _p = p;
 }
Example #12
0
            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;
            }