protected override void ExecuteQuery() { var chosenAttackers = Game.Recorder.LoadDecisionResult(); if (chosenAttackers is ChosenAttackers) { Result = (ChosenAttackers)chosenAttackers; } else { // For backward compatibility reasons // so old savegames can be loaded. Result = new ChosenAttackers((ChosenCards)chosenAttackers); } }
public MachineHandler() { Result = new ChosenAttackers(); _executor = new MachinePlanExecutor(this); }
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; }
private bool IsValidAttackerDeclaration(ChosenAttackers attackers) { return(CreaturesThatMustAttack.All(creature => attackers.Any(x => x.Card == creature))); }
public ScenarioHandler() { Result = new ChosenAttackers(); }