* Ninjutsu - Fixed that the selection of the unblocked attacker was not handled untargeted (so shroud on a creature did prevent to be able to select it).

This commit is contained in:
LevelX2 2015-09-25 22:15:13 +02:00
parent c7edbbac5b
commit 28b575cf37

View file

@ -1,36 +1,33 @@
/* /*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, are * Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met: * permitted provided that the following conditions are met:
* *
* 1. Redistributions of source code must retain the above copyright notice, this list of * 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer. * conditions and the following disclaimer.
* *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list * 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials * of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution. * provided with the distribution.
* *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.keyword; package mage.abilities.keyword;
import java.util.UUID; import java.util.UUID;
import mage.constants.Zone;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.ActivatedAbilityImpl; import mage.abilities.ActivatedAbilityImpl;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
@ -41,6 +38,7 @@ import mage.cards.Card;
import mage.cards.Cards; import mage.cards.Cards;
import mage.cards.CardsImpl; import mage.cards.CardsImpl;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.permanent.UnblockedPredicate; import mage.filter.predicate.permanent.UnblockedPredicate;
import mage.game.Game; import mage.game.Game;
@ -52,9 +50,9 @@ import mage.target.common.TargetControlledPermanent;
/** /**
* 702.47. Ninjutsu * 702.47. Ninjutsu
* *
* 702.47a Ninjutsu is an activated ability that functions only while the card * 702.47a Ninjutsu is an activated ability that functions only while the card
* with ninjutsu is in a player's hand. "Ninjutsu [cost]" means "[Cost], Reveal * with ninjutsu is in a player's hand. "Ninjutsu [cost]" means "[Cost], Reveal
* this card from your hand, Return an unblocked attacking creature you control * this card from your hand, Return an unblocked attacking creature you control
* to its owner's hand: Put this card onto the battlefield from your hand tapped * to its owner's hand: Put this card onto the battlefield from your hand tapped
* and attacking." * and attacking."
* *
@ -62,8 +60,8 @@ import mage.target.common.TargetControlledPermanent;
* announced until the ability leaves the stack. * announced until the ability leaves the stack.
* *
* 702.47c A ninjutsu ability may be activated only while a creature on the * 702.47c A ninjutsu ability may be activated only while a creature on the
* battlefield is unblocked (see rule 509.1h). The creature with ninjutsu is * battlefield is unblocked (see rule 509.1h). The creature with ninjutsu is put
* put onto the battlefield unblocked. It will be attacking the same player or * onto the battlefield unblocked. It will be attacking the same player or
* planeswalker as the creature that was returned to its owner's hand. * planeswalker as the creature that was returned to its owner's hand.
* *
* *
@ -78,13 +76,13 @@ public class NinjutsuAbility extends ActivatedAbilityImpl {
} }
/** /**
* *
* @param manaCost ninjutsu mana cost * @param manaCost ninjutsu mana cost
*/ */
public NinjutsuAbility(ManaCost manaCost) { public NinjutsuAbility(ManaCost manaCost) {
super(Zone.HAND,new NinjutsuEffect(), manaCost); super(Zone.HAND, new NinjutsuEffect(), manaCost);
this.addCost(new RevealNinjutsuCardCost()); this.addCost(new RevealNinjutsuCardCost());
this.addCost(new ReturnAttackerToHandTargetCost(new TargetControlledCreaturePermanent(1,1,filter,false))); this.addCost(new ReturnAttackerToHandTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, true)));
} }
public NinjutsuAbility(NinjutsuAbility ability) { public NinjutsuAbility(NinjutsuAbility ability) {
@ -128,7 +126,7 @@ class NinjutsuEffect extends OneShotEffect {
Permanent permanent = game.getPermanent(source.getSourceId()); Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) { if (permanent != null) {
UUID defendingPlayerId = null; UUID defendingPlayerId = null;
for (Cost cost :source.getCosts()) { for (Cost cost : source.getCosts()) {
if (cost instanceof ReturnAttackerToHandTargetCost) { if (cost instanceof ReturnAttackerToHandTargetCost) {
defendingPlayerId = ((ReturnAttackerToHandTargetCost) cost).getDefendingPlayerId(); defendingPlayerId = ((ReturnAttackerToHandTargetCost) cost).getDefendingPlayerId();
} }
@ -161,7 +159,7 @@ class ReturnAttackerToHandTargetCost extends CostImpl {
@Override @Override
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) {
if (targets.choose(Outcome.ReturnToHand, controllerId, sourceId, game)) { if (targets.choose(Outcome.ReturnToHand, controllerId, sourceId, game)) {
for (UUID targetId: targets.get(0).getTargets()) { for (UUID targetId : targets.get(0).getTargets()) {
Permanent permanent = game.getPermanent(targetId); Permanent permanent = game.getPermanent(targetId);
if (permanent == null) { if (permanent == null) {
return false; return false;