Fix so card text shows up properly in details pane

This commit is contained in:
drdev
2014-10-10 15:43:21 +00:00
parent dfb260286a
commit 1d67bcbcc1
22 changed files with 254 additions and 207 deletions

View File

@@ -164,7 +164,7 @@ public class AbilityUtils {
}
}
else if (defined.equals("Remembered")) {
if (hostCard.getRemembered().isEmpty()) {
if (!hostCard.hasRemembered()) {
final Card newCard = game.getCardState(hostCard);
for (final Object o : newCard.getRemembered()) {
if (o instanceof Card) {
@@ -180,7 +180,7 @@ public class AbilityUtils {
}
}
else if (defined.equals("DirectRemembered")) {
if (hostCard.getRemembered().isEmpty()) {
if (!hostCard.hasRemembered()) {
final Card newCard = game.getCardState(hostCard);
for (final Object o : newCard.getRemembered()) {
if (o instanceof Card) {
@@ -456,7 +456,7 @@ public class AbilityUtils {
// Add whole Remembered list to handlePaid
final List<Card> list = new ArrayList<Card>();
Card newCard = card;
if (card.getRemembered().isEmpty()) {
if (!card.hasRemembered()) {
newCard = game.getCardState(card);
}
@@ -1287,11 +1287,12 @@ public class AbilityUtils {
}
}
else if (unlessCost.equals("RememberedCostMinus2")) {
if (source.getRemembered().isEmpty() || !(source.getRemembered().get(0) instanceof Card)) {
Card rememberedCard = (Card) source.getFirstRemembered();
if (rememberedCard == null) {
sa.resolve();
resolveSubAbilities(sa, game);
return;
}
Card rememberedCard = (Card) source.getRemembered().get(0);
ManaCostBeingPaid newCost = new ManaCostBeingPaid(rememberedCard.getManaCost());
newCost.decreaseColorlessMana(2);
cost = new Cost(newCost.toManaCost(), true);
@@ -1355,7 +1356,7 @@ public class AbilityUtils {
if (sa.hasParam("RememberCostMana")) {
host.clearRemembered();
host.getRemembered().addAll(sa.getPayingMana());
host.addRemembered(sa.getPayingMana());
}
if (sa.hasParam("RememberCostCards") && !sa.getPaidHash().isEmpty()) {

View File

@@ -133,14 +133,14 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
if (remember != null) {
game.getCardState(source).addRemembered(movedCard);
if (!source.getRemembered().contains(movedCard)) {
if (!source.isRemembered(movedCard)) {
source.addRemembered(movedCard);
}
}
if (remLKI && movedCard != null) {
final Card lki = CardUtil.getLKICopy(c);
game.getCardState(source).addRemembered(lki);
if (!source.getRemembered().contains(lki)) {
if (!source.isRemembered(lki)) {
source.addRemembered(lki);
}
}

View File

@@ -544,7 +544,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
hostCard.addRemembered(movedCard);
}
if (forget != null && !movedCard.getZone().equals(originZone)) {
hostCard.getRemembered().remove(movedCard);
hostCard.removeRemembered(movedCard);
}
if (imprint != null && !movedCard.getZone().equals(originZone)) {
hostCard.addImprintedCard(movedCard);

View File

@@ -138,7 +138,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
card.clearRemembered();
}
if (sa.hasParam("RememberHighest")) {
card.getRemembered().addAll(highestNum);
card.addRemembered(highestNum);
}
}
}

View File

@@ -23,7 +23,7 @@ public class CleanUpEffect extends SpellAbilityEffect {
}
if (sa.hasParam("ForgetDefined")) {
for (final Card card : AbilityUtils.getDefinedCards(source, sa.getParam("ForgetDefined"), sa)) {
source.getRemembered().remove(card);
source.removeRemembered(card);
}
}
if (sa.hasParam("ClearImprinted")) {

View File

@@ -174,31 +174,30 @@ public class CloneEffect extends SpellAbilityEffect {
@Override
public void run() {
if (cloneCard.isCloned()) {
cloneCard.switchStates(CardCharacteristicName.Cloner, CardCharacteristicName.Original);
cloneCard.setState(CardCharacteristicName.Original);
cloneCard.clearStates(CardCharacteristicName.Cloner);
cloneCard.switchStates(CardCharacteristicName.Cloner, CardCharacteristicName.Original);
cloneCard.setState(CardCharacteristicName.Original);
cloneCard.clearStates(CardCharacteristicName.Cloner);
}
}
};
String duration = sa.getParam("Duration");
if (duration.equals("UntilEndOfTurn")) {
game.getEndOfTurn().addUntil(unclone);
} else if (duration.equals("UntilYourNextTurn")) {
}
else if (duration.equals("UntilYourNextTurn")) {
game.getCleanup().addUntil(host.getController(), unclone);
}
}
game.fireEvent(new GameEventCardStatsChanged(tgtCard));
} // cloneResolve
private void addExtraCharacteristics(final Card tgtCard, final SpellAbility sa, final Map<String, String> origSVars) {
// additional types to clone
if (sa.hasParam("AddTypes")) {
for (final String type : Arrays.asList(sa.getParam("AddTypes").split(","))) {
tgtCard.addType(type);
}
for (final String type : Arrays.asList(sa.getParam("AddTypes").split(","))) {
tgtCard.addType(type);
}
}
// triggers to add to clone

View File

@@ -129,11 +129,11 @@ public class ControlGainEffect extends SpellAbilityEffect {
}
}
if (remember && !sa.getHostCard().getRemembered().contains(tgtC)) {
if (remember && !sa.getHostCard().isRemembered(tgtC)) {
sa.getHostCard().addRemembered(tgtC);
}
if (forget && sa.getHostCard().getRemembered().contains(tgtC)) {
if (forget && sa.getHostCard().isRemembered(tgtC)) {
sa.getHostCard().removeRemembered(tgtC);
}

View File

@@ -127,7 +127,7 @@ public class CounterEffect extends SpellAbilityEffect {
if (sa.hasParam("RememberSplicedOntoCounteredSpell")) {
if (tgtSA.getSplicedCards() != null) {
sa.getHostCard().getRemembered().addAll(tgtSA.getSplicedCards());
sa.getHostCard().addRemembered(tgtSA.getSplicedCards());
}
}
}

View File

@@ -11,12 +11,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.google.common.collect.Iterables;
public class DestroyEffect extends SpellAbilityEffect {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility)
*/
@Override
protected String getStackDescription(SpellAbility sa) {
final boolean noRegen = sa.hasParam("NoRegen");
@@ -99,9 +94,9 @@ public class DestroyEffect extends SpellAbilityEffect {
boolean destroyed = false;
final Card lki = CardUtil.getLKICopy(tgtC);
if (remAttached) {
Iterables.addAll(card.getRemembered(), tgtC.getEnchantedBy(false));
Iterables.addAll(card.getRemembered(), tgtC.getEquippedBy(false));
Iterables.addAll(card.getRemembered(), tgtC.getFortifiedBy(false));
card.addRemembered(tgtC.getEnchantedBy(false));
card.addRemembered(tgtC.getEquippedBy(false));
card.addRemembered(tgtC.getFortifiedBy(false));
}
if (sac) {
destroyed = game.getAction().sacrifice(tgtC, sa) != null;

View File

@@ -250,8 +250,9 @@ public class PumpEffect extends SpellAbilityEffect {
final String targets = Lang.joinHomogenous(tgtCards);
final String message = sa.hasParam("OptionQuestion") ? sa.getParam("OptionQuestion").replace("TARGETS", targets) : "Apply pump to " + targets + "?";
if ( !sa.getActivatingPlayer().getController().confirmAction(sa, null, message) )
if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) {
return;
}
}
if (sa.hasParam("RememberObjects")) {
@@ -260,9 +261,7 @@ public class PumpEffect extends SpellAbilityEffect {
if (pumpRemembered != null) {
for (final Object o : AbilityUtils.getDefinedObjects(host, pumpRemembered, sa)) {
if (!host.getRemembered().contains(o)) {
host.addRemembered(o);
}
host.addRemembered(o);
}
}
@@ -272,9 +271,7 @@ public class PumpEffect extends SpellAbilityEffect {
if (pumpForget != null) {
for (final Object o : AbilityUtils.getDefinedObjects(host, pumpForget, sa)) {
if (host.getRemembered().contains(o)) {
host.removeRemembered(o);
}
host.removeRemembered(o);
}
}
if (sa.hasParam("ImprintCards")) {
@@ -283,17 +280,13 @@ public class PumpEffect extends SpellAbilityEffect {
if (pumpImprint != null) {
for (final Card c : AbilityUtils.getDefinedCards(host, pumpImprint, sa)) {
if (!host.getImprintedCards().contains(c)) {
host.addImprintedCard(c);
}
host.addImprintedCard(c);
}
}
if (sa.hasParam("ForgetImprinted")) {
for (final Card c : AbilityUtils.getDefinedCards(host, sa.getParam("ForgetImprinted"), sa)) {
if (host.getImprintedCards().contains(c)) {
host.removeImprintedCard(c);
}
host.removeImprintedCard(c);
}
}

View File

@@ -334,9 +334,7 @@ public class TokenEffect extends SpellAbilityEffect {
final Card token = game.getCardState(c);
final String remembered = sa.getParam("TokenRemembered");
for (final Object o : AbilityUtils.getDefinedObjects(host, remembered, sa)) {
if (!token.getRemembered().contains(o)) {
token.addRemembered(o);
}
token.addRemembered(o);
}
}
}

View File

@@ -141,7 +141,7 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
/** Original values of SVars changed by text changes. */
private Map<String, String> originalSVars = Maps.newHashMap();
private final ArrayList<Object> rememberedObjects = new ArrayList<Object>();
private final Set<Object> rememberedObjects = new LinkedHashSet<Object>();
private final MapOfLists<GameEntity, Object> rememberMap = new HashMapOfLists<GameEntity, Object>(CollectionSuppliers.<Object>arrayLists());
private Map<Player, String> flipResult;
@@ -463,17 +463,46 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
rememberMap.addAll(e, o);
}
public final ArrayList<Object> getRemembered() {
public final Iterable<Object> getRemembered() {
return rememberedObjects;
}
public final void addRemembered(final Object o) {
rememberedObjects.add(o);
public final boolean hasRemembered() {
return !rememberedObjects.isEmpty();
}
public final void removeRemembered(final Object o) {
rememberedObjects.remove(o);
public final int getRememberedCount() {
return rememberedObjects.size();
}
public final Object getFirstRemembered() {
return Iterables.getFirst(rememberedObjects, null);
}
public final <T> boolean isRemembered(T o) {
return rememberedObjects.contains(o);
}
public final <T> void addRemembered(final T o) {
if (rememberedObjects.add(o)) {
view.updateRemembered(this);
}
}
public final <T> void addRemembered(final Iterable<T> objects) {
boolean changed = false;
for (T o : objects) {
if (rememberedObjects.add(o)) {
changed = true;
}
}
if (changed) {
view.updateRemembered(this);
}
}
public final <T> void removeRemembered(final T o) {
if (rememberedObjects.remove(o)) {
view.updateRemembered(this);
}
}
public final void clearRemembered() {
if (rememberedObjects.isEmpty()) { return; }
rememberedObjects.clear();
view.updateRemembered(this);
}
public final CardCollectionView getImprintedCards() {
@@ -1062,7 +1091,9 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
return chosenDirection;
}
public void setChosenDirection(Direction chosenDirection0) {
if (chosenDirection == chosenDirection0) { return; }
chosenDirection = chosenDirection0;
view.updateChosenDirection(this);
}
// used for cards like Meddling Mage...
@@ -1106,98 +1137,6 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
text = originalText;
}
// get the text that should be displayed
public String getText() {
final StringBuilder sb = new StringBuilder();
// Vanguard Modifiers
if (isType("Vanguard")) {
sb.append("Hand Modifier: ").append(getRules().getHand());
sb.append("\r\nLife Modifier: ").append(getRules().getLife());
sb.append("\r\n\r\n");
}
if (isCommander) {
sb.append(getOwner()).append("'s Commander\r\n");
sb.append(CardFactoryUtil.getCommanderInfo(getOwner())).append("\r\n");
}
sb.append(getAbilityText());
String nonAbilityText = getNonAbilityText();
if (getAmountOfKeyword("CARDNAME can block an additional creature.") > 1) {
final StringBuilder ab = new StringBuilder();
ab.append("CARDNAME can block an additional ");
ab.append(getAmountOfKeyword("CARDNAME can block an additional creature."));
ab.append(" creatures.");
nonAbilityText = nonAbilityText.replaceFirst("CARDNAME can block an additional creature.", ab.toString());
nonAbilityText = nonAbilityText.replaceAll("CARDNAME can block an additional creature.", "");
nonAbilityText = nonAbilityText.replaceAll("\r\n\r\n\r\n", "");
}
if (nonAbilityText.length() > 0) {
sb.append("\r\n \r\nNon ability features: \r\n");
sb.append(nonAbilityText.replaceAll("CARDNAME", getName()));
}
// Remembered cards
if (rememberedObjects.size() > 0) {
sb.append("\r\nRemembered: \r\n");
for (final Object o : rememberedObjects) {
if (o instanceof Card) {
final Card c = (Card) o;
if (c.isFaceDown()) {
sb.append("Face Down");
// face-down cards don't show unique number to avoid cheating
} else {
sb.append(c.getName());
sb.append(" (");
sb.append(c.getId());
sb.append(")");
}
} else if (o != null) {
sb.append(o.toString());
}
sb.append("\r\n");
}
}
if (chosenPlayer != null) {
sb.append("\r\n[Chosen player: ");
sb.append(getChosenPlayer());
sb.append("]\r\n");
}
if (chosenDirection != null) {
sb.append("\r\n[Chosen direction: ");
sb.append(getChosenDirection());
sb.append("]\r\n");
}
if (isHaunted()) {
sb.append("Haunted by: ");
for (final Card c : hauntedBy) {
sb.append(c).append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("\r\n");
}
if (haunting != null) {
sb.append("Haunting: ").append(haunting);
sb.append("\r\n");
}
if (pairedWith != null) {
sb.append("\r\n \r\nPaired With: ").append(pairedWith);
sb.append("\r\n");
}
if (characteristicsMap.get(CardCharacteristicName.Cloner) != null) {
sb.append("\r\nCloned by: ").append(characteristicsMap.get(CardCharacteristicName.Cloner).getName()).append(" (")
.append(id).append(")");
}
return sb.toString();
}
// get the text that does not belong to a cards abilities (and is not really
// there rules-wise)
public final String getNonAbilityText() {
@@ -3433,9 +3372,7 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
// Takes one argument like Permanent.Blue+withFlying
@Override
public final boolean isValid(final String restriction, final Player sourceController, final Card source) {
if (isImmutable()
&& !source.getRemembered().contains(this)) { // special case exclusion
if (isImmutable() && !source.isRemembered(this)) { // special case exclusion
return false;
}
@@ -3494,7 +3431,7 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
return false;
}
} else if (property.equals("NamedByRememberedPlayer")) {
if (source.getRemembered().isEmpty()) {
if (!source.hasRemembered()) {
final Card newCard = game.getCardState(source);
for (final Object o : newCard.getRemembered()) {
if (o instanceof Player) {
@@ -3587,11 +3524,10 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
return false;
}
if (property.endsWith("ForRemembered")) {
if (source.getRemembered().isEmpty()) {
if (!source.hasRemembered()) {
return false;
}
if (getGame().getCombat().getDefendingPlayerRelatedTo((Card) source.getRemembered().get(0))
!= getController()) {
if (getGame().getCombat().getDefendingPlayerRelatedTo((Card) source.getFirstRemembered()) != getController()) {
return false;
}
} else {
@@ -3626,7 +3562,7 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
}
} else if (property.startsWith("RememberedPlayer")) {
Player p = property.endsWith("Ctrl") ? getController() : getOwner();
if (source.getRemembered().isEmpty()) {
if (!source.hasRemembered()) {
final Card newCard = game.getCardState(source);
for (final Object o : newCard.getRemembered()) {
if (o instanceof Player) {
@@ -3645,14 +3581,14 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
}
}
} else if (property.startsWith("nonRememberedPlayerCtrl")) {
if (source.getRemembered().isEmpty()) {
if (!source.hasRemembered()) {
final Card newCard = game.getCardState(source);
if (newCard.getRemembered().contains(getController())) {
if (newCard.isRemembered(getController())) {
return false;
}
}
if (source.getRemembered().contains(getController())) {
if (source.isRemembered(getController())) {
return false;
}
} else if (property.equals("TargetedPlayerCtrl")) {
@@ -4935,11 +4871,11 @@ public class Card extends GameEntity implements Comparable<Card>, IIdentifiable
}
return false;
} else if (property.equals("IsRemembered")) {
if (!source.getRemembered().contains(this)) {
if (!source.isRemembered(this)) {
return false;
}
} else if (property.equals("IsNotRemembered")) {
if (source.getRemembered().contains(this)) {
if (source.isRemembered(this)) {
return false;
}
} else if (property.equals("IsImprinted")) {

View File

@@ -126,7 +126,7 @@ public class CardCharacteristics {
}
public void setOracleText(final String oracleText0) {
oracleText = oracleText0;
view.updateText(this);
view.updateOracleText(this);
}
public final int getBaseAttack() {

View File

@@ -951,7 +951,7 @@ public class CardFactoryUtil {
}
if (l[0].startsWith("RememberedSize")) {
return doXMath(c.getRemembered().size(), m, c);
return doXMath(c.getRememberedCount(), m, c);
}
if (l[0].startsWith("RememberedNumber")) {
@@ -1253,7 +1253,7 @@ public class CardFactoryUtil {
ce = c.getEquipping();
}
else if (sq[0].contains("Remembered")) {
ce = (Card) c.getRemembered().get(0);
ce = (Card) c.getFirstRemembered();
}
else {
ce = c;

View File

@@ -81,8 +81,8 @@ public class CardLists {
public static final Comparator<Card> TextLenComparator = new Comparator<Card>() {
@Override
public int compare(final Card a, final Card b) {
final int aLen = a.getText().length();
final int bLen = b.getText().length();
final int aLen = a.getView().getText().length();
final int bLen = b.getView().getText().length();
return aLen - bLen;
}
};

View File

@@ -3,6 +3,7 @@ package forge.game.card;
import java.util.Set;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicates;
@@ -15,7 +16,9 @@ import forge.card.CardRarity;
import forge.card.CardType;
import forge.card.ColorSet;
import forge.card.mana.ManaCost;
import forge.game.Direction;
import forge.game.GameEntityView;
import forge.game.player.Player;
import forge.game.player.PlayerView;
import forge.game.zone.ZoneType;
import forge.item.IPaperCard;
@@ -240,6 +243,45 @@ public class CardView extends GameEntityView {
set(TrackableProperty.ChosenPlayer, c.getChosenPlayer());
}
public Direction getChosenDirection() {
return get(TrackableProperty.ChosenDirection);
}
void updateChosenDirection(Card c) {
set(TrackableProperty.ChosenDirection, c.getChosenDirection());
}
private String getRemembered() {
return get(TrackableProperty.Remembered);
}
void updateRemembered(Card c) {
if (c.getRemembered() == null) {
set(TrackableProperty.Remembered, null);
return;
}
StringBuilder sb = new StringBuilder();
sb.append("\r\nRemembered: \r\n");
for (final Object o : c.getRemembered()) {
if (o instanceof Card) {
final Card card = (Card) o;
if (card.isFaceDown()) {
sb.append("Face Down");
// face-down cards don't show unique number to avoid cheating
}
else {
sb.append(card.getName());
sb.append(" (");
sb.append(card.getId());
sb.append(")");
}
}
else if (o != null) {
sb.append(o.toString());
}
sb.append("\r\n");
}
set(TrackableProperty.Remembered, sb.toString());
}
public String getNamedCard() {
return get(TrackableProperty.NamedCard);
}
@@ -335,6 +377,93 @@ public class CardView extends GameEntityView {
set(TrackableProperty.ChangedTypes, c.getChangedTextTypeWords());
}
public String getText() {
final Card card = Card.get(this); //TODO: Avoid needing this
final CardStateView state = getOriginal();
if (card == null) {
return state.getOracleText().trim();
}
final StringBuilder sb = new StringBuilder();
// Vanguard Modifiers
if (card.isType("Vanguard")) {
sb.append("Hand Modifier: ").append(card.getRules().getHand());
sb.append("\r\nLife Modifier: ").append(card.getRules().getLife());
sb.append("\r\n\r\n");
}
if (card.isCommander()) {
sb.append(getOwner()).append("'s Commander\r\n");
sb.append(CardFactoryUtil.getCommanderInfo(Player.get(getOwner()))).append("\r\n");
}
sb.append(card.getAbilityText());
String nonAbilityText = card.getNonAbilityText();
if (card.getAmountOfKeyword("CARDNAME can block an additional creature.") > 1) {
final StringBuilder ab = new StringBuilder();
ab.append("CARDNAME can block an additional ");
ab.append(card.getAmountOfKeyword("CARDNAME can block an additional creature."));
ab.append(" creatures.");
nonAbilityText = nonAbilityText.replaceFirst("CARDNAME can block an additional creature.", ab.toString());
nonAbilityText = nonAbilityText.replaceAll("CARDNAME can block an additional creature.", "");
nonAbilityText = nonAbilityText.replaceAll("\r\n\r\n\r\n", "");
}
if (nonAbilityText.length() > 0) {
sb.append("\r\n \r\nNon ability features: \r\n");
sb.append(nonAbilityText.replaceAll("CARDNAME", getName()));
}
sb.append(getRemembered());
PlayerView chosenPlayer = getChosenPlayer();
if (chosenPlayer != null) {
sb.append("\r\n[Chosen player: ");
sb.append(chosenPlayer);
sb.append("]\r\n");
}
Direction chosenDirection = getChosenDirection();
if (chosenDirection != null) {
sb.append("\r\n[Chosen direction: ");
sb.append(chosenDirection);
sb.append("]\r\n");
}
Iterable<CardView> hauntedBy = getHauntedBy();
if (hauntedBy != null) {
sb.append("Haunted by: ");
boolean needDelim = false;
for (final CardView c : hauntedBy) {
if (needDelim) {
sb.append(",");
}
else { needDelim = false; }
sb.append(c);
}
sb.append("\r\n");
}
CardView haunting = getHaunting();
if (haunting != null) {
sb.append("Haunting: ").append(haunting);
sb.append("\r\n");
}
CardView pairedWith = getPairedWith();
if (pairedWith != null) {
sb.append("\r\n \r\nPaired With: ").append(pairedWith);
sb.append("\r\n");
}
CardCharacteristics cloner = card.getState(CardCharacteristicName.Cloner);
if (cloner != null) {
sb.append("\r\nCloned by: ").append(cloner.getView().getName());
sb.append(" (").append(cloner.getView().getId()).append(")");
}
return sb.toString().trim();
}
public CardStateView getOriginal() {
return get(TrackableProperty.Original);
}
@@ -409,9 +538,9 @@ public class CardView extends GameEntityView {
return getOriginal().getName();
}
/*if (!mayBeShown) {
if (!mayBeShown) {
return "(Unknown card)";
}*/
}
if (StringUtils.isEmpty(getOriginal().getName())) {
CardStateView alternate = getAlternate();
@@ -501,13 +630,14 @@ public class CardView extends GameEntityView {
set(TrackableProperty.Power, c.getNetAttack());
}
void updatePower(CardCharacteristics c) {
Card card = Card.get(CardView.this);
if (card != null) {
updatePower(card); //TODO: find a better way to do this
}
else {
set(TrackableProperty.Power, c.getBaseAttack());
if (CardView.this.getOriginal() == this) {
Card card = Card.get(CardView.this);
if (card != null) {
updatePower(card); //TODO: find a better way to do this
return;
}
}
set(TrackableProperty.Power, c.getBaseAttack());
}
public int getToughness() {
@@ -517,13 +647,14 @@ public class CardView extends GameEntityView {
set(TrackableProperty.Toughness, c.getNetDefense());
}
void updateToughness(CardCharacteristics c) {
Card card = Card.get(CardView.this);
if (card != null) {
updateToughness(card); //TODO: find a better way to do this
}
else {
set(TrackableProperty.Toughness, c.getBaseDefense());
if (CardView.this.getOriginal() == this) {
Card card = Card.get(CardView.this);
if (card != null) {
updateToughness(card); //TODO: find a better way to do this
return;
}
}
set(TrackableProperty.Toughness, c.getBaseDefense());
}
public int getLoyalty() {
@@ -533,29 +664,21 @@ public class CardView extends GameEntityView {
set(TrackableProperty.Loyalty, c.getCurrentLoyalty());
}
void updateLoyalty(CardCharacteristics c) {
Card card = Card.get(CardView.this);
if (card != null) {
updateLoyalty(card); //TODO: find a better way to do this
}
else {
set(TrackableProperty.Loyalty, 0);
if (CardView.this.getOriginal() == this) {
Card card = Card.get(CardView.this);
if (card != null) {
updateLoyalty(card); //TODO: find a better way to do this
return;
}
}
set(TrackableProperty.Loyalty, 0); //alternates don't need loyalty
}
public String getText() {
return get(TrackableProperty.Text);
public String getOracleText() {
return get(TrackableProperty.OracleText);
}
void updateText(Card c) {
set(TrackableProperty.Text, c.getText());
}
void updateText(CardCharacteristics c) {
Card card = Card.get(CardView.this);
if (card != null) {
updateText(card); //TODO: find a better way to do this
}
else {
set(TrackableProperty.Text, c.getOracleText());
}
void updateOracleText(CardCharacteristics c) {
set(TrackableProperty.OracleText, c.getOracleText());
}
private int foilIndexOverride = -1;

View File

@@ -1790,11 +1790,11 @@ public class Player extends GameEntity implements Comparable<Player> {
return false;
}
} else if (property.equals("IsRemembered")) {
if (!source.getRemembered().contains(this)) {
if (!source.isRemembered(this)) {
return false;
}
} else if (property.equals("IsNotRemembered")) {
if (source.getRemembered().contains(this)) {
if (source.isRemembered(this)) {
return false;
}
} else if (property.startsWith("EnchantedBy")) {

View File

@@ -456,15 +456,16 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
}
public String getStackDescription() {
if (stackDescription.equals(getHostCard().getText().trim())) {
return getHostCard().getName() + " - " + getHostCard().getText();
String text = getHostCard().getView().getText();
if (stackDescription.equals(text)) {
return getHostCard().getName() + " - " + text;
}
return stackDescription.replaceAll("CARDNAME", getHostCard().getName());
}
public void setStackDescription(final String s) {
originalStackDescription = s;
stackDescription = originalStackDescription;
if (StringUtils.isEmpty(description) && StringUtils.isEmpty(hostCard.getText())) {
if (StringUtils.isEmpty(description) && StringUtils.isEmpty(hostCard.getView().getText())) {
setDescription(s);
}
}

View File

@@ -1,6 +1,7 @@
package forge.trackable;
import forge.card.CardRarity;
import forge.game.Direction;
import forge.game.GameType;
import forge.game.phase.PhaseType;
import forge.game.zone.ZoneType;
@@ -38,6 +39,8 @@ public enum TrackableProperty {
ChosenType(TrackableTypes.StringType),
ChosenColors(TrackableTypes.CardViewCollectionType),
ChosenPlayer(TrackableTypes.PlayerViewType),
ChosenDirection(TrackableTypes.EnumType(Direction.class)),
Remembered(TrackableTypes.StringType),
NamedCard(TrackableTypes.StringType),
Equipping(TrackableTypes.CardViewType),
EquippedBy(TrackableTypes.CardViewCollectionType),
@@ -60,6 +63,7 @@ public enum TrackableProperty {
ImageKey(TrackableTypes.StringType),
Type(TrackableTypes.StringSetType),
ManaCost(TrackableTypes.ManaCostType),
OracleText(TrackableTypes.StringType),
Power(TrackableTypes.IntegerType),
Toughness(TrackableTypes.IntegerType),
Loyalty(TrackableTypes.IntegerType),

View File

@@ -176,15 +176,12 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen
break;
}
final String text = state.getText();
final String firstText = firstState.getText();
if (!panel.getAttachedPanels().isEmpty()
|| !card.hasSameCounters(firstPanel.getCard())
|| (card.isSick() != firstCard.isSick())
|| (state.getPower() != firstState.getPower())
|| (state.getToughness() != firstState.getToughness())
|| !(text.equals(firstText))
|| !(card.getText().equals(firstCard.getText()))
|| (stack.size() == tokenStackMax)) {
// If this token has attachments or the stack is full,
// put it to the right.

View File

@@ -267,7 +267,7 @@ public class CardImageRenderer {
g.drawImage(image, x + (w - iconSize) / 2, y + (h - iconSize) / 2, iconSize, iconSize);
}
else {
final String text = card.getOriginal().getText();
final String text = card.getText();
if (StringUtils.isEmpty(text)) { return; }
float padding = TEXT_FONT.getCapHeight() * 0.75f;

View File

@@ -250,7 +250,7 @@ public class CardDetailUtil {
if (area.length() != 0) {
area.append("\n");
}
String text = state.getText();
String text = card.getText();
// LEVEL [0-9]+-[0-9]+
// LEVEL [0-9]+\+