diff --git a/.gitattributes b/.gitattributes index 0c1435049e0..246dcfce667 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14100,6 +14100,7 @@ src/main/java/forge/card/replacement/ReplacementEffect.java -text src/main/java/forge/card/replacement/ReplacementHandler.java -text src/main/java/forge/card/replacement/ReplacementLayer.java -text src/main/java/forge/card/replacement/ReplacementResult.java -text +src/main/java/forge/card/replacement/ReplacementType.java -text src/main/java/forge/card/replacement/package-info.java svneol=native#text/plain src/main/java/forge/card/spellability/Ability.java svneol=native#text/plain src/main/java/forge/card/spellability/AbilityActivated.java svneol=native#text/plain diff --git a/src/main/java/forge/card/replacement/ReplaceDamage.java b/src/main/java/forge/card/replacement/ReplaceDamage.java index 29507e9fda1..80961eca088 100644 --- a/src/main/java/forge/card/replacement/ReplaceDamage.java +++ b/src/main/java/forge/card/replacement/ReplaceDamage.java @@ -94,17 +94,6 @@ public class ReplaceDamage extends ReplacementEffect { return true; } - /* (non-Javadoc) - * @see forge.card.replacement.ReplacementEffect#getCopy() - */ - @Override - public ReplacementEffect getCopy() { - ReplacementEffect res = new ReplaceDamage(this.getMapParams(), this.getHostCard()); - res.setOverridingAbility(this.getOverridingAbility()); - res.setActiveZone(validHostZones); - res.setLayer(getLayer()); - return res; - } /* (non-Javadoc) * @see forge.card.replacement.ReplacementEffect#setReplacingObjects(java.util.HashMap, forge.card.spellability.SpellAbility) diff --git a/src/main/java/forge/card/replacement/ReplaceDiscard.java b/src/main/java/forge/card/replacement/ReplaceDiscard.java index 4821e4ef89e..a777eebaecf 100644 --- a/src/main/java/forge/card/replacement/ReplaceDiscard.java +++ b/src/main/java/forge/card/replacement/ReplaceDiscard.java @@ -70,18 +70,6 @@ public class ReplaceDiscard extends ReplacementEffect { return true; } - /* (non-Javadoc) - * @see forge.card.replacement.ReplacementEffect#getCopy() - */ - @Override - public ReplacementEffect getCopy() { - ReplacementEffect res = new ReplaceDiscard(this.getMapParams(), this.getHostCard()); - res.setOverridingAbility(this.getOverridingAbility()); - res.setActiveZone(validHostZones); - res.setLayer(getLayer()); - return res; - } - /* (non-Javadoc) * @see forge.card.replacement.ReplacementEffect#setReplacingObjects(java.util.HashMap, forge.card.spellability.SpellAbility) */ diff --git a/src/main/java/forge/card/replacement/ReplaceDraw.java b/src/main/java/forge/card/replacement/ReplaceDraw.java index d0691a209ee..26f8a6c5d2e 100644 --- a/src/main/java/forge/card/replacement/ReplaceDraw.java +++ b/src/main/java/forge/card/replacement/ReplaceDraw.java @@ -65,17 +65,7 @@ public class ReplaceDraw extends ReplacementEffect { return true; } - /* (non-Javadoc) - * @see forge.card.replacement.ReplacementEffect#getCopy() - */ - @Override - public ReplacementEffect getCopy() { - ReplacementEffect res = new ReplaceDraw(this.getMapParams(), this.getHostCard()); - res.setOverridingAbility(this.getOverridingAbility()); - res.setActiveZone(validHostZones); - res.setLayer(getLayer()); - return res; - } + /* (non-Javadoc) * @see forge.card.replacement.ReplacementEffect#setReplacingObjects(java.util.HashMap, forge.card.spellability.SpellAbility) diff --git a/src/main/java/forge/card/replacement/ReplaceGainLife.java b/src/main/java/forge/card/replacement/ReplaceGainLife.java index a5ae9774200..b9d377388ff 100644 --- a/src/main/java/forge/card/replacement/ReplaceGainLife.java +++ b/src/main/java/forge/card/replacement/ReplaceGainLife.java @@ -65,18 +65,6 @@ public class ReplaceGainLife extends ReplacementEffect { return true; } - /* (non-Javadoc) - * @see forge.card.replacement.ReplacementEffect#getCopy() - */ - @Override - public ReplacementEffect getCopy() { - ReplacementEffect res = new ReplaceGainLife(this.getMapParams(), this.getHostCard()); - res.setOverridingAbility(this.getOverridingAbility()); - res.setActiveZone(validHostZones); - res.setLayer(getLayer()); - return res; - } - /* (non-Javadoc) * @see forge.card.replacement.ReplacementEffect#setReplacingObjects(java.util.HashMap, forge.card.spellability.SpellAbility) */ diff --git a/src/main/java/forge/card/replacement/ReplaceGameLoss.java b/src/main/java/forge/card/replacement/ReplaceGameLoss.java index fc98590dce3..bfbfbd5d2ac 100644 --- a/src/main/java/forge/card/replacement/ReplaceGameLoss.java +++ b/src/main/java/forge/card/replacement/ReplaceGameLoss.java @@ -37,16 +37,4 @@ public class ReplaceGameLoss extends ReplacementEffect { return true; } - /* (non-Javadoc) - * @see forge.card.replacement.ReplacementEffect#getCopy() - */ - @Override - public ReplacementEffect getCopy() { - ReplacementEffect res = new ReplaceGameLoss(this.getMapParams(), this.getHostCard()); - res.setOverridingAbility(this.getOverridingAbility()); - res.setActiveZone(validHostZones); - res.setLayer(getLayer()); - return res; - } - } diff --git a/src/main/java/forge/card/replacement/ReplaceMoved.java b/src/main/java/forge/card/replacement/ReplaceMoved.java index f538bb1dd33..e91ef715ecb 100644 --- a/src/main/java/forge/card/replacement/ReplaceMoved.java +++ b/src/main/java/forge/card/replacement/ReplaceMoved.java @@ -66,18 +66,6 @@ public class ReplaceMoved extends ReplacementEffect { return true; } - /* (non-Javadoc) - * @see forge.card.replacement.ReplacementEffect#getCopy() - */ - @Override - public ReplacementEffect getCopy() { - ReplacementEffect res = new ReplaceMoved(this.getMapParams(), this.getHostCard()); - res.setOverridingAbility(this.getOverridingAbility()); - res.setActiveZone(validHostZones); - res.setLayer(getLayer()); - return res; - } - /* (non-Javadoc) * @see forge.card.replacement.ReplacementEffect#setReplacingObjects(java.util.HashMap, forge.card.spellability.SpellAbility) */ diff --git a/src/main/java/forge/card/replacement/ReplaceSetInMotion.java b/src/main/java/forge/card/replacement/ReplaceSetInMotion.java index e382f40b743..ff6d86808ce 100644 --- a/src/main/java/forge/card/replacement/ReplaceSetInMotion.java +++ b/src/main/java/forge/card/replacement/ReplaceSetInMotion.java @@ -54,16 +54,4 @@ public class ReplaceSetInMotion extends ReplacementEffect { return true; } - /* (non-Javadoc) - * @see forge.card.replacement.ReplacementEffect#getCopy() - */ - @Override - public ReplacementEffect getCopy() { - ReplacementEffect res = new ReplaceSetInMotion(this.getMapParams(), this.getHostCard()); - res.setOverridingAbility(this.getOverridingAbility()); - res.setActiveZone(validHostZones); - res.setLayer(getLayer()); - return res; - } - } diff --git a/src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java b/src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java index 4f3ddc414ff..2cf9c4ca5f9 100644 --- a/src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java +++ b/src/main/java/forge/card/replacement/ReplaceTurnFaceUp.java @@ -37,18 +37,6 @@ public class ReplaceTurnFaceUp extends ReplacementEffect { return true; } - /* (non-Javadoc) - * @see forge.card.replacement.ReplacementEffect#getCopy() - */ - @Override - public ReplacementEffect getCopy() { - ReplacementEffect res = new ReplaceTurnFaceUp(this.getMapParams(), this.getHostCard()); - res.setOverridingAbility(this.getOverridingAbility()); - res.setActiveZone(validHostZones); - res.setLayer(getLayer()); - return res; - } - /* (non-Javadoc) * @see forge.card.replacement.ReplacementEffect#setReplacingObjects(java.util.HashMap, forge.card.spellability.SpellAbility) */ diff --git a/src/main/java/forge/card/replacement/ReplacementEffect.java b/src/main/java/forge/card/replacement/ReplacementEffect.java index e0140defee7..08c31a06226 100644 --- a/src/main/java/forge/card/replacement/ReplacementEffect.java +++ b/src/main/java/forge/card/replacement/ReplacementEffect.java @@ -17,7 +17,6 @@ */ package forge.card.replacement; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -51,6 +50,22 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { return this.hasRun; } + /** The map params, denoting what to replace. */ + protected final Map mapParams; + + /** + * Instantiates a new replacement effect. + * + * @param map + * the map + * @param host + * the host + */ + public ReplacementEffect(final Map map, final Card host) { + mapParams = map; + this.setHostCard(host); + } + /** * Checks if is secondary. * @@ -117,9 +132,6 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { this.hasRun = hasRun; } - /** The map params, denoting what to replace. */ - private Map mapParams = new HashMap(); - /** *

