From 2491d0782eb01c3c9cb282b79c74f01501875852 Mon Sep 17 00:00:00 2001 From: drdev Date: Wed, 12 Mar 2014 22:28:26 +0000 Subject: [PATCH] Pull in targeting changes to forge-m-base --- .../src/forge/player/TargetSelection.java | 81 +++---------------- .../match/input/InputSelectTargets.java | 38 ++++++++- 2 files changed, 50 insertions(+), 69 deletions(-) diff --git a/forge-m-base/src/forge/player/TargetSelection.java b/forge-m-base/src/forge/player/TargetSelection.java index d7f340197c5..c03cf05d7bc 100644 --- a/forge-m-base/src/forge/player/TargetSelection.java +++ b/forge-m-base/src/forge/player/TargetSelection.java @@ -21,13 +21,12 @@ import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.game.Game; -import forge.game.GameObject; -import forge.game.card.Card; -import forge.game.card.CardLists; -import forge.game.player.Player; -import forge.game.spellability.SpellAbility; -import forge.game.spellability.SpellAbilityStackInstance; -import forge.game.spellability.TargetRestrictions; +import forge.game.GameObject; +import forge.game.card.Card; +import forge.game.card.CardLists; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.TargetRestrictions; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.screens.match.input.InputSelectTargets; @@ -188,67 +187,13 @@ public class TargetSelection { public boolean apply(final Card c) { return c.sharesControllerWith(card); } - }); - } - } - // If second target has properties related to the first - if (tgt.getRelatedProperty() != null && !targetedObjects.isEmpty()) { - final List list = new ArrayList(); - final String related = tgt.getRelatedProperty(); - for (final Object o : targetedObjects) { - if (o instanceof Card) { - list.add((Card) o); - } - } - if (!list.isEmpty()) { - final Card card = list.get(0); - if ("LEPower".equals(related)) { - choices = CardLists.filter(choices, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.getNetAttack() <= card.getNetAttack(); - } - }); - } - if ("LECMC".equals(related)) { - choices = CardLists.filter(choices, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.getCMC() <= card.getCMC(); - } - }); - } - } - } - // If all cards must be from the same zone - if (tgt.isSingleZone() && !targeted.isEmpty()) { - choices = CardLists.filterControlledBy(choices, targeted.get(0).getController()); - } - // If all cards must be from different zones - if (tgt.isDifferentZone() && !targeted.isEmpty()) { - choices = CardLists.filterControlledBy(choices, targeted.get(0).getController().getOpponent()); - } - // If all cards must have different controllers - if (tgt.isDifferentControllers() && !targeted.isEmpty()) { - final List availableControllers = new ArrayList(game.getPlayers()); - for (int i = 0; i < targeted.size(); i++) { - availableControllers.remove(targeted.get(i).getController()); - } - choices = CardLists.filterControlledBy(choices, availableControllers); - } - // If the cards can't share a creature type - if (tgt.isWithoutSameCreatureType() && !targeted.isEmpty()) { - final Card card = targeted.get(0); - choices = CardLists.filter(choices, new Predicate() { - @Override - public boolean apply(final Card c) { - return !c.sharesCreatureTypeWith(card); - } - }); - } - return choices; - } - + }); + } + } + + return choices; + } + /** *

* chooseCardFromList. diff --git a/forge-m-base/src/forge/screens/match/input/InputSelectTargets.java b/forge-m-base/src/forge/screens/match/input/InputSelectTargets.java index 309958f2f62..272899bf97b 100644 --- a/forge-m-base/src/forge/screens/match/input/InputSelectTargets.java +++ b/forge-m-base/src/forge/screens/match/input/InputSelectTargets.java @@ -1,6 +1,7 @@ package forge.screens.match.input; import forge.game.GameEntity; +import forge.game.GameObject; import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.player.Player; @@ -9,6 +10,7 @@ import forge.game.spellability.TargetRestrictions; import forge.screens.match.FControl; import forge.toolbox.GuiChoose; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,6 +22,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { private final Map targetDepth = new HashMap(); private final TargetRestrictions tgt; private final SpellAbility sa; + private Card lastTarget = null; private boolean bCancel = false; private boolean bOk = false; private final boolean mandatory; @@ -109,7 +112,40 @@ public final class InputSelectTargets extends InputSyncronizedBase { if (!card.canBeTargetedBy(sa)) { showMessage(sa.getHostCard() + " - Cannot target this card (Shroud? Protection? Restrictions)."); return; - } + } + // If all cards must be from the same zone + if (tgt.isSingleZone() && lastTarget != null && !card.getController().equals(lastTarget.getController())) { + showMessage(sa.getHostCard() + " - Cannot target this card (not in the same zone)"); + return; + } + + // If all cards must be from different zones + if (tgt.isDifferentZone() && lastTarget != null && !card.getController().equals(lastTarget.getController().getOpponent())) { + showMessage(sa.getHostCard() + " - Cannot target this card (not in different zones)"); + return; + } + + // If the cards can't share a creature type + if (tgt.isWithoutSameCreatureType() && lastTarget != null && card.sharesCreatureTypeWith(lastTarget)) { + showMessage(sa.getHostCard() + " - Cannot target this card (should not share a creature type)"); + return; + } + + // If all cards must have different controllers + if (tgt.isDifferentControllers()) { + final List targetedControllers = new ArrayList(); + for (GameObject o : targetDepth.keySet()) { + if (o instanceof Card) { + Player p = ((Card) o).getController(); + targetedControllers.add(p); + } + } + if (targetedControllers.contains(card.getController())) { + showMessage(sa.getHostCard() + " - Cannot target this card (must have different controllers)"); + return; + } + } + if (!choices.contains(card)) { if (card.isPlaneswalker() && sa.getApi() == ApiType.DealDamage) { showMessage(sa.getHostCard() + " - To deal an opposing Planeswalker direct damage, target its controller and then redirect the damage on resolution.");