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(); }
public virtual void Initialize(CostType type, Card card, Game game, TargetValidator validator = null) { Game = game; Card = card; Validator = validator; Type = type; }
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); }
public virtual void Receive(SelectionChanged message) { if (TargetValidator.MaxCount != null && _selection.Count >= TargetValidator.MaxCount.GetValue(_x)) { return; } if (_selection.Contains(message.Selection)) { _targetUnselected(message.Selection); _selection.Remove(message.Selection); return; } if (TargetValidator.HasValidZone(message.Selection) == false) { return; } if (TargetValidator.IsTargetValid(message.Selection, _triggerMessage) == false) { return; } _targetSelected(message.Selection); _selection.Add(message.Selection); if (CanAutoComplete) { Done(); } }
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); }
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()); }
public override void Initialize(Card card, Game game, TargetValidator validator = null) { base.Initialize(card, game, validator); foreach (var cost in _costs) { cost.Initialize(card, game, validator); } }
public override void Initialize(Card card, Game game, TargetValidator validator = null) { base.Initialize(card, game, validator); foreach (var cost in _costs) { cost.Initialize(card, game, validator); } }
public override bool SelectTarget(out IEnumerable <IWowUnit> possibleTargets) { possibleTargets = Bot.Objects.All.OfType <IWowUnit>() .Where(e => TargetValidator.IsValid(e) && e.IsInCombat) .OrderByDescending(e => IsPriorityTarget(e)) .ThenByDescending(e => e.Type) .ThenBy(e => e.DistanceTo(Bot.Player)); return(possibleTargets != null && possibleTargets.Any()); }
public override bool SelectTarget(out IEnumerable <IWowUnit> possibleTargets) { possibleTargets = null; IEnumerable <IWowUnit> unitsAroundMe = Bot.Objects.All .OfType <IWowUnit>() .Where(e => TargetValidator.IsValid(e) && e.IsInCombat) .OrderByDescending(e => e.Type) .ThenByDescending(e => e.MaxHealth); IEnumerable <IWowUnit> targetsINeedToTank = unitsAroundMe .Where(e => e.Type != WowObjectType.Player && e.TargetGuid != Bot.Wow.PlayerGuid && Bot.Objects.PartymemberGuids.Contains(e.TargetGuid)); if (targetsINeedToTank.Any()) { possibleTargets = targetsINeedToTank; return(true); } else { if (Bot.Objects.Partymembers.Any()) { Dictionary <IWowUnit, int> targets = new(); foreach (IWowUnit unit in Bot.Objects.Partymembers) { if (unit.TargetGuid > 0) { IWowUnit targetUnit = Bot.GetWowObjectByGuid <IWowUnit>(unit.TargetGuid); if (targetUnit != null && Bot.Db.GetReaction(targetUnit, Bot.Player) != WowUnitReaction.Friendly) { if (!targets.ContainsKey(targetUnit)) { targets.Add(targetUnit, 1); } else { ++targets[targetUnit]; } } } } possibleTargets = targets.OrderBy(e => e.Value).Select(e => e.Key); return(true); } possibleTargets = unitsAroundMe; return(true); } }
private bool NoValidTargets(TargetValidator validator) { foreach (var target in GenerateTargets(validator.IsZoneValid)) { if (validator.IsTargetValid(target, D._p.Effect.TriggerMessage <object>())) { return(false); } } return(true); }
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; }
private static SelectTarget.ViewModel ShowSelectTargetDialog(TargetValidator validator, int?x, bool canCancel) { var selectTargetParameters = new SelectTarget.SelectTargetParameters { Validator = validator, CanCancel = canCancel, X = x }; var dialog = Ui.Dialogs.SelectTarget.Create(selectTargetParameters); Ui.Shell.ShowModalDialog(dialog, DialogType.Small, InteractionState.SelectTarget); return(dialog); }
private SelectTarget.ViewModel ShowSelectorDialog(TargetValidator validator, int?x) { var selectTargetParameters = new SelectTargetParameters { Validator = validator, CanCancel = true, X = x }; var dialog = ViewModels.SelectTarget.Create(selectTargetParameters); Shell.ShowModalDialog(dialog, DialogType.Small, InteractionState.SelectTarget); return(dialog); }
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 }); }
public override bool SelectTarget(out IEnumerable <IWowUnit> possibleTargets) { List <IWowUnit> healableUnits = new(Bot.Objects.Partymembers) { Bot.Player }; // healableUnits.AddRange(Bot.ObjectManager.PartyPets); possibleTargets = healableUnits .Where(e => TargetValidator.IsValid(e) && e.Health > 1 && e.Health < e.MaxHealth) .OrderByDescending(e => e.Type) .ThenByDescending(e => e.MaxHealth - e.Health); return(possibleTargets.Any()); }
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 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; }
public virtual void Initialize(Card card, Game game, TargetValidator validator = null) { Game = game; Card = card; Validator = validator; }
public virtual void Initialize(Card card, Game game, TargetValidator validator = null) { Game = game; Card = card; Validator = validator; }
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; }
public HammerTargetCollectorComponent(TargetCollector targetCollector, TargetValidator targetValidator) : base(targetCollector, targetValidator) { }