diff --git a/Mage/src/mage/abilities/effects/common/GainAbilityControlledEffect.java b/Mage/src/mage/abilities/effects/common/GainAbilityControlledEffect.java index 7d0ba7b6d8..a41b4e1201 100644 --- a/Mage/src/mage/abilities/effects/common/GainAbilityControlledEffect.java +++ b/Mage/src/mage/abilities/effects/common/GainAbilityControlledEffect.java @@ -1,87 +1,98 @@ -/* -* 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 mage.Constants.Duration; -import mage.Constants.Layer; -import mage.Constants.Outcome; -import mage.Constants.SubLayer; -import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.filter.FilterPermanent; -import mage.game.Game; -import mage.game.permanent.Permanent; - -/** - * - * @author BetaSteward_at_googlemail.com - */ -public class GainAbilityControlledEffect extends ContinuousEffectImpl { - - protected Ability ability; - protected FilterPermanent permanentFilter; - - public GainAbilityControlledEffect(Ability ability, Duration duration) { - this(ability, duration, new FilterPermanent()); - } - - public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter) { - super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - this.ability = ability; - this.permanentFilter = filter; - } - - public GainAbilityControlledEffect(final GainAbilityControlledEffect effect) { - super(effect); - this.ability = effect.ability.copy(); - this.permanentFilter = effect.permanentFilter.copy(); - } - - @Override - public GainAbilityControlledEffect copy() { - return new GainAbilityControlledEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - for (Permanent perm: game.getBattlefield().getAllActivePermanents(permanentFilter, source.getControllerId())) { - perm.addAbility(ability.copy()); - } - return true; - } - - @Override - public String getText(Ability source) { - StringBuilder sb = new StringBuilder(); - sb.append(permanentFilter.getMessage()).append(" you control gain ").append(ability.getRule()); - sb.append(" ").append(duration.toString()); - return sb.toString(); - } - -} +/* +* 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 mage.Constants.Duration; +import mage.Constants.Layer; +import mage.Constants.Outcome; +import mage.Constants.SubLayer; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class GainAbilityControlledEffect extends ContinuousEffectImpl { + + protected Ability ability; + protected boolean excludeSource; + protected FilterPermanent permanentFilter; + + public GainAbilityControlledEffect(Ability ability, Duration duration) { + this(ability, duration, new FilterPermanent()); + } + + public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter) { + this(ability, duration, filter, false); + } + + public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter, boolean excludeSource) { + super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + this.ability = ability; + this.permanentFilter = filter; + this.excludeSource = excludeSource; + } + + public GainAbilityControlledEffect(final GainAbilityControlledEffect effect) { + super(effect); + this.ability = effect.ability.copy(); + this.permanentFilter = effect.permanentFilter.copy(); + this.excludeSource = effect.excludeSource; + } + + @Override + public GainAbilityControlledEffect copy() { + return new GainAbilityControlledEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent perm: game.getBattlefield().getAllActivePermanents(permanentFilter, source.getControllerId())) { + if (!(excludeSource && perm.getId().equals(source.getSourceId()))) { + perm.addAbility(ability.copy()); + } + } + return true; + } + + @Override + public String getText(Ability source) { + StringBuilder sb = new StringBuilder(); + if (excludeSource) + sb.append("Other "); + sb.append(permanentFilter.getMessage()).append(" you control gain ").append(ability.getRule()); + sb.append(" ").append(duration.toString()); + return sb.toString(); + } + +} diff --git a/Mage/src/mage/abilities/effects/common/UntapSourceEffect.java b/Mage/src/mage/abilities/effects/common/UntapSourceEffect.java new file mode 100644 index 0000000000..6b00b7a543 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/UntapSourceEffect.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.abilities.effects.common; + +import mage.Constants.Outcome; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author Loki + */ +public class UntapSourceEffect extends OneShotEffect { + + public UntapSourceEffect() { + super(Outcome.Untap); + } + + public UntapSourceEffect(final UntapSourceEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + permanent.setTapped(false); + return true; + } + return false; + } + + @Override + public UntapSourceEffect copy() { + return new UntapSourceEffect(this); + } + + @Override + public String getText(Ability source) { + return "untap {this}"; + } +} diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java index cd38965198..708e80322b 100644 --- a/Mage/src/mage/cards/ExpansionSet.java +++ b/Mage/src/mage/cards/ExpansionSet.java @@ -1,143 +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.cards; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.lang.reflect.Constructor; -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author BetaSteward_at_googlemail.com - */ -public abstract class ExpansionSet implements Serializable { - - protected String name; - protected String code; - protected String symbolCode; - protected List cards; - - public ExpansionSet(String name, String code, String symbolCode, String packageName) { - this.name = name; - this.code = code; - this.symbolCode = symbolCode; - this.cards = getCardClassesForPackage(packageName); - } - - public List getCards() { - return cards; - } - - public String getName() { - return name; - } - - public String getCode() { - return code; - } - - public String getSymbolCode() { - return symbolCode; - } - - public Card createCard(Class clazz) { - try { - Constructor con = clazz.getConstructor(new Class[]{UUID.class}); - return (Card) con.newInstance(new Object[] {null}); - } catch (Exception ex) { - Logger.getLogger(ExpansionSet.class.getName()).log(Level.SEVERE, "Error creating card:" + clazz.getName(), ex); - return null; - } - } - - public Set createCards() { - Set created = new HashSet(); - for (Class clazz: cards) { - created.add(createCard(clazz)); - } - return created; - } - - @Override - public String toString() { - return name; - } - - protected ArrayList getCardClassesForPackage(String packageName) { - ArrayList classes = new ArrayList(); - // Get a File object for the package - File directory = null; - String fullPath; - String relPath = packageName.replace('.', '/'); - URL resource = ClassLoader.getSystemClassLoader().getResource(relPath); - if (resource == null) { - throw new RuntimeException("No resource for " + relPath); - } - fullPath = resource.getFile(); - directory = new File(fullPath); - - try { - String jarPath = fullPath.replaceFirst("[.]jar[!].*", ".jar").replaceFirst("file:", ""); - JarFile jarFile = new JarFile(jarPath); - Enumeration entries = jarFile.entries(); - while(entries.hasMoreElements()) { - JarEntry entry = entries.nextElement(); - String entryName = entry.getName(); - if(entryName.startsWith(relPath) && entryName.length() > (relPath.length() + "/".length())) { - String className = entryName.replace('/', '.').replace('\\', '.').replace(".class", ""); - try { - Class clazz = Class.forName(className); - if (CardImpl.class.isAssignableFrom(clazz)) { - classes.add(clazz); - } - } - catch (ClassNotFoundException e) { - throw new RuntimeException("ClassNotFoundException loading " + className); - } - } - } - } catch (IOException e) { - throw new RuntimeException(packageName + " (" + directory + ") does not appear to be a valid package", e); - } - return classes; - } - -} +/* +* 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.cards; + +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public abstract class ExpansionSet implements Serializable { + + protected String name; + protected String code; + protected String symbolCode; + protected List cards; + + public ExpansionSet(String name, String code, String symbolCode, String packageName) { + this.name = name; + this.code = code; + this.symbolCode = symbolCode; + this.cards = getCardClassesForPackage(packageName); + } + + public List getCards() { + return cards; + } + + public String getName() { + return name; + } + + public String getCode() { + return code; + } + + public String getSymbolCode() { + return symbolCode; + } + + public Card createCard(Class clazz) { + try { + Constructor con = clazz.getConstructor(new Class[]{UUID.class}); + return (Card) con.newInstance(new Object[] {null}); + } catch (Exception ex) { + Logger.getLogger(ExpansionSet.class.getName()).log(Level.SEVERE, "Error creating card:" + clazz.getName(), ex); + return null; + } + } + + public Set createCards() { + Set created = new HashSet(); + for (Class clazz: cards) { + created.add(createCard(clazz)); + } + return created; + } + + @Override + public String toString() { + return name; + } + + protected ArrayList getCardClassesForPackage(String packageName) { + ArrayList classes = new ArrayList(); + // Get a File object for the package + File directory = null; + String fullPath; + String relPath = packageName.replace('.', '/'); + URL resource = ClassLoader.getSystemClassLoader().getResource(relPath); + if (resource == null) { + throw new RuntimeException("No resource for " + relPath); + } + fullPath = resource.getFile(); + directory = new File(fullPath); + + try { + String jarPath = fullPath.replaceFirst("[.]jar[!].*", ".jar").replaceFirst("file:", "").replaceAll("%20", " "); + JarFile jarFile = new JarFile(jarPath); + Enumeration entries = jarFile.entries(); + while(entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + String entryName = entry.getName(); + if(entryName.startsWith(relPath) && entryName.length() > (relPath.length() + "/".length())) { + String className = entryName.replace('/', '.').replace('\\', '.').replace(".class", ""); + try { + Class clazz = Class.forName(className); + if (CardImpl.class.isAssignableFrom(clazz)) { + classes.add(clazz); + } + } + catch (ClassNotFoundException e) { + throw new RuntimeException("ClassNotFoundException loading " + className); + } + } + } + } catch (IOException e) { + throw new RuntimeException(packageName + " (" + directory + ") does not appear to be a valid package", e); + } + return classes; + } + +}