From 795bf74f1133fc09b80cb7002d967b76e9cf574b Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 20 Sep 2015 18:25:48 +0300 Subject: [PATCH 01/42] Add Demon token and use it for existing cards. --- .../sets/avacynrestored/DemonicRising.java | 16 +---- .../ObNixilisOfTheBlackOath.java | 24 +------- .../sets/innistrad/SkirsdagHighPriest.java | 17 +----- .../magicorigins/PriestOfTheBloodRite.java | 18 +----- .../mage/game/permanent/token/DemonToken.java | 60 +++++++++++++++++++ 5 files changed, 66 insertions(+), 69 deletions(-) create mode 100644 Mage/src/mage/game/permanent/token/DemonToken.java diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java b/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java index b3f1f6ee608..c320fa32841 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/DemonicRising.java @@ -29,7 +29,6 @@ package mage.sets.avacynrestored; import mage.constants.CardType; import mage.constants.Rarity; -import mage.MageInt; import mage.ObjectColor; import mage.abilities.TriggeredAbility; import mage.abilities.common.BeginningOfYourEndStepTriggeredAbility; @@ -38,7 +37,7 @@ import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.DemonToken; import java.util.UUID; @@ -53,7 +52,6 @@ public class DemonicRising extends CardImpl { super(ownerId, 94, "Demonic Rising", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); this.expansionSetCode = "AVR"; - // At the beginning of your end step, if you control exactly one creature, put a 5/5 black Demon creature token with flying onto the battlefield. TriggeredAbility ability = new BeginningOfYourEndStepTriggeredAbility(new CreateTokenEffect(new DemonToken()), false); this.addAbility(new ConditionalTriggeredAbility(ability, OneControlledCreatureCondition.getInstance(), ruleText)); @@ -68,15 +66,3 @@ public class DemonicRising extends CardImpl { return new DemonicRising(this); } } - -class DemonToken extends Token { - public DemonToken() { - super("Demon", "a 5/5 black Demon creature token with flying"); - cardType.add(CardType.CREATURE); - color.setBlack(true); - subtype.add("Demon"); - power = new MageInt(5); - toughness = new MageInt(5); - addAbility(FlyingAbility.getInstance()); - } -} diff --git a/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java b/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java index 79cb66aa248..2593433d2ea 100644 --- a/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java +++ b/Mage.Sets/src/mage/sets/commander2014/ObNixilisOfTheBlackOath.java @@ -28,7 +28,6 @@ package mage.sets.commander2014; import java.util.UUID; -import mage.MageInt; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; @@ -55,7 +54,7 @@ import mage.constants.Zone; import mage.counters.CounterType; import mage.game.Game; import mage.game.command.Emblem; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.DemonToken; import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; @@ -77,13 +76,13 @@ public class ObNixilisOfTheBlackOath extends CardImpl { this.addAbility(new LoyaltyAbility(new ObNixilisOfTheBlackOathEffect1(), 2)); // -2: Put a 5/5 black Demon creature token with flying onto the battlefield. You lose 2 life. - LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new CreateTokenEffect(new ObNixilisDemonToken()), -2); + LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new CreateTokenEffect(new DemonToken()), -2); loyaltyAbility.addEffect(new LoseLifeSourceControllerEffect(2)); this.addAbility(loyaltyAbility); // -8: You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power." this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new ObNixilisOfTheBlackOathEmblem()), -8)); - + // Ob Nixilis of the Black Oath can be your commander. this.addAbility(CanBeYourCommanderAbility.getInstance()); } @@ -134,23 +133,6 @@ class ObNixilisOfTheBlackOathEffect1 extends OneShotEffect { } -class ObNixilisDemonToken extends Token { - - ObNixilisDemonToken() { - super("Demon", "5/5 black Demon creature token with flying"); - setTokenType(1); - setOriginalExpansionSetCode("C14"); - cardType.add(CardType.CREATURE); - subtype.add("Demon"); - - color.setBlack(true); - power = new MageInt(5); - toughness = new MageInt(5); - - addAbility(FlyingAbility.getInstance()); - } -} - class ObNixilisOfTheBlackOathEmblem extends Emblem { // You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power." public ObNixilisOfTheBlackOathEmblem() { diff --git a/Mage.Sets/src/mage/sets/innistrad/SkirsdagHighPriest.java b/Mage.Sets/src/mage/sets/innistrad/SkirsdagHighPriest.java index 08e333a7ef6..16fef1058fe 100644 --- a/Mage.Sets/src/mage/sets/innistrad/SkirsdagHighPriest.java +++ b/Mage.Sets/src/mage/sets/innistrad/SkirsdagHighPriest.java @@ -44,7 +44,7 @@ import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.DemonToken; import mage.target.common.TargetControlledCreaturePermanent; /** @@ -111,18 +111,3 @@ class SkirsdagHighPriestCost extends CostImpl { return paid; } } - -class DemonToken extends Token { - - DemonToken() { - super("Demon", "5/5 black Demon creature token with flying"); - cardType.add(CardType.CREATURE); - subtype.add("Demon"); - - color.setBlack(true); - power = new MageInt(5); - toughness = new MageInt(5); - - addAbility(FlyingAbility.getInstance()); - } -} diff --git a/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java b/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java index 6eed42819e2..ad780413154 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java +++ b/Mage.Sets/src/mage/sets/magicorigins/PriestOfTheBloodRite.java @@ -38,7 +38,7 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.TargetController; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.DemonToken; /** * @@ -70,19 +70,3 @@ public class PriestOfTheBloodRite extends CardImpl { return new PriestOfTheBloodRite(this); } } - -class DemonToken extends Token { - - DemonToken() { - super("Demon", "5/5 black Demon creature token with flying"); - cardType.add(CardType.CREATURE); - subtype.add("Demon"); - setOriginalExpansionSetCode("ORI"); - - color.setBlack(true); - power = new MageInt(5); - toughness = new MageInt(5); - - addAbility(FlyingAbility.getInstance()); - } -} diff --git a/Mage/src/mage/game/permanent/token/DemonToken.java b/Mage/src/mage/game/permanent/token/DemonToken.java new file mode 100644 index 00000000000..72231decd68 --- /dev/null +++ b/Mage/src/mage/game/permanent/token/DemonToken.java @@ -0,0 +1,60 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* 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 +* 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 +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.Arrays; +import mage.constants.CardType; +import mage.MageInt; +import mage.abilities.keyword.FlyingAbility; + +/** + * + * @author LoneFox + */ +public class DemonToken extends Token { + + public DemonToken() { + super("Demon", "1/1 black Demon creature token with flying"); + cardType.add(CardType.CREATURE); + color.setBlack(true); + subtype.add("Demon"); + power = new MageInt(5); + toughness = new MageInt(5); + addAbility(FlyingAbility.getInstance()); + availableImageSetCodes.addAll(Arrays.asList("INN", "AVR", "C14", "ORI")); + } + + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("C14")) { + this.setTokenType(2); + } + } +} From 5d51e03a696ddf25d019e297c7cea32ad8554a7c Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sun, 20 Sep 2015 19:17:30 +0300 Subject: [PATCH 02/42] Add Goblin Rogue token and use it for existing cards. --- .../src/mage/sets/lorwyn/BoggartMob.java | 20 ++------ .../mage/sets/modernmasters/MarshFlitter.java | 16 +----- .../sets/modernmasters/WarrenWeirding.java | 17 ++----- .../mage/sets/morningtide/WeirdingShaman.java | 16 +----- .../permanent/token/GoblinRogueToken.java | 51 +++++++++++++++++++ 5 files changed, 63 insertions(+), 57 deletions(-) create mode 100644 Mage/src/mage/game/permanent/token/GoblinRogueToken.java diff --git a/Mage.Sets/src/mage/sets/lorwyn/BoggartMob.java b/Mage.Sets/src/mage/sets/lorwyn/BoggartMob.java index 0bfee0cd162..e80f8e9d8f4 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/BoggartMob.java +++ b/Mage.Sets/src/mage/sets/lorwyn/BoggartMob.java @@ -38,14 +38,14 @@ import mage.constants.Rarity; import mage.constants.SetTargetPointer; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.GoblinRogueToken; /** * * @author fireshoes */ public class BoggartMob extends CardImpl { - + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Goblin you control"); static { @@ -62,10 +62,10 @@ public class BoggartMob extends CardImpl { // Champion a Goblin this.addAbility(new ChampionAbility(this, "Goblin")); - + // Whenever a Goblin you control deals combat damage to a player, you may put a 1/1 black Goblin Rogue creature token onto the battlefield. this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility( - new CreateTokenEffect(new BlackGoblinRogueToken()), + new CreateTokenEffect(new GoblinRogueToken()), filter, true, SetTargetPointer.NONE, true)); } @@ -78,15 +78,3 @@ public class BoggartMob extends CardImpl { return new BoggartMob(this); } } - -class BlackGoblinRogueToken extends Token { - BlackGoblinRogueToken() { - super("Goblin Rogue", "1/1 black Goblin Rogue creature token"); - cardType.add(CardType.CREATURE); - color.setBlack(true); - subtype.add("Goblin"); - subtype.add("Rogue"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java b/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java index 56a97459bb9..65428a838bb 100644 --- a/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java +++ b/Mage.Sets/src/mage/sets/modernmasters/MarshFlitter.java @@ -44,7 +44,7 @@ import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.GoblinRogueToken; import mage.target.common.TargetControlledPermanent; /** @@ -70,7 +70,7 @@ public class MarshFlitter extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // When Marsh Flitter enters the battlefield, put two 1/1 black Goblin Rogue creature tokens onto the battlefield. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new BlackGoblinRogueToken(), 2), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GoblinRogueToken(), 2), false)); // Sacrifice a Goblin: Marsh Flitter has base power and toughness 3/3 until end of turn. Effect effect = new SetPowerToughnessSourceEffect(3, 3, Duration.EndOfTurn); effect.setText("{this} has base power and toughness 3/3 until end of turn"); @@ -88,15 +88,3 @@ public class MarshFlitter extends CardImpl { return new MarshFlitter(this); } } - -class BlackGoblinRogueToken extends Token { - BlackGoblinRogueToken() { - super("Goblin Rogue", "1/1 black Goblin Rogue creature tokens"); - cardType.add(CardType.CREATURE); - color.setBlack(true); - subtype.add("Goblin"); - subtype.add("Rogue"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/modernmasters/WarrenWeirding.java b/Mage.Sets/src/mage/sets/modernmasters/WarrenWeirding.java index 8a294fd70a3..b3f6d2144fa 100644 --- a/Mage.Sets/src/mage/sets/modernmasters/WarrenWeirding.java +++ b/Mage.Sets/src/mage/sets/modernmasters/WarrenWeirding.java @@ -47,6 +47,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.game.permanent.token.GoblinRogueToken; import mage.game.permanent.token.Token; import mage.players.Player; import mage.target.TargetPlayer; @@ -83,9 +84,11 @@ public class WarrenWeirding extends CardImpl { class WarrenWeirdingEffect extends OneShotEffect { private static final FilterCreaturePermanent filterGoblin = new FilterCreaturePermanent(); + static { filterGoblin.add(new SubtypePredicate("Goblin")); } + WarrenWeirdingEffect ( ) { super(Outcome.Sacrifice); staticText = "Target player sacrifices a creature. If a Goblin is sacrificed this way, that player puts two 1/1 black Goblin Rogue creature tokens onto the battlefield, and those tokens gain haste until end of turn"; @@ -113,7 +116,7 @@ class WarrenWeirdingEffect extends OneShotEffect { permanent.sacrifice(source.getSourceId(), game); if (filterGoblin.match(permanent, game)) { for (int i = 0; i < 2; i++) { - Token token = new WarrenWeirdingBlackGoblinRogueToken(); + Token token = new GoblinRogueToken(); Effect effect = new CreateTokenTargetEffect(token); effect.setTargetPointer(new FixedTarget(player.getId())); if (effect.apply(game, source)) { @@ -138,15 +141,3 @@ class WarrenWeirdingEffect extends OneShotEffect { } } - -class WarrenWeirdingBlackGoblinRogueToken extends Token { - WarrenWeirdingBlackGoblinRogueToken() { - super("Goblin Rogue", "1/1 black Goblin Rogue creature tokens, and those tokens gain haste until end of turn"); - cardType.add(CardType.CREATURE); - color.setBlack(true); - subtype.add("Goblin"); - subtype.add("Rogue"); - power.setValue(1); - toughness.setValue(1); - } -} diff --git a/Mage.Sets/src/mage/sets/morningtide/WeirdingShaman.java b/Mage.Sets/src/mage/sets/morningtide/WeirdingShaman.java index 8bc8b3e8eb4..063142396ed 100644 --- a/Mage.Sets/src/mage/sets/morningtide/WeirdingShaman.java +++ b/Mage.Sets/src/mage/sets/morningtide/WeirdingShaman.java @@ -41,7 +41,7 @@ import mage.cards.CardImpl; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.GoblinRogueToken; import mage.target.common.TargetControlledPermanent; /** @@ -64,7 +64,7 @@ public class WeirdingShaman extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new goblinRogueToken(), 2), new ManaCostsImpl("{3}{B}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GoblinRogueToken(), 2), new ManaCostsImpl("{3}{B}")); ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); this.addAbility(ability); } @@ -78,15 +78,3 @@ public class WeirdingShaman extends CardImpl { return new WeirdingShaman(this); } } - -class goblinRogueToken extends Token { - goblinRogueToken() { - super("Goblin", "1/1 black Goblin Rogue creature tokens"); - cardType.add(CardType.CREATURE); - color.setBlack(true); - subtype.add("Goblin"); - subtype.add("Rogue"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage/src/mage/game/permanent/token/GoblinRogueToken.java b/Mage/src/mage/game/permanent/token/GoblinRogueToken.java new file mode 100644 index 00000000000..b7839593c22 --- /dev/null +++ b/Mage/src/mage/game/permanent/token/GoblinRogueToken.java @@ -0,0 +1,51 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* 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 +* 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 +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.Arrays; +import mage.constants.CardType; +import mage.MageInt; + +/** + * + * @author LoneFox + */ +public class GoblinRogueToken extends Token { + + public GoblinRogueToken() { + super("Goblin Rogue", "1/1 black Goblin Rogue creature token"); + cardType.add(CardType.CREATURE); + color.setBlack(true); + subtype.add("Goblin"); + subtype.add("Rogue"); + power = new MageInt(1); + toughness = new MageInt(1); + availableImageSetCodes.addAll(Arrays.asList("LRW", "MMA")); + } +} From 5fdd1aae495f96054791ee4b8eba032527799b2d Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 23 Sep 2015 12:34:28 +0300 Subject: [PATCH 03/42] Add Sliver token and use it for existing cards --- .../src/mage/sets/legions/BroodSliver.java | 20 ++------ .../mage/sets/magic2014/HiveStirrings.java | 15 +----- .../src/mage/sets/magic2015/SliverHive.java | 14 +----- .../src/mage/sets/stronghold/SliverQueen.java | 13 +---- .../game/permanent/token/SliverToken.java | 49 +++++++++++++++++++ 5 files changed, 56 insertions(+), 55 deletions(-) create mode 100644 Mage/src/mage/game/permanent/token/SliverToken.java diff --git a/Mage.Sets/src/mage/sets/legions/BroodSliver.java b/Mage.Sets/src/mage/sets/legions/BroodSliver.java index 48e856b3b72..86ea9e7ec7b 100644 --- a/Mage.Sets/src/mage/sets/legions/BroodSliver.java +++ b/Mage.Sets/src/mage/sets/legions/BroodSliver.java @@ -37,7 +37,7 @@ import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.SetTargetPointer; import mage.filter.common.FilterCreaturePermanent; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.SliverToken; /** * @@ -53,12 +53,11 @@ public class BroodSliver extends CardImpl { this.power = new MageInt(3); this.toughness = new MageInt(3); - // Whenever a Sliver deals combat damage to a player, its controller may put a 1/1 colorless Sliver creature token onto the battlefield. + // Whenever a Sliver deals combat damage to a player, its controller may put a 1/1 colorless Sliver creature token onto the battlefield. Effect effect = new CreateTokenTargetEffect(new SliverToken()); effect.setText("its controller may put a 1/1 colorless Sliver creature token onto the battlefield"); - this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(effect, - new FilterCreaturePermanent("Sliver", "a Sliver"), - true, SetTargetPointer.PLAYER, true)); + this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(effect, + new FilterCreaturePermanent("Sliver", "a Sliver"), true, SetTargetPointer.PLAYER, true)); } public BroodSliver(final BroodSliver card) { @@ -70,14 +69,3 @@ public class BroodSliver extends CardImpl { return new BroodSliver(this); } } - -class SliverToken extends Token { - - public SliverToken() { - super("Sliver", "1/1 colorless Sliver creature token"); - cardType.add(CardType.CREATURE); - subtype.add("Sliver"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/magic2014/HiveStirrings.java b/Mage.Sets/src/mage/sets/magic2014/HiveStirrings.java index 2d378cc5167..9f9a6a6f027 100644 --- a/Mage.Sets/src/mage/sets/magic2014/HiveStirrings.java +++ b/Mage.Sets/src/mage/sets/magic2014/HiveStirrings.java @@ -28,12 +28,11 @@ package mage.sets.magic2014; import java.util.UUID; -import mage.MageInt; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.SliverToken; /** * @@ -45,10 +44,8 @@ public class HiveStirrings extends CardImpl { super(ownerId, 21, "Hive Stirrings", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{W}"); this.expansionSetCode = "M14"; - // Put two 1/1 colorless Sliver creature tokens onto the battlefield. this.getSpellAbility().addEffect(new CreateTokenEffect(new SliverToken(), 2)); - } public HiveStirrings(final HiveStirrings card) { @@ -60,13 +57,3 @@ public class HiveStirrings extends CardImpl { return new HiveStirrings(this); } } - -class SliverToken extends Token { - SliverToken() { - super("Sliver", "a 1/1 colorless Sliver creature token"); - cardType.add(CardType.CREATURE); - subtype.add("Sliver"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/magic2015/SliverHive.java b/Mage.Sets/src/mage/sets/magic2015/SliverHive.java index f5c40cb43e3..cfba0c94491 100644 --- a/Mage.Sets/src/mage/sets/magic2015/SliverHive.java +++ b/Mage.Sets/src/mage/sets/magic2015/SliverHive.java @@ -51,7 +51,7 @@ import mage.filter.FilterSpell; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.SliverToken; /** * @@ -134,15 +134,3 @@ class SliverHiveManaCondition extends CreatureCastManaCondition { return false; } } - -class SliverToken extends Token { - - SliverToken() { - super("Sliver", "1/1 colorless Sliver creature token"); - setOriginalExpansionSetCode("M15"); - cardType.add(CardType.CREATURE); - subtype.add("Sliver"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/stronghold/SliverQueen.java b/Mage.Sets/src/mage/sets/stronghold/SliverQueen.java index a7d7b7c7273..c5218656fc1 100644 --- a/Mage.Sets/src/mage/sets/stronghold/SliverQueen.java +++ b/Mage.Sets/src/mage/sets/stronghold/SliverQueen.java @@ -36,7 +36,7 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.Zone; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.SliverToken; /** * @@ -66,14 +66,3 @@ public class SliverQueen extends CardImpl { return new SliverQueen(this); } } - -class SliverToken extends Token { - - public SliverToken() { - super("Sliver", "1/1 colorless Sliver creature token"); - cardType.add(CardType.CREATURE); - subtype.add("Sliver"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} \ No newline at end of file diff --git a/Mage/src/mage/game/permanent/token/SliverToken.java b/Mage/src/mage/game/permanent/token/SliverToken.java new file mode 100644 index 00000000000..38be6195be7 --- /dev/null +++ b/Mage/src/mage/game/permanent/token/SliverToken.java @@ -0,0 +1,49 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* 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 +* 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 +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.Arrays; +import mage.constants.CardType; +import mage.MageInt; + +/** + * + * @author LoneFox + */ +public class SliverToken extends Token { + + public SliverToken() { + super("Demon", "1/1 colorless Sliver creature token"); + cardType.add(CardType.CREATURE); + subtype.add("Sliver"); + power = new MageInt(1); + toughness = new MageInt(1); + availableImageSetCodes.addAll(Arrays.asList("M14", "M15")); + } +} From 3d1ae1c414bfaf08cf51543b7540a64fb167391f Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 23 Sep 2015 12:49:12 +0300 Subject: [PATCH 04/42] Add Cat token and use it for existing cards. --- .../sets/magic2013/AjaniCallerOfThePride.java | 14 +----- .../src/mage/sets/magic2014/AjanisChosen.java | 16 +----- .../mirrodinbesieged/WhiteSunsZenith.java | 16 +----- .../sets/scarsofmirrodin/KembaKhaRegent.java | 15 +----- .../mage/game/permanent/token/CatToken.java | 50 +++++++++++++++++++ 5 files changed, 55 insertions(+), 56 deletions(-) create mode 100644 Mage/src/mage/game/permanent/token/CatToken.java diff --git a/Mage.Sets/src/mage/sets/magic2013/AjaniCallerOfThePride.java b/Mage.Sets/src/mage/sets/magic2013/AjaniCallerOfThePride.java index 9c4305c3bef..2575cf4bc83 100644 --- a/Mage.Sets/src/mage/sets/magic2013/AjaniCallerOfThePride.java +++ b/Mage.Sets/src/mage/sets/magic2013/AjaniCallerOfThePride.java @@ -46,7 +46,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Rarity; import mage.counters.CounterType; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.CatToken; import mage.target.common.TargetCreaturePermanent; /** @@ -91,15 +91,3 @@ public class AjaniCallerOfThePride extends CardImpl { return new AjaniCallerOfThePride(this); } } - -class CatToken extends Token { - - public CatToken() { - super("Cat", "2/2 white Cat creature tokens"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - subtype.add("Cat"); - power = new MageInt(2); - toughness = new MageInt(2); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java b/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java index 62e2921c40a..1728e7f1f4a 100644 --- a/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java +++ b/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java @@ -43,6 +43,7 @@ import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.game.permanent.token.CatToken; import mage.game.permanent.token.Token; import mage.players.Player; @@ -56,7 +57,7 @@ public class AjanisChosen extends CardImpl { static { filter.add(new CardTypePredicate(CardType.ENCHANTMENT)); } - + public AjanisChosen(UUID ownerId) { super(ownerId, 2, "Ajani's Chosen", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); this.expansionSetCode = "M14"; @@ -123,16 +124,3 @@ class AjanisChosenEffect extends OneShotEffect { } } - - -class CatToken extends Token { - public CatToken() { - super("Cat", "2/2 white Cat creature token"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - - subtype.add("Cat"); - power = new MageInt(2); - toughness = new MageInt(2); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/WhiteSunsZenith.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/WhiteSunsZenith.java index ca6630a0c4d..4ff0f362062 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/WhiteSunsZenith.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/WhiteSunsZenith.java @@ -29,7 +29,6 @@ package mage.sets.mirrodinbesieged; import java.util.UUID; -import mage.MageInt; import mage.ObjectColor; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.CreateTokenEffect; @@ -37,7 +36,7 @@ import mage.abilities.effects.common.ShuffleSpellEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.CatToken; /** * @@ -62,16 +61,3 @@ public class WhiteSunsZenith extends CardImpl { return new WhiteSunsZenith(this); } } - -class CatToken extends Token { - public CatToken() { - super("Cat", "2/2 white Cat creature token"); - setOriginalExpansionSetCode("SOM"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - - subtype.add("Cat"); - power = new MageInt(2); - toughness = new MageInt(2); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/KembaKhaRegent.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/KembaKhaRegent.java index 91e4e6d7672..acbfb13f318 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/KembaKhaRegent.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/KembaKhaRegent.java @@ -38,7 +38,7 @@ import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.dynamicvalue.common.EquipmentAttachedCount; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.CatToken; /** * @@ -69,16 +69,3 @@ public class KembaKhaRegent extends CardImpl { return new KembaKhaRegent(this); } } - -class CatToken extends Token { - - public CatToken() { - super("Cat", "a 2/2 white Cat creature token"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - - subtype.add("Cat"); - power = new MageInt(2); - toughness = new MageInt(2); - } -} diff --git a/Mage/src/mage/game/permanent/token/CatToken.java b/Mage/src/mage/game/permanent/token/CatToken.java new file mode 100644 index 00000000000..544f4c8a1fa --- /dev/null +++ b/Mage/src/mage/game/permanent/token/CatToken.java @@ -0,0 +1,50 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* 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 +* 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 +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.Arrays; +import mage.constants.CardType; +import mage.MageInt; + +/** + * + * @author LoneFox + */ +public class CatToken extends Token { + + public CatToken() { + super("Demon", "2/2 white Cat creature token"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add("Cat"); + power = new MageInt(2); + toughness = new MageInt(2); + availableImageSetCodes.addAll(Arrays.asList("SOM", "M13", "M14", "C14")); + } +} From e5e7ec456d18a7ebe8cc08a1b21990cd3871e15b Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 23 Sep 2015 13:37:10 +0300 Subject: [PATCH 05/42] Fix a couple of copy-paste errors --- Mage/src/mage/game/permanent/token/CatToken.java | 2 +- Mage/src/mage/game/permanent/token/SliverToken.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage/src/mage/game/permanent/token/CatToken.java b/Mage/src/mage/game/permanent/token/CatToken.java index 544f4c8a1fa..486891abbb1 100644 --- a/Mage/src/mage/game/permanent/token/CatToken.java +++ b/Mage/src/mage/game/permanent/token/CatToken.java @@ -39,7 +39,7 @@ import mage.MageInt; public class CatToken extends Token { public CatToken() { - super("Demon", "2/2 white Cat creature token"); + super("Cat", "2/2 white Cat creature token"); cardType.add(CardType.CREATURE); color.setWhite(true); subtype.add("Cat"); diff --git a/Mage/src/mage/game/permanent/token/SliverToken.java b/Mage/src/mage/game/permanent/token/SliverToken.java index 38be6195be7..1c95852bfe0 100644 --- a/Mage/src/mage/game/permanent/token/SliverToken.java +++ b/Mage/src/mage/game/permanent/token/SliverToken.java @@ -39,7 +39,7 @@ import mage.MageInt; public class SliverToken extends Token { public SliverToken() { - super("Demon", "1/1 colorless Sliver creature token"); + super("Sliver", "1/1 colorless Sliver creature token"); cardType.add(CardType.CREATURE); subtype.add("Sliver"); power = new MageInt(1); From 9279d81c247e42a019dc46f1ba0057fa5a215264 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 23 Sep 2015 13:55:40 +0300 Subject: [PATCH 06/42] Add Human token and use it for existing cards --- .../avacynrestored/CommandersAuthority.java | 9 ++- .../avacynrestored/VoiceOfTheProvinces.java | 14 +---- .../darkascension/GatherTheTownsfolk.java | 17 +----- .../darkascension/IncreasingDevotion.java | 9 ++- .../sets/darkascension/ThrabenDoomsayer.java | 6 +- .../mage/game/permanent/token/HumanToken.java | 58 +++++++++++++++++++ 6 files changed, 76 insertions(+), 37 deletions(-) create mode 100644 Mage/src/mage/game/permanent/token/HumanToken.java diff --git a/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java b/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java index 7ec41d11dad..a408d0b7fe4 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/CommandersAuthority.java @@ -28,8 +28,6 @@ package mage.sets.avacynrestored; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -38,6 +36,13 @@ import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.permanent.token.HumanToken; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; diff --git a/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java b/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java index 552e5d59c41..4cb50e37fe1 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/VoiceOfTheProvinces.java @@ -36,7 +36,7 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.HumanToken; /** * @@ -66,15 +66,3 @@ public class VoiceOfTheProvinces extends CardImpl { return new VoiceOfTheProvinces(this); } } - -class HumanToken extends Token { - public HumanToken() { - super("Human", "1/1 white Human creature token"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - - subtype.add("Human"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/darkascension/GatherTheTownsfolk.java b/Mage.Sets/src/mage/sets/darkascension/GatherTheTownsfolk.java index d734501cf7f..15553884e18 100644 --- a/Mage.Sets/src/mage/sets/darkascension/GatherTheTownsfolk.java +++ b/Mage.Sets/src/mage/sets/darkascension/GatherTheTownsfolk.java @@ -30,13 +30,12 @@ package mage.sets.darkascension; import java.util.UUID; import mage.constants.CardType; import mage.constants.Rarity; -import mage.MageInt; import mage.ObjectColor; import mage.abilities.condition.common.FatefulHourCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.HumanToken; /** * @@ -64,17 +63,3 @@ public class GatherTheTownsfolk extends CardImpl { return new GatherTheTownsfolk(this); } } - -class HumanToken extends Token { - - public HumanToken() { - super("Human", "1/1 white Human creature token"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - - subtype.add("Human"); - power = new MageInt(1); - toughness = new MageInt(1); - } - -} diff --git a/Mage.Sets/src/mage/sets/darkascension/IncreasingDevotion.java b/Mage.Sets/src/mage/sets/darkascension/IncreasingDevotion.java index e5405b471e6..12f7f2fcd06 100644 --- a/Mage.Sets/src/mage/sets/darkascension/IncreasingDevotion.java +++ b/Mage.Sets/src/mage/sets/darkascension/IncreasingDevotion.java @@ -28,14 +28,18 @@ package mage.sets.darkascension; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TimingRule; +import mage.constants.Zone; import mage.game.Game; +import mage.game.permanent.token.HumanToken; import mage.game.stack.Spell; /** @@ -48,7 +52,6 @@ public class IncreasingDevotion extends CardImpl { super(ownerId, 11, "Increasing Devotion", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{W}{W}"); this.expansionSetCode = "DKA"; - // Put five 1/1 white Human creature tokens onto the battlefield. If Increasing Devotion was cast from a graveyard, put ten of those tokens onto the battlefield instead. this.getSpellAbility().addEffect(new IncreasingDevotionEffect()); diff --git a/Mage.Sets/src/mage/sets/darkascension/ThrabenDoomsayer.java b/Mage.Sets/src/mage/sets/darkascension/ThrabenDoomsayer.java index 5da2eef4b10..b5cb14cd29b 100644 --- a/Mage.Sets/src/mage/sets/darkascension/ThrabenDoomsayer.java +++ b/Mage.Sets/src/mage/sets/darkascension/ThrabenDoomsayer.java @@ -28,9 +28,6 @@ package mage.sets.darkascension; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; @@ -40,8 +37,11 @@ import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Rarity; import mage.constants.Zone; +import mage.game.permanent.token.HumanToken; /** * diff --git a/Mage/src/mage/game/permanent/token/HumanToken.java b/Mage/src/mage/game/permanent/token/HumanToken.java new file mode 100644 index 00000000000..9ca595ce975 --- /dev/null +++ b/Mage/src/mage/game/permanent/token/HumanToken.java @@ -0,0 +1,58 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* 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 +* 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 +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.Arrays; +import mage.constants.CardType; +import mage.MageInt; + +/** + * + * @author LoneFox + */ +public class HumanToken extends Token { + + public HumanToken() { + super("Human", "1/1 white Human creature token"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add("Human"); + power = new MageInt(1); + toughness = new MageInt(1); + availableImageSetCodes.addAll(Arrays.asList("DKA", "AVR", "FNMP")); + } + + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("AVR")) { + this.setTokenType(1); + } + } +} From 10695ddf4c205d7043f29a067c0658b2762f2ba5 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 23 Sep 2015 16:34:20 +0300 Subject: [PATCH 07/42] Add Warrior token and use it for existing cards. --- .../sets/dragonsoftarkir/SecureTheWastes.java | 19 +----- .../sets/khansoftarkir/HeraldOfAnafenza.java | 21 +------ .../mage/sets/khansoftarkir/MarduCharm.java | 36 ++++------- .../sets/khansoftarkir/MarduHordechief.java | 18 +----- .../mage/sets/khansoftarkir/TakeUpArms.java | 19 +----- .../game/permanent/token/WarriorToken.java | 59 +++++++++++++++++++ 6 files changed, 79 insertions(+), 93 deletions(-) create mode 100644 Mage/src/mage/game/permanent/token/WarriorToken.java diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/SecureTheWastes.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/SecureTheWastes.java index 0f3666570af..102d77a2e78 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/SecureTheWastes.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/SecureTheWastes.java @@ -28,13 +28,12 @@ package mage.sets.dragonsoftarkir; import java.util.UUID; -import mage.MageInt; import mage.abilities.dynamicvalue.common.ManacostVariableValue; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.WarriorToken; /** * @@ -47,7 +46,7 @@ public class SecureTheWastes extends CardImpl { this.expansionSetCode = "DTK"; // Put X 1/1 white Warrior creature tokens onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new SecureTheWastesToken(), new ManacostVariableValue())); + this.getSpellAbility().addEffect(new CreateTokenEffect(new WarriorToken(), new ManacostVariableValue())); } public SecureTheWastes(final SecureTheWastes card) { @@ -59,17 +58,3 @@ public class SecureTheWastes extends CardImpl { return new SecureTheWastes(this); } } - -class SecureTheWastesToken extends Token { - - SecureTheWastesToken() { - super("Warrior", "1/1 white Warrior creature token"); - this.setOriginalExpansionSetCode("DTK"); - cardType.add(CardType.CREATURE); - subtype.add("Warrior"); - - color.setWhite(true); - power = new MageInt(1); - toughness = new MageInt(1); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java b/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java index d1383261c6f..09e806e8bab 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java @@ -40,7 +40,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.WarriorToken; import mage.game.stack.StackAbility; /** @@ -79,7 +79,7 @@ public class HeraldOfAnafenza extends CardImpl { class HeraldOfAnafenzaTriggeredAbility extends TriggeredAbilityImpl { public HeraldOfAnafenzaTriggeredAbility() { - super(Zone.BATTLEFIELD, new CreateTokenEffect(new HeraldOfAnafenzaWarriorToken()), false); + super(Zone.BATTLEFIELD, new CreateTokenEffect(new WarriorToken()), false); } public HeraldOfAnafenzaTriggeredAbility(final HeraldOfAnafenzaTriggeredAbility ability) { @@ -90,7 +90,7 @@ class HeraldOfAnafenzaTriggeredAbility extends TriggeredAbilityImpl { public HeraldOfAnafenzaTriggeredAbility copy() { return new HeraldOfAnafenzaTriggeredAbility(this); } - + @Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.ACTIVATED_ABILITY; @@ -112,18 +112,3 @@ class HeraldOfAnafenzaTriggeredAbility extends TriggeredAbilityImpl { return "Whenever you activate {this}'s outlast ability, " + super.getRule(); } } - -class HeraldOfAnafenzaWarriorToken extends Token { - - public HeraldOfAnafenzaWarriorToken() { - super("Warrior", "1/1 white Warrior creature token"); - this.setOriginalExpansionSetCode("KTK"); - this.setTokenType(1); - cardType.add(CardType.CREATURE); - subtype.add("Warrior"); - - color.setWhite(true); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduCharm.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduCharm.java index 44b4423042d..2153f4e42dd 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduCharm.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduCharm.java @@ -28,7 +28,6 @@ package mage.sets.khansoftarkir; import java.util.UUID; -import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.ContinuousEffect; @@ -48,7 +47,7 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.WarriorToken; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetOpponent; @@ -61,12 +60,12 @@ import mage.target.targetpointer.FixedTarget; public class MarduCharm extends CardImpl { private static final FilterCard filter = new FilterCard("a noncreature, nonland card"); - + static { filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); } - + public MarduCharm(UUID ownerId) { super(ownerId, 186, "Mardu Charm", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{R}{W}{B}"); this.expansionSetCode = "KTK"; @@ -76,18 +75,18 @@ public class MarduCharm extends CardImpl { // * Mardu Charm deals 4 damage to target creature. this.getSpellAbility().addEffect(new DamageTargetEffect(4)); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - + // * Put two 1/1 white Warrior creature tokens onto the battlefield. They gain first strike until end of turn. Mode mode = new Mode(); mode.getEffects().add(new MarduCharmCreateTokenEffect()); this.getSpellAbility().addMode(mode); - + // * Target opponent reveals his or her hand. You choose a noncreature, nonland card from it. That player discards that card. mode = new Mode(); mode.getEffects().add(new DiscardCardYouChooseTargetEffect(filter)); mode.getTargets().add(new TargetOpponent()); this.getSpellAbility().addMode(mode); - + } public MarduCharm(final MarduCharm card) { @@ -101,26 +100,26 @@ public class MarduCharm extends CardImpl { } class MarduCharmCreateTokenEffect extends OneShotEffect { - + public MarduCharmCreateTokenEffect() { super(Outcome.PutCreatureInPlay); this.staticText = "Put two 1/1 white Warrior creature tokens onto the battlefield. They gain first strike until end of turn"; } - + public MarduCharmCreateTokenEffect(final MarduCharmCreateTokenEffect effect) { super(effect); } - + @Override public MarduCharmCreateTokenEffect copy() { return new MarduCharmCreateTokenEffect(this); } - + @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - CreateTokenEffect effect = new CreateTokenEffect(new MarduCharmWarriorToken(), 2); + CreateTokenEffect effect = new CreateTokenEffect(new WarriorToken(), 2); effect.apply(game, source); for (UUID tokenId :effect.getLastAddedTokenIds()) { Permanent token = game.getPermanent(tokenId); @@ -135,16 +134,3 @@ class MarduCharmCreateTokenEffect extends OneShotEffect { return false; } } -class MarduCharmWarriorToken extends Token { - - public MarduCharmWarriorToken() { - super("Warrior", "1/1 white Warrior creature token"); - this.setOriginalExpansionSetCode("KTK"); - this.setTokenType(2); - cardType.add(CardType.CREATURE); - color.setWhite(true); - subtype.add("Warrior"); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java b/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java index 4452b0dd55b..5338301b668 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MarduHordechief.java @@ -36,7 +36,7 @@ import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.WarriorToken; import mage.watchers.common.PlayerAttackedWatcher; /** @@ -55,7 +55,7 @@ public class MarduHordechief extends CardImpl { this.toughness = new MageInt(3); // Raid - When Mardu Hordechief enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield - this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new MarduHordechiefToken())), RaidCondition.getInstance(), + this.addAbility(new ConditionalTriggeredAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WarriorToken())), RaidCondition.getInstance(), "Raid - When {this} enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield."), new PlayerAttackedWatcher()); } @@ -69,17 +69,3 @@ public class MarduHordechief extends CardImpl { return new MarduHordechief(this); } } - -class MarduHordechiefToken extends Token { - - MarduHordechiefToken() { - super("Warrior", "1/1 white Warrior creature token"); - this.setOriginalExpansionSetCode("KTK"); - cardType.add(CardType.CREATURE); - subtype.add("Warrior"); - - color.setWhite(true); - power = new MageInt(1); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/TakeUpArms.java b/Mage.Sets/src/mage/sets/khansoftarkir/TakeUpArms.java index 2d448508bb2..6aaf4499cac 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/TakeUpArms.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/TakeUpArms.java @@ -28,12 +28,11 @@ package mage.sets.khansoftarkir; import java.util.UUID; -import mage.MageInt; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.WarriorToken; /** * @@ -47,7 +46,7 @@ public class TakeUpArms extends CardImpl { // Put three 1/1 white Warrior creature tokens onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new TakeUpArmsToken(), 3)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new WarriorToken(), 3)); } public TakeUpArms(final TakeUpArms card) { @@ -59,17 +58,3 @@ public class TakeUpArms extends CardImpl { return new TakeUpArms(this); } } - -class TakeUpArmsToken extends Token { - - TakeUpArmsToken() { - super("Warrior", "1/1 white Warrior creature token"); - this.setOriginalExpansionSetCode("KTK"); - cardType.add(CardType.CREATURE); - subtype.add("Warrior"); - - color.setWhite(true); - power = new MageInt(1); - toughness = new MageInt(1); - } -} \ No newline at end of file diff --git a/Mage/src/mage/game/permanent/token/WarriorToken.java b/Mage/src/mage/game/permanent/token/WarriorToken.java new file mode 100644 index 00000000000..a864106d3a5 --- /dev/null +++ b/Mage/src/mage/game/permanent/token/WarriorToken.java @@ -0,0 +1,59 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* 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 +* 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 +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.Arrays; +import java.util.Random; +import mage.MageInt; +import mage.constants.CardType; + +/** + * + * @author LoneFox + */ +public class WarriorToken extends Token { + + public WarriorToken() { + super("Warrior", "1/1 white Warrior creature token"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add("Warrior"); + power = new MageInt(1); + toughness = new MageInt(1); + availableImageSetCodes.addAll(Arrays.asList("KTK", "DTK")); + } + + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("KTK")) { + this.setTokenType(new Random().nextInt(2) + 1); + } + } +} From f380b2cdde97e18b7974b26744d5299d498aba8f Mon Sep 17 00:00:00 2001 From: LoneFox Date: Wed, 23 Sep 2015 16:59:21 +0300 Subject: [PATCH 08/42] Add Goat token and use it for existing cards. --- .../sets/commander2013/SpringjackPasture.java | 16 +- .../sets/eventide/SpringjackShepherd.java | 218 +++++++++--------- .../src/mage/sets/magic2013/TradingPost.java | 26 +-- .../mage/game/permanent/token/GoatToken.java | 50 ++++ 4 files changed, 161 insertions(+), 149 deletions(-) create mode 100644 Mage/src/mage/game/permanent/token/GoatToken.java diff --git a/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java b/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java index 8fafdc13ef2..d4873e2dd16 100644 --- a/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java +++ b/Mage.Sets/src/mage/sets/commander2013/SpringjackPasture.java @@ -50,7 +50,7 @@ import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.GoatToken; import mage.players.Player; /** @@ -136,17 +136,3 @@ class SpringjackPastureEffect extends OneShotEffect { return new SpringjackPastureEffect(this); } } - -class GoatToken extends Token { - - public GoatToken() { - super("Goat", "0/1 white Goat creature token"); - setOriginalExpansionSetCode("EVE"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - - subtype.add("Goat"); - power = new MageInt(0); - toughness = new MageInt(1); - } -} diff --git a/Mage.Sets/src/mage/sets/eventide/SpringjackShepherd.java b/Mage.Sets/src/mage/sets/eventide/SpringjackShepherd.java index 460d913355a..481269f78f2 100644 --- a/Mage.Sets/src/mage/sets/eventide/SpringjackShepherd.java +++ b/Mage.Sets/src/mage/sets/eventide/SpringjackShepherd.java @@ -1,116 +1,104 @@ -/* - * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 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 - * provided with the distribution. - * - * 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 - * 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 - * 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 - * 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 - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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 - * or implied, of BetaSteward_at_googlemail.com. - */ -package mage.sets.eventide; - -import java.util.UUID; -import mage.MageInt; -import mage.ObjectColor; -import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CreateTokenEffect; -import mage.cards.CardImpl; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.filter.FilterPermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.permanent.token.Token; - -/** - * - * @author jeffwadsworth - * - */ -public class SpringjackShepherd extends CardImpl { - - public SpringjackShepherd(UUID ownerId) { - super(ownerId, 15, "Springjack Shepherd", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); - this.expansionSetCode = "EVE"; - this.subtype.add("Kithkin"); - this.subtype.add("Wizard"); - - this.power = new MageInt(1); - this.toughness = new MageInt(2); - - // Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control. - Effect effect = new CreateTokenEffect(new GoatToken(), new ChromaSpringjackShepherdCount()); - effect.setText("Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control."); - this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false, true)); - - } - - public SpringjackShepherd(final SpringjackShepherd card) { - super(card); - } - - @Override - public SpringjackShepherd copy() { - return new SpringjackShepherd(this); - } -} - -class ChromaSpringjackShepherdCount implements DynamicValue { - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - int chroma = 0; - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterPermanent(), sourceAbility.getControllerId(), game)) { - chroma += permanent.getManaCost().getMana().getWhite(); - } - return chroma; - } - - @Override - public DynamicValue copy() { - return new ChromaSpringjackShepherdCount(); - } - - @Override - public String toString() { - return "1"; - } - - @Override - public String getMessage() { - return ""; - } -} - -class GoatToken extends Token { - - public GoatToken() { - super("Goat", "a 0/1 white Goat creature token"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - subtype.add("Goat"); - power = new MageInt(0); - toughness = new MageInt(1); - } +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.eventide; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.GoatToken; + +/** + * + * @author jeffwadsworth + * + */ +public class SpringjackShepherd extends CardImpl { + + public SpringjackShepherd(UUID ownerId) { + super(ownerId, 15, "Springjack Shepherd", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "EVE"; + this.subtype.add("Kithkin"); + this.subtype.add("Wizard"); + + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control. + Effect effect = new CreateTokenEffect(new GoatToken(), new ChromaSpringjackShepherdCount()); + effect.setText("Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control."); + this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false, true)); + + } + + public SpringjackShepherd(final SpringjackShepherd card) { + super(card); + } + + @Override + public SpringjackShepherd copy() { + return new SpringjackShepherd(this); + } +} + +class ChromaSpringjackShepherdCount implements DynamicValue { + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + int chroma = 0; + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterPermanent(), sourceAbility.getControllerId(), game)) { + chroma += permanent.getManaCost().getMana().getWhite(); + } + return chroma; + } + + @Override + public DynamicValue copy() { + return new ChromaSpringjackShepherdCount(); + } + + @Override + public String toString() { + return "1"; + } + + @Override + public String getMessage() { + return ""; + } } diff --git a/Mage.Sets/src/mage/sets/magic2013/TradingPost.java b/Mage.Sets/src/mage/sets/magic2013/TradingPost.java index 2b933e21b2d..f6370a6d285 100644 --- a/Mage.Sets/src/mage/sets/magic2013/TradingPost.java +++ b/Mage.Sets/src/mage/sets/magic2013/TradingPost.java @@ -49,7 +49,7 @@ import mage.constants.Zone; import mage.filter.common.FilterArtifactCard; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.GoatToken; import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetCardInHand; import mage.target.common.TargetControlledPermanent; @@ -59,10 +59,10 @@ import mage.target.common.TargetControlledPermanent; * @author jeffwadsworth */ public class TradingPost extends CardImpl { - + final static FilterControlledPermanent filter = new FilterControlledPermanent("creature"); final static FilterControlledPermanent filter2 = new FilterControlledPermanent("artifact"); - + static { filter.add(new CardTypePredicate(CardType.CREATURE)); filter2.add(new CardTypePredicate(CardType.ARTIFACT)); @@ -77,26 +77,26 @@ public class TradingPost extends CardImpl { ability1.addCost(new TapSourceCost()); ability1.addCost(new DiscardTargetCost(new TargetCardInHand())); this.addAbility(ability1); - + // {1}, {tap}, Pay 1 life: Put a 0/1 white Goat creature token onto the battlefield. Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new GoatToken()), new GenericManaCost(1)); ability2.addCost(new TapSourceCost()); ability2.addCost(new PayLifeCost(1)); this.addAbility(ability2); - + // {1}, {tap}, Sacrifice a creature: Return target artifact card from your graveyard to your hand. Ability ability3 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnFromGraveyardToHandTargetEffect(), new GenericManaCost(1)); ability3.addTarget(new TargetCardInGraveyard(new FilterArtifactCard("artifact card in your graveyard"))); ability3.addCost(new TapSourceCost()); ability3.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter))); this.addAbility(ability3); - + // {1}, {tap}, Sacrifice an artifact: Draw a card. Ability ability4 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(1)); ability4.addCost(new TapSourceCost()); ability4.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter2))); this.addAbility(ability4); - + } public TradingPost(final TradingPost card) { @@ -108,15 +108,3 @@ public class TradingPost extends CardImpl { return new TradingPost(this); } } - -class GoatToken extends Token { - public GoatToken() { - super("Goat", "a 0/1 white Goat creature token"); - cardType.add(CardType.CREATURE); - color.setWhite(true); - - subtype.add("Goat"); - power = new MageInt(0); - toughness = new MageInt(1); - } -} diff --git a/Mage/src/mage/game/permanent/token/GoatToken.java b/Mage/src/mage/game/permanent/token/GoatToken.java new file mode 100644 index 00000000000..d3d4078902b --- /dev/null +++ b/Mage/src/mage/game/permanent/token/GoatToken.java @@ -0,0 +1,50 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* 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 +* 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 +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.Arrays; +import mage.constants.CardType; +import mage.MageInt; + +/** + * + * @author LoneFox + */ +public class GoatToken extends Token { + + public GoatToken() { + super("Goat", "0/1 white Goat creature token"); + cardType.add(CardType.CREATURE); + color.setWhite(true); + subtype.add("Goat"); + power = new MageInt(1); + toughness = new MageInt(1); + availableImageSetCodes.addAll(Arrays.asList("EVE", "M13", "M14", "C14")); + } +} From 044e8b70f0308daff7340047e25b2cc0b3236233 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 23 Sep 2015 19:53:25 +0200 Subject: [PATCH 09/42] Some minor changes for BFZ token image handling. --- .../mage/plugins/card/images/ImageCache.java | 82 +++++++------------ .../GideonAllyOfZendikar.java | 11 +-- .../KioraMasterOfTheDepths.java | 7 +- .../battleforzendikar/ObNixilisReignited.java | 1 + .../permanent/token/EldraziScionToken.java | 31 +++++-- 5 files changed, 64 insertions(+), 68 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java index 33cbb1a7dbe..6389c70ecff 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/ImageCache.java @@ -25,8 +25,8 @@ import org.mage.plugins.card.utils.CardImageUtils; /** * This class stores ALL card images in a cache with soft values. this means - * that the images may be garbage collected when they are not needed any more, but will - * be kept as long as possible. + * that the images may be garbage collected when they are not needed any more, + * but will be kept as long as possible. * * Key format: "####" * @@ -46,8 +46,7 @@ public class ImageCache { private static final Map imageCache; /** - * Common pattern for keys. - * Format: "##" + * Common pattern for keys. Format: "##" */ private static final Pattern KEY_PATTERN = Pattern.compile("(.*)#(.*)#(.*)#(.*)#(.*)"); @@ -104,16 +103,16 @@ public class ImageCache { thumbnailFile = new TFile(thumbnailPath); } catch (Exception ex) { } - boolean exists =false; + boolean exists = false; if (thumbnailFile != null) { try { exists = thumbnailFile.exists(); - } catch(Exception ex) { + } catch (Exception ex) { exists = false; } } if (exists) { - log.debug("loading thumbnail for " + key + ", path="+thumbnailPath); + log.debug("loading thumbnail for " + key + ", path=" + thumbnailPath); return loadImage(thumbnailFile); } else { BufferedImage image = loadImage(file); @@ -187,30 +186,15 @@ public class ImageCache { } public static BufferedImage getThumbnail(CardView card) { - String key = getKey(card) + "#thumb"; - if (card.getUsesVariousArt()) { - key += "#usesVariousArt"; - } - // log.debug("#key: " + key); - return getImage(key); + return getImage(getKey(card, card.getName(), "#thumb")); } public static BufferedImage getImageOriginal(CardView card) { - String key = getKey(card); - if (card.getUsesVariousArt()) { - key += "#usesVariousArt"; - } - // log.warn("#key: " + key); - return getImage(key); + return getImage(getKey(card, card.getName(), "")); } public static BufferedImage getImageOriginalAlternateName(CardView card) { - String key = getKeyAlternateName(card, card.getAlternateName()); - if (card.getUsesVariousArt()) { - key += "#usesVariousArt"; - } - // log.warn("#key: " + key); - return getImage(key); + return getImage(getKey(card, card.getAlternateName(), "")); } /** @@ -230,7 +214,7 @@ public class ImageCache { if (ex.getCause() instanceof NullPointerException) { return null; } - log.error(ex,ex); + log.error(ex, ex); return null; } } @@ -238,32 +222,25 @@ public class ImageCache { /** * Returns the map key for a card, without any suffixes for the image size. */ - private static String getKey(CardView card) { - StringBuilder sb = new StringBuilder(card.getName()).append("#"); - sb.append(card.getExpansionSetCode()).append("#"); - sb.append(card.getType()).append("#"); - sb.append(card.getCardNumber()).append("#"); - sb.append(card.getTokenSetCode() == null ? "":card.getTokenSetCode()); - return sb.toString(); - } - - /** - * Returns the map key for the flip image of a card, without any suffixes for the image size. - */ - private static String getKeyAlternateName(CardView card, String alternateName) { - StringBuilder sb = new StringBuilder(alternateName).append("#"); - sb.append(card.getExpansionSetCode()).append("#"); - sb.append(card.getType()).append("#"); - sb.append(card.getCardNumber()).append("#"); - sb.append(card.getTokenSetCode() == null ? "":card.getTokenSetCode()); - return sb.toString(); + private static String getKey(CardView card, String name, String suffix) { + return name + "#" + card.getExpansionSetCode() + "#" + card.getType() + "#" + card.getCardNumber() + "#" + + (card.getTokenSetCode() == null ? "" : card.getTokenSetCode()) + + suffix + + (card.getUsesVariousArt() ? "#usesVariousArt" : ""); + } +// /** +// * Returns the map key for the flip image of a card, without any suffixes for the image size. +// */ +// private static String getKeyAlternateName(CardView card, String alternateName) { +// return alternateName + "#" + card.getExpansionSetCode() + "#" +card.getType()+ "#" + card.getCardNumber() + "#" +// + (card.getTokenSetCode() == null ? "":card.getTokenSetCode()); +// } /** * Load image from file * - * @param file - * file to load image from + * @param file file to load image from * @return {@link BufferedImage} */ public static BufferedImage loadImage(TFile file) { @@ -297,7 +274,7 @@ public class ImageCache { ImageIO.write(image, "jpg", outputStream); } } catch (IOException e) { - log.error(e,e); + log.error(e, e); imageFile.delete(); } return image; @@ -305,6 +282,7 @@ public class ImageCache { /** * Returns an image scaled to the size given + * * @param original * @return */ @@ -344,6 +322,7 @@ public class ImageCache { /** * Returns an image scaled to the size appropriate for the card picture * panel + * * @param original * @param sizeNeed * @return @@ -356,6 +335,7 @@ public class ImageCache { /** * Returns the image appropriate to display the card in the picture panel + * * @param card * @param width * @param height @@ -365,11 +345,7 @@ public class ImageCache { if (Constants.THUMBNAIL_SIZE_FULL.width + 10 > width) { return getThumbnail(card); } - String key = getKey(card); - if (card.getUsesVariousArt()) { - key += "#usesVariousArt"; - } - // log.warn("getImage: " + key); + String key = getKey(card, card.getName(), ""); BufferedImage original = getImage(key); if (original == null) { log.debug(key + " not found"); diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java b/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java index eb6e52d3e8d..9da9eacd178 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java @@ -60,7 +60,7 @@ public class GideonAllyOfZendikar extends CardImpl { super(ownerId, 29, "Gideon, Ally of Zendikar", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{W}"); this.expansionSetCode = "BFZ"; this.subtype.add("Gideon"); - + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(4)), false)); // +1: Until end of turn, Gideon, Ally of Zendikar becomes a 5/5 Human Soldier Ally creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. @@ -69,7 +69,7 @@ public class GideonAllyOfZendikar extends CardImpl { effect.setText("Prevent all damage that would be dealt to him this turn"); ability.addEffect(effect); this.addAbility(ability); - + // 0: Put a 2/2 white Knight Ally creature token onto the battlefield. this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new KnightAllyToken()), 0)); @@ -94,6 +94,7 @@ class GideonAllyOfZendikarEmblem extends Emblem { BoostControlledEffect effect = new BoostControlledEffect(1, 1, Duration.EndOfGame); Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); this.getAbilities().add(ability); + this.setExpansionSetCodeForImage("BFZ"); } } @@ -107,8 +108,8 @@ class GideonAllyOfZendikarToken extends Token { subtype.add("Ally"); power = new MageInt(5); toughness = new MageInt(5); - - addAbility(IndestructibleAbility.getInstance()); + + addAbility(IndestructibleAbility.getInstance()); } } @@ -123,4 +124,4 @@ class KnightAllyToken extends Token { power = new MageInt(2); toughness = new MageInt(2); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java b/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java index 2cabb3005db..e8f68019e99 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java @@ -173,8 +173,8 @@ class KioraRevealEffect extends OneShotEffect { if (!cards.isEmpty()) { player.revealCards(sourceObject.getName(), cards, game); - if ((creatureCardFound || landCardFound) - && player.chooseUse(Outcome.DrawCard, + if ((creatureCardFound || landCardFound) + && player.chooseUse(Outcome.DrawCard, "Put a creature card and/or a land card into your hand?", source, game)) { TargetCard target = new TargetCard(Zone.PICK, new FilterCreatureCard("creature card to put into your hand")); if (creatureCardFound && player.choose(Outcome.DrawCard, cards, target, game)) { @@ -208,12 +208,13 @@ class KioraMasterOfTheDepthsEmblem extends Emblem { public KioraMasterOfTheDepthsEmblem() { this.setName("EMBLEM: Kiora, Master of the Depths"); - + Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.COMMAND, new KioraFightEffect(), filter, true, SetTargetPointer.PERMANENT, "Whenever a creature enters the battlefield under your control, you may have it fight target creature."); ability.addTarget(new TargetCreaturePermanent()); this.getAbilities().add(ability); + this.setExpansionSetCodeForImage("BFZ"); } } diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java b/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java index 036ce0ccb58..419aaba047a 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java @@ -100,6 +100,7 @@ class ObNixilisReignitedEmblem extends Emblem { setName("EMBLEM: Ob Nixilis Reignited"); this.getAbilities().add(new ObNixilisEmblemTriggeredAbility(new LoseLifeSourceControllerEffect(2), false)); + this.setExpansionSetCodeForImage("BFZ"); } } diff --git a/Mage/src/mage/game/permanent/token/EldraziScionToken.java b/Mage/src/mage/game/permanent/token/EldraziScionToken.java index 1b8e1cd6a74..92d33cadc1f 100644 --- a/Mage/src/mage/game/permanent/token/EldraziScionToken.java +++ b/Mage/src/mage/game/permanent/token/EldraziScionToken.java @@ -1,16 +1,16 @@ /* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 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 * provided with the distribution. - * + * * 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 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR @@ -20,14 +20,14 @@ * 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 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * 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 * or implied, of BetaSteward_at_googlemail.com. */ - package mage.game.permanent.token; +import java.util.Random; import mage.MageInt; import mage.Mana; import mage.abilities.costs.common.SacrificeSourceCost; @@ -49,7 +49,24 @@ public class EldraziScionToken extends Token { power = new MageInt(1); toughness = new MageInt(1); addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana, new SacrificeSourceCost())); - this.setOriginalExpansionSetCode("BFZ"); + setOriginalExpansionSetCode("BFZ"); + } + @Override + public void setExpansionSetCodeForImage(String code) { + super.setExpansionSetCodeForImage(code); + if (getOriginalExpansionSetCode().equals("BFZ")) { + this.setTokenType(new Random().nextInt(3) + 1); // 3 different images + } + } + + public EldraziScionToken(final EldraziScionToken token) { + super(token); + } + + @Override + public EldraziScionToken copy() { + return new EldraziScionToken(this); //To change body of generated methods, choose Tools | Templates. + } } From bee7758625fe5092fef70b9b04012fc41d1964d4 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 24 Sep 2015 07:54:45 +0300 Subject: [PATCH 10/42] Fix another copy-paste error --- Mage/src/mage/game/permanent/token/DemonToken.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/mage/game/permanent/token/DemonToken.java b/Mage/src/mage/game/permanent/token/DemonToken.java index 72231decd68..5643ff2ad8f 100644 --- a/Mage/src/mage/game/permanent/token/DemonToken.java +++ b/Mage/src/mage/game/permanent/token/DemonToken.java @@ -40,7 +40,7 @@ import mage.abilities.keyword.FlyingAbility; public class DemonToken extends Token { public DemonToken() { - super("Demon", "1/1 black Demon creature token with flying"); + super("Demon", "5/5 black Demon creature token with flying"); cardType.add(CardType.CREATURE); color.setBlack(true); subtype.add("Demon"); From d6a1f96547cac382349d427ad618a0b685d39871 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 24 Sep 2015 08:57:25 +0300 Subject: [PATCH 11/42] Add Faerie Rogue token and use it for existing cards. Implement card: Notorious Throng --- .../mage/sets/morningtide/Bitterblossom.java | 20 +--- .../sets/morningtide/NotoriousThrong.java | 109 ++++++++++++++++++ .../src/mage/sets/morningtide/VioletPall.java | 24 +--- .../permanent/token/FaerieRogueToken.java | 53 +++++++++ 4 files changed, 168 insertions(+), 38 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java create mode 100644 Mage/src/mage/game/permanent/token/FaerieRogueToken.java diff --git a/Mage.Sets/src/mage/sets/morningtide/Bitterblossom.java b/Mage.Sets/src/mage/sets/morningtide/Bitterblossom.java index e7a64e2a949..e1064177230 100644 --- a/Mage.Sets/src/mage/sets/morningtide/Bitterblossom.java +++ b/Mage.Sets/src/mage/sets/morningtide/Bitterblossom.java @@ -28,17 +28,15 @@ package mage.sets.morningtide; import java.util.UUID; -import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; -import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.TargetController; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.FaerieRogueToken; /** * @@ -51,10 +49,9 @@ public class Bitterblossom extends CardImpl { this.expansionSetCode = "MOR"; this.subtype.add("Faerie"); - // At the beginning of your upkeep, you lose 1 life and put a 1/1 black Faerie Rogue creature token with flying onto the battlefield. Ability ability = new BeginningOfUpkeepTriggeredAbility(new LoseLifeSourceControllerEffect(1), TargetController.YOU, false); - ability.addEffect(new CreateTokenEffect(new FaerieToken(), 1)); + ability.addEffect(new CreateTokenEffect(new FaerieRogueToken(), 1)); this.addAbility(ability); } @@ -67,16 +64,3 @@ public class Bitterblossom extends CardImpl { return new Bitterblossom(this); } } - -class FaerieToken extends Token { - FaerieToken() { - super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying"); - cardType.add(CardType.CREATURE); - color.setBlack(true); - subtype.add("Faerie"); - subtype.add("Rogue"); - power = new MageInt(1); - toughness = new MageInt(1); - this.addAbility(FlyingAbility.getInstance()); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java b/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java new file mode 100644 index 00000000000..ed9b704332d --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java @@ -0,0 +1,109 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.morningtide; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.condition.common.ProwlCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; +import mage.abilities.keyword.ProwlAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.game.permanent.token.FaerieRogueToken; +import mage.players.Player; +import mage.watchers.common.AmountOfDamageAPlayerReceivedThisTurnWatcher; + +/** + * + * @author LoneFox + */ +public class NotoriousThrong extends CardImpl { + + public NotoriousThrong(UUID ownerId) { + super(ownerId, 45, "Notorious Throng", Rarity.RARE, new CardType[]{CardType.TRIBAL, CardType.SORCERY}, "{3}{U}"); + this.expansionSetCode = "MOR"; + this.subtype.add("Rogue"); + + // Prowl {5}{U} + this.addAbility(new ProwlAbility(this, "{5}{U}")); + // Put X 1/1 black Faerie Rogue creature tokens with flying onto the battlefield, where X is the damage dealt to your opponents this turn. + this.getSpellAbility().addEffect(new NotoriousThrongEffect()); + this.getSpellAbility().addWatcher(new AmountOfDamageAPlayerReceivedThisTurnWatcher()); + // If Notorious Throng's prowl cost was paid, take an extra turn after this one. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new AddExtraTurnControllerEffect(), ProwlCondition.getInstance())); + } + + public NotoriousThrong(final NotoriousThrong card) { + super(card); + } + + @Override + public NotoriousThrong copy() { + return new NotoriousThrong(this); + } +} + +class NotoriousThrongEffect extends OneShotEffect { + + public NotoriousThrongEffect() { + super(Outcome.PutCreatureInPlay); + staticText = "Put X 1/1 black Faerie Rogue creature tokens with flying onto the battlefield, where X is the damage dealt to your opponents this turn."; + } + + public NotoriousThrongEffect(NotoriousThrongEffect effect) { + super(effect); + } + + @Override + public NotoriousThrongEffect copy() { + return new NotoriousThrongEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + AmountOfDamageAPlayerReceivedThisTurnWatcher watcher = (AmountOfDamageAPlayerReceivedThisTurnWatcher) game.getState().getWatchers().get("AmountOfDamageReceivedThisTurn"); + if(controller != null && watcher != null) { + int numTokens = 0; + for(UUID opponentId: game.getOpponents(controller.getId())) { + numTokens += watcher.getAmountOfDamageReceivedThisTurn(opponentId); + } + if(numTokens > 0) { + new CreateTokenEffect(new FaerieRogueToken(), numTokens).apply(game, source); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/morningtide/VioletPall.java b/Mage.Sets/src/mage/sets/morningtide/VioletPall.java index 7b760e28e44..b76090f5c2e 100644 --- a/Mage.Sets/src/mage/sets/morningtide/VioletPall.java +++ b/Mage.Sets/src/mage/sets/morningtide/VioletPall.java @@ -28,18 +28,16 @@ package mage.sets.morningtide; import java.util.UUID; -import mage.MageInt; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.ObjectColor; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; -import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.permanent.token.Token; +import mage.game.permanent.token.FaerieRogueToken; import mage.target.common.TargetCreaturePermanent; /** @@ -61,7 +59,7 @@ public class VioletPall extends CardImpl { this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); - this.getSpellAbility().addEffect(new CreateTokenEffect(new VioletPallFaerieToken(), 1)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new FaerieRogueToken(), 1)); } public VioletPall(final VioletPall card) { @@ -73,17 +71,3 @@ public class VioletPall extends CardImpl { return new VioletPall(this); } } - -class VioletPallFaerieToken extends Token { - - VioletPallFaerieToken() { - super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying"); - cardType.add(CardType.CREATURE); - color.setBlack(true); - subtype.add("Faerie"); - subtype.add("Rogue"); - power = new MageInt(1); - toughness = new MageInt(1); - this.addAbility(FlyingAbility.getInstance()); - } -} diff --git a/Mage/src/mage/game/permanent/token/FaerieRogueToken.java b/Mage/src/mage/game/permanent/token/FaerieRogueToken.java new file mode 100644 index 00000000000..a64ff364484 --- /dev/null +++ b/Mage/src/mage/game/permanent/token/FaerieRogueToken.java @@ -0,0 +1,53 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 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 +* provided with the distribution. +* +* 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 +* 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 +* 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 +* 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 +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* 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 +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.game.permanent.token; + +import java.util.Arrays; +import mage.constants.CardType; +import mage.MageInt; +import mage.abilities.keyword.FlyingAbility; + +/** + * + * @author LoneFox + */ +public class FaerieRogueToken extends Token { + + public FaerieRogueToken() { + super("Faerie Rogue", "1/1 black Faerie Rogue creature token with flying"); + cardType.add(CardType.CREATURE); + color.setBlack(true); + subtype.add("Faerie"); + subtype.add("Rogue"); + power = new MageInt(1); + toughness = new MageInt(1); + addAbility(FlyingAbility.getInstance()); + availableImageSetCodes.addAll(Arrays.asList("SHM", "MOR", "MMA")); + } +} From 9d52ecef8307e4902de2c97c58615e45f975e00b Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 24 Sep 2015 09:05:22 +0300 Subject: [PATCH 12/42] Fix yet another copy-paste error --- Mage/src/mage/game/permanent/token/GoatToken.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/mage/game/permanent/token/GoatToken.java b/Mage/src/mage/game/permanent/token/GoatToken.java index d3d4078902b..82ea1284145 100644 --- a/Mage/src/mage/game/permanent/token/GoatToken.java +++ b/Mage/src/mage/game/permanent/token/GoatToken.java @@ -43,7 +43,7 @@ public class GoatToken extends Token { cardType.add(CardType.CREATURE); color.setWhite(true); subtype.add("Goat"); - power = new MageInt(1); + power = new MageInt(0); toughness = new MageInt(1); availableImageSetCodes.addAll(Arrays.asList("EVE", "M13", "M14", "C14")); } From 21061ac928d469dca3e092d23aa7946d29c85545 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 24 Sep 2015 08:25:45 +0200 Subject: [PATCH 13/42] Fixed some attack forcing cards to only force to attack once a turn instead of wrongly forcing to attack each combat. --- .../FumikoTheLowblood.java | 3 +- .../sets/commander/AvatarOfSlaughter.java | 3 +- .../sets/commander2014/WarmongerHellkite.java | 2 +- .../sets/magic2015/GoblinRabblemaster.java | 15 +++-- .../src/mage/sets/mirrodin/InciteWar.java | 14 ++-- .../sets/shardsofalara/GoblinAssault.java | 66 +++++-------------- .../common/combat/AttacksIfAbleAllEffect.java | 30 +++++++-- .../combat/AttacksIfAbleTargetEffect.java | 11 +--- 8 files changed, 62 insertions(+), 82 deletions(-) diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/FumikoTheLowblood.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/FumikoTheLowblood.java index aa93e4cf8d5..02af73fe030 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/FumikoTheLowblood.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/FumikoTheLowblood.java @@ -40,6 +40,7 @@ import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.ControllerPredicate; +import mage.watchers.common.AttackedThisTurnWatcher; /** * @@ -63,7 +64,7 @@ public class FumikoTheLowblood extends CardImpl { // Creatures your opponents control attack each turn if able. FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures your opponents control"); filter.add(new ControllerPredicate(TargetController.OPPONENT)); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AttacksIfAbleAllEffect(filter))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AttacksIfAbleAllEffect(filter)), new AttackedThisTurnWatcher()); } diff --git a/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java b/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java index bfe50914d20..da89c528bdd 100644 --- a/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java +++ b/Mage.Sets/src/mage/sets/commander/AvatarOfSlaughter.java @@ -41,6 +41,7 @@ import mage.constants.Duration; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; +import mage.watchers.common.AttackedThisTurnWatcher; /** * @@ -62,7 +63,7 @@ public class AvatarOfSlaughter extends CardImpl { effect = new AttacksIfAbleAllEffect(new FilterCreaturePermanent("creatures")); effect.setText("and attack each turn if able"); ability.addEffect(effect); - this.addAbility(ability); + this.addAbility(ability, new AttackedThisTurnWatcher()); } public AvatarOfSlaughter(final AvatarOfSlaughter card) { diff --git a/Mage.Sets/src/mage/sets/commander2014/WarmongerHellkite.java b/Mage.Sets/src/mage/sets/commander2014/WarmongerHellkite.java index facef8d227a..450a026bcab 100644 --- a/Mage.Sets/src/mage/sets/commander2014/WarmongerHellkite.java +++ b/Mage.Sets/src/mage/sets/commander2014/WarmongerHellkite.java @@ -62,7 +62,7 @@ public class WarmongerHellkite extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // All creatures attack each combat if able. - Effect effect = new AttacksIfAbleAllEffect(new FilterCreaturePermanent("creatures")); + Effect effect = new AttacksIfAbleAllEffect(new FilterCreaturePermanent("creatures"), Duration.WhileOnBattlefield, true); effect.setText("All creatures attack each combat if able"); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); diff --git a/Mage.Sets/src/mage/sets/magic2015/GoblinRabblemaster.java b/Mage.Sets/src/mage/sets/magic2015/GoblinRabblemaster.java index 9d23e6719af..cf2df4c91fa 100644 --- a/Mage.Sets/src/mage/sets/magic2015/GoblinRabblemaster.java +++ b/Mage.Sets/src/mage/sets/magic2015/GoblinRabblemaster.java @@ -50,6 +50,7 @@ import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.permanent.AttackingPredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.permanent.token.Token; +import mage.watchers.common.AttackedThisTurnWatcher; /** * @@ -59,15 +60,15 @@ public class GoblinRabblemaster extends CardImpl { private static final FilterCreaturePermanent otherGoblinFilter = new FilterCreaturePermanent("Goblin", "Other Goblin creatures you control"); private static final FilterCreaturePermanent attackingFilter = new FilterCreaturePermanent("Goblin", "other attacking Goblin"); - + static { otherGoblinFilter.add(new AnotherPredicate()); otherGoblinFilter.add(new ControllerPredicate(TargetController.YOU)); - + attackingFilter.add(new AttackingPredicate()); attackingFilter.add(new AnotherPredicate()); } - + public GoblinRabblemaster(UUID ownerId) { super(ownerId, 145, "Goblin Rabblemaster", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.expansionSetCode = "M15"; @@ -79,11 +80,11 @@ public class GoblinRabblemaster extends CardImpl { // Other Goblin creatures you control attack each turn if able. Effect effect = new AttacksIfAbleAllEffect(otherGoblinFilter); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); - + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect), new AttackedThisTurnWatcher()); + // At the beginning of combat on your turn, put a 1/1 red Goblin creature token with haste onto the battlefield. this.addAbility(new BeginningOfCombatTriggeredAbility(new CreateTokenEffect(new GoblinToken()), TargetController.YOU, false)); - + // When Goblin Rabblemaster attacks, it gets +1/+0 until end of turn for each other attacking Goblin. this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(new PermanentsOnBattlefieldCount(attackingFilter), new StaticValue(0), Duration.EndOfTurn, true), false)); } @@ -110,5 +111,5 @@ class GoblinToken extends Token { toughness = new MageInt(1); addAbility(HasteAbility.getInstance()); } - + } diff --git a/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java b/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java index b7635f2125e..d646a4430e0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java +++ b/Mage.Sets/src/mage/sets/mirrodin/InciteWar.java @@ -48,18 +48,19 @@ import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; +import mage.watchers.common.AttackedThisTurnWatcher; /** * * @author fireshoes */ public class InciteWar extends CardImpl { - + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures you control"); static { filter.add(new ControllerPredicate(TargetController.YOU)); - } + } public InciteWar(UUID ownerId) { super(ownerId, 96, "Incite War", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{R}"); @@ -68,12 +69,13 @@ public class InciteWar extends CardImpl { // Choose one - Creatures target player controls attack this turn if able; this.getSpellAbility().addEffect(new InciteWarMustAttackEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); - + this.getSpellAbility().addWatcher(new AttackedThisTurnWatcher()); + // or creatures you control gain first strike until end of turn. Mode mode = new Mode(); mode.getEffects().add(new GainAbilityAllEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter)); this.getSpellAbility().getModes().addMode(mode); - + // Entwine {2} this.addAbility(new EntwineAbility("{2}")); } @@ -91,7 +93,7 @@ public class InciteWar extends CardImpl { class InciteWarMustAttackEffect extends OneShotEffect { public InciteWarMustAttackEffect() { - super(Outcome.Detriment); + super(Outcome.Detriment); staticText = "Creatures target player control attack this turn if able"; } @@ -116,4 +118,4 @@ class InciteWarMustAttackEffect extends OneShotEffect { } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/shardsofalara/GoblinAssault.java b/Mage.Sets/src/mage/sets/shardsofalara/GoblinAssault.java index 43ca9f54978..7877a087dc0 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/GoblinAssault.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/GoblinAssault.java @@ -28,22 +28,22 @@ package mage.sets.shardsofalara; import java.util.UUID; - -import mage.constants.*; import mage.MageInt; -import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.RequirementEffect; import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.combat.AttacksIfAbleAllEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; +import mage.watchers.common.AttackedThisTurnWatcher; /** * @@ -51,15 +51,21 @@ import mage.game.permanent.token.Token; */ public class GoblinAssault extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin creatures"); + + static { + filter.add(new SubtypePredicate("Goblin")); + } + public GoblinAssault(UUID ownerId) { super(ownerId, 101, "Goblin Assault", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); this.expansionSetCode = "ALA"; - // At the beginning of your upkeep, put a 1/1 red Goblin creature token with haste onto the battlefield. this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new GoblinAssaultToken()), TargetController.YOU, false)); + // Goblin creatures attack each turn if able. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GoblinAssaultEffect())); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AttacksIfAbleAllEffect(filter, Duration.WhileOnBattlefield)), new AttackedThisTurnWatcher()); } public GoblinAssault(final GoblinAssault card) { @@ -72,48 +78,6 @@ public class GoblinAssault extends CardImpl { } } - -class GoblinAssaultEffect extends RequirementEffect { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Goblin creatures"); - static { - filter.add(new SubtypePredicate("Goblin")); - } - - public GoblinAssaultEffect() { - super(Duration.WhileOnBattlefield); - staticText = "Goblin creatures attack each turn if able"; - } - - public GoblinAssaultEffect(final GoblinAssaultEffect effect) { - super(effect); - } - - @Override - public GoblinAssaultEffect copy() { - return new GoblinAssaultEffect(this); - } - - @Override - public boolean applies(Permanent permanent, Ability source, Game game) { - if (filter.match(permanent, source.getSourceId(), source.getControllerId(), game)) { - return true; - } - return false; - } - - @Override - public boolean mustAttack(Game game) { - return true; - } - - @Override - public boolean mustBlock(Game game) { - return false; - } - -} - class GoblinAssaultToken extends Token { public GoblinAssaultToken() { diff --git a/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAllEffect.java b/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAllEffect.java index 4cdc3b8317a..2983f348322 100644 --- a/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAllEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleAllEffect.java @@ -3,7 +3,6 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ - package mage.abilities.effects.common.combat; import mage.abilities.Ability; @@ -12,6 +11,7 @@ import mage.constants.Duration; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.watchers.common.AttackedThisTurnWatcher; /** * @@ -24,19 +24,28 @@ public class AttacksIfAbleAllEffect extends RequirementEffect { public AttacksIfAbleAllEffect(FilterCreaturePermanent filter) { this(filter, Duration.WhileOnBattlefield); } - + + boolean eachCombat; + public AttacksIfAbleAllEffect(FilterCreaturePermanent filter, Duration duration) { + this(filter, duration, false); + } + + public AttacksIfAbleAllEffect(FilterCreaturePermanent filter, Duration duration, boolean eachCombat) { super(duration); - staticText = new StringBuilder(filter.getMessage()) - .append(" attack ") - .append(duration.equals(Duration.EndOfTurn) ? "this":"each") - .append(" turn if able").toString(); this.filter = filter; + this.eachCombat = eachCombat; + if (this.duration == Duration.EndOfTurn) { + staticText = filter.getMessage() + " attack " + (eachCombat ? "each combat" : "this turn") + " if able"; + } else { + staticText = filter.getMessage() + " attack each " + (eachCombat ? "combat" : "turn") + " if able"; + } } public AttacksIfAbleAllEffect(final AttacksIfAbleAllEffect effect) { super(effect); this.filter = effect.filter; + this.eachCombat = effect.eachCombat; } @Override @@ -46,7 +55,14 @@ public class AttacksIfAbleAllEffect extends RequirementEffect { @Override public boolean applies(Permanent permanent, Ability source, Game game) { - return filter.match(permanent, source.getSourceId(), source.getControllerId(), game); + if (filter.match(permanent, source.getSourceId(), source.getControllerId(), game)) { + if (eachCombat) { + return true; + } + AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get("AttackedThisTurn"); + return watcher != null && !watcher.getAttackedThisTurnCreatures().contains(permanent.getId()); + } + return false; } @Override diff --git a/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java b/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java index a06f8ddead7..cc9600fb9c2 100644 --- a/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/AttacksIfAbleTargetEffect.java @@ -25,13 +25,12 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects.common.combat; -import mage.constants.Duration; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.RequirementEffect; +import mage.constants.Duration; import mage.game.Game; import mage.game.permanent.Permanent; @@ -56,10 +55,7 @@ public class AttacksIfAbleTargetEffect extends RequirementEffect { @Override public boolean applies(Permanent permanent, Ability source, Game game) { - if (this.getTargetPointer().getTargets(game, source).contains(permanent.getId())) { - return true; - } - return false; + return this.getTargetPointer().getTargets(game, source).contains(permanent.getId()); } @Override @@ -79,8 +75,7 @@ public class AttacksIfAbleTargetEffect extends RequirementEffect { } if (this.duration == Duration.EndOfTurn) { return new StringBuilder("Target ").append(mode.getTargets().get(0).getTargetName()).append(" attacks this turn if able").toString(); - } - else { + } else { return new StringBuilder("Target ").append(mode.getTargets().get(0).getTargetName()).append(" attacks each turn if able").toString(); } } From 9bedbc882103618dabe34c3b70a53a1d0438e1cf Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 24 Sep 2015 09:47:59 +0300 Subject: [PATCH 14/42] Add copy() method to tokens that need it. --- Mage/src/mage/game/permanent/token/DemonToken.java | 9 +++++++++ Mage/src/mage/game/permanent/token/HumanToken.java | 9 +++++++++ Mage/src/mage/game/permanent/token/WarriorToken.java | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/Mage/src/mage/game/permanent/token/DemonToken.java b/Mage/src/mage/game/permanent/token/DemonToken.java index 5643ff2ad8f..824d6eb0a28 100644 --- a/Mage/src/mage/game/permanent/token/DemonToken.java +++ b/Mage/src/mage/game/permanent/token/DemonToken.java @@ -50,6 +50,15 @@ public class DemonToken extends Token { availableImageSetCodes.addAll(Arrays.asList("INN", "AVR", "C14", "ORI")); } + public DemonToken(final DemonToken token) { + super(token); + } + + @Override + public DemonToken copy() { + return new DemonToken(this); + } + @Override public void setExpansionSetCodeForImage(String code) { super.setExpansionSetCodeForImage(code); diff --git a/Mage/src/mage/game/permanent/token/HumanToken.java b/Mage/src/mage/game/permanent/token/HumanToken.java index 9ca595ce975..6e580a5642f 100644 --- a/Mage/src/mage/game/permanent/token/HumanToken.java +++ b/Mage/src/mage/game/permanent/token/HumanToken.java @@ -48,6 +48,15 @@ public class HumanToken extends Token { availableImageSetCodes.addAll(Arrays.asList("DKA", "AVR", "FNMP")); } + public HumanToken(final HumanToken token) { + super(token); + } + + @Override + public HumanToken copy() { + return new HumanToken(this); + } + @Override public void setExpansionSetCodeForImage(String code) { super.setExpansionSetCodeForImage(code); diff --git a/Mage/src/mage/game/permanent/token/WarriorToken.java b/Mage/src/mage/game/permanent/token/WarriorToken.java index a864106d3a5..5ddc1c3aa21 100644 --- a/Mage/src/mage/game/permanent/token/WarriorToken.java +++ b/Mage/src/mage/game/permanent/token/WarriorToken.java @@ -49,6 +49,15 @@ public class WarriorToken extends Token { availableImageSetCodes.addAll(Arrays.asList("KTK", "DTK")); } + public WarriorToken(final WarriorToken token) { + super(token); + } + + @Override + public WarriorToken copy() { + return new WarriorToken(this); + } + @Override public void setExpansionSetCodeForImage(String code) { super.setExpansionSetCodeForImage(code); From c73e7b72b11e3e5217584821ed825307bf5ec420 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Thu, 24 Sep 2015 09:55:42 +0300 Subject: [PATCH 15/42] Fix Notorious Throng's tooltip text. --- Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java b/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java index ed9b704332d..d943672f4a4 100644 --- a/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java +++ b/Mage.Sets/src/mage/sets/morningtide/NotoriousThrong.java @@ -31,6 +31,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.condition.common.ProwlCondition; import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; @@ -61,7 +62,9 @@ public class NotoriousThrong extends CardImpl { this.getSpellAbility().addEffect(new NotoriousThrongEffect()); this.getSpellAbility().addWatcher(new AmountOfDamageAPlayerReceivedThisTurnWatcher()); // If Notorious Throng's prowl cost was paid, take an extra turn after this one. - this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new AddExtraTurnControllerEffect(), ProwlCondition.getInstance())); + Effect effect = new ConditionalOneShotEffect(new AddExtraTurnControllerEffect(), ProwlCondition.getInstance()); + effect.setText("If {this}'s prowl cost was paid, take an extra turn after this one."); + this.getSpellAbility().addEffect(effect); } public NotoriousThrong(final NotoriousThrong card) { @@ -78,7 +81,7 @@ class NotoriousThrongEffect extends OneShotEffect { public NotoriousThrongEffect() { super(Outcome.PutCreatureInPlay); - staticText = "Put X 1/1 black Faerie Rogue creature tokens with flying onto the battlefield, where X is the damage dealt to your opponents this turn."; + staticText = "Put X 1/1 black Faerie Rogue creature tokens with flying onto the battlefield, where X is the damage dealt to your opponents this turn"; } public NotoriousThrongEffect(NotoriousThrongEffect effect) { From b2cc5b59c606b71cc22607bb0e42aec85b00815e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 24 Sep 2015 19:51:30 +0200 Subject: [PATCH 16/42] * Brutal Expulsion - Fixed that the spell could wrongly target itself on the stack. --- .../target/common/TargetSpellOrPermanent.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Mage/src/mage/target/common/TargetSpellOrPermanent.java b/Mage/src/mage/target/common/TargetSpellOrPermanent.java index fea5811abbf..a52afb47ca7 100644 --- a/Mage/src/mage/target/common/TargetSpellOrPermanent.java +++ b/Mage/src/mage/target/common/TargetSpellOrPermanent.java @@ -117,13 +117,15 @@ public class TargetSpellOrPermanent extends TargetImpl { if (permanent != null) { if (source != null) { MageObject targetSource = game.getObject(source.getSourceId()); - return permanent.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(permanent, source.getSourceId(), source.getControllerId(), game); + return permanent.canBeTargetedBy(targetSource, source.getControllerId(), game) + && filter.match(permanent, source.getSourceId(), source.getControllerId(), game); } else { return filter.match(permanent, game); } } Spell spell = game.getStack().getSpell(id); - if (spell != null) { + if (spell != null + && !source.getSourceId().equals(id)) { // 114.4. A spell or ability on the stack is an illegal target for itself. return filter.match(spell, game); } return false; @@ -151,7 +153,9 @@ public class TargetSpellOrPermanent extends TargetImpl { MageObject targetSource = game.getObject(sourceId); for (StackObject stackObject : game.getStack()) { Spell spell = game.getStack().getSpell(stackObject.getId()); - if (spell != null && filter.match(spell, sourceId, sourceControllerId, game)) { + if (spell != null + && !sourceId.equals(spell.getSourceId()) + && filter.match(spell, sourceId, sourceControllerId, game)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -184,7 +188,8 @@ public class TargetSpellOrPermanent extends TargetImpl { int count = 0; for (StackObject stackObject : game.getStack()) { Spell spell = game.getStack().getSpell(stackObject.getId()); - if (spell != null && filter.match(spell, null, sourceControllerId, game) && filter.match(spell, game)) { + if (spell != null + && filter.match(spell, null, sourceControllerId, game) && filter.match(spell, game)) { count++; if (count >= this.minNumberOfTargets) { return true; @@ -208,7 +213,9 @@ public class TargetSpellOrPermanent extends TargetImpl { MageObject targetSource = game.getObject(sourceId); for (StackObject stackObject : game.getStack()) { Spell spell = game.getStack().getSpell(stackObject.getId()); - if (spell != null && filter.match(spell, null, sourceControllerId, game) && filter.match(spell, game)) { + if (spell != null + && !sourceId.equals(spell.getSourceId()) + && filter.match(spell, sourceId, sourceControllerId, game)) { possibleTargets.add(spell.getId()); } } @@ -225,7 +232,8 @@ public class TargetSpellOrPermanent extends TargetImpl { Set possibleTargets = new HashSet<>(); for (StackObject stackObject : game.getStack()) { Spell spell = game.getStack().getSpell(stackObject.getId()); - if (spell != null && filter.match(spell, null, sourceControllerId, game) && filter.match(spell, game)) { + if (spell != null + && filter.match(spell, null, sourceControllerId, game)) { possibleTargets.add(spell.getId()); } } From d7a80dc11defa63efc860f5f2a6c894e14ba7166 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 24 Sep 2015 19:59:16 +0200 Subject: [PATCH 17/42] * Infuse with the Elements - Fixed that one +1/+1 counter too much was placed on target creature. --- .../src/mage/sets/battleforzendikar/InfuseWithTheElements.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/InfuseWithTheElements.java b/Mage.Sets/src/mage/sets/battleforzendikar/InfuseWithTheElements.java index 080658ef9cb..5f30903dbf6 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/InfuseWithTheElements.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/InfuseWithTheElements.java @@ -53,7 +53,7 @@ public class InfuseWithTheElements extends CardImpl { // Converge - Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast Infuse with the Elements. this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE); - Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance()); + Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(0), ColorsOfManaSpentToCastCount.getInstance()); effect.setText("Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast {this}"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); From 234d5b0a528337304a4e5a791f3b7b35650bcaf7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 24 Sep 2015 20:09:49 +0200 Subject: [PATCH 18/42] * Kiora, Master of the Depths - Fixed second ability that handled card movement to graveyard not correctly. --- .../KioraMasterOfTheDepths.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java b/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java index e8f68019e99..557c17be929 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java @@ -150,17 +150,16 @@ class KioraRevealEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); + Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); - if (sourceObject != null && player != null) { - Cards cards = new CardsImpl(Zone.PICK); + if (sourceObject != null && controller != null) { + Cards cards = new CardsImpl(Zone.LIBRARY); + cards.addAll(controller.getLibrary().getTopCards(game, 4)); boolean creatureCardFound = false; boolean landCardFound = false; - int count = Math.min(player.getLibrary().size(), 4); - for (int i = 0; i < count; i++) { - Card card = player.getLibrary().removeFromTop(game); + for (UUID cardId : cards) { + Card card = game.getCard(cardId); if (card != null) { - game.setZone(card.getId(), Zone.PICK); cards.add(card); if (card.getCardType().contains(CardType.CREATURE)) { creatureCardFound = true; @@ -172,30 +171,30 @@ class KioraRevealEffect extends OneShotEffect { } if (!cards.isEmpty()) { - player.revealCards(sourceObject.getName(), cards, game); + controller.revealCards(sourceObject.getName(), cards, game); if ((creatureCardFound || landCardFound) - && player.chooseUse(Outcome.DrawCard, + && controller.chooseUse(Outcome.DrawCard, "Put a creature card and/or a land card into your hand?", source, game)) { TargetCard target = new TargetCard(Zone.PICK, new FilterCreatureCard("creature card to put into your hand")); - if (creatureCardFound && player.choose(Outcome.DrawCard, cards, target, game)) { + if (creatureCardFound && controller.chooseTarget(Outcome.DrawCard, cards, target, source, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + controller.moveCards(card, null, Zone.HAND, source, game); } } - target = new TargetCard(Zone.PICK, new FilterLandCard("land card to put into your hand")); - if (landCardFound && player.choose(Outcome.DrawCard, cards, target, game)) { + target = new TargetCard(Zone.LIBRARY, new FilterLandCard("land card to put into your hand")); + if (landCardFound && controller.chooseTarget(Outcome.DrawCard, cards, target, source, game)) { Card card = cards.get(target.getFirstTarget(), game); if (card != null) { cards.remove(card); - card.moveToZone(Zone.HAND, source.getSourceId(), game, false); + controller.moveCards(card, null, Zone.HAND, source, game); } } } } - player.moveCards(cards, Zone.PICK, Zone.GRAVEYARD, source, game); + controller.moveCards(cards, null, Zone.GRAVEYARD, source, game); return true; } return false; From 3bb7b6dd5be92b66cdc61e2bd88dfa630b98775b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 25 Sep 2015 00:21:29 +0200 Subject: [PATCH 19/42] * Slab Hammer - Removed unneccessary target. --- Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java | 2 -- .../common/DontUntapInControllersNextUntapStepTargetEffect.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java b/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java index 31b09aed229..5cf9ddf0545 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java @@ -41,7 +41,6 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.filter.common.FilterControlledLandPermanent; -import mage.target.TargetPermanent; import mage.target.common.TargetControlledPermanent; /** @@ -60,7 +59,6 @@ public class SlabHammer extends CardImpl { new DoIfCostPaid(new BoostEquippedEffect(2, 2, Duration.EndOfTurn), new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent())), "Return a land you control to its owner's hand? (giving +2/+2 to the equipped creature)")); - ability.addTarget(new TargetPermanent()); this.addAbility(ability); // Equip {2} diff --git a/Mage/src/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java b/Mage/src/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java index 44403167deb..e679a45d44b 100644 --- a/Mage/src/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java @@ -148,7 +148,7 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR if (targetName != null && targetName.length() > 0) { return targetName + " doesn't untap during its controller's next untap step"; } else { - return "Target " + (mode == null ? "creature" : mode.getTargets().get(0).getTargetName()) + " doesn't untap during its controller's next untap step"; + return "target " + (mode == null ? "creature" : mode.getTargets().get(0).getTargetName()) + " doesn't untap during its controller's next untap step"; } } From 4c1754b9bff3471422b5219df8c2e46cdff0bb06 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 25 Sep 2015 00:34:02 +0200 Subject: [PATCH 20/42] * Tempt with Discovery - Fixed that players had not to shuffle their library after card search. --- .../commander2013/TemptWithDiscovery.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/sets/commander2013/TemptWithDiscovery.java b/Mage.Sets/src/mage/sets/commander2013/TemptWithDiscovery.java index e684acd3028..608f28407cd 100644 --- a/Mage.Sets/src/mage/sets/commander2013/TemptWithDiscovery.java +++ b/Mage.Sets/src/mage/sets/commander2013/TemptWithDiscovery.java @@ -27,6 +27,8 @@ */ package mage.sets.commander2013; +import java.util.LinkedHashSet; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -51,7 +53,6 @@ public class TemptWithDiscovery extends CardImpl { super(ownerId, 174, "Tempt with Discovery", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{G}"); this.expansionSetCode = "C13"; - // Tempting offer - Search your library for a land card and put it onto the battlefield. // Each opponent may search his or her library for a land card and put it onto the battlefield. // For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield. @@ -89,12 +90,14 @@ class TemptWithDiscoveryEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { + Set playersShuffle = new LinkedHashSet<>(); + playersShuffle.add(controller.getId()); TargetCardInLibrary target = new TargetCardInLibrary(new FilterLandCard()); if (controller.searchLibrary(target, game)) { - for (UUID cardId: target.getTargets()) { + for (UUID cardId : target.getTargets()) { Card card = game.getCard(cardId); if (card != null) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), controller.getId()); + controller.moveCards(card, null, Zone.BATTLEFIELD, source, game); } } } @@ -105,11 +108,12 @@ class TemptWithDiscoveryEffect extends OneShotEffect { if (opponent.chooseUse(outcome, "Search your library for a land card and put it onto the battlefield?", source, game)) { target.clearChosen(); opponentsUsedSearch++; + playersShuffle.add(playerId); if (opponent.searchLibrary(target, game)) { - for (UUID cardId: target.getTargets()) { + for (UUID cardId : target.getTargets()) { Card card = game.getCard(cardId); if (card != null) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), opponent.getId()); + opponent.moveCards(card, null, Zone.BATTLEFIELD, source, game); } } } @@ -119,17 +123,23 @@ class TemptWithDiscoveryEffect extends OneShotEffect { if (opponentsUsedSearch > 0) { target = new TargetCardInLibrary(0, opponentsUsedSearch, new FilterLandCard()); if (controller.searchLibrary(target, game)) { - for (UUID cardId: target.getTargets()) { + for (UUID cardId : target.getTargets()) { Card card = game.getCard(cardId); if (card != null) { - card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), controller.getId()); + controller.moveCards(card, null, Zone.BATTLEFIELD, source, game); } } } } + for (UUID playerId : playersShuffle) { + Player player = game.getPlayer(playerId); + if (player != null) { + player.shuffleLibrary(game); + } + } return true; } - + return false; } } From b929b231d8b6272c5f3069999a4d889c2c61fd3c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 25 Sep 2015 00:37:29 +0200 Subject: [PATCH 21/42] * Evolutionary Leap - Fixed minor tooltip text bug. --- Mage.Sets/src/mage/sets/magicorigins/EvolutionaryLeap.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/magicorigins/EvolutionaryLeap.java b/Mage.Sets/src/mage/sets/magicorigins/EvolutionaryLeap.java index b5cd46c4577..29b4b9dc852 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/EvolutionaryLeap.java +++ b/Mage.Sets/src/mage/sets/magicorigins/EvolutionaryLeap.java @@ -42,6 +42,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.players.Library; @@ -60,7 +61,7 @@ public class EvolutionaryLeap extends CardImpl { // {G}, Sacrifice a creature: Reveal cards from the top of your library until you reveal a creature card. Put that card into your hand and the rest on the bottom of your library in a random order. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new EvolutionaryLeapEffect(), new ManaCostsImpl("{G}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature")))); this.addAbility(ability); } From 6c3d4677b2986553d1925bff5beb267fabcc52bb Mon Sep 17 00:00:00 2001 From: LoneFox Date: Fri, 25 Sep 2015 07:19:09 +0300 Subject: [PATCH 22/42] Implement cards: Cutthroat il-Dal, Dauthi Cutthroat, Dauthi Ghoul, and Infiltrator il-Kor --- .../src/mage/sets/exodus/DauthiCutthroat.java | 83 +++++++++++++++++++ .../mage/sets/futuresight/CutthroatIlDal.java | 70 ++++++++++++++++ .../sets/futuresight/InfiltratorIlKor.java | 67 +++++++++++++++ .../src/mage/sets/tempest/DauthiGhoul.java | 77 +++++++++++++++++ 4 files changed, 297 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/exodus/DauthiCutthroat.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/CutthroatIlDal.java create mode 100644 Mage.Sets/src/mage/sets/futuresight/InfiltratorIlKor.java create mode 100644 Mage.Sets/src/mage/sets/tempest/DauthiGhoul.java diff --git a/Mage.Sets/src/mage/sets/exodus/DauthiCutthroat.java b/Mage.Sets/src/mage/sets/exodus/DauthiCutthroat.java new file mode 100644 index 00000000000..031474abcb2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/exodus/DauthiCutthroat.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.exodus; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LoneFox + */ +public class DauthiCutthroat extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with shadow"); + + static { + filter.add(new AbilityPredicate(ShadowAbility.class)); + } + + public DauthiCutthroat(UUID ownerId) { + super(ownerId, 57, "Dauthi Cutthroat", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.expansionSetCode = "EXO"; + this.subtype.add("Dauthi"); + this.subtype.add("Minion"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Shadow + this.addAbility(ShadowAbility.getInstance()); + // {1}{B}, {tap}: Destroy target creature with shadow. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{1}{B}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public DauthiCutthroat(final DauthiCutthroat card) { + super(card); + } + + @Override + public DauthiCutthroat copy() { + return new DauthiCutthroat(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/CutthroatIlDal.java b/Mage.Sets/src/mage/sets/futuresight/CutthroatIlDal.java new file mode 100644 index 00000000000..b74a7724e2b --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/CutthroatIlDal.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.HellbentCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class CutthroatIlDal extends CardImpl { + + public CutthroatIlDal(UUID ownerId) { + super(ownerId, 64, "Cutthroat il-Dal", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Human"); + this.subtype.add("Rogue"); + this.power = new MageInt(4); + this.toughness = new MageInt(1); + + // Hellbent - Cutthroat il-Dal has shadow as long as you have no cards in hand. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( + new GainAbilitySourceEffect(ShadowAbility.getInstance(), Duration.WhileOnBattlefield), HellbentCondition.getInstance(), + "Hellbent - {this} has shadow as long as you have no cards in hand"))); } + + public CutthroatIlDal(final CutthroatIlDal card) { + super(card); + } + + @Override + public CutthroatIlDal copy() { + return new CutthroatIlDal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/InfiltratorIlKor.java b/Mage.Sets/src/mage/sets/futuresight/InfiltratorIlKor.java new file mode 100644 index 00000000000..0b402309a6d --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/InfiltratorIlKor.java @@ -0,0 +1,67 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.futuresight; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.ShadowAbility; +import mage.abilities.keyword.SuspendAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class InfiltratorIlKor extends CardImpl { + + public InfiltratorIlKor(UUID ownerId) { + super(ownerId, 37, "Infiltrator il-Kor", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{U}"); + this.expansionSetCode = "FUT"; + this.subtype.add("Kor"); + this.subtype.add("Rogue"); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Shadow + this.addAbility(ShadowAbility.getInstance()); + // Suspend 2-{1}{U} + this.addAbility(new SuspendAbility(2, new ManaCostsImpl("{1}{U}"), this)); + } + + public InfiltratorIlKor(final InfiltratorIlKor card) { + super(card); + } + + @Override + public InfiltratorIlKor copy() { + return new InfiltratorIlKor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/DauthiGhoul.java b/Mage.Sets/src/mage/sets/tempest/DauthiGhoul.java new file mode 100644 index 00000000000..8b81a6833e1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/DauthiGhoul.java @@ -0,0 +1,77 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.tempest; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.ShadowAbility; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author LoneFox + */ +public class DauthiGhoul extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature with shadow"); + + static { + filter.add(new AbilityPredicate(ShadowAbility.class)); + } + + public DauthiGhoul(UUID ownerId) { + super(ownerId, 15, "Dauthi Ghoul", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.expansionSetCode = "TMP"; + this.subtype.add("Dauthi"); + this.subtype.add("Zombie"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Shadow + this.addAbility(ShadowAbility.getInstance()); + // Whenever a creature with shadow dies, put a +1/+1 counter on Dauthi Ghoul. + this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, filter)); + } + + public DauthiGhoul(final DauthiGhoul card) { + super(card); + } + + @Override + public DauthiGhoul copy() { + return new DauthiGhoul(this); + } +} From 71e8d90c8301431b7fa717e90961761e534e34e7 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Fri, 25 Sep 2015 07:20:33 +0300 Subject: [PATCH 23/42] Implement cards: Circle of Protection: Shadow, Faceless Devourer, Stronghold Overseer, and Thalakos Mistfolk --- .../tempest/CircleOfProtectionShadow.java | 74 +++++++++++++++ .../mage/sets/tempest/ThalakosMistfolk.java | 69 ++++++++++++++ .../sets/timespiral/FacelessDevourer.java | 92 +++++++++++++++++++ .../sets/timespiral/StrongholdOverseer.java | 89 ++++++++++++++++++ .../common/ExileTargetForSourceEffect.java | 4 + 5 files changed, 328 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/tempest/CircleOfProtectionShadow.java create mode 100644 Mage.Sets/src/mage/sets/tempest/ThalakosMistfolk.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/FacelessDevourer.java create mode 100644 Mage.Sets/src/mage/sets/timespiral/StrongholdOverseer.java diff --git a/Mage.Sets/src/mage/sets/tempest/CircleOfProtectionShadow.java b/Mage.Sets/src/mage/sets/tempest/CircleOfProtectionShadow.java new file mode 100644 index 00000000000..195c8378d33 --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/CircleOfProtectionShadow.java @@ -0,0 +1,74 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.tempest; + +import java.util.UUID; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.PreventNextDamageFromChosenSourceToYouEffect; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author LoneFox + */ +public class CircleOfProtectionShadow extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature of your choice with shadow"); + + static { + filter.add(new AbilityPredicate(ShadowAbility.class)); + } + + public CircleOfProtectionShadow(UUID ownerId) { + super(ownerId, 224, "Circle of Protection: Shadow", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "TMP"; + + // {1}: The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage. + Effect effect = new PreventNextDamageFromChosenSourceToYouEffect(Duration.EndOfTurn, filter); + effect.setText("The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage"); + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("1"))); + } + + public CircleOfProtectionShadow(final CircleOfProtectionShadow card) { + super(card); + } + + @Override + public CircleOfProtectionShadow copy() { + return new CircleOfProtectionShadow(this); + } +} diff --git a/Mage.Sets/src/mage/sets/tempest/ThalakosMistfolk.java b/Mage.Sets/src/mage/sets/tempest/ThalakosMistfolk.java new file mode 100644 index 00000000000..d13503cf7ed --- /dev/null +++ b/Mage.Sets/src/mage/sets/tempest/ThalakosMistfolk.java @@ -0,0 +1,69 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.tempest; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PutOnLibrarySourceEffect; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LoneFox + */ +public class ThalakosMistfolk extends CardImpl { + + public ThalakosMistfolk(UUID ownerId) { + super(ownerId, 93, "Thalakos Mistfolk", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "TMP"; + this.subtype.add("Thalakos"); + this.subtype.add("Illusion"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Shadow + this.addAbility(ShadowAbility.getInstance()); + // {U}: Put Thalakos Mistfolk on top of its owner's library. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutOnLibrarySourceEffect(true), new ManaCostsImpl("{U}"))); + } + + public ThalakosMistfolk(final ThalakosMistfolk card) { + super(card); + } + + @Override + public ThalakosMistfolk copy() { + return new ThalakosMistfolk(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/FacelessDevourer.java b/Mage.Sets/src/mage/sets/timespiral/FacelessDevourer.java new file mode 100644 index 00000000000..10a7130adcd --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/FacelessDevourer.java @@ -0,0 +1,92 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ExileTargetForSourceEffect; +import mage.abilities.effects.common.ReturnFromExileForSourceEffect; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.Target; +import mage.target.TargetPermanent; + +/** + * + * @author LoneFox + */ +public class FacelessDevourer extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(new AnotherPredicate()); + filter.add(new AbilityPredicate(ShadowAbility.class)); + } + + public FacelessDevourer(UUID ownerId) { + super(ownerId, 108, "Faceless Devourer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Nightmare"); + this.subtype.add("Horror"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Shadow + this.addAbility(ShadowAbility.getInstance()); + // When Faceless Devourer enters the battlefield, exile another target creature with shadow. + Effect effect = new ExileTargetForSourceEffect(); + effect.setText("exile another target creature with shadow"); + Ability ability = new EntersBattlefieldTriggeredAbility(effect, false); + Target target = new TargetPermanent(filter); + ability.addTarget(target); + this.addAbility(ability); + // When Faceless Devourer leaves the battlefield, return the exiled card to the battlefield under its owner's control. + ability = new LeavesBattlefieldTriggeredAbility(new ReturnFromExileForSourceEffect(Zone.BATTLEFIELD), false); + this.addAbility(ability); + } + + public FacelessDevourer(final FacelessDevourer card) { + super(card); + } + + @Override + public FacelessDevourer copy() { + return new FacelessDevourer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/StrongholdOverseer.java b/Mage.Sets/src/mage/sets/timespiral/StrongholdOverseer.java new file mode 100644 index 00000000000..6127f98184d --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/StrongholdOverseer.java @@ -0,0 +1,89 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ShadowAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author LoneFox + */ +public class StrongholdOverseer extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with shadow"); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creatures without shadow"); + + static { + filter.add(new AbilityPredicate(ShadowAbility.class)); + filter2.add(Predicates.not(new AbilityPredicate(ShadowAbility.class))); + } + + public StrongholdOverseer(UUID ownerId) { + super(ownerId, 133, "Stronghold Overseer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}{B}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Demon"); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Shadow + this.addAbility(ShadowAbility.getInstance()); + // {B}{B}: Creatures with shadow get +1/+0 until end of turn and creatures without shadow get -1/-0 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 0, Duration.EndOfTurn, filter, false), new ManaCostsImpl("{B}{B}")); + Effect effect = new BoostAllEffect(-1, 0, Duration.EndOfTurn, filter2, false); + effect.setText("and creatures without shadow get -1/-0 until end of turn"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public StrongholdOverseer(final StrongholdOverseer card) { + super(card); + } + + @Override + public StrongholdOverseer copy() { + return new StrongholdOverseer(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/ExileTargetForSourceEffect.java b/Mage/src/mage/abilities/effects/common/ExileTargetForSourceEffect.java index 99b3a1e0bdc..f909d0828ea 100644 --- a/Mage/src/mage/abilities/effects/common/ExileTargetForSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/ExileTargetForSourceEffect.java @@ -84,6 +84,10 @@ public class ExileTargetForSourceEffect extends OneShotEffect { @Override public String getText(Mode mode) { + if(staticText != null && !staticText.isEmpty()) { + return staticText; + } + if (mode.getTargets().isEmpty()) { return "Exile it"; } else { From cbeaaa26a60964bd81744adeb1a14b7cdff3b516 Mon Sep 17 00:00:00 2001 From: LoneFox Date: Fri, 25 Sep 2015 07:21:47 +0300 Subject: [PATCH 24/42] Fix Faceless Butcher's tooltip text (missing "other than Faceless Butcher") --- .../src/mage/sets/timeshifted/FacelessButcher.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/timeshifted/FacelessButcher.java b/Mage.Sets/src/mage/sets/timeshifted/FacelessButcher.java index 3fc17bbe5a5..9ff88812945 100644 --- a/Mage.Sets/src/mage/sets/timeshifted/FacelessButcher.java +++ b/Mage.Sets/src/mage/sets/timeshifted/FacelessButcher.java @@ -32,6 +32,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.ExileTargetForSourceEffect; import mage.abilities.effects.common.ReturnFromExileForSourceEffect; import mage.cards.CardImpl; @@ -56,8 +57,8 @@ public class FacelessButcher extends CardImpl { static { filter.add(new AnotherPredicate()); } - - + + public FacelessButcher(UUID ownerId) { super(ownerId, 43, "Faceless Butcher", Rarity.SPECIAL, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); this.expansionSetCode = "TSB"; @@ -65,10 +66,12 @@ public class FacelessButcher extends CardImpl { this.subtype.add("Horror"); this.power = new MageInt(2); this.toughness = new MageInt(3); - + // When Faceless Butcher enters the battlefield, exile target creature other than Faceless Butcher. - Ability ability1 = new EntersBattlefieldTriggeredAbility(new ExileTargetForSourceEffect(), false); + Effect effect = new ExileTargetForSourceEffect(); + effect.setText("exile target creature other than {this}"); + Ability ability1 = new EntersBattlefieldTriggeredAbility(effect, false); Target target = new TargetPermanent(filter); ability1.addTarget(target); this.addAbility(ability1); @@ -76,7 +79,7 @@ public class FacelessButcher extends CardImpl { // When Faceless Butcher leaves the battlefield, return the exiled card to the battlefield under its owner's control. Ability ability2 = new LeavesBattlefieldTriggeredAbility(new ReturnFromExileForSourceEffect(Zone.BATTLEFIELD), false); this.addAbility(ability2); - + } public FacelessButcher(final FacelessButcher card) { From c7edbbac5bffc2fc992b79b776d3750ddfce6a6a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 25 Sep 2015 22:04:49 +0200 Subject: [PATCH 25/42] * Fixed a bug that automatically pass priority after putting an activated ability to stack passed to next phase if the ability was not put on the stack (e.g. Suspend). --- Mage/src/mage/players/PlayerImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 8ab8b836b3c..44d164941fb 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -1136,7 +1136,9 @@ public abstract class PlayerImpl implements Player, Serializable { justActivatedType = null; if (result) { if (isHuman() && (ability.getAbilityType().equals(AbilityType.SPELL) || ability.getAbilityType().equals(AbilityType.ACTIVATED))) { - setJustActivatedType(ability.getAbilityType()); + if (ability.isUsesStack()) { // if the ability does not use the stack (e.g. Suspend) auto pass would go to next phase unintended + setJustActivatedType(ability.getAbilityType()); + } } game.getPlayers().resetPassed(); } From 28b575cf37e7c6da373a41818b4c942527b488f1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 25 Sep 2015 22:15:13 +0200 Subject: [PATCH 26/42] * 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). --- .../abilities/keyword/NinjutsuAbility.java | 76 +++++++++---------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/Mage/src/mage/abilities/keyword/NinjutsuAbility.java b/Mage/src/mage/abilities/keyword/NinjutsuAbility.java index 23d23b2aad4..8fc900bd3d1 100644 --- a/Mage/src/mage/abilities/keyword/NinjutsuAbility.java +++ b/Mage/src/mage/abilities/keyword/NinjutsuAbility.java @@ -1,36 +1,33 @@ /* -* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without modification, are -* permitted provided that the following conditions are met: -* -* 1. Redistributions of source code must retain the above copyright notice, this list of -* conditions and the following disclaimer. -* -* 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 -* provided with the distribution. -* -* 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 -* 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 -* 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 -* 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 -* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -* 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 -* or implied, of BetaSteward_at_googlemail.com. -*/ - + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ package mage.abilities.keyword; import java.util.UUID; - -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.ActivatedAbilityImpl; import mage.abilities.costs.Cost; @@ -41,6 +38,7 @@ import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.Outcome; +import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.UnblockedPredicate; import mage.game.Game; @@ -52,9 +50,9 @@ import mage.target.common.TargetControlledPermanent; /** * 702.47. Ninjutsu * - * 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 - * this card from your hand, Return an unblocked attacking creature you control + * 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 + * 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 * and attacking." * @@ -62,8 +60,8 @@ import mage.target.common.TargetControlledPermanent; * announced until the ability leaves the stack. * * 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 - * put onto the battlefield unblocked. It will be attacking the same player or + * battlefield is unblocked (see rule 509.1h). The creature with ninjutsu is put + * onto the battlefield unblocked. It will be attacking the same player or * 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 */ public NinjutsuAbility(ManaCost manaCost) { - super(Zone.HAND,new NinjutsuEffect(), manaCost); + super(Zone.HAND, new NinjutsuEffect(), manaCost); 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) { @@ -128,7 +126,7 @@ class NinjutsuEffect extends OneShotEffect { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { UUID defendingPlayerId = null; - for (Cost cost :source.getCosts()) { + for (Cost cost : source.getCosts()) { if (cost instanceof ReturnAttackerToHandTargetCost) { defendingPlayerId = ((ReturnAttackerToHandTargetCost) cost).getDefendingPlayerId(); } @@ -161,7 +159,7 @@ class ReturnAttackerToHandTargetCost extends CostImpl { @Override public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { 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); if (permanent == null) { return false; From 85cec315dbaef446edf6eaa03858e54191100743 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 25 Sep 2015 22:32:53 +0200 Subject: [PATCH 27/42] * Fixed a lot of cards with return permanent to hand costs, where the selection of the permanent was handled targeted. --- .../sets/alarareborn/FieldmistBorderpost.java | 4 ++-- .../sets/alarareborn/FirewildBorderpost.java | 4 ++-- .../sets/alarareborn/MistveinBorderpost.java | 4 ++-- .../sets/alarareborn/VeinfireBorderpost.java | 4 ++-- .../sets/alarareborn/WildfieldBorderpost.java | 4 ++-- .../mage/sets/battleforzendikar/SlabHammer.java | 4 ++-- .../sets/betrayersofkamigawa/Floodbringer.java | 4 ++-- .../betrayersofkamigawa/SoratamiMindsweeper.java | 4 ++-- .../sets/betrayersofkamigawa/VeilOfSecrecy.java | 4 ++-- .../sets/bornofthegods/FloodtideSerpent.java | 6 +++--- .../MelokuTheCloudedMirror.java | 4 ++-- .../championsofkamigawa/SoratamiCloudskater.java | 11 +++++------ .../championsofkamigawa/SoratamiMirrorGuard.java | 4 ++-- .../championsofkamigawa/SoratamiMirrorMage.java | 11 +++++------ .../championsofkamigawa/SoratamiRainshaper.java | 4 ++-- .../sets/championsofkamigawa/SoratamiSavant.java | 4 ++-- .../sets/championsofkamigawa/SoratamiSeer.java | 4 ++-- .../championsofkamigawa/UyoSilentProphet.java | 4 ++-- .../mage/sets/commander2013/Stonecloaker.java | 8 ++++---- .../src/mage/sets/commander2014/CoralAtoll.java | 4 ++-- .../mage/sets/commander2014/DormantVolcano.java | 4 ++-- .../src/mage/sets/commander2014/Everglades.java | 8 ++++---- .../src/mage/sets/commander2014/JungleBasin.java | 4 ++-- Mage.Sets/src/mage/sets/commander2014/Karoo.java | 4 ++-- .../src/mage/sets/conflux/MasterTransmuter.java | 4 ++-- .../src/mage/sets/jacevschandra/FathomSeer.java | 4 ++-- Mage.Sets/src/mage/sets/jacevschandra/Gush.java | 4 ++-- .../mage/sets/jacevschandra/WaterspoutDjinn.java | 4 ++-- .../sets/khansoftarkir/PearlLakeAncient.java | 4 ++-- .../src/mage/sets/lorwyn/FamiliarsRuse.java | 16 +++++++++------- .../src/mage/sets/magic2013/RoaringPrimadox.java | 12 ++---------- .../src/mage/sets/mercadianmasques/Thwart.java | 4 ++-- .../mage/sets/mercadianmasques/TidalBore.java | 4 ++-- Mage.Sets/src/mage/sets/nemesis/Daze.java | 4 ++-- .../src/mage/sets/planeshift/ArcticMerfolk.java | 4 ++-- .../mage/sets/planeshift/CrosissCatacombs.java | 4 ++-- .../mage/sets/planeshift/DarigaazsCaldera.java | 4 ++-- .../src/mage/sets/planeshift/DromarsCavern.java | 4 ++-- .../src/mage/sets/planeshift/RithsGrove.java | 4 ++-- .../src/mage/sets/planeshift/TrevasRuins.java | 4 ++-- .../src/mage/sets/riseoftheeldrazi/Deprive.java | 4 ++-- .../saviorsofkamigawa/MoonbowIllusionist.java | 4 ++-- .../saviorsofkamigawa/OboroBreezecaller.java | 4 ++-- .../mage/sets/saviorsofkamigawa/OboroEnvoy.java | 4 ++-- .../saviorsofkamigawa/SoramaroFirstToDream.java | 4 ++-- .../src/mage/sets/scourge/WirewoodSymbiote.java | 4 ++-- .../src/mage/sets/timespiral/ScrybRanger.java | 4 ++-- .../src/mage/sets/visions/QuirionRanger.java | 4 ++-- .../src/mage/sets/zendikar/LivingTsunami.java | 4 ++-- ...turnToHandChosenControlledPermanentCost.java} | 11 ++++++----- 50 files changed, 122 insertions(+), 129 deletions(-) rename Mage/src/mage/abilities/costs/common/{ReturnToHandTargetPermanentCost.java => ReturnToHandChosenControlledPermanentCost.java} (88%) diff --git a/Mage.Sets/src/mage/sets/alarareborn/FieldmistBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/FieldmistBorderpost.java index fd91cace663..2db77ebb0ef 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/FieldmistBorderpost.java +++ b/Mage.Sets/src/mage/sets/alarareborn/FieldmistBorderpost.java @@ -34,7 +34,7 @@ import mage.constants.CardType; import mage.constants.Rarity; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.WhiteManaAbility; @@ -64,7 +64,7 @@ public class FieldmistBorderpost extends CardImpl { // You may pay {1} and return a basic land you control to its owner's hand rather than pay Fieldmist Borderpost's mana cost. Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); this.addAbility(ability); // Fieldmist Borderpost enters the battlefield tapped. diff --git a/Mage.Sets/src/mage/sets/alarareborn/FirewildBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/FirewildBorderpost.java index 586307655c0..e0464f950e2 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/FirewildBorderpost.java +++ b/Mage.Sets/src/mage/sets/alarareborn/FirewildBorderpost.java @@ -32,7 +32,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.RedManaAbility; @@ -64,7 +64,7 @@ public class FirewildBorderpost extends CardImpl { // You may pay {1} and return a basic land you control to its owner's hand rather than pay Firewild Borderpost's mana cost. Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); this.addAbility(ability); // Veinfire Firewild enters the battlefield tapped. diff --git a/Mage.Sets/src/mage/sets/alarareborn/MistveinBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/MistveinBorderpost.java index dc01e983b54..050cda79a5d 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/MistveinBorderpost.java +++ b/Mage.Sets/src/mage/sets/alarareborn/MistveinBorderpost.java @@ -34,7 +34,7 @@ import mage.constants.CardType; import mage.constants.Rarity; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; @@ -64,7 +64,7 @@ public class MistveinBorderpost extends CardImpl { // You may pay {1} and return a basic land you control to its owner's hand rather than pay Mistvein Borderpost's mana cost. Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); this.addAbility(ability); // Mistvein Borderpost enters the battlefield tapped. diff --git a/Mage.Sets/src/mage/sets/alarareborn/VeinfireBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/VeinfireBorderpost.java index 29ca354d0c0..82c2243a1cb 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/VeinfireBorderpost.java +++ b/Mage.Sets/src/mage/sets/alarareborn/VeinfireBorderpost.java @@ -34,7 +34,7 @@ import mage.constants.CardType; import mage.constants.Rarity; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.RedManaAbility; @@ -64,7 +64,7 @@ public class VeinfireBorderpost extends CardImpl { // You may pay {1} and return a basic land you control to its owner's hand rather than pay Veinfire Borderpost's mana cost. Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); this.addAbility(ability); // Veinfire Borderpost enters the battlefield tapped. diff --git a/Mage.Sets/src/mage/sets/alarareborn/WildfieldBorderpost.java b/Mage.Sets/src/mage/sets/alarareborn/WildfieldBorderpost.java index 2015f45f10a..f167e516df3 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/WildfieldBorderpost.java +++ b/Mage.Sets/src/mage/sets/alarareborn/WildfieldBorderpost.java @@ -34,7 +34,7 @@ import mage.constants.CardType; import mage.constants.Rarity; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.WhiteManaAbility; @@ -64,7 +64,7 @@ public class WildfieldBorderpost extends CardImpl { // You may pay {1} and return a basic land you control to its owner's hand rather than pay Wildfield Borderpost's mana cost. Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); this.addAbility(ability); // Wildfield Borderpost enters the battlefield tapped. diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java b/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java index 5cf9ddf0545..98e97a9e68e 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/SlabHammer.java @@ -30,7 +30,7 @@ package mage.sets.battleforzendikar; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.AttacksAttachedTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.continuous.BoostEquippedEffect; @@ -57,7 +57,7 @@ public class SlabHammer extends CardImpl { // Whenever equipped creature attacks, you may return a land you control to its owner's hand. If you do, the creature gets +2/+2 until end of turn. Ability ability = new AttacksAttachedTriggeredAbility( new DoIfCostPaid(new BoostEquippedEffect(2, 2, Duration.EndOfTurn), - new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent())), + new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent())), "Return a land you control to its owner's hand? (giving +2/+2 to the equipped creature)")); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/Floodbringer.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/Floodbringer.java index fa8a52c1232..cc2eab2da77 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/Floodbringer.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/Floodbringer.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.TapTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -64,7 +64,7 @@ public class Floodbringer extends CardImpl { // {2}, Return a land you control to its owner's hand: Tap target land. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new GenericManaCost(2)); - ReturnToHandTargetPermanentCost cost = new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)); + ReturnToHandChosenControlledPermanentCost cost = new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)); cost.setText("Return a land you control to its owner's hand"); ability.addCost(cost); ability.addTarget(new TargetLandPermanent()); diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/SoratamiMindsweeper.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/SoratamiMindsweeper.java index 141dfacf5e8..d3905fda60b 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/SoratamiMindsweeper.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/SoratamiMindsweeper.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -66,7 +66,7 @@ public class SoratamiMindsweeper extends CardImpl { // {2}, Return a land you control to its owner's hand: Target player puts the top two cards of his or her library into his or her graveyard. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,new PutLibraryIntoGraveTargetEffect(2), new ManaCostsImpl("{2}")); ability.addTarget(new TargetPlayer()); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/VeilOfSecrecy.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/VeilOfSecrecy.java index c0184c3793c..7b4c81b3575 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/VeilOfSecrecy.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/VeilOfSecrecy.java @@ -29,7 +29,7 @@ package mage.sets.betrayersofkamigawa; import java.util.UUID; import mage.ObjectColor; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.Effect; import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; @@ -71,7 +71,7 @@ public class VeilOfSecrecy extends CardImpl { this.getSpellAbility().addEffect(effect); // Splice onto Arcane-Return a blue creature you control to its owner's hand. - this.addAbility(new SpliceOntoArcaneAbility(new ReturnToHandTargetPermanentCost(new TargetControlledCreaturePermanent(filter)))); + this.addAbility(new SpliceOntoArcaneAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledCreaturePermanent(filter)))); } public VeilOfSecrecy(final VeilOfSecrecy card) { diff --git a/Mage.Sets/src/mage/sets/bornofthegods/FloodtideSerpent.java b/Mage.Sets/src/mage/sets/bornofthegods/FloodtideSerpent.java index 0fcebf1fd79..16e5cd91835 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/FloodtideSerpent.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/FloodtideSerpent.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.PayCostToAttackBlockEffectImpl; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.combat.CantAttackBlockUnlessPaysSourceEffect; @@ -71,7 +71,7 @@ public class FloodtideSerpent extends CardImpl { // Floodtide Serpent can't attack unless you return an enchantment you control to its owner's hand (This cost is paid as attackers are declared.) this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackBlockUnlessPaysSourceEffect( - new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)), PayCostToAttackBlockEffectImpl.RestrictType.ATTACK))); + new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)), PayCostToAttackBlockEffectImpl.RestrictType.ATTACK))); } @@ -106,7 +106,7 @@ class FloodtideSerpentReplacementEffect extends ReplacementEffectImpl { public boolean replaceEvent(GameEvent event, Ability source, Game game) { Player player = game.getPlayer(event.getPlayerId()); if (player != null) { - ReturnToHandTargetPermanentCost attackCost = new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)); + ReturnToHandChosenControlledPermanentCost attackCost = new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)); if (attackCost.canPay(source, source.getSourceId(), event.getPlayerId(), game) && player.chooseUse(Outcome.Neutral, "Return an enchantment you control to hand to attack?", source, game)) { if (attackCost.pay(source, game, source.getSourceId(), event.getPlayerId(), true)) { diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/MelokuTheCloudedMirror.java b/Mage.Sets/src/mage/sets/championsofkamigawa/MelokuTheCloudedMirror.java index d4e8b1e5690..f1678c2c14c 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/MelokuTheCloudedMirror.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/MelokuTheCloudedMirror.java @@ -35,7 +35,7 @@ import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.FlyingAbility; @@ -66,7 +66,7 @@ public class MelokuTheCloudedMirror extends CardImpl { // {1}, Return a land you control to its owner's hand: Put a 1/1 blue Illusion creature token with flying onto the battlefield. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new MelokuTheCloudedMirrorToken(), 1), new GenericManaCost(1)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiCloudskater.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiCloudskater.java index bbcd6a5665e..4832aa5cd82 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiCloudskater.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiCloudskater.java @@ -25,21 +25,20 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.championsofkamigawa; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.DrawDiscardControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterControlledPermanent; import mage.target.common.TargetControlledPermanent; @@ -65,7 +64,7 @@ public class SoratamiCloudskater extends CardImpl { // {2}, Return a land you control to its owner's hand: Draw a card, then discard a card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawDiscardControllerEffect(), new GenericManaCost(2)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(1, 1, filter, true))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorGuard.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorGuard.java index c429582b1d1..f06f9b1ef96 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorGuard.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorGuard.java @@ -35,7 +35,7 @@ import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -74,7 +74,7 @@ public class SoratamiMirrorGuard extends CardImpl { // {2}, Return a land you control to its owner's hand: Target creature with power 2 or less can't be blocked this turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBeBlockedTargetEffect(), new GenericManaCost(2)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); ability.addTarget(new TargetCreaturePermanent(filterCreature)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorMage.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorMage.java index 458fdc8a00c..e93013bedc7 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorMage.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiMirrorMage.java @@ -25,21 +25,20 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.championsofkamigawa; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterControlledPermanent; import mage.target.common.TargetControlledPermanent; @@ -66,7 +65,7 @@ public class SoratamiMirrorMage extends CardImpl { // {3}, Return three lands you control to their owner's hand: Return target creature to its owner's hand. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new GenericManaCost(3)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(3, 3, filter, false))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(3, 3, filter, true))); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiRainshaper.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiRainshaper.java index 7f32cbe86db..3d0e59bc518 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiRainshaper.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiRainshaper.java @@ -35,7 +35,7 @@ import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -69,7 +69,7 @@ public class SoratamiRainshaper extends CardImpl { // {3}, Return a land you control to its owner's hand: Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(ShroudAbility.getInstance(), Duration.EndOfTurn), new GenericManaCost(3)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSavant.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSavant.java index 1060fdd8b36..9d479f7d85e 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSavant.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSavant.java @@ -35,7 +35,7 @@ import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.keyword.FlyingAbility; @@ -67,7 +67,7 @@ public class SoratamiSavant extends CardImpl { // {3}, Return a land you control to its owner's hand: Counter target spell unless its controller pays {3}. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(new GenericManaCost(3)), new GenericManaCost(3)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); ability.addTarget(new TargetSpell()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java index 344923e03db..9887cb743b1 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SoratamiSeer.java @@ -36,7 +36,7 @@ import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlyingAbility; @@ -70,7 +70,7 @@ public class SoratamiSeer extends CardImpl { // {4}, Return two lands you control to their owner's hand: Discard all the cards in your hand, then draw that many cards. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SoratamiSeerEffect(), new GenericManaCost(4)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(2, 2, filter, false))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, filter, false))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/UyoSilentProphet.java b/Mage.Sets/src/mage/sets/championsofkamigawa/UyoSilentProphet.java index 9b0b414d4ae..e3f4928b4fa 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/UyoSilentProphet.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/UyoSilentProphet.java @@ -34,7 +34,7 @@ import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.CopyTargetSpellEffect; import mage.abilities.keyword.FlyingAbility; @@ -75,7 +75,7 @@ public class UyoSilentProphet extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // {2}, Return two lands you control to their owner's hand: Copy target instant or sorcery spell. You may choose new targets for the copy. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new GenericManaCost(2)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("lands"), false))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("lands"), false))); ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/commander2013/Stonecloaker.java b/Mage.Sets/src/mage/sets/commander2013/Stonecloaker.java index 5cc2d1a4c95..92b4f50836f 100644 --- a/Mage.Sets/src/mage/sets/commander2013/Stonecloaker.java +++ b/Mage.Sets/src/mage/sets/commander2013/Stonecloaker.java @@ -32,14 +32,14 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.ExileTargetEffect; -import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.common.ReturnToHandChosenControlledPermanentEffect; import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.target.common.TargetCardInGraveyard; -import mage.target.common.TargetControlledCreaturePermanent; /** * @@ -60,8 +60,8 @@ public class Stonecloaker extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // When Stonecloaker enters the battlefield, return a creature you control to its owner's hand. - Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), false); - ability.addTarget(new TargetControlledCreaturePermanent()); + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandChosenControlledPermanentEffect(new FilterControlledCreaturePermanent()), true); + this.addAbility(ability); // When Stonecloaker enters the battlefield, exile target card from a graveyard. ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect(), false); diff --git a/Mage.Sets/src/mage/sets/commander2014/CoralAtoll.java b/Mage.Sets/src/mage/sets/commander2014/CoralAtoll.java index d2a186eb83c..3785405c2c3 100644 --- a/Mage.Sets/src/mage/sets/commander2014/CoralAtoll.java +++ b/Mage.Sets/src/mage/sets/commander2014/CoralAtoll.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.SimpleManaAbility; @@ -66,7 +66,7 @@ public class CoralAtoll extends CardImpl { // Coral Atoll enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); // When Coral Atoll enters the battlefield, sacrifice it unless you return an untapped Island you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {1}{U} to your mana pool. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 1, 0, 0, 1,0 ), new TapSourceCost())); diff --git a/Mage.Sets/src/mage/sets/commander2014/DormantVolcano.java b/Mage.Sets/src/mage/sets/commander2014/DormantVolcano.java index 800f515fca7..c4b046863bd 100644 --- a/Mage.Sets/src/mage/sets/commander2014/DormantVolcano.java +++ b/Mage.Sets/src/mage/sets/commander2014/DormantVolcano.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.SimpleManaAbility; @@ -66,7 +66,7 @@ public class DormantVolcano extends CardImpl { this.addAbility(new EntersBattlefieldTappedAbility()); // When Dormant Volcano enters the battlefield, sacrifice it unless you return an untapped Mountain you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {1}{R} to your mana pool. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(1, 0, 0, 0, 0, 1,0 ), new TapSourceCost())); diff --git a/Mage.Sets/src/mage/sets/commander2014/Everglades.java b/Mage.Sets/src/mage/sets/commander2014/Everglades.java index 7cf1f874132..e9693d66a88 100644 --- a/Mage.Sets/src/mage/sets/commander2014/Everglades.java +++ b/Mage.Sets/src/mage/sets/commander2014/Everglades.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.SimpleManaAbility; @@ -53,7 +53,7 @@ public class Everglades extends CardImpl { private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("an untapped Swamp"); - static{ + static { filter.add(new SubtypePredicate("Swamp")); filter.add(Predicates.not(new TappedPredicate())); } @@ -66,10 +66,10 @@ public class Everglades extends CardImpl { this.addAbility(new EntersBattlefieldTappedAbility()); // When Everglades enters the battlefield, sacrifice it unless you return an untapped Swamp you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(1, 1, filter, true))))); // {tap}: Add {1}{B} to your mana pool. - this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 0, 0, 1, 1,0 ), new TapSourceCost())); + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 0, 0, 1, 1, 0), new TapSourceCost())); } diff --git a/Mage.Sets/src/mage/sets/commander2014/JungleBasin.java b/Mage.Sets/src/mage/sets/commander2014/JungleBasin.java index c90e7f0e107..dfa53c525a9 100644 --- a/Mage.Sets/src/mage/sets/commander2014/JungleBasin.java +++ b/Mage.Sets/src/mage/sets/commander2014/JungleBasin.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.SimpleManaAbility; @@ -66,7 +66,7 @@ public class JungleBasin extends CardImpl { this.addAbility(new EntersBattlefieldTappedAbility()); // When Jungle Basin enters the battlefield, sacrifice it unless you return an untapped Forest you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {1}{G} to your mana pool. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 1, 0, 0, 0, 1,0 ), new TapSourceCost())); diff --git a/Mage.Sets/src/mage/sets/commander2014/Karoo.java b/Mage.Sets/src/mage/sets/commander2014/Karoo.java index eed52e1bc32..095d04b79d6 100644 --- a/Mage.Sets/src/mage/sets/commander2014/Karoo.java +++ b/Mage.Sets/src/mage/sets/commander2014/Karoo.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.Mana; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.SimpleManaAbility; @@ -66,7 +66,7 @@ public class Karoo extends CardImpl { this.addAbility(new EntersBattlefieldTappedAbility()); // When Karoo enters the battlefield, sacrifice it unless you return an untapped Plains you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {1}{W} to your mana pool. this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 0, 0, 1, 0, 1,0 ), new TapSourceCost())); diff --git a/Mage.Sets/src/mage/sets/conflux/MasterTransmuter.java b/Mage.Sets/src/mage/sets/conflux/MasterTransmuter.java index fcae2dcac52..ae89e66ea5d 100644 --- a/Mage.Sets/src/mage/sets/conflux/MasterTransmuter.java +++ b/Mage.Sets/src/mage/sets/conflux/MasterTransmuter.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; @@ -61,7 +61,7 @@ public class MasterTransmuter extends CardImpl { // {U}, {tap}, Return an artifact you control to its owner's hand: You may put an artifact card from your hand onto the battlefield. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PutPermanentOnBattlefieldEffect(new FilterArtifactCard("an artifact card")), new ManaCostsImpl("{U}")); ability.addCost(new TapSourceCost()); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact")))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact")))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/jacevschandra/FathomSeer.java b/Mage.Sets/src/mage/sets/jacevschandra/FathomSeer.java index b3b9fa11778..e322cd800d2 100644 --- a/Mage.Sets/src/mage/sets/jacevschandra/FathomSeer.java +++ b/Mage.Sets/src/mage/sets/jacevschandra/FathomSeer.java @@ -30,7 +30,7 @@ package mage.sets.jacevschandra; import java.util.UUID; import mage.MageInt; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; @@ -60,7 +60,7 @@ public class FathomSeer extends CardImpl { this.toughness = new MageInt(3); // Morph-Return two Islands you control to their owner's hand. - this.addAbility(new MorphAbility(this, new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(2,2, filter, true)))); + this.addAbility(new MorphAbility(this, new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2,2, filter, true)))); // When Fathom Seer is turned face up, draw two cards. this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new DrawCardSourceControllerEffect(2))); } diff --git a/Mage.Sets/src/mage/sets/jacevschandra/Gush.java b/Mage.Sets/src/mage/sets/jacevschandra/Gush.java index eabcd98d8c8..ab9d0a300fa 100644 --- a/Mage.Sets/src/mage/sets/jacevschandra/Gush.java +++ b/Mage.Sets/src/mage/sets/jacevschandra/Gush.java @@ -29,7 +29,7 @@ package mage.sets.jacevschandra; import java.util.UUID; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.constants.CardType; @@ -55,7 +55,7 @@ public class Gush extends CardImpl { // You may return two Islands you control to their owner's hand rather than pay Gush's mana cost. AlternativeCostSourceAbility ability; - ability = new AlternativeCostSourceAbility(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(2, 2, filter, true))); + ability = new AlternativeCostSourceAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, filter, true))); this.addAbility(ability); // Draw two cards. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2)); diff --git a/Mage.Sets/src/mage/sets/jacevschandra/WaterspoutDjinn.java b/Mage.Sets/src/mage/sets/jacevschandra/WaterspoutDjinn.java index ecf4bef9930..711ed79fc65 100644 --- a/Mage.Sets/src/mage/sets/jacevschandra/WaterspoutDjinn.java +++ b/Mage.Sets/src/mage/sets/jacevschandra/WaterspoutDjinn.java @@ -30,7 +30,7 @@ package mage.sets.jacevschandra; import java.util.UUID; import mage.MageInt; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -67,7 +67,7 @@ public class WaterspoutDjinn extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // At the beginning of your upkeep, sacrifice Waterspout Djinn unless you return an untapped Island you control to its owner's hand. this.addAbility(new BeginningOfUpkeepTriggeredAbility( - new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))), + new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))), TargetController.YOU, false)); } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/PearlLakeAncient.java b/Mage.Sets/src/mage/sets/khansoftarkir/PearlLakeAncient.java index a2b8784709f..9681a0d2bc6 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/PearlLakeAncient.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/PearlLakeAncient.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.common.CantBeCounteredAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.ProwessAbility; @@ -67,7 +67,7 @@ public class PearlLakeAncient extends CardImpl { // Return three lands you control to their owner's hand: Return Pearl Lake Ancient to its owner's hand. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), - new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(3, 3, new FilterControlledLandPermanent("lands"), true)))); + new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(3, 3, new FilterControlledLandPermanent("lands"), true)))); } public PearlLakeAncient(final PearlLakeAncient card) { diff --git a/Mage.Sets/src/mage/sets/lorwyn/FamiliarsRuse.java b/Mage.Sets/src/mage/sets/lorwyn/FamiliarsRuse.java index ba12a2e3612..4bf7c42fe6b 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/FamiliarsRuse.java +++ b/Mage.Sets/src/mage/sets/lorwyn/FamiliarsRuse.java @@ -27,17 +27,16 @@ */ package mage.sets.lorwyn; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import java.util.UUID; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.target.TargetSpell; import mage.target.common.TargetControlledCreaturePermanent; -import java.util.UUID; -import mage.filter.common.FilterControlledCreaturePermanent; - /** * * @author Loki @@ -48,7 +47,10 @@ public class FamiliarsRuse extends CardImpl { super(ownerId, 64, "Familiar's Ruse", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{U}{U}"); this.expansionSetCode = "LRW"; - this.getSpellAbility().addCost(new ReturnToHandTargetPermanentCost(new TargetControlledCreaturePermanent(1,1, new FilterControlledCreaturePermanent("creature"),false))); + // As an additional cost to cast Familiar's Ruse, return a creature you control to its owner's hand. + this.getSpellAbility().addCost(new ReturnToHandChosenControlledPermanentCost( + new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("creature"), true))); + // Counter target spell. this.getSpellAbility().addEffect(new CounterTargetEffect()); this.getSpellAbility().addTarget(new TargetSpell()); } diff --git a/Mage.Sets/src/mage/sets/magic2013/RoaringPrimadox.java b/Mage.Sets/src/mage/sets/magic2013/RoaringPrimadox.java index f2a2062eb01..5ed8a2f9894 100644 --- a/Mage.Sets/src/mage/sets/magic2013/RoaringPrimadox.java +++ b/Mage.Sets/src/mage/sets/magic2013/RoaringPrimadox.java @@ -28,22 +28,14 @@ package mage.sets.magic2013; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.OnEventTriggeredAbility; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.ReturnToHandChosenControlledPermanentEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.game.Game; import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetControlledCreaturePermanent; /** * diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/Thwart.java b/Mage.Sets/src/mage/sets/mercadianmasques/Thwart.java index a8c224e8dfe..0ecda013df4 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/Thwart.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/Thwart.java @@ -29,7 +29,7 @@ package mage.sets.mercadianmasques; import java.util.UUID; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; @@ -54,7 +54,7 @@ public class Thwart extends CardImpl { // You may return three Islands you control to their owner's hand rather than pay Thwart's mana cost. AlternativeCostSourceAbility ability; - ability = new AlternativeCostSourceAbility(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(3, 3, filter, true))); + ability = new AlternativeCostSourceAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(3, 3, filter, true))); this.addAbility(ability); // Counter target spell. diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/TidalBore.java b/Mage.Sets/src/mage/sets/mercadianmasques/TidalBore.java index abd9bf620da..792c862964f 100644 --- a/Mage.Sets/src/mage/sets/mercadianmasques/TidalBore.java +++ b/Mage.Sets/src/mage/sets/mercadianmasques/TidalBore.java @@ -29,7 +29,7 @@ package mage.sets.mercadianmasques; import java.util.UUID; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.MayTapOrUntapTargetEffect; import mage.cards.CardImpl; import mage.constants.CardType; @@ -58,7 +58,7 @@ public class TidalBore extends CardImpl { this.expansionSetCode = "MMQ"; // You may return an Island you control to its owner's hand rather than pay Tidal Bore's mana cost. - this.addAbility(new AlternativeCostSourceAbility(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)))); + this.addAbility(new AlternativeCostSourceAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)))); // You may tap or untap target creature. this.getSpellAbility().addEffect(new MayTapOrUntapTargetEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); diff --git a/Mage.Sets/src/mage/sets/nemesis/Daze.java b/Mage.Sets/src/mage/sets/nemesis/Daze.java index 5cdf8ec4c8c..ecb769b3740 100644 --- a/Mage.Sets/src/mage/sets/nemesis/Daze.java +++ b/Mage.Sets/src/mage/sets/nemesis/Daze.java @@ -29,7 +29,7 @@ package mage.sets.nemesis; import java.util.UUID; import mage.abilities.costs.AlternativeCostSourceAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.cards.CardImpl; @@ -60,7 +60,7 @@ public class Daze extends CardImpl { // You may return an Island you control to its owner's hand rather than pay Daze's mana cost. - this.addAbility(new AlternativeCostSourceAbility(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)))); + this.addAbility(new AlternativeCostSourceAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)))); // Counter target spell unless its controller pays {1}. this.getSpellAbility().addTarget(new TargetSpell()); diff --git a/Mage.Sets/src/mage/sets/planeshift/ArcticMerfolk.java b/Mage.Sets/src/mage/sets/planeshift/ArcticMerfolk.java index e7993aa1681..0125728af80 100644 --- a/Mage.Sets/src/mage/sets/planeshift/ArcticMerfolk.java +++ b/Mage.Sets/src/mage/sets/planeshift/ArcticMerfolk.java @@ -33,7 +33,7 @@ import mage.constants.Rarity; import mage.MageInt; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.condition.common.KickedCondition; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; @@ -56,7 +56,7 @@ public class ArcticMerfolk extends CardImpl { this.toughness = new MageInt(1); // Kicker—Return a creature you control to its owner's hand. (You may return a creature you control to its owner's hand in addition to any other costs as you cast this spell.) - this.addAbility(new KickerAbility(new ReturnToHandTargetPermanentCost(new TargetControlledCreaturePermanent(1,1,new FilterControlledCreaturePermanent("a creature"),true)))); + this.addAbility(new KickerAbility(new ReturnToHandChosenControlledPermanentCost(new TargetControlledCreaturePermanent(1,1,new FilterControlledCreaturePermanent("a creature"),true)))); // If Arctic Merfolk was kicked, it enters the battlefield with a +1/+1 counter on it. this.addAbility(new EntersBattlefieldAbility( diff --git a/Mage.Sets/src/mage/sets/planeshift/CrosissCatacombs.java b/Mage.Sets/src/mage/sets/planeshift/CrosissCatacombs.java index 40cafe55313..7efc25e7f80 100644 --- a/Mage.Sets/src/mage/sets/planeshift/CrosissCatacombs.java +++ b/Mage.Sets/src/mage/sets/planeshift/CrosissCatacombs.java @@ -29,7 +29,7 @@ package mage.sets.planeshift; import java.util.UUID; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; @@ -59,7 +59,7 @@ public class CrosissCatacombs extends CardImpl { this.subtype.add("Lair"); // When Crosis's Catacombs enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {U}, {B}, or {R} to your mana pool. this.addAbility(new BlueManaAbility()); this.addAbility(new BlackManaAbility()); diff --git a/Mage.Sets/src/mage/sets/planeshift/DarigaazsCaldera.java b/Mage.Sets/src/mage/sets/planeshift/DarigaazsCaldera.java index cf9b3567fda..09e9902d6cc 100644 --- a/Mage.Sets/src/mage/sets/planeshift/DarigaazsCaldera.java +++ b/Mage.Sets/src/mage/sets/planeshift/DarigaazsCaldera.java @@ -29,7 +29,7 @@ package mage.sets.planeshift; import java.util.UUID; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.GreenManaAbility; @@ -59,7 +59,7 @@ public class DarigaazsCaldera extends CardImpl { this.subtype.add("Lair"); // When Darigaaz's Caldera enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {B}, {R}, or {G} to your mana pool. this.addAbility(new BlackManaAbility()); this.addAbility(new RedManaAbility()); diff --git a/Mage.Sets/src/mage/sets/planeshift/DromarsCavern.java b/Mage.Sets/src/mage/sets/planeshift/DromarsCavern.java index 0527355c9bc..87e138351ae 100644 --- a/Mage.Sets/src/mage/sets/planeshift/DromarsCavern.java +++ b/Mage.Sets/src/mage/sets/planeshift/DromarsCavern.java @@ -29,7 +29,7 @@ package mage.sets.planeshift; import java.util.UUID; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.BlackManaAbility; import mage.abilities.mana.BlueManaAbility; @@ -58,7 +58,7 @@ public class DromarsCavern extends CardImpl { this.subtype.add("Lair"); // When Dromar's Cavern enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {W}, {U}, or {B} to your mana pool. this.addAbility(new WhiteManaAbility()); this.addAbility(new BlueManaAbility()); diff --git a/Mage.Sets/src/mage/sets/planeshift/RithsGrove.java b/Mage.Sets/src/mage/sets/planeshift/RithsGrove.java index d0fe9fde6f0..aa36ec7965a 100644 --- a/Mage.Sets/src/mage/sets/planeshift/RithsGrove.java +++ b/Mage.Sets/src/mage/sets/planeshift/RithsGrove.java @@ -29,7 +29,7 @@ package mage.sets.planeshift; import java.util.UUID; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.GreenManaAbility; import mage.abilities.mana.RedManaAbility; @@ -59,7 +59,7 @@ public class RithsGrove extends CardImpl { this.subtype.add("Lair"); // When Rith's Grove enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {R}, {G}, or {W} to your mana pool. this.addAbility(new RedManaAbility()); this.addAbility(new GreenManaAbility()); diff --git a/Mage.Sets/src/mage/sets/planeshift/TrevasRuins.java b/Mage.Sets/src/mage/sets/planeshift/TrevasRuins.java index 64b9eec6c94..d72cc657f27 100644 --- a/Mage.Sets/src/mage/sets/planeshift/TrevasRuins.java +++ b/Mage.Sets/src/mage/sets/planeshift/TrevasRuins.java @@ -29,7 +29,7 @@ package mage.sets.planeshift; import java.util.UUID; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.mana.BlueManaAbility; import mage.abilities.mana.GreenManaAbility; @@ -59,7 +59,7 @@ public class TrevasRuins extends CardImpl { this.subtype.add("Lair"); // When Treva's Ruins enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))))); // {tap}: Add {G}, {W}, or {U} to your mana pool. this.addAbility(new GreenManaAbility()); this.addAbility(new WhiteManaAbility()); diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/Deprive.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/Deprive.java index afa39d5afc2..773a63bab34 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/Deprive.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/Deprive.java @@ -31,7 +31,7 @@ package mage.sets.riseoftheeldrazi; import java.util.UUID; import mage.constants.CardType; import mage.constants.Rarity; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; import mage.filter.common.FilterControlledLandPermanent; @@ -52,7 +52,7 @@ public class Deprive extends CardImpl { this.expansionSetCode = "ROE"; // As an additional cost to cast Deprive, return a land you control to its owner's hand. - this.getSpellAbility().addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + this.getSpellAbility().addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); // Counter target spell. this.getSpellAbility().addTarget(new TargetSpell()); diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/MoonbowIllusionist.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/MoonbowIllusionist.java index ef110170247..d41c6240d87 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/MoonbowIllusionist.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/MoonbowIllusionist.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -63,7 +63,7 @@ public class MoonbowIllusionist extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // {2}, Return a land you control to its owner's hand: Target land becomes the basic land type of your choice until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.EndOfTurn), new GenericManaCost(2)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent("land")))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent("land")))); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/OboroBreezecaller.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/OboroBreezecaller.java index c3f406d50ff..9578e96727f 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/OboroBreezecaller.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/OboroBreezecaller.java @@ -34,7 +34,7 @@ import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.keyword.FlyingAbility; @@ -66,7 +66,7 @@ public class OboroBreezecaller extends CardImpl { // {2}, Return a land you control to its owner's hand: Untap target land. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new GenericManaCost(2)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/OboroEnvoy.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/OboroEnvoy.java index 4ed03c26ba5..1c1e54e47aa 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/OboroEnvoy.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/OboroEnvoy.java @@ -31,7 +31,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; @@ -68,7 +68,7 @@ public class OboroEnvoy extends CardImpl { Effect effect = new BoostTargetEffect(new SignInversionDynamicValue(new CardsInControllerHandCount()), new StaticValue(-0), Duration.EndOfTurn); effect.setText("Target creature gets -X/-0 until end of turn, where X is the number of cards in your hand"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SoramaroFirstToDream.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SoramaroFirstToDream.java index a4134bda06e..6ea5106fd85 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SoramaroFirstToDream.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SoramaroFirstToDream.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; @@ -70,7 +70,7 @@ public class SoramaroFirstToDream extends CardImpl { // {4}, Return a land you control to its owner's hand: Draw a card. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(4)); - ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))); + ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land")))); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/scourge/WirewoodSymbiote.java b/Mage.Sets/src/mage/sets/scourge/WirewoodSymbiote.java index 8bc500b1c35..3c676c3bdb7 100644 --- a/Mage.Sets/src/mage/sets/scourge/WirewoodSymbiote.java +++ b/Mage.Sets/src/mage/sets/scourge/WirewoodSymbiote.java @@ -34,7 +34,7 @@ import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.UntapTargetEffect; import mage.cards.CardImpl; import mage.filter.common.FilterControlledCreaturePermanent; @@ -63,7 +63,7 @@ public class WirewoodSymbiote extends CardImpl { this.toughness = new MageInt(1); // Return an Elf you control to its owner's hand: Untap target creature. Activate this ability only once each turn. - Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/timespiral/ScrybRanger.java b/Mage.Sets/src/mage/sets/timespiral/ScrybRanger.java index f4218fe4bd2..e3fe4173f65 100644 --- a/Mage.Sets/src/mage/sets/timespiral/ScrybRanger.java +++ b/Mage.Sets/src/mage/sets/timespiral/ScrybRanger.java @@ -32,7 +32,7 @@ import mage.MageInt; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.FlyingAbility; @@ -76,7 +76,7 @@ public class ScrybRanger extends CardImpl { // protection from blue this.addAbility(new ProtectionAbility(filter)); // Return a Forest you control to its owner's hand: Untap target creature. Activate this ability only once each turn. - Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filterForest))); + Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filterForest))); ability.addTarget(new TargetCreaturePermanent(1)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/visions/QuirionRanger.java b/Mage.Sets/src/mage/sets/visions/QuirionRanger.java index bfba3fdce8c..1df79ddb4ce 100644 --- a/Mage.Sets/src/mage/sets/visions/QuirionRanger.java +++ b/Mage.Sets/src/mage/sets/visions/QuirionRanger.java @@ -34,7 +34,7 @@ import mage.constants.Zone; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.UntapTargetEffect; import mage.cards.CardImpl; import mage.filter.common.FilterControlledPermanent; @@ -63,7 +63,7 @@ public class QuirionRanger extends CardImpl { this.toughness = new MageInt(1); // Return a Forest you control to its owner's hand: Untap target creature. Activate this ability only once each turn. - Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter))); + Ability ability = new LimitedTimesPerTurnActivatedAbility(Zone.BATTLEFIELD, new UntapTargetEffect(), new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter))); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/zendikar/LivingTsunami.java b/Mage.Sets/src/mage/sets/zendikar/LivingTsunami.java index 8c761ff0bfe..436b2886265 100644 --- a/Mage.Sets/src/mage/sets/zendikar/LivingTsunami.java +++ b/Mage.Sets/src/mage/sets/zendikar/LivingTsunami.java @@ -34,7 +34,7 @@ import mage.constants.Rarity; import mage.constants.TargetController; import mage.MageInt; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; -import mage.abilities.costs.common.ReturnToHandTargetPermanentCost; +import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; @@ -67,7 +67,7 @@ public class LivingTsunami extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // At the beginning of your upkeep, sacrifice Living Tsunami unless you return a land you control to its owner's hand. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new SacrificeSourceUnlessPaysEffect(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(1, 1, filter, true))), TargetController.YOU, false)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new SacrificeSourceUnlessPaysEffect(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(1, 1, filter, true))), TargetController.YOU, false)); } public LivingTsunami(final LivingTsunami card) { diff --git a/Mage/src/mage/abilities/costs/common/ReturnToHandTargetPermanentCost.java b/Mage/src/mage/abilities/costs/common/ReturnToHandChosenControlledPermanentCost.java similarity index 88% rename from Mage/src/mage/abilities/costs/common/ReturnToHandTargetPermanentCost.java rename to Mage/src/mage/abilities/costs/common/ReturnToHandChosenControlledPermanentCost.java index 6a0e383c83f..238377fdf4b 100644 --- a/Mage/src/mage/abilities/costs/common/ReturnToHandTargetPermanentCost.java +++ b/Mage/src/mage/abilities/costs/common/ReturnToHandChosenControlledPermanentCost.java @@ -40,9 +40,10 @@ import mage.target.common.TargetControlledPermanent; * * @author BetaSteward_at_googlemail.com */ -public class ReturnToHandTargetPermanentCost extends CostImpl { +public class ReturnToHandChosenControlledPermanentCost extends CostImpl { - public ReturnToHandTargetPermanentCost(TargetControlledPermanent target) { + public ReturnToHandChosenControlledPermanentCost(TargetControlledPermanent target) { + target.setNotTarget(true); this.addTarget(target); if (target.getMaxNumberOfTargets() > 1 && target.getMaxNumberOfTargets() == target.getNumberOfTargets()) { this.text = new StringBuilder("return ").append(target.getMaxNumberOfTargets()).append(" ").append(target.getTargetName()).append(" you control to its owner's hand").toString(); @@ -51,7 +52,7 @@ public class ReturnToHandTargetPermanentCost extends CostImpl { } } - public ReturnToHandTargetPermanentCost(ReturnToHandTargetPermanentCost cost) { + public ReturnToHandChosenControlledPermanentCost(ReturnToHandChosenControlledPermanentCost cost) { super(cost); } @@ -78,8 +79,8 @@ public class ReturnToHandTargetPermanentCost extends CostImpl { } @Override - public ReturnToHandTargetPermanentCost copy() { - return new ReturnToHandTargetPermanentCost(this); + public ReturnToHandChosenControlledPermanentCost copy() { + return new ReturnToHandChosenControlledPermanentCost(this); } } From 6119f710223327dac68b68d4bd9499c68e5cd8e1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 25 Sep 2015 23:15:55 +0200 Subject: [PATCH 28/42] * Added the text (to sacrifice) for selections done for sacrifice costs so the player can better distinguish what object to select currently. --- Mage.Sets/src/mage/sets/shardsofalara/BoneSplinters.java | 5 +++-- .../src/mage/abilities/costs/common/SacrificeTargetCost.java | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/shardsofalara/BoneSplinters.java b/Mage.Sets/src/mage/sets/shardsofalara/BoneSplinters.java index 002f0c851c2..77ac4cc3a49 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/BoneSplinters.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/BoneSplinters.java @@ -34,6 +34,7 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; @@ -50,8 +51,8 @@ public class BoneSplinters extends CardImpl { // As an additional cost to cast Bone Splinters, sacrifice a creature. this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature")))); // Destroy target creature. - this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (to destoy)"))); + this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target creature")); } public BoneSplinters(final BoneSplinters card) { diff --git a/Mage/src/mage/abilities/costs/common/SacrificeTargetCost.java b/Mage/src/mage/abilities/costs/common/SacrificeTargetCost.java index 8e33063ba2f..be90768d5fd 100644 --- a/Mage/src/mage/abilities/costs/common/SacrificeTargetCost.java +++ b/Mage/src/mage/abilities/costs/common/SacrificeTargetCost.java @@ -51,6 +51,7 @@ public class SacrificeTargetCost extends CostImpl { this.addTarget(target); target.setNotTarget(true); // sacrifice is never targeted this.text = "sacrifice " + target.getTargetName(); + target.setTargetName(target.getTargetName() + " (to sacrifice)"); } public SacrificeTargetCost(TargetControlledPermanent target, boolean noText) { From 2023686ee8064f7ef51811b6912cff3a890c83f7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 25 Sep 2015 23:22:54 +0200 Subject: [PATCH 29/42] * Some minor changes. --- Mage.Client/serverlist.txt | 1 + .../src/main/resources/avatars/special/21.gif | Bin 0 -> 23839 bytes .../src/main/java/mage/server/Session.java | 2 ++ 3 files changed, 3 insertions(+) create mode 100644 Mage.Client/src/main/resources/avatars/special/21.gif diff --git a/Mage.Client/serverlist.txt b/Mage.Client/serverlist.txt index cff928b3be7..eb5c37cbcb4 100644 --- a/Mage.Client/serverlist.txt +++ b/Mage.Client/serverlist.txt @@ -1,6 +1,7 @@ XMage.de 1 (Europe/Germany) fast :xmage.de:17171 woogerworks (North America/USA) :xmage.woogerworks.info:17171 XMage.info 1 (Europe/France) new network code -> see forum :176.31.186.181:17171 +XMage BR (South America/Brazil) :ec2-54-233-67-0.sa-east-1.compute.amazonaws.com:17171 IceMage (Europe/Netherlands) :ring0.cc:17171 Seedds Server (Asia) :115.29.203.80:17171 localhost -> connect to your local server (must be started):localhost:17171 diff --git a/Mage.Client/src/main/resources/avatars/special/21.gif b/Mage.Client/src/main/resources/avatars/special/21.gif new file mode 100644 index 0000000000000000000000000000000000000000..5de3fb6134a1004c35152ed5da045128ef6d6bf4 GIT binary patch literal 23839 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 Date: Sat, 26 Sep 2015 01:10:05 +0200 Subject: [PATCH 30/42] * Some rework of preferences avatar panel. --- .../mage/client/dialog/PreferencesDialog.form | 869 +++++++++++++----- .../mage/client/dialog/PreferencesDialog.java | 648 ++++++++----- .../java/mage/client/game/PlayerPanelExt.java | 3 +- Mage.Client/src/main/resources/avatars/10.jpg | Bin 7912 -> 6403 bytes Mage.Client/src/main/resources/avatars/11.jpg | Bin 0 -> 7603 bytes Mage.Client/src/main/resources/avatars/12.jpg | Bin 0 -> 7485 bytes Mage.Client/src/main/resources/avatars/13.jpg | Bin 7603 -> 7546 bytes Mage.Client/src/main/resources/avatars/14.jpg | Bin 7485 -> 7575 bytes Mage.Client/src/main/resources/avatars/15.jpg | Bin 0 -> 7752 bytes Mage.Client/src/main/resources/avatars/16.jpg | Bin 0 -> 7022 bytes Mage.Client/src/main/resources/avatars/17.jpg | Bin 0 -> 7126 bytes Mage.Client/src/main/resources/avatars/18.jpg | Bin 0 -> 9244 bytes Mage.Client/src/main/resources/avatars/19.jpg | Bin 7546 -> 7152 bytes .../main/resources/avatars/{48.jpg => 20.jpg} | Bin Mage.Client/src/main/resources/avatars/21.jpg | Bin 0 -> 7912 bytes Mage.Client/src/main/resources/avatars/22.jpg | Bin 7575 -> 9061 bytes Mage.Client/src/main/resources/avatars/23.jpg | Bin 7752 -> 7637 bytes .../main/resources/avatars/{57.jpg => 24.jpg} | Bin Mage.Client/src/main/resources/avatars/25.jpg | Bin 7022 -> 7577 bytes .../main/resources/avatars/{62.jpg => 26.jpg} | Bin .../main/resources/avatars/{66.jpg => 27.jpg} | Bin .../main/resources/avatars/{71.jpg => 28.jpg} | Bin Mage.Client/src/main/resources/avatars/29.jpg | Bin 7126 -> 9504 bytes Mage.Client/src/main/resources/avatars/30.jpg | Bin 9244 -> 10212 bytes .../main/resources/avatars/{77.jpg => 31.jpg} | Bin .../main/resources/avatars/{9.jpg => 32.jpg} | Bin Mage.Client/src/main/resources/avatars/39.jpg | Bin 7152 -> 0 bytes Mage.Client/src/main/resources/avatars/51.jpg | Bin 6403 -> 0 bytes Mage.Client/src/main/resources/avatars/52.jpg | Bin 9061 -> 0 bytes Mage.Client/src/main/resources/avatars/53.jpg | Bin 7637 -> 0 bytes Mage.Client/src/main/resources/avatars/6.jpg | Bin 7577 -> 0 bytes Mage.Client/src/main/resources/avatars/72.jpg | Bin 9504 -> 0 bytes Mage.Client/src/main/resources/avatars/75.jpg | Bin 10212 -> 0 bytes .../src/main/java/mage/server/Session.java | 2 +- 34 files changed, 1093 insertions(+), 429 deletions(-) create mode 100644 Mage.Client/src/main/resources/avatars/11.jpg create mode 100644 Mage.Client/src/main/resources/avatars/12.jpg create mode 100644 Mage.Client/src/main/resources/avatars/15.jpg create mode 100644 Mage.Client/src/main/resources/avatars/16.jpg create mode 100644 Mage.Client/src/main/resources/avatars/17.jpg create mode 100644 Mage.Client/src/main/resources/avatars/18.jpg rename Mage.Client/src/main/resources/avatars/{48.jpg => 20.jpg} (100%) create mode 100644 Mage.Client/src/main/resources/avatars/21.jpg rename Mage.Client/src/main/resources/avatars/{57.jpg => 24.jpg} (100%) rename Mage.Client/src/main/resources/avatars/{62.jpg => 26.jpg} (100%) rename Mage.Client/src/main/resources/avatars/{66.jpg => 27.jpg} (100%) rename Mage.Client/src/main/resources/avatars/{71.jpg => 28.jpg} (100%) rename Mage.Client/src/main/resources/avatars/{77.jpg => 31.jpg} (100%) rename Mage.Client/src/main/resources/avatars/{9.jpg => 32.jpg} (100%) delete mode 100644 Mage.Client/src/main/resources/avatars/39.jpg delete mode 100644 Mage.Client/src/main/resources/avatars/51.jpg delete mode 100644 Mage.Client/src/main/resources/avatars/52.jpg delete mode 100644 Mage.Client/src/main/resources/avatars/53.jpg delete mode 100644 Mage.Client/src/main/resources/avatars/6.jpg delete mode 100644 Mage.Client/src/main/resources/avatars/72.jpg delete mode 100644 Mage.Client/src/main/resources/avatars/75.jpg diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form index b15bbcdd6aa..8008ce940d9 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form @@ -25,13 +25,13 @@ - + - + @@ -69,8 +69,11 @@ - + + + + @@ -200,18 +203,18 @@ - - + - - - + + + + - + @@ -335,9 +338,9 @@ - - - + + + @@ -528,7 +531,7 @@ - + @@ -730,11 +733,11 @@ - + - - + + @@ -769,29 +772,34 @@ - - - - - - - - - - + + + + - - + + + + + + + + + - - - + + + + + + + - + @@ -899,36 +907,37 @@ - - + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - - - - - - - - - - - - - - - - - - - - @@ -1206,120 +1215,54 @@ - + + + + - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - @@ -1329,41 +1272,26 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - + - + @@ -1377,17 +1305,26 @@ + + + + + + + + + - + - + @@ -1401,17 +1338,59 @@ + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1425,17 +1404,26 @@ + + + + + + + + + - + - + @@ -1449,29 +1437,30 @@ + + + + + + + + + - + - + - - - - - - - - @@ -1481,17 +1470,26 @@ + + + + + + + + + - + - + @@ -1505,17 +1503,26 @@ + + + + + + + + + - + - + @@ -1529,17 +1536,26 @@ + + + + + + + + + - + - + @@ -1553,17 +1569,26 @@ + + + + + + + + + - + - + @@ -1577,17 +1602,26 @@ + + + + + + + + + - + - + @@ -1601,17 +1635,419 @@ + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1634,19 +2070,18 @@ - + - - + + + - - - + - + @@ -1662,7 +2097,7 @@ - + @@ -1859,7 +2294,7 @@ - + diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index d655432110c..dde646aff4d 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -42,9 +42,7 @@ import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; import javax.swing.BorderFactory; @@ -264,29 +262,15 @@ public class PreferencesDialog extends javax.swing.JDialog { public static String PHASE_ON = "on"; public static String PHASE_OFF = "off"; - public static final int DEFAULT_AVATAR_ID = 51; - private static int selectedAvatarId = DEFAULT_AVATAR_ID; - private static final Set available_avatars = new HashSet<>(); + public static final int MIN_AVATAR_ID = 10; + public static final int MAX_AVATAR_ID = 32; + public static final int DEFAULT_AVATAR_ID = 10; private static final Map panels = new HashMap<>(); private static final Border GREEN_BORDER = BorderFactory.createLineBorder(Color.GREEN, 3); private static final Border BLACK_BORDER = BorderFactory.createLineBorder(Color.BLACK, 3); - static { - available_avatars.add(51); - available_avatars.add(13); - available_avatars.add(9); - available_avatars.add(53); - available_avatars.add(10); - available_avatars.add(39); - available_avatars.add(19); - available_avatars.add(30); - available_avatars.add(25); - - available_avatars.add(22); - available_avatars.add(77); - available_avatars.add(62); - } + private static int selectedAvatarId = DEFAULT_AVATAR_ID; private final JFileChooser fc = new JFileChooser(); @@ -433,20 +417,30 @@ public class PreferencesDialog extends javax.swing.JDialog { tabAvatars = new javax.swing.JPanel(); avatarPane = new javax.swing.JScrollPane(); avatarPanel = new javax.swing.JPanel(); - jLabel12 = new javax.swing.JLabel(); jPanel10 = new javax.swing.JPanel(); - jPanel13 = new javax.swing.JPanel(); jPanel11 = new javax.swing.JPanel(); jPanel12 = new javax.swing.JPanel(); + jPanel13 = new javax.swing.JPanel(); jPanel14 = new javax.swing.JPanel(); jPanel15 = new javax.swing.JPanel(); - jLabel13 = new javax.swing.JLabel(); jPanel16 = new javax.swing.JPanel(); jPanel17 = new javax.swing.JPanel(); jPanel18 = new javax.swing.JPanel(); jPanel19 = new javax.swing.JPanel(); jPanel20 = new javax.swing.JPanel(); jPanel21 = new javax.swing.JPanel(); + jPanel22 = new javax.swing.JPanel(); + jPanel23 = new javax.swing.JPanel(); + jPanel24 = new javax.swing.JPanel(); + jPanel25 = new javax.swing.JPanel(); + jPanel26 = new javax.swing.JPanel(); + jPanel27 = new javax.swing.JPanel(); + jPanel28 = new javax.swing.JPanel(); + jPanel29 = new javax.swing.JPanel(); + jPanel30 = new javax.swing.JPanel(); + jPanel31 = new javax.swing.JPanel(); + jPanel32 = new javax.swing.JPanel(); + jPanel33 = new javax.swing.JPanel(); tabConnection = new javax.swing.JPanel(); lblProxyType = new javax.swing.JLabel(); cbProxyType = new javax.swing.JComboBox(); @@ -608,16 +602,16 @@ public class PreferencesDialog extends javax.swing.JDialog { main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(main_gameLayout.createSequentialGroup() .addContainerGap() - .addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cbAllowRequestToShowHandCards, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(showPlayerNamesPermanently, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(nonLandPermanentsInOnePile, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(showAbilityPickerForced, javax.swing.GroupLayout.Alignment.LEADING)) - .addComponent(cbShowStormCounter, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(cbConfirmEmptyManaPool, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(cbAskMoveToGraveOrder, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(cbConfirmEmptyManaPool, javax.swing.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE) + .addComponent(cbAllowRequestToShowHandCards, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(cbShowStormCounter, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(cbAskMoveToGraveOrder, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(7, Short.MAX_VALUE)) ); main_gameLayout.setVerticalGroup( main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -666,9 +660,9 @@ public class PreferencesDialog extends javax.swing.JDialog { main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(main_gamelogLayout.createSequentialGroup() .addContainerGap() - .addGroup(main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.PREFERRED_SIZE, 528, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(cbDraftLogAutoSave, javax.swing.GroupLayout.PREFERRED_SIZE, 528, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(cbDraftLogAutoSave, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.DEFAULT_SIZE, 473, Short.MAX_VALUE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); main_gamelogLayout.setVerticalGroup( @@ -687,8 +681,10 @@ public class PreferencesDialog extends javax.swing.JDialog { .addContainerGap() .addGroup(tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(main_card, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(tabMainLayout.createSequentialGroup() + .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); tabMainLayout.setVerticalGroup( @@ -915,7 +911,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .addComponent(jLabelEndOfTurn) .addComponent(checkBoxEndTurnOthers)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(phases_stopSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(phases_stopSettings, javax.swing.GroupLayout.DEFAULT_SIZE, 183, Short.MAX_VALUE) .addContainerGap()) ); @@ -962,24 +958,27 @@ public class PreferencesDialog extends javax.swing.JDialog { panelCardImages.setLayout(panelCardImagesLayout); panelCardImagesLayout.setHorizontalGroup( panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelCardImagesLayout.createSequentialGroup() - .addGap(24, 24, 24) - .addComponent(txtImageFolderPath) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnBrowseImageLocation)) .addGroup(panelCardImagesLayout.createSequentialGroup() .addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cbUseDefaultImageFolder) - .addComponent(cbCheckForNewImages) .addGroup(panelCardImagesLayout.createSequentialGroup() - .addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelCardImagesLayout.createSequentialGroup() - .addContainerGap() - .addComponent(labelPreferedImageLanguage)) - .addComponent(cbSaveToZipFiles, javax.swing.GroupLayout.Alignment.LEADING)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(cbPreferedImageLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(cbUseDefaultImageFolder) + .addComponent(cbCheckForNewImages) + .addGroup(panelCardImagesLayout.createSequentialGroup() + .addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelCardImagesLayout.createSequentialGroup() + .addContainerGap() + .addComponent(labelPreferedImageLanguage)) + .addComponent(cbSaveToZipFiles, javax.swing.GroupLayout.Alignment.LEADING)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(cbPreferedImageLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(0, 190, Short.MAX_VALUE)) + .addGroup(panelCardImagesLayout.createSequentialGroup() + .addGap(24, 24, 24) + .addComponent(txtImageFolderPath) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnBrowseImageLocation))) + .addContainerGap()) ); panelCardImagesLayout.setVerticalGroup( panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1061,32 +1060,29 @@ public class PreferencesDialog extends javax.swing.JDialog { .addGroup(panelBackgroundImagesLayout.createSequentialGroup() .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelBackgroundImagesLayout.createSequentialGroup() - .addGap(19, 19, 19) - .addComponent(jLabel14)) - .addGroup(panelBackgroundImagesLayout.createSequentialGroup() - .addGap(25, 25, 25) - .addComponent(jLabel15))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelBackgroundImagesLayout.createSequentialGroup() - .addComponent(txtBattlefieldImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelBackgroundImagesLayout.createSequentialGroup() + .addGap(19, 19, 19) + .addComponent(jLabel14)) + .addGroup(panelBackgroundImagesLayout.createSequentialGroup() + .addGap(25, 25, 25) + .addComponent(jLabel15))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnBrowseBattlefieldImage)) - .addGroup(panelBackgroundImagesLayout.createSequentialGroup() - .addComponent(txtBackgroundImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 332, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(txtBackgroundImagePath) + .addComponent(txtBattlefieldImagePath)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnBrowseBackgroundImage))) - .addGap(0, 0, Short.MAX_VALUE)) - .addGroup(panelBackgroundImagesLayout.createSequentialGroup() - .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cbUseRandomBattleImage) - .addComponent(cbUseDefaultBattleImage) - .addComponent(cbUseDefaultBackground)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(btnBrowseBackgroundImage, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(btnBrowseBattlefieldImage, javax.swing.GroupLayout.Alignment.TRAILING))) + .addGroup(panelBackgroundImagesLayout.createSequentialGroup() + .addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(cbUseRandomBattleImage) + .addComponent(cbUseDefaultBattleImage) + .addComponent(cbUseDefaultBackground)) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) ); - - panelBackgroundImagesLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {txtBackgroundImagePath, txtBattlefieldImagePath}); - panelBackgroundImagesLayout.setVerticalGroup( panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelBackgroundImagesLayout.createSequentialGroup() @@ -1115,8 +1111,8 @@ public class PreferencesDialog extends javax.swing.JDialog { .addGroup(tabImagesLayout.createSequentialGroup() .addContainerGap() .addGroup(tabImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(panelCardImages, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelBackgroundImages, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(panelCardImages, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelBackgroundImages, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); tabImagesLayout.setVerticalGroup( @@ -1248,249 +1244,459 @@ public class PreferencesDialog extends javax.swing.JDialog { tabsPanel.addTab("Sounds", tabSounds); - jLabel12.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N - jLabel12.setText("Choose your avatar:"); + avatarPane.setMaximumSize(new java.awt.Dimension(508, 772)); + avatarPane.setMinimumSize(new java.awt.Dimension(508, 772)); + avatarPane.setPreferredSize(new java.awt.Dimension(508, 772)); + + avatarPanel.setMaximumSize(new java.awt.Dimension(508, 772)); + avatarPanel.setMinimumSize(new java.awt.Dimension(508, 772)); + avatarPanel.setPreferredSize(new java.awt.Dimension(508, 772)); + avatarPanel.setLayout(new java.awt.GridLayout(6, 4, 20, 20)); jPanel10.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel10.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel10.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel10.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel10Layout = new javax.swing.GroupLayout(jPanel10); jPanel10.setLayout(jPanel10Layout); jPanel10Layout.setHorizontalGroup( jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel10Layout.setVerticalGroup( jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); - jPanel13.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); - - javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13); - jPanel13.setLayout(jPanel13Layout); - jPanel13Layout.setHorizontalGroup( - jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) - ); - jPanel13Layout.setVerticalGroup( - jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) - ); + avatarPanel.add(jPanel10); jPanel11.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel11.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel11.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel11.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel11Layout = new javax.swing.GroupLayout(jPanel11); jPanel11.setLayout(jPanel11Layout); jPanel11Layout.setHorizontalGroup( jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel11Layout.setVerticalGroup( jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel11); + jPanel12.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel12.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel12.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel12.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel12Layout = new javax.swing.GroupLayout(jPanel12); jPanel12.setLayout(jPanel12Layout); jPanel12Layout.setHorizontalGroup( jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel12Layout.setVerticalGroup( jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel12); + + jPanel13.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel13.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel13.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel13.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13); + jPanel13.setLayout(jPanel13Layout); + jPanel13Layout.setHorizontalGroup( + jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel13Layout.setVerticalGroup( + jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 0, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel13); + jPanel14.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel14.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel14.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel14.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel14Layout = new javax.swing.GroupLayout(jPanel14); jPanel14.setLayout(jPanel14Layout); jPanel14Layout.setHorizontalGroup( jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel14Layout.setVerticalGroup( jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel14); + jPanel15.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel15.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel15.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel15.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel15Layout = new javax.swing.GroupLayout(jPanel15); jPanel15.setLayout(jPanel15Layout); jPanel15Layout.setHorizontalGroup( jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel15Layout.setVerticalGroup( jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); - jLabel13.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N - jLabel13.setText("New avatars:"); + avatarPanel.add(jPanel15); jPanel16.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel16.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel16.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel16.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel16Layout = new javax.swing.GroupLayout(jPanel16); jPanel16.setLayout(jPanel16Layout); jPanel16Layout.setHorizontalGroup( jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel16Layout.setVerticalGroup( jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel16); + jPanel17.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel17.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel17.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel17.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel17Layout = new javax.swing.GroupLayout(jPanel17); jPanel17.setLayout(jPanel17Layout); jPanel17Layout.setHorizontalGroup( jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel17Layout.setVerticalGroup( jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel17); + jPanel18.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel18.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel18.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel18.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel18Layout = new javax.swing.GroupLayout(jPanel18); jPanel18.setLayout(jPanel18Layout); jPanel18Layout.setHorizontalGroup( jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel18Layout.setVerticalGroup( jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel18); + jPanel19.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel19.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel19.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel19.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel19Layout = new javax.swing.GroupLayout(jPanel19); jPanel19.setLayout(jPanel19Layout); jPanel19Layout.setHorizontalGroup( jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel19Layout.setVerticalGroup( jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel19); + jPanel20.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel20.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel20.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel20.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel20Layout = new javax.swing.GroupLayout(jPanel20); jPanel20.setLayout(jPanel20Layout); jPanel20Layout.setHorizontalGroup( jPanel20Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel20Layout.setVerticalGroup( jPanel20Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel20); + jPanel21.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel21.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel21.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel21.setPreferredSize(new java.awt.Dimension(102, 102)); javax.swing.GroupLayout jPanel21Layout = new javax.swing.GroupLayout(jPanel21); jPanel21.setLayout(jPanel21Layout); jPanel21Layout.setHorizontalGroup( jPanel21Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); jPanel21Layout.setVerticalGroup( jPanel21Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 100, Short.MAX_VALUE) + .addGap(0, 110, Short.MAX_VALUE) ); - javax.swing.GroupLayout avatarPanelLayout = new javax.swing.GroupLayout(avatarPanel); - avatarPanel.setLayout(avatarPanelLayout); - avatarPanelLayout.setHorizontalGroup( - avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(avatarPanelLayout.createSequentialGroup() - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(avatarPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jLabel12)) - .addGroup(avatarPanelLayout.createSequentialGroup() - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(avatarPanelLayout.createSequentialGroup() - .addGap(30, 30, 30) - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jPanel12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel19, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(33, 33, 33) - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel13, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel14, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel20, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(avatarPanelLayout.createSequentialGroup() - .addContainerGap() - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(avatarPanelLayout.createSequentialGroup() - .addGap(20, 20, 20) - .addComponent(jPanel16, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(33, 33, 33) - .addComponent(jPanel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(jLabel13)))) - .addGap(32, 32, 32) - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel18, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel21, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + avatarPanel.add(jPanel21); + + jPanel22.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel22.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel22.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel22.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel22Layout = new javax.swing.GroupLayout(jPanel22); + jPanel22.setLayout(jPanel22Layout); + jPanel22Layout.setHorizontalGroup( + jPanel22Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) ); - avatarPanelLayout.setVerticalGroup( - avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(avatarPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jLabel12) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel13, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(26, 26, 26) - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel14, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(23, 23, 23) - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jPanel19, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel20, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel21, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(18, 18, 18) - .addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(avatarPanelLayout.createSequentialGroup() - .addComponent(jLabel13) - .addGap(18, 18, 18) - .addComponent(jPanel16, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(jPanel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jPanel18, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(25, 25, 25)) + jPanel22Layout.setVerticalGroup( + jPanel22Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) ); + avatarPanel.add(jPanel22); + + jPanel23.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel23.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel23.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel23.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel23Layout = new javax.swing.GroupLayout(jPanel23); + jPanel23.setLayout(jPanel23Layout); + jPanel23Layout.setHorizontalGroup( + jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel23Layout.setVerticalGroup( + jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel23); + + jPanel24.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel24.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel24.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel24.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel24Layout = new javax.swing.GroupLayout(jPanel24); + jPanel24.setLayout(jPanel24Layout); + jPanel24Layout.setHorizontalGroup( + jPanel24Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel24Layout.setVerticalGroup( + jPanel24Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel24); + + jPanel25.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel25.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel25.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel25.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel25Layout = new javax.swing.GroupLayout(jPanel25); + jPanel25.setLayout(jPanel25Layout); + jPanel25Layout.setHorizontalGroup( + jPanel25Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel25Layout.setVerticalGroup( + jPanel25Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel25); + + jPanel26.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel26.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel26.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel26.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel26Layout = new javax.swing.GroupLayout(jPanel26); + jPanel26.setLayout(jPanel26Layout); + jPanel26Layout.setHorizontalGroup( + jPanel26Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel26Layout.setVerticalGroup( + jPanel26Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel26); + + jPanel27.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel27.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel27.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel27.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel27Layout = new javax.swing.GroupLayout(jPanel27); + jPanel27.setLayout(jPanel27Layout); + jPanel27Layout.setHorizontalGroup( + jPanel27Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel27Layout.setVerticalGroup( + jPanel27Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel27); + + jPanel28.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel28.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel28.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel28.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel28Layout = new javax.swing.GroupLayout(jPanel28); + jPanel28.setLayout(jPanel28Layout); + jPanel28Layout.setHorizontalGroup( + jPanel28Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel28Layout.setVerticalGroup( + jPanel28Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel28); + + jPanel29.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel29.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel29.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel29.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel29Layout = new javax.swing.GroupLayout(jPanel29); + jPanel29.setLayout(jPanel29Layout); + jPanel29Layout.setHorizontalGroup( + jPanel29Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel29Layout.setVerticalGroup( + jPanel29Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel29); + + jPanel30.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel30.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel30.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel30.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel30Layout = new javax.swing.GroupLayout(jPanel30); + jPanel30.setLayout(jPanel30Layout); + jPanel30Layout.setHorizontalGroup( + jPanel30Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel30Layout.setVerticalGroup( + jPanel30Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel30); + + jPanel31.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel31.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel31.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel31.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel31Layout = new javax.swing.GroupLayout(jPanel31); + jPanel31.setLayout(jPanel31Layout); + jPanel31Layout.setHorizontalGroup( + jPanel31Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel31Layout.setVerticalGroup( + jPanel31Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel31); + + jPanel32.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel32.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel32.setMinimumSize(new java.awt.Dimension(102, 102)); + jPanel32.setPreferredSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel32Layout = new javax.swing.GroupLayout(jPanel32); + jPanel32.setLayout(jPanel32Layout); + jPanel32Layout.setHorizontalGroup( + jPanel32Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel32Layout.setVerticalGroup( + jPanel32Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel32); + + jPanel33.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true)); + jPanel33.setMaximumSize(new java.awt.Dimension(102, 102)); + jPanel33.setMinimumSize(new java.awt.Dimension(102, 102)); + + javax.swing.GroupLayout jPanel33Layout = new javax.swing.GroupLayout(jPanel33); + jPanel33.setLayout(jPanel33Layout); + jPanel33Layout.setHorizontalGroup( + jPanel33Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + jPanel33Layout.setVerticalGroup( + jPanel33Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 110, Short.MAX_VALUE) + ); + + avatarPanel.add(jPanel33); + avatarPane.setViewportView(avatarPanel); javax.swing.GroupLayout tabAvatarsLayout = new javax.swing.GroupLayout(tabAvatars); tabAvatars.setLayout(tabAvatarsLayout); tabAvatarsLayout.setHorizontalGroup( tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(avatarPane, javax.swing.GroupLayout.DEFAULT_SIZE, 590, Short.MAX_VALUE) + .addGroup(tabAvatarsLayout.createSequentialGroup() + .addComponent(avatarPane, javax.swing.GroupLayout.PREFERRED_SIZE, 527, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) ); tabAvatarsLayout.setVerticalGroup( tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(avatarPane, javax.swing.GroupLayout.DEFAULT_SIZE, 432, Short.MAX_VALUE) + .addComponent(avatarPane, javax.swing.GroupLayout.PREFERRED_SIZE, 418, Short.MAX_VALUE) ); tabsPanel.addTab("Avatars", tabAvatars); @@ -1629,7 +1835,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .addContainerGap() .addComponent(lblURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(txtURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 421, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(txtURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 370, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(connection_serversLayout.createSequentialGroup() .addGap(141, 141, 141) .addComponent(jLabel17))) @@ -1651,15 +1857,14 @@ public class PreferencesDialog extends javax.swing.JDialog { tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tabConnectionLayout.createSequentialGroup() .addContainerGap() - .addGroup(tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(tabConnectionLayout.createSequentialGroup() + .addGroup(tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(pnlProxySettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, tabConnectionLayout.createSequentialGroup() .addComponent(lblProxyType) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(pnlProxySettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(connection_servers, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap()) + .addContainerGap(16, Short.MAX_VALUE)) ); tabConnectionLayout.setVerticalGroup( tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1672,7 +1877,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(pnlProxySettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(90, Short.MAX_VALUE)) + .addContainerGap(107, Short.MAX_VALUE)) ); pnlProxySettings.getAccessibleContext().setAccessibleDescription(""); @@ -1700,12 +1905,12 @@ public class PreferencesDialog extends javax.swing.JDialog { layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap(405, Short.MAX_VALUE) .addComponent(saveButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(exitButton, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) - .addComponent(tabsPanel) + .addComponent(tabsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1795,10 +2000,11 @@ public class PreferencesDialog extends javax.swing.JDialog { save(prefs, dialog.txtURLServerList, KEY_CONNECTION_URL_SERVER_LIST); // Avatar - if (available_avatars.contains(selectedAvatarId)) { - prefs.put(KEY_AVATAR, String.valueOf(selectedAvatarId)); - updateCache(KEY_AVATAR, String.valueOf(selectedAvatarId)); + if (selectedAvatarId < MIN_AVATAR_ID || selectedAvatarId > MAX_AVATAR_ID) { + selectedAvatarId = DEFAULT_AVATAR_ID; } + prefs.put(KEY_AVATAR, String.valueOf(selectedAvatarId)); + updateCache(KEY_AVATAR, String.valueOf(selectedAvatarId)); try { MageFrame.getSession().updatePreferencesForServer(getUserData()); @@ -2275,7 +2481,7 @@ public class PreferencesDialog extends javax.swing.JDialog { } catch (NumberFormatException n) { selectedAvatarId = DEFAULT_AVATAR_ID; } finally { - if (!available_avatars.contains(selectedAvatarId)) { + if (selectedAvatarId < MIN_AVATAR_ID || selectedAvatarId > MAX_AVATAR_ID) { selectedAvatarId = DEFAULT_AVATAR_ID; } } @@ -2441,26 +2647,37 @@ public class PreferencesDialog extends javax.swing.JDialog { private void addAvatars() { try { - addAvatar(jPanel10, 51, true, false); + addAvatar(jPanel10, 10, true, false); + addAvatar(jPanel11, 11, false, false); + addAvatar(jPanel12, 12, false, false); addAvatar(jPanel13, 13, false, false); - addAvatar(jPanel11, 9, false, false); - addAvatar(jPanel12, 53, false, false); - addAvatar(jPanel14, 10, false, false); - addAvatar(jPanel15, 39, false, false); + addAvatar(jPanel14, 14, false, false); + addAvatar(jPanel15, 15, false, false); + addAvatar(jPanel16, 16, false, false); + addAvatar(jPanel17, 17, false, false); + addAvatar(jPanel18, 18, false, false); addAvatar(jPanel19, 19, false, false); - addAvatar(jPanel20, 30, false, false); - addAvatar(jPanel21, 25, false, false); + addAvatar(jPanel20, 20, false, false); + addAvatar(jPanel21, 21, false, false); + addAvatar(jPanel22, 22, false, false); + addAvatar(jPanel23, 23, false, false); + addAvatar(jPanel24, 24, false, false); + addAvatar(jPanel25, 25, false, false); + addAvatar(jPanel26, 26, false, false); + addAvatar(jPanel27, 27, false, false); + addAvatar(jPanel28, 28, false, false); + addAvatar(jPanel29, 29, false, false); + addAvatar(jPanel30, 30, false, false); + addAvatar(jPanel31, 31, false, false); + addAvatar(jPanel32, 32, false, false); - addAvatar(jPanel16, 22, false, false); - addAvatar(jPanel17, 77, false, false); - addAvatar(jPanel18, 62, false, false); } catch (Exception e) { log.error(e, e); } } public void setSelectedId(int id) { - if (available_avatars.contains(id)) { + if (id >= MIN_AVATAR_ID && id <= MAX_AVATAR_ID) { for (JPanel panel : panels.values()) { panel.setBorder(BLACK_BORDER); } @@ -2473,7 +2690,8 @@ public class PreferencesDialog extends javax.swing.JDialog { String path = "/avatars/" + String.valueOf(id) + ".jpg"; panels.put(id, jPanel); Image image = ImageHelper.getImageFromResources(path); - Rectangle r = new Rectangle(90, 90); + + Rectangle r = new Rectangle(jPanel.getWidth() - 5, jPanel.getHeight() - 5); BufferedImage bufferedImage; if (!locked) { bufferedImage = BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB); @@ -2571,8 +2789,6 @@ public class PreferencesDialog extends javax.swing.JDialog { private javax.swing.JCheckBox displayBigCardsInHand; private javax.swing.JButton exitButton; private javax.swing.JLabel jLabel11; - private javax.swing.JLabel jLabel12; - private javax.swing.JLabel jLabel13; private javax.swing.JLabel jLabel14; private javax.swing.JLabel jLabel15; private javax.swing.JLabel jLabel16; @@ -2599,6 +2815,18 @@ public class PreferencesDialog extends javax.swing.JDialog { private javax.swing.JPanel jPanel19; private javax.swing.JPanel jPanel20; private javax.swing.JPanel jPanel21; + private javax.swing.JPanel jPanel22; + private javax.swing.JPanel jPanel23; + private javax.swing.JPanel jPanel24; + private javax.swing.JPanel jPanel25; + private javax.swing.JPanel jPanel26; + private javax.swing.JPanel jPanel27; + private javax.swing.JPanel jPanel28; + private javax.swing.JPanel jPanel29; + private javax.swing.JPanel jPanel30; + private javax.swing.JPanel jPanel31; + private javax.swing.JPanel jPanel32; + private javax.swing.JPanel jPanel33; private javax.swing.JLabel labelPreferedImageLanguage; private javax.swing.JLabel lblProxyPassword; private javax.swing.JLabel lblProxyPort; diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java index 01ffad75880..31416d85e6e 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java @@ -63,6 +63,7 @@ import mage.client.components.HoverButton; import mage.client.components.MageRoundPane; import mage.client.components.ext.dlg.DialogManager; import mage.client.dialog.PreferencesDialog; +import static mage.client.dialog.PreferencesDialog.DEFAULT_AVATAR_ID; import mage.client.util.CardsViewUtil; import mage.client.util.Command; import mage.client.util.ImageHelper; @@ -92,7 +93,7 @@ public class PlayerPanelExt extends javax.swing.JPanel { private static final int AVATAR_COUNT = 77; - private static final String DEFAULT_AVATAR_PATH = "/avatars/51.jpg"; + private static final String DEFAULT_AVATAR_PATH = "/avatars/" + DEFAULT_AVATAR_ID + ".jpg"; private static final int PANEL_WIDTH = 94; private static final int PANEL_HEIGHT = 242; diff --git a/Mage.Client/src/main/resources/avatars/10.jpg b/Mage.Client/src/main/resources/avatars/10.jpg index fb5b2744649a4a76edc33ca40a59c92a20517cc6..7ce97fc81e302bcf977242350f15264c36a98c20 100644 GIT binary patch delta 6278 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 delta 7799 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 diff --git a/Mage.Client/src/main/resources/avatars/11.jpg b/Mage.Client/src/main/resources/avatars/11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b665f235a2f84a70c575bc0d18c20588b4bb186 GIT binary patch literal 7603 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 literal 0 HcmV?d00001 diff --git a/Mage.Client/src/main/resources/avatars/12.jpg b/Mage.Client/src/main/resources/avatars/12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d57f3963ee1e8be20bcee1009fd8d0b6d20e2e2c GIT binary patch literal 7485 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 X9-jDBEcyqkIkRZ8cU6qn-7fwQ@;%*3 literal 0 HcmV?d00001 diff --git a/Mage.Client/src/main/resources/avatars/13.jpg b/Mage.Client/src/main/resources/avatars/13.jpg index 2b665f235a2f84a70c575bc0d18c20588b4bb186..b08ae1c24ab8da41a11f129aba0e23b16ae5b2d1 100644 GIT binary patch delta 7430 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 E+1>{A9{>OV diff --git a/Mage.Client/src/main/resources/avatars/48.jpg b/Mage.Client/src/main/resources/avatars/20.jpg similarity index 100% rename from Mage.Client/src/main/resources/avatars/48.jpg rename to Mage.Client/src/main/resources/avatars/20.jpg diff --git a/Mage.Client/src/main/resources/avatars/21.jpg b/Mage.Client/src/main/resources/avatars/21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb5b2744649a4a76edc33ca40a59c92a20517cc6 GIT binary patch literal 7912 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 literal 0 HcmV?d00001 diff --git a/Mage.Client/src/main/resources/avatars/22.jpg b/Mage.Client/src/main/resources/avatars/22.jpg index e45b888a9ea07335772da0a421de66c806744fcf..12c2a87b7bf5d6c30b58a9e4467e13bc417ee174 100644 GIT binary patch delta 8957 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 XGM?g^TWYwm*o;yMNumD$39tXz_VTsz delta 7443 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 E*(Zce-2eap diff --git a/Mage.Client/src/main/resources/avatars/57.jpg b/Mage.Client/src/main/resources/avatars/24.jpg similarity index 100% rename from Mage.Client/src/main/resources/avatars/57.jpg rename to Mage.Client/src/main/resources/avatars/24.jpg diff --git a/Mage.Client/src/main/resources/avatars/25.jpg b/Mage.Client/src/main/resources/avatars/25.jpg index 75b41b0ce637b0967b6132b02ddf81095d8cb430..68b2b338648bb2dcf3ed864a05bfb578f6137711 100644 GIT binary patch delta 7456 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%0AO` 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 literal 7126 zcmb7{Wmgmow1o$T?rtQ8#sO)NkdC2;W&lCDyF(hJ8D{A2?p9Db1eER&kZuVPf$MwM zxrMkbsz!ij0_ql7xVeoQ|B5nwplDmWYg=fu4qeiiVcvKL`pMIyweA z1|B9R9t|-eG0p#5&tCwW8>VNqEV*>za=qNw{Dh4LjKUawO9~~79h=GBMg8sjme{moh@jtc< zx^@^TvxR$66B&PM-}D8>4-kti)Z?=Gc?Ez6{1+nz5(C}ng{ zkIONE*jvp2wSdmu%-6!w6COEepLtDJOZY2fH~ks6FpNi~=yLU<#T}p-?s59@ZS|7i zGlPXwZ@bJ3`O9=oDD(JS&MobKJ#-jJ8?nhX_{7*uKqa`~yuI z?XXX`-N=mYPrT54CD2jKWNS5tfg|-ES^kr9^_;5mo&%BM8MYguJ8z86%9|Vo?6%a9 zZ{8W+PDZByAyFQq#FB_r=$BR`ha!8j3Y$-R(oPdgIU=$L1+w1N23Eck^tRkKJCpFQ z)wgJod5g8bu@g?n9*0z>E_NPJ%|MSzuxR~ts8xsh)5x_o?n*8+_DF(s&5;<-9-Ugr zp4C1X%c>^4>9HEeR}lE|lClkV)MszoxLec=br`yZEP7iLw6upeMDMjtC$7%xYrvx9_7(FKqh`749P1bz9p`1Cf;t3stF*Q$1<~uHyiq7F~lX7zXh9LN*pKdD5 zmsj7tdwyBnFyO;AW+FM31n~|t?sq=4om&inpEJRc0BB9dTM|Z z-LzDdnCl6&+-({a5h3LqHla^wM@F?PqSn}Sikk577;cg!C2mjAL=Mk7LzLm8eVV_B zAK5x&RH!7k!q-w__DUl!NE%kkz-c191h6^qMFG^KE$T!Qis2vvqj&}+R!qw9@HsyO zt`li+TY+29$@s#$(r0t)IL9uiDiwq>ypfy+g#OvFYN7BD`lT&mt%MI{=Xkg#-@8r0 ztUM5DLbUy_Gc`QR0h(Apd{C959xCZq?yOtEcjFI&1*0>sYkymt?iXt2i54df5YIjE z!0y3XLd>|k-@J1VO+{Yc`1xmssn~Hec)(S_X<^??a`zIP{CI*4aPHkd;=H@9I{9Sm zoF3jUKl0YP-&kKZStIk}>aucddqH-h&(WpXl(%Fp;QH{yOsyQ+ayFULv#f$ zRkIMxD@5VL9H#81Qxqz+Fo1iI#$yB%H)^L%*JD;RCQ`iIqyu{s{ z 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 eVg-XxV<9MJ>A)PF!1t8fk&Agf#N{yZPV0 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 PDY&hl-s95pb?yHFP4!LM diff --git a/Mage.Client/src/main/resources/avatars/77.jpg b/Mage.Client/src/main/resources/avatars/31.jpg similarity index 100% rename from Mage.Client/src/main/resources/avatars/77.jpg rename to Mage.Client/src/main/resources/avatars/31.jpg diff --git a/Mage.Client/src/main/resources/avatars/9.jpg b/Mage.Client/src/main/resources/avatars/32.jpg similarity index 100% rename from Mage.Client/src/main/resources/avatars/9.jpg rename to Mage.Client/src/main/resources/avatars/32.jpg diff --git a/Mage.Client/src/main/resources/avatars/39.jpg b/Mage.Client/src/main/resources/avatars/39.jpg deleted file mode 100644 index bbffc049eead602f8a30393a9b6c3e15b67106ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7152 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 diff --git a/Mage.Client/src/main/resources/avatars/51.jpg b/Mage.Client/src/main/resources/avatars/51.jpg deleted file mode 100644 index 7ce97fc81e302bcf977242350f15264c36a98c20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6403 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 kNq4_MNe+5i9m diff --git a/Mage.Client/src/main/resources/avatars/52.jpg b/Mage.Client/src/main/resources/avatars/52.jpg deleted file mode 100644 index 12c2a87b7bf5d6c30b58a9e4467e13bc417ee174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9061 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%0AO` zQ{%#&Yl%K`7}MT=%-k)4V)5%^Ef~<4wlE2go{Ne+7!r>_qeA;yFxq22_q<_UP(`$> zd=e7goNMmdefiR&+E7%RqS})c^IkOyJ`U97($IBh*Me%-jJy)B*XeUuQI20Cqx{@C zRxr0N*fppE#Zlm{KIJ)k&T5bOrkjkRh3*j1<<$(9`T)>o_#}O@dUbF z``zy!O&iTC-Yfbm>O65B$D>V)wgXmQxCg&0e8!Y3h@0SkD60RCmf3v!ZG*{Gm3>@k+qZ_}J6k)_ zmu7M^t?XRXcUdiY=O3K5fyTOS1iaQsg!>P-Do% z8?p$kt#dm**16_}#x}2URjH+r??HPrT#ni+n{FF@WZikWSFAU}@a=yMX0eV%x-Hb_ ztqx@5*wx(ewL@)@BkvAZj;&`Z+>e`^=|9grzgLi{;hx&^c+vj z5E1`MPoscdL#`wQBs5jv#Rmsed7_jrJ3X7<$uFysKJ4?=OZvBm+uW$Ir;Ug@(otOa z{Y7I=zYFOArIkg5!1oBFfoPOsRVm$iWG%{fIYW z7j?xZe?9Otfyk4cX>HNpIa<%3p-U{bi1cANHhgzynF#zps* z`G(fO{qiL4y5)TL0fbp%1m8KoVcp%k2#I##y1@|;2lk6>7c%2Tj;%FzZN231< zha43!NkaxJ%XitUx$!rCTnWYW26|2cXyw@Fy>wqnxs-zc7`@F{b=nV?T6|{froDp2M-N zRex@0hl&JRBrf7CDf8NQF`LENN!L+vqzH4={s{Rgu%2T*8Lj8!K{8a{2IIWzH4iKE zQ1J&W@$DhRmePMP@?G1BFT{sob|rI z#!oI4+310=xbHj`0tU=_DszE-Ct0k1**fMKwW$fyR0g^^4bJ7G9t$hFAZDG8tMV@5 z+lkd&B*+?@Ce_G?htcga3ze*I3k?|CV<>3t+;$O6)qKZoz+`#i#a+8SY}<|Hch;`|7I>^p?Y@6fdvT2+~U4MT14giI!!HJ z0iUm1^Q(f{;E0nj$rHs*HsbU7qY+CX$~3QlqNE$I`=&tr>UcYwqYvf6N6jJ6!#{bO z`E}~!?g=&~=q8;rik4-}VcX}M@FG9%%Kg!MF8BCC4JH-P?}BKQ*jDb_qd2$J7p5JE zrU|DQ3eUx&{2}hb>wcs%>pu1S9Ez#2fBw{2 zVhot|5x|g$T}8C}c+}2V%Z357FnWuI^MX`~&*#wkN#Xpw5-GZ1XIurgFt0Nf+)u2R zFQBP|ul!BDG8R3IAbMrf=J%()L9yB&6Ax4LW#n=Bq!~suKXd{&wh%fxKm67kI8`o> z>a1caiRG(#FP>t#&||yO=*@NAjX+8Qj>#fvnxLUcmd_ZfE{ z$nmN)dY&bkCYmF@|20qWx6|h~Q2TGX4hs~e%qvB64CBldu7+LRI6*Zz((<%R2}ZP# z`J;=sc$#_uchL^|11X|)#LA{~+H@Bpp~X^87Qz%RUUY{K8*fuvy|#xbM|Rxf-r4us zI%Q$~qHCRcGxP#RrlfqgP_AXSvEEZH)7mSZk~ z0=#-P_edj#c=IosmR1*yjMR1k@IG8W+2K6_pWN)tMU->EMatiV&Lq3gQHiwKnq>+6 z$mcG`+0fGTKgw)7@`h@jkMMz#NkBXfq99+DfMN`ow1rY?%QHf`Ej9P-VmZ>Uhyyi3 zVPq?HD`s7vBO|j1nyTkbb>3ZH1$=Kw)_A{)Eyp&ViWKyeeP(!30JUP4MJcDwMN?bh zcrT=iV*n*3dSRts&T|5`&qGIU;G8t zv(QtFo(QD}@2Iy3v@#=l8ll$bforj*`anp|`y`xYib)kh!mVkJur}$Nzs5A1dZ#CL zvYoVNe>y?nMrSL%`O~-OU0zh(`ZDI`ELC6RO&z>7i->|7{+OYt>koXG4B5de!U)Uf(RO=n|cqSiLc?BGQc}Nx5RXoSh zT>pu(c&P?m$Bz=A=nX`gaNzrFOp4rvgZ+Mo|qY7?ulCiUmpGV*snX|$e(6<4XMsV zq-I_L=AHnY31(5{cWSw>0LKa2CA|>Qe07561t{EYOFw%(ebwwrn3%HOZN&6O(^{U! zth*$i<9lXacOQBfdg9XaEs=7ovX4gOJQ&?xyw{WUfY{o=BM-=l!)M1R30dr_8s$#Ih6oBm4?Cm!ZD1V*1s(L{B+4 zV_YBf=`1vTx#VeF%!D|f-l1-E0DwtJ^J9<~_{xv&#>yY1U%DyrNDkJHvqlS7ulQug zCU%ZYPY){88u9F9f70szS;=kHop}=0K?N5lp-!e4RQCL`8XK`YI9B;-&tz;>F102& z6Uv)r=e0RzB0%j?Ol*SKJp(KEn0C*{5IieX`hwlX5z5Nj30ph%fj#K3Ue6QSB8kjSbqt+R|(3HxlIa zWQKbAmd0O!;9FNeh21#=jz5Db{MU*s8L8t_PE_EXKAn>odJl>KreCXA| zVgAe>Y`8^B3#yg$LBWb&-K5KaL?&U&l5@ad5Y>N{u{Yzav3@O`9GVOe%}D2;t}EIhw# z{rJ18D=Vloq{c>m-K0YxoR9reTDykp^gF-5k51n>(7T0FjJ3ad$`iSg#ov@y{JAD5 zkWM&E;FPCZPK(!*rL9d9xh6{b(kInqvFZV|l~O3CFia1e`bub6y-{-^O(VoIYS=G< z@j<1{B-gmY<1l&Fb|}vg!E8jQGvcu7mP|27yfZUeg`E;lt{nj`4?VhovnH=a`)etv zl5%V><9q%7fn!0IBAhc>$PGJ1q=~7u`>5Cr{4BEM+#IFtFjOv`mh`#D=JaJ7RrXB! zUKlAE?e3gZ+oF-_Cnusf>(l27eZGN=di7 zHfyTJj-9t@jYP+ZUwKM(_7|xuu)QE2hpJA&RT935v<3)97^#^Hf67`ESuka1vQ0B_QAgaxwql zv|M)SVlJ;xlM*X}YM{|fggEDdc0;ocL#!4<5AJVM1uSousU?!JqB;{g)#3!#Y7`s1 za-9e_)Z+FO-BJu{*9>DNNZB%jiAy@dMe>v~QB?ZKHzoF-tm(TKfDVDAoCJDwjXisG zFI-`p8~?Vd9O|D}01uN^#j0Rzz=Bd@Yd`}{wb^iim9qa~irwLJ z)IrH-XY!gH{a>~~j)JuJ$ZiH+>m!of9Z`sY#{|3tla2pukl(n+sd!){_il)4ejgmBd z^=joKA*3jhp?l6#Z2N{6f$>aAkar$nf!_^p^zF~t!08x7_=jg{PHiwkA^KrLFJ%R5T->a@hhf#2cGkbK1C__AkXRbW%fvwOID zR~u_^HXqNsi#Ca2@D*uyQv@HDj43`dEfapiX%x}nXtoF8S33$jXKN-0D!3D|iLHI( zvJl30E$YP8Y8@3&D0~~JaU^uMmDX|zCMF%12^k3$JHE7x#jt|pQ}@Mc1R~q*ARq2g zJ;wBMaXj(pi6x3QZKPUJ%px^DzBaP*N4V;p(o_CRX4&0S9$Sl8YR3Iy(oKX&O>;A< zui{e8>Se>1lA6~6`HbWkDXA=@s_ooSVg&fJd(k6jySUZ6N}Hn~Q)`g4Dm_XbL?>Rd zfC9fIWt+@_941NgPaIDLL44Duy(&J8^&SdKWgzHy3{`4z7lmYla(U;IuC9%~@F+)Z z={bO<+jh@Ieer%(flXCosNd$OFPtLQF8&-vUfLm&I3+)$0U69T{?&wnjFNo}&nZP= zJc(}t&WnT177v$5n00PH9L6O;WejMjW<4N_3567C*jS~F=LLoD<+pIANrg1Q43Ae; zl7K8N_X2}bGNOVbC-C^xnvw5_K1n@o@CbV`(OjES6DrxmX1 zRgo1DSHCdrGfzXGCMuwF3WRa7YbW3)n9#2+#1_*vRqvxEKtK{ol@b?Q#E`EmF$6cO zNyKFF0}yywsjPBo9ij57lsbW-Ht|*pJ0Tm`iTOGLsOH~#D$`{7E9vIye+@j=oSAit z>i{hFoNEW0iFlRU^>~Wuh^$6ddu)8Fsk3OC^*<0)guHL14@ic%U|SVyvs*r#9?dAKG>oB zb_QT+cozM9G8cm&R7A3o(iB$Nr0&_}=`Dq%`-mAg$|g_ff$xadd>uZAaWPtVqT=cg z=qRV-v|zz7K#UkG;>2-b!F55Ef@VX#9qjn;Kw|nROD5Nwg=$lFhzSh&P$idIvrEKS zIZ<#f%=JVcfA&2BiK&RZ=CAn#)GiRz?Vv*H?JxN(}x^IG4gFADepBIyELo2(B%gwnJ6$+%D z&70;h?Jw``J+!AY07D3YiJGD*SA9%a#AT9=Hy=@VnVFU{dE^ZS z_Bz+FaWO~1-O?%Zh`NP7?1gxm>`rkLuauSFD0phA3N#l?)$Pt zupW6wdfl~|a76|I0|T9Tw5%EBe7-Xt7{g2ZSS&F-mOKE@Ubc8>F4QmzK%B(jgXBA? z6+!X4kTTE7PZ{c%?nEh;2O#M-YiIv!)cfQTJlceDtN~}anCeX+UltyvR$63kLG`q+ zG!7NB?-8F~9E;3(vttX;sz<5TNgPGB)m!Zq!^dL9BQgMPn+gTcwwOeJQychtb2l6_ zwrHq(pjOySLRI)j@)nb(z|5Pe&TgH+S2jBu5EQVzWEC;~0ns2M(2y6KP=kz2Ma{fQ zPv8nKd3r$7_8kGbS(>uEeSNT!=%S@cD?7KYr}HL?k;-}WZfx$AMLC5+$WVOa zA`N|MQ!mCeg=C^bX1>Qjto*48=G~va@uF&DW3u zuL}1OglGyZ0{)R!fl=c9NJH+bfTWX{0uQT%3qmCZx<=uk3W&s4OQ4UsLK%`ZY{Dg{ zGWJ|z!7kFGZKR$o>Jl{&CQ@qC@hNK2%n8O7m3!48qu7)R}YgZnk9Njk*{UX2zg=3ksP| zXDm~SrJ*eb06aX$oQKuSm1712nlziy5ZI5jEExl>V=g4TQ<$>epRvJL>x`|_Re+oC z=tx92u><#SRqEw~koI}!rlOJ*)#4d=0*!P@i`_P5@Qam$ey3;=DeS|xONWkHszsrV zd7_nSLD6*h%be2fX#g;AyM4)Z@1^xkKe5g?Epzt{7pozQsp0Wf6`ergzWGvf?0@eK z{W_~aS)cSCwNZ)fM4z__(lR1r2L_Msuo~}HNl_+LFtHfD6PL_`;saY0^%t$jR)Io# zS&YHEBE;(gR|#y1z@Qrj{!= z#g1cmv6T=am0BtR&>a=v&<#lZSw8$GK%^1bQZ~w}()9!{GLgLkxP}*4Mmu#&4cl}6 zCt<}ZEeKtds@&y%2(QmEmCLF8o4Z;vfzyF$a2mLJKF*pK+JJVWDcSkXroq?q#nlKm zhu|J#US4*HD#%{#xX_%1IQFz=d>Gm$PmLJtuN9CHR5N(~@EE6_RPp>64T>2|Ls5hS zpP*Gsn=}sSb!EQ-{PGg_zyo5{yrP8u%8r(#F4upHfz_f7FTVXmu~W1k?9sn-pPnNH zmO8MSJ<^sL*>s6BL=Q+Hr5!R{DT}ycx=py8Dc!*99bgC{l)v=WH8i~F(q~4mwPGg_ zAN(*WMA^6*veGUd_bVWikW$gR>OegE^D=>;1j(x>2u5JG2#<{6dC5tLaKs#e`>H*= zcQ(MrWSoE7#igpjPKL(GomlLdER~wz#1z9Kf_RsfyB9j;!a4WRNzL&cZ=Z;A{UGUk z%(l+)$jCEbJ##>*Et&ed-^FvcP+U9Al#!Rf?U!+DzL>H@{mQjb!}NMA0_C;PLA9vE zfIa8Cq^NbnUQ^eh_~pMs=`j)Z0l;=bbAe#>Ym&t%S=jZrgX0QGCJv2{-J*sIcfLdY zt(8A@%OLL}JcH%TtTBc~SjOsjQ3ML$yAe%R_BmD~)v3XlzFl);P0YFgIm@iIAp~oq zRm0Mv5lh3;Bzeeuz@(067(9)Oy^sH?}(O5=B6Uxe(ie$U^0<~5>zG6s`z z_iCzLQSabxi*NL$X6l9xxv z`+zl*Mi2NYk|BD~5i*Chjsz+~W?f0}w)sQ7uf`?{ZBdG|2L(Z`rq3zO+k-_|(zbBiWjjEB}d=HPta<6yILggifz#C$CqCWK6$Y)8IL&02mO( zKf^9*@eY*o%cQl?>KB6v2=9^u;g0_jo4GYlVe`ov013Hs>6g!@1+Aq{4Rh|;R(x_o z9H%tXILOPxIQKfoVbpmURD{IM;u(^_t8~KRwRBl7$e5sgLUJfCjsTnD>J&77h<)5? zh}lW^vJ(q&mdoGuJjc~Y+aJNYP`G>F%A2DmDPQ$Q!u*53ym@(SPxZ@B-A;-^oJqe7@zu8?VS1~=_$q|m~wl|pMN_6c<<31`r- rTXqw6FNOnAl#YDQci&)mz9z_y>O21Xt&xq%E{^;O_mEJu*QNghI~9b; diff --git a/Mage.Client/src/main/resources/avatars/75.jpg b/Mage.Client/src/main/resources/avatars/75.jpg deleted file mode 100644 index cf70d9b85e860f6375f551daa064280cd09407b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10212 zcmY*;1yo$ivi1za;O_1aT!SaU-QC^Y2^!qp2Msp3ySqbhx8Q*R5!DEA|aj z0Gk>Io=Z%P2G`6jgj+qOsBuu7_G-c0od*w$wSO&v0|0_wm4W{|8f*X-6_6T-lPg42 z)l|$34)=9XaIdZa|L=%_uPR>^zN$+p!n$f4T-d*+`nw50d+ibq8-)EDmEqt<{W4nF z(n_KWYj(rZ@tRn#-(TRc>9mKc+u^j+Xv5FUlF>cek|6ByL#)^OP0neHuKDYPXm5G4 zolh;|R-*?gDSsP?rKFUJUgFoS_HAF2e8RHwEIf2(_$-`T$}!4*NG&=nUx2Q2aW_id zdu-R0fWKJy{XVNQt`g^EYDF7iJoQ$NV3|5EJ5wn^9XM9`>ujNsyM%i|O(}xX8}hh||a!%bQ}s zNoJF!Z~Xx!{Vf|S7&q(q?)K_X+~Z>zNtQtjC%2qKx=L4%tZGu6jp0q3j&~1P-l(<8 zT3T@1ev1IbZ~(ZeH4wz+LNMC<3EtycR$Tb0^i3*WNpnz-5>MI6b!LE4F9!@bT%=Em{&{&&<78VUKF zNwyo4dzt!|&ckSwvAaSk;WMC`F_wME)n#XG)KCBFop^DgXeNwXyk@E9nYvaYXBUzuM7-U^h(_|Gw9k2HUYQjpJZoa~K2NB4O?d87q`RRXmKmCy zEMZ$TEcqv)vSTbcRbL#v)>%Mx_2lN!flow%E1MC%AX{3pOdFy){aW-LDFbTqK)WFV zr?BR=?~7XnjQi!;tZU75ZyBeK$^0>`Xt&m&{4YwRhxFw&qzag{b5zssnkJFwk-mk7 zOW$lG*wGMLwP)3kobu3*-@&{Hi1$O6-Lz6?OXt-1GV=@);x)!Qn-{u2>rq}p8I4C8 zTKMwwtmC_?p?G0cT&Sz1G)w14_Zg%{#c|C<>j5SiF%Rlb&`P5V2UBk*I}sfZLGy>~ zu)M@;!p16G@zR88HBtY+i{u6lRwsYDIypKh0Cw#VN;r!&lCuk1S~vVSi-x1iH+P z8a`)GnH^B}{|f%IL?}g)cUAb|EDG)NXB5nMOg$itfx*hO>1e`$_1pQ!Khg7xwt|mIv`7}gsa2Te3iEk((DUmi7(S6H$%drFXhSyG>On-dfGV|6o+8~2i=T`Y% z{h6tH;8w@9qC}_e?2Y&V`@wE;xsm9NH+BJZ_@{rsbWRzhowUxWHZ1>%8|a_7DNdtS4ZXsVJB`?T$lFMpvmrmt z$Ev_Re~FdmQ7KYs|CxuqB*e(qNJn!Td4tF5&%0PR<#R@jE_cOG$ZH$(#dtFv;@Jxo zOK(*6$Z;8LB!-fEgz&F!s6LUexsYqSc3V*n(>fM9ma8?TyT;r^kXm_qvM`P0qnZiV z6jFS7QVUE@<)8Ws5Gl&$=16=8G%N9ZrdB>n3qTq29B9m-neu#BX!QndBDp*OUg{9} zCR_23h3-*uiQ@S?&^}KYztxUV%FQ3ramQaStl3u)H!(|Dr+5=#RaQw$pNVvJuP%Zc zVr~ynQBio;?#x6|qy?^i?B}vJ?+W+rR_Yv_X%ElPI5RWqWcRZ*9ozQx1L1wh$-4+&XxSVhEAbtPM|RC! zJ1R~*B_rIN8*jaHbC%8)B{OJ*RY^gIdReL##C^HA7j3`9M- znl81L^Y*M>DV|3uvS0gJaf1q?^lH=iWjngUzN*7Yz0)+9X1@EZS_`KBG?SHC>g%qP zvTH?o;g1=kMOBv)`Rzip&dJIWcwX^gu`a{^b^EKM+>_L5Cv!Kw-r_?B3L}<=s z-_%HEtZ3D)Rm5Er#%j9f(vHG>Fzt`4l7>fQ+_amjsIKWM<7KnNIO%E?ZmLL(gT|Kef6b}Ro(+58X>Hf3duZy)MX-&+TN z{zRefuU#f>+Js@*iJB=jY}fv=sVgf~7{l4$Y)e0Zb&=gx;+-=3pn-)-5+1(rD9 z=W!CN8AY2Y5`K96p$_X|5;^k|YRBPaCNEcWuA{p)*z#SZUcq3ihz=>}tMbT+DL7>8 z!nd&qa_jWw4^kOT6rWx|(yp(|Rk_>4k+Dte>R{t=Q-3GNws*&p#5nnVj@k^Eci!toMEc7KaBG3!vQ)Zva`LO?ZhJ$}Q#Rva~i`o_3vi^-5k z-TF<<_D78f$FWa?RAxWyFH%kha^dck$5Y1=eTD)2vCHts8r)RBo~wv{xV?2``x^0~Te+$$fxf?)=(qci?=&$p zg2@}o&#T2ZWnPFG_Ufg~Fpl7DbPg?T*~zXD8P&${Git7)`;_U6E#+^dZ5I3bp*5O{ zg(6PZW$9+F9D6RRTcl$w)fL)aUmU?Oq6LyA{dXJ62+R9dtv1`%95=PXHt)sq44Q2# zpKl!_M4jGASn+_8;5d8Z`jo?%Sn+Lc151l z506(MFTtA8uD_#(O74z(nX>EJN2P>`lL_4|YLa_LqS&3Mh&kc+M9A;SMjmH3vp#8> z1ojJM3c4(LjxA5(-<&*oS>I~3^u+b8!wGB_bM+q1W$~)eqE?Y6p#&*7p!!#mo-uqm zG^<)S8?Pio8VhZIY#iXv#hiksosz{Iwsqqkc&`?(Lr8h`8ekIXKOgN{ffG~Q zlz~ZI@uj*98(=2biK}yYAi*6b(}ocr@q3+0f-P?n|q_!NH@lz@yuoZa-3ed!XK=yK4mtj_<{%Kq(<87_W(Q@1xi2A*d%(UVdZ zCxyK@msh(+FhWAYtisgJJv0MxYe_^~V&Hpa|NPR|V*SO8y{%_-mg>I%3+dr{_>$|( zT3hLXa%~RVnU;jgrkd**vvimKgJnf`ND^#BQ(xjaP|BJ#DacEH)0JA&v9V%bjqxww zD6#fy%d;IXfLN$zD(s#eu5iWa&xpim8fJuuxNyF_KKF-|q2hqfFy2y&7gTttVJSn6DJ96> zXOt~Xc_Zp>ElP`^FdpL9|NBb=0Y#|4>E~LIcJPEuYZzfFbaj2eszA=|C?>5@FaRza zObZ-T7fGE4laUqibTMVBtD=cg=n{Eb6%t>tYvdxDjbA<8rhZBcG&u(KO;Z4~g4lA5D2&BFS<#GYU* z5bT2v*C^5JJyHWwWcHfqux=}q^gi{RselSXJRe4?`Km?t{7x*!_(vYVl-vnJ=d;s zqvQ!Js(3=sDHc8*Pa#BT#a)~JN|avxQ6(|yY_3$XtJ2`O0C^!Tm-Bgx?BT^Xm0F?JRG@l3U6f4vSfTAC);i`*mV)JXmQ z3F#Y&76$^;Gx~RX)LK|iy*51@pHHk0K?D*@+b}eRv&>iyRun z=UJ4Gx{K0zizy&Nw+EoFTyex-M{8l^5=MXK-$l5Q4B=O}erx&A;D>o*1@HG+E(gSy z8T?f9!CXsDI87)v@*>lF<}N`sE1LbQZo`fnlhtFG;_6G02g_Y(>SQ!wut1a;3UAlp zN>*N#)k;uI()Sgqs+HBZBxyDk0fQ@%WpSeGgUchiIo%}@I8m7m^5JCU+tiYjh6-41 z`3T9@?cmD$?9Ms2^zjopZM$;8N~1%iV66Zd6C=hYl@S7kcX+5eBh1aA6(*U&`Jfud zkJg`YiDagPo~d+w?p*^?L{gashQ>JMz&f0YBTA z9yJeEG1`Ya>Jr~zS8#GuB>y=Nj8WnI6$1#EF^+hBIEB;|WDYO_n@Cur8W&J}gqyOlsw%4evxvm_z zzr!s9{k-J)CP*OL!oAV$!u?~fZi=eX7;?!63Vl<*?^s7c@42D2Yf1Y4XQ&YofJERv zX&g3fcgCC4{202xhv|v%1@eIU5NtbW(e=WmNE73s6F<$jgx+3v-Q}fyrP{M*v1e%L zY2%rB#%`$ow46zadl}xmA~RLO)1h=RjB3>`zE=9d5h0I^c(0>XfLZt`A_4hOu_>J! zCiw>nEu~)8Hj(ubA6QsDaLEk##d%_cx1%XPv}Myqwx)2L7yMhEvNN1Udf}t8vFRbo zLzc9DfqT8I+twk?%APrrYS?jD%$1Nn_-pBLR_W|xWCUDKd>wX?j`=Ndo1fP-L=Yni zsUzEugdw)uTR*%8og%e;Bd_e^6M>&5n>m?p6b(L{*?$Xeu`{z9=cgY z!&{n{>o*a=5F~)ZXQeTY-Tb`=!+%WVESt;H%9HPTkgvbR>Y1xf)Tpz))OYj4(g(?A zw%V~X77X>@tgNckWLDbGW8Pl8iEe9d?Vf)j5HjCCBZzTrnj=MhGCR@DZr{1dGyULG3=+$8NCy4j;6uX#7JN9_CE zNIkLhS4>#OeV9brbGL8fcg+oS%Pw1*3K}_hC3t{;ODZ*)nX%N#2j-iDx?Ai7ApN#VgqFA zUfF1Pf%HYY-+C4?4(8y*6UnI|o$!F8Mml5Z?Db5A>$Gq?H3f@OgkNGw;Ejz0K zW}@(umu5qI$ezz*HhP=<{ko-L-5&-Ux%L>9I(me^fF6J8GZxLKUy0+jK}4$pEicbQ z%ci~>j0kS<_p*dGS5r~YU)G*WIFfeVa;m&20_WZgeBXnb(zn0WnE8v6zWMiD`A@v9 z=6R46k}OSgh>@Md$@FKVD-G^JYRc(2(|wVGhtB&qGBaCb3Jj4hx5%B+&oU-rwmFqD z@h_~S3R>LI!7@(^)hhyK%uNEs_jQRl=AFCHHvw(sq0dtL=K|0$3vD zfUYCVduT&2;lw<5>X`h*>`p5c%O_^UHB_(c!ws3t2>0+zOU2+Ik-XJte9ss}LQ&J2 zHpYO%qoZF_joBG5y*vK+PV+dE zey&I^ebX_e^h8~8(AjIM0)}uP<%X(Wr8`|V=~7(h9gJCcMkW>G`s%m;e=mUb(%@%G zFH^;dRwiNJkRtLL7I#Fyq4&ZTgj_ZRlx>&kMSfai=+pDPwn`(l40+l}u5eae#VWmY zo!CH!ThXJNxGap#v4sPyD$b|$g-^MH-Mkb*LI2$iVYzbmuswz?;Z1QMm(297x!cis zYl@+D#Tpu6rBqo>0O&FobcI+6BMSx>0r)PGyv0jUrVx-B%NvAbZ7K{u9qv_294Rsl z{+-IONF=A=F7=fCZ6b5#y8$tMKw$I%aiKyk6=<5xgjS}_(cY0~#17?>01af}=kCFC za}$rBaJJnO+rqN)kr0;)>gcNcpU+JRBb2glsewqq1=QWDKKZ@Io3Ux(ya z#P-0U#v;~)BbxMVEQ-B;g0{z*7QWFjFl8y1$EKxcCULf1vtw%8#K(y5SY+bRU}s8D zv3r$PrQ^mOyV#?Vr;WI&&tgO-`P?Mf#pK>*G=A@;rG;xuuWjo%*}jQK6#hpu{(kz-Wkki-Zm+`K63|r)HxQK?)As;QM5(c_( z5u7CO5Jy8n6jUQj=53Bz&|>i3XX+Lw@;YNHRAkX_L6B#rAq3*7^N+4s%3INe21dqP zy}qMmtNv2Vv3!+2M>GSb#)LI=@xfAQ_yswOZOsfrG}KJ%LdrT{TZHflR`BM<7LPAY zAod=$COJ7@iZcM&E=bSJ^$dRueBF}ju~hOmo* z_)a-dy9_x8np-C&gH*sdiFJ`51lis*0TL+dTWKW*jeX!|VbMGtP7egq=4#!!G}}vCmp5UkGcuHO79^ z7M%dULclCe##>LEFm4lh){XOwW-eVk_;W$3fQAO(APKDd;PcR~ zI~m{;$ni$gGYgOp>m29y=u20x`~tA_rPRtqOlcl4b- zz^in~W4v_TUMwz(qUFt>UMv<(KO{oay?}0N80fmVI%5K(Tdg8(N!X&T02r?Me$hDb zCRBZtx?W7Uu@gF?3rUFC&|p^$K$YZLK)TwOW^YmZi;!gdAVh(cTttlOkV64#rxoY_qwth9u2_yVF-fFnYxE{C$1fgM@a6}>zM8|UbT^Z!OSF`26hTY{ znkd~09c>B^FE;okrUvV}bWGjzvA3(|k0D(Ym@?N8V{u`v$i?|LEygg2V^R%#x(oid zd}1QW=(pHVVqU{(uf*Wcf<%j=RDuw>dPzYllwp!~y}D+jCRi@>0RBhhh3Vt?G=F)e z`=4CETqm#H5_Y)Wz;Ow+YM&i&MLXQ_2TNh`6!{oHL-#m8AGh{eRxZ-*WM;rD;(JY^^`rl5*sY}K%q{Kp-h&MUZZommu77ZUF{ZK3?~n5jcB7@8ub z*6eN8UHP%WQ2->pf3kPt+u@fK4uVhd5z|pG!vV)4#jPW*%#0OKBG7eC9$>6mwB4_n ziE%~E^!sc_*BX}UL-f_7K=yQ+7p>%kyr|ev1Ndk!^1HkLxqf=x{9u`Nc0=#2rfKT1 z^D(+Y)hTMU8g;yWbtJGo1~n>2d9z6NuAi0u(2A*3l4_LkX*5jx;+bI~s}eo5RhfTD zaf0?nIUeWxW_A8h?I>3d_Da@PlF2r06IDN@>+WA#I~=o6ikk0CZKt1TEOCubj?Jj% z@H0+p3pP!?VEpS@LM?0A$pnEk;$p%aQJg8ty(nP3LJFxEYCpgsNNI>>fv^wW>mO0V z(5vTR@fM_5T$5+z#-EQa=$|-_2=9+3ZO%5rKPaxRBQ1bvSsWk|V#{gMmN{TrSFZ$* zg?KGweKQZ64QkA!%@cKMcsbuiiFiozaq2ncd(t~jGBU)B8Z&2Q6+4+52C6W9dJI<8 z1l}tu#3bpkAO}B7`s_ahW#Qs)_@3Sf!>oZ?t439Or1D=mB^a}P#R=Z7f9>gZ678*h zf&_Cd_U`NAS8mpH#$u>6slAtL<5=zIj$0sS*L@+}#f{>~bOz=&8f8SCATvk}wl1d7 zcuMzl1{GW_+gkK_Eb1e;9Ow(_jG2sRmyLItg{#At2#iG;Ta#@L^-c>(hIYq2sw`7< zP6-0NAYiC>UdPsviw-inItPxYo?uqtEV_ns zH?V3BqU*H40RUTu8!5aSoP1x*Cu&R-(15;~AH2*K>)r}XVU@x8wJWh`%=W?Ge{`7n zYsy@Bj6Q+2fMlJrbKx~cmv23B0X|XY^o<7ohs`iCO|kS!liW;gJ??2oq~D^Gz7l@0kM&hDapy zF!_Cw1qv8(Y>{L|EOx<4-O4-y?Vagmoq&(ihB4Ch5ix z4KDW22xaM4>Qbt!)&aN1vjbQ&d;bFRq;06KORkRx32F-e?VX8$HT z=$~ZAM;mryjKW74p!PJ0k-;s)`h%BPSjNI6+X67zJuEz;#YRaW$@)&eg@OQn>-WW6 ze`dU>f0^K{E_Fjm6n_r%L}sjh;nNu|OMgKB25mbfIdKq$LHNVtvo$VB`HvGuwrIy} zjZvks&n_~PkGav)h2u~7Z^iia6Hr1OvFXQWvgTth{5><-n=P`HZz=AX@_OG%2vFQV zWeRl@~-GIY|dgGd^GR?eGW`p>J2 zls=a_V(k1n!$=dB&*V{izke|W*EK>ly~!wgmhQ&d#+0d}C!3f1AaYd0fwOd1VBP3` z>_JGI2~5(hxJIT*WoqRvI}sZD!F$KJepBo{{Fo#G`KgaKO`!#VD}Q`W&>jiQ6e}7L z&m%lkzbb(&YL@G!*}0ujsI>%rumEjh`Y1BF9+~ehMx#;@)b&04E9SB*E?45aWo=qQ zZ;|y_%6-D?JpL%wdXQntR&aZUld|>+JY5s>){j)gX@)1>?u8~F3PcW=3oQ>Jdl6V$ zQ%d9JxZz}4U(t{*WZK~!9G|o3$*~j5SvnQnn`$)!7Yz^lZ5NunjZq1h`$aQH&C+nc zVZ`e)!qZxind6(9v2dXhd9sr!!eywdg--+YX4ulAc}JA^(OSvL>^V_vEXOp&c@xWd z5#nNRH_aoM2hdMYlzkHI7|rR)rtucQEz2gpj9nR#V=NYt$g=e-1`tpSyt@>^Y1>El eVg-XxV<9MJ>A)P Date: Sat, 26 Sep 2015 08:27:16 +0200 Subject: [PATCH 31/42] * Triskelavus - Added missing {1} cost of activated ability. --- Mage.Sets/src/mage/sets/timespiral/Triskelavus.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java b/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java index 704c4c478d8..6a95558fbb8 100644 --- a/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java +++ b/Mage.Sets/src/mage/sets/timespiral/Triskelavus.java @@ -34,6 +34,7 @@ import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -61,12 +62,14 @@ public class Triskelavus extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - + // Triskelavus enters the battlefield with three +1/+1 counters on it. this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(3)), "with three +1/+1 counters on it")); - + // {1}, Remove a +1/+1 counter from Triskelavus: Put a 1/1 colorless Triskelavite artifact creature token with flying onto the battlefield. It has "Sacrifice this creature: This creature deals 1 damage to target creature or player." - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new TriskelaviteToken()), new RemoveCountersSourceCost(CounterType.P1P1.createInstance()))); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new TriskelaviteToken()), new GenericManaCost(1)); + ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance())); + this.addAbility(ability); } public Triskelavus(final Triskelavus card) { @@ -93,7 +96,7 @@ class TriskelaviteToken extends Token { Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new SacrificeSourceCost()); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); - + addAbility(FlyingAbility.getInstance()); } -} \ No newline at end of file +} From 56a5030f93e436a0a440a15fe5c30842d2f1030f Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 26 Sep 2015 23:30:24 +0200 Subject: [PATCH 32/42] * Goryo's Vengeance - Fixed that the beginning of next end step ability also exiled the target if it meanwhile left and returned the battlefield as sa new object. --- .../src/mage/sets/betrayersofkamigawa/GoryosVengeance.java | 5 ++--- Mage/src/mage/players/PlayerImpl.java | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java index 87999170a71..c30dfb512fe 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java @@ -70,7 +70,6 @@ public class GoryosVengeance extends CardImpl { this.expansionSetCode = "BOK"; this.subtype.add("Arcane"); - // Return target legendary creature card from your graveyard to the battlefield. That creature gains haste. Exile it at the beginning of the next end step. this.getSpellAbility().addEffect(new GoryosVengeanceEffect()); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); @@ -119,8 +118,8 @@ class GoryosVengeanceEffect extends OneShotEffect { effect.setTargetPointer(new FixedTarget(permanent.getId())); game.addEffect(effect, source); // Exile it at end of turn - Effect exileEffect = new ExileTargetEffect(new StringBuilder("Exile ").append(permanent.getName()).append(" at the beginning of the next end step").toString()); - exileEffect.setTargetPointer(new FixedTarget(card.getId())); + Effect exileEffect = new ExileTargetEffect("Exile " + permanent.getName() + " at the beginning of the next end step"); + exileEffect.setTargetPointer(new FixedTarget(permanent, game)); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 44d164941fb..eb175ea8a29 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -2926,6 +2926,9 @@ public abstract class PlayerImpl implements Player, Serializable { @Override public boolean moveCards(Cards cards, Zone fromZone, Zone toZone, Ability source, Game game) { + if (cards.isEmpty()) { + return true; + } Set cardList = new HashSet<>(); for (UUID cardId : cards) { fromZone = game.getState().getZone(cardId); From 46fa935172564861381e9509f12ee11fd9f698e2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 27 Sep 2015 00:22:51 +0200 Subject: [PATCH 33/42] * Emrakul, the Aeons Torn, Ulamog, the Infinite Gyre, Kozilek, Butcher of Truth - Fixed that the shuffle graveyard to library was wrongly done for the controller of instead the owner. --- .../sets/battleforzendikar/SunkenHollow.java | 4 +- .../riseoftheeldrazi/EmrakulTheAeonsTorn.java | 111 ++---------------- .../KozilekButcherOfTruth.java | 98 ++-------------- .../UlamogTheInfiniteGyre.java | 79 ++----------- .../triggers/UlamogTheInfiniteGyreTest.java | 52 +++++++- .../base/impl/CardTestPlayerAPIImpl.java | 2 +- ...leIntoLibraryGraveOfSourceOwnerEffect.java | 72 ++++++++++++ .../turn/AddExtraTurnControllerEffect.java | 58 ++++----- 8 files changed, 180 insertions(+), 296 deletions(-) create mode 100644 Mage/src/mage/abilities/effects/common/ShuffleIntoLibraryGraveOfSourceOwnerEffect.java diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java b/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java index 654009000d4..0f9edc0a55a 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java @@ -47,9 +47,9 @@ import mage.filter.predicate.mageobject.SupertypePredicate; * @author fireshoes */ public class SunkenHollow extends CardImpl { - + private static final FilterLandPermanent filter = new FilterLandPermanent(); - + static { filter.add(new SupertypePredicate("Basic")); } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/EmrakulTheAeonsTorn.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/EmrakulTheAeonsTorn.java index 11b0df213d7..81f7d3e5c6d 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/EmrakulTheAeonsTorn.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/EmrakulTheAeonsTorn.java @@ -29,30 +29,20 @@ package mage.sets.riseoftheeldrazi; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.CantBeCounteredAbility; import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CastSourceTriggeredAbility; +import mage.abilities.effects.common.ShuffleIntoLibraryGraveOfSourceOwnerEffect; +import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; import mage.abilities.keyword.AnnihilatorAbility; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.ProtectionAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.constants.Zone; import mage.filter.FilterSpell; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ColorlessPredicate; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.stack.Spell; -import mage.game.turn.TurnMod; -import mage.players.Player; - /** * @author Loki @@ -72,17 +62,18 @@ public class EmrakulTheAeonsTorn extends CardImpl { this.subtype.add("Eldrazi"); this.power = new MageInt(15); this.toughness = new MageInt(15); - + // Emrakul, the Aeons Torn can't be countered. this.addAbility(new CantBeCounteredAbility()); - // When you cast Emrakul, take an extra turn after this one. - this.addAbility(new EmrakulTheAeonsTornOnCastAbility()); + // When you cast Emrakul, take an extra turn after this one. + this.addAbility(new CastSourceTriggeredAbility(new AddExtraTurnControllerEffect())); + // Flying, protection from colored spells, annihilator 6 this.addAbility(FlyingAbility.getInstance()); this.addAbility(new ProtectionAbility(filter)); this.addAbility(new AnnihilatorAbility(6)); // When Emrakul is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library. - this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new EmrakulTheAeonsTornEffect(), false)); + this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibraryGraveOfSourceOwnerEffect(), false)); } public EmrakulTheAeonsTorn(final EmrakulTheAeonsTorn card) { @@ -94,89 +85,3 @@ public class EmrakulTheAeonsTorn extends CardImpl { return new EmrakulTheAeonsTorn(this); } } -class EmrakulTheAeonsTornOnCastAbility extends TriggeredAbilityImpl { - - private static final String abilityText = "When you cast {this}, take an extra turn after this one"; - - EmrakulTheAeonsTornOnCastAbility() { - super(Zone.STACK, new EmrakulExtraTurnEffect()); - } - - EmrakulTheAeonsTornOnCastAbility(EmrakulTheAeonsTornOnCastAbility ability) { - super(ability); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.SPELL_CAST; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Spell spell = (Spell) game.getObject(event.getTargetId()); - return this.getSourceId().equals(spell.getSourceId()); - } - - @Override - public EmrakulTheAeonsTornOnCastAbility copy() { - return new EmrakulTheAeonsTornOnCastAbility(this); - } - - @Override - public String getRule() { - return abilityText; - } -} - -class EmrakulTheAeonsTornEffect extends OneShotEffect { - - EmrakulTheAeonsTornEffect() { - super(Outcome.Benefit); - staticText = "its owner shuffles his or her graveyard into his or her library"; - } - - EmrakulTheAeonsTornEffect(final EmrakulTheAeonsTornEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - for (Card card: player.getGraveyard().getCards(game)) { - card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - player.shuffleLibrary(game); - return true; - } - return false; - } - - @Override - public EmrakulTheAeonsTornEffect copy() { - return new EmrakulTheAeonsTornEffect(this); - } -} - -class EmrakulExtraTurnEffect extends OneShotEffect { - - EmrakulExtraTurnEffect() { - super(Outcome.ExtraTurn); - staticText = "take an extra turn after this one"; - } - - EmrakulExtraTurnEffect(final EmrakulExtraTurnEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - game.getState().getTurnMods().add(new TurnMod(source.getControllerId(), false)); - return true; - } - - @Override - public EmrakulExtraTurnEffect copy() { - return new EmrakulExtraTurnEffect(this); - } -} diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/KozilekButcherOfTruth.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/KozilekButcherOfTruth.java index 81f0622ac4c..00a59b921e3 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/KozilekButcherOfTruth.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/KozilekButcherOfTruth.java @@ -25,28 +25,18 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.riseoftheeldrazi; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CastSourceTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ShuffleIntoLibraryGraveOfSourceOwnerEffect; import mage.abilities.keyword.AnnihilatorAbility; -import mage.cards.Card; import mage.cards.CardImpl; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.stack.Spell; -import mage.players.Player; +import mage.constants.CardType; +import mage.constants.Rarity; /** * @@ -54,25 +44,25 @@ import mage.players.Player; */ public class KozilekButcherOfTruth extends CardImpl { - public KozilekButcherOfTruth (UUID ownerId) { + public KozilekButcherOfTruth(UUID ownerId) { super(ownerId, 6, "Kozilek, Butcher of Truth", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{10}"); this.expansionSetCode = "ROE"; this.supertype.add("Legendary"); this.subtype.add("Eldrazi"); this.power = new MageInt(12); this.toughness = new MageInt(12); - - // When you cast Kozilek, Butcher of Truth, draw four cards. - this.addAbility(new KozilekButcherOfTruthOnCastAbility()); - + + // When you cast Kozilek, Butcher of Truth, draw four cards. + this.addAbility(new CastSourceTriggeredAbility(new DrawCardSourceControllerEffect(4))); + // Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.) this.addAbility(new AnnihilatorAbility(4)); - + // When Kozilek is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library. - this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new KozilekButcherOfTruthEffect(), false)); + this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibraryGraveOfSourceOwnerEffect(), false)); } - public KozilekButcherOfTruth (final KozilekButcherOfTruth card) { + public KozilekButcherOfTruth(final KozilekButcherOfTruth card) { super(card); } @@ -82,67 +72,3 @@ public class KozilekButcherOfTruth extends CardImpl { } } - -class KozilekButcherOfTruthOnCastAbility extends TriggeredAbilityImpl { - - private static final String abilityText = "When you cast {this}, draw four cards"; - - KozilekButcherOfTruthOnCastAbility() { - super(Zone.STACK, new DrawCardSourceControllerEffect(4)); - } - - KozilekButcherOfTruthOnCastAbility(final KozilekButcherOfTruthOnCastAbility ability) { - super(ability); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SPELL_CAST; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Spell spell = (Spell) game.getObject(event.getTargetId()); - return this.getSourceId().equals(spell.getSourceId()); - } - - @Override - public KozilekButcherOfTruthOnCastAbility copy() { - return new KozilekButcherOfTruthOnCastAbility(this); - } - - @Override - public String getRule() { - return abilityText; - } -} - -class KozilekButcherOfTruthEffect extends OneShotEffect { - KozilekButcherOfTruthEffect() { - super(Outcome.Benefit); - staticText = "its owner shuffles his or her graveyard into his or her library"; - } - - KozilekButcherOfTruthEffect(final KozilekButcherOfTruthEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - for (Card card: controller.getGraveyard().getCards(game)) { - controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.GRAVEYARD, true, true); - } - controller.shuffleLibrary(game); - return true; - } - return false; - } - - @Override - public KozilekButcherOfTruthEffect copy() { - return new KozilekButcherOfTruthEffect(this); - } - -} diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java index 0c43c1abf89..4a25d967f60 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java @@ -30,22 +30,15 @@ package mage.sets.riseoftheeldrazi; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.PutIntoGraveFromAnywhereSourceTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CastSourceTriggeredAbility; import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.ShuffleIntoLibraryGraveOfSourceOwnerEffect; import mage.abilities.keyword.AnnihilatorAbility; import mage.abilities.keyword.IndestructibleAbility; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.stack.Spell; -import mage.players.Player; import mage.target.TargetPermanent; /** @@ -64,13 +57,16 @@ public class UlamogTheInfiniteGyre extends CardImpl { this.toughness = new MageInt(10); // When you cast Ulamog, the Infinite Gyre, destroy target permanent. - this.addAbility(new UlamogTheInfiniteGyreDestroyOnCastAbility()); + Ability ability = new CastSourceTriggeredAbility(new DestroyTargetEffect()); + ability.addTarget(new TargetPermanent()); + this.addAbility(ability); + // Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.) this.addAbility(new AnnihilatorAbility(4)); // Indestructible this.addAbility(IndestructibleAbility.getInstance()); // When Ulamog is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library. - this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new UlamogTheInfiniteGyreEnterGraveyardEffect(), false)); + this.addAbility(new PutIntoGraveFromAnywhereSourceTriggeredAbility(new ShuffleIntoLibraryGraveOfSourceOwnerEffect(), false)); } public UlamogTheInfiniteGyre(final UlamogTheInfiniteGyre card) { @@ -82,64 +78,3 @@ public class UlamogTheInfiniteGyre extends CardImpl { return new UlamogTheInfiniteGyre(this); } } - -class UlamogTheInfiniteGyreDestroyOnCastAbility extends TriggeredAbilityImpl { - - UlamogTheInfiniteGyreDestroyOnCastAbility() { - super(Zone.STACK, new DestroyTargetEffect()); - this.addTarget(new TargetPermanent()); - } - - UlamogTheInfiniteGyreDestroyOnCastAbility(UlamogTheInfiniteGyreDestroyOnCastAbility ability) { - super(ability); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.SPELL_CAST; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - Spell spell = (Spell) game.getObject(event.getTargetId()); - return this.getSourceId().equals(spell.getSourceId()); - } - - @Override - public UlamogTheInfiniteGyreDestroyOnCastAbility copy() { - return new UlamogTheInfiniteGyreDestroyOnCastAbility(this); - } - - @Override - public String getRule() { - return "When you cast {this}, " + super.getRule(); - } -} - -class UlamogTheInfiniteGyreEnterGraveyardEffect extends OneShotEffect { - - UlamogTheInfiniteGyreEnterGraveyardEffect() { - super(Outcome.Benefit); - staticText = "its owner shuffles his or her graveyard into his or her library"; - } - - UlamogTheInfiniteGyreEnterGraveyardEffect(UlamogTheInfiniteGyreEnterGraveyardEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player owner = game.getPlayer(game.getOwnerId(source.getSourceId())); - if (owner != null) { - owner.moveCards(owner.getGraveyard(), null, Zone.LIBRARY, source, game); - owner.shuffleLibrary(game); - return true; - } - return false; - } - - @Override - public UlamogTheInfiniteGyreEnterGraveyardEffect copy() { - return new UlamogTheInfiniteGyreEnterGraveyardEffect(this); - } -} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/UlamogTheInfiniteGyreTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/UlamogTheInfiniteGyreTest.java index 44a39cd25c7..dfde867688b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/UlamogTheInfiniteGyreTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/UlamogTheInfiniteGyreTest.java @@ -36,11 +36,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author LevelX2 */ - public class UlamogTheInfiniteGyreTest extends CardTestPlayerBase { /** - * Tests if Ulamog, the Infinite Gyre is countered its triggered ability resolves anyway + * Tests if Ulamog, the Infinite Gyre is countered its triggered ability + * resolves anyway */ @Test public void testDisabledEffectOnChangeZone() { @@ -57,11 +57,57 @@ public class UlamogTheInfiniteGyreTest extends CardTestPlayerBase { setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - assertHandCount(playerA, "Ulamog, the Infinite Gyre", 0); assertPermanentCount(playerA, "Ulamog, the Infinite Gyre", 0); assertGraveyardCount(playerB, "Counterspell", 1); assertPermanentCount(playerB, "Island", 1); } + /** + * If one of the big eldrazi is under the control of someone that is not its + * owner when it goes to the graveyard, it's ability doesn't trigger + * correctly. + */ + @Test + public void testControlledByOtherPlayer() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 15); + // When you cast Kozilek, Butcher of Truth, draw four cards. + // Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.) + // When Kozilek is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library. + addCard(Zone.HAND, playerA, "Kozilek, Butcher of Truth"); // {10} + // Destroy target creature. + // Spell mastery - If there are two or more instant and/or sorcery cards in your graveyard, you gain 2 life. + addCard(Zone.HAND, playerA, "Unholy Hunger"); // {3}{B}{B} + addCard(Zone.GRAVEYARD, playerA, "Silvercoat Lion"); + + addCard(Zone.BATTLEFIELD, playerB, "Island", 4); + addCard(Zone.HAND, playerB, "Control Magic", 1); + addCard(Zone.GRAVEYARD, playerB, "Silvercoat Lion"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Kozilek, Butcher of Truth"); + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Control Magic", "Kozilek, Butcher of Truth"); + castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Unholy Hunger", "Kozilek, Butcher of Truth"); + setStopAt(2, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Kozilek, Butcher of Truth", 0); + assertPermanentCount(playerB, "Kozilek, Butcher of Truth", 0); + + assertLife(playerA, 20); + + assertGraveyardCount(playerB, "Silvercoat Lion", 1); + assertHandCount(playerB, "Control Magic", 0); + assertGraveyardCount(playerB, "Control Magic", 1); + + assertGraveyardCount(playerA, "Kozilek, Butcher of Truth", 0); + + assertHandCount(playerA, "Kozilek, Butcher of Truth", 0); + assertGraveyardCount(playerA, "Silvercoat Lion", 0); + + assertGraveyardCount(playerA, "Unholy Hunger", 0); + + assertHandCount(playerA, 4); + + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 26e68f09440..bc7f74a40f4 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -858,7 +858,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement } } - Assert.assertEquals("(Graveyard) Card counts are not equal (" + cardName + ")", count, actualCount); + Assert.assertEquals("(Graveyard " + player.getName() + ") Card counts are not equal (" + cardName + ")", count, actualCount); } /** diff --git a/Mage/src/mage/abilities/effects/common/ShuffleIntoLibraryGraveOfSourceOwnerEffect.java b/Mage/src/mage/abilities/effects/common/ShuffleIntoLibraryGraveOfSourceOwnerEffect.java new file mode 100644 index 00000000000..149117f39f0 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/ShuffleIntoLibraryGraveOfSourceOwnerEffect.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.abilities.effects.common; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class ShuffleIntoLibraryGraveOfSourceOwnerEffect extends OneShotEffect { + + public ShuffleIntoLibraryGraveOfSourceOwnerEffect() { + super(Outcome.Benefit); + staticText = "its owner shuffles his or her graveyard into his or her library"; + } + + public ShuffleIntoLibraryGraveOfSourceOwnerEffect(final ShuffleIntoLibraryGraveOfSourceOwnerEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + UUID ownerId = game.getOwnerId(source.getSourceId()); + if (ownerId == null) { + return false; + } + Player owner = game.getPlayer(ownerId); + if (owner != null) { + owner.moveCards(owner.getGraveyard(), null, Zone.LIBRARY, source, game); + owner.shuffleLibrary(game); + return true; + } + return false; + } + + @Override + public ShuffleIntoLibraryGraveOfSourceOwnerEffect copy() { + return new ShuffleIntoLibraryGraveOfSourceOwnerEffect(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/turn/AddExtraTurnControllerEffect.java b/Mage/src/mage/abilities/effects/common/turn/AddExtraTurnControllerEffect.java index 9b08d1d3618..82ada6f9893 100644 --- a/Mage/src/mage/abilities/effects/common/turn/AddExtraTurnControllerEffect.java +++ b/Mage/src/mage/abilities/effects/common/turn/AddExtraTurnControllerEffect.java @@ -1,30 +1,30 @@ /* -* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without modification, are -* permitted provided that the following conditions are met: -* -* 1. Redistributions of source code must retain the above copyright notice, this list of -* conditions and the following disclaimer. -* -* 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 -* provided with the distribution. -* -* 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 -* 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 -* 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 -* 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 -* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -* 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 -* or implied, of BetaSteward_at_googlemail.com. -*/ + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ package mage.abilities.effects.common.turn; import java.util.UUID; @@ -54,8 +54,8 @@ public class AddExtraTurnControllerEffect extends OneShotEffect { public AddExtraTurnControllerEffect(boolean loseGameAtEnd) { super(loseGameAtEnd ? Outcome.AIDontUseIt : Outcome.ExtraTurn); this.loseGameAtEnd = loseGameAtEnd; - staticText = "Take an extra turn after this one"; - if(loseGameAtEnd) { + staticText = "take an extra turn after this one"; + if (loseGameAtEnd) { staticText += ". At the beginning of that turn's end step, you lose the game"; } } @@ -76,7 +76,7 @@ public class AddExtraTurnControllerEffect extends OneShotEffect { if (player != null) { TurnMod extraTurn = new TurnMod(player.getId(), false); game.getState().getTurnMods().add(extraTurn); - if(loseGameAtEnd) { + if (loseGameAtEnd) { LoseGameDelayedTriggeredAbility delayedTriggeredAbility = new LoseGameDelayedTriggeredAbility(); delayedTriggeredAbility.setSourceId(source.getSourceId()); delayedTriggeredAbility.setControllerId(source.getControllerId()); From b6f6866452e68ba6258dba8d846665f11e40dc36 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 27 Sep 2015 00:34:10 +0200 Subject: [PATCH 34/42] * Krond the Dawn-Clad - Added the missing vigilance ability. --- .../sets/planechase2012/KrondTheDawnClad.java | 11 +++++----- .../src/mage/sets/zendikar/SpreadingSeas.java | 20 +++++++++---------- .../BecomesBasicLandEnchantedEffect.java | 14 +++---------- 3 files changed, 19 insertions(+), 26 deletions(-) diff --git a/Mage.Sets/src/mage/sets/planechase2012/KrondTheDawnClad.java b/Mage.Sets/src/mage/sets/planechase2012/KrondTheDawnClad.java index a42a96ec85f..75c25f891d0 100644 --- a/Mage.Sets/src/mage/sets/planechase2012/KrondTheDawnClad.java +++ b/Mage.Sets/src/mage/sets/planechase2012/KrondTheDawnClad.java @@ -28,8 +28,6 @@ package mage.sets.planechase2012; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; @@ -37,7 +35,10 @@ import mage.abilities.condition.common.EnchantedCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.target.TargetPermanent; /** @@ -52,18 +53,18 @@ public class KrondTheDawnClad extends CardImpl { this.supertype.add("Legendary"); this.subtype.add("Archon"); - this.power = new MageInt(6); this.toughness = new MageInt(6); - // Flying + // Flying, vigilance this.addAbility(FlyingAbility.getInstance()); + this.addAbility(VigilanceAbility.getInstance()); // Whenever Krond the Dawn-Clad attacks, if it's enchanted, exile target permanent. Ability ability = new ConditionalTriggeredAbility( new AttacksTriggeredAbility(new ExileTargetEffect(), false), new EnchantedCondition(), - "Whenever Krond the Dawn-Clad attacks, if it's enchanted, exile target permanent."); + "Whenever {this} attacks, if it's enchanted, exile target permanent."); ability.addTarget(new TargetPermanent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/zendikar/SpreadingSeas.java b/Mage.Sets/src/mage/sets/zendikar/SpreadingSeas.java index 7b75921e09f..ab0741a212c 100644 --- a/Mage.Sets/src/mage/sets/zendikar/SpreadingSeas.java +++ b/Mage.Sets/src/mage/sets/zendikar/SpreadingSeas.java @@ -1,16 +1,16 @@ /* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 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 * provided with the distribution. - * + * * 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 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR @@ -20,19 +20,14 @@ * 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 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * 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 * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.zendikar; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -41,6 +36,10 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.BecomesBasicLandEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.target.TargetPermanent; import mage.target.common.TargetLandPermanent; @@ -61,6 +60,7 @@ public class SpreadingSeas extends CardImpl { this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false)); // Enchanted land is an Island. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BecomesBasicLandEnchantedEffect("Island"))); diff --git a/Mage/src/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java b/Mage/src/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java index 068fee171e2..41f4c112c21 100644 --- a/Mage/src/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java +++ b/Mage/src/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java @@ -25,12 +25,10 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects.common.continuous; import java.util.ArrayList; import java.util.Arrays; -import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.mana.BlackManaAbility; @@ -46,12 +44,6 @@ import mage.constants.SubLayer; import mage.game.Game; import mage.game.permanent.Permanent; -/** - * - * @author LevelX2 - */ - - public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { protected ArrayList landTypes = new ArrayList<>(); @@ -93,7 +85,7 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { break; case AbilityAddingRemovingEffects_6: permanent.removeAllAbilities(source.getSourceId(), game); - for (String landType : landTypes) { + for (String landType : landTypes) { switch (landType) { case "Swamp": permanent.addAbility(new BlackManaAbility(), source.getSourceId(), game); @@ -134,8 +126,8 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { private String setText() { StringBuilder sb = new StringBuilder("Enchanted land is a "); int i = 1; - for (String landType : landTypes) { - if (i >1) { + for (String landType : landTypes) { + if (i > 1) { if (i == landTypes.size()) { sb.append(" and "); } else { From f22fb380b787014cfaf1b2dae4304bc24ac489a1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 27 Sep 2015 01:21:47 +0200 Subject: [PATCH 35/42] * Reaper of Sheoldred - Fixed that damage was sometimes dealt to Reaper of Sheoldred controller. --- .../src/mage/sets/magic2015/ChasmSkulker.java | 5 +- .../sets/newphyrexia/ReaperOfSheoldred.java | 17 ++++- .../cards/triggers/DrawTriggeredTest.java | 71 +++++++++++++++++++ 3 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/triggers/DrawTriggeredTest.java diff --git a/Mage.Sets/src/mage/sets/magic2015/ChasmSkulker.java b/Mage.Sets/src/mage/sets/magic2015/ChasmSkulker.java index 874f933c5a9..b8af72b4240 100644 --- a/Mage.Sets/src/mage/sets/magic2015/ChasmSkulker.java +++ b/Mage.Sets/src/mage/sets/magic2015/ChasmSkulker.java @@ -29,7 +29,6 @@ package mage.sets.magic2015; import java.util.UUID; import mage.MageInt; -import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.common.DrawCardControllerTriggeredAbility; @@ -65,7 +64,7 @@ public class ChasmSkulker extends CardImpl { // Whenever you draw a card, put a +1/+1 counter on Chasm Skulker. this.addAbility(new DrawCardControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false)); - + // When Chasm Skulker dies, put X 1/1 blue Squid creature tokens with islandwalk onto the battlefield, where X is the number of +1/+1 counters on Chasm Skulker. this.addAbility(new DiesTriggeredAbility(new ChasmSkulkerEffect(), false)); } @@ -127,4 +126,4 @@ class ChasmSkulkerSquidToken extends Token { this.addAbility(new IslandwalkAbility()); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/newphyrexia/ReaperOfSheoldred.java b/Mage.Sets/src/mage/sets/newphyrexia/ReaperOfSheoldred.java index c8da60dba23..5e9a8469cf7 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/ReaperOfSheoldred.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/ReaperOfSheoldred.java @@ -41,6 +41,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; +import mage.players.Player; import mage.target.targetpointer.FixedTarget; /** @@ -57,7 +58,10 @@ public class ReaperOfSheoldred extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(5); + // Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) this.addAbility(InfectAbility.getInstance()); + + // Whenever a source deals damage to Reaper of Sheoldred, that source's controller gets a poison counter. this.addAbility(new ReaperOfSheoldredTriggeredAbility()); } @@ -72,6 +76,7 @@ public class ReaperOfSheoldred extends CardImpl { } class ReaperOfSheoldredTriggeredAbility extends TriggeredAbilityImpl { + ReaperOfSheoldredTriggeredAbility() { super(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.POISON.createInstance())); } @@ -93,10 +98,16 @@ class ReaperOfSheoldredTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getTargetId().equals(this.getSourceId())) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getPlayerId())); + UUID controller = game.getControllerId(event.getSourceId()); + if (controller != null) { + Player player = game.getPlayer(controller); + if (player != null) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(player.getId())); + } + return true; + } } - return true; } return false; } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/DrawTriggeredTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/DrawTriggeredTest.java new file mode 100644 index 00000000000..38bed27ca82 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/DrawTriggeredTest.java @@ -0,0 +1,71 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.triggers; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class DrawTriggeredTest extends CardTestPlayerBase { + + /* + * Day's Undoing - Doesn't create card draw triggers "Specifically, it + * doesn't work with Chasm Skulker. + * + * Steps to reproduce: + 1) Have Chasm Skulker on the battlefield. + 2) Cast Day's Undoing. + 3) You will draw 7 cards, but Chasm Skulker's ""when you draw a card"" trigger does not trigger." ==> What is correct + */ + @Test + public void DaysUndoingTriggeredDrewEventAreRemovedTest() { + // Each player shuffles his or her hand and graveyard into his or her library, then draws seven cards. If it's your turn, end the turn. + addCard(Zone.HAND, playerA, "Day's Undoing"); + addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + + // Whenever you draw a card, put a +1/+1 counter on Chasm Skulker. + // When Chasm Skulker dies, put X 1/1 blue Squid creature tokens with islandwalk onto the battlefield, where X is the number of +1/+1 counters on Chasm Skulker. + addCard(Zone.BATTLEFIELD, playerB, "Chasm Skulker", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Day's Undoing"); + + setStopAt(2, PhaseStep.UNTAP); + execute(); + + assertExileCount("Day's Undoing", 1); + assertPermanentCount(playerB, "Chasm Skulker", 1); + assertPowerToughness(playerB, "Chasm Skulker", 1, 1); + + } + +} From 9e1111748d7bbaee4f5e3e435362f5bd7ec11511 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 27 Sep 2015 09:23:40 +0200 Subject: [PATCH 36/42] * Enslave - Fixed that the set source of the damge was wrong. --- .../mirrodinbesieged/CorruptedConscience.java | 17 +++++--- .../src/mage/sets/newphyrexia/Enslave.java | 26 +++++++---- .../newphyrexia/PhyrexianObliterator.java | 4 ++ .../cards/abilities/keywords/InfectTest.java | 43 +++++++++++++++++++ 4 files changed, 76 insertions(+), 14 deletions(-) diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/CorruptedConscience.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/CorruptedConscience.java index 74adb82e243..c26e3cff44c 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/CorruptedConscience.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/CorruptedConscience.java @@ -25,12 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.mirrodinbesieged; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.AttachEffect; @@ -39,6 +36,11 @@ import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.InfectAbility; import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -48,21 +50,26 @@ import mage.target.common.TargetCreaturePermanent; */ public class CorruptedConscience extends CardImpl { - public CorruptedConscience (UUID ownerId) { + public CorruptedConscience(UUID ownerId) { super(ownerId, 22, "Corrupted Conscience", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}{U}"); this.expansionSetCode = "MBS"; this.subtype.add("Aura"); + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + + // You control enchanted creature. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ControlEnchantedEffect())); + + // Enchanted creature has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(InfectAbility.getInstance(), AttachmentType.AURA))); } - public CorruptedConscience (final CorruptedConscience card) { + public CorruptedConscience(final CorruptedConscience card) { super(card); } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/Enslave.java b/Mage.Sets/src/mage/sets/newphyrexia/Enslave.java index d158331c83f..b9bd7826273 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/Enslave.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/Enslave.java @@ -25,12 +25,9 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.newphyrexia; import java.util.UUID; - -import mage.constants.*; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -39,6 +36,11 @@ import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.ControlEnchantedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -51,21 +53,26 @@ import mage.target.common.TargetCreaturePermanent; */ public class Enslave extends CardImpl { - public Enslave (UUID ownerId) { + public Enslave(UUID ownerId) { super(ownerId, 58, "Enslave", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{4}{B}{B}"); this.expansionSetCode = "NPH"; this.subtype.add("Aura"); + // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + + // You control enchanted creature. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ControlEnchantedEffect())); + + // At the beginning of your upkeep, enchanted creature deals 1 damage to its owner. this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new EnslaveEffect(), TargetController.YOU, false, false)); } - public Enslave (final Enslave card) { + public Enslave(final Enslave card) { super(card); } @@ -77,6 +84,7 @@ public class Enslave extends CardImpl { } class EnslaveEffect extends OneShotEffect { + EnslaveEffect() { super(Outcome.Damage); staticText = "enchanted creature deals 1 damage to its owner"; @@ -88,13 +96,13 @@ class EnslaveEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (sourcePermanent != null) { - Permanent attached = game.getPermanent(sourcePermanent.getAttachedTo()); + Permanent attached = game.getPermanentOrLKIBattlefield(sourcePermanent.getAttachedTo()); if (attached != null) { Player owner = game.getPlayer(attached.getOwnerId()); if (owner != null) { - owner.damage(1, source.getSourceId(), game, false, true); + owner.damage(1, attached.getId(), game, false, true); return true; } } @@ -108,4 +116,4 @@ class EnslaveEffect extends OneShotEffect { return new EnslaveEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/newphyrexia/PhyrexianObliterator.java b/Mage.Sets/src/mage/sets/newphyrexia/PhyrexianObliterator.java index 5811c99d20a..16b0136dbda 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/PhyrexianObliterator.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/PhyrexianObliterator.java @@ -58,7 +58,10 @@ public class PhyrexianObliterator extends CardImpl { this.power = new MageInt(5); this.toughness = new MageInt(5); + // Trample this.addAbility(TrampleAbility.getInstance()); + + // Whenever a source deals damage to Phyrexian Obliterator, that source's controller sacrifices that many permanents. this.addAbility(new PhyrexianObliteratorTriggeredAbility()); } @@ -73,6 +76,7 @@ public class PhyrexianObliterator extends CardImpl { } class PhyrexianObliteratorTriggeredAbility extends TriggeredAbilityImpl { + PhyrexianObliteratorTriggeredAbility() { super(Zone.BATTLEFIELD, new SacrificeEffect(new FilterPermanent(), 0, "")); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InfectTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InfectTest.java index d1f5ab38482..c404d825452 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InfectTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InfectTest.java @@ -27,6 +27,7 @@ */ package org.mage.test.cards.abilities.keywords; +import mage.abilities.keyword.InfectAbility; import mage.constants.PhaseStep; import mage.constants.Zone; import mage.counters.CounterType; @@ -126,4 +127,46 @@ public class InfectTest extends CardTestPlayerBase { } + /** + * Phyrexian Obliterator is enchanted with Corrupted Conscience and Enslave + * + * on upkeep Phyrexian Obliterator does 1 damage to its owner but this + * damage was NOT infect damage and it should have been + */ + @Test + public void GainedInfectByEnchantment() { + // Trample + // Whenever a source deals damage to Phyrexian Obliterator, that source's controller sacrifices that many permanents. + addCard(Zone.BATTLEFIELD, playerB, "Phyrexian Obliterator"); + + // Enchant creature + // You control enchanted creature. + // Enchanted creature has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) + addCard(Zone.HAND, playerA, "Corrupted Conscience"); // Enchantment {3}{U}{U} + // Enchant creature + // You control enchanted creature. + // At the beginning of your upkeep, enchanted creature deals 1 damage to its owner. + addCard(Zone.HAND, playerA, "Enslave"); // Enchantment {4}{B}{B} + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 9); + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Corrupted Conscience", "Phyrexian Obliterator"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enslave", "Phyrexian Obliterator"); + + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Phyrexian Obliterator", 1); + assertPermanentCount(playerA, "Corrupted Conscience", 1); + assertPermanentCount(playerA, "Enslave", 1); + + assertAbility(playerA, "Phyrexian Obliterator", InfectAbility.getInstance(), true); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + assertCounterCount(playerB, CounterType.POISON, 1); + + } + } From 7650f53dee0b4d480d2a63befed72b6c8197e752 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 27 Sep 2015 10:29:30 +0200 Subject: [PATCH 37/42] * Rosheen Meanderer - Fixed that the created conditional mana could only be used for spells. --- .../sets/shadowmoor/RosheenMeanderer.java | 19 ++++-- .../test/cards/mana/ConditionalManaTest.java | 65 +++++++++++++++---- .../mage/cards/repository/CardRepository.java | 2 +- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/Mage.Sets/src/mage/sets/shadowmoor/RosheenMeanderer.java b/Mage.Sets/src/mage/sets/shadowmoor/RosheenMeanderer.java index 80bc63dda1a..6907063e21f 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/RosheenMeanderer.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/RosheenMeanderer.java @@ -37,6 +37,7 @@ import mage.abilities.condition.Condition; import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.mana.BasicManaAbility; import mage.cards.CardImpl; +import mage.constants.AbilityType; import mage.constants.CardType; import mage.constants.Rarity; import mage.game.Game; @@ -56,9 +57,9 @@ public class RosheenMeanderer extends CardImpl { this.power = new MageInt(4); this.toughness = new MageInt(4); - // {tap}: Add {4} to your mana pool. Spend this mana only on costs that contain {X}. + // {T}: Add {4} to your mana pool. Spend this mana only on costs that contain {X}. this.addAbility(new RosheenMeandererManaAbility()); - + } public RosheenMeanderer(final RosheenMeanderer card) { @@ -75,7 +76,7 @@ class RosheenMeandererManaAbility extends BasicManaAbility { RosheenMeandererManaAbility() { super(new BasicManaEffect(new RosheenMeandererConditionalMana())); - this.netMana.add(new Mana(0,0,0,0,0,4,0)); + this.netMana.add(new Mana(0, 0, 0, 0, 0, 4, 0)); } RosheenMeandererManaAbility(RosheenMeandererManaAbility ability) { @@ -98,10 +99,16 @@ class RosheenMeandererConditionalMana extends ConditionalMana { } class RosheenMeandererManaCondition implements Condition { + @Override public boolean apply(Game game, Ability source) { - MageObject object = game.getObject(source.getSourceId()); - return object != null - && object.getManaCost().getText().contains("X"); + if (AbilityType.SPELL.equals(source.getAbilityType())) { + MageObject object = game.getObject(source.getSourceId()); + return object != null + && object.getManaCost().getText().contains("X"); + + } else { + return source.getManaCosts().getText().contains("X"); + } } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ConditionalManaTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ConditionalManaTest.java index d7a9ca20297..80560b23bec 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ConditionalManaTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ConditionalManaTest.java @@ -36,7 +36,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author LevelX2 */ - public class ConditionalManaTest extends CardTestPlayerBase { @Test @@ -47,11 +46,11 @@ public class ConditionalManaTest extends CardTestPlayerBase { // Target player gains 7 life. addCard(Zone.HAND, playerA, "Heroes' Reunion", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Heroes' Reunion", playerA); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Heroes' Reunion", playerA); + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - + assertGraveyardCount(playerA, "Heroes' Reunion", 1); assertHandCount(playerA, "Heroes' Reunion", 0); // player A could not cast it assertLife(playerA, 27); @@ -63,16 +62,16 @@ public class ConditionalManaTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Pillar of the Paruns", 2); addCard(Zone.HAND, playerA, "Silvercoat Lion", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion"); playerA.addChoice("White"); playerA.addChoice("White"); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertHandCount(playerA, "Silvercoat Lion", 1); // player A could not cast Silvercoat Lion because the conditional mana is not available } - + @Test public void testWorkingWithReflectingPool() { addCard(Zone.BATTLEFIELD, playerA, "Cavern of Souls", 1); @@ -80,13 +79,13 @@ public class ConditionalManaTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Silvercoat Lion", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion"); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerA, "Silvercoat Lion", 1); } - + @Test public void testWorkingWithReflectingPool2() { addCard(Zone.BATTLEFIELD, playerA, "Reflecting Pool", 1); // can create white mana without restriction from the Hive @@ -98,10 +97,48 @@ public class ConditionalManaTest extends CardTestPlayerBase { setChoice(playerA, "White"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion"); - + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - - assertPermanentCount(playerA, "Silvercoat Lion", 1); - } + + assertPermanentCount(playerA, "Silvercoat Lion", 1); + } + + /** + * I wasunable to use "Rosheen Meanderer" ability to pay for "Candelabra of + * Tawnos" ability even thought it has "X" on its cost + */ + @Test + public void testRosheenMeandererUsingAbility() { + // Flying + addCard(Zone.HAND, playerB, "Snapping Drake", 2); // {3}{U} + // {T}: Add {4} to your mana pool. Spend this mana only on costs that contain {X}. + addCard(Zone.BATTLEFIELD, playerB, "Rosheen Meanderer", 1); + // {X}, {T}: Untap X target lands. + addCard(Zone.BATTLEFIELD, playerB, "Candelabra of Tawnos", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Island", 4); + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Snapping Drake"); + + activateManaAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "{T}: Add {4}"); + + activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "{X},{T}: Untap"); + setChoice(playerB, "X=4"); + addTarget(playerB, "Island"); + addTarget(playerB, "Island"); + addTarget(playerB, "Island"); + addTarget(playerB, "Island"); + + castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Snapping Drake"); + + setStopAt(2, PhaseStep.END_TURN); + execute(); + + assertTappedCount("Island", true, 4); + assertTappedCount("Rosheen Meanderer", true, 1); + assertTappedCount("Candelabra of Tawnos", true, 1); + + assertPermanentCount(playerB, "Snapping Drake", 2); + } } diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java index bb949267611..8a709d93107 100644 --- a/Mage/src/mage/cards/repository/CardRepository.java +++ b/Mage/src/mage/cards/repository/CardRepository.java @@ -63,7 +63,7 @@ public enum CardRepository { // raise this if db structure was changed private static final long CARD_DB_VERSION = 41; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 38; + private static final long CARD_CONTENT_VERSION = 39; private final Random random = new Random(); private Dao cardDao; From 0b235599494cf8be41a9c34c96a991e94297f7a3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 27 Sep 2015 10:54:02 +0200 Subject: [PATCH 38/42] Xmage 1.4.4v6 --- Mage.Common/src/mage/utils/MageVersion.java | 2 +- Utils/release/getting_implemented_cards.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Mage.Common/src/mage/utils/MageVersion.java b/Mage.Common/src/mage/utils/MageVersion.java index b1adde18b0b..e2c6830fcaf 100644 --- a/Mage.Common/src/mage/utils/MageVersion.java +++ b/Mage.Common/src/mage/utils/MageVersion.java @@ -41,7 +41,7 @@ public class MageVersion implements Serializable, Comparable { public final static int MAGE_VERSION_MAJOR = 1; public final static int MAGE_VERSION_MINOR = 4; public final static int MAGE_VERSION_PATCH = 4; - public final static String MAGE_VERSION_MINOR_PATCH = "v4"; + public final static String MAGE_VERSION_MINOR_PATCH = "v6"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Utils/release/getting_implemented_cards.txt b/Utils/release/getting_implemented_cards.txt index a8e576fdfed..3a42aba4874 100644 --- a/Utils/release/getting_implemented_cards.txt +++ b/Utils/release/getting_implemented_cards.txt @@ -30,6 +30,9 @@ git log 3d8494edb5c0fddcb972758f7d983b8b66a9651e..head --diff-filter=A --name-st since 1.4.4.v4 git log 513a574ae98aff3d7820e5411a8e5f2a6506e69c..head --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt +since 1.4.4.v6 +git log 7650f53dee0b4d480d2a63befed72b6c8197e752..head --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt + 3. Copy added_cards.txt to trunk\Utils folder 4. Run script: > perl extract_in_wiki_format.perl From 23cd772fea79957a246da1c933fe7cd856ba4f48 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 27 Sep 2015 14:11:56 +0200 Subject: [PATCH 39/42] * Fixed that using a previous internal avatar ID did create an exception while playing/watching a game. --- .../src/main/java/mage/client/game/PlayerPanelExt.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java index 31416d85e6e..1fd4c05df91 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java @@ -64,6 +64,8 @@ import mage.client.components.MageRoundPane; import mage.client.components.ext.dlg.DialogManager; import mage.client.dialog.PreferencesDialog; import static mage.client.dialog.PreferencesDialog.DEFAULT_AVATAR_ID; +import static mage.client.dialog.PreferencesDialog.MAX_AVATAR_ID; +import static mage.client.dialog.PreferencesDialog.MIN_AVATAR_ID; import mage.client.util.CardsViewUtil; import mage.client.util.Command; import mage.client.util.ImageHelper; @@ -239,7 +241,7 @@ public class PlayerPanelExt extends javax.swing.JPanel { if (!MageFrame.isLite()) { int id = player.getUserData().getAvatarId(); - if (id <= 0) { + if (id <= 0 || !(id >= 1000) || (id <= MIN_AVATAR_ID && id > MAX_AVATAR_ID)) { id = PreferencesDialog.DEFAULT_AVATAR_ID; } if (id != avatarId) { From b95d7ca705819698677fecc6620b5c45bb098388 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 27 Sep 2015 14:50:44 +0200 Subject: [PATCH 40/42] * Fixed some problems with new avatar handling. --- Mage.Client/serverlist.txt | 1 - .../mage/client/dialog/PreferencesDialog.java | 6 +++--- .../java/mage/client/game/PlayerPanelExt.java | 10 +++++----- Mage.Common/src/mage/constants/Constants.java | 4 ++++ Mage.Common/src/mage/utils/MageVersion.java | 2 +- .../src/main/java/mage/server/Session.java | 15 ++++++--------- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Mage.Client/serverlist.txt b/Mage.Client/serverlist.txt index eb5c37cbcb4..db223b403ff 100644 --- a/Mage.Client/serverlist.txt +++ b/Mage.Client/serverlist.txt @@ -2,6 +2,5 @@ XMage.de 1 (Europe/Germany) fast :xmage.de:17171 woogerworks (North America/USA) :xmage.woogerworks.info:17171 XMage.info 1 (Europe/France) new network code -> see forum :176.31.186.181:17171 XMage BR (South America/Brazil) :ec2-54-233-67-0.sa-east-1.compute.amazonaws.com:17171 -IceMage (Europe/Netherlands) :ring0.cc:17171 Seedds Server (Asia) :115.29.203.80:17171 localhost -> connect to your local server (must be started):localhost:17171 diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index dde646aff4d..c8f314e4a80 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -61,6 +61,9 @@ import mage.client.MageFrame; import mage.client.util.Config; import mage.client.util.ImageHelper; import mage.client.util.gui.BufferedImageBuilder; +import static mage.constants.Constants.DEFAULT_AVATAR_ID; +import static mage.constants.Constants.MAX_AVATAR_ID; +import static mage.constants.Constants.MIN_AVATAR_ID; import mage.players.net.UserData; import mage.players.net.UserGroup; import mage.players.net.UserSkipPrioritySteps; @@ -262,9 +265,6 @@ public class PreferencesDialog extends javax.swing.JDialog { public static String PHASE_ON = "on"; public static String PHASE_OFF = "off"; - public static final int MIN_AVATAR_ID = 10; - public static final int MAX_AVATAR_ID = 32; - public static final int DEFAULT_AVATAR_ID = 10; private static final Map panels = new HashMap<>(); private static final Border GREEN_BORDER = BorderFactory.createLineBorder(Color.GREEN, 3); diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java index 1fd4c05df91..ff350409715 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java @@ -63,15 +63,15 @@ import mage.client.components.HoverButton; import mage.client.components.MageRoundPane; import mage.client.components.ext.dlg.DialogManager; import mage.client.dialog.PreferencesDialog; -import static mage.client.dialog.PreferencesDialog.DEFAULT_AVATAR_ID; -import static mage.client.dialog.PreferencesDialog.MAX_AVATAR_ID; -import static mage.client.dialog.PreferencesDialog.MIN_AVATAR_ID; import mage.client.util.CardsViewUtil; import mage.client.util.Command; import mage.client.util.ImageHelper; import mage.client.util.gui.BufferedImageBuilder; import mage.client.util.gui.countryBox.CountryUtil; import mage.components.ImagePanel; +import static mage.constants.Constants.DEFAULT_AVATAR_ID; +import static mage.constants.Constants.MAX_AVATAR_ID; +import static mage.constants.Constants.MIN_AVATAR_ID; import mage.constants.ManaType; import mage.remote.Session; import mage.utils.timer.PriorityTimer; @@ -241,8 +241,8 @@ public class PlayerPanelExt extends javax.swing.JPanel { if (!MageFrame.isLite()) { int id = player.getUserData().getAvatarId(); - if (id <= 0 || !(id >= 1000) || (id <= MIN_AVATAR_ID && id > MAX_AVATAR_ID)) { - id = PreferencesDialog.DEFAULT_AVATAR_ID; + if (!(id >= 1000) && (id <= 0 || (id <= MIN_AVATAR_ID && id > MAX_AVATAR_ID))) { + id = DEFAULT_AVATAR_ID; } if (id != avatarId) { avatarId = id; diff --git a/Mage.Common/src/mage/constants/Constants.java b/Mage.Common/src/mage/constants/Constants.java index 965346f2819..fd8bf95052c 100644 --- a/Mage.Common/src/mage/constants/Constants.java +++ b/Mage.Common/src/mage/constants/Constants.java @@ -67,6 +67,10 @@ public final class Constants { public static final double SCALE_FACTOR = 0.5; + public static final int MIN_AVATAR_ID = 10; + public static final int MAX_AVATAR_ID = 32; + public static final int DEFAULT_AVATAR_ID = 10; + /** * Time each player has during the game to play using his\her priority. */ diff --git a/Mage.Common/src/mage/utils/MageVersion.java b/Mage.Common/src/mage/utils/MageVersion.java index e2c6830fcaf..c28ce7ebc7b 100644 --- a/Mage.Common/src/mage/utils/MageVersion.java +++ b/Mage.Common/src/mage/utils/MageVersion.java @@ -41,7 +41,7 @@ public class MageVersion implements Serializable, Comparable { public final static int MAGE_VERSION_MAJOR = 1; public final static int MAGE_VERSION_MINOR = 4; public final static int MAGE_VERSION_PATCH = 4; - public final static String MAGE_VERSION_MINOR_PATCH = "v6"; + public final static String MAGE_VERSION_MINOR_PATCH = "v7"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Mage.Server/src/main/java/mage/server/Session.java b/Mage.Server/src/main/java/mage/server/Session.java index ad5c8c0a913..16b1da7e510 100644 --- a/Mage.Server/src/main/java/mage/server/Session.java +++ b/Mage.Server/src/main/java/mage/server/Session.java @@ -36,6 +36,7 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.regex.Matcher; import java.util.regex.Pattern; import mage.MageException; +import mage.constants.Constants; import mage.interfaces.callback.ClientCallback; import mage.players.net.UserData; import mage.players.net.UserGroup; @@ -157,6 +158,10 @@ public class Session { } else { user.getUserData().update(userData); } + if (user.getUserData().getAvatarId() < Constants.MIN_AVATAR_ID + || user.getUserData().getAvatarId() > Constants.MAX_AVATAR_ID) { + user.getUserData().setAvatarId(Constants.DEFAULT_AVATAR_ID); + } if (user.getUserData().getAvatarId() == 11) { user.getUserData().setAvatarId(updateAvatar(user.getName())); } @@ -169,24 +174,16 @@ public class Session { //TODO: move to separate class //TODO: add for checking for private key switch (userName) { - case "nantuko": - return 1000; case "North": return 1006; case "BetaSteward": return 1008; - case "loki": - return 1012; - case "Ayrat": - return 1018; case "Bandit": return 1020; case "fireshoes": return 1021; - case "Wehk": - return 66; } - return 51; + return 11; } public String getId() { From 0680560225ab679687a245dbf6dfc74a9ca967c0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 28 Sep 2015 15:14:50 +0200 Subject: [PATCH 41/42] * Compost - Fixed that it triggered for all cards going to opponents graveyard (instead of only black cards). --- .../mage/sets/darksteel/SunderingTitan.java | 15 ++-- .../src/mage/sets/seventhedition/Compost.java | 3 +- .../triggers/dies/SunderingTitanTest.java | 71 +++++++++++++++++++ 3 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SunderingTitanTest.java diff --git a/Mage.Sets/src/mage/sets/darksteel/SunderingTitan.java b/Mage.Sets/src/mage/sets/darksteel/SunderingTitan.java index 40e1cc019e2..bf12c5dd792 100644 --- a/Mage.Sets/src/mage/sets/darksteel/SunderingTitan.java +++ b/Mage.Sets/src/mage/sets/darksteel/SunderingTitan.java @@ -32,9 +32,7 @@ import java.util.Set; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersOrLeavesTheBattlefieldSourceTriggeredAbility; -import mage.abilities.common.LeavesBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.constants.CardType; @@ -98,19 +96,18 @@ class SunderingTitanDestroyLandEffect extends OneShotEffect { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); Set lands = new HashSet<>(); if (controller != null && sourcePermanent != null) { - for (String landName : new String[] {"Forest","Island","Mountain","Plains","Swamp"}) { - FilterLandPermanent filter = new FilterLandPermanent(new StringBuilder(landName).append(" to destroy").toString()); + for (String landName : new String[]{"Forest", "Island", "Mountain", "Plains", "Swamp"}) { + FilterLandPermanent filter = new FilterLandPermanent(landName + " to destroy"); filter.add(new SubtypePredicate(landName)); - Target target = new TargetLandPermanent(1,1, filter, true); + Target target = new TargetLandPermanent(1, 1, filter, true); if (target.canChoose(source.getSourceId(), source.getControllerId(), game)) { controller.chooseTarget(outcome, target, source, game); lands.add(target.getFirstTarget()); } - } if (!lands.isEmpty()) { int destroyedLands = 0; - for (UUID landId: lands) { + for (UUID landId : lands) { Permanent land = game.getPermanent(landId); if (land != null) { if (land.destroy(source.getSourceId(), game, false)) { @@ -118,9 +115,9 @@ class SunderingTitanDestroyLandEffect extends OneShotEffect { } } } - game.informPlayers(new StringBuilder(sourcePermanent.getName()).append(": ").append(destroyedLands).append(destroyedLands > 1 ? " lands were destroyed":"land was destroyed").toString()); + game.informPlayers(sourcePermanent.getLogName() + ": " + destroyedLands + (destroyedLands > 1 ? " lands were" : "land was") + " destroyed"); } - + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/seventhedition/Compost.java b/Mage.Sets/src/mage/sets/seventhedition/Compost.java index 2b1b44ee3c8..feaf9284a64 100644 --- a/Mage.Sets/src/mage/sets/seventhedition/Compost.java +++ b/Mage.Sets/src/mage/sets/seventhedition/Compost.java @@ -54,10 +54,9 @@ public class Compost extends CardImpl { super(ownerId, 235, "Compost", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); this.expansionSetCode = "7ED"; - // Whenever a black card is put into an opponent's graveyard from anywhere, you may draw a card. this.addAbility(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( - new DrawCardSourceControllerEffect(1), true, TargetController.OPPONENT)); + new DrawCardSourceControllerEffect(1), true, filter, TargetController.OPPONENT)); } public Compost(final Compost card) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SunderingTitanTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SunderingTitanTest.java new file mode 100644 index 00000000000..325257cf28c --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/dies/SunderingTitanTest.java @@ -0,0 +1,71 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 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 + * provided with the distribution. + * + * 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 + * 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 + * 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 + * 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 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.triggers.dies; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class SunderingTitanTest extends CardTestPlayerBase { + + /** + * the card Sundering Titan doesn't trigger for the aposing player + * + */ + @Test + public void testComesIntoTriggeredAbility() { + // // When Sundering Titan enters the battlefield or leaves the battlefield, choose a land of each basic land type, then destroy those lands. + addCard(Zone.HAND, playerA, "Sundering Titan"); // {8} + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2); + addCard(Zone.BATTLEFIELD, playerB, "Plains", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sundering Titan"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Sundering Titan", 1); + assertGraveyardCount(playerA, "Swamp", 1); + assertGraveyardCount(playerA, "Forest", 1); + assertGraveyardCount(playerA, "Island", 1); + + assertGraveyardCount(playerB, "Mountain", 1); + assertGraveyardCount(playerB, "Plains", 1); + + } + +} From 6cc2ac0e707f73d63338811c49cac264660c66ed Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 28 Sep 2015 19:27:51 +0200 Subject: [PATCH 42/42] * Zada, Hedron Grinder - Fixed a bug with checking and copying modal spells. --- .../battleforzendikar/ZadaHedronGrinder.java | 42 +++++++++----- .../mage/test/cards/copy/CopySpellTest.java | 58 +++++++++++++++++++ 2 files changed, 85 insertions(+), 15 deletions(-) diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ZadaHedronGrinder.java b/Mage.Sets/src/mage/sets/battleforzendikar/ZadaHedronGrinder.java index 2e2648a2024..e34ac40666b 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/ZadaHedronGrinder.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/ZadaHedronGrinder.java @@ -102,12 +102,15 @@ class ZadaHedronGrinderTriggeredAbility extends TriggeredAbilityImpl { Spell spell = game.getStack().getSpell(event.getTargetId()); if (isControlledInstantOrSorcery(spell)) { boolean targetsSource = false; - for (Target target : spell.getSpellAbility().getTargets()) { - for (UUID targetId : target.getTargets()) { - if (targetId.equals(getSourceId())) { - targetsSource = true; - } else { - return false; + for (UUID modeId : spell.getSpellAbility().getModes().getSelectedModes()) { + spell.getSpellAbility().getModes().setActiveMode(modeId); + for (Target target : spell.getSpellAbility().getTargets()) { + for (UUID targetId : target.getTargets()) { + if (targetId.equals(getSourceId())) { + targetsSource = true; + } else { + return false; + } } } } @@ -157,10 +160,15 @@ class ZadaHedronGrinderEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (spell != null && controller != null) { Target usedTarget = null; - for (Target target : spell.getSpellAbility().getTargets()) { - if (target.getFirstTarget().equals(source.getSourceId())) { - usedTarget = target.copy(); - usedTarget.clearChosen(); + setUsedTarget: + for (UUID modeId : spell.getSpellAbility().getModes().getSelectedModes()) { + spell.getSpellAbility().getModes().setActiveMode(modeId); + for (Target target : spell.getSpellAbility().getTargets()) { + if (target.getFirstTarget().equals(source.getSourceId())) { + usedTarget = target.copy(); + usedTarget.clearChosen(); + break setUsedTarget; + } } } if (usedTarget == null) { @@ -169,11 +177,15 @@ class ZadaHedronGrinderEffect extends OneShotEffect { for (Permanent creature : game.getState().getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), game)) { if (!creature.getId().equals(source.getSourceId()) && usedTarget.canTarget(source.getControllerId(), creature.getId(), source, game)) { Spell copy = spell.copySpell(); - for (Target target : spell.getSpellAbility().getTargets()) { - if (target.getClass().equals(usedTarget.getClass()) && target.getMessage().equals(usedTarget.getMessage())) { - target.clearChosen(); - target.add(creature.getId(), game); - break; + setTarget: + for (UUID modeId : spell.getSpellAbility().getModes().getSelectedModes()) { + copy.getSpellAbility().getModes().setActiveMode(modeId); + for (Target target : copy.getSpellAbility().getTargets()) { + if (target.getClass().equals(usedTarget.getClass()) && target.getMessage().equals(usedTarget.getMessage())) { + target.clearChosen(); + target.add(creature.getId(), game); + break setTarget; + } } } copy.setControllerId(source.getControllerId()); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopySpellTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopySpellTest.java index c9736f2aa00..e3701dd6a48 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopySpellTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopySpellTest.java @@ -27,6 +27,7 @@ */ package org.mage.test.cards.copy; +import mage.abilities.keyword.FlyingAbility; import mage.constants.PhaseStep; import mage.constants.Zone; import org.junit.Test; @@ -61,4 +62,61 @@ public class CopySpellTest extends CardTestPlayerBase { assertHandCount(playerA, "Silvercoat Lion", 1); } + @Test + public void ZadaHedronGrinderBoost() { + // Target creature gets +3/+3 and gains flying until end of turn. + addCard(Zone.HAND, playerA, "Angelic Blessing", 1); // {2}{W} + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); + + // Whenever you cast an instant or sorcery spell that targets only Zada, Hedron Grinder, copy that spell for each other creature you control that the spell could target. Each copy targets a different one of those creatures. + addCard(Zone.BATTLEFIELD, playerA, "Zada, Hedron Grinder", 1); + addCard(Zone.BATTLEFIELD, playerA, "Pillarfield Ox", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Angelic Blessing", "Zada, Hedron Grinder"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Angelic Blessing", 1); + assertPowerToughness(playerA, "Pillarfield Ox", 5, 7); + assertAbility(playerA, "Pillarfield Ox", FlyingAbility.getInstance(), true); + assertPowerToughness(playerA, "Zada, Hedron Grinder", 6, 6); + assertAbility(playerA, "Zada, Hedron Grinder", FlyingAbility.getInstance(), true); + + assertPowerToughness(playerB, "Silvercoat Lion", 2, 2); + assertAbility(playerB, "Silvercoat Lion", FlyingAbility.getInstance(), false); + } + + @Test + public void ZadaHedronGrinderBoostWithCharm() { + // Choose two - + // • Counter target spell. + // • Return target permanent to its owner's hand. + // • Tap all creatures your opponents control. + // • Draw a card. + addCard(Zone.HAND, playerA, "Cryptic Command", 1); // {2}{U}{U}{U} + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + + // Whenever you cast an instant or sorcery spell that targets only Zada, Hedron Grinder, copy that spell for each other creature you control that the spell could target. Each copy targets a different one of those creatures. + addCard(Zone.BATTLEFIELD, playerA, "Zada, Hedron Grinder", 1); + addCard(Zone.BATTLEFIELD, playerA, "Pillarfield Ox", 1); + + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cryptic Command", "mode=2Zada, Hedron Grinder"); + setModeChoice(playerA, "2"); // Return target permanent to its owner's hand + setModeChoice(playerA, "4"); // Draw a card + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPowerToughness(playerB, "Silvercoat Lion", 2, 2); + + assertGraveyardCount(playerA, "Cryptic Command", 1); + assertPermanentCount(playerA, "Zada, Hedron Grinder", 0); + assertPermanentCount(playerA, "Pillarfield Ox", 0); + assertHandCount(playerA, 4); // 2 draw + 2 creatures returned to hand + } }

4eNk2H$O~XC51q=~RiavLXZ1verFpxWD+nB(Gwq{T>fvQ37IK4@h)~fjL6EOH zRoK$yz^%g&BSE9g>H{XA+fO>Jsz}31$CT$F%=>`*4IOBqR?~N!Jc}ULKwjYw;6Ap-qi!&Z$n3Db>MV7qzC@Lb1H0CkaxB-~}Es zbEprJu$tuqwi=s8N*{e_gC&_EOfxm*ze3@E6H)Ex@CTJ-~vu_@r7rMj@pXh8B(KL_Wa3` zs&L$^+kf=vs8`iNkr)Wc!O2r@lbowRkR;gCbmeV;<4K+PsA zQQw5yC?O2CuvDj=^a{WwMEhz)?!e)AdU8;@2jQ`rtS?-`n03ecSf3@ zfIq7QkbMt2mfH%kCejUBpk46s?+@>ELuR7#BB@~;-cmwJRC~AzNK$>k0Q151(gAu+ zXo#FUgZ}_)=&x%!$3T9qj0N$UaQ5~i?0>Ak6Z|)Y7J~^%hR_a6Y|2wJvOVO$n`C_+UODT;_lP$38P#VW7N-^k98RzyItXaWCni&h2Z+b;) zP2AmaHJKHp%^}9>30VbuzfeAyNe#f0xd$fyh-skvcnbN<8ZpCD^gIF(x3I>Q>My}vYlLJuyo7(m z?-OaZjl(Cl5 ze3URSgevjMv_kY0TWMuoE z!&xT^%K9jE;cou`;vLlO2DNio6(p%DskEt7_9P93xrjmB*&WhU2XFg*&Z6IC=TYT* zW7V%Ce9MBwxiKzz;lic9vRQEmDkLL}Z6`R#w|@Fb{-Di4YimCIFQNYcw&m%JmQdnh3- zPt-J@vt2(}{XC44+H+iel~Hk0WvbLxb&crKN4rE^(mXrQ%qolUi^kEd&!N*PvMUf{%u+s;46WjWp6LnmCm{NF&X`#% zH&w!7tJc`DCc|duw`Z|Xc_HSh>5>6YJ(r!!MtJh)cgWW;yOlOyi*T#7cVeRIV%3Qx zAE>0lrn=G=0XPmkoqx-4{{Z?vy5TPHx&uckDzRInNWbM=w4J}haOzRSR<;mS%V7i{ zB=hKd>)ThYJl&ol+cz!X%qw2iO&*yhX_WYUtLi1a$wC#AhS8EdqaF3oHkw=})5JT1 z=(%f1llU5Gzevg>)1o2OZe?VD)C3&vC*SSws|B2@oj_7$rhi?P*^e4Man_~DX+wTU zONkjffgo*B9^4)ed}x^DO0`-p<4J0pH7Ws4EbdB%K^P#9ai&q#Ebw8E;t6&@^N>Lx z@-d@YaIThCw2<*b!n!JT)la9V@S@P1TS{44(iGHuW6YEe3cW^sb(4#4_+qKy zcZycc-_%HD%72SbDdZ@tDcypl6Y5e`pPf}jxhnEQh83rE_`vMy_tk7=i4dG|43z$4 zq?{ZdW2-lVl}ByWgf64vyVq1z(4{zqB2y#~qx!%*Nc*b*{1d9&K@?F?M&>v?ax#-_ zyVj#e64-6$5P(uS_T@>>$n$>c(ybUU?u)=U`>l6ecz@RRwSHXMKTwHI@gWP8en{G_OiYe>n%oa1*q z_x99jO8t^*d>^V_ZHaeHyk*bc6#Y(%Fe&Yxt5aloh~wW~0Y>QZtIPAi@8Nn=m1;Fw zMCj;{hJRNcZ9Q?`Z+QR}9F+GxyX%BlUETsMWOzYYG@5Nrn@)bFRW4-9pI~i zCHGaE9z^?QEO9EWO=(i+fRz0f)Re8XXZ5LBC4X7S2Z5-%{3)@`1a9N`s{V$Wqzb|v z4#aI+gNLqGlpL$y*dJe=3m5MVd2T)Yr_+CjNeg8G!^SrF;Ge3uu86PGn5W2ppjw*1 zaV9##&=fdYQlZ=q2>3r5(P>F=r*g2`y*zPE-H4jBmiwSD^CtxHj@o40to+1C>S@CN E*=JJp<^TWy delta 7488 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 KDB*!a&;Qw=1OTo8 diff --git a/Mage.Client/src/main/resources/avatars/14.jpg b/Mage.Client/src/main/resources/avatars/14.jpg index d57f3963ee1e8be20bcee1009fd8d0b6d20e2e2c..e45b888a9ea07335772da0a421de66c806744fcf 100644 GIT binary patch delta 7460 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 z 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 PDY&hl-s95pb?yHFP4!LM literal 0 HcmV?d00001 diff --git a/Mage.Client/src/main/resources/avatars/19.jpg b/Mage.Client/src/main/resources/avatars/19.jpg index b08ae1c24ab8da41a11f129aba0e23b16ae5b2d1..bbffc049eead602f8a30393a9b6c3e15b67106ff 100644 GIT binary patch delta 7033 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 XNU+Af2sA~fY02clwY!D~0)PM6Vsu`( delta 7430 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