/* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ package mage.cards.repository; import com.j256.ormlite.field.DataType; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; import java.util.*; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.cards.Card; import mage.cards.CardGraphicInfo; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.FrameStyle; import mage.cards.mock.MockCard; import mage.cards.mock.MockSplitCard; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.SpellAbilityType; import mage.constants.SuperType; import org.apache.log4j.Logger; /** * @author North */ @DatabaseTable(tableName = "card") public class CardInfo { private static final int MAX_RULE_LENGTH = 700; private static final String SEPARATOR = "@@@"; @DatabaseField(indexName = "name_index") protected String name; @DatabaseField(indexName = "setCode_cardNumber_index") protected String cardNumber; @DatabaseField(indexName = "setCode_cardNumber_index") protected String setCode; @DatabaseField(indexName = "className_index") protected String className; @DatabaseField protected String power; @DatabaseField protected String toughness; @DatabaseField protected String startingLoyalty; @DatabaseField protected int convertedManaCost; @DatabaseField(dataType = DataType.ENUM_STRING) protected Rarity rarity; @DatabaseField protected String types; @DatabaseField protected String subtypes; @DatabaseField protected String supertypes; @DatabaseField protected String manaCosts; @DatabaseField(dataType = DataType.STRING, width = MAX_RULE_LENGTH) protected String rules; @DatabaseField protected boolean black; @DatabaseField protected boolean blue; @DatabaseField protected boolean green; @DatabaseField protected boolean red; @DatabaseField protected boolean white; @DatabaseField protected String frameColor; @DatabaseField protected String frameStyle; @DatabaseField protected boolean variousArt; @DatabaseField protected boolean splitCard; @DatabaseField protected boolean splitCardFuse; @DatabaseField protected boolean splitCardAftermath; @DatabaseField protected boolean splitCardHalf; @DatabaseField protected boolean flipCard; @DatabaseField protected boolean doubleFaced; @DatabaseField(indexName = "name_index") protected boolean nightCard; @DatabaseField protected String flipCardName; @DatabaseField protected String secondSideName; public CardInfo() { } public CardInfo(Card card) { this.name = card.getName(); this.cardNumber = card.getCardNumber(); this.setCode = card.getExpansionSetCode(); this.className = card.getClass().getCanonicalName(); this.power = card.getPower().toString(); this.toughness = card.getToughness().toString(); this.convertedManaCost = card.getConvertedManaCost(); this.rarity = card.getRarity(); this.splitCard = card.isSplitCard(); this.splitCardFuse = card.getSpellAbility() != null && card.getSpellAbility().getSpellAbilityType() == SpellAbilityType.SPLIT_FUSED; this.splitCardAftermath = card.getSpellAbility() != null && card.getSpellAbility().getSpellAbilityType() == SpellAbilityType.SPLIT_AFTERMATH; this.flipCard = card.isFlipCard(); this.flipCardName = card.getFlipCardName(); this.doubleFaced = card.isTransformable() && card.getSecondCardFace() != null; this.nightCard = card.isNightCard(); Card secondSide = card.getSecondCardFace(); if (secondSide != null) { this.secondSideName = secondSide.getName(); } this.frameStyle = card.getFrameStyle().toString(); this.frameColor = card.getFrameColor(null).toString(); this.variousArt = card.getUsesVariousArt(); this.blue = card.getColor(null).isBlue(); this.black = card.getColor(null).isBlack(); this.green = card.getColor(null).isGreen(); this.red = card.getColor(null).isRed(); this.white = card.getColor(null).isWhite(); this.setTypes(card.getCardType()); this.setSubtypes(card.getSubtype(null)); this.setSuperTypes(card.getSuperType()); this.setManaCosts(card.getManaCost().getSymbols()); int length = 0; for (String rule : card.getRules()) { length += rule.length(); } if (length > MAX_RULE_LENGTH) { length = 0; ArrayList<String> shortRules = new ArrayList<>(); for (String rule : card.getRules()) { if (length + rule.length() + 3 <= MAX_RULE_LENGTH) { shortRules.add(rule); length += rule.length() + 3; } else { shortRules.add(rule.substring(0, MAX_RULE_LENGTH - (length + 3))); break; } } Logger.getLogger(CardInfo.class).warn("Card rule text was cut - cardname: " + card.getName()); this.setRules(shortRules); } else { this.setRules(card.getRules()); } SpellAbility spellAbility = card.getSpellAbility(); if (spellAbility != null) { SpellAbilityType spellAbilityType = spellAbility.getSpellAbilityType(); if (spellAbilityType == SpellAbilityType.SPLIT_LEFT || spellAbilityType == SpellAbilityType.SPLIT_RIGHT) { this.className = this.setCode + '.' + this.name; this.splitCardHalf = true; } } // Starting loyalty if (card.isPlaneswalker()) { for (Ability ab : card.getAbilities()) { if (ab instanceof PlanswalkerEntersWithLoyalityCountersAbility) { this.startingLoyalty = "" + ((PlanswalkerEntersWithLoyalityCountersAbility) ab).getStartingLoyalty(); } } if (this.startingLoyalty == null) { //Logger.getLogger(CardInfo.class).warn("Planeswalker `" + card.getName() + "` missing starting loyalty"); this.startingLoyalty = ""; } } else { this.startingLoyalty = ""; } } public Card getCard() { return CardImpl.createCard(className, new CardSetInfo(name, setCode, cardNumber, rarity, new CardGraphicInfo(FrameStyle.valueOf(frameStyle), variousArt))); } public Card getMockCard() { if (this.splitCard) { return new MockSplitCard(this); } else { return new MockCard(this); } } public boolean usesVariousArt() { return variousArt; } public ObjectColor getColor() { ObjectColor color = new ObjectColor(); color.setBlack(black); color.setBlue(blue); color.setGreen(green); color.setRed(red); color.setWhite(white); return color; } public ObjectColor getFrameColor() { return new ObjectColor(frameColor); } public FrameStyle getFrameStyle() { return FrameStyle.valueOf(this.frameStyle); } private String joinList(List<String> items) { StringBuilder sb = new StringBuilder(); for (Object item : items) { sb.append(item.toString()).append(SEPARATOR); } return sb.toString(); } private List<String> parseList(String list) { if (list.isEmpty()) { return Collections.emptyList(); } return Arrays.asList(list.split(SEPARATOR)); } public final EnumSet<CardType> getTypes() { EnumSet<CardType> list = EnumSet.noneOf(CardType.class); for (String type : this.types.split(SEPARATOR)) { try { list.add(CardType.valueOf(type)); } catch (IllegalArgumentException e) { } } return list; } public final void setTypes(Set<CardType> types) { StringBuilder sb = new StringBuilder(); for (CardType item : types) { sb.append(item.name()).append(SEPARATOR); } this.types = sb.toString(); } public int getConvertedManaCost() { return convertedManaCost; } public final List<String> getManaCosts() { return parseList(manaCosts); } public final void setManaCosts(List<String> manaCosts) { this.manaCosts = joinList(manaCosts); } public String getName() { return name; } public String getPower() { return power; } public Rarity getRarity() { return rarity; } public final List<String> getRules() { return parseList(rules); } public final void setRules(List<String> rules) { this.rules = joinList(rules); } public final List<String> getSubTypes() { return parseList(subtypes); } public final void setSubtypes(List<String> subtypes) { this.subtypes = joinList(subtypes); } public final EnumSet<SuperType> getSupertypes() { EnumSet<SuperType> list = EnumSet.noneOf(SuperType.class); for (String type : this.supertypes.split(SEPARATOR)) { try { list.add(SuperType.valueOf(type)); } catch (IllegalArgumentException e) { } } return list; } public final void setSuperTypes(Set<SuperType> superTypes) { StringBuilder sb = new StringBuilder(); for (SuperType item : superTypes) { sb.append(item.name()).append(SEPARATOR); } this.supertypes = sb.toString(); } public String getToughness() { return toughness; } public String getStartingLoyalty() { return startingLoyalty; } public String getSetCode() { return setCode; } public String getClassName() { return className; } public String getCardNumber() { return cardNumber; } public boolean isSplitCard() { return splitCard; } public boolean isSplitFuseCard() { return splitCardFuse; } public boolean isSplitAftermathCard() { return splitCardAftermath; } public boolean isSplitCardHalf() { return splitCardHalf; } public boolean isFlipCard() { return flipCard; } public String getFlipCardName() { return flipCardName; } public boolean isDoubleFaced() { return doubleFaced; } public boolean isNightCard() { return nightCard; } public String getSecondSideName() { return secondSideName; } }