diff --git a/Mage.Client/config/config.xml b/Mage.Client/config/config.xml
index cc832e984a7..ebb8bfb3da2 100644
--- a/Mage.Client/config/config.xml
+++ b/Mage.Client/config/config.xml
@@ -17,12 +17,19 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mage.Client/release/config/config.xml b/Mage.Client/release/config/config.xml
index cc832e984a7..ebb8bfb3da2 100644
--- a/Mage.Client/release/config/config.xml
+++ b/Mage.Client/release/config/config.xml
@@ -17,12 +17,19 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Legacy.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Legacy.java
new file mode 100644
index 00000000000..97e24c7020a
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Legacy.java
@@ -0,0 +1,104 @@
+/*
+* Copyright 2011 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.deck;
+
+import mage.cards.decks.Constructed;
+
+/**
+ *
+ * LevelX2
+ */
+public class Legacy extends Constructed {
+
+ public Legacy() {
+ super("Constructed - Legacy");
+
+ banned.add("Amulet of Quoz");
+ banned.add("Ancestral Recall");
+ banned.add("Balance");
+ banned.add("Bazaar of Baghdad");
+ banned.add("Black Lotus");
+ banned.add("Black Vise");
+ banned.add("Bronze Tablet");
+ banned.add("Channel");
+ banned.add("Chaos Orb");
+ banned.add("Contract from Below");
+ banned.add("Darkpact");
+ banned.add("Demonic Attorney");
+ banned.add("Demonic Consultation");
+ banned.add("Demonic Tutor");
+ banned.add("Earthcraft");
+ banned.add("Falling Star");
+ banned.add("Fastbond");
+ banned.add("Flash");
+ banned.add("Frantic Search");
+ banned.add("Goblin Recruiter");
+ banned.add("Gush");
+ banned.add("Hermit Druid");
+ banned.add("Imperial Seal");
+ banned.add("Jeweled Bird");
+ banned.add("Library of Alexandria");
+ banned.add("Mana Crypt");
+ banned.add("Mana Drain");
+ banned.add("Mana Vault");
+ banned.add("Memory Jar");
+ banned.add("Mental Misstep");
+ banned.add("Mind Twist");
+ banned.add("Mind's Desire");
+ banned.add("Mishra's Workshop");
+ banned.add("Mox Emerald");
+ banned.add("Mox Jet");
+ banned.add("Mox Pearl");
+ banned.add("Mox Ruby");
+ banned.add("Mox Sapphire");
+ banned.add("Mystical Tutor");
+ banned.add("Necropotence");
+ banned.add("Oath of Druids");
+ banned.add("Rebirth");
+ banned.add("Shahrazad");
+ banned.add("Skullclamp");
+ banned.add("Sol Ring");
+ banned.add("Strip Mine");
+ banned.add("Survival of the Fittes");
+ banned.add("Tempest Efreet");
+ banned.add("Time Vault");
+ banned.add("Time Walk");
+ banned.add("Timetwister");
+ banned.add("Timmerian Fiends");
+ banned.add("Tinker");
+ banned.add("Tolarian Academy");
+ banned.add("Vampiric Tutor");
+ banned.add("Wheel of Fortune");
+ banned.add("Windfall");
+ banned.add("Worldgorger Dragon");
+ banned.add("Yawgmoth's Bargain");
+ banned.add("Yawgmoth's Will");
+
+ }
+}
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
index c3fba20e5a5..14d5902815e 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
@@ -1124,9 +1124,9 @@ public class ComputerPlayer6 extends ComputerPlayer implements
&& !blocker.getAbilities().containsKey(ReachAbility.getInstance().getId())) {
safeToAttack = true;
}
- if (attacker.getPower().getValue() == 0) {
- safeToAttack = false;
- }
+ }
+ if (attacker.getPower().getValue() == 0) {
+ safeToAttack = false;
}
if (safeToAttack) {
attackingPlayer.declareAttacker(attacker.getId(), defenderId, game);
diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml
index 0e21072f774..ed7632aa174 100644
--- a/Mage.Server/config/config.xml
+++ b/Mage.Server/config/config.xml
@@ -23,6 +23,7 @@
+
diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml
index 22ab1fd5236..b1040dd3a3a 100644
--- a/Mage.Server/release/config/config.xml
+++ b/Mage.Server/release/config/config.xml
@@ -21,6 +21,7 @@
+
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/HeartbeatOfSpring.java b/Mage.Sets/src/mage/sets/championsofkamigawa/HeartbeatOfSpring.java
index 2725dbab7d5..d457078f60c 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/HeartbeatOfSpring.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/HeartbeatOfSpring.java
@@ -25,7 +25,6 @@
* 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;
@@ -54,15 +53,15 @@ import mage.target.targetpointer.FixedTarget;
*/
public class HeartbeatOfSpring extends CardImpl {
- public HeartbeatOfSpring (UUID ownerId) {
+ public HeartbeatOfSpring(UUID ownerId) {
super(ownerId, 212, "Heartbeat of Spring", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
this.expansionSetCode = "CHK";
- this.color.setGreen(true);
+ this.color.setGreen(true);
// Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced.
this.addAbility(new HeartbeatOfSpringAbility());
}
- public HeartbeatOfSpring (final HeartbeatOfSpring card) {
+ public HeartbeatOfSpring(final HeartbeatOfSpring card) {
super(card);
}
@@ -70,7 +69,6 @@ public class HeartbeatOfSpring extends CardImpl {
public HeartbeatOfSpring copy() {
return new HeartbeatOfSpring(this);
}
-
}
class HeartbeatOfSpringAbility extends TriggeredManaAbility {
@@ -87,14 +85,14 @@ class HeartbeatOfSpringAbility extends TriggeredManaAbility {
Permanent land = game.getPermanent(this.targetPointer.getFirst(game, source));
Abilities mana = land.getAbilities().getManaAbilities(Zone.BATTLEFIELD);
Mana types = new Mana();
- for (ManaAbility ability: mana) {
+ for (ManaAbility ability : mana) {
types.add(ability.getNetMana(game));
}
Choice choice = new ChoiceImpl(true);
choice.setMessage("Pick a mana color");
- if (types.getBlack() > 0)
+ if (types.getBlack() > 0) {
choice.getChoices().add("Black");
- if (types.getRed() > 0)
+ }
+ if (types.getRed() > 0) {
choice.getChoices().add("Red");
- if (types.getBlue() > 0)
+ }
+ if (types.getBlue() > 0) {
choice.getChoices().add("Blue");
- if (types.getGreen() > 0)
+ }
+ if (types.getGreen() > 0) {
choice.getChoices().add("Green");
- if (types.getWhite() > 0)
+ }
+ if (types.getWhite() > 0) {
choice.getChoices().add("White");
- if (types.getColorless() > 0)
+ }
+ if (types.getColorless() > 0) {
choice.getChoices().add("Colorless");
+ }
if (choice.getChoices().size() > 0) {
- Player player = game.getPlayer(source.getControllerId());
- if (choice.getChoices().size() == 1)
+ Player player = game.getPlayer(land.getControllerId());
+ if (choice.getChoices().size() == 1) {
choice.setChoice(choice.getChoices().iterator().next());
- else
+ } else {
player.choose(outcome, choice, game);
+ }
if (choice.getChoice().equals("Black")) {
player.getManaPool().addMana(Mana.BlackMana, game, source);
return true;
- }
- else if (choice.getChoice().equals("Blue")) {
+ } else if (choice.getChoice().equals("Blue")) {
player.getManaPool().addMana(Mana.BlueMana, game, source);
return true;
- }
- else if (choice.getChoice().equals("Red")) {
+ } else if (choice.getChoice().equals("Red")) {
player.getManaPool().addMana(Mana.RedMana, game, source);
return true;
- }
- else if (choice.getChoice().equals("Green")) {
+ } else if (choice.getChoice().equals("Green")) {
player.getManaPool().addMana(Mana.GreenMana, game, source);
return true;
- }
- else if (choice.getChoice().equals("White")) {
+ } else if (choice.getChoice().equals("White")) {
player.getManaPool().addMana(Mana.WhiteMana, game, source);
return true;
- }
- else if (choice.getChoice().equals("Colorless")) {
+ } else if (choice.getChoice().equals("Colorless")) {
player.getManaPool().addMana(Mana.ColorlessMana, game, source);
return true;
}
@@ -182,5 +182,4 @@ class HeartbeatOfSpringEffect extends ManaEffect {
public HeartbeatOfSpringEffect copy() {
return new HeartbeatOfSpringEffect(this);
}
-
}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/HiddenStrings.java b/Mage.Sets/src/mage/sets/dragonsmaze/HiddenStrings.java
index 2b06036c431..95cff0de2c7 100644
--- a/Mage.Sets/src/mage/sets/dragonsmaze/HiddenStrings.java
+++ b/Mage.Sets/src/mage/sets/dragonsmaze/HiddenStrings.java
@@ -37,6 +37,7 @@ import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CipherEffect;
import mage.cards.CardImpl;
+import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -57,8 +58,8 @@ public class HiddenStrings extends CardImpl {
// You may tap or untap target permanent, then you may tap or untap another target permanent
this.getSpellAbility().addEffect(new HiddenStringsEffect());
- this.getSpellAbility().addTarget(new TargetPermanent());
- this.getSpellAbility().addTarget(new TargetPermanent());
+ this.getSpellAbility().addTarget(new TargetPermanent(0, 2, new FilterPermanent(), false));
+
// Cipher
this.getSpellAbility().addEffect(new CipherEffect());
}
@@ -92,35 +93,20 @@ class HiddenStringsEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- boolean result = false;
-
- Player player = game.getPlayer(source.getControllerId());
- if (player != null) {
- Permanent permanent = game.getPermanent(source.getFirstTarget());
- if (permanent != null) {
- if (permanent.isTapped()) {
- if (player.chooseUse(Constants.Outcome.Untap, "Untap that permanent?", game)) {
- result |= permanent.untap(game);
- }
- } else {
- if (player.chooseUse(Constants.Outcome.Tap, "Tap that permanent?", game)) {
- result |= permanent.tap(game);
+ Player player = game.getPlayer(source.getControllerId());
+ if (player != null) {
+ for (UUID targetId : source.getTargets().get(0).getTargets()) {
+ Permanent permanent = game.getPermanent(targetId);
+ if (permanent != null) {
+ if (player.chooseUse(Constants.Outcome.Tap, new StringBuilder("Tap ").append(permanent.getName()).append("?").toString(), game)) {
+ permanent.tap(game);
+ } else if (player.chooseUse(Constants.Outcome.Untap, new StringBuilder("Untap ").append(permanent.getName()).append("?").toString(), game)) {
+ permanent.untap(game);
+ }
}
}
+ return true;
}
- permanent = game.getPermanent(source.getTargets().get(1).getFirstTarget());
- if (permanent != null) {
- if (permanent.isTapped()) {
- if (player.chooseUse(Constants.Outcome.Untap, "Untap that permanent?", game)) {
- result |= permanent.untap(game);
- }
- } else {
- if (player.chooseUse(Constants.Outcome.Tap, "Tap that permanent?", game)) {
- result |= permanent.tap(game);
- }
- }
- }
- }
- return result;
+ return false;
}
}
diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/VoiceOfResurgence.java b/Mage.Sets/src/mage/sets/dragonsmaze/VoiceOfResurgence.java
new file mode 100644
index 00000000000..6f7502be826
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/dragonsmaze/VoiceOfResurgence.java
@@ -0,0 +1,139 @@
+/*
+ * 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.dragonsmaze;
+
+import java.util.UUID;
+import mage.Constants;
+import mage.Constants.CardType;
+import mage.Constants.Rarity;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.continious.SetPowerToughnessSourceEffect;
+import mage.cards.CardImpl;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.token.Token;
+import mage.game.stack.Spell;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class VoiceOfResurgence extends CardImpl {
+
+ public VoiceOfResurgence(UUID ownerId) {
+ super(ownerId, 114, "Voice of Resurgence", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{G}{W}");
+ this.expansionSetCode = "DGM";
+ this.subtype.add("Elemental");
+
+ this.color.setGreen(true);
+ this.color.setWhite(true);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever an opponent casts a spell during your turn or when Voice of Resurgence dies, put a green and white Elemental creature token onto the battlefield with "This creature's power and toughness are each equal to the number of creatures you control."
+ this.addAbility(new VoiceOfResurgenceTriggeredAbility());
+
+ }
+
+ public VoiceOfResurgence(final VoiceOfResurgence card) {
+ super(card);
+ }
+
+ @Override
+ public VoiceOfResurgence copy() {
+ return new VoiceOfResurgence(this);
+ }
+}
+
+class VoiceOfResurgenceTriggeredAbility extends TriggeredAbilityImpl {
+
+ public VoiceOfResurgenceTriggeredAbility() {
+ super(Constants.Zone.BATTLEFIELD, new CreateTokenEffect(new VoiceOfResurgenceToken()), false);
+ }
+
+ public VoiceOfResurgenceTriggeredAbility(final VoiceOfResurgenceTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ // Opponent casts spell during your turn
+ if (event.getType() == GameEvent.EventType.SPELL_CAST) {
+ Spell spell = game.getStack().getSpell(event.getTargetId());
+ if (spell != null
+ && game.getOpponents(super.getControllerId()).contains(spell.getControllerId())
+ && game.getActivePlayerId().equals(super.getControllerId())) {
+ return true;
+ }
+ }
+ // Voice Of Resurgence Dies
+ if (event.getType() == GameEvent.EventType.ZONE_CHANGE) {
+ if (super.getSourceId().equals(event.getTargetId())) {
+ MageObject before = game.getLastKnownInformation(event.getTargetId(), Constants.Zone.BATTLEFIELD);
+ Constants.Zone after = game.getState().getZone(event.getTargetId());
+ return before != null && after != null && Constants.Zone.GRAVEYARD.match(after);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever an opponent casts a spell during your turn or when Voice of Resurgence dies, put a green and white Elemental creature token onto the battlefield with \"This creature's power and toughness are each equal to the number of creatures you control.";
+ }
+
+ @Override
+ public VoiceOfResurgenceTriggeredAbility copy() {
+ return new VoiceOfResurgenceTriggeredAbility(this);
+ }
+}
+
+class VoiceOfResurgenceToken extends Token {
+
+ public VoiceOfResurgenceToken() {
+ super("Elemental", "X/X green and white Elemental creature with with \"This creature's power and toughness are each equal to the number of creatures you control.");
+ cardType.add(Constants.CardType.CREATURE);
+ color.setGreen(true);
+ color.setWhite(true);
+ subtype.add("Elemental");
+ power = new MageInt(0);
+ toughness = new MageInt(0);
+ FilterControlledPermanent filter = new FilterControlledPermanent();
+ filter.add(new CardTypePredicate(CardType.CREATURE));
+ DynamicValue creaturesControlled = new PermanentsOnBattlefieldCount(filter);
+ this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, new SetPowerToughnessSourceEffect(creaturesControlled, Constants.Duration.EndOfGame)));
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/VorelOfTheHullClade.java b/Mage.Sets/src/mage/sets/dragonsmaze/VorelOfTheHullClade.java
new file mode 100644
index 00000000000..725e031450e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/dragonsmaze/VorelOfTheHullClade.java
@@ -0,0 +1,127 @@
+/*
+ * 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.dragonsmaze;
+
+import java.util.List;
+import java.util.UUID;
+import mage.Constants;
+import mage.Constants.CardType;
+import mage.Constants.Outcome;
+import mage.Constants.Rarity;
+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.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.counters.Counter;
+import mage.filter.FilterPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class VorelOfTheHullClade extends CardImpl {
+
+ final static private FilterPermanent filter = new FilterPermanent("artifact, creature, or land");
+
+ static {
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.ARTIFACT),
+ new CardTypePredicate(CardType.CREATURE),
+ new CardTypePredicate(CardType.LAND)));
+ }
+
+ public VorelOfTheHullClade(UUID ownerId) {
+ super(ownerId, 115, "Vorel of the Hull Clade", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}{U}");
+ this.expansionSetCode = "DGM";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Merfolk");
+
+ this.color.setBlue(true);
+ this.color.setGreen(true);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(4);
+
+ // {G}{U}, {tap}: For each counter on target artifact, creature, or land, put another of those counters on that permanent.
+ Ability ability = new SimpleActivatedAbility(Constants.Zone.BATTLEFIELD, new VorelOfTheHullCladeEffect(), new ManaCostsImpl("{G}{U}"));
+ ability.addTarget(new TargetPermanent(filter));
+ ability.addCost(new TapSourceCost());
+ this.addAbility(ability);
+
+ }
+
+ public VorelOfTheHullClade(final VorelOfTheHullClade card) {
+ super(card);
+ }
+
+ @Override
+ public VorelOfTheHullClade copy() {
+ return new VorelOfTheHullClade(this);
+ }
+}
+
+class VorelOfTheHullCladeEffect extends OneShotEffect {
+
+ public VorelOfTheHullCladeEffect() {
+ super(Outcome.Benefit);
+ staticText = "For each counter on target artifact, creature, or land, put another of those counters on that permanent";
+ }
+
+ public VorelOfTheHullCladeEffect(VorelOfTheHullCladeEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent target = game.getPermanent(source.getFirstTarget());
+ if (target == null) {
+ return false;
+ }
+ for (Counter counter : target.getCounters().values()) {
+ Counter newCounter = new Counter(counter.getName(), 1);
+ target.addCounters(newCounter, game);
+ System.out.println("The target and counter type added is " + target.getName() + counter.getName());
+ }
+ return true;
+ }
+
+ @Override
+ public VorelOfTheHullCladeEffect copy() {
+ return new VorelOfTheHullCladeEffect(this);
+ }
+
+}
+
diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/WarleadersHelix.java b/Mage.Sets/src/mage/sets/dragonsmaze/WarleadersHelix.java
new file mode 100644
index 00000000000..a0739a92d61
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/dragonsmaze/WarleadersHelix.java
@@ -0,0 +1,65 @@
+/*
+ * 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.dragonsmaze;
+
+import java.util.UUID;
+import mage.Constants.CardType;
+import mage.Constants.Rarity;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class WarleadersHelix extends CardImpl {
+
+ public WarleadersHelix(UUID ownerId) {
+ super(ownerId, 116, "Warleader's Helix", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{R}{W}");
+ this.expansionSetCode = "DGM";
+
+ this.color.setRed(true);
+ this.color.setWhite(true);
+
+ // Warleader's Helix deals 4 damage to target creature or player and you gain 4 life.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(4));
+ this.getSpellAbility().addEffect(new GainLifeEffect(4));
+ this.getSpellAbility().addTarget(new TargetCreatureOrPlayer());
+ }
+
+ public WarleadersHelix(final WarleadersHelix card) {
+ super(card);
+ }
+
+ @Override
+ public WarleadersHelix copy() {
+ return new WarleadersHelix(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/ZhurTaaAncient.java b/Mage.Sets/src/mage/sets/dragonsmaze/ZhurTaaAncient.java
new file mode 100644
index 00000000000..d663c003446
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/dragonsmaze/ZhurTaaAncient.java
@@ -0,0 +1,191 @@
+/*
+ * 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.dragonsmaze;
+
+import java.util.UUID;
+import mage.Constants;
+import mage.Constants.CardType;
+import mage.Constants.Rarity;
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.Abilities;
+import mage.abilities.Ability;
+import mage.abilities.effects.common.ManaEffect;
+import mage.abilities.mana.ManaAbility;
+import mage.abilities.mana.TriggeredManaAbility;
+import mage.cards.CardImpl;
+import mage.choices.Choice;
+import mage.choices.ChoiceImpl;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class ZhurTaaAncient extends CardImpl {
+
+ public ZhurTaaAncient(UUID ownerId) {
+ super(ownerId, 119, "Zhur-Taa Ancient", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{G}");
+ this.expansionSetCode = "DGM";
+ this.subtype.add("Beast");
+
+ this.color.setRed(true);
+ this.color.setGreen(true);
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(5);
+
+ // Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced.
+ this.addAbility(new ZhurTaaAncientAbility());
+ }
+
+ public ZhurTaaAncient(final ZhurTaaAncient card) {
+ super(card);
+ }
+
+ @Override
+ public ZhurTaaAncient copy() {
+ return new ZhurTaaAncient(this);
+ }
+}
+
+class ZhurTaaAncientAbility extends TriggeredManaAbility {
+
+ private static final String staticText = "Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced.";
+
+ public ZhurTaaAncientAbility() {
+ super(Constants.Zone.BATTLEFIELD, new ZhurTaaAncientEffect());
+ }
+
+ public ZhurTaaAncientAbility(ZhurTaaAncientAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getType() == GameEvent.EventType.TAPPED_FOR_MANA) {
+ Permanent permanent = game.getPermanent(event.getSourceId());
+ if (permanent == null) {
+ permanent = (Permanent) game.getLastKnownInformation(event.getSourceId(), Constants.Zone.BATTLEFIELD);
+ }
+ if (permanent != null && permanent.getCardType().contains(CardType.LAND)) {
+ getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public ZhurTaaAncientAbility copy() {
+ return new ZhurTaaAncientAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return staticText;
+ }
+}
+
+class ZhurTaaAncientEffect extends ManaEffect {
+
+ public ZhurTaaAncientEffect() {
+ super();
+ staticText = "that player adds one mana to his or her mana pool of any type that land produced";
+ }
+
+ public ZhurTaaAncientEffect(final ZhurTaaAncientEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent land = game.getPermanent(this.targetPointer.getFirst(game, source));
+ Abilities mana = land.getAbilities().getManaAbilities(Constants.Zone.BATTLEFIELD);
+ Mana types = new Mana();
+ for (ManaAbility ability : mana) {
+ types.add(ability.getNetMana(game));
+ }
+ Choice choice = new ChoiceImpl(true);
+ choice.setMessage("Pick a mana color");
+ if (types.getBlack() > 0) {
+ choice.getChoices().add("Black");
+ }
+ if (types.getRed() > 0) {
+ choice.getChoices().add("Red");
+ }
+ if (types.getBlue() > 0) {
+ choice.getChoices().add("Blue");
+ }
+ if (types.getGreen() > 0) {
+ choice.getChoices().add("Green");
+ }
+ if (types.getWhite() > 0) {
+ choice.getChoices().add("White");
+ }
+ if (types.getColorless() > 0) {
+ choice.getChoices().add("Colorless");
+ }
+ if (choice.getChoices().size() > 0) {
+ Player player = game.getPlayer(land.getControllerId());
+ if (choice.getChoices().size() == 1) {
+ choice.setChoice(choice.getChoices().iterator().next());
+ } else {
+ player.choose(outcome, choice, game);
+ }
+ if (choice.getChoice().equals("Black")) {
+ player.getManaPool().addMana(Mana.BlackMana, game, source);
+ return true;
+ } else if (choice.getChoice().equals("Blue")) {
+ player.getManaPool().addMana(Mana.BlueMana, game, source);
+ return true;
+ } else if (choice.getChoice().equals("Red")) {
+ player.getManaPool().addMana(Mana.RedMana, game, source);
+ return true;
+ } else if (choice.getChoice().equals("Green")) {
+ player.getManaPool().addMana(Mana.GreenMana, game, source);
+ return true;
+ } else if (choice.getChoice().equals("White")) {
+ player.getManaPool().addMana(Mana.WhiteMana, game, source);
+ return true;
+ } else if (choice.getChoice().equals("Colorless")) {
+ player.getManaPool().addMana(Mana.ColorlessMana, game, source);
+ return true;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public ZhurTaaAncientEffect copy() {
+ return new ZhurTaaAncientEffect(this);
+ }
+}
\ No newline at end of file
diff --git a/Mage/src/mage/abilities/effects/common/GainLifeEffect.java b/Mage/src/mage/abilities/effects/common/GainLifeEffect.java
index f145eadb62f..3d06f72a52b 100644
--- a/Mage/src/mage/abilities/effects/common/GainLifeEffect.java
+++ b/Mage/src/mage/abilities/effects/common/GainLifeEffect.java
@@ -80,7 +80,11 @@ public class GainLifeEffect extends OneShotEffect {
StringBuilder sb = new StringBuilder();
String message = life.getMessage();
- sb.append("you gain ");
+ if (sb.length() > 0) {
+ sb.append("you gain ");
+ } else {
+ sb.append("You gain ");
+ }
if (message.isEmpty() || !message.equals("1")) {
sb.append(life).append(" ");
}
diff --git a/Mage/src/mage/cards/SplitCard.java b/Mage/src/mage/cards/SplitCard.java
index 3d02c36220e..48cc68801ee 100644
--- a/Mage/src/mage/cards/SplitCard.java
+++ b/Mage/src/mage/cards/SplitCard.java
@@ -51,7 +51,7 @@ import mage.watchers.Watcher;
public abstract class SplitCard> extends CardImpl {
public enum ActiveCardHalf {
- NONE, LEFT, RIGHT
+ NONE, LEFT, RIGHT, BOTH
}
private Card leftHalfCard;
private Card rightHalfCard;
@@ -67,8 +67,8 @@ public abstract class SplitCard> extends CardImpl {
public SplitCard(SplitCard card) {
super(card);
- this.leftHalfCard = card.leftHalfCard;
- this.rightHalfCard = card.rightHalfCard;
+ this.leftHalfCard = card.leftHalfCard.copy();
+ this.rightHalfCard = card.rightHalfCard.copy();
this.activeCardHalf = card.activeCardHalf;
}
@@ -104,16 +104,19 @@ public abstract class SplitCard> extends CardImpl {
@Override
public boolean cast(Game game, Constants.Zone fromZone, SpellAbility ability, UUID controllerId) {
+ if (this.getAbilities().contains(ability)) {
+ activeCardHalf = ActiveCardHalf.BOTH;
+ } else if (leftHalfCard.getAbilities().contains(ability)) {
+ activeCardHalf = ActiveCardHalf.LEFT;
+ } else if (rightHalfCard.getAbilities().contains(ability)) {
+ activeCardHalf = ActiveCardHalf.RIGHT;
+ } else {
+ activeCardHalf = ActiveCardHalf.NONE;
+ }
if (super.cast(game, fromZone, ability, controllerId)) {
- if (leftHalfCard.getAbilities().contains(ability)) {
- activeCardHalf = ActiveCardHalf.LEFT;
- } else if (rightHalfCard.getAbilities().contains(ability)) {
- activeCardHalf = ActiveCardHalf.RIGHT;
- } else {
- activeCardHalf = ActiveCardHalf.NONE;
- }
return true;
}
+ activeCardHalf = ActiveCardHalf.NONE;
return false;
}