Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation

This commit is contained in:
klaxnek
2019-08-08 16:57:45 +02:00
23 changed files with 249 additions and 241 deletions

View File

@@ -1339,7 +1339,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
}); });
for (Card pw : aiPlaneswalkers) { for (Card pw : aiPlaneswalkers) {
int curLoyalty = pw.getCounters(CounterType.LOYALTY); int curLoyalty = pw.getCounters(CounterType.LOYALTY);
int freshLoyalty = pw.getCurrentState().getBaseLoyalty(); int freshLoyalty = Integer.valueOf(pw.getCurrentState().getBaseLoyalty());
if (freshLoyalty - curLoyalty >= loyaltyDiff && curLoyalty <= maxLoyaltyToConsider) { if (freshLoyalty - curLoyalty >= loyaltyDiff && curLoyalty <= maxLoyaltyToConsider) {
return pw; return pw;
} }

View File

@@ -38,7 +38,7 @@ final class CardFace implements ICardFace {
private int iToughness = Integer.MAX_VALUE; private int iToughness = Integer.MAX_VALUE;
private String power = null; private String power = null;
private String toughness = null; private String toughness = null;
private int initialLoyalty = -1; private String initialLoyalty = "";
private String nonAbilityText = null; private String nonAbilityText = null;
private List<String> keywords = null; private List<String> keywords = null;
@@ -56,7 +56,7 @@ final class CardFace implements ICardFace {
@Override public int getIntToughness() { return iToughness; } @Override public int getIntToughness() { return iToughness; }
@Override public String getPower() { return power; } @Override public String getPower() { return power; }
@Override public String getToughness() { return toughness; } @Override public String getToughness() { return toughness; }
@Override public int getInitialLoyalty() { return initialLoyalty; } @Override public String getInitialLoyalty() { return initialLoyalty; }
@Override public String getName() { return this.name; } @Override public String getName() { return this.name; }
@Override public CardType getType() { return this.type; } @Override public CardType getType() { return this.type; }
@Override public ManaCost getManaCost() { return this.manaCost; } @Override public ManaCost getManaCost() { return this.manaCost; }
@@ -84,7 +84,7 @@ final class CardFace implements ICardFace {
void setManaCost(ManaCost manaCost0) { this.manaCost = manaCost0; } void setManaCost(ManaCost manaCost0) { this.manaCost = manaCost0; }
void setColor(ColorSet color0) { this.color = color0; } void setColor(ColorSet color0) { this.color = color0; }
void setOracleText(String text) { this.oracleText = text; } void setOracleText(String text) { this.oracleText = text; }
void setInitialLoyalty(int value) { this.initialLoyalty = value; } void setInitialLoyalty(String value) { this.initialLoyalty = value; }
void setPtText(String value) { void setPtText(String value) {
final String k[] = value.split("/"); final String k[] = value.split("/");

View File

@@ -186,7 +186,7 @@ public final class CardRules implements ICardCharacteristics {
@Override public int getIntToughness() { return mainPart.getIntToughness(); } @Override public int getIntToughness() { return mainPart.getIntToughness(); }
@Override public String getPower() { return mainPart.getPower(); } @Override public String getPower() { return mainPart.getPower(); }
@Override public String getToughness() { return mainPart.getToughness(); } @Override public String getToughness() { return mainPart.getToughness(); }
@Override public int getInitialLoyalty() { return mainPart.getInitialLoyalty(); } @Override public String getInitialLoyalty() { return mainPart.getInitialLoyalty(); }
@Override @Override
public String getOracleText() { public String getOracleText() {
@@ -409,7 +409,7 @@ public final class CardRules implements ICardCharacteristics {
case 'L': case 'L':
if ("Loyalty".equals(key)) { if ("Loyalty".equals(key)) {
this.faces[this.curFace].setInitialLoyalty(Integer.valueOf(value)); this.faces[this.curFace].setInitialLoyalty(value);
} }
break; break;

View File

@@ -12,7 +12,7 @@ public interface ICardCharacteristics {
int getIntToughness(); int getIntToughness();
String getPower(); String getPower();
String getToughness(); String getToughness();
int getInitialLoyalty(); String getInitialLoyalty();
String getOracleText(); String getOracleText();
} }

View File

@@ -376,6 +376,9 @@ public class GameAction {
copied.clearEtbCounters(); copied.clearEtbCounters();
} }
// update state for view
copied.updateStateForView();
if (fromBattlefield) { if (fromBattlefield) {
c.setDamage(0); //clear damage after a card leaves the battlefield c.setDamage(0); //clear damage after a card leaves the battlefield
c.setHasBeenDealtDeathtouchDamage(false); c.setHasBeenDealtDeathtouchDamage(false);

View File

@@ -539,8 +539,7 @@ public class Card extends GameEntity implements Comparable<Card> {
} }
public final void updatePowerToughnessForView() { public final void updatePowerToughnessForView() {
currentState.getView().updatePower(this); view.updateCounters(this);
currentState.getView().updateToughness(this);
} }
public final void updateTypesForView() { public final void updateTypesForView() {

View File

@@ -325,9 +325,6 @@ public class CardFactory {
// ****************************************************************** // ******************************************************************
// ************** Link to different CardFactories ******************* // ************** Link to different CardFactories *******************
if (card.isPlaneswalker()) {
buildPlaneswalkerAbilities(card);
}
if (state == CardStateName.LeftSplit || state == CardStateName.RightSplit) { if (state == CardStateName.LeftSplit || state == CardStateName.RightSplit) {
for (final SpellAbility sa : card.getSpellAbilities()) { for (final SpellAbility sa : card.getSpellAbilities()) {
@@ -383,18 +380,6 @@ public class CardFactory {
card.addSpellAbility(planarRoll); card.addSpellAbility(planarRoll);
} }
private static void buildPlaneswalkerAbilities(Card card) {
CardState state = card.getCurrentState();
// etbCounter only for Original Card
if (state.getBaseLoyalty() > 0) {
final String loyalty = Integer.toString(state.getBaseLoyalty());
// keyword need to be added to state directly, so init can be disabled
if (state.addIntrinsicKeyword("etbCounter:LOYALTY:" + loyalty + ":no Condition:no desc", false) != null) {
card.updateKeywords();
}
}
}
private static Card readCard(final CardRules rules, final IPaperCard paperCard, int cardId, Game game) { private static Card readCard(final CardRules rules, final IPaperCard paperCard, int cardId, Game game) {
final Card card = new Card(cardId, paperCard, game); final Card card = new Card(cardId, paperCard, game);

View File

@@ -53,7 +53,7 @@ public class CardState extends GameObject {
private byte color = MagicColor.COLORLESS; private byte color = MagicColor.COLORLESS;
private int basePower = 0; private int basePower = 0;
private int baseToughness = 0; private int baseToughness = 0;
private int baseLoyalty = 0; private String baseLoyalty = "";
private KeywordCollection intrinsicKeywords = new KeywordCollection(); private KeywordCollection intrinsicKeywords = new KeywordCollection();
private final FCollection<SpellAbility> nonManaAbilities = new FCollection<SpellAbility>(); private final FCollection<SpellAbility> nonManaAbilities = new FCollection<SpellAbility>();
@@ -72,6 +72,8 @@ public class CardState extends GameObject {
private final CardStateView view; private final CardStateView view;
private final Card card; private final Card card;
private ReplacementEffect loyaltyRep = null;
public CardState(Card card, CardStateName name) { public CardState(Card card, CardStateName name) {
this(card.getView().createAlternateState(name), card); this(card.getView().createAlternateState(name), card);
} }
@@ -174,11 +176,11 @@ public class CardState extends GameObject {
view.updateToughness(this); view.updateToughness(this);
} }
public int getBaseLoyalty() { public String getBaseLoyalty() {
return baseLoyalty; return baseLoyalty;
} }
public final void setBaseLoyalty(final int loyalty) { public final void setBaseLoyalty(final String string) {
baseLoyalty = loyalty; baseLoyalty = string;
view.updateLoyalty(this); view.updateLoyalty(this);
} }
@@ -400,6 +402,14 @@ public class CardState extends GameObject {
public FCollectionView<ReplacementEffect> getReplacementEffects() { public FCollectionView<ReplacementEffect> getReplacementEffects() {
FCollection<ReplacementEffect> result = new FCollection<>(replacementEffects); FCollection<ReplacementEffect> result = new FCollection<>(replacementEffects);
if (getTypeWithChanges().isPlaneswalker()) {
if (loyaltyRep == null) {
loyaltyRep = CardFactoryUtil.makeEtbCounter("etbCounter:LOYALTY:" + this.baseLoyalty, card, true);
}
result.add(loyaltyRep);
}
card.updateReplacementEffects(result, this); card.updateReplacementEffects(result, this);
return result; return result;
} }

View File

@@ -678,6 +678,8 @@ public class CardView extends GameEntityView {
if (c.getGame() != null) { if (c.getGame() != null) {
currentStateView.updateColors(currentState); currentStateView.updateColors(currentState);
} }
} else {
currentStateView.updateLoyalty(currentState);
} }
currentState.getView().updateKeywords(c, currentState); //update keywords even if state doesn't change currentState.getView().updateKeywords(c, currentState); //update keywords even if state doesn't change
@@ -704,6 +706,8 @@ public class CardView extends GameEntityView {
if (c.getGame() != null) { if (c.getGame() != null) {
alternateStateView.updateColors(alternateState); alternateStateView.updateColors(alternateState);
} }
} else {
alternateStateView.updateLoyalty(alternateState);
} }
alternateState.getView().updateKeywords(c, alternateState); alternateState.getView().updateKeywords(c, alternateState);
} }
@@ -908,13 +912,17 @@ public class CardView extends GameEntityView {
set(TrackableProperty.Toughness, c.getBaseToughness()); set(TrackableProperty.Toughness, c.getBaseToughness());
} }
public int getLoyalty() { public String getLoyalty() {
return get(TrackableProperty.Loyalty); return get(TrackableProperty.Loyalty);
} }
void updateLoyalty(Card c) { void updateLoyalty(Card c) {
updateLoyalty(c.getCurrentLoyalty()); if (c.isInZone(ZoneType.Battlefield)) {
updateLoyalty(String.valueOf(c.getCurrentLoyalty()));
} else {
updateLoyalty(c.getCurrentState().getBaseLoyalty());
} }
void updateLoyalty(int loyalty) { }
void updateLoyalty(String loyalty) {
set(TrackableProperty.Loyalty, loyalty); set(TrackableProperty.Loyalty, loyalty);
} }
void updateLoyalty(CardState c) { void updateLoyalty(CardState c) {
@@ -930,7 +938,7 @@ public class CardView extends GameEntityView {
return; return;
} }
} }
set(TrackableProperty.Loyalty, 0); //alternates don't need loyalty set(TrackableProperty.Loyalty, "0"); //alternates don't need loyalty
} }
public String getSetCode() { public String getSetCode() {

View File

@@ -90,7 +90,7 @@ public class ReplacementHandler {
if (cause != null && cause.isReplacementAbility()) { if (cause != null && cause.isReplacementAbility()) {
final ReplacementEffect re = cause.getReplacementEffect(); final ReplacementEffect re = cause.getReplacementEffect();
// only return for same layer // only return for same layer
if (layer.equals(re.getLayer())) { if ("Moved".equals(re.getParam("Event")) && layer.equals(re.getLayer())) {
return re.getOtherChoices(); return re.getOtherChoices();
} }
} }

View File

@@ -77,7 +77,7 @@ public enum TrackableProperty {
RulesText(TrackableTypes.StringType), RulesText(TrackableTypes.StringType),
Power(TrackableTypes.IntegerType), Power(TrackableTypes.IntegerType),
Toughness(TrackableTypes.IntegerType), Toughness(TrackableTypes.IntegerType),
Loyalty(TrackableTypes.IntegerType), Loyalty(TrackableTypes.StringType),
ChangedColorWords(TrackableTypes.StringMapType), ChangedColorWords(TrackableTypes.StringMapType),
ChangedTypes(TrackableTypes.StringMapType), ChangedTypes(TrackableTypes.StringMapType),
HasDeathtouch(TrackableTypes.BooleanType), HasDeathtouch(TrackableTypes.BooleanType),

View File

@@ -437,7 +437,7 @@ public class VAssignDamage {
} }
else if (defender instanceof CardView) { // planeswalker else if (defender instanceof CardView) { // planeswalker
final CardView pw = (CardView)defender; final CardView pw = (CardView)defender;
lethalDamage = pw.getCurrentState().getLoyalty(); lethalDamage = Integer.valueOf(pw.getCurrentState().getLoyalty());
} }
} }
else { else {

View File

@@ -706,7 +706,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
String sPt = ""; String sPt = "";
if (state.isCreature() && state.isPlaneswalker()) { if (state.isCreature() && state.isPlaneswalker()) {
sPt = state.getPower() + "/" + state.getToughness() + sPt = state.getPower() + "/" + state.getToughness() +
" (" + String.valueOf(state.getLoyalty()) + ")"; " (" + state.getLoyalty() + ")";
} }
else if (state.isCreature()) { else if (state.isCreature()) {
sPt = state.getPower() + "/" + state.getToughness(); sPt = state.getPower() + "/" + state.getToughness();
@@ -715,7 +715,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
sPt = "[" + state.getPower() + "/" + state.getToughness() + "]"; sPt = "[" + state.getPower() + "/" + state.getToughness() + "]";
} }
else if (state.isPlaneswalker()) { else if (state.isPlaneswalker()) {
sPt = String.valueOf(state.getLoyalty()); sPt = state.getLoyalty();
} }
ptText.setText(sPt); ptText.setText(sPt);
} }

View File

@@ -273,7 +273,7 @@ public class CardRenderer {
state.getLoyalty(), count, suffix, x, y, w, h, compactMode); state.getLoyalty(), count, suffix, x, y, w, h, compactMode);
} }
public static void drawCardListItem(Graphics g, FSkinFont font, FSkinColor foreColor, FImageComplex cardArt, CardView card, String set, CardRarity rarity, int power, int toughness, int loyalty, int count, String suffix, float x, float y, float w, float h, boolean compactMode) { public static void drawCardListItem(Graphics g, FSkinFont font, FSkinColor foreColor, FImageComplex cardArt, CardView card, String set, CardRarity rarity, int power, int toughness, String loyalty, int count, String suffix, float x, float y, float w, float h, boolean compactMode) {
float cardArtHeight = h + 2 * FList.PADDING; float cardArtHeight = h + 2 * FList.PADDING;
float cardArtWidth = cardArtHeight * CARD_ART_RATIO; float cardArtWidth = cardArtHeight * CARD_ART_RATIO;
if (cardArt != null) { if (cardArt != null) {

View File

@@ -446,7 +446,7 @@ public class VAssignDamage extends FDialog {
} }
else if (defender instanceof CardView) { // planeswalker else if (defender instanceof CardView) { // planeswalker
CardView pw = (CardView)defender; CardView pw = (CardView)defender;
lethalDamage = pw.getCurrentState().getLoyalty(); lethalDamage = Integer.valueOf(pw.getCurrentState().getLoyalty());
} }
} }
else { else {

View File

@@ -1,7 +1,7 @@
Name:Chance for Glory Name:Chance for Glory
ManaCost:1 R W ManaCost:1 R W
Types:Instant Types:Instant
A:SP$ PumpAll | Cost$ 1 R W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | Permanent$ True | SubAbility$ DBAddTurn | SpellDescription$ Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. A:SP$ PumpAll | Cost$ 1 R W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | Permanent$ True | SubAbility$ DBAddTurn | SpellDescription$ Creatures you control gain indestructible.
SVar:DBAddTurn:DB$ AddTurn | NumTurns$ 1 | ExtraTurnDelayedTrigger$ DBDelTrig | ExtraTurnDelayedTriggerExcute$ TrigLose | References$ DBDelTrig,TrigLose | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. SVar:DBAddTurn:DB$ AddTurn | NumTurns$ 1 | ExtraTurnDelayedTrigger$ DBDelTrig | ExtraTurnDelayedTriggerExcute$ TrigLose | References$ DBDelTrig,TrigLose | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.
SVar:DBDelTrig:ThisTurn$ True | Mode$ Phase | Phase$ End of Turn | TriggerDescription$ At the beginning of that turn's end step, you lose the game. SVar:DBDelTrig:ThisTurn$ True | Mode$ Phase | Phase$ End of Turn | TriggerDescription$ At the beginning of that turn's end step, you lose the game.
SVar:TrigLose:DB$ LosesGame | Defined$ You SVar:TrigLose:DB$ LosesGame | Defined$ You

View File

@@ -2,8 +2,8 @@ Name:Cruel Celebrant
ManaCost:W B ManaCost:W B
Types:Creature Vampire Types:Creature Vampire
PT:1/2 PT:1/2
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl,Planeswalker.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever CARDNAME or another creature you control dies, each opponent loses 1 life and you gain 1 life. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl,Planeswalker.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever CARDNAME or another creature or planeswalker you control dies, each opponent loses 1 life and you gain 1 life.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerController$ TriggeredCardController | Execute$ TrigDrain | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature you control dies, each opponent loses 1 life and you gain 1 life. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerController$ TriggeredCardController | Execute$ TrigDrain | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature or planeswalker you control dies, each opponent loses 1 life and you gain 1 life.
SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1
DeckHas:Ability$LifeGain DeckHas:Ability$LifeGain

View File

@@ -5,7 +5,7 @@ PT:5/5
K:Kicker:3 K:Kicker:3
K:etbCounter:P1P1:5:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with five +1/+1 counters on it. K:etbCounter:P1P1:5:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with five +1/+1 counters on it.
SVar:WasKicked:Count$Kicked.1.0 SVar:WasKicked:Count$Kicked.1.0
T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAMRE attacks alone, double its power and toughness until end of turn. T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks alone, double its power and toughness until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +X | NumDef$ +Y | References$ X,Y SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +X | NumDef$ +Y | References$ X,Y
SVar:X:Count$CardPower SVar:X:Count$CardPower
SVar:Y:Count$CardToughness SVar:Y:Count$CardToughness

View File

@@ -1,8 +1,7 @@
Name:Nissa, Steward of Elements Name:Nissa, Steward of Elements
ManaCost:X G U ManaCost:X G U
Types:Legendary Planeswalker Nissa Types:Legendary Planeswalker Nissa
Loyalty:0 Loyalty:X
K:etbCounter:LOYALTY:X
SVar:X:Count$xPaid SVar:X:Count$xPaid
A:AB$ Scry | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ScryNum$ 2 | SpellDescription$ Scry 2. A:AB$ Scry | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ScryNum$ 2 | SpellDescription$ Scry 2.
A:AB$ Dig | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | DigNum$ 1 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Land,Creature.cmcLEY | ForceRevealToController$ True | PromptToSkipOptionalAbility$ True | References$ Y | AILogic$ AlwaysConfirm | OptionalAbilityPrompt$ Would you like to put the permanent onto the battlefield? | DestinationZone$ Battlefield | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of your library. If it's a land card or a creature card with converted mana cost less than or equal to the number of loyalty counters on Nissa, Steward of Elements, you may put that card onto the battlefield. A:AB$ Dig | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | DigNum$ 1 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Land,Creature.cmcLEY | ForceRevealToController$ True | PromptToSkipOptionalAbility$ True | References$ Y | AILogic$ AlwaysConfirm | OptionalAbilityPrompt$ Would you like to put the permanent onto the battlefield? | DestinationZone$ Battlefield | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of your library. If it's a land card or a creature card with converted mana cost less than or equal to the number of loyalty counters on Nissa, Steward of Elements, you may put that card onto the battlefield.

View File

@@ -2,7 +2,8 @@ Name:Yanling's Harbinger
ManaCost:3 U U ManaCost:3 U U
Types:Creature Bird Types:Creature Bird
PT:2/4 PT:2/4
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedMu Yanling; Celestial Wind | ChangeNum$ 1 | Optional$ True SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedMu Yanling; Celestial Wind | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Mu Yanling, Celestial Wind DeckHints:Name$Mu Yanling, Celestial Wind
Oracle:When Yanling's Harbinger enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it. Oracle:Flying\nWhen Yanling's Harbinger enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -3,5 +3,5 @@ Name:Brawl
Order:101 Order:101
Type:Casual Type:Casual
Subtype:Commander Subtype:Commander
Sets:XLN, RIX, DOM, M19, G18, GRN, RNA, WAR Sets:XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, M20
Banned:Sorcerous Spyglass Banned:Sorcerous Spyglass

View File

@@ -7,36 +7,36 @@ splash.loading.decks=Lade Decks...
splash.loading.processingimagesprites=Verarbeite Bilddaten splash.loading.processingimagesprites=Verarbeite Bilddaten
#FControl.java #FControl.java
lblOpeningMainWindow=Öffne Hauptfenster... lblOpeningMainWindow=Öffne Hauptfenster...
lblCloseScreen=Close Screen lblCloseScreen=Schließe Fenster
txCloseAction1=Forge now supports navigation tabs which allow closing and switching between different screens with ease. As a result, you no longer need to use the X button in the upper right to close the current screen and go back. txCloseAction1=Forge unterstützt Tab-Navigation um einfach Fenster zu schließen und zwischen ihnen zu wechseln. Darum ist es nicht mehr nötig ein Fenster mit X zu schließen um zu einem anderen Fenster zu wechseln.
txCloseAction2=Please select what you want to happen when clicking the X button in the upper right. This choice will be used going forward and you will not see this message again. You can change this behavior at any time in Preferences. txCloseAction2=Bitte wähle was passiert sobald du auf X oben rechts klickst. Die ausgewählte Option kann später jederzeti in den Einstellungen geändert werden.
titCloseAction=Select Your Close Action titCloseAction=Wähle deine "Schließen" Aktion
lblAreYouSureYouWishRestartForge=Are you sure you wish restart Forge? lblAreYouSureYouWishRestartForge=Willst du wirklich Forge neustarten?
lblAreYouSureYouWishExitForge=Are you sure you wish exit Forge? lblAreYouSureYouWishExitForge=Willst du wirklich Forge beenden?
lblOneOrMoreGamesActive=One or more games are currently active lblOneOrMoreGamesActive=Mindestens ein Spiel ist derzeit aktiv
lblerrLoadingLayoutFile=Your %s layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout. lblerrLoadingLayoutFile=Deine Layout-Datei %s konnte nicht gelesen werden. Sie wird gelöscht sobald du OK drückst.\nDas Spiel lädt anschließend das Standardlayout.
lblLoadingQuest=Loading quest... lblLoadingQuest=Lade Quest...
#FScreen.java #FScreen.java
lblHome=Home lblHome=Hauptmenü
lblWorkshop=Workshop lblWorkshop=Werkstatt
lblBacktoHome=Back to Home lblBacktoHome=Zum Hauptmenü
lblDeckEditor=Deck Editor lblDeckEditor=Deck-Editor
lblCloseEditor=Close Editor lblCloseEditor=Schließe Editor
lblCommanderDeckEditor=Commander Deck Editor lblCommanderDeckEditor=Commander-Deck-Editor
lblTinyLeadersDeckEditor=Tiny Leaders DeckEditor lblTinyLeadersDeckEditor=Kleine-Anführer-Deck-Editor
lblBrawlDeckEditor=Brawl Deck Editor lblBrawlDeckEditor=Brawl-Deck-Editor
lblDraftDeckEditor=Draft Deck Editor lblDraftDeckEditor=Draft-Deck-Editor
lblSealedDeckEditor=Sealed Deck Editor lblSealedDeckEditor=Sealed-Deck-Editor
lblTokenViewer=Token Viewer lblTokenViewer=Spielstein-Übersicht
lblCloseViewer=Close Viewer lblCloseViewer=Schließe Übersicht
lblQuestDeckEditor=Quest Deck Editor lblQuestDeckEditor=Quest-Deck-Editor
lblQuestTournamentDeckEditor=Quest Tournament Deck Editor lblQuestTournamentDeckEditor=Quest-Turnier-Deck-Editor
lblSpellShop=Spell Shop lblSpellShop=Spruchladen
lblLeaveShop=Leave Shop lblLeaveShop=Verlasse Laden
lblLeaveDraft=Leave Draft lblLeaveDraft=Verlasse Draft
lblBazaar=Bazaar lblBazaar=Basar
lblConcedeGame=Concede Game lblConcedeGame=Spiel aufgeben
txerrFailedtodeletelayoutfile=Failed to delete layout file. txerrFailedtodeletelayoutfile=Fehler beim Löschen der Layout-Datei.
#VSubmenuPreferences.java #VSubmenuPreferences.java
Preferences=Einstellungen Preferences=Einstellungen
btnReset=Alles zurücksetzen btnReset=Alles zurücksetzen
@@ -108,12 +108,12 @@ cbpCounterDisplayLocation=Markeranzeige Ort
cbpGraveyardOrdering=Genaue Reihenfolge im Friedhof einhalten cbpGraveyardOrdering=Genaue Reihenfolge im Friedhof einhalten
Troubleshooting=Fehlerbehebung Troubleshooting=Fehlerbehebung
GeneralConfiguration=Allgemeine Einstellungen GeneralConfiguration=Allgemeine Einstellungen
lblPlayerName=Player Name lblPlayerName=Spielername
nlPlayerName=Name unter welchem du beim Spielen geführt wirst. nlPlayerName=Name unter welchem du beim Spielen geführt wirst.
nlCompactMainMenu=Aktiviere, um im Seitenmenü platzsparend immer nur eine Menügruppe anzeigen zu lassen. (Erfordert Neustart) nlCompactMainMenu=Aktiviere, um im Seitenmenü platzsparend immer nur eine Menügruppe anzeigen zu lassen. (Erfordert Neustart)
nlUseSentry=Aktiviere, um automatische Fehlerberichte an die Entwickler zu senden. nlUseSentry=Aktiviere, um automatische Fehlerberichte an die Entwickler zu senden.
GamePlay=Spiel GamePlay=Spiel
nlpMulliganRule=Choose the version of the Mulligan rule nlpMulliganRule=Wähle die Version der Mulligan Regel
nlpAiProfiles=Wähle die Spielweise deines KI-Gegners. nlpAiProfiles=Wähle die Spielweise deines KI-Gegners.
nlAnte=Entscheidet, ob um einen Einsatz (Ante) gespielt wird. nlAnte=Entscheidet, ob um einen Einsatz (Ante) gespielt wird.
nlAnteMatchRarity=Versucht den Spieleinsatz für alle Spieler ungefähr gleich zu halten. nlAnteMatchRarity=Versucht den Spieleinsatz für alle Spieler ungefähr gleich zu halten.
@@ -150,7 +150,7 @@ nlLoadCardsLazily=Wenn aktiviert, lädt Forge Kartenscripte erst wenn sie benöt
nlLoadHistoricFormats=Wenn aktiviert, lädt Forge auch ältere Spielformate. Verlängert den Programmstart. nlLoadHistoricFormats=Wenn aktiviert, lädt Forge auch ältere Spielformate. Verlängert den Programmstart.
GraphicOptions=Grafik Optionen GraphicOptions=Grafik Optionen
nlDefaultFontSize=Die Standardschriftgröße. Alle Schriftelemente werden werden relative zu dieser angepaßt. (Erfordert Neustart) nlDefaultFontSize=Die Standardschriftgröße. Alle Schriftelemente werden werden relative zu dieser angepaßt. (Erfordert Neustart)
cbpMulliganRule=Mulligan Rule cbpMulliganRule=Mulligan Regel
nlImageFetcher=Ermöglicht bei bestehender Onlineverbindung das automatisches Nachladen fehlender Kartenbilder. nlImageFetcher=Ermöglicht bei bestehender Onlineverbindung das automatisches Nachladen fehlender Kartenbilder.
nlDisplayFoil=Zeige FOIL-Karten mit einem optischen FOIL-Effekt. nlDisplayFoil=Zeige FOIL-Karten mit einem optischen FOIL-Effekt.
nlRandomFoil=Zeige den FOIL-Effekt bei zufälligen Karten. nlRandomFoil=Zeige den FOIL-Effekt bei zufälligen Karten.
@@ -220,7 +220,7 @@ AresetMatchScreenLayout=Dies wird das Spielfeldlayout zurücksetzen.\nFalls du v
TresetMatchScreenLayout=Spielfeldlayout zurücksetzen TresetMatchScreenLayout=Spielfeldlayout zurücksetzen
OKresetMatchScreenLayout=Spielfeldlayout wurde zurückgesetzt. OKresetMatchScreenLayout=Spielfeldlayout wurde zurückgesetzt.
#EMenuGroup.java #EMenuGroup.java
lblSanctionedFormats=gültige Spielformate lblSanctionedFormats=Gültige Spielformate
lblOnlineMultiplayer=Mehrspieler (online) lblOnlineMultiplayer=Mehrspieler (online)
lblQuestMode=Quest-Modus lblQuestMode=Quest-Modus
lblPuzzleMode=Rätsel-Modus lblPuzzleMode=Rätsel-Modus
@@ -235,7 +235,7 @@ lblUseThisName=Nutzen
lblTryAgain=Neu lblTryAgain=Neu
lblAddAPlayer=Spieler hinzufügen lblAddAPlayer=Spieler hinzufügen
lblVariants=Varianten lblVariants=Varianten
lblRandom=Random lblRandom=Zufällig
#VSubmenuConstructed.java #VSubmenuConstructed.java
lblConstructedMode=Constructed-Modus lblConstructedMode=Constructed-Modus
lblConstructed=Constructed lblConstructed=Constructed
@@ -371,7 +371,7 @@ btnBuildNewSealedDeck=Erstelle neues Sealed Deck
#FDeckChooser.java #FDeckChooser.java
lblViewDeck=Zeige Deck lblViewDeck=Zeige Deck
lblRandomDeck=Zufälliges Deck lblRandomDeck=Zufälliges Deck
lblRandomColors=Random Colors lblRandomColors=Zufällige Farben
#GameType.java #GameType.java
lblSealed=Sealed lblSealed=Sealed
lblDraft=Draft lblDraft=Draft
@@ -696,184 +696,184 @@ ttWinsperDraftRotation=Wenn ein Draft nicht soweit fertig gespielt wird, wird er
lblRotationType=Austauschtyp lblRotationType=Austauschtyp
ttRotationType=Bei 0 verschwinden alte Drafts, bei 1 wird er duch einen neuen ersetzt. ttRotationType=Bei 0 verschwinden alte Drafts, bei 1 wird er duch einen neuen ersetzt.
#StatTypeFilter.java #StatTypeFilter.java
lblclicktotoogle=click to toggle the filter, right-click to show only lblclicktotoogle=Klicke zum Umschalten des Filters, Rechtsklick für Einzelanzeige von:
#SItemManagerUtil.java #SItemManagerUtil.java
lblWhitecards=White cards lblWhitecards=Weiße Karten
lblBluecards=Blue cards lblBluecards=Blaue Karten
lblBlackcards=Black cards lblBlackcards=Schwarze Karten
lblRedcards=Red cards lblRedcards=Rote Karten
lblGreencards=Green cards lblGreencards=Grüne Karten
lblColorlesscards=Colorless cards lblColorlesscards=Farblose Karten
lblMulticolorcards=Multicolor cards lblMulticolorcards=Mehrfarbige Karten
lblPackordeck=Card packs and prebuilt decks lblPackordeck=Kartenpacks und vorkonstruierte Decks
lblLands=Lands lblLands=Länder
lblArtifacts=Artifacts lblArtifacts=Artefakte
lblCreatures=Creatures lblCreatures=Kreaturen
lblEnchantments=Enchantments lblEnchantments=Verzauberungen
lblPlaneswalkers=Planeswalkers lblPlaneswalkers=Planeswalker
lblInstants=Instants lblInstants=Spontanzauber
lblSorceries=Sorceries lblSorceries=Hexereien
lblCCMC0=Cards with CMC 0 lblCCMC0=Karten mit UMK 0
lblCCMC1=Cards with CMC 1 lblCCMC1=Karten mit UMK 1
lblCCMC2=Cards with CMC 2 lblCCMC2=Karten mit UMK 2
lblCCMC3=Cards with CMC 3 lblCCMC3=Karten mit UMK 3
lblCCMC4=Cards with CMC 4 lblCCMC4=Karten mit UMK 4
lblCCMC5=Cards with CMC 5 lblCCMC5=Karten mit UMK 5
lblCCMC6orMore=Cards with CMC 6 lblCCMC6orMore=Karten mit UMK 6+
lblWhitedecks=White decks lblWhitedecks=Weiße Decks
lblBluedecks=Blue decks lblBluedecks=Blaue Decks
lblBlackdecks=Black decks lblBlackdecks=Schwarze Decks
lblReddecks=Red decks lblReddecks=Rote Decks
lblGreendecks=Green decks lblGreendecks=Grüne Decks
lblColorlessdecks=Colorless decks lblColorlessdecks=Farblose Decks
lblMulticolordecks=Multicolor decks lblMulticolordecks=Mehrfarbige Decks
lblOldstyleFoilcards=Old style Foil cards lblOldstyleFoilcards=Foil-Karten: alter Stil
lblNewstyleFoilcards=New style Foil cards lblNewstyleFoilcards=Foil-Karten: neuer Stil
lblNon-Foilcards=Non-Foil cards lblNon-Foilcards=Nicht-Foil Karten
lblUnratedcards=Unrated cards lblUnratedcards=Unbewertet Karten
lbl1starcards=1 star cards lbl1starcards=1-Stern-Karten
lbl2starcards=2 star cards lbl2starcards=2-Sterne-Karten
lbl3starcards=3 star cards lbl3starcards=3-Sterne-Karten
lbl4starcards=4 star cards lbl4starcards=4-Sterne-Karten
lbl5starcards=5 star cards lbl5starcards=5-Sterne-Karten
lblXcopiesof=X copies of lblXcopiesof=X Kopien von
lblcopiesof=copies of lblcopiesof=Kopien von
#ItemListView.java #ItemListView.java
lblUniqueCardsOnly=Unique Cards Only lblUniqueCardsOnly=Nur eine Version
ttUniqueCardsOnly=Toggle whether to show unique cards only ttUniqueCardsOnly=Schaltet zwischen der Anzeige der neuesten oder aller Versionen einer Karte um.
#ACEditorBase.java #ACEditorBase.java
lblAddcard=Add card lblAddcard=Karten hinzufügen
ttAddcard=Add selected card to current deck (or double click the row or hit the spacebar) ttAddcard=Fügt gewählte Karte dem Deck hinzu (oder Doppelklick oder Leertate drücken)
lblAdd4ofcard=Add 4 of card lblAdd4ofcard=4 Karten hinzufügen
ttAdd4ofcard=Add up to 4 of selected card to current deck ttAdd4ofcard=Fügt bis zu 4 Kopien der gewählten Karte dem Deck hinzu
lblRemovecard=Remove card lblRemovecard=Entferne Karte
ttRemovecard=Remove selected card from current deck (or double click the row or hit the spacebar) ttRemovecard=Entfernt die gewählte Karte aus dem Deck (oder Doppelklick oder Leertate drücken)
lblRemove4ofcard=Remove 4 of card lblRemove4ofcard=Entferne 4 Karten
ttRemove4ofcard=Remove up to 4 of selected card to current deck ttRemove4ofcard=Entfernt bis zu 4 Kopien der gewählten Karte aus dem Deck
lblAddBasicLands=Add Basic Lands lblAddBasicLands=Standardländer hinzufügen
ttAddBasicLands=Add basic lands to the deck ttAddBasicLands=Fügt Standardländer dem Deck hinzu
lblCardCatalog=Card Catalog lblCardCatalog=Kartenkatalog
lblJumptoprevioustable=Jump to previous table lblJumptoprevioustable=Springe zur vorigen Tabelle
lblJumptopnexttable=Jump to next table lblJumptopnexttable=Springe zur nächsten Tabelle
lblJumptotextfilter=Jump to text filter lblJumptotextfilter=Springe zum Textfilter
lblChooseavalueforX=Choose a value for X lblChooseavalueforX=Wähle Wert für X
#VCurrentDeck.java #VCurrentDeck.java
lblVCurrentDeck=Current Deck lblVCurrentDeck=Aktuelles Deck
ttbtnSave=Save Deck (Ctrl+S) ttbtnSave=Speichere Deck (STRG+S)
ttbtnSaveAs=Save Deck As (Ctrl+E) ttbtnSaveAs=Speichere Deck unter (STRG+E)
ttbtnLoadDeck=Open Deck (Ctrl+O) ttbtnLoadDeck=Öffne Deck (STRG+O)
ttbtnNewDeck=New Deck (Ctrl+N) ttbtnNewDeck=Neues Deck (STRG+N)
ttbtnPrintProxies=Print to HTML file (Ctrl+P) ttbtnPrintProxies=Speicher als HTML-Datei (STRG+P)
lblImport=Import lblImport=Importieren
ttImportDeck=Attempt to import a deck from a non-Forge format (Ctrl+I) ttImportDeck=Versucht ein Deck eines Nicht-Forge-Formates zu importiern (STRG+I)
lblTitle=Title lblTitle=Titel
#ImageView.java #ImageView.java
lblExpandallgroups=Expand all groups lblExpandallgroups=Expandiere alle Gruppen
lblCollapseallgroups=Collapse all groups lblCollapseallgroups=Minimiere alle Gruppen
lblGroupby=group by lblGroupby=Gruppiere nach
lblPileby=pile by lblPileby=Stapel nach
lblColumns=Columns lblColumns=Spalten
#CEditorVariant.java, CEditorConstructed.java #CEditorVariant.java, CEditorConstructed.java
lblCatalog=Catalog lblCatalog=Katalog
lblAdd=Add lblAdd=Hinzufügen
lbltodeck=to deck lbltodeck=zum Deck
lblfromdeck=from deck lblfromdeck=vom Deck
lbltosideboard=to sideboard lbltosideboard=zum Sideboard
lblfromsideboard=from sideboard lblfromsideboard=vom Sideboard
lblascommander=as commander lblascommander=als Kommandeur
lblasavatar=as avatar lblasavatar=als Avatar
lblfromschemedeck=from scheme deck lblfromschemedeck=vom Komplottdeck
lblfromplanardeck=from planar deck lblfromplanardeck=vom Weltendeck
lblfromconspiracydeck=from conspiracy deck lblfromconspiracydeck=vom Verschwörungsdeck
lbltoschemedeck=to scheme deck lbltoschemedeck=zum Komplottdeck
lbltoplanardeck=to planar deck lbltoplanardeck=zum Weltendeck
lbltoconspiracydeck=to conspiracy deck lbltoconspiracydeck=zum Verschwörungsdeck
lblMove=Move lblMove=Verschieben
#VDock.java #VDock.java
lblDock=Dock lblDock=Symbolleiste
lblViewDeckList=View DeckList lblViewDeckList=Zeige Deckliste
lblRevertLayout=Revert Layout lblRevertLayout=Layout zurücksetzen
lblOpenLayout=OpenLayout lblOpenLayout=Lade Layout
lblSaveLayout=Save Layout lblSaveLayout=Sichere Layout
#GroupDef.java #GroupDef.java
lblColor=Color lblColor=Farbe
lblColorIdentity=Color Identity lblColorIdentity=Farbidentität
lblSet=Set lblSet=Set
lblSet2=Set lblSet2=Set
#Set word has different meanings in other languages #Set word has different meanings in other languages
lblDefault=Default lblDefault=Standard
lblType=Type lblType=Typ
lblPlaneswalkerDeckSort=Planeswalker Deck Sort lblPlaneswalkerDeckSort=Planeswalker Deck
lblRarity=Rarity lblRarity=Seltenheit
lblConvertToFoil=Foil lblConvertToFoil=Foil
lblMulticolor=Multicolor lblMulticolor=Mehrfarbig
#DeckFileMenu.java #DeckFileMenu.java
lblNewDeck=New Deck lblNewDeck=Neues Deck
lblOpenDeck=Open Deck lblOpenDeck=Öffne Deck
lblImportDeck=Import Deck lblImportDeck=Deck importiren
lblSaveDeck=Save Deck lblSaveDeck=Speichere Deck
lblSaveDeckAs=Save Deck As... lblSaveDeckAs=Speichere Deck unter
lblPrinttoHTMLfile=Print to HTML file lblPrinttoHTMLfile=Speicher als HTML-Datei
#PaperCard.java #PaperCard.java
lblCard=Carta lblCard=Karte
#CardManager.java #CardManager.java
lblFormat=Format lblFormat=Format
lblFormats=Formats lblFormats=Formate
lblQuestWorld=Quest World lblQuestWorld=Quest-Welt
lblSets=Sets lblSets=Sets
lblTypes=Types lblTypes=Typen
lblConvertedManaCosts=Converted mana lblConvertedManaCosts=umgewandelte Manakosten
lblCMCRange=CMC Range lblCMCRange=UMK-Bereich
lblPowerRange=Power Range lblPowerRange=Stärke-Bereich
lblToughnessRange=Toughness Range lblToughnessRange=Widerstandskraft-Bereich
lblFoil=Foil lblFoil=Foil
lblPersonalRating=Personal Rating lblPersonalRating=persönliche Bewertung
lblAdvanced=Advanced lblAdvanced=Fortgeschritten
#VDeckgen.java #VDeckgen.java
lblDeckGeneration=Deck Generation lblDeckGeneration=Deckerstellung
btnRandCardpool=Random Cardpool btnRandCardpool=zufällige Kartenauswahl
ttbtnRandCardpool=Generate random constructed cardpool in current deck area ttbtnRandCardpool=erzeugt eine zufällige Kartenauswahl
btnRandDeck2=Constructed (2 color) btnRandDeck2=Constructed (2 Farben)
ttbtnRandDeck2=Generate 2 color constructed deck in current deck area ttbtnRandDeck2=Erzeugt konstuiertes Deck in zwei Farben
btnRandDeck3=Constructed (3 color) btnRandDeck3=Constructed (3 Farben)
ttbtnRandDeck3=Generate 3 color constructed deck in current deck area ttbtnRandDeck3=Erzeugt konstuiertes Deck in drei Farben
btnRandDeck5=Constructed (5 color) btnRandDeck5=Constructed (5 Farben)
ttbtnRandDeck5=Generate 5 color constructed deck in current deck area ttbtnRandDeck5=Erzeugt konstuiertes Deck in fünf Farben
#DeckCotroller.java #DeckCotroller.java
lblCurrentDeck2=Current Deck lblCurrentDeck2=aktuelles Deck
lblUntitled=Untitled lblUntitled=Unbenannt
#VPrompt.java #VPrompt.java
lblPrompt=Prompt lblPrompt=Meldungen
lblGameSetup=Game Setup lblGameSetup=Spielvorbereitung
#ColumnDef.java #ColumnDef.java
lblAIStatus=AI Status lblAIStatus=KI-Status
lblCMC=CMC lblCMC=UMK
ttCMC=CMC ttCMC=Umgerechnete Manakosten
lblCN=CN lblCN=SN
ttCN=Collector Number Order ttCN=Sammlernummer
ttColor=Color ttColor=Farbe
lblCost=Cost lblCost=Kosten
ttCost=Cost ttCost=Kosten
lblDecks=Decks lblDecks=Decks
lblDeleteEdit=Delete/Edit lblDeleteEdit=Löschen/Bearbeiten
lblSetEdition=Mystery column. We don't know what it does or if that's what it should do. lblSetEdition=Mysteriöse Spalte. Wir wissen nicht, wozu sie gut ist.
ttFavorite=Favorite ttFavorite=Favorit
lblFolder=Folder lblFolder=Ordner
ttFormats=Formats deck is legal in ttFormats=In welchem Format das Deck legal ist
lblMain=Main lblMain=Primär
ttMain=MainDeck ttMain=Das primäre Deck
lblQty=Qty lblQty=Anz.
lblQuantity=Quantity lblQuantity=Anzahl
lblSide=Side lblSide=Neben.
lblSideboard=Sideboard lblSideboard=Das Sideboard
lblNew=New lblNew=Neu
lblOwned=Owned lblOwned=Besitz
lblPower=Power lblPower=Stärke
ttPower=Power ttPower=Stärke
lblPrice=Price lblPrice=Preis
ttPrice=Price ttPrice=Preis
lblRanking=Ranking lblRanking=Rang
lblDraftRanking=Draft Ranking lblDraftRanking=Draft-Rang
lblToughness=Toughness lblToughness=Widerstand
ttToughness=Toughness ttToughness=Widerstand
ttType=Type ttType=Typ

View File

@@ -35,6 +35,8 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
public enum ColumnDef { public enum ColumnDef {
/**The column containing the inventory item name.*/ /**The column containing the inventory item name.*/
STRING("", "", 0, false, SortState.ASC, STRING("", "", 0, false, SortState.ASC,
@@ -512,7 +514,8 @@ public enum ColumnDef {
result = ((IPaperCard) i).getRules().getIntPower(); result = ((IPaperCard) i).getRules().getIntPower();
if (result == Integer.MAX_VALUE) { if (result == Integer.MAX_VALUE) {
if (((IPaperCard)i).getRules().getType().isPlaneswalker()) { if (((IPaperCard)i).getRules().getType().isPlaneswalker()) {
result = ((IPaperCard) i).getRules().getInitialLoyalty(); String loy = ((IPaperCard) i).getRules().getInitialLoyalty();
result = StringUtils.isNumeric(loy) ? Integer.valueOf(loy) : 0;
} }
} }
} }