diff --git a/.gitattributes b/.gitattributes index e2a7eaaea7f..4a84b9da627 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9551,6 +9551,7 @@ src/main/java/forge/GUI_DeckAnalysis.java svneol=native#text/plain src/main/java/forge/GUI_ImportPicture.java svneol=native#text/plain src/main/java/forge/GameAction.java svneol=native#text/plain src/main/java/forge/GameActionUtil.java svneol=native#text/plain +src/main/java/forge/GameEntity.java -text src/main/java/forge/GuiDisplay4.java svneol=native#text/plain src/main/java/forge/GuiDisplayUtil.java svneol=native#text/plain src/main/java/forge/GuiFilter.java svneol=native#text/plain diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 1592255f967..af21fda80da 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -31,7 +31,7 @@ import forge.card.trigger.Trigger; * @author Forge * @version $Id$ */ -public class Card extends MyObservable implements Comparable { +public class Card extends GameEntity implements Comparable { private static int nextUniqueNumber = 1; private int uniqueNumber = nextUniqueNumber++; @@ -120,7 +120,6 @@ public class Card extends MyObservable implements Comparable { private int damage; private int nShield; // regeneration - private int preventNextDamage = 0; private int turnInZone; @@ -144,7 +143,6 @@ public class Card extends MyObservable implements Comparable { private Player owner = null; private ArrayList controllerObjects = new ArrayList(); - private String name = ""; private String imageName = ""; private String rarity = ""; private String text = ""; @@ -2032,51 +2030,6 @@ public class Card extends MyObservable implements Comparable { return res; } - - //PreventNextDamage - /** - *

Setter for the field preventNextDamage.

- * - * @param n a int. - */ - public void setpreventNextDamage(int n) { - preventNextDamage = n; - } - - /** - *

Getter for the field preventNextDamage.

- * - * @return a int. - */ - public int getPreventNextDamage() { - return preventNextDamage; - } - - /** - *

addPreventNextDamage.

- * - * @param n a int. - */ - public void addPreventNextDamage(int n) { - preventNextDamage += n; - } - - /** - *

subtractPreventNextDamage.

- * - * @param n a int. - */ - public void subtractPreventNextDamage(int n) { - preventNextDamage -= n; - } - - /** - *

resetPreventNextDamage.

- */ - public void resetPreventNextDamage() { - preventNextDamage = 0; - } - //shield = regeneration /** *

setShield.