* Getter for the field mapParams. @@ -131,16 +143,6 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { return this.mapParams; } - /** - * Sets the map params. - * - * @param mapParams - * the mapParams to set - */ - public final void setMapParams(final Map mapParams) { - this.mapParams = mapParams; - } - /** * Can replace. * @@ -150,20 +152,6 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { */ public abstract boolean canReplace(final Map runParams); - /** - * To string. - * - * @return a String - */ - @Override - public String toString() { - if (this.getMapParams().containsKey("Description") && !this.isSuppressed()) { - return this.getMapParams().get("Description"); - } else { - return ""; - } - } - /** *

* requirementsCheck. @@ -210,7 +198,15 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { * * @return the copy */ - public abstract ReplacementEffect getCopy(); + public final ReplacementEffect getCopy() { + ReplacementType rt = ReplacementType.getTypeFor(this); + ReplacementEffect res = rt.createReplacement(mapParams, hostCard); + res.setOverridingAbility(this.getOverridingAbility()); + res.setActiveZone(validHostZones); + res.setLayer(getLayer()); + return res; + + } /** * Sets the replacing objects. @@ -224,19 +220,6 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { // Should be overridden by replacers that need it. } - /** - * Instantiates a new replacement effect. - * - * @param map - * the map - * @param host - * the host - */ - public ReplacementEffect(final Map map, final Card host) { - this.setMapParams(map); - this.setHostCard(host); - } - /** * @return the layer */ @@ -250,4 +233,18 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { public void setLayer(ReplacementLayer layer0) { this.layer = layer0; } + + /** + * To string. + * + * @return a String + */ + @Override + public String toString() { + if (this.getMapParams().containsKey("Description") && !this.isSuppressed()) { + return this.getMapParams().get("Description"); + } else { + return ""; + } + } } diff --git a/src/main/java/forge/card/replacement/ReplacementHandler.java b/src/main/java/forge/card/replacement/ReplacementHandler.java index 34f2a205ff1..f9c00d41275 100644 --- a/src/main/java/forge/card/replacement/ReplacementHandler.java +++ b/src/main/java/forge/card/replacement/ReplacementHandler.java @@ -254,6 +254,7 @@ public class ReplacementHandler { * @return A finished instance */ public static ReplacementEffect parseReplacement(final String repParse, final Card host) { + final Map mapParams = FileSection.parseToMap(repParse, "$", "|"); return ReplacementHandler.parseReplacement(mapParams, host); } @@ -269,27 +270,9 @@ public class ReplacementHandler { * The card that hosts the replacement effect * @return The finished instance */ - public static ReplacementEffect parseReplacement(final Map mapParams, final Card host) { - ReplacementEffect ret = null; - - final String eventToReplace = mapParams.get("Event"); - if (eventToReplace.equals("Draw")) { - ret = new ReplaceDraw(mapParams, host); - } else if (eventToReplace.equals("Discard")) { - ret = new ReplaceDiscard(mapParams, host); - } else if (eventToReplace.equals("GainLife")) { - ret = new ReplaceGainLife(mapParams, host); - } else if (eventToReplace.equals("DamageDone")) { - ret = new ReplaceDamage(mapParams, host); - } else if (eventToReplace.equals("GameLoss")) { - ret = new ReplaceGameLoss(mapParams, host); - } else if (eventToReplace.equals("Moved")) { - ret = new ReplaceMoved(mapParams, host); - } else if (eventToReplace.equals("SetInMotion")) { - ret = new ReplaceSetInMotion(mapParams, host); - } else if (eventToReplace.equals("TurnFaceUp")) { - ret = new ReplaceTurnFaceUp(mapParams, host); - } + private static ReplacementEffect parseReplacement(final Map mapParams, final Card host) { + final ReplacementType rt = ReplacementType.smartValueOf(mapParams.get("Event")); + ReplacementEffect ret = rt.createReplacement(mapParams, host); String activeZones = mapParams.get("ActiveZones"); if (null != activeZones) { diff --git a/src/main/java/forge/card/replacement/ReplacementType.java b/src/main/java/forge/card/replacement/ReplacementType.java new file mode 100644 index 00000000000..c185c7a1e26 --- /dev/null +++ b/src/main/java/forge/card/replacement/ReplacementType.java @@ -0,0 +1,81 @@ +package forge.card.replacement; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +import forge.Card; + +/** + * TODO: Write javadoc for this type. + * + */ +public enum ReplacementType { + DamageDone(ReplaceDamage.class), + Discard(ReplaceDiscard.class), + Draw(ReplaceDraw.class), + GainLife(ReplaceGainLife.class), + GameLoss(ReplaceGameLoss.class), + Moved(ReplaceMoved.class), + SetInMotion(ReplaceSetInMotion.class), + TurnFaceUp(ReplaceTurnFaceUp.class); + + Class clasz; + private ReplacementType(Class cls) { + clasz = cls; + } + + public static ReplacementType getTypeFor(ReplacementEffect e) { + final Class cls = e.getClass(); + for (final ReplacementType v : ReplacementType.values()) { + if (v.clasz.equals(cls)) { + return v; + } + } + return null; + } + + public static ReplacementType smartValueOf(String value) { + final String valToCompate = value.trim(); + for (final ReplacementType v : ReplacementType.values()) { + if (v.name().compareToIgnoreCase(valToCompate) == 0) { + return v; + } + } + throw new RuntimeException("Element " + value + " not found in TriggerType enum"); + } + + /** + * TODO: Write javadoc for this method. + * @param mapParams + * @param host + * @param intrinsic + * @return + */ + public ReplacementEffect createReplacement(Map mapParams, Card host) { + @SuppressWarnings("unchecked") + Constructor[] cc = (Constructor[]) clasz.getDeclaredConstructors(); + for (Constructor c : cc) { + Class[] pp = c.getParameterTypes(); + if (pp[0].isAssignableFrom(Map.class)) { + try { + ReplacementEffect res = c.newInstance(mapParams, host); + return res; + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log. + e.printStackTrace(); + } catch (InstantiationException e) { + // TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log. + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log. + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log. + e.printStackTrace(); + } + } + } + throw new RuntimeException("No constructor found that would take Map as 1st parameter in class " + clasz.getName()); + } +} diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 9c1bd250fa9..ba546bce796 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -328,8 +328,7 @@ public enum FControl { } public boolean mayShowCard(Card c) { - if ( game == null ) return true; - return !gameHasHumanPlayer || c.canBeShownTo(getCurrentPlayer()); + return game == null || !gameHasHumanPlayer || c.canBeShownTo(getCurrentPlayer()); } /** diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 26d5959059a..40d281a8977 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -1271,6 +1271,7 @@ public class GameAction { // Play the Destroy sound game.fireEvent(new GameEventCardDestroyed()); + // Run triggers final HashMap runParams = new HashMap(); runParams.put("Card", c); diff --git a/src/main/java/forge/gui/framework/InvalidLayoutFileException.java b/src/main/java/forge/gui/framework/InvalidLayoutFileException.java index e446852138f..3c638f4c4e3 100644 --- a/src/main/java/forge/gui/framework/InvalidLayoutFileException.java +++ b/src/main/java/forge/gui/framework/InvalidLayoutFileException.java @@ -6,4 +6,6 @@ package forge.gui.framework; */ public class InvalidLayoutFileException extends RuntimeException { + private static final long serialVersionUID = 8201703516717298690L; + }