diff --git a/src/main/java/forge/CardLists.java b/src/main/java/forge/CardLists.java index 76de0698080..44363d2e8c6 100644 --- a/src/main/java/forge/CardLists.java +++ b/src/main/java/forge/CardLists.java @@ -62,26 +62,26 @@ public class CardLists { }); } - public static final Comparator DefenseComparator = new Comparator() { + public static final Comparator ToughnessComparator = new Comparator() { @Override public int compare(final Card a, final Card b) { - return b.getNetDefense() - a.getNetDefense(); + return a.getNetDefense() - b.getNetDefense(); } }; - public static final Comparator AttackComparator = new Comparator() { + public static final Comparator PowerComparator = new Comparator() { @Override public int compare(final Card a, final Card b) { - return b.getNetCombatDamage() - a.getNetCombatDamage(); + return a.getNetCombatDamage() - b.getNetCombatDamage(); } }; - public static final Comparator CmcComparator = new Comparator() { + public static final Comparator CmcComparatorInv = new Comparator() { @Override public int compare(final Card a, final Card b) { return b.getCMC() - a.getCMC(); } }; - public static final Comparator TextLenReverseComparator = new Comparator() { + public static final Comparator TextLenComparator = new Comparator() { @Override public int compare(final Card a, final Card b) { final int aLen = a.getText().length(); @@ -90,30 +90,6 @@ public class CardLists { } }; - public static final Comparator getKeywordComparator(final String kw) { - return new Comparator() { - @Override - public int compare(final Card a, final Card b) { - int aV = a.hasKeyword(kw) ? 1 : 0; - int bV = b.hasKeyword(kw) ? 1 : 0; - return bV - aV; - } - }; - } - - // the higher the attack the better - /** - *

- * sortAttack. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - public static void sortAttack(final List list) { - Collections.sort(list, AttackComparator); - } // sortAttack() - /** *

* Sorts a List by "best" using the EvaluateCreature function. @@ -129,17 +105,16 @@ public class CardLists { /** *

- * Sorts a List by converted mana cost, putting highest first. + * Sorts a List from highest converted mana cost to lowest. *

* * @param list * a {@link forge.CardList} object. */ - public static void sortByMostExpensive(final List list) { - Collections.sort(list, CmcComparator); - } // sortByMostExpensive() + public static void sortByCmcDesc(final List list) { + Collections.sort(list, CmcComparatorInv); + } // sortCMC - // the lower the attack the better /** *

* sortAttackLowFirst. @@ -148,46 +123,24 @@ public class CardLists { * @param list * a {@link forge.CardList} object. */ - public static void sortAttackLowFirst(final List list) { - Collections.sort(list, Collections.reverseOrder(AttackComparator)); + public static void sortByPowerAsc(final List list) { + Collections.sort(list, PowerComparator); } // sortAttackLowFirst() + // the higher the attack the better /** *

- * Sorts a CardList, putting creatures without Flying first. + * sortAttack. *

* * @param list * a {@link forge.CardList} object. */ - public static void sortNonFlyingFirst(final List list) { - CardLists.sortFlying(list); - Collections.reverse(list); - } // sortNonFlyingFirst + public static void sortByPowerDesc(final List list) { + Collections.sort(list, Collections.reverseOrder(PowerComparator)); + } // sortAttack() - /** - *

- * Sorts a CardList, putting creatures with Flying first. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - public static void sortFlying(final List list) { - Collections.sort(list, getKeywordComparator("Flying")); - } // sortFlying() - /** - *

- * Sorts a List from highest converted mana cost to lowest. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - public static void sortCMC(final List list) { - Collections.sort(list, CmcComparator); - } // sortCMC /** *

diff --git a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java index 6e854c297f8..ef3944cc27a 100644 --- a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java +++ b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java @@ -860,7 +860,7 @@ public class ChangeZoneAi extends SpellAbilityAi { if (ai.getLife() <= 5) { // Desperate? // Get something AI can cast soon. System.out.println("5 Life or less, trying to find something castable."); - CardLists.sortByMostExpensive(nonLands); + CardLists.sortByCmcDesc(nonLands); for (Card potentialCard : nonLands) { if (ComputerUtilMana.payManaCost(potentialCard.getFirstSpellAbility(), ai, true, 0, false)) { choice = potentialCard; @@ -971,7 +971,7 @@ public class ChangeZoneAi extends SpellAbilityAi { if (ai.getLife() <= 5) { // Desperate? // Get something AI can cast soon. System.out.println("5 Life or less, trying to find something castable."); - CardLists.sortByMostExpensive(nonLands); + CardLists.sortByCmcDesc(nonLands); for (Card potentialCard : nonLands) { if (ComputerUtilMana.payManaCost(potentialCard.getFirstSpellAbility(), ai, true, 0, false)) { choice = potentialCard; @@ -1212,7 +1212,7 @@ public class ChangeZoneAi extends SpellAbilityAi { if (ai.getLife() <= 5) { // Desperate? // Get something AI can cast soon. System.out.println("5 Life or less, trying to find something castable."); - CardLists.sortByMostExpensive(fetchList); + CardLists.sortByCmcDesc(fetchList); for (Card potentialCard : fetchList) { if (ComputerUtilMana.payManaCost(potentialCard.getFirstSpellAbility(), ai, true, 0, false)) { c = potentialCard; diff --git a/src/main/java/forge/card/ability/ai/PumpAi.java b/src/main/java/forge/card/ability/ai/PumpAi.java index 50f8b1ca376..1c135f4ed41 100644 --- a/src/main/java/forge/card/ability/ai/PumpAi.java +++ b/src/main/java/forge/card/ability/ai/PumpAi.java @@ -184,7 +184,7 @@ public class PumpAi extends PumpAiBase { if (sa.getParam("AILogic").equals("HighestPower")) { list = CardLists.getValidCards(CardLists.filter(Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield), Presets.CREATURES), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); list = CardLists.getTargetableCards(list, sa); - CardLists.sortAttack(list); + CardLists.sortByPowerDesc(list); if (!list.isEmpty()) { tgt.addTarget(list.get(0)); return true; diff --git a/src/main/java/forge/card/ability/ai/RegenerateAi.java b/src/main/java/forge/card/ability/ai/RegenerateAi.java index 66c52f44c66..bd246275627 100644 --- a/src/main/java/forge/card/ability/ai/RegenerateAi.java +++ b/src/main/java/forge/card/ability/ai/RegenerateAi.java @@ -213,7 +213,7 @@ public class RegenerateAi extends SpellAbilityAi { tgt.addTarget(combatants.get(0)); return true; } else { - CardLists.sortByMostExpensive(compTargetables); + CardLists.sortByCmcDesc(compTargetables); for (final Card c : compTargetables) { if (c.getShield() == 0) { tgt.addTarget(c); diff --git a/src/main/java/forge/card/ability/effects/DiscardEffect.java b/src/main/java/forge/card/ability/effects/DiscardEffect.java index 858b59f6af0..49fd91ea912 100644 --- a/src/main/java/forge/card/ability/effects/DiscardEffect.java +++ b/src/main/java/forge/card/ability/effects/DiscardEffect.java @@ -117,9 +117,9 @@ public class DiscardEffect extends RevealEffectBase { } } - Collections.sort(goodChoices, CardLists.TextLenReverseComparator); + Collections.sort(goodChoices, CardLists.TextLenComparator); - CardLists.sortCMC(goodChoices); + CardLists.sortByCmcDesc(goodChoices); dChoices.add(goodChoices.get(0)); return Aggregates.random(goodChoices); diff --git a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java index cfbc238de78..25ce2580b0f 100644 --- a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java +++ b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java @@ -505,8 +505,8 @@ public class CardFactorySorceries { continue; } if (p.isComputer()) { - CardLists.sortAttackLowFirst(c); - CardLists.sortCMC(c); + CardLists.sortByPowerAsc(c); + CardLists.sortByCmcDesc(c); Collections.reverse(c); for (int i = 0; i < sac; i++) { Singletons.getModel().getGame().getAction().sacrifice(c.get(i), card); diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index ef2a8492520..97385a0180e 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -1237,7 +1237,7 @@ public class GameAction { return crd.hasKeyword("Totem armor"); } }); - CardLists.sortCMC(list); + CardLists.sortByCmcDesc(list); if (list.size() != 0) { final Card crd; diff --git a/src/main/java/forge/game/ai/AiAttackController.java b/src/main/java/forge/game/ai/AiAttackController.java index 95ef4bc58c7..e2276310d9a 100644 --- a/src/main/java/forge/game/ai/AiAttackController.java +++ b/src/main/java/forge/game/ai/AiAttackController.java @@ -253,7 +253,7 @@ public class AiAttackController { } } } - CardLists.sortAttackLowFirst(attackers); + CardLists.sortByPowerAsc(attackers); int blockersNeeded = this.oppList.size(); // don't hold back creatures that can't block any of the human creatures @@ -382,7 +382,7 @@ public class AiAttackController { } } - CardLists.sortAttack(this.attackers); + CardLists.sortByPowerDesc(this.attackers); final List unblockedAttackers = new ArrayList(); final List remainingAttackers = new ArrayList(this.attackers); @@ -531,7 +531,7 @@ public class AiAttackController { } if (bAssault) { System.out.println("Assault"); - CardLists.sortAttack(attackersLeft); + CardLists.sortByPowerDesc(attackersLeft); for (Card attacker : attackersLeft) { if (CombatUtil.canAttack(attacker, combat) && this.isEffectiveAttacker(ai, attacker, combat)) { combat.addAttacker(attacker); @@ -563,7 +563,7 @@ public class AiAttackController { } } if (exalted) { - CardLists.sortAttack(this.attackers); + CardLists.sortByPowerDesc(this.attackers); System.out.println("Exalted"); this.aiAggression = 6; for (Card attacker : this.attackers) { @@ -663,7 +663,7 @@ public class AiAttackController { // ********************* boolean doAttritionalAttack = false; // get list of attackers ordered from low power to high - CardLists.sortAttackLowFirst(this.attackers); + CardLists.sortByPowerAsc(this.attackers); // get player life total int humanLife = opp.getLife(); // get the list of attackers up to the first blocked one @@ -799,7 +799,7 @@ public class AiAttackController { int attackNum = 0; int damage = 0; List attacking = combat.getAttackersByDefenderSlot(combat.getCurrentDefenderNumber()); - CardLists.sortAttackLowFirst(attacking); + CardLists.sortByPowerAsc(attacking); for (Card atta : attacking) { if (attackNum >= blockNum || !CombatUtil.canBeBlocked(attacker, this.blockers)) { damage += ComputerUtilCombat.damageIfUnblocked(atta, opp, null); diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index 2b4b528a921..7189d5b4376 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -586,7 +586,7 @@ public class AiController { discardList.add(landsInHand.get(0)); hand.remove(landsInHand.get(0)); } else { // Discard other stuff - CardLists.sortCMC(hand); + CardLists.sortByCmcDesc(hand); int numLandsAvailable = numLandsInPlay; if (numLandsInHand > 0) { numLandsAvailable++; diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index b593fd16ab9..29615335ffe 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -399,7 +399,7 @@ public class ComputerUtil { * * @param type * a {@link java.lang.String} object. - * @param activate + * @param source * a {@link forge.Card} object. * @param target * a {@link forge.Card} object. @@ -407,10 +407,8 @@ public class ComputerUtil { * a int. * @return a {@link forge.CardList} object. */ - public static List chooseSacrificeType(final Player ai, final String type, final Card activate, final Card target, - final int amount) { - List typeList = - CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate); + public static List chooseSacrificeType(final Player ai, final String type, final Card source, final Card target, final int amount) { + List typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), source.getController(), source); if (ai.hasKeyword("You can't sacrifice creatures to cast spells or activate abilities.")) { typeList = CardLists.getNotType(typeList, "Creature"); } @@ -427,7 +425,7 @@ public class ComputerUtil { int count = 0; while (count < amount) { - final Card prefCard = ComputerUtil.getCardPreference(ai, activate, "SacCost", typeList); + final Card prefCard = ComputerUtil.getCardPreference(ai, source, "SacCost", typeList); if (prefCard != null) { sacList.add(prefCard); typeList.remove(prefCard); @@ -437,7 +435,7 @@ public class ComputerUtil { } } - CardLists.sortAttackLowFirst(typeList); + CardLists.sortByPowerAsc(typeList); for (int i = count; i < amount; i++) { sacList.add(typeList.get(i)); @@ -481,7 +479,7 @@ public class ComputerUtil { return null; } - CardLists.sortAttackLowFirst(typeList); + CardLists.sortByPowerAsc(typeList); final List exileList = new ArrayList(); for (int i = 0; i < amount; i++) { @@ -520,7 +518,7 @@ public class ComputerUtil { return null; } - CardLists.sortAttackLowFirst(typeList); + CardLists.sortByPowerAsc(typeList); final List tapList = new ArrayList(); @@ -560,7 +558,7 @@ public class ComputerUtil { return null; } - CardLists.sortAttack(typeList); + CardLists.sortByPowerDesc(typeList); final List untapList = new ArrayList(); @@ -597,7 +595,7 @@ public class ComputerUtil { return null; } - CardLists.sortAttackLowFirst(typeList); + CardLists.sortByPowerAsc(typeList); final List returnList = new ArrayList(); for (int i = 0; i < amount; i++) { @@ -645,7 +643,7 @@ public class ComputerUtil { return sacrificed; // sacrifice none } - CardLists.sortCMC(remaining); + CardLists.sortByCmcDesc(remaining); Collections.reverse(remaining); final int max = Math.min(remaining.size(), amount); diff --git a/src/main/java/forge/game/ai/ComputerUtilBlock.java b/src/main/java/forge/game/ai/ComputerUtilBlock.java index de107e9b043..49ddea84e56 100644 --- a/src/main/java/forge/game/ai/ComputerUtilBlock.java +++ b/src/main/java/forge/game/ai/ComputerUtilBlock.java @@ -285,7 +285,7 @@ public class ComputerUtilBlock { // Begin with the attackers that pose the biggest threat CardLists.sortByEvaluateCreature(firstAttacker); - CardLists.sortAttack(firstAttacker); + CardLists.sortByPowerDesc(firstAttacker); // If I don't have any planeswalkers than sorting doesn't really matter if (defenders.size() == 1) { @@ -301,7 +301,7 @@ public class ComputerUtilBlock { // if planeswalker will be too difficult to defend don't even bother for (List attacker : attackerLists) { // Begin with the attackers that pose the biggest threat - CardLists.sortAttack(attacker); + CardLists.sortByPowerDesc(attacker); for (final Card c : attacker) { sortedAttackers.add(c); } @@ -423,7 +423,7 @@ public class ComputerUtilBlock { } if (firstStrikeBlockers.size() > 1) { - CardLists.sortAttack(firstStrikeBlockers); + CardLists.sortByPowerDesc(firstStrikeBlockers); for (final Card blocker : firstStrikeBlockers) { final int damageNeeded = ComputerUtilCombat.getDamageToKill(attacker) + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, blocker, combat, false); @@ -803,7 +803,7 @@ public class ComputerUtilBlock { } // Begin with the weakest blockers - CardLists.sortAttackLowFirst(ComputerUtilBlock.getBlockersLeft()); + CardLists.sortByPowerAsc(ComputerUtilBlock.getBlockersLeft()); // == 1. choose best blocks first == combat = ComputerUtilBlock.makeGoodBlocks(ai, combat); @@ -919,7 +919,7 @@ public class ComputerUtilBlock { // very very simple ordering of blockers, sort by evaluate, then sort by attack //final int damage = attacker.getNetCombatDamage(); CardLists.sortByEvaluateCreature(blockers); - CardLists.sortAttack(blockers); + CardLists.sortByPowerDesc(blockers); // TODO: Take total damage, and attempt to maximize killing the greatest evaluation of creatures // It's probably generally better to kill the largest creature, but sometimes its better to kill a few smaller ones @@ -932,7 +932,7 @@ public class ComputerUtilBlock { // very very simple ordering of attackers, sort by evaluate, then sort by attack //final int damage = attacker.getNetCombatDamage(); CardLists.sortByEvaluateCreature(blockers); - CardLists.sortAttack(blockers); + CardLists.sortByPowerDesc(blockers); // TODO: Take total damage, and attempt to maximize killing the greatest evaluation of creatures // It's probably generally better to kill the largest creature, but sometimes its better to kill a few smaller ones diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index 4f281ac14a8..076f377e199 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -544,7 +544,7 @@ public class Upkeep extends Phase { public void resolve() { final List creatures = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); if (creatures.size() > 0) { - CardLists.sortAttackLowFirst(creatures); + CardLists.sortByPowerAsc(creatures); final int power = creatures.get(0).getNetAttack(); if (player.isHuman()) { Singletons.getModel().getMatch().getInput().setInput( diff --git a/src/main/java/forge/gui/toolbox/DeckLister.java b/src/main/java/forge/gui/toolbox/DeckLister.java index 47a10f03656..16e3ffc3f78 100644 --- a/src/main/java/forge/gui/toolbox/DeckLister.java +++ b/src/main/java/forge/gui/toolbox/DeckLister.java @@ -419,7 +419,6 @@ public class DeckLister extends JPanel implements ILocalRepaint { this.cmdRowSelect.execute(); } } - @SuppressWarnings("unchecked") private void editDeck(final Deck d0) { switch (this.gametype) { case Quest: