From 90ec6123b2059d85a1492e8b200b8f66a6aa5d9e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 24 Aug 2013 17:16:42 +0200 Subject: [PATCH 1/6] Some changes to RedirectionEffect. --- .../abilities/effects/ContinuousEffects.java | 1 + .../PlaneswalkerRedirectionEffect.java | 10 ++++---- .../abilities/effects/RedirectionEffect.java | 24 ++++--------------- 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index 6df71fc2a1..8d8fa27cde 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -721,6 +721,7 @@ public class ContinuousEffects implements Serializable { public void addEffect(ContinuousEffect effect, Ability source) { switch (effect.getEffectType()) { case REPLACEMENT: + case REDIRECTION: ReplacementEffect newReplacementEffect = (ReplacementEffect)effect; replacementEffects.addEffect(newReplacementEffect, source); break; diff --git a/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java b/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java index 7608a2e912..ef41ad4a83 100644 --- a/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java +++ b/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java @@ -28,9 +28,10 @@ package mage.abilities.effects; +import java.util.UUID; +import mage.abilities.Ability; import mage.constants.Duration; import mage.constants.Outcome; -import mage.abilities.Ability; import mage.filter.common.FilterPlaneswalkerPermanent; import mage.game.Game; import mage.game.events.DamageEvent; @@ -41,7 +42,6 @@ import mage.game.stack.StackObject; import mage.players.Player; import mage.target.TargetPermanent; -import java.util.UUID; /** * @@ -92,11 +92,13 @@ public class PlaneswalkerRedirectionEffect extends RedirectionEffect> extends public boolean replaceEvent(GameEvent event, Ability source, Game game) { DamageEvent damageEvent = (DamageEvent)event; Permanent permanent = game.getPermanent(redirectTarget.getFirstTarget()); - Ability damageSource = getSource(damageEvent.getSourceId(), game); - if (permanent != null && damageSource != null) { - permanent.damage(damageEvent.getAmount(), damageSource.getId(), game, damageEvent.isPreventable(), damageEvent.isCombatDamage()); + if (permanent != null) { + permanent.damage(damageEvent.getAmount(), event.getSourceId(), game, damageEvent.isPreventable(), damageEvent.isCombatDamage(), event.getAppliedEffects()); return true; } Player player = game.getPlayer(redirectTarget.getFirstTarget()); if (player != null) { - player.damage(damageEvent.getAmount(), damageSource.getId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable()); + player.damage(damageEvent.getAmount(), event.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); return true; } return false; } - protected Ability getSource(UUID sourceId, Game game) { - StackObject source = game.getStack().getStackObject(sourceId); - if (source != null) { - if (source instanceof StackAbility) - return (StackAbility)source; - if (source instanceof Spell) - return ((Spell)source).getSpellAbility(); - } - return null; - } - } From d4b9f1d4c9da4b5a5a667e09d11168217981c421 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 24 Aug 2013 17:16:58 +0200 Subject: [PATCH 2/6] Added Shield Dancer. --- .../src/mage/sets/prophecy/ShieldDancer.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/prophecy/ShieldDancer.java diff --git a/Mage.Sets/src/mage/sets/prophecy/ShieldDancer.java b/Mage.Sets/src/mage/sets/prophecy/ShieldDancer.java new file mode 100644 index 0000000000..9235e688bd --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/ShieldDancer.java @@ -0,0 +1,112 @@ +/* + * 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.prophecy; + +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.RedirectionEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.DamageEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.target.TargetPermanent; +import mage.target.common.TargetAttackingCreature; + +/** + * + * @author LevelX2 + */ +public class ShieldDancer extends CardImpl { + + public ShieldDancer(UUID ownerId) { + super(ownerId, 23, "Shield Dancer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "PCY"; + this.subtype.add("Human"); + this.subtype.add("Rebel"); + + this.color.setWhite(true); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // {2}{W}: The next time target attacking creature would deal combat damage to Shield Dancer this turn, that creature deals that damage to itself instead. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ShieldDancerRedirectionEffect(), new ManaCostsImpl("{2}{W}")); + ability.addTarget(new TargetAttackingCreature()); + this.addAbility(ability); + } + + public ShieldDancer(final ShieldDancer card) { + super(card); + } + + @Override + public ShieldDancer copy() { + return new ShieldDancer(this); + } +} + +class ShieldDancerRedirectionEffect extends RedirectionEffect { + + public ShieldDancerRedirectionEffect() { + super(Duration.EndOfTurn); + staticText = "The next time target attacking creature would deal combat damage to {this} this turn, that creature deals that damage to itself instead"; + } + + public ShieldDancerRedirectionEffect(final ShieldDancerRedirectionEffect effect) { + super(effect); + } + + @Override + public ShieldDancerRedirectionEffect copy() { + return new ShieldDancerRedirectionEffect(this); + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == EventType.DAMAGE_CREATURE + && event.getTargetId().equals(source.getSourceId()) + && event.getSourceId().equals(source.getTargets().get(0).getFirstTarget())) { + DamageEvent damageEvent = (DamageEvent) event; + if (damageEvent.isCombatDamage()) { + TargetPermanent target = new TargetPermanent(); + target.add(source.getTargets().get(0).getFirstTarget(), game); + redirectTarget = target; + } + return true; + } + return false; + } + +} From b8e7604ca75bd07e79e2c87975e51bc0a9f323fd Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 24 Aug 2013 17:17:35 +0200 Subject: [PATCH 3/6] Minor formattings. --- .../src/mage/sets/conflux/PathToExile.java | 17 +++++-------- .../dynamicvalue/common/CountersCount.java | 3 ++- .../search/SearchLibraryPutInPlayEffect.java | 25 +++++++++++-------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Mage.Sets/src/mage/sets/conflux/PathToExile.java b/Mage.Sets/src/mage/sets/conflux/PathToExile.java index da0ce75064..b025525fb2 100644 --- a/Mage.Sets/src/mage/sets/conflux/PathToExile.java +++ b/Mage.Sets/src/mage/sets/conflux/PathToExile.java @@ -29,19 +29,18 @@ package mage.sets.conflux; 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.effects.OneShotEffect; 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.common.FilterBasicLandCard; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; - import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCreaturePermanent; @@ -96,11 +95,7 @@ class PathToExileEffect extends OneShotEffect { if (player.searchLibrary(target, game)) { Card card = player.getLibrary().getCard(target.getFirstTarget(), game); if (card != null) { - if (card.putOntoBattlefield(game, Zone.LIBRARY, source.getId(), permanent.getControllerId())) { - Permanent land = game.getPermanent(card.getId()); - if (land != null) - land.setTapped(true); - } + card.putOntoBattlefield(game, Zone.LIBRARY, source.getId(), permanent.getControllerId(), true); } } player.shuffleLibrary(game); @@ -111,4 +106,4 @@ class PathToExileEffect extends OneShotEffect { return false; } -} \ No newline at end of file +} diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java index 61f696da69..4cb70d10f0 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/CountersCount.java @@ -25,8 +25,9 @@ public class CountersCount implements DynamicValue { // if permanent already leaves the battlefield, try to find counters count via last known information if (p == null) { MageObject o = game.getLastKnownInformation(sourceAbility.getSourceId(), Zone.BATTLEFIELD); - if (o instanceof Permanent) + if (o instanceof Permanent) { p = (Permanent) o; + } } if (p != null) { return p.getCounters().getCount(counter); diff --git a/Mage/src/mage/abilities/effects/common/search/SearchLibraryPutInPlayEffect.java b/Mage/src/mage/abilities/effects/common/search/SearchLibraryPutInPlayEffect.java index 3a6558e908..5eb457563a 100644 --- a/Mage/src/mage/abilities/effects/common/search/SearchLibraryPutInPlayEffect.java +++ b/Mage/src/mage/abilities/effects/common/search/SearchLibraryPutInPlayEffect.java @@ -28,19 +28,17 @@ package mage.abilities.effects.common.search; -import mage.constants.Outcome; -import mage.constants.Zone; +import java.util.List; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.SearchEffect; import mage.cards.Card; +import mage.constants.Outcome; +import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInLibrary; -import java.util.List; -import java.util.UUID; - /** * * @author BetaSteward_at_googlemail.com @@ -87,8 +85,9 @@ public class SearchLibraryPutInPlayEffect extends SearchEffect 0) { for (UUID cardId: (List)target.getTargets()) { @@ -101,8 +100,9 @@ public class SearchLibraryPutInPlayEffect extends SearchEffect Date: Sat, 24 Aug 2013 17:18:09 +0200 Subject: [PATCH 4/6] Added Minds Aglow, Alliances of Arms, Collective Voyage and Shared Trauma. --- .../mage/sets/commander/AllianceOfArms.java | 133 ++++++++++++++++ .../mage/sets/commander/CollectiveVoyage.java | 143 ++++++++++++++++++ .../src/mage/sets/commander/MindsAglow.java | 131 ++++++++++++++++ .../src/mage/sets/commander/SharedTrauma.java | 133 ++++++++++++++++ 4 files changed, 540 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/commander/AllianceOfArms.java create mode 100644 Mage.Sets/src/mage/sets/commander/CollectiveVoyage.java create mode 100644 Mage.Sets/src/mage/sets/commander/MindsAglow.java create mode 100644 Mage.Sets/src/mage/sets/commander/SharedTrauma.java diff --git a/Mage.Sets/src/mage/sets/commander/AllianceOfArms.java b/Mage.Sets/src/mage/sets/commander/AllianceOfArms.java new file mode 100644 index 0000000000..9da5b2b127 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/AllianceOfArms.java @@ -0,0 +1,133 @@ +/* + * 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.commander; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenTargetEffect; +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.SoldierToken; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LevelX2 + */ +public class AllianceOfArms extends CardImpl { + + public AllianceOfArms(UUID ownerId) { + super(ownerId, 4, "Alliance of Arms", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{W}"); + this.expansionSetCode = "CMD"; + + this.color.setWhite(true); + + // Join forces - Starting with you, each player may pay any amount of mana. Each player puts X 1/1 white Soldier creature tokens onto the battlefield, where X is the total amount of mana paid this way. + this.getSpellAbility().addEffect(new AllianceOfArmsEffect()); + } + + public AllianceOfArms(final AllianceOfArms card) { + super(card); + } + + @Override + public AllianceOfArms copy() { + return new AllianceOfArms(this); + } +} + +class AllianceOfArmsEffect extends OneShotEffect { + + public AllianceOfArmsEffect() { + super(Outcome.Detriment); + this.staticText = "Join forces - Starting with you, each player may pay any amount of mana. Each player puts X 1/1 white Soldier creature tokens onto the battlefield, where X is the total amount of mana paid this way"; + } + + public AllianceOfArmsEffect(final AllianceOfArmsEffect effect) { + super(effect); + } + + @Override + public AllianceOfArmsEffect copy() { + return new AllianceOfArmsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int xSum = 0; + xSum += playerPaysXGenericMana(controller, source, game); + for(UUID playerId : controller.getInRange()) { + if (playerId != controller.getId()) { + Player player = game.getPlayer(playerId); + if (player != null) { + xSum += playerPaysXGenericMana(player, source, game); + + } + } + } + if (xSum > 0) { + for(UUID playerId : controller.getInRange()) { + Effect effect = new CreateTokenTargetEffect(new SoldierToken(), xSum); + effect.setTargetPointer(new FixedTarget(playerId)); + effect.apply(game, source); + } + + } + // prevent undo + controller.resetStoredBookmark(game); + return true; + } + return false; + } + + protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { + int xValue = 0; + boolean payed = false; + while (!payed) { + xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); + if (xValue > 0) { + Cost cost = new GenericManaCost(xValue); + payed = cost.pay(source, game, source.getSourceId(), player.getId(), false); + } else { + payed = true; + } + } + game.informPlayers(new StringBuilder(player.getName()).append(" pays {").append(xValue).append("}.").toString()); + return xValue; + } +} diff --git a/Mage.Sets/src/mage/sets/commander/CollectiveVoyage.java b/Mage.Sets/src/mage/sets/commander/CollectiveVoyage.java new file mode 100644 index 0000000000..ea292dc285 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/CollectiveVoyage.java @@ -0,0 +1,143 @@ +/* + * 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.commander; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +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.common.FilterBasicLandCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author LevelX2 + */ +public class CollectiveVoyage extends CardImpl { + + public CollectiveVoyage(UUID ownerId) { + super(ownerId, 147, "Collective Voyage", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{G}"); + this.expansionSetCode = "CMD"; + + this.color.setGreen(true); + + // Join forces - Starting with you, each player may pay any amount of mana. Each player searches his or her library for up to X basic land cards, where X is the total amount of mana paid this way, puts them onto the battlefield tapped, then shuffles his or her library. + this.getSpellAbility().addEffect(new CollectiveVoyageEffect()); + } + + public CollectiveVoyage(final CollectiveVoyage card) { + super(card); + } + + @Override + public CollectiveVoyage copy() { + return new CollectiveVoyage(this); + } +} + +class CollectiveVoyageEffect extends OneShotEffect { + + public CollectiveVoyageEffect() { + super(Outcome.Detriment); + this.staticText = "Join forces - Starting with you, each player may pay any amount of mana. Each player searches his or her library for up to X basic land cards, where X is the total amount of mana paid this way, puts them onto the battlefield tapped, then shuffles his or her library"; + } + + public CollectiveVoyageEffect(final CollectiveVoyageEffect effect) { + super(effect); + } + + @Override + public CollectiveVoyageEffect copy() { + return new CollectiveVoyageEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int xSum = 0; + xSum += playerPaysXGenericMana(controller, source, game); + for(UUID playerId : controller.getInRange()) { + if (playerId != controller.getId()) { + Player player = game.getPlayer(playerId); + if (player != null) { + xSum += playerPaysXGenericMana(player, source, game); + + } + } + } + for(UUID playerId : controller.getInRange()) { + Player player = game.getPlayer(playerId); + if (player != null) { + TargetCardInLibrary target = new TargetCardInLibrary(0, xSum, new FilterBasicLandCard()); + if (player.searchLibrary(target, game)) { + for (UUID cardId : target.getTargets()) { + Card card = player.getLibrary().getCard(cardId, game); + if (card != null) { + card.putOntoBattlefield(game, Zone.LIBRARY, source.getId(), player.getId(), true); + } + + } + player.shuffleLibrary(game); + } + + } + } + // prevent undo + controller.resetStoredBookmark(game); + return true; + } + return false; + } + + protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { + int xValue = 0; + boolean payed = false; + while (!payed) { + xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); + if (xValue > 0) { + Cost cost = new GenericManaCost(xValue); + payed = cost.pay(source, game, source.getSourceId(), player.getId(), false); + } else { + payed = true; + } + } + game.informPlayers(new StringBuilder(player.getName()).append(" pays {").append(xValue).append("}.").toString()); + return xValue; + } +} + diff --git a/Mage.Sets/src/mage/sets/commander/MindsAglow.java b/Mage.Sets/src/mage/sets/commander/MindsAglow.java new file mode 100644 index 0000000000..e0a8abd25e --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/MindsAglow.java @@ -0,0 +1,131 @@ +/* + * 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.commander; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class MindsAglow extends CardImpl { + + public MindsAglow(UUID ownerId) { + super(ownerId, 51, "Minds Aglow", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{U}"); + this.expansionSetCode = "CMD"; + + this.color.setBlue(true); + + // Join forces - Starting with you, each player may pay any amount of mana. Each player draws X cards, where X is the total amount of mana paid this way. + this.getSpellAbility().addEffect(new MindsAglowEffect()); + + } + + public MindsAglow(final MindsAglow card) { + super(card); + } + + @Override + public MindsAglow copy() { + return new MindsAglow(this); + } +} + +class MindsAglowEffect extends OneShotEffect { + + public MindsAglowEffect() { + super(Outcome.Detriment); + this.staticText = "Join forces - Starting with you, each player may pay any amount of mana. Each player draws X cards, where X is the total amount of mana paid this way"; + } + + public MindsAglowEffect(final MindsAglowEffect effect) { + super(effect); + } + + @Override + public MindsAglowEffect copy() { + return new MindsAglowEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int xSum = 0; + xSum += playerPaysXGenericMana(controller, source, game); + for(UUID playerId : controller.getInRange()) { + if (playerId != controller.getId()) { + Player player = game.getPlayer(playerId); + if (player != null) { + xSum += playerPaysXGenericMana(player, source, game); + + } + } + } + if (xSum > 0) { + for(UUID playerId : controller.getInRange()) { + Player player = game.getPlayer(playerId); + if (player != null) { + player.drawCards(xSum, game); + } + } + + } + // prevent undo + controller.resetStoredBookmark(game); + return true; + } + return false; + } + + protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { + int xValue = 0; + boolean payed = false; + while (!payed) { + xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); + if (xValue > 0) { + Cost cost = new GenericManaCost(xValue); + payed = cost.pay(source, game, source.getSourceId(), player.getId(), false); + } else { + payed = true; + } + } + game.informPlayers(new StringBuilder(player.getName()).append(" pays {").append(xValue).append("}.").toString()); + return xValue; + } +} diff --git a/Mage.Sets/src/mage/sets/commander/SharedTrauma.java b/Mage.Sets/src/mage/sets/commander/SharedTrauma.java new file mode 100644 index 0000000000..f1dd6f71a1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/SharedTrauma.java @@ -0,0 +1,133 @@ +/* + * 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.commander; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutTopCardOfTargetPlayerLibraryIntoGraveEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LevelX2 + */ +public class SharedTrauma extends CardImpl { + + public SharedTrauma(UUID ownerId) { + super(ownerId, 99, "Shared Trauma", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{B}"); + this.expansionSetCode = "CMD"; + + this.color.setBlack(true); + + // Join forces - Starting with you, each player may pay any amount of mana. Each player puts the top X cards of his or her library into his or her graveyard, where X is the total amount of mana paid this way. + this.getSpellAbility().addEffect(new SharedTraumaEffect()); + } + + public SharedTrauma(final SharedTrauma card) { + super(card); + } + + @Override + public SharedTrauma copy() { + return new SharedTrauma(this); + } +} + +class SharedTraumaEffect extends OneShotEffect { + + public SharedTraumaEffect() { + super(Outcome.Detriment); + this.staticText = "Join forces - Starting with you, each player may pay any amount of mana. Each player puts the top X cards of his or her library into his or her graveyard, where X is the total amount of mana paid this way"; + } + + public SharedTraumaEffect(final SharedTraumaEffect effect) { + super(effect); + } + + @Override + public SharedTraumaEffect copy() { + return new SharedTraumaEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + int xSum = 0; + xSum += playerPaysXGenericMana(controller, source, game); + for(UUID playerId : controller.getInRange()) { + if (playerId != controller.getId()) { + Player player = game.getPlayer(playerId); + if (player != null) { + xSum += playerPaysXGenericMana(player, source, game); + + } + } + } + if (xSum > 0) { + for(UUID playerId : controller.getInRange()) { + Effect effect = new PutTopCardOfTargetPlayerLibraryIntoGraveEffect(xSum); + effect.setTargetPointer(new FixedTarget(playerId)); + effect.apply(game, source); + } + + } + // prevent undo + controller.resetStoredBookmark(game); + return true; + } + return false; + } + + protected static int playerPaysXGenericMana(Player player, Ability source, Game game) { + int xValue = 0; + boolean payed = false; + while (!payed) { + xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source); + if (xValue > 0) { + Cost cost = new GenericManaCost(xValue); + payed = cost.pay(source, game, source.getSourceId(), player.getId(), false); + } else { + payed = true; + } + } + game.informPlayers(new StringBuilder(player.getName()).append(" pays {").append(xValue).append("}.").toString()); + return xValue; + } +} + From c26a081f93eb0d56a19f04bea19985c4415a6123 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 25 Aug 2013 10:31:57 +0200 Subject: [PATCH 5/6] * Vorel of the Hull Clade - Fixed the bug, that only always one new counter was put on the target permanent of any type of counter that was already on the permanent instead of the amount that was already on the permanent before. --- .../mage/sets/dragonsmaze/VorelOfTheHullClade.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/VorelOfTheHullClade.java b/Mage.Sets/src/mage/sets/dragonsmaze/VorelOfTheHullClade.java index 17363d104b..ad59e0c817 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/VorelOfTheHullClade.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/VorelOfTheHullClade.java @@ -28,10 +28,6 @@ package mage.sets.dragonsmaze; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -39,6 +35,9 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.Zone; import mage.counters.Counter; import mage.filter.FilterPermanent; @@ -111,9 +110,8 @@ class VorelOfTheHullCladeEffect extends OneShotEffect return false; } for (Counter counter : target.getCounters().values()) { - Counter newCounter = new Counter(counter.getName(), 1); + Counter newCounter = new Counter(counter.getName(), counter.getCount()); target.addCounters(newCounter, game); - System.out.println("The target and counter type added is " + target.getName() + counter.getName()); } return true; } @@ -124,4 +122,3 @@ class VorelOfTheHullCladeEffect extends OneShotEffect } } - From 04e36b4cbcb242463e9c65e1eaff6ce051ff6719 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 26 Aug 2013 08:31:50 +0200 Subject: [PATCH 6/6] * Tolsimir Wolfblood - Fixed missing attribute of created token (token was no creature). --- Mage.Sets/src/mage/sets/ravnika/TolsimirWolfblood.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/ravnika/TolsimirWolfblood.java b/Mage.Sets/src/mage/sets/ravnika/TolsimirWolfblood.java index 315024960b..41e6447441 100644 --- a/Mage.Sets/src/mage/sets/ravnika/TolsimirWolfblood.java +++ b/Mage.Sets/src/mage/sets/ravnika/TolsimirWolfblood.java @@ -93,7 +93,7 @@ public class TolsimirWolfblood extends CardImpl { class VojaToken extends Token{ public VojaToken(){ super("Voja", "legendary 2/2 green and white Wolf creature token named Voja"); - + this.cardType.add(CardType.CREATURE); this.supertype.add("Legendary"); this.subtype.add("Wolf");