From 86d9d2e5f7bcd80fc3986b287442cb9b6c9c70f6 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 24 Jul 2016 07:14:51 +0000 Subject: [PATCH] CardDb & CardRules & Card & CardFactory: use MeldPair to get the Backside from the Secondary if CardFactory use StaticData to get the other card --- forge-core/src/main/java/forge/card/CardDb.java | 15 +++++++++++++-- .../src/main/java/forge/card/CardRules.java | 11 +++++++++++ .../src/main/java/forge/game/card/Card.java | 5 +++++ .../main/java/forge/game/card/CardFactory.java | 8 +++++++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 6cf3e790546..46adb20c06d 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -177,8 +177,10 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (paperCard.getRules().getSplitType() == CardSplitType.None) { return; } - //allow looking up card by the name of other faces - allCardsByName.put(paperCard.getRules().getOtherPart().getName(), paperCard); + if (paperCard.getRules().getOtherPart() != null) { + //allow looking up card by the name of other faces + allCardsByName.put(paperCard.getRules().getOtherPart().getName(), paperCard); + } if (paperCard.getRules().getSplitType() == CardSplitType.Split) { //also include main part for split cards allCardsByName.put(paperCard.getRules().getMainPart().getName(), paperCard); @@ -218,6 +220,15 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return false; } + public CardRules getRules(String cardname) { + CardRules result = rulesByName.get(cardname); + if (result != null) { + return result; + } else { + return CardRules.getUnsupportedCardNamed(cardname); + } + } + @Override public PaperCard getCard(String cardName) { CardRequest request = CardRequest.fromString(cardName); diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index 7c1f27d6f5c..0f0ccceb9fa 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -38,12 +38,14 @@ public final class CardRules implements ICardCharacteristics { private ICardFace otherPart; private CardAiHints aiHints; private ColorSet colorIdentity; + private String meldWith; private CardRules(ICardFace[] faces, CardSplitType altMode, CardAiHints cah) { splitType = altMode; mainPart = faces[0]; otherPart = faces[1]; aiHints = cah; + meldWith = ""; //calculate color identity byte colMask = calculateColorIdentity(mainPart); @@ -63,6 +65,7 @@ public final class CardRules implements ICardCharacteristics { otherPart = newRules.otherPart; aiHints = newRules.aiHints; colorIdentity = newRules.colorIdentity; + meldWith = newRules.meldWith; } private static byte calculateColorIdentity(final ICardFace face) { @@ -195,6 +198,10 @@ public final class CardRules implements ICardCharacteristics { return mainPart.getOracleText().contains("can be your commander"); } + public String getMeldWith() { + return meldWith; + } + // public Set getSets() { return this.setsPrinted.keySet(); } // public CardInSet getEditionInfo(final String setCode) { // final CardInSet result = this.setsPrinted.get(setCode); @@ -242,6 +249,7 @@ public final class CardRules implements ICardCharacteristics { private String[] pictureUrl = new String[] { null, null }; private int curFace = 0; private CardSplitType altMode = CardSplitType.None; + private String meldWith = ""; private String handLife = null; // fields to build CardAiHints @@ -281,6 +289,7 @@ public final class CardRules implements ICardCharacteristics { faces[0].assignMissingFields(); if (null != faces[1]) faces[1].assignMissingFields(); final CardRules result = new CardRules(faces, altMode, cah); + result.meldWith = this.meldWith; result.setDlUrls(pictureUrl); if (StringUtils.isNotBlank(handLife)) result.setVanguardProperties(handLife); @@ -362,6 +371,8 @@ public final class CardRules implements ICardCharacteristics { if ("ManaCost".equals(key)) { this.faces[this.curFace].setManaCost("no cost".equals(value) ? ManaCost.NO_COST : new ManaCost(new ManaCostParser(value))); + } else if ("MeldPair".equals(key)) { + this.meldWith = value; } break; diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 52e8574d68c..d54eb691da0 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -324,6 +324,9 @@ public class Card extends GameEntity implements Comparable { else if (isDoubleFaced() && currentStateName != CardStateName.Transformed) { return states.get(CardStateName.Transformed); } + else if (this.isMeldable() && currentStateName != CardStateName.Meld) { + return states.get(CardStateName.Meld); + } else { return states.get(CardStateName.Original); } @@ -6623,6 +6626,8 @@ public class Card extends GameEntity implements Comparable { } public boolean isCommander() { + if (this.getMeldedWith() != null && this.getMeldedWith().isCommander()) + return true; return isCommander; } public void setCommander(boolean b) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index bfcb611913e..c788a36d2b1 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -18,7 +18,9 @@ package forge.game.card; import forge.ImageKeys; +import forge.StaticData; import forge.card.CardStateName; +import forge.card.CardDb; import forge.card.CardRules; import forge.card.CardSplitType; import forge.card.CardType; @@ -423,7 +425,11 @@ public class CardFactory { if (st != CardSplitType.None) { card.addAlternateState(st.getChangedStateName(), false); card.setState(st.getChangedStateName(), false); - readCardFace(card, rules.getOtherPart()); + if (rules.getOtherPart() != null) { + readCardFace(card, rules.getOtherPart()); + } else if (!rules.getMeldWith().isEmpty()) { + readCardFace(card, StaticData.instance().getCommonCards().getRules(rules.getMeldWith()).getOtherPart()); + } } if (card.isInAlternateState()) {