Commander: more fixes for new Commander changes and Color Identity

This commit is contained in:
Hanmac
2016-10-26 09:01:16 +00:00
parent 91d8afdf85
commit a27fb9106b
4 changed files with 22 additions and 28 deletions

View File

@@ -28,10 +28,12 @@ import org.apache.commons.lang3.Range;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import forge.StaticData; import forge.StaticData;
import forge.card.CardRules; import forge.card.CardRules;
import forge.card.CardRulesPredicates;
import forge.card.CardType; import forge.card.CardType;
import forge.card.ICardFace; import forge.card.ICardFace;
import forge.deck.generation.DeckGenPool; import forge.deck.generation.DeckGenPool;
@@ -383,13 +385,11 @@ public enum DeckFormat {
}; };
} }
public Predicate<PaperCard> isLegalCardForCommanderPredicate(PaperCard commander) { public Predicate<PaperCard> isLegalCardForCommanderPredicate(List<PaperCard> commanders) {
final byte cmdCI = commander.getRules().getColorIdentity().getColor(); byte cmdCI = 0;
return new Predicate<PaperCard>() { for (final PaperCard p : commanders) {
@Override cmdCI |= p.getRules().getColorIdentity().getColor();
public boolean apply(PaperCard card) { }
return card.getRules().getColorIdentity().hasNoColorsExcept(cmdCI); return Predicates.compose(CardRulesPredicates.hasColorIdentity(cmdCI), PaperCard.FN_GET_RULES);
}
};
} }
} }

View File

@@ -40,6 +40,7 @@ import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FEvent.FEventType; import forge.toolbox.FEvent.FEventType;
import forge.util.Callback; import forge.util.Callback;
import forge.util.ItemPool; import forge.util.ItemPool;
import forge.util.Lang;
import forge.util.Utils; import forge.util.Utils;
import forge.util.storage.IStorage; import forge.util.storage.IStorage;
@@ -523,8 +524,8 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
protected void save(final Callback<Boolean> callback) { protected void save(final Callback<Boolean> callback) {
if (StringUtils.isEmpty(deck.getName())) { if (StringUtils.isEmpty(deck.getName())) {
PaperCard commander = deck.getCommander(); List<PaperCard> commanders = deck.getCommanders(); //use commander name as default deck name
String initialInput = commander == null ? "" : commander.getName(); //use commander name as default deck name String initialInput = Lang.joinHomogenous(commanders);
FOptionPane.showInputDialog("Enter name for new deck", initialInput, new Callback<String>() { FOptionPane.showInputDialog("Enter name for new deck", initialInput, new Callback<String>() {
@Override @Override
public void run(String result) { public void run(String result) {
@@ -915,15 +916,15 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
break; break;
case Commander: case Commander:
case TinyLeaders: case TinyLeaders:
final PaperCard commander = parentScreen.getDeck().getCommander(); final List<PaperCard> commanders = parentScreen.getDeck().getCommanders();
if (commander == null) { if (commanders.isEmpty()) {
//if no commander set for deck, only show valid commanders //if no commander set for deck, only show valid commanders
additionalFilter = DeckFormat.Commander.isLegalCommanderPredicate(); additionalFilter = DeckFormat.Commander.isLegalCommanderPredicate();
cardManager.setCaption("Commanders"); cardManager.setCaption("Commanders");
} }
else { else {
//if a commander has been set, only show cards that match its color identity //if a commander has been set, only show cards that match its color identity
additionalFilter = DeckFormat.Commander.isLegalCardForCommanderPredicate(commander); additionalFilter = DeckFormat.Commander.isLegalCardForCommanderPredicate(commanders);
cardManager.setCaption("Cards"); cardManager.setCaption("Cards");
} }
//fall through to below //fall through to below
@@ -951,7 +952,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
} }
private boolean needsCommander() { private boolean needsCommander() {
return parentScreen.getCommanderPage() != null && parentScreen.getDeck().getCommander() == null; return parentScreen.getCommanderPage() != null && parentScreen.getDeck().getCommanders().isEmpty();
} }
private void setCommander(PaperCard card) { private void setCommander(PaperCard card) {

View File

@@ -10,6 +10,7 @@ import com.google.common.base.Predicates;
import forge.GuiBase; import forge.GuiBase;
import forge.assets.ISkinImage; import forge.assets.ISkinImage;
import forge.card.CardRulesPredicates;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.deck.generation.DeckGenPool; import forge.deck.generation.DeckGenPool;
import forge.item.PaperCard; import forge.item.PaperCard;
@@ -112,13 +113,7 @@ public class ConquestRegion {
break; break;
case "colors": case "colors":
colorSet = ColorSet.fromNames(value.toCharArray()); colorSet = ColorSet.fromNames(value.toCharArray());
final int colorMask = colorSet.getColor(); pred = Predicates.compose(CardRulesPredicates.hasColorIdentity(colorSet.getColor()), PaperCard.FN_GET_RULES);
pred = new Predicate<PaperCard>() {
@Override
public boolean apply(PaperCard pc) {
return pc.getRules().getColorIdentity().hasNoColorsExcept(colorMask);
}
};
break; break;
case "sets": case "sets":
final String[] sets = value.split(","); final String[] sets = value.split(",");

View File

@@ -8,7 +8,9 @@ import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.assets.FSkinProp; import forge.assets.FSkinProp;
import forge.assets.IHasSkinProp; import forge.assets.IHasSkinProp;
@@ -129,13 +131,9 @@ public class ConquestUtil {
//remove any cards that aren't allowed in deck due to color identity //remove any cards that aren't allowed in deck due to color identity
if (colorIdentity != MagicColor.ALL_COLORS) { if (colorIdentity != MagicColor.ALL_COLORS) {
List<PaperCard> invalidCards = new ArrayList<PaperCard>(); Predicate<PaperCard> pred = DeckFormat.Commander.isLegalCardForCommanderPredicate(deck.getCommanders());
for (PaperCard pc : availableCards) {
if (!pc.getRules().getColorIdentity().hasNoColorsExcept(colorIdentity)) { availableCards.retainAll(Lists.newArrayList(Iterables.filter(availableCards, pred)));
invalidCards.add(pc);
}
}
availableCards.removeAll(invalidCards);
} }
//create pool from available cards //create pool from available cards