@@ -2683,16 +2636,7 @@ public class Card extends MyObservable implements Comparable { */ public String getImageName() { if (!imageName.equals("")) return imageName; - return name; - } - - /** - *

Getter for the field name.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return name; + return getName(); } /** @@ -2793,16 +2737,6 @@ public class Card extends MyObservable implements Comparable { controllerObjects = in; } - /** - *

Setter for the field name.

- * - * @param s a {@link java.lang.String} object. - */ - public void setName(String s) { - name = s; - this.updateObservers(); - } - /** *

Setter for the field owner.

* @@ -4748,6 +4682,7 @@ public class Card extends MyObservable implements Comparable { * @param source a {@link forge.Card} object. * @return a boolean. */ + @Override public boolean isValid(final String Restriction, final Player sourceController, final Card source) { if (getName().equals("Mana Pool") || isImmutable()) return false; @@ -4783,6 +4718,7 @@ public class Card extends MyObservable implements Comparable { * @param source a {@link forge.Card} object. * @return a boolean. */ + @Override public boolean hasProperty(String Property, final Player sourceController, final Card source) { //by name can also have color names, so needs to happen before colors. if (Property.startsWith("named")) { @@ -5285,9 +5221,9 @@ public class Card extends MyObservable implements Comparable { * @return a int. */ public int getKillDamage() { - int killDamage = getLethalDamage() + preventNextDamage; - if (killDamage > preventNextDamage && hasStartOfKeyword("When CARDNAME is dealt damage, destroy it.")) - killDamage = 1 + preventNextDamage; + int killDamage = getLethalDamage() + getPreventNextDamage(); + if (killDamage > getPreventNextDamage() && hasStartOfKeyword("When CARDNAME is dealt damage, destroy it.")) + killDamage = 1 + getPreventNextDamage(); return killDamage; } @@ -5433,26 +5369,6 @@ public class Card extends MyObservable implements Comparable { return restDamage; } - //This function helps the AI calculate the actual amount of damage an effect would deal - /** - *

predictDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int predictDamage(final int damage, final Card source, final boolean isCombat) { - - int restDamage = damage; - - restDamage = staticReplaceDamage(restDamage, source, isCombat); - - restDamage = staticDamagePrevention(restDamage, source, isCombat); - - return restDamage; - } - //This should be also usable by the AI to forecast an effect (so it must not change the game state) /** *

staticDamagePrevention.

@@ -5483,6 +5399,7 @@ public class Card extends MyObservable implements Comparable { * @param isCombat a boolean. * @return a int. */ + @Override public int staticDamagePrevention(final int damage, final Card source, final boolean isCombat) { if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; @@ -5561,6 +5478,7 @@ public class Card extends MyObservable implements Comparable { * @param isCombat a boolean. * @return a int. */ + @Override public int preventDamage(final int damage, Card source, boolean isCombat) { if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; @@ -5581,12 +5499,12 @@ public class Card extends MyObservable implements Comparable { this.subtractCounter(Counters.P1P1, 1); } - if (restDamage >= preventNextDamage) { - restDamage = restDamage - preventNextDamage; - preventNextDamage = 0; + if (restDamage >= getPreventNextDamage()) { + restDamage = restDamage - getPreventNextDamage(); + setPreventNextDamage(0); } else { + setPreventNextDamage(getPreventNextDamage() - restDamage); restDamage = 0; - preventNextDamage = preventNextDamage - restDamage; } if (getName().equals("Phyrexian Hydra")) { @@ -5606,6 +5524,7 @@ public class Card extends MyObservable implements Comparable { * @param isCombat a boolean. * @return a int. */ + @Override public int staticReplaceDamage(final int damage, Card source, boolean isCombat) { int restDamage = damage; @@ -5676,6 +5595,7 @@ public class Card extends MyObservable implements Comparable { * @param isCombat a boolean. * @return a int. */ + @Override public int replaceDamage(final int damage, Card source, boolean isCombat) { int restDamage = damage; @@ -5712,37 +5632,6 @@ public class Card extends MyObservable implements Comparable { } } - //This is for noncombat damage - /** - *

addDamage.

- * - * @param damageIn a int. - * @param source a {@link forge.Card} object. - */ - public void addDamage(final int damageIn, final Card source) { - int damageToAdd = damageIn; - - damageToAdd = replaceDamage(damageToAdd, source, false); - damageToAdd = preventDamage(damageToAdd, source, false); - - addDamageAfterPrevention(damageToAdd, source, false); - - } - - /** - *

addDamageWithoutPrevention.

- * - * @param damageIn a int. - * @param source a {@link forge.Card} object. - */ - public void addDamageWithoutPrevention(final int damageIn, final Card source) { - int damageToAdd = damageIn; - - damageToAdd = replaceDamage(damageToAdd, source, false); - - addDamageAfterPrevention(damageToAdd, source, false); - } - //This function handles damage after replacement and prevention effects are applied /** *

addDamageAfterPrevention.

@@ -5751,6 +5640,7 @@ public class Card extends MyObservable implements Comparable { * @param source a {@link forge.Card} object. * @param isCombat a boolean. */ + @Override public void addDamageAfterPrevention(final int damageIn, final Card source, final boolean isCombat) { int damageToAdd = damageIn; boolean wither = false; diff --git a/src/main/java/forge/GameEntity.java b/src/main/java/forge/GameEntity.java new file mode 100644 index 00000000000..407fb573448 --- /dev/null +++ b/src/main/java/forge/GameEntity.java @@ -0,0 +1,261 @@ +package forge; + +import forge.card.spellability.SpellAbility; + + +/** + *

Abstract Player class.

+ * + * @author Forge + * @version $Id: Player.java 10091 2011-08-30 16:11:21Z Sloth $ + */ +public abstract class GameEntity extends MyObservable { + private String name = ""; + private int preventNextDamage = 0; + + /** + *

Getter for the field name.

+ * + * @return a {@link java.lang.String} object. + */ + public String getName() { + return name; + } + + + /** + *

Setter for the field name.

+ * + * @param s a {@link java.lang.String} object. + */ + public void setName(String s) { + name = s; + } + + ////////////////////////// + // + // methods for handling damage + // + ////////////////////////// + + /** + *

addDamage.

+ * + * @param damage a int. + * @param source a {@link forge.Card} object. + */ + public void addDamage(final int damage, final Card source) { + int damageToDo = damage; + + damageToDo = replaceDamage(damageToDo, source, false); + damageToDo = preventDamage(damageToDo, source, false); + + addDamageAfterPrevention(damageToDo, source, false); + } + + /** + *

addDamageWithoutPrevention.

+ * + * @param damage a int. + * @param source a {@link forge.Card} object. + */ + public void addDamageWithoutPrevention(final int damage, final Card source) { + int damageToDo = damage; + + damageToDo = replaceDamage(damageToDo, source, false); + + addDamageAfterPrevention(damageToDo, source, false); + } + + //This function handles damage after replacement and prevention effects are applied + /** + *

addDamageAfterPrevention.

+ * + * @param damage a int. + * @param source a {@link forge.Card} object. + * @param isCombat a boolean. + */ + public void addDamageAfterPrevention(final int damage, final Card source, final boolean isCombat) { + + } + + /** + *

predictDamage.

+ * + * @param damage a int. + * @param source a {@link forge.Card} object. + * @param isCombat a boolean. + * @return a int. + */ + //This function helps the AI calculate the actual amount of damage an effect would deal + public int predictDamage(final int damage, final Card source, final boolean isCombat) { + + int restDamage = damage; + + restDamage = staticReplaceDamage(restDamage, source, isCombat); + restDamage = staticDamagePrevention(restDamage, source, isCombat); + + return restDamage; + } + + //This should be also usable by the AI to forecast an effect (so it must not change the game state) + /** + *

staticDamagePrevention.

+ * + * @param damage a int. + * @param source a {@link forge.Card} object. + * @param isCombat a boolean. + * @return a int. + */ + public int staticDamagePrevention(final int damage, final Card source, final boolean isCombat) { + return 0; + } + + //This should be also usable by the AI to forecast an effect (so it must not change the game state) + /** + *

staticReplaceDamage.

+ * + * @param damage a int. + * @param source a {@link forge.Card} object. + * @param isCombat a boolean. + * @return a int. + */ + public int staticReplaceDamage(final int damage, Card source, boolean isCombat) { + return 0; + } + + /** + *

replaceDamage.

+ * + * @param damage a int. + * @param source a {@link forge.Card} object. + * @param isCombat a boolean. + * @return a int. + */ + public int replaceDamage(final int damage, Card source, boolean isCombat) { + return 0; + } + + /** + *

preventDamage.

+ * + * @param damage a int. + * @param source a {@link forge.Card} object. + * @param isCombat a boolean. + * @return a int. + */ + public int preventDamage(final int damage, Card source, boolean isCombat) { + return 0; + } + + ////////////////////////// + // + // methods for handling Damage Prevention + // + ////////////////////////// + + //PreventNextDamage + /** + *

Setter for the field preventNextDamage.

+ * + * @param n a int. + */ + public void setPreventNextDamage(int n) { + preventNextDamage = n; + } + + /** + *

Getter for the field preventNextDamage.

+ * + * @return a int. + */ + public int getPreventNextDamage() { + return preventNextDamage; + } + + /** + *

addPreventNextDamage.

+ * + * @param n a int. + */ + public void addPreventNextDamage(int n) { + preventNextDamage += n; + } + + /** + *

subtractPreventNextDamage.

+ * + * @param n a int. + */ + public void subtractPreventNextDamage(int n) { + preventNextDamage -= n; + } + + /** + *

resetPreventNextDamage.

+ */ + public void resetPreventNextDamage() { + preventNextDamage = 0; + } + + + public boolean hasKeyword(String keyword){ + return false; + } + + /** + * + * @param sa + * @return a boolean + */ + public boolean canTarget(SpellAbility sa) { + return false; + } + + public boolean isValid(final String Restriction, final Player sourceController, final Card source) { + + String incR[] = Restriction.split("\\."); + + if (!incR[0].equals("Player") && + !(incR[0].equals("Opponent") && !this.equals(sourceController)) && + !(incR[0].equals("You") && this.equals(sourceController))) + return false; + + if (incR.length > 1) { + final String excR = incR[1]; + String exR[] = excR.split("\\+"); // Exclusive Restrictions are ... + for (int j = 0; j < exR.length; j++) + if (hasProperty(exR[j], sourceController, source) == false) return false; + } + + return true; + } + + public boolean hasProperty(String Property, final Player sourceController, final Card source) { + + if (Property.equals("You")) { + if (!this.equals(sourceController)) { + return false; + } + } + else if (Property.equals("Opponent")) { + if (this.equals(sourceController)) { + return false; + } + } + + return true; + } + + //////////////////////////////// + // + // generic Object overrides + // + ///////////////////////////////// + + /** {@inheritDoc} */ + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/forge/Player.java b/src/main/java/forge/Player.java index cd9a6a15ac6..96c2cbca5f9 100644 --- a/src/main/java/forge/Player.java +++ b/src/main/java/forge/Player.java @@ -16,12 +16,10 @@ import java.util.*; * @author Forge * @version $Id$ */ -public abstract class Player extends MyObservable { - protected String name; +public abstract class Player extends GameEntity { protected int poisonCounters; protected int life; protected int assignedDamage; - protected int preventNextDamage; protected int numPowerSurgeLands; protected boolean altWin = false; @@ -67,7 +65,7 @@ public abstract class Player extends MyObservable { public Player(String myName, int myLife, int myPoisonCounters) { reset(); - name = myName; + setName(myName); life = myLife; poisonCounters = myPoisonCounters; } @@ -79,7 +77,7 @@ public abstract class Player extends MyObservable { life = 20; poisonCounters = 0; assignedDamage = 0; - preventNextDamage = 0; + setPreventNextDamage(0); lastDrawnCard = null; numDrawnThisTurn = 0; slowtripList = new CardList(); @@ -100,15 +98,6 @@ public abstract class Player extends MyObservable { this.updateObservers(); } - /** - *

Getter for the field name.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return name; - } - /** *

isHuman.

* @@ -130,7 +119,7 @@ public abstract class Player extends MyObservable { * @return a boolean. */ public boolean isPlayer(Player p1) { - return p1 != null && p1.getName().equals(this.name); + return p1 != null && p1.getName().equals(getName()); } /** @@ -322,35 +311,6 @@ public abstract class Player extends MyObservable { // ////////////////////////// - /** - *

addDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - */ - public void addDamage(final int damage, final Card source) { - int damageToDo = damage; - - damageToDo = replaceDamage(damageToDo, source, false); - damageToDo = preventDamage(damageToDo, source, false); - - addDamageAfterPrevention(damageToDo, source, false); - } - - /** - *

addDamageWithoutPrevention.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - */ - public void addDamageWithoutPrevention(final int damage, final Card source) { - int damageToDo = damage; - - damageToDo = replaceDamage(damageToDo, source, false); - - addDamageAfterPrevention(damageToDo, source, false); - } - //This function handles damage after replacement and prevention effects are applied /** *

addDamageAfterPrevention.

@@ -359,6 +319,7 @@ public abstract class Player extends MyObservable { * @param source a {@link forge.Card} object. * @param isCombat a boolean. */ + @Override public void addDamageAfterPrevention(final int damage, final Card source, final boolean isCombat) { int damageToDo = damage; @@ -420,6 +381,7 @@ public abstract class Player extends MyObservable { * @param isCombat a boolean. * @return a int. */ + @Override public int staticDamagePrevention(final int damage, final Card source, final boolean isCombat) { if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; @@ -478,6 +440,7 @@ public abstract class Player extends MyObservable { * @param isCombat a boolean. * @return a int. */ + @Override public int staticReplaceDamage(final int damage, Card source, boolean isCombat) { int restDamage = damage; @@ -541,6 +504,7 @@ public abstract class Player extends MyObservable { * @param isCombat a boolean. * @return a int. */ + @Override public int replaceDamage(final int damage, Card source, boolean isCombat) { int restDamage = staticReplaceDamage(damage, source, isCombat); @@ -578,6 +542,7 @@ public abstract class Player extends MyObservable { * @param isCombat a boolean. * @return a int. */ + @Override public int preventDamage(final int damage, Card source, boolean isCombat) { if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; @@ -592,12 +557,12 @@ public abstract class Player extends MyObservable { restDamage = staticDamagePrevention(restDamage, source, isCombat); - if (restDamage >= preventNextDamage) { - restDamage = restDamage - preventNextDamage; - preventNextDamage = 0; + if (restDamage >= getPreventNextDamage()) { + restDamage = restDamage - getPreventNextDamage(); + setPreventNextDamage(0); } else { + setPreventNextDamage(getPreventNextDamage() - restDamage); restDamage = 0; - preventNextDamage = preventNextDamage - restDamage; } return restDamage; @@ -650,56 +615,6 @@ public abstract class Player extends MyObservable { } } - ////////////////////////// - // - // methods for handling Damage Prevention - // - ////////////////////////// - - //PreventNextDamage - /** - *

Setter for the field preventNextDamage.

- * - * @param n a int. - */ - public void setpreventNextDamage(int n) { - preventNextDamage = n; - } - - /** - *

Getter for the field preventNextDamage.

- * - * @return a int. - */ - public int getPreventNextDamage() { - return preventNextDamage; - } - - /** - *

addPreventNextDamage.

- * - * @param n a int. - */ - public void addPreventNextDamage(int n) { - preventNextDamage += n; - } - - /** - *

subtractPreventNextDamage.

- * - * @param n a int. - */ - public void subtractPreventNextDamage(int n) { - preventNextDamage -= n; - } - - /** - *

resetPreventNextDamage.

- */ - public void resetPreventNextDamage() { - preventNextDamage = 0; - } - ////////////////////////// // // methods for handling Poison counters @@ -770,6 +685,7 @@ public abstract class Player extends MyObservable { * @param sa * @return a boolean */ + @Override public boolean canTarget(SpellAbility sa) { if (hasKeyword("Shroud") || (!this.isPlayer(sa.getActivatingPlayer()) && hasKeyword("Hexproof"))) @@ -1669,6 +1585,7 @@ public abstract class Player extends MyObservable { prowl = new ArrayList(); } + @Override public boolean isValid(final String Restriction, final Player sourceController, final Card source) { String incR[] = Restriction.split("\\."); @@ -1688,6 +1605,7 @@ public abstract class Player extends MyObservable { return true; } + @Override public boolean hasProperty(String Property, final Player sourceController, final Card source) { if (Property.equals("You")) { @@ -1939,13 +1857,7 @@ public abstract class Player extends MyObservable { public boolean equals(Object o) { if (o instanceof Player) { Player p1 = (Player) o; - return p1.getName().equals(name); + return p1.getName().equals(getName()); } else return false; } - - /** {@inheritDoc} */ - @Override - public String toString() { - return name; - } }