* restores token images

Card: dropped imageName field (which was commonly mixed up with imageFileName)
Starting cards for quest and challenges no longer use functions (CardToken helps a lot)
Quest challenges code: Token parsing remake (to produce CardRules instance and wrap it into CardToken)
some utility functions were moved closer to usage points
This commit is contained in:
Maxmtg
2013-02-22 22:50:40 +00:00
parent d2361e87b8
commit c49bf52b8f
15 changed files with 120 additions and 189 deletions

View File

@@ -3524,32 +3524,6 @@ public class Card extends GameEntity implements Comparable<Card> {
return this.sickness && this.isCreature() && !this.hasKeyword("Haste");
}
/**
* <p>
* Setter for the field <code>imageName</code>.
* </p>
*
* @param s
* a {@link java.lang.String} object.
*/
public final void setImageName(final String s) {
this.getCharacteristics().setImageName(s);
}
/**
* <p>
* Getter for the field <code>imageName</code>.
* </p>
*
* @return a {@link java.lang.String} object.
*/
public final String getImageName() {
if (!this.getCharacteristics().getImageName().equals("")) {
return this.getCharacteristics().getImageName();
}
return this.getName();
}
/**
* <p>
* Getter for the field <code>owner</code>.

View File

@@ -477,7 +477,7 @@ public final class CardUtil {
ret.setName("");
ret.setType(types);
ret.setImageName(NewConstants.MORPH_IMAGE_FILE_NAME);
ret.setImageFilename(NewConstants.MORPH_IMAGE_FILE_NAME);
return ret;
}

View File

@@ -144,7 +144,7 @@ public class ImageCache {
private static String getKey(final Card card) {
if ((card.isToken() && !card.isCopiedToken()) || card.isFaceDown()) {
return ImageCache.TOKEN + GuiDisplayUtil.cleanString(card.getImageName());
return ImageCache.TOKEN + GuiDisplayUtil.cleanString(card.getImageFilename());
}
return card.getImageFilename(); // key;

View File

@@ -51,7 +51,6 @@ public class CardCharacteristics {
private ArrayList<StaticAbility> staticAbilities = new ArrayList<StaticAbility>();
private ArrayList<String> staticAbilityStrings = new ArrayList<String>();
private String imageFilename = "";
private String imageName = "";
private Map<String, String> sVars = new TreeMap<String, String>();
/**
@@ -308,25 +307,6 @@ public class CardCharacteristics {
this.staticAbilityStrings = staticAbilityStrings0;
}
/**
* Gets the image name.
*
* @return the imageName
*/
public String getImageName() {
return this.imageName;
}
/**
* Sets the image name.
*
* @param imageName0
* the imageName to set
*/
public void setImageName(final String imageName0) {
this.imageName = imageName0;
}
/**
* @return the replacementEffects
*/
@@ -426,8 +406,6 @@ public class CardCharacteristics {
this.staticAbilityStrings = new ArrayList<String>(source.getStaticAbilityStrings());
// String imageFilename = copy reference
this.imageFilename = source.getImageFilename();
// String imageName = "";
this.imageName = source.getImageName();
// Map<String, String> sVars
this.sVars = new TreeMap<String, String>(source.getSVars());
this.replacementEffects = new ArrayList<ReplacementEffect>();

View File

@@ -328,7 +328,7 @@ public class AbilityUtils {
}
if (calcX[0].startsWith("Count")) {
return CardFactoryUtil.xCount(card, calcX[1], ability) * multiplier;
return AbilityUtils.xCount(card, calcX[1], ability) * multiplier;
} else if (calcX[0].startsWith("Number")) {
return CardFactoryUtil.xCount(card, svarval) * multiplier;
} else if (calcX[0].startsWith("SVar")) {
@@ -1196,4 +1196,38 @@ public class AbilityUtils {
resolveSubAbilities(sa, usedStack, game);
}
/**
* <p>
* Parse non-mana X variables.
* </p>
*
* @param c
* a {@link forge.Card} object.
* @param s
* a {@link java.lang.String} object.
* @param sa
* a {@link forge.SpellAbility} object.
* @return a int.
*/
public static int xCount(final Card c, final String s, final SpellAbility sa) {
final String[] l = s.split("/");
final String[] m = CardFactoryUtil.parseMath(l);
final String[] sq;
sq = l[0].split("\\.");
if (sa != null) {
// Count$Kicked.<numHB>.<numNotHB>
if (sq[0].startsWith("Kicked")) {
if (sa.isKicked()) {
return CardFactoryUtil.doXMath(Integer.parseInt(sq[1]), m, c); // Kicked
} else {
return CardFactoryUtil.doXMath(Integer.parseInt(sq[2]), m, c); // not Kicked
}
}
}
return CardFactoryUtil.xCount(c, s);
}
}

View File

@@ -499,8 +499,8 @@ public class AttachAi extends SpellAbilityAi {
continue;
}
if ((affected.contains(stCheck) || affected.contains("AttachedBy"))) {
totToughness += CardFactoryUtil.parseSVar(attachSource, stabMap.get("AddToughness"));
totPower += CardFactoryUtil.parseSVar(attachSource, stabMap.get("AddPower"));
totToughness += AttachAi.parseSVar(attachSource, stabMap.get("AddToughness"));
totPower += AttachAi.parseSVar(attachSource, stabMap.get("AddPower"));
String kws = stabMap.get("AddKeyword");
if (kws != null) {
@@ -611,6 +611,30 @@ public class AttachAi extends SpellAbilityAi {
return true;
}
/**
* parseSVar TODO - flesh out javadoc for this method.
*
* @param hostCard
* the Card with the SVar on it
* @param amount
* a String
* @return the calculated number
*/
public static int parseSVar(final Card hostCard, final String amount) {
int num = 0;
if (amount == null) {
return num;
}
try {
num = Integer.valueOf(amount);
} catch (final NumberFormatException e) {
num = CardFactoryUtil.xCount(hostCard, hostCard.getSVar(amount).split("\\$")[1]);
}
return num;
}
/**
* Attach preference.
*
@@ -720,8 +744,8 @@ public class AttachAi extends SpellAbilityAi {
continue;
}
if ((affected.contains(stCheck) || affected.contains("AttachedBy"))) {
totToughness += CardFactoryUtil.parseSVar(attachSource, stabMap.get("AddToughness"));
totPower += CardFactoryUtil.parseSVar(attachSource, stabMap.get("AddPower"));
totToughness += AttachAi.parseSVar(attachSource, stabMap.get("AddToughness"));
totPower += AttachAi.parseSVar(attachSource, stabMap.get("AddPower"));
grantingAbilities |= stabMap.containsKey("AddAbility");

View File

@@ -93,7 +93,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
copy = CardFactoryUtil.copyStats(c);
copy.setName(c.getName());
copy.setImageName(c.getImageName());
copy.setImageFilename(c.getImageFilename());
copy.setOwner(controller);
copy.addController(controller);

View File

@@ -104,13 +104,10 @@ public class EffectEffect extends SpellAbilityEffect {
// nuked
eff.addController(controller);
eff.setOwner(controller);
eff.setImageName(hostCard.getImageName());
eff.setImageFilename(hostCard.getImageFilename());
eff.setColor(hostCard.getColor());
eff.setImmutable(true);
eff.setEffectSource(hostCard);
if (sa.hasParam("Image")) {
eff.setImageName(sa.getParam("Image"));
}
// Effects should be Orange or something probably

View File

@@ -234,11 +234,16 @@ public class CardFactory {
public final Card getCard(final IPaperCard cp, final Player owner) {
//System.out.println(cardName);
Card c = this.getCard2(cp.getRules(), owner);
CardRules cardRules = cp.getRules();
final Card c = readCard(cardRules);
c.setRules(cardRules);
c.setOwner(owner);
buildAbilities(c);
c.setCurSetCode(cp.getEdition());
c.setRandomPicture(cp.getArtIndex() + 1);
String originalPicture = cp.getImageFilename();
//System.out.println(c.getName() + " -> " + originalPicture);
c.setImageFilename(originalPicture);
c.setToken(cp.isToken());
@@ -263,14 +268,6 @@ public class CardFactory {
}
protected Card getCard2(final CardRules cardRules, final Player owner) {
final Card card = readCard(cardRules);
card.setRules(cardRules);
card.setOwner(owner);
buildAbilities(card);
return card;
}
private static void buildAbilities(final Card card) {
final String cardName = card.getName();
@@ -319,7 +316,7 @@ public class CardFactory {
public static Card readCard(final CardRules rules) {
private static Card readCard(final CardRules rules) {
final Card card = new Card();

View File

@@ -1947,64 +1947,6 @@ public class CardFactoryUtil {
return CardFactoryUtil.doXMath(n, m, source);
}
/**
* parseSVar TODO - flesh out javadoc for this method.
*
* @param hostCard
* the Card with the SVar on it
* @param amount
* a String
* @return the calculated number
*/
public static int parseSVar(final Card hostCard, final String amount) {
int num = 0;
if (amount == null) {
return num;
}
try {
num = Integer.valueOf(amount);
} catch (final NumberFormatException e) {
num = CardFactoryUtil.xCount(hostCard, hostCard.getSVar(amount).split("\\$")[1]);
}
return num;
}
/**
* <p>
* Parse non-mana X variables.
* </p>
*
* @param c
* a {@link forge.Card} object.
* @param s
* a {@link java.lang.String} object.
* @param sa
* a {@link forge.SpellAbility} object.
* @return a int.
*/
public static int xCount(final Card c, final String s, final SpellAbility sa) {
final String[] l = s.split("/");
final String[] m = CardFactoryUtil.parseMath(l);
final String[] sq;
sq = l[0].split("\\.");
if (sa != null) {
// Count$Kicked.<numHB>.<numNotHB>
if (sq[0].startsWith("Kicked")) {
if (sa.isKicked()) {
return CardFactoryUtil.doXMath(Integer.parseInt(sq[1]), m, c); // Kicked
} else {
return CardFactoryUtil.doXMath(Integer.parseInt(sq[2]), m, c); // not Kicked
}
}
}
return xCount(c, s);
}
/**
* <p>
* Parse non-mana X variables.
@@ -3295,7 +3237,7 @@ public class CardFactoryUtil {
final List<Card> list = new ArrayList<Card>();
final Card c = new Card();
c.setName(name);
c.setImageName(imageName);
c.setImageFilename(imageName);
// TODO - most tokens mana cost is 0, this needs to be fixed
// c.setManaCost(manaCost);
@@ -3356,7 +3298,7 @@ public class CardFactoryUtil {
final List<String> kal = thisToken.getIntrinsicKeyword();
final String[] tokenKeywords = new String[kal.size()];
kal.toArray(tokenKeywords);
final List<Card> tokens = CardFactoryUtil.makeToken(thisToken.getName(), thisToken.getImageName(),
final List<Card> tokens = CardFactoryUtil.makeToken(thisToken.getName(), thisToken.getImageFilename(),
thisToken.getController(), thisToken.getManaCost().toString(), tokenTypes, thisToken.getBaseAttack(),
thisToken.getBaseDefense(), tokenKeywords);
@@ -3607,7 +3549,6 @@ public class CardFactoryUtil {
to.setSVars(from.getSVars());
to.setIntrinsicAbilities(from.getIntrinsicAbilities());
to.setImageName(from.getImageName());
to.setImageFilename(from.getImageFilename());
to.setTriggers(from.getTriggers());
to.setReplacementEffects(from.getReplacementEffects());
@@ -4222,7 +4163,6 @@ public class CardFactoryUtil {
// play it gets nuked
eff.addController(card.getController());
eff.setOwner(card.getController());
eff.setImageName(card.getImageName());
eff.setColor(card.getColor());
eff.setImmutable(true);
eff.setEffectSource(card);

View File

@@ -221,10 +221,12 @@ public class GameNew {
return myRemovedAnteCards;
}
private static void putCardsOnBattlefield(Player player, Iterable<Card> cards) {
private static void putCardsOnBattlefield(Player player, Iterable<? extends IPaperCard> cards) {
PlayerZone bf = player.getZone(ZoneType.Battlefield);
if (cards != null) {
for (final Card c : cards) {
for (final IPaperCard cp : cards) {
Card c = cp.toForgeCard(player);
c.setOwner(player);
c.addController(player);
bf.add(c, false);
c.setSickness(true);

View File

@@ -3,12 +3,10 @@ package forge.game;
import java.util.ArrayList;
import java.util.Collections;
import com.google.common.base.Function;
import forge.Card;
import forge.deck.Deck;
import forge.game.player.Player;
import forge.item.CardPrinted;
import forge.item.IPaperCard;
public class PlayerStartConditions {
@@ -18,9 +16,9 @@ public class PlayerStartConditions {
private static final Iterable<CardPrinted> EmptyList = Collections.unmodifiableList(new ArrayList<CardPrinted>());
private int startingLife = 20;
private int startingHand = 7;
private Function<Player, Iterable<Card>> cardsOnBattlefield = null;
private Iterable<CardPrinted> cardsInCommand = null;
private Iterable<CardPrinted> schemes = null;
private Iterable<IPaperCard> cardsOnBattlefield = null;
private Iterable<? extends IPaperCard> cardsInCommand = null;
private Iterable<? extends IPaperCard> schemes = null;
private Iterable<CardPrinted> planes = null;
public PlayerStartConditions(Deck deck0) {
@@ -44,15 +42,15 @@ public class PlayerStartConditions {
public final int getStartingLife() {
return startingLife;
}
public final Iterable<Card> getCardsOnBattlefield(Player p) {
return cardsOnBattlefield == null ? null : cardsOnBattlefield.apply(p);
public final Iterable<? extends IPaperCard> getCardsOnBattlefield(Player p) {
return cardsOnBattlefield == null ? EmptyList : cardsOnBattlefield;
}
public final void setStartingLife(int startingLife) {
this.startingLife = startingLife;
}
public final void setCardsOnBattlefield(Function<Player, Iterable<Card>> cardsOnTable) {
public final void setCardsOnBattlefield(Iterable<IPaperCard> cardsOnTable) {
this.cardsOnBattlefield = cardsOnTable;
}
@@ -73,28 +71,28 @@ public class PlayerStartConditions {
/**
* @return the cardsInCommand
*/
public Iterable<CardPrinted> getCardsInCommand(Player p) {
public Iterable<? extends IPaperCard> getCardsInCommand(Player p) {
return cardsInCommand == null ? EmptyList : cardsInCommand;
}
/**
* @param function the cardsInCommand to set
*/
public void setCardsInCommand(Iterable<CardPrinted> function) {
public void setCardsInCommand(Iterable<? extends IPaperCard> function) {
this.cardsInCommand = function;
}
/**
* @return the schemes
*/
public Iterable<CardPrinted> getSchemes(Player p) {
public Iterable<? extends IPaperCard> getSchemes(Player p) {
return schemes == null ? EmptyList : schemes;
}
/**
* @param schemes0 the schemes to set
*/
public void setSchemes(Iterable<CardPrinted> s) {
public void setSchemes(Iterable<? extends IPaperCard> s) {
this.schemes = s;
}

View File

@@ -11,8 +11,6 @@ import javax.swing.SwingWorker;
import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.base.Function;
import forge.Card;
import forge.Singletons;
import forge.card.CardEdition;
import forge.control.FControl;
@@ -21,7 +19,6 @@ import forge.game.GameType;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player;
import forge.game.player.PlayerType;
import forge.gui.GuiChoose;
import forge.gui.SOverlayUtils;
@@ -413,10 +410,8 @@ public class SSubmenuQuestUtil {
humanStart.setStartingLife(qData.getAssets().getLife(qData.getMode()) + extraLifeHuman);
aiStart.setStartingLife(lifeAI);
humanStart.setCardsOnBattlefield(new Function<Player, Iterable<Card>>() {
@Override public Iterable<Card> apply(Player p) { return QuestUtil.getHumanStartingCards(qData, event, p); } });
aiStart.setCardsOnBattlefield(new Function<Player, Iterable<Card>>() {
@Override public Iterable<Card> apply(Player p) { return QuestUtil.getComputerStartingCards(event, p); } });
humanStart.setCardsOnBattlefield(QuestUtil.getHumanStartingCards(qData, event));
aiStart.setCardsOnBattlefield(QuestUtil.getComputerStartingCards(event));
} // End isFantasy
MatchStartHelper msh = new MatchStartHelper();

View File

@@ -1,7 +1,6 @@
package forge.item;
import forge.Card;
import forge.ImageCache;
import forge.Singletons;
import forge.card.CardRarity;
import forge.card.CardRules;
@@ -20,6 +19,7 @@ public class CardToken implements InventoryItemFromSet, IPaperCard {
this.card = c;
this.name = c.getName();
this.edition = edition0;
this.imageFileName = imageFileName;
}
@Override public String getName() { return name; }
@@ -31,7 +31,7 @@ public class CardToken implements InventoryItemFromSet, IPaperCard {
@Override public CardRarity getRarity() { return CardRarity.Common; } // They don't have rarity though!
@Override public String getImageFilename() { return ImageCache.TOKEN + imageFileName; }
@Override public String getImageFilename() { return imageFileName; }
@Override public String getItemType() { return "Token"; }
@Override public Card getMatchingForgeCard() { return toForgeCard(null); } // hope this won't be queried too frequently, so no cache

View File

@@ -19,9 +19,11 @@ package forge.quest;
import forge.Card;
import forge.game.player.Player;
import forge.card.CardEdition;
import forge.card.CardRulesReader;
import forge.item.CardDb;
import forge.item.CardToken;
import forge.item.IPaperCard;
import forge.quest.bazaar.QuestPetController;
import java.util.ArrayList;
@@ -62,11 +64,11 @@ public class QuestUtil {
* a {@link forge.quest.QuestEvent} object.
* @return a {@link forge.CardList} object.
*/
public static List<Card> getComputerStartingCards(final QuestEvent qe, Player ai) {
final List<Card> list = new ArrayList<Card>();
public static List<IPaperCard> getComputerStartingCards(final QuestEvent qe) {
final List<IPaperCard> list = new ArrayList<IPaperCard>();
for (final String s : qe.getAiExtraCards()) {
list.add(QuestUtil.readExtraCard(s, ai));
list.add(QuestUtil.readExtraCard(s));
}
return list;
@@ -83,18 +85,16 @@ public class QuestUtil {
* a {@link forge.quest.data.QuestData} object.
* @return a {@link forge.CardList} object.
*/
public static List<Card> getHumanStartingCards(final QuestController qc, Player human) {
final List<Card> list = new ArrayList<Card>();
public static List<IPaperCard> getHumanStartingCards(final QuestController qc) {
final List<IPaperCard> list = new ArrayList<IPaperCard>();
for (int iSlot = 0; iSlot < QuestController.MAX_PET_SLOTS; iSlot++) {
String petName = qc.getSelectedPet(iSlot);
QuestPetController pet = qc.getPetsStorage().getPet(petName);
if (pet != null) {
CardToken c = pet.getPetCard(qc.getAssets());
IPaperCard c = pet.getPetCard(qc.getAssets());
if (c != null) {
Card copy = c.toForgeCard(human);
copy.setSickness(true);
list.add(copy);
list.add(c);
}
}
}
@@ -115,10 +115,10 @@ public class QuestUtil {
* a {@link forge.quest.QuestEvent} object.
* @return a {@link forge.CardList} object.
*/
public static List<Card> getHumanStartingCards(final QuestController qc, final QuestEvent qe, final Player human) {
final List<Card> list = QuestUtil.getHumanStartingCards(qc, human);
public static List<IPaperCard> getHumanStartingCards(final QuestController qc, final QuestEvent qe) {
final List<IPaperCard> list = QuestUtil.getHumanStartingCards(qc);
for (final String s : qe.getHumanExtraCards()) {
list.add(QuestUtil.readExtraCard(s, human));
list.add(QuestUtil.readExtraCard(s));
}
return list;
}
@@ -134,24 +134,17 @@ public class QuestUtil {
* (TOKEN;W;1;1;sheep;type;type;type...)
* @return token Card
*/
public static Card createToken(final String s) {
final String[] properties = s.split(";");
final Card c = new Card();
c.setToken(true);
public static CardToken createToken(final String s) {
final String[] properties = s.split(";", 5);
List<String> script = new ArrayList<String>();
script.add("Name:" + properties[4]);
script.add("Colors:" + properties[1]);
script.add("PT:"+ properties[2] + "/" + properties[3]);
script.add("Types:" + properties[5].replace(';', ' '));
// c.setManaCost(properties[1]);
c.addColor(properties[1]);
c.setBaseAttack(Integer.parseInt(properties[2]));
c.setBaseDefense(Integer.parseInt(properties[3]));
c.setName(properties[4]);
c.setImageName(properties[1] + " " + properties[2] + " " + properties[3] + " " + properties[4]);
int x = 5;
while (x != properties.length) {
c.addType(properties[x++]);
}
String fileName = properties[1] + " " + properties[2] + " " + properties[3] + " " + properties[4];
final CardToken c = new CardToken(CardRulesReader.parseSingleCard(script), CardEdition.UNKNOWN.getCode(), fileName);
return c;
}
@@ -167,16 +160,15 @@ public class QuestUtil {
* the owner
* @return the card
*/
public static Card readExtraCard(final String name, Player owner) {
public static IPaperCard readExtraCard(final String name) {
// Token card creation
Card tempcard;
IPaperCard tempcard;
if (name.startsWith("TOKEN")) {
tempcard = QuestUtil.createToken(name);
tempcard.setOwner(owner);
return tempcard;
}
// Standard card creation
return CardDb.instance().getCard(name, true).toForgeCard(owner);
return CardDb.instance().getCard(name, true);
}
} // QuestUtil