- Added GameEntity class as parent of Card and Player class.

This commit is contained in:
Sloth
2011-09-01 15:15:12 +00:00
parent d1a5e97692
commit d3460d9d88
4 changed files with 295 additions and 231 deletions

View File

@@ -31,7 +31,7 @@ import forge.card.trigger.Trigger;
* @author Forge
* @version $Id$
*/
public class Card extends MyObservable implements Comparable<Card> {
public class Card extends GameEntity implements Comparable<Card> {
private static int nextUniqueNumber = 1;
private int uniqueNumber = nextUniqueNumber++;
@@ -120,7 +120,6 @@ public class Card extends MyObservable implements Comparable<Card> {
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<Card> {
private Player owner = null;
private ArrayList<Object> controllerObjects = new ArrayList<Object>();
private String name = "";
private String imageName = "";
private String rarity = "";
private String text = "";
@@ -2032,51 +2030,6 @@ public class Card extends MyObservable implements Comparable<Card> {
return res;
}
//PreventNextDamage
/**
* <p>Setter for the field <code>preventNextDamage</code>.</p>
*
* @param n a int.
*/
public void setpreventNextDamage(int n) {
preventNextDamage = n;
}
/**
* <p>Getter for the field <code>preventNextDamage</code>.</p>
*
* @return a int.
*/
public int getPreventNextDamage() {
return preventNextDamage;
}
/**
* <p>addPreventNextDamage.</p>
*
* @param n a int.
*/
public void addPreventNextDamage(int n) {
preventNextDamage += n;
}
/**
* <p>subtractPreventNextDamage.</p>
*
* @param n a int.
*/
public void subtractPreventNextDamage(int n) {
preventNextDamage -= n;
}
/**
* <p>resetPreventNextDamage.</p>
*/
public void resetPreventNextDamage() {
preventNextDamage = 0;
}
//shield = regeneration
/**
* <p>setShield.</p>
@@ -2683,16 +2636,7 @@ public class Card extends MyObservable implements Comparable<Card> {
*/
public String getImageName() {
if (!imageName.equals("")) return imageName;
return name;
}
/**
* <p>Getter for the field <code>name</code>.</p>
*
* @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<Card> {
controllerObjects = in;
}
/**
* <p>Setter for the field <code>name</code>.</p>
*
* @param s a {@link java.lang.String} object.
*/
public void setName(String s) {
name = s;
this.updateObservers();
}
/**
* <p>Setter for the field <code>owner</code>.</p>
*
@@ -4748,6 +4682,7 @@ public class Card extends MyObservable implements Comparable<Card> {
* @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<Card> {
* @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<Card> {
* @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<Card> {
return restDamage;
}
//This function helps the AI calculate the actual amount of damage an effect would deal
/**
* <p>predictDamage.</p>
*
* @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)
/**
* <p>staticDamagePrevention.</p>
@@ -5483,6 +5399,7 @@ public class Card extends MyObservable implements Comparable<Card> {
* @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<Card> {
* @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<Card> {
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<Card> {
* @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<Card> {
* @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<Card> {
}
}
//This is for noncombat damage
/**
* <p>addDamage.</p>
*
* @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);
}
/**
* <p>addDamageWithoutPrevention.</p>
*
* @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
/**
* <p>addDamageAfterPrevention.</p>
@@ -5751,6 +5640,7 @@ public class Card extends MyObservable implements Comparable<Card> {
* @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;

View File

@@ -0,0 +1,261 @@
package forge;
import forge.card.spellability.SpellAbility;
/**
* <p>Abstract Player class.</p>
*
* @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;
/**
* <p>Getter for the field <code>name</code>.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getName() {
return name;
}
/**
* <p>Setter for the field <code>name</code>.</p>
*
* @param s a {@link java.lang.String} object.
*/
public void setName(String s) {
name = s;
}
//////////////////////////
//
// methods for handling damage
//
//////////////////////////
/**
* <p>addDamage.</p>
*
* @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);
}
/**
* <p>addDamageWithoutPrevention.</p>
*
* @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
/**
* <p>addDamageAfterPrevention.</p>
*
* @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) {
}
/**
* <p>predictDamage.</p>
*
* @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)
/**
* <p>staticDamagePrevention.</p>
*
* @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)
/**
* <p>staticReplaceDamage.</p>
*
* @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;
}
/**
* <p>replaceDamage.</p>
*
* @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;
}
/**
* <p>preventDamage.</p>
*
* @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
/**
* <p>Setter for the field <code>preventNextDamage</code>.</p>
*
* @param n a int.
*/
public void setPreventNextDamage(int n) {
preventNextDamage = n;
}
/**
* <p>Getter for the field <code>preventNextDamage</code>.</p>
*
* @return a int.
*/
public int getPreventNextDamage() {
return preventNextDamage;
}
/**
* <p>addPreventNextDamage.</p>
*
* @param n a int.
*/
public void addPreventNextDamage(int n) {
preventNextDamage += n;
}
/**
* <p>subtractPreventNextDamage.</p>
*
* @param n a int.
*/
public void subtractPreventNextDamage(int n) {
preventNextDamage -= n;
}
/**
* <p>resetPreventNextDamage.</p>
*/
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;
}
}

View File

@@ -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();
}
/**
* <p>Getter for the field <code>name</code>.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getName() {
return name;
}
/**
* <p>isHuman.</p>
*
@@ -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 {
//
//////////////////////////
/**
* <p>addDamage.</p>
*
* @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);
}
/**
* <p>addDamageWithoutPrevention.</p>
*
* @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
/**
* <p>addDamageAfterPrevention.</p>
@@ -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
/**
* <p>Setter for the field <code>preventNextDamage</code>.</p>
*
* @param n a int.
*/
public void setpreventNextDamage(int n) {
preventNextDamage = n;
}
/**
* <p>Getter for the field <code>preventNextDamage</code>.</p>
*
* @return a int.
*/
public int getPreventNextDamage() {
return preventNextDamage;
}
/**
* <p>addPreventNextDamage.</p>
*
* @param n a int.
*/
public void addPreventNextDamage(int n) {
preventNextDamage += n;
}
/**
* <p>subtractPreventNextDamage.</p>
*
* @param n a int.
*/
public void subtractPreventNextDamage(int n) {
preventNextDamage -= n;
}
/**
* <p>resetPreventNextDamage.</p>
*/
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<String>();
}
@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;
}
}