From 260f626ee1c827401a792dac4a6e9e1bd2eadc61 Mon Sep 17 00:00:00 2001 From: moomarc Date: Mon, 18 Mar 2013 17:18:58 +0000 Subject: [PATCH] - Made Scythe Specter work correctly when opponents discard cards tied for highest cmc. - Made Heretic's Punishment work correctly with split cards --- src/main/java/forge/Card.java | 15 ++----- src/main/java/forge/CardLists.java | 39 +++++++++++++++++++ .../card/cardfactory/CardFactoryUtil.java | 14 ++++++- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index feef7038acf..53c3b9602b8 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -7032,7 +7032,7 @@ public class Card extends GameEntity implements Comparable { } } } else if (property.startsWith("greatestRememberedCMC")) { - final List list = new ArrayList(); + List list = new ArrayList(); for (final Object o : source.getRemembered()) { if (o instanceof Card) { list.add(Singletons.getModel().getGame().getCardState((Card) o)); @@ -7041,16 +7041,9 @@ public class Card extends GameEntity implements Comparable { if (!list.contains(this)) { return false; } - for (final Card crd : list) { - if (crd.getRules() != null && crd.getRules().getSplitType() == CardSplitType.Split) { - if (crd.getCMC(Card.SplitCMCMode.LeftSplitCMC) > this.getCMC() || crd.getCMC(Card.SplitCMCMode.RightSplitCMC) > this.getCMC()) { - return false; - } - } else { - if (crd.getCMC() > this.getCMC()) { - return false; - } - } + list = CardLists.getCardsWithHighestCMC(list); + if (!list.contains(this)) { + return false; } } else if (property.startsWith("lowestCMC")) { final List list = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); diff --git a/src/main/java/forge/CardLists.java b/src/main/java/forge/CardLists.java index 4d8f445fba9..d6898fbcd7e 100644 --- a/src/main/java/forge/CardLists.java +++ b/src/main/java/forge/CardLists.java @@ -28,6 +28,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.card.CardSplitType; import forge.card.spellability.SpellAbility; import forge.game.ai.ComputerUtilCard; import forge.game.player.Player; @@ -259,4 +260,42 @@ public class CardLists { res.add(c); return res; } + + /** + * Given a List cardList, return a List that are tied for having the highest CMC. + * + * @param cardList the Card List to be filtered. + * @return CardList the list of Cards sharing the highest CMC. + */ + public static List getCardsWithHighestCMC(Iterable cardList) { + final List tiedForHighest = new ArrayList(); + int highest = 0; + for (final Card crd : cardList) { + if (crd.getRules() != null && crd.getRules().getSplitType() == CardSplitType.Split) { + if (crd.getCMC(Card.SplitCMCMode.LeftSplitCMC) > highest) { + highest = crd.getCMC(Card.SplitCMCMode.LeftSplitCMC); + tiedForHighest.clear(); + tiedForHighest.add(crd); + } else if (crd.getCMC(Card.SplitCMCMode.LeftSplitCMC) == highest && !tiedForHighest.contains(crd)) { + tiedForHighest.add(crd); + } + if (crd.getCMC(Card.SplitCMCMode.RightSplitCMC) > highest) { + highest = crd.getCMC(Card.SplitCMCMode.RightSplitCMC); + tiedForHighest.clear(); + tiedForHighest.add(crd); + } else if (crd.getCMC(Card.SplitCMCMode.RightSplitCMC) == highest && !tiedForHighest.contains(crd)) { + tiedForHighest.add(crd); + } + } else { + if (crd.getCMC() > highest) { + highest = crd.getCMC(); + tiedForHighest.clear(); + tiedForHighest.add(crd); + } else if (crd.getCMC() == highest && !tiedForHighest.contains(crd)) { + tiedForHighest.add(crd); + } + } + } + return tiedForHighest; + } } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 13abdc2c331..5813640e334 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -40,6 +40,7 @@ import forge.Constant; import forge.CounterType; import forge.GameEntity; import forge.Singletons; +import forge.card.CardSplitType; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; @@ -1420,8 +1421,17 @@ public class CardFactoryUtil { } } for (final Card crd : list) { - if (crd.getCMC() > highest) { - highest = crd.getCMC(); + if (crd.getRules() != null && crd.getRules().getSplitType() == CardSplitType.Split) { + if (crd.getCMC(Card.SplitCMCMode.LeftSplitCMC) > highest) { + highest = crd.getCMC(Card.SplitCMCMode.LeftSplitCMC); + } + if (crd.getCMC(Card.SplitCMCMode.RightSplitCMC) > highest) { + highest = crd.getCMC(Card.SplitCMCMode.RightSplitCMC); + } + } else { + if (crd.getCMC() > highest) { + highest = crd.getCMC(); + } } } return highest;