diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index b84adeea7d5..eb808066d02 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-ai diff --git a/forge-ai/src/main/java/forge/ai/AIOption.java b/forge-ai/src/main/java/forge/ai/AIOption.java index 3eea52dfc7e..66925e7f6b8 100644 --- a/forge-ai/src/main/java/forge/ai/AIOption.java +++ b/forge-ai/src/main/java/forge/ai/AIOption.java @@ -1,5 +1,5 @@ package forge.ai; public enum AIOption { - USE_SIMULATION; + USE_SIMULATION } diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 1a374d80660..51798704399 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -81,7 +81,7 @@ public class AiAttackController { this.defendingOpponent = choosePreferredDefenderPlayer(); this.oppList = getOpponentCreatures(this.defendingOpponent); this.myList = ai.getCreaturesInPlay(); - this.attackers = new ArrayList(); + this.attackers = new ArrayList<>(); for (Card c : myList) { if (CombatUtil.canAttack(c, this.defendingOpponent)) { attackers.add(c); @@ -95,7 +95,7 @@ public class AiAttackController { this.defendingOpponent = choosePreferredDefenderPlayer(); this.oppList = getOpponentCreatures(this.defendingOpponent); this.myList = ai.getCreaturesInPlay(); - this.attackers = new ArrayList(); + this.attackers = new ArrayList<>(); if (CombatUtil.canAttack(attacker, this.defendingOpponent)) { attackers.add(attacker); } @@ -103,8 +103,7 @@ public class AiAttackController { } // overloaded constructor to evaluate single specified attacker public static List getOpponentCreatures(final Player defender) { - List defenders = new ArrayList(); - defenders.addAll(defender.getCreaturesInPlay()); + List defenders = new ArrayList<>(defender.getCreaturesInPlay()); Predicate canAnimate = new Predicate() { @Override public boolean apply(Card c) { @@ -151,7 +150,7 @@ public class AiAttackController { * */ public final static List sortAttackers(final List in) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); // Cards with triggers should come first (for Battle Cry) for (final Card attacker : in) { @@ -256,7 +255,7 @@ public class AiAttackController { } public final static List getPossibleBlockers(final List blockers, final List attackers) { - List possibleBlockers = new ArrayList(blockers); + List possibleBlockers = new ArrayList<>(blockers); possibleBlockers = CardLists.filter(possibleBlockers, new Predicate() { @Override public boolean apply(final Card c) { @@ -267,7 +266,7 @@ public class AiAttackController { } public final static boolean canBlockAnAttacker(final Card c, final List attackers, final boolean nextTurn) { - final List attackerList = new ArrayList(attackers); + final List attackerList = new ArrayList<>(attackers); if (!c.isCreature()) { return false; } @@ -280,7 +279,7 @@ public class AiAttackController { } public final static Card getCardCanBlockAnAttacker(final Card c, final List attackers, final boolean nextTurn) { - final List attackerList = new ArrayList(attackers); + final List attackerList = new ArrayList<>(attackers); if (!c.isCreature()) { return null; } @@ -295,9 +294,9 @@ public class AiAttackController { // this checks to make sure that the computer player doesn't lose when the human player attacks // this method is used by getAttackers() public final List notNeededAsBlockers(final Player ai, final List attackers) { - final List notNeededAsBlockers = new ArrayList(attackers); + final List notNeededAsBlockers = new ArrayList<>(attackers); int fixedBlockers = 0; - final List vigilantes = new ArrayList(); + final List vigilantes = new ArrayList<>(); //check for time walks if (ai.getGame().getPhaseHandler().getNextTurn().equals(ai)) { return attackers; @@ -336,7 +335,7 @@ public class AiAttackController { } } - List opponentsAttackers = new ArrayList(oppList); + List opponentsAttackers = new ArrayList<>(oppList); opponentsAttackers = CardLists.filter(opponentsAttackers, new Predicate() { @Override public boolean apply(final Card c) { @@ -548,8 +547,7 @@ public class AiAttackController { remainingAttackers.removeAll(unblockedAttackers); for (Card blocker : this.blockers) { - if (blocker.hasKeyword("CARDNAME can block any number of creatures.") - || blocker.hasKeyword("CARDNAME can block an additional ninety-nine creatures each combat.")) { + if (blocker.canBlockAny()) { for (Card attacker : this.attackers) { if (CombatUtil.canBlock(attacker, blocker)) { remainingAttackers.remove(attacker); @@ -565,14 +563,19 @@ public class AiAttackController { if (remainingAttackers.isEmpty() || maxBlockersAfterCrew == 0) { break; } - if (blocker.hasKeyword("CARDNAME can block an additional creature each combat.")) { - blockedAttackers.add(remainingAttackers.get(0)); - remainingAttackers.remove(0); - maxBlockersAfterCrew--; - if (remainingAttackers.isEmpty()) { - break; + + int numExtraBlocks = blocker.canBlockAdditional(); + if (numExtraBlocks > 0) { + while (numExtraBlocks-- > 0 && !remainingAttackers.isEmpty()) { + blockedAttackers.add(remainingAttackers.get(0)); + remainingAttackers.remove(0); + maxBlockersAfterCrew--; } } + + if (remainingAttackers.isEmpty()) { + break; + } blockedAttackers.add(remainingAttackers.get(0)); remainingAttackers.remove(0); maxBlockersAfterCrew--; @@ -681,7 +684,7 @@ public class AiAttackController { // Determine who will be attacked GameEntity defender = this.chooseDefender(combat, bAssault); - List attackersLeft = new ArrayList(this.attackers); + List attackersLeft = new ArrayList<>(this.attackers); // TODO probably use AttackConstraints instead of only GlobalAttackRestrictions? GlobalAttackRestrictions restrict = GlobalAttackRestrictions.getGlobalRestrictions(ai, combat.getDefenders()); @@ -821,12 +824,12 @@ public class AiAttackController { int humanForcesForAttritionalAttack = 0; // examine the potential forces - final List nextTurnAttackers = new ArrayList(); + final List nextTurnAttackers = new ArrayList<>(); int candidateCounterAttackDamage = 0; final Player opp = this.defendingOpponent; // get the potential damage and strength of the AI forces - final List candidateAttackers = new ArrayList(); + final List candidateAttackers = new ArrayList<>(); int candidateUnblockedDamage = 0; for (final Card pCard : this.myList) { // if the creature can attack then it's a potential attacker this @@ -885,7 +888,7 @@ public class AiAttackController { final int outNumber = computerForces - humanForces; for (Card blocker : this.blockers) { - if (blocker.hasKeyword("CARDNAME can block any number of creatures.")) { + if (blocker.canBlockAny()) { aiLifeToPlayerDamageRatio--; } } @@ -908,7 +911,7 @@ public class AiAttackController { // get player life total int humanLife = opp.getLife(); // get the list of attackers up to the first blocked one - final List attritionalAttackers = new ArrayList(); + final List attritionalAttackers = new ArrayList<>(); for (int x = 0; x < (this.attackers.size() - humanForces); x++) { attritionalAttackers.add(this.attackers.get(x)); } @@ -1021,7 +1024,7 @@ public class AiAttackController { } // stay at home to block if ( LOG_AI_ATTACKS ) - System.out.println(String.valueOf(this.aiAggression) + " = ai aggression"); + System.out.println(this.aiAggression + " = ai aggression"); // **************** // Evaluation the end @@ -1457,7 +1460,7 @@ public class AiAttackController { if (artifact != null) { return artifact; } - return null; //should never get here + return null;//should never get here } private void doLightmineFieldAttackLogic(List attackersLeft, int numForcedAttackers, boolean playAggro) { diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index e948d3cebfc..5b2caa36636 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -148,9 +148,7 @@ public class AiBlockController { final CardCollection attackers = combat.getAttackersOf(defender); // Begin with the attackers that pose the biggest threat CardLists.sortByPowerDesc(attackers); - for (final Card c : attackers) { - sortedAttackers.add(c); - } + sortedAttackers.addAll(attackers); } else if (defender instanceof Player && defender.equals(ai)) { firstAttacker = combat.getAttackersOf(defender); } @@ -163,9 +161,7 @@ public class AiBlockController { } } else { // add creatures attacking the Player to the back of the list - for (final Card c : firstAttacker) { - sortedAttackers.add(c); - } + sortedAttackers.addAll(firstAttacker); } return sortedAttackers; } @@ -481,8 +477,7 @@ public class AiBlockController { final int damageNeeded = ComputerUtilCombat.getDamageToKill(attacker) + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, secondBlocker, combat, false); - List usableBlockersAsThird = new ArrayList<>(); - usableBlockersAsThird.addAll(usableBlockers); + List usableBlockersAsThird = new ArrayList<>(usableBlockers); usableBlockersAsThird.remove(secondBlocker); // loop over the remaining blockers in search of a good third blocker candidate @@ -859,7 +854,7 @@ public class AiBlockController { damageToPW += ComputerUtilCombat.predictDamageTo((Card) def, pwatkr.getNetCombatDamage(), pwatkr, true); } } - if ((!onlyIfLethal && damageToPW > 0) || damageToPW >= ((Card) def).getCounters(CounterType.LOYALTY)) { + if ((!onlyIfLethal && damageToPW > 0) || damageToPW >= def.getCounters(CounterType.LOYALTY)) { threatenedPWs.add((Card) def); } } @@ -879,7 +874,7 @@ public class AiBlockController { if (!chumpPWDefenders.isEmpty()) { for (final Card attacker : attackers) { GameEntity def = combat.getDefenderByAttacker(attacker); - if (def instanceof Card && threatenedPWs.contains((Card) def)) { + if (def instanceof Card && threatenedPWs.contains(def)) { if (attacker.hasKeyword(Keyword.TRAMPLE)) { // don't bother trying to chump a trampling creature continue; @@ -914,7 +909,7 @@ public class AiBlockController { pwDefenders.addAll(combat.getBlockers(pwAtk)); } else { isFullyBlocked = false; - damageToPW += ComputerUtilCombat.predictDamageTo((Card) pw, pwAtk.getNetCombatDamage(), pwAtk, true); + damageToPW += ComputerUtilCombat.predictDamageTo(pw, pwAtk.getNetCombatDamage(), pwAtk, true); } } if (!isFullyBlocked && damageToPW >= pw.getCounters(CounterType.LOYALTY)) { @@ -1329,13 +1324,9 @@ public class AiBlockController { && ((Card) combat.getDefenderByAttacker(attacker)).isPlaneswalker(); boolean wantToTradeDownToSavePW = chanceToTradeDownToSaveWalker > 0; - if (((evalBlk <= evalAtk + 1) || (wantToSavePlaneswalker && wantToTradeDownToSavePW)) // "1" accounts for tapped. + return ((evalBlk <= evalAtk + 1) || (wantToSavePlaneswalker && wantToTradeDownToSavePW)) // "1" accounts for tapped. && powerParityOrHigher && (creatureParityOrAllowedDiff || wantToTradeWithCreatInHand) - && (MyRandom.percentTrue(chance) || wantToSavePlaneswalker)) { - return true; - } - - return false; + && (MyRandom.percentTrue(chance) || wantToSavePlaneswalker); } } diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index e0794076723..9e203710dd9 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -137,7 +137,7 @@ public class AiCardMemory { Set memorySet = getMemorySet(set); - return memorySet == null ? false : memorySet.contains(c); + return memorySet != null && memorySet.contains(c); } /** @@ -291,7 +291,7 @@ public class AiCardMemory { * @return true, if the given memory set contains no remembered cards. */ public boolean isMemorySetEmpty(MemorySet set) { - return set == null ? true : getMemorySet(set).isEmpty(); + return set == null || getMemorySet(set).isEmpty(); } /** diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index bc548e7079f..a027cc9ea1c 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1645,7 +1645,6 @@ public class AiController { // For non-converted triggers (such as Cumulative Upkeep) that don't have costs or targets to worry about return true; } - return false; } @@ -1690,16 +1689,11 @@ public class AiController { left = AbilityUtils.calculateAmount(hostCard, svarToCheck, sa); } System.out.println("aiShouldRun?" + left + comparator + compareTo); - if (Expressions.compare(left, comparator, compareTo)) { - return true; - } + return Expressions.compare(left, comparator, compareTo); } else if (effect.getMapParams().containsKey("AICheckDredge")) { return player.getCardsIn(ZoneType.Library).size() > 8 || player.isCardInPlay("Laboratory Maniac"); - } else if (sa != null && doTrigger(sa, false)) { - return true; - } + } else return sa != null && doTrigger(sa, false); - return false; } public List chooseSaToActivateFromOpeningHand(List usableFromOpeningHand) { @@ -2078,9 +2072,7 @@ public class AiController { // AI-specific restrictions specified as activation parameters in spell abilities if (sa.hasParam("AILifeThreshold")) { - if (player.getLife() <= Integer.parseInt(sa.getParam("AILifeThreshold"))) { - return false; - } + return player.getLife() > Integer.parseInt(sa.getParam("AILifeThreshold")); } return true; diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index c5ae2738f94..47dfbbd4d4b 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -56,7 +56,7 @@ public class AiCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(CostChooseCreatureType cost) { String choice = player.getController().chooseSomeType("Creature", ability, CardType.getAllCreatureTypes(), - Lists.newArrayList()); + Lists.newArrayList()); return PaymentDecision.type(choice); } @@ -475,7 +475,7 @@ public class AiCostDecision extends CostDecisionMakerBase { if (ability.getPayCosts().hasTapCost() && typeList.contains(ability.getHostCard())) { c--; } - source.setSVar("ChosenX", "Number$" + Integer.toString(c)); + source.setSVar("ChosenX", "Number$" + c); } else { if (!isVehicle) { c = AbilityUtils.calculateAmount(source, amount, ability); @@ -809,7 +809,7 @@ public class AiCostDecision extends CostDecisionMakerBase { final String sVar = ability.getSVar(amount); if (sVar.equals("XChoice")) { c = AbilityUtils.calculateAmount(source, "ChosenX", ability); - source.setSVar("ChosenX", "Number$" + String.valueOf(c)); + source.setSVar("ChosenX", "Number$" + c); } else if (amount.equals("All")) { c = source.getCounters(cost.counter); } else if (sVar.equals("Targeted$CardManaCost")) { @@ -865,7 +865,7 @@ public class AiCostDecision extends CostDecisionMakerBase { } typeList = CardLists.filter(typeList, Presets.TAPPED); c = typeList.size(); - source.setSVar("ChosenX", "Number$" + Integer.toString(c)); + source.setSVar("ChosenX", "Number$" + c); } else { c = AbilityUtils.calculateAmount(source, amount, ability); } diff --git a/forge-ai/src/main/java/forge/ai/AiPlayDecision.java b/forge-ai/src/main/java/forge/ai/AiPlayDecision.java index c3c41cd20ba..692badb6bd8 100644 --- a/forge-ai/src/main/java/forge/ai/AiPlayDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiPlayDecision.java @@ -17,5 +17,5 @@ public enum AiPlayDecision { WouldBecomeZeroToughnessCreature, WouldDestroyWorldEnchantment, BadEtbEffects, - CurseEffects; + CurseEffects } \ No newline at end of file diff --git a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java index cfe4bcd61dc..06f60545f52 100644 --- a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java +++ b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java @@ -39,7 +39,7 @@ import java.util.Map; * @version $Id: AIProfile.java 20169 2013-03-08 08:24:17Z Agetian $ */ public class AiProfileUtil { - private static Map> loadedProfiles = new HashMap>(); + private static Map> loadedProfiles = new HashMap<>(); private static String AI_PROFILE_DIR; private static final String AI_PROFILE_EXT = ".ai"; @@ -74,7 +74,7 @@ public class AiProfileUtil { * @param profileName a profile to load. */ private static final Map loadProfile(final String profileName) { - Map profileMap = new HashMap(); + Map profileMap = new HashMap<>(); List lines = FileUtil.readFile(buildFileName(profileName)); for (String line : lines) { @@ -122,7 +122,7 @@ public class AiProfileUtil { */ public static List getAvailableProfiles() { - final List availableProfiles = new ArrayList(); + final List availableProfiles = new ArrayList<>(); final File dir = new File(AI_PROFILE_DIR); final String[] children = dir.list(); @@ -146,7 +146,7 @@ public class AiProfileUtil { * available profiles including special random profile tags. */ public static List getProfilesDisplayList() { - final List availableProfiles = new ArrayList(); + final List availableProfiles = new ArrayList<>(); availableProfiles.add(AI_PROFILE_RANDOM_MATCH); availableProfiles.add(AI_PROFILE_RANDOM_DUEL); availableProfiles.addAll(getAvailableProfiles()); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index baf97df8181..a5de6d50c5f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -423,7 +423,7 @@ public class ComputerUtil { int mana = ComputerUtilMana.getAvailableManaEstimate(ai, false); boolean cantAffordSoon = activate.getCMC() > mana + 1; - boolean wrongColor = !activate.determineColor().hasNoColorsExcept(ColorSet.fromNames(ComputerUtilCost.getAvailableManaColors(ai, ImmutableList.of())).getColor()); + boolean wrongColor = !activate.determineColor().hasNoColorsExcept(ColorSet.fromNames(ComputerUtilCost.getAvailableManaColors(ai, ImmutableList.of())).getColor()); // Only do this for spells, not activated abilities // We can't pay for this spell even if we play another land, or have wrong colors @@ -524,7 +524,7 @@ public class ComputerUtil { typeList = CardLists.filter(typeList, CardPredicates.canBeSacrificedBy(ability)); - if ((target != null) && target.getController() == ai && typeList.contains(target)) { + if ((target != null) && target.getController() == ai) { typeList.remove(target); // don't sacrifice the card we're pumping } @@ -554,7 +554,7 @@ public class ComputerUtil { final Card target, final int amount) { CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(zone), type.split(";"), activate.getController(), activate, null); - if ((target != null) && target.getController() == ai && typeList.contains(target)) { + if ((target != null) && target.getController() == ai) { typeList.remove(target); // don't exile the card we're pumping } @@ -575,7 +575,7 @@ public class ComputerUtil { final Card target, final int amount) { CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(zone), type.split(";"), activate.getController(), activate, null); - if ((target != null) && target.getController() == ai && typeList.contains(target)) { + if ((target != null) && target.getController() == ai) { typeList.remove(target); // don't move the card we're pumping } @@ -704,7 +704,7 @@ public class ComputerUtil { public static CardCollection chooseReturnType(final Player ai, final String type, final Card activate, final Card target, final int amount) { final CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate, null); - if ((target != null) && target.getController() == ai && typeList.contains(target)) { + if ((target != null) && target.getController() == ai) { // don't bounce the card we're pumping typeList.remove(target); } @@ -794,11 +794,11 @@ public class ComputerUtil { if (c.hasSVar("SacMe") || ComputerUtilCard.evaluateCreature(c) < sacThreshold) { return true; } - + if (ComputerUtilCard.hasActiveUndyingOrPersist(c)) { return true; } - + return false; } }); @@ -1514,7 +1514,7 @@ public class ComputerUtil { */ public static List predictThreatenedObjects(final Player ai, final SpellAbility sa, boolean top) { final Game game = ai.getGame(); - final List objects = new ArrayList(); + final List objects = new ArrayList<>(); if (game.getStack().isEmpty()) { return objects; } @@ -1543,8 +1543,8 @@ public class ComputerUtil { private static Iterable predictThreatenedObjects(final Player aiPlayer, final SpellAbility saviour, final SpellAbility topStack) { - Iterable objects = new ArrayList(); - final List threatened = new ArrayList(); + Iterable objects = new ArrayList<>(); + final List threatened = new ArrayList<>(); ApiType saviourApi = saviour == null ? null : saviour.getApi(); int toughness = 0; boolean grantIndestructible = false; @@ -1574,7 +1574,7 @@ public class ComputerUtil { } } else { objects = topStack.getTargets().getTargets(); - final List canBeTargeted = new ArrayList(); + final List canBeTargeted = new ArrayList<>(); for (Object o : objects) { if (o instanceof Card) { final Card c = (Card) o; @@ -1597,7 +1597,7 @@ public class ComputerUtil { toughness = saviorWithSubs.hasParam("NumDef") ? AbilityUtils.calculateAmount(saviorWithSubs.getHostCard(), saviorWithSubs.getParam("NumDef"), saviour) : 0; final List keywords = saviorWithSubs.hasParam("KW") ? - Arrays.asList(saviorWithSubs.getParam("KW").split(" & ")) : new ArrayList(); + Arrays.asList(saviorWithSubs.getParam("KW").split(" & ")) : new ArrayList<>(); if (keywords.contains("Indestructible")) { grantIndestructible = true; } @@ -1630,7 +1630,7 @@ public class ComputerUtil { final SpellAbility sub = topStack.getSubAbility(); boolean noRegen = false; if (sub != null && sub.getApi() == ApiType.Pump) { - final List keywords = sub.hasParam("KW") ? Arrays.asList(sub.getParam("KW").split(" & ")) : new ArrayList(); + final List keywords = sub.hasParam("KW") ? Arrays.asList(sub.getParam("KW").split(" & ")) : new ArrayList<>(); for (String kw : keywords) { if (kw.contains("can't be regenerated")) { noRegen = true; @@ -1925,9 +1925,9 @@ public class ComputerUtil { if (predictThreatenedObjects(ai, null).contains(source)) { return true; } - if (game.getPhaseHandler().inCombat() && - ComputerUtilCombat.combatantWouldBeDestroyed(ai, source, game.getCombat())) { - return true; + if (game.getPhaseHandler().inCombat() && + ComputerUtilCombat.combatantWouldBeDestroyed(ai, source, game.getCombat())) { + return true; } } else if (zone.getZoneType() == ZoneType.Exile && sa.getMayPlay() != null) { // play cards in exile that can only be played that turn @@ -1967,11 +1967,8 @@ public class ComputerUtil { final CardCollectionView lands = CardLists.filter(handList, new Predicate() { @Override public boolean apply(final Card c) { - if (c.getManaCost().getCMC() > 0 || c.hasSVar("NeedsToPlay") - || (!c.getType().isLand() && !c.getType().isArtifact())) { - return false; - } - return true; + return c.getManaCost().getCMC() <= 0 && !c.hasSVar("NeedsToPlay") + && (c.getType().isLand() || c.getType().isArtifact()); } }); @@ -1986,10 +1983,7 @@ public class ComputerUtil { final CardCollectionView castables = CardLists.filter(handList, new Predicate() { @Override public boolean apply(final Card c) { - if (c.getManaCost().getCMC() > 0 && c.getManaCost().getCMC() <= landSize) { - return false; - } - return true; + return c.getManaCost().getCMC() <= 0 || c.getManaCost().getCMC() > landSize; } }); @@ -2059,7 +2053,7 @@ public class ComputerUtil { //Too many lands! //Init int cntColors = MagicColor.WUBRG.length; - List numProducers = new ArrayList(cntColors); + List numProducers = new ArrayList<>(cntColors); for (byte col : MagicColor.WUBRG) { numProducers.add(col, new CardCollection()); } @@ -2186,10 +2180,7 @@ public class ComputerUtil { CardCollection goodChoices = CardLists.filter(validCards, new Predicate() { @Override public boolean apply(final Card c) { - if (c.hasSVar("DiscardMeByOpp") || c.hasSVar("DiscardMe")) { - return false; - } - return true; + return !c.hasSVar("DiscardMeByOpp") && !c.hasSVar("DiscardMe"); } }); if (goodChoices.isEmpty()) { @@ -2205,7 +2196,7 @@ public class ComputerUtil { } } } - + Collections.sort(goodChoices, CardLists.TextLenComparator); CardLists.sortByCmcDesc(goodChoices); @@ -2225,7 +2216,7 @@ public class ComputerUtil { public static String chooseSomeType(Player ai, String kindOfType, String logic, List invalidTypes) { if (invalidTypes == null) { - invalidTypes = ImmutableList.of(); + invalidTypes = ImmutableList.of(); } final Game game = ai.getGame(); @@ -2292,8 +2283,7 @@ public class ComputerUtil { chosen = ComputerUtilCard.getMostProminentType(list, valid); } else if (logic.equals("MostNeededType")) { // Choose a type that is in the deck, but not in hand or on the battlefield - final List basics = new ArrayList(); - basics.addAll(CardType.Constant.BASIC_TYPES); + final List basics = new ArrayList<>(CardType.Constant.BASIC_TYPES); CardCollectionView presentCards = CardCollection.combine(ai.getCardsIn(ZoneType.Battlefield), ai.getCardsIn(ZoneType.Hand)); CardCollectionView possibleCards = ai.getAllCards(); @@ -2546,8 +2536,7 @@ public class ComputerUtil { @Override public boolean apply(final Card c) { if (c.getController() == ai) { - if (c.getSVar("Targeting").equals("Dies") || c.getSVar("Targeting").equals("Counter")) - return false; + return !c.getSVar("Targeting").equals("Dies") && !c.getSVar("Targeting").equals("Counter"); } return true; } @@ -2598,7 +2587,7 @@ public class ComputerUtil { int damage = 0; final Game game = player.getGame(); final Card card = sa.getHostCard(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card c : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(c.getTriggers()); @@ -2690,7 +2679,7 @@ public class ComputerUtil { public static int getDamageFromETB(final Player player, final Card permanent) { int damage = 0; final Game game = player.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); @@ -2875,7 +2864,6 @@ public class ComputerUtil { } else if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "LichDraw"))) { return false; } - return true; } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index f562e7a3a01..bb8bc575f55 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -368,7 +368,7 @@ public class ComputerUtilCard { } if (hasEnchantmants || hasArtifacts) { - final List ae = CardLists.filter(list, Predicates.and(Predicates.or(CardPredicates.Presets.ARTIFACTS, CardPredicates.Presets.ENCHANTMENTS), new Predicate() { + final List ae = CardLists.filter(list, Predicates.and(Predicates.or(CardPredicates.Presets.ARTIFACTS, CardPredicates.Presets.ENCHANTMENTS), new Predicate() { @Override public boolean apply(Card card) { return !card.hasSVar("DoNotDiscardIfAble"); @@ -564,7 +564,7 @@ public class ComputerUtilCard { AiBlockController aiBlk = new AiBlockController(ai); Combat combat = new Combat(ai); combat.addAttacker(attacker, ai); - final List attackers = new ArrayList(); + final List attackers = new ArrayList<>(); attackers.add(attacker); aiBlk.assignBlockersGivenAttackers(combat, attackers); return ComputerUtilCombat.attackerWouldBeDestroyed(ai, attacker, combat); @@ -788,7 +788,7 @@ public class ComputerUtilCard { public static List getColorByProminence(final List list) { int cntColors = MagicColor.WUBRG.length; - final List> map = new ArrayList>(); + final List> map = new ArrayList<>(); for(int i = 0; i < cntColors; i++) { map.add(MutablePair.of(MagicColor.WUBRG[i], 0)); } @@ -809,7 +809,7 @@ public class ComputerUtilCard { }); // will this part be once dropped? - List result = new ArrayList(cntColors); + List result = new ArrayList<>(cntColors); for(Pair idx : map) { // fetch color names in the same order result.add(MagicColor.toLongString(idx.getKey())); } @@ -881,7 +881,7 @@ public class ComputerUtilCard { } }; public static List chooseColor(SpellAbility sa, int min, int max, List colorChoices) { - List chosen = new ArrayList(); + List chosen = new ArrayList<>(); Player ai = sa.getActivatingPlayer(); final Game game = ai.getGame(); Player opp = ai.getWeakestOpponent(); @@ -1301,7 +1301,7 @@ public class ComputerUtilCard { combatTrick = true; final List kws = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) - : Lists.newArrayList(); + : Lists.newArrayList(); for (String kw : kws) { if (!kw.equals("Trample") && !kw.equals("First Strike") && !kw.equals("Double Strike")) { combatTrick = false; @@ -1571,7 +1571,7 @@ public class ComputerUtilCard { Card pumped = CardFactory.copyCard(c, true); pumped.setSickness(c.hasSickness()); final long timestamp = c.getGame().getNextTimestamp(); - final List kws = new ArrayList(); + final List kws = new ArrayList<>(); for (String kw : keywords) { if (kw.startsWith("HIDDEN")) { pumped.addHiddenExtrinsicKeyword(kw); @@ -1601,8 +1601,8 @@ public class ComputerUtilCard { } pumped.addNewPT(c.getCurrentPower(), c.getCurrentToughness(), timestamp); - pumped.addTempPowerBoost(c.getTempPowerBoost() + power + berserkPower); - pumped.addTempToughnessBoost(c.getTempToughnessBoost() + toughness); + pumped.setPTBoost(c.getPTBoostMap()); + pumped.addPTBoost(power + berserkPower, toughness, timestamp); pumped.addChangedCardKeywords(kws, null, false, false, timestamp); Set types = c.getCounters().keySet(); for(CounterType ct : types) { @@ -1648,6 +1648,8 @@ public class ComputerUtilCard { } list.add(vCard); // account for the static abilities that may be present on the card itself for (final Card c : list) { + // remove old boost that might be copied + vCard.removePTBoost(c.getTimestamp()); for (final StaticAbility stAb : c.getStaticAbilities()) { final Map params = stAb.getMapParams(); if (!params.get("Mode").equals("Continuous")) { @@ -1663,26 +1665,25 @@ public class ComputerUtilCard { if (!vCard.isValid(valid, c.getController(), c, null)) { continue; } + int att = 0; if (params.containsKey("AddPower")) { String addP = params.get("AddPower"); - int att = 0; if (addP.equals("AffectedX")) { att = CardFactoryUtil.xCount(vCard, AbilityUtils.getSVar(stAb, addP)); } else { att = AbilityUtils.calculateAmount(c, addP, stAb); } - vCard.addTempPowerBoost(att); } + int def = 0; if (params.containsKey("AddToughness")) { String addT = params.get("AddToughness"); - int def = 0; if (addT.equals("AffectedY")) { def = CardFactoryUtil.xCount(vCard, AbilityUtils.getSVar(stAb, addT)); } else { def = AbilityUtils.calculateAmount(c, addT, stAb); } - vCard.addTempToughnessBoost(def); } + vCard.addPTBoost(att, def, c.getTimestamp()); } } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 4a38704d130..262d63705e9 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -84,7 +84,7 @@ public class ComputerUtilCombat { return Iterables.any(defenders, new Predicate() { @Override public boolean apply(final GameEntity input) { return ComputerUtilCombat.canAttackNextTurn(attacker, input); - }; + } }); } // canAttackNextTurn(Card) @@ -119,11 +119,7 @@ public class ComputerUtilCombat { } // The creature won't untap next turn - if (atacker.isTapped() && !Untap.canUntap(atacker)) { - return false; - } - - return true; + return !atacker.isTapped() || Untap.canUntap(atacker); } // canAttackNextTurn(Card, GameEntity) /** @@ -883,20 +879,19 @@ public class ComputerUtilCombat { } else if (mode == TriggerType.DamageDone) { willTrigger = true; if (trigParams.containsKey("ValidSource")) { - if (CardTraitBase.matchesValid(defender, trigParams.get("ValidSource").split(","), source) + if (!(CardTraitBase.matchesValid(defender, trigParams.get("ValidSource").split(","), source) && defender.getNetCombatDamage() > 0 && (!trigParams.containsKey("ValidTarget") - || CardTraitBase.matchesValid(attacker, trigParams.get("ValidTarget").split(","), source))) { - return true; + || CardTraitBase.matchesValid(attacker, trigParams.get("ValidTarget").split(","), source)))) { + return false; } - if (CardTraitBase.matchesValid(attacker, trigParams.get("ValidSource").split(","), source) + if (!(CardTraitBase.matchesValid(attacker, trigParams.get("ValidSource").split(","), source) && attacker.getNetCombatDamage() > 0 && (!trigParams.containsKey("ValidTarget") - || CardTraitBase.matchesValid(defender, trigParams.get("ValidTarget").split(","), source))) { - return true; + || CardTraitBase.matchesValid(defender, trigParams.get("ValidTarget").split(","), source)))) { + return false; } } - return false; } return willTrigger; @@ -970,7 +965,7 @@ public class ComputerUtilCombat { } } - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1105,7 +1100,7 @@ public class ComputerUtilCombat { } final Game game = attacker.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1289,7 +1284,7 @@ public class ComputerUtilCombat { } final Game game = attacker.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1414,7 +1409,7 @@ public class ComputerUtilCombat { if (att.matches("[0-9][0-9]?") || att.matches("-" + "[0-9][0-9]?")) { power += Integer.parseInt(att); } else { - String bonus = new String(source.getSVar(att)); + String bonus = source.getSVar(att); if (bonus.contains("TriggerCount$NumBlockers")) { bonus = TextUtil.fastReplace(bonus, "TriggerCount$NumBlockers", "Number$1"); } else if (bonus.contains("TriggeredPlayersDefenders$Amount")) { // for Melee @@ -1510,7 +1505,7 @@ public class ComputerUtilCombat { } final Game game = attacker.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1655,7 +1650,7 @@ public class ComputerUtilCombat { if (def.matches("[0-9][0-9]?") || def.matches("-" + "[0-9][0-9]?")) { toughness += Integer.parseInt(def); } else { - String bonus = new String(source.getSVar(def)); + String bonus = source.getSVar(def); if (bonus.contains("TriggerCount$NumBlockers")) { bonus = TextUtil.fastReplace(bonus, "TriggerCount$NumBlockers", "Number$1"); } else if (bonus.contains("TriggeredPlayersDefenders$Amount")) { // for Melee @@ -1731,7 +1726,7 @@ public class ComputerUtilCombat { } // check Destroy triggers (Cockatrice and friends) - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : attacker.getGame().getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -1948,7 +1943,7 @@ public class ComputerUtilCombat { return defenderDamage >= attackerLife; } // defender no double strike - return false; // should never arrive here + return false;// should never arrive here } // canDestroyAttacker // For AI safety measures like Regeneration @@ -2011,7 +2006,7 @@ public class ComputerUtilCombat { } final Game game = blocker.getGame(); - final FCollection theTriggers = new FCollection(); + final FCollection theTriggers = new FCollection<>(); for (Card card : game.getCardsIn(ZoneType.Battlefield)) { theTriggers.addAll(card.getTriggers()); } @@ -2195,7 +2190,7 @@ public class ComputerUtilCombat { return attackerDamage >= defenderLife; } // attacker no double strike - return false; // should never arrive here + return false;// should never arrive here } // canDestroyBlocker diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 43c942f94a2..bdbf2abf61c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -424,7 +424,7 @@ public class ComputerUtilCost { continue; } final int remainingLife = ai.getLife(); - final int lifeCost = ((CostPayLife) part).convertAmount(); + final int lifeCost = part.convertAmount(); if ((remainingLife - lifeCost) < 10) { return false; //Don't pay life if it would put AI under 10 life } else if ((remainingLife / lifeCost) < 4) { @@ -552,7 +552,7 @@ public class ComputerUtilCost { final Card source = sa.getHostCard(); final String aiLogic = sa.getParam("UnlessAI"); boolean payForOwnOnly = "OnlyOwn".equals(aiLogic); - boolean payOwner = sa.hasParam("UnlessAI") ? aiLogic.startsWith("Defined") : false; + boolean payOwner = sa.hasParam("UnlessAI") && aiLogic.startsWith("Defined"); boolean payNever = "Never".equals(aiLogic); boolean shockland = "Shockland".equals(aiLogic); boolean isMine = sa.getActivatingPlayer().equals(payer); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 7aae37dc721..1a1b9fc6df5 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -170,8 +170,7 @@ public class ComputerUtilMana { } return ability1.compareTo(ability2); - } - else { + } else { return preOrder; } } @@ -344,6 +343,10 @@ public class ComputerUtilMana { payMultipleMana(cost, manaProduced, ai); // remove from available lists + /* + * Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard())); + * causes Android build not to compile + * */ Iterator itSa = sourcesForShards.values().iterator(); while (itSa.hasNext()) { SpellAbility srcSa = itSa.next(); @@ -362,7 +365,7 @@ public class ComputerUtilMana { private static boolean payManaCost(final ManaCostBeingPaid cost, final SpellAbility sa, final Player ai, final boolean test, boolean checkPlayable) { adjustManaCostToAvoidNegEffects(cost, sa.getHostCard(), ai); - List manaSpentToPay = test ? new ArrayList() : sa.getPayingMana(); + List manaSpentToPay = test ? new ArrayList<>() : sa.getPayingMana(); boolean purePhyrexian = cost.containsOnlyPhyrexianMana(); int testEnergyPool = ai.getCounters(CounterType.ENERGY); @@ -487,6 +490,10 @@ public class ComputerUtilMana { payMultipleMana(cost, manaProduced, ai); // remove from available lists + /* + * Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard())); + * causes Android build not to compile + * */ Iterator itSa = sourcesForShards.values().iterator(); while (itSa.hasNext()) { SpellAbility srcSa = itSa.next(); @@ -517,6 +524,10 @@ public class ComputerUtilMana { if (hasConverge) { // hack to prevent converge re-using sources // remove from available lists + /* + * Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard())); + * causes Android build not to compile + * */ Iterator itSa = sourcesForShards.values().iterator(); while (itSa.hasNext()) { SpellAbility srcSa = itSa.next(); @@ -880,10 +891,12 @@ public class ComputerUtilMana { // For combat tricks, always obey mana reservation if (curPhase == PhaseType.COMBAT_DECLARE_BLOCKERS || curPhase == PhaseType.CLEANUP) { - AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK); - } else if (!(ai.getGame().getPhaseHandler().isPlayerTurn(ai)) && (curPhase == PhaseType.COMBAT_DECLARE_BLOCKERS || curPhase == PhaseType.CLEANUP)) { - AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK); - AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); + if (!(ai.getGame().getPhaseHandler().isPlayerTurn(ai))) { + AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK); + AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); + } + else + AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK); } else { if ((AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK)) || (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK))) { @@ -1346,7 +1359,7 @@ public class ComputerUtilMana { final ListMultimap manaMap = ArrayListMultimap.create(); final Game game = ai.getGame(); - List replacementEffects = new ArrayList(); + List replacementEffects = new ArrayList<>(); for (final Player p : game.getPlayers()) { for (final Card crd : p.getAllCards()) { for (final ReplacementEffect replacementEffect : crd.getReplacementEffects()) { @@ -1552,7 +1565,7 @@ public class ComputerUtilMana { * @return map between creatures and shards to convoke */ public static Map getConvokeOrImproviseFromList(final ManaCost cost, List list, boolean improvise) { - final Map convoke = new HashMap(); + final Map convoke = new HashMap<>(); Card convoked = null; if (!improvise) { for (ManaCostShard toPay : cost) { diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index a7477639ce4..6edd9ffb70e 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -41,7 +41,7 @@ import java.util.*; import java.util.Map.Entry; public abstract class GameState { - private static final Map ZONES = new HashMap(); + private static final Map ZONES = new HashMap<>(); static { ZONES.put(ZoneType.Battlefield, "battlefield"); ZONES.put(ZoneType.Hand, "hand"); @@ -66,8 +66,8 @@ public abstract class GameState { private boolean puzzleCreatorState = false; - private final Map humanCardTexts = new EnumMap(ZoneType.class); - private final Map aiCardTexts = new EnumMap(ZoneType.class); + private final Map humanCardTexts = new EnumMap<>(ZoneType.class); + private final Map aiCardTexts = new EnumMap<>(ZoneType.class); private final Map idToCard = new HashMap<>(); private final Map cardToAttachId = new HashMap<>(); @@ -254,7 +254,7 @@ public abstract class GameState { newText.append(";"); } if (c.isToken()) { - newText.append("t:" + new TokenInfo(c).toString()); + newText.append("t:").append(new TokenInfo(c).toString()); } else { if (c.getPaperCard() == null) { return; @@ -377,7 +377,7 @@ public abstract class GameState { newText.append("|Attacking"); GameEntity def = c.getGame().getCombat().getDefenderByAttacker(c); if (def instanceof Card) { - newText.append(":" + def.getId()); + newText.append(":").append(def.getId()); } } } @@ -653,15 +653,15 @@ public abstract class GameState { } private String processManaPool(ManaPool manaPool) { - String mana = ""; + StringBuilder mana = new StringBuilder(); for (final byte c : MagicColor.WUBRGC) { int amount = manaPool.getAmountOfColor(c); for (int i = 0; i < amount; i++) { - mana += MagicColor.toShortString(c) + " "; + mana.append(MagicColor.toShortString(c)).append(" "); } } - return mana.trim(); + return mana.toString().trim(); } private void updateManaPool(Player p, String manaDef, boolean clearPool, boolean persistent) { @@ -1061,7 +1061,7 @@ public abstract class GameState { } private void applyCountersToGameEntity(GameEntity entity, String counterString) { - entity.setCounters(Maps.newEnumMap(CounterType.class)); + entity.setCounters(Maps.newEnumMap(CounterType.class)); String[] allCounterStrings = counterString.split(","); for (final String counterPair : allCounterStrings) { String[] pair = counterPair.split("=", 2); @@ -1078,7 +1078,7 @@ public abstract class GameState { p.getZone(zt).removeAllCards(true); } - Map playerCards = new EnumMap(ZoneType.class); + Map playerCards = new EnumMap<>(ZoneType.class); for (Entry kv : cardTexts.entrySet()) { String value = kv.getValue(); playerCards.put(kv.getKey(), processCardsForZone(value.isEmpty() ? new String[0] : value.split(";"), p)); @@ -1091,7 +1091,7 @@ public abstract class GameState { for (Entry kv : playerCards.entrySet()) { PlayerZone zone = p.getZone(kv.getKey()); if (kv.getKey() == ZoneType.Battlefield) { - List cards = new ArrayList(); + List cards = new ArrayList<>(); for (final Card c : kv.getValue()) { if (c.isToken()) { cards.add(c); @@ -1107,7 +1107,7 @@ public abstract class GameState { Map counters = c.getCounters(); // Note: Not clearCounters() since we want to keep the counters // var as-is. - c.setCounters(Maps.newEnumMap(CounterType.class)); + c.setCounters(Maps.newEnumMap(CounterType.class)); if (c.isAura()) { // dummy "enchanting" to indicate that the card will be force-attached elsewhere // (will be overridden later, so the actual value shouldn't matter) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 529df9a08c8..3f461395650 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -168,8 +168,8 @@ public class PlayerControllerAi extends PlayerController { if (delayedReveal != null) { reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix()); } - FCollection remaining = new FCollection(optionList); - List selecteds = new ArrayList(); + FCollection remaining = new FCollection<>(optionList); + List selecteds = new ArrayList<>(); T selected; do { selected = chooseSingleEntityForEffect(remaining, null, sa, title, selecteds.size()>=min, targetedPlayer); @@ -492,7 +492,7 @@ public class PlayerControllerAi extends PlayerController { Card toDiscard = Aggregates.itemWithMin(cardsOfType, CardPredicates.Accessors.fnGetCmc); return new CardCollection(toDiscard); } - return getAi().getCardsToDiscard(num, (String[])null, sa); + return getAi().getCardsToDiscard(num, null, sa); } @@ -612,7 +612,7 @@ public class PlayerControllerAi extends PlayerController { @Override public CardCollection chooseCardsToDiscardToMaximumHandSize(int numDiscard) { - return brains.getCardsToDiscard(numDiscard, (String[])null, null); + return brains.getCardsToDiscard(numDiscard, null, null); } @Override @@ -669,7 +669,7 @@ public class PlayerControllerAi extends PlayerController { throw new InvalidParameterException("SA is not api-based, this is not supported yet"); } return SpellApiToAi.Converter.get(api).chooseNumber(player, sa, min, max, params); - }; + } @Override public int chooseNumber(SpellAbility sa, String title, List options, Player relatedPlayer) { @@ -1072,7 +1072,7 @@ public class PlayerControllerAi extends PlayerController { } }); } else { - return new HashMap(); + return new HashMap<>(); } } diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 1b3afb1d8c1..27700e2455b 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -94,12 +94,8 @@ public class SpecialCardAi { int minCMC = isLowCMCDeck ? 3 : 4; // probably not worth wasting a lotus on a low-CMC spell (<4 CMC), except in low-CMC decks, where 3 CMC may be fine int paidCMC = cost.getConvertedManaCost(); if (paidCMC < minCMC) { - if (paidCMC == 3 && numManaSrcs < 3) { - // if it's a CMC 3 spell and we're more than one mana source short for it, might be worth it anyway - return true; - } - - return false; + // if it's a CMC 3 spell and we're more than one mana source short for it, might be worth it anyway + return paidCMC == 3 && numManaSrcs < 3; } return true; @@ -218,11 +214,7 @@ public class SpecialCardAi { } } - if (ai.getLife() <= sa.getHostCard().getNetPower() && !hasUsefulBlocker) { - return true; - } else { - return false; - } + return ai.getLife() <= sa.getHostCard().getNetPower() && !hasUsefulBlocker; } public static int getSacThreshold() { @@ -335,7 +327,7 @@ public class SpecialCardAi { boolean canTrample = source.hasKeyword(Keyword.TRAMPLE); if (!isBlocking && combat.getDefenderByAttacker(source) instanceof Card) { - int loyalty = ((Card)combat.getDefenderByAttacker(source)).getCounters(CounterType.LOYALTY); + int loyalty = combat.getDefenderByAttacker(source).getCounters(CounterType.LOYALTY); int totalDamageToPW = 0; for (Card atk : (combat.getAttackersOf(combat.getDefenderByAttacker(source)))) { if (combat.isUnblocked(atk)) { @@ -411,11 +403,7 @@ public class SpecialCardAi { Pair predictedPT = getPumpedPT(ai, source.getNetCombatDamage(), source.getNetToughness()); int oppT = Aggregates.sum(potentialBlockers, CardPredicates.Accessors.fnGetNetToughness); - if (potentialBlockers.isEmpty() || (source.hasKeyword(Keyword.TRAMPLE) && predictedPT.getLeft() - oppT >= oppLife)) { - return true; - } - - return false; + return potentialBlockers.isEmpty() || (source.hasKeyword(Keyword.TRAMPLE) && predictedPT.getLeft() - oppT >= oppLife); } public static Pair getPumpedPT(Player ai, int power, int toughness) { @@ -522,7 +510,7 @@ public class SpecialCardAi { best.add(sp); // these SAs are prioritized since the AI sees a reason to play them now } final List keywords = sp.hasParam("KW") ? Arrays.asList(sp.getParam("KW").split(" & ")) - : Lists.newArrayList(); + : Lists.newArrayList(); for (String kw : keywords) { if (!tgtCard.hasKeyword(kw)) { if ("Indestructible".equals(kw) && ai.getOpponents().getCreaturesInPlay().isEmpty()) { @@ -568,10 +556,7 @@ public class SpecialCardAi { @Override public boolean apply(final Card c) { // Don't enchant creatures that can survive - if (!c.canBeDestroyed() || c.getNetCombatDamage() < c.getNetToughness() || c.isEnchantedBy("Guilty Conscience")) { - return false; - } - return true; + return c.canBeDestroyed() && c.getNetCombatDamage() >= c.getNetToughness() && !c.isEnchantedBy("Guilty Conscience"); } }); chosen = ComputerUtilCard.getBestCreatureAI(creatures); @@ -911,15 +896,14 @@ public class SpecialCardAi { } } else if (blackViseOTB && computerHandSize + exiledWithNecro - 1 >= 4) { // try not to overdraw in presence of Black Vise - return false; + return false; } else if (computerHandSize + exiledWithNecro - 1 >= maxHandSize) { // Only draw until we reach max hand size return false; } else if (!ph.isPlayerTurn(ai) || !ph.is(PhaseType.MAIN2)) { // Only activate in AI's own turn (sans the exception above) return false; - } - + } return true; } } @@ -941,11 +925,7 @@ public class SpecialCardAi { } // Maybe use it for some important high-impact spells even if there are more cards in hand? - if (ai.getCardsIn(ZoneType.Hand).size() > 1 && !hasEnsnaringBridgeEffect) { - return false; - } - - return true; + return ai.getCardsIn(ZoneType.Hand).size() <= 1 || hasEnsnaringBridgeEffect; } } @@ -1310,12 +1290,8 @@ public class SpecialCardAi { } } - if (aiHandSize < HAND_SIZE_THRESHOLD || maxOppHandSize - aiHandSize > HAND_SIZE_THRESHOLD) { - // use in case we're getting low on cards or if we're significantly behind our opponent in cards in hand - return true; - } - - return false; + // use in case we're getting low on cards or if we're significantly behind our opponent in cards in hand + return aiHandSize < HAND_SIZE_THRESHOLD || maxOppHandSize - aiHandSize > HAND_SIZE_THRESHOLD; } } @@ -1342,9 +1318,7 @@ public class SpecialCardAi { if (topGY == null || !topGY.isCreature() || ComputerUtilCard.evaluateCreature(creatHand) > ComputerUtilCard.evaluateCreature(topGY) + 80) { - if (numCreatsInHand > 1 || !ComputerUtilMana.canPayManaCost(creatHand.getSpellPermanent(), ai, 0)) { - return true; - } + return numCreatsInHand > 1 || !ComputerUtilMana.canPayManaCost(creatHand.getSpellPermanent(), ai, 0); } } @@ -1465,8 +1439,7 @@ public class SpecialCardAi { } else if (!ph.isPlayerTurn(ai)) { // Only activate in AI's own turn (sans the exception above) return false; - } - + } return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java index 44780ec2e94..18029dd4d7f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java @@ -56,12 +56,9 @@ public class ActivateAbilityAi extends SpellAbilityAi { } else { final List defined = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa); - if (!defined.contains(opp)) { - return false; - } + return defined.contains(opp); } - return true; } else { sa.resetTargets(); sa.getTargets().add(opp); diff --git a/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java b/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java index 243edf2c3f7..f20a3f2f7fd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java @@ -67,10 +67,8 @@ public class AddTurnAi extends SpellAbilityAi { return false; } } - if (!StringUtils.isNumeric(sa.getParam("NumTurns"))) { - // TODO: improve ai for Sage of Hours - return false; - } + // TODO: improve ai for Sage of Hours + return StringUtils.isNumeric(sa.getParam("NumTurns")); // not sure if the AI should be playing with cards that give the // Human more turns. } diff --git a/forge-ai/src/main/java/forge/ai/ability/AmassAi.java b/forge-ai/src/main/java/forge/ai/ability/AmassAi.java index 0c98f2b65c6..7699259abd1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AmassAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AmassAi.java @@ -23,9 +23,7 @@ public class AmassAi extends SpellAbilityAi { final Game game = ai.getGame(); if (!aiArmies.isEmpty()) { - if (CardLists.count(aiArmies, CardPredicates.canReceiveCounters(CounterType.P1P1)) <= 0) { - return false; - } + return CardLists.count(aiArmies, CardPredicates.canReceiveCounters(CounterType.P1P1)) > 0; } else { final String tokenScript = "b_0_0_zombie_army"; final int amount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("Num", "1"), sa); @@ -57,12 +55,9 @@ public class AmassAi extends SpellAbilityAi { //reset static abilities game.getAction().checkStaticAbilities(false); - if (!result) { - return false; - } + return result; } - return true; } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 0ba446e250e..17748584c9f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -207,21 +207,16 @@ public class AnimateAi extends SpellAbilityAi { return bFlag; // All of the defined stuff is animated, not very useful } else { sa.resetTargets(); - if (!animateTgtAI(sa)) { - return false; - } + return animateTgtAI(sa); } - return true; } @Override public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) { if (sa.usesTargeting()) { sa.resetTargets(); - if (!animateTgtAI(sa)) { - return false; - } + return animateTgtAI(sa); } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAllAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAllAi.java index 8e126db8ae8..79770568fd3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAllAi.java @@ -8,11 +8,7 @@ public class AnimateAllAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { - if ("Always".equals(sa.getParam("AILogic"))) { - return true; - } - - return false; + return "Always".equals(sa.getParam("AILogic")); } // end animateAllCanPlayAI() @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index ae728a26dc7..bbf17fa1069 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -31,10 +31,7 @@ import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.util.MyRandom; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; public class AttachAi extends SpellAbilityAi { @@ -123,9 +120,7 @@ public class AttachAi extends SpellAbilityAi { return !(c.hasProtectionFrom(source) || c.hasKeyword(Keyword.SHROUD) || c.hasKeyword(Keyword.HEXPROOF)); } }); - if (targets.isEmpty()) { - return false; - } + return !targets.isEmpty(); } return true; @@ -239,9 +234,7 @@ public class AttachAi extends SpellAbilityAi { return false; } - if (!(combat.isAttacking(attachTarget) || combat.isBlocking(attachTarget))) { - return false; - } + return combat.isAttacking(attachTarget) || combat.isBlocking(attachTarget); } return true; @@ -455,7 +448,7 @@ public class AttachAi extends SpellAbilityAi { */ private static Player attachToPlayerAIPreferences(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { - List targetable = new ArrayList(); + List targetable = new ArrayList<>(); for (final Player player : aiPlayer.getGame().getPlayers()) { if (sa.canTarget(player)) { targetable.add(player); @@ -859,7 +852,7 @@ public class AttachAi extends SpellAbilityAi { int totToughness = 0; int totPower = 0; - final List keywords = new ArrayList(); + final List keywords = new ArrayList<>(); for (final StaticAbility stAbility : attachSource.getStaticAbilities()) { final Map stabMap = stAbility.getMapParams(); @@ -879,15 +872,11 @@ public class AttachAi extends SpellAbilityAi { String kws = stabMap.get("AddKeyword"); if (kws != null) { - for (final String kw : kws.split(" & ")) { - keywords.add(kw); - } + keywords.addAll(Arrays.asList(kws.split(" & "))); } kws = stabMap.get("AddHiddenKeyword"); if (kws != null) { - for (final String kw : kws.split(" & ")) { - keywords.add(kw); - } + keywords.addAll(Arrays.asList(kws.split(" & "))); } } } @@ -910,7 +899,7 @@ public class AttachAi extends SpellAbilityAi { Card c = null; if (prefList == null || prefList.isEmpty()) { - prefList = new ArrayList(list); + prefList = new ArrayList<>(list); } else { c = ComputerUtilCard.getBestAI(prefList); if (c != null) { @@ -964,7 +953,7 @@ public class AttachAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(final Player ai, final SpellAbility sa, final boolean mandatory) { final Card card = sa.getHostCard(); // Check if there are any valid targets - List targets = new ArrayList(); + List targets = new ArrayList<>(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt == null) { targets = AbilityUtils.getDefinedObjects(sa.getHostCard(), sa.getParam("Defined"), sa); @@ -987,9 +976,7 @@ public class AttachAi extends SpellAbilityAi { return false; } // don't equip creatures that don't gain anything - if (card.hasSVar("NonStackingAttachEffect") && newTarget.isEquippedBy(card.getName())) { - return false; - } + return !card.hasSVar("NonStackingAttachEffect") || !newTarget.isEquippedBy(card.getName()); } } @@ -1156,8 +1143,9 @@ public class AttachAi extends SpellAbilityAi { int totToughness = 0; int totPower = 0; - final List keywords = new ArrayList(); + final List keywords = new ArrayList<>(); boolean grantingAbilities = false; + boolean grantingExtraBlock = false; for (final StaticAbility stAbility : attachSource.getStaticAbilities()) { final Map stabMap = stAbility.getMapParams(); @@ -1176,18 +1164,15 @@ public class AttachAi extends SpellAbilityAi { totPower += AbilityUtils.calculateAmount(attachSource, stabMap.get("AddPower"), stAbility); grantingAbilities |= stabMap.containsKey("AddAbility"); + grantingExtraBlock |= stabMap.containsKey("CanBlockAmount") || stabMap.containsKey("CanBlockAny"); String kws = stabMap.get("AddKeyword"); if (kws != null) { - for (final String kw : kws.split(" & ")) { - keywords.add(kw); - } + keywords.addAll(Arrays.asList(kws.split(" & "))); } kws = stabMap.get("AddHiddenKeyword"); if (kws != null) { - for (final String kw : kws.split(" & ")) { - keywords.add(kw); - } + keywords.addAll(Arrays.asList(kws.split(" & "))); } } } @@ -1209,20 +1194,27 @@ public class AttachAi extends SpellAbilityAi { } //only add useful keywords unless P/T bonus is significant - if (totToughness + totPower < 4 && !keywords.isEmpty()) { + if (totToughness + totPower < 4 && (!keywords.isEmpty() || grantingExtraBlock)) { final int pow = totPower; + final boolean extraBlock = grantingExtraBlock; prefList = CardLists.filter(prefList, new Predicate() { @Override public boolean apply(final Card c) { - for (final String keyword : keywords) { - if (isUsefulAttachKeyword(keyword, c, sa, pow)) { - return true; - } - if (c.hasKeyword(Keyword.INFECT) && pow >= 2) { - // consider +2 power a significant bonus on Infect creatures - return true; + if (!keywords.isEmpty()) { + for (final String keyword : keywords) { + if (isUsefulAttachKeyword(keyword, c, sa, pow)) { + return true; + } } } + + if (c.hasKeyword(Keyword.INFECT) && pow >= 2) { + // consider +2 power a significant bonus on Infect creatures + return true; + } + if (extraBlock && CombatUtil.canBlock(c, true) && !c.canBlockAny()) { + return true; + } return false; } }); @@ -1353,7 +1345,7 @@ public class AttachAi extends SpellAbilityAi { CardCollection prefList = list; // Filter AI-specific targets if provided - prefList = ComputerUtil.filterAITgts(sa, aiPlayer, (CardCollection)list, true); + prefList = ComputerUtil.filterAITgts(sa, aiPlayer, list, true); Card c = attachGeneralAI(aiPlayer, sa, prefList, mandatory, attachSource, sa.getParam("AILogic")); @@ -1557,86 +1549,52 @@ public class AttachAi extends SpellAbilityAi { } if (evasive) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || !ComputerUtilCombat.canAttackNextTurn(card) - || !canBeBlocked) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ComputerUtilCombat.canAttackNextTurn(card) + && canBeBlocked; } else if (keyword.equals("Haste")) { - if (!card.hasSickness() || !ph.isPlayerTurn(sa.getActivatingPlayer()) || card.isTapped() - || card.getNetCombatDamage() + powerBonus <= 0 - || card.hasKeyword("CARDNAME can attack as though it had haste.") - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || !ComputerUtilCombat.canAttackNextTurn(card)) { - return false; - } + return card.hasSickness() && ph.isPlayerTurn(sa.getActivatingPlayer()) && !card.isTapped() + && card.getNetCombatDamage() + powerBonus > 0 + && !card.hasKeyword("CARDNAME can attack as though it had haste.") + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && ComputerUtilCombat.canAttackNextTurn(card); } else if (keyword.endsWith("Indestructible")) { return true; } else if (keyword.endsWith("Deathtouch") || keyword.endsWith("Wither")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || ((!canBeBlocked || !ComputerUtilCombat.canAttackNextTurn(card)) - && !CombatUtil.canBlock(card, true))) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ((canBeBlocked && ComputerUtilCombat.canAttackNextTurn(card)) + || CombatUtil.canBlock(card, true)); } else if (keyword.equals("Double Strike") || keyword.equals("Lifelink")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || (!ComputerUtilCombat.canAttackNextTurn(card) && !CombatUtil.canBlock(card, true))) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && (ComputerUtilCombat.canAttackNextTurn(card) || CombatUtil.canBlock(card, true)); } else if (keyword.equals("First Strike")) { - if (card.getNetCombatDamage() + powerBonus <= 0 || card.hasKeyword(Keyword.DOUBLE_STRIKE) - || (!ComputerUtilCombat.canAttackNextTurn(card) && !CombatUtil.canBlock(card, true))) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 && !card.hasKeyword(Keyword.DOUBLE_STRIKE) + && (ComputerUtilCombat.canAttackNextTurn(card) || CombatUtil.canBlock(card, true)); } else if (keyword.startsWith("Flanking")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || !ComputerUtilCombat.canAttackNextTurn(card) - || !canBeBlocked) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ComputerUtilCombat.canAttackNextTurn(card) + && canBeBlocked; } else if (keyword.startsWith("Bushido")) { - if ((!canBeBlocked || !ComputerUtilCombat.canAttackNextTurn(card)) - && !CombatUtil.canBlock(card, true)) { - return false; - } + return (canBeBlocked && ComputerUtilCombat.canAttackNextTurn(card)) + || CombatUtil.canBlock(card, true); } else if (keyword.equals("Trample")) { - if (card.getNetCombatDamage() + powerBonus <= 1 - || !canBeBlocked - || !ComputerUtilCombat.canAttackNextTurn(card)) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 1 + && canBeBlocked + && ComputerUtilCombat.canAttackNextTurn(card); } else if (keyword.equals("Infect")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || !ComputerUtilCombat.canAttackNextTurn(card)) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ComputerUtilCombat.canAttackNextTurn(card); } else if (keyword.equals("Vigilance")) { - if (card.getNetCombatDamage() + powerBonus <= 0 - || !ComputerUtilCombat.canAttackNextTurn(card) - || !CombatUtil.canBlock(card, true)) { - return false; - } + return card.getNetCombatDamage() + powerBonus > 0 + && ComputerUtilCombat.canAttackNextTurn(card) + && CombatUtil.canBlock(card, true); } else if (keyword.equals("Reach")) { - if (card.hasKeyword(Keyword.FLYING) || !CombatUtil.canBlock(card, true)) { - return false; - } - } else if (keyword.endsWith("CARDNAME can block an additional creature each combat.")) { - if (!CombatUtil.canBlock(card, true) || card.hasKeyword("CARDNAME can block any number of creatures.") - || card.hasKeyword("CARDNAME can block an additional ninety-nine creatures each combat.")) { - return false; - } + return !card.hasKeyword(Keyword.FLYING) && CombatUtil.canBlock(card, true); } else if (keyword.equals("CARDNAME can attack as though it didn't have defender.")) { - if (!card.hasKeyword(Keyword.DEFENDER) || card.getNetCombatDamage() + powerBonus <= 0) { - return false; - } + return card.hasKeyword(Keyword.DEFENDER) && card.getNetCombatDamage() + powerBonus > 0; } else if (keyword.equals("Shroud") || keyword.equals("Hexproof")) { - if (card.hasKeyword(Keyword.SHROUD) || card.hasKeyword(Keyword.HEXPROOF)) { - return false; - } - } else if (keyword.equals("Defender")) { - return false; - } - return true; + return !card.hasKeyword(Keyword.SHROUD) && !card.hasKeyword(Keyword.HEXPROOF); + } else return !keyword.equals("Defender"); } /** @@ -1657,17 +1615,11 @@ public class AttachAi extends SpellAbilityAi { if (keyword.endsWith("CARDNAME can't attack.") || keyword.equals("Defender") || keyword.endsWith("CARDNAME can't attack or block.")) { - if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 1) { - return false; - } + return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 1; } else if (keyword.endsWith("CARDNAME attacks each turn if able.") || keyword.endsWith("CARDNAME attacks each combat if able.")) { - if (!ComputerUtilCombat.canAttackNextTurn(card) || !CombatUtil.canBlock(card, true) || ai.getCreaturesInPlay().isEmpty()) { - return false; - } + return ComputerUtilCombat.canAttackNextTurn(card) && CombatUtil.canBlock(card, true) && !ai.getCreaturesInPlay().isEmpty(); } else if (keyword.endsWith("CARDNAME can't block.") || keyword.contains("CantBlock")) { - if (!CombatUtil.canBlock(card, true)) { - return false; - } + return CombatUtil.canBlock(card, true); } else if (keyword.endsWith("CARDNAME's activated abilities can't be activated.")) { for (SpellAbility ability : card.getSpellAbilities()) { if (ability.isAbility()) { @@ -1676,18 +1628,12 @@ public class AttachAi extends SpellAbilityAi { } return false; } else if (keyword.endsWith("Prevent all combat damage that would be dealt by CARDNAME.")) { - if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 1) { - return false; - } + return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 1; } else if (keyword.endsWith("Prevent all combat damage that would be dealt to and dealt by CARDNAME.") || keyword.endsWith("Prevent all damage that would be dealt to and dealt by CARDNAME.")) { - if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 2) { - return false; - } + return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 2; } else if (keyword.endsWith("CARDNAME doesn't untap during your untap step.")) { - if (card.isUntapped()) { - return false; - } + return !card.isUntapped(); } return true; } @@ -1711,12 +1657,8 @@ public class AttachAi extends SpellAbilityAi { return true; } - if (sa.getHostCard().isEquipment() && ComputerUtilCard.isUselessCreature(ai, c)) { - // useless to equip a creature that can't attack or block. - return false; - } - - return true; + // useless to equip a creature that can't attack or block. + return !sa.getHostCard().isEquipment() || !ComputerUtilCard.isUselessCreature(ai, c); } public static Card doPumpOrCurseAILogic(final Player ai, final SpellAbility sa, final List list, final String type) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index a2906c96b88..0a747747895 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -355,9 +355,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { if (c.getType().isLegendary()) { - if (ai.isCardInPlay(c.getName())) { - return false; - } + return !ai.isCardInPlay(c.getName()); } return true; } @@ -484,7 +482,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } } - List origin = new ArrayList(); + List origin = new ArrayList<>(); if (sa.hasParam("Origin")) { origin = ZoneType.listValueOf(sa.getParam("Origin")); } @@ -559,7 +557,7 @@ public class ChangeZoneAi extends SpellAbilityAi { */ private static Card basicManaFixing(final Player ai, final List list) { // Search for a Basic Land final CardCollectionView combined = CardCollection.combine(ai.getCardsIn(ZoneType.Battlefield), ai.getCardsIn(ZoneType.Hand)); - final List basics = new ArrayList(); + final List basics = new ArrayList<>(); // what types can I go get? for (final String name : MagicColor.Constant.BASIC_LANDS) { @@ -738,11 +736,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } final AbilitySub subAb = sa.getSubAbility(); - if (subAb != null && !SpellApiToAi.Converter.get(subAb.getApi()).chkDrawbackWithSubs(ai, subAb)) { - return false; - } - - return true; + return subAb == null || SpellApiToAi.Converter.get(subAb.getApi()).chkDrawbackWithSubs(ai, subAb); } /* @@ -864,7 +858,7 @@ public class ChangeZoneAi extends SpellAbilityAi { list = CardLists.getTargetableCards(list, sa); // Filter AI-specific targets if provided - list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, true); + list = ComputerUtil.filterAITgts(sa, ai, list, true); if (sa.hasParam("AITgtsOnlyBetterThanSelf")) { list = CardLists.filter(list, new Predicate() { @Override @@ -995,11 +989,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { for (Card aura : c.getEnchantedBy()) { - if (aura.getController().isOpponentOf(ai)) { - return true; - } else { - return false; - } + return aura.getController().isOpponentOf(ai); } if (blink) { return c.isToken(); @@ -1291,7 +1281,7 @@ public class ChangeZoneAi extends SpellAbilityAi { final List objects = ComputerUtil .predictThreatenedObjects(ai, sa); - final List threatenedTargets = new ArrayList(); + final List threatenedTargets = new ArrayList<>(); for (final Card c : aiPermanents) { if (objects.contains(c)) { @@ -1471,16 +1461,12 @@ public class ChangeZoneAi extends SpellAbilityAi { if (!list.isEmpty()) { final Card attachedTo = list.get(0); // This code is for the Dragon auras - if (attachedTo.getController().isOpponentOf(ai)) { - return false; - } + return !attachedTo.getController().isOpponentOf(ai); } } } else if (isPreferredTarget(ai, sa, mandatory, true)) { // do nothing - } else if (!isUnpreferredTarget(ai, sa, mandatory)) { - return false; - } + } else return isUnpreferredTarget(ai, sa, mandatory); return true; } @@ -1532,9 +1518,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { if (c.getType().isLegendary()) { - if (decider.isCardInPlay(c.getName())) { - return false; - } + return !decider.isCardInPlay(c.getName()); } return true; } @@ -1543,10 +1527,7 @@ public class ChangeZoneAi extends SpellAbilityAi { fetchList = CardLists.filter(fetchList, new Predicate() { @Override public boolean apply(final Card c) { - if (ComputerUtilCard.isCardRemAIDeck(c) || ComputerUtilCard.isCardRemRandomDeck(c)) { - return false; - } - return true; + return !ComputerUtilCard.isCardRemAIDeck(c) && !ComputerUtilCard.isCardRemRandomDeck(c); } }); } @@ -1718,9 +1699,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { if (c.getType().isLegendary()) { - if (ai.isCardInPlay(c.getName())) { - return false; - } + return !ai.isCardInPlay(c.getName()); } return true; } @@ -1826,20 +1805,16 @@ public class ChangeZoneAi extends SpellAbilityAi { && "Battlefield".equals(causeSub.getParam("Destination"))) { // A blink effect implemented using ChangeZone API return false; - } else if (subApi == ApiType.DelayedTrigger) { + } else // This is an intrinsic effect that blinks the card (e.g. Obzedat, Ghost Council), no need to + // return the commander to the Command zone. + if (subApi == ApiType.DelayedTrigger) { SpellAbility exec = causeSub.getAdditionalAbility("Execute"); if (exec != null && exec.getApi() == ApiType.ChangeZone) { - if ("Exile".equals(exec.getParam("Origin")) && "Battlefield".equals(exec.getParam("Destination"))) { - // A blink effect implemented using a delayed trigger - return false; - } + // A blink effect implemented using a delayed trigger + return !"Exile".equals(exec.getParam("Origin")) || !"Battlefield".equals(exec.getParam("Destination")); } - } else if (causeSa.getHostCard() != null && causeSa.getHostCard().equals((Card)sa.getReplacingObject("Card")) - && causeSa.getActivatingPlayer().equals(aiPlayer)) { - // This is an intrinsic effect that blinks the card (e.g. Obzedat, Ghost Council), no need to - // return the commander to the Command zone. - return false; - } + } else return causeSa.getHostCard() == null || !causeSa.getHostCard().equals(sa.getReplacingObject("Card")) + || !causeSa.getActivatingPlayer().equals(aiPlayer); } // Normally we want the commander back in Command zone to recast him later diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java index c17506d37b2..fcf0733bf0d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java @@ -335,11 +335,8 @@ public class ChangeZoneAllAi extends SpellAbilityAi { return true; // if AI creature is better than Human Creature - if (ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard - .evaluateCreatureList(humanCards)) { - return true; - } - return false; + return ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard + .evaluateCreatureList(humanCards); } return true; } @@ -441,29 +438,21 @@ public class ChangeZoneAllAi extends SpellAbilityAi { if (sa.getParam("GainControl") != null) { // Check if the cards are valuable enough if ((CardLists.getNotType(humanType, "Creature").size() == 0) && (CardLists.getNotType(computerType, "Creature").size() == 0)) { - if ((ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard - .evaluateCreatureList(humanType)) < 1) { - return false; - } + return (ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard + .evaluateCreatureList(humanType)) >= 1; } // otherwise evaluate both lists by CMC and pass only if human // permanents are less valuable - else if ((ComputerUtilCard.evaluatePermanentList(computerType) + ComputerUtilCard - .evaluatePermanentList(humanType)) < 1) { - return false; - } + else return (ComputerUtilCard.evaluatePermanentList(computerType) + ComputerUtilCard + .evaluatePermanentList(humanType)) >= 1; } else { // don't activate if human gets more back than AI does if ((CardLists.getNotType(humanType, "Creature").isEmpty()) && (CardLists.getNotType(computerType, "Creature").isEmpty())) { - if (ComputerUtilCard.evaluateCreatureList(computerType) <= ComputerUtilCard - .evaluateCreatureList(humanType)) { - return false; - } + return ComputerUtilCard.evaluateCreatureList(computerType) > ComputerUtilCard + .evaluateCreatureList(humanType); } // otherwise evaluate both lists by CMC and pass only if human // permanents are less valuable - else if (ComputerUtilCard.evaluatePermanentList(computerType) <= ComputerUtilCard - .evaluatePermanentList(humanType)) { - return false; - } + else return ComputerUtilCard.evaluatePermanentList(computerType) > ComputerUtilCard + .evaluatePermanentList(humanType); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index 6d0cee69a14..1beefd77b09 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -71,21 +71,15 @@ public class ChooseCardAi extends SpellAbilityAi { choices = CardLists.filterControlledBy(choices, ai.getOpponents()); } if (aiLogic.equals("AtLeast1") || aiLogic.equals("OppPreferred")) { - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } else if (aiLogic.equals("AtLeast2") || aiLogic.equals("BestBlocker")) { - if (choices.size() < 2) { - return false; - } + return choices.size() >= 2; } else if (aiLogic.equals("Clone") || aiLogic.equals("Vesuva")) { final String filter = aiLogic.equals("Clone") ? "Permanent.YouDontCtrl,Permanent.nonLegendary" : "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva"; choices = CardLists.getValidCards(choices, filter, host.getController(), host); - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } else if (aiLogic.equals("Never")) { return false; } else if (aiLogic.equals("NeedsPrevention")) { @@ -103,9 +97,7 @@ public class ChooseCardAi extends SpellAbilityAi { return ComputerUtilCombat.damageIfUnblocked(c, ai, combat, true) > ref; } }); - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } else if (aiLogic.equals("Ashiok")) { final int loyalty = host.getCounters(CounterType.LOYALTY) - 1; for (int i = loyalty; i >= 0; i--) { @@ -117,13 +109,9 @@ public class ChooseCardAi extends SpellAbilityAi { } } - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } else if (aiLogic.equals("RandomNonLand")) { - if (CardLists.getValidCards(choices, "Card.nonLand", host.getController(), host).isEmpty()) { - return false; - } + return !CardLists.getValidCards(choices, "Card.nonLand", host.getController(), host).isEmpty(); } else if (aiLogic.equals("Duneblast")) { CardCollection aiCreatures = ai.getCreaturesInPlay(); CardCollection oppCreatures = ai.getWeakestOpponent().getCreaturesInPlay(); @@ -139,10 +127,8 @@ public class ChooseCardAi extends SpellAbilityAi { aiCreatures.remove(chosen); int minGain = 200; - if ((ComputerUtilCard.evaluateCreatureList(aiCreatures) + minGain) >= ComputerUtilCard - .evaluateCreatureList(oppCreatures)) { - return false; - } + return (ComputerUtilCard.evaluateCreatureList(aiCreatures) + minGain) < ComputerUtilCard + .evaluateCreatureList(oppCreatures); } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java index 8ba40274dcd..2633899924b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java @@ -52,10 +52,7 @@ public class ChooseColorAi extends SpellAbilityAi { } if ("Addle".equals(sourceName)) { - if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).isEmpty()) { - return false; - } - return true; + return !ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && !ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).isEmpty(); } if (logic.equals("MostExcessOpponentControls")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java index 3480f561d70..b3ae74d5274 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java @@ -33,9 +33,7 @@ public class ChooseDirectionAi extends SpellAbilityAi { CardCollection right = CardLists.filterControlledBy(all, game.getNextPlayerAfter(ai, Direction.Right)); int leftValue = Aggregates.sum(left, CardPredicates.Accessors.fnGetCmc); int rightValue = Aggregates.sum(right, CardPredicates.Accessors.fnGetCmc); - if (aiValue > leftValue || aiValue > rightValue) { - return false; - } + return aiValue <= leftValue && aiValue <= rightValue; } } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index 2b608b2acbd..1f4e627bda8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -103,7 +103,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { Cost unless = new Cost(unlessCost, false); SpellAbility paycost = new SpellAbility.EmptySa(sa.getHostCard(), player); paycost.setPayCosts(unless); - if (ComputerUtilCost.willPayUnlessCost(sp, player, unless, false, new FCollection(player)) + if (ComputerUtilCost.willPayUnlessCost(sp, player, unless, false, new FCollection<>(player)) && ComputerUtilCost.canPayCost(paycost, player)) { return sp; } @@ -385,9 +385,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { final Player opp = player.getWeakestOpponent(); if (opp != null) { // TODO add predict Combat Damage? - if (opp.getLife() < copy.getNetPower()) { - return true; - } + return opp.getLife() < copy.getNetPower(); } // haste might not be good enough? diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java index 3478e74b73b..f7a694e0c67 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -97,10 +97,7 @@ public class ChooseSourceAi extends SpellAbilityAi { return false; } int dmg = AbilityUtils.calculateAmount(threatSource, topStack.getParam("NumDmg"), topStack); - if (ComputerUtilCombat.predictDamageTo(ai, dmg, threatSource, false) <= 0) { - return false; - } - return true; + return ComputerUtilCombat.predictDamageTo(ai, dmg, threatSource, false) > 0; } if (game.getPhaseHandler().getPhase() != PhaseType.COMBAT_DECLARE_BLOCKERS) { return false; @@ -119,9 +116,7 @@ public class ChooseSourceAi extends SpellAbilityAi { return ComputerUtilCombat.damageIfUnblocked(c, ai, combat, true) > 0; } }); - if (choices.isEmpty()) { - return false; - } + return !choices.isEmpty(); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index 3f49d12fac9..3d6870d033d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -244,9 +244,6 @@ public class CloneAi extends SpellAbilityAi { } // don't activate during main2 unless this effect is permanent - if (ph.is(PhaseType.MAIN2) && !sa.hasParam("Permanent")) { - return false; - } - return true; + return !ph.is(PhaseType.MAIN2) || sa.hasParam("Permanent"); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index eb6e3ed5d9b..630548b00bd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -84,9 +84,7 @@ public class ControlGainAi extends SpellAbilityAi { if (sa.hasParam("AllValid")) { CardCollectionView tgtCards = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), opponents); tgtCards = AbilityUtils.filterListByType(tgtCards, sa.getParam("AllValid"), sa); - if (tgtCards.isEmpty()) { - return false; - } + return !tgtCards.isEmpty(); } return true; } else { @@ -247,7 +245,7 @@ public class ControlGainAi extends SpellAbilityAi { break; } } - }; + } if (t != null) { sa.getTargets().add(t); @@ -296,15 +294,12 @@ public class ControlGainAi extends SpellAbilityAi { lose.addAll(Lists.newArrayList(sa.getParam("LoseControl").split(","))); } - if (lose.contains("EOT") - && game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } + return !lose.contains("EOT") + || !game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else { return this.canPlayAI(ai, sa); } - return true; } // pumpDrawbackAI() @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java index 34827a4a273..bf142184a33 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java @@ -90,9 +90,7 @@ public class CountersMoveAi extends SpellAbilityAi { } // for Simic Fluxmage and other - if (!ph.getNextTurn().equals(ai) || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) { - return false; - } + return ph.getNextTurn().equals(ai) && !ph.getPhase().isBefore(PhaseType.END_OF_TURN); } else if (CounterType.P1P1.equals(cType) && sa.hasParam("Defined")) { // something like Cyptoplast Root-kin @@ -107,9 +105,7 @@ public class CountersMoveAi extends SpellAbilityAi { } // Make sure that removing the last counter doesn't kill the creature if ("Self".equals(sa.getParam("Source"))) { - if (host != null && host.getNetToughness() - 1 <= 0) { - return false; - } + return host == null || host.getNetToughness() - 1 > 0; } } return true; @@ -193,9 +189,7 @@ public class CountersMoveAi extends SpellAbilityAi { // check for some specific AI preferences if ("DontMoveCounterIfLethal".equals(sa.getParam("AILogic"))) { - if (cType == CounterType.P1P1 && src.getNetToughness() - src.getTempToughnessBoost() - 1 <= 0) { - return false; - } + return cType != CounterType.P1P1 || src.getNetToughness() - src.getTempToughnessBoost() - 1 > 0; } } // no target @@ -207,9 +201,7 @@ public class CountersMoveAi extends SpellAbilityAi { public boolean chkAIDrawback(SpellAbility sa, Player ai) { if (sa.usesTargeting()) { sa.resetTargets(); - if (!moveTgtAI(ai, sa)) { - return false; - } + return moveTgtAI(ai, sa); } return true; @@ -287,10 +279,7 @@ public class CountersMoveAi extends SpellAbilityAi { // do not steal a P1P1 from Undying if it would die // this way if (CounterType.P1P1.equals(cType) && srcCardCpy.getNetToughness() <= 0) { - if (srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) || card.isToken()) { - return true; - } - return false; + return srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) || card.isToken(); } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java index 53b7c4b2619..b20e99ace3b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java @@ -48,6 +48,7 @@ public class CountersMultiplyAi extends SpellAbilityAi { if (!c.canReceiveCounters(counterType)) { return false; } + } else { for (Map.Entry e : c.getCounters().entrySet()) { // has negative counter it would double @@ -96,10 +97,7 @@ public class CountersMultiplyAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - if (sa.usesTargeting() && !setTargets(ai, sa) && !mandatory) { - return false; - } - return true; + return !sa.usesTargeting() || setTargets(ai, sa) || mandatory; } private CounterType getCounterType(SpellAbility sa) { diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java index f108106dce3..52538a0827c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersProliferateAi.java @@ -83,12 +83,9 @@ public class CountersProliferateAi extends SpellAbilityAi { } })); } - - if (cperms.isEmpty() && hperms.isEmpty() && !opponentPoison && !allyExpOrEnergy) { - return false; - } - return true; + + return !cperms.isEmpty() || !hperms.isEmpty() || opponentPoison || allyExpOrEnergy; } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index c636ea7b560..d139920d0a4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -469,7 +469,7 @@ public class CountersPutAi extends SpellAbilityAi { int left = amount; for (Card c : list) { if (ComputerUtilCard.shouldPumpCard(ai, sa, c, i, i, - Lists.newArrayList())) { + Lists.newArrayList())) { sa.getTargets().add(c); abTgt.addDividedAllocation(c, i); left -= i; @@ -506,7 +506,7 @@ public class CountersPutAi extends SpellAbilityAi { if (type.equals("P1P1") && !SpellAbilityAi.isSorcerySpeed(sa)) { for (Card c : list) { if (ComputerUtilCard.shouldPumpCard(ai, sa, c, amount, amount, - Lists.newArrayList())) { + Lists.newArrayList())) { choice = c; break; } @@ -595,7 +595,7 @@ public class CountersPutAi extends SpellAbilityAi { if (ComputerUtil.waitForBlocking(sa)) { return false; } - + return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java index 4a2ab325af7..863e3b53c21 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java @@ -101,7 +101,7 @@ public class CountersRemoveAi extends SpellAbilityAi { } // Filter AI-specific targets if provided - list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, false); + list = ComputerUtil.filterAITgts(sa, ai, list, false); boolean noLegendary = game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule); diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java index d894b2f7a79..fada6ed260e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java @@ -37,9 +37,7 @@ public abstract class DamageAiBase extends SpellAbilityAi { } if ("SelfDamage".equals(sa.getParam("AILogic"))) { if (comp.getLife() * 0.75 < enemy.getLife()) { - if (!lifelink) { - return true; - } + return !lifelink; } } return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index f00dffe3205..f4af5ec56dc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -80,10 +80,7 @@ public class DamageDealAi extends DamageAiBase { dmg--; // the card will be spent casting the spell, so actual damage is 1 less } } - if (!this.damageTargetAI(ai, sa, dmg, true)) { - return false; - } - return true; + return this.damageTargetAI(ai, sa, dmg, true); } @Override @@ -490,9 +487,7 @@ public class DamageDealAi extends DamageAiBase { for (final Object o : objects) { if (o instanceof Card) { final Card c = (Card) o; - if (hPlay.contains(c)) { - hPlay.remove(c); - } + hPlay.remove(c); } } hPlay = CardLists.getTargetableCards(hPlay, sa); @@ -952,9 +947,7 @@ public class DamageDealAi extends DamageAiBase { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt == null) { // If it's not mandatory check a few things - if (!mandatory && !this.damageChooseNontargeted(ai, sa, dmg)) { - return false; - } + return mandatory || this.damageChooseNontargeted(ai, sa, dmg); } else { if (!this.damageChoosingTargets(ai, sa, tgt, dmg, mandatory, true) && !mandatory) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java index 84bb04ebaf9..c80e1db1a93 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java @@ -100,7 +100,7 @@ public class DamagePreventAi extends SpellAbilityAi { tcs.add(ai); chance = true; } - final List threatenedTargets = new ArrayList(); + final List threatenedTargets = new ArrayList<>(); // filter AIs battlefield by what I can target List targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, hostCard, sa); targetables = CardLists.getTargetableCards(targetables, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index ca3fae2f3a8..37bcd7c2d33 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -124,7 +124,7 @@ public class DebuffAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); sa.resetTargets(); - CardCollection list = getCurseCreatures(ai, sa, kws == null ? Lists.newArrayList() : kws); + CardCollection list = getCurseCreatures(ai, sa, kws == null ? Lists.newArrayList() : kws); list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); // several uses here: @@ -266,7 +266,7 @@ public class DebuffAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final List kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList(); + final List kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList<>(); if (sa.getTargetRestrictions() == null) { if (mandatory) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java b/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java index cbe954cd663..c5b17785e61 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java @@ -27,7 +27,7 @@ public class DelayedTriggerAi extends SpellAbilityAi { trigsa.setActivatingPlayer(ai); if (trigsa instanceof AbilitySub) { - return SpellApiToAi.Converter.get(((AbilitySub) trigsa).getApi()).chkDrawbackWithSubs(ai, (AbilitySub)trigsa); + return SpellApiToAi.Converter.get(trigsa.getApi()).chkDrawbackWithSubs(ai, (AbilitySub)trigsa); } else { return AiPlayDecision.WillPlay == ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(trigsa); } diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index cede308bfc7..69c5bf22fc0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -48,7 +48,7 @@ public class DestroyAi extends SpellAbilityAi { return false; } - hasXCost = abCost.getCostMana() != null ? abCost.getCostMana().getAmountOfX() > 0 : false; + hasXCost = abCost.getCostMana() != null && abCost.getCostMana().getAmountOfX() > 0; } if ("AtOpponentsCombatOrAfter".equals(sa.getParam("AILogic"))) { @@ -132,7 +132,7 @@ public class DestroyAi extends SpellAbilityAi { } // Filter AI-specific targets if provided - list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, true); + list = ComputerUtil.filterAITgts(sa, ai, list, true); list = CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE); if (CardLists.getNotType(list, "Creature").isEmpty()) { @@ -296,8 +296,8 @@ public class DestroyAi extends SpellAbilityAi { } if (list.isEmpty() - || !CardLists.filterControlledBy(list, ai).isEmpty() - || CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE).isEmpty()) { + || !CardLists.filterControlledBy(list, ai).isEmpty() + || CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE).isEmpty()) { return false; } } @@ -342,7 +342,7 @@ public class DestroyAi extends SpellAbilityAi { } // Filter AI-specific targets if provided - preferred = ComputerUtil.filterAITgts(sa, ai, (CardCollection)preferred, true); + preferred = ComputerUtil.filterAITgts(sa, ai, preferred, true); for (final Card c : preferred) { list.remove(c); @@ -400,16 +400,11 @@ public class DestroyAi extends SpellAbilityAi { } } - if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) { - return false; - } + return sa.getTargets().getNumTargeted() >= tgt.getMinTargets(sa.getHostCard(), sa); } else { - if (!mandatory) { - return false; - } + return mandatory; } - return true; } public boolean doLandForLandRemovalLogic(SpellAbility sa, Player ai, Card tgtLand, String logic) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java index 16d426c7f62..a84aa9d8643 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -147,7 +147,7 @@ public class DestroyAllAi extends SpellAbilityAi { block.assignBlockersForCombat(combat); if (ComputerUtilCombat.lifeInSeriousDanger(ai, combat)) { - return true; + return true; } return false; } // only lands involved @@ -171,7 +171,6 @@ public class DestroyAllAi extends SpellAbilityAi { else if ((ComputerUtilCard.evaluatePermanentList(ailist) + 3) >= ComputerUtilCard.evaluatePermanentList(opplist)) { return false; } - return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java index f6745d73c39..fbb96a1dc91 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java @@ -51,12 +51,9 @@ public class DrainManaAi extends SpellAbilityAi { } else { final List defined = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa); - if (!defined.contains(opp)) { - return false; - } + return defined.contains(opp); } - return true; } else { sa.resetTargets(); sa.getTargets().add(opp); diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java index 094ebe558a1..212f0bbdab6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java @@ -69,7 +69,7 @@ public class DrawAi extends SpellAbilityAi { } if (!canLoot(ai, sa)) { - return false; + return false; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index 4b83190cc6f..92e8422c41c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -283,11 +283,7 @@ public class EffectAi extends SpellAbilityAi { return false; } final SpellAbility topStack = game.getStack().peekAbility(); - if (topStack.getActivatingPlayer().isOpponentOf(ai) && topStack.getApi() == ApiType.GainLife) { - return true; - } else { - return false; - } + return topStack.getActivatingPlayer().isOpponentOf(ai) && topStack.getApi() == ApiType.GainLife; } else if (logic.equals("Fight")) { return FightAi.canFightAi(ai, sa, 0, 0); } else if (logic.equals("Burn")) { @@ -301,11 +297,9 @@ public class EffectAi extends SpellAbilityAi { return false; } if (logic.contains(":")) { - String k[] = logic.split(":"); + String[] k = logic.split(":"); Integer i = Integer.valueOf(k[1]); - if (ai.getCreaturesInPlay().size() < i) { - return false; - } + return ai.getCreaturesInPlay().size() >= i; } return true; } else if (logic.equals("CastFromGraveThisTurn")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/FightAi.java b/forge-ai/src/main/java/forge/ai/ability/FightAi.java index 8486fb0ab46..9a3b0965c42 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FightAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FightAi.java @@ -273,10 +273,10 @@ public class FightAi extends SpellAbilityAi { if (!canKill(opponent, fighter, -pumpDefense)) { // can survive return true; } else { - if (MyRandom.getRandom().nextInt(20)<(opponent.getCMC() - fighter.getCMC())) { // trade - return true; - } - } + if (MyRandom.getRandom().nextInt(20)<(opponent.getCMC() - fighter.getCMC())) { // trade + return true; + } + } } return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java b/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java index 4792fbf0c05..7d61025c40d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FlipACoinAi.java @@ -20,9 +20,9 @@ public class FlipACoinAi extends SpellAbilityAi { if (AILogic.equals("Never")) { return false; } else if (AILogic.equals("PhaseOut")) { - if (!ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(sa.getHostCard())) { + if (!ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(sa.getHostCard())) { return false; - } + } } else if (AILogic.equals("KillOrcs")) { if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN) ) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/GameWinAi.java b/forge-ai/src/main/java/forge/ai/ability/GameWinAi.java index f5dd9e62318..9586916f190 100644 --- a/forge-ai/src/main/java/forge/ai/ability/GameWinAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/GameWinAi.java @@ -11,9 +11,7 @@ public class GameWinAi extends SpellAbilityAi { */ @Override protected boolean canPlayAI(Player ai, SpellAbility sa) { - if (ai.cantWin()) { - return false; - } + return !ai.cantWin(); // TODO Check conditions are met on card (e.g. Coalition Victory) @@ -21,7 +19,6 @@ public class GameWinAi extends SpellAbilityAi { // In general, don't return true. // But this card wins the game, I can make an exception for that - return true; } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java index 353d84b606e..41751f85882 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java @@ -106,13 +106,9 @@ public class LifeGainAi extends SpellAbilityAi { return false; } - if (!lifeCritical && !activateForCost - && (!ph.getNextTurn().equals(ai) || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) - && !sa.hasParam("PlayerTurn") && !SpellAbilityAi.isSorcerySpeed(sa)) { - return false; - } - - return true; + return lifeCritical || activateForCost + || (ph.getNextTurn().equals(ai) && !ph.getPhase().isBefore(PhaseType.END_OF_TURN)) + || sa.hasParam("PlayerTurn") || SpellAbilityAi.isSorcerySpeed(sa); } /* @@ -304,9 +300,7 @@ public class LifeGainAi extends SpellAbilityAi { hasTgt = true; } } - if (!hasTgt) { - return false; - } + return hasTgt; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java index 96fc5d4f195..23ee0a4712e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java @@ -53,9 +53,7 @@ public class LifeLoseAi extends SpellAbilityAi { } if (sa.usesTargeting()) { - if (!doTgt(ai, sa, false)) { - return false; - } + return doTgt(ai, sa, false); } return true; @@ -184,15 +182,11 @@ public class LifeLoseAi extends SpellAbilityAi { } final List tgtPlayers = sa.usesTargeting() && !sa.hasParam("Defined") - ? new FCollection(sa.getTargets().getTargetPlayers()) + ? new FCollection<>(sa.getTargets().getTargetPlayers()) : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); - if (!mandatory && tgtPlayers.contains(ai) && amount > 0 && amount + 3 > ai.getLife()) { - // For cards like Foul Imp, ETB you lose life - return false; - } - - return true; + // For cards like Foul Imp, ETB you lose life + return mandatory || !tgtPlayers.contains(ai) || amount <= 0 || amount + 3 <= ai.getLife(); } protected boolean doTgt(Player ai, SpellAbility sa, boolean mandatory) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index 868f69fd185..60eaeef180f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -80,12 +80,9 @@ public class ManaEffectAi extends SpellAbilityAi { if (sa.hasParam("AILogic")) { return true; // handled elsewhere, does not meet the standard requirements } - - if (!(sa.getPayCosts() != null && sa.getPayCosts().hasNoManaCost() && sa.getPayCosts().isReusuableResource() - && sa.getSubAbility() == null && ComputerUtil.playImmediately(ai, sa))) { - return false; - } - return true; + + return sa.getPayCosts() != null && sa.getPayCosts().hasNoManaCost() && sa.getPayCosts().isReusuableResource() + && sa.getSubAbility() == null && ComputerUtil.playImmediately(ai, sa); // return super.checkApiLogic(ai, sa); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java index 7adea756b2e..57e70f7fe58 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java @@ -185,10 +185,7 @@ public class ManifestAi extends SpellAbilityAi { CardCollection filtered = CardLists.filter(options, new Predicate() { @Override public boolean apply(Card input) { - if (shouldManyfest(input, ai, sa)) { - return false; - } - return true; + return !shouldManyfest(input, ai, sa); } }); if (!filtered.isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/MillAi.java b/forge-ai/src/main/java/forge/ai/ability/MillAi.java index c975d894c29..3656226ee06 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MillAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MillAi.java @@ -31,19 +31,13 @@ public class MillAi extends SpellAbilityAi { PhaseHandler ph = ai.getGame().getPhaseHandler(); if (aiLogic.equals("Main1")) { - if (ph.getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases") - && !ComputerUtil.castSpellInMain1(ai, sa)) { - return false; - } + return !ph.getPhase().isBefore(PhaseType.MAIN2) || sa.hasParam("ActivationPhases") + || ComputerUtil.castSpellInMain1(ai, sa); } else if (aiLogic.equals("EndOfOppTurn")) { - if (!(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai))) { - return false; - } + return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); } else if (aiLogic.equals("LilianaMill")) { // Only mill if a "Raise Dead" target is available, in case of control decks with few creatures - if (CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES).size() < 1) { - return false; - } + return CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES).size() >= 1; } return true; } @@ -62,11 +56,9 @@ public class MillAi extends SpellAbilityAi { } } if (sa.getHostCard().isCreature() && sa.getPayCosts().hasTapCost()) { - if (!(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai))) { - // creatures with a tap cost to mill (e.g. Doorkeeper) should be activated at the opponent's end step - // because they are also potentially useful for combat - return false; - } + // creatures with a tap cost to mill (e.g. Doorkeeper) should be activated at the opponent's end step + // because they are also potentially useful for combat + return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); } return true; } @@ -100,9 +92,7 @@ public class MillAi extends SpellAbilityAi { // Set PayX here to maximum value. final int cardsToDiscard = getNumToDiscard(ai, sa); source.setSVar("PayX", Integer.toString(cardsToDiscard)); - if (cardsToDiscard <= 0) { - return false; - } + return cardsToDiscard > 0; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java index 7a7c0bdb732..bd6dedc12ec 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PeekAndRevealAi.java @@ -24,10 +24,10 @@ public class PeekAndRevealAi extends SpellAbilityAi { return false; } if ("Main2".equals(sa.getParam("AILogic"))) { - if (aiPlayer.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)) { - return false; - } - } + if (aiPlayer.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)) { + return false; + } + } // So far this only appears on Triggers, but will expand // once things get converted from Dig + NoMove return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index 14a3f8160c5..62012507864 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -38,10 +38,7 @@ public class PermanentAi extends SpellAbilityAi { } // Wait for Main2 if possible - if (ph.is(PhaseType.MAIN1) && ph.isPlayerTurn(ai) && !ComputerUtil.castPermanentInMain1(ai, sa) && !sa.hasParam("WithoutManaCost")) { - return false; - } - return true; + return !ph.is(PhaseType.MAIN1) || !ph.isPlayerTurn(ai) || ComputerUtil.castPermanentInMain1(ai, sa) || sa.hasParam("WithoutManaCost"); } /** @@ -259,9 +256,7 @@ public class PermanentAi extends SpellAbilityAi { } } - if (dontCast) { - return false; - } + return !dontCast; } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 1fa1a224098..fff79b466d4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -40,9 +40,7 @@ public class PermanentCreatureAi extends PermanentAi { ComputerUtilCard.applyStaticContPT(game, copy, null); - if (copy.getNetToughness() <= 0) { - return false; - } + return copy.getNetToughness() > 0; } return true; } @@ -225,13 +223,9 @@ public class PermanentCreatureAi extends PermanentAi { */ final Card copy = CardUtil.getLKICopy(sa.getHostCard()); ComputerUtilCard.applyStaticContPT(game, copy, null); - if (copy.getNetToughness() <= 0 && !copy.hasStartOfKeyword("etbCounter") && mana.countX() == 0 - && !copy.hasETBTrigger(false) && !copy.hasETBReplacement() && !copy.hasSVar("NoZeroToughnessAI")) { - // AiPlayDecision.WouldBecomeZeroToughnessCreature - return false; - } - - return true; + // AiPlayDecision.WouldBecomeZeroToughnessCreature + return copy.getNetToughness() > 0 || copy.hasStartOfKeyword("etbCounter") || mana.countX() != 0 + || copy.hasETBTrigger(false) || copy.hasETBReplacement() || copy.hasSVar("NoZeroToughnessAI"); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java index a4569fb1c2e..bd7db42f43f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java @@ -19,10 +19,7 @@ public class PermanentNoncreatureAi extends PermanentAi { @Override protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { - if ("Never".equals(aiLogic) || "DontCast".equals(aiLogic)) { - return false; - } - return true; + return !"Never".equals(aiLogic) && !"DontCast".equals(aiLogic); } /** @@ -54,10 +51,8 @@ public class PermanentNoncreatureAi extends PermanentAi { // TODO: consider replacing the condition with host.hasSVar("OblivionRing") targets = CardLists.filterControlledBy(targets, ai.getOpponents()); } - if (targets.isEmpty()) { - // AiPlayDecision.AnotherTime - return false; - } + // AiPlayDecision.AnotherTime + return !targets.isEmpty(); } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java index dffcc09e823..ca9dcd4e57c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java @@ -33,9 +33,7 @@ public class PhasesAi extends SpellAbilityAi { if (tgtCards.contains(source)) { // Protect it from something final boolean isThreatened = ComputerUtil.predictThreatenedObjects(aiPlayer, null, true).contains(source); - if (isThreatened) { - return true; - } + return isThreatened; } else { // Card def = tgtCards.get(0); // Phase this out if it might attack me, or before it can be diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index f023a718fb1..96c22f1d519 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -178,11 +178,7 @@ public class PlayAi extends SpellAbilityAi { // Before accepting, see if the spell has a valid number of targets (it should at this point). // Proceeding past this point if the spell is not correctly targeted will result // in "Failed to add to stack" error and the card disappearing from the game completely. - if (!spell.isTargetNumberValid()) { - return false; - } - - return true; + return spell.isTargetNumberValid(); } } return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java b/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java index a66326ac4e2..0eba3082f50 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PoisonAi.java @@ -24,11 +24,8 @@ public class PoisonAi extends SpellAbilityAi { */ @Override protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) { - if (ph.getPhase().isBefore(PhaseType.MAIN2) - && !sa.hasParam("ActivationPhases")) { - return false; - } - return true; + return !ph.getPhase().isBefore(PhaseType.MAIN2) + || sa.hasParam("ActivationPhases"); } /* @@ -83,7 +80,6 @@ public class PoisonAi extends SpellAbilityAi { return false; } } - return true; } @@ -99,7 +95,6 @@ public class PoisonAi extends SpellAbilityAi { } else if (!input.canReceiveCounters(CounterType.POISON)) { return false; } - return true; } @@ -132,10 +127,7 @@ public class PoisonAi extends SpellAbilityAi { if (input.cantLose()) { return true; } - if (!input.canReceiveCounters(CounterType.POISON)) { - return true; - } - return false; + return !input.canReceiveCounters(CounterType.POISON); } }); diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java index 513b8689a0c..51db49de678 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java @@ -30,7 +30,7 @@ import forge.util.MyRandom; public class ProtectAi extends SpellAbilityAi { private static boolean hasProtectionFrom(final Card card, final String color) { - final List onlyColors = new ArrayList(MagicColor.Constant.ONLY_COLORS); + final List onlyColors = new ArrayList<>(MagicColor.Constant.ONLY_COLORS); // make sure we have a valid color if (!onlyColors.contains(color)) { @@ -162,11 +162,8 @@ public class ProtectAi extends SpellAbilityAi { @Override protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) { final boolean notAiMain1 = !(ph.getPlayerTurn() == ai && ph.getPhase() == PhaseType.MAIN1); - if (SpellAbilityAi.isSorcerySpeed(sa) && notAiMain1) { - // sorceries can only give protection in order to create an unblockable attacker - return false; - } - return true; + // sorceries can only give protection in order to create an unblockable attacker + return !SpellAbilityAi.isSorcerySpeed(sa) || !notAiMain1; } @Override @@ -177,9 +174,7 @@ public class ProtectAi extends SpellAbilityAi { return false; } else if (cards.size() == 1) { // Affecting single card - if ((getProtectCreatures(ai, sa)).contains(cards.get(0))) { - return true; - } + return (getProtectCreatures(ai, sa)).contains(cards.get(0)); } /* * when this happens we need to expand AI to consider if its ok diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 3ab163edddc..31c4c7a8ddd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -92,10 +92,7 @@ public class PumpAi extends PumpAiBase { return true; } - if (!ph.getNextTurn().equals(ai) || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) { - return false; - } - return true; + return ph.getNextTurn().equals(ai) && !ph.getPhase().isBefore(PhaseType.END_OF_TURN); } else if (logic.equals("Aristocrat")) { final boolean isThreatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()); if (!ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS) && !isThreatened) { @@ -121,9 +118,7 @@ public class PumpAi extends PumpAiBase { || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS))) { // Instant-speed pumps should not be cast outside of combat when the // stack is empty - if (!sa.isCurse() && !SpellAbilityAi.isSorcerySpeed(sa) && !main1Preferred) { - return false; - } + return sa.isCurse() || SpellAbilityAi.isSorcerySpeed(sa) || main1Preferred; } return true; } @@ -134,7 +129,7 @@ public class PumpAi extends PumpAiBase { final Card source = sa.getHostCard(); final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) - : Lists.newArrayList(); + : Lists.newArrayList(); final String numDefense = sa.hasParam("NumDef") ? sa.getParam("NumDef") : ""; final String numAttack = sa.hasParam("NumAtt") ? sa.getParam("NumAtt") : ""; @@ -191,11 +186,8 @@ public class PumpAi extends PumpAiBase { srcCardCpy.setCounters(cType, srcCardCpy.getCounters(cType) - amount); if (CounterType.P1P1.equals(cType) && srcCardCpy.getNetToughness() <= 0) { - if (srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) - || card.isToken()) { - return true; - } - return false; + return srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) + || card.isToken(); } return false; } @@ -244,11 +236,8 @@ public class PumpAi extends PumpAiBase { srcCardCpy.setCounters(cType, srcCardCpy.getCounters(cType) - amount); if (CounterType.P1P1.equals(cType) && srcCardCpy.getNetToughness() <= 0) { - if (srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) - || card.isToken()) { - return true; - } - return false; + return srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) + || card.isToken(); } return true; } @@ -395,11 +384,11 @@ public class PumpAi extends PumpAiBase { Card pumped = ComputerUtilCard.getPumpedCreature(ai, sa, card, 0, 0, keywords); if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai) || game.getPhaseHandler().is(PhaseType.COMBAT_BEGIN, ai)) { - if (!ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped)) { - return false; - } + return ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped); } + return true; + } else if (grantsUsefulExtraBlockOpts(ai, card)) { return true; } } @@ -432,7 +421,7 @@ public class PumpAi extends PumpAiBase { private boolean pumpTgtAI(final Player ai, final SpellAbility sa, final int defense, final int attack, final boolean mandatory, boolean immediately) { final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) - : Lists.newArrayList(); + : Lists.newArrayList(); final Game game = ai.getGame(); final Card source = sa.getHostCard(); final boolean isFight = "Fight".equals(sa.getParam("AILogic")) || "PowerDmg".equals(sa.getParam("AILogic")); @@ -555,7 +544,7 @@ public class PumpAi extends PumpAiBase { } // Filter AI-specific targets if provided - list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, true); + list = ComputerUtil.filterAITgts(sa, ai, list, true); if (list.isEmpty()) { if (ComputerUtil.activateForCost(sa, ai)) { @@ -788,15 +777,11 @@ public class PumpAi extends PumpAiBase { if (!source.hasKeyword(Keyword.INDESTRUCTIBLE) && source.getNetToughness() + defense <= source.getDamage()) { return false; } - if (source.getNetToughness() + defense <= 0) { - return false; - } + return source.getNetToughness() + defense > 0; } } else { //Targeted - if (!pumpTgtAI(ai, sa, defense, attack, false, true)) { - return false; - } + return pumpTgtAI(ai, sa, defense, attack, false, true); } return true; @@ -849,9 +834,7 @@ public class PumpAi extends PumpAiBase { } } ); - if (sacFodder.size() >= numCreatsToSac) { - return true; - } + return sacFodder.size() >= numCreatsToSac; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 3ccc5b81605..eb2ab18e1d1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -37,6 +37,24 @@ public abstract class PumpAiBase extends SpellAbilityAi { } + public boolean grantsUsefulExtraBlockOpts(final Player ai, final Card card) { + PhaseHandler ph = ai.getGame().getPhaseHandler(); + if (ph.isPlayerTurn(ai) || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS)) { + return false; + } + int canBlockNum = 1 + card.canBlockAdditional(); + int possibleBlockNum = 0; + for (Card attacker : ai.getGame().getCombat().getAttackers()) { + if (CombatUtil.canBlock(attacker, card)) { + possibleBlockNum++; + if (possibleBlockNum > canBlockNum) { + break; + } + } + } + return possibleBlockNum > canBlockNum; + } + /** * Checks if is useful keyword. * @@ -56,24 +74,17 @@ public abstract class PumpAiBase extends SpellAbilityAi { if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { return false; } else if (keyword.equals("Defender") || keyword.endsWith("CARDNAME can't attack.")) { - if (!ph.isPlayerTurn(card.getController()) || !CombatUtil.canAttack(card, ai) - || (card.getNetCombatDamage() <= 0) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } + return ph.isPlayerTurn(card.getController()) && CombatUtil.canAttack(card, ai) + && (card.getNetCombatDamage() > 0) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else if (keyword.endsWith("CARDNAME can't attack or block.")) { if (sa.hasParam("UntilYourNextTurn")) { - if (CombatUtil.canAttack(card, ai) || CombatUtil.canBlock(card, true)) { - return true; - } - return false; + return CombatUtil.canAttack(card, ai) || CombatUtil.canBlock(card, true); } if (!ph.isPlayerTurn(ai)) { - if (!CombatUtil.canAttack(card, ai) - || (card.getNetCombatDamage() <= 0) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } + return CombatUtil.canAttack(card, ai) + && (card.getNetCombatDamage() > 0) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else { if (ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) || ph.getPhase().isBefore(PhaseType.MAIN1)) { @@ -90,9 +101,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { return CombatUtil.canAttack(c, card.getController()) || (combat != null && combat.isAttacking(c)); } }); - if (!CombatUtil.canBlockAtLeastOne(card, attackers)) { - return false; - } + return CombatUtil.canBlockAtLeastOne(card, attackers); } } else if (keyword.endsWith("CARDNAME can't block.")) { if (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) @@ -112,24 +121,18 @@ public abstract class PumpAiBase extends SpellAbilityAi { && card.getController().equals(combat.getDefenderPlayerByAttacker(c))); } }); - if (!CombatUtil.canBlockAtLeastOne(card, attackers)) { - return false; - } + return CombatUtil.canBlockAtLeastOne(card, attackers); } else if (keyword.endsWith("CantBlockCardUIDSource")) { // can't block CARDNAME this turn if (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) || ph.getPhase().isBefore(PhaseType.MAIN1) || !CombatUtil.canBlock(sa.getHostCard(), card)) { return false; } // target needs to be a creature, controlled by the player which is attacked - if (sa.getHostCard().isTapped() && (combat == null || !combat.isAttacking(sa.getHostCard()) - || !card.getController().equals(combat.getDefenderPlayerByAttacker(sa.getHostCard())))) { - return false; - } + return !sa.getHostCard().isTapped() || (combat != null && combat.isAttacking(sa.getHostCard()) + && card.getController().equals(combat.getDefenderPlayerByAttacker(sa.getHostCard()))); } else if (keyword.endsWith("This card doesn't untap during your next untap step.")) { - if (ph.getPhase().isBefore(PhaseType.MAIN2) || card.isUntapped() || !ph.isPlayerTurn(ai) - || !Untap.canUntap(card)) { - return false; - } + return !ph.getPhase().isBefore(PhaseType.MAIN2) && !card.isUntapped() && ph.isPlayerTurn(ai) + && Untap.canUntap(card); } else if (keyword.endsWith("Prevent all combat damage that would be dealt by CARDNAME.") || keyword.endsWith("Prevent all damage that would be dealt by CARDNAME.")) { if (ph.isPlayerTurn(ai) && (!(CombatUtil.canBlock(card) || combat != null && combat.isBlocking(card)) @@ -139,28 +142,18 @@ public abstract class PumpAiBase extends SpellAbilityAi { || CardLists.getNotKeyword(ai.getCreaturesInPlay(), Keyword.DEFENDER).isEmpty())) { return false; } - if (!ph.isPlayerTurn(ai) && (combat == null || !combat.isAttacking(card) || card.getNetCombatDamage() <= 0)) { - return false; - } + return ph.isPlayerTurn(ai) || (combat != null && combat.isAttacking(card) && card.getNetCombatDamage() > 0); } else if (keyword.endsWith("CARDNAME attacks each turn if able.") || keyword.endsWith("CARDNAME attacks each combat if able.")) { - if (ph.isPlayerTurn(ai) || !CombatUtil.canAttack(card, ai) || !CombatUtil.canBeBlocked(card, ai) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } + return !ph.isPlayerTurn(ai) && CombatUtil.canAttack(card, ai) && CombatUtil.canBeBlocked(card, ai) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else if (keyword.endsWith("CARDNAME can't be regenerated.")) { if (card.getShieldCount() > 0) { return true; } - if (card.hasKeyword("If CARDNAME would be destroyed, regenerate it.") && combat != null - && (combat.isBlocked(card) || combat.isBlocking(card))) { - return true; - } - return false; - } else if (keyword.endsWith("CARDNAME's activated abilities can't be activated.")) { - return false; //too complex - } - return true; + return card.hasKeyword("If CARDNAME would be destroyed, regenerate it.") && combat != null + && (combat.isBlocked(card) || combat.isBlocking(card)); + } else return !keyword.endsWith("CARDNAME's activated abilities can't be activated."); //too complex } /** @@ -187,12 +180,10 @@ public abstract class PumpAiBase extends SpellAbilityAi { final boolean evasive = (keyword.endsWith("Unblockable") || keyword.endsWith("Shadow") || keyword.startsWith("CantBeBlockedBy")); // give evasive keywords to creatures that can or do attack if (evasive) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.endsWith("Flying")) { CardCollectionView attackingFlyer = CardCollection.EMPTY; if (combat != null) { @@ -221,13 +212,11 @@ public abstract class PumpAiBase extends SpellAbilityAi { } } } - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || !Iterables.any(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), - Predicates.not(flyingOrReach))) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && Iterables.any(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), + Predicates.not(flyingOrReach)); } else if (keyword.endsWith("Horsemanship")) { if (ph.isPlayerTurn(opp) && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS) @@ -236,46 +225,35 @@ public abstract class PumpAiBase extends SpellAbilityAi { && ComputerUtilCombat.lifeInDanger(ai, game.getCombat())) { return true; } - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getNotKeyword(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), - Keyword.HORSEMANSHIP).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getNotKeyword(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), + Keyword.HORSEMANSHIP).isEmpty(); } else if (keyword.endsWith("Intimidate")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getNotType(CardLists.filter( - opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), "Artifact").isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getNotType(CardLists.filter( + opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), "Artifact").isEmpty(); } else if (keyword.endsWith("Fear")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getNotColor(CardLists.getNotType(CardLists.filter( - opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), "Artifact"), MagicColor.BLACK).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getNotColor(CardLists.getNotType(CardLists.filter( + opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), "Artifact"), MagicColor.BLACK).isEmpty(); } else if (keyword.endsWith("Haste")) { - if (!card.hasSickness() || ph.isPlayerTurn(opp) || card.isTapped() - || newPower <= 0 - || card.hasKeyword("CARDNAME can attack as though it had haste.") - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || !ComputerUtilCombat.canAttackNextTurn(card)) { - return false; - } + return card.hasSickness() && !ph.isPlayerTurn(opp) && !card.isTapped() + && newPower > 0 + && !card.hasKeyword("CARDNAME can attack as though it had haste.") + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && ComputerUtilCombat.canAttackNextTurn(card); } else if (keyword.endsWith("Indestructible")) { // Predicting threatened objects in relevant non-combat situations happens elsewhere, // so we are only worrying about combat relevance of Indestructible at this point. - if (combat == null - || !((combat.isBlocked(card) || combat.isBlocking(card)) - && ComputerUtilCombat.combatantWouldBeDestroyed(ai, card, combat))) { - return false; - } - return true; + return combat != null + && ((combat.isBlocked(card) || combat.isBlocking(card)) + && ComputerUtilCombat.combatantWouldBeDestroyed(ai, card, combat)); } else if (keyword.endsWith("Deathtouch")) { if (ph.isPlayerTurn(opp) && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS)) { List attackers = combat.getAttackers(); @@ -296,13 +274,11 @@ public abstract class PumpAiBase extends SpellAbilityAi { } } return false; - } else if (keyword.equals("Bushido")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) - || opp.getCreaturesInPlay().isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + } else if (keyword.startsWith("Bushido")) { + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) + && !opp.getCreaturesInPlay().isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("First Strike")) { if (card.hasKeyword(Keyword.DOUBLE_STRIKE)) { return false; @@ -321,40 +297,31 @@ public abstract class PumpAiBase extends SpellAbilityAi { if (!ComputerUtilCombat.canDestroyAttacker(ai, attacker, card, combat, true) && ComputerUtilCombat.canDestroyAttacker(ai, attacker, card, combat, false)) return true; - if (ComputerUtilCombat.canDestroyBlocker(ai, card, attacker, combat, true) - && !ComputerUtilCombat.canDestroyBlocker(ai, card, attacker, combat, false)) - return true; + return ComputerUtilCombat.canDestroyBlocker(ai, card, attacker, combat, true) + && !ComputerUtilCombat.canDestroyBlocker(ai, card, attacker, combat, false); } return false; } else if (keyword.equals("Double Strike")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || newPower <= 0 - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && newPower > 0 + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS); } else if (keyword.startsWith("Rampage")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || newPower <= 0 - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).size() < 2) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && newPower > 0 + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).size() >= 2; } else if (keyword.startsWith("Flanking")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || newPower <= 0 - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || CardLists.getNotKeyword(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), - Keyword.FLANKING).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && newPower > 0 + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && !CardLists.getNotKeyword(CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)), + Keyword.FLANKING).isEmpty(); } else if (keyword.startsWith("Trample")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || !CombatUtil.canBeBlocked(card, opp) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 1 - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && CombatUtil.canBeBlocked(card, opp) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 1 + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("Infect")) { if (newPower <= 0) { return false; @@ -362,11 +329,9 @@ public abstract class PumpAiBase extends SpellAbilityAi { if (combat != null && combat.isBlocking(card) && !card.hasKeyword(Keyword.WITHER)) { return true; } - if ((ph.isPlayerTurn(opp)) - || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - return false; - } + return (!ph.isPlayerTurn(opp)) + && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS); } else if (keyword.endsWith("Wither")) { if (newPower <= 0 || card.hasKeyword(Keyword.INFECT)) { return false; @@ -378,92 +343,52 @@ public abstract class PumpAiBase extends SpellAbilityAi { } return combat != null && ( combat.isAttacking(card) || combat.isBlocking(card) ); } else if (keyword.equals("Vigilance")) { - if (ph.isPlayerTurn(opp) || !CombatUtil.canAttack(card, opp) - || newPower <= 0 - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || CardLists.getNotKeyword(opp.getCreaturesInPlay(), Keyword.DEFENDER).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && CombatUtil.canAttack(card, opp) + && newPower > 0 + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && !CardLists.getNotKeyword(opp.getCreaturesInPlay(), Keyword.DEFENDER).isEmpty(); } else if (keyword.equals("Reach")) { - if (ph.isPlayerTurn(ai) - || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS) - || CardLists.getKeyword(game.getCombat().getAttackers(), Keyword.FLYING).isEmpty() - || card.hasKeyword(Keyword.FLYING) - || !CombatUtil.canBlock(card)) { - return false; - } - } else if (keyword.endsWith("CARDNAME can block an additional creature each combat.")) { - if (ph.isPlayerTurn(ai) - || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return false; - } - int canBlockNum = 1 + CombatUtil.numberOfAdditionalCreaturesCanBlock(card); - int possibleBlockNum = 0; - for (Card attacker : game.getCombat().getAttackers()) { - if (CombatUtil.canBlock(attacker, card)) { - possibleBlockNum++; - if (possibleBlockNum > canBlockNum) { - break; - } - } - } - if (possibleBlockNum <= canBlockNum) { - return false; - } + return !ph.isPlayerTurn(ai) + && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS) + && !CardLists.getKeyword(game.getCombat().getAttackers(), Keyword.FLYING).isEmpty() + && !card.hasKeyword(Keyword.FLYING) + && CombatUtil.canBlock(card); } else if (keyword.equals("Shroud") || keyword.equals("Hexproof")) { - if (!ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(card)) { - return false; - } + return ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(card); } else if (keyword.equals("Persist")) { - if (card.getBaseToughness() <= 1 || card.hasKeyword(Keyword.UNDYING)) { - return false; - } + return card.getBaseToughness() > 1 && !card.hasKeyword(Keyword.UNDYING); } else if (keyword.equals("Islandwalk")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getType(opp.getLandsInPlay(), "Island").isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getType(opp.getLandsInPlay(), "Island").isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("Swampwalk")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getType(opp.getLandsInPlay(), "Swamp").isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getType(opp.getLandsInPlay(), "Swamp").isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("Mountainwalk")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getType(opp.getLandsInPlay(), "Mountain").isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getType(opp.getLandsInPlay(), "Mountain").isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.equals("Forestwalk")) { - if (ph.isPlayerTurn(opp) || !(CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) - || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) - || newPower <= 0 - || CardLists.getType(opp.getLandsInPlay(), "Forest").isEmpty() - || CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty()) { - return false; - } + return !ph.isPlayerTurn(opp) && (CombatUtil.canAttack(card, opp) || (combat != null && combat.isAttacking(card))) + && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) + && newPower > 0 + && !CardLists.getType(opp.getLandsInPlay(), "Forest").isEmpty() + && !CardLists.filter(opp.getCreaturesInPlay(), CardPredicates.possibleBlockers(card)).isEmpty(); } else if (keyword.endsWith("CARDNAME can attack as though it didn't have defender.")) { - if (!ph.isPlayerTurn(ai) || !card.hasKeyword(Keyword.DEFENDER) - || ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) - || card.isTapped() || newPower <= 0) { - return false; - } + return ph.isPlayerTurn(ai) && card.hasKeyword(Keyword.DEFENDER) + && !ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) + && !card.isTapped() && newPower > 0; } else if (keyword.equals("Prevent all combat damage that would be dealt to CARDNAME.")) { - if (combat == null || !(combat.isBlocking(card) || combat.isBlocked(card))) { - return false; - } + return combat != null && (combat.isBlocking(card) || combat.isBlocked(card)); } else if (keyword.equals("Menace")) { - if (combat == null || !combat.isAttacking(card)) { - return false; - } + return combat != null && combat.isAttacking(card); } return true; } @@ -547,10 +472,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { return true; } //Don't waste a -7/-0 spell on a 1/1 creature - if (c.getNetPower() + attack > -2 || c.getNetPower() > 3) { - return true; - } - return false; + return c.getNetPower() + attack > -2 || c.getNetPower() > 3; } }); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index 7f03f31ddf4..0189574dc65 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -50,7 +50,7 @@ public class PumpAllAi extends PumpAiBase { final int power = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumAtt"), sa); final int defense = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumDef"), sa); - final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList(); + final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList<>(); final PhaseType phase = game.getPhaseHandler().getPhase(); @@ -141,10 +141,7 @@ public class PumpAllAi extends PumpAiBase { // evaluate both lists and pass only if human creatures are more // valuable - if ((ComputerUtilCard.evaluateCreatureList(comp) + 200) >= ComputerUtilCard.evaluateCreatureList(human)) { - return false; - } - return true; + return (ComputerUtilCard.evaluateCreatureList(comp) + 200) < ComputerUtilCard.evaluateCreatureList(human); } // end Curse return !CardLists.getValidCards(getPumpCreatures(ai, sa, defense, power, keywords, false), valid, source.getController(), source).isEmpty(); diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java index 1e5ed6f1d01..64603e40410 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java @@ -106,7 +106,7 @@ public class RegenerateAi extends SpellAbilityAi { // control final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa, true); - final List threatenedTargets = new ArrayList(); + final List threatenedTargets = new ArrayList<>(); for (final Card c : targetables) { if (objects.contains(c) && c.getShieldCount() == 0 && !ComputerUtil.canRegenerate(ai, c)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/RemoveFromCombatAi.java b/forge-ai/src/main/java/forge/ai/ability/RemoveFromCombatAi.java index 6c498f1e764..5d1abd1e177 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RemoveFromCombatAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RemoveFromCombatAi.java @@ -18,9 +18,7 @@ public class RemoveFromCombatAi extends SpellAbilityAi { // AI should only activate this during Human's turn if ("RemoveBestAttacker".equals(sa.getParam("AILogic"))) { - if (aiPlayer.getGame().getCombat() != null && aiPlayer.getGame().getCombat().getDefenders().contains(aiPlayer)) { - return true; - } + return aiPlayer.getGame().getCombat() != null && aiPlayer.getGame().getCombat().getDefenders().contains(aiPlayer); } // TODO - implement AI diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java index 08059c5cace..7a37733b284 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java @@ -32,9 +32,7 @@ public class RepeatAi extends SpellAbilityAi { // Set PayX here to maximum value. final int max = ComputerUtilMana.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(max)); - if (max <= 0) { - return false; - } + return max > 0; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java index 7ef2f78aef4..8ba1494b666 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java @@ -35,9 +35,7 @@ public class RepeatEachAi extends SpellAbilityAi { List humTokenCreats = CardLists.filter(aiPlayer.getOpponents().getCreaturesInPlay(), Presets.TOKEN); List compTokenCreats = CardLists.filter(aiPlayer.getCreaturesInPlay(), Presets.TOKEN); - if (compTokenCreats.size() <= humTokenCreats.size()) { - return false; - } + return compTokenCreats.size() > humTokenCreats.size(); } else if ("BalanceLands".equals(logic)) { if (CardLists.filter(aiPlayer.getCardsIn(ZoneType.Battlefield), Presets.LANDS).size() >= 5) { return false; @@ -111,9 +109,7 @@ public class RepeatEachAi extends SpellAbilityAi { } } // would not hit oppoent, don't do that - if (!hitOpp) { - return false; - } + return hitOpp; } // TODO Add some normal AI variability here diff --git a/forge-ai/src/main/java/forge/ai/ability/RevealHandAi.java b/forge-ai/src/main/java/forge/ai/ability/RevealHandAi.java index 841a0cdedca..b2484c99f30 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RevealHandAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RevealHandAi.java @@ -30,11 +30,7 @@ public class RevealHandAi extends RevealAiBase { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - if (!revealHandTargetAI(ai, sa/*, false, mandatory*/)) { - return false; - } - - return true; + return revealHandTargetAI(ai, sa/*, false, mandatory*/); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/RollPlanarDiceAi.java b/forge-ai/src/main/java/forge/ai/ability/RollPlanarDiceAi.java index 4dd60206601..09d3859a5c5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RollPlanarDiceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RollPlanarDiceAi.java @@ -144,7 +144,7 @@ public class RollPlanarDiceAi extends SpellAbilityAi { } } - return decideToRoll ? true : false; + return decideToRoll; } /* (non-Javadoc) diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java index f5f1c587075..94e36b479da 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -136,9 +136,7 @@ public class SacrificeAi extends SpellAbilityAi { // Since all of the cards have AI:RemoveDeck:All, I enabled 1 for 1 // (or X for X) trades for special decks - if (humanList.size() < amount) { - return false; - } + return humanList.size() >= amount; } else if (defined.equals("You")) { List computerList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java index ea10f386b9e..cf01c1d8026 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java @@ -145,10 +145,10 @@ public class ScryAi extends SpellAbilityAi { if (maxToRemove <= 0) { return false; } - sa.setSVar("ChosenX", "Number$" + Integer.toString(maxToRemove)); + sa.setSVar("ChosenX", "Number$" + maxToRemove); } else { // no Instant or Sorceries anymore, just scry - sa.setSVar("ChosenX", "Number$" + Integer.toString(Math.min(counterNum, libsize))); + sa.setSVar("ChosenX", "Number$" + Math.min(counterNum, libsize)); } } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index dc5c4f5e635..79104d062a6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -92,9 +92,7 @@ public class SetStateAi extends SpellAbilityAi { } } - if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) { - return false; - } + return sa.getTargets().getNumTargeted() >= tgt.getMinTargets(source, sa); } } else if ("TurnFace".equals(mode)) { if (!sa.usesTargeting()) { @@ -123,9 +121,7 @@ public class SetStateAi extends SpellAbilityAi { } } - if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) { - return false; - } + return sa.getTargets().getNumTargeted() >= tgt.getMinTargets(source, sa); } } return true; @@ -254,9 +250,7 @@ public class SetStateAi extends SpellAbilityAi { // for legendary KI counter creatures if (othercard.getCounters(CounterType.KI) >= source.getCounters(CounterType.KI)) { // if the other legendary is useless try to replace it - if (!ComputerUtilCard.isUselessCreature(aiPlayer, othercard)) { - return false; - } + return ComputerUtilCard.isUselessCreature(aiPlayer, othercard); } } } @@ -266,10 +260,6 @@ public class SetStateAi extends SpellAbilityAi { public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { // TODO: improve the AI for when it may want to transform something that's optional to transform - if (!isSafeToTransformIntoLegendary(player, sa.getHostCard())) { - return false; - } - - return true; + return isSafeToTransformIntoLegendary(player, sa.getHostCard()); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java b/forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java index 23f55ec9544..14cae9165fc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SkipTurnAi.java @@ -11,10 +11,7 @@ public class SkipTurnAi extends SpellAbilityAi { */ @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { - if ("Always".equals(sa.getParam("AILogic"))) { - return true; - } - return false; + return "Always".equals(sa.getParam("AILogic")); } /* (non-Javadoc) diff --git a/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java b/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java index 88d585a3a25..2abada6610d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java @@ -47,7 +47,7 @@ public class StoreSVarAi extends SpellAbilityAi { possibleBlockers = CardLists.filter(possibleBlockers, Presets.UNTAPPED); int oppLife = opp.getLife(); int potentialDmg = 0; - List currentAttackers = new ArrayList(); + List currentAttackers = new ArrayList<>(); if (possibleBlockers.size() == 0) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java index 23069294e94..eb2beab480b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java @@ -76,9 +76,7 @@ public class SurveilAi extends SpellAbilityAi { if ("Never".equals(aiLogic)) { return false; } else if ("Once".equals(aiLogic)) { - if (AiCardMemory.isRememberedCard(ai, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { - return false; - } + return !AiCardMemory.isRememberedCard(ai, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); } // TODO: add card-specific Surveil AI logic here when/if necessary diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAi.java index 82b55dce044..a4eb933dbe4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAi.java @@ -64,9 +64,7 @@ public class TapAi extends TapAiBase { bFlag |= c.isUntapped(); } - if (!bFlag) { - return false; - } + return bFlag; } else { if ("TapForXCounters".equals(sa.getParam("AILogic"))) { // e.g. Waxmane Baku @@ -83,12 +81,9 @@ public class TapAi extends TapAiBase { } sa.resetTargets(); - if (!tapPrefTargeting(ai, source, tgt, sa, false)) { - return false; - } + return tapPrefTargeting(ai, source, tgt, sa, false); } - return true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java index 77f83383db6..6a408821cbe 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java @@ -248,12 +248,8 @@ public abstract class TapAiBase extends SpellAbilityAi { sa.getTargets().add(choice); } - if (sa.getTargets().getNumTargeted() == 0) { - // Nothing was ever targeted, so we need to bail. - return false; - } - - return true; + // Nothing was ever targeted, so we need to bail. + return sa.getTargets().getNumTargeted() != 0; } /** @@ -307,11 +303,7 @@ public abstract class TapAiBase extends SpellAbilityAi { // just tap whatever we can tapList = list; - if (tapTargetList(ai, sa, tapList, mandatory)) { - return true; - } - - return false; + return tapTargetList(ai, sa, tapList, mandatory); } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index baf1842e4e0..8361e437dcd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -93,9 +93,7 @@ public class TapAllAi extends SpellAbilityAi { return CombatUtil.canAttack(c) && ComputerUtilCombat.canAttackNextTurn(c); } }); - if(!any) { - return false; - } + return any; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index cee492ffb3c..49ce81440e9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -103,12 +103,9 @@ public class TokenAi extends SpellAbilityAi { if (actualToken == null) { final AbilitySub sub = sa.getSubAbility(); - if (pwPlus || (sub != null && SpellApiToAi.Converter.get(sub.getApi()).chkAIDrawback(sub, ai))) { - return true; // planeswalker plus ability or sub-ability is - // useful - } else { - return false; // no token created - } + // useful + // no token created + return pwPlus || (sub != null && SpellApiToAi.Converter.get(sub.getApi()).chkAIDrawback(sub, ai)); // planeswalker plus ability or sub-ability is } // X-cost spells @@ -154,10 +151,7 @@ public class TokenAi extends SpellAbilityAi { && !haste && !pwMinus) { return false; } - if ((ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) || !ph.isPlayerTurn(ai)) && oneShot) { - return false; - } - return true; + return (!ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN) && ph.isPlayerTurn(ai)) || !oneShot; } @Override @@ -269,10 +263,8 @@ public class TokenAi extends SpellAbilityAi { list.add(token); list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(), sa); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); - if (ComputerUtilCard.evaluateCreature(token) < ComputerUtilCard.evaluateCreature(list.get(0)) - && list.contains(token)) { - return true; - } + return ComputerUtilCard.evaluateCreature(token) < ComputerUtilCard.evaluateCreature(list.get(0)) + && list.contains(token); } return false; } @@ -411,7 +403,7 @@ public class TokenAi extends SpellAbilityAi { String tokenToughness = sa.getParam("TokenToughness"); String tokenName = sa.getParam("TokenName"); String[] tokenTypes = sa.getParam("TokenTypes").split(","); - String cost = ""; + StringBuilder cost = new StringBuilder(); String[] tokenColors = sa.getParam("TokenColors").split(","); String tokenImage = sa.hasParam("TokenImage") ? PaperToken.makeTokenFileName(sa.getParam("TokenImage")) : ""; String[] tokenAbilities = sa.hasParam("TokenAbilities") ? sa.getParam("TokenAbilities").split(",") : null; @@ -426,35 +418,35 @@ public class TokenAi extends SpellAbilityAi { substitutedColors[i] = host.getChosenColor(); } } - String colorDesc = ""; + StringBuilder colorDesc = new StringBuilder(); for (final String col : substitutedColors) { if (col.equalsIgnoreCase("White")) { - colorDesc += "W "; + colorDesc.append("W "); } else if (col.equalsIgnoreCase("Blue")) { - colorDesc += "U "; + colorDesc.append("U "); } else if (col.equalsIgnoreCase("Black")) { - colorDesc += "B "; + colorDesc.append("B "); } else if (col.equalsIgnoreCase("Red")) { - colorDesc += "R "; + colorDesc.append("R "); } else if (col.equalsIgnoreCase("Green")) { - colorDesc += "G "; + colorDesc.append("G "); } else if (col.equalsIgnoreCase("Colorless")) { - colorDesc = "C"; + colorDesc = new StringBuilder("C"); } } - final List imageNames = new ArrayList(1); + final List imageNames = new ArrayList<>(1); if (tokenImage.equals("")) { - imageNames.add(PaperToken.makeTokenFileName(TextUtil.fastReplace(colorDesc, " ", ""), tokenPower, tokenToughness, tokenName)); + imageNames.add(PaperToken.makeTokenFileName(TextUtil.fastReplace(colorDesc.toString(), " ", ""), tokenPower, tokenToughness, tokenName)); } else { imageNames.add(0, tokenImage); } - for (final char c : colorDesc.toCharArray()) { - cost += c + ' '; + for (final char c : colorDesc.toString().toCharArray()) { + cost.append(c + ' '); } - cost = colorDesc.replace('C', '1').trim(); + cost = new StringBuilder(colorDesc.toString().replace('C', '1').trim()); final int finalPower = AbilityUtils.calculateAmount(host, tokenPower, sa); final int finalToughness = AbilityUtils.calculateAmount(host, tokenToughness, sa); @@ -468,7 +460,7 @@ public class TokenAi extends SpellAbilityAi { final String substitutedName = tokenName.equals("ChosenType") ? host.getChosenType() : tokenName; final String imageName = imageNames.get(MyRandom.getRandom().nextInt(imageNames.size())); final TokenInfo tokenInfo = new TokenInfo(substitutedName, imageName, - cost, substitutedTypes, tokenKeywords, finalPower, finalToughness); + cost.toString(), substitutedTypes, tokenKeywords, finalPower, finalToughness); Card token = tokenInfo.makeOneToken(ai); if (token == null) { diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java index 1589ec3f41d..0b1ac1ad906 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java @@ -39,7 +39,7 @@ public class TwoPilesAi extends SpellAbilityAi { } final List tgtPlayers = sa.usesTargeting() && !sa.hasParam("Defined") - ? new FCollection(sa.getTargets().getTargetPlayers()) + ? new FCollection<>(sa.getTargets().getTargetPlayers()) : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); final Player p = tgtPlayers.get(0); diff --git a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java index 6b7ad4eefbe..4c877974ff2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java @@ -66,7 +66,7 @@ public class UnattachAllAi extends SpellAbilityAi { final Card card = sa.getHostCard(); final Player opp = ai.getWeakestOpponent(); // Check if there are any valid targets - List targets = new ArrayList(); + List targets = new ArrayList<>(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt == null) { targets = AbilityUtils.getDefinedObjects(sa.getHostCard(), sa.getParam("Defined"), sa); @@ -82,9 +82,7 @@ public class UnattachAllAi extends SpellAbilityAi { //don't equip a worse creature if (card.isEquipping()) { Card oldTarget = card.getEquipping(); - if (ComputerUtilCard.evaluateCreature(oldTarget) > ComputerUtilCard.evaluateCreature(newTarget)) { - return false; - } + return ComputerUtilCard.evaluateCreature(oldTarget) <= ComputerUtilCard.evaluateCreature(newTarget); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index 48884ee524f..5e2659fdacc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -45,11 +45,7 @@ public class UntapAi extends SpellAbilityAi { return false; } - if (!ComputerUtilCost.checkDiscardCost(ai, cost, sa.getHostCard())) { - return false; - } - - return true; + return ComputerUtilCost.checkDiscardCost(ai, cost, sa.getHostCard()); } @Override @@ -63,16 +59,11 @@ public class UntapAi extends SpellAbilityAi { if (tgt == null) { final List pDefined = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); - if (pDefined != null && pDefined.get(0).isUntapped() && pDefined.get(0).getController() == ai) { - return false; - } + return pDefined == null || !pDefined.get(0).isUntapped() || pDefined.get(0).getController() != ai; } else { - if (!untapPrefTargeting(ai, tgt, sa, false)) { - return false; - } + return untapPrefTargeting(ai, tgt, sa, false); } - return true; } @Override @@ -86,11 +77,7 @@ public class UntapAi extends SpellAbilityAi { // TODO: use Defined to determine, if this is an unfavorable result final List pDefined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); - if (pDefined != null && pDefined.get(0).isUntapped() && pDefined.get(0).getController() == ai) { - return false; - } - - return true; + return pDefined == null || !pDefined.get(0).isUntapped() || pDefined.get(0).getController() != ai; } else { if (untapPrefTargeting(ai, tgt, sa, mandatory)) { return true; @@ -271,11 +258,7 @@ public class UntapAi extends SpellAbilityAi { // just tap whatever we can tapList = list; - if (untapTargetList(source, tgt, sa, mandatory, tapList)) { - return true; - } - - return false; + return untapTargetList(source, tgt, sa, mandatory, tapList); } private boolean untapTargetList(final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory, @@ -438,13 +421,10 @@ public class UntapAi extends SpellAbilityAi { // no harm in doing this past declare blockers during the opponent's turn and right before our turn, // maybe we'll serendipitously untap into something like a removal spell or burn spell that'll help - if (ph.getNextTurn() == ai - && (ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS))) { - return true; - } + return ph.getNextTurn() == ai + && (ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)); // haven't found any immediate playable options - return false; } } diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index b04ba570a51..8cd20c54a26 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -277,10 +277,7 @@ public class GameCopier { // TODO: Copy the full list with timestamps. newCard.addNewPT(setPower, setToughness, newGame.getNextTimestamp()); } - newCard.addTempPowerBoost(c.getTempPowerBoost()); - newCard.setSemiPermanentPowerBoost(c.getSemiPermanentPowerBoost()); - newCard.addTempToughnessBoost(c.getTempToughnessBoost()); - newCard.setSemiPermanentToughnessBoost(c.getSemiPermanentToughnessBoost()); + newCard.setPTBoost(c.getPTBoostMap()); newCard.setDamage(c.getDamage()); newCard.setChangedCardTypes(c.getChangedCardTypesMap()); diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java index 6fe8a5074be..c1d0fac1e32 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameSimulator.java @@ -38,7 +38,7 @@ public class GameSimulator { aiPlayer = (Player) copier.find(origAiPlayer); eval = new GameStateEvaluator(); - origLines = new ArrayList(); + origLines = new ArrayList<>(); debugLines = origLines; debugPrint = false; @@ -52,7 +52,7 @@ public class GameSimulator { // first and get the updated eval score, since this is what we'll // want to compare to the eval score after simulating. if (COPY_STACK && !origGame.getStackZone().isEmpty()) { - origLines = new ArrayList(); + origLines = new ArrayList<>(); debugLines = origLines; Game copyOrigGame = copier.makeCopy(); Player copyOrigAiPlayer = copyOrigGame.getPlayers().get(1); @@ -66,12 +66,12 @@ public class GameSimulator { private void ensureGameCopyScoreMatches(Game origGame, Player origAiPlayer) { eval.setDebugging(true); - List simLines = new ArrayList(); + List simLines = new ArrayList<>(); debugLines = simLines; Score simScore = eval.getScoreForGameState(simGame, aiPlayer); if (!simScore.equals(origScore)) { // Re-eval orig with debug printing. - origLines = new ArrayList(); + origLines = new ArrayList<>(); debugLines = origLines; eval.getScoreForGameState(origGame, origAiPlayer); // Print debug info. @@ -216,7 +216,7 @@ public class GameSimulator { List simLines = null; if (debugPrint) { debugPrint("SimGame:"); - simLines = new ArrayList(); + simLines = new ArrayList<>(); debugLines = simLines; debugPrint = false; } @@ -245,7 +245,7 @@ public class GameSimulator { opponent.runWithController(new Runnable() { @Override public void run() { - final Set allAffectedCards = new HashSet(); + final Set allAffectedCards = new HashSet<>(); game.getAction().checkStateEffects(false, allAffectedCards); game.getStack().addAllTriggeredAbilitiesToStack(); while (!game.getStack().isEmpty() && !game.isGameOver()) { diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java b/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java index e32de189652..3ee4521d4ba 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameStateEvaluator.java @@ -161,17 +161,6 @@ public class GameStateEvaluator { } return super.addValue(value, text); } - - @Override - protected int getEffectivePower(final Card c) { - Card.StatBreakdown breakdown = c.getNetCombatDamageBreakdown(); - return breakdown.getTotal() - breakdown.tempBoost; - } - @Override - protected int getEffectiveToughness(final Card c) { - Card.StatBreakdown breakdown = c.getNetToughnessBreakdown(); - return breakdown.getTotal() - breakdown.tempBoost; - } } public static class Score { diff --git a/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java b/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java index fcaf0ad073f..8d3e3f06321 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java +++ b/forge-ai/src/main/java/forge/ai/simulation/PossibleTargetSelector.java @@ -51,7 +51,7 @@ public class PossibleTargetSelector { this.sa = sa; this.targetingSa = targetingSa; this.targetingSaIndex = targetingSaIndex; - this.validTargets = new ArrayList(); + this.validTargets = new ArrayList<>(); generateValidTargets(sa.getHostCard().getController()); } @@ -80,8 +80,8 @@ public class PossibleTargetSelector { } private static class SimilarTargetSkipper { - private ArrayListMultimap validTargetsMap = ArrayListMultimap.create(); - private HashMap cardTypeStrings = new HashMap(); + private ArrayListMultimap validTargetsMap = ArrayListMultimap.create(); + private HashMap cardTypeStrings = new HashMap<>(); private HashMap creatureScores; private int getCreatureScore(Card c) { @@ -91,7 +91,7 @@ public class PossibleTargetSelector { return score; } } else { - creatureScores = new HashMap(); + creatureScores = new HashMap<>(); } int score = ComputerUtilCard.evaluateCreature(c); diff --git a/forge-ai/src/main/java/forge/ai/simulation/SimulationController.java b/forge-ai/src/main/java/forge/ai/simulation/SimulationController.java index 2593973d08c..f6588af7fe0 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SimulationController.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SimulationController.java @@ -18,7 +18,7 @@ public class SimulationController { private List simulatorStack; private Plan.Decision bestSequence; // last action of sequence private Score bestScore; - private List effectCache = new ArrayList(); + private List effectCache = new ArrayList<>(); private GameObject[] currentHostAndTarget; private static class CachedEffect { @@ -39,10 +39,10 @@ public class SimulationController { public SimulationController(Score score) { bestScore = score; - scoreStack = new ArrayList(); + scoreStack = new ArrayList<>(); scoreStack.add(score); - simulatorStack = new ArrayList(); - currentStack = new ArrayList(); + simulatorStack = new ArrayList<>(); + currentStack = new ArrayList<>(); } private int getRecursionDepth() { @@ -97,7 +97,7 @@ public class SimulationController { throw new RuntimeException("getBestPlan() expects currentStack to be empty!"); } - ArrayList sequence = new ArrayList(); + ArrayList sequence = new ArrayList<>(); Plan.Decision current = bestSequence; while (current != null) { sequence.add(current); diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java index 75225c73cab..b940278d477 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityChoicesIterator.java @@ -49,7 +49,7 @@ public class SpellAbilityChoicesIterator { // TODO: Do we need to do something special to support cards that have extra costs // when choosing more modes, like Blessed Alliance? if (!allowRepeat) { - modeIterator = CombinatoricsUtils.combinationsIterator(choices.size(), num);; + modeIterator = CombinatoricsUtils.combinationsIterator(choices.size(), num); } else { // Note: When allowRepeat is true, it does result in many possibilities being tried. // We should ideally prune some of those at a higher level. @@ -84,7 +84,7 @@ public class SpellAbilityChoicesIterator { } ChoicePoint cp = choicePoints.get(cpIndex); // Prune duplicates. - HashSet uniqueCards = new HashSet(); + HashSet uniqueCards = new HashSet<>(); for (int i = 0; i < fetchList.size(); i++) { Card card = fetchList.get(i); if (uniqueCards.add(card.getName()) && uniqueCards.size() == cp.nextChoice + 1) { @@ -213,7 +213,7 @@ public class SpellAbilityChoicesIterator { } public static List getModeCombination(List choices, int[] modeIndexes) { - ArrayList modes = new ArrayList(); + ArrayList modes = new ArrayList<>(); for (int modeIndex : modeIndexes) { modes.add(choices.get(modeIndex)); } diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java index a14f2b94047..b81c648c1d2 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java +++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java @@ -61,7 +61,7 @@ public class SpellAbilityPicker { List all = ComputerUtilAbility.getSpellAbilities(cards, player); CardCollection landsToPlay = ComputerUtilAbility.getAvailableLandsToPlay(game, player); if (landsToPlay != null) { - HashMap landsDeDupe = new HashMap(); + HashMap landsDeDupe = new HashMap<>(); for (Card land : landsToPlay) { Card previousLand = landsDeDupe.get(land.getName()); // Skip identical lands. @@ -165,7 +165,7 @@ public class SpellAbilityPicker { PhaseType currentPhase = game.getPhaseHandler().getPhase(); if (currentPhase.isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - List candidateSAs2 = new ArrayList(); + List candidateSAs2 = new ArrayList<>(); for (SpellAbility sa : candidateSAs) { if (!isSorcerySpeed(sa, player)) { System.err.println("Not sorcery: " + sa); @@ -270,28 +270,28 @@ public class SpellAbilityPicker { return abilityToString(sa, true); } public static String abilityToString(SpellAbility sa, boolean withTargets) { - String saString = "N/A"; + StringBuilder saString = new StringBuilder("N/A"); if (sa != null) { - saString = sa.toString(); + saString = new StringBuilder(sa.toString()); String cardName = sa.getHostCard().getName(); if (!cardName.isEmpty()) { - saString = TextUtil.fastReplace(saString, cardName, "<$>"); + saString = new StringBuilder(TextUtil.fastReplace(saString.toString(), cardName, "<$>")); } if (saString.length() > 40) { - saString = saString.substring(0, 40) + "..."; + saString = new StringBuilder(saString.substring(0, 40) + "..."); } if (withTargets) { SpellAbility saOrSubSa = sa; do { if (saOrSubSa.usesTargeting()) { - saString += " (targets: " + saOrSubSa.getTargets().getTargetedString() + ")"; + saString.append(" (targets: ").append(saOrSubSa.getTargets().getTargetedString()).append(")"); } saOrSubSa = saOrSubSa.getSubAbility(); } while (saOrSubSa != null); } - saString = sa.getHostCard() + " -> " + saString; + saString.insert(0, sa.getHostCard() + " -> "); } - return saString; + return saString.toString(); } private boolean shouldWaitForLater(final SpellAbility sa) { @@ -308,9 +308,7 @@ public class SpellAbilityPicker { return true; } List phases = conditions.getPhases(); - if (phases.isEmpty() || phases.contains(PhaseType.MAIN1)) { - return true; - } + return phases.isEmpty() || phases.contains(PhaseType.MAIN1); } return false; diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 6d1913363d1..de96bebf9b6 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-core diff --git a/forge-core/src/main/java/forge/CardStorageReader.java b/forge-core/src/main/java/forge/CardStorageReader.java index 92b30bce7ac..257305926d6 100644 --- a/forge-core/src/main/java/forge/CardStorageReader.java +++ b/forge-core/src/main/java/forge/CardStorageReader.java @@ -64,7 +64,7 @@ public class CardStorageReader { void report(int current, int total); // does nothing, used when they pass null instead of an instance - public final static ProgressObserver emptyObserver = new ProgressObserver() { + ProgressObserver emptyObserver = new ProgressObserver() { @Override public void setOperationName(final String name, final boolean usePercents) {} @Override public void report(final int current, final int total) {} }; @@ -175,7 +175,7 @@ public class CardStorageReader { } if (zipEntriesMap == null) { - zipEntriesMap = new HashMap(); + zipEntriesMap = new HashMap<>(); for (ZipEntry entry : getZipEntries()) { zipEntriesMap.put(entry.getName(), entry); } @@ -256,7 +256,7 @@ public class CardStorageReader { return result; } - final List allFiles = collectCardFiles(new ArrayList(), this.cardsfolder); + final List allFiles = collectCardFiles(new ArrayList<>(), this.cardsfolder); if (!allFiles.isEmpty()) { int fileParts = zip == null ? NUMBER_OF_PARTS : 1 + NUMBER_OF_PARTS / 3; if (allFiles.size() < fileParts * 100) { diff --git a/forge-core/src/main/java/forge/FTrace.java b/forge-core/src/main/java/forge/FTrace.java index 06533b8365d..66da87c881a 100644 --- a/forge-core/src/main/java/forge/FTrace.java +++ b/forge-core/src/main/java/forge/FTrace.java @@ -8,7 +8,7 @@ import java.util.Map; public class FTrace { private static long appStartTime; - private static Map traces = new HashMap(); + private static Map traces = new HashMap<>(); public static void initialize() { appStartTime = new Date().getTime(); diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java index bd2c20ed0b5..3e5192ba642 100644 --- a/forge-core/src/main/java/forge/ImageKeys.java +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -123,7 +123,7 @@ public final class ImageKeys { int index = filename.lastIndexOf('_'); if (index != -1) { String setlessFilename = filename.substring(0, index); - String setCode = filename.substring(index + 1, filename.length()); + String setCode = filename.substring(index + 1); // try with upper case set file = findFile(dir, setlessFilename + "_" + setCode.toUpperCase()); if (file != null) { return file; } diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 7ff30567465..d9d02dcc78b 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -110,7 +110,7 @@ public class StaticData { private List sortedEditions; public final List getSortedEditions() { if (sortedEditions == null) { - sortedEditions = new ArrayList(); + sortedEditions = new ArrayList<>(); for (CardEdition set : editions) { sortedEditions.add(set); } diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 0c4071e4cf4..79776618bed 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -41,16 +41,16 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { public final static char NameSetSeparator = '|'; // need this to obtain cardReference by name+set+artindex - private final ListMultimap allCardsByName = Multimaps.newListMultimap(new TreeMap>(String.CASE_INSENSITIVE_ORDER), CollectionSuppliers.arrayLists()); + private final ListMultimap allCardsByName = Multimaps.newListMultimap(new TreeMap<>(String.CASE_INSENSITIVE_ORDER), CollectionSuppliers.arrayLists()); private final Map uniqueCardsByName = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); private final Map rulesByName; private final Map facesByName = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); - private static Map artPrefs = new HashMap(); + private static Map artPrefs = new HashMap<>(); private final Map alternateName = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER); - private final Map artIds = new HashMap(); + private final Map artIds = new HashMap<>(); - private final List allCards = new ArrayList(); + private final List allCards = new ArrayList<>(); private final List roAllCards = Collections.unmodifiableList(allCards); private final CardEdition.Collection editions; @@ -62,7 +62,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { Random(false); final boolean filterSets; - private SetPreference(boolean filterIrregularSets) { + SetPreference(boolean filterIrregularSets) { filterSets = filterIrregularSets; } @@ -166,8 +166,8 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } public void initialize(boolean logMissingPerEdition, boolean logMissingSummary) { - Set allMissingCards = new LinkedHashSet(); - List missingCards = new ArrayList(); + Set allMissingCards = new LinkedHashSet<>(); + List missingCards = new ArrayList<>(); CardEdition upcomingSet = null; Date today = new Date(); @@ -342,10 +342,10 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (request.artIndex <= 0) { // this stands for 'random art' Collection candidates; if (reqEdition == null) { - candidates = new ArrayList(cards); + candidates = new ArrayList<>(cards); } else { - candidates = new ArrayList(); + candidates = new ArrayList<>(); for (PaperCard pc : cards) { if (pc.getEdition().equalsIgnoreCase(reqEdition)) { candidates.add(pc); @@ -452,7 +452,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { firstWithoutImage = pc; //ensure first without image returns if none have image } if (cardsListReadOnly) { //ensure we don't modify a cached collection - cards = new ArrayList(cards); + cards = new ArrayList<>(cards); cardsListReadOnly = false; } cards.remove(randomIndex); //remove card from collection and try another random card @@ -686,7 +686,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { result = rulesByName.put(cardName, rules); // 1. generate all paper cards from edition data we have (either explicit, or found in res/editions, or add to unknown edition) - List paperCards = new ArrayList(); + List paperCards = new ArrayList<>(); if (null == whenItWasPrinted || whenItWasPrinted.isEmpty()) { for (CardEdition e : editions.getOrderedEditions()) { int artIdx = 1; diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 86653eb178b..b9b88687d97 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -189,7 +189,7 @@ public final class CardEdition implements Comparable { // immutable public String getBoosterMustContain() { return boosterMustContain; } public CardInSet[] getCards() { return cards; } - public Map getTokens() { return tokenNormalized; }; + public Map getTokens() { return tokenNormalized; } public static final Function FN_GET_CODE = new Function() { @Override diff --git a/forge-core/src/main/java/forge/card/CardFace.java b/forge-core/src/main/java/forge/card/CardFace.java index 001f2eff18d..26afc2c06c7 100644 --- a/forge-core/src/main/java/forge/card/CardFace.java +++ b/forge-core/src/main/java/forge/card/CardFace.java @@ -20,12 +20,12 @@ final class CardFace implements ICardFace { public enum FaceSelectionMethod { // USE_ACTIVE_FACE, USE_PRIMARY_FACE, - COMBINE; + COMBINE } - private final static List emptyList = Collections.unmodifiableList(new ArrayList()); - private final static Map emptyMap = Collections.unmodifiableMap(new TreeMap()); + private final static List emptyList = Collections.unmodifiableList(new ArrayList<>()); + private final static Map emptyMap = Collections.unmodifiableMap(new TreeMap<>()); private final String name; private String altName = null; @@ -87,7 +87,7 @@ final class CardFace implements ICardFace { void setInitialLoyalty(String value) { this.initialLoyalty = value; } void setPtText(String value) { - final String k[] = value.split("/"); + final String[] k = value.split("/"); if (k.length != 2) { throw new RuntimeException("Creature '" + this.getName() + "' has bad p/t stats"); @@ -112,12 +112,12 @@ final class CardFace implements ICardFace { // Raw fields used for Card creation void setNonAbilityText(String value) { this.nonAbilityText = value; } - void addKeyword(String value) { if (null == this.keywords) { this.keywords = new ArrayList(); } this.keywords.add(value); } - void addAbility(String value) { if (null == this.abilities) { this.abilities = new ArrayList(); } this.abilities.add(value);} - void addTrigger(String value) { if (null == this.triggers) { this.triggers = new ArrayList(); } this.triggers.add(value);} - void addStaticAbility(String value) { if (null == this.staticAbilities) { this.staticAbilities = new ArrayList(); } this.staticAbilities.add(value);} - void addReplacementEffect(String value) { if (null == this.replacements) { this.replacements = new ArrayList(); } this.replacements.add(value);} - void addSVar(String key, String value) { if (null == this.variables) { this.variables = new TreeMap(String.CASE_INSENSITIVE_ORDER); } this.variables.put(key, value); } + void addKeyword(String value) { if (null == this.keywords) { this.keywords = new ArrayList<>(); } this.keywords.add(value); } + void addAbility(String value) { if (null == this.abilities) { this.abilities = new ArrayList<>(); } this.abilities.add(value);} + void addTrigger(String value) { if (null == this.triggers) { this.triggers = new ArrayList<>(); } this.triggers.add(value);} + void addStaticAbility(String value) { if (null == this.staticAbilities) { this.staticAbilities = new ArrayList<>(); } this.staticAbilities.add(value);} + void addReplacementEffect(String value) { if (null == this.replacements) { this.replacements = new ArrayList<>(); } this.replacements.add(value);} + void addSVar(String key, String value) { if (null == this.variables) { this.variables = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); } this.variables.put(key, value); } void assignMissingFields() { // Most scripts do not specify color explicitly diff --git a/forge-core/src/main/java/forge/card/CardFacePredicates.java b/forge-core/src/main/java/forge/card/CardFacePredicates.java index ee83dda3787..e2b4d2a5815 100644 --- a/forge-core/src/main/java/forge/card/CardFacePredicates.java +++ b/forge-core/src/main/java/forge/card/CardFacePredicates.java @@ -85,7 +85,7 @@ public final class CardFacePredicates { @Override public boolean apply(ICardFace input) { - String k[] = valid.split("\\.", 2); + String[] k = valid.split("\\.", 2); if ("Card".equals(k[0])) { // okay @@ -110,10 +110,7 @@ public final class CardFacePredicates { static protected boolean hasProperty(ICardFace input, final String v) { if (v.startsWith("non")) { return !hasProperty(input, v.substring(3)); - } else if (!input.getType().hasStringType(v)) { - return false; - } - return true; + } else return input.getType().hasStringType(v); } } diff --git a/forge-core/src/main/java/forge/card/CardRarity.java b/forge-core/src/main/java/forge/card/CardRarity.java index 7ed13dda93c..b6f1f898067 100644 --- a/forge-core/src/main/java/forge/card/CardRarity.java +++ b/forge-core/src/main/java/forge/card/CardRarity.java @@ -35,7 +35,7 @@ public enum CardRarity { private final String shortName, longName; - private CardRarity(final String shortName0, final String longName0) { + CardRarity(final String shortName0, final String longName0) { shortName = shortName0; longName = longName0; } diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index e6b200b1a94..6679b3ad673 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -435,10 +435,10 @@ public final class CardRulesPredicates { return this.op(card.getManaCost().getGenericCost(), this.operand); case POWER: value = card.getIntPower(); - return value != Integer.MAX_VALUE ? this.op(value, this.operand) : false; + return value != Integer.MAX_VALUE && this.op(value, this.operand); case TOUGHNESS: value = card.getIntToughness(); - return value != Integer.MAX_VALUE ? this.op(value, this.operand) : false; + return value != Integer.MAX_VALUE && this.op(value, this.operand); default: return false; } @@ -627,7 +627,7 @@ public final class CardRulesPredicates { public static final Predicate IS_MONOCOLOR = CardRulesPredicates.hasCntColors((byte) 1); /** The Constant colors. */ - public static final List> COLORS = new ArrayList>(); + public static final List> COLORS = new ArrayList<>(); static { Presets.COLORS.add(Presets.IS_WHITE); Presets.COLORS.add(Presets.IS_BLUE); diff --git a/forge-core/src/main/java/forge/card/CardSplitType.java b/forge-core/src/main/java/forge/card/CardSplitType.java index 38902df9db1..a949ec8b975 100644 --- a/forge-core/src/main/java/forge/card/CardSplitType.java +++ b/forge-core/src/main/java/forge/card/CardSplitType.java @@ -10,7 +10,7 @@ public enum CardSplitType Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit), Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped); - private CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) { + CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) { method = calcMode; this.changedStateName = stateName; } diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java index ebc12e29266..21cd142f63a 100644 --- a/forge-core/src/main/java/forge/card/CardType.java +++ b/forge-core/src/main/java/forge/card/CardType.java @@ -73,7 +73,7 @@ public final class CardType implements Comparable, CardTypeView { public final boolean isPermanent; private static final ImmutableList allCoreTypeNames = EnumUtil.getNames(CoreType.class); - private CoreType(final boolean permanent) { + CoreType(final boolean permanent) { isPermanent = permanent; } } diff --git a/forge-core/src/main/java/forge/card/ColorSet.java b/forge-core/src/main/java/forge/card/ColorSet.java index c3b34c5cdd8..0384ff5a481 100644 --- a/forge-core/src/main/java/forge/card/ColorSet.java +++ b/forge-core/src/main/java/forge/card/ColorSet.java @@ -320,7 +320,7 @@ public final class ColorSet implements Comparable, Iterable, Ser if (isColorless()) { return EnumSet.of(Color.COLORLESS); } - List list = new ArrayList(); + List list = new ArrayList<>(); for (Color c : Color.values()) { if (hasAnyColor(c.getColormask())) { list.add(c); diff --git a/forge-core/src/main/java/forge/card/ICardFace.java b/forge-core/src/main/java/forge/card/ICardFace.java index 4953f3ddf0e..d73578d6242 100644 --- a/forge-core/src/main/java/forge/card/ICardFace.java +++ b/forge-core/src/main/java/forge/card/ICardFace.java @@ -5,5 +5,5 @@ package forge.card; * */ public interface ICardFace extends ICardCharacteristics, ICardRawAbilites, Comparable { - public String getAltName(); + String getAltName(); } diff --git a/forge-core/src/main/java/forge/card/MagicColor.java b/forge-core/src/main/java/forge/card/MagicColor.java index bf0b4fdbb9f..c21dedeac97 100644 --- a/forge-core/src/main/java/forge/card/MagicColor.java +++ b/forge-core/src/main/java/forge/card/MagicColor.java @@ -168,7 +168,7 @@ public final class MagicColor { private final String name, symbol; private final byte colormask; - private Color(String name0, byte colormask0, String symbol0) { + Color(String name0, byte colormask0, String symbol0) { name = name0; colormask = colormask0; symbol = symbol0; diff --git a/forge-core/src/main/java/forge/card/PrintSheet.java b/forge-core/src/main/java/forge/card/PrintSheet.java index 3aa29ad2527..7c5c22461fa 100644 --- a/forge-core/src/main/java/forge/card/PrintSheet.java +++ b/forge-core/src/main/java/forge/card/PrintSheet.java @@ -96,7 +96,7 @@ public class PrintSheet { number -= uniqueCards; } - List uniques = wantUnique ? new ArrayList() : null; + List uniques = wantUnique ? new ArrayList<>() : null; for(int iC = 0; iC < number; iC++) { int index = MyRandom.getRandom().nextInt(totalWeight); PaperCard toAdd = fetchRoulette(0, index, wantUnique ? uniques : null); diff --git a/forge-core/src/main/java/forge/card/mana/ManaAtom.java b/forge-core/src/main/java/forge/card/mana/ManaAtom.java index 5a38b3a3310..951f7fbf776 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaAtom.java +++ b/forge-core/src/main/java/forge/card/mana/ManaAtom.java @@ -44,7 +44,7 @@ public abstract class ManaAtom { if (s.length() == 2) { //if name is two characters, check for combination of two colors return (byte)(fromName(s.charAt(0)) | fromName(s.charAt(1))); } else if (s.length() == 1) { - return (byte) fromName(s.charAt(0)); + return fromName(s.charAt(0)); } s = s.toLowerCase(); diff --git a/forge-core/src/main/java/forge/card/mana/ManaCost.java b/forge-core/src/main/java/forge/card/mana/ManaCost.java index a2393429897..51611a48d18 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCost.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCost.java @@ -69,7 +69,7 @@ public final class ManaCost implements Comparable, IterablenewArrayList()); + sealClass(Lists.newArrayList()); } private ManaCost(int cmc, List shards0) { @@ -114,7 +114,7 @@ public final class ManaCost implements Comparable, Iterable 0) { - sb.append("{" + this.genericCost + "}"); + sb.append("{").append(this.genericCost).append("}"); } for (final ManaCostShard s : this.shards) { if (s == ManaCostShard.X) { @@ -251,7 +251,7 @@ public final class ManaCost implements Comparable, Iterable { public String toCardList(String separator) { List> main2sort = Lists.newArrayList(this); - Collections.sort(main2sort, ItemPoolSorter.BY_NAME_THEN_SET); + main2sort.sort(ItemPoolSorter.BY_NAME_THEN_SET); final CardDb commonDb = StaticData.instance().getCommonCards(); StringBuilder sb = new StringBuilder(); diff --git a/forge-core/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java index 3dee5c15371..9e8921d78b6 100644 --- a/forge-core/src/main/java/forge/deck/Deck.java +++ b/forge-core/src/main/java/forge/deck/Deck.java @@ -39,8 +39,8 @@ import java.util.Map.Entry; */ @SuppressWarnings("serial") public class Deck extends DeckBase implements Iterable> { - private final Map parts = new EnumMap(DeckSection.class); - private final Set tags = new TreeSet(String.CASE_INSENSITIVE_ORDER); + private final Map parts = new EnumMap<>(DeckSection.class); + private final Set tags = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); // Supports deferring loading a deck until we actually need its contents. This works in conjunction with // the lazy card load feature to ensure we don't need to load all cards on start up. private Map> deferredSections; @@ -123,7 +123,7 @@ public class Deck extends DeckBase implements Iterable 1) { //sort by type so signature spell comes after oathbreaker - Collections.sort(result, new Comparator() { + result.sort(new Comparator() { @Override public int compare(final PaperCard c1, final PaperCard c2) { return Boolean.compare(c1.getRules().canBeSignatureSpell(), c2.getRules().canBeSignatureSpell()); diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 5d9f651828b..99bc2613fad 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -85,10 +85,7 @@ public enum DeckFormat { if (otherPart != null && otherPart.getManaCost().getCMC() > 3) { return false; //only cards with CMC less than 3 are allowed } - if (bannedCards.contains(rules.getName())) { - return false; - } - return true; + return !bannedCards.contains(rules.getName()); } }) { private final Set bannedCommanders = ImmutableSet.of("Derevi, Empyrial Tactician", "Erayo, Soratami Ascendant", "Rofellos, Llanowar Emissary"); @@ -120,7 +117,7 @@ public enum DeckFormat { private final static String ADVPROCLAMATION = "Advantageous Proclamation"; private final static String SOVREALM = "Sovereign's Realm"; - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0, Predicate paperCardPoolFilter0) { + DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0, Predicate paperCardPoolFilter0) { mainRange = mainRange0; sideRange = sideRange0; maxCardCopies = maxCardCopies0; @@ -128,7 +125,7 @@ public enum DeckFormat { paperCardPoolFilter = paperCardPoolFilter0; } - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0) { + DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0) { mainRange = mainRange0; sideRange = sideRange0; maxCardCopies = maxCardCopies0; @@ -136,7 +133,7 @@ public enum DeckFormat { cardPoolFilter = cardPoolFilter0; } - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0) { + DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0) { mainRange = mainRange0; sideRange = sideRange0; maxCardCopies = maxCardCopies0; @@ -266,7 +263,7 @@ public enum DeckFormat { } } - final List erroneousCI = new ArrayList(); + final List erroneousCI = new ArrayList<>(); Set basicLandNames = new HashSet<>(); for (final Entry cp : deck.get(DeckSection.Main)) { @@ -309,7 +306,7 @@ public enum DeckFormat { } if (cardPoolFilter != null) { - final List erroneousCI = new ArrayList(); + final List erroneousCI = new ArrayList<>(); for (final Entry cp : deck.getAllCardsInASinglePool()) { if (!cardPoolFilter.apply(cp.getKey().getRules())) { erroneousCI.add(cp.getKey()); diff --git a/forge-core/src/main/java/forge/deck/DeckGroup.java b/forge-core/src/main/java/forge/deck/DeckGroup.java index 1a48f019d25..53f22b74d2d 100644 --- a/forge-core/src/main/java/forge/deck/DeckGroup.java +++ b/forge-core/src/main/java/forge/deck/DeckGroup.java @@ -37,7 +37,7 @@ public class DeckGroup extends DeckBase { private static final long serialVersionUID = -1628725522049635829L; private Deck humanDeck; - private List aiDecks = new ArrayList(); + private List aiDecks = new ArrayList<>(); /** * Gets the human deck. @@ -79,7 +79,7 @@ public class DeckGroup extends DeckBase { if (aiDecks.size() < 2) { return; } - Collections.sort(aiDecks, comparator); + aiDecks.sort(comparator); } @Override @@ -119,9 +119,7 @@ public class DeckGroup extends DeckBase { * @param computer the computer */ public void addAiDecks(final Deck[] computer) { - for (final Deck element : computer) { - aiDecks.add(element); - } + aiDecks.addAll(Arrays.asList(computer)); } /* diff --git a/forge-core/src/main/java/forge/deck/DeckSection.java b/forge-core/src/main/java/forge/deck/DeckSection.java index 90d2b91d17e..59516041ad0 100644 --- a/forge-core/src/main/java/forge/deck/DeckSection.java +++ b/forge-core/src/main/java/forge/deck/DeckSection.java @@ -10,7 +10,7 @@ public enum DeckSection { Conspiracy(0); private final int typicalSize; // Rules enforcement is done in DeckFormat class, this is for reference only - private DeckSection(int commonSize) { + DeckSection(int commonSize) { typicalSize = commonSize; } diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java index b319452123b..870c6472107 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java @@ -11,7 +11,7 @@ import forge.item.IPaperCard; import forge.item.PaperCard; public class DeckGenPool implements IDeckGenPool { - private final Map cards = new HashMap(); + private final Map cards = new HashMap<>(); public DeckGenPool() { } diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java index d3f0a844019..ec0b0c270ba 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java @@ -51,7 +51,7 @@ import java.util.regex.Pattern; */ public abstract class DeckGeneratorBase { protected final DebugTrace trace = new DebugTrace(); - protected final Map cardCounts = new HashMap(); + protected final Map cardCounts = new HashMap<>(); protected int maxDuplicates = 4; protected boolean useArtifacts = true; protected String basicLandEdition = null; @@ -142,7 +142,7 @@ public abstract class DeckGeneratorBase { if(basicLandEdition == null){ if(setBasicLandPool(cp.getEdition())){ basicLandEdition = cp.getEdition(); - }; + } } cardCounts.put(cp.getName(), newCount); trace.append(String.format("(%d) %s [%s]%n", cp.getRules().getManaCost().getCMC(), cp.getName(), cp.getRules().getManaCost())); @@ -299,7 +299,7 @@ public abstract class DeckGeneratorBase { protected static Map countLands(ItemPool outList) { // attempt to optimize basic land counts according // to color representation - Map res = new TreeMap(); + Map res = new TreeMap<>(); // count each card color using mana costs // TODO: count hybrid mana differently? for (Entry cpe : outList) { @@ -418,7 +418,7 @@ public abstract class DeckGeneratorBase { } public List regexLandSearch(String pattern, Iterable landCards){ - final List dLands = new ArrayList(); + final List dLands = new ArrayList<>(); Pattern p = Pattern.compile(pattern); for (PaperCard card:landCards){ if (card.getRules().getAiHints().getRemAIDecks()) { diff --git a/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java b/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java index 65a074e1cb7..43a7ffbd4a6 100644 --- a/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java +++ b/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java @@ -74,7 +74,7 @@ public class DeckFileHeader { this.deckType = DeckFormat.smartValueOf(kvPairs.get(DeckFileHeader.DECK_TYPE), DeckFormat.Constructed); this.customPool = kvPairs.getBoolean(DeckFileHeader.CSTM_POOL); this.intendedForAi = "computer".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER)) || "ai".equalsIgnoreCase(kvPairs.get(DeckFileHeader.PLAYER_TYPE)); - this.tags = new TreeSet(); + this.tags = new TreeSet<>(); String rawTags = kvPairs.get(DeckFileHeader.TAGS); if( StringUtils.isNotBlank(rawTags) ) { diff --git a/forge-core/src/main/java/forge/deck/io/DeckSerializer.java b/forge-core/src/main/java/forge/deck/io/DeckSerializer.java index 1b50211c8cf..8b59c4e8dd2 100644 --- a/forge-core/src/main/java/forge/deck/io/DeckSerializer.java +++ b/forge-core/src/main/java/forge/deck/io/DeckSerializer.java @@ -41,7 +41,7 @@ public class DeckSerializer { } private static List serializeDeck(Deck d) { - final List out = new ArrayList(); + final List out = new ArrayList<>(); out.add(TextUtil.enclosedBracket("metadata")); out.add(TextUtil.concatNoSpace(DeckFileHeader.NAME,"=", d.getName().replaceAll("\n", ""))); diff --git a/forge-core/src/main/java/forge/item/BoosterBox.java b/forge-core/src/main/java/forge/item/BoosterBox.java index b26824e498e..8b3c5e93f51 100644 --- a/forge-core/src/main/java/forge/item/BoosterBox.java +++ b/forge-core/src/main/java/forge/item/BoosterBox.java @@ -93,7 +93,7 @@ public class BoosterBox extends BoxedProduct { final String[] data = TextUtil.splitWithParenthesis(headAndData[1], ','); int nBoosters = 6; - List> slots = new ArrayList>(); + List> slots = new ArrayList<>(); for(String slotDesc : data) { String[] kv = TextUtil.split(slotDesc, ' ', 2); if (kv[1].startsWith("Booster")) diff --git a/forge-core/src/main/java/forge/item/BoxedProduct.java b/forge-core/src/main/java/forge/item/BoxedProduct.java index a73ee07f1e1..6bfdc48b438 100644 --- a/forge-core/src/main/java/forge/item/BoxedProduct.java +++ b/forge-core/src/main/java/forge/item/BoxedProduct.java @@ -44,7 +44,7 @@ public abstract class BoxedProduct extends SealedProduct { } public List getExtraCards() { - return new ArrayList(); + return new ArrayList<>(); } @Override diff --git a/forge-core/src/main/java/forge/item/FatPack.java b/forge-core/src/main/java/forge/item/FatPack.java index c45414c17bd..b57870b93a3 100644 --- a/forge-core/src/main/java/forge/item/FatPack.java +++ b/forge-core/src/main/java/forge/item/FatPack.java @@ -111,7 +111,7 @@ public class FatPack extends BoxedProduct { final String[] data = TextUtil.splitWithParenthesis(headAndData[1], ','); int nBoosters = 6; - List> slots = new ArrayList>(); + List> slots = new ArrayList<>(); for(String slotDesc : data) { String[] kv = TextUtil.split(slotDesc, ' ', 2); if (kv[1].startsWith("Booster")) diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index be80957515c..4200b240e4d 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -238,13 +238,11 @@ public final class PaperCard implements Comparable, InventoryItemFro // Return true if card is one of the five basic lands that can be added for free public boolean isVeryBasicLand() { - if ((this.getName().equals("Swamp")) + return (this.getName().equals("Swamp")) || (this.getName().equals("Plains")) || (this.getName().equals("Island")) || (this.getName().equals("Forest")) - || (this.getName().equals("Mountain"))) { - return true; - } else return false; + || (this.getName().equals("Mountain")); } } diff --git a/forge-core/src/main/java/forge/util/Aggregates.java b/forge-core/src/main/java/forge/util/Aggregates.java index fb13b81400c..82fa8206d59 100644 --- a/forge-core/src/main/java/forge/util/Aggregates.java +++ b/forge-core/src/main/java/forge/util/Aggregates.java @@ -124,7 +124,7 @@ public class Aggregates { } public static final List random(final Iterable source, final int count) { - return random(source, count, new ArrayList()); + return random(source, count, new ArrayList<>()); } public static final > L random(final Iterable source, final int count, final L list) { // Using Reservoir Sampling to grab X random values from source @@ -163,7 +163,7 @@ public class Aggregates { } public static final Iterable uniqueByLast(final Iterable source, final Function fnUniqueKey) { // this might be exotic - final Map uniques = new Hashtable(); + final Map uniques = new Hashtable<>(); for (final U c : source) { uniques.put(fnUniqueKey.apply(c), c); } @@ -206,7 +206,7 @@ public class Aggregates { } public static Iterable> groupSumBy(Iterable> source, Function fnGetField) { - Map result = new HashMap(); + Map result = new HashMap<>(); for (Entry kv : source) { U k = fnGetField.apply(kv.getKey()); Integer v = kv.getValue(); diff --git a/forge-core/src/main/java/forge/util/Base64Coder.java b/forge-core/src/main/java/forge/util/Base64Coder.java index c78acff79b9..2a53be0d765 100644 --- a/forge-core/src/main/java/forge/util/Base64Coder.java +++ b/forge-core/src/main/java/forge/util/Base64Coder.java @@ -36,6 +36,7 @@ import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; +import java.nio.charset.StandardCharsets; /** * A Base64 encoder/decoder. @@ -377,7 +378,7 @@ public final class Base64Coder { SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); - return String.valueOf(encode(pbeCipher.doFinal(value.getBytes("UTF-8")))); + return String.valueOf(encode(pbeCipher.doFinal(value.getBytes(StandardCharsets.UTF_8)))); } public static String decrypt(String value) throws Exception { @@ -385,7 +386,7 @@ public final class Base64Coder { SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); - return new String(pbeCipher.doFinal(decode(value)), "UTF-8"); + return new String(pbeCipher.doFinal(decode(value)), StandardCharsets.UTF_8); } // Dummy constructor. diff --git a/forge-core/src/main/java/forge/util/ComparableOp.java b/forge-core/src/main/java/forge/util/ComparableOp.java index ff7fb1030fb..ad295dac98e 100644 --- a/forge-core/src/main/java/forge/util/ComparableOp.java +++ b/forge-core/src/main/java/forge/util/ComparableOp.java @@ -33,7 +33,7 @@ public enum ComparableOp { private final String caption; - private ComparableOp(String caption0) { + ComparableOp(String caption0) { caption = caption0; } diff --git a/forge-core/src/main/java/forge/util/FileSection.java b/forge-core/src/main/java/forge/util/FileSection.java index 1d67b4daeda..53a5f140d06 100644 --- a/forge-core/src/main/java/forge/util/FileSection.java +++ b/forge-core/src/main/java/forge/util/FileSection.java @@ -50,7 +50,7 @@ public class FileSection { * Instantiates a new file section. */ protected FileSection() { - this(new TreeMap(String.CASE_INSENSITIVE_ORDER)); + this(new TreeMap<>(String.CASE_INSENSITIVE_ORDER)); } protected FileSection(Map lines0) { @@ -71,7 +71,7 @@ public class FileSection { } public static Map parseToMap(final String line, final String kvSeparator, final String pairSeparator) { - Map result = new TreeMap(String.CASE_INSENSITIVE_ORDER); + Map result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); if (!StringUtils.isEmpty(line)) { final String[] pairs = line.split(Pattern.quote(pairSeparator)); final Pattern splitter = Pattern.compile(Pattern.quote(kvSeparator)); @@ -211,7 +211,7 @@ public class FileSection { */ @SuppressWarnings("unchecked") public static Map> parseSections(final List source) { - final Map> result = new TreeMap>(String.CASE_INSENSITIVE_ORDER); + final Map> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); String currentSection = ""; List currentList = null; @@ -234,7 +234,7 @@ public class FileSection { currentList = null; } else { if (currentList == null) { - currentList = new ArrayList(); + currentList = new ArrayList<>(); } currentList.add(st); } diff --git a/forge-core/src/main/java/forge/util/FileUtil.java b/forge-core/src/main/java/forge/util/FileUtil.java index 32eda08b4a2..212748744b1 100644 --- a/forge-core/src/main/java/forge/util/FileUtil.java +++ b/forge-core/src/main/java/forge/util/FileUtil.java @@ -196,7 +196,7 @@ public final class FileUtil { public static List readFile(final File file) { try { if ((file == null) || !file.exists()) { - return new ArrayList(); + return new ArrayList<>(); } return FileUtil.readAllLines(new FileReader(file), false); } catch (final Exception ex) { @@ -222,7 +222,7 @@ public final class FileUtil { * @return list of strings */ public static List readAllLines(final Reader reader, final boolean mayTrim) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); try { final BufferedReader in = new BufferedReader(reader); String line; @@ -244,7 +244,7 @@ public final class FileUtil { Pattern lineSplitter = Pattern.compile(Pattern.quote(" ")); Pattern replacer = Pattern.compile(Pattern.quote("%20")); - List> list = new ArrayList>(); + List> list = new ArrayList<>(); for (String line : readFile(nameUrlFile)) { if (StringUtils.isBlank(line) || line.startsWith("#")) { @@ -271,7 +271,7 @@ public final class FileUtil { } public static List readFile(final URL url) { - final List lines = new ArrayList(); + final List lines = new ArrayList<>(); ThreadUtil.executeWithTimeout(new Callable() { @Override public Void call() throws Exception { diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index fff1213d844..4b2e515f8fd 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -10,7 +10,7 @@ import forge.item.PaperCard; public class ImageUtil { public static float getNearestHQSize(float baseSize, float actualSize) { //get nearest power of actualSize to baseSize so that the image renders good - return (float)Math.round(actualSize) * (float)Math.pow(2, (double)Math.round(Math.log((double)(baseSize / actualSize)) / Math.log(2))); + return (float)Math.round(actualSize) * (float)Math.pow(2, (double)Math.round(Math.log(baseSize / actualSize) / Math.log(2))); } public static PaperCard getPaperCardFromImageKey(String key) { @@ -119,7 +119,6 @@ public class ImageUtil { for (int i = 0; i < in.length(); i++) { c = in.charAt(i); if ((c == '"') || (c == '/') || (c == ':') || (c == '?')) { - out.append(""); } else { out.append(c); } diff --git a/forge-core/src/main/java/forge/util/ItemPool.java b/forge-core/src/main/java/forge/util/ItemPool.java index 64ea51fbf2d..ed778df28f9 100644 --- a/forge-core/src/main/java/forge/util/ItemPool.java +++ b/forge-core/src/main/java/forge/util/ItemPool.java @@ -60,12 +60,12 @@ public class ItemPool implements Iterable cls) { - this(new LinkedHashMap(), cls); + this(new LinkedHashMap<>(), cls); } @SuppressWarnings("unchecked") public static ItemPool createFrom(final ItemPool from, final Class clsHint) { - final ItemPool result = new ItemPool(clsHint); + final ItemPool result = new ItemPool<>(clsHint); if (from != null) { for (final Entry e : from) { final Tin srcKey = e.getKey(); @@ -79,7 +79,7 @@ public class ItemPool implements Iterable ItemPool createFrom(final Iterable from, final Class clsHint) { - final ItemPool result = new ItemPool(clsHint); + final ItemPool result = new ItemPool<>(clsHint); if (from != null) { for (final Tin srcKey : from) { if (clsHint.isInstance(srcKey)) { @@ -95,7 +95,7 @@ public class ItemPool implements Iterable(); //prevent items being null + items = new HashMap<>(); //prevent items being null } myClass = cls; } @@ -161,7 +161,7 @@ public class ItemPool implements Iterable toFlatList() { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final Entry e : this) { for (int i = 0; i < e.getValue(); i++) { result.add(e.getKey()); @@ -171,7 +171,7 @@ public class ItemPool implements Iterable toNameLookup() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); for (final Entry e : this) { result.put(e.getKey().getName(), e.getValue()); } @@ -183,7 +183,7 @@ public class ItemPool implements Iterable getView() { - return new ItemPool(Collections.unmodifiableMap(items), getMyClass()); + return new ItemPool<>(Collections.unmodifiableMap(items), getMyClass()); } public void add(final T item) { diff --git a/forge-core/src/main/java/forge/util/ItemPoolSorter.java b/forge-core/src/main/java/forge/util/ItemPoolSorter.java index 1010abdb655..0b44e775a38 100644 --- a/forge-core/src/main/java/forge/util/ItemPoolSorter.java +++ b/forge-core/src/main/java/forge/util/ItemPoolSorter.java @@ -56,7 +56,7 @@ public class ItemPoolSorter implements Comparator> { } /** The Constant byNameThenSet. */ - public static final ItemPoolSorter BY_NAME_THEN_SET = new ItemPoolSorter( + public static final ItemPoolSorter BY_NAME_THEN_SET = new ItemPoolSorter<>( new Function, Comparable>() { @Override public Comparable apply(final Entry from) { diff --git a/forge-core/src/main/java/forge/util/Lang.java b/forge-core/src/main/java/forge/util/Lang.java index 216bfee2664..531f7237314 100644 --- a/forge-core/src/main/java/forge/util/Lang.java +++ b/forge-core/src/main/java/forge/util/Lang.java @@ -102,7 +102,7 @@ public final class Lang { strCount = startsWithVowel(noun) ? "an " : "a "; } else { - strCount = String.valueOf(cnt) + " "; + strCount = cnt + " "; } return strCount + countedForm; } diff --git a/forge-core/src/main/java/forge/util/LocalizationChangeObserver.java b/forge-core/src/main/java/forge/util/LocalizationChangeObserver.java index 88887508309..559a2191424 100644 --- a/forge-core/src/main/java/forge/util/LocalizationChangeObserver.java +++ b/forge-core/src/main/java/forge/util/LocalizationChangeObserver.java @@ -1,5 +1,5 @@ package forge.util; public interface LocalizationChangeObserver { - public void localizationChanged(); + void localizationChanged(); } diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java index 6569e1a2e91..73076e6b30c 100644 --- a/forge-core/src/main/java/forge/util/Localizer.java +++ b/forge-core/src/main/java/forge/util/Localizer.java @@ -1,10 +1,10 @@ package forge.util; import java.io.File; -import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.charset.StandardCharsets; import java.text.MessageFormat; import java.util.*; @@ -38,7 +38,7 @@ public class Localizer { try { //formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); - formatter = new MessageFormat(resourceBundle.getString(key.toString()), locale); + formatter = new MessageFormat(resourceBundle.getString(key), locale); } catch (final IllegalArgumentException | MissingResourceException e) { e.printStackTrace(); } @@ -51,14 +51,10 @@ public class Localizer { formatter.setLocale(locale); String formattedMessage = "CHAR ENCODING ERROR"; - try { - //Support non-English-standard characters - formattedMessage = new String(formatter.format(messageArguments).getBytes("ISO-8859-1"), "UTF-8"); - } catch (final UnsupportedEncodingException e) { - e.printStackTrace(); - } - - return formattedMessage; + //Support non-English-standard characters + formattedMessage = new String(formatter.format(messageArguments).getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + + return formattedMessage; } diff --git a/forge-core/src/main/java/forge/util/NameGenerator.java b/forge-core/src/main/java/forge/util/NameGenerator.java index 6e7512ed844..625bbbc669d 100644 --- a/forge-core/src/main/java/forge/util/NameGenerator.java +++ b/forge-core/src/main/java/forge/util/NameGenerator.java @@ -195,7 +195,7 @@ public final class NameGenerator { "Coreshaker", "Forgewulf", "Sheepspear", "Elvenworm", "Lipswalker", "Sealight", "the Rotten" }; - private static List usedMonikers = new ArrayList(); + private static List usedMonikers = new ArrayList<>(); private static List usedNames; private static String[] sourceList; @@ -239,8 +239,8 @@ public final class NameGenerator { break; default: - List all = new ArrayList( - genericMales.length + fantasyMales.length + genericFemales.length + fantasyFemales.length); + List all = new ArrayList<>( + genericMales.length + fantasyMales.length + genericFemales.length + fantasyFemales.length); Collections.addAll(all, genericMales); Collections.addAll(all, fantasyMales); Collections.addAll(all, genericFemales); @@ -272,7 +272,7 @@ public final class NameGenerator { /** Generates a specified number of random names. */ public static List getRandomNames(final int generateAmount, final List excludeNames) { usedNames = excludeNames; - final List names = new ArrayList(generateAmount); + final List names = new ArrayList<>(generateAmount); for (int i = 0; i < generateAmount; i++) { getRandomName("Any", "Any", usedNames); } @@ -281,7 +281,7 @@ public final class NameGenerator { /** Generates a single name that doesn't match any names in the supplied list. */ public static String getRandomName(final String gender, final String type, final String notNamed) { - List exclude = new ArrayList(1); + List exclude = new ArrayList<>(1); exclude.add(notNamed); return getRandomName(gender, type, exclude); } diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java index badf6d2533a..4974a8e087f 100644 --- a/forge-core/src/main/java/forge/util/TextUtil.java +++ b/forge-core/src/main/java/forge/util/TextUtil.java @@ -38,7 +38,7 @@ public class TextUtil { } else { mapAsString.append("; "); } - mapAsString.append(p.getKey() + " => " + (p.getValue() == null ? "(null)" : p.getValue().toString())); + mapAsString.append(p.getKey()).append(" => ").append(p.getValue() == null ? "(null)" : p.getValue().toString()); } return mapAsString.toString(); } @@ -71,7 +71,7 @@ public class TextUtil { * It's faster than String.split, and allows parenthesis */ public static String[] splitWithParenthesis(CharSequence input, char delimiter, int maxEntries, char openPar, char closePar, boolean skipEmpty) { - List result = new ArrayList(); + List result = new ArrayList<>(); // Assume that when equal non-zero parenthesis are passed, they need to be discarded boolean trimParenthesis = openPar == closePar && openPar > 0; int nPar = 0; diff --git a/forge-core/src/main/java/forge/util/collect/FCollection.java b/forge-core/src/main/java/forge/util/collect/FCollection.java index ac523f54560..4599035c795 100644 --- a/forge-core/src/main/java/forge/util/collect/FCollection.java +++ b/forge-core/src/main/java/forge/util/collect/FCollection.java @@ -9,15 +9,7 @@ import com.google.common.collect.Sets; import org.apache.commons.lang3.ArrayUtils; import java.io.Serializable; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; -import java.util.Set; +import java.util.*; /** * Collection with unique elements ({@link Set}) that maintains the order in @@ -31,7 +23,7 @@ import java.util.Set; public class FCollection implements List, /*Set,*/ FCollectionView, Cloneable, Serializable { private static final long serialVersionUID = -1664555336364294106L; - private static final FCollection EMPTY = new EmptyFCollection(); + private static final FCollection EMPTY = new EmptyFCollection<>(); @SuppressWarnings("unchecked") public static FCollection getEmpty() { @@ -73,9 +65,7 @@ public class FCollection implements List, /*Set,*/ FCollectionView, * creation. */ public FCollection(final T[] c) { - for (final T e : c) { - add(e); - } + this.addAll(Arrays.asList(c)); } /** @@ -87,9 +77,7 @@ public class FCollection implements List, /*Set,*/ FCollectionView, * creation. */ public FCollection(final Iterable i) { - for (final T e : i) { - add(e); - } + this.addAll(i); } /** @@ -518,7 +506,7 @@ public class FCollection implements List, /*Set,*/ FCollectionView, * {@inheritDoc} */ public void sort(final Comparator comparator) { - Collections.sort(list, comparator); + list.sort(comparator); } /** @@ -527,7 +515,7 @@ public class FCollection implements List, /*Set,*/ FCollectionView, @Override public Iterable threadSafeIterable() { //create a new linked list for iterating to make it thread safe and avoid concurrent modification exceptions - return Iterables.unmodifiableIterable(new LinkedList(list)); + return Iterables.unmodifiableIterable(new LinkedList<>(list)); } @Override diff --git a/forge-core/src/main/java/forge/util/maps/LinkedHashMapToAmount.java b/forge-core/src/main/java/forge/util/maps/LinkedHashMapToAmount.java index 360707b5236..d26165ecda1 100644 --- a/forge-core/src/main/java/forge/util/maps/LinkedHashMapToAmount.java +++ b/forge-core/src/main/java/forge/util/maps/LinkedHashMapToAmount.java @@ -6,7 +6,7 @@ public class LinkedHashMapToAmount extends LinkedHashMap implemen private static final long serialVersionUID = 1438913784333297606L; public static LinkedHashMapToAmount emptyMap() { - return new LinkedHashMapToAmount(0); + return new LinkedHashMapToAmount<>(0); } /** diff --git a/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java b/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java index de1e68f9ae5..a0434aeab79 100644 --- a/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java +++ b/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java @@ -59,11 +59,11 @@ public final class MapToAmountUtil { throw new NullPointerException(); } if (map.isEmpty()) { - return new FCollection(); + return new FCollection<>(); } final int max = Collections.max(map.values()); - final FCollection set = new FCollection(); + final FCollection set = new FCollection<>(); for (final Entry entry : map.entrySet()) { if (entry.getValue().intValue() == max) { set.add(entry.getKey()); @@ -114,11 +114,11 @@ public final class MapToAmountUtil { throw new NullPointerException(); } if (map.isEmpty()) { - return new FCollection(); + return new FCollection<>(); } final int min = Collections.min(map.values()); - final FCollection set = new FCollection(); + final FCollection set = new FCollection<>(); for (final Entry entry : map.entrySet()) { if (entry.getValue().intValue() == min) { set.add(entry.getKey()); @@ -132,7 +132,7 @@ public final class MapToAmountUtil { for (final Entry entry : map.entrySet()) { entries.add(Pair.of(entry.getKey(), entry.getValue())); } - Collections.sort(entries, new Comparator>() { + entries.sort(new Comparator>() { @Override public int compare(final Entry o1, final Entry o2) { return o1.getValue().compareTo(o2.getValue()); diff --git a/forge-core/src/main/java/forge/util/storage/StorageBase.java b/forge-core/src/main/java/forge/util/storage/StorageBase.java index 5a970878e8d..b3ce9fad954 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageBase.java +++ b/forge-core/src/main/java/forge/util/storage/StorageBase.java @@ -35,7 +35,7 @@ import java.util.*; public class StorageBase implements IStorage { protected final Map map; - public final static StorageBase emptyMap = new StorageBase("Empty", null, new HashMap()); + public final static StorageBase emptyMap = new StorageBase<>("Empty", null, new HashMap<>()); public final String name, fullPath; public StorageBase(final String name0, final IItemReader io) { @@ -55,7 +55,7 @@ public class StorageBase implements IStorage { @Override public final Collection getItemNames() { - return new ArrayList(map.keySet()); + return new ArrayList<>(map.keySet()); } @Override @@ -65,7 +65,7 @@ public class StorageBase implements IStorage { @Override public boolean contains(String name) { - return name == null ? false : map.containsKey(name); + return name != null && map.containsKey(name); } @Override diff --git a/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java b/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java index 52a54c56d5d..e68658cbece 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java +++ b/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java @@ -39,7 +39,7 @@ public class StorageImmediatelySerialized extends StorageBase { private final Function> nestedFactory = new Function>() { @Override public IStorage apply(File file) { - return new StorageImmediatelySerialized(file.getName(), (IItemSerializer) serializer.getReaderForFolder(file), true); + return new StorageImmediatelySerialized<>(file.getName(), (IItemSerializer) serializer.getReaderForFolder(file), true); } }; @@ -57,7 +57,7 @@ public class StorageImmediatelySerialized extends StorageBase { public StorageImmediatelySerialized(String name, final IItemSerializer io, boolean withSubFolders) { super(name, io); this.serializer = io; - subfolders = withSubFolders ? new StorageNestedFolders(io.getDirectory(), io.getSubFolders(), nestedFactory) : null; + subfolders = withSubFolders ? new StorageNestedFolders<>(io.getDirectory(), io.getSubFolders(), nestedFactory) : null; } /* diff --git a/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java b/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java index 269338e77f9..ddd83d49c1d 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java +++ b/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java @@ -9,7 +9,7 @@ public class StorageNestedFolders extends StorageBase> { private final File thisFolder; public StorageNestedFolders(File thisFolder, Iterable subfolders, Function> factory) { - super("", thisFolder.getPath(), new HashMap>()); + super("", thisFolder.getPath(), new HashMap<>()); this.thisFolder = thisFolder; for (File sf : subfolders) { IStorage newUnit = factory.apply(sf); diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java index 01b5f3f735f..61cb21c73a9 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java +++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java @@ -52,7 +52,7 @@ public abstract class StorageReaderFile extends StorageReaderBase { @Override public Map readAll() { - final Map result = new TreeMap(); + final Map result = new TreeMap<>(); int idx = 0; for (String line : FileUtil.readFile(file)) { diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java index eb599f579d5..c3c2773ad9f 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java +++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java @@ -53,7 +53,7 @@ public abstract class StorageReaderFileSections extends StorageReaderBase } protected Map createMap() { - return new TreeMap(); + return new TreeMap<>(); } /* (non-Javadoc) @@ -66,7 +66,7 @@ public abstract class StorageReaderFileSections extends StorageReaderBase int idx = 0; Iterable contents = FileUtil.readFile(file); - List accumulator = new ArrayList(); + List accumulator = new ArrayList<>(); String header = null; for (final String s : contents) { diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java index f7c35bacbbb..2fa2ea9fa63 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java +++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java @@ -75,14 +75,14 @@ public abstract class StorageReaderFolder extends StorageReaderBase { } } - public final List objectsThatFailedToLoad = new ArrayList(); + public final List objectsThatFailedToLoad = new ArrayList<>(); /* (non-Javadoc) * @see forge.util.IItemReader#readAll() */ @Override public Map readAll() { - final Map result = new TreeMap(); + final Map result = new TreeMap<>(); final File[] files = this.directory.listFiles(this.getFileFilter()); for (final File file : files) { diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java b/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java index fba09b57f74..5b81bfa5f2b 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java +++ b/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java @@ -77,14 +77,14 @@ public abstract class StorageReaderRecursiveFolderWithUserFolder extends Stor } } - public final List objectsThatFailedToLoad = new ArrayList(); + public final List objectsThatFailedToLoad = new ArrayList<>(); /* (non-Javadoc) * @see forge.util.IItemReader#readAll() */ @Override public Map readAll() { - final Map result = new TreeMap(); + final Map result = new TreeMap<>(); Collection forgeFormats = listFileTree(directory); Collection customFormats = listFileTree(userDirectory); @@ -115,7 +115,7 @@ public abstract class StorageReaderRecursiveFolderWithUserFolder extends Stor } private Collection listFileTree(File dir) { - Set fileTree = new HashSet(); + Set fileTree = new HashSet<>(); if(dir==null||dir.listFiles(getFileFilter())==null){ return fileTree; } diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 898e378a0a9..ee375af6f5b 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-game diff --git a/forge-game/src/main/java/forge/GameCommand.java b/forge-game/src/main/java/forge/GameCommand.java index f0d96122ffe..e67dc9560a3 100644 --- a/forge-game/src/main/java/forge/GameCommand.java +++ b/forge-game/src/main/java/forge/GameCommand.java @@ -27,7 +27,7 @@ package forge; */ public interface GameCommand extends java.io.Serializable, Runnable { /** Constant Blank. */ - public final GameCommand BLANK = new GameCommand() { + GameCommand BLANK = new GameCommand() { private static final long serialVersionUID = 2689172297036001710L; diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index aacc1d389e1..a56db98f6f9 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -1,5 +1,6 @@ package forge.game; +import forge.card.MagicColor; import forge.card.mana.ManaAtom; import forge.game.ability.AbilityUtils; import forge.game.card.Card; @@ -16,6 +17,8 @@ import forge.util.Expressions; import java.util.*; +import org.apache.commons.lang3.StringUtils; + import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; @@ -159,9 +162,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { */ public final boolean isSecondary() { if (this.mapParams.containsKey("Secondary")) { - if (this.mapParams.get("Secondary").equals("True")) { - return true; - } + return this.mapParams.get("Secondary").equals("True"); } return false; } @@ -252,6 +253,16 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { if (params.containsKey("Blessing")) { if ("True".equalsIgnoreCase(params.get("Blessing")) != hostController.hasBlessing()) return false; } + + if (params.containsKey("Adamant")) { + if (hostCard.getCastSA() == null) { + return false; + } + final String payingMana = StringUtils.join(hostCard.getCastSA().getPayingMana()); + if (StringUtils.countMatches(payingMana, MagicColor.toShortString(params.get("Adamant"))) < 3) { + return false; + } + } if (params.containsKey("Presence")) { if (hostCard.getCastFrom() == null || hostCard.getCastSA() == null) @@ -451,9 +462,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { if (params.containsKey("ActivateNoLoyaltyAbilitiesCondition")) { final Player active = game.getPhaseHandler().getPlayerTurn(); - if (active.getActivateLoyaltyAbilityThisTurn()) { - return false; - } + return !active.getActivateLoyaltyAbilityThisTurn(); } return true; } diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index c5db86d46ad..1bf735a42d4 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -29,8 +29,7 @@ public class ForgeScript { int desiredColor = MagicColor.fromName(colorName); boolean hasColor = colors.hasAnyColor(desiredColor); - if (mustHave != hasColor) - return false; + return mustHave == hasColor; } else if (property.contains("Colorless")) { // ... Card is colorless boolean non = property.startsWith("non"); @@ -38,66 +37,48 @@ public class ForgeScript { if (non && withSource && isColorlessSource) { return false; } - if (non == colors.isColorless()) return false; + return non != colors.isColorless(); } else if (property.contains("MultiColor")) { // ... Card is multicolored if (property.endsWith("Source") && isColorlessSource) return false; - if (property.startsWith("non") == colors.isMulticolor()) - return false; + return property.startsWith("non") != colors.isMulticolor(); } else if (property.contains("MonoColor")) { // ... Card is monocolored if (property.endsWith("Source") && isColorlessSource) return false; - if (property.startsWith("non") == colors.isMonoColor()) - return false; + return property.startsWith("non") != colors.isMonoColor(); } else if (property.startsWith("ChosenColor")) { if (property.endsWith("Source") && isColorlessSource) return false; - if (!source.hasChosenColor() || !colors.hasAnyColor(MagicColor.fromName(source.getChosenColor()))) - return false; + return source.hasChosenColor() && colors.hasAnyColor(MagicColor.fromName(source.getChosenColor())); } else if (property.startsWith("AnyChosenColor")) { if (property.endsWith("Source") && isColorlessSource) return false; - if (!source.hasChosenColor() - || !colors.hasAnyColor(ColorSet.fromNames(source.getChosenColors()).getColor())) - return false; + return source.hasChosenColor() + && colors.hasAnyColor(ColorSet.fromNames(source.getChosenColors()).getColor()); } else if (property.startsWith("non")) { // ... Other Card types - if (cardState.getTypeWithChanges().hasStringType(property.substring(3))) { - return false; - } + return !cardState.getTypeWithChanges().hasStringType(property.substring(3)); } else if (property.equals("CostsPhyrexianMana")) { - if (!cardState.getManaCost().hasPhyrexian()) { - return false; - } + return cardState.getManaCost().hasPhyrexian(); } else if (property.startsWith("HasSVar")) { final String svar = property.substring(8); - if (!cardState.hasSVar(svar)) { - return false; - } + return cardState.hasSVar(svar); } else if (property.equals("ChosenType")) { - if (!cardState.getTypeWithChanges().hasStringType(source.getChosenType())) { - return false; - } + return cardState.getTypeWithChanges().hasStringType(source.getChosenType()); } else if (property.equals("IsNotChosenType")) { - if (cardState.getTypeWithChanges().hasStringType(source.getChosenType())) { - return false; - } + return !cardState.getTypeWithChanges().hasStringType(source.getChosenType()); } else if (property.startsWith("HasSubtype")) { final String subType = property.substring(11); - if (!cardState.getTypeWithChanges().hasSubtype(subType)) { - return false; - } + return cardState.getTypeWithChanges().hasSubtype(subType); } else if (property.startsWith("HasNoSubtype")) { final String subType = property.substring(13); - if (cardState.getTypeWithChanges().hasSubtype(subType)) { - return false; - } + return !cardState.getTypeWithChanges().hasSubtype(subType); } else if (property.equals("hasActivatedAbilityWithTapCost")) { for (final SpellAbility sa : cardState.getSpellAbilities()) { if (sa.isAbility() && (sa.getPayCosts() != null) && sa.getPayCosts().hasTapCost()) { @@ -136,80 +117,47 @@ public class ForgeScript { x = AbilityUtils.calculateAmount(source, rhs, spellAbility); } - if (!Expressions.compare(y, property, x)) { - return false; - } - } else if (!cardState.getTypeWithChanges().hasStringType(property)) { - return false; - } - - return true; - + return Expressions.compare(y, property, x); + } else return cardState.getTypeWithChanges().hasStringType(property); + - } public static boolean spellAbilityHasProperty(SpellAbility sa, String property, Player sourceController, Card source, SpellAbility spellAbility) { if (property.equals("ManaAbility")) { - if (!sa.isManaAbility()) { - return false; - } + return sa.isManaAbility(); } else if (property.equals("nonManaAbility")) { - if (sa.isManaAbility()) { - return false; - } + return !sa.isManaAbility(); } else if (property.equals("Buyback")) { - if (!sa.isBuyBackAbility()) { - return false; - } + return sa.isBuyBackAbility(); } else if (property.equals("Cycling")) { - if (!sa.isCycling()) { - return false; - } + return sa.isCycling(); } else if (property.equals("Dash")) { - if (!sa.isDash()) { - return false; - } + return sa.isDash(); } else if (property.equals("Flashback")) { - if (!sa.isFlashBackAbility()) { - return false; - } + return sa.isFlashBackAbility(); } else if (property.equals("Jumpstart")) { - if (!sa.isJumpstart()) { - return false; - } + return sa.isJumpstart(); } else if (property.equals("Kicked")) { - if (!sa.isKicked()) { - return false; - } + return sa.isKicked(); } else if (property.equals("Loyalty")) { - if (!sa.isPwAbility()) { - return false; - } + return sa.isPwAbility(); } else if (property.equals("Aftermath")) { - if (!sa.isAftermath()) { - return false; - } + return sa.isAftermath(); } else if (property.equals("MorphUp")) { - if (!sa.isMorphUp()) { - return false; - } + return sa.isMorphUp(); } else if (property.equals("Equip")) { - if (!sa.hasParam("Equip")) { - return false; - } + return sa.hasParam("Equip"); } else if (property.equals("MayPlaySource")) { StaticAbility m = sa.getMayPlay(); if (m == null) { return false; } - if (!source.equals(m.getHostCard())) { - return false; - } + return source.equals(m.getHostCard()); } else if (property.startsWith("IsTargeting")) { - String k[] = property.split(" ", 2); + String[] k = property.split(" ", 2); boolean found = false; for (GameObject o : AbilityUtils.getDefinedObjects(source, k[1], spellAbility)) { if (sa.isTargeting(o)) { @@ -217,15 +165,11 @@ public class ForgeScript { break; } } - if (!found) { - return false; - } + return found; } else if (property.equals("YouCtrl")) { return sa.getActivatingPlayer().equals(sourceController); } else if (sa.getHostCard() != null) { - if (!sa.getHostCard().hasProperty(property, sourceController, source, spellAbility)) { - return false; - } + return sa.getHostCard().hasProperty(property, sourceController, source, spellAbility); } return true; diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 4e58a1aba55..e138ed9a402 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -713,7 +713,7 @@ public class Game { ingamePlayers.remove(p); lostPlayers.add(p); - final Map runParams = new TreeMap(); + final Map runParams = new TreeMap<>(); runParams.put("Player", p); getTriggerHandler().runTrigger(TriggerType.LosesGame, runParams, false); } @@ -845,7 +845,7 @@ public class Game { } } - library.removeAll((Collection)toRemove); + library.removeAll(toRemove); if (library.size() > 0) { //Make sure that matches were found. If not, use the original method to choose antes Card ante = library.get(MyRandom.getRandom().nextInt(library.size())); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 2b95afafab1..39f6041fefd 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -763,7 +763,7 @@ public class GameAction { checkStaticAbilities(true); } public final void checkStaticAbilities(final boolean runEvents) { - checkStaticAbilities(runEvents, Sets.newHashSet(), CardCollection.EMPTY); + checkStaticAbilities(runEvents, Sets.newHashSet(), CardCollection.EMPTY); } public final void checkStaticAbilities(final boolean runEvents, final Set affectedCards, final CardCollectionView preList) { if (isCheckingStaticAbilitiesOnHold()) { @@ -787,7 +787,7 @@ public class GameAction { } // search for cards with static abilities - final FCollection staticAbilities = new FCollection(); + final FCollection staticAbilities = new FCollection<>(); final CardCollection staticList = new CardCollection(); game.forEachCardInGame(new Visitor() { @@ -880,6 +880,10 @@ public class GameAction { c.getStaticCommandList().removeAll(toRemove); } // Exclude cards in hidden zones from update + /* + * Refactoring this code to affectedCards.removeIf((Card c) -> c.isInZone(ZoneType.Library)); + * causes Android build not to compile + * */ Iterator it = affectedCards.iterator(); while (it.hasNext()) { Card c = it.next(); @@ -929,7 +933,7 @@ public class GameAction { } public final void checkStateEffects(final boolean runEvents) { - checkStateEffects(runEvents, Sets.newHashSet()); + checkStateEffects(runEvents, Sets.newHashSet()); } public final void checkStateEffects(final boolean runEvents, final Set affectedCards) { // sol(10/29) added for Phase updates, state effects shouldn't be diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index b8fa75f9f13..e425d2fff6e 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -234,7 +234,7 @@ public final class GameActionUtil { // there is a flashback cost (and not the cards cost) if (keyword.contains(":")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); flashback.setPayCosts(new Cost(k[1], false)); } alternatives.add(flashback); diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 1e7ecd2d3f9..58ab4d02127 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -407,11 +407,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { } // true for all - if (hasProtectionFrom(attach, checkSBA)) { - return false; - } - - return true; + return !hasProtectionFrom(attach, checkSBA); } protected boolean canBeEquippedBy(final Card aura) { diff --git a/forge-game/src/main/java/forge/game/GameEntityCache.java b/forge-game/src/main/java/forge/game/GameEntityCache.java index f61505bbf69..b5532f2bf96 100644 --- a/forge-game/src/main/java/forge/game/GameEntityCache.java +++ b/forge-game/src/main/java/forge/game/GameEntityCache.java @@ -8,7 +8,7 @@ import java.util.List; import forge.trackable.TrackableObject; public class GameEntityCache { - private HashMap entityCache = new HashMap(); + private HashMap entityCache = new HashMap<>(); public void put(Integer id, Entity entity) { entityCache.put(id, entity); @@ -33,7 +33,7 @@ public class GameEntityCache getList(Iterable views) { - List list = new ArrayList(); + List list = new ArrayList<>(); addToList(views, list); return list; } diff --git a/forge-game/src/main/java/forge/game/GameEntityView.java b/forge-game/src/main/java/forge/game/GameEntityView.java index 0e769a8cf56..0349b4c8e54 100644 --- a/forge-game/src/main/java/forge/game/GameEntityView.java +++ b/forge-game/src/main/java/forge/game/GameEntityView.java @@ -17,7 +17,7 @@ public abstract class GameEntityView extends TrackableObject { if (entities == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (GameEntity e : entities) { collection.add(e.getView()); } diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index 2790a759a64..8f714aac24a 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -101,14 +101,14 @@ public class GameFormat implements Comparable { } allowedSetCodes = Lists.newArrayList(parsedSets); }else{ - allowedSetCodes = new ArrayList(); + allowedSetCodes = new ArrayList<>(); } - bannedCardNames = bannedCards == null ? new ArrayList() : Lists.newArrayList(bannedCards); - restrictedCardNames = restrictedCards == null ? new ArrayList() : Lists.newArrayList(restrictedCards); - allowedRarities = rarities == null ? new ArrayList() : rarities; + bannedCardNames = bannedCards == null ? new ArrayList<>() : Lists.newArrayList(bannedCards); + restrictedCardNames = restrictedCards == null ? new ArrayList<>() : Lists.newArrayList(restrictedCards); + allowedRarities = rarities == null ? new ArrayList<>() : rarities; this.restrictedLegendary = restrictedLegendary; - additionalCardNames = additionalCards == null ? new ArrayList() : Lists.newArrayList(additionalCards); + additionalCardNames = additionalCards == null ? new ArrayList<>() : Lists.newArrayList(additionalCards); this.allowedSetCodes_ro = Collections.unmodifiableList(allowedSetCodes); this.bannedCardNames_ro = Collections.unmodifiableList(bannedCardNames); @@ -195,7 +195,7 @@ public class GameFormat implements Comparable { } public List getAllCards() { - List cards = new ArrayList(); + List cards = new ArrayList<>(); CardDb commonCards = StaticData.instance().getCommonCards(); for (String setCode : allowedSetCodes_ro) { CardEdition edition = StaticData.instance().getEditions().get(setCode); @@ -285,7 +285,7 @@ public class GameFormat implements Comparable { } public static class Reader extends StorageReaderRecursiveFolderWithUserFolder { - List naturallyOrdered = new ArrayList(); + List naturallyOrdered = new ArrayList<>(); boolean includeHistoric; private List coreFormats = new ArrayList<>(); { @@ -368,7 +368,7 @@ public class GameFormat implements Comparable { if ( strCars != null ) { CardRarity cr; rarities = Lists.newArrayList(); - for (String s: Arrays.asList(strCars.split(", "))) { + for (String s: strCars.split(", ")) { cr = CardRarity.smartValueOf(s); if (!cr.name().equals("Unknown")) { rarities.add(cr); @@ -403,6 +403,7 @@ public class GameFormat implements Comparable { naturallyOrdered = reader.naturallyOrdered; reverseDateOrdered = new ArrayList<>(naturallyOrdered); Collections.sort(naturallyOrdered); + //Why this refactor doesnt work on some android phones? -> reverseDateOrdered.sort(new InverseDateComparator()); Collections.sort(reverseDateOrdered, new InverseDateComparator()); } @@ -484,7 +485,7 @@ public class GameFormat implements Comparable { } public Set getAllFormatsOfCard(PaperCard card) { - Set result = new HashSet(); + Set result = new HashSet<>(); for (GameFormat gf : naturallyOrdered) { if (gf.getFilterRules().apply(card)) { result.add(gf); @@ -501,7 +502,7 @@ public class GameFormat implements Comparable { } public Set getAllFormatsOfDeck(Deck deck, Boolean exhaustive) { - SortedSet result = new TreeSet(); + SortedSet result = new TreeSet<>(); Set coveredTypes = new HashSet<>(); CardPool allCards = deck.getAllCardsInASinglePool(); for(GameFormat gf : reverseDateOrdered) { diff --git a/forge-game/src/main/java/forge/game/GameLog.java b/forge-game/src/main/java/forge/game/GameLog.java index 979e2880330..8fca317132b 100644 --- a/forge-game/src/main/java/forge/game/GameLog.java +++ b/forge-game/src/main/java/forge/game/GameLog.java @@ -34,7 +34,7 @@ import java.util.Observable; public class GameLog extends Observable implements Serializable { private static final long serialVersionUID = 6465283802022948827L; - private final List log = new ArrayList(); + private final List log = new ArrayList<>(); private final transient GameLogFormatter formatter = new GameLogFormatter(this); @@ -70,7 +70,7 @@ public class GameLog extends Observable implements Serializable { * @return the log text */ public List getLogEntries(final GameLogEntryType logLevel) { // null to fetch all - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (int i = log.size() - 1; i >= 0; i--) { GameLogEntry le = log.get(i); @@ -82,7 +82,7 @@ public class GameLog extends Observable implements Serializable { } public List getLogEntriesExact(final GameLogEntryType logLevel) { // null to fetch all - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (int i = log.size() - 1; i >= 0; i--) { GameLogEntry le = log.get(i); diff --git a/forge-game/src/main/java/forge/game/GameLogEntryType.java b/forge-game/src/main/java/forge/game/GameLogEntryType.java index 76538fef910..8654fba1a55 100644 --- a/forge-game/src/main/java/forge/game/GameLogEntryType.java +++ b/forge-game/src/main/java/forge/game/GameLogEntryType.java @@ -20,7 +20,7 @@ public enum GameLogEntryType { PHASE("Phase"); private final String caption; - private GameLogEntryType(String name) { + GameLogEntryType(String name) { this.caption = name; } diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index 6ad9bd1cf8f..0e100e9db4f 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -130,7 +130,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { private static GameLogEntry generateSummary(final List gamesPlayed) { final GameOutcome outcome1 = gamesPlayed.get(0); final HashMap players = outcome1.getPlayerNames(); - final HashMap winCount = new HashMap(); + final HashMap winCount = new HashMap<>(); // Calculate total games each player has won. for (final GameOutcome game : gamesPlayed) { @@ -182,7 +182,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { if (event.type == DamageType.LoyaltyLoss) { additionalLog = " (Removing " + Lang.nounWithAmount(event.amount, "loyalty counter") + ")"; } - String message = event.source.toString() + " deals " + String.valueOf(event.amount) + " damage" + additionalLog + " to " + event.card.toString() + "."; + String message = event.source.toString() + " deals " + event.amount + " damage" + additionalLog + " to " + event.card.toString() + "."; return new GameLogEntry(GameLogEntryType.DAMAGE, message); } @@ -197,7 +197,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { @Override public GameLogEntry visit(GameEventTurnBegan event) { - String message = "Turn " + String.valueOf(event.turnNumber) + " (" + event.turnOwner.toString() + ")"; + String message = "Turn " + event.turnNumber + " (" + event.turnOwner.toString() + ")"; return new GameLogEntry(GameLogEntryType.TURN, message); } @@ -205,7 +205,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { public GameLogEntry visit(GameEventPlayerDamaged ev) { String extra = ev.infect ? " (as poison counters)" : ""; String damageType = ev.combat ? "combat" : "non-combat"; - String message = ev.source.toString() + " deals " + String.valueOf(ev.amount) + " " + damageType + " damage to " + ev.target.toString() + extra + "."; + String message = ev.source.toString() + " deals " + ev.amount + " " + damageType + " damage to " + ev.target.toString() + extra + "."; return new GameLogEntry(GameLogEntryType.DAMAGE, message); } @@ -229,11 +229,11 @@ public class GameLogFormatter extends IGameEventVisitor.Base { continue; } if (sb.length() > 0) sb.append("\n"); - sb.append(ev.player + " assigned " + Lang.joinHomogenous(attackers)); - sb.append(" to attack " + k + "."); + sb.append(ev.player).append(" assigned ").append(Lang.joinHomogenous(attackers)); + sb.append(" to attack ").append(k).append("."); } if (sb.length() == 0) { - sb.append(ev.player + " didn't attack this turn."); + sb.append(ev.player).append(" didn't attack this turn."); } return new GameLogEntry(GameLogEntryType.COMBAT, sb.toString()); } @@ -265,10 +265,10 @@ public class GameLogFormatter extends IGameEventVisitor.Base { blockers = att.getValue(); if (blockers.isEmpty()) { - sb.append(controllerName + " didn't block "); + sb.append(controllerName).append(" didn't block "); } else { - sb.append(controllerName + " assigned " + Lang.joinHomogenous(blockers) + " to block "); + sb.append(controllerName).append(" assigned ").append(Lang.joinHomogenous(blockers)).append(" to block "); } sb.append(att.getKey()).append("."); @@ -281,7 +281,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { @Override public GameLogEntry visit(GameEventMulligan ev) { - String message = ev.player.toString() + " has mulliganed down to " + String.valueOf(ev.player.getZone(ZoneType.Hand).size()) + " cards."; + String message = ev.player.toString() + " has mulliganed down to " + ev.player.getZone(ZoneType.Hand).size() + " cards."; return new GameLogEntry(GameLogEntryType.MULLIGAN, message); } diff --git a/forge-game/src/main/java/forge/game/GameObjectMap.java b/forge-game/src/main/java/forge/game/GameObjectMap.java index f94953a0462..b98c8d790fe 100644 --- a/forge-game/src/main/java/forge/game/GameObjectMap.java +++ b/forge-game/src/main/java/forge/game/GameObjectMap.java @@ -36,7 +36,7 @@ public abstract class GameObjectMap { @SuppressWarnings("unchecked") public List mapList(final List objects) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final T o : objects) { result.add((T) map(o)); } diff --git a/forge-game/src/main/java/forge/game/GameStage.java b/forge-game/src/main/java/forge/game/GameStage.java index 9d32e7ac39f..251fc2e25ee 100644 --- a/forge-game/src/main/java/forge/game/GameStage.java +++ b/forge-game/src/main/java/forge/game/GameStage.java @@ -5,5 +5,5 @@ public enum GameStage { Mulligan, Play, RestartedByKarn, - GameOver; + GameOver } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/GameType.java b/forge-game/src/main/java/forge/game/GameType.java index dc63a482d3f..7ef81786c26 100644 --- a/forge-game/src/main/java/forge/game/GameType.java +++ b/forge-game/src/main/java/forge/game/GameType.java @@ -71,11 +71,11 @@ public enum GameType { private final String name, description; private final Function deckAutoGenerator; - private GameType(DeckFormat deckFormat0, boolean isCardPoolLimited0, boolean canSideboard0, boolean addWonCardsMidgame0, String name0, String description0) { + GameType(DeckFormat deckFormat0, boolean isCardPoolLimited0, boolean canSideboard0, boolean addWonCardsMidgame0, String name0, String description0) { this(deckFormat0, isCardPoolLimited0, canSideboard0, addWonCardsMidgame0, name0, description0, null); } - private GameType(DeckFormat deckFormat0, boolean isCardPoolLimited0, boolean canSideboard0, boolean addWonCardsMidgame0, String name0, String description0, Function deckAutoGenerator0) { + GameType(DeckFormat deckFormat0, boolean isCardPoolLimited0, boolean canSideboard0, boolean addWonCardsMidgame0, String name0, String description0, Function deckAutoGenerator0) { final Localizer localizer = forge.util.Localizer.getInstance(); deckFormat = deckFormat0; isCardPoolLimited = isCardPoolLimited0; diff --git a/forge-game/src/main/java/forge/game/GlobalRuleChange.java b/forge-game/src/main/java/forge/game/GlobalRuleChange.java index aa2e4f1b326..2e7fc2ca2ab 100644 --- a/forge-game/src/main/java/forge/game/GlobalRuleChange.java +++ b/forge-game/src/main/java/forge/game/GlobalRuleChange.java @@ -40,7 +40,7 @@ public enum GlobalRuleChange { private final String ruleText; - private GlobalRuleChange(String text) { + GlobalRuleChange(String text) { ruleText = text; } diff --git a/forge-game/src/main/java/forge/game/IIdentifiable.java b/forge-game/src/main/java/forge/game/IIdentifiable.java index 8c3bf20272a..6b90c6826e8 100644 --- a/forge-game/src/main/java/forge/game/IIdentifiable.java +++ b/forge-game/src/main/java/forge/game/IIdentifiable.java @@ -3,8 +3,8 @@ package forge.game; import com.google.common.base.Function; public interface IIdentifiable { - public abstract int getId(); - public static final Function FN_GET_ID = new Function() { + int getId(); + Function FN_GET_ID = new Function() { @Override public Integer apply(final IIdentifiable input) { return Integer.valueOf(input.getId()); diff --git a/forge-game/src/main/java/forge/game/Match.java b/forge-game/src/main/java/forge/game/Match.java index c716709122b..d5ad5316568 100644 --- a/forge-game/src/main/java/forge/game/Match.java +++ b/forge-game/src/main/java/forge/game/Match.java @@ -28,7 +28,7 @@ public class Match { private final GameRules rules; private final String title; - private final List gamesPlayed = new ArrayList(); + private final List gamesPlayed = new ArrayList<>(); private final List gamesPlayedRo; public Match(final GameRules rules0, final List players0, final String title) { @@ -171,7 +171,7 @@ public class Match { private static Set getRemovedAnteCards(Deck toUse) { final String keywordToRemove = "Remove CARDNAME from your deck before playing if you're not playing for ante."; - Set myRemovedAnteCards = new HashSet(); + Set myRemovedAnteCards = new HashSet<>(); for (Entry ds : toUse) { for (Entry cp : ds.getValue()) { if (Iterables.contains(cp.getKey().getRules().getMainPart().getKeywords(), keywordToRemove)) { @@ -184,7 +184,7 @@ public class Match { private static void preparePlayerLibrary(Player player, final ZoneType zoneType, CardPool section, boolean canRandomFoil) { PlayerZone library = player.getZone(zoneType); - List newLibrary = new ArrayList(); + List newLibrary = new ArrayList<>(); for (final Entry stackOfCards : section) { final PaperCard cp = stackOfCards.getKey(); for (int i = 0; i < stackOfCards.getValue(); i++) { @@ -304,7 +304,7 @@ public class Match { GameOutcome outcome = lastGame.getOutcome(); // remove all the lost cards from owners' decks - List losses = new ArrayList(); + List losses = new ArrayList<>(); int cntPlayers = players.size(); int iWinner = -1; for (int i = 0; i < cntPlayers; i++) { diff --git a/forge-game/src/main/java/forge/game/PlanarDice.java b/forge-game/src/main/java/forge/game/PlanarDice.java index 34d826b3494..bdf3b292ed0 100644 --- a/forge-game/src/main/java/forge/game/PlanarDice.java +++ b/forge-game/src/main/java/forge/game/PlanarDice.java @@ -36,7 +36,7 @@ public enum PlanarDice { trigRes = Chaos; } - HashMap runParams = new HashMap(); + HashMap runParams = new HashMap<>(); runParams.put("Player", roller); runParams.put("Result", trigRes); roller.getGame().getTriggerHandler().runTrigger(TriggerType.PlanarDice, runParams,false); diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java index 9f4be831e8f..b27ed2f3d20 100644 --- a/forge-game/src/main/java/forge/game/StaticEffect.java +++ b/forge-game/src/main/java/forge/game/StaticEffect.java @@ -47,13 +47,9 @@ public class StaticEffect { private final Card source; private StaticAbility ability; - private int keywordNumber = 0; private CardCollectionView affectedCards = new CardCollection(); private List affectedPlayers = Lists.newArrayList(); - private int xValue = 0; - private int yValue = 0; private long timestamp = -1; - private Map xValueMap = Maps.newTreeMap(); private String chosenType; private Map mapParams = Maps.newTreeMap(); @@ -89,13 +85,9 @@ public class StaticEffect { private StaticEffect makeMappedCopy(GameObjectMap map) { StaticEffect copy = new StaticEffect(map.map(this.source)); copy.ability = this.ability; - copy.keywordNumber = this.keywordNumber; copy.affectedCards = map.mapCollection(this.affectedCards); copy.affectedPlayers = map.mapList(this.affectedPlayers); - copy.xValue = this.xValue; - copy.yValue = this.yValue; copy.timestamp = this.timestamp; - copy.xValueMap = this.xValueMap; copy.chosenType = this.chosenType; copy.mapParams = this.mapParams; copy.overwriteTypes = this.overwriteTypes; @@ -168,7 +160,7 @@ public class StaticEffect { */ public final void addOriginalAbilities(final Card c, final SpellAbility sa) { if (!this.originalAbilities.containsKey(c)) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); list.add(sa); this.originalAbilities.put(c, list); } else { @@ -187,7 +179,7 @@ public class StaticEffect { * a {@link java.util.List} object. */ public final void addOriginalAbilities(final Card c, final List s) { - final List list = new ArrayList(s); + final List list = new ArrayList<>(s); if (!this.originalAbilities.containsKey(c)) { this.originalAbilities.put(c, list); } else { @@ -206,7 +198,7 @@ public class StaticEffect { * @return a {@link java.util.List} object. */ public final List getOriginalAbilities(final Card c) { - final List returnList = new ArrayList(); + final List returnList = new ArrayList<>(); if (this.originalAbilities.containsKey(c)) { returnList.addAll(this.originalAbilities.get(c)); } @@ -273,7 +265,7 @@ public class StaticEffect { */ public final void addOriginalKeyword(final Card c, final String s) { if (!this.originalKeywords.containsKey(c)) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); list.add(s); this.originalKeywords.put(c, list); } else { @@ -292,7 +284,7 @@ public class StaticEffect { * a {@link List} object. */ public final void addOriginalKeywords(final Card c, final List s) { - final List list = new ArrayList(s); + final List list = new ArrayList<>(s); if (!this.originalKeywords.containsKey(c)) { this.originalKeywords.put(c, list); } else { @@ -311,7 +303,7 @@ public class StaticEffect { * @return a {@link List} object. */ public final List getOriginalKeywords(final Card c) { - final List returnList = new ArrayList(); + final List returnList = new ArrayList<>(); if (this.originalKeywords.containsKey(c)) { returnList.addAll(this.originalKeywords.get(c)); } @@ -426,7 +418,7 @@ public class StaticEffect { */ public final void addOriginalType(final Card c, final String s) { if (!this.originalTypes.containsKey(c)) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); list.add(s); this.originalTypes.put(c, list); } else { @@ -445,7 +437,7 @@ public class StaticEffect { * a {@link java.util.ArrayList} object. */ public final void addOriginalTypes(final Card c, final List s) { - final List list = new ArrayList(s); + final List list = new ArrayList<>(s); if (!this.originalTypes.containsKey(c)) { this.originalTypes.put(c, list); } else { @@ -464,7 +456,7 @@ public class StaticEffect { * @return a {@link java.util.ArrayList} object. */ public final List getOriginalTypes(final Card c) { - final List returnList = new ArrayList(); + final List returnList = new ArrayList<>(); if (this.originalTypes.containsKey(c)) { returnList.addAll(this.originalTypes.get(c)); } @@ -507,7 +499,7 @@ public class StaticEffect { */ public final void addType(final Card c, final String s) { if (!this.types.containsKey(c)) { - final List list = new ArrayList(); + final List list = new ArrayList<>(); list.add(s); this.types.put(c, list); } else { @@ -525,7 +517,7 @@ public class StaticEffect { * @return a {@link java.util.List} object. */ public final List getTypes(final Card c) { - final List returnList = new ArrayList(); + final List returnList = new ArrayList<>(); if (this.types.containsKey(c)) { returnList.addAll(this.types.get(c)); } @@ -629,29 +621,6 @@ public class StaticEffect { return this.source; } - /** - *

- * Setter for the field keywordNumber. - *

- * - * @param i - * a int. - */ - public final void setKeywordNumber(final int i) { - this.keywordNumber = i; - } - - /** - *

- * Getter for the field keywordNumber. - *

- * - * @return a int. - */ - public final int getKeywordNumber() { - return this.keywordNumber; - } - /** *

* Getter for the field affectedCards. @@ -694,75 +663,6 @@ public class StaticEffect { this.affectedPlayers = list; } - /** - *

- * Setter for the field xValue. - *

- * - * @param x - * a int. - */ - public final void setXValue(final int x) { - this.xValue = x; - } - - /** - *

- * Getter for the field xValue. - *

- * - * @return a int. - */ - public final int getXValue() { - return this.xValue; - } - - /** - *

- * Setter for the field yValue. - *

- * - * @param y - * a int. - */ - public final void setYValue(final int y) { - this.yValue = y; - } - - /** - *

- * Getter for the field yValue. - *

- * - * @return a int. - */ - public final int getYValue() { - return this.yValue; - } - - /** - * Store xValue relative to a specific card. - * @param affectedCard the card affected - * @param xValue the xValue - */ - public final void addXMapValue(final Card affectedCard, final Integer xValue) { - if (this.xValueMap.containsKey(affectedCard)) { - if (!this.xValueMap.get(affectedCard).equals(xValue)) { - this.xValueMap.remove(affectedCard); - } - } - this.xValueMap.put(affectedCard, xValue); - } - - /** - * Get the xValue for specific card. - * @param affectedCard the affected card - * @return an int. - */ - public int getXMapValue(Card affectedCard) { - return this.xValueMap.get(affectedCard); - } - /** * setParams. TODO Write javadoc for this method. * @@ -813,11 +713,6 @@ public class StaticEffect { String changeColorWordsTo = null; - int powerBonus = 0; - String addP = ""; - int toughnessBonus = 0; - String addT = ""; - int keywordMultiplier = 1; boolean setPT = false; String[] addHiddenKeywords = null; String addColors = null; @@ -834,37 +729,6 @@ public class StaticEffect { setPT = true; } - if (params.containsKey("AddPower")) { - addP = params.get("AddPower"); - if (addP.matches("[0-9][0-9]?")) { - powerBonus = Integer.valueOf(addP); - } else if (addP.equals("AffectedX")) { - // gets calculated at runtime - } else { - powerBonus = getXValue(); - } - } - - if (params.containsKey("AddToughness")) { - addT = params.get("AddToughness"); - if (addT.matches("[0-9][0-9]?")) { - toughnessBonus = Integer.valueOf(addT); - } else if (addT.equals("AffectedX")) { - // gets calculated at runtime - } else { - toughnessBonus = getYValue(); - } - } - - if (params.containsKey("KeywordMultiplier")) { - String multiplier = params.get("KeywordMultiplier"); - if (multiplier.equals("X")) { - keywordMultiplier = getXValue(); - } else { - keywordMultiplier = Integer.valueOf(multiplier); - } - } - if (params.containsKey("AddHiddenKeyword")) { addHiddenKeywords = params.get("AddHiddenKeyword").split(" & "); } @@ -874,7 +738,7 @@ public class StaticEffect { if (colors.equals("ChosenColor")) { addColors = CardUtil.getShortColorsString(getSource().getChosenColors()); } else { - addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(" & ")))); + addColors = CardUtil.getShortColorsString(new ArrayList<>(Arrays.asList(colors.split(" & ")))); } } @@ -883,7 +747,7 @@ public class StaticEffect { if (colors.equals("ChosenColor")) { addColors = CardUtil.getShortColorsString(getSource().getChosenColors()); } else { - addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(" & ")))); + addColors = CardUtil.getShortColorsString(new ArrayList<>(Arrays.asList(colors.split(" & ")))); } } @@ -934,15 +798,9 @@ public class StaticEffect { } // remove P/T bonus - if (addP.startsWith("AffectedX")) { - powerBonus = getXMapValue(affectedCard); - } - if (addT.startsWith("AffectedX")) { - toughnessBonus = getXMapValue(affectedCard); - } + affectedCard.removePTBoost(getTimestamp()); + // the view is updated in GameAction#checkStaticAbilities to avoid flickering - affectedCard.addSemiPermanentPowerBoost(powerBonus * -1, false); - affectedCard.addSemiPermanentToughnessBoost(toughnessBonus * -1, false); // remove keywords // TODO regular keywords currently don't try to use keyword multiplier @@ -963,9 +821,7 @@ public class StaticEffect { if (addHiddenKeywords != null) { for (final String k : addHiddenKeywords) { - for (int j = 0; j < keywordMultiplier; j++) { - affectedCard.removeHiddenExtrinsicKeyword(k); - } + affectedCard.removeHiddenExtrinsicKeyword(k); } } @@ -1006,6 +862,13 @@ public class StaticEffect { affectedCard.removeGoad(getTimestamp()); } + if (params.containsKey("CanBlockAny")) { + affectedCard.removeCanBlockAny(getTimestamp()); + } + if (params.containsKey("CanBlockAmount")) { + affectedCard.removeCanBlockAdditional(getTimestamp()); + } + affectedCard.updateAbilityTextForView(); // only update keywords and text for view to avoid flickering } return affectedCards; diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java index 6fd213ea43c..1e770f1fce9 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java @@ -64,7 +64,7 @@ public final class AbilityFactory { SubAbility("DB"); private final String prefix; - private AbilityRecordType(String prefix) { + AbilityRecordType(String prefix) { this.prefix = prefix; } public String getPrefix() { diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 747945ae97b..fa03796fa5a 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -35,7 +35,6 @@ import io.sentry.event.BreadcrumbBuilder; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -150,9 +149,7 @@ public class AbilityUtils { if (crd instanceof Card) { c = game.getCardState((Card) crd); } else if (crd instanceof Iterable) { - for (final Card cardItem : Iterables.filter((Iterable) crd, Card.class)) { - cards.add(cardItem); - } + cards.addAll(Iterables.filter((Iterable) crd, Card.class)); } } } @@ -162,9 +159,7 @@ public class AbilityUtils { if (crd instanceof Card) { c = game.getCardState((Card) crd); } else if (crd instanceof List) { - for (final Card cardItem : (CardCollection) crd) { - cards.add(cardItem); - } + cards.addAll((CardCollection) crd); } } else if (defined.equals("Remembered") || defined.equals("RememberedCard")) { @@ -433,7 +428,7 @@ public class AbilityUtils { val = CardFactoryUtil.doXMath(AbilityUtils.calculateAmount(card, l[0], ability), m, card); } else if (calcX[0].startsWith("PlayerCount")) { final String hType = calcX[0].substring(11); - final FCollection players = new FCollection(); + final FCollection players = new FCollection<>(); if (hType.equals("Players") || hType.equals("")) { players.addAll(game.getPlayers()); val = CardFactoryUtil.playerXCount(players, calcX[1], card); @@ -531,9 +526,7 @@ public class AbilityUtils { } if (calcX[0].endsWith("LKI")) { // last known information - for (final Card c : newCard.getImprintedCards()) { - list.add(c); - } + list.addAll(newCard.getImprintedCards()); } else { for (final Card c : newCard.getImprintedCards()) { @@ -578,7 +571,7 @@ public class AbilityUtils { // Player attribute counting if (calcX[0].startsWith("TargetedPlayer")) { - final List players = new ArrayList(); + final List players = new ArrayList<>(); final SpellAbility saTargeting = sa.getSATargetingPlayer(); if (null != saTargeting) { Iterables.addAll(players, saTargeting.getTargets().getTargetPlayers()); @@ -586,12 +579,12 @@ public class AbilityUtils { return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } if (calcX[0].startsWith("ThisTargetedPlayer")) { - final List players = new ArrayList(); + final List players = new ArrayList<>(); Iterables.addAll(players, sa.getTargets().getTargetPlayers()); return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } if (calcX[0].startsWith("TargetedObjects")) { - final List objects = new ArrayList(); + final List objects = new ArrayList<>(); // Make list of all targeted objects starting with the root SpellAbility SpellAbility loopSA = sa.getRootAbility(); while (loopSA != null) { @@ -603,7 +596,7 @@ public class AbilityUtils { return CardFactoryUtil.objectXCount(objects, calcX[1], card) * multiplier; } if (calcX[0].startsWith("TargetedController")) { - final List players = new ArrayList(); + final List players = new ArrayList<>(); final CardCollection list = getDefinedCards(card, "Targeted", sa); final List sas = AbilityUtils.getDefinedSpellAbilities(card, "Targeted", sa); @@ -642,7 +635,7 @@ public class AbilityUtils { if (calcX[0].startsWith("TriggeredPlayers")) { key = "Triggered" + key.substring(16); } - final List players = new ArrayList(); + final List players = new ArrayList<>(); Iterables.addAll(players, getDefinedPlayers(card, key, sa)); return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } @@ -752,7 +745,7 @@ public class AbilityUtils { * @return a {@link java.util.ArrayList} object. */ public static FCollection getDefinedObjects(final Card card, final String def, final SpellAbility sa) { - final FCollection objects = new FCollection(); + final FCollection objects = new FCollection<>(); final String defined = (def == null) ? "Self" : def; objects.addAll(AbilityUtils.getDefinedPlayers(card, defined, sa)); @@ -1063,7 +1056,7 @@ public class AbilityUtils { } else if (defined.startsWith("OppNon")) { players.addAll(player.getOpponents()); - players.removeAll((Collection)getDefinedPlayers(card, defined.substring(6), sa)); + players.removeAll(getDefinedPlayers(card, defined.substring(6), sa)); } else if (defined.startsWith("Replaced")) { final SpellAbility root = sa.getRootAbility(); @@ -1224,7 +1217,7 @@ public class AbilityUtils { */ public static FCollection getDefinedSpellAbilities(final Card card, final String def, final SpellAbility sa) { - final FCollection sas = new FCollection(); + final FCollection sas = new FCollection<>(); final String defined = (def == null) ? "Self" : applyAbilityTextChangeEffects(def, sa); // default to Self final Game game = card.getGame(); @@ -1624,6 +1617,13 @@ public class AbilityUtils { return count; } + // Count$Adamant... + if (sq[0].startsWith("Adamant")) { + final String payingMana = StringUtils.join(sa.getRootAbility().getPayingMana()); + final boolean adamant = StringUtils.countMatches(payingMana, MagicColor.toShortString(sq[1])) >= 3; + return CardFactoryUtil.doXMath(Integer.parseInt(sq[adamant ? 2 : 3]), expr, c); + } + if (l[0].startsWith("LastStateBattlefield")) { final String[] k = l[0].split(" "); CardCollectionView list = null; @@ -1691,7 +1691,7 @@ public class AbilityUtils { } public static final List getBasicSpellsFromPlayEffect(final Card tgtCard, final Player controller) { - List sas = new ArrayList(); + List sas = new ArrayList<>(); for (SpellAbility s : tgtCard.getBasicSpells()) { final Spell newSA = (Spell) s.copy(); newSA.setActivatingPlayer(controller); @@ -1800,7 +1800,7 @@ public class AbilityUtils { public static final String getSVar(final CardTraitBase ability, final String sVarName) { String val = null; if (ability instanceof SpellAbility) { - val = ((SpellAbility) ability).getSVar(sVarName); + val = ability.getSVar(sVarName); } if (StringUtils.isEmpty(val)) { Card host = null; @@ -1857,7 +1857,7 @@ public class AbilityUtils { public boolean apply(Card input) { for (final KeywordInterface inst : input.getKeywords(Keyword.SPLICE)) { String k = inst.getOriginal(); - final String n[] = k.split(":"); + final String[] n = k.split(":"); if (source.isValid(n[1].split(","), player, input, sa)) { return true; } @@ -1890,7 +1890,7 @@ public class AbilityUtils { // This Function thinks that Splice exist only once on the card for (final KeywordInterface inst : c.getKeywords(Keyword.SPLICE)) { final String k = inst.getOriginal(); - final String n[] = k.split(":"); + final String[] n = k.split(":"); spliceCost = new Cost(n[2], false); } diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index a0d4e8b10b4..160febd110b 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -83,7 +83,7 @@ public abstract class SpellAbilityEffect { "CARDNAME", sa.getHostCard().getName())); } if (sa.getTargets() != null && !sa.getTargets().getTargets().isEmpty()) { - sb.append(" (Targeting: " + sa.getTargets().getTargets() + ")"); + sb.append(" (Targeting: ").append(sa.getTargets().getTargets()).append(")"); } } else if (!"None".equalsIgnoreCase(stackDesc)) { // by typing "none" they want to suppress output makeSpellDescription(sa, sb, stackDesc); @@ -186,7 +186,7 @@ public abstract class SpellAbilityEffect { private static FCollection getPlayers(final boolean definedFirst, final String definedParam, final SpellAbility sa) { final boolean useTargets = sa.usesTargeting() && (!definedFirst || !sa.hasParam(definedParam)); - return useTargets ? new FCollection(sa.getTargets().getTargetPlayers()) + return useTargets ? new FCollection<>(sa.getTargets().getTargetPlayers()) : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam(definedParam), sa); } @@ -258,7 +258,7 @@ public abstract class SpellAbilityEffect { if (your) { delTrig.append("| ValidPlayer$ You "); } - delTrig.append("| TriggerDescription$ " + desc); + delTrig.append("| TriggerDescription$ ").append(desc); final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), sa.getHostCard(), intrinsic); for (final Card c : crds) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java index 2811591354c..3114cf48501 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java @@ -51,7 +51,7 @@ public class ActivateAbilityEffect extends SpellAbilityEffect { continue; } SpellAbility manaAb = p.getController().chooseSingleSpellForEffect( - possibleAb, sa, "Choose a mana ability:", ImmutableMap.of()); + possibleAb, sa, "Choose a mana ability:", ImmutableMap.of()); p.getController().playChosenSpellAbility(manaAb); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java index 0f3219c7e55..623a727ed55 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java @@ -71,17 +71,17 @@ public class AnimateAllEffect extends AnimateEffectBase { types.add(host.getChosenType()); } - final List keywords = new ArrayList(); + final List keywords = new ArrayList<>(); if (sa.hasParam("Keywords")) { keywords.addAll(Arrays.asList(sa.getParam("Keywords").split(" & "))); } - final List removeKeywords = new ArrayList(); + final List removeKeywords = new ArrayList<>(); if (sa.hasParam("RemoveKeywords")) { removeKeywords.addAll(Arrays.asList(sa.getParam("RemoveKeywords").split(" & "))); } - final List hiddenKeywords = new ArrayList(); + final List hiddenKeywords = new ArrayList<>(); if (sa.hasParam("HiddenKeywords")) { hiddenKeywords.addAll(Arrays.asList(sa.getParam("HiddenKeywords").split(" & "))); } @@ -101,29 +101,29 @@ public class AnimateAllEffect extends AnimateEffectBase { if (colors.equals("ChosenColor")) { tmpDesc = CardUtil.getShortColorsString(host.getChosenColors()); } else { - tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(",")))); + tmpDesc = CardUtil.getShortColorsString(new ArrayList<>(Arrays.asList(colors.split(",")))); } } final String finalDesc = tmpDesc; // abilities to add to the animated being - final List abilities = new ArrayList(); + final List abilities = new ArrayList<>(); if (sa.hasParam("Abilities")) { abilities.addAll(Arrays.asList(sa.getParam("Abilities").split(","))); } // replacement effects to add to the animated being - final List replacements = new ArrayList(); + final List replacements = new ArrayList<>(); if (sa.hasParam("Replacements")) { replacements.addAll(Arrays.asList(sa.getParam("Replacements").split(","))); } // triggers to add to the animated being - final List triggers = new ArrayList(); + final List triggers = new ArrayList<>(); if (sa.hasParam("Triggers")) { triggers.addAll(Arrays.asList(sa.getParam("Triggers").split(","))); } // sVars to add to the animated being - final List sVars = new ArrayList(); + final List sVars = new ArrayList<>(); if (sa.hasParam("sVars")) { sVars.addAll(Arrays.asList(sa.getParam("sVars").split(","))); } @@ -154,7 +154,7 @@ public class AnimateAllEffect extends AnimateEffectBase { keywords, removeKeywords, hiddenKeywords, timestamp); // give abilities - final List addedAbilities = new ArrayList(); + final List addedAbilities = new ArrayList<>(); if (abilities.size() > 0) { for (final String s : abilities) { final String actualAbility = host.getSVar(s); @@ -165,7 +165,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // remove abilities - final List removedAbilities = new ArrayList(); + final List removedAbilities = new ArrayList<>(); if (sa.hasParam("OverwriteAbilities") || removeAll || removeIntrinsic) { for (final SpellAbility ab : c.getSpellAbilities()) { if (ab.isAbility()) { @@ -178,7 +178,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } } // give replacement effects - final List addedReplacements = new ArrayList(); + final List addedReplacements = new ArrayList<>(); if (replacements.size() > 0) { for (final String s : replacements) { final String actualReplacement = host.getSVar(s); @@ -187,7 +187,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } } // Grant triggers - final List addedTriggers = new ArrayList(); + final List addedTriggers = new ArrayList<>(); if (triggers.size() > 0) { for (final String s : triggers) { final String actualTrigger = host.getSVar(s); @@ -197,7 +197,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // suppress triggers from the animated card - final List removedTriggers = new ArrayList(); + final List removedTriggers = new ArrayList<>(); if (sa.hasParam("OverwriteTriggers") || removeAll || removeIntrinsic) { final FCollectionView triggersToRemove = c.getTriggers(); for (final Trigger trigger : triggersToRemove) { @@ -210,7 +210,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // suppress static abilities from the animated card - final List removedStatics = new ArrayList(); + final List removedStatics = new ArrayList<>(); if (sa.hasParam("OverwriteStatics") || removeAll || removeIntrinsic) { for (final StaticAbility stAb : c.getStaticAbilities()) { if (removeIntrinsic && !stAb.isIntrinsic()) { @@ -222,7 +222,7 @@ public class AnimateAllEffect extends AnimateEffectBase { } // suppress static abilities from the animated card - final List removedReplacements = new ArrayList(); + final List removedReplacements = new ArrayList<>(); if (sa.hasParam("OverwriteReplacements") || removeAll || removeIntrinsic) { for (final ReplacementEffect re : c.getReplacementEffects()) { if (removeIntrinsic && !re.isIntrinsic()) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java index eb53cecf76b..e3e53dc6fa0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java @@ -38,7 +38,7 @@ public class AssignGroupEffect extends SpellAbilityEffect { List defined = getDefinedOrTargeted(sa, "Defined"); - final List abilities = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); + final List abilities = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); Player chooser = sa.getActivatingPlayer(); if (sa.hasParam("Chooser")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 44643d555d2..3e1b4f5e11d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -166,7 +166,7 @@ public class AttachEffect extends SpellAbilityEffect { Player p = source.getController(); if (tgt.canTgtPlayer()) { - final FCollection players = new FCollection(); + final FCollection players = new FCollection<>(); for (Player player : game.getPlayers()) { if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source, null)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java index 27821b41b89..311fd3ae2a0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java @@ -34,7 +34,7 @@ public class BalanceEffect extends SpellAbilityEffect { int min = Integer.MAX_VALUE; final FCollectionView players = game.getPlayersInTurnOrder(); - final List validCards = new ArrayList(players.size()); + final List validCards = new ArrayList<>(players.size()); for(int i = 0; i < players.size(); i++) { // Find the minimum of each Valid per player diff --git a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java index fdd3365212e..36026b174dc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java @@ -22,7 +22,7 @@ public class BidLifeEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); final Player activator = sa.getActivatingPlayer(); - final FCollection bidPlayers = new FCollection(); + final FCollection bidPlayers = new FCollection<>(); final int startBidding; if (sa.hasParam("StartBidding")) { String start = sa.getParam("StartBidding"); @@ -54,7 +54,7 @@ public class BidLifeEffect extends SpellAbilityEffect { willBid = false; for (final Player p : bidPlayers) { final boolean result = p.getController().confirmBidAction(sa, PlayerActionConfirmMode.BidLife, - "Do you want to top bid? Current Bid =" + String.valueOf(bid), bid, winner); + "Do you want to top bid? Current Bid =" + bid, bid, winner); willBid |= result; if (result) { // a different choose number bid += p.getController().chooseNumber(sa, "Bid life:", 1, 9); diff --git a/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java index 5160b929da7..3ec32f0532e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java @@ -22,7 +22,7 @@ public class BlockEffect extends SpellAbilityEffect { final Game game = host.getGame(); final Combat combat = game.getPhaseHandler().getCombat(); - List attackers = new ArrayList(); + List attackers = new ArrayList<>(); if (sa.hasParam("DefinedAttacker")) { for (final Card attacker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa)) { if (combat.isAttacking(attacker)) @@ -30,7 +30,7 @@ public class BlockEffect extends SpellAbilityEffect { } } - List blockers = new ArrayList(); + List blockers = new ArrayList<>(); if (sa.hasParam("DefinedBlocker")) { for (final Card blocker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedBlocker"), sa)) { if (blocker.isCreature() && blocker.isInZone(ZoneType.Battlefield)) @@ -90,14 +90,14 @@ public class BlockEffect extends SpellAbilityEffect { // end standard pre- - List attackers = new ArrayList(); + List attackers = new ArrayList<>(); if (sa.hasParam("DefinedAttacker")) { for (final Card attacker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa)) { attackers.add(attacker.toString()); } } - List blockers = new ArrayList(); + List blockers = new ArrayList<>(); if (sa.hasParam("DefinedBlocker")) { for (final Card blocker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedBlocker"), sa)) { blockers.add(blocker.toString()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java index 91ee11bd4b8..131eecbcff7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java @@ -71,13 +71,13 @@ public class ChangeTextEffect extends SpellAbilityEffect { validTypes.addAll(CardType.Constant.CREATURE_TYPES); kindOfType = "creature"; } - changedTypeWordOriginal = sa.getActivatingPlayer().getController().chooseSomeType(kindOfType, sa, validTypes, Lists.newArrayList()); + changedTypeWordOriginal = sa.getActivatingPlayer().getController().chooseSomeType(kindOfType, sa, validTypes, Lists.newArrayList()); } else { changedTypeWordOriginal = changedTypeWordsArray[0]; } validTypes.clear(); - final List forbiddenTypes = sa.hasParam("ForbiddenNewTypes") ? Lists.newArrayList(sa.getParam("ForbiddenNewTypes").split(",")) : Lists.newArrayList(); + final List forbiddenTypes = sa.hasParam("ForbiddenNewTypes") ? Lists.newArrayList(sa.getParam("ForbiddenNewTypes").split(",")) : Lists.newArrayList(); forbiddenTypes.add(changedTypeWordOriginal); if (changedTypeWordsArray[1].startsWith("Choose")) { if (changedTypeWordsArray[1].equals("ChooseBasicLandType")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 58220d302fb..b18b305f9b9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -641,7 +641,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // for things like Gaea's Blessing if (destination.equals(ZoneType.Library) && sa.hasParam("Shuffle") && "True".equals(sa.getParam("Shuffle"))) { - FCollection pl = new FCollection(); + FCollection pl = new FCollection<>(); // use defined controller. it does need to work even without Targets. if (sa.hasParam("TargetsWithDefinedController")) { pl.addAll(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("TargetsWithDefinedController"), sa)); @@ -876,9 +876,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { selectedCards = decider.getController().chooseCardsForZoneChange(destination, origin, sa, fetchList, 0, changeNum, delayedReveal, selectPrompt, decider); } while (selectedCards != null && selectedCards.size() > changeNum); if (selectedCards != null) { - for (Card card : selectedCards) { - chosenCards.add(card); - } + chosenCards.addAll(selectedCards); } // maybe prompt the user if they selected fewer than the maximum possible? } else { @@ -908,7 +906,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (totalcmc != null) { if (totcmc >= 0) { - fetchList = CardLists.getValidCards(fetchList, "Card.cmcLE" + Integer.toString(totcmc), source.getController(), source); + fetchList = CardLists.getValidCards(fetchList, "Card.cmcLE" + totcmc, source.getController(), source); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index 5d7083bf5ab..d87d9da4b85 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -98,7 +98,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { int chosenP = 0; while (!creature.isEmpty()) { Card c = p.getController().chooseSingleEntityForEffect(creature, sa, - "Select creature(s) with total power less than or equal to " + Integer.toString(totP - chosenP - negativeNum) + "Select creature(s) with total power less than or equal to " + (totP - chosenP - negativeNum) + "\r\n(Selected:" + chosenPool + ")\r\n" + "(Total Power: " + chosenP + ")", chosenP <= totP); if (c == null) { if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, "Cancel Choose?")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java index 7407314dff0..7b7a0f2740c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java @@ -34,7 +34,7 @@ public class ChooseColorEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); - List colorChoices = new ArrayList(MagicColor.Constant.ONLY_COLORS); + List colorChoices = new ArrayList<>(MagicColor.Constant.ONLY_COLORS); if (sa.hasParam("Choices")) { String[] restrictedChoices = sa.getParam("Choices").split(","); colorChoices = Arrays.asList(restrictedChoices); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java index b2bf0f36a9c..3c0dac6f8a1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java @@ -16,7 +16,7 @@ public class ChooseDirectionEffect extends SpellAbilityEffect { public void resolve(final SpellAbility sa) { final Card source = sa.getHostCard(); final Game game = source.getGame(); - final FCollection left = new FCollection(game.getPlayers()); + final FCollection left = new FCollection<>(game.getPlayers()); // TODO: We'd better set up turn order UI here final String info = "Left (clockwise): " + left + "\r\nRight (anticlockwise):" + Lists.reverse(left); sa.getActivatingPlayer().getController().notifyOfValue(sa, source, info); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java index 93e5b3bca09..9073e1a9342 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java @@ -30,14 +30,14 @@ public class ChooseGenericEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); - final List abilities = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); + final List abilities = Lists.newArrayList(sa.getAdditionalAbilityList("Choices")); final SpellAbility fallback = sa.getAdditionalAbility("FallbackAbility"); final List tgtPlayers = getDefinedPlayersOrTargeted(sa); for (final Player p : tgtPlayers) { // determine if any of the choices are not valid - List saToRemove = Lists.newArrayList(); + List saToRemove = Lists.newArrayList(); for (SpellAbility saChoice : abilities) { if (!saChoice.getRestrictions().checkOtherRestrictions(host, saChoice, sa.getActivatingPlayer()) ) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java index 731cfcc5426..36ac0d24e5c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java @@ -29,9 +29,9 @@ public class ChooseTypeEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); final String type = sa.getParam("Type"); - final List invalidTypes = sa.hasParam("InvalidTypes") ? Arrays.asList(sa.getParam("InvalidTypes").split(",")) : new ArrayList(); + final List invalidTypes = sa.hasParam("InvalidTypes") ? Arrays.asList(sa.getParam("InvalidTypes").split(",")) : new ArrayList<>(); - final List validTypes = new ArrayList(); + final List validTypes = new ArrayList<>(); if (sa.hasParam("ValidTypes")) { validTypes.addAll(Arrays.asList(sa.getParam("ValidTypes").split(","))); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java index 930f2b28477..55d43b0c51e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java @@ -32,7 +32,7 @@ public class ClashEffect extends SpellAbilityEffect { final boolean victory = clashWithOpponent(sa); // Run triggers - final HashMap runParams = new HashMap(); + final HashMap runParams = new HashMap<>(); runParams.put("Player", sa.getHostCard().getController()); if (victory) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index 19933d913e2..742132bac5f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -40,7 +40,7 @@ public class CloneEffect extends SpellAbilityEffect { } sb.append(tgtCard); - sb.append(" becomes a copy of " + cardToCopy + "."); + sb.append(" becomes a copy of ").append(cardToCopy).append("."); return sb.toString(); } // end cloneStackDescription() @@ -124,7 +124,7 @@ public class CloneEffect extends SpellAbilityEffect { } if (!pumpKeywords.isEmpty()) { - tgtCard.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, ts); + tgtCard.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, ts); } tgtCard.updateStateForView(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java index 5976bfe7173..0e2ea5a6ce6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java @@ -22,7 +22,7 @@ public class ControlExchangeEffect extends SpellAbilityEffect { Card object1 = null; Card object2 = null; final TargetRestrictions tgt = sa.getTargetRestrictions(); - List tgts = tgt == null ? new ArrayList() : Lists.newArrayList(sa.getTargets().getTargetCards()); + List tgts = tgt == null ? new ArrayList<>() : Lists.newArrayList(sa.getTargets().getTargetCards()); if (tgts.size() > 0) { object1 = tgts.get(0); } @@ -47,7 +47,7 @@ public class ControlExchangeEffect extends SpellAbilityEffect { Card object1 = null; Card object2 = null; final TargetRestrictions tgt = sa.getTargetRestrictions(); - List tgts = tgt == null ? new ArrayList() : Lists.newArrayList(sa.getTargets().getTargetCards()); + List tgts = tgt == null ? new ArrayList<>() : Lists.newArrayList(sa.getTargets().getTargetCards()); if (tgts.size() > 0) { object1 = tgts.get(0); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index 9844f1dd6a2..ec26b621f1d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -142,7 +142,7 @@ public class ControlGainEffect extends SpellAbilityEffect { } if (!kws.isEmpty()) { - tgtC.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, tStamp); + tgtC.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, tStamp); game.fireEvent(new GameEventCardStatsChanged(tgtC)); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 2ecdfcfd620..612737941e8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -192,7 +192,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { copyInPlay.setCloneOrigin(host); if (!pumpKeywords.isEmpty()) { - copyInPlay.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, timestamp); + copyInPlay.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, timestamp); } crds.add(copyInPlay); if (sa.hasParam("RememberCopied")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index fcb79639e2b..a1db15665f8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -78,7 +78,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { } boolean mayChooseNewTargets = true; - List copies = new ArrayList(); + List copies = new ArrayList<>(); if (sa.hasParam("CopyMultipleSpells")) { final int spellCount = Integer.parseInt(sa.getParam("CopyMultipleSpells")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java index 15a4a69bcf2..5338477cae1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java @@ -32,7 +32,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { int amount = 0; if (!num.equals("All") && !num.equals("Remembered")) { amount = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa); - }; + } sb.append("Remove "); if (sa.hasParam("UpTo")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index 97b00f3c9be..bfb6258496d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -108,10 +108,8 @@ public class DamageDealEffect extends DamageBaseEffect { } // Can't radiate from a player if (origin != null) { - for (final Card c : CardUtil.getRadiance(hostCard, origin, - sa.getParam("ValidTgts").split(","))) { - tgts.add(c); - } + tgts.addAll(CardUtil.getRadiance(hostCard, origin, + sa.getParam("ValidTgts").split(","))); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java index 4c35db52d4d..5b7ce50d73f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java @@ -69,7 +69,7 @@ public class DamagePreventEffect extends SpellAbilityEffect { int numDam = AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa); final List tgts = getTargets(sa); - final List untargetedCards = new ArrayList(); + final List untargetedCards = new ArrayList<>(); if (sa.hasParam("Radiance") && (sa.usesTargeting())) { Card origin = null; @@ -81,9 +81,7 @@ public class DamagePreventEffect extends SpellAbilityEffect { } if (origin != null) { // Can't radiate from a player - for (final Card c : CardUtil.getRadiance(host, origin, sa.getParam("ValidTgts").split(","))) { - untargetedCards.add(c); - } + untargetedCards.addAll(CardUtil.getRadiance(host, origin, sa.getParam("ValidTgts").split(","))); } } @@ -96,12 +94,12 @@ public class DamagePreventEffect extends SpellAbilityEffect { final Card c = (Card) o; if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) { if (preventionWithEffect) { - Map effectMap = new TreeMap(); + Map effectMap = new TreeMap<>(); effectMap.put("EffectString", sa.getSVar(sa.getParam("PreventionSubAbility"))); effectMap.put("ShieldAmount", String.valueOf(numDam)); if (sa.hasParam("ShieldEffectTarget")) { String effTgtString = ""; - List effTgts = new ArrayList(); + List effTgts = new ArrayList<>(); effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa); for (final Object effTgt : effTgts) { if (effTgt instanceof Card) { @@ -123,12 +121,12 @@ public class DamagePreventEffect extends SpellAbilityEffect { final Player p = (Player) o; if (!targeted || p.canBeTargetedBy(sa)) { if (preventionWithEffect) { - Map effectMap = new TreeMap(); + Map effectMap = new TreeMap<>(); effectMap.put("EffectString", sa.getSVar(sa.getParam("PreventionSubAbility"))); effectMap.put("ShieldAmount", String.valueOf(numDam)); if (sa.hasParam("ShieldEffectTarget")) { String effTgtString = ""; - List effTgts = new ArrayList(); + List effTgts = new ArrayList<>(); effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa); for (final Object effTgt : effTgts) { if (effTgt instanceof Card) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java index d3c5ab0bc4c..33cd4a6aaf7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java @@ -30,9 +30,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { Map mapParams = Maps.newHashMap(sa.getMapParams()); - if (mapParams.containsKey("Cost")) { - mapParams.remove("Cost"); - } + mapParams.remove("Cost"); if (mapParams.containsKey("SpellDescription")) { mapParams.put("TriggerDescription", mapParams.get("SpellDescription")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java index b8d71057e54..e53e99e19c0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java @@ -78,10 +78,8 @@ public class DestroyEffect extends SpellAbilityEffect { CardCollection untargetedCards = new CardCollection(); if (sa.hasParam("Radiance")) { - for (final Card c : CardUtil.getRadiance(card, tgtCards.get(0), - sa.getParam("ValidTgts").split(","))) { - untargetedCards.add(c); - } + untargetedCards.addAll(CardUtil.getRadiance(card, tgtCards.get(0), + sa.getParam("ValidTgts").split(","))); } if (tgtCards.size() > 1) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index f3e66bad91b..dca94e86b5d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -167,9 +167,7 @@ public class DigEffect extends SpellAbilityEffect { if (!noMove) { CardCollection movedCards; - for (final Card c : top) { - rest.add(c); - } + rest.addAll(top); CardCollection valid; if (mitosis) { valid = sharesNameWithCardOnBattlefield(game, top); @@ -264,7 +262,7 @@ public class DigEffect extends SpellAbilityEffect { if ( p == chooser ) { // the digger can still see all the dug cards when choosing chooser.getController().tempShowCards(top); } - List chosen = new ArrayList(); + List chosen = new ArrayList<>(); int max = anyNumber ? valid.size() : Math.min(valid.size(),destZone1ChangeNum); int min = (anyNumber || optional) ? 0 : max; diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java index ac5bd969092..4218d8897f7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java @@ -108,7 +108,7 @@ public class DiscardEffect extends SpellAbilityEffect { final Game game = source.getGame(); //final boolean anyNumber = sa.hasParam("AnyNumber"); - final List discarded = new ArrayList(); + final List discarded = new ArrayList<>(); final List targets = getTargetPlayers(sa), discarders; Player firstTarget = null; diff --git a/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java index 20353da8342..873a8fab135 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java @@ -27,7 +27,7 @@ public class DrainManaEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - List drained = new ArrayList(); + List drained = new ArrayList<>(); for (final Player p : getTargetPlayers(sa)) { if ((tgt == null) || p.canBeTargetedBy(sa)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java index 6ededdfbf7c..7b0754c09cf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java @@ -45,7 +45,7 @@ public class EncodeEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); - sb.append("Do you want to exile " + host + " and encode it onto a creature you control?"); + sb.append("Do you want to exile ").append(host).append(" and encode it onto a creature you control?"); if (!player.getController().confirmAction(sa, null, sb.toString())) { return; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java index 4029bfd4d12..aa57af95f61 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java @@ -26,10 +26,10 @@ public class FightEffect extends DamageBaseEffect { List fighters = getFighters(sa); if (fighters.size() > 1) { - sb.append(fighters.get(0) + " fights " + fighters.get(1)); + sb.append(fighters.get(0)).append(" fights ").append(fighters.get(1)); } else if (fighters.size() == 1) { - sb.append(fighters.get(0) + " fights unknown"); + sb.append(fighters.get(0)).append(" fights unknown"); } return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java index 9724391b980..c23c2fb8f78 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java @@ -35,7 +35,7 @@ public class FlipCoinEffect extends SpellAbilityEffect { sb.append(player).append(" flips a coin."); if (tgts != null && !tgts.isEmpty()) { - sb.append(" Targeting: " + tgts + "."); + sb.append(" Targeting: ").append(tgts).append("."); } return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java index a96057b6c34..8fe2f8b4813 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java @@ -29,9 +29,7 @@ public class ImmediateTriggerEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { Map mapParams = Maps.newHashMap(sa.getMapParams()); - if (mapParams.containsKey("Cost")) { - mapParams.remove("Cost"); - } + mapParams.remove("Cost"); if (mapParams.containsKey("SpellDescription")) { mapParams.put("TriggerDescription", mapParams.get("SpellDescription")); diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java index d4af63d3a8e..39693308a68 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeLoseEffect.java @@ -43,12 +43,12 @@ public class LifeLoseEffect extends SpellAbilityEffect { lifeLost += p.loseLife(lifeAmount); } } - sa.getHostCard().setSVar("AFLifeLost", "Number$" + Integer.toString(lifeLost)); + sa.getHostCard().setSVar("AFLifeLost", "Number$" + lifeLost); // Exceptional case for Extort: must propagate the amount of life lost to subability, // otherwise the first Extort trigger per game won't work if (sa.getSubAbility() != null && ApiType.GainLife.equals(sa.getSubAbility().getApi())) { - sa.getSubAbility().setSVar("AFLifeLost", "Number$" + Integer.toString(lifeLost)); + sa.getSubAbility().setSVar("AFLifeLost", "Number$" + lifeLost); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java index 984f76b5ab4..5224b7792a6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java @@ -19,7 +19,7 @@ public class LifeSetEffect extends SpellAbilityEffect { final boolean redistribute = sa.hasParam("Redistribute"); final int lifeAmount = redistribute ? 20 : AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("LifeAmount"), sa); final TargetRestrictions tgt = sa.getTargetRestrictions(); - final List lifetotals = new ArrayList(); + final List lifetotals = new ArrayList<>(); if (redistribute) { for (final Player p : getTargetPlayers(sa)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java index 1bbe40ac2a3..eca41963660 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java @@ -105,7 +105,7 @@ public class MillEffect extends SpellAbilityEffect { sb.append("s"); } final String millPosition = sa.hasParam("FromBottom") ? "bottom" : "top"; - sb.append(" from the " + millPosition + " of their library."); + sb.append(" from the ").append(millPosition).append(" of their library."); return sb.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java index f48ca1824c9..504d17ba0b1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java @@ -23,7 +23,7 @@ public class MustBlockEffect extends SpellAbilityEffect { if (sa.hasParam("DefinedAttacker")) { cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa); } else { - cards = new ArrayList(); + cards = new ArrayList<>(); cards.add(host); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 38dceefcb16..4056b367799 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -97,7 +97,7 @@ public class PlayEffect extends SpellAbilityEffect { cards = Lists.newArrayList(Iterables.filter(cards, cpp)); } if (sa.hasParam("RandomCopied")) { - final List copysource = new ArrayList(cards); + final List copysource = new ArrayList<>(cards); final CardCollection choice = new CardCollection(); final String num = sa.hasParam("RandomNum") ? sa.getParam("RandomNum") : "1"; int ncopied = AbilityUtils.calculateAmount(source, num, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java index 2a09ba0eb5b..6f09ea7e577 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java @@ -48,7 +48,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { final boolean isChoice = sa.getParam("Gains").contains("Choice"); final List choices = ProtectEffect.getProtectionList(sa); - final List gains = new ArrayList(); + final List gains = new ArrayList<>(); if (isChoice) { Player choser = sa.getActivatingPlayer(); final String choice = choser.getController().chooseProtectionType("Choose a protection", sa, choices); @@ -123,7 +123,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { final List playerList = AbilityUtils.getDefinedPlayers(host, players, sa); for (final Player player : playerList) { for (final String gain : gains) { - player.addChangedKeywords(ImmutableList.of("Protection from " + gain), ImmutableList.of(), timestamp); + player.addChangedKeywords(ImmutableList.of("Protection from " + gain), ImmutableList.of(), timestamp); } if (!sa.hasParam("Permanent")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java index 3b2b1fe6445..dd4769a547a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java @@ -27,7 +27,7 @@ public class ProtectEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final List gains = getProtectionList(sa); - final boolean choose = (sa.hasParam("Choices")) ? true : false; + final boolean choose = sa.hasParam("Choices"); final String joiner = choose ? "or" : "and"; final StringBuilder sb = new StringBuilder(); @@ -100,7 +100,7 @@ public class ProtectEffect extends SpellAbilityEffect { final boolean isChoice = sa.getParam("Gains").contains("Choice"); final List choices = getProtectionList(sa); - final List gains = new ArrayList(); + final List gains = new ArrayList<>(); final List tgtCards = getTargetCards(sa); if (isChoice && !choices.isEmpty()) { @@ -128,14 +128,12 @@ public class ProtectEffect extends SpellAbilityEffect { gainsKWList.add(TextUtil.concatWithSpace("Protection from", color)); } - final List untargetedCards = new ArrayList(); + final List untargetedCards = new ArrayList<>(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (sa.hasParam("Radiance") && (tgt != null)) { - for (final Card c : CardUtil.getRadiance(host, tgtCards.get(0), - sa.getParam("ValidTgts").split(","))) { - untargetedCards.add(c); - } + untargetedCards.addAll(CardUtil.getRadiance(host, tgtCards.get(0), + sa.getParam("ValidTgts").split(","))); } @@ -205,7 +203,7 @@ public class ProtectEffect extends SpellAbilityEffect { public static List getProtectionList(final SpellAbility sa) { - final List gains = new ArrayList(); + final List gains = new ArrayList<>(); final String gainStr = sa.getParam("Gains"); if (gainStr.equals("Choice")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index c149b976412..010914c6775 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -49,9 +49,17 @@ public class PumpAllEffect extends SpellAbilityEffect { continue; } - tgtC.addTempPowerBoost(a); - tgtC.addTempToughnessBoost(d); + boolean redrawPT = false; + + if (a != 0 || d != 0) { + tgtC.addPTBoost(a, d, timestamp); + redrawPT = true; + } + tgtC.addChangedCardKeywords(kws, null, false, false, timestamp); + if (redrawPT) { + tgtC.updatePowerToughnessForView(); + } for (String kw : hiddenkws) { tgtC.addHiddenExtrinsicKeyword(kw); @@ -68,13 +76,13 @@ public class PumpAllEffect extends SpellAbilityEffect { @Override public void run() { - tgtC.addTempPowerBoost(-1 * a); - tgtC.addTempToughnessBoost(-1 * d); + tgtC.removePTBoost(timestamp); tgtC.removeChangedCardKeywords(timestamp); for (String kw : hiddenkws) { tgtC.removeHiddenExtrinsicKeyword(kw); } + tgtC.updatePowerToughnessForView(); game.fireEvent(new GameEventCardStatsChanged(tgtC)); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 68936a2f7ae..1c89e3a66ff 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -55,13 +55,24 @@ public class PumpEffect extends SpellAbilityEffect { } } - gameCard.addTempPowerBoost(a); - gameCard.addTempToughnessBoost(d); - gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, timestamp); + if (a != 0 || d != 0) { + gameCard.addPTBoost(a, d, timestamp); + redrawPT = true; + } + + gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, timestamp); if (redrawPT) { gameCard.updatePowerToughnessForView(); } - + + if (sa.hasParam("CanBlockAny")) { + gameCard.addCanBlockAny(timestamp); + } + if (sa.hasParam("CanBlockAmount")) { + int v = AbilityUtils.calculateAmount(host, sa.getParam("CanBlockAmount"), sa, true); + gameCard.addCanBlockAdditional(v, timestamp); + } + if (sa.hasParam("LeaveBattlefield")) { addLeaveBattlefieldReplacement(gameCard, sa, sa.getParam("LeaveBattlefield")); } @@ -73,23 +84,24 @@ public class PumpEffect extends SpellAbilityEffect { @Override public void run() { - gameCard.addTempPowerBoost(-1 * a); - gameCard.addTempToughnessBoost(-1 * d); + gameCard.removePTBoost(timestamp); + boolean updateText = false; + updateText = gameCard.removeCanBlockAny(timestamp) || updateText; + updateText = gameCard.removeCanBlockAdditional(timestamp) || updateText; if (keywords.size() > 0) { - boolean redrawPT = false; for (String kw : keywords) { - redrawPT |= kw.contains("CARDNAME's power and toughness are switched"); if (kw.startsWith("HIDDEN")) { gameCard.removeHiddenExtrinsicKeyword(kw); - if (redrawPT) { - gameCard.updatePowerToughnessForView(); - } } } gameCard.removeChangedCardKeywords(timestamp); } + gameCard.updatePowerToughnessForView(); + if (updateText) { + gameCard.updateAbilityTextForView(); + } game.fireEvent(new GameEventCardStatsChanged(gameCard)); } @@ -108,7 +120,7 @@ public class PumpEffect extends SpellAbilityEffect { && !(host.isInPlay() || host.isInZone(ZoneType.Stack))) { return; } - p.addChangedKeywords(keywords, ImmutableList.of(), timestamp); + p.addChangedKeywords(keywords, ImmutableList.of(), timestamp); if (!sa.hasParam("Permanent")) { // If not Permanent, remove Pumped at EOT @@ -191,7 +203,12 @@ public class PumpEffect extends SpellAbilityEffect { final int atk = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumAtt"), sa, true); final int def = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumDef"), sa, true); - sb.append("gains "); + boolean gains = sa.hasParam("NumAtt") || sa.hasParam("NumDef") || !keywords.isEmpty(); + + if (gains) { + sb.append("gains "); + } + if (sa.hasParam("NumAtt") || sa.hasParam("NumDef")) { if (atk >= 0) { sb.append("+"); @@ -209,8 +226,25 @@ public class PumpEffect extends SpellAbilityEffect { sb.append(keywords.get(i)).append(" "); } + if (sa.hasParam("CanBlockAny")) { + if (gains) { + sb.append(" and "); + } + sb.append("can block any number of creatures "); + } else if (sa.hasParam("CanBlockAmount")) { + if (gains) { + sb.append(" and "); + } + String n = sa.getParam("CanBlockAmount"); + sb.append("can block an additional "); + sb.append("1".equals(n) ? "creature" : Lang.nounWithNumeral(n, "creature")); + sb.append(" each combat "); + } + if (!sa.hasParam("Permanent")) { sb.append("until end of turn."); + } else { + sb.append("."); } } @@ -254,7 +288,7 @@ public class PumpEffect extends SpellAbilityEffect { if (defined.equals("ChosenType")) { replaced = host.getChosenType(); } else if (defined.equals("CardUIDSource")) { - replaced = "CardUID_" + String.valueOf(host.getId()); + replaced = "CardUID_" + host.getId(); } else if (defined.equals("ActivatorName")) { replaced = sa.getActivatingPlayer().getName(); } @@ -279,9 +313,7 @@ public class PumpEffect extends SpellAbilityEffect { if (sa.hasParam("NoRepetition")) { for (KeywordInterface inst : tgtCards.get(0).getKeywords()) { final String kws = inst.getOriginal(); - if (total.contains(kws)) { - total.remove(kws); - } + total.remove(kws); } } final int min = Math.min(total.size(), numkw); @@ -336,10 +368,8 @@ public class PumpEffect extends SpellAbilityEffect { } if (sa.hasParam("Radiance")) { - for (final Card c : CardUtil.getRadiance(host, tgtCards.get(0), sa.getParam("ValidTgts") - .split(","))) { - untargetedCards.add(c); - } + untargetedCards.addAll(CardUtil.getRadiance(host, tgtCards.get(0), sa.getParam("ValidTgts") + .split(","))); } final ZoneType pumpZone = sa.hasParam("PumpZone") ? ZoneType.smartValueOf(sa.getParam("PumpZone")) diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index d89e2c9066b..4641d05d75f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -29,10 +29,10 @@ public class RestartGameEffect extends SpellAbilityEffect { final Player activator = sa.getActivatingPlayer(); final Game game = activator.getGame(); FCollectionView players = game.getPlayers(); - Map> playerLibraries = new HashMap>(); + Map> playerLibraries = new HashMap<>(); // Don't grab Ante Zones - List restartZones = new ArrayList(Arrays.asList(ZoneType.Battlefield, + List restartZones = new ArrayList<>(Arrays.asList(ZoneType.Battlefield, ZoneType.Library, ZoneType.Graveyard, ZoneType.Hand, ZoneType.Exile, ZoneType.Command)); ZoneType leaveZone = ZoneType.smartValueOf(sa.hasParam("RestrictFromZone") ? sa.getParam("RestrictFromZone") : null); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java index 903c20b25d0..e812e83a209 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java @@ -20,7 +20,7 @@ public class RunSVarAbilityEffect extends SpellAbilityEffect { if (sVars == null || cards.isEmpty()) { return; } - List validSA = new ArrayList(); + List validSA = new ArrayList<>(); final boolean isTrigger = sa.hasParam("IsTrigger"); for (final Card tgtC : cards) { if (!tgtC.hasSVar(sVars)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java index 607c18d793c..367d9785286 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java @@ -62,7 +62,7 @@ public class SacrificeEffect extends SpellAbilityEffect { game.updateLastStateForCard(card); StringBuilder sb = new StringBuilder(); - sb.append("Cumulative upkeep for " + card); + sb.append("Cumulative upkeep for ").append(card); boolean isPaid = activator.getController().payManaOptional(card, payCost, sa, sb.toString(), ManaPaymentPurpose.CumulativeUpkeep); final Map runParams = Maps.newHashMap(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java index 32d4d05e12e..a74bb75cd6f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java @@ -14,8 +14,8 @@ public class StoreMapEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card source = sa.getHostCard(); - List entity = new ArrayList(); - List objects = new ArrayList(); + List entity = new ArrayList<>(); + List objects = new ArrayList<>(); if (sa.hasParam("RememberEntity")) { entity.addAll(AbilityUtils.getDefinedPlayers(source, sa.getParam("RememberEntity"), sa)); diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 548b7b18844..3c590887b26 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -368,14 +368,14 @@ public class TokenEffect extends SpellAbilityEffect { } private String parseColorForImage() { - String originalColorDesc = ""; + StringBuilder originalColorDesc = new StringBuilder(); for (final String col : this.tokenOriginalColors) { - originalColorDesc += MagicColor.toShortString(col); - if (originalColorDesc.equals("C")) { - return originalColorDesc; + originalColorDesc.append(MagicColor.toShortString(col)); + if (originalColorDesc.toString().equals("C")) { + return originalColorDesc.toString(); } } - return originalColorDesc; + return originalColorDesc.toString(); } private String determineTokenColor(Card host) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index d25125b73df..37febec93c9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -106,16 +106,16 @@ public class TwoPilesEffect extends SpellAbilityEffect { CardCollectionView chosenPile = pile1WasChosen ? pile1 : pile2; CardCollectionView unchosenPile = !pile1WasChosen ? pile1 : pile2; - String notification = chooser + " chooses Pile " + (pile1WasChosen ? "1" : "2") + ":\n"; + StringBuilder notification = new StringBuilder(chooser + " chooses Pile " + (pile1WasChosen ? "1" : "2") + ":\n"); if (!chosenPile.isEmpty()) { for (Card c : chosenPile) { - notification += c.getName() + "\n"; + notification.append(c.getName()).append("\n"); } } else { - notification += "(Empty pile)"; + notification.append("(Empty pile)"); } - p.getGame().getAction().nofityOfValue(sa, chooser, notification, chooser); + p.getGame().getAction().nofityOfValue(sa, chooser, notification.toString(), chooser); // take action on the chosen pile if (sa.hasParam("ChosenPile")) { 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 8e08f99c1bb..9a10954b1f2 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -113,7 +113,7 @@ public class Card extends GameEntity implements Comparable { private final Map mayPlay = Maps.newHashMap(); - private final Multimap withFlash = HashMultimap.create(); + private final Multimap withFlash = HashMultimap.create(); // changes by AF animate and continuous static effects - timestamp is the key of maps private final Map changedCardTypes = Maps.newTreeMap(); @@ -123,6 +123,8 @@ public class Card extends GameEntity implements Comparable { private final NavigableMap clonedStates = Maps.newTreeMap(); private final NavigableMap textChangeStates = Maps.newTreeMap(); + private final Map canBlockAdditional = Maps.newTreeMap(); + private final Set canBlockAny = Sets.newHashSet(); // changes that say "replace each instance of one [color,type] by another - timestamp is the key of maps private final CardChangedWords changedTextColors = new CardChangedWords(); @@ -195,6 +197,8 @@ public class Card extends GameEntity implements Comparable { // stack of set power/toughness private Map> newPT = Maps.newTreeMap(); private Map> newPTCharacterDefining = Maps.newTreeMap(); + private Map> boostPT = Maps.newTreeMap(); + private String basePowerString = null; private String baseToughnessString = null; private String oracleText = ""; @@ -208,12 +212,6 @@ public class Card extends GameEntity implements Comparable { private int turnInZone; - private int tempPowerBoost = 0; - private int tempToughnessBoost = 0; - - private int semiPermanentPowerBoost = 0; - private int semiPermanentToughnessBoost = 0; - private int xManaCostPaid = 0; private Map xManaCostPaidByColor; @@ -1200,9 +1198,7 @@ public class Card extends GameEntity implements Comparable { if (type == CounterType.DREAM) { // need to be done extra because it is also a state based action - if (hasKeyword("CARDNAME can't have more than seven dream counters on it.") && getCounters(CounterType.DREAM) > 6) { - return false; - } + return !hasKeyword("CARDNAME can't have more than seven dream counters on it.") || getCounters(CounterType.DREAM) <= 6; } return true; } @@ -1658,13 +1654,13 @@ public class Card extends GameEntity implements Comparable { if (!mCost.isOnlyManaCost()) { sbLong.append("."); } - sbLong.append(" (" + inst.getReminderText() + ")"); + sbLong.append(" (").append(inst.getReminderText()).append(")"); sbLong.append("\r\n"); } } else if (keyword.startsWith("Emerge")) { final String[] k = keyword.split(":"); sbLong.append(k[0]).append(" ").append(ManaCostParser.parse(k[1])); - sbLong.append(" (" + inst.getReminderText() + ")"); + sbLong.append(" (").append(inst.getReminderText()).append(")"); sbLong.append("\r\n"); } else if (keyword.startsWith("Echo")) { sbLong.append("Echo "); @@ -1695,7 +1691,7 @@ public class Card extends GameEntity implements Comparable { final String[] n = keyword.split(":"); final Cost cost = new Cost(n[1], false); sbLong.append("Multikicker ").append(cost.toSimpleString()); - sbLong.append(" (" + inst.getReminderText() + ")").append("\r\n"); + sbLong.append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } } else if (keyword.startsWith("Kicker")) { if (!keyword.endsWith("Generic")) { @@ -1709,11 +1705,11 @@ public class Card extends GameEntity implements Comparable { final Cost cost2 = new Cost(n[2], false); sbx.append(cost2.toSimpleString()); } - sbx.append(" (" + inst.getReminderText() + ")"); + sbx.append(" (").append(inst.getReminderText()).append(")"); sbLong.append(sbx).append("\r\n"); } } else if (keyword.startsWith("Hexproof:")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); sbLong.append("Hexproof from ").append(k[2]) .append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } else if (keyword.endsWith(".") && !keyword.startsWith("Haunt")) { @@ -1739,10 +1735,10 @@ public class Card extends GameEntity implements Comparable { || keyword.equals("Hideaway") || keyword.equals("Ascend") || keyword.equals("Totem armor") || keyword.equals("Battle cry") || keyword.equals("Devoid") || keyword.equals("Riot")){ - sbLong.append(keyword + " (" + inst.getReminderText() + ")"); + sbLong.append(keyword).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Partner:")) { final String[] k = keyword.split(":"); - sbLong.append("Partner with " + k[1] + " (" + inst.getReminderText() + ")"); + sbLong.append("Partner with ").append(k[1]).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Modular") || keyword.startsWith("Bloodthirst") || keyword.startsWith("Dredge") || keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido") || keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb") @@ -1751,7 +1747,7 @@ public class Card extends GameEntity implements Comparable { || keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") || keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) { final String[] k = keyword.split(":"); - sbLong.append(k[0] + " " + k[1] + " (" + inst.getReminderText() + ")"); + sbLong.append(k[0]).append(" ").append(k[1]).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.contains("Haunt")) { sb.append("\r\nHaunt ("); if (isCreature()) { @@ -1772,14 +1768,14 @@ public class Card extends GameEntity implements Comparable { if (sb.length() != 0) { sb.append("\r\n"); } - sb.append(keyword + " (" + inst.getReminderText() + ")"); + sb.append(keyword).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.endsWith(" offering")) { String offeringType = keyword.split(" ")[0]; if (sb.length() != 0) { sb.append("\r\n"); } sbLong.append(keyword); - sbLong.append(" (" + Keyword.getInstance("Offering:"+ offeringType).getReminderText() + ")"); + sbLong.append(" (").append(Keyword.getInstance("Offering:" + offeringType).getReminderText()).append(")"); } else if (keyword.startsWith("Equip") || keyword.startsWith("Fortify") || keyword.startsWith("Outlast") || keyword.startsWith("Unearth") || keyword.startsWith("Scavenge") || keyword.startsWith("Spectacle") || keyword.startsWith("Evoke") || keyword.startsWith("Bestow") || keyword.startsWith("Dash") @@ -1807,7 +1803,7 @@ public class Card extends GameEntity implements Comparable { } else if (keyword.equals("AllNonLegendaryCreatureNames")) { sbLong.append(getName()).append(" has all names of nonlegendary creature cards.\r\n"); } else if (keyword.startsWith("IfReach")) { - String k[] = keyword.split(":"); + String[] k = keyword.split(":"); sbLong.append(getName()).append(" can block ") .append(CardType.getPluralType(k[1])) .append(" as though it had reach.\r\n"); @@ -1817,7 +1813,7 @@ public class Card extends GameEntity implements Comparable { String desc = AbilityFactory.getMapParams(getSVar(k[1])).get("SpellDescription"); sbLong.append(desc); } else if (keyword.startsWith("Saga")) { - String k[] = keyword.split(":"); + String[] k = keyword.split(":"); String desc = "(As this Saga enters and after your draw step, " + " add a lore counter. Sacrifice after " + Strings.repeat("I", Integer.valueOf(k[1])) + ".)"; sbLong.append(desc); @@ -1941,7 +1937,7 @@ public class Card extends GameEntity implements Comparable { String meld = this.getRules().getMeldWith(); if (meld != "" && (!hasMeldEffect)) { sb.append("\r\n"); - sb.append("(Melds with " + meld + ".)"); + sb.append("(Melds with ").append(meld).append(".)"); sb.append("\r\n"); } } @@ -2048,9 +2044,10 @@ public class Card extends GameEntity implements Comparable { } if (isGoaded()) { - sb.append("is goaded by: " + Lang.joinHomogenous(getGoaded())); + sb.append("is goaded by: ").append(Lang.joinHomogenous(getGoaded())); sb.append("\r\n"); } + // replace triple line feeds with double line feeds int start; final String s = "\r\n\r\n\r\n"; @@ -2110,17 +2107,17 @@ public class Card extends GameEntity implements Comparable { || keyword.equals("Undaunted") || keyword.equals("Cascade") || keyword.equals("Devoid") || keyword.equals("Lifelink") || keyword.equals("Split second")) { - sbBefore.append(keyword + " (" + inst.getReminderText() + ")"); + sbBefore.append(keyword).append(" (").append(inst.getReminderText()).append(")"); sbBefore.append("\r\n"); } else if(keyword.equals("Conspire") || keyword.equals("Epic") || keyword.equals("Suspend") || keyword.equals("Jump-start")) { - sbAfter.append(keyword + " (" + inst.getReminderText() + ")"); + sbAfter.append(keyword).append(" (").append(inst.getReminderText()).append(")"); sbAfter.append("\r\n"); } else if (keyword.startsWith("Ripple")) { - sbBefore.append(TextUtil.fastReplace(keyword, ":", " ") + " (" + inst.getReminderText() + ")"); + sbBefore.append(TextUtil.fastReplace(keyword, ":", " ")).append(" (").append(inst.getReminderText()).append(")"); sbBefore.append("\r\n"); } else if (keyword.startsWith("Dredge")) { - sbAfter.append(TextUtil.fastReplace(keyword, ":", " ") + " (" + inst.getReminderText() + ")"); + sbAfter.append(TextUtil.fastReplace(keyword, ":", " ")).append(" (").append(inst.getReminderText()).append(")"); sbAfter.append("\r\n"); } else if (keyword.startsWith("Escalate") || keyword.startsWith("Buyback") || keyword.startsWith("Prowl")) { @@ -2135,14 +2132,13 @@ public class Card extends GameEntity implements Comparable { sbCost.append(" "); } sbCost.append(cost.toSimpleString()); - sbBefore.append(sbCost + " (" + inst.getReminderText() + ")"); + sbBefore.append(sbCost).append(" (").append(inst.getReminderText()).append(")"); sbBefore.append("\r\n"); } else if (keyword.startsWith("Multikicker")) { if (!keyword.endsWith("Generic")) { final String[] n = keyword.split(":"); final Cost cost = new Cost(n[1], false); - sbBefore.append("Multikicker ").append(cost.toSimpleString()) - .append(" (" + inst.getReminderText() + ")").append("\r\n"); + sbBefore.append("Multikicker ").append(cost.toSimpleString()).append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } } else if (keyword.startsWith("Kicker")) { if (!keyword.endsWith("Generic")) { @@ -2156,7 +2152,7 @@ public class Card extends GameEntity implements Comparable { final Cost cost2 = new Cost(n[2], false); sbx.append(cost2.toSimpleString()); } - sbx.append(" (" + inst.getReminderText() + ")"); + sbx.append(" (").append(inst.getReminderText()).append(")"); sbBefore.append(sbx).append("\r\n"); } }else if (keyword.startsWith("AlternateAdditionalCost")) { @@ -2185,7 +2181,7 @@ public class Card extends GameEntity implements Comparable { sbCost.append(" "); } sbCost.append(cost.toSimpleString()); - sbAfter.append(sbCost + " (" + inst.getReminderText() + ")"); + sbAfter.append(sbCost).append(" (").append(inst.getReminderText()).append(")"); sbAfter.append("\r\n"); } else if (keyword.equals("CARDNAME can't be countered.") || keyword.equals("Remove CARDNAME from your deck before playing if you're not playing for ante.")) { @@ -2205,7 +2201,7 @@ public class Card extends GameEntity implements Comparable { if (n.length > 3) { desc = n[3]; } else { - String k[] = n[1].split(","); + String[] k = n[1].split(","); for (int i = 0; i < k.length; i++) { if (CardType.isACardType(k[i])) { k[i] = k[i].toLowerCase(); @@ -2215,7 +2211,7 @@ public class Card extends GameEntity implements Comparable { } sbAfter.append("Splice onto ").append(desc).append(" ").append(cost.toSimpleString()); - sbAfter.append(" (" + inst.getReminderText() + ")").append("\r\n"); + sbAfter.append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } else if (keyword.equals("Storm")) { sbAfter.append("Storm ("); @@ -3343,7 +3339,7 @@ public class Card extends GameEntity implements Comparable { } public final StatBreakdown getUnswitchedPowerBreakdown() { - return new StatBreakdown(getCurrentPower(), getTempPowerBoost(), getSemiPermanentPowerBoost(), getPowerBonusFromCounters()); + return new StatBreakdown(getCurrentPower(), getTempPowerBoost(), getPowerBonusFromCounters()); } public final int getUnswitchedPower() { return getUnswitchedPowerBreakdown().getTotal(); @@ -3380,31 +3376,28 @@ public class Card extends GameEntity implements Comparable { public static class StatBreakdown { public final int currentValue; public final int tempBoost; - public final int semiPermanentBoost; public final int bonusFromCounters; public StatBreakdown() { this.currentValue = 0; this.tempBoost = 0; - this.semiPermanentBoost = 0; this.bonusFromCounters = 0; } - public StatBreakdown(int currentValue, int tempBoost, int semiPermanentBoost, int bonusFromCounters){ + public StatBreakdown(int currentValue, int tempBoost, int bonusFromCounters){ this.currentValue = currentValue; this.tempBoost = tempBoost; - this.semiPermanentBoost = semiPermanentBoost; this.bonusFromCounters = bonusFromCounters; } public int getTotal() { - return currentValue + tempBoost + semiPermanentBoost + bonusFromCounters; + return currentValue + tempBoost + bonusFromCounters; } @Override public String toString() { - return TextUtil.concatWithSpace("c:"+String.valueOf(currentValue),"tb:"+String.valueOf(tempBoost), "spb:"+String.valueOf(semiPermanentBoost),"bfc:"+String.valueOf(bonusFromCounters)); + return TextUtil.concatWithSpace("c:"+ currentValue,"tb:"+ tempBoost,"bfc:"+ bonusFromCounters); } } public final StatBreakdown getUnswitchedToughnessBreakdown() { - return new StatBreakdown(getCurrentToughness(), getTempToughnessBoost(), getSemiPermanentToughnessBoost(), getToughnessBonusFromCounters()); + return new StatBreakdown(getCurrentToughness(), getTempToughnessBoost(), getToughnessBonusFromCounters()); } public final int getUnswitchedToughness() { return getUnswitchedToughnessBreakdown().getTotal(); @@ -3465,62 +3458,44 @@ public class Card extends GameEntity implements Comparable { // for cards like Giant Growth, etc. public final int getTempPowerBoost() { - return tempPowerBoost; + int result = 0; + for (Pair pair : boostPT.values()) { + if (pair.getLeft() != null) { + result += pair.getLeft(); + } + } + return result; } public final int getTempToughnessBoost() { - return tempToughnessBoost; - } - - public final void addTempPowerBoost(final int n) { - if (n == 0) { return; } - tempPowerBoost += n; - currentState.getView().updatePower(this); - } - - public final void addTempToughnessBoost(final int n) { - if (n == 0) { return; } - tempToughnessBoost += n; - currentState.getView().updateToughness(this); - } - - // for cards like Glorious Anthem, etc. - public final int getSemiPermanentPowerBoost() { - return semiPermanentPowerBoost; - } - - public final int getSemiPermanentToughnessBoost() { - return semiPermanentToughnessBoost; - } - - public final void addSemiPermanentPowerBoost(final int n, final boolean updateViewImmediately) { - if (n == 0) { return; } - semiPermanentPowerBoost += n; - if (updateViewImmediately) { - currentState.getView().updatePower(this); + int result = 0; + for (Pair pair : boostPT.values()) { + if (pair.getRight() != null) { + result += pair.getRight(); + } } + return result; } - public final void addSemiPermanentToughnessBoost(final int n, final boolean updateViewImmediately) { - if (n == 0) { return; } - semiPermanentToughnessBoost += n; - if (updateViewImmediately) { - currentState.getView().updateToughness(this); + public void addPTBoost(final Integer power, final Integer toughness, final long timestamp) { + boostPT.put(timestamp, Pair.of(power, toughness)); + } + + public void removePTBoost(final long timestamp) { + boostPT.remove(timestamp); + } + + public Map> getPTBoostMap() { + return ImmutableMap.copyOf(boostPT); + } + + public void setPTBoost(Map> map) { + this.boostPT.clear(); + for (Map.Entry> e : map.entrySet()) { + this.boostPT.put(e.getKey(), Pair.of(e.getValue().getLeft(), e.getValue().getRight())); } } - public final void setSemiPermanentPowerBoost(final int n) { - if (semiPermanentPowerBoost == n) { return; } - semiPermanentPowerBoost = n; - currentState.getView().updatePower(this); - } - - public final void setSemiPermanentToughnessBoost(final int n) { - if (semiPermanentToughnessBoost == n) { return; } - semiPermanentToughnessBoost = n; - currentState.getView().updateToughness(this); - } - public final boolean isUntapped() { return !tapped; } @@ -4810,7 +4785,7 @@ public class Card extends GameEntity implements Comparable { CardCollection newCardsInCommand = (CardCollection)getGame().getCardsIn(ZoneType.Command); newCardsInCommand.removeAll(cardsInCommand); if (!newCardsInCommand.isEmpty()) { - newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + Integer.toString(dmgToBePrevented)); + newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + dmgToBePrevented); } } subtractPreventNextDamageWithEffect(shieldSource, restDamage); @@ -5105,7 +5080,7 @@ public class Card extends GameEntity implements Comparable { addChangedCardTypes(new CardType(Collections.singletonList("Aura")), new CardType(Collections.singletonList("Creature")), false, false, false, false, false, false, true, bestowTimestamp, updateView); - addChangedCardKeywords(Collections.singletonList("Enchant creature"), Lists.newArrayList(), + addChangedCardKeywords(Collections.singletonList("Enchant creature"), Lists.newArrayList(), false, false, bestowTimestamp, updateView); } @@ -5409,7 +5384,7 @@ public class Card extends GameEntity implements Comparable { switch (kw.getOriginal()) { case "Shroud": StringBuilder sb = new StringBuilder(); - sb.append("Can target CardUID_").append(String.valueOf(getId())); + sb.append("Can target CardUID_").append(getId()); sb.append(" with spells and abilities as though it didn't have shroud."); if (sa.getActivatingPlayer() == null) { System.err.println("Unexpected behavior: SA activator was null when trying to determine if the activating player could target a card with Shroud. SA host card = " + source + ", SA = " + sa); @@ -5472,9 +5447,7 @@ public class Card extends GameEntity implements Comparable { } // check valid - if (!isValid(tgt.getValidTgts(), aura.getController(), aura, sa)) { - return false; - } + return isValid(tgt.getValidTgts(), aura.getController(), aura, sa); } return true; @@ -5482,18 +5455,12 @@ public class Card extends GameEntity implements Comparable { @Override protected final boolean canBeEquippedBy(final Card equip) { - if (!isCreature() || !isInPlay()) { - return false; - } - return true; + return isCreature() && isInPlay(); } @Override protected boolean canBeFortifiedBy(final Card fort) { - if (!isLand() || !isInPlay() || fort.isLand()) { - return false; - } - return true; + return isLand() && isInPlay() && !fort.isLand(); } /* (non-Javadoc) @@ -5752,11 +5719,7 @@ public class Card extends GameEntity implements Comparable { } } - if (!getController().canSacrificeBy(source)) { - return false; - } - - return true; + return getController().canSacrificeBy(source); } public CardRules getRules() { @@ -6155,10 +6118,7 @@ public class Card extends GameEntity implements Comparable { if (hasKeyword(Keyword.FLASH)) { return true; } - if (withFlash.containsValue(p)) { - return true; - } - return false; + return withFlash.containsValue(p); } public void addWithFlash(Long timestamp, Iterable players) { @@ -6195,11 +6155,7 @@ public class Card extends GameEntity implements Comparable { return false; } - if (!getOwner().canDiscardBy(sa)) { - return false; - } - - return true; + return getOwner().canDiscardBy(sa); } public void addAbilityActivated(SpellAbility ability) { @@ -6271,4 +6227,45 @@ public class Card extends GameEntity implements Comparable { numberTurnActivations.clear(); numberTurnActivationsStatic.clear(); } + + public void addCanBlockAdditional(int n, long timestamp) { + if (n <= 0) { + return; + } + canBlockAdditional.put(timestamp, n); + getView().updateBlockAdditional(this); + } + + public boolean removeCanBlockAdditional(long timestamp) { + boolean result = canBlockAdditional.remove(timestamp) != null; + if (result) { + getView().updateBlockAdditional(this); + } + return result; + } + + public int canBlockAdditional() { + int result = 0; + for (Integer v : canBlockAdditional.values()) { + result += v; + } + return result; + } + + public void addCanBlockAny(long timestamp) { + canBlockAny.add(timestamp); + getView().updateBlockAdditional(this); + } + + public boolean removeCanBlockAny(long timestamp) { + boolean result = canBlockAny.remove(timestamp); + if (result) { + getView().updateBlockAdditional(this); + } + return result; + } + + public boolean canBlockAny() { + return !canBlockAny.isEmpty(); + } } 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 2a69b3e4567..98dab46962d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -645,7 +645,7 @@ public class CardFactory { Trigger t = null; if (sa.isWrapper()) { // copy trigger? - t = ((WrappedAbility) sa).getTrigger(); + t = sa.getTrigger(); } else { // some keyword ability, e.g. Exalted, Annihilator return sa.copy(); } @@ -677,7 +677,7 @@ public class CardFactory { WrappedAbility wrapperAbility = new WrappedAbility(t, trig, ((WrappedAbility) sa).getDecider()); wrapperAbility.setTrigger(true); - wrapperAbility.setMandatory(((WrappedAbility) sa).isMandatory()); + wrapperAbility.setMandatory(sa.isMandatory()); wrapperAbility.setDescription(wrapperAbility.getStackDescription()); t.setTriggeredSA(wrapperAbility); return wrapperAbility; @@ -774,7 +774,7 @@ public class CardFactory { // triggers to add to clone if (sa.hasParam("AddTriggers")) { - for (final String s : Arrays.asList(sa.getParam("AddTriggers").split(","))) { + for (final String s : sa.getParam("AddTriggers").split(",")) { if (origSVars.containsKey(s)) { final String actualTrigger = origSVars.get(s); final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, out, true); @@ -786,7 +786,7 @@ public class CardFactory { // SVars to add to clone if (sa.hasParam("AddSVars") || sa.hasParam("GainTextSVars")) { final String str = sa.getParamOrDefault("GainTextSVars", sa.getParam("AddSVars")); - for (final String s : Arrays.asList(str.split(","))) { + for (final String s : str.split(",")) { if (origSVars.containsKey(s)) { final String actualsVar = origSVars.get(s); state.setSVar(s, actualsVar); @@ -797,7 +797,7 @@ public class CardFactory { // abilities to add to clone if (sa.hasParam("AddAbilities") || sa.hasParam("GainTextAbilities")) { final String str = sa.getParamOrDefault("GainTextAbilities", sa.getParam("AddAbilities")); - for (final String s : Arrays.asList(str.split(","))) { + for (final String s : str.split(",")) { if (origSVars.containsKey(s)) { final String actualAbility = origSVars.get(s); final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, out); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index bf22da56bb6..b6d21204033 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -147,7 +147,7 @@ public class CardFactoryUtil { sbCost.append("— "); } // get rid of the ": " at the end - sbCost.append(costDesc.substring(0, costDesc.length() - 2)); + sbCost.append(costDesc, 0, costDesc.length() - 2); StringBuilder sb = new StringBuilder(); sb.append("ST$ SetState | Cost$ ").append(costStr).append(" | CostDesc$ ").append(sbCost); @@ -292,11 +292,7 @@ public class CardFactoryUtil { * @return a boolean. */ public static boolean isCounterable(final Card c) { - if (c.hasKeyword("CARDNAME can't be countered.") || !c.getCanCounter()) { - return false; - } - - return true; + return !c.hasKeyword("CARDNAME can't be countered.") && c.getCanCounter(); } /** @@ -318,7 +314,7 @@ public class CardFactoryUtil { for (KeywordInterface k : c.getKeywords()) { final String o = k.getOriginal(); if (o.startsWith("CantBeCounteredBy")) { - final String m[] = o.split(":"); + final String[] m = o.split(":"); if (sa.isValid(m[1].split(","), c.getController(), c, null)) { return false; } @@ -905,11 +901,11 @@ public class CardFactoryUtil { if (sq[0].contains("xColorPaid")) { String[] attrs = sq[0].split(" "); - String colors = ""; + StringBuilder colors = new StringBuilder(); for (int i = 1; i < attrs.length; i++) { - colors += attrs[i]; + colors.append(attrs[i]); } - return doXMath(c.getXManaCostPaidCount(colors), m, c); + return doXMath(c.getXManaCostPaidCount(colors.toString()), m, c); } @@ -2117,7 +2113,7 @@ public class CardFactoryUtil { } if (!zone.isEmpty()) { - repEffsb.append(" | ActiveZones$ " + zone); + repEffsb.append(" | ActiveZones$ ").append(zone); } ReplacementEffect re = ReplacementHandler.parseReplacement(repEffsb.toString(), card, intrinsic); @@ -2186,12 +2182,12 @@ public class CardFactoryUtil { final String abStringAfflict = "DB$ LoseLife | Defined$ TriggeredDefendingPlayer" + " | LifeAmount$ " + n; - final Trigger afflictTrigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger afflictTrigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); afflictTrigger.setOverridingAbility(AbilityFactory.getAbility(abStringAfflict, card)); inst.addTrigger(afflictTrigger); } else if (keyword.startsWith("Afterlife")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); final String name = StringUtils.join(k, " "); final StringBuilder sb = new StringBuilder(); @@ -2327,7 +2323,7 @@ public class CardFactoryUtil { StringBuilder trig = new StringBuilder(); trig.append("Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self"); - trig.append(" | TriggerDescription$ Champion ").append(article + " ").append(desc); + trig.append(" | TriggerDescription$ Champion ").append(article).append(" ").append(desc); trig.append(" (").append(Keyword.getInstance("Champion:"+desc).getReminderText()) .append(")"); StringBuilder trigReturn = new StringBuilder(); @@ -2435,7 +2431,7 @@ public class CardFactoryUtil { final String effect = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | " + "CounterNum$ 1 | Evolve$ True"; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); inst.addTrigger(trigger); @@ -2681,7 +2677,7 @@ public class CardFactoryUtil { final StringBuilder sbTrig = new StringBuilder(); sbTrig.append("Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | "); sbTrig.append("ValidCard$ Card.Self | Secondary$ True | TriggerDescription$ "); - sbTrig.append("Living Weapon (" + inst.getReminderText() + ")"); + sbTrig.append("Living Weapon (").append(inst.getReminderText()).append(")"); final StringBuilder sbGerm = new StringBuilder(); sbGerm.append("DB$ Token | TokenAmount$ 1 | TokenScript$ b_0_0_germ |TokenOwner$ You | RememberTokens$ True"); @@ -2731,7 +2727,7 @@ public class CardFactoryUtil { " | TriggerDescription$ Melee (" + inst.getReminderText() + ")"; final String effect = "DB$ Pump | Defined$ TriggeredAttackerLKICopy | NumAtt$ MeleeX | NumDef$ MeleeX"; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); SpellAbility sa = AbilityFactory.getAbility(effect, card); sa.setSVar("MeleeX", "TriggeredPlayersDefenders$Amount"); @@ -2746,7 +2742,7 @@ public class CardFactoryUtil { final String effect = "DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1" + " | ValidTgts$ Creature.attacking+powerLTX" + " | TgtPrompt$ Select target attacking creature with less power"; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); SpellAbility sa = AbilityFactory.getAbility(effect, card); sa.setSVar("X", "Count$CardPower"); @@ -2854,7 +2850,7 @@ public class CardFactoryUtil { final String trigStr = "Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Secondary$ True" + " | TriggerZones$ Battlefield | TriggerDescription$ Poisonous " + n + " (" + inst.getReminderText() + ")"; - final Trigger parsedTrigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger parsedTrigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); final String effect = "DB$ Poison | Defined$ TriggeredTarget | Num$ " + n; parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); @@ -2902,7 +2898,7 @@ public class CardFactoryUtil { final String effect = "DB$ Pump | Defined$ TriggeredAttackerLKICopy" + " | NumAtt$ Rampage" + n + " | NumDef$ Rampage" + n; - final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); SpellAbility sa = AbilityFactory.getAbility(effect, card); sa.setSVar("Rampage" + n, "SVar$RampageCount/Times." + n); @@ -3070,7 +3066,7 @@ public class CardFactoryUtil { inst.addTrigger(parsedTrigger); } else if (keyword.startsWith("Suspend")) { //upkeep trigger - StringBuilder upkeepTrig = new StringBuilder();; + StringBuilder upkeepTrig = new StringBuilder(); upkeepTrig.append("Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Exile "); upkeepTrig.append(" | IsPresent$ Card.Self+suspended | PresentZone$ Exile"); @@ -3146,7 +3142,7 @@ public class CardFactoryUtil { } final String costStr = k.length == 3 ? k[2] : cost.toSimpleString(); - sb.append(costStr.substring(0,1).toLowerCase() + costStr.substring(1)); + sb.append(costStr.substring(0, 1).toLowerCase()).append(costStr.substring(1)); sb.append("."); String upkeepTrig = "Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | " + @@ -3201,7 +3197,7 @@ public class CardFactoryUtil { SpellAbility saDelay = AbilityFactory.getAbility(strDelay, card); saDelay.setAdditionalAbility("Execute", (AbilitySub) AbilityFactory.getAbility(strSac, card)); - final Trigger trigger = TriggerHandler.parseTrigger(strTrig.toString(), card, intrinsic); + final Trigger trigger = TriggerHandler.parseTrigger(strTrig, card, intrinsic); trigger.setOverridingAbility(saDelay); inst.addTrigger(trigger); } @@ -3404,7 +3400,7 @@ public class CardFactoryUtil { sb.append("| ValidStackSa$ Spell.Flashback | Description$ Flashback"); if (keyword.contains(":")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); final Cost cost = new Cost(k[1], false); sb.append( cost.isOnlyManaCost() ? " " : "—"); @@ -3896,7 +3892,7 @@ public class CardFactoryUtil { // Add the Epic effect as a subAbility String dbStr = "DB$ Effect | Triggers$ EpicTrigger | SVars$ EpicCopy | StaticAbilities$ EpicCantBeCast | Duration$ Permanent | Epic$ True"; - final AbilitySub newSA = (AbilitySub) AbilityFactory.getAbility(dbStr.toString(), card); + final AbilitySub newSA = (AbilitySub) AbilityFactory.getAbility(dbStr, card); newSA.setSVar("EpicCantBeCast", "Mode$ CantBeCast | ValidCard$ Card | Caster$ You | EffectZone$ Command | Description$ For the rest of the game, you can't cast spells."); newSA.setSVar("EpicTrigger", "Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ EpicCopy | TriggerDescription$ " @@ -3938,8 +3934,8 @@ public class CardFactoryUtil { } else { abilityStr.append(" "); } - abilityStr.append("| CostDesc$ " + cost.toSimpleString() + " "); - abilityStr.append("| SpellDescription$ (" + inst.getReminderText() + ")"); + abilityStr.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); + abilityStr.append("| SpellDescription$ (").append(inst.getReminderText()).append(")"); // instantiate attach ability final SpellAbility newSA = AbilityFactory.getAbility(abilityStr.toString(), card); newSA.setIntrinsic(intrinsic); @@ -3964,7 +3960,7 @@ public class CardFactoryUtil { // don't use SimpleString there because it does has "and" between cost i dont want that costStr = cost.toString(); // but now it has ": " at the end i want to remove - sb.append("| CostDesc$ ").append(costStr.substring(0, costStr.length() - 2)); + sb.append("| CostDesc$ ").append(costStr, 0, costStr.length() - 2); if (!cost.isOnlyManaCost()) { sb.append("."); } @@ -4012,7 +4008,7 @@ public class CardFactoryUtil { abilityStr.append("| PrecostDesc$ Fortify"); Cost cost = new Cost(equipCost, true); abilityStr.append(cost.isOnlyManaCost() ? " " : "—"); - abilityStr.append("| CostDesc$ " + cost.toSimpleString() + " "); + abilityStr.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); abilityStr.append("| SpellDescription$ ("); abilityStr.append(inst.getReminderText()).append(")"); @@ -4173,8 +4169,8 @@ public class CardFactoryUtil { } else { abilityStr.append(" "); } - abilityStr.append("| CostDesc$ " + cost.toSimpleString() + " "); - abilityStr.append("| SpellDescription$ (" + inst.getReminderText() + ")"); + abilityStr.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); + abilityStr.append("| SpellDescription$ (").append(inst.getReminderText()).append(")"); final SpellAbility sa = AbilityFactory.getAbility(abilityStr.toString(), card); sa.setIntrinsic(intrinsic); @@ -4196,7 +4192,7 @@ public class CardFactoryUtil { // makes new SpellDescription final StringBuilder sb = new StringBuilder(); sb.append(newSA.getCostDescription()); - sb.append("(" + inst.getReminderText() + ")"); + sb.append("(").append(inst.getReminderText()).append(")"); newSA.setDescription(sb.toString()); newSA.setBasicSpell(false); @@ -4213,9 +4209,9 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder(); sb.append("AB$ PutCounter | CounterType$ P1P1 | ActivationZone$ Hand"); sb.append("| ValidTgts$ Creature | TgtPrompt$ Select target creature"); - sb.append("| Cost$ " + manacost + " Discard<1/CARDNAME>"); + sb.append("| Cost$ ").append(manacost).append(" Discard<1/CARDNAME>"); sb.append("| CounterNum$ ").append(n); - sb.append("| CostDesc$ " + ManaCostParser.parse(manacost)); // to hide the Discard from the cost + sb.append("| CostDesc$ ").append(ManaCostParser.parse(manacost)); // to hide the Discard from the cost sb.append("| PrecostDesc$ Reinforce ").append(n).append("—"); sb.append("| SpellDescription$ (").append(inst.getReminderText()).append(")"); @@ -4425,7 +4421,7 @@ public class CardFactoryUtil { sb.append(manacost); sb.append(" Discard<1/CARDNAME> | ActivationZone$ Hand | PrecostDesc$ Cycling"); sb.append(cost.isOnlyManaCost() ? " " : "—"); - sb.append("| CostDesc$ " + cost.toSimpleString() + " "); + sb.append("| CostDesc$ ").append(cost.toSimpleString()).append(" "); sb.append("| SpellDescription$ (").append(inst.getReminderText()).append(")"); SpellAbility sa = AbilityFactory.getAbility(sb.toString(), card); @@ -4498,7 +4494,7 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder(); sb.append("Mode$ Continuous | EffectZone$ Exile | Affected$ Card.EncodedWithSource"); sb.append(" | AddTrigger$ CipherTrigger"); - sb.append(" | Description$ Cipher (" + inst.getReminderText() + ")"); + sb.append(" | Description$ Cipher (").append(inst.getReminderText()).append(")"); effect = sb.toString(); @@ -4542,7 +4538,7 @@ public class CardFactoryUtil { final StringBuilder sbValid = new StringBuilder(); if (!keyword.equals("Hexproof")) { - final String k[] = keyword.split(":"); + final String[] k = keyword.split(":"); sbDesc.append(" from ").append(k[2]); sbValid.append("| ValidSource$ ").append(k[1]); diff --git a/forge-game/src/main/java/forge/game/card/CardPlayOption.java b/forge-game/src/main/java/forge/game/card/CardPlayOption.java index 3c53c4d0e35..3c2cb2e699e 100644 --- a/forge-game/src/main/java/forge/game/card/CardPlayOption.java +++ b/forge-game/src/main/java/forge/game/card/CardPlayOption.java @@ -11,7 +11,7 @@ public final class CardPlayOption { /** Indicates the mana cost must be paid. */ YES, /** Indicates the mana cost may not be paid. */ - NO; + NO } private final Player player; @@ -82,7 +82,7 @@ public final class CardPlayOption { switch (getPayManaCost()) { case YES: if (altManaCost != null) { - sb.append(" (by paying " + getFormattedAltManaCost() + " instead of paying its mana cost"); + sb.append(" (by paying ").append(getFormattedAltManaCost()).append(" instead of paying its mana cost"); if (isWithFlash()) { sb.append(" and as though it has flash"); } diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 5d5a415af5c..4f4d00b2010 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -214,7 +214,7 @@ public final class CardPredicates { return c.canBeSacrificedBy(sa); } }; - }; + } public static final Predicate canBeAttached(final Card aura) { return new Predicate() { @@ -223,7 +223,7 @@ public final class CardPredicates { return c.canBeAttached(aura); } }; - }; + } public static final Predicate isColor(final byte color) { return new Predicate() { diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 74112fa659e..1411664dd18 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -27,8 +27,7 @@ import java.util.List; public class CardProperty { - public static boolean cardHasProperty(Card card, String property, Player sourceController, Card source, - SpellAbility spellAbility) { + public static boolean cardHasProperty(Card card, String property, Player sourceController, Card source, SpellAbility spellAbility) { final Game game = card.getGame(); final Combat combat = game.getCombat(); // lki can't be null but it does return this @@ -40,7 +39,7 @@ public class CardProperty { String name = TextUtil.fastReplace(property.substring(5), ";", ","); // for some legendary cards if (!card.sharesNameWith(name)) { return false; - } + } } else if (property.startsWith("notnamed")) { if (card.sharesNameWith(property.substring(8))) { return false; @@ -1115,9 +1114,9 @@ public class CardProperty { return false; } } else if (property.startsWith("DrawnThisTurn")) { - if (!card.getDrawnThisTurn()) { - return false; - } + if (!card.getDrawnThisTurn()) { + return false; + } } else if (property.startsWith("enteredBattlefieldThisTurn")) { if (!(card.getTurnInZone() == game.getPhaseHandler().getTurn())) { return false; @@ -1749,7 +1748,7 @@ public class CardProperty { final ZoneType realZone = ZoneType.smartValueOf(strZone); // lki last zone does fall back to this zone final Zone lkiZone = lki.getLastKnownZone(); - + if (lkiZone == null || !lkiZone.is(realZone)) { return false; } @@ -1773,4 +1772,4 @@ public class CardProperty { return true; } -} +} \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index dbe4ca1546b..eb9cb92e1bf 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -56,11 +56,11 @@ public class CardState extends GameObject { private String baseLoyalty = ""; private KeywordCollection intrinsicKeywords = new KeywordCollection(); - private final FCollection nonManaAbilities = new FCollection(); - private final FCollection manaAbilities = new FCollection(); - private FCollection triggers = new FCollection(); - private FCollection replacementEffects = new FCollection(); - private FCollection staticAbilities = new FCollection(); + private final FCollection nonManaAbilities = new FCollection<>(); + private final FCollection manaAbilities = new FCollection<>(); + private FCollection triggers = new FCollection<>(); + private FCollection replacementEffects = new FCollection<>(); + private FCollection staticAbilities = new FCollection<>(); private String imageKey = ""; private Map sVars = Maps.newTreeMap(); @@ -257,24 +257,24 @@ public class CardState extends GameObject { } public final FCollectionView getSpellAbilities() { - FCollection newCol = new FCollection(manaAbilities); + FCollection newCol = new FCollection<>(manaAbilities); newCol.addAll(nonManaAbilities); card.updateSpellAbilities(newCol, this, null); return newCol; } public final FCollectionView getManaAbilities() { - FCollection newCol = new FCollection(manaAbilities); + FCollection newCol = new FCollection<>(manaAbilities); card.updateSpellAbilities(newCol, this, true); return newCol; } public final FCollectionView getNonManaAbilities() { - FCollection newCol = new FCollection(nonManaAbilities); + FCollection newCol = new FCollection<>(nonManaAbilities); card.updateSpellAbilities(newCol, this, false); return newCol; } public final FCollectionView getIntrinsicSpellAbilities() { - return new FCollection(Iterables.filter(getSpellAbilities(), SpellAbilityPredicates.isIntrinsic())); + return new FCollection<>(Iterables.filter(getSpellAbilities(), SpellAbilityPredicates.isIntrinsic())); } public final boolean hasSpellAbility(final SpellAbility sa) { @@ -386,7 +386,7 @@ public class CardState extends GameObject { return staticAbilities.remove(stab); } public final void setStaticAbilities(final Iterable staticAbilities0) { - staticAbilities = new FCollection(staticAbilities0); + staticAbilities = new FCollection<>(staticAbilities0); } public final void clearStaticAbilities() { staticAbilities.clear(); @@ -471,9 +471,7 @@ public class CardState extends GameObject { view.updateFoilIndex(card.getState(CardStateName.Original)); } public final void removeSVar(final String var) { - if (sVars.containsKey(var)) { - sVars.remove(var); - } + sVars.remove(var); } public final int getFoil() { diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index f96d0f8af38..7bf0cfe1390 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -80,7 +80,7 @@ public final class CardUtil { } public static boolean isStackingKeyword(final String keyword) { - String kw = new String(keyword); + String kw = keyword; if (kw.startsWith("HIDDEN")) { kw = kw.substring(7); } @@ -92,7 +92,7 @@ public final class CardUtil { public static String getShortColorsString(final Iterable colors) { StringBuilder colorDesc = new StringBuilder(); for (final String col : colors) { - colorDesc.append(MagicColor.toShortString(col) + " "); + colorDesc.append(MagicColor.toShortString(col)).append(" "); } return colorDesc.toString(); } @@ -251,8 +251,8 @@ public final class CardUtil { } // lock in the current P/T without bonus from counters - newCopy.setBasePower(in.getCurrentPower() + in.getTempPowerBoost() + in.getSemiPermanentPowerBoost()); - newCopy.setBaseToughness(in.getCurrentToughness() + in.getTempToughnessBoost() + in.getSemiPermanentToughnessBoost()); + newCopy.setBasePower(in.getCurrentPower() + in.getTempPowerBoost()); + newCopy.setBaseToughness(in.getCurrentToughness() + in.getTempToughnessBoost()); newCopy.setCounters(Maps.newEnumMap(in.getCounters())); @@ -345,7 +345,7 @@ public final class CardUtil { // a nice entry point with minimum parameters public static Set getReflectableManaColors(final SpellAbility sa) { - return getReflectableManaColors(sa, sa, Sets.newHashSet(), new CardCollection()); + return getReflectableManaColors(sa, sa, Sets.newHashSet(), new CardCollection()); } private static Set getReflectableManaColors(final SpellAbility abMana, final SpellAbility sa, @@ -390,9 +390,7 @@ public final class CardUtil { // remove anything cards that is already in parents for (final Card p : parents) { - if (cards.contains(p)) { - cards.remove(p); - } + cards.remove(p); } if ((cards.size() == 0) && !reflectProperty.equals("Produced")) { @@ -425,7 +423,7 @@ public final class CardUtil { colors.add(MagicColor.Constant.COLORLESS); } } else if (reflectProperty.equals("Produce")) { - final FCollection abilities = new FCollection(); + final FCollection abilities = new FCollection<>(); for (final Card c : cards) { abilities.addAll(c.getManaAbilities()); } @@ -506,9 +504,7 @@ public final class CardUtil { // Remove cards already targeted final List targeted = Lists.newArrayList(ability.getTargets().getTargetCards()); for (final Card c : targeted) { - if (choices.contains(c)) { - choices.remove(c); - } + choices.remove(c); } // Remove cards exceeding total CMC diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 5afd53b06ca..732cb4374a8 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -18,6 +18,7 @@ import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; import forge.trackable.Tracker; +import forge.util.Lang; import forge.util.collect.FCollectionView; import org.apache.commons.lang3.StringUtils; @@ -46,7 +47,7 @@ public class CardView extends GameEntityView { if (cards == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (Card c : cards) { if (c.getCardForUi() == c) { //only add cards that match their card for UI collection.add(c.getView()); @@ -345,17 +346,14 @@ public class CardView extends GameEntityView { return true; } col = get(TrackableProperty.PlayerMayLookTemp); - if (col != null && col.contains(pv)) { - return true; - } - return false; + return col != null && col.contains(pv); } void setPlayerMayLook(Player p, boolean mayLook, boolean temp) { TrackableProperty prop = temp ? TrackableProperty.PlayerMayLookTemp : TrackableProperty.PlayerMayLook; TrackableCollection col = get(prop); if (mayLook) { if (col == null) { - col = new TrackableCollection(p.getView()); + col = new TrackableCollection<>(p.getView()); set(prop, col); } else if (col.add(p.getView())) { @@ -380,7 +378,7 @@ public class CardView extends GameEntityView { return Iterables.any(viewers, new Predicate() { public final boolean apply(final PlayerView input) { return canBeShownTo(input); - }; + } }); } @@ -462,10 +460,7 @@ public class CardView extends GameEntityView { if (mindSlaveMaster != null && canFaceDownBeShownTo(mindSlaveMaster)) { return true; } - if (isInZone(EnumSet.of(ZoneType.Battlefield, ZoneType.Stack, ZoneType.Sideboard)) && getController().equals(viewer)) { - return true; - } - return false; + return isInZone(EnumSet.of(ZoneType.Battlefield, ZoneType.Stack, ZoneType.Sideboard)) && getController().equals(viewer); } public FCollectionView getEncodedCards() { @@ -565,7 +560,7 @@ public class CardView extends GameEntityView { sb.append(rulesText).append("\r\n\r\n"); } if (isCommander()) { - sb.append(getOwner()).append("'s " + getCommanderType() + "\r\n"); + sb.append(getOwner()).append("'s ").append(getCommanderType()).append("\r\n"); sb.append(getOwner().getCommanderInfo(this)).append("\r\n"); } @@ -587,16 +582,6 @@ public class CardView extends GameEntityView { } String nonAbilityText = get(TrackableProperty.NonAbilityText); - int blockAdditional = state.getBlockAdditional(); - if (blockAdditional > 1) { - final StringBuilder ab = new StringBuilder(); - ab.append("CARDNAME can block an additional "); - ab.append(blockAdditional); - ab.append(" creatures each combat."); - nonAbilityText = nonAbilityText.replaceFirst("CARDNAME can block an additional creature each combat.", ab.toString()); - nonAbilityText = nonAbilityText.replaceAll("CARDNAME can block an additional creature each combat.", ""); - nonAbilityText = nonAbilityText.replaceAll("\r\n\r\n\r\n", ""); - } if (!nonAbilityText.isEmpty()) { sb.append("\r\n \r\nNon ability features: \r\n"); sb.append(nonAbilityText.replaceAll("CARDNAME", getName())); @@ -624,6 +609,22 @@ public class CardView extends GameEntityView { sb.append("\r\n"); } + if (getCanBlockAny()) { + sb.append("\r\n\r\n"); + sb.append("CARDNAME can block any number of creatures.".replaceAll("CARDNAME", getName())); + sb.append("\r\n"); + } else { + int i = getBlockAdditional(); + if (i > 0) { + sb.append("\r\n\r\n"); + sb.append("CARDNAME can block an additional ".replaceAll("CARDNAME", getName())); + sb.append(i == 1 ? "creature" : Lang.nounWithNumeral(i, "creature")); + sb.append(" each combat."); + sb.append("\r\n"); + } + + } + String cloner = get(TrackableProperty.Cloner); if (!cloner.isEmpty()) { sb.append("\r\nCloned by: ").append(cloner); @@ -728,6 +729,19 @@ public class CardView extends GameEntityView { set(TrackableProperty.HiddenId, hiddenId); } + int getBlockAdditional() { + return get(TrackableProperty.BlockAdditional); + } + + boolean getCanBlockAny() { + return get(TrackableProperty.BlockAny); + } + + void updateBlockAdditional(Card c) { + set(TrackableProperty.BlockAdditional, c.canBlockAdditional()); + set(TrackableProperty.BlockAny, c.canBlockAny()); + } + @Override public String toString() { String name = getName(); @@ -995,9 +1009,6 @@ public class CardView extends GameEntityView { return get(TrackableProperty.HasTrample); } - public int getBlockAdditional() { - return get(TrackableProperty.BlockAdditional); - } public String getAbilityText() { return get(TrackableProperty.AbilityText); } @@ -1011,7 +1022,6 @@ public class CardView extends GameEntityView { set(TrackableProperty.HasInfect, c.hasKeyword(Keyword.INFECT, state)); set(TrackableProperty.HasStorm, c.hasKeyword(Keyword.STORM, state)); set(TrackableProperty.HasTrample, c.hasKeyword(Keyword.TRAMPLE, state)); - set(TrackableProperty.BlockAdditional, c.getAmountOfKeyword("CARDNAME can block an additional creature each combat.", state)); updateAbilityText(c, state); } @@ -1066,8 +1076,8 @@ public class CardView extends GameEntityView { if (oldCards.add(cardToAdd)) { TrackableCollection views = get(key); if (views == null) { - views = new TrackableCollection(); - views.add(cardToAdd.getView());; + views = new TrackableCollection<>(); + views.add(cardToAdd.getView()); set(key, views); } else if (views.add(cardToAdd.getView())) { @@ -1087,7 +1097,7 @@ public class CardView extends GameEntityView { for (Card c : cardsToAdd) { if (c != null && oldCards.add(c)) { if (views == null) { - views = new TrackableCollection(); + views = new TrackableCollection<>(); views.add(c.getView()); set(key, views); } diff --git a/forge-game/src/main/java/forge/game/card/token/TokenInfo.java b/forge-game/src/main/java/forge/game/card/token/TokenInfo.java index 5d4ff3b79aa..4abd4a7447e 100644 --- a/forge-game/src/main/java/forge/game/card/token/TokenInfo.java +++ b/forge-game/src/main/java/forge/game/card/token/TokenInfo.java @@ -320,7 +320,7 @@ public class TokenInfo { if (!CardUtil.isKeywordModifiable(o)) { continue; } - String r = new String(o); + String r = o; // replace types for (final Map.Entry e : typeMap.entrySet()) { final String key = e.getKey(); diff --git a/forge-game/src/main/java/forge/game/combat/AttackConstraints.java b/forge-game/src/main/java/forge/game/combat/AttackConstraints.java index c3420217e83..181c27e769e 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackConstraints.java +++ b/forge-game/src/main/java/forge/game/combat/AttackConstraints.java @@ -45,7 +45,7 @@ public class AttackConstraints { "If a creature with a magnet counter on it attacks, all creatures with magnet counters on them attack if able."); } - final MapToAmount attacksIfOtherAttacks = new LinkedHashMapToAmount(); + final MapToAmount attacksIfOtherAttacks = new LinkedHashMapToAmount<>(); for (final Card possibleAttacker : possibleAttackers) { attacksIfOtherAttacks.add(possibleAttacker, possibleAttacker.getAmountOfKeyword("If a creature you control attacks, CARDNAME also attacks if able.")); } @@ -53,7 +53,7 @@ public class AttackConstraints { for (final Card possibleAttacker : possibleAttackers) { restrictions.put(possibleAttacker, new AttackRestriction(possibleAttacker, possibleDefenders)); - final MapToAmount causesToAttack = new LinkedHashMapToAmount(); + final MapToAmount causesToAttack = new LinkedHashMapToAmount<>(); for (final Entry entry : attacksIfOtherAttacks.entrySet()) { if (entry.getKey() != possibleAttacker) { causesToAttack.add(entry.getKey(), entry.getValue().intValue()); @@ -94,10 +94,10 @@ public class AttackConstraints { final int globalMax = globalRestrictions.getMax(); final int myMax = Ints.min(globalMax == -1 ? Integer.MAX_VALUE : globalMax, possibleAttackers.size()); if (myMax == 0) { - return Pair.of(Collections.emptyMap(), Integer.valueOf(0)); + return Pair.of(Collections.emptyMap(), Integer.valueOf(0)); } - final MapToAmount> possible = new LinkedHashMapToAmount>(); + final MapToAmount> possible = new LinkedHashMapToAmount<>(); final List reqs = getSortedFilteredRequirements(); final CardCollection myPossibleAttackers = new CardCollection(possibleAttackers); @@ -163,8 +163,8 @@ public class AttackConstraints { // Now try all others (plus empty attack) and count their violations final FCollection> legalAttackers = collectLegalAttackers(reqs, myMax); possible.putAll(Maps.asMap(legalAttackers.asSet(), FN_COUNT_VIOLATIONS)); - if (countViolations(Collections.emptyMap()) != -1) { - possible.put(Collections.emptyMap(), countViolations(Collections.emptyMap())); + if (countViolations(Collections.emptyMap()) != -1) { + possible.put(Collections.emptyMap(), countViolations(Collections.emptyMap())); } // take the case with the fewest violations @@ -172,8 +172,8 @@ public class AttackConstraints { } private final FCollection> collectLegalAttackers(final List reqs, final int maximum) { - return new FCollection> - (collectLegalAttackers(Collections.emptyMap(), deepClone(reqs), new CardCollection(), maximum)); + return new FCollection<> + (collectLegalAttackers(Collections.emptyMap(), deepClone(reqs), new CardCollection(), maximum)); } private final List> collectLegalAttackers(final Map attackers, final List reqs, final CardCollection reserved, final int maximum) { @@ -182,7 +182,7 @@ public class AttackConstraints { int localMaximum = maximum; final boolean isLimited = globalRestrictions.getMax() != -1; final Map myAttackers = Maps.newHashMap(attackers); - final MapToAmount toDefender = new LinkedHashMapToAmount(); + final MapToAmount toDefender = new LinkedHashMapToAmount<>(); int attackersNeeded = 0; outer: while(!reqs.isEmpty()) { diff --git a/forge-game/src/main/java/forge/game/combat/AttackRequirement.java b/forge-game/src/main/java/forge/game/combat/AttackRequirement.java index c02701595d3..2841352d515 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackRequirement.java +++ b/forge-game/src/main/java/forge/game/combat/AttackRequirement.java @@ -29,9 +29,9 @@ public class AttackRequirement { private final MapToAmount causesToAttack; public AttackRequirement(final Card attacker, final MapToAmount causesToAttack, final FCollectionView possibleDefenders) { - this.defenderSpecific = new LinkedHashMapToAmount(); - this.defenderOrPWSpecific = new LinkedHashMapToAmount(); - this.defenderSpecificAlternatives = new HashMap>(); + this.defenderSpecific = new LinkedHashMapToAmount<>(); + this.defenderOrPWSpecific = new LinkedHashMapToAmount<>(); + this.defenderSpecificAlternatives = new HashMap<>(); this.causesToAttack = causesToAttack; @@ -80,7 +80,7 @@ public class AttackRequirement { for (Card pw : CardLists.filter(c.getController().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.PLANESWALKERS)) { // Add the attack alternatives that suffice (planeswalkers that can be attacked instead of the player) if (!defenderSpecificAlternatives.containsKey(c.getController())) { - defenderSpecificAlternatives.put(c.getController(), Lists.newArrayList()); + defenderSpecificAlternatives.put(c.getController(), Lists.newArrayList()); } defenderSpecificAlternatives.get(c.getController()).add(pw); } @@ -147,7 +147,7 @@ public class AttackRequirement { int violations = 0; // first. check to see if "must attack X or Y with at least one creature" requirements are satisfied - List toRemoveFromDefSpecific = Lists.newArrayList(); + List toRemoveFromDefSpecific = Lists.newArrayList(); if (!defenderOrPWSpecific.isEmpty()) { for (GameEntity def : defenderOrPWSpecific.keySet()) { if (defenderSpecificAlternatives.containsKey(def)) { diff --git a/forge-game/src/main/java/forge/game/combat/AttackRestriction.java b/forge-game/src/main/java/forge/game/combat/AttackRestriction.java index 2f47ffd92e2..6535808a622 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackRestriction.java +++ b/forge-game/src/main/java/forge/game/combat/AttackRestriction.java @@ -26,7 +26,7 @@ public class AttackRestriction { this.attacker = attacker; setRestrictions(); - final FCollection cantAttackDefender = new FCollection(); + final FCollection cantAttackDefender = new FCollection<>(); for (final GameEntity defender : possibleDefenders) { if (!CombatUtil.canAttack(attacker, defender)) { cantAttackDefender.add(defender); diff --git a/forge-game/src/main/java/forge/game/combat/AttackingBand.java b/forge-game/src/main/java/forge/game/combat/AttackingBand.java index 3158cbcea73..3e9f861600f 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackingBand.java +++ b/forge-game/src/main/java/forge/game/combat/AttackingBand.java @@ -65,7 +65,7 @@ public class AttackingBand { public boolean canJoinBand(Card card) { // Trying to join an existing band, attackers should be non-empty and card should exist - List newBand = new ArrayList(attackers); + List newBand = new ArrayList<>(attackers); if (card != null) { newBand.add(card); } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index bc5441689ea..7a85137e66c 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -51,11 +51,11 @@ public class Combat { private final Player playerWhoAttacks; private final AttackConstraints attackConstraints; // Defenders, as they are attacked by hostile forces - private final FCollection attackableEntries = new FCollection(); + private final FCollection attackableEntries = new FCollection<>(); // Keyed by attackable defender (player or planeswalker) - private final Multimap attackedByBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); - private final Multimap blockedBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); + private final Multimap attackedByBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); + private final Multimap blockedBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); private final Map defendingDamageMap = Maps.newHashMap(); @@ -71,9 +71,7 @@ public class Combat { playerWhoAttacks = attacker; // Create keys for all possible attack targets - for (final GameEntity defender : CombatUtil.getAllPossibleDefenders(playerWhoAttacks)) { - attackableEntries.add(defender); - } + attackableEntries.addAll(CombatUtil.getAllPossibleDefenders(playerWhoAttacks)); attackConstraints = new AttackConstraints(this); } @@ -87,7 +85,7 @@ public class Combat { HashMap bandsMap = new HashMap<>(); for (Entry entry : combat.attackedByBands.entries()) { AttackingBand origBand = entry.getValue(); - ArrayList attackers = new ArrayList(); + ArrayList attackers = new ArrayList<>(); for (Card c : origBand.getAttackers()) { attackers.add(map.map(c)); } @@ -187,7 +185,7 @@ public class Combat { } public final FCollection getDefendersControlledBy(Player who) { - FCollection res = new FCollection(); + FCollection res = new FCollection<>(); for (GameEntity ge : attackableEntries) { // if defender is the player himself or his cards if (ge == who || ge instanceof Card && ((Card) ge).getController() == who) { @@ -198,7 +196,7 @@ public class Combat { } public final FCollectionView getDefendingPlayers() { - return new FCollection(Iterables.filter(attackableEntries, Player.class)); + return new FCollection<>(Iterables.filter(attackableEntries, Player.class)); } public final CardCollection getDefendingPlaneswalkers() { @@ -353,7 +351,7 @@ public class Combat { public final boolean isBlocked(final Card attacker) { AttackingBand band = getBandOfAttacker(attacker); - return band == null ? false : Boolean.TRUE.equals(band.isBlocked()); + return band != null && Boolean.TRUE.equals(band.isBlocked()); } // Some cards in Alpha may UNBLOCK an attacker, so second parameter is not always-true @@ -414,7 +412,7 @@ public class Combat { } public final FCollectionView getAttackingBandsBlockedBy(Card blocker) { - FCollection bands = new FCollection(); + FCollection bands = new FCollection<>(); for (Entry kv : blockedBands.entries()) { if (kv.getValue().equals(blocker)) { bands.add(kv.getKey()); @@ -804,7 +802,7 @@ public class Combat { for (final Entry entry : defendingDamageMap.entrySet()) { GameEntity defender = getDefenderByAttacker(entry.getKey()); if (defender instanceof Player) { // player - ((Player) defender).addCombatDamage(entry.getValue(), entry.getKey(), dealtDamageTo, preventMap, counterTable); + defender.addCombatDamage(entry.getValue(), entry.getKey(), dealtDamageTo, preventMap, counterTable); } else if (defender instanceof Card) { // planeswalker ((Card) defender).getController().addCombatDamage(entry.getValue(), entry.getKey(), dealtDamageTo, preventMap, counterTable); @@ -843,7 +841,7 @@ public class Combat { public final boolean isUnblocked(final Card att) { AttackingBand band = getBandOfAttacker(att); - return band == null ? false : Boolean.FALSE.equals(band.isBlocked()); + return band != null && Boolean.FALSE.equals(band.isBlocked()); } public final CardCollection getUnblockedAttackers() { @@ -875,7 +873,7 @@ public class Combat { public boolean isBlocking(Card blocker) { if (blockedBands.containsValue(blocker)) { return true; // is blocking something at the moment - }; + } CombatLki lki = lkiCache.get(blocker); return null != lki && !lki.isAttacker; // was blocking something anyway @@ -902,7 +900,7 @@ public class Combat { return; // card was not even in combat } } - final FCollectionView relatedBands = isAttacker ? new FCollection(attackingBand) : attackersBlocked; + final FCollectionView relatedBands = isAttacker ? new FCollection<>(attackingBand) : attackersBlocked; lkiCache.put(lastKnownInfo, new CombatLki(isAttacker, relatedBands)); } } diff --git a/forge-game/src/main/java/forge/game/combat/CombatLki.java b/forge-game/src/main/java/forge/game/combat/CombatLki.java index 128718a3d25..9e1d60b5bfb 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatLki.java +++ b/forge-game/src/main/java/forge/game/combat/CombatLki.java @@ -14,7 +14,7 @@ public class CombatLki { public CombatLki(boolean isAttacker, FCollectionView relatedBands) { this.isAttacker = isAttacker; - this.relatedBands = new FCollection(relatedBands);; + this.relatedBands = new FCollection<>(relatedBands); } public AttackingBand getFirstBand() { diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 1b88c16440f..1879bbca6d7 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -59,7 +59,7 @@ import java.util.Map; public class CombatUtil { public static FCollectionView getAllPossibleDefenders(final Player playerWhoAttacks) { - final FCollection defenders = new FCollection(); + final FCollection defenders = new FCollection<>(); for (final Player defender : playerWhoAttacks.getOpponents()) { defenders.add(defender); final CardCollection planeswalkers = CardLists.filter(defender.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.PLANESWALKERS); @@ -426,28 +426,17 @@ public class CombatUtil { } final List list = blocker.getController().getCreaturesInPlay(); - if (list.size() < 2 && blocker.hasKeyword("CARDNAME can't attack or block alone.")) { - return false; - } - - return true; + return list.size() >= 2 || !blocker.hasKeyword("CARDNAME can't attack or block alone."); } public static boolean canBlockMoreCreatures(final Card blocker, final CardCollectionView blockedBy) { - if (blockedBy.isEmpty() || blocker.hasKeyword("CARDNAME can block any number of creatures.")) { + if (blockedBy.isEmpty() || blocker.canBlockAny()) { return true; } - int canBlockMore = numberOfAdditionalCreaturesCanBlock(blocker); + int canBlockMore = blocker.canBlockAdditional(); return canBlockMore >= blockedBy.size(); } - public static int numberOfAdditionalCreaturesCanBlock(final Card blocker) { - // If Wizards makes a few more of these, we should really just make a generic version - return blocker.getAmountOfKeyword("CARDNAME can block an additional creature each combat.") + - blocker.getAmountOfKeyword("CARDNAME can block an additional ninety-nine creatures.") * 99 + - blocker.getAmountOfKeyword("CARDNAME can block an additional seven creatures each combat.") * 7; - } - // can the attacker be blocked at all? /** *

@@ -500,8 +489,7 @@ public class CombatUtil { // Landwalk if (isUnblockableFromLandwalk(attacker, defender)) { - if (CardLists.getAmountOfKeyword(defender.getCreaturesInPlay(), "CARDNAME can block creatures with landwalk abilities as though they didn't have those abilities.") == 0) - return false; + return CardLists.getAmountOfKeyword(defender.getCreaturesInPlay(), "CARDNAME can block creatures with landwalk abilities as though they didn't have those abilities.") != 0; } return true; @@ -518,7 +506,7 @@ public class CombatUtil { IGNORE_LANDWALK_KEYWORDS = new String[size]; for (int i = 0; i < size; i++) { final String basic = MagicColor.Constant.BASIC_LANDS.get(i); - final String landwalk = basic + "walk";; + final String landwalk = basic + "walk"; LANDWALK_KEYWORDS[i] = landwalk; SNOW_LANDWALK_KEYWORDS[i] = "Snow " + landwalk.toLowerCase(); IGNORE_LANDWALK_KEYWORDS[i] = "May be blocked as though it doesn't have " + landwalk + "."; @@ -1053,7 +1041,7 @@ public class CombatUtil { for (KeywordInterface inst : blocker.getKeywords()) { String k = inst.getOriginal(); if (k.startsWith("IfReach")) { - String n[] = k.split(":"); + String[] n = k.split(":"); if (attacker.getType().hasCreatureType(n[1])) { stillblock = true; break; @@ -1114,9 +1102,7 @@ public class CombatUtil { System.out.println("Warning: it was impossible to deduce the defending player in CombatUtil#canAttackerBeBlockedWithAmount, returning 'true' (safest default)."); return true; } - if (amount < defender.getCreaturesInPlay().size()) { - return false; - } + return amount >= defender.getCreaturesInPlay().size(); } return true; diff --git a/forge-game/src/main/java/forge/game/combat/CombatView.java b/forge-game/src/main/java/forge/game/combat/CombatView.java index 3d7ef74db64..94863af1395 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatView.java +++ b/forge-game/src/main/java/forge/game/combat/CombatView.java @@ -59,7 +59,7 @@ public class CombatView extends TrackableObject { public Iterable getAttackers() { final HashSet allAttackers; synchronized (this) { - allAttackers = new HashSet(getAttackersWithDefenders().keySet()); + allAttackers = new HashSet<>(getAttackersWithDefenders().keySet()); } return allAttackers; } @@ -67,7 +67,7 @@ public class CombatView extends TrackableObject { public Iterable getDefenders() { final HashSet allDefenders; synchronized (this) { - allDefenders = new HashSet(getAttackersWithDefenders().values()); + allDefenders = new HashSet<>(getAttackersWithDefenders().values()); } return allDefenders; } @@ -139,7 +139,7 @@ public class CombatView extends TrackableObject { synchronized (this) { attackersWithDefenders = Lists.newArrayList(getAttackersWithDefenders().entrySet()); } - final FCollection views = new FCollection(); + final FCollection views = new FCollection<>(); for (final Entry entry : attackersWithDefenders) { if (defender != null && defender.equals(entry.getValue())) { views.add(entry.getKey()); @@ -152,7 +152,7 @@ public class CombatView extends TrackableObject { synchronized (this) { bandsWithDefenders = Lists.newArrayList(getBandsWithDefenders().entrySet()); } - final List> views = new ArrayList>(); + final List> views = new ArrayList<>(); for (final Entry, GameEntityView> entry : bandsWithDefenders) { if (defender != null && defender.equals(entry.getValue())) { views.add(entry.getKey()); @@ -164,9 +164,9 @@ public class CombatView extends TrackableObject { public void addAttackingBand(final Iterable attackingBand, final GameEntityView defender, final Iterable blockers, final Iterable plannedBlockers) { if (defender == null) { return; } - final FCollection attackingBandCopy = new FCollection(); - final FCollection blockersCopy = new FCollection(); - final FCollection plannedBlockersCopy = new FCollection(); + final FCollection attackingBandCopy = new FCollection<>(); + final FCollection blockersCopy = new FCollection<>(); + final FCollection plannedBlockersCopy = new FCollection<>(); attackingBandCopy.addAll(attackingBand); if (blockers != null) { diff --git a/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java b/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java index cde3c921347..dc8eabe113f 100644 --- a/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java +++ b/forge-game/src/main/java/forge/game/combat/GlobalAttackRestrictions.java @@ -45,10 +45,10 @@ public class GlobalAttackRestrictions { private GlobalAttackRestrictionViolations getViolations(final Map attackers, final CardCollection possibleAttackers, final boolean returnQuickly) { final int nTooMany = max < 0 ? 0 : attackers.size() - max; if (returnQuickly && nTooMany > 0) { - return new GlobalAttackRestrictionViolations(nTooMany, MapToAmountUtil.emptyMap(), MapToAmountUtil.emptyMap()); + return new GlobalAttackRestrictionViolations(nTooMany, MapToAmountUtil.emptyMap(), MapToAmountUtil.emptyMap()); } - final MapToAmount defenderTooMany = new LinkedHashMapToAmount(defenderMax.size()); + final MapToAmount defenderTooMany = new LinkedHashMapToAmount<>(defenderMax.size()); outer: for (final GameEntity defender : attackers.values()) { final Integer max = defenderMax.get(defender); if (max == null) { @@ -76,7 +76,7 @@ public class GlobalAttackRestrictions { } } - final MapToAmount defenderTooFew = new LinkedHashMapToAmount(defenderMax.size()); + final MapToAmount defenderTooFew = new LinkedHashMapToAmount<>(defenderMax.size()); for (final GameEntity mandatoryDef : mustBeAttackedByEachOpp) { // check to ensure that this defender can even legally be attacked in the first place boolean canAttackThisDef = false; @@ -145,7 +145,7 @@ public class GlobalAttackRestrictions { */ public static GlobalAttackRestrictions getGlobalRestrictions(final Player attackingPlayer, final FCollectionView possibleDefenders) { int max = -1; - final MapToAmount defenderMax = new LinkedHashMapToAmount(possibleDefenders.size()); + final MapToAmount defenderMax = new LinkedHashMapToAmount<>(possibleDefenders.size()); final PlayerCollection mustBeAttacked = new PlayerCollection(); final Game game = attackingPlayer.getGame(); diff --git a/forge-game/src/main/java/forge/game/cost/CostAddMana.java b/forge-game/src/main/java/forge/game/cost/CostAddMana.java index 5213f4f6ae6..81ea129bce2 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAddMana.java +++ b/forge-game/src/main/java/forge/game/cost/CostAddMana.java @@ -76,7 +76,7 @@ public class CostAddMana extends CostPart { public boolean payAsDecided(Player ai, PaymentDecision decision, SpellAbility sa) { Card source = sa.getHostCard(); - List manaProduced = new ArrayList(); + List manaProduced = new ArrayList<>(); final String type = this.getType(); for (int n = 0; n < decision.c; n++) { if (StringUtils.isNumeric(type)) { diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 5f40f259d76..75d87c49e64 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -13,7 +13,6 @@ import forge.game.keyword.KeywordInterface; import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.spellability.AbilityActivated; -import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetChoices; import forge.game.staticability.StaticAbility; @@ -40,7 +39,7 @@ public class CostAdjustment { Cost result = cost.copy(); boolean isStateChangeToFaceDown = false; - if (sa.isSpell() && ((Spell) sa).isCastFaceDown()) { + if (sa.isSpell() && sa.isCastFaceDown()) { // Turn face down to apply cost modifiers correctly host.turnFaceDownNoUpdate(); isStateChangeToFaceDown = true; @@ -159,7 +158,7 @@ public class CostAdjustment { boolean isStateChangeToFaceDown = false; if (sa.isSpell()) { - if (((Spell) sa).isCastFaceDown()) { + if (sa.isCastFaceDown()) { // Turn face down to apply cost modifiers correctly originalCard.turnFaceDownNoUpdate(); isStateChangeToFaceDown = true; @@ -490,7 +489,7 @@ public class CostAdjustment { return false; } } else if (type.equals("MorphDown")) { - if (!sa.isSpell() || !((Spell) sa).isCastFaceDown()) { + if (!sa.isSpell() || !sa.isCastFaceDown()) { return false; } } @@ -546,9 +545,7 @@ public class CostAdjustment { } curSa = curSa.getSubAbility(); } - if (!targetValid) { - return false; - } + return targetValid; } return true; } diff --git a/forge-game/src/main/java/forge/game/cost/CostDiscard.java b/forge-game/src/main/java/forge/game/cost/CostDiscard.java index d788b0287f4..517b374b6b8 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDiscard.java +++ b/forge-game/src/main/java/forge/game/cost/CostDiscard.java @@ -112,15 +112,11 @@ public class CostDiscard extends CostPartWithList { final Integer amount = this.convertAmount(); if (this.payCostFromSource()) { - if (!source.canBeDiscardedBy(ability)) { - return false; - } + return source.canBeDiscardedBy(ability); } else { if (type.equals("Hand")) { - if (!payer.canDiscardBy(ability)) { - return false; - } + return payer.canDiscardBy(ability); // this will always work } else if (type.equals("LastDrawn")) { @@ -159,7 +155,6 @@ public class CostDiscard extends CostPartWithList { } } } - return true; } diff --git a/forge-game/src/main/java/forge/game/cost/CostDraw.java b/forge-game/src/main/java/forge/game/cost/CostDraw.java index 4cd621773ab..b33630f7808 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDraw.java +++ b/forge-game/src/main/java/forge/game/cost/CostDraw.java @@ -64,7 +64,7 @@ public class CostDraw extends CostPart { * @param source */ private List getPotentialPlayers(final Player payer, final Card source) { - List res = new ArrayList(); + List res = new ArrayList<>(); String type = this.getType(); for (Player p : payer.getGame().getPlayers()) { if (p.isValid(type, payer, source, null) && p.canDraw()) { diff --git a/forge-game/src/main/java/forge/game/cost/CostExert.java b/forge-game/src/main/java/forge/game/cost/CostExert.java index 60160d0d5f3..c9dc957a715 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExert.java +++ b/forge-game/src/main/java/forge/game/cost/CostExert.java @@ -93,9 +93,7 @@ public class CostExert extends CostPartWithList { final Integer amount = this.convertAmount(); - if (!needsAnnoucement && (amount != null) && (typeList.size() < amount)) { - return false; - } + return needsAnnoucement || (amount == null) || (typeList.size() >= amount); } diff --git a/forge-game/src/main/java/forge/game/cost/CostExile.java b/forge-game/src/main/java/forge/game/cost/CostExile.java index 4e4f3dc8003..61a189b8731 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExile.java +++ b/forge-game/src/main/java/forge/game/cost/CostExile.java @@ -146,9 +146,7 @@ public class CostExile extends CostPartWithList { break; } } - if (!foundPayable) { - return false; - } + return foundPayable; } return true; } diff --git a/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java b/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java index cf66f777abd..d04501e37f3 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java +++ b/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java @@ -94,11 +94,7 @@ public class CostExileFromStack extends CostPart { list = CardLists.getValidCards(list, type.split(";"), payer, source, ability); final Integer amount = this.convertAmount(); - if ((amount != null) && (list.size() < amount)) { - return false; - } - - return true; + return (amount == null) || (list.size() >= amount); } diff --git a/forge-game/src/main/java/forge/game/cost/CostGainControl.java b/forge-game/src/main/java/forge/game/cost/CostGainControl.java index b77f91075ac..28940a73060 100644 --- a/forge-game/src/main/java/forge/game/cost/CostGainControl.java +++ b/forge-game/src/main/java/forge/game/cost/CostGainControl.java @@ -83,10 +83,7 @@ public class CostGainControl extends CostPartWithList { if (amount == null) { amount = AbilityUtils.calculateAmount(source, this.getAmount(), ability); } - if (typeList.size() < amount) { - return false; - } - return true; + return typeList.size() >= amount; } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostGainLife.java b/forge-game/src/main/java/forge/game/cost/CostGainLife.java index bd04dd670e9..75e97f0c5f9 100644 --- a/forge-game/src/main/java/forge/game/cost/CostGainLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostGainLife.java @@ -66,7 +66,7 @@ public class CostGainLife extends CostPart { public List getPotentialTargets(final Player payer, final Card source) { - List res = new ArrayList(); + List res = new ArrayList<>(); for(Player p : payer.getGame().getPlayers()) { if(p.isValid(getType(), payer, source, null)) diff --git a/forge-game/src/main/java/forge/game/cost/CostPartWithList.java b/forge-game/src/main/java/forge/game/cost/CostPartWithList.java index 495457493be..b934d3d0be7 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPartWithList.java +++ b/forge-game/src/main/java/forge/game/cost/CostPartWithList.java @@ -144,7 +144,7 @@ public abstract class CostPartWithList extends CostPart { protected abstract Card doPayment(SpellAbility ability, Card targetCard); // Overload these two only together, set to true and perform payment on list protected boolean canPayListAtOnce() { return false; } - protected CardCollectionView doListPayment(SpellAbility ability, CardCollectionView targetCards) { return CardCollection.EMPTY; }; + protected CardCollectionView doListPayment(SpellAbility ability, CardCollectionView targetCards) { return CardCollection.EMPTY; } /** * TODO: Write javadoc for this method. diff --git a/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java b/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java index f70b1c8d188..5c55cea15e1 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java +++ b/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java @@ -160,9 +160,7 @@ public class CostPutCardToLib extends CostPartWithList { break; } } - if (!foundPayable) { - return false; - } + return foundPayable; } return true; } diff --git a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java index 3738d839398..63c64457ea2 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java @@ -140,9 +140,7 @@ public class CostPutCounter extends CostPartWithList { public final boolean canPay(final SpellAbility ability, final Player payer) { final Card source = ability.getHostCard(); if (this.payCostFromSource()) { - if (!source.canReceiveCounters(this.counter)) { - return false; - } + return source.canReceiveCounters(this.counter); } else { // 3 Cards have Put a -1/-1 Counter on a Creature you control. List typeList = CardLists.getValidCards(source.getGame().getCardsIn(ZoneType.Battlefield), @@ -150,12 +148,9 @@ public class CostPutCounter extends CostPartWithList { typeList = CardLists.filter(typeList, CardPredicates.canReceiveCounters(this.counter)); - if (typeList.isEmpty()) { - return false; - } + return !typeList.isEmpty(); } - return true; } /* diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java index 329f2991bc8..063a44ce224 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java @@ -123,7 +123,7 @@ public class CostRemoveAnyCounter extends CostPartWithList { sb.append("Remove "); sb.append(Cost.convertIntAndTypeToWords(this.convertAmount(), "counter")); final String desc = this.getTypeDescription() == null ? this.getType() : this.getTypeDescription(); - sb.append(" from " + desc); + sb.append(" from ").append(desc); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java index f74a892516d..7434d7add6f 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java @@ -133,9 +133,7 @@ public class CostRemoveCounter extends CostPartWithList { final Integer amount = this.convertAmount(); if (this.payCostFromSource()) { - if ((amount != null) && ((source.getCounters(cntrs) - amount) < 0)) { - return false; - } + return (amount == null) || ((source.getCounters(cntrs) - amount) >= 0); } else { List typeList; @@ -152,9 +150,7 @@ public class CostRemoveCounter extends CostPartWithList { for (Card c : typeList) { totalCounters += c.getCounters(cntrs); } - if (totalCounters >= amount) { - return true; - } + return totalCounters >= amount; } else { // (default logic) remove X counters from a single permanent diff --git a/forge-game/src/main/java/forge/game/cost/CostReturn.java b/forge-game/src/main/java/forge/game/cost/CostReturn.java index 11b9e8b236a..2a9d6603701 100644 --- a/forge-game/src/main/java/forge/game/cost/CostReturn.java +++ b/forge-game/src/main/java/forge/game/cost/CostReturn.java @@ -102,14 +102,9 @@ public class CostReturn extends CostPartWithList { typeList = CardLists.getValidCards(typeList, this.getType().split(";"), payer, source, ability); final Integer amount = this.convertAmount(); - if (!needsAnnoucement && amount != null && typeList.size() < amount) { - return false; - } - } else if (!source.isInPlay()) { - return false; - } + return needsAnnoucement || amount == null || typeList.size() >= amount; + } else return source.isInPlay(); - return true; } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostReveal.java b/forge-game/src/main/java/forge/game/cost/CostReveal.java index 0252203d1e6..b7d08ff1807 100644 --- a/forge-game/src/main/java/forge/game/cost/CostReveal.java +++ b/forge-game/src/main/java/forge/game/cost/CostReveal.java @@ -57,9 +57,7 @@ public class CostReveal extends CostPartWithList { final Integer amount = this.convertAmount(); if (this.payCostFromSource()) { - if (!source.isInZone(ZoneType.Hand)) { - return false; - } + return source.isInZone(ZoneType.Hand); } else if (this.getType().equals("Hand")) { return true; } else if (this.getType().equals("SameColor")) { @@ -85,14 +83,11 @@ public class CostReveal extends CostPartWithList { handList = modifiedHand; } handList = CardLists.getValidCards(handList, type.split(";"), payer, source, ability); - if ((amount != null) && (amount > handList.size())) { - // not enough cards in hand to pay - return false; - } + // not enough cards in hand to pay + return (amount == null) || (amount <= handList.size()); //System.out.println("revealcost - " + amount + type + handList); } - return true; } @Override diff --git a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java index 46f121a07a2..0ac0cb3248a 100644 --- a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java +++ b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java @@ -103,19 +103,14 @@ public class CostSacrifice extends CostPartWithList { typeList = CardLists.filter(typeList, CardPredicates.canBeSacrificedBy(ability)); - if (!needsAnnoucement && (amount != null) && (typeList.size() < amount)) { - return false; - } + return needsAnnoucement || (amount == null) || (typeList.size() >= amount); // If amount is null, it's either "ALL" or "X" // if X is defined, it needs to be calculated and checked, if X is // choice, it can be Paid even if it's 0 } - else if (!source.canBeSacrificedBy(ability)) { - return false; - } + else return source.canBeSacrificedBy(ability); - return true; } @Override diff --git a/forge-game/src/main/java/forge/game/cost/CostTapType.java b/forge-game/src/main/java/forge/game/cost/CostTapType.java index e0e9b345f4e..fa62b2945a9 100644 --- a/forge-game/src/main/java/forge/game/cost/CostTapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostTapType.java @@ -77,7 +77,7 @@ public class CostTapType extends CostPartWithList { sb.append("two untapped creatures you control that share a creature type"); } else if (type.contains("+withTotalPowerGE")) { String num = type.split("\\+withTotalPowerGE")[1]; - sb.append("Tap any number of untapped creatures you control other than CARDNAME with total power " + num + "or greater"); + sb.append("Tap any number of untapped creatures you control other than CARDNAME with total power ").append(num).append("or greater"); } else { sb.append(Cost.convertAmountTypeToWords(i, this.getAmount(), "untapped " + desc)); sb.append(" you control"); @@ -150,11 +150,7 @@ public class CostTapType extends CostPartWithList { } final Integer amount = this.convertAmount(); - if ((typeList.size() == 0) || ((amount != null) && (typeList.size() < amount))) { - return false; - } - - return true; + return (typeList.size() != 0) && ((amount == null) || (typeList.size() >= amount)); } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostUnattach.java b/forge-game/src/main/java/forge/game/cost/CostUnattach.java index fb33a53ebf3..d4ab4bd8b76 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUnattach.java +++ b/forge-game/src/main/java/forge/game/cost/CostUnattach.java @@ -74,21 +74,14 @@ public class CostUnattach extends CostPartWithList { final String type = this.getType(); if (type.equals("CARDNAME")) { - if (source.isEquipping()) { - return true; - } + return source.isEquipping(); } else if (type.equals("OriginalHost")) { Card originalEquipment = ability.getOriginalHost(); - if (originalEquipment.isEquipping()) { - return true; - } + return originalEquipment.isEquipping(); } else { - if (CardLists.getValidCards(source.getEquippedBy(), type, payer, source).size() > 0) { - return true; - } + return CardLists.getValidCards(source.getEquippedBy(), type, payer, source).size() > 0; } - return false; } public Card findCardToUnattach(final Card source, Player activator, SpellAbility ability) { diff --git a/forge-game/src/main/java/forge/game/cost/CostUntapType.java b/forge-game/src/main/java/forge/game/cost/CostUntapType.java index 7db801bc88f..b52634e00f8 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUntapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostUntapType.java @@ -89,10 +89,7 @@ public class CostUntapType extends CostPartWithList { typeList = CardLists.filter(typeList, Presets.TAPPED); final Integer amount = convertAmount(); - if ((typeList.size() == 0) || ((amount != null) && (typeList.size() < amount))) { - return false; - } - return true; + return (typeList.size() != 0) && ((amount == null) || (typeList.size() >= amount)); } @Override diff --git a/forge-game/src/main/java/forge/game/cost/ICostVisitor.java b/forge-game/src/main/java/forge/game/cost/ICostVisitor.java index 5112124012e..9ca192502b3 100644 --- a/forge-game/src/main/java/forge/game/cost/ICostVisitor.java +++ b/forge-game/src/main/java/forge/game/cost/ICostVisitor.java @@ -2,36 +2,36 @@ package forge.game.cost; public interface ICostVisitor { - public T visit(CostGainControl cost); - public T visit(CostChooseCreatureType cost); - public T visit(CostDiscard cost); - public T visit(CostDamage cost); - public T visit(CostDraw cost); - public T visit(CostExile cost); - public T visit(CostExileFromStack cost); - public T visit(CostExiledMoveToGrave cost); - public T visit(CostExert cost); - public T visit(CostFlipCoin cost); - public T visit(CostMill cost); - public T visit(CostAddMana cost); - public T visit(CostPayLife cost); - public T visit(CostPayEnergy cost); - public T visit(CostGainLife cost); - public T visit(CostPartMana cost); - public T visit(CostPutCardToLib cost); - public T visit(CostTap cost); - public T visit(CostSacrifice cost); - public T visit(CostReturn cost); - public T visit(CostReveal cost); - public T visit(CostRemoveAnyCounter cost); - public T visit(CostRemoveCounter cost); - public T visit(CostPutCounter cost); - public T visit(CostUntapType cost); - public T visit(CostUntap cost); - public T visit(CostUnattach cost); - public T visit(CostTapType cost); + T visit(CostGainControl cost); + T visit(CostChooseCreatureType cost); + T visit(CostDiscard cost); + T visit(CostDamage cost); + T visit(CostDraw cost); + T visit(CostExile cost); + T visit(CostExileFromStack cost); + T visit(CostExiledMoveToGrave cost); + T visit(CostExert cost); + T visit(CostFlipCoin cost); + T visit(CostMill cost); + T visit(CostAddMana cost); + T visit(CostPayLife cost); + T visit(CostPayEnergy cost); + T visit(CostGainLife cost); + T visit(CostPartMana cost); + T visit(CostPutCardToLib cost); + T visit(CostTap cost); + T visit(CostSacrifice cost); + T visit(CostReturn cost); + T visit(CostReveal cost); + T visit(CostRemoveAnyCounter cost); + T visit(CostRemoveCounter cost); + T visit(CostPutCounter cost); + T visit(CostUntapType cost); + T visit(CostUntap cost); + T visit(CostUnattach cost); + T visit(CostTapType cost); - public static class Base implements ICostVisitor { + class Base implements ICostVisitor { @Override public T visit(CostGainControl cost) { diff --git a/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java b/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java index 2043b0e0895..26b1bcaae18 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java +++ b/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java @@ -37,7 +37,7 @@ public class GameEventBlockersDeclared extends GameEvent { */ @Override public String toString() { - List blockerCards = new ArrayList(); + List blockerCards = new ArrayList<>(); for (MapOfLists vv : blockers.values()) { for (Collection cc : vv.values()) { blockerCards.addAll(cc); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java b/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java index e809ad41743..149cf8e3ea9 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java @@ -8,7 +8,7 @@ public class GameEventCardDamaged extends GameEvent { Normal, M1M1Counters, Deathtouch, - LoyaltyLoss; + LoyaltyLoss } public final Card card; diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java b/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java index 1eb9149788f..e1bb2138ffe 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java @@ -43,7 +43,7 @@ public class GameEventCardStatsChanged extends GameEvent { return "Card state changes: " + card.getName() + " (" + StringUtils.join(card.getType(), ' ') + ") " + card.getNetPower() + "/" + card.getNetToughness() + - " and " + String.valueOf(cards.size() - 1) + " more"; + " and " + (cards.size() - 1) + " more"; } } diff --git a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java index 7e038506226..8dd56af94d4 100644 --- a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java +++ b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java @@ -51,7 +51,7 @@ public interface IGameEventVisitor { // This is base class for all visitors. - public static class Base implements IGameEventVisitor{ + class Base implements IGameEventVisitor{ public T visit(GameEventAnteCardsSelected event) { return null; } public T visit(GameEventAttackersDeclared event) { return null; } public T visit(GameEventBlockersDeclared event) { return null; } diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index ead951daf98..805b00f6f92 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -164,7 +164,7 @@ public enum Keyword { protected final boolean isMultipleRedundant; protected final String reminderText, displayName; - private Keyword(Class> type0, boolean isMultipleRedundant0, String reminderText0) { + Keyword(Class> type0, boolean isMultipleRedundant0, String reminderText0) { type = type0; isMultipleRedundant = isMultipleRedundant0; reminderText = reminderText0; @@ -176,7 +176,7 @@ public enum Keyword { String details = k; // try to get real part if (k.contains(":")) { - final String x[] = k.split(":", 2); + final String[] x = k.split(":", 2); keyword = smartValueOf(x[0]); details = x[1]; } else if (k.contains(" ")) { @@ -186,7 +186,7 @@ public enum Keyword { // other keywords that contains other stuff like Enchant if (keyword == Keyword.UNDEFINED) { - final String x[] = k.split(" ", 2); + final String[] x = k.split(" ", 2); final Keyword k2 = smartValueOf(x[0]); // Keywords that needs to be undefined @@ -245,20 +245,20 @@ public enum Keyword { public static List getAllKeywords() { Keyword[] values = values(); - List keywords = new ArrayList(); + List keywords = new ArrayList<>(); for (int i = 1; i < values.length; i++) { //skip UNDEFINED keywords.add(values[i]); } return keywords; } - private static final Map> cardKeywordSetLookup = new HashMap>(); + private static final Map> cardKeywordSetLookup = new HashMap<>(); public static Set getKeywordSet(PaperCard card) { String key = card.getName(); Set keywordSet = cardKeywordSetLookup.get(key); if (keywordSet == null) { - keywordSet = new HashSet(); + keywordSet = new HashSet<>(); for (KeywordInterface inst : Card.getCardForUi(card).getKeywords()) { final Keyword keyword = inst.getKeyword(); if (keyword != Keyword.UNDEFINED) { diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java index 33bfe77dd56..50b99b5e66a 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java @@ -24,10 +24,10 @@ public abstract class KeywordInstance> implements K private boolean hidden; - private List triggers = Lists.newArrayList(); - private List replacements = Lists.newArrayList(); - private List abilities = Lists.newArrayList(); - private List staticAbilities = Lists.newArrayList(); + private List triggers = Lists.newArrayList(); + private List replacements = Lists.newArrayList(); + private List abilities = Lists.newArrayList(); + private List staticAbilities = Lists.newArrayList(); /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java b/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java index 83ad9b87aa8..d8b5f152605 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java @@ -21,36 +21,36 @@ public interface KeywordInterface extends Cloneable { boolean getHidden(); void setHidden(boolean val); - public void createTraits(final Card host, final boolean intrinsic); + void createTraits(final Card host, final boolean intrinsic); void createTraits(final Card host, final boolean intrinsic, final boolean clear); - public void addTrigger(final Trigger trg); + void addTrigger(final Trigger trg); - public void addReplacement(final ReplacementEffect trg); + void addReplacement(final ReplacementEffect trg); - public void addSpellAbility(final SpellAbility s); - public void addStaticAbility(final StaticAbility st); + void addSpellAbility(final SpellAbility s); + void addStaticAbility(final StaticAbility st); - public void setHostCard(final Card host); + void setHostCard(final Card host); /** * @return the triggers */ - public Collection getTriggers(); + Collection getTriggers(); /** * @return the replacements */ - public Collection getReplacements(); + Collection getReplacements(); /** * @return the abilities */ - public Collection getAbilities(); + Collection getAbilities(); /** * @return the staticAbilities */ - public Collection getStaticAbilities(); + Collection getStaticAbilities(); - public KeywordInterface copy(final Card host, final boolean lki); + KeywordInterface copy(final Card host, final boolean lki); - public boolean redundant(final Collection list); + boolean redundant(final Collection list); } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java index b1e988e5bdb..167cc20dce5 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java @@ -18,7 +18,7 @@ public class KeywordWithCostAndType extends KeywordInstance 2) { strType = k[2]; } else { - String n[] = type.split(","); + String[] n = type.split(","); for (int i = 0; i < n.length; i++) { if (CardType.isACardType(n[i])) { n[i] = n[i].toLowerCase(); diff --git a/forge-game/src/main/java/forge/game/keyword/Ninjutsu.java b/forge-game/src/main/java/forge/game/keyword/Ninjutsu.java index 2159f8ea430..50b5d8b2006 100644 --- a/forge-game/src/main/java/forge/game/keyword/Ninjutsu.java +++ b/forge-game/src/main/java/forge/game/keyword/Ninjutsu.java @@ -10,7 +10,7 @@ public class Ninjutsu extends KeywordWithCost { @Override protected void parse(String details) { if (details.contains(":")) { - String k[] = details.split(":"); + String[] k = details.split(":"); details = k[0]; if (k[1].equals("Commander")) { commander = true; diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java index d652b3c40a9..f3484f6192b 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java @@ -109,7 +109,7 @@ public class ManaCostBeingPaid { // holds Mana_Part objects // ManaPartColor is stored before ManaPartGeneric - private final Map unpaidShards = new HashMap(); + private final Map unpaidShards = new HashMap<>(); private Map xManaCostPaidByColor; private final String sourceRestriction; private byte sunburstMap = 0; @@ -124,7 +124,7 @@ public class ManaCostBeingPaid { unpaidShards.put(m.getKey(), new ShardCount(m.getValue())); } if (manaCostBeingPaid.xManaCostPaidByColor != null) { - xManaCostPaidByColor = new HashMap(manaCostBeingPaid.xManaCostPaidByColor); + xManaCostPaidByColor = new HashMap<>(manaCostBeingPaid.xManaCostPaidByColor); } sourceRestriction = manaCostBeingPaid.sourceRestriction; sunburstMap = manaCostBeingPaid.sunburstMap; @@ -503,7 +503,7 @@ public class ManaCostBeingPaid { sc.xCount--; String color = MagicColor.toShortString(colorMask); if (xManaCostPaidByColor == null) { - xManaCostPaidByColor = new HashMap(); + xManaCostPaidByColor = new HashMap<>(); } Integer xColor = xManaCostPaidByColor.get(color); if (xColor == null) { @@ -594,7 +594,7 @@ public class ManaCostBeingPaid { } int nGeneric = getGenericManaAmount(); - List shards = new ArrayList(unpaidShards.keySet()); + List shards = new ArrayList<>(unpaidShards.keySet()); // TODO Fix this. Should we really be changing Shards here? if (false && pool != null) { //replace shards with generic mana if they can be paid with any color mana @@ -610,12 +610,12 @@ public class ManaCostBeingPaid { if (nGeneric > 0) { if (nGeneric <= 20) { - sb.append("{" + nGeneric + "}"); + sb.append("{").append(nGeneric).append("}"); } else { //if no mana symbol exists for generic amount, use combination of symbols for each digit String genericStr = String.valueOf(nGeneric); for (int i = 0; i < genericStr.length(); i++) { - sb.append("{" + genericStr.charAt(i) + "}"); + sb.append("{").append(genericStr.charAt(i)).append("}"); } } } @@ -668,7 +668,7 @@ public class ManaCostBeingPaid { } public final List getUnpaidShards() { - List result = new ArrayList(); + List result = new ArrayList<>(); for (Entry kv : unpaidShards.entrySet()) { for (int i = kv.getValue().totalCount; i > 0; i--) { result.add(kv.getKey()); diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index de59a57ef21..9fb66880820 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -95,15 +95,12 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } } - if (totalMana() == safeMana) { - return false; //won't lose floating mana if all mana is of colors that aren't going to be emptied - } - return true; + return totalMana() != safeMana; //won't lose floating mana if all mana is of colors that aren't going to be emptied } public final List clearPool(boolean isEndOfPhase) { // isEndOfPhase parameter: true = end of phase, false = mana drain effect - List cleared = new ArrayList(); + List cleared = new ArrayList<>(); if (floatingMana.isEmpty()) { return cleared; } if (isEndOfPhase && owner.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.manapoolsDontEmpty)) { @@ -128,7 +125,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { for (Byte b : keys) { Collection cm = floatingMana.get(b); if (isEndOfPhase && !owner.getGame().getPhaseHandler().is(PhaseType.CLEANUP)) { - final List pMana = new ArrayList(); + final List pMana = new ArrayList<>(); for (final Mana mana : cm) { if (mana.getManaAbility()!= null && mana.getManaAbility().isPersistentMana()) { pMana.add(mana); @@ -162,7 +159,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } private void convertManaColor(final byte originalColor, final byte toColor) { - List convert = new ArrayList(); + List convert = new ArrayList<>(); Collection cm = floatingMana.get(originalColor); for (Mana m : cm) { convert.add(new Mana(toColor, m.getSourceCard(), m.getManaAbility())); @@ -290,7 +287,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { return false; } - final List removeFloating = new ArrayList(); + final List removeFloating = new ArrayList<>(); boolean manaNotAccountedFor = false; // loop over mana produced by mana ability @@ -370,7 +367,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } // TODO The following may not be needed anymore? - if (((color & (byte) ManaAtom.COLORLESS) != 0) && shard.canBePaidWithManaOfColor((byte) (byte)ManaAtom.COLORLESS)) { + if (((color & (byte) ManaAtom.COLORLESS) != 0) && shard.canBePaidWithManaOfColor((byte)ManaAtom.COLORLESS)) { return true; } diff --git a/forge-game/src/main/java/forge/game/mulligan/MulliganService.java b/forge-game/src/main/java/forge/game/mulligan/MulliganService.java index 2fed6777cc5..0d787327ff1 100644 --- a/forge-game/src/main/java/forge/game/mulligan/MulliganService.java +++ b/forge-game/src/main/java/forge/game/mulligan/MulliganService.java @@ -68,7 +68,7 @@ public class MulliganService { continue; } Player p = mulligan.getPlayer(); - boolean keep = mulligan.canMulligan() ? p.getController().mulliganKeepHand(firstPlayer, mulligan.tuckCardsAfterKeepHand()) : true; + boolean keep = !mulligan.canMulligan() || p.getController().mulliganKeepHand(firstPlayer, mulligan.tuckCardsAfterKeepHand()); if (game.isGameOver()) { // conceded on mulligan prompt return; diff --git a/forge-game/src/main/java/forge/game/phase/ExtraTurn.java b/forge-game/src/main/java/forge/game/phase/ExtraTurn.java index 156e788cf1d..5d7a0d29c17 100644 --- a/forge-game/src/main/java/forge/game/phase/ExtraTurn.java +++ b/forge-game/src/main/java/forge/game/phase/ExtraTurn.java @@ -36,7 +36,7 @@ import forge.game.trigger.Trigger; public class ExtraTurn { private Player player = null; - private List delTrig = Collections.synchronizedList(new ArrayList()); + private List delTrig = Collections.synchronizedList(new ArrayList<>()); private boolean skipUntap = false; private boolean cantSetSchemesInMotion = false; /** diff --git a/forge-game/src/main/java/forge/game/phase/Phase.java b/forge-game/src/main/java/forge/game/phase/Phase.java index 9b31c09900a..3a84791af1c 100644 --- a/forge-game/src/main/java/forge/game/phase/Phase.java +++ b/forge-game/src/main/java/forge/game/phase/Phase.java @@ -45,11 +45,11 @@ public class Phase implements java.io.Serializable { this.type = type; } - protected final List at = new ArrayList(); - private final List until = new ArrayList(); - private final HashMap> untilMap = new HashMap>(); - private final HashMap> untilEndMap = new HashMap>(); - private final HashMap> registerMap = new HashMap>(); + protected final List at = new ArrayList<>(); + private final List until = new ArrayList<>(); + private final HashMap> untilMap = new HashMap<>(); + private final HashMap> untilEndMap = new HashMap<>(); + private final HashMap> registerMap = new HashMap<>(); /** *

diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index fd75bb5e2b8..9aa823316e2 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -70,7 +70,7 @@ public class PhaseHandler implements java.io.Serializable { private PhaseType phase = null; private int turn = 0; - private final transient Stack extraTurns = new Stack(); + private final transient Stack extraTurns = new Stack<>(); private final transient Map> extraPhases = Maps.newEnumMap(PhaseType.class); private int nUpkeepsThisTurn = 0; @@ -663,7 +663,7 @@ public class PhaseHandler implements java.io.Serializable { // map: defender => (many) attacker => (many) blocker Map> blockers = Maps.newHashMap(); for (GameEntity ge : combat.getDefendersControlledBy(p)) { - MapOfLists protectThisDefender = new HashMapOfLists(CollectionSuppliers.arrayLists()); + MapOfLists protectThisDefender = new HashMapOfLists<>(CollectionSuppliers.arrayLists()); for (Card att : combat.getAttackersOf(ge)) { protectThisDefender.addAll(att, combat.getBlockers(att)); } @@ -916,7 +916,7 @@ public class PhaseHandler implements java.io.Serializable { // 500.8. Some effects can add phases to a turn. They do this by adding the phases directly after the specified phase. // If multiple extra phases are created after the same phase, the most recently created phase will occur first. if (!extraPhases.containsKey(afterPhase)) { - extraPhases.put(afterPhase, new Stack()); + extraPhases.put(afterPhase, new Stack<>()); } extraPhases.get(afterPhase).push(extraPhase); } @@ -1077,7 +1077,7 @@ public class PhaseHandler implements java.io.Serializable { } private boolean checkStateBasedEffects() { - final Set allAffectedCards = new HashSet(); + final Set allAffectedCards = new HashSet<>(); do { // Rule 704.3 Whenever a player would get priority, the game checks ... for state-based actions, game.getAction().checkStateEffects(false, allAffectedCards); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseType.java b/forge-game/src/main/java/forge/game/phase/PhaseType.java index 8022b483c39..15fda8e63d1 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseType.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseType.java @@ -36,10 +36,10 @@ public enum PhaseType { public final String nameForUi; public final String nameForScripts; - private PhaseType(String name) { + PhaseType(String name) { this(name, name); } - private PhaseType(String name, String name_for_scripts) { + PhaseType(String name, String name_for_scripts) { nameForUi = name; nameForScripts = name_for_scripts; } @@ -74,7 +74,7 @@ public enum PhaseType { } public static List listValueOf(final String values) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final String s : values.split("[, ]+")) { result.add(PhaseType.smartValueOf(s)); } @@ -87,7 +87,7 @@ public enum PhaseType { * @return */ public static List parseRange(String values) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final String s : values.split(",")) { int idxArrow = s.indexOf("->"); if (idxArrow >= 0) { diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index 7835a67cdaf..6b317fa3dff 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -35,7 +35,6 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -93,11 +92,8 @@ public class Untap extends Phase { } //exerted need current player turn final Player playerTurn = c.getGame().getPhaseHandler().getPlayerTurn(); - - if (c.isExertedBy(playerTurn)) { - return false; - } - return true; + + return !c.isExertedBy(playerTurn); } public static final Predicate CANUNTAP = new Predicate() { @@ -125,7 +121,7 @@ public class Untap extends Phase { for (final Card c : bounceList) { game.getAction().moveToHand(c, null); } - list.removeAll((Collection)bounceList); + list.removeAll(bounceList); final Map restrictUntap = Maps.newHashMap(); boolean hasChosen = false; @@ -154,10 +150,7 @@ public class Untap extends Phase { if (!Untap.canUntap(c)) { return false; } - if (c.isValid(restrict, player, null, null)) { - return false; - } - return true; + return !c.isValid(restrict, player, null, null); } }); @@ -187,7 +180,7 @@ public class Untap extends Phase { Map remaining = Maps.newHashMap(restrictUntap); for (Entry entry : remaining.entrySet()) { if (entry.getValue() == 0) { - cardList.removeAll((Collection)CardLists.getValidCards(cardList, entry.getKey(), player, null)); + cardList.removeAll(CardLists.getValidCards(cardList, entry.getKey(), player, null)); restrictUntap.remove(entry.getKey()); } } @@ -227,19 +220,19 @@ public class Untap extends Phase { private static void optionalUntap(final Card c) { if (c.hasKeyword("You may choose not to untap CARDNAME during your untap step.")) { if (c.isTapped()) { - String prompt = "Untap " + c.toString() + "?"; + StringBuilder prompt = new StringBuilder("Untap " + c.toString() + "?"); boolean defaultChoice = true; if (c.getGainControlTargets().size() > 0) { final Iterable targets = c.getGainControlTargets(); - prompt += "\r\n" + c + " is controlling: "; + prompt.append("\r\n").append(c).append(" is controlling: "); for (final Card target : targets) { - prompt += target; + prompt.append(target); if (target.isInPlay()) { defaultChoice = false; } } } - boolean untap = c.getController().getController().chooseBinary(new SpellAbility.EmptySa(c, c.getController()), prompt, BinaryChoiceType.UntapOrLeaveTapped, defaultChoice); + boolean untap = c.getController().getController().chooseBinary(new SpellAbility.EmptySa(c, c.getController()), prompt.toString(), BinaryChoiceType.UntapOrLeaveTapped, defaultChoice); if (untap) { c.untap(); } diff --git a/forge-game/src/main/java/forge/game/player/AchievementTracker.java b/forge-game/src/main/java/forge/game/player/AchievementTracker.java index 58ff288510e..4987a380b4b 100644 --- a/forge-game/src/main/java/forge/game/player/AchievementTracker.java +++ b/forge-game/src/main/java/forge/game/player/AchievementTracker.java @@ -10,8 +10,8 @@ import forge.game.spellability.SpellAbility; //class for storing information during a game that is used at the end of the game to determine achievements public class AchievementTracker { - public final Set activatedUltimates = new HashSet(); - public final Set challengesCompleted = new HashSet(); + public final Set activatedUltimates = new HashSet<>(); + public final Set challengesCompleted = new HashSet<>(); public int mulliganTo = 7; public int spellsCast = 0; public int maxStormCount = 0; diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 2607b412d75..feb0bde0000 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -119,7 +119,7 @@ public class Player extends GameEntity implements Comparable { private Map staticAbilities = Maps.newHashMap(); - private Map changedKeywords = new ConcurrentSkipListMap(); + private Map changedKeywords = new ConcurrentSkipListMap<>(); private ManaPool manaPool = new ManaPool(this); private GameEntity mustAttackEntity = null; private GameEntity mustAttackEntityThisTurn = null; @@ -461,10 +461,7 @@ public class Player extends GameEntity implements Comparable { } public final boolean canGainLife() { - if (hasKeyword("You can't gain life.") || hasKeyword("Your life total can't change.")) { - return false; - } - return true; + return !hasKeyword("You can't gain life.") && !hasKeyword("Your life total can't change."); } public final int loseLife(final int toLose) { @@ -513,20 +510,14 @@ public class Player extends GameEntity implements Comparable { } public final boolean canLoseLife() { - if (hasKeyword("Your life total can't change.")) { - return false; - } - return true; + return !hasKeyword("Your life total can't change."); } public final boolean canPayLife(final int lifePayment) { if (life < lifePayment) { return false; } - if ((lifePayment > 0) && hasKeyword("Your life total can't change.")) { - return false; - } - return true; + return (lifePayment <= 0) || !hasKeyword("Your life total can't change."); } public final boolean payLife(final int lifePayment, final Card source) { @@ -777,8 +768,8 @@ public class Player extends GameEntity implements Comparable { CardCollection preventionEffectSources = new CardCollection(shieldMap.keySet()); Card shieldSource = preventionEffectSources.get(0); if (preventionEffectSources.size() > 1) { - Map choiceMap = new TreeMap(); - List choices = new ArrayList(); + Map choiceMap = new TreeMap<>(); + List choices = new ArrayList<>(); for (final Card key : preventionEffectSources) { String effDesc = shieldMap.get(key).get("EffectString"); int descIndex = effDesc.indexOf("SpellDescription"); @@ -826,7 +817,7 @@ public class Player extends GameEntity implements Comparable { CardCollection newCardsInCommand = new CardCollection(getGame().getCardsIn(ZoneType.Command)); newCardsInCommand.removeAll(cardsInCommand); if (!newCardsInCommand.isEmpty()) { - newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + Integer.toString(dmgToBePrevented)); + newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + dmgToBePrevented); } } subtractPreventNextDamageWithEffect(shieldSource, restDamage); @@ -1067,7 +1058,7 @@ public class Player extends GameEntity implements Comparable { * @param keyword the keyword to add. */ public final void addKeyword(final String keyword) { - addChangedKeywords(ImmutableList.of(keyword), ImmutableList.of(), getGame().getNextTimestamp()); + addChangedKeywords(ImmutableList.of(keyword), ImmutableList.of(), getGame().getNextTimestamp()); } /** @@ -1157,7 +1148,7 @@ public class Player extends GameEntity implements Comparable { } public final FCollectionView getStaticAbilities() { - FCollection result = new FCollection(); + FCollection result = new FCollection<>(); for (DetachedCardEffect eff : staticAbilities.values()) { result.addAll(eff.getStaticAbilities()); } @@ -1185,7 +1176,7 @@ public class Player extends GameEntity implements Comparable { PlayerZone com = getZone(ZoneType.Command); for (DetachedCardEffect eff : staticAbilities.values()) { com.remove(eff); - eff.setStaticAbilities(Lists.newArrayList()); + eff.setStaticAbilities(Lists.newArrayList()); } this.updateZoneForView(com); } @@ -1201,7 +1192,7 @@ public class Player extends GameEntity implements Comparable { boolean cancelHexproof = false; for (String k : a.getKeywords()) { if (k.startsWith("IgnoreHexproof")) { - String m[] = k.split(":"); + String[] m = k.split(":"); if (isValid(m[1].split(","), a, sa.getHostCard(), sa)) { cancelHexproof = true; break; @@ -1218,10 +1209,7 @@ public class Player extends GameEntity implements Comparable { return false; } - if ((hasKeyword("You can't be the targets of spells or activated abilities") && (sa.isSpell() || (sa instanceof AbilityActivated)))) { - return false; - } - return true; + return (!hasKeyword("You can't be the targets of spells or activated abilities") || (!sa.isSpell() && (!(sa instanceof AbilityActivated)))); } @@ -1723,7 +1711,7 @@ public class Player extends GameEntity implements Comparable { if (land.isFaceDown()) { land.turnFaceUp(); } - game.getAction().moveTo(getZone(ZoneType.Battlefield), land, null, new HashMap()); + game.getAction().moveTo(getZone(ZoneType.Battlefield), land, null, new HashMap<>()); // play a sound game.fireEvent(new GameEventLandPlayed(this, land)); @@ -1783,10 +1771,7 @@ public class Player extends GameEntity implements Comparable { adjMax += Integer.valueOf(k[1]); } } - if (landsPlayedThisTurn < adjMax) { - return true; - } - return false; + return landsPlayedThisTurn < adjMax; } public final ManaPool getManaPool() { @@ -2957,11 +2942,7 @@ public class Player extends GameEntity implements Comparable { return true; } - if (isOpponentOf(sa.getActivatingPlayer()) && hasKeyword("Spells and abilities your opponents control can't cause you to discard cards.")) { - return false; - } - - return true; + return !isOpponentOf(sa.getActivatingPlayer()) || !hasKeyword("Spells and abilities your opponents control can't cause you to discard cards."); } public boolean canSacrificeBy(SpellAbility sa) { @@ -2969,11 +2950,7 @@ public class Player extends GameEntity implements Comparable { return true; } - if (isOpponentOf(sa.getActivatingPlayer()) && hasKeyword("Spells and abilities your opponents control can't cause you to sacrifice permanents.")) { - return false; - } - - return true; + return !isOpponentOf(sa.getActivatingPlayer()) || !hasKeyword("Spells and abilities your opponents control can't cause you to sacrifice permanents."); } public boolean canSearchLibraryWith(SpellAbility sa, Player targetPlayer) { @@ -2983,11 +2960,8 @@ public class Player extends GameEntity implements Comparable { if (this.hasKeyword("CantSearchLibrary")) { return false; - } else if (targetPlayer != null && targetPlayer.equals(sa.getActivatingPlayer()) - && hasKeyword("Spells and abilities you control can't cause you to search your library.")) { - return false; - } + } else return targetPlayer == null || !targetPlayer.equals(sa.getActivatingPlayer()) + || !hasKeyword("Spells and abilities you control can't cause you to search your library."); - return true; } } diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 96f146e564f..ecea26174d9 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -43,7 +43,7 @@ import java.util.Map; */ public abstract class PlayerController { - public static enum ManaPaymentPurpose { + public enum ManaPaymentPurpose { DeclareAttacker, DeclareBlocker, Echo, @@ -51,7 +51,7 @@ public abstract class PlayerController { CumulativeUpkeep, } - public static enum BinaryChoiceType { + public enum BinaryChoiceType { HeadsOrTails, // coin TapOrUntap, PlayOrDraw, diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index 08238470931..88038cad515 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -274,7 +274,7 @@ public class PlayerProperty { } else if (kind.equals("PermanentInPlay")) { int typeNum = 0; - List controlmost = new ArrayList(); + List controlmost = new ArrayList<>(); for (final Player p : game.getPlayers()) { final int num = p.getCardsIn(ZoneType.Battlefield).size(); if (num > typeNum) { @@ -311,7 +311,7 @@ public class PlayerProperty { type = TextUtil.fastReplace(type, "Only", ""); } int typeNum = 0; - List controlmost = new ArrayList(); + List controlmost = new ArrayList<>(); for (final Player p : game.getPlayers()) { final int num = CardLists.getType(p.getCardsIn(ZoneType.Battlefield), type).size(); if (num > typeNum) { @@ -332,7 +332,7 @@ public class PlayerProperty { } else if (property.startsWith("withLowest")) { if (property.substring(10).equals("Life")) { int lowestLife = player.getLife(); - List lowestlifep = new ArrayList(); + List lowestlifep = new ArrayList<>(); for (final Player p : game.getPlayers()) { if (p.getLife() == lowestLife) { lowestlifep.add(p); @@ -358,4 +358,4 @@ public class PlayerProperty { return true; } -} +} \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 989d70ecf38..ec65996b87c 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -41,7 +41,7 @@ public class PlayerView extends GameEntityView { if (players == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (Player p : players) { collection.add(p.getView()); } @@ -91,7 +91,7 @@ public class PlayerView extends GameEntityView { } public FCollectionView getOpponents() { - return MoreObjects.firstNonNull(this.>get(TrackableProperty.Opponents), new FCollection()); + return MoreObjects.firstNonNull(this.>get(TrackableProperty.Opponents), new FCollection<>()); } void updateOpponents(Player p) { set(TrackableProperty.Opponents, PlayerView.getCollection(p.getOpponents())); @@ -262,7 +262,7 @@ public class PlayerView extends GameEntityView { return damage == null ? 0 : damage.intValue(); } void updateCommanderDamage(Player p) { - Map map = new HashMap(); + Map map = new HashMap<>(); for (Entry entry : p.getCommanderDamage()) { map.put(entry.getKey().getId(), entry.getValue()); } @@ -415,7 +415,7 @@ public class PlayerView extends GameEntityView { return get(TrackableProperty.Mana); } void updateMana(Player p) { - Map mana = new HashMap(); + Map mana = new HashMap<>(); for (byte b : ManaAtom.MANATYPES) { mana.put(b, p.getManaPool().getAmountOfColor(b)); } diff --git a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java index aedf99e5774..094b94ad796 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -19,7 +19,7 @@ public class RegisteredPlayer { private final Deck originalDeck; // never return or modify this instance (it's a reference to game resources) private Deck currentDeck; - private static final Iterable EmptyList = Collections.unmodifiableList(new ArrayList()); + private static final Iterable EmptyList = Collections.unmodifiableList(new ArrayList<>()); private LobbyPlayer player = null; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java b/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java index c2121b2e0d7..ad6a9478245 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java @@ -31,7 +31,7 @@ public class ReplaceSurveil extends ReplacementEffect { } if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get("Affected"), getParam("ValidPlayer").split(","), getHostCard())) { + if (!matchesValid(runParams.get("Affected"), this.getMapParams().get("ValidPlayer").split(","), this.getHostCard())) { return false; } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementResult.java b/forge-game/src/main/java/forge/game/replacement/ReplacementResult.java index bdbf0705124..a60f85d12ce 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementResult.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementResult.java @@ -8,5 +8,5 @@ public enum ReplacementResult { Replaced, NotReplaced, Prevented, - Updated; + Updated } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java index 9d420ef7199..0f10844b665 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementType.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementType.java @@ -29,7 +29,7 @@ public enum ReplacementType { Untap(ReplaceUntap.class); Class clasz; - private ReplacementType(Class cls) { + ReplacementType(Class cls) { clasz = cls; } diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index 9d2d71e1f38..b3b9040bf61 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -97,8 +97,7 @@ public class AbilityManaPart implements java.io.Serializable { this.addsKeywordsUntil = params.get("AddsKeywordsUntil"); this.addsCounters = params.get("AddsCounters"); this.triggersWhenSpent = params.get("TriggersWhenSpent"); - this.persistentMana = (null == params.get("PersistentMana")) ? false : - "True".equalsIgnoreCase(params.get("PersistentMana")); + this.persistentMana = (null != params.get("PersistentMana")) && "True".equalsIgnoreCase(params.get("PersistentMana")); this.manaReplaceType = params.containsKey("ManaReplaceType") ? params.get("ManaReplaceType") : ""; } @@ -489,12 +488,8 @@ public class AbilityManaPart implements java.io.Serializable { * @return a boolean. */ public final boolean isBasic() { - if (this.getOrigProduced().length() != 1 && !this.getOrigProduced().contains("Any") - && !this.getOrigProduced().contains("Chosen")) { - return false; - } - - return true; + return this.getOrigProduced().length() == 1 || this.getOrigProduced().contains("Any") + || this.getOrigProduced().contains("Chosen"); } /** {@inheritDoc} */ diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index fb8389a1af7..cfa028365c6 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -118,7 +118,8 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean basicLandAbility = false; private SplitSide splitSide = null; - enum SplitSide { LEFT, RIGHT }; + enum SplitSide { LEFT, RIGHT } + private int totalManaSpent = 0; /** The pay costs. */ @@ -209,7 +210,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit @Override public boolean equals(final Object obj) { return obj instanceof SpellAbility && this.id == ((SpellAbility) obj).id; - }; + } @Override public void setHostCard(final Card c) { @@ -271,7 +272,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (isPwAbility()) { return false; //Loyalty ability, not a mana ability. } - if (isWrapper() && ((WrappedAbility) this).getTrigger().getMode() != TriggerType.TapsForMana) { + if (isWrapper() && this.getTrigger().getMode() != TriggerType.TapsForMana) { return false; } @@ -1428,10 +1429,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit maxTargets = Integer.parseInt(this.getHostCard().getSVar("CostCountersRemoved")); } - if (minTargets > numTargets || maxTargets < numTargets) { - return false; - } - return true; + return minTargets <= numTargets && maxTargets >= numTargets; } /** *

diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index c53c34bd3ce..0c3f01508a6 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -363,7 +363,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { } if (this.getPlayerContains() != null) { - List list = new ArrayList(); + List list = new ArrayList<>(); if (this.getPlayerDefined() != null) { list.addAll(AbilityUtils.getDefinedPlayers(sa.getHostCard(), this.getPlayerDefined(), sa)); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index bf6a8e8a045..048014c7684 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -314,7 +314,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { // try to deduce which target has been replaced // (this may be imprecise, updateTarget should specify old target if possible) for (Object obj : map.keySet()) { - if (!target.getTargets().contains((GameObject)obj)) { + if (!target.getTargets().contains(obj)) { toRemove = obj; break; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java index 3c0bb190692..20e3d91e522 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityView.java @@ -17,7 +17,7 @@ public class SpellAbilityView extends TrackableObject implements IHasCardView { if (spabs == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (SpellAbility spab : spabs) { collection.add(spab.getView()); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java b/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java index 8b04a632bb3..4d0a734746a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellPermanent.java @@ -48,7 +48,7 @@ public class SpellPermanent extends SpellApiBased { */ public SpellPermanent(final Card sourceCard) { super(sourceCard.isCreature() ? ApiType.PermanentCreature : ApiType.PermanentNoncreature, sourceCard, - new Cost(sourceCard.getManaCost(), false), null, Maps.newHashMap()); + new Cost(sourceCard.getManaCost(), false), null, Maps.newHashMap()); // reset StackDescription for something with Text this.setStackDescription(""); diff --git a/forge-game/src/main/java/forge/game/spellability/StackItemView.java b/forge-game/src/main/java/forge/game/spellability/StackItemView.java index 22ab4d46cad..efe19f0786e 100644 --- a/forge-game/src/main/java/forge/game/spellability/StackItemView.java +++ b/forge-game/src/main/java/forge/game/spellability/StackItemView.java @@ -19,7 +19,7 @@ public class StackItemView extends TrackableObject implements IHasCardView { if (instances == null) { return null; } - TrackableCollection collection = new TrackableCollection(); + TrackableCollection collection = new TrackableCollection<>(); for (SpellAbilityStackInstance si : instances) { collection.add(si.getView()); } diff --git a/forge-game/src/main/java/forge/game/spellability/TargetChoices.java b/forge-game/src/main/java/forge/game/spellability/TargetChoices.java index 6391ab5b509..4d1c812d141 100644 --- a/forge-game/src/main/java/forge/game/spellability/TargetChoices.java +++ b/forge-game/src/main/java/forge/game/spellability/TargetChoices.java @@ -41,8 +41,8 @@ public class TargetChoices implements Cloneable { // Card or Player are legal targets. private final CardCollection targetCards = new CardCollection(); - private final List targetPlayers = new ArrayList(); - private final List targetSpells = new ArrayList(); + private final List targetPlayers = new ArrayList<>(); + private final List targetSpells = new ArrayList<>(); public final int getNumTargeted() { return numTargeted; @@ -117,7 +117,7 @@ public class TargetChoices implements Cloneable { } public final List getTargets() { - final List tgts = new ArrayList(); + final List tgts = new ArrayList<>(); tgts.addAll(targetPlayers); tgts.addAll(targetCards); tgts.addAll(targetSpells); diff --git a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java index 305b77f6950..84cf024fd13 100644 --- a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java +++ b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java @@ -77,7 +77,7 @@ public class TargetRestrictions { // For "Divided" cards. Is this better in TargetChoices? private boolean dividedAsYouChoose = false; - private HashMap dividedMap = new HashMap(); + private HashMap dividedMap = new HashMap<>(); private int stillToDivide = 0; // Not sure what's up with Mandatory? Why wouldn't targeting be mandatory? @@ -773,9 +773,7 @@ public class TargetRestrictions { * @param portionAllocated the divided portion allocated */ public final void addDividedAllocation(final Object tgt, final Integer portionAllocated) { - if (this.dividedMap.containsKey(tgt)) { - this.dividedMap.remove(tgt); - } + this.dividedMap.remove(tgt); this.dividedMap.put(tgt, portionAllocated); } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 0c01ab230e9..21d4edff7d5 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -166,7 +166,7 @@ public class StaticAbility extends CardTraitBase implements Comparable addHiddenKeywords = Lists.newArrayList(); @@ -179,27 +178,11 @@ public final class StaticAbilityContinuous { if (layer == StaticAbilityLayer.MODIFYPT && params.containsKey("AddPower")) { addP = params.get("AddPower"); powerBonus = AbilityUtils.calculateAmount(hostCard, addP, stAb, true); - if (!StringUtils.isNumeric(addP) && !addP.equals("AffectedX")) { - se.setXValue(powerBonus); - } } if (layer == StaticAbilityLayer.MODIFYPT && params.containsKey("AddToughness")) { addT = params.get("AddToughness"); toughnessBonus = AbilityUtils.calculateAmount(hostCard, addT, stAb, true); - if (!StringUtils.isNumeric(addT) && !addT.equals("AffectedX")) { - se.setYValue(toughnessBonus); - } - } - - if (params.containsKey("KeywordMultiplier")) { - final String multiplier = params.get("KeywordMultiplier"); - if (multiplier.equals("X")) { - keywordMultiplier = AbilityUtils.calculateAmount(hostCard, "X", stAb); - se.setXValue(keywordMultiplier); - } else { - keywordMultiplier = Integer.valueOf(multiplier); - } } if (layer == StaticAbilityLayer.ABILITIES2 && params.containsKey("AddKeyword")) { @@ -454,9 +437,7 @@ public final class StaticAbilityContinuous { // add keywords if (addKeywords != null) { - for (int i = 0; i < keywordMultiplier; i++) { - p.addChangedKeywords(addKeywords, removeKeywords == null ? new String[0] : removeKeywords, se.getTimestamp()); - } + p.addChangedKeywords(addKeywords, removeKeywords == null ? new String[0] : removeKeywords, se.getTimestamp()); } // add static abilities @@ -547,14 +528,11 @@ public final class StaticAbilityContinuous { if (layer == StaticAbilityLayer.MODIFYPT) { if (addP.startsWith("AffectedX")) { powerBonus = CardFactoryUtil.xCount(affectedCard, AbilityUtils.getSVar(stAb, addP)); - se.addXMapValue(affectedCard, powerBonus); } if (addT.startsWith("AffectedX")) { toughnessBonus = CardFactoryUtil.xCount(affectedCard, AbilityUtils.getSVar(stAb, addT)); - se.addXMapValue(affectedCard, toughnessBonus); } - affectedCard.addSemiPermanentPowerBoost(powerBonus, false); - affectedCard.addSemiPermanentToughnessBoost(toughnessBonus, false); + affectedCard.addPTBoost(powerBonus, toughnessBonus, se.getTimestamp()); } // add keywords @@ -586,9 +564,7 @@ public final class StaticAbilityContinuous { // add HIDDEN keywords if (!addHiddenKeywords.isEmpty()) { for (final String k : addHiddenKeywords) { - for (int j = 0; j < keywordMultiplier; j++) { - affectedCard.addHiddenExtrinsicKeyword(k); - } + affectedCard.addHiddenExtrinsicKeyword(k); } } @@ -636,7 +612,7 @@ public final class StaticAbilityContinuous { for (String rep : addReplacements) { final ReplacementEffect actualRep = ReplacementHandler.parseReplacement(rep, affectedCard, false); actualRep.setIntrinsic(false); - affectedCard.addReplacementEffect(actualRep).setTemporary(true);; + affectedCard.addReplacementEffect(actualRep).setTemporary(true); } } @@ -727,8 +703,17 @@ public final class StaticAbilityContinuous { } } - if (layer == StaticAbilityLayer.RULES && params.containsKey("Goad")) { - affectedCard.addGoad(se.getTimestamp(), hostCard.getController()); + if (layer == StaticAbilityLayer.RULES) { + if (params.containsKey("Goad")) { + affectedCard.addGoad(se.getTimestamp(), hostCard.getController()); + } + if (params.containsKey("CanBlockAny")) { + affectedCard.addCanBlockAny(se.getTimestamp()); + } + if (params.containsKey("CanBlockAmount")) { + int v = AbilityUtils.calculateAmount(hostCard, params.get("CanBlockAmount"), stAb, true); + affectedCard.addCanBlockAdditional(v, se.getTimestamp()); + } } if (mayLookAt != null) { @@ -759,7 +744,7 @@ public final class StaticAbilityContinuous { } private static void buildIgnorEffectAbility(final StaticAbility stAb, final String costString, final List players, final CardCollectionView cards) { - final List validActivator = new ArrayList(players); + final List validActivator = new ArrayList<>(players); for (final Card c : cards) { validActivator.add(c.getController()); } @@ -802,7 +787,7 @@ public final class StaticAbilityContinuous { final Card hostCard = stAb.getHostCard(); final Player controller = hostCard.getController(); - final List players = new ArrayList(); + final List players = new ArrayList<>(); if (!params.containsKey("Affected")) { return players; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java index db69215e01e..43dd0cb64df 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java @@ -39,12 +39,8 @@ public class StaticAbilityETBTapped { final Map params = stAb.getMapParams(); final Card hostCard = stAb.getHostCard(); - if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { - return false; - } - - return true; + return !params.containsKey("ValidCard") + || card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null); } } diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index e901efcb665..09972042775 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -122,7 +122,7 @@ public abstract class Trigger extends TriggerReplacementBase { this.id = nextId(); this.intrinsic = intrinsic; - this.setRunParams(new HashMap()); // TODO: Consider whether this can be null instead, for performance reasons. + this.setRunParams(new HashMap<>()); // TODO: Consider whether this can be null instead, for performance reasons. this.originalMapParams.putAll(params); this.mapParams.putAll(params); this.setHostCard(host); @@ -303,7 +303,7 @@ public abstract class Trigger extends TriggerReplacementBase { if (this.mapParams.containsKey("APlayerHasMoreLifeThanEachOther")) { int highestLife = Integer.MIN_VALUE; // Negative base just in case a few Lich's or Platinum Angels are running around - final List healthiest = new ArrayList(); + final List healthiest = new ArrayList<>(); for (final Player p : game.getPlayers()) { if (p.getLife() > highestLife) { healthiest.clear(); @@ -323,7 +323,7 @@ public abstract class Trigger extends TriggerReplacementBase { if (this.mapParams.containsKey("APlayerHasMostCardsInHand")) { int largestHand = 0; - final List withLargestHand = new ArrayList(); + final List withLargestHand = new ArrayList<>(); for (final Player p : game.getPlayers()) { if (p.getCardsIn(ZoneType.Hand).size() > largestHand) { withLargestHand.clear(); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java index 4f4ae302f7a..be66cc09438 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java @@ -73,12 +73,12 @@ public class TriggerAttackerBlockedByCreature extends Trigger { if (this.mapParams.containsKey("ValidBlocker")) { final String validBlocker = this.mapParams.get("ValidBlocker"); if (validBlocker.equals("LessPowerThanAttacker")) { - if (blocker.getNetPower() >= attacker.getNetPower()) { - return false; - } - } else if (!matchesValid(blocker, validBlocker.split(","), this.getHostCard())) { - return false; - } + if (blocker.getNetPower() >= attacker.getNetPower()) { + return false; + } + } else if (!matchesValid(blocker, validBlocker.split(","), this.getHostCard())) { + return false; + } } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java index 1f351c52813..441348ace95 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java @@ -76,9 +76,9 @@ public class TriggerBlocks extends Trigger { break; } } - + if (!foundMatch) { - return false; + return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index 0993e8dae29..f49005ac74a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -17,11 +17,7 @@ public class TriggerChangesZoneAll extends Trigger { public boolean performTest(Map runParams2) { final CardZoneTable table = (CardZoneTable) runParams2.get("Cards"); - if (filterCards(table).isEmpty()) { - return false; - } - - return true; + return !filterCards(table).isEmpty(); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java index 8becd1a4ded..94b49909f02 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java @@ -19,11 +19,7 @@ public class TriggerCounterAddedAll extends Trigger { public boolean performTest(Map runParams2) { final GameEntityCounterTable table = (GameEntityCounterTable) runParams2.get("Objects"); - if (filterTable(table).isEmpty()) { - return false; - } - - return true; + return !filterTable(table).isEmpty(); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java index a13e8664d9e..d62f0f8f58c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java @@ -63,10 +63,8 @@ public class TriggerCycled extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java index f067b7a179a..ac8002f5682 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java @@ -51,10 +51,8 @@ public class TriggerDevoured extends Trigger { public final boolean performTest(final java.util.Map runParams2) { final Card sac = (Card) runParams2.get("Devoured"); if (this.mapParams.containsKey("ValidDevoured")) { - if (!sac.isValid(this.mapParams.get("ValidDevoured").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return sac.isValid(this.mapParams.get("ValidDevoured").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java index a85c4479cb3..71c0af1aac8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java @@ -52,10 +52,8 @@ public class TriggerEvolved extends Trigger { public final boolean performTest(final Map runParams2) { final Card sac = (Card) runParams2.get("Card"); if (hasParam("ValidCard")) { - if (!sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + return sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), + getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java index 2005d7fdc40..d4006d908e5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java @@ -24,10 +24,8 @@ public class TriggerExerted extends Trigger { public boolean performTest(Map runParams2) { final Card exerter = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - if (!exerter.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return exerter.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java index 5b15c7db8da..69e458136a9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java @@ -51,10 +51,8 @@ public class TriggerExplores extends Trigger { @Override public final boolean performTest(final Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java index 65ee54f09f4..e45b2eeda7e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java @@ -53,10 +53,8 @@ public class TriggerFight extends Trigger { final Card fighter = (Card) runParams2.get("Fighter"); if (this.mapParams.containsKey("ValidCard")) { - if (!fighter.isValid(this.mapParams.get("ValidCard").split(","), - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + return fighter.isValid(this.mapParams.get("ValidCard").split(","), + this.getHostCard().getController(), this.getHostCard(), null); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 0197f253336..d44cc2af616 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -52,13 +52,13 @@ import com.google.common.collect.Maps; import com.google.common.collect.Multimaps; public class TriggerHandler { - private final List suppressedModes = Collections.synchronizedList(new ArrayList()); - private final List activeTriggers = Collections.synchronizedList(new ArrayList()); + private final List suppressedModes = Collections.synchronizedList(new ArrayList<>()); + private final List activeTriggers = Collections.synchronizedList(new ArrayList<>()); - private final List delayedTriggers = Collections.synchronizedList(new ArrayList()); - private final List thisTurnDelayedTriggers = Collections.synchronizedList(new ArrayList()); - private final ListMultimap playerDefinedDelayedTriggers = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); - private final List waitingTriggers = Collections.synchronizedList(new ArrayList()); + private final List delayedTriggers = Collections.synchronizedList(new ArrayList<>()); + private final List thisTurnDelayedTriggers = Collections.synchronizedList(new ArrayList<>()); + private final ListMultimap playerDefinedDelayedTriggers = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); + private final List waitingTriggers = Collections.synchronizedList(new ArrayList<>()); private final Game game; public TriggerHandler(final Game gameState) { @@ -127,7 +127,7 @@ public class TriggerHandler { } public final void clearDelayedTrigger(final Card card) { - final List deltrigs = new ArrayList(delayedTriggers); + final List deltrigs = new ArrayList<>(delayedTriggers); for (final Trigger trigger : deltrigs) { if (trigger.getHostCard().equals(card)) { @@ -282,7 +282,7 @@ public class TriggerHandler { public final void clearInstrinsicActiveTriggers(final Card c, Zone zoneFrom) { final Iterator itr = activeTriggers.iterator(); Trigger t; - final List toBeRemoved = new ArrayList(); + final List toBeRemoved = new ArrayList<>(); while(itr.hasNext()) { t = itr.next(); @@ -348,7 +348,7 @@ public class TriggerHandler { } public final boolean runWaitingTriggers() { - final List waiting = new ArrayList(waitingTriggers); + final List waiting = new ArrayList<>(waitingTriggers); waitingTriggers.clear(); if (waiting.isEmpty()) { return false; @@ -373,7 +373,7 @@ public class TriggerHandler { } // Copy triggers here, so things can be modified just in case - final List delayedTriggersWorkingCopy = new ArrayList(delayedTriggers); + final List delayedTriggersWorkingCopy = new ArrayList<>(delayedTriggers); boolean checkStatics = false; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java index b9aa5c4028e..931ef32c740 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java @@ -28,10 +28,8 @@ public class TriggerLosesGame extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java index 0dcdb617893..4616f0db3a9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java @@ -51,9 +51,7 @@ public class TriggerPayLife extends Trigger { @Override public final boolean performTest(final Map runParams2) { if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), getParam("ValidPlayer").split(","), getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java index 843368ac05d..3fbe945effc 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java @@ -50,10 +50,8 @@ public class TriggerPhase extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java index a9cac8b0db5..c3b4aa6e789 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java @@ -17,10 +17,8 @@ public class TriggerPhaseIn extends Trigger { final Card phaser = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { - if (!phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + return phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard(), null); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java index f8d1d6c18e4..55bbcbd4b5c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java @@ -42,7 +42,7 @@ public class TriggerPlanarDice extends Trigger { if (this.mapParams.containsKey("Result")) { PlanarDice cond = PlanarDice.smartValueOf(this.mapParams.get("Result")); - if (cond != ((PlanarDice) runParams2.get("Result"))) { + if (cond != runParams2.get("Result")) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java index 59d8d29d926..c7614ca9d95 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java @@ -22,7 +22,7 @@ public class TriggerRevealed extends Trigger { } if (this.mapParams.containsKey("Miracle")) { Boolean madness = (Boolean) runParams2.get("Miracle"); - if (this.mapParams.get("Miracle").equals("True") ^ madness) { + if (!matchesValid(runParams2.get("Card"), getParam("ValidCard").split(","), getHostCard())) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java index 209f3bd5571..70be461dde3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java @@ -50,10 +50,8 @@ public class TriggerScry extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java index bdc94181666..0cebd807951 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java @@ -63,7 +63,7 @@ public class TriggerSetInMotion extends Trigger { return false; } } else if (this.mapParams.get("SchemeType").equals("Ongoing")) { - if (!((Card)runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing)) { + if (((Card) runParams2.get("Scheme")).getType().hasSupertype(CardType.Supertype.Ongoing)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java index 0dc88c7c789..43fde3f60c0 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -254,7 +254,7 @@ public class TriggerSpellAbilityCast extends Trigger { } if (!sameNameFound) { return false; - } + } } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java index 49bedc53cea..b1237117a44 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java @@ -45,10 +45,8 @@ public class TriggerTransformed extends Trigger { @Override public boolean performTest(Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Transformer"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Transformer"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java index 032a6733081..aa0ac8a718d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java @@ -12,10 +12,8 @@ public class TriggerTurnBegin extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), + this.getHostCard()); } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java index 1136077e14b..41d27376928 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java @@ -50,10 +50,8 @@ public class TriggerTurnFaceUp extends Trigger { @Override public final boolean performTest(final java.util.Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { - return false; - } + return matchesValid(runParams2.get("Card"), this.mapParams.get("ValidCard").split(","), + this.getHostCard()); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 1c62481089e..952a21bb6f9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -98,7 +98,7 @@ public enum TriggerType { private final Constructor constructor; - private TriggerType(Class clasz) { + TriggerType(Class clasz) { constructor = findConstructor(clasz); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java index 5b3aef0197b..4ed2b85ad2d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java @@ -79,7 +79,7 @@ public class TriggerVote extends Trigger { private static FCollection getVoters(final Player player, final ListMultimap votes, final boolean isOpponent, final boolean votedOtherchoice) { - final FCollection voters = new FCollection(); + final FCollection voters = new FCollection<>(); for (final Object voteType : votes.keySet()) { final List players = votes.get(voteType); if (votedOtherchoice ^ players.contains(player)) { diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 827f5ff62b5..e48396c53a6 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -463,7 +463,7 @@ public class WrappedAbility extends Ability { if (triggerParams.containsKey("ResolvingCheck")) { // rare cases: Hidden Predators (state trigger, but have "Intervening If" to check IsPresent2) etc. - Map recheck = new HashMap(); + Map recheck = new HashMap<>(); String key = triggerParams.get("ResolvingCheck"); String value = regtrig.getMapParams().get(key); recheck.put(key, value); @@ -532,7 +532,7 @@ public class WrappedAbility extends Ability { } } } - final Map triggerMap = new HashMap(sa.getTriggeringObjects()); + final Map triggerMap = new HashMap<>(sa.getTriggeringObjects()); for (Entry ev : triggerMap.entrySet()) { if (ev.getValue() instanceof Card) { Card card = (Card) ev.getValue(); diff --git a/forge-game/src/main/java/forge/game/zone/CostPaymentStack.java b/forge-game/src/main/java/forge/game/zone/CostPaymentStack.java index f5717f517d6..f8c59d4983c 100644 --- a/forge-game/src/main/java/forge/game/zone/CostPaymentStack.java +++ b/forge-game/src/main/java/forge/game/zone/CostPaymentStack.java @@ -15,7 +15,7 @@ public class CostPaymentStack implements Iterable private Stack stack; public CostPaymentStack() { - stack = new Stack(); + stack = new Stack<>(); } public IndividualCostPaymentInstance push(final CostPart cost, final CostPayment payment) { diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 2fb39bf9915..fd40f536a70 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -72,9 +72,9 @@ public class MagicStack /* extends MyObservable */ implements Iterable simultaneousStackEntryList = Lists.newArrayList(); // They don't provide a LIFO queue, so had to use a deque - private final Deque stack = new LinkedBlockingDeque(); - private final Stack frozenStack = new Stack(); - private final Stack undoStack = new Stack(); + private final Deque stack = new LinkedBlockingDeque<>(); + private final Stack frozenStack = new Stack<>(); + private final Stack undoStack = new Stack<>(); private Player undoStackOwner; private boolean frozen = false; @@ -618,7 +618,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable() { @Override public boolean apply(final Card c) { - if (!c.mayPlay(who).isEmpty() || c.mayPlayerLook(who)) { - return true; - } - return false; + return !c.mayPlay(who).isEmpty() || c.mayPlayerLook(who); } }; } diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 7800e400519..000da073c7c 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -51,10 +51,10 @@ public class Zone implements java.io.Serializable, Iterable { protected final ZoneType zoneType; protected final Game game; - protected final transient MapOfLists cardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); - protected final transient MapOfLists cardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); - protected final transient MapOfLists latestStateCardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); - protected final transient MapOfLists latestStateCardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists cardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists cardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists latestStateCardsAddedThisTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); + protected final transient MapOfLists latestStateCardsAddedLastTurn = new EnumMapOfLists<>(ZoneType.class, CollectionSuppliers.arrayLists()); public Zone(final ZoneType zone0, Game game0) { zoneType = zone0; diff --git a/forge-game/src/main/java/forge/game/zone/ZoneType.java b/forge-game/src/main/java/forge/game/zone/ZoneType.java index 283c309df0e..3383a83cb14 100644 --- a/forge-game/src/main/java/forge/game/zone/ZoneType.java +++ b/forge-game/src/main/java/forge/game/zone/ZoneType.java @@ -22,10 +22,10 @@ public enum ZoneType { PlanarDeck(true), None(true); - public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(new ZoneType[]{Battlefield, Graveyard, Exile, Command/*, Hand*/}); + public static final List STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(Battlefield, Graveyard, Exile, Command/*, Hand*/); private final boolean holdsHiddenInfo; - private ZoneType(boolean holdsHidden) { + ZoneType(boolean holdsHidden) { holdsHiddenInfo = holdsHidden; } @@ -46,7 +46,7 @@ public enum ZoneType { } public static List listValueOf(final String values) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); for (final String s : values.split("[, ]+")) { ZoneType zt = ZoneType.smartValueOf(s); if (zt != null) { diff --git a/forge-game/src/main/java/forge/trackable/TrackableObject.java b/forge-game/src/main/java/forge/trackable/TrackableObject.java index a4318b4a829..280fe24d3d0 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableObject.java +++ b/forge-game/src/main/java/forge/trackable/TrackableObject.java @@ -22,7 +22,7 @@ public abstract class TrackableObject implements IIdentifiable, Serializable { protected TrackableObject(final int id0, final Tracker tracker) { id = id0; this.tracker = tracker; - props = new EnumMap(TrackableProperty.class); + props = new EnumMap<>(TrackableProperty.class); changedProps = EnumSet.noneOf(TrackableProperty.class); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index bae4622580e..1f446791f85 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -89,6 +89,7 @@ public enum TrackableProperty { YouMayLook(TrackableTypes.BooleanType), OpponentMayLook(TrackableTypes.BooleanType), BlockAdditional(TrackableTypes.IntegerType), + BlockAny(TrackableTypes.BooleanType), AbilityText(TrackableTypes.StringType), NonAbilityText(TrackableTypes.StringType), FoilIndex(TrackableTypes.IntegerType), @@ -172,10 +173,10 @@ public enum TrackableProperty { private final TrackableType type; private final FreezeMode freezeMode; - private TrackableProperty(TrackableType type0) { + TrackableProperty(TrackableType type0) { this(type0, FreezeMode.RespectsFreeze); } - private TrackableProperty(TrackableType type0, FreezeMode freezeMode0) { + TrackableProperty(TrackableType type0, FreezeMode freezeMode0) { type = type0; freezeMode = freezeMode0; } diff --git a/forge-game/src/main/java/forge/trackable/TrackableTypes.java b/forge-game/src/main/java/forge/trackable/TrackableTypes.java index d54c0f1bef3..6214563f8f7 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableTypes.java +++ b/forge-game/src/main/java/forge/trackable/TrackableTypes.java @@ -376,7 +376,7 @@ public class TrackableTypes { public static final TrackableCollectionType StackItemViewListType = new TrackableCollectionType(StackItemViewType) { @Override protected TrackableCollection getDefaultValue() { - return new TrackableCollection(); + return new TrackableCollection<>(); } @Override diff --git a/forge-game/src/main/java/forge/util/MessageUtil.java b/forge-game/src/main/java/forge/util/MessageUtil.java index efdbc0c040f..ea46eeb77e3 100644 --- a/forge-game/src/main/java/forge/util/MessageUtil.java +++ b/forge-game/src/main/java/forge/util/MessageUtil.java @@ -9,7 +9,7 @@ import forge.game.spellability.SpellAbility; public class MessageUtil { - private MessageUtil() { }; + private MessageUtil() { } public static String formatMessage(String message, Player player, Object related) { if (related instanceof Player && message.indexOf("{player") >= 0) { diff --git a/forge-gui-android/libs/arm64-v8a/libgdx-freetype.so b/forge-gui-android/libs/arm64-v8a/libgdx-freetype.so deleted file mode 100644 index 7565cedda9c..00000000000 Binary files a/forge-gui-android/libs/arm64-v8a/libgdx-freetype.so and /dev/null differ diff --git a/forge-gui-android/libs/arm64-v8a/libgdx.so b/forge-gui-android/libs/arm64-v8a/libgdx.so deleted file mode 100644 index 258b198378c..00000000000 Binary files a/forge-gui-android/libs/arm64-v8a/libgdx.so and /dev/null differ diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 463b1cd39af..bc51f044742 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.27.001 + 1.6.28.002 keystore alias storepass @@ -19,7 +19,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 9d7e5e8dc9d..2f70bf99f2c 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index 7cc24a3df86..0bd9e3a87c9 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -61,7 +61,7 @@ import java.util.concurrent.TimeUnit; public class ImageCache { // short prefixes to save memory - private static final Set _missingIconKeys = new HashSet(); + private static final Set _missingIconKeys = new HashSet<>(); private static final LoadingCache _CACHE = CacheBuilder.newBuilder() .maximumSize(FModel.getPreferences().getPrefInt((FPref.UI_IMAGE_CACHE_MAXIMUM))) .expireAfterAccess(15, TimeUnit.MINUTES) diff --git a/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java b/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java index 72ecf54fb83..25e76e0169e 100644 --- a/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java +++ b/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java @@ -52,7 +52,7 @@ public class KeyboardShortcuts { final InputMap im = c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); final ActionMap am = c.getActionMap(); - final List list = new ArrayList(); + final List list = new ArrayList<>(); //========== Match Shortcuts /** Show stack. */ @@ -345,9 +345,9 @@ public class KeyboardShortcuts { List existingCodes; if (codestring != null) { - existingCodes = new ArrayList(Arrays.asList(codestring.split(" "))); + existingCodes = new ArrayList<>(Arrays.asList(codestring.split(" "))); } else { - existingCodes = new ArrayList(); + existingCodes = new ArrayList<>(); } // Backspace (8) will remove last code from list. diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java b/forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java index 1f59867d680..d792948e01c 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/DecksComboBox.java @@ -27,9 +27,9 @@ public class DecksComboBox extends FComboBoxWrapper { public void refresh(final DeckType deckType, final boolean isForCommander) { if(isForCommander){ - setModel(new DefaultComboBoxModel(DeckType.CommanderOptions)); + setModel(new DefaultComboBoxModel<>(DeckType.CommanderOptions)); }else { - setModel(new DefaultComboBoxModel(DeckType.ConstructedOptions)); + setModel(new DefaultComboBoxModel<>(DeckType.ConstructedOptions)); } setSelectedItem(deckType); } diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index 3d218ce0fd8..2c8b5b40eaf 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -444,7 +444,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { if (decksComboBox.getDeckType() == null || decksComboBox.getDeckType() == DeckType.NET_DECK) { //handle special case of net decks if (netDeckCategory == null) { return ""; } - state.append(NetDeckCategory.PREFIX + netDeckCategory.getName()); + state.append(NetDeckCategory.PREFIX).append(netDeckCategory.getName()); } else { state.append(decksComboBox.getDeckType().name()); @@ -506,13 +506,13 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { private List getSelectedDecksFromSavedState(final String savedState) { try { if (StringUtils.isBlank(savedState)) { - return new ArrayList(); + return new ArrayList<>(); } else { return Arrays.asList(savedState.split(";")[1].split(SELECTED_DECK_DELIMITER)); } } catch (final Exception ex) { System.err.println(ex + " [savedState=" + savedState + "]"); - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java index a28f4a94202..7ee3252e5a1 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java @@ -36,7 +36,7 @@ import java.util.TreeMap; @SuppressWarnings("serial") public class FDeckViewer extends FDialog { private final Deck deck; - private final List sections = new ArrayList(); + private final List sections = new ArrayList<>(); private final CardManager cardManager; private DeckSection currentSection; diff --git a/forge-gui-desktop/src/main/java/forge/error/BugReportDialog.java b/forge-gui-desktop/src/main/java/forge/error/BugReportDialog.java index 3b9eaa6d65d..1f06e198b63 100644 --- a/forge-gui-desktop/src/main/java/forge/error/BugReportDialog.java +++ b/forge-gui-desktop/src/main/java/forge/error/BugReportDialog.java @@ -67,7 +67,7 @@ public class BugReportDialog { // Button is not modified, String gets the automatic listener to hide // the dialog - List options = new ArrayList(); + List options = new ArrayList<>(); options.add(new JButton(new _Report())); // option to enable automatic Sentry submission options.add(new JCheckBox(new _ActivateSentry())); diff --git a/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java b/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java index 98343afae07..d62d8bd0f62 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java @@ -100,7 +100,7 @@ public class BoxedProductCardListViewer extends FDialog { */ public BoxedProductCardListViewer(final String title, final String message, final List list, final Icon dialogIcon) { this.list = Collections.unmodifiableList(list); - this.jList = new JList(new ChooserListModel()); + this.jList = new JList<>(new ChooserListModel()); this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.picture.setOpaque(false); diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java b/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java index 620b0b2ce3d..8a9a98c6530 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java @@ -98,7 +98,7 @@ public class CardListViewer extends FDialog { */ public CardListViewer(final String title, final String message, final List list, final Icon dialogIcon) { this.list = Collections.unmodifiableList(list); - this.jList = new JList(new ChooserListModel()); + this.jList = new JList<>(new ChooserListModel()); this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.picture.setOpaque(false); diff --git a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java index 7943e5fb22c..02f7034d946 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java +++ b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java @@ -79,10 +79,10 @@ public class DualListBox extends FDialog { targetRemainingSourcesMin = remainingSourcesMin; targetRemainingSourcesMax = remainingSourcesMax; - sourceListModel = new UnsortedListModel(); - sourceList = new FList(sourceListModel); - destListModel = new UnsortedListModel(); - destList = new FList(destListModel); + sourceListModel = new UnsortedListModel<>(); + sourceList = new FList<>(sourceListModel); + destListModel = new UnsortedListModel<>(); + destList = new FList<>(destListModel); final Runnable onAdd = new Runnable() { @SuppressWarnings("unchecked") @@ -90,7 +90,7 @@ public class DualListBox extends FDialog { public void run() { if (!addButton.isEnabled()) { return; } - List selected = new ArrayList(); + List selected = new ArrayList<>(); for (Object item : sourceList.getSelectedValuesList()) { selected.add((T)item); } @@ -107,7 +107,7 @@ public class DualListBox extends FDialog { public void run() { if (!removeButton.isEnabled()) { return; } - List selected = new ArrayList(); + List selected = new ArrayList<>(); for (Object item : destList.getSelectedValuesList()) { selected.add((T)item); } diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index a5db47f9733..b47791c4b84 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -89,7 +89,7 @@ public class GuiChoose { return getInteger(message, min, max); } - final List choices = new ArrayList(); + final List choices = new ArrayList<>(); for (int i = min; i <= cutoff; i++) { choices.add(Integer.valueOf(i)); } @@ -143,7 +143,7 @@ public class GuiChoose { public static List getChoices(final String message, final int min, final int max, final Collection choices, final T selected, final Function display, final CMatchUI matchUI) { if (choices == null || choices.isEmpty()) { if (min == 0) { - return new ArrayList(); + return new ArrayList<>(); } throw new RuntimeException("choice required from empty list"); } @@ -151,7 +151,7 @@ public class GuiChoose { final Callable> showChoice = new Callable>() { @Override public List call() { - final ListChooser c = new ListChooser(message, min, max, choices, display); + final ListChooser c = new ListChooser<>(message, min, max, choices, display); final JList list = c.getLstChoices(); if (matchUI != null) { list.addListSelectionListener(new ListSelectionListener() { @@ -224,7 +224,7 @@ public class GuiChoose { } }; - final FutureTask> future = new FutureTask>(showChoice); + final FutureTask> future = new FutureTask<>(showChoice); FThreads.invokeInEdtAndWait(future); try { return future.get(); @@ -251,7 +251,7 @@ public class GuiChoose { final Callable> callable = new Callable>() { @Override public List call() { - final DualListBox dual = new DualListBox(remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, matchUI); + final DualListBox dual = new DualListBox<>(remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, matchUI); dual.setSecondColumnLabelText(top); dual.setSideboardMode(sideboardingMode); @@ -275,7 +275,7 @@ public class GuiChoose { } }; - final FutureTask> ft = new FutureTask>(callable); + final FutureTask> ft = new FutureTask<>(callable); FThreads.invokeInEdtAndWait(ft); try { return ft.get(); @@ -298,7 +298,7 @@ public class GuiChoose { return cardList; } }; - final FutureTask> ft = new FutureTask>(callable); + final FutureTask> ft = new FutureTask<>(callable); FThreads.invokeInEdtAndWait(ft); gui.clearSelectables(); try { diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java b/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java index 1152cc40270..6924ba602ae 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java @@ -35,7 +35,7 @@ public class GuiDialog { return Boolean.valueOf(answer == 0); }}; - final FutureTask future = new FutureTask(confirmTask); + final FutureTask future = new FutureTask<>(confirmTask); FThreads.invokeInEdtAndWait(future); try { return future.get().booleanValue(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java b/forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java index 1ff99429027..0b4880b2f3f 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportDialog.java @@ -313,7 +313,7 @@ public class ImportDialog { // associates a file operation type with its enablement checkbox and the set // of file move/copy operations that enabling it would entail private final Map>> _selections = - new HashMap>>(); + new HashMap<>(); // attached to all changeable widgets to keep the UI in sync private final ChangeListener _stateChangedListener = new ChangeListener() { @@ -359,7 +359,7 @@ public class ImportDialog { _addSelectionWidget(knownDeckPanel, OpType.UNKNOWN_DECK, "Unknown decks"); final JPanel unknownDeckPanel = new JPanel(new MigLayout("insets 0, gap 5")); unknownDeckPanel.setOpaque(false); - _unknownDeckCombo = new FComboBoxWrapper<_UnknownDeckChoice>(); + _unknownDeckCombo = new FComboBoxWrapper<>(); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Constructed", ForgeConstants.DECK_CONSTRUCTED_DIR)); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Draft", ForgeConstants.DECK_DRAFT_DIR)); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Planar", ForgeConstants.DECK_PLANE_DIR)); @@ -464,14 +464,14 @@ public class ImportDialog { // use a skip list map instead of a regular hashmap so that the files are sorted // alphabetically in the logs. note that this is a concurrent data structure // since it will be modified and read simultaneously by different threads - _selections.put(type, Pair.of(cb, new ConcurrentSkipListMap())); + _selections.put(type, Pair.of(cb, new ConcurrentSkipListMap<>())); parent.add(cb, constraints); } // must be called from GUI event loop thread private void _updateUI() { // update checkbox text labels with current totals - final Set selectedOptions = new HashSet(); + final Set selectedOptions = new HashSet<>(); for (final Map.Entry>> entry : _selections.entrySet()) { final Pair> selection = entry.getValue(); final FCheckBox cb = selection.getLeft(); @@ -494,7 +494,7 @@ public class ImportDialog { Timer timer = null; try { - final Map> selections = new HashMap>(); + final Map> selections = new HashMap<>(); for (final Map.Entry>> entry : _selections.entrySet()) { selections.put(entry.getKey(), entry.getValue().getRight()); } @@ -607,7 +607,7 @@ public class ImportDialog { // user an option to fix if (_isMigration) { // assemble a list of selections that need to be selected to complete a full migration - final List unselectedButShouldBe = new ArrayList(); + final List unselectedButShouldBe = new ArrayList<>(); for (final Map.Entry>> entry : _selections.entrySet()) { if (OpType.POSSIBLE_SET_CARD_PIC == entry.getKey()) { continue; @@ -709,7 +709,7 @@ public class ImportDialog { super("OperationLogUpdater"); setDaemon(true); - _selections = new HashMap>(); + _selections = new HashMap<>(); _operationLog = operationLog; // remove references to FCheckBox when populating map -- we can't safely access it from a thread @@ -844,7 +844,7 @@ public class ImportDialog { // build local operations map that only includes data that we can access from the background thread // use a tree map to maintain alphabetical order - _operations = new TreeMap(); + _operations = new TreeMap<>(); for (final Map.Entry>> entry : selections.entrySet()) { final Pair> selection = entry.getValue(); if (selection.getLeft().isSelected()) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java b/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java index ae670d53f84..123e612e206 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ListChooser.java @@ -87,7 +87,7 @@ public class ListChooser { this.minChoices = minChoices; this.maxChoices = maxChoices; this.list = list.getClass().isInstance(List.class) ? (List)list : Lists.newArrayList(list); - this.lstChoices = new FList(new ChooserListModel()); + this.lstChoices = new FList<>(new ChooserListModel()); final ImmutableList options; if (minChoices == 0) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java b/forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java index 74084fea249..69f585fc7fd 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java +++ b/forge-gui-desktop/src/main/java/forge/gui/MultiLineLabelUI.java @@ -517,7 +517,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener * @return a list of text lines to render */ protected List prepareLines(final JLabel l) { - final List lines = new ArrayList(MultiLineLabelUI.defaultSize); + final List lines = new ArrayList<>(MultiLineLabelUI.defaultSize); final String text = l.getText(); if (text == null) { return null; // Null guard @@ -603,7 +603,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * Reused segments. */ - private final List segments = new ArrayList(2); + private final List segments = new ArrayList<>(2); /** * Singleton instance. diff --git a/forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java b/forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java index 26ffe0ad346..19030dcc8cd 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/UnsortedListModel.java @@ -44,7 +44,7 @@ public class UnsortedListModel extends AbstractListModel { } public void addAll(final ListModel otherModel) { - final Collection elements = new ArrayList(); + final Collection elements = new ArrayList<>(); final int size = otherModel.getSize(); for (int i = 0; size > i; ++i) { elements.add(otherModel.getElementAt(i)); diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java b/forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java index ded574680bb..cd127e8f352 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/DragCell.java @@ -50,7 +50,7 @@ public final class DragCell extends JPanel implements ILocalRepaint { private final int margin = 2 * tabPaddingPx; // Tab handling layout stuff - private final List> allDocs = new ArrayList>(); + private final List> allDocs = new ArrayList<>(); private final JLabel lblHandle = new DragHandle(); private final JLabel lblOverflow = new JLabel(); private IVDoc docSelected = null; @@ -355,7 +355,7 @@ public final class DragCell extends JPanel implements ILocalRepaint { if (allDocs.isEmpty()) { return; } // Order tabs by priority - final List priority = new ArrayList(); + final List priority = new ArrayList<>(); final DragTab selectedTab = docSelected.getTabLabel(); DragTab nextTab = selectedTab; diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java index b809f33f005..8c2f6a38f3e 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java @@ -556,7 +556,7 @@ public final class SLayoutIO { EDocID selectedId = null; double x0 = 0, y0 = 0, w0 = 0, h0 = 0; - MapOfLists model = new HashMapOfLists(CollectionSuppliers.arrayLists()); + MapOfLists model = new HashMapOfLists<>(CollectionSuppliers.arrayLists()); LayoutInfo currentKey = null; while (null != reader && reader.hasNext()) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java index 73b0e1cd4a8..0f779013499 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SRearrangingUtil.java @@ -45,7 +45,7 @@ public final class SRearrangingUtil { private static DragCell cellSrc = null; private static DragCell cellNew = null; private static Dropzone dropzone = Dropzone.NONE; - private static List> docsToMove = new ArrayList>(); + private static List> docsToMove = new ArrayList<>(); private static IVDoc srcSelectedDoc = null; private static final SkinCursor CUR_L = FSkin.getCursor(FSkinProp.IMG_CUR_L, 16, 16, "CUR_L"); @@ -98,9 +98,7 @@ public final class SRearrangingUtil { } // Otherwise, add all of the documents. else { - for (final IVDoc vDoc : cellSrc.getDocs()) { - docsToMove.add(vDoc); - } + docsToMove.addAll(cellSrc.getDocs()); } // Reset and show preview panel @@ -312,7 +310,7 @@ public final class SRearrangingUtil { * from any side which shares corners with the gap. */ private static void fillGap() { // Variables to help with matching the borders - final List cellsToResize = new ArrayList(); + final List cellsToResize = new ArrayList<>(); final int srcX = cellSrc.getAbsX(); final int srcX2 = cellSrc.getAbsX2(); final int srcY = cellSrc.getAbsY(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java index dfc7c4c3fcd..3a3771b449f 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SResizingUtil.java @@ -22,10 +22,10 @@ import java.util.List; *

(S at beginning of class name denotes a static factory.) */ public final class SResizingUtil { - private static final List LEFT_PANELS = new ArrayList(); - private static final List RIGHT_PANELS = new ArrayList(); - private static final List TOP_PANELS = new ArrayList(); - private static final List BOTTOM_PANELS = new ArrayList(); + private static final List LEFT_PANELS = new ArrayList<>(); + private static final List RIGHT_PANELS = new ArrayList<>(); + private static final List TOP_PANELS = new ArrayList<>(); + private static final List BOTTOM_PANELS = new ArrayList<>(); private static int dX; private static int evtX; @@ -135,10 +135,8 @@ public final class SResizingUtil { double roughVal = 0; int smoothVal = 0; - Set existingComponents = new HashSet(); - for (Component c : pnlContent.getComponents()) { - existingComponents.add(c); - } + Set existingComponents = new HashSet<>(); + existingComponents.addAll(Arrays.asList(pnlContent.getComponents())); // This is the core of the pixel-perfect layout. To avoid ±1 px errors on borders // from rounding individual panels, the intermediate values (exactly accurate, in %) diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java index 3ebaff3221a..caf187048ea 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java @@ -49,7 +49,7 @@ public class CardManager extends ItemManager { @Override protected Iterable> getUnique(Iterable> items) { //use special technique for getting unique cards so that cards without art aren't shown - HashMap> map = new HashMap>(); + HashMap> map = new HashMap<>(); for (Entry item : items) { final String key = item.getKey().getName(); final Entry oldValue = map.get(key); @@ -218,7 +218,7 @@ public class CardManager extends ItemManager { filter.edit(); } else { - filter = new AdvancedSearchFilter(itemManager); + filter = new AdvancedSearchFilter<>(itemManager); itemManager.lockFiltering = true; //ensure filter not applied until added boolean result = filter.edit(); itemManager.lockFiltering = false; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java index b5d1755ebc0..10ff32736d7 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java @@ -108,7 +108,7 @@ public final class DeckManager extends ItemManager implements IHasGam if (config0.getCols().containsKey(ColumnDef.DECK_ACTIONS)) { final ItemTableColumn column = new ItemTableColumn(new ItemColumn(config0.getCols().get(ColumnDef.DECK_ACTIONS))); column.setCellRenderer(new DeckActionsRenderer()); - colOverrides = new HashMap(); + colOverrides = new HashMap<>(); colOverrides.put(ColumnDef.DECK_ACTIONS, column); } super.setup(config0, colOverrides); @@ -307,7 +307,7 @@ public final class DeckManager extends ItemManager implements IHasGam filter.edit(); } else { - filter = new AdvancedSearchFilter(DeckManager.this); + filter = new AdvancedSearchFilter<>(DeckManager.this); lockFiltering = true; //ensure filter not applied until added boolean result = filter.edit(); lockFiltering = false; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java index 8a0f5236431..e11b200275c 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java @@ -77,8 +77,8 @@ public abstract class ItemManager extends JPanel implem private final ItemManagerModel model; private Predicate filterPredicate = null; private final Map>, List>> filters = - new HashMap>, List>>(); - private final List> orderedFilters = new ArrayList>(); + new HashMap<>(); + private final List> orderedFilters = new ArrayList<>(); private boolean wantUnique = false; private boolean alwaysNonUnique = false; private boolean allowMultipleSelections = false; @@ -88,7 +88,7 @@ public abstract class ItemManager extends JPanel implem private final Class genericType; private final CDetailPicture cDetailPicture; private ItemManagerConfig config; - private final List selectionListeners = new ArrayList(); + private final List selectionListeners = new ArrayList<>(); private final ItemFilter mainSearchFilter; private final SkinnedPanel pnlButtons = new SkinnedPanel(new MigLayout("insets 0, gap 0, ax center, hidemode 3")); @@ -125,7 +125,7 @@ public abstract class ItemManager extends JPanel implem .tooltip("Toggle to show/hide options for current view") .build(); - private final List> views = new ArrayList>(); + private final List> views = new ArrayList<>(); private final ItemListView listView; private final ImageView imageView; private ItemView currentView; @@ -143,12 +143,12 @@ public abstract class ItemManager extends JPanel implem this.cDetailPicture = cDetailPicture; this.genericType = genericType0; this.wantUnique = wantUnique0; - this.model = new ItemManagerModel(genericType0); + this.model = new ItemManagerModel<>(genericType0); this.mainSearchFilter = createSearchFilter(); this.mainSearchFilter.setAllowRemove(false); - this.listView = new ItemListView(this, this.model); + this.listView = new ItemListView<>(this, this.model); this.imageView = createImageView(this.model); this.views.add(this.listView); @@ -157,7 +157,7 @@ public abstract class ItemManager extends JPanel implem } protected ImageView createImageView(final ItemManagerModel model0) { - return new ImageView(this, model0); + return new ImageView<>(this, model0); } public final CDetailPicture getCDetailPicture() { @@ -562,7 +562,7 @@ public abstract class ItemManager extends JPanel implem */ @Override public ItemPool getSelectedItemPool() { - final ItemPool selectedItemPool = new ItemPool(this.genericType); + final ItemPool selectedItemPool = new ItemPool<>(this.genericType); for (final T item : getSelectedItems()) { selectedItemPool.add(item, getItemCount(item)); } @@ -634,7 +634,7 @@ public abstract class ItemManager extends JPanel implem */ @Override public boolean setSelectedStrings(final Iterable strings) { - final List items = new ArrayList(); + final List items = new ArrayList<>(); for (final String str : strings) { final T item = stringToItem(str); if (item != null) { @@ -652,7 +652,7 @@ public abstract class ItemManager extends JPanel implem */ @Override public boolean selectItemEntrys(final Iterable> itemEntrys) { - final List items = new ArrayList(); + final List items = new ArrayList<>(); for (final Entry itemEntry : itemEntrys) { items.add(itemEntry.getKey()); } @@ -734,7 +734,7 @@ public abstract class ItemManager extends JPanel implem if (this.isUnfiltered()) { this.model.addItem(item, qty); } - final List items = new ArrayList(); + final List items = new ArrayList<>(); items.add(item); this.updateView(false, items); } @@ -755,7 +755,7 @@ public abstract class ItemManager extends JPanel implem this.model.addItems(itemsToAdd); } - final List items = new ArrayList(); + final List items = new ArrayList<>(); for (final Map.Entry item : itemsToAdd) { items.add(item.getKey()); } @@ -859,7 +859,7 @@ public abstract class ItemManager extends JPanel implem final Class> filterClass = (Class>) filter.getClass(); List> classFilters = this.filters.get(filterClass); if (classFilters == null) { - classFilters = new ArrayList>(); + classFilters = new ArrayList<>(); this.filters.put(filterClass, classFilters); } if (classFilters.size() > 0) { @@ -936,7 +936,7 @@ public abstract class ItemManager extends JPanel implem public boolean applyFilters() { if (this.lockFiltering || !this.initialized) { return false; } - final List> predicates = new ArrayList>(); + final List> predicates = new ArrayList<>(); for (final ItemFilter filter : this.orderedFilters) { //TODO: Support custom filter logic if (filter.isEnabled() && !filter.isEmpty()) { predicates.add(filter.buildPredicate(this.genericType)); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java index 30f671c7957..2c6ff484f2a 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -38,7 +38,7 @@ public class AdvancedSearchFilter extends ItemFilter public AdvancedSearchFilter(ItemManager itemManager0) { super(itemManager0); - model = new AdvancedSearch.Model(); + model = new AdvancedSearch.Model<>(); } @Override @@ -54,7 +54,7 @@ public class AdvancedSearchFilter extends ItemFilter @Override public ItemFilter createCopy() { - return new AdvancedSearchFilter(itemManager); + return new AdvancedSearchFilter<>(itemManager); } @Override diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java index 6a040c82653..8b66faa6d9d 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardCMCFilter.java @@ -44,7 +44,7 @@ public class CardCMCFilter extends StatTypeFilter { @Override protected final Predicate buildPredicate() { - final List> cmcs = new ArrayList>(); + final List> cmcs = new ArrayList<>(); for (StatTypes s : buttonMap.keySet()) { if (s.predicate != null && buttonMap.get(s).isSelected()) { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java index 2d94f90ef61..0970b593e07 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardQuestWorldFilter.java @@ -11,7 +11,7 @@ import forge.quest.QuestWorld; public class CardQuestWorldFilter extends CardFormatFilter { - private final Set questWorlds = new HashSet(); + private final Set questWorlds = new HashSet<>(); public CardQuestWorldFilter(final ItemManager itemManager0) { super(itemManager0); @@ -72,7 +72,7 @@ public class CardQuestWorldFilter extends CardFormatFilter { @Override protected Iterable getList() { - final Set strings = new HashSet(); + final Set strings = new HashSet<>(); for (final QuestWorld w : this.questWorlds) { strings.add(w.getName()); } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java index 4f87e5fd468..03e5c7b9621 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSearchFilter.java @@ -53,7 +53,7 @@ public class CardSearchFilter extends TextSearchFilter { protected final void buildWidget(JPanel widget) { super.buildWidget(widget); - cbSearchMode = new FComboBoxWrapper(); + cbSearchMode = new FComboBoxWrapper<>(); cbSearchMode.addItem("in"); cbSearchMode.addItem("not in"); cbSearchMode.addTo(widget); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java index 62ae54615cb..03404c13a46 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardSetFilter.java @@ -14,7 +14,7 @@ import java.util.Set; * */ public class CardSetFilter extends CardFormatFilter { - private final Set sets = new HashSet(); + private final Set sets = new HashSet<>(); public CardSetFilter(ItemManager itemManager0, Collection sets0, boolean allowReprints0) { super(itemManager0); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java index ebc9ecef2ba..9f032ab3163 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardTypeFilter.java @@ -41,7 +41,7 @@ public class CardTypeFilter extends StatTypeFilter { @Override protected final Predicate buildPredicate() { - final List> types = new ArrayList>(); + final List> types = new ArrayList<>(); for (StatTypes s : buttonMap.keySet()) { if (s.predicate != null && buttonMap.get(s).isSelected()) { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java index 5fc0deb7b86..82936633767 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFolderFilter.java @@ -13,7 +13,7 @@ import java.util.Set; * */ public class DeckFolderFilter extends ListLabelFilter { - protected final Set folders = new HashSet(); + protected final Set folders = new HashSet<>(); public DeckFolderFilter(ItemManager itemManager0) { super(itemManager0); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java index f17dc05b42b..366f6058452 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java @@ -11,7 +11,7 @@ import forge.quest.QuestWorld; public class DeckQuestWorldFilter extends DeckFormatFilter { - private final Set questWorlds = new HashSet(); + private final Set questWorlds = new HashSet<>(); public DeckQuestWorldFilter(final ItemManager itemManager0) { super(itemManager0); @@ -72,7 +72,7 @@ public class DeckQuestWorldFilter extends DeckFormatFilter { @Override protected Iterable getList() { - final Set strings = new HashSet(); + final Set strings = new HashSet<>(); for (final QuestWorld w : this.questWorlds) { strings.add(w.getName()); } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java index 801516e79e1..b3c62397f23 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java @@ -11,7 +11,7 @@ import java.util.Set; public class DeckSetFilter extends DeckFormatFilter { - private final Set sets = new HashSet(); + private final Set sets = new HashSet<>(); public DeckSetFilter(ItemManager itemManager0, Collection sets0, boolean allowReprints0) { super(itemManager0); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java index 114437e9d3c..e6899c98b31 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java @@ -13,7 +13,7 @@ import java.util.Set; public abstract class FormatFilter extends ListLabelFilter { protected boolean allowReprints = true; - protected final Set formats = new HashSet(); + protected final Set formats = new HashSet<>(); public FormatFilter(ItemManager itemManager0) { super(itemManager0); @@ -25,8 +25,8 @@ public abstract class FormatFilter extends ListLabelFil @Override protected String getTooltip() { - Set sets = new HashSet(); - Set bannedCards = new HashSet(); + Set sets = new HashSet<>(); + Set bannedCards = new HashSet<>(); Set additionalCards = new HashSet<>(); for (GameFormat format : this.formats) { @@ -158,7 +158,7 @@ public abstract class FormatFilter extends ListLabelFil @Override protected Iterable getList() { - Set strings = new HashSet(); + Set strings = new HashSet<>(); for (GameFormat f : this.formats) { strings.add(f.getName()); } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java index 5490f787e5f..989db5eb853 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java @@ -45,10 +45,10 @@ public abstract class ListLabelFilter extends ItemFilte labelBuilder.append("s: All"); break; case 1: - labelBuilder.append(": " + getList().iterator().next()); + labelBuilder.append(": ").append(getList().iterator().next()); break; default: - labelBuilder.append("s: " + TextUtil.join(getList(), ", ")); + labelBuilder.append("s: ").append(TextUtil.join(getList(), ", ")); break; } label.setText(labelBuilder.toString()); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java index 15d0fbcee87..775cdaf496e 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java @@ -24,7 +24,7 @@ public abstract class StatTypeFilter extends ToggleButt public StatTypeFilter(ItemManager itemManager0) { super(itemManager0); - buttonMap = new HashMap(); + buttonMap = new HashMap<>(); } @SuppressWarnings("serial") @@ -32,7 +32,7 @@ public abstract class StatTypeFilter extends ToggleButt final Localizer localizer = Localizer.getInstance(); StringBuilder tooltip = new StringBuilder(); tooltip.append(st.label); - tooltip.append(" (" + localizer.getMessage("lblclicktotoogle") + " "); + tooltip.append(" (").append(localizer.getMessage("lblclicktotoogle")).append(" "); if (st.label.length() > 1 && !Character.isUpperCase(st.label.charAt(1))) { tooltip.append(st.label.substring(0, 1).toLowerCase()); tooltip.append(st.label.substring(1)); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java index dc9ad7af8f4..1bee48d047e 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TextSearchFilter.java @@ -27,7 +27,7 @@ public class TextSearchFilter extends ItemFilter { @Override public ItemFilter createCopy() { - TextSearchFilter copy = new TextSearchFilter(itemManager); + TextSearchFilter copy = new TextSearchFilter<>(itemManager); copy.getWidget(); //initialize widget copy.txtSearch.setText(this.txtSearch.getText()); return copy; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java index aa33152ff6c..735cb0e459b 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/ToggleButtonsFilter.java @@ -23,7 +23,7 @@ import forge.toolbox.LayoutHelper; @SuppressWarnings("serial") public abstract class ToggleButtonsFilter extends ItemFilter { protected boolean lockFiltering; - private final List buttons = new ArrayList(); + private final List buttons = new ArrayList<>(); protected ToggleButtonsFilter(ItemManager itemManager0) { super(itemManager0); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java index d7f0b14170d..e1fd9d7c54e 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/TokenSearchFilter.java @@ -51,7 +51,7 @@ public class TokenSearchFilter extends TextSearchFilter { protected final void buildWidget(JPanel widget) { super.buildWidget(widget); - cbSearchMode = new FComboBoxWrapper(); + cbSearchMode = new FComboBoxWrapper<>(); cbSearchMode.addItem("in"); cbSearchMode.addItem("not in"); cbSearchMode.addTo(widget); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index d7bfcd1bba6..b57a92b3261 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -71,7 +71,7 @@ public class ImageView extends ItemView { private static final int MAX_COLUMN_COUNT = 10; private final CardViewDisplay display; - private final List selectedIndices = new ArrayList(); + private final List selectedIndices = new ArrayList<>(); private int columnCount = 4; private boolean allowMultipleSelections; private ColumnDef pileBy = null; @@ -82,8 +82,8 @@ public class ImageView extends ItemView { private Point hoverScrollPos; private ItemInfo hoveredItem; private ItemInfo focalItem; - private final List orderedItems = new ArrayList(); - private final List groups = new ArrayList(); + private final List orderedItems = new ArrayList<>(); + private final List groups = new ArrayList<>(); final Localizer localizer = Localizer.getInstance(); private static boolean isPreferenceEnabled(final ForgePreferences.FPref preferenceName) { @@ -162,9 +162,9 @@ public class ImageView extends ItemView { } private final ExpandCollapseButton btnExpandCollapseAll = new ExpandCollapseButton(); - private final FComboBoxWrapper cbGroupByOptions = new FComboBoxWrapper(); - private final FComboBoxWrapper cbPileByOptions = new FComboBoxWrapper(); - private final FComboBoxWrapper cbColumnCount = new FComboBoxWrapper(); + private final FComboBoxWrapper cbGroupByOptions = new FComboBoxWrapper<>(); + private final FComboBoxWrapper cbPileByOptions = new FComboBoxWrapper<>(); + private final FComboBoxWrapper cbColumnCount = new FComboBoxWrapper<>(); public ImageView(final ItemManager itemManager0, final ItemManagerModel model0) { super(itemManager0, model0); @@ -588,7 +588,7 @@ public class ImageView extends ItemView { if (forRefresh && pileBy != null) { //refresh piles if needed //use TreeMap to build pile set so iterating below sorts on key ColumnDef groupPileBy = groupBy == null ? pileBy : groupBy.getGroupPileBy(i, pileBy); - Map, Pile> piles = new TreeMap, Pile>(); + Map, Pile> piles = new TreeMap<>(); for (ItemInfo itemInfo : group.items) { Comparable key = groupPileBy.fnSort.apply(itemInfo); if (!piles.containsKey(key)) { @@ -597,9 +597,7 @@ public class ImageView extends ItemView { piles.get(key).items.add(itemInfo); } group.piles.clear(); - for (Pile pile : piles.values()) { - group.piles.add(pile); - } + group.piles.addAll(piles.values()); } groupY = y; @@ -927,8 +925,8 @@ public class ImageView extends ItemView { } } private class Group extends DisplayArea { - private final List items = new ArrayList(); - private final List piles = new ArrayList(); + private final List items = new ArrayList<>(); + private final List piles = new ArrayList<>(); private final String name; private boolean isCollapsed; @@ -946,7 +944,7 @@ public class ImageView extends ItemView { } } private class Pile extends DisplayArea { - private final List items = new ArrayList(); + private final List items = new ArrayList<>(); } private class ItemInfo extends DisplayArea implements Entry { private final T item; diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java index c7dc42ba265..23dc2860af2 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemListView.java @@ -35,7 +35,6 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.LinkedList; @@ -156,7 +155,7 @@ public final class ItemListView extends ItemView { final DefaultTableColumnModel colmodel = new DefaultTableColumnModel(); //ensure columns ordered properly - final List columns = new LinkedList(); + final List columns = new LinkedList<>(); for (final ItemColumnConfig colConfig : config.getCols().values()) { if (colOverrides == null || !colOverrides.containsKey(colConfig.getDef())) { columns.add(new ItemTableColumn(new ItemColumn(colConfig))); @@ -165,8 +164,9 @@ public final class ItemListView extends ItemView { columns.add(colOverrides.get(colConfig.getDef())); } } - Collections.sort(columns, new Comparator() { - @Override public int compare(final ItemTableColumn arg0, final ItemTableColumn arg1) { + columns.sort(new Comparator() { + @Override + public int compare(final ItemTableColumn arg0, final ItemTableColumn arg1) { return Integer.compare(arg0.getIndex(), arg1.getIndex()); } }); @@ -287,7 +287,7 @@ public final class ItemListView extends ItemView { @Override public Iterable getSelectedIndices() { - final List indices = new ArrayList(); + final List indices = new ArrayList<>(); final int[] selectedRows = this.table.getSelectedRows(); for (int i = 0; i < selectedRows.length; i++) { indices.add(selectedRows[i]); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java index aaff5a98c15..914af73bdbd 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ItemView.java @@ -179,7 +179,7 @@ public abstract class ItemView { } public final Collection getSelectedItems() { - final List items = new ArrayList(); + final List items = new ArrayList<>(); for (final Integer i : getSelectedIndices()) { final T item = getItemAtIndex(i); if (item != null) { @@ -205,7 +205,7 @@ public abstract class ItemView { return setSelectedItems(items, true); } public final boolean setSelectedItems(final Iterable items, final boolean scrollIntoView) { - final List indices = new ArrayList(); + final List indices = new ArrayList<>(); for (final T item : items) { final int index = getIndexOfItem(item); if (index != -1) { @@ -249,7 +249,7 @@ public abstract class ItemView { final int count = getCount(); if (count == 0) { return; } - final List indexList = new ArrayList(); + final List indexList = new ArrayList<>(); for (final Integer index : indices) { if (index >= 0 && index < count) { indexList.add(index); diff --git a/forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java b/forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java index afa9e46045a..e788bb92d3d 100644 --- a/forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java +++ b/forge-gui-desktop/src/main/java/forge/menus/ForgeMenu.java @@ -24,7 +24,7 @@ public final class ForgeMenu { private JPopupMenu popupMenu; private IMenuProvider provider; - private static HashMap activeShortcuts = new HashMap(); + private static HashMap activeShortcuts = new HashMap<>(); public ForgeMenu() { refresh(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java index 7b0dbe9978b..5ee535771e8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java @@ -67,7 +67,7 @@ public class AddBasicLandsDialog { private static final int ADD_BTN_SIZE = 30; private static final int LAND_PANEL_PADDING = 3; - private final FComboBoxPanel cbLandSet = new FComboBoxPanel("Land Set:", FlowLayout.CENTER, Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands)); + private final FComboBoxPanel cbLandSet = new FComboBoxPanel<>("Land Set:", FlowLayout.CENTER, Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands)); private final MainPanel panel = new MainPanel(); private final LandPanel pnlPlains = new LandPanel("Plains"); @@ -313,7 +313,7 @@ public class AddBasicLandsDialog { cardName = cardName0; cardPanel = new LandCardPanel(); - cbLandArt = new FComboBox(); + cbLandArt = new FComboBox<>(); cbLandArt.setFont(cbLandSet.getFont()); cbLandArt.addActionListener(new ActionListener() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java index 3fd7cf4f62b..80f2ac05ea1 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java @@ -69,7 +69,7 @@ public enum CDeckEditorUI implements ICDoc { private final VTinyLeadersDecks vTinyLeadersDecks; CDeckEditorUI() { - screenChildControllers = new HashMap>(); + screenChildControllers = new HashMap<>(); this.cDetailPicture = new CDetailPicture(); this.vAllDecks = VAllDecks.SINGLETON_INSTANCE; this.vAllDecks.setCDetailPicture(cDetailPicture); @@ -163,7 +163,7 @@ public enum CDeckEditorUI implements ICDoc { private void moveSelectedItems(final ItemManager itemManager, final _MoveAction moveAction, final int maxQty) { if (maxQty == 0) { return; } - final ItemPool items = new ItemPool(itemManager.getGenericType()); + final ItemPool items = new ItemPool<>(itemManager.getGenericType()); for (final T item : itemManager.getSelectedItems()) { final int qty = Math.min(maxQty, itemManager.getItemCount(item)); if (qty > 0) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java index d82b0652b1c..4484002b868 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java @@ -85,8 +85,8 @@ public class DeckImport ex private final FCheckBox dateTimeCheck = new FCheckBox("Use only sets released before:", false); private final FCheckBox onlyCoreExpCheck = new FCheckBox("Use only core and expansion sets", true); - private final FComboBox monthDropdown = new FComboBox(); //don't need wrappers since skin can't change while this dialog is open - private final FComboBox yearDropdown = new FComboBox(); + private final FComboBox monthDropdown = new FComboBox<>(); //don't need wrappers since skin can't change while this dialog is open + private final FComboBox yearDropdown = new FComboBox<>(); private final DeckImportController controller; private final ACEditorBase host; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index 4fc4420725a..1e809ae2752 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -163,7 +163,7 @@ public abstract class ACEditorBase createPoolForItem(final TItem item, final int qty) { if (item == null || qty <= 0) { return null; } - final ItemPool pool = new ItemPool((Class)item.getClass()); + final ItemPool pool = new ItemPool<>((Class) item.getClass()); pool.add(item, qty); return pool; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java index 1271ca3925c..a6aff9b7132 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java @@ -63,7 +63,7 @@ public final class CEditorCommander extends CDeckEditor { private DragCell allDecksParent = null; private DragCell deckGenParent = null; - private List allSections = new ArrayList(); + private List allSections = new ArrayList<>(); private final ItemPool commanderPool; private final ItemPool normalPool; @@ -114,16 +114,16 @@ public final class CEditorCommander extends CDeckEditor { CardCollections decks = FModel.getDecks(); switch (gameType) { case TinyLeaders: - this.controller = new DeckController(decks.getTinyLeaders(), this, newCreator); + this.controller = new DeckController<>(decks.getTinyLeaders(), this, newCreator); break; case Brawl: - this.controller = new DeckController(decks.getBrawl(), this, newCreator); + this.controller = new DeckController<>(decks.getBrawl(), this, newCreator); break; case Oathbreaker: - this.controller = new DeckController(decks.getOathbreaker(), this, newCreator); + this.controller = new DeckController<>(decks.getOathbreaker(), this, newCreator); break; default: - this.controller = new DeckController(decks.getCommander(), this, newCreator); + this.controller = new DeckController<>(decks.getCommander(), this, newCreator); break; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java index 1acfb3064d5..eec8c20c98a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java @@ -58,7 +58,7 @@ import java.util.Map.Entry; */ public final class CEditorConstructed extends CDeckEditor { private DeckController controller; - private final List allSections = new ArrayList(); + private final List allSections = new ArrayList<>(); private ItemPool normalPool, avatarPool, planePool, schemePool, conspiracyPool, commanderPool; Predicate commanderFilter; @@ -149,19 +149,19 @@ public final class CEditorConstructed extends CDeckEditor { switch (this.gameType) { case Constructed: - this.controller = new DeckController(FModel.getDecks().getConstructed(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getConstructed(), this, newCreator); break; case Commander: - this.controller = new DeckController(FModel.getDecks().getCommander(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getCommander(), this, newCreator); break; case Oathbreaker: - this.controller = new DeckController(FModel.getDecks().getOathbreaker(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getOathbreaker(), this, newCreator); break; case Brawl: - this.controller = new DeckController(FModel.getDecks().getBrawl(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getBrawl(), this, newCreator); break; case TinyLeaders: - this.controller = new DeckController(FModel.getDecks().getTinyLeaders(), this, newCreator); + this.controller = new DeckController<>(FModel.getDecks().getTinyLeaders(), this, newCreator); break; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java index e2c6b928827..c35e194b880 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java @@ -62,7 +62,7 @@ public final class CEditorLimited extends CDeckEditor { private DragCell brawlDecksParent = null; private DragCell tinyLeadersDecksParent = null; private DragCell deckGenParent = null; - private final List allSections = new ArrayList(); + private final List allSections = new ArrayList<>(); //========== Constructor @@ -92,7 +92,7 @@ public final class CEditorLimited extends CDeckEditor { return new DeckGroup(""); } }; - this.controller = new DeckController(deckMap0, this, newCreator); + this.controller = new DeckController<>(deckMap0, this, newCreator); getBtnAddBasicLands().setCommand(new UiCommand() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index 4bafc436d96..9294853a1e9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -75,7 +75,7 @@ import java.util.Map.Entry; public final class CEditorQuest extends CDeckEditor { private final QuestController questData; private final DeckController controller; - private final List allSections = new ArrayList(); + private final List allSections = new ArrayList<>(); private DragCell allDecksParent = null; private DragCell deckGenParent = null; @@ -139,7 +139,7 @@ public final class CEditorQuest extends CDeckEditor { } }; - this.controller = new DeckController(questData0.getMyDecks(), this, newCreator); + this.controller = new DeckController<>(questData0.getMyDecks(), this, newCreator); getBtnAddBasicLands().setCommand(new UiCommand() { @Override @@ -158,7 +158,7 @@ public final class CEditorQuest extends CDeckEditor { // fills number of decks using each card private Map countDecksForEachCard() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); for (final Deck deck : this.questData.getMyDecks()) { for (final Entry e : deck.getMain()) { final PaperCard card = e.getKey(); @@ -221,7 +221,7 @@ public final class CEditorQuest extends CDeckEditor { if (n == 0) { s = "Remove custom rating"; } else { - s = "Rate this card as " + Integer.toString(n) + " stars"; + s = "Rate this card as " + n + " stars"; } GuiUtils.addMenuItem(cmb.getMenu(), s, KeyStroke.getKeyStroke(48 + n, 0), @@ -393,7 +393,7 @@ public final class CEditorQuest extends CDeckEditor { //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? if(sectionMode == null) sectionMode = DeckSection.Main; - final Map colOverridesCatalog = new HashMap(); + final Map colOverridesCatalog = new HashMap<>(); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in @@ -428,8 +428,8 @@ public final class CEditorQuest extends CDeckEditor { public void update() { this.decksUsingMyCards = this.countDecksForEachCard(); - final Map colOverridesCatalog = new HashMap(); - final Map colOverridesDeck = new HashMap(); + final Map colOverridesCatalog = new HashMap<>(); + final Map colOverridesDeck = new HashMap<>(); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_DECK_EDITOR, colOverridesDeck, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java index c9f8f5c0fb2..c730d6595c9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java @@ -83,10 +83,10 @@ public final class CEditorQuestCardShop extends ACEditorBase colOverridesCatalog = new HashMap(); - final Map colOverridesDeck = new HashMap(); + final Map colOverridesCatalog = new HashMap<>(); + final Map colOverridesDeck = new HashMap<>(); // Add spell shop-specific columns ItemTableColumn.addColOverride(ItemManagerConfig.SPELL_SHOP, colOverridesCatalog, ColumnDef.PRICE, QuestSpellShop.fnPriceCompare, QuestSpellShop.fnPriceGet); @@ -251,7 +251,7 @@ public final class CEditorQuestCardShop extends ACEditorBase ownedItems = new ItemPool(InventoryItem.class); + final ItemPool ownedItems = new ItemPool<>(InventoryItem.class); ownedItems.addAllOfType(this.questData.getCards().getCardpool().getView()); this.getCatalogManager().setPool(cardsForSale); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestLimited.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestLimited.java index 0d75829e2dd..3b34554ccf9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestLimited.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestLimited.java @@ -62,7 +62,7 @@ import java.util.Map.Entry; public final class CEditorQuestLimited extends CDeckEditor { private final QuestController questData; private final DeckController controller; - private final List allSections = new ArrayList(); + private final List allSections = new ArrayList<>(); private DragCell allDecksParent = null; private DragCell deckGenParent = null; @@ -118,7 +118,7 @@ public final class CEditorQuestLimited extends CDeckEditor { } }; - this.controller = new DeckController(questData0.getDraftDecks(), this, newCreator); + this.controller = new DeckController<>(questData0.getDraftDecks(), this, newCreator); controller.getView().getDeckManager().setup(ItemManagerConfig.DRAFT_POOL); controller.setModel(questData0.getDraftDecks().get(QuestEventDraft.DECK_NAME)); @@ -132,7 +132,7 @@ public final class CEditorQuestLimited extends CDeckEditor { // fills number of decks using each card private Map countDecksForEachCard() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); for (final Deck deck : this.questData.getMyDecks()) { for (final Entry e : deck.getMain()) { final PaperCard card = e.getKey(); @@ -234,8 +234,8 @@ public final class CEditorQuestLimited extends CDeckEditor { this.decksUsingMyCards = this.countDecksForEachCard(); - final Map colOverridesCatalog = new HashMap(); - final Map colOverridesDeck = new HashMap(); + final Map colOverridesCatalog = new HashMap<>(); + final Map colOverridesDeck = new HashMap<>(); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_DECK_EDITOR, colOverridesDeck, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorTokenViewer.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorTokenViewer.java index 152d0cf10e2..ed3d896318f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorTokenViewer.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorTokenViewer.java @@ -24,10 +24,10 @@ public class CEditorTokenViewer extends ACEditorBase { private List fullCatalogCards; // remember changed gui elements - private String CCTabLabel = new String(); - private String CCAddLabel = new String(); - private String CDTabLabel = new String(); - private String CDRemLabel = new String(); + private String CCTabLabel = ""; + private String CCAddLabel = ""; + private String CDTabLabel = ""; + private String CDRemLabel = ""; private String prevRem4Label = null; private String prevRem4Tooltip = null; private Runnable prevRem4Cmd = null; diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java index a032572d708..6f09ba6e073 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorVariant.java @@ -85,7 +85,7 @@ public final class CEditorVariant extends CDeckEditor { return new Deck(); } }; - this.controller = new DeckController(folder, this, newCreator); + this.controller = new DeckController<>(folder, this, newCreator); getBtnAddBasicLands().setCommand(new UiCommand() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java index 25cbfc46521..7a3fd676276 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CProbabilities.java @@ -61,17 +61,17 @@ public enum CProbabilities implements ICDoc { final ACEditorBase ed = (ACEditorBase) CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController(); - if (ed == null) { return new ArrayList(); } + if (ed == null) { return new ArrayList<>(); } final ItemPool deck = ItemPool.createFrom(ed.getDeckManager().getPool(), PaperCard.class); - final List cardProbabilities = new ArrayList(); + final List cardProbabilities = new ArrayList<>(); final List shuffled = deck.toFlatList(); Collections.shuffle(shuffled, MyRandom.getRandom()); // Log totals of each card for decrementing - final Map cardTotals = new HashMap(); + final Map cardTotals = new HashMap<>(); for (final PaperCard c : shuffled) { if (cardTotals.containsKey(c)) { cardTotals.put(c, cardTotals.get(c) + 1); } else { cardTotals.put(c, 1); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java index 30b034a5de8..d3d2a19ae3e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java @@ -136,7 +136,7 @@ public class DeckController { } private HashMap groupByName(CardPool section) { - HashMap result = new HashMap(); + HashMap result = new HashMap<>(); for (Map.Entry entry : section) { PaperCard importedCard = entry.getKey(); @@ -190,7 +190,7 @@ public class DeckController { } private HashMap getBasicLandsByName(CardPool sourceSection) { - HashMap result = new HashMap(); + HashMap result = new HashMap<>(); for (Map.Entry entry : sourceSection) { PaperCard card = entry.getKey(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java index 21117a5c25b..1f1c8a47df4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/menus/CDeckEditorUIMenus.java @@ -13,7 +13,7 @@ public class CDeckEditorUIMenus { private final boolean SHOW_ICONS = true; public List getMenus() { - List menus = new ArrayList(); + List menus = new ArrayList<>(); menus.add(DeckFileMenu.getMenu(SHOW_ICONS)); return menus; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java index fc09b9c4033..0058e27744f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java @@ -2,6 +2,7 @@ package forge.screens.home; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Arrays; import java.util.Vector; import javax.swing.SwingUtilities; @@ -27,10 +28,8 @@ public class CLobby { } private void addDecks(final Iterable commanderDecks, FList deckList, String... initialItems) { - Vector listData = new Vector(); - for (String item : initialItems) { - listData.add(item); - } + Vector listData = new Vector<>(); + listData.addAll(Arrays.asList(initialItems)); listData.add("Generate"); if (!Iterables.isEmpty(commanderDecks)) { listData.add("Random"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java index d983a97902d..c6afcf7e625 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java @@ -75,8 +75,8 @@ public class PlayerPanel extends FPanel { private FRadioButton radioOpen; private FCheckBox chkReady; - private final FComboBoxWrapper teamComboBox = new FComboBoxWrapper(); - private final FComboBoxWrapper aeTeamComboBox = new FComboBoxWrapper(); + private final FComboBoxWrapper teamComboBox = new FComboBoxWrapper<>(); + private final FComboBoxWrapper aeTeamComboBox = new FComboBoxWrapper<>(); private final FLabel closeBtn; private final FLabel deckBtn = new FLabel.ButtonBuilder().text(localizer.getMessage("lblSelectaDeck")).build(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java b/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java index 3fe77120d36..99a38f3f046 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VHomeUI.java @@ -85,9 +85,9 @@ public enum VHomeUI implements IVTopLevelUI { private final SkinColor clrTheme = FSkin.getColor(FSkin.Colors.CLR_THEME); private final SkinColor l00 = clrTheme.stepColor(0); - private final List> allSubmenus = new ArrayList>(); - private final Map allSubmenuLabels = new HashMap(); - private final Map allGroupLabels = new HashMap(); + private final List> allSubmenus = new ArrayList<>(); + private final Map allSubmenuLabels = new HashMap<>(); + private final Map allGroupLabels = new HashMap<>(); private final PnlMenu pnlMenu = new PnlMenu(); private final PnlDisplay pnlDisplay = new PnlDisplay(); @@ -144,7 +144,7 @@ public enum VHomeUI implements IVTopLevelUI { allSubmenus.add(VSubmenuReleaseNotes.SINGLETON_INSTANCE); // For each group: init its panel - final SortedMap allGroupPanels = new TreeMap(); + final SortedMap allGroupPanels = new TreeMap<>(); for (final EMenuGroup e : EMenuGroup.values()) { allGroupPanels.put(e, new PnlGroup()); allGroupPanels.get(e).setVisible(false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index 4fafd123966..7c0c978b0be 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -82,7 +82,7 @@ public class VLobby implements ILobbyView { // Player frame elements private final JPanel playersFrame = new JPanel(new MigLayout("insets 0, gap 0 5, wrap, hidemode 3")); private final FScrollPanel playersScroll = new FScrollPanel(new MigLayout("insets 0, gap 0, wrap, hidemode 3"), true); - private final List playerPanels = new ArrayList(MAX_PLAYERS); + private final List playerPanels = new ArrayList<>(MAX_PLAYERS); private final FLabel addPlayerBtn = new FLabel.ButtonBuilder().fontSize(14).text(localizer.getMessage("lblAddAPlayer")).build(); @@ -99,21 +99,21 @@ public class VLobby implements ILobbyView { private final List tinyLeadersDeckChoosers = Lists.newArrayListWithCapacity(MAX_PLAYERS); private final List brawlDeckChoosers = Lists.newArrayListWithCapacity(MAX_PLAYERS); - private final List> schemeDeckLists = new ArrayList>(); - private final List schemeDeckPanels = new ArrayList(MAX_PLAYERS); + private final List> schemeDeckLists = new ArrayList<>(); + private final List schemeDeckPanels = new ArrayList<>(MAX_PLAYERS); - private final List> planarDeckLists = new ArrayList>(); - private final List planarDeckPanels = new ArrayList(MAX_PLAYERS); + private final List> planarDeckLists = new ArrayList<>(); + private final List planarDeckPanels = new ArrayList<>(MAX_PLAYERS); - private final List> vgdAvatarLists = new ArrayList>(); - private final List vgdPanels = new ArrayList(MAX_PLAYERS); - private final List vgdAvatarDetails = new ArrayList(); - private final List vgdAllAvatars = new ArrayList(); - private final List vgdAllAiAvatars = new ArrayList(); - private final List nonRandomHumanAvatars = new ArrayList(); - private final List nonRandomAiAvatars = new ArrayList(); - private final Vector humanListData = new Vector(); - private final Vector aiListData = new Vector(); + private final List> vgdAvatarLists = new ArrayList<>(); + private final List vgdPanels = new ArrayList<>(MAX_PLAYERS); + private final List vgdAvatarDetails = new ArrayList<>(); + private final List vgdAllAvatars = new ArrayList<>(); + private final List vgdAllAiAvatars = new ArrayList<>(); + private final List nonRandomHumanAvatars = new ArrayList<>(); + private final List nonRandomAiAvatars = new ArrayList<>(); + private final Vector humanListData = new Vector<>(); + private final Vector aiListData = new Vector<>(); public boolean isForCommander() { return isForCommander; @@ -486,7 +486,7 @@ public class VLobby implements ILobbyView { deckPanel.add(new FLabel.Builder().text("Select " + formatName) .fontStyle(Font.BOLD).fontSize(14).fontAlign(SwingConstants.CENTER) .build(), "gaptop 10px, gapbottom 5px, growx, pushx"); - final FList deckList = new FList(); + final FList deckList = new FList<>(); deckList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); deckList.addListSelectionListener(selectionListener); @@ -902,7 +902,7 @@ public class VLobby implements ILobbyView { } List getPlayerNames() { - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final PlayerPanel pp : playerPanels) { names.add(pp.getPlayerName()); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java index 949aa703f99..3d25bcd2d51 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletBuild.java @@ -31,7 +31,7 @@ public enum CSubmenuGauntletBuild implements ICDoc { SINGLETON_INSTANCE; private final VSubmenuGauntletBuild view = VSubmenuGauntletBuild.SINGLETON_INSTANCE; - private final List workingDecks = new ArrayList(); + private final List workingDecks = new ArrayList<>(); private final File openStartDir = new File(ForgeConstants.GAUNTLET_DIR.userPrefLoc); private final FileFilter filterDAT = new FileFilter() { @@ -169,7 +169,7 @@ public enum CSubmenuGauntletBuild implements ICDoc { } private void dumpDecksIntoList() { - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final Deck d : workingDecks) { names.add(d.getName()); @@ -211,7 +211,7 @@ public enum CSubmenuGauntletBuild implements ICDoc { gd = new GauntletData(); } - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final Deck d : workingDecks) { names.add(d.getName()); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java index a0bba9a7f20..e220842ad8e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java @@ -66,7 +66,7 @@ public enum CSubmenuGauntletContests implements ICDoc { private void updateData() { final File[] files = GauntletIO.getGauntletFilesLocked(); - final List data = new ArrayList(); + final List data = new ArrayList<>(); if (files != null) { for (final File f : files) { final GauntletData gd = GauntletIO.loadGauntlet(f); @@ -105,7 +105,7 @@ public enum CSubmenuGauntletContests implements ICDoc { final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java index aaf79e76226..a5ce391de90 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java @@ -92,7 +92,7 @@ public enum CSubmenuGauntletLoad implements ICDoc { private void updateData() { final File[] files = GauntletIO.getGauntletFilesUnlocked(null); - final List data = new ArrayList(); + final List data = new ArrayList<>(); for (final File f : files) { final GauntletData gd = GauntletIO.loadGauntlet(f); @@ -138,7 +138,7 @@ public enum CSubmenuGauntletLoad implements ICDoc { } }); - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java index 01d5ff3856e..237d7124593 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java @@ -68,7 +68,7 @@ public enum CSubmenuGauntletQuick implements ICDoc { }); // Find appropriate filename for new save, create and set new save file. - final List allowedDeckTypes = new ArrayList(); + final List allowedDeckTypes = new ArrayList<>(); if (view.getBoxColorDecks().isSelected()) { allowedDeckTypes.add(DeckType.COLOR_DECK); } if (view.getBoxStandardColorDecks().isSelected()) { allowedDeckTypes.add(DeckType.STANDARD_COLOR_DECK); } if (view.getBoxStandardGenDecks().isSelected()) { allowedDeckTypes.add(DeckType.STANDARD_CARDGEN_DECK); } @@ -83,7 +83,7 @@ public enum CSubmenuGauntletQuick implements ICDoc { final GauntletData gd = GauntletUtil.createQuickGauntlet(view.getLstDecks().getPlayer().getDeck(), view.getSliOpponents().getValue(), allowedDeckTypes, null); - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(gd.getDecks().get(gd.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java index f465232242b..2dc906c0e61 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/ContestGauntletLister.java @@ -4,7 +4,6 @@ import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -44,10 +43,10 @@ public class ContestGauntletLister extends JPanel { public void setGauntlets(final List gd0) { this.removeAll(); - final List tempRows = new ArrayList(); - final List sorted = new ArrayList(); - for (final GauntletData gd : gd0) { sorted.add(gd); } - Collections.sort(sorted, new Comparator() { + final List tempRows = new ArrayList<>(); + final List sorted = new ArrayList<>(); + sorted.addAll(gd0); + sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { return x.getName().compareTo(y.getName()); @@ -79,8 +78,8 @@ public class ContestGauntletLister extends JPanel { name = gd.getName(); name = name.substring(GauntletIO.PREFIX_LOCKED.length()); - progress = String.valueOf(Math.round( - ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100)) + " %"; + progress = Math.round( + ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100) + " %"; if (gd.getUserDeck() == null) { progress = "---"; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java index 1938459912c..99e47412fb5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/QuickGauntletLister.java @@ -4,7 +4,6 @@ import java.awt.Color; import java.awt.event.MouseEvent; import java.io.File; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -63,10 +62,10 @@ public class QuickGauntletLister extends JPanel { public void refresh() { this.removeAll(); - final List tempRows = new ArrayList(); - final List sorted = new ArrayList(); - for (final GauntletData gd : gauntlets) { sorted.add(gd); } - Collections.sort(sorted, new Comparator() { + final List tempRows = new ArrayList<>(); + final List sorted = new ArrayList<>(); + sorted.addAll(gauntlets); + sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); @@ -110,8 +109,8 @@ public class QuickGauntletLister extends JPanel { row.add(new FLabel.Builder().text(String.valueOf(gd.getDecks().size())) .fontAlign(SwingConstants.RIGHT).build(), "w 90px!, h 20px!, gap 0 0 5px 0"); - row.add(new FLabel.Builder().text(String.valueOf(Math.round( - ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100)) + "%") + row.add(new FLabel.Builder().text(Math.round( + ((double) gd.getCompleted() / (double) gd.getDecks().size()) * 100) + "%") .fontAlign(SwingConstants.RIGHT).build(), "w 90px!, h 20px!, gap 0 0 5px 0"); this.add(row, "w 98%!, h 30px!, gap 1% 0 0 0"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java index 8580dc6b133..69adbb2ae16 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletBuild.java @@ -44,7 +44,7 @@ public enum VSubmenuGauntletBuild implements IVSubmenu { private final JPanel pnlDirections = new JPanel(); private final FDeckChooser lstLeft = new FDeckChooser(null, false, GameType.Constructed, false); - private final JList lstRight = new FList(); + private final JList lstRight = new FList<>(); private final FScrollPane scrRight = new FScrollPane(lstRight, true, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java index 1a843a739f7..8aa5bf49971 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java @@ -139,7 +139,7 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { */ @Override public List getMenus() { - final List menus = new ArrayList(); + final List menus = new ArrayList<>(); menus.add(ConstructedGameMenu.getMenu()); return menus; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleCreate.java b/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleCreate.java index a63a0fd52f1..4544a5e040f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleCreate.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleCreate.java @@ -48,7 +48,7 @@ public enum CSubmenuPuzzleCreate implements ICDoc, IMenuProvider { @Override public List getMenus() { - final List menus = new ArrayList(); + final List menus = new ArrayList<>(); menus.add(PuzzleGameMenu.getMenu()); return menus; } @@ -104,7 +104,7 @@ public enum CSubmenuPuzzleCreate implements ICDoc, IMenuProvider { } }); - final List players = new ArrayList(); + final List players = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(new Deck()).setPlayer(GamePlayerUtil.getGuiPlayer()); human.setStartingHand(0); players.add(human); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleSolve.java b/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleSolve.java index e9490dffad6..29d2ea6db9c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleSolve.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/puzzle/CSubmenuPuzzleSolve.java @@ -67,7 +67,7 @@ public enum CSubmenuPuzzleSolve implements ICDoc, IMenuProvider { @Override public List getMenus() { - final List menus = new ArrayList(); + final List menus = new ArrayList<>(); menus.add(PuzzleGameMenu.getMenu()); return menus; } @@ -96,7 +96,7 @@ public enum CSubmenuPuzzleSolve implements ICDoc, IMenuProvider { } }); - final List players = new ArrayList(); + final List players = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(new Deck()).setPlayer(GamePlayerUtil.getGuiPlayer()); human.setStartingHand(0); players.add(human); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java index 5b0a3ad6750..f674b5b8ee2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java @@ -153,7 +153,7 @@ public enum CSubmenuChallenges implements ICDoc { view.getPnlChallenges().removeAll(); qCtrl.regenerateChallenges(); - final List challenges = new ArrayList(); + final List challenges = new ArrayList<>(); for(final Object id : qCtrl.getAchievements().getCurrentChallenges()) { challenges.add(qCtrl.getChallenges().get(id.toString())); } @@ -161,7 +161,7 @@ public enum CSubmenuChallenges implements ICDoc { final JXButtonPanel grpPanel = new JXButtonPanel(); StringBuilder sb = new StringBuilder(); - sb.append(localizer.getMessage("lblMatchBestof") + " ").append(FModel.getQuest().getMatchLength()); + sb.append(localizer.getMessage("lblMatchBestof")).append(" ").append(FModel.getQuest().getMatchLength()); view.getCbxMatchLength().setSelectedItem(sb.toString()); boolean haveAnyChallenges = true; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java index 448f521e7e7..1ddc1ebaaf6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuDuels.java @@ -197,7 +197,7 @@ public enum CSubmenuDuels implements ICDoc { view.getPnlDuels().add(grpPanel, "w 100%!"); StringBuilder sb = new StringBuilder(); - sb.append(localizer.getMessage("lblMatchBestof") + " ").append(FModel.getQuest().getMatchLength()); + sb.append(localizer.getMessage("lblMatchBestof")).append(" ").append(FModel.getQuest().getMatchLength()); view.getCbxMatchLength().setSelectedItem(sb.toString()); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 6294c372932..01c5098a069 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -101,7 +101,7 @@ public enum CSubmenuQuestData implements ICDoc { @Override public void run() { customFormatCodes.clear(); - Set sets = new HashSet(); + Set sets = new HashSet<>(); for(GameFormat format:dialog.getSelectedFormats()){ sets.addAll(format.getAllowedSetCodes()); } @@ -133,7 +133,7 @@ public enum CSubmenuQuestData implements ICDoc { @Override public void run() { customPrizeFormatCodes.clear(); - Set sets = new HashSet(); + Set sets = new HashSet<>(); for(GameFormat format:dialog.getSelectedFormats()){ sets.addAll(format.getAllowedSetCodes()); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java index e6224e3b574..7a650ed9ee4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java @@ -64,10 +64,10 @@ public class QuestFileLister extends JPanel { /** @param qd0   {@link forge.quest.data.QuestData}[] */ public void setQuests(List qd0) { this.removeAll(); - List tempRows = new ArrayList(); - List sorted = new ArrayList(); - for (QuestData qd : qd0) { sorted.add(qd); } - Collections.sort(sorted, new Comparator() { + List tempRows = new ArrayList<>(); + List sorted = new ArrayList<>(); + sorted.addAll(qd0); + sorted.sort(new Comparator() { @Override public int compare(final QuestData x, final QuestData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java index a2ab6a55278..4c8ad44cf77 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java @@ -34,10 +34,10 @@ public enum VSubmenuChallenges implements IVSubmenu, IVQuest ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); private final StartButton btnStart = new StartButton(); - private final FComboBoxWrapper cbxPet = new FComboBoxWrapper(); + private final FComboBoxWrapper cbxPet = new FComboBoxWrapper<>(); private final FCheckBox cbPlant = new FCheckBox(localizer.getMessage("cbSummonPlant")); - private final FComboBoxWrapper cbxMatchLength = new FComboBoxWrapper(); + private final FComboBoxWrapper cbxMatchLength = new FComboBoxWrapper<>(); private final FLabel lblZep = new FLabel.Builder().text(localizer.getMessage("htmlLaunchZeppelin")) .hoverable(true).icon(FSkin.getIcon(FSkinProp.ICO_QUEST_ZEP)) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 3813522c759..65454ac06ce 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -49,7 +49,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FLabel lblTitleNew = new FLabel.Builder().text(localizer.getMessage("lblStartanewQuest")).opaque(true).fontSize(16).build(); - String str=new String( ForgeConstants.QUEST_SAVE_DIR.replace('\\', '/')); + String str= ForgeConstants.QUEST_SAVE_DIR.replace('\\', '/'); private final FLabel lblOldQuests = new FLabel.Builder().text(localizer.getMessage("lblOldQuestData").replace("%s",str)).fontAlign(SwingConstants.CENTER).fontSize(12).build(); private final QuestFileLister lstQuests = new QuestFileLister(); private final FScrollPane scrQuests = new FScrollPane(lstQuests, false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java index 002165d9255..31b8aa1a43b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewItem.java @@ -89,7 +89,7 @@ public class ViewItem extends FPanel { ViewItem.this.lblIcon.setIcon(i); ViewItem.this.lblName.setText(bazaarItem.getPurchaseName()); - ViewItem.this.lblPrice.setText("Cost: " + String.valueOf(bazaarItem.getBuyingPrice(qA)) + " credits"); + ViewItem.this.lblPrice.setText("Cost: " + bazaarItem.getBuyingPrice(qA) + " credits"); String desc = bazaarItem.getPurchaseDescription(qA); ViewItem.this.tarDesc.setText(FSkin.encodeSymbols(desc, false)); //encode in case there are mana symbols in description diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java index 0eb32eff473..f6ff91680be 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/ViewStall.java @@ -73,7 +73,7 @@ public class ViewStall extends JPanel { this.pnlInventory = new JPanel(); this.scrInventory = new FScrollPane(this.pnlInventory, false); this.parentView = v0; - this.lstItemPanels = new ArrayList(); + this.lstItemPanels = new ArrayList<>(); // Component styling this.setOpaque(false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java index 711dba75f69..99175befc18 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/AvatarSelector.java @@ -20,7 +20,7 @@ import forge.view.FDialog; @SuppressWarnings("serial") public class AvatarSelector extends FDialog { - private final List selectables = new ArrayList(); + private final List selectables = new ArrayList<>(); private final Map avatarMap = FSkin.getAvatars(); public AvatarSelector(final String playerName, final int currentIndex, final Collection usedIndices) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java index b813ec6c381..668526600a9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java @@ -49,7 +49,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { */ @Override public List getMenus() { - final List menus = new ArrayList(); + final List menus = new ArrayList<>(); menus.add(ConstructedGameMenu.getMenu()); return menus; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java index af71fda0b46..6b87e60fe4c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java @@ -160,7 +160,7 @@ public enum CSubmenuDraft implements ICDoc { throw new IllegalStateException("Draft: Computer deck is null!"); } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java index 52a56884ff9..22535e37f10 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java @@ -161,7 +161,7 @@ public enum CSubmenuSealed implements ICDoc { throw new IllegalStateException("Sealed: Computer deck is null!"); } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java index f247de68c7a..85cfe525d19 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java @@ -134,7 +134,7 @@ public enum CSubmenuWinston implements ICDoc { throw new IllegalStateException("Draft: Computer deck is null!"); } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java index 4111f83ba8b..da69fcadd8b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuDraft.java @@ -46,7 +46,7 @@ public enum VSubmenuDraft implements IVSubmenu { private final JRadioButton radSingle = new FRadioButton(localizer.getMessage("lblPlayAnOpponent")); private final JRadioButton radAll = new FRadioButton(localizer.getMessage("lblPlayAll7opponents")); - private final JComboBox cbOpponent = new JComboBox(); + private final JComboBox cbOpponent = new JComboBox<>(); private final JLabel lblInfo = new FLabel.Builder() .fontAlign(SwingConstants.LEFT).fontSize(16).fontStyle(Font.BOLD) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java index 1aa9040fee7..dee2a078700 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuSealed.java @@ -55,7 +55,7 @@ public enum VSubmenuSealed implements IVSubmenu { private final JRadioButton radSingle = new FRadioButton(localizer.getMessage("lblPlayAnOpponent")); private final JRadioButton radAll = new FRadioButton(localizer.getMessage("lblPlayAll7opponents")); - private final JComboBox cbOpponent = new JComboBox(); + private final JComboBox cbOpponent = new JComboBox<>(); private final FLabel lblInfo = new FLabel.Builder() .fontAlign(SwingConstants.LEFT).fontSize(16).fontStyle(Font.BOLD) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuWinston.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuWinston.java index 790c98f2b62..147cfc32205 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuWinston.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuWinston.java @@ -47,7 +47,7 @@ public enum VSubmenuWinston implements IVSubmenu { private final StartButton btnStart = new StartButton(); private final DeckManager lstDecks = new DeckManager(GameType.Winston, CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture()); - private final JList lstAI = new FList(); + private final JList lstAI = new FList<>(); private final JLabel lblInfo = new FLabel.Builder() .fontAlign(SwingConstants.LEFT).fontSize(16).fontStyle(Font.BOLD) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java index b8f40edaa71..0e075972619 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java @@ -63,7 +63,7 @@ public enum VSubmenuAchievements implements IVSubmenu { private final FLabel lblTitle = new FLabel.Builder() .text(localizer.getMessage("lblAchievements")).fontAlign(SwingConstants.CENTER) .opaque(true).fontSize(16).build(); - private final FComboBox cbCollections = new FComboBox(); + private final FComboBox cbCollections = new FComboBox<>(); private final TrophyCase trophyCase = new TrophyCase(); private final FScrollPane scroller = new FScrollPane(trophyCase, false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java index 44c3e2230b9..bd4bde30705 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java @@ -234,14 +234,14 @@ public enum VSubmenuDownloaders implements IVSubmenu { cniSB.append("-------------------\n\n"); for (CardEdition e : editions) { - nifSB.append("Edition: " + e.getName() + " " + "(" + e.getCode() + "/" + e.getCode2() + ")\n"); - cniSB.append("Edition: " + e.getName() + " " + "(" + e.getCode() + "/" + e.getCode2() + ")\n"); + nifSB.append("Edition: ").append(e.getName()).append(" ").append("(").append(e.getCode()).append("/").append(e.getCode2()).append(")\n"); + cniSB.append("Edition: ").append(e.getName()).append(" ").append("(").append(e.getCode()).append("/").append(e.getCode2()).append(")\n"); String imagePath; int artIndex = 1; - ArrayList cis = new ArrayList(); + ArrayList cis = new ArrayList<>(); - HashMap cardCount = new HashMap(); + HashMap cardCount = new HashMap<>(); for (CardInSet c : e.getCards()) { if (cardCount.containsKey(c.name)) { cardCount.put(c.name, cardCount.get(c.name) + 1); @@ -261,7 +261,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { } if (cp == null) { - cniSB.append(" " + c + "\n"); + cniSB.append(" ").append(c).append("\n"); notImplementedCount++; continue; } @@ -274,7 +274,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { if (imagePath != null) { File file = ImageKeys.getImageFile(imagePath); if (file == null) { - nifSB.append(" " + imagePath + "\n"); + nifSB.append(" ").append(imagePath).append("\n"); missingCount++; } } @@ -287,7 +287,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { if (imagePath != null) { File file = ImageKeys.getImageFile(imagePath); if (file == null) { - nifSB.append(" " + imagePath + "\n"); + nifSB.append(" ").append(imagePath).append("\n"); missingCount++; } } @@ -310,7 +310,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { String imgKey = token.getImageKey(i); File file = ImageKeys.getImageFile(imgKey); if (file == null) { - nifSB.append(" " + token.getImageFilename(i+1) + "\n"); + nifSB.append(" ").append(token.getImageFilename(i + 1)).append("\n"); missingCount++; } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 1d6b5532257..f6af4afd542 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -101,7 +101,6 @@ import forge.util.gui.SOptionPane; import forge.view.FView; import forge.view.arcane.CardPanel; import forge.view.arcane.FloatingZone; -import forge.match.input.*; /** * Constructs instance of match UI controller, used as a single point of @@ -122,7 +121,7 @@ public final class CMatchUI private final TargetingOverlay targetingOverlay = new TargetingOverlay(this); private FCollectionView sortedPlayers; - private final Map avatarImages = new HashMap(); + private final Map avatarImages = new HashMap<>(); private boolean allHands; private boolean showOverlay = true; private JPopupMenu openAbilityMenu; @@ -141,7 +140,7 @@ public final class CMatchUI public CMatchUI() { this.view = new VMatchUI(this); this.screen = FScreen.getMatchScreen(this, view); - this.myDocs = new EnumMap>(EDocID.class); + this.myDocs = new EnumMap<>(EDocID.class); this.myDocs.put(EDocID.CARD_PICTURE, cDetailPicture.getCPicture().getView()); this.myDocs.put(EDocID.CARD_DETAIL, cDetailPicture.getCDetail().getView()); // only create an ante doc if playing for ante @@ -258,7 +257,7 @@ public final class CMatchUI final String[] indices = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(","); - final List fields = new ArrayList(); + final List fields = new ArrayList<>(); Singletons.getView().getLpnDocument().add(targetingOverlay.getPanel(), FView.TARGETING_LAYER); targetingOverlay.getPanel().setSize(Singletons.getControl().getDisplaySize()); @@ -286,7 +285,7 @@ public final class CMatchUI } private void initHandViews() { - final List hands = new ArrayList(); + final List hands = new ArrayList<>(); final Iterable localPlayers = getLocalPlayers(); int i = 0; @@ -614,7 +613,7 @@ public final class CMatchUI } } private List getVisibleCardPanels() { - final List panels = new ArrayList(); + final List panels = new ArrayList<>(); for (final VHand h : view.getHands()) { panels.addAll(h.getHandArea().getCardPanels()); } @@ -951,7 +950,7 @@ public final class CMatchUI return ImmutableMap.of(firstBlocker, damage); } - final AtomicReference> result = new AtomicReference>(); + final AtomicReference> result = new AtomicReference<>(); FThreads.invokeInEdtAndWait(new Runnable() { @Override public void run() { @@ -969,7 +968,7 @@ public final class CMatchUI // Sort players FCollectionView players = gameView.getPlayers(); if (players.size() == 2 && myPlayers != null && myPlayers.size() == 1 && myPlayers.get(0).equals(players.get(1))) { - players = new FCollection(new PlayerView[] { players.get(1), players.get(0) }); + players = new FCollection<>(new PlayerView[]{players.get(1), players.get(0)}); } initMatch(players, myPlayers); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java b/forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java index 3d26d9e13a8..5400775c273 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/GameLogPanel.java @@ -80,7 +80,7 @@ public class GameLogPanel extends JPanel { scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.getViewport().add(scrollablePanel); - layer = new JLayer(scrollPane, layerUI); + layer = new JLayer<>(scrollPane, layerUI); this.add(layer, "w 10:100%, h 100%"); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java index fb786da85bc..6f09994f068 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java @@ -63,7 +63,7 @@ public class QuestWinLoseCardViewer extends FPanel { */ public QuestWinLoseCardViewer(final List list) { this.list = Collections.unmodifiableList(list); - this.jList = new FList(new ChooserListModel()); + this.jList = new FList<>(new ChooserListModel()); this.detail = new CardDetailPanel(); this.picture = new CardPicturePanel(); this.scroller = new FScrollPane(this.jList, false); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index be3f8c4545b..922f4b6f5f2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -63,12 +63,12 @@ import forge.view.arcane.util.CardPanelMouseListener; public class TargetingOverlay { private final CMatchUI matchUI; private final OverlayPanel pnl = new OverlayPanel(); - private final List cardPanels = new ArrayList(); - private final List arcsFoeAtk = new ArrayList(); - private final List arcsFoeDef = new ArrayList(); - private final List arcsFriend = new ArrayList(); + private final List cardPanels = new ArrayList<>(); + private final List arcsFoeAtk = new ArrayList<>(); + private final List arcsFoeDef = new ArrayList<>(); + private final List arcsFriend = new ArrayList<>(); private final ArcAssembler assembler = new ArcAssembler(); - private final Set stackItemIDs = new HashSet(); + private final Set stackItemIDs = new HashSet<>(); private static class Arc { private final int x1, y1, x2, y2; @@ -88,7 +88,7 @@ public class TargetingOverlay { } } - private final Set cardsVisualized = new HashSet(); + private final Set cardsVisualized = new HashSet<>(); private CardPanel activePanel = null; //private long lastUpdated = System.currentTimeMillis(); // TODO: determine if timer is needed (see below) @@ -158,7 +158,7 @@ public class TargetingOverlay { //final Point docOffsets = FView.SINGLETON_INSTANCE.getLpnDocument().getLocationOnScreen(); // Locations of arc endpoint, per card, with ID as primary key. - final Map endpoints = new HashMap(); + final Map endpoints = new HashMap<>(); Point cardLocOnScreen; Point locOnScreen = this.getPanel().getLocationOnScreen(); @@ -306,7 +306,7 @@ public class TargetingOverlay { } private Map getCardEndpoints() { - final Map endpoints = new HashMap(); + final Map endpoints = new HashMap<>(); Point cardLocOnScreen; Point locOnScreen = this.getPanel().getLocationOnScreen(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java index 9e9fcb0df1d..e0115d20a61 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java @@ -174,7 +174,7 @@ public class VAssignDamage { final JPanel pnlDefenders = new JPanel(); pnlDefenders.setOpaque(false); int cols = attackerHasTrample ? blockers.size() + 1 : blockers.size(); - final String wrap = "wrap " + Integer.toString(cols); + final String wrap = "wrap " + cols; pnlDefenders.setLayout(new MigLayout("insets 0, gap 0, ax center, " + wrap)); final FScrollPane scrDefenders = new FScrollPane(pnlDefenders, false); @@ -403,7 +403,7 @@ public class VAssignDamage { StringBuilder sb = new StringBuilder(); sb.append(dmg); if( overkill >= 0 ) { - sb.append(" (" +localizer.getMessage("lblLethal")); + sb.append(" (").append(localizer.getMessage("lblLethal")); if( overkill > 0 ) sb.append(" +").append(overkill); sb.append(")"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java index 0a443bf09d0..ff70964091f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java @@ -34,11 +34,11 @@ public class VAutoYields extends FDialog { super(); setTitle("Auto-Yields"); - autoYields = new ArrayList(); + autoYields = new ArrayList<>(); for (final String autoYield : matchUI.getAutoYields()) { autoYields.add(autoYield); } - lstAutoYields = new FList(new AutoYieldsListModel()); + lstAutoYields = new FList<>(new AutoYieldsListModel()); int x = PADDING; int y = PADDING; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java index 5dd1062b2ce..9ff1370c329 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java @@ -29,8 +29,8 @@ import forge.view.FView; *

(V at beginning of class name denotes a view class.) */ public class VMatchUI implements IVTopLevelUI { - private List lstFields = new ArrayList(); - private List lstHands = new ArrayList(); + private List lstFields = new ArrayList<>(); + private List lstHands = new ArrayList<>(); // Other instantiations private final CMatchUI control; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java index e7aee4c1136..a8285aa86e3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java @@ -117,8 +117,8 @@ public class CHand implements ICDoc { ordering.addAll(cards); } - final List placeholders = new ArrayList(); - final List cardPanels = new ArrayList(); + final List placeholders = new ArrayList<>(); + final List cardPanels = new ArrayList<>(); for (final CardView card : ordering) { CardPanel cardPanel = p.getCardPanel(card.getId()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java index a744679411a..8fdcce87de6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java @@ -52,7 +52,7 @@ public class VAntes implements IVDoc { private final JPanel pnl = new JPanel(); private final FScrollPane scroller = new FScrollPane(pnl, false); - private final SortedSet allAntes = new TreeSet(); + private final SortedSet allAntes = new TreeSet<>(); //========== Constructor public VAntes(final CAntes controller) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java index ae85d6daf6e..a29442777f7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java @@ -181,7 +181,7 @@ public class VLog implements IVDoc { logEntries.removeAll(this.displayedLogEntries); return logEntries; } - return new ArrayList(); + return new ArrayList<>(); } private void addNewLogEntriesToJPanel(final List newLogEntries) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java b/forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java index aa2a6ab9286..689a031cf28 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java +++ b/forge-gui-desktop/src/main/java/forge/screens/workshop/menus/CWorkshopUIMenus.java @@ -13,7 +13,7 @@ public class CWorkshopUIMenus { private final boolean SHOW_ICONS = true; public List getMenus() { - List menus = new ArrayList(); + List menus = new ArrayList<>(); menus.add(WorkshopFileMenu.getMenu(SHOW_ICONS)); return menus; } diff --git a/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java b/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java index a62ca687e8a..6aed9f95289 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AltSoundSystem.java @@ -11,7 +11,7 @@ import java.util.Map; * @author agetian */ class AsyncSoundRegistry { - static Map soundsPlayed = new HashMap(); + static Map soundsPlayed = new HashMap<>(); public synchronized static void registerSound(String soundName) { if (soundsPlayed.containsKey(soundName)) { diff --git a/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java b/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java index 831dc2806c6..105dadd8882 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java @@ -24,6 +24,8 @@ import forge.properties.ForgeConstants; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.MissingResourceException; import java.util.function.Supplier; @@ -35,9 +37,10 @@ import java.util.function.Supplier; * @author Agetian */ public class AudioClip implements IAudioClip { - private Clip clip; - private boolean started; - private boolean looping; + private final int maxSize = 16; + private String filename; + private List clips; + private boolean failed; public static boolean fileExists(String fileName) { File fSound = new File(ForgeConstants.SOUND_DIR, fileName); @@ -45,100 +48,62 @@ public class AudioClip implements IAudioClip { } public AudioClip(final String filename) { - File fSound = new File(ForgeConstants.SOUND_DIR, filename); - if (!fSound.exists()) { - throw new IllegalArgumentException("Sound file " + fSound.toString() + " does not exist, cannot make a clip of it"); - } - - try { - AudioInputStream stream = AudioSystem.getAudioInputStream(fSound); - AudioFormat format = stream.getFormat(); - DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), ((int) stream.getFrameLength() * format.getFrameSize())); - clip = (Clip) AudioSystem.getLine(info); - clip.addLineListener(this::lineStatusChanged); - clip.open(stream); - return; - - } catch (IOException ex) { - System.err.println("Unable to load sound file: " + filename); - } catch (LineUnavailableException ex) { - System.err.println("Error initializing sound system: " + ex); - } catch (UnsupportedAudioFileException ex) { - System.err.println("Unsupported file type of the sound file: " + fSound.toString() + " - " + ex.getMessage()); - clip = null; - return; - } - throw new MissingResourceException("Sound clip failed to load", this.getClass().getName(), filename); + this.filename = filename; + clips = new ArrayList<>(maxSize); + addClip(); } @Override public final void play() { - if (null == clip) { - return; - } - synchronized (this) { - if (clip.isRunning()) { - // introduce small delay to make a batch sounds more granular, - // e.g. when you auto-tap 4 lands the 4 tap sounds should - // not become completely merged - waitSoundSystemDelay(); - } - clip.setMicrosecondPosition(0); - if (!this.looping && clip.isRunning()) { - return; - } - this.started = false; - clip.start(); - wait(() -> this.started); + if (clips.stream().anyMatch(ClipWrapper::isRunning)) { + // introduce small delay to make a batch sounds more granular, + // e.g. when you auto-tap 4 lands the 4 tap sounds should + // not become completely merged + waitSoundSystemDelay(); } + getIdleClip().start(); } @Override public final void loop() { - if (null == clip) { - return; - } - synchronized (this) { - clip.setMicrosecondPosition(0); - if (this.looping && clip.isRunning()) { - return; - } - this.started = false; - clip.loop(Clip.LOOP_CONTINUOUSLY); - wait(() -> this.started); - this.looping = true; - } + getIdleClip().loop(); } @Override public final void stop() { - if (null == clip) { - return; - } - synchronized (this) { + for (ClipWrapper clip: clips) { clip.stop(); - this.looping = false; } } @Override public final boolean isDone() { - if (null == clip) { - return false; - } - return !clip.isRunning(); + return clips.stream().noneMatch(ClipWrapper::isRunning); } - private void wait(Supplier completed) { - final int attempts = 5; - for (int i = 0; i < attempts; i++) { - if (completed.get() || !waitSoundSystemDelay()) { - break; + private ClipWrapper getIdleClip() { + return clips.stream() + .filter(clip -> !clip.isRunning()) + .findFirst() + .orElseGet(this::addClip); + } + + private ClipWrapper addClip() { + if (clips.size() < maxSize && !failed) { + ClipWrapper clip = new ClipWrapper(filename); + if (clip.isFailed()) { + failed = true; + } else { + clips.add(clip); } + return clip; } + return ClipWrapper.Dummy; } - private boolean waitSoundSystemDelay() { + + + private static boolean waitSoundSystemDelay() { try { Thread.sleep(SoundSystem.DELAY); return true; @@ -148,8 +113,101 @@ public class AudioClip implements IAudioClip { } } - private void lineStatusChanged(LineEvent line) { - LineEvent.Type status = line.getType(); - this.started |= status == LineEvent.Type.START; + static class ClipWrapper { + private final Clip clip; + private boolean started; + static final ClipWrapper Dummy = new ClipWrapper(); + + private ClipWrapper() { + clip = null; + } + + ClipWrapper(String filename) { + clip = createClip(filename); + if (clip != null) { + clip.addLineListener(this::clipStateChanged); + } + } + + boolean isFailed() { + return null == clip; + } + + void start() { + if (null == clip) { + return; + } + synchronized (this) { + clip.setMicrosecondPosition(0); + this.started = false; + clip.start(); + // with JRE 1.8.0_211 if another thread called clip.setMicrosecondPosition + // just now, it would deadlock. To prevent this we synchronize this method + // and wait + wait(() -> this.started); + } + } + + void loop() { + if (null == clip) { + return; + } + synchronized (this) { + clip.setMicrosecondPosition(0); + this.started = false; + clip.loop(Clip.LOOP_CONTINUOUSLY); + wait(() -> this.started); + } + } + + void stop() { + if (null == clip) { + return; + } + synchronized (this) { + clip.stop(); + } + } + + boolean isRunning() { + return clip != null && (clip.isRunning() || clip.isActive()); + } + + private Clip createClip(String filename) { + File fSound = new File(ForgeConstants.SOUND_DIR, filename); + if (!fSound.exists()) { + throw new IllegalArgumentException("Sound file " + fSound.toString() + " does not exist, cannot make a clip of it"); + } + + try { + AudioInputStream stream = AudioSystem.getAudioInputStream(fSound); + AudioFormat format = stream.getFormat(); + DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), ((int) stream.getFrameLength() * format.getFrameSize())); + Clip clip = (Clip) AudioSystem.getLine(info); + clip.open(stream); + return clip; + } catch (IOException ex) { + System.err.println("Unable to load sound file: " + filename); + } catch (LineUnavailableException ex) { + System.err.println("Error initializing sound system: " + ex); + } catch (UnsupportedAudioFileException ex) { + System.err.println("Unsupported file type of the sound file: " + fSound.toString() + " - " + ex.getMessage()); + return null; + } + throw new MissingResourceException("Sound clip failed to load", this.getClass().getName(), filename); + } + + private void clipStateChanged(LineEvent lineEvent) { + started |= lineEvent.getType() == LineEvent.Type.START; + } + + private void wait(Supplier completed) { + final int attempts = 5; + for (int i = 0; i < attempts; i++) { + if (completed.get() || !waitSoundSystemDelay()) { + break; + } + } + } } } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java b/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java index 103fdaa5ece..29f75a6f473 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/CardFaceSymbols.java @@ -38,7 +38,7 @@ import java.util.StringTokenizer; */ public class CardFaceSymbols { /** Constant manaImages. */ - private static final Map MANA_IMAGES = new HashMap(); + private static final Map MANA_IMAGES = new HashMap<>(); private static final int manaImageSize = 13; diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java b/forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java index d44e767be9d..3ef20e47667 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FCheckBoxList.java @@ -26,7 +26,7 @@ public class FCheckBoxList extends JList { public FCheckBoxList(final boolean keepSelectionWhenFocusLost) { - setCellRenderer(new CellRenderer()); + setCellRenderer(new CellRenderer<>()); addMouseListener(new MouseAdapter() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java index 4e8f403e412..dde9c1ab5af 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java @@ -18,7 +18,7 @@ import forge.toolbox.FSkin.SkinnedLabel; @SuppressWarnings("serial") public class FComboBoxPanel extends JPanel { - private static final List> allPanels = new ArrayList>(); + private static final List> allPanels = new ArrayList<>(); public static void refreshAllSkins() { for (final FComboBoxPanel panel : allPanels) { @@ -48,7 +48,7 @@ public class FComboBoxPanel extends JPanel { this(comboBoxCaption0, flowLayout0); List list = ImmutableList.copyOf(items); - setComboBox(new FComboBox(list), list.get(0)); + setComboBox(new FComboBox<>(list), list.get(0)); } public void setComboBox(final FComboBox comboBox0, final E selectedItem) { diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java index 29aa7a1528c..3f5ce9cbfb8 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxWrapper.java @@ -23,7 +23,7 @@ import forge.toolbox.FSkin.SkinFont; */ public class FComboBoxWrapper implements IComboBox { - private static final List> allWrappers = new ArrayList>(); + private static final List> allWrappers = new ArrayList<>(); public static void refreshAllSkins() { for (final FComboBoxWrapper wrapper : allWrappers) { @@ -37,7 +37,7 @@ public class FComboBoxWrapper implements IComboBox { public FComboBoxWrapper() { super(); - comboBox = new FComboBox(); + comboBox = new FComboBox<>(); allWrappers.add(this); } @@ -209,7 +209,7 @@ public class FComboBoxWrapper implements IComboBox { } //create copy of combo box - final FComboBox newComboBox = new FComboBox(); + final FComboBox newComboBox = new FComboBox<>(); for (int i = 0; i < comboBox.getItemCount(); i++) { newComboBox.addItem(comboBox.getItemAt(i)); } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java b/forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java index 13b850f35c0..57b17e1a7f9 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FDigitalClock.java @@ -19,7 +19,7 @@ import forge.toolbox.FSkin.SkinnedLabel; public class FDigitalClock extends SkinnedLabel { private static final Calendar now = Calendar.getInstance(); private static final DateFormat timeFormatter = DateFormat.getTimeInstance(DateFormat.SHORT); - private static final List clocks = new ArrayList(); + private static final List clocks = new ArrayList<>(); private static Timer timer; private static String currentTimeDisplay; diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FList.java b/forge-gui-desktop/src/main/java/forge/toolbox/FList.java index b2f907c0828..a90d824112b 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FList.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FList.java @@ -44,7 +44,7 @@ public class FList extends SkinnedList { this.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); this.setSelectionForeground(this.getSkin().getForeground()); this.setFont(FSkin.getFont(12)); - this.setCellRenderer(new ComplexCellRenderer()); + this.setCellRenderer(new ComplexCellRenderer<>()); this.addFocusListener(new FocusListener() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java b/forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java index 1dbd4a37590..01872d6b5f7 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FOptionPane.java @@ -107,7 +107,7 @@ public class FOptionPane extends FDialog { txtInput = new FTextField.Builder().text(initialInput).build(); inputField = txtInput; } else { - cbInput = new FComboBox(inputOptions); + cbInput = new FComboBox<>(inputOptions); cbInput.setSelectedItem(initialInput); inputField = cbInput; } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java index 561ccd4897a..5d6946e78d2 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FPanel.java @@ -170,7 +170,7 @@ public class FPanel extends FPanelBase implements ILocalRepaint { // More implementations can be added as necessary. // See drawForegroundScaled(). - final List implemented = new ArrayList(); + final List implemented = new ArrayList<>(); implemented.add(SwingConstants.BOTTOM); implemented.add(SwingConstants.CENTER); diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java index 1bfcdd2b460..9c53990d84d 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java @@ -282,7 +282,7 @@ public class FImagePanel extends JPanel { at.translate(this.getWidth() / 2, this.getHeight() / 2); // 3. rotate around (0,0). - at.rotate(Math.toRadians((double) degreesOfRotation)); + at.rotate(Math.toRadians(degreesOfRotation)); // 2. scale image. if (createScaleTransform) { diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java index 79fa196ba8f..bccc0c274d9 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java @@ -39,7 +39,7 @@ public class PlayerDetailsPanel extends JPanel { private final DetailLabel lblExile = new DetailLabel(FSkinProp.IMG_ZONE_EXILE, "Exile (%s)"); private final DetailLabel lblFlashback = new DetailLabel(FSkinProp.IMG_ZONE_FLASHBACK, "Flashback cards (%s)"); private final DetailLabel lblCommand = new DetailLabel(FSkinProp.IMG_PLANESWALKER, "Command zone (%s)"); - private final List> manaLabels = new ArrayList>(); + private final List> manaLabels = new ArrayList<>(); public PlayerDetailsPanel(final PlayerView player0) { player = player0; @@ -213,7 +213,7 @@ public class PlayerDetailsPanel extends JPanel { } public void setToolTip(final String... args) { - super.setToolTipText(String.format(tooltip, (Object[]) args)); + super.setToolTipText(String.format(tooltip, args)); } @Override diff --git a/forge-gui-desktop/src/main/java/forge/view/FDialog.java b/forge-gui-desktop/src/main/java/forge/view/FDialog.java index f0e1d73ff35..76dfd9069af 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FDialog.java +++ b/forge-gui-desktop/src/main/java/forge/view/FDialog.java @@ -527,7 +527,7 @@ public class FDialog extends SkinnedDialog implements ITitleBarOwner, KeyEventDi return getIconImages().isEmpty() ? null : getIconImages().get(0); } - private static final Stack openModals = new Stack(); + private static final Stack openModals = new Stack<>(); private static final BackdropPanel backdropPanel = new BackdropPanel(); public static boolean isModalOpen() { diff --git a/forge-gui-desktop/src/main/java/forge/view/FView.java b/forge-gui-desktop/src/main/java/forge/view/FView.java index 7dedd44ee6d..2f9bb499825 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FView.java +++ b/forge-gui-desktop/src/main/java/forge/view/FView.java @@ -46,7 +46,7 @@ public enum FView { public static final Integer OVERLAY_LAYER = NAVIGATION_BAR_REVEAL_LAYER - 1; public static final Integer TARGETING_LAYER = OVERLAY_LAYER - 1; - private final List allCells = new ArrayList(); + private final List allCells = new ArrayList<>(); private SplashFrame frmSplash; // Top-level UI components; all have getters. @@ -139,17 +139,17 @@ public enum FView { { // get profile directories -- if one of them is actually under the res directory, don't // count is as data to migrate - final Set profileDirs = new HashSet(); + final Set profileDirs = new HashSet<>(); for (final String dname : ForgeConstants.PROFILE_DIRS) { profileDirs.add(new File(dname)); } - final List resDirs = new ArrayList(); + final List resDirs = new ArrayList<>(); for (final String resDir : Lists.newArrayList("decks", "gauntlet", "layouts", "pics", "preferences", "quest/data")) { resDirs.add(new File("res", resDir)); } - final Set doNotDeleteDirs = new HashSet(); + final Set doNotDeleteDirs = new HashSet<>(); for (final String dir : Lists.newArrayList("decks", "decks/constructed", "decks/draft", "decks/plane", "decks/scheme", "decks/sealed", "gauntlet", "layouts", "pics", "preferences", "quest/data")) { doNotDeleteDirs.add(new File("res", dir)); } @@ -165,7 +165,7 @@ public enum FView { } // assemble a list of remaining files. - final List remainingFiles = new LinkedList(); + final List remainingFiles = new LinkedList<>(); _addRemainingFiles(remainingFiles, resDirs, profileDirs, doNotDeleteDirs); // if any files remain, display them and make clear that they should be moved or @@ -356,8 +356,8 @@ public enum FView { // directories listed in profileDirs will not be searched // removes empty directories to reduce tree conflicts private static boolean _addRemainingFiles(final List remainingFiles, final List dirRoots, final Set profileDirs, final Set doNotDeleteDirs) { - final Deque stack = new LinkedList(dirRoots); - final Set seenDirs = new HashSet(); + final Deque stack = new LinkedList<>(dirRoots); + final Set seenDirs = new HashSet<>(); boolean ret = false; while (!stack.isEmpty()) { File cur = stack.peek(); @@ -459,8 +459,7 @@ public enum FView { * @return {@link java.util.List}<{@link forge.gui.framework.DragCell}> */ public List getDragCells() { - final List clone = new ArrayList(); - clone.addAll(allCells); + final List clone = new ArrayList<>(allCells); return clone; } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 0ae68b24e79..f46f022fccb 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -79,7 +79,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl private final CMatchUI matchUI; private CardView card; private CardPanel attachedToPanel; - private List attachedPanels = new ArrayList(); + private List attachedPanels = new ArrayList<>(); private List stack; private boolean tapped; private double tappedAngle = 0; @@ -693,7 +693,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl titleText.setText(card.getCurrentState().getName()); final int damage = card.getDamage(); - damageText.setText(damage > 0 ? "\u00BB " + String.valueOf(damage) + " \u00AB" : ""); + damageText.setText(damage > 0 ? "\u00BB " + damage + " \u00AB" : ""); // Card Id overlay cardIdText.setText(card.getCurrentState().getDisplayId()); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java index 9662888a354..7547f2d1878 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java @@ -48,7 +48,7 @@ public abstract class CardPanelContainer extends SkinnedPanel { private static final long serialVersionUID = -6400018234895548306L; private static final int DRAG_SMUDGE = 10; - private final List cardPanels = new ArrayList(); + private final List cardPanels = new ArrayList<>(); private final CMatchUI matchUI; private final FScrollPane scrollPane; @@ -59,7 +59,7 @@ public abstract class CardPanelContainer extends SkinnedPanel { private CardPanel mouseDownPanel; private CardPanel mouseDragPanel; - private final List listeners = new ArrayList(2); + private final List listeners = new ArrayList<>(2); private int mouseDragOffsetX, mouseDragOffsetY; private int intialMouseDragX = -1, intialMouseDragY; private boolean dragEnabled; diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java index bacbcd9d0c3..d686c6bb341 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java @@ -177,7 +177,7 @@ public abstract class FloatingCardArea extends CardArea { } protected void doRefresh() { - List cardPanels = new ArrayList(); + List cardPanels = new ArrayList<>(); Iterable cards = getCards(); if (cards != null) { for (final CardView card : cards) { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index 94ae1473e17..74e6e2e5a5d 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -19,7 +19,6 @@ package forge.view.arcane; import java.util.HashMap; import java.util.Map; -import java.util.Collections; import java.util.Comparator; import java.awt.event.MouseEvent; @@ -41,7 +40,7 @@ import forge.util.collect.FCollection; public class FloatingZone extends FloatingCardArea { private static final long serialVersionUID = 1927906492186378596L; - private static final Map floatingAreas = new HashMap(); + private static final Map floatingAreas = new HashMap<>(); private static int getKey(final PlayerView player, final ZoneType zone) { return 40 * player.getId() + zone.hashCode(); @@ -125,9 +124,9 @@ public class FloatingZone extends FloatingCardArea { protected Iterable getCards() { Iterable zoneCards = player.getCards(zone); if ( zoneCards != null ) { - cardList = new FCollection(zoneCards); + cardList = new FCollection<>(zoneCards); if ( sortedByName ) { - Collections.sort(cardList, comp); + cardList.sort(comp); } return cardList; } else { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index acb07c234c3..212fd9032e1 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -62,9 +62,9 @@ public class ListCardArea extends FloatingCardArea { if (storedArea==null) { storedArea = new ListCardArea(matchUI); } - cardList = new ArrayList(); + cardList = new ArrayList<>(); for ( CardView cv : cardList0 ) { cardList.add(cv) ; } - moveableCards = new ArrayList(); // make sure moveable cards are in cardlist + moveableCards = new ArrayList<>(); // make sure moveable cards are in cardlist for ( CardView card : moveableCards0 ) { if ( cardList.contains(card) ) { moveableCards.add(card); @@ -90,8 +90,8 @@ public class ListCardArea extends FloatingCardArea { @Override public void actionPerformed(ActionEvent e) { window.setVisible(false); } }); window.add(doneButton,BorderLayout.SOUTH); - cardList = new ArrayList(cardList0); // this is modified - pfps - is there a better way? - moveableCards = new ArrayList(moveableCards0); + cardList = new ArrayList<>(cardList0); // this is modified - pfps - is there a better way? + moveableCards = new ArrayList<>(moveableCards0); title = title0; toTop = toTop0; toBottom = toBottom0; diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java index 070d3775bbd..291c02b1253 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java @@ -66,7 +66,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen private final boolean mirror; // Computed in layout. - private List rows = new ArrayList(); + private List rows = new ArrayList<>(); private int cardWidth, cardHeight; private int playAreaWidth, playAreaHeight; private int extraCardSpacingX, cardSpacingX, cardSpacingY; @@ -373,7 +373,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } private List tryArrangePilesOfWidth(final CardStackRow lands, final CardStackRow tokens, final CardStackRow creatures, CardStackRow others) { - List template = new ArrayList(); + List template = new ArrayList<>(); int afterFirstRow; @@ -400,7 +400,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen int cntOthers = others.size(); // Copy the template for the case 1st approach won't work - final List templateCopy = new ArrayList(template.size()); + final List templateCopy = new ArrayList<>(template.size()); for (final CardStackRow row : template) { templateCopy.add((CardStackRow) row.clone()); } @@ -554,7 +554,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen for (CardPanel p : stack) { if (p != panel && p.getCard() != null && p.getStack() == stack) { if (otherCardViewsToSelect == null) { - otherCardViewsToSelect = new ArrayList(); + otherCardViewsToSelect = new ArrayList<>(); } otherCardViewsToSelect.add(p.getCard()); } @@ -628,10 +628,10 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } } - final List toAdd = new ArrayList(modelCopy); + final List toAdd = new ArrayList<>(modelCopy); toAdd.removeAll(oldCards); - final List newPanels = new ArrayList(); + final List newPanels = new ArrayList<>(); for (final CardView card : toAdd) { final CardPanel placeholder = new CardPanel(getMatchUI(), card); placeholder.setDisplayEnabled(false); diff --git a/forge-gui-desktop/src/test/java/forge/CardRankerTest.java b/forge-gui-desktop/src/test/java/forge/CardRankerTest.java index 8083210629a..3ab71d505a0 100644 --- a/forge-gui-desktop/src/test/java/forge/CardRankerTest.java +++ b/forge-gui-desktop/src/test/java/forge/CardRankerTest.java @@ -24,7 +24,7 @@ public class CardRankerTest { @Test(timeOut = 1000, enabled = true) void testRank() { - List list = new ArrayList(); + List list = new ArrayList<>(); PaperCard c0 = readCard("makindi_patrol.txt"); list.add(c0); PaperCard c1 = readCard("hero_of_goma_fada.txt"); diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index 628b9b6b160..725f114f550 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -50,7 +50,7 @@ public class GameWrapper { * Note that if you use this option, regular startup is ignored (using player deck, shuffling, drawing hand, mulligan, ...) */ public void runGame() { - List registeredPlayers = new ArrayList(); + List registeredPlayers = new ArrayList<>(); for( PlayerSpecification player : players ) { RegisteredPlayer registeredPlayer = new RegisteredPlayer(new Deck(player.getName())); LobbyPlayerForTests lobbyPlayer = new LobbyPlayerForTests( player.getName(), playerActions ); @@ -137,7 +137,7 @@ public class GameWrapper { //game.getAction().startGame( null ) determines starting player, draws starting hands, handles mulligans, and initiates the first turn //skip drawing initial hand and mulliganing game.setAge( GameStage.Play ); - final HashMap runParams = new HashMap(); + final HashMap runParams = new HashMap<>(); game.getTriggerHandler().runTrigger( TriggerType.NewGame, runParams, false ); //first player in the list starts, no coin toss etc game.getPhaseHandler().startFirstTurn( game.getPlayers().get( 0 ) ); diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java index d99d5b1f11b..2c171929f5a 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java @@ -22,7 +22,7 @@ public class LobbyPlayerForTests extends LobbyPlayer implements IGameEntitiesFac public LobbyPlayerForTests(String name, PlayerActions playerActions) { super(name); - playerControllers = new HashMap(); + playerControllers = new HashMap<>(); this.playerActions = playerActions; } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index f8a0f1eff77..4e3b48f2917 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -123,7 +123,7 @@ public class PlayerControllerForTests extends PlayerController { (attacker.getName().equals("Grizzly Bears") && blockers.get(0).getName().equals("Ajani's Sunstriker")) || (attacker.getName().equals("Ajani's Sunstriker") && blockers.get(0).getName().equals("Grizzly Bears")) )) {//test_104_3b_player_with_less_than_zero_life_loses_the_game_only_when_a_player_receives_priority_variant_with_combat - Map result = new HashMap(); + Map result = new HashMap<>(); result.put(blockers.get(0), damageDealt); return result; } @@ -609,7 +609,7 @@ public class PlayerControllerForTests extends PlayerController { CardCollectionView untappedCards, boolean improvise) { // TODO: AI to choose a creature to tap would go here // Probably along with deciding how many creatures to tap - return new HashMap(); + return new HashMap<>(); } @Override diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java index 96bd43fa372..0eb86f53329 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/SpecificationHandler.java @@ -22,7 +22,7 @@ public abstract class SpecificationHandler findMatches(Iterable items, final SPECIFICATION specification, final IntegerConstraint expectedNumberOfResults) { - List matches = new ArrayList(); + List matches = new ArrayList<>(); for (TYPE item : items) { if (matches(item, specification)) { matches.add(item); diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java index d4a1492db25..c4e2211fcab 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/gamestate/GameStateSpecificationBuilder.java @@ -12,8 +12,8 @@ public class GameStateSpecificationBuilder { private final Map playerFacts; public GameStateSpecificationBuilder() { - cards = new ArrayList(); - playerFacts = new HashMap(); + cards = new ArrayList<>(); + playerFacts = new HashMap<>(); } public GameStateSpecificationBuilder addCard( final CardSpecification cardSpecification ) { diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java index e52e001f0be..5dd9bfd73d7 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/DeclareAttackersAction.java @@ -12,8 +12,8 @@ public class DeclareAttackersAction extends BasePlayerAction { public DeclareAttackersAction( PlayerSpecification player ) { super( player ); - playerAttackAssignments = new HashMap(); - planeswalkerAttackAssignments = new HashMap(); + playerAttackAssignments = new HashMap<>(); + planeswalkerAttackAssignments = new HashMap<>(); } /** diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java index c891a034cae..acf1eb016b9 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/playeractions/PlayerActions.java @@ -14,7 +14,7 @@ public class PlayerActions { private final List playerActions; public PlayerActions( List playerActions ) { - this.playerActions = new LinkedList( playerActions ); + this.playerActions = new LinkedList<>(playerActions); } public PlayerActions( BasePlayerAction... basePlayerActions ) { diff --git a/forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java b/forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java index 945058620db..e6518586ad4 100644 --- a/forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java +++ b/forge-gui-desktop/src/test/java/forge/gui/ListChooserTest.java @@ -15,7 +15,7 @@ public class ListChooserTest { */ @Test(groups = { "UnitTest", "fast" }, timeOut = 1000, enabled = false) public void listChooserTest1() { - final ListChooser c = new ListChooser("choose a or b", 0, 2, Arrays.asList("a", "b"), null); + final ListChooser c = new ListChooser<>("choose a or b", 0, 2, Arrays.asList("a", "b"), null); System.out.println(c.show()); for (final String s : c.getSelectedValues()) { System.out.println(s); diff --git a/forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java b/forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java index 1514efe2284..0569a0e343e 100644 --- a/forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java +++ b/forge-gui-desktop/src/test/java/forge/item/DeckHintsTest.java @@ -41,7 +41,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("assault_griffin.txt")); list.add(readCard("auramancer.txt")); @@ -61,7 +61,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("assault_griffin.txt")); list.add(readCard("scepter_of_empires.txt")); list.add(readCard("crown_of_empires.txt")); @@ -79,7 +79,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("acidic_slime.txt")); list.add(readCard("ajanis_sunstriker.txt")); @@ -96,7 +96,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("llanowar_elves.txt")); list.add(readCard("unsummon.txt")); @@ -125,7 +125,7 @@ public class DeckHintsTest { Assert.assertNotNull(hints); Assert.assertTrue(hints.isValid()); - List list = new ArrayList(); + List list = new ArrayList<>(); list.add(readCard("assault_griffin.txt")); list.add(readCard("breaker_of_armies.txt")); list.add(readCard("benthic_infiltrator.txt")); diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java index 3eedba838c6..d74ac25ac6d 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java @@ -109,7 +109,7 @@ public class PlanarConquestCommanderGeneraterGA extends PlanarConquestGeneraterG @Override protected Deck mutateObject(Deck parent1) { PaperCard allele = parent1.getCommanders().get(0); - if(!standardMap.keySet().contains(allele.getName())){ + if(!standardMap.containsKey(allele.getName())){ return null; } return getDeckForCard(allele); diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java index 1ff8140c537..5d352e0d51a 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java @@ -174,7 +174,7 @@ public class PlanarConquestGeneraterGA extends AbstractGeneticAlgorithm { @Override protected Deck mutateObject(Deck parent1) { PaperCard allele = parent1.getMain().get(MyRandom.getRandom().nextInt(8)); - if(!standardMap.keySet().contains(allele.getName())){ + if(!standardMap.containsKey(allele.getName())){ return null; } return getDeckForCard(allele); @@ -184,8 +184,8 @@ public class PlanarConquestGeneraterGA extends AbstractGeneticAlgorithm { protected Deck createChild(Deck parent1, Deck parent2) { PaperCard allele = parent1.getMain().get(MyRandom.getRandom().nextInt(8)); PaperCard allele2 = parent2.getMain().get(MyRandom.getRandom().nextInt(8)); - if(!standardMap.keySet().contains(allele.getName()) - ||!standardMap.keySet().contains(allele2.getName()) + if(!standardMap.containsKey(allele.getName()) + ||!standardMap.containsKey(allele2.getName()) ||allele.getName().equals(allele2.getName())){ return null; } diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 628d3d9210c..f7344581e61 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,13 +6,13 @@ jar -Xms128m -Xmx2048m - 1.6.27.001 + 1.6.28.002 forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 4e745345768..5a552e6fc65 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index d5a932cefda..d80bc49cdae 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -77,7 +77,7 @@ public class Main { boolean fullscreenFlag = true; if (FileUtil.doesFileExist(desktopModeAssetsDir + "screen_resolution.ini")) { res = FileUtil.readFileToString(desktopModeAssetsDir + "screen_resolution.ini").split("x"); - fullscreenFlag = res.length == 3 ? Integer.parseInt(res[2].trim()) > 0 : true; + fullscreenFlag = res.length != 3 || Integer.parseInt(res[2].trim()) > 0; if (res.length >= 2) { desktopScreenWidth = Integer.parseInt(res[0].trim()); desktopScreenHeight = Integer.parseInt(res[1].trim()); diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 79bc4accf79..7b5224aa9c6 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-gui-mobile diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 2be333bc7c5..c2469192839 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.Stack; public class Forge implements ApplicationListener { - public static final String CURRENT_VERSION = "1.6.27.001"; + public static final String CURRENT_VERSION = "1.6.28.002"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; @@ -47,7 +47,7 @@ public class Forge implements ApplicationListener { private static KeyInputAdapter keyInputAdapter; private static boolean exited; private static int continuousRenderingCount = 1; //initialize to 1 since continuous rendering is the default - private static final Stack screens = new Stack(); + private static final Stack screens = new Stack<>(); private static boolean textureFiltering = false; private static boolean destroyThis = false; public static String extrawide = "default"; @@ -79,7 +79,7 @@ public class Forge implements ApplicationListener { to prevent rendering issue when you try to restart the app again (seems it doesnt dispose correctly...?!?) */ - Gdx.input.setCatchBackKey(true); + Gdx.input.setCatchKey(Keys.BACK, true); destroyThis = true; //Prevent back() ForgePreferences prefs = new ForgePreferences(); @@ -126,8 +126,7 @@ public class Forge implements ApplicationListener { SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music destroyThis = false; //Allow back() - Gdx.input.setCatchBackKey(true); - Gdx.input.setCatchMenuKey(true); + Gdx.input.setCatchKey(Keys.MENU, true); openScreen(HomeScreen.instance); splashScreen = null; @@ -487,7 +486,7 @@ public class Forge implements ApplicationListener { } private static class MainInputProcessor extends FGestureAdapter { - private static final List potentialListeners = new ArrayList(); + private static final List potentialListeners = new ArrayList<>(); private static char lastKeyTyped; private static boolean keyTyped, shiftKeyDown; diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index b2a99f88617..58467efc9eb 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -27,7 +27,7 @@ public class Graphics { private final SpriteBatch batch = new SpriteBatch(); private final ShapeRenderer shapeRenderer = new ShapeRenderer(); - private final Stack transforms = new Stack(); + private final Stack transforms = new Stack<>(); private final Vector3 tmp = new Vector3(); private float regionHeight; private Rectangle bounds; @@ -535,7 +535,16 @@ public class Graphics { } public void drawImage(FImage image, float x, float y, float w, float h) { + drawImage(image, x, y, w, h, false); + } + public void drawImage(FImage image, float x, float y, float w, float h, boolean withDarkOverlay) { image.draw(this, x, y, w, h); + if(withDarkOverlay){ + float oldalpha = alphaComposite; + setAlphaComposite(0.4f); + fillRect(Color.BLACK, x, y, w, h); + setAlphaComposite(oldalpha); + } } public void drawImage(Texture image, float x, float y, float w, float h) { batch.draw(image, adjustX(x), adjustY(y, h), w, h); diff --git a/forge-gui-mobile/src/forge/animation/AbilityEffect.java b/forge-gui-mobile/src/forge/animation/AbilityEffect.java index 868d527863b..755aa68d16a 100644 --- a/forge-gui-mobile/src/forge/animation/AbilityEffect.java +++ b/forge-gui-mobile/src/forge/animation/AbilityEffect.java @@ -11,7 +11,7 @@ public enum AbilityEffect { private GifAnimation animation; private AudioClip soundClip; - private AbilityEffect(String gif0, String wav0) { + AbilityEffect(String gif0, String wav0) { gif = gif0; wav = wav0; } diff --git a/forge-gui-mobile/src/forge/animation/ForgeAnimation.java b/forge-gui-mobile/src/forge/animation/ForgeAnimation.java index 0c285fff516..4ce7ceb42d3 100644 --- a/forge-gui-mobile/src/forge/animation/ForgeAnimation.java +++ b/forge-gui-mobile/src/forge/animation/ForgeAnimation.java @@ -8,7 +8,7 @@ import com.badlogic.gdx.Gdx; import forge.Forge; public abstract class ForgeAnimation { - private static final List activeAnimations = new ArrayList(); + private static final List activeAnimations = new ArrayList<>(); // A guard against inspecting activeAnimations while it's in the process of being edited private static boolean changingActiveAnimations = false; diff --git a/forge-gui-mobile/src/forge/animation/ForgeTransition.java b/forge-gui-mobile/src/forge/animation/ForgeTransition.java index 89fe4e7fd11..4e2fb125394 100644 --- a/forge-gui-mobile/src/forge/animation/ForgeTransition.java +++ b/forge-gui-mobile/src/forge/animation/ForgeTransition.java @@ -15,7 +15,7 @@ public class ForgeTransition extends ForgeAnimation { @Override protected void doLayout(final float width, final float height) { } }; - private static final Map transitionLookup = new LinkedHashMap(); + private static final Map transitionLookup = new LinkedHashMap<>(); public static void queue(final FDisplayObject obj, final Rectangle destBounds, final float duration, final Runnable onFinished) { queue(obj, destBounds, duration, 0, false, onFinished); @@ -87,7 +87,7 @@ public class ForgeTransition extends ForgeAnimation { private static class TransitionObject extends FDisplayObject { private final FDisplayObject originalObj; - private final LinkedList transitions = new LinkedList(); + private final LinkedList transitions = new LinkedList<>(); private TransitionObject(final FDisplayObject originalObj0) { originalObj = originalObj0; diff --git a/forge-gui-mobile/src/forge/animation/GifDecoder.java b/forge-gui-mobile/src/forge/animation/GifDecoder.java index a0aa82ad767..258b8d7036c 100644 --- a/forge-gui-mobile/src/forge/animation/GifDecoder.java +++ b/forge-gui-mobile/src/forge/animation/GifDecoder.java @@ -254,7 +254,7 @@ public class GifDecoder { if (frameCount <= 0) return null; n = n % frameCount; - return ((GifFrame) frames.elementAt(n)).image; + return frames.elementAt(n).image; } /** @@ -405,7 +405,7 @@ public class GifDecoder { protected void init() { status = STATUS_OK; frameCount = 0; - frames = new Vector(); + frames = new Vector<>(); gct = null; lct = null; } @@ -504,11 +504,11 @@ public class GifDecoder { break; case 0xff: // application extension readBlock(); - String app = ""; + StringBuilder app = new StringBuilder(); for (int i = 0; i < 11; i++) { - app += (char) block[i]; + app.append((char) block[i]); } - if (app.equals("NETSCAPE2.0")) { + if (app.toString().equals("NETSCAPE2.0")) { readNetscapeExt(); } else { skip(); // don't care @@ -554,11 +554,11 @@ public class GifDecoder { * Reads GIF file header information. */ protected void readHeader() { - String id = ""; + StringBuilder id = new StringBuilder(); for (int i = 0; i < 6; i++) { - id += (char) read(); + id.append((char) read()); } - if (!id.startsWith("GIF")) { + if (!id.toString().startsWith("GIF")) { status = STATUS_FORMAT_ERROR; return; } @@ -692,7 +692,7 @@ public class GifDecoder { Pixmap frame = getFrame(0); int width = frame.getWidth(); int height = frame.getHeight(); - int vzones = (int)Math.sqrt((double)nrFrames); + int vzones = (int)Math.sqrt(nrFrames); int hzones = vzones; while(vzones * hzones < nrFrames) vzones++; @@ -712,7 +712,7 @@ public class GifDecoder { } Texture texture = new Texture(target); - Array texReg = new Array(); + Array texReg = new Array<>(); for(h = 0; h < hzones; h++) { for(v = 0; v < vzones; v++) { diff --git a/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java b/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java index 457a337d2ec..05234d5b1d6 100644 --- a/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java +++ b/forge-gui-mobile/src/forge/assets/BitmapFontWriter.java @@ -40,12 +40,12 @@ import com.badlogic.gdx.utils.Array; public class BitmapFontWriter { /** The output format. */ - public static enum OutputFormat { + public enum OutputFormat { /** AngelCodeFont text format */ Text, /** AngelCodeFont XML format */ - XML; + XML } /** The output format */ @@ -237,7 +237,7 @@ import com.badlogic.gdx.utils.Array; buf.append("\t\n"); //CHARS - Array glyphs = new Array(256); + Array glyphs = new Array<>(256); for (int i=0; i getAllLanguages() { - final List allLanguages = new ArrayList(); + final List allLanguages = new ArrayList<>(); final FileHandle dir = Gdx.files.absolute(ForgeConstants.LANG_DIR); for (FileHandle languageFile : dir.list()) { diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index e39d143d014..4b1e202785a 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -28,8 +28,8 @@ import forge.screens.SplashScreen; import forge.toolbox.FProgressBar; public class FSkin { - private static final Map images = new HashMap(); - private static final Map avatars = new HashMap(); + private static final Map images = new HashMap<>(); + private static final Map avatars = new HashMap<>(); private static List allSkins; private static FileHandle preferredDir; @@ -98,7 +98,7 @@ public class FSkin { else { if (splashScreen != null) { if (allSkins == null) { //initialize - allSkins = new ArrayList(); + allSkins = new ArrayList<>(); final List skinDirectoryNames = getSkinDirectoryNames(); for (final String skinDirectoryName : skinDirectoryNames) { allSkins.add(WordUtils.capitalize(skinDirectoryName.replace('_', ' '))); @@ -173,7 +173,7 @@ public class FSkin { avatars.clear(); - final Map textures = new HashMap(); + final Map textures = new HashMap<>(); // Grab and test various sprite files. final FileHandle f1 = getDefaultSkinFile(SourceFile.ICONS.getFilename()); @@ -309,7 +309,7 @@ public class FSkin { * @return the skins */ public static List getSkinDirectoryNames() { - final List mySkins = new ArrayList(); + final List mySkins = new ArrayList<>(); final FileHandle dir = Gdx.files.absolute(ForgeConstants.SKINS_DIR); for (FileHandle skinFile : dir.list()) { diff --git a/forge-gui-mobile/src/forge/assets/FSkinColor.java b/forge-gui-mobile/src/forge/assets/FSkinColor.java index a5464aa8613..883088687f3 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinColor.java +++ b/forge-gui-mobile/src/forge/assets/FSkinColor.java @@ -69,8 +69,8 @@ public class FSkinColor { return new FSkinColor(c0, NO_BRIGHTNESS_DELTA, NO_STEP, NO_STEP, NO_ALPHA); } - private static final HashMap baseColors = new HashMap(); - private static final HashMap derivedColors = new HashMap(); + private static final HashMap baseColors = new HashMap<>(); + private static final HashMap derivedColors = new HashMap<>(); private static final int NO_BRIGHTNESS_DELTA = 0; private static final int NO_STEP = -999; //needs to be large negative since small negative values are valid private static final int NO_ALPHA = -1; diff --git a/forge-gui-mobile/src/forge/assets/FSkinFont.java b/forge-gui-mobile/src/forge/assets/FSkinFont.java index 726edaabc3a..7ebe4dae5e3 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinFont.java +++ b/forge-gui-mobile/src/forge/assets/FSkinFont.java @@ -25,7 +25,7 @@ public class FSkinFont { private static final int MAX_FONT_SIZE = 72; private static final String TTF_FILE = "font1.ttf"; - private static final Map fonts = new HashMap(); + private static final Map fonts = new HashMap<>(); private static final GlyphLayout layout = new GlyphLayout(); static { @@ -187,6 +187,30 @@ public class FSkinFont { //only generate images for characters that could be used by Forge String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"!?'.,;:()[]{}<>|/@\\^$-%+=#_&*\u2014\u2022"; chars += "ÁÉÍÓÚáéíóúÀÈÌÒÙàèìòùÑñÄËÏÖÜäëïöüẞß"; + //generate from zh-CN.properties + chars += "“”、一三上下不与专且东两个中临为主么义之乐也了争事二于五些交产" + + "亮人什仅从他付代以们件价任优会传伤但位低住体何作你使例供侧侵便" + + "保信倍候值偏做停偿像允元充先克入全关其具兼兽内再冒决况准减凑几" + + "出击分切列则创初删利到制刷前剪副力功加动助励势包化匹区十协单卖" + + "博卡印即原去参双发取受变叠口句只召可台史右号司合同名后向吗否含" + + "启告员周命和咒品哪唤售商喜器回因团困围图在地场均坊坏坟型域基堆" + + "塞境墓增声处备复多大天太失头夹奇奖套好如始子字存它完宏官定宝实" + + "宠客害家容对导将小少尝就局层屏展属巅左差已市布带帮常幕并幻序库" + + "应底店度建开异弊式引张弧强当录形征很得御徽必志快忽态性总恢息您" + + "悬情惊惰想意慢戏成我或战户所手才打执找把抓抗折报拉拟拥择括持指" + + "按挑挡挥损换据捷排探接控掷描提摩摸撤播操擎支收改攻放故效数文斗" + + "斯新方旅无日旧时明易星是显景暂暴更替最有服期未本术机权束来杯松" + + "板构果柄染查标栏样格框档检植模次止正此死殊段每比池没法注洗洛活" + + "测消涵混添清渐温渲游源滤灵灼点烁烧然片版牌物特状独率王玩环现珍" + + "理瓦生用由画界留略登白百的盒盖盘目直相省看着瞄瞬知破确磨示神票" + + "禁离种秘积称移稀程空窗立竞章第等筑筛简管箭类精系素索紧红级线组" + + "细终经结给络统继绩续维绿缓编缩缺网置者而联肥背胜能脚自至致舒航" + + "般艇色节英范莫获菜蓝薪藏行衍衡补表被西要覆观规视览觉角解触言誓" + + "警计认让记许论设证评试诗诡该详语误说请读调谋谜象败费资赌赛赢起" + + "距跳踢转轮轻载较辑输辨边过运近返还这进远连述退适选逐递速造道那" + + "部都配醒释里重量金钮铁银销锁锋错锦键长门闪闭间队防阴阶阻限除险" + + "隆随隐障难雄集雪需静非靠面音页顶项顺须顿预题颜风飞首验骰高魔鹏" + + "黑默鼠!(),:?"; final PixmapPacker packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 2, false); final FreeTypeFontParameter parameter = new FreeTypeFontParameter(); parameter.characters = chars; diff --git a/forge-gui-mobile/src/forge/assets/FSkinTexture.java b/forge-gui-mobile/src/forge/assets/FSkinTexture.java index 1e5689ea45d..772d897cb24 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinTexture.java +++ b/forge-gui-mobile/src/forge/assets/FSkinTexture.java @@ -7,94 +7,99 @@ import com.badlogic.gdx.graphics.Texture.TextureWrap; import forge.Graphics; import forge.properties.ForgeConstants; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public enum FSkinTexture implements FImage { BG_TEXTURE(ForgeConstants.TEXTURE_BG_FILE, true, false), BG_MATCH(ForgeConstants.MATCH_BG_FILE, false, false), BG_SPACE(ForgeConstants.SPACE_BG_FILE, false, false), BG_CHAOS_WHEEL(ForgeConstants.CHAOS_WHEEL_IMG_FILE, false, false), - BG_PLANE1(ForgeConstants.BG_1, false, true), - BG_PLANE2(ForgeConstants.BG_2, false, true), - BG_PLANE3(ForgeConstants.BG_3, false, true), - BG_PLANE4(ForgeConstants.BG_4, false, true), - BG_PLANE5(ForgeConstants.BG_5, false, true), - BG_PLANE6(ForgeConstants.BG_6, false, true), - BG_PLANE7(ForgeConstants.BG_7, false, true), - BG_PLANE8(ForgeConstants.BG_8, false, true), - BG_PLANE9(ForgeConstants.BG_9, false, true), - BG_PLANE10(ForgeConstants.BG_10, false, true), - BG_PLANE11(ForgeConstants.BG_11, false, true), - BG_PLANE12(ForgeConstants.BG_12, false, true), - BG_PLANE13(ForgeConstants.BG_13, false, true), - BG_PLANE14(ForgeConstants.BG_14, false, true), - BG_PLANE15(ForgeConstants.BG_15, false, true), - BG_PLANE16(ForgeConstants.BG_16, false, true), - BG_PLANE17(ForgeConstants.BG_17, false, true), - BG_PLANE18(ForgeConstants.BG_18, false, true), - BG_PLANE19(ForgeConstants.BG_19, false, true), - BG_PLANE20(ForgeConstants.BG_20, false, true), - BG_PLANE21(ForgeConstants.BG_21, false, true), - BG_PLANE22(ForgeConstants.BG_22, false, true), - BG_PLANE23(ForgeConstants.BG_23, false, true), - BG_PLANE24(ForgeConstants.BG_24, false, true), - BG_PLANE25(ForgeConstants.BG_25, false, true), - BG_PLANE26(ForgeConstants.BG_26, false, true), - BG_PLANE27(ForgeConstants.BG_27, false, true), - BG_PLANE28(ForgeConstants.BG_28, false, true), - BG_PLANE29(ForgeConstants.BG_29, false, true), - BG_PLANE30(ForgeConstants.BG_30, false, true), - BG_PLANE31(ForgeConstants.BG_31, false, true), - BG_PLANE32(ForgeConstants.BG_32, false, true), - BG_PLANE33(ForgeConstants.BG_33, false, true), - BG_PLANE34(ForgeConstants.BG_34, false, true), - BG_PLANE35(ForgeConstants.BG_35, false, true), - BG_PLANE36(ForgeConstants.BG_36, false, true), - BG_PLANE37(ForgeConstants.BG_37, false, true), - BG_PLANE38(ForgeConstants.BG_38, false, true), - BG_PLANE39(ForgeConstants.BG_39, false, true), - BG_PLANE40(ForgeConstants.BG_40, false, true), - BG_PLANE41(ForgeConstants.BG_41, false, true), - BG_PLANE42(ForgeConstants.BG_42, false, true), - BG_PLANE43(ForgeConstants.BG_43, false, true), - BG_PLANE44(ForgeConstants.BG_44, false, true), - BG_PLANE45(ForgeConstants.BG_45, false, true), - BG_PLANE46(ForgeConstants.BG_46, false, true), - BG_PLANE47(ForgeConstants.BG_47, false, true), - BG_PLANE48(ForgeConstants.BG_48, false, true), - BG_PLANE49(ForgeConstants.BG_49, false, true), - BG_PLANE50(ForgeConstants.BG_50, false, true), - BG_PLANE51(ForgeConstants.BG_51, false, true), - BG_PLANE52(ForgeConstants.BG_52, false, true), - BG_PLANE53(ForgeConstants.BG_53, false, true), - BG_PLANE54(ForgeConstants.BG_54, false, true), - BG_PLANE55(ForgeConstants.BG_55, false, true), - BG_PLANE56(ForgeConstants.BG_56, false, true), - BG_PLANE57(ForgeConstants.BG_57, false, true), - BG_PLANE58(ForgeConstants.BG_58, false, true), - BG_PLANE59(ForgeConstants.BG_59, false, true), - BG_PLANE60(ForgeConstants.BG_60, false, true), - BG_PLANE61(ForgeConstants.BG_61, false, true), - BG_PLANE62(ForgeConstants.BG_62, false, true), - BG_PLANE63(ForgeConstants.BG_63, false, true), - BG_PLANE64(ForgeConstants.BG_64, false, true), - BG_PLANE65(ForgeConstants.BG_65, false, true), - BG_PLANE66(ForgeConstants.BG_66, false, true), - BG_PLANE67(ForgeConstants.BG_67, false, true), - BG_PLANE68(ForgeConstants.BG_68, false, true), - BG_PLANE69(ForgeConstants.BG_69, false, true), - BG_PLANE70(ForgeConstants.BG_70, false, true), - BG_PLANE71(ForgeConstants.BG_71, false, true), - BG_PLANE72(ForgeConstants.BG_72, false, true), - BG_PLANE73(ForgeConstants.BG_73, false, true), - BG_PLANE74(ForgeConstants.BG_74, false, true), - BG_PLANE75(ForgeConstants.BG_75, false, true), - BG_PLANE76(ForgeConstants.BG_76, false, true), - BG_PLANE77(ForgeConstants.BG_77, false, true), - BG_PLANE78(ForgeConstants.BG_78, false, true); + Academy_at_Tolaria_West(ForgeConstants.BG_1, false, true), + Agyrem(ForgeConstants.BG_2, false, true), + Akoum(ForgeConstants.BG_3, false, true), + Aretopolis(ForgeConstants.BG_4, false, true), + Astral_Arena(ForgeConstants.BG_5, false, true), + Bant(ForgeConstants.BG_6, false, true), + Bloodhill_Bastion(ForgeConstants.BG_7, false, true), + Cliffside_Market(ForgeConstants.BG_8, false, true), + Edge_of_Malacol(ForgeConstants.BG_9, false, true), + Eloren_Wilds(ForgeConstants.BG_10, false, true), + Feeding_Grounds(ForgeConstants.BG_11, false, true), + Fields_of_Summer(ForgeConstants.BG_12, false, true), + Furnace_Layer(ForgeConstants.BG_13, false, true), + Gavony(ForgeConstants.BG_14, false, true), + Glen_Elendra(ForgeConstants.BG_15, false, true), + Glimmervoid_Basin(ForgeConstants.BG_16, false, true), + Goldmeadow(ForgeConstants.BG_17, false, true), + Grand_Ossuary(ForgeConstants.BG_18, false, true), + Grixis(ForgeConstants.BG_19, false, true), + Grove_of_the_Dreampods(ForgeConstants.BG_20, false, true), + Hedron_Fields_of_Agadeem(ForgeConstants.BG_21, false, true), + Immersturm(ForgeConstants.BG_22, false, true), + Isle_of_Vesuva(ForgeConstants.BG_23, false, true), + Izzet_Steam_Maze(ForgeConstants.BG_24, false, true), + Jund(ForgeConstants.BG_25, false, true), + Kessig(ForgeConstants.BG_26, false, true), + Kharasha_Foothills(ForgeConstants.BG_27, false, true), + Kilnspire_District(ForgeConstants.BG_28, false, true), + Krosa(ForgeConstants.BG_29, false, true), + Lair_of_the_Ashen_Idol(ForgeConstants.BG_30, false, true), + Lethe_Lake(ForgeConstants.BG_31, false, true), + Llanowar(ForgeConstants.BG_32, false, true), + Minamo(ForgeConstants.BG_33, false, true), + Mount_Keralia(ForgeConstants.BG_34, false, true), + Murasa(ForgeConstants.BG_35, false, true), + Naar_Isle(ForgeConstants.BG_36, false, true), + Naya(ForgeConstants.BG_37, false, true), + Nephalia(ForgeConstants.BG_38, false, true), + Norns_Dominion(ForgeConstants.BG_39, false, true), + Onakke_Catacomb(ForgeConstants.BG_40, false, true), + Orochi_Colony(ForgeConstants.BG_41, false, true), + Orzhova(ForgeConstants.BG_42, false, true), + Otaria(ForgeConstants.BG_43, false, true), + Panopticon(ForgeConstants.BG_44, false, true), + Pools_of_Becoming(ForgeConstants.BG_45, false, true), + Prahv(ForgeConstants.BG_46, false, true), + Quicksilver_Sea(ForgeConstants.BG_47, false, true), + Ravens_Run(ForgeConstants.BG_48, false, true), + Sanctum_of_Serra(ForgeConstants.BG_49, false, true), + Sea_of_Sand(ForgeConstants.BG_50, false, true), + Selesnya_Loft_Gardens(ForgeConstants.BG_51, false, true), + Shiv(ForgeConstants.BG_52, false, true), + Skybreen(ForgeConstants.BG_53, false, true), + Sokenzan(ForgeConstants.BG_54, false, true), + Stairs_to_Infinity(ForgeConstants.BG_55, false, true), + Stensia(ForgeConstants.BG_56, false, true), + Stronghold_Furnace(ForgeConstants.BG_57, false, true), + Takenuma(ForgeConstants.BG_58, false, true), + Tazeem(ForgeConstants.BG_59, false, true), + The_Aether_Flues(ForgeConstants.BG_60, false, true), + The_Dark_Barony(ForgeConstants.BG_61, false, true), + The_Eon_Fog(ForgeConstants.BG_62, false, true), + The_Fourth_Sphere(ForgeConstants.BG_63, false, true), + The_Great_Forest(ForgeConstants.BG_64, false, true), + The_Hippodrome(ForgeConstants.BG_65, false, true), + The_Maelstrom(ForgeConstants.BG_66, false, true), + The_Zephyr_Maze(ForgeConstants.BG_67, false, true), + Trail_of_the_MageRings(ForgeConstants.BG_68, false, true), + Truga_Jungle(ForgeConstants.BG_69, false, true), + Turri_Island(ForgeConstants.BG_70, false, true), + Undercity_Reaches(ForgeConstants.BG_71, false, true), + Velis_Vel(ForgeConstants.BG_72, false, true), + Windriddle_Palaces(ForgeConstants.BG_73, false, true), + Tember_City(ForgeConstants.BG_74, false, true), + Celestine_Reef(ForgeConstants.BG_75, false, true), + Horizon_Boughs(ForgeConstants.BG_76, false, true), + Mirrored_Depths(ForgeConstants.BG_77, false, true), + Talon_Gates(ForgeConstants.BG_78, false, true); private final String filename; private final boolean repeat; private Texture texture; private final boolean isPlane; + private static List PlanesValue; FSkinTexture(String filename0, boolean repeat0, boolean isPlane0) { filename = filename0; @@ -102,6 +107,20 @@ public enum FSkinTexture implements FImage { isPlane = isPlane0; } + static { + PlanesValue = new ArrayList<>(); + for (FSkinTexture PlanesEnum : FSkinTexture.values()) { + PlanesValue.add(PlanesEnum.filename + .replace(".jpg", "") + .replace("'", "") + .replace("-", "")); + } + } + + public static List getValues() { + return Collections.unmodifiableList(PlanesValue); + } + public void load() { FileHandle preferredFile = isPlane ? FSkin.getCachePlanechaseFile(filename) : FSkin.getSkinFile(filename); if (preferredFile.exists()) { diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 681e1dec9b3..6245e4ef2a4 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -51,7 +51,7 @@ import java.util.concurrent.TimeUnit; public class ImageCache { // short prefixes to save memory - private static final Set missingIconKeys = new HashSet(); + private static final Set missingIconKeys = new HashSet<>(); private static final LoadingCache cache = CacheBuilder.newBuilder() .maximumSize(400) .expireAfterAccess(15,TimeUnit.MINUTES) diff --git a/forge-gui-mobile/src/forge/assets/TextRenderer.java b/forge-gui-mobile/src/forge/assets/TextRenderer.java index 0b77c8341a5..d73a5b966fd 100644 --- a/forge-gui-mobile/src/forge/assets/TextRenderer.java +++ b/forge-gui-mobile/src/forge/assets/TextRenderer.java @@ -16,7 +16,7 @@ import forge.util.TextBounds; //Encodes text for drawing with symbols and reminder text public class TextRenderer { - private static final Map symbolLookup = new HashMap(); + private static final Map symbolLookup = new HashMap<>(); static { symbolLookup.put("C", FSkinImage.MANA_COLORLESS); symbolLookup.put("W", FSkinImage.MANA_W); @@ -77,8 +77,8 @@ public class TextRenderer { private float width, height, totalHeight; private FSkinFont baseFont, font; private boolean wrap, needClip; - private List pieces = new ArrayList(); - private List lineWidths = new ArrayList(); + private List pieces = new ArrayList<>(); + private List lineWidths = new ArrayList<>(); public TextRenderer() { this(false); diff --git a/forge-gui-mobile/src/forge/card/CardFaceSymbols.java b/forge-gui-mobile/src/forge/card/CardFaceSymbols.java index d48c69d4253..7a86a49966f 100644 --- a/forge-gui-mobile/src/forge/card/CardFaceSymbols.java +++ b/forge-gui-mobile/src/forge/card/CardFaceSymbols.java @@ -29,7 +29,7 @@ import java.util.StringTokenizer; public class CardFaceSymbols { public static final float FONT_SIZE_FACTOR = 0.85f; - private static final Map MANA_IMAGES = new HashMap(); + private static final Map MANA_IMAGES = new HashMap<>(); public static void loadImages() { for (int i = 0; i <= 20; i++) { diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index f9d3a2e40ef..88d6f1b28b2 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -273,7 +273,7 @@ public class CardImageRenderer { } private static void drawPtBox(Graphics g, CardView card, CardStateView state, Color[] colors, float x, float y, float w, float h) { - List pieces = new ArrayList(); + List pieces = new ArrayList<>(); if (state.isCreature()) { pieces.add(String.valueOf(state.getPower())); pieces.add("/"); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index e60b1faf7c7..aa898eb012f 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -133,7 +133,7 @@ public class CardRenderer { return Math.round(MANA_SYMBOL_SIZE + FSkinFont.get(12).getLineHeight() + 3 * FList.PADDING + 1); } - private static final Map cardArtCache = new HashMap(); + private static final Map cardArtCache = new HashMap<>(); public static final float CARD_ART_RATIO = 1.302f; public static final float CARD_ART_HEIGHT_PERCENTAGE = 0.43f; @@ -651,7 +651,7 @@ public class CardRenderer { private static void drawPtBox(Graphics g, CardView card, CardStateView details, Color color, float x, float y, float w, float h) { //use array of strings to render separately with a tiny amount of space in between //instead of using actual spaces which are too wide - List pieces = new ArrayList(); + List pieces = new ArrayList<>(); if (details.isCreature()) { pieces.add(String.valueOf(details.getPower())); pieces.add("/"); @@ -678,7 +678,7 @@ public class CardRenderer { FSkinFont font = FSkinFont.forHeight(h * 0.15f); float padding = Math.round(font.getCapHeight() / 4); float boxWidth = padding; - List pieceWidths = new ArrayList(); + List pieceWidths = new ArrayList<>(); for (String piece : pieces) { float pieceWidth = font.getBounds(piece).width + padding; pieceWidths.add(pieceWidth); diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index cbc10b877c3..b3cdd3a599a 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -47,7 +47,7 @@ public class CardZoom extends FOverlay { private static boolean showAltState; public static void show(Object item) { - List items0 = new ArrayList(); + List items0 = new ArrayList<>(); items0.add(item); show(items0, 0, null); } @@ -291,7 +291,7 @@ public class CardZoom extends FOverlay { protected void doLayout(float width, float height) { } - public static interface ActivateHandler { + public interface ActivateHandler { String getActivateAction(int index); void setSelectedIndex(int index); void activate(int index); diff --git a/forge-gui-mobile/src/forge/card/GameEntityPicker.java b/forge-gui-mobile/src/forge/card/GameEntityPicker.java index 6a18df6d474..d26f262d259 100644 --- a/forge-gui-mobile/src/forge/card/GameEntityPicker.java +++ b/forge-gui-mobile/src/forge/card/GameEntityPicker.java @@ -83,7 +83,7 @@ public class GameEntityPicker extends TabPageScreen { list.setListData(items); } else { - List filteredList = new ArrayList(); + List filteredList = new ArrayList<>(); for (GameEntityView option : items) { if (option.toString().toLowerCase().contains(pattern)) { filteredList.add(option); diff --git a/forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java b/forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java index 54d87c54410..a6a03bf06e9 100644 --- a/forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java +++ b/forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java @@ -61,7 +61,7 @@ public class AddBasicLandsDialog extends FDialog { private final Callback callback; private final FLabel lblLandSet = add(new FLabel.Builder().text("Land Set:").font(FSkinFont.get(12)).textColor(FLabel.INLINE_LABEL_COLOR).build()); - private final FComboBox cbLandSet = add(new FComboBox(Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands))); + private final FComboBox cbLandSet = add(new FComboBox<>(Iterables.filter(StaticData.instance().getEditions(), CardEdition.Predicates.hasBasicLands))); private final FScrollPane scroller = add(new FScrollPane() { @Override @@ -312,7 +312,7 @@ public class AddBasicLandsDialog extends FDialog { private LandPanel(String cardName0) { cardName = cardName0; cardPanel = add(new LandCardPanel()); - cbLandArt = add(new FComboBox()); + cbLandArt = add(new FComboBox<>()); cbLandArt.setFont(cbLandSet.getFont()); cbLandArt.setChangedHandler(new FEventHandler() { @Override diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 0419df3c7ed..06c681b5b8f 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -472,7 +472,7 @@ public class FDeckChooser extends FScreen { selectedDeckType = defaultDeckType; if (cmbDeckTypes == null) { //initialize components with delayed initialization the first time this is populated - cmbDeckTypes = new FComboBox(); + cmbDeckTypes = new FComboBox<>(); switch (lstDecks.getGameType()) { case Constructed: case Gauntlet: @@ -950,7 +950,7 @@ public class FDeckChooser extends FScreen { if (cmbDeckTypes.getSelectedItem() == null || cmbDeckTypes.getSelectedItem() == DeckType.NET_DECK) { //handle special case of net decks if (netDeckCategory == null) { return ""; } - state.append(NetDeckCategory.PREFIX + netDeckCategory.getName()); + state.append(NetDeckCategory.PREFIX).append(netDeckCategory.getName()); } else { state.append(cmbDeckTypes.getSelectedItem().name()); @@ -1015,7 +1015,7 @@ public class FDeckChooser extends FScreen { private List getSelectedDecksFromSavedState(String savedState) { try { if (StringUtils.isBlank(savedState)) { - return new ArrayList(); + return new ArrayList<>(); } else { return Arrays.asList(savedState.split(";")[1].split(SELECTED_DECK_DELIMITER)); @@ -1023,7 +1023,7 @@ public class FDeckChooser extends FScreen { } catch (Exception ex) { System.err.println(ex + " [savedState=" + savedState + "]"); - return new ArrayList(); + return new ArrayList<>(); } } @@ -1087,11 +1087,13 @@ public class FDeckChooser extends FScreen { deckTypes.remove(DeckType.VINTAGE_CARDGEN_DECK); } - ListChooser chooser = new ListChooser( + ListChooser chooser = new ListChooser<>( "Choose allowed deck types for opponents", 0, deckTypes.size(), deckTypes, null, new Callback>() { @Override public void run(final List allowedDeckTypes) { - if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { return; } + if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { + return; + } FThreads.invokeInBackgroundThread(new Runnable() { //needed for loading net decks @Override @@ -1112,7 +1114,7 @@ public class FDeckChooser extends FScreen { GauntletData gauntlet = GauntletUtil.createQuickGauntlet(userDeck, numOpponents, allowedDeckTypes, netCat); FModel.setGauntletData(gauntlet); - List players = new ArrayList(); + List players = new ArrayList<>(); RegisteredPlayer humanPlayer = new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer()); players.add(humanPlayer); players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); @@ -1140,10 +1142,10 @@ public class FDeckChooser extends FScreen { LoadingOverlay.show("Loading new game...", new Runnable() { @Override public void run() { - Set appliedVariants = new HashSet(); + Set appliedVariants = new HashSet<>(); appliedVariants.add(variant); - List players = new ArrayList(); + List players = new ArrayList<>(); RegisteredPlayer humanPlayer = RegisteredPlayer.forVariants(2, appliedVariants, userDeck, null, false, null, null); humanPlayer.setPlayer(GamePlayerUtil.getGuiPlayer()); RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, aiDeck, null, false, null, null); @@ -1151,7 +1153,7 @@ public class FDeckChooser extends FScreen { players.add(humanPlayer); players.add(aiPlayer); - final Map guiMap = new HashMap(); + final Map guiMap = new HashMap<>(); guiMap.put(humanPlayer, MatchController.instance); final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 56cbcaf5288..70be5c3361e 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -49,79 +49,79 @@ public class FDeckEditor extends TabPageScreen { private static final float HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f); public enum EditorType { - Constructed(new DeckController(FModel.getDecks().getConstructed(), new Supplier() { + Constructed(new DeckController<>(FModel.getDecks().getConstructed(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - Draft(new DeckController(FModel.getDecks().getDraft(), new Supplier() { + Draft(new DeckController<>(FModel.getDecks().getDraft(), new Supplier() { @Override public DeckGroup get() { return new DeckGroup(""); } }), null), - Sealed(new DeckController(FModel.getDecks().getSealed(), new Supplier() { + Sealed(new DeckController<>(FModel.getDecks().getSealed(), new Supplier() { @Override public DeckGroup get() { return new DeckGroup(""); } }), null), - Winston(new DeckController(FModel.getDecks().getWinston(), new Supplier() { + Winston(new DeckController<>(FModel.getDecks().getWinston(), new Supplier() { @Override public DeckGroup get() { return new DeckGroup(""); } }), null), - Commander(new DeckController(FModel.getDecks().getCommander(), new Supplier() { + Commander(new DeckController<>(FModel.getDecks().getCommander(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - Oathbreaker(new DeckController(FModel.getDecks().getOathbreaker(), new Supplier() { + Oathbreaker(new DeckController<>(FModel.getDecks().getOathbreaker(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - TinyLeaders(new DeckController(FModel.getDecks().getTinyLeaders(), new Supplier() { + TinyLeaders(new DeckController<>(FModel.getDecks().getTinyLeaders(), new Supplier() { @Override public Deck get() { return new Deck(); } }), DeckFormat.TinyLeaders.isLegalCardPredicate()), - Brawl(new DeckController(FModel.getDecks().getBrawl(), new Supplier() { + Brawl(new DeckController<>(FModel.getDecks().getBrawl(), new Supplier() { @Override public Deck get() { return new Deck(); } }), DeckFormat.Brawl.isLegalCardPredicate()), - Archenemy(new DeckController(FModel.getDecks().getScheme(), new Supplier() { + Archenemy(new DeckController<>(FModel.getDecks().getScheme(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - Planechase(new DeckController(FModel.getDecks().getPlane(), new Supplier() { + Planechase(new DeckController<>(FModel.getDecks().getPlane(), new Supplier() { @Override public Deck get() { return new Deck(); } }), null), - Quest(new DeckController(null, new Supplier() { //delay setting root folder until quest loaded + Quest(new DeckController<>(null, new Supplier() { //delay setting root folder until quest loaded @Override public Deck get() { return new Deck(); } }), null), - QuestDraft(new DeckController(null, new Supplier() { //delay setting root folder until quest loaded + QuestDraft(new DeckController<>(null, new Supplier() { //delay setting root folder until quest loaded @Override public DeckGroup get() { return new DeckGroup(""); } }), null), - PlanarConquest(new DeckController(null, new Supplier() { //delay setting root folder until conquest loaded + PlanarConquest(new DeckController<>(null, new Supplier() { //delay setting root folder until conquest loaded @Override public Deck get() { return new Deck(); @@ -135,7 +135,7 @@ public class FDeckEditor extends TabPageScreen { return controller; } - private EditorType(DeckController controller0, Predicate cardFilter0) { + EditorType(DeckController controller0, Predicate cardFilter0) { controller = controller0; cardFilter = cardFilter0; } @@ -152,7 +152,7 @@ public class FDeckEditor extends TabPageScreen { filter = Predicates.and(filter, additionalFilter); } - ItemPool filteredPool = new ItemPool(PaperCard.class); + ItemPool filteredPool = new ItemPool<>(PaperCard.class); for (Entry entry : cardPool) { if (filter.apply(entry.getKey())) { filteredPool.add(entry.getKey(), entry.getValue()); @@ -733,7 +733,7 @@ public class FDeckEditor extends TabPageScreen { protected abstract void buildMenu(final FDropDownMenu menu, final PaperCard card); private ItemPool getAllowedAdditions(Iterable> itemsToAdd, boolean isAddSource) { - ItemPool additions = new ItemPool(cardManager.getGenericType()); + ItemPool additions = new ItemPool<>(cardManager.getGenericType()); CardLimit limit = parentScreen.getCardLimit(); Deck deck = parentScreen.getDeck(); @@ -1026,7 +1026,7 @@ public class FDeckEditor extends TabPageScreen { cardManager.setPool(ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_PLANE_OR_PHENOMENON, PaperCard.FN_GET_RULES)), PaperCard.class), true); break; case Quest: - final ItemPool questPool = new ItemPool(PaperCard.class); + final ItemPool questPool = new ItemPool<>(PaperCard.class); questPool.addAll(FModel.getQuest().getCards().getCardpool()); // remove bottom cards that are in the deck from the card pool questPool.removeAll(parentScreen.getDeck().getMain()); @@ -1175,7 +1175,7 @@ public class FDeckEditor extends TabPageScreen { @Override public void handleEvent(FEvent e) { //sort options so current option is on top and selected by default - List sortedOptions = new ArrayList(); + List sortedOptions = new ArrayList<>(); sortedOptions.add(card); for (PaperCard option : artOptions) { if (option != card) { diff --git a/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java b/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java index e00e009a551..e8c5c56cece 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java +++ b/forge-gui-mobile/src/forge/deck/FDeckImportDialog.java @@ -49,8 +49,8 @@ public class FDeckImportDialog extends FDialog { */ private final FCheckBox onlyCoreExpCheck = add(new FCheckBox("Use only core and expansion sets", false)); - private final FComboBox monthDropdown = add(new FComboBox()); //don't need wrappers since skin can't change while this dialog is open - private final FComboBox yearDropdown = add(new FComboBox()); + private final FComboBox monthDropdown = add(new FComboBox<>()); //don't need wrappers since skin can't change while this dialog is open + private final FComboBox yearDropdown = add(new FComboBox<>()); private final boolean showOptions; private final DeckImportController controller; @@ -79,7 +79,7 @@ public class FDeckImportDialog extends FDialog { if (sb.length() > 0) { sb.append("\n"); } - sb.append(token.getNumber() + " " + token.getText()); + sb.append(token.getNumber()).append(" ").append(token.getText()); } } if (sb.length() > 0) { diff --git a/forge-gui-mobile/src/forge/itemmanager/CardManager.java b/forge-gui-mobile/src/forge/itemmanager/CardManager.java index bb0d0168cd0..6f194a42afc 100644 --- a/forge-gui-mobile/src/forge/itemmanager/CardManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/CardManager.java @@ -57,7 +57,7 @@ public class CardManager extends ItemManager { } public static AdvancedSearchFilter createAdvancedSearchFilter(final ItemManager itemManager) { - return new AdvancedSearchFilter(itemManager); + return new AdvancedSearchFilter<>(itemManager); } @Override diff --git a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java index f5f13203a10..d48e2a6e067 100644 --- a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java @@ -68,12 +68,12 @@ public final class DeckManager extends ItemManager implements IHasGam @Override protected TextSearchFilter createSearchFilter() { - return new TextSearchFilter(this); + return new TextSearchFilter<>(this); } @Override protected AdvancedSearchFilter createAdvancedSearchFilter() { - return new AdvancedSearchFilter(this); + return new AdvancedSearchFilter<>(this); } @Override diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index bfdcf634a56..d2b9a769b79 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -63,7 +63,7 @@ public abstract class ItemManager extends FContainer im protected final ItemManagerModel model; private Predicate filterPredicate = null; private AdvancedSearchFilter advancedSearchFilter; - private final List> filters = new ArrayList>(); + private final List> filters = new ArrayList<>(); private boolean hideFilters = false; private boolean wantUnique = false; private boolean multiSelectMode = false; @@ -74,7 +74,7 @@ public abstract class ItemManager extends FContainer im private ItemManagerConfig config; private Function, Object> fnNewGet; private boolean viewUpdating, needSecondUpdate; - private List sortCols = new ArrayList(); + private List sortCols = new ArrayList<>(); private final TextSearchFilter searchFilter; @@ -89,7 +89,7 @@ public abstract class ItemManager extends FContainer im private final FComboBox cbxSortOptions; - private final List> views = new ArrayList>(); + private final List> views = new ArrayList<>(); private final ItemListView listView; private final ImageView imageView; private ItemView currentView; @@ -106,11 +106,11 @@ public abstract class ItemManager extends FContainer im protected ItemManager(final Class genericType0, final boolean wantUnique0) { genericType = genericType0; wantUnique = wantUnique0; - model = new ItemManagerModel(genericType0); + model = new ItemManagerModel<>(genericType0); searchFilter = createSearchFilter(); - listView = new ItemListView(this, model); + listView = new ItemListView<>(this, model); imageView = createImageView(model); views.add(listView); @@ -125,7 +125,7 @@ public abstract class ItemManager extends FContainer im add(btnAdvancedSearchOptions); btnAdvancedSearchOptions.setSelected(!hideFilters); if (allowSortChange()) { - cbxSortOptions = add(new FComboBox("Sort: ")); + cbxSortOptions = add(new FComboBox<>("Sort: ")); cbxSortOptions.setFont(FSkinFont.get(12)); } else { @@ -205,7 +205,7 @@ public abstract class ItemManager extends FContainer im } protected ImageView createImageView(final ItemManagerModel model0) { - return new ImageView(this, model0); + return new ImageView<>(this, model0); } public ItemManagerConfig getConfig() { @@ -220,7 +220,7 @@ public abstract class ItemManager extends FContainer im setWantUnique(config0.getUniqueCardsOnly()); //ensure sort cols ordered properly - final List cols = new LinkedList(); + final List cols = new LinkedList<>(); for (ItemColumnConfig colConfig : config.getCols().values()) { if (colOverrides == null || !colOverrides.containsKey(colConfig.getDef())) { cols.add(new ItemColumn(colConfig)); @@ -229,7 +229,7 @@ public abstract class ItemManager extends FContainer im cols.add(colOverrides.get(colConfig.getDef())); } } - Collections.sort(cols, new Comparator() { + cols.sort(new Comparator() { @Override public int compare(ItemColumn arg0, ItemColumn arg1) { return Integer.compare(arg0.getConfig().getIndex(), arg1.getConfig().getIndex()); @@ -437,7 +437,7 @@ public abstract class ItemManager extends FContainer im } public ItemPool getSelectedItemPool() { - ItemPool selectedItemPool = new ItemPool(genericType); + ItemPool selectedItemPool = new ItemPool<>(genericType); if (currentView == listView) { for (T item : getSelectedItems()) { selectedItemPool.add(item, getItemCount(item)); @@ -475,7 +475,7 @@ public abstract class ItemManager extends FContainer im } public boolean setSelectedStrings(Iterable strings) { - List items = new ArrayList(); + List items = new ArrayList<>(); for (String str : strings) { T item = stringToItem(str); if (item != null) { @@ -486,7 +486,7 @@ public abstract class ItemManager extends FContainer im } public boolean selectItemEntrys(Iterable> itemEntrys) { - List items = new ArrayList(); + List items = new ArrayList<>(); for (Entry itemEntry : itemEntrys) { items.add(itemEntry.getKey()); } @@ -521,7 +521,7 @@ public abstract class ItemManager extends FContainer im if (isUnfiltered()) { model.addItem(item, qty); } - List items = new ArrayList(); + List items = new ArrayList<>(); items.add(item); updateView(false, items); } @@ -532,7 +532,7 @@ public abstract class ItemManager extends FContainer im model.addItems(itemsToAdd); } - List items = new ArrayList(); + List items = new ArrayList<>(); for (Map.Entry item : itemsToAdd) { items.add(item.getKey()); } @@ -695,7 +695,7 @@ public abstract class ItemManager extends FContainer im public boolean applyFilters() { if (lockFiltering || !initialized) { return false; } - List> predicates = new ArrayList>(); + List> predicates = new ArrayList<>(); for (ItemFilter filter : filters) { if (!filter.isEmpty()) { predicates.add(filter.buildPredicate(genericType)); @@ -901,10 +901,7 @@ public abstract class ItemManager extends FContainer im @Override protected boolean hideBackdropOnPress(float x, float y) { Rectangle bounds = currentView.getSelectionBounds(); - if (bounds == null || bounds.contains(x, y)) { - return false; //don't hide on press if within selection bounds - } - return true; + return bounds != null && !bounds.contains(x, y); //don't hide on press if within selection bounds } @Override diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java index b01dfcc9a9a..58327e7245c 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -35,12 +35,12 @@ public class AdvancedSearchFilter extends ItemFilter public AdvancedSearchFilter(ItemManager itemManager0) { super(itemManager0); - model = new AdvancedSearch.Model(); + model = new AdvancedSearch.Model<>(); } @Override public ItemFilter createCopy() { - AdvancedSearchFilter copy = new AdvancedSearchFilter(itemManager); + AdvancedSearchFilter copy = new AdvancedSearchFilter<>(itemManager); return copy; } diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java index c4e657e1ca0..7fac6999178 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java @@ -38,7 +38,7 @@ public class CardTypeFilter extends StatTypeFilter { @Override protected final Predicate buildPredicate() { - final List> types = new ArrayList>(); + final List> types = new ArrayList<>(); for (StatTypes s : buttonMap.keySet()) { if (s.predicate != null && buttonMap.get(s).isSelected()) { diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java index d83ff7dd814..3d4001e3818 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java @@ -10,7 +10,7 @@ import java.util.Set; public class DeckFolderFilter extends ListLabelFilter { - protected final Set folders = new HashSet(); + protected final Set folders = new HashSet<>(); public DeckFolderFilter(ItemManager itemManager0) { super(itemManager0); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java index fbd78453c3b..b1e89e6c20d 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java @@ -31,7 +31,7 @@ public abstract class FormatFilter extends ItemFilter cbxFormats = new FComboBox(); + private FComboBox cbxFormats = new FComboBox<>(); public FormatFilter(ItemManager itemManager0) { super(itemManager0); @@ -122,8 +122,8 @@ public abstract class FormatFilter extends ItemFilter selectedSets = new HashSet(); - private final FGroupList lstSets = add(new FGroupList()); + private final Set selectedSets = new HashSet<>(); + private final FGroupList lstSets = add(new FGroupList<>()); private MultiSetSelect() { super("Choose Sets"); @@ -177,8 +177,8 @@ public abstract class FormatFilter extends ItemFilter canCloseCallback) { if (selectedSets.size() > 0) { - List setCodes = new ArrayList(); - List sortedSets = new ArrayList(selectedSets); + List setCodes = new ArrayList<>(); + List sortedSets = new ArrayList<>(selectedSets); Collections.sort(sortedSets); for (CardEdition set : sortedSets) { setCodes.add(set.getCode()); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/HistoricFormatSelect.java b/forge-gui-mobile/src/forge/itemmanager/filters/HistoricFormatSelect.java index 10e27b27a48..ad7831603fa 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/HistoricFormatSelect.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/HistoricFormatSelect.java @@ -24,7 +24,7 @@ import java.util.Set; public class HistoricFormatSelect extends FScreen { private GameFormat selectedFormat; - private final FGroupList lstFormats = add(new FGroupList()); + private final FGroupList lstFormats = add(new FGroupList<>()); private final Set historicSubTypes = new HashSet<>(Arrays.asList(GameFormat.FormatSubType.Block, GameFormat.FormatSubType.Standard,GameFormat.FormatSubType.Extended,GameFormat.FormatSubType.Modern, GameFormat.FormatSubType.Legacy, GameFormat.FormatSubType.Vintage)); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/ListLabelFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/ListLabelFilter.java index 0dab393dcf6..7398e095dc7 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/ListLabelFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/ListLabelFilter.java @@ -43,10 +43,10 @@ public abstract class ListLabelFilter extends ItemFilte labelBuilder.append("s: All"); break; case 1: - labelBuilder.append(": " + getList().iterator().next()); + labelBuilder.append(": ").append(getList().iterator().next()); break; default: - labelBuilder.append("s: " + TextUtil.join(getList(), ", ")); + labelBuilder.append("s: ").append(TextUtil.join(getList(), ", ")); break; } label.setText(labelBuilder.toString()); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java index c93f419b0b5..b2d4ac67f60 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java @@ -18,7 +18,7 @@ public abstract class StatTypeFilter extends ToggleButt public StatTypeFilter(ItemManager itemManager0) { super(itemManager0); - buttonMap = new HashMap(); + buttonMap = new HashMap<>(); } protected void addToggleButton(Widget widget, final StatTypes st) { diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/TextSearchFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/TextSearchFilter.java index f1237a7ca37..c2cac6fdcdf 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/TextSearchFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/TextSearchFilter.java @@ -25,7 +25,7 @@ public class TextSearchFilter extends ItemFilter { @Override public ItemFilter createCopy() { - TextSearchFilter copy = new TextSearchFilter(itemManager); + TextSearchFilter copy = new TextSearchFilter<>(itemManager); copy.getWidget(); //initialize widget copy.txtSearch.setText(this.txtSearch.getText()); return copy; diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/ToggleButtonsFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/ToggleButtonsFilter.java index dc78154a668..61f986c9c38 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/ToggleButtonsFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/ToggleButtonsFilter.java @@ -16,7 +16,7 @@ import forge.toolbox.FLabel; public abstract class ToggleButtonsFilter extends ItemFilter { protected boolean lockFiltering; - private final List buttons = new ArrayList(); + private final List buttons = new ArrayList<>(); protected ToggleButtonsFilter(ItemManager itemManager0) { super(itemManager0); diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index 9c5d81b57c4..8261e525f40 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -55,7 +55,7 @@ public class ImageView extends ItemView { private static final int MIN_COLUMN_COUNT = 1; private static final int MAX_COLUMN_COUNT = 10; - private final List selectedIndices = new ArrayList(); + private final List selectedIndices = new ArrayList<>(); private int columnCount = 4; private float scrollHeight = 0; private ColumnDef pileBy = null; @@ -63,8 +63,8 @@ public class ImageView extends ItemView { private ItemInfo focalItem; private boolean updatingLayout; private float totalZoomAmount; - private final List orderedItems = new ArrayList(); - private final List groups = new ArrayList(); + private final List orderedItems = new ArrayList<>(); + private final List groups = new ArrayList<>(); private class ExpandCollapseButton extends FLabel { private boolean isAllCollapsed; @@ -135,8 +135,8 @@ public class ImageView extends ItemView { } } private final ExpandCollapseButton btnExpandCollapseAll = new ExpandCollapseButton(); - private final FComboBox cbGroupByOptions = new FComboBox("Groups: "); - private final FComboBox cbPileByOptions = new FComboBox("Piles: "); + private final FComboBox cbGroupByOptions = new FComboBox<>("Groups: "); + private final FComboBox cbPileByOptions = new FComboBox<>("Piles: "); public ImageView(ItemManager itemManager0, ItemManagerModel model0) { super(itemManager0, model0); @@ -424,7 +424,7 @@ public class ImageView extends ItemView { if (forRefresh && pileBy != null) { //refresh piles if needed //use TreeMap to build pile set so iterating below sorts on key ColumnDef groupPileBy = groupBy == null ? pileBy : groupBy.getGroupPileBy(i, pileBy); - Map, Pile> piles = new TreeMap, Pile>(); + Map, Pile> piles = new TreeMap<>(); for (ItemInfo itemInfo : group.items) { Comparable key = groupPileBy.fnSort.apply(itemInfo); if (!piles.containsKey(key)) { @@ -433,9 +433,7 @@ public class ImageView extends ItemView { piles.get(key).items.add(itemInfo); } group.piles.clear(); - for (Pile pile : piles.values()) { - group.piles.add(pile); - } + group.piles.addAll(piles.values()); } groupY = y; @@ -761,8 +759,8 @@ public class ImageView extends ItemView { } private class Group extends FScrollPane { - private final List items = new ArrayList(); - private final List piles = new ArrayList(); + private final List items = new ArrayList<>(); + private final List piles = new ArrayList<>(); private final String name; private boolean isCollapsed; private float scrollWidth; @@ -879,7 +877,7 @@ public class ImageView extends ItemView { } } private class Pile extends FDisplayObject { - private final List items = new ArrayList(); + private final List items = new ArrayList<>(); @Override public void draw(Graphics g) { diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java index 6caade0e233..0b7b2f5d076 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java @@ -46,7 +46,7 @@ public final class ItemListView extends ItemView { private final ItemList list = new ItemList(); private final ItemListModel listModel; - private List selectedIndices = new ArrayList(); + private List selectedIndices = new ArrayList<>(); public ItemListModel getListModel() { return listModel; diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java b/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java index dd8ce179d02..ed20f675273 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ItemView.java @@ -144,7 +144,7 @@ public abstract class ItemView { } public final Collection getSelectedItems() { - List items = new ArrayList(); + List items = new ArrayList<>(); for (Integer i : getSelectedIndices()) { T item = getItemAtIndex(i); if (item != null) { @@ -170,7 +170,7 @@ public abstract class ItemView { return setSelectedItems(items, true); } public final boolean setSelectedItems(Iterable items, boolean scrollIntoView) { - List indices = new ArrayList(); + List indices = new ArrayList<>(); for (T item : items) { int index = getIndexOfItem(item); if (index != -1) { @@ -199,7 +199,7 @@ public abstract class ItemView { if (index < 0) { if (index == -1 && minSelections == 0) { //allow passing -1 to clear selection if no selection allowed if (getSelectionCount() > 0) { - onSetSelectedIndices(new ArrayList()); + onSetSelectedIndices(new ArrayList<>()); onSelectionChange(); } return; @@ -225,7 +225,7 @@ public abstract class ItemView { int count = getCount(); if (count == 0) { return; } - List indexList = new ArrayList(); + List indexList = new ArrayList<>(); for (Integer index : indices) { if (index >= 0 && index < count) { indexList.add(index); diff --git a/forge-gui-mobile/src/forge/menu/FDropDown.java b/forge-gui-mobile/src/forge/menu/FDropDown.java index f308b38578e..0f2f67bd893 100644 --- a/forge-gui-mobile/src/forge/menu/FDropDown.java +++ b/forge-gui-mobile/src/forge/menu/FDropDown.java @@ -187,10 +187,7 @@ public abstract class FDropDown extends FScrollPane { protected boolean hideBackdropOnPress(float x, float y) { FDisplayObject owner = getDropDownOwner(); - if (owner == null || !owner.screenPos.contains(x, y)) { - return true; //auto-hide when backdrop pressed unless over owner - } - return false; + return owner == null || !owner.screenPos.contains(x, y); //auto-hide when backdrop pressed unless over owner } protected boolean preventOwnerHandlingBackupTap(float x, float y, int count) { diff --git a/forge-gui-mobile/src/forge/menu/FDropDownMenu.java b/forge-gui-mobile/src/forge/menu/FDropDownMenu.java index 6636a51f257..62a9946557a 100644 --- a/forge-gui-mobile/src/forge/menu/FDropDownMenu.java +++ b/forge-gui-mobile/src/forge/menu/FDropDownMenu.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; public abstract class FDropDownMenu extends FDropDown { - protected final List items = new ArrayList(); + protected final List items = new ArrayList<>(); public FDropDownMenu() { } @@ -71,9 +71,6 @@ public abstract class FDropDownMenu extends FDropDown { @Override public boolean tap(float x, float y, int count) { super.tap(x, y, count); - if (getDropDownOwner() instanceof FSubMenu) { - return false; //return false so owning sub menu can be hidden - } - return true; + return !(getDropDownOwner() instanceof FSubMenu); //return false so owning sub menu can be hidden } } diff --git a/forge-gui-mobile/src/forge/menu/FMenuBar.java b/forge-gui-mobile/src/forge/menu/FMenuBar.java index bafe533c0ef..7b9f8f05b58 100644 --- a/forge-gui-mobile/src/forge/menu/FMenuBar.java +++ b/forge-gui-mobile/src/forge/menu/FMenuBar.java @@ -7,7 +7,7 @@ import forge.Graphics; import forge.screens.FScreen.Header; public class FMenuBar extends Header { - private final List tabs = new ArrayList(); + private final List tabs = new ArrayList<>(); public void addTab(String text0, FDropDown dropDown0) { FMenuTab tab = new FMenuTab(text0, this, dropDown0, tabs.size()); diff --git a/forge-gui-mobile/src/forge/screens/TabPageScreen.java b/forge-gui-mobile/src/forge/screens/TabPageScreen.java index dfc82512daf..64ab47cdb69 100644 --- a/forge-gui-mobile/src/forge/screens/TabPageScreen.java +++ b/forge-gui-mobile/src/forge/screens/TabPageScreen.java @@ -32,7 +32,7 @@ public class TabPageScreen> extends FScreen { } public TabPageScreen(TabPage[] tabPages0, boolean showBackButton) { - this(new TabHeader(tabPages0, showBackButton)); + this(new TabHeader<>(tabPages0, showBackButton)); } public TabPageScreen(TabHeader tabHeader0) { @@ -44,7 +44,7 @@ public class TabPageScreen> extends FScreen { public TabPageScreen(String headerCaption, FPopupMenu menu, TabPage[] tabPages0) { super(headerCaption, menu); - tabHeader = add(new TabHeader(tabPages0, false)); + tabHeader = add(new TabHeader<>(tabPages0, false)); tabHeader.showBottomBorder = false; tabPages = tabHeader.tabPages; initialize(); @@ -52,7 +52,7 @@ public class TabPageScreen> extends FScreen { public TabPageScreen(String headerCaption, FPopupMenu menu, TabPage[] tabPages0, boolean alwaysRenderHorizontal) { super(headerCaption, menu); - tabHeader = add(new TabHeader(tabPages0, false)); + tabHeader = add(new TabHeader<>(tabPages0, false)); tabHeader.showBottomBorder = false; tabHeader.alwaysRenderHorizontal = alwaysRenderHorizontal; tabPages = tabHeader.tabPages; diff --git a/forge-gui-mobile/src/forge/screens/achievements/AchievementsScreen.java b/forge-gui-mobile/src/forge/screens/achievements/AchievementsScreen.java index 990090d343d..509bb367179 100644 --- a/forge-gui-mobile/src/forge/screens/achievements/AchievementsScreen.java +++ b/forge-gui-mobile/src/forge/screens/achievements/AchievementsScreen.java @@ -45,7 +45,7 @@ public class AchievementsScreen extends FScreen { Forge.openScreen(achievementsScreen); } - private final FComboBox cbCollections = add(new FComboBox()); + private final FComboBox cbCollections = add(new FComboBox<>()); private final TrophyCase trophyCase = add(new TrophyCase()); private AchievementsScreen() { diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index c985b091fa4..1ddb4f0c318 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -55,9 +55,9 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { // Variants frame and variables private final FLabel lblVariants = new FLabel.Builder().text("Variants:").font(VARIANTS_FONT).build(); - private final FComboBox cbVariants = new FComboBox(); + private final FComboBox cbVariants = new FComboBox<>(); - private final List playerPanels = new ArrayList(MAX_PLAYERS); + private final List playerPanels = new ArrayList<>(MAX_PLAYERS); private final FScrollPane playersScroll = new FScrollPane() { @Override protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { @@ -87,7 +87,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { btnStart.setEnabled(false); //disable start button until decks loaded add(lblPlayers); - cbPlayerCount = add(new FComboBox()); + cbPlayerCount = add(new FComboBox<>()); cbPlayerCount.setFont(VARIANTS_FONT); for (int i = 2; i <= MAX_PLAYERS; i++) { cbPlayerCount.addItem(i); @@ -216,14 +216,14 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { cbVariants.setSelectedItem(appliedVariants.iterator().next()); } else { - String text = ""; + StringBuilder text = new StringBuilder(); for (GameType variantType : appliedVariants) { if (text.length() > 0) { - text += ", "; + text.append(", "); } - text += variantType.toString(); + text.append(variantType.toString()); } - cbVariants.setText(text); + cbVariants.setText(text.toString()); } } @@ -322,7 +322,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { } List getPlayerNames() { - List names = new ArrayList(); + List names = new ArrayList<>(); for (PlayerPanel pp : playerPanels) { names.add(pp.getPlayerName()); } @@ -341,7 +341,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { //========== Various listeners in build order private class MultiVariantSelect extends FScreen { - private final FList lstVariants = add(new FList()); + private final FList lstVariants = add(new FList<>()); private MultiVariantSelect() { super("Select Variants"); diff --git a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java index 146de6b6217..22a48093b2e 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java @@ -64,8 +64,8 @@ public class PlayerPanel extends FContainer { private final FToggleSwitch humanAiSwitch; private final FToggleSwitch devModeSwitch; - private FComboBox cbTeam = new FComboBox(); - private FComboBox cbArchenemyTeam = new FComboBox(); + private FComboBox cbTeam = new FComboBox<>(); + private FComboBox cbArchenemyTeam = new FComboBox<>(); private final FLabel btnDeck = new FLabel.ButtonBuilder().text("Loading Deck...").build(); private final FLabel btnSchemeDeck = new FLabel.ButtonBuilder().text("Scheme Deck: Random Generated Deck").build(); @@ -719,7 +719,7 @@ public class PlayerPanel extends FContainer { public Set getAiOptions() { return isSimulatedAi() ? ImmutableSet.of(AIOption.USE_SIMULATION) - : Collections.emptySet(); + : Collections.emptySet(); } private boolean isSimulatedAi() { return isAi() && useAiSimulation; diff --git a/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java b/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java index fd123f87f1f..a8a3cc58e6a 100644 --- a/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java +++ b/forge-gui-mobile/src/forge/screens/gauntlet/LoadGauntletScreen.java @@ -3,7 +3,6 @@ package forge.screens.gauntlet; import java.io.File; import java.text.NumberFormat; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; import com.badlogic.gdx.utils.Align; @@ -75,7 +74,7 @@ public class LoadGauntletScreen extends LaunchScreen { public void onActivate() { final File[] files = GauntletIO.getGauntletFilesUnlocked(null); - final List data = new ArrayList(); + final List data = new ArrayList<>(); for (final File f : files) { GauntletData gd = GauntletIO.loadGauntlet(f); @@ -138,7 +137,7 @@ public class LoadGauntletScreen extends LaunchScreen { @Override public void run() { final GauntletData gauntlet = FModel.getGauntletData(); - List players = new ArrayList(); + List players = new ArrayList<>(); RegisteredPlayer humanPlayer = new RegisteredPlayer(gauntlet.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); players.add(humanPlayer); players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); @@ -295,11 +294,9 @@ public class LoadGauntletScreen extends LaunchScreen { } public void refresh() { - List sorted = new ArrayList(); - for (GauntletData gauntlet : gauntlets) { - sorted.add(gauntlet); - } - Collections.sort(sorted, new Comparator() { + List sorted = new ArrayList<>(); + sorted.addAll(gauntlets); + sorted.sort(new Comparator() { @Override public int compare(final GauntletData x, final GauntletData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java b/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java index 869730c6237..ad7b5de1967 100644 --- a/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java +++ b/forge-gui-mobile/src/forge/screens/gauntlet/NewGauntletScreen.java @@ -81,9 +81,8 @@ public class NewGauntletScreen extends LaunchScreen { public void run(final Integer numOpponents) { if (numOpponents == null) { return; } - ListChooser chooser = new ListChooser( - "Choose allowed deck types for opponents", 0, 11, Arrays.asList(new DeckType[] { - DeckType.CUSTOM_DECK, + ListChooser chooser = new ListChooser<>( + "Choose allowed deck types for opponents", 0, 11, Arrays.asList(DeckType.CUSTOM_DECK, DeckType.PRECONSTRUCTED_DECK, DeckType.QUEST_OPPONENT_DECK, DeckType.COLOR_DECK, @@ -93,16 +92,19 @@ public class NewGauntletScreen extends LaunchScreen { DeckType.MODERN_CARDGEN_DECK, DeckType.LEGACY_CARDGEN_DECK, DeckType.VINTAGE_CARDGEN_DECK, - DeckType.THEME_DECK - }), null, new Callback>() { + DeckType.THEME_DECK), null, new Callback>() { @Override public void run(final List allowedDeckTypes) { - if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { return; } + if (allowedDeckTypes == null || allowedDeckTypes.isEmpty()) { + return; + } FDeckChooser.promptForDeck("Select Your Deck", GameType.Gauntlet, false, new Callback() { @Override public void run(Deck userDeck) { - if (userDeck == null) { return; } + if (userDeck == null) { + return; + } GauntletData gauntlet = GauntletUtil.createQuickGauntlet(userDeck, numOpponents, allowedDeckTypes, null); launchGauntlet(gauntlet); @@ -122,7 +124,7 @@ public class NewGauntletScreen extends LaunchScreen { if (numOpponents == null) { return; } GauntletData gauntlet = new GauntletData(); - gauntlet.setDecks(new ArrayList()); + gauntlet.setDecks(new ArrayList<>()); promptForAiDeck(gauntlet, numOpponents); } }); @@ -160,7 +162,7 @@ public class NewGauntletScreen extends LaunchScreen { private void createGauntletContest() { final File[] files = GauntletIO.getGauntletFilesLocked(); - final List contests = new ArrayList(); + final List contests = new ArrayList<>(); for (final File f : files) { GauntletData gd = GauntletIO.loadGauntlet(f); if (gd != null) { @@ -180,8 +182,8 @@ public class NewGauntletScreen extends LaunchScreen { //create copy of contest to use as gauntlet GauntletData gauntlet = new GauntletData(); - gauntlet.setDecks(new ArrayList(contest.getDecks())); - gauntlet.setEventNames(new ArrayList(contest.getEventNames())); + gauntlet.setDecks(new ArrayList<>(contest.getDecks())); + gauntlet.setEventNames(new ArrayList<>(contest.getEventNames())); gauntlet.setUserDeck(userDeck); GauntletUtil.setDefaultGauntletName(gauntlet, contest.getDisplayName() + "_"); launchGauntlet(gauntlet); @@ -197,7 +199,7 @@ public class NewGauntletScreen extends LaunchScreen { gauntlet.reset(); RegisteredPlayer humanPlayer = new RegisteredPlayer(gauntlet.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); - List players = new ArrayList(); + List players = new ArrayList<>(); players.add(humanPlayer); players.add(new RegisteredPlayer(gauntlet.getDecks().get(gauntlet.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); gauntlet.startRound(players, humanPlayer); diff --git a/forge-gui-mobile/src/forge/screens/home/HomeScreen.java b/forge-gui-mobile/src/forge/screens/home/HomeScreen.java index 2c415509921..6c124ff90a7 100644 --- a/forge-gui-mobile/src/forge/screens/home/HomeScreen.java +++ b/forge-gui-mobile/src/forge/screens/home/HomeScreen.java @@ -34,7 +34,7 @@ public class HomeScreen extends FScreen { private final FLabel lblLogo = add(new FLabel.Builder().icon(FSkinImage.LOGO).iconInBackground().iconScaleFactor(1).build()); private final ButtonScroller buttonScroller = add(new ButtonScroller()); - private final List buttons = new ArrayList(); + private final List buttons = new ArrayList<>(); private int activeButtonIndex, baseButtonCount; private FDeckChooser deckManager; diff --git a/forge-gui-mobile/src/forge/screens/home/LoadGameMenu.java b/forge-gui-mobile/src/forge/screens/home/LoadGameMenu.java index 1ff05bc4dfd..c38c3f6c48b 100644 --- a/forge-gui-mobile/src/forge/screens/home/LoadGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/home/LoadGameMenu.java @@ -32,7 +32,7 @@ public class LoadGameMenu extends FPopupMenu { private final Class screenClass; private FScreen screen; - private LoadGameScreen(final String caption0, final FImage icon0, final Class screenClass0) { + LoadGameScreen(final String caption0, final FImage icon0, final Class screenClass0) { screenClass = screenClass0; item = new FMenuItem(caption0, icon0, new FEventHandler() { @Override diff --git a/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java b/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java index e1756cf2434..0bd6829888b 100644 --- a/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java @@ -36,7 +36,7 @@ public class NewGameMenu extends FPopupMenu { private final Class screenClass; private FScreen screen; - private NewGameScreen(final String caption0, final FImage icon0, final Class screenClass0) { + NewGameScreen(final String caption0, final FImage icon0, final Class screenClass0) { screenClass = screenClass0; item = new FMenuItem(caption0, icon0, new FEventHandler() { @Override diff --git a/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java b/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java index a028396bcba..b3ee50cfb08 100644 --- a/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/LoadDraftScreen.java @@ -43,7 +43,7 @@ public class LoadDraftScreen extends LaunchScreen { private final FSkinFont GAME_MODE_FONT= FSkinFont.get(12); private final FLabel lblMode = add(new FLabel.Builder().text("Mode:").font(GAME_MODE_FONT).build()); - private final FComboBox cbMode = add(new FComboBox()); + private final FComboBox cbMode = add(new FComboBox<>()); public LoadDraftScreen() { super(null, LoadGameMenu.getMenu()); @@ -153,7 +153,7 @@ public class LoadDraftScreen extends LaunchScreen { return; } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java b/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java index c954b90a6f8..421bffd268e 100644 --- a/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java +++ b/forge-gui-mobile/src/forge/screens/limited/LoadSealedScreen.java @@ -43,7 +43,7 @@ public class LoadSealedScreen extends LaunchScreen { private final FSkinFont GAME_MODE_FONT= FSkinFont.get(12); private final FLabel lblMode = add(new FLabel.Builder().text("Mode:").font(GAME_MODE_FONT).build()); - private final FComboBox cbMode = add(new FComboBox()); + private final FComboBox cbMode = add(new FComboBox<>()); public LoadSealedScreen() { super(null, LoadGameMenu.getMenu()); @@ -146,7 +146,7 @@ public class LoadSealedScreen extends LaunchScreen { LoadingOverlay.show("Loading new game...", new Runnable() { @Override public void run() { - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 83a9c1d5a65..8e3727a03e4 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -65,7 +65,7 @@ public class MatchController extends AbstractGuiGame { private MatchController() { } public static final MatchController instance = new MatchController(); - private static final Map avatarImages = new HashMap(); + private static final Map avatarImages = new HashMap<>(); private static HostedMatch hostedMatch; private static MatchScreen view; @@ -116,7 +116,7 @@ public class MatchController extends AbstractGuiGame { final boolean noHumans = !hasLocalPlayers(); final FCollectionView allPlayers = getGameView().getPlayers(); - final List playerPanels = new ArrayList(); + final List playerPanels = new ArrayList<>(); for (final PlayerView p : allPlayers) { final boolean isLocal = isLocalPlayer(p); final VPlayerPanel playerPanel = new VPlayerPanel(p, isLocal || noHumans, allPlayers.size()); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 3f08f076fd0..945f470ebae 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -330,7 +330,7 @@ public class MatchScreen extends FScreen { if (game == null) { return; } //draw arrows for paired cards - Set pairedCards = new HashSet(); + Set pairedCards = new HashSet<>(); for (VPlayerPanel playerPanel : playerPanels.values()) { for (CardView card : playerPanel.getField().getRow1().getOrderedCards()) { if (pairedCards.contains(card)) { continue; } //prevent arrows going both ways @@ -505,14 +505,26 @@ public class MatchScreen extends FScreen { float x = topPlayerPanel.getField().getLeft(); float y = midField - topPlayerPanel.getField().getHeight(); float w = getWidth() - x; - + float bgFullWidth, scaledbgHeight; + int multiplier = playerPanels.keySet().size() - 1; //fix scaling of background when zoomed in multiplayer + float bgHeight = (midField + bottomPlayerPanel.getField().getHeight() * multiplier) - y; if(FModel.getPreferences().getPrefBoolean(FPref.UI_DYNAMIC_PLANECHASE_BG) - && hasActivePlane()) - setPlanarBG(g, getPlaneName(), x, y, w, midField); + && hasActivePlane()) { + String imageName = getPlaneName() + .replace(" ", "_") + .replace("'", "") + .replace("-", ""); + if (FSkinTexture.getValues().contains(imageName)) { + bgFullWidth = bgHeight * FSkinTexture.valueOf(imageName).getWidth() / FSkinTexture.valueOf(imageName).getHeight(); + if (bgFullWidth < w) { + scaledbgHeight = w * (bgHeight / bgFullWidth); + bgFullWidth = w; + bgHeight = scaledbgHeight; + } + g.drawImage(FSkinTexture.valueOf(imageName), x + (w - bgFullWidth) / 2, y, bgFullWidth, bgHeight, true); + } + } else { - float bgFullWidth; - float scaledbgHeight; - float bgHeight = midField + bottomPlayerPanel.getField().getHeight() - y; bgFullWidth = bgHeight * FSkinTexture.BG_MATCH.getWidth() / FSkinTexture.BG_MATCH.getHeight(); if (bgFullWidth < w) { scaledbgHeight = w * (bgHeight / bgFullWidth); @@ -605,7 +617,7 @@ public class MatchScreen extends FScreen { y += oldScrollTop - VAvatar.HEIGHT; //build map of all horizontal scroll panes and their current scrollWidths and adjusted X values - Map> horzScrollPanes = new HashMap>(); + Map> horzScrollPanes = new HashMap<>(); backupHorzScrollPanes(topPlayerPanel, x, horzScrollPanes); backupHorzScrollPanes(bottomPlayerPanel, x, horzScrollPanes); @@ -657,802 +669,5 @@ public class MatchScreen extends FScreen { } return false; } - private void setPlanarBG(Graphics g, String planeName, float x, float y, float w, float midField ){ - float planeFullWidth; - float scaledPlaneHeight; - float planeHeight = midField + bottomPlayerPanel.getField().getHeight() - y; - switch (planeName) { - case "Academy at Tolaria West": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE1.getWidth() / FSkinTexture.BG_PLANE1.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE1, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Agyrem": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE2.getWidth() / FSkinTexture.BG_PLANE2.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE2, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Akoum": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE3.getWidth() / FSkinTexture.BG_PLANE3.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE3, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Aretopolis": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE4.getWidth() / FSkinTexture.BG_PLANE4.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE4, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Astral Arena": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE5.getWidth() / FSkinTexture.BG_PLANE5.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE5, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Bant": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE6.getWidth() / FSkinTexture.BG_PLANE6.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE6, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Bloodhill Bastion": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE7.getWidth() / FSkinTexture.BG_PLANE7.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE7, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Cliffside Market": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE8.getWidth() / FSkinTexture.BG_PLANE8.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE8, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Edge of Malacol": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE9.getWidth() / FSkinTexture.BG_PLANE9.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE9, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Eloren Wilds": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE10.getWidth() / FSkinTexture.BG_PLANE10.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE10, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Feeding Grounds": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE11.getWidth() / FSkinTexture.BG_PLANE11.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE11, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Fields of Summer": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE12.getWidth() / FSkinTexture.BG_PLANE12.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE12, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Furnace Layer": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE13.getWidth() / FSkinTexture.BG_PLANE13.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE13, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Gavony": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE14.getWidth() / FSkinTexture.BG_PLANE14.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE14, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Glen Elendra": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE15.getWidth() / FSkinTexture.BG_PLANE15.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE15, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Glimmervoid Basin": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE16.getWidth() / FSkinTexture.BG_PLANE16.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE16, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Goldmeadow": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE17.getWidth() / FSkinTexture.BG_PLANE17.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE17, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Grand Ossuary": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE18.getWidth() / FSkinTexture.BG_PLANE18.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE18, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Grixis": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE19.getWidth() / FSkinTexture.BG_PLANE19.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE19, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Grove of the Dreampods": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE20.getWidth() / FSkinTexture.BG_PLANE20.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE20, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Hedron Fields of Agadeem": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE21.getWidth() / FSkinTexture.BG_PLANE21.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE21, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Immersturm": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE22.getWidth() / FSkinTexture.BG_PLANE22.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE22, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Isle of Vesuva": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE23.getWidth() / FSkinTexture.BG_PLANE23.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE23, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Izzet Steam Maze": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE24.getWidth() / FSkinTexture.BG_PLANE24.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE24, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Jund": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE25.getWidth() / FSkinTexture.BG_PLANE25.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE25, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Kessig": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE26.getWidth() / FSkinTexture.BG_PLANE26.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE26, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Kharasha Foothills": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE27.getWidth() / FSkinTexture.BG_PLANE27.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE27, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Kilnspire District": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE28.getWidth() / FSkinTexture.BG_PLANE28.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE28, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Krosa": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE29.getWidth() / FSkinTexture.BG_PLANE29.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE29, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Lair of the Ashen Idol": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE30.getWidth() / FSkinTexture.BG_PLANE30.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE30, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Lethe Lake": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE31.getWidth() / FSkinTexture.BG_PLANE31.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE31, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Llanowar": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE32.getWidth() / FSkinTexture.BG_PLANE32.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE32, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Minamo": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE33.getWidth() / FSkinTexture.BG_PLANE33.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE33, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Mount Keralia": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE34.getWidth() / FSkinTexture.BG_PLANE34.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE34, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Murasa": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE35.getWidth() / FSkinTexture.BG_PLANE35.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE35, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Naar Isle": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE36.getWidth() / FSkinTexture.BG_PLANE36.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE36, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Naya": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE37.getWidth() / FSkinTexture.BG_PLANE37.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE37, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Nephalia": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE38.getWidth() / FSkinTexture.BG_PLANE38.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE38, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Norn's Dominion": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE39.getWidth() / FSkinTexture.BG_PLANE39.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE39, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Onakke Catacomb": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE40.getWidth() / FSkinTexture.BG_PLANE40.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE40, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Orochi Colony": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE41.getWidth() / FSkinTexture.BG_PLANE41.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE41, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Orzhova": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE42.getWidth() / FSkinTexture.BG_PLANE42.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE42, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Otaria": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE43.getWidth() / FSkinTexture.BG_PLANE43.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE43, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Panopticon": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE44.getWidth() / FSkinTexture.BG_PLANE44.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE44, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Pools of Becoming": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE45.getWidth() / FSkinTexture.BG_PLANE45.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE45, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Prahv": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE46.getWidth() / FSkinTexture.BG_PLANE46.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE46, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Quicksilver Sea": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE47.getWidth() / FSkinTexture.BG_PLANE47.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE47, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Raven's Run": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE48.getWidth() / FSkinTexture.BG_PLANE48.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE48, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Sanctum of Serra": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE49.getWidth() / FSkinTexture.BG_PLANE49.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE49, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Sea of Sand": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE50.getWidth() / FSkinTexture.BG_PLANE50.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE50, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Selesnya Loft Gardens": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE51.getWidth() / FSkinTexture.BG_PLANE51.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE51, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Shiv": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE52.getWidth() / FSkinTexture.BG_PLANE52.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE52, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Skybreen": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE53.getWidth() / FSkinTexture.BG_PLANE53.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE53, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Sokenzan": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE54.getWidth() / FSkinTexture.BG_PLANE54.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE54, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Stairs to Infinity": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE55.getWidth() / FSkinTexture.BG_PLANE55.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE55, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Stensia": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE56.getWidth() / FSkinTexture.BG_PLANE56.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE56, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Stronghold Furnace": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE57.getWidth() / FSkinTexture.BG_PLANE57.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE57, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Takenuma": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE58.getWidth() / FSkinTexture.BG_PLANE58.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE58, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Tazeem": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE59.getWidth() / FSkinTexture.BG_PLANE59.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE59, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "The Aether Flues": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE60.getWidth() / FSkinTexture.BG_PLANE60.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE60, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "The Dark Barony": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE61.getWidth() / FSkinTexture.BG_PLANE61.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE61, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "The Eon Fog": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE62.getWidth() / FSkinTexture.BG_PLANE62.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE62, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "The Fourth Sphere": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE63.getWidth() / FSkinTexture.BG_PLANE63.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE63, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "The Great Forest": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE64.getWidth() / FSkinTexture.BG_PLANE64.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE64, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "The Hippodrome": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE65.getWidth() / FSkinTexture.BG_PLANE65.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE65, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "The Maelstrom": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE66.getWidth() / FSkinTexture.BG_PLANE66.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE66, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "The Zephyr Maze": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE67.getWidth() / FSkinTexture.BG_PLANE67.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE67, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Trail of the Mage-Rings": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE68.getWidth() / FSkinTexture.BG_PLANE68.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE68, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Truga Jungle": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE69.getWidth() / FSkinTexture.BG_PLANE69.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE69, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Turri Island": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE70.getWidth() / FSkinTexture.BG_PLANE70.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE70, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Undercity Reaches": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE71.getWidth() / FSkinTexture.BG_PLANE71.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE71, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Velis Vel": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE72.getWidth() / FSkinTexture.BG_PLANE72.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE72, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Windriddle Palaces": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE73.getWidth() / FSkinTexture.BG_PLANE73.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE73, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Tember City": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE74.getWidth() / FSkinTexture.BG_PLANE74.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE74, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Celestine Reef": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE75.getWidth() / FSkinTexture.BG_PLANE75.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE75, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Horizon Boughs": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE76.getWidth() / FSkinTexture.BG_PLANE76.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE76, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Mirrored Depths": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE77.getWidth() / FSkinTexture.BG_PLANE77.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE77, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - case "Talon Gates": { - planeFullWidth = planeHeight * FSkinTexture.BG_PLANE78.getWidth() / FSkinTexture.BG_PLANE78.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_PLANE78, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - break; - - default: { - planeFullWidth = planeHeight * FSkinTexture.BG_MATCH.getWidth() / FSkinTexture.BG_MATCH.getHeight(); - if (planeFullWidth < w) { - scaledPlaneHeight = w * (planeHeight / planeFullWidth); - planeFullWidth = w; - planeHeight = scaledPlaneHeight; - } - g.drawImage(FSkinTexture.BG_MATCH, x + (w - planeFullWidth) / 2, y, planeFullWidth, planeHeight); - } - } - } } } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java index 9e7a089d1cb..7ea91363826 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java @@ -71,8 +71,8 @@ public class VAssignDamage extends FDialog { private final DefendersPanel pnlDefenders; // Indexes of defenders correspond to their indexes in the damage list and labels. - private final List defenders = new ArrayList(); // NULL in this map means defender - private final Map damage = new HashMap(); // NULL in this map means defender + private final List defenders = new ArrayList<>(); // NULL in this map means defender + private final Map damage = new HashMap<>(); // NULL in this map means defender private boolean canAssignTo(CardView card) { for (DamageTarget dt : defenders) { @@ -456,7 +456,7 @@ public class VAssignDamage extends FDialog { } public Map getDamageMap() { - Map result = new HashMap(); + Map result = new HashMap<>(); for (DamageTarget dt : defenders) { result.put(dt.card, dt.damage); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java b/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java index 4c82e4e0698..5ce1d4adddf 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java @@ -18,7 +18,7 @@ public class VAutoYields extends FDialog { public VAutoYields() { super("Auto-Yields", 2); - List autoYields = new ArrayList(); + List autoYields = new ArrayList<>(); for (String autoYield : MatchController.instance.getAutoYields()) { autoYields.add(autoYield); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 9978aec28c2..87ef2206087 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -22,8 +22,8 @@ import forge.util.ThreadUtil; public abstract class VCardDisplayArea extends VDisplayArea implements ActivateHandler { private static final float CARD_STACK_OFFSET = 0.2f; - protected final List orderedCards = new ArrayList(); - protected final List cardPanels = new ArrayList(); + protected final List orderedCards = new ArrayList<>(); + protected final List cardPanels = new ArrayList<>(); private boolean rotateCards180; public Iterable getOrderedCards() { @@ -206,7 +206,7 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH } public static class CardAreaPanel extends FCardPanel { - private static final Map allCardPanels = new HashMap(); + private static final Map allCardPanels = new HashMap<>(); public static CardAreaPanel get(CardView card0) { CardAreaPanel cardPanel = allCardPanels.get(card0.getId()); @@ -230,7 +230,7 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH private VCardDisplayArea displayArea; private CardAreaPanel attachedToPanel; - private final List attachedPanels = new ArrayList(); + private final List attachedPanels = new ArrayList<>(); private CardAreaPanel nextPanelInStack, prevPanelInStack; //use static get(card) function instead @@ -404,7 +404,7 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH //on double-tap select all other cards in stack if any if (prevPanelInStack == null && nextPanelInStack == null) { return null; } - List cards = new ArrayList(); + List cards = new ArrayList<>(); CardAreaPanel panel = nextPanelInStack; while (panel != null) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VField.java b/forge-gui-mobile/src/forge/screens/match/views/VField.java index b4aabc6c657..583fecb2710 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VField.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VField.java @@ -30,7 +30,7 @@ public class VField extends FContainer { } public Iterable getCardPanels() { - List cardPanels = new ArrayList(); + List cardPanels = new ArrayList<>(); for (CardAreaPanel cardPanel : row1.getCardPanels()) { cardPanels.add(cardPanel); } @@ -60,9 +60,9 @@ public class VField extends FContainer { cardPanel.setPrevPanelInStack(null); } - List creatures = new ArrayList(); - List lands = new ArrayList(); - List otherPermanents = new ArrayList(); + List creatures = new ArrayList<>(); + List lands = new ArrayList<>(); + List otherPermanents = new ArrayList<>(); for (CardView card : model) { CardAreaPanel cardPanel = CardAreaPanel.get(card); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java index 438aa86b37b..8cd0246b6fa 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java @@ -23,7 +23,7 @@ public class VManaPool extends VDisplayArea { private static final FSkinFont FONT = FSkinFont.get(16); private final PlayerView player; - private final List manaLabels = new ArrayList(); + private final List manaLabels = new ArrayList<>(); private int totalMana; public VManaPool(PlayerView player0) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPhaseIndicator.java b/forge-gui-mobile/src/forge/screens/match/views/VPhaseIndicator.java index 0194566606d..cf2724d538b 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPhaseIndicator.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPhaseIndicator.java @@ -21,7 +21,7 @@ public class VPhaseIndicator extends FContainer { public static final float PADDING_X = Utils.scale(1); public static final float PADDING_Y = Utils.scale(2); - private final Map phaseLabels = new HashMap(); + private final Map phaseLabels = new HashMap<>(); private FSkinFont font; public VPhaseIndicator() { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index 24deacce607..870e99ffdb0 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -42,8 +42,8 @@ public class VPlayerPanel extends FContainer { private final VZoneDisplay commandZone; private final LifeLabel lblLife; private final InfoTab tabManaPool; - private final Map zoneTabs = new HashMap(); - private final List tabs = new ArrayList(); + private final Map zoneTabs = new HashMap<>(); + private final List tabs = new ArrayList<>(); private InfoTab selectedTab; private float avatarHeight = VAvatar.HEIGHT; private float displayAreaHeightFactor = 1.0f; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index c72bcf226e3..100b9cc46b2 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -69,8 +69,8 @@ public class VStack extends FDropDown { private void revealTargetZones() { if (activeStackInstance == null) { return; } - final Set zones = new HashSet(); - playersWithValidTargets = new HashMap(); + final Set zones = new HashSet<>(); + playersWithValidTargets = new HashMap<>(); for (final CardView c : activeStackInstance.getTargetCards()) { if (c.getZone() != null) { zones.add(c.getZone()); @@ -325,7 +325,7 @@ public class VStack extends FDropDown { CardZoom.show(stackInstance.getSourceCard()); } })); - }; + } }; menu.show(this, x, y); diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java index c0dcc042f66..69d634cd9e5 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java @@ -52,17 +52,16 @@ public class GauntletWinLose extends ControlWinLose { if (!lstEventNames.isEmpty()) { for (int i = 0; i < len; i++) { if (i <= num) { - sb.append((i + 1) + ". " + lstEventNames.get(i) - + " (" + lstEventRecords.get(i) + ")\n"); + sb.append(i + 1).append(". ").append(lstEventNames.get(i)).append(" (").append(lstEventRecords.get(i)).append(")\n"); } else { - sb.append((i + 1) + ". ??????\n"); + sb.append(i + 1).append(". ??????\n"); } } } if (message1 != null) { sb.append("\n"); - sb.append(message1 + "\n\n"); + sb.append(message1).append("\n\n"); sb.append(message2); } else { diff --git a/forge-gui-mobile/src/forge/screens/online/OnlineMenu.java b/forge-gui-mobile/src/forge/screens/online/OnlineMenu.java index 7b7dcf882cb..f796b3d55d3 100644 --- a/forge-gui-mobile/src/forge/screens/online/OnlineMenu.java +++ b/forge-gui-mobile/src/forge/screens/online/OnlineMenu.java @@ -21,7 +21,7 @@ public class OnlineMenu extends FPopupMenu { private final Class screenClass; private FScreen screen; - private OnlineScreen(final String caption0, final FImage icon0, final Class screenClass0) { + OnlineScreen(final String caption0, final FImage icon0, final Class screenClass0) { screenClass = screenClass0; item = new FMenuItem(caption0, icon0, new FEventHandler() { @Override diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestCommandersScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestCommandersScreen.java index 034b9b10131..d314ed0bf99 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestCommandersScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestCommandersScreen.java @@ -166,12 +166,12 @@ public class ConquestCommandersScreen extends FScreen { @Override protected TextSearchFilter createSearchFilter() { - return new TextSearchFilter(this); + return new TextSearchFilter<>(this); } @Override protected AdvancedSearchFilter createAdvancedSearchFilter() { - return new AdvancedSearchFilter(this); + return new AdvancedSearchFilter<>(this); } @Override diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java index 2cf70553e1a..892c37c9131 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestRewardDialog.java @@ -5,6 +5,7 @@ import java.util.List; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.utils.Align; +import forge.Forge; import forge.Graphics; import forge.ImageKeys; import forge.animation.ForgeAnimation; @@ -28,7 +29,7 @@ public class ConquestRewardDialog extends FScrollPane { private static final float PADDING = Utils.scale(5); public static void show(String title, PaperCard card, Runnable callback0) { - List rewards = new ArrayList(1); + List rewards = new ArrayList<>(1); rewards.add(new ConquestReward(card, 0)); show(title, rewards, callback0); } @@ -38,7 +39,7 @@ public class ConquestRewardDialog extends FScrollPane { } private final RevealDialog dialog; - private final List cardRevealers = new ArrayList(); + private final List cardRevealers = new ArrayList<>(); private final CardRevealAnimation animation; private final Runnable callback; @@ -60,10 +61,22 @@ public class ConquestRewardDialog extends FScrollPane { columnCount = 1; } else if (cardCount < 5) { - columnCount = 2; + if (Forge.extrawide.equals("default")) + columnCount = 2; + else { + if (cardCount == 4) + columnCount = 4; + else + columnCount = 3; + } } else { - columnCount = 3; + if (Forge.extrawide.equals("extrawide")) + columnCount = 5; + else if (Forge.extrawide.equals("wide")) + columnCount = 4; + else + columnCount = 3; } animation = new CardRevealAnimation(); @@ -230,7 +243,10 @@ public class ConquestRewardDialog extends FScrollPane { //ensure current card in view if (getScrollHeight() > getHeight() && index < cardCount) { CardRevealer currentCard = cardRevealers.get(index); - scrollIntoView(currentCard, currentCard.getHeight() / 2 + PADDING); //show half of the card below + if (!Forge.extrawide.equals("default")) + scrollIntoView(currentCard, currentCard.getHeight() / (columnCount * PADDING) / 2); + else + scrollIntoView(currentCard, currentCard.getHeight() / 2 + PADDING); //show half of the card below } } @@ -287,7 +303,7 @@ public class ConquestRewardDialog extends FScrollPane { private boolean showCardZoom() { int index = -1; - List cards = new ArrayList(); + List cards = new ArrayList<>(); for (int i = 0; i < animation.currentIndex; i++) { CardRevealer revealer = cardRevealers.get(i); if (revealer == this) { diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java index abd6a461c70..6075299a5f6 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java @@ -22,7 +22,7 @@ import forge.util.Utils; public class ConquestStatsScreen extends FScreen implements IVConquestStats { private static final float PADDING = Utils.scale(5f); - private final FComboBox cbPlanes = add(new FComboBox()); + private final FComboBox cbPlanes = add(new FComboBox<>()); private final FScrollPane scroller = add(new FScrollPane() { @Override protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java index 581d7e47504..e11ce520ca0 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java @@ -2,7 +2,6 @@ package forge.screens.planarconquest; import java.io.File; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -12,6 +11,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Align; import forge.FThreads; +import forge.Forge; import forge.Graphics; import forge.assets.FSkinColor; import forge.assets.FSkinColor.Colors; @@ -93,7 +93,7 @@ public class LoadConquestScreen extends LaunchScreen { final File dirConquests = new File(ForgeConstants.CONQUEST_SAVE_DIR); final ConquestController qc = FModel.getConquest(); - Map arrConquests = new HashMap(); + Map arrConquests = new HashMap<>(); if (dirConquests.listFiles() != null) { for (File f : dirConquests.listFiles()) { if (f.isDirectory()) { @@ -104,7 +104,7 @@ public class LoadConquestScreen extends LaunchScreen { } // Populate list with available conquest data. - lstConquests.setConquests(new ArrayList(arrConquests.values())); + lstConquests.setConquests(new ArrayList<>(arrConquests.values())); // If there are quests available, force select. if (arrConquests.size() > 0) { @@ -149,7 +149,7 @@ public class LoadConquestScreen extends LaunchScreen { @Override protected void drawBackground(Graphics g) { super.drawBackground(g); - float y = getHeader().getBottom(); + float y = Forge.isLandscapeMode() ? 0 : getHeader().getBottom(); g.fillRect(OLD_CONQUESTS_BACK_COLOR, 0, y, lstConquests.getWidth(), lstConquests.getTop() - y); } @@ -333,11 +333,9 @@ public class LoadConquestScreen extends LaunchScreen { } public void setConquests(List qd0) { - List sorted = new ArrayList(); - for (ConquestData qd : qd0) { - sorted.add(qd); - } - Collections.sort(sorted, new Comparator() { + List sorted = new ArrayList<>(); + sorted.addAll(qd0); + sorted.sort(new Comparator() { @Override public int compare(final ConquestData x, final ConquestData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java index c17ba142e31..23ccaaf97bf 100644 --- a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java @@ -4,7 +4,6 @@ import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -102,7 +101,7 @@ public class LoadQuestScreen extends LaunchScreen { } }; File[] arrFiles = dirQuests.listFiles(takeDatFiles); - Map arrQuests = new HashMap(); + Map arrQuests = new HashMap<>(); for (File f : arrFiles) { try { arrQuests.put(f.getName(), QuestDataIO.loadData(f)); @@ -114,7 +113,7 @@ public class LoadQuestScreen extends LaunchScreen { } // Populate list with available quest data. - lstQuests.setQuests(new ArrayList(arrQuests.values())); + lstQuests.setQuests(new ArrayList<>(arrQuests.values())); // If there are quests available, force select. if (arrQuests.size() > 0) { @@ -335,11 +334,9 @@ public class LoadQuestScreen extends LaunchScreen { } public void setQuests(List qd0) { - List sorted = new ArrayList(); - for (QuestData qd : qd0) { - sorted.add(qd); - } - Collections.sort(sorted, new Comparator() { + List sorted = new ArrayList<>(); + sorted.addAll(qd0); + sorted.sort(new Comparator() { @Override public int compare(final QuestData x, final QuestData y) { return x.getName().toLowerCase().compareTo(y.getName().toLowerCase()); diff --git a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java index a93827e7edf..83293de0bb7 100644 --- a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java @@ -111,7 +111,7 @@ public class NewQuestScreen extends FScreen { @SuppressWarnings("unused") private final FLabel lblStartingWorld = scroller.add(new FLabel.Builder().text("Starting world:").build()); - private final FComboBox cbxStartingWorld = scroller.add(new FComboBox()); + private final FComboBox cbxStartingWorld = scroller.add(new FComboBox<>()); @SuppressWarnings("unused") private final FLabel lblDifficulty = scroller.add(new FLabel.Builder().text("Difficulty:").build()); @@ -119,18 +119,18 @@ public class NewQuestScreen extends FScreen { @SuppressWarnings("unused") private final FLabel lblStartingPool = scroller.add(new FLabel.Builder().text("Starting pool:").build()); - private final FComboBox cbxStartingPool = scroller.add(new FComboBox()); + private final FComboBox cbxStartingPool = scroller.add(new FComboBox<>()); private final FLabel lblUnrestricted = scroller.add(new FLabel.Builder().align(Align.right).font(FSkinFont.get(12)).text("All cards will be available to play.").build()); private final FLabel lblPreconDeck = scroller.add(new FLabel.Builder().text("Starter/Event deck:").build()); - private final FComboBox cbxPreconDeck = scroller.add(new FComboBox()); + private final FComboBox cbxPreconDeck = scroller.add(new FComboBox<>()); private final FLabel lblFormat = scroller.add(new FLabel.Builder().text("Select format:").build()); - private final FComboBox cbxFormat = scroller.add(new FComboBox()); + private final FComboBox cbxFormat = scroller.add(new FComboBox<>()); private final FLabel lblCustomDeck = scroller.add(new FLabel.Builder().text("Custom deck:").build()); - private final FComboBox cbxCustomDeck = scroller.add(new FComboBox()); + private final FComboBox cbxCustomDeck = scroller.add(new FComboBox<>()); private final FLabel btnSelectFormat = scroller.add(new FLabel.ButtonBuilder().text("Choose format").build()); @@ -159,7 +159,7 @@ public class NewQuestScreen extends FScreen { private final FComboBox cbxPrizedCards = scroller.add(new FComboBox<>()); private final FLabel lblPrizeFormat = scroller.add(new FLabel.Builder().text("Defined format:").build()); - private final FComboBox cbxPrizeFormat = scroller.add(new FComboBox()); + private final FComboBox cbxPrizeFormat = scroller.add(new FComboBox<>()); private final FLabel lblPrizeUnrestricted = scroller.add(new FLabel.Builder().align(Align.right).font(FSkinFont.get(12)).text("All cards will be available to win.").build()); private final FLabel lblPrizeSameAsStarting = scroller.add(new FLabel.Builder().align(Align.right).font(FSkinFont.get(12)).text("Only sets found in starting pool will be available.").build()); diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestDeckEditor.java b/forge-gui-mobile/src/forge/screens/quest/QuestDeckEditor.java index 6e1bad5d4e8..81fa5b1035a 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestDeckEditor.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestDeckEditor.java @@ -27,7 +27,7 @@ public class QuestDeckEditor extends FDeckEditor { @Override protected Map getColOverrides(ItemManagerConfig config) { - Map colOverrides = new HashMap(); + Map colOverrides = new HashMap<>(); switch (config) { case QUEST_EDITOR_POOL: ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java index dab3d7d1892..95e14a8d26d 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java @@ -235,7 +235,7 @@ public class QuestSpellShopScreen extends TabPageScreen { FThreads.invokeInBackgroundThread(new Runnable() { @Override public void run() { - ItemPool items = new ItemPool(InventoryItem.class); + ItemPool items = new ItemPool<>(InventoryItem.class); items.add(item, result); activateItems(items); FThreads.invokeInEdtLater(new Runnable() { @@ -284,7 +284,7 @@ public class QuestSpellShopScreen extends TabPageScreen { @Override protected void refresh() { - Map colOverrides = new HashMap(); + Map colOverrides = new HashMap<>(); ItemColumn.addColOverride(ItemManagerConfig.SPELL_SHOP, colOverrides, ColumnDef.PRICE, QuestSpellShop.fnPriceCompare, QuestSpellShop.fnPriceGet); ItemColumn.addColOverride(ItemManagerConfig.SPELL_SHOP, colOverrides, ColumnDef.OWNED, FModel.getQuest().getCards().getFnOwnedCompare(), FModel.getQuest().getCards().getFnOwnedGet()); itemManager.setup(ItemManagerConfig.SPELL_SHOP, colOverrides); @@ -341,13 +341,13 @@ public class QuestSpellShopScreen extends TabPageScreen { @Override protected void refresh() { - Map colOverrides = new HashMap(); + Map colOverrides = new HashMap<>(); ItemColumn.addColOverride(ItemManagerConfig.QUEST_INVENTORY, colOverrides, ColumnDef.PRICE, QuestSpellShop.fnPriceCompare, QuestSpellShop.fnPriceSellGet); ItemColumn.addColOverride(ItemManagerConfig.QUEST_INVENTORY, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); ItemColumn.addColOverride(ItemManagerConfig.QUEST_INVENTORY, colOverrides, ColumnDef.DECKS, QuestSpellShop.fnDeckCompare, QuestSpellShop.fnDeckGet); itemManager.setup(ItemManagerConfig.QUEST_INVENTORY, colOverrides); - final ItemPool ownedItems = new ItemPool(InventoryItem.class); + final ItemPool ownedItems = new ItemPool<>(InventoryItem.class); ownedItems.addAllOfType(FModel.getQuest().getCards().getCardpool().getView()); itemManager.setPool(ownedItems); } diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java index 7840e135436..5538964468f 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java @@ -48,8 +48,8 @@ public class QuestStatsScreen extends FScreen { private final FLabel lblWinStreak = scroller.add(new StatLabel(FSkinImage.QUEST_PLUSPLUS)); private final FLabel lblLife = scroller.add(new StatLabel(FSkinImage.QUEST_LIFE)); private final FLabel lblWorld = scroller.add(new StatLabel(FSkinImage.QUEST_MAP)); - private final FComboBox cbxPet = scroller.add(new FComboBox()); - private final FComboBox cbxMatchLength = scroller.add(new FComboBox()); + private final FComboBox cbxPet = scroller.add(new FComboBox<>()); + private final FComboBox cbxMatchLength = scroller.add(new FComboBox<>()); private final FCheckBox cbPlant = scroller.add(new FCheckBox("Summon Plant")); private final FLabel lblZep = scroller.add(new FLabel.Builder().text("Launch Zeppelin").icon(FSkinImage.QUEST_ZEP).font(FSkinFont.get(16)).opaque().build()); diff --git a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java index 2120288df18..4f4367b646f 100644 --- a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java @@ -19,7 +19,7 @@ import forge.toolbox.FOptionPane; import forge.util.Callback; public class FilesPage extends TabPage { - private final FGroupList lstItems = add(new FGroupList()); + private final FGroupList lstItems = add(new FGroupList<>()); protected FilesPage() { super("Files", FSkinImage.OPEN); diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index c558505413f..13b0dbe6720 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -29,10 +29,11 @@ import forge.util.Callback; import forge.util.Utils; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class SettingsPage extends TabPage { - private final FGroupList lstSettings = add(new FGroupList()); + private final FGroupList lstSettings = add(new FGroupList<>()); public SettingsPage() { super("Settings", FSkinImage.SETTINGS); @@ -397,14 +398,12 @@ public class SettingsPage extends TabPage { } private class CustomSelectSetting extends Setting { - private final List options = new ArrayList(); + private final List options = new ArrayList<>(); public CustomSelectSetting(FPref pref0, String label0, String description0, String[] options0) { super(pref0, label0 + ":", description0); - for (String option : options0) { - options.add(option); - } + options.addAll(Arrays.asList(options0)); } public CustomSelectSetting(FPref pref0, String label0, String description0, Iterable options0) { super(pref0, label0 + ":", description0); @@ -437,7 +436,7 @@ public class SettingsPage extends TabPage { private CustomSelectScreen() { super("Select " + label.substring(0, label.length() - 1)); - lstOptions = add(new FList(options)); + lstOptions = add(new FList<>(options)); lstOptions.setListItemRenderer(new FList.DefaultListItemRenderer() { @Override public boolean tap(Integer index, String value, float x, float y, int count) { diff --git a/forge-gui-mobile/src/forge/sound/AudioClip.java b/forge-gui-mobile/src/forge/sound/AudioClip.java index e7ec8c305f0..792125836d5 100644 --- a/forge-gui-mobile/src/forge/sound/AudioClip.java +++ b/forge-gui-mobile/src/forge/sound/AudioClip.java @@ -74,9 +74,6 @@ public class AudioClip implements IAudioClip { } public final boolean isDone() { - if (clip == null) { - return false; - } - return true; //TODO: Make this smarter if Sound supports marking as done + return clip != null;//TODO: Make this smarter if Sound supports marking as done } } diff --git a/forge-gui-mobile/src/forge/toolbox/DualListBox.java b/forge-gui-mobile/src/forge/toolbox/DualListBox.java index 65891c3eb47..452ae654533 100644 --- a/forge-gui-mobile/src/forge/toolbox/DualListBox.java +++ b/forge-gui-mobile/src/forge/toolbox/DualListBox.java @@ -206,7 +206,7 @@ public class DualListBox extends FDialog { private final FEventHandler onActivate; private ChoiceList(Collection items, final T typeItem, final FEventHandler onActivate0) { - super(items != null ? items : new ArrayList(), typeItem); //handle null without crashing + super(items != null ? items : new ArrayList<>(), typeItem); //handle null without crashing onActivate = onActivate0; } diff --git a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java index a512d0ce567..770736b177e 100644 --- a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java +++ b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java @@ -40,7 +40,7 @@ public class FChoiceList extends FList implements ActivateHandler { protected final int minChoices, maxChoices; private final CompactModeHandler compactModeHandler = new CompactModeHandler(); - private final List selectedIndices = new ArrayList(); + private final List selectedIndices = new ArrayList<>(); public FChoiceList(Iterable items) { this(items, null); @@ -172,7 +172,7 @@ public class FChoiceList extends FList implements ActivateHandler { } public List getSelectedItems() { - List choices = new ArrayList(); + List choices = new ArrayList<>(); for (int i : selectedIndices) { choices.add(getItemAt(i)); } diff --git a/forge-gui-mobile/src/forge/toolbox/FComboBox.java b/forge-gui-mobile/src/forge/toolbox/FComboBox.java index 019af582c63..e6878c5e142 100644 --- a/forge-gui-mobile/src/forge/toolbox/FComboBox.java +++ b/forge-gui-mobile/src/forge/toolbox/FComboBox.java @@ -1,6 +1,7 @@ package forge.toolbox; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.badlogic.gdx.utils.Align; @@ -12,7 +13,7 @@ import forge.menu.FMenuItem; import forge.toolbox.FEvent.*; public class FComboBox extends FTextField implements IComboBox { - private final List items = new ArrayList(); + private final List items = new ArrayList<>(); private T selectedItem; private String label = ""; private final DropDown dropDown = new DropDown(); @@ -26,9 +27,7 @@ public class FComboBox extends FTextField implements IComboBox { setLabel(label0); } public FComboBox(T[] itemArray) { - for (T item : itemArray) { - items.add(item); - } + items.addAll(Arrays.asList(itemArray)); initialize(); } public FComboBox(Iterable items0) { @@ -66,9 +65,7 @@ public class FComboBox extends FTextField implements IComboBox { public void setItems(T[] itemArray, T selectedItem0) { items.clear(); if (itemArray != null) { - for (T item : itemArray) { - items.add(item); - } + items.addAll(Arrays.asList(itemArray)); } setSelectedItem(selectedItem0); } diff --git a/forge-gui-mobile/src/forge/toolbox/FContainer.java b/forge-gui-mobile/src/forge/toolbox/FContainer.java index 9aa5c7511d8..32fcf2ea0ab 100644 --- a/forge-gui-mobile/src/forge/toolbox/FContainer.java +++ b/forge-gui-mobile/src/forge/toolbox/FContainer.java @@ -10,7 +10,7 @@ import forge.Graphics; import forge.error.BugReporter; public abstract class FContainer extends FDisplayObject { - private final List children = new ArrayList(); + private final List children = new ArrayList<>(); public T add(T child) { children.add(child); diff --git a/forge-gui-mobile/src/forge/toolbox/FDialog.java b/forge-gui-mobile/src/forge/toolbox/FDialog.java index a935e0d72a3..19b8c8aec42 100644 --- a/forge-gui-mobile/src/forge/toolbox/FDialog.java +++ b/forge-gui-mobile/src/forge/toolbox/FDialog.java @@ -145,7 +145,7 @@ public abstract class FDialog extends FOverlay { public boolean isButtonEnabled(int index) { FButton button = getButton(index); - return button != null ? button.isEnabled() : false; + return button != null && button.isEnabled(); } public void setButtonEnabled(int index, boolean enabled) { @@ -283,9 +283,7 @@ public abstract class FDialog extends FOverlay { if (revealPercent != newRevealPercent) { revealPercent = newRevealPercent; updateDisplayTop(); - if (physicsObj.isMoving()) { - return true; - } + return physicsObj.isMoving(); } } diff --git a/forge-gui-mobile/src/forge/toolbox/FEvent.java b/forge-gui-mobile/src/forge/toolbox/FEvent.java index fd6d83ba6bc..7fc207b66d2 100644 --- a/forge-gui-mobile/src/forge/toolbox/FEvent.java +++ b/forge-gui-mobile/src/forge/toolbox/FEvent.java @@ -36,7 +36,7 @@ public class FEvent { return args; } - public static interface FEventHandler { + public interface FEventHandler { void handleEvent(FEvent e); } } diff --git a/forge-gui-mobile/src/forge/toolbox/FGroupList.java b/forge-gui-mobile/src/forge/toolbox/FGroupList.java index 918413b5f82..7646c858d38 100644 --- a/forge-gui-mobile/src/forge/toolbox/FGroupList.java +++ b/forge-gui-mobile/src/forge/toolbox/FGroupList.java @@ -16,7 +16,7 @@ import forge.util.Utils; public class FGroupList extends FScrollPane { private static final float GROUP_HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.6f); - private final List groups = new ArrayList(); + private final List groups = new ArrayList<>(); private FSkinFont font; private ListItemRenderer renderer; @@ -38,7 +38,7 @@ public class FGroupList extends FScrollPane { private void initialize() { font = FSkinFont.get(14); - renderer = new DefaultListItemRenderer(); + renderer = new DefaultListItemRenderer<>(); } public void addGroup(String groupName) { @@ -166,7 +166,7 @@ public class FGroupList extends FScrollPane { private class ListGroup extends FContainer { private final FLabel header; - private final List items = new ArrayList(); + private final List items = new ArrayList<>(); private boolean isCollapsed; diff --git a/forge-gui-mobile/src/forge/toolbox/FList.java b/forge-gui-mobile/src/forge/toolbox/FList.java index 4fcb3929d3f..c6c3f80cc74 100644 --- a/forge-gui-mobile/src/forge/toolbox/FList.java +++ b/forge-gui-mobile/src/forge/toolbox/FList.java @@ -24,7 +24,7 @@ public class FList extends FScrollPane implements Iterable { public static final FSkinColor LINE_COLOR = FORE_COLOR.alphaColor(0.5f); public static final float LINE_THICKNESS = Utils.scale(1); - protected final List items = new ArrayList(); + protected final List items = new ArrayList<>(); private FSkinFont font; private ListItemRenderer renderer; private int pressedIndex = -1; @@ -47,7 +47,7 @@ public class FList extends FScrollPane implements Iterable { private void initialize() { font = FSkinFont.get(14); - renderer = new DefaultListItemRenderer(); + renderer = new DefaultListItemRenderer<>(); } public synchronized void addItem(T item) { @@ -65,7 +65,7 @@ public class FList extends FScrollPane implements Iterable { } public List extractListData() { - return new ArrayList(items); //create copy to avoid modifying items + return new ArrayList<>(items); //create copy to avoid modifying items } public synchronized void setListData(Iterable items0) { clear(); diff --git a/forge-gui-mobile/src/forge/toolbox/FOptionPane.java b/forge-gui-mobile/src/forge/toolbox/FOptionPane.java index 9db441307c1..b93a8b04731 100644 --- a/forge-gui-mobile/src/forge/toolbox/FOptionPane.java +++ b/forge-gui-mobile/src/forge/toolbox/FOptionPane.java @@ -173,7 +173,7 @@ public class FOptionPane extends FDialog { } else { txtInput = null; - cbInput = new FComboBox(inputOptions); + cbInput = new FComboBox<>(inputOptions); cbInput.setSelectedItem(initialInput); inputField = cbInput; } diff --git a/forge-gui-mobile/src/forge/toolbox/FOverlay.java b/forge-gui-mobile/src/forge/toolbox/FOverlay.java index 3905b488c9e..dca477d87a8 100644 --- a/forge-gui-mobile/src/forge/toolbox/FOverlay.java +++ b/forge-gui-mobile/src/forge/toolbox/FOverlay.java @@ -18,7 +18,7 @@ import forge.screens.match.MatchController; public abstract class FOverlay extends FContainer { public static final float ALPHA_COMPOSITE = 0.5f; - private static final Stack overlays = new Stack(); + private static final Stack overlays = new Stack<>(); private static boolean hidingAll = false; private static FOverlay tempOverlay; @@ -49,7 +49,7 @@ public abstract class FOverlay extends FContainer { if (overlays.size() < 2) { return overlays; //don't need to create new list if one or fewer overlay } - List reversedList = new ArrayList(); + List reversedList = new ArrayList<>(); for (int i = overlays.size() - 1; i >= 0; i--) { reversedList.add(overlays.get(i)); } diff --git a/forge-gui-mobile/src/forge/toolbox/FProgressBar.java b/forge-gui-mobile/src/forge/toolbox/FProgressBar.java index 06eb7233d45..160cf0bcd89 100644 --- a/forge-gui-mobile/src/forge/toolbox/FProgressBar.java +++ b/forge-gui-mobile/src/forge/toolbox/FProgressBar.java @@ -119,7 +119,7 @@ public class FProgressBar extends FDisplayObject implements IProgressBar { float h = getHeight(); //draw background and progress - List> selTextRegions = new ArrayList>(); + List> selTextRegions = new ArrayList<>(); if (showProgressTrail) { long now = new Date().getTime(); if (progressTrailStart == -1) { diff --git a/forge-gui-mobile/src/forge/toolbox/FRadioButton.java b/forge-gui-mobile/src/forge/toolbox/FRadioButton.java index ed8d94490b1..7488045e387 100644 --- a/forge-gui-mobile/src/forge/toolbox/FRadioButton.java +++ b/forge-gui-mobile/src/forge/toolbox/FRadioButton.java @@ -94,6 +94,6 @@ public class FRadioButton extends FLabel { } public static class RadioButtonGroup { - private final List buttons = new ArrayList(); + private final List buttons = new ArrayList<>(); } } diff --git a/forge-gui-mobile/src/forge/toolbox/FScrollPane.java b/forge-gui-mobile/src/forge/toolbox/FScrollPane.java index 809b715c8ad..0534860961e 100644 --- a/forge-gui-mobile/src/forge/toolbox/FScrollPane.java +++ b/forge-gui-mobile/src/forge/toolbox/FScrollPane.java @@ -232,9 +232,7 @@ public abstract class FScrollPane extends FContainer { if (physicsObj.isMoving()) { //avoid storing last fling stop time if scroll manually stopped physicsObj.advance(dt); Vector2 pos = physicsObj.getPosition(); - if (setScrollPositions(pos.x, pos.y) && physicsObj.isMoving()) { - return true; - } + return setScrollPositions(pos.x, pos.y) && physicsObj.isMoving(); } //end fling animation if can't scroll anymore or physics object is no longer moving diff --git a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java index 0b369d8fe4c..e8f19f00ad1 100644 --- a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java +++ b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java @@ -110,7 +110,7 @@ public class GuiChoose { // Nothing to choose here. Code uses this to just reveal one or more items public static void reveal(final String message, final T item) { - List items = new ArrayList(); + List items = new ArrayList<>(); items.add(item); reveal(message, items); } @@ -162,7 +162,7 @@ public class GuiChoose { return; } - List choices = new ArrayList(); + List choices = new ArrayList<>(); for (int i = min; i <= cutoff; i++) { choices.add(Integer.valueOf(i)); } @@ -229,13 +229,13 @@ public class GuiChoose { public static void getChoices(final String message, final int min, final int max, final Collection choices, final T selected, final Function display, final Callback> callback) { if (choices == null || choices.isEmpty()) { if (min == 0) { - callback.run(new ArrayList()); + callback.run(new ArrayList<>()); return; } throw new RuntimeException("choice required from empty list"); } - ListChooser c = new ListChooser(message, min, max, choices, display, callback); + ListChooser c = new ListChooser<>(message, min, max, choices, display, callback); c.show(selected, false); } @@ -256,7 +256,7 @@ public class GuiChoose { public static void order(final String title, final String top, final int remainingObjectsMin, final int remainingObjectsMax, final List sourceChoices, final List destChoices, final CardView referenceCard, final Callback> callback) { // An input box for handling the order of choices. - DualListBox dual = new DualListBox(title, remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, callback); + DualListBox dual = new DualListBox<>(title, remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, callback); dual.setSecondColumnLabelText(top); dual.show(); } @@ -334,7 +334,7 @@ public class GuiChoose { // If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine public static void sortedGetChoices(final String message, final int min, final int max, final List choices, Comparator comparer, final Callback> callback) { // You may create a copy of source list if callers expect the collection to be unchanged - Collections.sort(choices, comparer); + choices.sort(comparer); getChoices(message, min, max, choices, callback); } } diff --git a/forge-gui-mobile/src/forge/toolbox/ListChooser.java b/forge-gui-mobile/src/forge/toolbox/ListChooser.java index 9fd472230ed..de20d8ab69a 100644 --- a/forge-gui-mobile/src/forge/toolbox/ListChooser.java +++ b/forge-gui-mobile/src/forge/toolbox/ListChooser.java @@ -151,7 +151,7 @@ public class ListChooser extends FContainer { show(); //show if user tries to cancel when input is mandatory } else { - callback.run(new ArrayList()); + callback.run(new ArrayList<>()); } } }) { @@ -179,7 +179,7 @@ public class ListChooser extends FContainer { public void applyFilters() { lstChoices.clearSelection(); - List> predicates = new ArrayList>(); + List> predicates = new ArrayList<>(); final String pattern = txtSearch.getText().toLowerCase(); if (!pattern.isEmpty()) { diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 4e4c32c1e39..a557a58da68 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT forge-gui diff --git a/forge-gui/res/cardsfolder/a/act_of_heroism.txt b/forge-gui/res/cardsfolder/a/act_of_heroism.txt index 2052d53734a..9b7127436b9 100644 --- a/forge-gui/res/cardsfolder/a/act_of_heroism.txt +++ b/forge-gui/res/cardsfolder/a/act_of_heroism.txt @@ -2,6 +2,6 @@ Name:Act of Heroism ManaCost:1 W Types:Instant A:SP$ Untap | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBPump | SpellDescription$ Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn. -SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +2 | NumDef$ +2 | KW$ CARDNAME can block an additional creature each combat. +SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +2 | NumDef$ +2 | CanBlockAmount$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/act_of_heroism.jpg Oracle:Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/aeon_engine.txt b/forge-gui/res/cardsfolder/a/aeon_engine.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/aeon_engine.txt rename to forge-gui/res/cardsfolder/a/aeon_engine.txt diff --git a/forge-gui/res/cardsfolder/upcoming/anje_falkenrath.txt b/forge-gui/res/cardsfolder/a/anje_falkenrath.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/anje_falkenrath.txt rename to forge-gui/res/cardsfolder/a/anje_falkenrath.txt diff --git a/forge-gui/res/cardsfolder/upcoming/anjes_ravager.txt b/forge-gui/res/cardsfolder/a/anjes_ravager.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/anjes_ravager.txt rename to forge-gui/res/cardsfolder/a/anjes_ravager.txt diff --git a/forge-gui/res/cardsfolder/a/anurid_swarmsnapper.txt b/forge-gui/res/cardsfolder/a/anurid_swarmsnapper.txt index affd95a84f2..ae4329ff07b 100644 --- a/forge-gui/res/cardsfolder/a/anurid_swarmsnapper.txt +++ b/forge-gui/res/cardsfolder/a/anurid_swarmsnapper.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Frog Beast PT:1/4 K:Reach -A:AB$ Pump | Cost$ 1 G | Defined$ Self | KW$ HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ CARDNAME can block an additional creature this turn. +A:AB$ Pump | Cost$ 1 G | Defined$ Self | CanBlockAmount$ 1 | SpellDescription$ CARDNAME can block an additional creature this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/anurid_swarmsnapper.jpg Oracle:Reach (This creature can block creatures with flying.)\n{1}{G}: Anurid Swarmsnapper can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/apex_altisaur.txt b/forge-gui/res/cardsfolder/a/apex_altisaur.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/apex_altisaur.txt rename to forge-gui/res/cardsfolder/a/apex_altisaur.txt diff --git a/forge-gui/res/cardsfolder/upcoming/archfiend_of_spite.txt b/forge-gui/res/cardsfolder/a/archfiend_of_spite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/archfiend_of_spite.txt rename to forge-gui/res/cardsfolder/a/archfiend_of_spite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/atla_palani_nest_tender.txt b/forge-gui/res/cardsfolder/a/atla_palani_nest_tender.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/atla_palani_nest_tender.txt rename to forge-gui/res/cardsfolder/a/atla_palani_nest_tender.txt diff --git a/forge-gui/res/cardsfolder/a/avatar_of_hope.txt b/forge-gui/res/cardsfolder/a/avatar_of_hope.txt index 9c647850ee1..c925f3c80f5 100644 --- a/forge-gui/res/cardsfolder/a/avatar_of_hope.txt +++ b/forge-gui/res/cardsfolder/a/avatar_of_hope.txt @@ -4,7 +4,7 @@ Types:Creature Avatar PT:4/9 S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 6 | EffectZone$ All | CheckSVar$ NeedHope | SVarCompare$ LE3 | Description$ If you have 3 or less life, CARDNAME costs {6} less to cast. K:Flying -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. SVar:NeedHope:Count$YourLifeTotal SVar:Picture:http://www.wizards.com/global/images/magic/general/avatar_of_hope.jpg Oracle:If you have 3 or less life, this spell costs {6} less to cast.\nFlying\nAvatar of Hope can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/backdraft_hellkite.txt b/forge-gui/res/cardsfolder/b/backdraft_hellkite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/backdraft_hellkite.txt rename to forge-gui/res/cardsfolder/b/backdraft_hellkite.txt diff --git a/forge-gui/res/cardsfolder/b/blaze_of_glory.txt b/forge-gui/res/cardsfolder/b/blaze_of_glory.txt index 4834b48c1dc..9c04e8eba0d 100644 --- a/forge-gui/res/cardsfolder/b/blaze_of_glory.txt +++ b/forge-gui/res/cardsfolder/b/blaze_of_glory.txt @@ -1,7 +1,7 @@ Name:Blaze of Glory ManaCost:W Types:Instant -A:SP$ Pump | Cost$ W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | KW$ HIDDEN CARDNAME can block any number of creatures. | SubAbility$ GoingDownInStyle | ActivationPhases$ BeginCombat->Declare Attackers | StackDescription$ {c:Targeted} can block any number of creatures this turn. It blocks each attacking creature this turn if able. | SpellDescription$ Cast CARDNAME only during combat before blockers are declared. Target creature defending player controls can block any number of creatures this turn. It blocks each attacking creature this turn if able. +A:SP$ Pump | Cost$ W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | CanBlockAny$ True | SubAbility$ GoingDownInStyle | ActivationPhases$ BeginCombat->Declare Attackers | StackDescription$ {c:Targeted} can block any number of creatures this turn. It blocks each attacking creature this turn if able. | SpellDescription$ Cast CARDNAME only during combat before blockers are declared. Target creature defending player controls can block any number of creatures this turn. It blocks each attacking creature this turn if able. SVar:GoingDownInStyle:DB$ MustBlock | Defined$ ParentTarget | DefinedAttacker$ Valid Card.attacking | BlockAllDefined$ True | StackDescription$ None AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blaze_of_glory.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/bloodthirsty_blade.txt b/forge-gui/res/cardsfolder/b/bloodthirsty_blade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bloodthirsty_blade.txt rename to forge-gui/res/cardsfolder/b/bloodthirsty_blade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bone_miser.txt b/forge-gui/res/cardsfolder/b/bone_miser.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bone_miser.txt rename to forge-gui/res/cardsfolder/b/bone_miser.txt diff --git a/forge-gui/res/cardsfolder/b/brave_the_sands.txt b/forge-gui/res/cardsfolder/b/brave_the_sands.txt index f8fc947dec6..e423f20ec3d 100644 --- a/forge-gui/res/cardsfolder/b/brave_the_sands.txt +++ b/forge-gui/res/cardsfolder/b/brave_the_sands.txt @@ -2,7 +2,7 @@ Name:Brave the Sands ManaCost:1 W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddKeyword$ Vigilance | Description$ Creatures you control have vigilance. -S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Each creature you control can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.YouCtrl | CanBlockAmount$ 1 | Description$ Each creature you control can block an additional creature each combat. SVar:NonStackingEffect:True SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/brave_the_sands.jpg diff --git a/forge-gui/res/cardsfolder/c/cenns_tactician.txt b/forge-gui/res/cardsfolder/c/cenns_tactician.txt index 613adaa7e18..39de7253d3d 100644 --- a/forge-gui/res/cardsfolder/c/cenns_tactician.txt +++ b/forge-gui/res/cardsfolder/c/cenns_tactician.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Kithkin Soldier PT:1/1 A:AB$ PutCounter | Cost$ W T | ValidTgts$ Creature.Soldier | TgtPrompt$ Select target soldier creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target Soldier creature. -S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Each creature you control with a +1/+1 counter on it can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | CanBlockAmount$ 1 | Description$ Each creature you control with a +1/+1 counter on it can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/cenns_tactician.jpg Oracle:{W}, {T}: Put a +1/+1 counter on target Soldier creature.\nEach creature you control with a +1/+1 counter on it can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/upcoming/chainer_nightmare_adept.txt b/forge-gui/res/cardsfolder/c/chainer_nightmare_adept.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/chainer_nightmare_adept.txt rename to forge-gui/res/cardsfolder/c/chainer_nightmare_adept.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cliffside_rescuer.txt b/forge-gui/res/cardsfolder/c/cliffside_rescuer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cliffside_rescuer.txt rename to forge-gui/res/cardsfolder/c/cliffside_rescuer.txt diff --git a/forge-gui/res/cardsfolder/c/coastline_chimera.txt b/forge-gui/res/cardsfolder/c/coastline_chimera.txt index 934123897f6..9041b5b6cfd 100644 --- a/forge-gui/res/cardsfolder/c/coastline_chimera.txt +++ b/forge-gui/res/cardsfolder/c/coastline_chimera.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Creature Chimera PT:1/5 K:Flying -A:AB$ Pump | Cost$ 1 W | Defined$ Self | KW$ HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ CARDNAME can block an additional creature this turn. +A:AB$ Pump | Cost$ 1 W | Defined$ Self | CanBlockAmount$ 1 | SpellDescription$ CARDNAME can block an additional creature this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/coastline_chimera.jpg Oracle:Flying\n{1}{W}: Coastline Chimera can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/commanders_insignia.txt b/forge-gui/res/cardsfolder/c/commanders_insignia.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/commanders_insignia.txt rename to forge-gui/res/cardsfolder/c/commanders_insignia.txt diff --git a/forge-gui/res/cardsfolder/upcoming/curse_of_fools_wisdom.txt b/forge-gui/res/cardsfolder/c/curse_of_fools_wisdom.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/curse_of_fools_wisdom.txt rename to forge-gui/res/cardsfolder/c/curse_of_fools_wisdom.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dockside_extortionist.txt b/forge-gui/res/cardsfolder/d/dockside_extortionist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dockside_extortionist.txt rename to forge-gui/res/cardsfolder/d/dockside_extortionist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/doomed_artisan.txt b/forge-gui/res/cardsfolder/d/doomed_artisan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/doomed_artisan.txt rename to forge-gui/res/cardsfolder/d/doomed_artisan.txt diff --git a/forge-gui/res/cardsfolder/e/echo_circlet.txt b/forge-gui/res/cardsfolder/e/echo_circlet.txt index 38743d1c66d..4ff2047aeee 100644 --- a/forge-gui/res/cardsfolder/e/echo_circlet.txt +++ b/forge-gui/res/cardsfolder/e/echo_circlet.txt @@ -2,6 +2,6 @@ Name:Echo Circlet ManaCost:2 Types:Artifact Equipment K:Equip:1 -S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Equipped creature can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.EquippedBy | CanBlockAmount$ 1 | Description$ Equipped creature can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_circlet.jpg Oracle:Equipped creature can block an additional creature each combat.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/upcoming/elsha_of_the_infinite.txt b/forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt similarity index 65% rename from forge-gui/res/cardsfolder/upcoming/elsha_of_the_infinite.txt rename to forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt index d02ad5dae4a..6b4e63b94c7 100644 --- a/forge-gui/res/cardsfolder/upcoming/elsha_of_the_infinite.txt +++ b/forge-gui/res/cardsfolder/e/elsha_of_the_infinite.txt @@ -4,5 +4,5 @@ Types:Legendary Creature Djinn Monk PT:3/3 K:Prowess S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ You | Description$ You may look at the top card of your library any time. -S:Mode$ Continuous | Affected$ Creature.TopLibrary+YouCtrl+nonLand+nonCreature | AffectedZone$ Library | MayPlay$ True | MayPlayWithFlash$ True | Description$ You may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash. +S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl+nonLand+nonCreature | AffectedZone$ Library | MayPlay$ True | MayPlayWithFlash$ True | Description$ You may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash. Oracle:Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)\nYou may look at the top card of your library any time.\nYou may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash. diff --git a/forge-gui/res/cardsfolder/upcoming/empowered_autogenerator.txt b/forge-gui/res/cardsfolder/e/empowered_autogenerator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/empowered_autogenerator.txt rename to forge-gui/res/cardsfolder/e/empowered_autogenerator.txt diff --git a/forge-gui/res/cardsfolder/e/entangler.txt b/forge-gui/res/cardsfolder/e/entangler.txt index 98668f72c4d..e876b4aab98 100644 --- a/forge-gui/res/cardsfolder/e/entangler.txt +++ b/forge-gui/res/cardsfolder/e/entangler.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 W W | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can block any number of creatures. | Description$ Enchanted creature can block any number of creatures. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | CanBlockAny$ True | Description$ Enchanted creature can block any number of creatures. SVar:Picture:http://www.wizards.com/global/images/magic/general/entangler.jpg Oracle:Enchant creature\nEnchanted creature can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/e/entourage_of_trest.txt b/forge-gui/res/cardsfolder/e/entourage_of_trest.txt index a82d59e278b..8b0c23ee88b 100644 --- a/forge-gui/res/cardsfolder/e/entourage_of_trest.txt +++ b/forge-gui/res/cardsfolder/e/entourage_of_trest.txt @@ -4,6 +4,6 @@ Types:Creature Elf Soldier PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMonarch | TriggerDescription$ When CARDNAME enters the battlefield, you become the monarch. SVar:TrigMonarch:DB$ BecomeMonarch | Defined$ You -S:Mode$ Continuous | Affected$ Card.Self | Condition$ You.isMonarch | AddKeyword$ CARDNAME can block an additional creature each combat. | Description$ CARDNAME can block an additional creature each combat as long as you're the monarch. +S:Mode$ Continuous | Affected$ Card.Self | Condition$ You.isMonarch | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat as long as you're the monarch. SVar:Picture:http://www.wizards.com/global/images/magic/general/entourage_of_trest.jpg -Oracle:When Entourage of Trest enters the battlefield, you become the monarch.\nEntourage of Trest can block an additional creature each combat as long as you're the monarch. \ No newline at end of file +Oracle:When Entourage of Trest enters the battlefield, you become the monarch.\nEntourage of Trest can block an additional creature each combat as long as you're the monarch. diff --git a/forge-gui/res/cardsfolder/f/foriysian_brigade.txt b/forge-gui/res/cardsfolder/f/foriysian_brigade.txt index 036019926c1..7593086bafa 100644 --- a/forge-gui/res/cardsfolder/f/foriysian_brigade.txt +++ b/forge-gui/res/cardsfolder/f/foriysian_brigade.txt @@ -2,6 +2,6 @@ Name:Foriysian Brigade ManaCost:3 W Types:Creature Human Soldier PT:2/4 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/foriysian_brigade.jpg Oracle:Foriysian Brigade can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/f/foriysian_interceptor.txt b/forge-gui/res/cardsfolder/f/foriysian_interceptor.txt index effcce187bb..6bc1f0fc258 100644 --- a/forge-gui/res/cardsfolder/f/foriysian_interceptor.txt +++ b/forge-gui/res/cardsfolder/f/foriysian_interceptor.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:0/5 K:Flash K:Defender -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/foriysian_interceptor.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nDefender\nForiysian Interceptor can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/f/foriysian_totem.txt b/forge-gui/res/cardsfolder/f/foriysian_totem.txt index fd96f56d4ed..573f8a3891e 100644 --- a/forge-gui/res/cardsfolder/f/foriysian_totem.txt +++ b/forge-gui/res/cardsfolder/f/foriysian_totem.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Animate | Cost$ 4 R | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Artifact,Creature,Giant | Colors$ Red | Keywords$ Trample | SpellDescription$ CARDNAME becomes a 4/4 red Giant artifact creature with trample until end of turn. -S:Mode$ Continuous | Affected$ Creature.Self | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ As long as CARDNAME is a creature, it can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.Self | CanBlockAmount$ 1 | Description$ As long as CARDNAME is a creature, it can block an additional creature each combat. DeckNeeds:Color$Red #TODO: The AI won't block multiple creatures yet, it seems. Can be improved. SVar:Picture:http://www.wizards.com/global/images/magic/general/foriysian_totem.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/full_flowering.txt b/forge-gui/res/cardsfolder/f/full_flowering.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/full_flowering.txt rename to forge-gui/res/cardsfolder/f/full_flowering.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gerrard_weatherlight_hero.txt b/forge-gui/res/cardsfolder/g/gerrard_weatherlight_hero.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gerrard_weatherlight_hero.txt rename to forge-gui/res/cardsfolder/g/gerrard_weatherlight_hero.txt diff --git a/forge-gui/res/cardsfolder/g/ghastbark_twins.txt b/forge-gui/res/cardsfolder/g/ghastbark_twins.txt index 345eebe9ef7..cd8f7c7cceb 100644 --- a/forge-gui/res/cardsfolder/g/ghastbark_twins.txt +++ b/forge-gui/res/cardsfolder/g/ghastbark_twins.txt @@ -1,7 +1,7 @@ Name:Ghastbark Twins ManaCost:5 G G Types:Creature Treefolk +PT:7/7 K:Trample -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)\nGhastbark Twins can block an additional creature each combat. -PT:7/7 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/ghired_conclave_exile.txt b/forge-gui/res/cardsfolder/g/ghired_conclave_exile.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ghired_conclave_exile.txt rename to forge-gui/res/cardsfolder/g/ghired_conclave_exile.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ghireds_belligerence.txt b/forge-gui/res/cardsfolder/g/ghireds_belligerence.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ghireds_belligerence.txt rename to forge-gui/res/cardsfolder/g/ghireds_belligerence.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gift_of_doom.txt b/forge-gui/res/cardsfolder/g/gift_of_doom.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gift_of_doom.txt rename to forge-gui/res/cardsfolder/g/gift_of_doom.txt diff --git a/forge-gui/res/cardsfolder/g/give_no_ground.txt b/forge-gui/res/cardsfolder/g/give_no_ground.txt index dccad2edbcf..d77822c38d3 100644 --- a/forge-gui/res/cardsfolder/g/give_no_ground.txt +++ b/forge-gui/res/cardsfolder/g/give_no_ground.txt @@ -1,6 +1,6 @@ Name:Give No Ground ManaCost:3 W Types:Instant -A:SP$ Pump | Cost$ 3 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +6 | AddHiddenKeyword$ CARDNAME can block any number of creatures. | SpellDescription$ Target creature gets +2/+6 and can block any number of creatures this turn. +A:SP$ Pump | Cost$ 3 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +6 | CanBlockAny$ True | SpellDescription$ Target creature gets +2/+6 and can block any number of creatures this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/give_no_ground.jpg Oracle:Target creature gets +2/+6 and can block any number of creatures this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/greven_predator_captain.txt b/forge-gui/res/cardsfolder/g/greven_predator_captain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/greven_predator_captain.txt rename to forge-gui/res/cardsfolder/g/greven_predator_captain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/grismold_the_dreadsower.txt b/forge-gui/res/cardsfolder/g/grismold_the_dreadsower.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/grismold_the_dreadsower.txt rename to forge-gui/res/cardsfolder/g/grismold_the_dreadsower.txt diff --git a/forge-gui/res/cardsfolder/g/guardian_of_the_gateless.txt b/forge-gui/res/cardsfolder/g/guardian_of_the_gateless.txt index 9ee1627543e..ba79078d93f 100644 --- a/forge-gui/res/cardsfolder/g/guardian_of_the_gateless.txt +++ b/forge-gui/res/cardsfolder/g/guardian_of_the_gateless.txt @@ -3,7 +3,7 @@ ManaCost:4 W Types:Creature Angel PT:3/3 K:Flying -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +1/+1 until end of turn for each creature it's blocking. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X | NumDef$ X | References$ X SVar:X:Count$Valid Creature.blockedBySource diff --git a/forge-gui/res/cardsfolder/upcoming/hate_mirage.txt b/forge-gui/res/cardsfolder/h/hate_mirage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hate_mirage.txt rename to forge-gui/res/cardsfolder/h/hate_mirage.txt diff --git a/forge-gui/res/cardsfolder/h/high_ground.txt b/forge-gui/res/cardsfolder/h/high_ground.txt index 743af4eb4a3..673b11004ad 100644 --- a/forge-gui/res/cardsfolder/h/high_ground.txt +++ b/forge-gui/res/cardsfolder/h/high_ground.txt @@ -1,6 +1,6 @@ Name:High Ground ManaCost:W Types:Enchantment -S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Each creature you control can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.YouCtrl | CanBlockAmount$ 1 | Description$ Each creature you control can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/high_ground.jpg Oracle:Each creature you control can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/h/hundred_handed_one.txt b/forge-gui/res/cardsfolder/h/hundred_handed_one.txt index 4cdf94ba357..18d6f075025 100644 --- a/forge-gui/res/cardsfolder/h/hundred_handed_one.txt +++ b/forge-gui/res/cardsfolder/h/hundred_handed_one.txt @@ -4,7 +4,7 @@ Types:Creature Giant PT:3/5 K:Vigilance K:Monstrosity:3:3 W W W -S:Mode$ Continuous | Affected$ Card.Self+IsMonstrous | AddKeyword$ Reach & CARDNAME can block an additional ninety-nine creatures each combat. | Description$ As long as CARDNAME is monstrous, it has reach and can block an additional ninety-nine creatures each combat. +S:Mode$ Continuous | Affected$ Card.Self+IsMonstrous | AddKeyword$ Reach | CanBlockAmount$ 99 | Description$ As long as CARDNAME is monstrous, it has reach and can block an additional ninety-nine creatures each combat. DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/hundred_handed_one.jpg Oracle:Vigilance\n{3}{W}{W}{W}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.)\nAs long as Hundred-Handed One is monstrous, it has reach and can block an additional ninety-nine creatures each combat. diff --git a/forge-gui/res/cardsfolder/upcoming/idol_of_oblivion.txt b/forge-gui/res/cardsfolder/i/idol_of_oblivion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/idol_of_oblivion.txt rename to forge-gui/res/cardsfolder/i/idol_of_oblivion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ignite_the_future.txt b/forge-gui/res/cardsfolder/i/ignite_the_future.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ignite_the_future.txt rename to forge-gui/res/cardsfolder/i/ignite_the_future.txt diff --git a/forge-gui/res/cardsfolder/i/ionas_blessing.txt b/forge-gui/res/cardsfolder/i/ionas_blessing.txt index 13708dcafdf..4df8dc72a55 100644 --- a/forge-gui/res/cardsfolder/i/ionas_blessing.txt +++ b/forge-gui/res/cardsfolder/i/ionas_blessing.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 3 W | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Enchanted creature gets +2/+2, has vigilance, and can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | CanBlockAmount$ 1 | Description$ Enchanted creature gets +2/+2, has vigilance, and can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/ionas_blessing.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2, has vigilance, and can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/i/ironfist_crusher.txt b/forge-gui/res/cardsfolder/i/ironfist_crusher.txt index 76953216b1d..5f2cbbef88f 100644 --- a/forge-gui/res/cardsfolder/i/ironfist_crusher.txt +++ b/forge-gui/res/cardsfolder/i/ironfist_crusher.txt @@ -2,7 +2,7 @@ Name:Ironfist Crusher ManaCost:4 W Types:Creature Human Soldier PT:2/4 -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. K:Morph:3 W SVar:Picture:http://www.wizards.com/global/images/magic/general/ironfist_crusher.jpg Oracle:Ironfist Crusher can block any number of creatures.\nMorph {3}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/kadena_slinking_sorcerer.txt b/forge-gui/res/cardsfolder/k/kadena_slinking_sorcerer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kadena_slinking_sorcerer.txt rename to forge-gui/res/cardsfolder/k/kadena_slinking_sorcerer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kadenas_silencer.txt b/forge-gui/res/cardsfolder/k/kadenas_silencer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kadenas_silencer.txt rename to forge-gui/res/cardsfolder/k/kadenas_silencer.txt diff --git a/forge-gui/res/cardsfolder/k/kembas_legion.txt b/forge-gui/res/cardsfolder/k/kembas_legion.txt index a9e89be1ca3..b8ce046c287 100644 --- a/forge-gui/res/cardsfolder/k/kembas_legion.txt +++ b/forge-gui/res/cardsfolder/k/kembas_legion.txt @@ -3,7 +3,7 @@ ManaCost:5 W W Types:Creature Cat Soldier PT:4/6 K:Vigilance -S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | KeywordMultiplier$ X | Description$ CARDNAME can block an additional creature each combat for each Equipment attached to CARDNAME. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ X | References$ X | Description$ CARDNAME can block an additional creature each combat for each Equipment attached to CARDNAME. SVar:X:Count$Valid Equipment.Attached SVar:Picture:http://www.wizards.com/global/images/magic/general/kembas_legion.jpg SVar:EquipMe:Multiple diff --git a/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt b/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt index 4e38776c875..0c6f7e3af07 100644 --- a/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt +++ b/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt @@ -2,7 +2,7 @@ Name:Knight of Sorrows ManaCost:4 W Types:Creature Human Knight PT:3/3 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. K:Afterlife:1 DeckHas:Ability$Token Oracle:Knight of Sorrows can block an additional creature each combat.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/krrik_son_of_yawgmoth.txt b/forge-gui/res/cardsfolder/k/krrik_son_of_yawgmoth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/krrik_son_of_yawgmoth.txt rename to forge-gui/res/cardsfolder/k/krrik_son_of_yawgmoth.txt diff --git a/forge-gui/res/cardsfolder/l/lairwatch_giant.txt b/forge-gui/res/cardsfolder/l/lairwatch_giant.txt index 9ab7f303d22..270f0ea6387 100644 --- a/forge-gui/res/cardsfolder/l/lairwatch_giant.txt +++ b/forge-gui/res/cardsfolder/l/lairwatch_giant.txt @@ -2,7 +2,7 @@ Name:Lairwatch Giant ManaCost:5 W Types:Creature Giant Warrior PT:5/3 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. T:Mode$ Blocks | ValidCard$ Card.Self | CheckSVar$ X | NoResolvingCheck$ True | SVarCompare$ GE2 | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks two or more creatures, it gains first strike until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. SVar:X:Count$Valid Creature.blockedBySource diff --git a/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt b/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt index badb1aee8bc..215a4e90b95 100644 --- a/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt @@ -5,8 +5,8 @@ A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T Sac<1/Swamp> | Produced$ B | Amount$ 4 | SpellDescription$ Add {B}{B}{B}{B}. R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | ReplaceWith$ PayBeforeETB | Description$ If CARDNAME would enter the battlefield, sacrifice a Swamp instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. SVar:PayBeforeETB:DB$ Sacrifice | SacValid$ Swamp | Defined$ You | RememberSacrificed$ True | SubAbility$ MoveToGraveyard -SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup +SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ MoveToBattlefield +SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/upcoming/leadership_vacuum.txt b/forge-gui/res/cardsfolder/l/leadership_vacuum.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/leadership_vacuum.txt rename to forge-gui/res/cardsfolder/l/leadership_vacuum.txt diff --git a/forge-gui/res/cardsfolder/l/luminous_guardian.txt b/forge-gui/res/cardsfolder/l/luminous_guardian.txt index 6dee45f14de..61b27a4f768 100644 --- a/forge-gui/res/cardsfolder/l/luminous_guardian.txt +++ b/forge-gui/res/cardsfolder/l/luminous_guardian.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Human Nomad PT:1/4 A:AB$ Pump | Cost$ W | Defined$ Self | NumDef$ 1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -A:AB$ Pump | Cost$ 2 | Defined$ Self | KW$ HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ CARDNAME can block an additional creature this turn. +A:AB$ Pump | Cost$ 2 | Defined$ Self | CanBlockAmount$ 1 | SpellDescription$ CARDNAME can block an additional creature this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/luminous_guardian.jpg Oracle:{W}: Luminous Guardian gets +0/+1 until end of turn.\n{2}: Luminous Guardian can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/mandate_of_peace.txt b/forge-gui/res/cardsfolder/m/mandate_of_peace.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mandate_of_peace.txt rename to forge-gui/res/cardsfolder/m/mandate_of_peace.txt diff --git a/forge-gui/res/cardsfolder/upcoming/marisi_breaker_of_the_coil.txt b/forge-gui/res/cardsfolder/m/marisi_breaker_of_the_coil.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/marisi_breaker_of_the_coil.txt rename to forge-gui/res/cardsfolder/m/marisi_breaker_of_the_coil.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mass_diminish.txt b/forge-gui/res/cardsfolder/m/mass_diminish.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mass_diminish.txt rename to forge-gui/res/cardsfolder/m/mass_diminish.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mire_in_misery.txt b/forge-gui/res/cardsfolder/m/mire_in_misery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mire_in_misery.txt rename to forge-gui/res/cardsfolder/m/mire_in_misery.txt diff --git a/forge-gui/res/cardsfolder/m/mounted_archers.txt b/forge-gui/res/cardsfolder/m/mounted_archers.txt index aed5f718c18..b1d2be563f7 100644 --- a/forge-gui/res/cardsfolder/m/mounted_archers.txt +++ b/forge-gui/res/cardsfolder/m/mounted_archers.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Human Soldier Archer PT:2/3 K:Reach -A:AB$ Pump | Cost$ W | Defined$ Self | KW$ HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ CARDNAME can block an additional creature this turn. +A:AB$ Pump | Cost$ W | Defined$ Self | CanBlockAmount$ 1 | SpellDescription$ CARDNAME can block an additional creature this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/mounted_archers.jpg Oracle:Reach (This creature can block creatures with flying.)\n{W}: Mounted Archers can block an additional creature this turn. diff --git a/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt b/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt index b402d8903a7..f3e54e728bc 100644 --- a/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt +++ b/forge-gui/res/cardsfolder/n/narset_parter_of_veils.txt @@ -3,5 +3,5 @@ ManaCost:1 U U Types:Legendary Planeswalker Narset Loyalty:5 S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ You can't draw more than one card each turn. | Description$ Each opponent can't draw more than one card each turn. -A:AB$ Dig | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Card.nonCreature+nonLand | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +A:AB$ Dig | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Card.nonCreature+nonLand | RestRandomOrder$ True | ForceRevealToController$ True | SpellDescription$ Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. Oracle:Each opponent can't draw more than one card each turn.\n[-2]: Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/n/night_market_guard.txt b/forge-gui/res/cardsfolder/n/night_market_guard.txt index fde1f44b062..12e693a737a 100644 --- a/forge-gui/res/cardsfolder/n/night_market_guard.txt +++ b/forge-gui/res/cardsfolder/n/night_market_guard.txt @@ -2,6 +2,6 @@ Name:Night Market Guard ManaCost:3 Types:Artifact Creature Construct PT:3/1 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/night_market_guard.jpg -Oracle:Night Market Guard can block an additional creature each combat. \ No newline at end of file +Oracle:Night Market Guard can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/upcoming/nightmare_unmaking.txt b/forge-gui/res/cardsfolder/n/nightmare_unmaking.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nightmare_unmaking.txt rename to forge-gui/res/cardsfolder/n/nightmare_unmaking.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ohran_frostfang.txt b/forge-gui/res/cardsfolder/o/ohran_frostfang.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ohran_frostfang.txt rename to forge-gui/res/cardsfolder/o/ohran_frostfang.txt diff --git a/forge-gui/res/cardsfolder/p/palace_guard.txt b/forge-gui/res/cardsfolder/p/palace_guard.txt index 47a1f4bb919..cb2bf7f3e90 100644 --- a/forge-gui/res/cardsfolder/p/palace_guard.txt +++ b/forge-gui/res/cardsfolder/p/palace_guard.txt @@ -2,6 +2,6 @@ Name:Palace Guard ManaCost:2 W Types:Creature Human Soldier PT:1/4 -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. SVar:Picture:http://www.wizards.com/global/images/magic/general/palace_guard.jpg Oracle:Palace Guard can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/pendant_of_prosperity.txt b/forge-gui/res/cardsfolder/p/pendant_of_prosperity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pendant_of_prosperity.txt rename to forge-gui/res/cardsfolder/p/pendant_of_prosperity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pramikon_sky_rampart.txt b/forge-gui/res/cardsfolder/p/pramikon_sky_rampart.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pramikon_sky_rampart.txt rename to forge-gui/res/cardsfolder/p/pramikon_sky_rampart.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rayami_first_of_the_fallen.txt b/forge-gui/res/cardsfolder/r/rayami_first_of_the_fallen.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rayami_first_of_the_fallen.txt rename to forge-gui/res/cardsfolder/r/rayami_first_of_the_fallen.txt diff --git a/forge-gui/res/cardsfolder/r/reprobation.txt b/forge-gui/res/cardsfolder/r/reprobation.txt index 70bee1efe39..31e57175382 100644 --- a/forge-gui/res/cardsfolder/r/reprobation.txt +++ b/forge-gui/res/cardsfolder/r/reprobation.txt @@ -3,5 +3,5 @@ ManaCost:1 W Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Curse -S:Mode$ Continuous | Affected$ Card.EnchantedBy | SetPower$ 0 | SetToughness$ 1 | RemoveAllAbilities$ True | AddType$ Coward | Description$ Enchanted creature loses all abilities and is a Coward creature with base power and toughness 0/1. +S:Mode$ Continuous | Affected$ Card.EnchantedBy | SetPower$ 0 | SetToughness$ 1 | RemoveAllAbilities$ True | AddType$ Creature & Coward | RemoveCardTypes$ True | Description$ Enchanted creature loses all abilities and is a Coward creature with base power and toughness 0/1. Oracle:Enchant creature\nEnchanted creature loses all abilities and is a Coward creature with base power and toughness 0/1. (It keeps all supertypes but loses all other types and creature types.) diff --git a/forge-gui/res/cardsfolder/upcoming/road_of_return.txt b/forge-gui/res/cardsfolder/r/road_of_return.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/road_of_return.txt rename to forge-gui/res/cardsfolder/r/road_of_return.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sanctum_of_eternity.txt b/forge-gui/res/cardsfolder/s/sanctum_of_eternity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sanctum_of_eternity.txt rename to forge-gui/res/cardsfolder/s/sanctum_of_eternity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scaretiller.txt b/forge-gui/res/cardsfolder/s/scaretiller.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scaretiller.txt rename to forge-gui/res/cardsfolder/s/scaretiller.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scroll_of_fate.txt b/forge-gui/res/cardsfolder/s/scroll_of_fate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scroll_of_fate.txt rename to forge-gui/res/cardsfolder/s/scroll_of_fate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/selesnya_eulogist.txt b/forge-gui/res/cardsfolder/s/selesnya_eulogist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/selesnya_eulogist.txt rename to forge-gui/res/cardsfolder/s/selesnya_eulogist.txt diff --git a/forge-gui/res/cardsfolder/s/selesnya_sagittars.txt b/forge-gui/res/cardsfolder/s/selesnya_sagittars.txt index fa6614fd227..ea7f32e53b6 100644 --- a/forge-gui/res/cardsfolder/s/selesnya_sagittars.txt +++ b/forge-gui/res/cardsfolder/s/selesnya_sagittars.txt @@ -3,6 +3,6 @@ ManaCost:3 G W Types:Creature Elf Archer PT:2/5 K:Reach -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_sagittars.jpg Oracle:Reach (This creature can block creatures with flying.)\nSelesnya Sagittars can block an additional creature each combat diff --git a/forge-gui/res/cardsfolder/upcoming/sevinne_the_chronoclasm.txt b/forge-gui/res/cardsfolder/s/sevinne_the_chronoclasm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sevinne_the_chronoclasm.txt rename to forge-gui/res/cardsfolder/s/sevinne_the_chronoclasm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sevinnes_reclamation.txt b/forge-gui/res/cardsfolder/s/sevinnes_reclamation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sevinnes_reclamation.txt rename to forge-gui/res/cardsfolder/s/sevinnes_reclamation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/skyfire_phoenix.txt b/forge-gui/res/cardsfolder/s/skyfire_phoenix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/skyfire_phoenix.txt rename to forge-gui/res/cardsfolder/s/skyfire_phoenix.txt diff --git a/forge-gui/res/cardsfolder/upcoming/song_of_the_worldsoul.txt b/forge-gui/res/cardsfolder/s/song_of_the_worldsoul.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/song_of_the_worldsoul.txt rename to forge-gui/res/cardsfolder/s/song_of_the_worldsoul.txt diff --git a/forge-gui/res/cardsfolder/s/spike_tailed_ceratops.txt b/forge-gui/res/cardsfolder/s/spike_tailed_ceratops.txt index 6fe1a1e9547..6e84ba97e92 100644 --- a/forge-gui/res/cardsfolder/s/spike_tailed_ceratops.txt +++ b/forge-gui/res/cardsfolder/s/spike_tailed_ceratops.txt @@ -2,6 +2,6 @@ Name:Spike-Tailed Ceratops ManaCost:4 G Types:Creature Dinosaur PT:4/4 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_tailed_ceratops.jpg -Oracle:Spike-Tailed Ceratops can block an additional creature each combat. \ No newline at end of file +Oracle:Spike-Tailed Ceratops can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/upcoming/tahngarth_first_mate.txt b/forge-gui/res/cardsfolder/t/tahngarth_first_mate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tahngarth_first_mate.txt rename to forge-gui/res/cardsfolder/t/tahngarth_first_mate.txt diff --git a/forge-gui/res/cardsfolder/t/tangleclaw_werewolf_fibrous_entangler.txt b/forge-gui/res/cardsfolder/t/tangleclaw_werewolf_fibrous_entangler.txt index e66cae7ddd6..46defcba3d4 100644 --- a/forge-gui/res/cardsfolder/t/tangleclaw_werewolf_fibrous_entangler.txt +++ b/forge-gui/res/cardsfolder/t/tangleclaw_werewolf_fibrous_entangler.txt @@ -1,41 +1,22 @@ Name:Tangleclaw Werewolf - ManaCost:2 G G - Types:Creature Werewolf Horror - PT:2/4 - -K:CARDNAME can block an additional creature each combat. - +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. A:AB$SetState | Cost$ 6 G | Defined$ Self | Mode$ Transform | SpellDescription$ Transform CARDNAME. - SVar:Picture:http://www.wizards.com/global/images/magic/general/tangleclaw_werewolf.jpg - AlternateMode:DoubleFaced - Oracle:Tangleclaw Werewolf can block an additional creature each combat.\n{6}{G}: Transform Tangleclaw Werewolf. - - ALTERNATE - Name:Fibrous Entangler - ManaCost:no cost - Types:Creature Eldrazi Werewolf - PT:4/6 - K:Vigilance - K:CARDNAME must be blocked if able. - -K:CARDNAME can block an additional creature each combat. - +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/fibrous_entangler.jpg - Oracle:Vigilance\nFibrous Entangler must be blocked if able.\nFibrous Entangler can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/upcoming/tectonic_hellion.txt b/forge-gui/res/cardsfolder/t/tectonic_hellion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tectonic_hellion.txt rename to forge-gui/res/cardsfolder/t/tectonic_hellion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thalias_geistcaller.txt b/forge-gui/res/cardsfolder/t/thalias_geistcaller.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thalias_geistcaller.txt rename to forge-gui/res/cardsfolder/t/thalias_geistcaller.txt diff --git a/forge-gui/res/cardsfolder/t/the_hippodrome.txt b/forge-gui/res/cardsfolder/t/the_hippodrome.txt index b90de6b14ce..206af01743d 100644 --- a/forge-gui/res/cardsfolder/t/the_hippodrome.txt +++ b/forge-gui/res/cardsfolder/t/the_hippodrome.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Plane Segovia S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AddPower$ -5 | Description$ All Creatures get -5/-0. T:Mode$ PlanarDice | Result$ Chaos | OptionalDecider$ You | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, you may destroy target creature if it's power is 0 or less. -SVar:RolledChaos:DB$ Destroy | ValidTgts$ Creature | ConditionCheckSVar$ TgtPow | ConditionCompareSVar$ EQ1 | AITgts$ Creature.OpponentCtrl+powerLE0 +SVar:RolledChaos:DB$ Destroy | ValidTgts$ Creature | ConditionCheckSVar$ TgtPow | ConditionSVarCompare$ EQ1 | AITgts$ Creature.OpponentCtrl+powerLE0 SVar:TgtPow:Targeted$Valid Creature.powerLE0 SVar:Picture:http://www.wizards.com/global/images/magic/general/the_hippodrome.jpg SVar:AIRollPlanarDieParams:Mode$ Always diff --git a/forge-gui/res/cardsfolder/upcoming/thieving_amalgam.txt b/forge-gui/res/cardsfolder/t/thieving_amalgam.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thieving_amalgam.txt rename to forge-gui/res/cardsfolder/t/thieving_amalgam.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thought_sponge.txt b/forge-gui/res/cardsfolder/t/thought_sponge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thought_sponge.txt rename to forge-gui/res/cardsfolder/t/thought_sponge.txt diff --git a/forge-gui/res/cardsfolder/t/thoughtweft_trio.txt b/forge-gui/res/cardsfolder/t/thoughtweft_trio.txt index a3388561ea8..a6eca7e32cb 100644 --- a/forge-gui/res/cardsfolder/t/thoughtweft_trio.txt +++ b/forge-gui/res/cardsfolder/t/thoughtweft_trio.txt @@ -5,6 +5,6 @@ PT:5/5 K:First Strike K:Vigilance K:Champion:Kithkin -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtweft_trio.jpg Oracle:First strike, vigilance\nChampion a Kithkin (When this enters the battlefield, sacrifice it unless you exile another Kithkin you control. When this leaves the battlefield, that card returns to the battlefield.)\nThoughtweft Trio can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/t/titanias_song.txt b/forge-gui/res/cardsfolder/t/titanias_song.txt index 73bdbd4da82..ed181a83062 100644 --- a/forge-gui/res/cardsfolder/t/titanias_song.txt +++ b/forge-gui/res/cardsfolder/t/titanias_song.txt @@ -1,7 +1,7 @@ Name:Titania's Song ManaCost:3 G Types:Enchantment -S:Mode$ Continuous | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | RemoveAllAbilities$ True | Description$ Each noncreature artifact loses all abilities and is an artifact creature with power and toughness each equal to its converted mana cost. +S:Mode$ Continuous | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Artifact & Creature | RemoveCardTypes$ True | RemoveAllAbilities$ True | Description$ Each noncreature artifact loses all abilities and is an artifact creature with power and toughness each equal to its converted mana cost. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigEffect | Static$ True | TriggerDescription$ If CARDNAME leaves the battlefield, this effect continues until end of turn. SVar:TrigEffect:DB$ Effect | Name$ Titania's Song Effect | StaticAbilities$ KWAnimateAll | SVars$ AffectedX | References$ AffectedX SVar:KWAnimateAll:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | RemoveAllAbilities$ True | Description$ Each noncreature artifact loses all abilities and is an artifact creature with power and toughness each equal to its converted mana cost. diff --git a/forge-gui/res/cardsfolder/t/transmute_artifact.txt b/forge-gui/res/cardsfolder/t/transmute_artifact.txt index e50e51028e4..8ccedb74d00 100644 --- a/forge-gui/res/cardsfolder/t/transmute_artifact.txt +++ b/forge-gui/res/cardsfolder/t/transmute_artifact.txt @@ -6,8 +6,8 @@ SVar:StoreCanSearch:DB$ StoreSVar | SVar$ SackedCMC | Type$ Number | Expression$ SVar:StoreCMC:DB$ StoreSVar | SVar$ SackedCMC | Type$ Calculate | Expression$ Y | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBClear SVar:DBClear:DB$ Cleanup | ClearRemembered$ True | SubAbility$ SearchLibrary SVar:SearchLibrary:DB$ ChangeZone | Origin$ Library | Destination$ Library | ChangeType$ Artifact | ChangeNum$ 1 | SubAbility$ EqualTransmute | StackDescription$ None | RememberChanged$ True | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ GE0 -SVar:EqualTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | NoLooking$ True | Mandatory$ True | Defined$ Remembered | ChangeNum$ 1 | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ GEY | SubAbility$ PayForTransmute | StackDescription$ None -SVar:PayForTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | NoLooking$ True | Mandatory$ True | Defined$ Remembered | ChangeNum$ 1 | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ LTY | UnlessCost$ X | UnlessPayer$ You | UnlessSwitched$ True | StackDescription$ None | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 +SVar:EqualTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | NoLooking$ True | Mandatory$ True | Defined$ Remembered | ChangeNum$ 1 | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ GEY | References$ Y | SubAbility$ PayForTransmute | StackDescription$ None +SVar:PayForTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | NoLooking$ True | Mandatory$ True | Defined$ Remembered | ChangeNum$ 1 | ConditionCheckSVar$ SackedCMC | ConditionSVarCompare$ LTY | UnlessCost$ X | References$ X,Y | UnlessPayer$ You | UnlessSwitched$ True | StackDescription$ None | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 # Everything working but when no artifact is sacrificed # SackedCMC to be overridden to see if a sacrifice actually happened SVar:Y:Remembered$CardManaCost diff --git a/forge-gui/res/cardsfolder/t/trueheart_duelist.txt b/forge-gui/res/cardsfolder/t/trueheart_duelist.txt index 6133dad36ef..842e8c74369 100644 --- a/forge-gui/res/cardsfolder/t/trueheart_duelist.txt +++ b/forge-gui/res/cardsfolder/t/trueheart_duelist.txt @@ -2,8 +2,8 @@ Name:Trueheart Duelist ManaCost:1 W Types:Creature Human Warrior PT:2/2 -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. K:Embalm:2 W DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/trueheart_duelist.jpg -Oracle:Trueheart Duelist can block an additional creature each combat.\nEmbalm {2}{W} ({2}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a white Zombie Human Warrior with no mana cost. Embalm only as a sorcery.) \ No newline at end of file +Oracle:Trueheart Duelist can block an additional creature each combat.\nEmbalm {2}{W} ({2}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a white Zombie Human Warrior with no mana cost. Embalm only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/t/two_headed_dragon.txt b/forge-gui/res/cardsfolder/t/two_headed_dragon.txt index 88952a8c92f..c104e2a08bd 100644 --- a/forge-gui/res/cardsfolder/t/two_headed_dragon.txt +++ b/forge-gui/res/cardsfolder/t/two_headed_dragon.txt @@ -4,7 +4,7 @@ Types:Creature Dragon PT:4/4 K:Flying K:Menace -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. A:AB$ Pump | Cost$ 1 R | NumAtt$ +2 | NumDef$ +0 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/two_headed_dragon.jpg Oracle:Flying\nMenace (This creature can't be blocked except by two or more creatures.)\nTwo-Headed Dragon can block an additional creature each combat.\n{1}{R}: Two-Headed Dragon gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys.txt b/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys.txt index d408f474bdf..09c8eef1615 100644 --- a/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys.txt +++ b/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys.txt @@ -3,6 +3,6 @@ ManaCost:4 R Types:Creature Giant PT:4/4 K:Trample -K:CARDNAME can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 1 | Description$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/two_headed_giant_of_foriys.jpg Oracle:Trample\nTwo-Headed Giant of Foriys can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys_avatar.txt b/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys_avatar.txt index e8cb3bc6ded..2c9038a5e81 100644 --- a/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys_avatar.txt +++ b/forge-gui/res/cardsfolder/t/two_headed_giant_of_foriys_avatar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+1/-4 S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddKeyword$ Menace | Description$ Creatures you control have menace. (They can't be blocked except by two or more creatures.) -S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | Description$ Each creature you control can block an additional creature each combat. +S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | CanBlockAmount$ 1 | Description$ Each creature you control can block an additional creature each combat. SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Two-Headed Giant of Foriys Avatar.full.jpg -Oracle:Hand +1, life -4\nCreatures you control have menace. (They can't be blocked except by two or more creatures.)\nEach creature you control can block an additional creature each combat. \ No newline at end of file +Oracle:Hand +1, life -4\nCreatures you control have menace. (They can't be blocked except by two or more creatures.)\nEach creature you control can block an additional creature each combat. diff --git a/forge-gui/res/cardsfolder/upcoming/alela_artful_provocateur.txt b/forge-gui/res/cardsfolder/upcoming/alela_artful_provocateur.txt new file mode 100644 index 00000000000..90269915dfc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/alela_artful_provocateur.txt @@ -0,0 +1,14 @@ +Name:Alela, Artful Provocateur +ManaCost:1 W U B +Types:Legendary Creature Faerie Warlock +PT:2/3 +K:Flying +K:Deathtouch +K:Lifelink +S:Mode$ Continuous | Affected$ Creature.withFlying+Other+YouCtrl | AddPower$ 1 | Description$ Other creatures you control with flying get +1/+0. +SVar:PlayMain1:TRUE +T:Mode$ SpellCast | ValidCard$ Artifact,Enchantment | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an artifact or enchantment spell, create a 1/1 blue Faerie creature token with flying. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_1_1_faerie_flying | TokenOwner$ You | LegacyImage$ u 1 1 faerie flying eld +SVar:BuffedBy:Artifact,Enchantment +DeckHints:Type$Artifact | Enchantment +Oracle:Flying, deathtouch, lifelink\nOther creatures you control with flying get +1/+0.\nWhenever you cast an artifact or enchantment spell, create a 1/1 blue Faerie creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/all_that_glitters.txt b/forge-gui/res/cardsfolder/upcoming/all_that_glitters.txt new file mode 100644 index 00000000000..c010c289fc2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/all_that_glitters.txt @@ -0,0 +1,10 @@ +Name:All That Glitters +ManaCost:1 W +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ X | AddToughness$ X | References$ X | Description$ Enchanted creature gets +1/+1 for each artifact and/or enchantment you control. +SVar:X:Count$Valid Artifact.YouCtrl,Enchantment.YouCtrl +SVar:BuffedBy:Artifact,Enchantment +DeckHints:Type$Artifact|Enchantment +Oracle:Enchant creature\nEnchanted creature gets +1/+1 for each artifact and/or enchantment you control. diff --git a/forge-gui/res/cardsfolder/upcoming/arcanists_owl.txt b/forge-gui/res/cardsfolder/upcoming/arcanists_owl.txt new file mode 100644 index 00000000000..bc1a12c4223 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcanists_owl.txt @@ -0,0 +1,8 @@ +Name:Arcanist's Owl +ManaCost:W/U W/U W/U W/U +Types:Artifact Creature Bird +PT:3/3 +K:Flying +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library. You may reveal an artifact or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Artifact,Enchantment | RestRandomOrder$ True | RestRandomOrder$ True +Oracle:Flying\nWhen Arcanist's Owl enters the battlefield, look at the top four cards of your library. You may reveal an artifact or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/bake_into_a_pie.txt b/forge-gui/res/cardsfolder/upcoming/bake_into_a_pie.txt new file mode 100644 index 00000000000..1f226e4432c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bake_into_a_pie.txt @@ -0,0 +1,7 @@ +Name:Bake into a Pie +ManaCost:2 B B +Types:Instant +A:SP$ Destroy | Cost$ 2 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBToken | SpellDescription$ Destroy target creature. Create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +DeckHas:Ability$LifeGain +Oracle:Destroy target creature. Create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/banish_into_fable.txt b/forge-gui/res/cardsfolder/upcoming/banish_into_fable.txt new file mode 100644 index 00000000000..4aab936b038 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/banish_into_fable.txt @@ -0,0 +1,10 @@ +Name:Banish into Fable +ManaCost:4 W U +Types:Instant +T:Mode$ SpellCast | ValidCard$ Card.Self+wasCastFromHand | Execute$ TrigCopy | TriggerDescription$ When you cast this spell from your hand, copy it if you control an artifact, then copy it if you control an enchantment. You may choose new targets for the copies. +SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ GE1 | SubAbility$ DBCopy +SVar:DBCopy:DB$ CopySpellAbility| Defined$ TriggeredSpellAbility | ConditionPresent$ Enchantment.YouCtrl | ConditionCompare$ GE1 +A:SP$ ChangeZone | Cost$ 4 W U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBToken | SpellDescription$ Return target nonland permanent to its owner's hand. You create a 2/2 white Knight creature token with vigilance. +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You | LegacyImage$ w 2 2 knight vigilance eld +DeckHas:Ability$Token +Oracle:When you cast this spell from your hand, copy it if you control an artifact, then copy it if you control an enchantment. You may choose new targets for the copies.\nReturn target nonland permanent to its owner's hand. You create a 2/2 white Knight creature token with vigilance. diff --git a/forge-gui/res/cardsfolder/upcoming/belle_of_the_brawl.txt b/forge-gui/res/cardsfolder/upcoming/belle_of_the_brawl.txt new file mode 100644 index 00000000000..0f28dc9cafc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/belle_of_the_brawl.txt @@ -0,0 +1,9 @@ +Name:Belle of the Brawl +ManaCost:2 B +Types:Creature Human Knight +PT:3/2 +K:Menance +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, other Knights you control get +1/+0 until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Knight.YouCtrl+Other | NumAtt$ 1 +DeckHints:Type$Knight +Oracle:Menance\nWhenever Belle of the Brawl attacks, other Knights you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/chittering_witch.txt b/forge-gui/res/cardsfolder/upcoming/chittering_witch.txt new file mode 100644 index 00000000000..f2130f0197b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chittering_witch.txt @@ -0,0 +1,10 @@ +Name:Chittering Witch +ManaCost:3 B +Types:Creature Human Warlock +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 1/1 black Rat creature tokens equal to the number of opponents you have. +SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ b_1_1_rat | TokenOwner$ You | LegacyImage$ b 1 1 rat eld | References$ X +SVar:X:PlayerCountOpponents$Amount +A:AB$ Pump | Cost$ 1 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. +AI:RemoveDeck:All +Oracle:When Chittering Witch enters the battlefield, create a number of 1/1 black Rat creature tokens equal to the number of opponents you have.\n{1}{B}, Sacrifice a creature: Target creature gets -2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/corridor_monitor.txt b/forge-gui/res/cardsfolder/upcoming/corridor_monitor.txt new file mode 100644 index 00000000000..a7c4ab70133 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/corridor_monitor.txt @@ -0,0 +1,7 @@ +Name:Corridor Monitor +ManaCost:1 U +Types:Artifact Creature Construct +PT:1/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap target artifact or creature you control. +SVar:TrigUntap:DB$ Untap | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TgtPrompt$ Choose target artifact or creature you control. +Oracle:When Corridor Monitor enters the battlefield, untap target artifact or creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/crystal_slipper.txt b/forge-gui/res/cardsfolder/upcoming/crystal_slipper.txt new file mode 100644 index 00000000000..5d89ec8c092 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/crystal_slipper.txt @@ -0,0 +1,6 @@ +Name:Crystal Slipper +ManaCost:1 R +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddKeyword$ Haste | Description$ Equipped creature gets +1/+0 and has haste. +K:Equip:1 +Oracle:Equipped creature gets +1/+0 and has haste.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt b/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt new file mode 100644 index 00000000000..b76ada65fcd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/embereth_paladin.txt @@ -0,0 +1,9 @@ +Name:Embereth Paladin +ManaCost:3 R +Types:Creature Human Knight +PT:4/1 +K:Haste +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | Adamant$ Red | ReplaceWith$ ETBAddCounter | Description$ Adamant — If at least three red mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +SVar:ETBAddCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +Oracle:Haste\nAdamant — If at least three red mana was spent to cast this spell, Embereth Paladin enters the battlefield with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/embereth_skyblazer.txt b/forge-gui/res/cardsfolder/upcoming/embereth_skyblazer.txt new file mode 100644 index 00000000000..9d234610c0f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/embereth_skyblazer.txt @@ -0,0 +1,9 @@ +Name:Embereth Skyblazer +ManaCost:3 R +Types:Creature Human Knight +PT:4/3 +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Flying | Condition$ PlayerTurn | Description$ As long as it's your turn, CARDNAME has flying. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, you may pay {2}{R}. If you do, creatures you control get +X/+0 until end of turn, where X is the number of opponents you have. +SVar:TrigPumpAll:AB$ PumpAll | Cost$ 2 R | ValidCards$ Creature.YouCtrl | NumAtt$ +X | References$ X +SVar:X:PlayerCountOpponents$Amount +Oracle:As long as it's your turn, Embereth Skyblazer has flying.\nWhenever Embereth Skyblazer attacks, you may pay {2}{R}. If you do, creatures you control get +X/+0 until end of turn, where X is the number of opponents you have. diff --git a/forge-gui/res/cardsfolder/upcoming/eye_collector.txt b/forge-gui/res/cardsfolder/upcoming/eye_collector.txt new file mode 100644 index 00000000000..d7c466491f5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/eye_collector.txt @@ -0,0 +1,8 @@ +Name:Eye Collector +ManaCost:B +Types:Creature Faerie +PT:1/1 +K:Flying +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigMill | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, each player puts the top card of their library into their graveyard. +SVar:TrigMill:DB$Mill | NumCards$ 1 | Defined$ Player +Oracle:Flying\nWhenever Eye Collector deals combat damage to a player, each player puts the top card of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_formation.txt b/forge-gui/res/cardsfolder/upcoming/faerie_formation.txt new file mode 100644 index 00000000000..d5951dffad7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/faerie_formation.txt @@ -0,0 +1,8 @@ +Name:Faerie Formation +ManaCost:4 U +Types:Creature Faerie +PT:5/4 +K:Flying +A:AB$ Token | Cost$ 3 U | TokenAmount$ 1 | TokenScript$ u_1_1_faerie_flying | TokenOwner$ You | LegacyImage$ u 1 1 faerie flying eld | SubAbility$ DBDraw | SpellDescription$ Create a 1/1 blue Faerie creature token with flying. Draw a card. +SVar:DBDraw:DB$Draw | NumCards$ 1 +Oracle:Flying\n{3}{U}: Create a 1/1 blue Faerie creature token with flying. Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_vandal.txt b/forge-gui/res/cardsfolder/upcoming/faerie_vandal.txt new file mode 100644 index 00000000000..d75cabc8602 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/faerie_vandal.txt @@ -0,0 +1,10 @@ +Name:Faerie Vandal +ManaCost:1 U +Types:Creature Faerie Rogue +PT:1/2 +K:Flash +K:Flying +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you draw your second card each turn, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +AI:RemoveDeck:Random +Oracle:Flash\nFlying\nWhenever you draw your second card each turn, put a +1/+1 counter on Faerie Vandal. diff --git a/forge-gui/res/cardsfolder/upcoming/fireborn_knight.txt b/forge-gui/res/cardsfolder/upcoming/fireborn_knight.txt new file mode 100644 index 00000000000..eec17b67b89 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fireborn_knight.txt @@ -0,0 +1,7 @@ +Name:Fireborn Knight +ManaCost:R/W R/W R/W R/W +Types:Creature Human Knight +PT:2/3 +K:Double Strike +A:AB$ Pump | Cost$ RW RW RW RW | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. +Oracle:Double strike\n{R/W}{R/W}{R/W}{R/W}: Fireborn Knight gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/frogify.txt b/forge-gui/res/cardsfolder/upcoming/frogify.txt new file mode 100644 index 00000000000..bc07c2bdbb5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/frogify.txt @@ -0,0 +1,7 @@ +Name:Frogify +ManaCost:1 U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | SetPower$ 1 | SetToughness$ 1 | SetColor$ Blue | RemoveAllAbilities$ True | AddType$ Creature & Frog | RemoveCardTypes$ True | RemoveCreatureTypes$ True | Description$ Enchanted creature loses all abilities and is a blue Frog creature with base power and toughness 1/1. +Oracle:Enchant creature\nEnchanted creature loses all abilities and is a blue Frog creature with base power and toughness 1/1. (It loses all other card types and creature types.) diff --git a/forge-gui/res/cardsfolder/upcoming/garruk_cursed_huntsman.txt b/forge-gui/res/cardsfolder/upcoming/garruk_cursed_huntsman.txt new file mode 100644 index 00000000000..b5decbca13e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/garruk_cursed_huntsman.txt @@ -0,0 +1,11 @@ +Name:Garruk, Cursed Huntsman +Types:Legendary Planeswalker Garruk +ManaCost:4 B G +Loyalty:5 +A:AB$ Token | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | LegacyImage$ bg 2 2 wolf garruk eld | TokenAmount$ 2 | TokenScript$ bg_2_2_wolf_garruk | TokenOwner$ You | SpellDescription$ Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control." +A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Planeswalker$ True | SubAbility$ DBDraw | SpellDescription$ Destroy target creature. Draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 +A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Name$ Emblem - Garruk, Cursed Hunstman | Image$ emblem_garruk_cursed_hunstman | StaticAbilities$ STTrample | Planeswalker$ True | Ultimate$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +3/+3 and have trample." +SVar:STTrample:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Trample | AddPower$ 3 | AddToughness$ 3 | Description$ Creatures you control get +3/+3 and have trample. +DeckHas:Ability$Token +Oracle:[0]: Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control."\n[-3]: Destroy target creature. Draw a card.\n:[-6]: You get an emblem with "Creatures you control get +3/+3 and have trample." diff --git a/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt b/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt new file mode 100644 index 00000000000..dd8cd58571c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gilded_goose.txt @@ -0,0 +1,11 @@ +Name:Gilded Goose +ManaCost:G +Types:Creature Bird +PT:0/2 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFood | TriggerDescription$ When CARDNAME enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigFood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +A:AB$ Token | Cost$ 1 G T | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | SpellDescription$ Create a Food Token. +A:AB$ Mana | Cost$ T Sac<1/Food> | Produced$ Any | SpellDescription$ Add one mana of any color. +DeckHas:Ability$LifeGain +Oracle:Flying\nWhen Gilded Goose enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{1}{G}, {T}: Create a Food token.\n{T}, Sacrifice a Food: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/gluttonous_troll.txt b/forge-gui/res/cardsfolder/upcoming/gluttonous_troll.txt new file mode 100644 index 00000000000..96c2f493bf0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gluttonous_troll.txt @@ -0,0 +1,12 @@ +Name:Gluttonous Troll +ManaCost:2 B G +Types:Creature Troll +PT:3/3 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of Food tokens equal to the number of opponents you have. (Food tokens are artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ X | References$ X | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +SVar:X:PlayerCountOpponents$Amount +SVar:PlayMain1:TRUE +DeckHas:Ability$Token +A:AB$ Pump | Cost$ 1 G Sac<1/Permanent.Other/another nonland permanent> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. +Oracle:Trample\nWhen Gluttonous Troll enters the battlefield, create a number of Food tokens equal to the number of opponents you have. (Food tokens are artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{1}{G}, Sacrifice another nonland permanent: Gluttonous Troll gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/golden_egg.txt b/forge-gui/res/cardsfolder/upcoming/golden_egg.txt new file mode 100644 index 00000000000..da8a981a901 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/golden_egg.txt @@ -0,0 +1,8 @@ +Name:Golden Egg +ManaCost:2 +Types:Artifact Food +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ FreeCard | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:FreeCard:DB$ Draw | Defined$ You | NumCards$ 1 +A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ Any | SpellDescription$ Add one mana of any color. +A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME> | Defined$ You | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +Oracle:When Golden Egg enters the battlefield, draw a card.\n{1}, {T}, Sacrifice Golden Egg: Add one mana of any color.\n{2}, {T}, Sacrifice Golden Egg: You gain 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/heraldic_banner.txt b/forge-gui/res/cardsfolder/upcoming/heraldic_banner.txt new file mode 100644 index 00000000000..4146dfe3285 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/heraldic_banner.txt @@ -0,0 +1,9 @@ +Name:Heraldic Banner +ManaCost:3 +Types:Artifact +K:ETBReplacement:Other:ChooseColor +SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a color. | AILogic$ MostProminentHumanCreatures +S:Mode$ Continuous | Affected$ Creature.ChosenColor+YouCtrl | AddPower$ 1 | Description$ Creatures you control of the chosen color get +1/+0. +A:AB$ Mana | Cost$ T | Produced$ Chosen | SpellDescription$ Add one mana of the chosen color. +SVar:PlayMain1:TRUE +Oracle:As Heraldic Banner enters the battlefield, choose a color.\nCreatures you control of the chosen color get +1/+0.\n{T}: Add one mana of the chosen color. diff --git a/forge-gui/res/cardsfolder/upcoming/inspiring_veteran.txt b/forge-gui/res/cardsfolder/upcoming/inspiring_veteran.txt new file mode 100644 index 00000000000..3ab04271a23 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/inspiring_veteran.txt @@ -0,0 +1,8 @@ +Name:Inspiring Veteran +ManaCost:R W +Types:Creature Human Knight +PT:2/2 +S:Mode$ Continuous | Affected$ Knight.YouCtrl+Other | AddPower$ 1 | AddToughness$ 1 | Description$ Other Knights you control get +1/+1. +SVar:PlayMain1:TRUE +DeckHints:Type$Knight +Oracle:Other Knights you control get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/keeper_of_fables.txt b/forge-gui/res/cardsfolder/upcoming/keeper_of_fables.txt new file mode 100644 index 00000000000..514c6fba44e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/keeper_of_fables.txt @@ -0,0 +1,7 @@ +Name:Keeper of Fables +ManaCost:3 G G +Types:Creature Cat +PT:4/5 +T:Mode$ DamageDoneOnce | ValidSource$ Creature.nonHuman+YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever one or more non-Human creatures you control deal combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +Oracle:Whenever one or more non-Human creatures you control deal combat damage to a player, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/knights_charge.txt b/forge-gui/res/cardsfolder/upcoming/knights_charge.txt new file mode 100644 index 00000000000..d02512c705b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/knights_charge.txt @@ -0,0 +1,10 @@ +Name:Knights' Charge +ManaCost:1 W B +Types:Enchantment +T:Mode$ Attacks | ValidCard$ Card.Knight+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever a Knight you control attacks, each opponent loses 1 life and you gain 1 life. +SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1 +A:AB$ ChangeZoneAll | Cost$ 6 W B Sac<1/CARDNAME> | ChangeType$ Card.Knight+Creature+YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return all Knight creature cards from your graveyard to the battlefield. +DeckHints:Type$Knight +SVar:BuffedBy:Knight +Oracle:Whenever a Knight you control attacks, each opponent loses 1 life and you gain 1 life.\n{6}{W}{B}, Sacrifice Knights' Charge: Return all Knight creature cards from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/korvold_fae_cursed_king.txt b/forge-gui/res/cardsfolder/upcoming/korvold_fae_cursed_king.txt new file mode 100644 index 00000000000..cf1098c79c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/korvold_fae_cursed_king.txt @@ -0,0 +1,15 @@ +Name:Korvold, Fae-Cursed King +ManaCost:2 B R G +Types:Legendary Creature Dragon Noble +PT:4/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, sacrifice another permanent. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, sacrifice another permanent. +SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Permanent.Other +SVar:NeedsToPlay:Permanent.YouCtrl+cmcLE2 +T:Mode$ Sacrificed | ValidCard$ Permanent | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a permanent, put a +1/+1 counter on CARDNAME and draw a card. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +AI:RemoveDeck:Random +SVar:BuffedBy:Permanent.YouCtrl +Oracle:Flying\nWhenever Korvold, Fae-Cursed King enters the battlefield or attacks, sacrifice another permanent.\nWhenever you sacrifice a permanent, put a +1/+1 counter on Korvold and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/mace_of_the_valiant.txt b/forge-gui/res/cardsfolder/upcoming/mace_of_the_valiant.txt new file mode 100644 index 00000000000..74a5c24fddb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mace_of_the_valiant.txt @@ -0,0 +1,12 @@ +Name:Mace of the Valiant +ManaCost:2 W +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ X | AddKeyword$ Vigilance | Description$ Equipped creature gets +1/+1 for each charge counter on CARDNAME and has vigilance. +SVar:X:Count$CardCounters.CHARGE +SVar:NeedsToPlayVar:X GE3 +AI:RemoveDeck:Random +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature enters the battlefield under your control, put a charge counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 +SVar:BuffedBy:Creature +K:Equip:3 +Oracle:Equipped creature gets +1/+1 for each charge counter on Mace of the Valiant and has vigilance.\nWhenever a creature enters the battlefield under your control, put a charge counter on Mace of the Valiant.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/upcoming/maraleaf_pixie.txt b/forge-gui/res/cardsfolder/upcoming/maraleaf_pixie.txt new file mode 100644 index 00000000000..c337e03e800 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/maraleaf_pixie.txt @@ -0,0 +1,8 @@ +Name:Maraleaf Pixie +ManaCost:G U +Types:Creature Faerie +PT:2/2 +K:Flying +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Flying\n{T}: Add {G} or {U}. diff --git a/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt b/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt new file mode 100644 index 00000000000..a92cf6c1230 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/midnight_clock.txt @@ -0,0 +1,13 @@ +Name:Midnight Clock +ManaCost:2 U +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ PutCounter | Cost$ 2 U | CounterType$ HOUR | CounterNum$ 1 | SpellDescription$ Put an hour counter on CARDNAME. +AI:RemoveDeck:Random +T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each upkeep, put an hour counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ HOUR | CounterNum$ 1 +T:Mode$ CounterAdded | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ HOUR | CounterAmount$ EQ12 | Execute$ TrigChangeAll | TriggerDescription$ When the twelfth hour counter is put on CARDNAME, shuffle your hand and graveyard into your library, then draw seven cards. Exile CARDNAME. +SVar:TrigChangeAll:DB$ ChangeZoneAll | Origin$ Graveyard,Hand | Destination$ Library | ChangeType$ Card.YouOwn | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 7 | SubAbility$ DBExile +SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile +Oracle:{T}: Add {U}.\n{2}{U}: Put an hour counter on Midnight Clock.\nAt the beginning of each upkeep, put an hour counter on Midnight Clock.\nWhen the twelfth hour counter is put on Midnight Clock, shuffle your hand and graveyard into your library, then draw seven cards. Exile Midnight Clock. diff --git a/forge-gui/res/cardsfolder/upcoming/oko_thief_of_crowns.txt b/forge-gui/res/cardsfolder/upcoming/oko_thief_of_crowns.txt new file mode 100644 index 00000000000..84dd9bc8ab8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/oko_thief_of_crowns.txt @@ -0,0 +1,9 @@ +Name:Oko, Thief of Crowns +ManaCost:1 G U +Types:Legendary Planeswalker Oko +Loyalty:4 +A:AB$ Token | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | SpellDescription$ Create a Food Token. +A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | Power$ 3 | Toughness$ 3 | RemoveAllAbilities$ True | Colors$ Green | OverwriteColors$ True | Types$ Creature,Elk | RemoveCreatureTypes$ True | RemoveCardTypes$ True | Permanent$ True | SpellDescription$ Target artifact or creature loses all abilities and becomes a green Elk creature with base power and toughness 3/3. +A:AB$ Pump | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | AITgts$ Artifact.YouCtrl+cmcLE1 | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TgtPrompt$ Choose target artifact or creature you control | SubAbility$ OkoExchange | SpellDescription$ Exchange control of target artifact or creature you control and target creature an opponent controls with power 3 or less. +SVar:OkoExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl+powerLE3 | TgtPrompt$ Choose target creature an opponent controls with power 3 or less +Oracle:[+2]: Create a Food Token.\n[+1]: Target artifact or creature loses all abilities and becomes a green Elk creature with base power and toughness 3/3.\n[-5]: Exchange control of target artifact or creature you control and target creature an opponent controls with power 3 or less. diff --git a/forge-gui/res/cardsfolder/upcoming/piper_of_the_swarm.txt b/forge-gui/res/cardsfolder/upcoming/piper_of_the_swarm.txt new file mode 100644 index 00000000000..cf376559189 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/piper_of_the_swarm.txt @@ -0,0 +1,11 @@ +Name:Piper of the Swarm +ManaCost:1 B +Types:Creature Human Warlock +PT:1/3 +S:Mode$ Continuous | Affected$ Rat.YouCtrl | AddKeyword$ Menace | Description$ Rats you control have menace. +SVar:PlayMain1:TRUE +DeckHints:Type$Rat +A:AB$ Token | Cost$ 1 B T | TokenAmount$ 1 | TokenScript$ b_1_1_rat | TokenOwner$ You | LegacyImage$ b 1 1 rat eld | SpellDescription$ Create a 1/1 black Rat creature token. +A:AB$ GainControl | Cost$ 2 B B T Sac<3/Rat> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Gain control of target creature. +AI:RemoveDeck:All +Oracle:Rats you control have menace.\n{1}{B}, {T}: Create a 1/1 black Rat creature token.\n{2}{B}{B}, {T}, Sacrifice three Rats: Gain control of target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/rankle_master_of_pranks.txt b/forge-gui/res/cardsfolder/upcoming/rankle_master_of_pranks.txt new file mode 100644 index 00000000000..dc56299cd37 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rankle_master_of_pranks.txt @@ -0,0 +1,13 @@ +Name:Rankle, Master of Pranks +ManaCost:2 B B +Types:Legendary Creature Faerie Rogue +PT:3/3 +K:Flying +K:Haste +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigCharm | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ DBDiscard,DBLoseLife,DBSac | MinCharmNum$ 0 | CharmNum$ 3 +SVar:DBDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Player | SpellDescription$ Each player discards a card. +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 | Defined$ Player | SubAbility$ DBDraw | SpellDescription$ Each player loses 1 life and draws a card. +SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 1 +SVar:DBSac:DB$ Sacrifice | SacValid$ Creature | Defined$ Player | SpellDescription$ Each player sacrifices a creature. +Oracle:Flying, haste\nWhenever Rankle, Master of Pranks deals combat damage to a player, choose any number —\n• Each player discards a card.\n• Each player loses 1 life and draws a card.\n• Each player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/upcoming/run_away_together.txt b/forge-gui/res/cardsfolder/upcoming/run_away_together.txt new file mode 100644 index 00000000000..7d039ac73cd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/run_away_together.txt @@ -0,0 +1,5 @@ +Name:Run Away Together +ManaCost:1 U +Types:Instant +A:SP$ ChangeZone | Cost$ 1 U | TargetMin$ 2 | TargetMax$ 2 | TargetsWithDifferentControllers$ True | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Choose two target creatures by different players. Return those creatures to their owners' hands. +Oracle:Choose two target creatures controlled by different players. Return those creatures to their owners' hands. diff --git a/forge-gui/res/cardsfolder/upcoming/savvy_hunter.txt b/forge-gui/res/cardsfolder/upcoming/savvy_hunter.txt new file mode 100644 index 00000000000..e165dc5b962 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/savvy_hunter.txt @@ -0,0 +1,10 @@ +Name:Savvy Hunter +ManaCost:1 B G +Types:Creature Human Warrior +PT:3/3 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks or blocks, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +SVar:HasAttackEffect:TRUE +A:AB$ Draw | Cost$ Sac<2/Food> | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Whenever Savvy Hunter attacks or blocks, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\nSacrifice two Foods: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/shambling_suit.txt b/forge-gui/res/cardsfolder/upcoming/shambling_suit.txt new file mode 100644 index 00000000000..04c4dc70ae6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shambling_suit.txt @@ -0,0 +1,7 @@ +Name:Shambling Suit +ManaCost:3 +Types:Artifact Creature Construct +PT:*/3 +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | References$ X | Description$ CARDNAME's power is equal to the number of artifacts and/or enchantments you control. +SVar:X:Count$Valid Artifact.YouCtrl,Enchantment.YouCtrl +Oracle:Shambling Suit's power is equal to the number of artifacts and/or enchantments you control. diff --git a/forge-gui/res/cardsfolder/upcoming/shimmer_dragon.txt b/forge-gui/res/cardsfolder/upcoming/shimmer_dragon.txt new file mode 100644 index 00000000000..f76836c523d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shimmer_dragon.txt @@ -0,0 +1,10 @@ +Name:Shimmer Dragon +ManaCost:4 U U +Types:Creature Dragon +PT:5/6 +K:Flying +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Hexproof | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE4 | Description$ As long as you control four or more artifacts, CARDNAME has hexproof. +A:AB$ Draw | Cost$ tapXType<2/Artifact> | NumCards$ 1 | SpellDescription$ Draw a card. +SVar:BuffedBy:Artifact +DeckHints:Type$Artifact +Oracle:Flying\nAs long as you control four or more artifacts, Shimmer Dragon has hexproof.\nTap two untapped artifacts you control: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/shinechaser.txt b/forge-gui/res/cardsfolder/upcoming/shinechaser.txt new file mode 100644 index 00000000000..f8dc1c7309c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shinechaser.txt @@ -0,0 +1,10 @@ +Name:Shinechaser +ManaCost:1 W U +Types:Creature Faerie +PT:1/1 +K:Flying +K:Vigilance +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Artifact.YouCtrl | Description$ CARDNAME gets +1/+1 as long as you control an artifact. +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Enchantment.YouCtrl | Description$ CARDNAME gets +1/+1 as long as you control an enchantment. +SVar:BuffedBy:Enchantment,Artifact +Oracle:Flying, vigilance\nShinechaser gets +1/+1 as long as you control an artifact.\nShinechaser gets +1/+1 as long as you control an enchantment. diff --git a/forge-gui/res/cardsfolder/upcoming/shining_armor.txt b/forge-gui/res/cardsfolder/upcoming/shining_armor.txt new file mode 100644 index 00000000000..68e38c4abe4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shining_armor.txt @@ -0,0 +1,11 @@ +Name:Shining Armor +ManaCost:1 W +Types:Artifact Equipment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target Knight you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Knight.YouCtrl | TgtPrompt$ Select target Knight you control +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Equipped creature gets +0/+2 and has vigilance. +K:Equip:3 +SVar:BuffedBy:Knight +DeckHints:Type$Knight +Oracle:Flash\nWhen Shining Armor enters the battlefield, attach it to target Knight you control.\nEquipped creature gets +0/+2 and has vigilance.\Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt b/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt new file mode 100644 index 00000000000..7692b568a9b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverflame_ritual.txt @@ -0,0 +1,7 @@ +Name:Silverflame Ritual +ManaCost:3 W +Types:Sorcery +A:SP$ PutCounterAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPumpAll | SpellDescription$ Put a +1/+1 counter on each creature you control. Adamant — If at least three white mana was spent to cast this spell, creatures you control gain vigilance until end of turn. +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionCheckSVar$ X | References$ X +SVar:X:Count$Adamant.White.1.0 +Oracle:Put a +1/+1 counter on each creature you control.\nAdamant — If at least three white mana was spent to cast this spell, creatures you control gain vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/silverwing_squadron.txt b/forge-gui/res/cardsfolder/upcoming/silverwing_squadron.txt new file mode 100644 index 00000000000..ec7e1b888ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverwing_squadron.txt @@ -0,0 +1,14 @@ +Name:Silverwing Squadron +ManaCost:5 W +Types:Creature Human Knight +PT:*/* +K:Flying +K:Vigilance +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of creatures you control. +SVar:X:Count$Valid Creature.YouCtrl +SVar:BuffedBy:Creature +SVar:NoZeroToughnessAI:True +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you have. +SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ Y | TokenScript$ w_2_2_knight_vigilance | LegacyImage$ w 2 2 knight vigilance eld | References$ Y +SVar:Y:PlayerCountOpponents$Amount +Oracle:Flying, vigilance\nSilverwing Squadron's power and toughness are each equal to the number of creatures you control.\nWhenever Silverwing Squadron attacks, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you have. diff --git a/forge-gui/res/cardsfolder/upcoming/slaying_fire.txt b/forge-gui/res/cardsfolder/upcoming/slaying_fire.txt new file mode 100644 index 00000000000..8476797dfaa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slaying_fire.txt @@ -0,0 +1,6 @@ +Name:Slaying Fire +ManaCost:2 R +Types:Instant +A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals 3 damage to any target. Adamant — If at least three red mana was spent to cast this spell, it deals 4 damage instead. +SVar:X:Count$Adamant.Red.4.3 +Oracle:Slaying Fire deals 3 damage to any target.\nAdamant — If at least three red mana was spent to cast this spell, it deals 4 damage instead. diff --git a/forge-gui/res/cardsfolder/upcoming/steelbane_hydra.txt b/forge-gui/res/cardsfolder/upcoming/steelbane_hydra.txt new file mode 100644 index 00000000000..600dcc1b8fb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steelbane_hydra.txt @@ -0,0 +1,8 @@ +Name:Steelbane Hydra +ManaCost:X G G +Types:Creature Turtle Hydra +PT:0/0 +K:etbCounter:P1P1:X +SVar:X:Count$xPaid +A:AB$ Destroy | Cost$ 2 G SubCounter<1/P1P1> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. +Oracle:Steelbane Hydra enters the battlefield with X +1/+1 counters on it.\n{2}{G}, Remove a +1/+1 counter from Steelbane Hydra: Destroy target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/upcoming/steelclaw_lance.txt b/forge-gui/res/cardsfolder/upcoming/steelclaw_lance.txt new file mode 100644 index 00000000000..0247261b16f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steelclaw_lance.txt @@ -0,0 +1,7 @@ +Name:Steelclaw Lance +ManaCost:B R +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | Description$ Equipped creature gets +2/+2. +K:Equip:1:Creature.Knight+YouCtrl:Knight +K:Equip:3 +Oracle:Equipped creature gets +2/+2.\nEquip Knight {1} ({1}: Attach to target Knight creature you control. Equip only as a sorcery.)\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashvale.txt b/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashvale.txt new file mode 100644 index 00000000000..2aca904bcd0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syr_gwyn_hero_of_ashvale.txt @@ -0,0 +1,11 @@ +Name:Syr Gwyn, Hero of Ashvale +ManaCost:3 R W B +Types:Legendary Creature Human Knight +PT:5/5 +K:Vigilance +K:Menace +T:Mode$ Attacks | ValidCard$ Creature.YouCtrl+equipped | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an equipped creature you control attacks, you draw a card and you lose 1 life. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 +S:Mode$ Continuous | Affected$ Equipment.YouCtrl | AddKeyword$ Equip:0:Creature.YouCtrl+Knight:Knight | Description$ Equipment you control have equip Knight {0}. +Oracle:Vigilance, menace\nWhenever an equipped creature you control attacks, you draw a card and you lose 1 life.\nEquipment you control have equip Knight {0}. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_konrad_the_grim.txt b/forge-gui/res/cardsfolder/upcoming/syr_konrad_the_grim.txt new file mode 100644 index 00000000000..3d7b61f5af9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syr_konrad_the_grim.txt @@ -0,0 +1,10 @@ +Name:Syr Konrad, the Grim +ManaCost:3 B B +Types:Legendary Creature Human Knight +PT:5/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever another creature dies, or a creature card is put into a graveyard from anywhere than the battlefield, or a creature card leaves your graveyard, CARDNAME deals 1 damage to each opponent. +T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Any | ValidCard$ Card.Creature+Other | TriggerZones$ Battlefield | Execute$ TrigDmg | Secondary$ True | TriggerDescription$ Whenever another creature dies, or a creature card is put into a graveyard from anywhere than the battlefield, or a creature card leaves your graveyard, CARDNAME deals 1 damage to each opponent. +SVar:TrigDmg:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 +A:AB$ Mill | Cost$ 1 B | NumCards$ 1 | Defined$ Player | SpellDescription$ Each player puts the top card of their library into their graveyard. +AI:RemoveDeck:All +Oracle:Whenever another creature dies, or a creature card is put into a graveyard from anywhere other than the battlefield, or a creature card leaves your graveyard, Syr Konrad, the Grim deals 1 damage to each opponent.\n{1}{B}: Each player puts the top card of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/taste_of_death.txt b/forge-gui/res/cardsfolder/upcoming/taste_of_death.txt new file mode 100644 index 00000000000..f3e9b865f9c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/taste_of_death.txt @@ -0,0 +1,7 @@ +Name:Taste of Death +ManaCost:4 B B +Types:Sorcery +A:SP$ Sacrifice | Cost$ 4 B B | Amount$ 3 | Defined$ Player | SacValid$ Creature | SpellDescription$ Each player sacrifices three creatures. You create three Food tokens. | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ 3 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +DeckHas:Ability$LifeGain +Oracle:Each player sacrifices three creatures. You create three Food tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/the_circle_of_loyalty.txt b/forge-gui/res/cardsfolder/upcoming/the_circle_of_loyalty.txt new file mode 100644 index 00000000000..16efcc7b77e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_circle_of_loyalty.txt @@ -0,0 +1,14 @@ +Name:The Circle of Loyalty +ManaCost:4 W W +Types:Legendary Artifact +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each Knight you control. +SVar:X:Count$Valid Knight.YouCtrl +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control get +1/+1. +T:Mode$ SpellCast | ValidCard$ Card.Legendary | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a legendary spell, create a 2/2 white Knight creature token with vigilance. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You | LegacyImage$ w 2 2 knight vigilance eld +A:AB$ Token | Cost$ 3 W T | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You | LegacyImage$ w 2 2 knight vigilance eld | SpellDescription$ Create a 2/2 white Knight creature token with vigilance. +SVar:PlayMain1:TRUE +SVar:BuffedBy:Legendary +DeckHas:Ability$Token +DeckHints:Type$Knight +Oracle:This spell costs {1} less to cast for each Knight you control.\nCreatures you control get +1/+1.\nWhenever you cast a legendary spell, create a 2/2 white Knight creature token with vigilance.\n{3}{W}, {T}: Create a 2/2 white Knight creature token with vigilance. diff --git a/forge-gui/res/cardsfolder/upcoming/thorn_mammoth.txt b/forge-gui/res/cardsfolder/upcoming/thorn_mammoth.txt new file mode 100644 index 00000000000..06cfcb29fb2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thorn_mammoth.txt @@ -0,0 +1,9 @@ +Name:Thorn Mammoth +ManaCost:5 G G +Types:Creature Elephant +PT:6/6 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFight | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, CARDNAME fights up to one target creature you don't control. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigFight | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield under your control, CARDNAME fights up to one target creature you don't control. +SVar:TrigFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control | TargetMin$ 0 | TargetMax$ 1 +Oracle:Trample\nWhenever Thorn Mammoth or another creature enters the battlefield under your control, Thorn Mammoth fights up to one target creature you don't control. diff --git a/forge-gui/res/cardsfolder/upcoming/tome_of_legends.txt b/forge-gui/res/cardsfolder/upcoming/tome_of_legends.txt new file mode 100644 index 00000000000..c2becfeeed6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tome_of_legends.txt @@ -0,0 +1,11 @@ +Name:Tome of Legends +ManaCost:2 +Types:Artifact +K:etbCounter:PAGE:1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.IsCommander+YouOwn+YouCtrl | Execute$ TrigPutCounter | TriggerDescription$ Whenever your commander enters the battlefield or attacks, put a page counter on CARDNAME. +T:Mode$ Attacks | ValidCard$ Card.IsCommander+YouOwn+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever your commander enters the battlefield or attacks, put a page counter on CARDNAME. +SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ PAGE | CounterNum$ 1 +SVar:HasAttackEffect:TRUE +DeckHints:Type$IsCommander +A:AB$ Draw | Cost$ 1 T SubCounter<1/PAGE> | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Tome of Legends enters the battlefield with a page counter on it.\nWhenever your commander enters the battlefield or attacks, put a page counter on Tome of Legends.\n{1}, {T}, Remove a page counter from Tome of Legends: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/tome_raider.txt b/forge-gui/res/cardsfolder/upcoming/tome_raider.txt new file mode 100644 index 00000000000..f28b1077eda --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tome_raider.txt @@ -0,0 +1,8 @@ +Name:Tome Raider +ManaCost:2 U +Types:Creature Faerie +PT:1/1 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:Flying\nWhen Tome Raider enters the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/tournament_grounds.txt b/forge-gui/res/cardsfolder/upcoming/tournament_grounds.txt new file mode 100644 index 00000000000..dfaf64e80d0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tournament_grounds.txt @@ -0,0 +1,9 @@ +Name:Tournament Grounds +ManaCost:no cost +Types:Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Mana | Cost$ T | Produced$ R | RestrictValid$ Card.Knight,Card.Equipment | SpellDescription$ Add {R}. Spend this mana only to cast a Knight or Equipment spell. +A:AB$ Mana | Cost$ T | Produced$ W | RestrictValid$ Card.Knight,Card.Equipment | SpellDescription$ Add {W}. Spend this mana only to cast a Knight or Equipment spell. +A:AB$ Mana | Cost$ T | Produced$ B | RestrictValid$ Card.Knight,Card.Equipment | SpellDescription$ Add {B}. Spend this mana only to cast a Knight or Equipment spell. +AI:RemoveDeck:Random +Oracle:{T}: Add {C}.\n{T}: Add {R}, {W}, or {B}. Spend this mana only to cast a Knight or Equipment spell. diff --git a/forge-gui/res/cardsfolder/upcoming/venerable_knight.txt b/forge-gui/res/cardsfolder/upcoming/venerable_knight.txt new file mode 100644 index 00000000000..90adcc55028 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venerable_knight.txt @@ -0,0 +1,8 @@ +Name:Venerable Knight +ManaCost:W +Types:Creature Human Knight +PT:2/1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, put a +1/+1 counter on target Knight you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Knight.YouCtrl | TgtPrompt$ Select target Knight you control | CounterType$ P1P1 | CounterNum$ 1 +DeckHints:Type$Knight +Oracle:When Venerable Knight dies, put a +1/+1 counter on target Knight you control. diff --git a/forge-gui/res/cardsfolder/upcoming/wintermoor_commander.txt b/forge-gui/res/cardsfolder/upcoming/wintermoor_commander.txt new file mode 100644 index 00000000000..8ae9de01b7f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wintermoor_commander.txt @@ -0,0 +1,12 @@ +Name:Wintermoor Commander +ManaCost:W B +Types:Creature Human Knight +PT:2/* +K:Deathtouch +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetToughness$ X | References$ X | Description$ CARDNAME's toughness is equal to the number of Knights you control. +SVar:X:Count$Valid Knight.YouCtrl +SVar:BuffedBy:Knight +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target Knight you control gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) +SVar:TrigPump:DB$ Pump | ValidTgts$ Knight.YouCtrl+Other | TgtPrompt$ Select another target Knight you control | KW$ Indestructible +DeckHints:Type$Knight +Oracle:Deathtouch\nWintermoor Commander's toughness is equal to the number of Knights you control.\nWhenever Wintermoor Commander attacks, another target Knight you control gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/wishful_merfolk.txt b/forge-gui/res/cardsfolder/upcoming/wishful_merfolk.txt new file mode 100644 index 00000000000..fe1d0778d33 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wishful_merfolk.txt @@ -0,0 +1,8 @@ +Name:Wishful Merfolk +ManaCost:1 U +Types:Creature Merfolk +PT:3/2 +K:Defender +A:AB$ Debuff | Cost$ 1 U | Defined$ Self | Keywords$ Defender | SubAbility$ DBAnimate | SpellDescription$ CARDNAME loses defender and becomes a Human until end of turn. +SVar:DBAnimate:DB$Animate | Defined$ Self | Types$ Human | RemoveCreatureTypes$ True +Oracle:Defender\n{1}{U}: Wishful Merfolk loses defender and becomes a Human until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/witching_well.txt b/forge-gui/res/cardsfolder/upcoming/witching_well.txt new file mode 100644 index 00000000000..d0899ba9348 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/witching_well.txt @@ -0,0 +1,7 @@ +Name:Witching Well +ManaCost:U +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on the top in any order.) +SVar:TrigScry:DB$ Scry | ScryNum$ 2 +A:AB$ Draw | Cost$ 3 U Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. +Oracle:When Witching Well enters the battlefield, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on the top in any order.)\n{3}{U}, Sacrifice Witching Well: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt new file mode 100644 index 00000000000..b6b9625fad9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt @@ -0,0 +1,10 @@ +Name:Witch's Cottage +ManaCost:no cost +Types:Land Swamp +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Swamps. +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield +SVar:ETBCheckSVar:Count$Valid Swamp.YouCtrl+Other +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target creature card from your graveyard on top of your library. +SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Library +Oracle:({T}: Add {B}.)\nWitch's Cottage enters the battlefield tapped unless you control three or more other Swamps.\nWhen Witch's Cottage enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_oven.txt b/forge-gui/res/cardsfolder/upcoming/witchs_oven.txt new file mode 100644 index 00000000000..43954e3ade5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/witchs_oven.txt @@ -0,0 +1,9 @@ +Name:Witch's Oven +ManaCost:1 +Types:Artifact +A:AB$ Token | Cost$ T Sac<1/Creature> | TokenAmount$ X | References$ X,Y | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | SpellDescription$ Create a Food token. If the sacrificed creature's toughness was 4 or greater, create two Food tokens instead. (They're artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:AIPreference:SacCost$Creature.token +SVar:X:Count$Compare Y GE4.2.1 +SVar:Y:Sacrificed$CardToughness +AI:RemoveDeck:Random +Oracle:{T}, Sacrifice a creature: Create a Food token. If the sacrificed creature's toughness was 4 or greater, create two Food tokens instead. (They're artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/workshop_elders.txt b/forge-gui/res/cardsfolder/upcoming/workshop_elders.txt new file mode 100644 index 00000000000..8d4ae5b13f5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/workshop_elders.txt @@ -0,0 +1,10 @@ +Name:Workshop Elders +ManaCost:6 U +Types:Creature Human Artificer +PT:4/4 +S:Mode$ Continuous | Affected$ Creature.Artifact+YouCtrl | AddKeyword$ Flying | Description$ Artifact creatures you control have flying. +SVar:PlayMain1:TRUE +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigAnimate | TriggerDescription$ At the beginning of combat on your turn, you may have target noncreature artifact you control becomes a 0/0 artifact creature. If you do, put four +1/+1 counters on it. +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Permanent$ True | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 4 +Oracle:Artifact creatures you control have flying.\nAt the beginning of combat on your turn, you may have target noncreature artifact you control become a 0/0 artifact creature. If you do, put four +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/v/valor_made_real.txt b/forge-gui/res/cardsfolder/v/valor_made_real.txt index f379a1c3649..e8d4b21359a 100644 --- a/forge-gui/res/cardsfolder/v/valor_made_real.txt +++ b/forge-gui/res/cardsfolder/v/valor_made_real.txt @@ -1,7 +1,7 @@ Name:Valor Made Real ManaCost:W Types:Instant -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can block any number of creatures. | SpellDescription$ Target creature can block any number of creatures this turn. +A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | CanBlockAny$ True | SpellDescription$ Target creature can block any number of creatures this turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/valor_made_real.jpg Oracle:Target creature can block any number of creatures this turn. diff --git a/forge-gui/res/cardsfolder/v/vanguards_shield.txt b/forge-gui/res/cardsfolder/v/vanguards_shield.txt index d4a6ebdd5e2..b93594e1094 100644 --- a/forge-gui/res/cardsfolder/v/vanguards_shield.txt +++ b/forge-gui/res/cardsfolder/v/vanguards_shield.txt @@ -2,6 +2,6 @@ Name:Vanguard's Shield ManaCost:2 Types:Artifact Equipment K:Equip:3 -S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. | AddToughness$ 3 | Description$ Equipped creature gets +0/+3 and can block an additional creature each combat. +S:Mode$ Continuous | Affected$ Creature.EquippedBy | CanBlockAmount$ 1 | AddToughness$ 3 | Description$ Equipped creature gets +0/+3 and can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/vanguards_shield.jpg Oracle:Equipped creature gets +0/+3 and can block an additional creature each combat.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/voice_of_many.txt b/forge-gui/res/cardsfolder/v/voice_of_many.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/voice_of_many.txt rename to forge-gui/res/cardsfolder/v/voice_of_many.txt diff --git a/forge-gui/res/cardsfolder/upcoming/volrath_the_shapestealer.txt b/forge-gui/res/cardsfolder/v/volrath_the_shapestealer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/volrath_the_shapestealer.txt rename to forge-gui/res/cardsfolder/v/volrath_the_shapestealer.txt diff --git a/forge-gui/res/cardsfolder/w/wall_of_glare.txt b/forge-gui/res/cardsfolder/w/wall_of_glare.txt index dfd1b83510a..18b87e38225 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_glare.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_glare.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Creature Wall PT:0/5 K:Defender -K:CARDNAME can block any number of creatures. +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAny$ True | Description$ CARDNAME can block any number of creatures. SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_glare.jpg Oracle:Defender (This creature can't attack.)\nWall of Glare can block any number of creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/wall_of_stolen_identity.txt b/forge-gui/res/cardsfolder/w/wall_of_stolen_identity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wall_of_stolen_identity.txt rename to forge-gui/res/cardsfolder/w/wall_of_stolen_identity.txt diff --git a/forge-gui/res/cardsfolder/w/watcher_in_the_web.txt b/forge-gui/res/cardsfolder/w/watcher_in_the_web.txt index 17bafa233a8..a83ed2e9075 100644 --- a/forge-gui/res/cardsfolder/w/watcher_in_the_web.txt +++ b/forge-gui/res/cardsfolder/w/watcher_in_the_web.txt @@ -3,5 +3,5 @@ ManaCost:4 G Types:Creature Spider PT:2/5 K:Reach -K:CARDNAME can block an additional seven creatures each combat. -Oracle:Reach (This creature can block creatures with flying.)\nWatcher in the Web can block an additional seven creatures each combat. \ No newline at end of file +S:Mode$ Continuous | Affected$ Card.Self | CanBlockAmount$ 7 | Description$ CARDNAME can block an additional seven creatures each combat. +Oracle:Reach (This creature can block creatures with flying.)\nWatcher in the Web can block an additional seven creatures each combat. diff --git a/forge-gui/res/cardsfolder/upcoming/wildfire_devils.txt b/forge-gui/res/cardsfolder/w/wildfire_devils.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wildfire_devils.txt rename to forge-gui/res/cardsfolder/w/wildfire_devils.txt diff --git a/forge-gui/res/cardsfolder/y/yare.txt b/forge-gui/res/cardsfolder/y/yare.txt index 22465525609..8ff601136a8 100644 --- a/forge-gui/res/cardsfolder/y/yare.txt +++ b/forge-gui/res/cardsfolder/y/yare.txt @@ -1,7 +1,7 @@ Name:Yare ManaCost:2 W Types:Instant -A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | NumAtt$ 3 | KW$ HIDDEN CARDNAME can block an additional creature each combat. & HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. +A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | NumAtt$ 3 | CanBlockAmount$ 2 | SpellDescription$ Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/yare.jpg Oracle:Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties new file mode 100644 index 00000000000..8f96e54bcac --- /dev/null +++ b/forge-gui/res/languages/zh-CN.properties @@ -0,0 +1,890 @@ +language.name=Chinese (ZH) +#SplashScreen.java +splash.loading.examining-cards=加载牌张,检查文件夹 +splash.loading.cards-folders=从文件夹加载牌张 +splash.loading.cards-archive=从存档中加载牌张 +splash.loading.decks=加载套牌 +splash.loading.processingimagesprites=处理精灵图 +#FControl.java +lblOpeningMainWindow=打开主窗口中 +lblCloseScreen=关闭屏幕 +txCloseAction1=Forge现在支持选项卡导航,可以轻松关闭和切换不同屏幕。因此,您不再需要使用右上角X按钮关闭当前屏幕并返回 +txCloseAction2=请选择右上角的X按钮选择接下来将要进行的操作。此选项保留给未来使用,您将不会再看到此消息,您可以随时在“首选项”中更改此行为 +titCloseAction=选择您的关闭行动 +lblAreYouSureYouWishRestartForge=你确定要重启Forge吗? +lblAreYouSureYouWishExitForge=你确定要退出Forge吗? +lblOneOrMoreGamesActive=一个或多个游戏正处于活动状态 +lblerrLoadingLayoutFile=无法读取您的布局文件:%s。按OK然后删除。\n游戏将以默认布局进行。 +lblLoadingQuest=加载时空竞逐中... +#FScreen.java +lblHome=主页 +lblWorkshop=作坊页面 +lblBacktoHome=回退到主页 +lblDeckEditor=套牌编辑器 +lblCloseEditor=关闭编辑器 +lblCommanderDeckEditor=指挥官套牌编辑器 +lblOathbreakerDeckEditor=破誓者套牌编辑器 +lblTinyLeadersDeckEditor=小指挥官套牌编辑器 +lblBrawlDeckEditor=争锋套牌编辑器 +lblDraftDeckEditor=轮抓套牌编辑器 +lblSealedDeckEditor=现开套牌编辑器 +lblTokenViewer=衍生物查看器 +lblCloseViewer=关闭查看器 +lblQuestDeckEditor=竞逐套牌编辑器 +lblQuestTournamentDeckEditor=竞逐比赛套牌编辑器 +lblSpellShop=轮替商店 +lblLeaveShop=离开商店 +lblLeaveDraft=离开轮抓 +lblBazaar=珍宝集市 +lblConcedeGame=认输这场游戏 +txerrFailedtodeletelayoutfile=删除布局文件失败。 +#VSubmenuPreferences.java +Preferences=偏好 +btnReset=重置到默认偏好 +btnDeleteMatchUI=重置匹配布局 +btnDeleteEditorUI=重置编辑器布局 +btnDeleteWorkshopUI=重置游戏界面 +btnUserProfileUI=打开用户目录 +btnContentDirectoryUI=打开内容目录 +btnResetJavaFutureCompatibilityWarnings=重置Java兼容性警告 +btnClearImageCache=清除图片缓存 +btnTokenPreviewer=衍生物预览器 +btnCopyToClipboard=复制到剪切板 +cbpSelectLanguage=语言 +nlSelectLanguage=选择语言(除了正在进行中的游戏)(需要重新启动) +cbRemoveSmall=删除小生物 +cbCardBased=包括基于单卡生成的套牌 +cbSingletons=单张模式 +cbRemoveArtifacts=删除神器 +cbAnte=赌博模式 +cbAnteMatchRarity=赌注稀有度匹配 +cbEnableAICheats=允许AI作弊 +cbManaBurn=法术力灼烧 +cbManaLostPrompt=提示法术力池将要清空 +cbDevMode=开发人员模式 +cbLoadCardsLazily=惰性加载卡牌脚本 +cbLoadHistoricFormats=加载史记赛制 +cbWorkshopSyntax=作坊语法检查 +cbEnforceDeckLegality=套牌一致性 +cbSideboardForAI=玩家为AI换备 +cbPerformanceMode=性能模式 +cbFilteredHands=手牌过滤 +cbImageFetcher=自动下载缺失的图片 +cbCloneImgSource=复制使用原始的图片 +cbScaleLarger=将图像缩放的更大 +cbRenderBlackCardBorders=渲染黑卡边框 +cbLargeCardViewers=使用大图查看器 +cbSmallDeckViewer=使用小套牌查看器 +cbDisplayFoil=显示闪卡 +cbRandomFoil=随机闪卡 +cbRandomArtInPools=在生成的卡池中随机加入闪卡 +cbEnableSounds=启用音效 +cbEnableMusic=启用背景音乐 +cbAltSoundSystem=使用备用音效系统 +cbUiForTouchScreen=触摸屏UI增强 +cbTimedTargOverlay=启用定位叠加优化 +cbCompactMainMenu=使用紧凑的主侧边栏菜单 +cbDetailedPaymentDesc=在付费提示中详细描述咒语 +cbPromptFreeBlocks=不阻塞句柄 +cbPauseWhileMinimized=暂停时最小化 +cbCompactPrompt=紧凑型提示 +cbEscapeEndsTurn=使用空格结束回合 +cbPreselectPrevAbOrder=预选能力的顺序 +cbHideReminderText=隐藏提示文字 +cbOpenPacksIndiv=逐个打开补充包 +cbTokensInSeparateRow=在单独一行中显示衍生物 +cbStackCreatures=堆叠生物 +cbFilterLandsByColorId=在启动式异能中按颜色筛选地 +cbShowStormCount=在提示窗中显示风暴计数 +cbRemindOnPriority=获得优先权时高亮提示 +cbUseSentry=自动提交错误报告 +cbpGameLogEntryType=游戏日志详细程度 +cbpCloseAction=关闭动作 +cbpDefaultFontSize=默认字体大小 +cbpAiProfiles=AI强度 +cbpDisplayCurrentCardColors=显示牌张颜色详情 +cbpAutoYieldMode=自动让过 +cbpCounterDisplayType=计数器显示类型 +cbpCounterDisplayLocation=计数器显示区域 +cbpGraveyardOrdering=允许指衍生物进入墓地 +Troubleshooting=故障排除 +GeneralConfiguration=常规配置 +lblPlayerName=玩家名称 +nlPlayerName=设置游戏中Forge将引用的名称 +nlCompactMainMenu=启用节省空间的侧边栏,一次只显示一个菜单组(需要重新启动)。 +nlUseSentry=启用后,会自动向开发人员提交错误报告。 +GamePlay=游戏 +nlpMulliganRule=选择调度规则 +nlpAiProfiles=选择你的AI对手 +nlAnte=确定游戏是否使用赌注 +nlAnteMatchRarity=尝试为所有玩家生成同稀有度赌注 +nlEnableAICheats=允许AI进行作弊以获得优势(对于已经设置了作弊洗牌的AI)。 +nlManaBurn=使用法术力灼烧(M10之前的规则) +nlManaLostPrompt=启用后,如果让过优先权会导致法术力池清空,你将收到一个警告提示。 +nlEnforceDeckLegality=强制每个与环境相关的套牌合法性(最小单卡数,最大单卡数等)。 +nlSideboardForAI=允许用户在构筑赛制中为AI换备牌。 +nlPerformanceMode=禁止其他静态能力检查以加速游戏引擎(警告:对手手牌有闪现单卡能使用时可能会跳过)。 +nlFilteredHands=生成两个起手并发给你最接近套牌地比例的起手(需要重启) +nlCloneImgSource=启用克隆的时候将使用原画而不是克隆牌的画 +nlPromptFreeBlocks=启用后如果你需要支付0来阻挡,则不会提示自动支付0。 +nlPauseWhileMinimized=启用后,Forge将在暂停时最小化(主要用于AI VS AI)。 +nlEscapeEndsTurn=启用后,空格键可以用于结束当前回合的替代按键。 +nlDetailedPaymentDesc=启用后,选择目标和支付费用的时候会显示详细的咒语/异能说明。 +nlShowStormCount=启用后,提示窗格将会显示当前的风暴计数 +nlRemindOnPriority=启用后,获得优先权时玩家区域将闪烁。 +nlPreselectPrevAbOrder=启用后,将预先将异能排序。 +nlpGraveyardOrdering=确定何时让玩家确定同时进入坟场的牌的顺序(最好只在关键操作时启用此选项,比如:瓦拉司的变形兽) +nlpAutoYieldMode=定义自动让过的详细程度(每个异能或者每张卡)。 +RandomDeckGeneration=生成随机套牌 +nlRemoveSmall=在生成的套牌中禁用1/1和0/X生物 +nlSingletons=禁止在生成的套牌中非地牌重复出现 +nlRemoveArtifacts=在生成的套牌中禁用神器牌 +nlCardBased=构建具有更多协同效应的套牌(需要重启) +DeckEditorOptions=套牌编辑器选项 +nlFilterLandsByColorId=当使用牌张颜色筛选器时,过滤地可以更容易找到产数相关法术力的地 +AdvancedSettings=高级设置 +nlDevMode=启用在开发期间进行测试的功能菜单 +nlWorkshopSyntax=在作坊中启用卡牌脚本检查。注意:该功能任在测试阶段。 +nlGameLogEntryType=更改游戏中日志显示的信息量。排序为最少到最详细。 +nlCloseAction=更改单击右上角X按钮时的行为 +nlLoadCardsLazily=如果打开该选项Forge将在使用到卡牌脚本时才加载(警告:实验状态)。 +nlLoadHistoricFormats=如果打开,Forge将加载史记赛制,这个能会导致游戏载入时间变长。 +GraphicOptions=图形选项 +nlDefaultFontSize=UI中字体的默认大小。所有字体元素都相对于此缩放。(需要重启) +cbpMulliganRule = 调度规则 +nlImageFetcher=允许从在线资源中实时获取缺失的图片 +nlDisplayFoil=显示闪卡 +nlRandomFoil=随机将牌设置为闪卡 +nlScaleLarger=允许卡牌图片缩放为初始大小 +nlRenderBlackCardBorders=为牌周围渲染黑色边框 +nlLargeCardViewers=是所有牌看起来更大以便高分辨率图片看起来更舒适,不适合低分辨率设备使用 +nlSmallDeckViewer=将套牌查看器设置为800X600而不是按屏幕大小等比缩放 +nlRandomArtInPools=限制赛生成的卡池中带有闪卡。 +nlUiForTouchScreen=增加一些UI元素以提高触屏体验(需要重启)。 +nlCompactPrompt=隐藏标题并在“提示”窗格中使用较小的字体使其更紧凑。 +nlHideReminderText=在“卡牌详情“窗格中隐藏提醒文本 +nlOpenPacksIndiv=打开肥包或者补充盒的时候一包一包开。 +nlTokensInSeparateRow=生物与衍生物分不同的行显示。 +nlStackCreatures=在战场上如同地、神器、结界一般堆叠一样的生物。 +nlTimedTargOverlay=启用基于限制目标的覆盖优化以减少CPU使用率(仅在旧设备上需要使用,需要重启游戏)。 +nlCounterDisplayType=选择指示物的样式。基于文本还是基于图片还是二者混合。 +nlCounterDisplayLocation=确定牌张上指示物的位置:靠近底部还是顶部 +nlDisplayCurrentCardColors=在卡牌详情窗格中显示当前牌的颜色 +SoundOptions=声音选项 +nlEnableSounds=在游戏中启用声音效果 +nlEnableMusic=在游戏中启用背景音乐 +nlAltSoundSystem=使用备用音效系统(仅在声音消失的情况使用) +KeyboardShortcuts=键盘快捷键 +# VSubmenuAchievements.java +lblAchievements=成就 +# VSubmenuDownloaders.java +btnDownloadSetPics=下载低清系列图 +btnDownloadPicsHQ=下载高清卡图(这很慢!) +btnDownloadPics=下载低清卡图 +btnDownloadQuestImages=下载冒险图片 +btnDownloadAchievementImages=下载成就图片 +btnReportBug=报告错误 +btnListImageData=统计牌和图片数据 +lblListImageData=统计Forge实现且缺少的图片的牌 +btnImportPictures=导入数据 +btnHowToPlay=如何玩 +btnDownloadPrices=下载牌张价格 +btnLicensing=许可证详情 +lblDownloadPics=下载缺省牌的图片 +lblDownloadPicsHQ=下载缺省牌的高清图片 +lblDownloadSetPics=下载每张牌的图片(每张牌出现一次) +lblDownloadQuestImages=下载冒险之旅里使用的衍生物与图标 +lblDownloadAchievementImages=下载成就图片,让你的奖杯更引人注目。 +lblDownloadPrices=下载卡牌商店最新的价格表 +lblYourVersionOfJavaIsTooOld=你的Java版本太旧无法开始下载内容 +lblPleaseUpdateToTheLatestVersionOfJava=请更新到最新版本的JRE +lblYoureRunning=你在运行 +lblYouNeedAtLeastJavaVersion=您的JRE版本至少需要为1.8.0_101。 +lblImportPictures=从本地目录导入数据 +lblReportBug=什么东西坏了? +lblHowToPlay=游戏规则。 +lblLicensing=Forge合法性。 +ContentDownloaders=内容下载 +ReleaseNotes=发布说明 +# CSubmenuPreferences.java +CantChangeDevModeWhileNetworkMath=网络匹配时无法更改开发模式 +CompatibilityWarningsReEnabled=兼容性警告重新启用 +AresetForgeSettingsToDefault=这将把所有首选项设置为默认并重新启动Forge。\n\n重置并重启Forge? +TresetForgeSettingsToDefault=重置设置 +AresetDeckEditorLayout=这将重置套牌编辑器布局。\n所有选项卡将恢复到其默认位置。\n\n重置布局? +TresetDeckEditorLayout=重置套牌编辑器布局 +OKresetDeckEditorLayout=套牌编辑器布局已重置。 +AresetWorkshopLayout=这将重置游戏屏幕布局。\n所有选项卡将恢复至其默认位置。\n\n重置布局? +TresetWorkshopLayout=重置游戏界面 +OKresetWorkshopLayout=游戏界面已重置 +AresetMatchScreenLayout=这将重置匹配屏幕的布局。\n如果要保存当前的布局,请使用“匹配”屏幕中的“保存布局”选项。\n\n重置布局? +TresetMatchScreenLayout=重置匹配布局 +OKresetMatchScreenLayout=匹配布局已重置。 +#EMenuGroup.java +lblSanctionedFormats=单人游戏 +lblOnlineMultiplayer=多人联机 +lblQuestMode=冒险之旅 +lblPuzzleMode=谜题模式 +lblGauntlets=决斗之巅 +lblGameSettings=游戏设置 +#VLobby.java +lblHeaderConstructedMode=游戏模式:构筑 +lblGetNewRandomName=获取一个随机名称 +lbltypeofName=您想要生成什么类型的名称? +lblconfirmName=你想使用名称%s,还是想重试 +lblUseThisName=使用这个名称 +lblTryAgain=再试一次 +lblAddAPlayer=增加一个玩家 +lblVariants=变种 +lblRandom=随机 +#VSubmenuConstructed.java +lblConstructedMode=构筑模式 +lblConstructed=构筑 +#PlayerPanel.java +lblSelectaDeck=选择一个套牌 +lblSelectaSchemeDeck=选择一个套牌类型 +lblSchemeDeckEditor=套牌类型编辑器 +lblSelectaCommanderDeck=选择一个指挥官套牌 +lblSelectaPlanarDeck=选择一个时空竞逐套牌 +lblPlanarDeckEditor=时空竞逐套牌编辑器 +lblSelectaVanguardAvatar=选择一个先锋头像 +lblVanguardAvatar=先锋头像 +lblDeck=套牌 +lblSchemeDeck=魔王套牌 +lblCommanderDeck=指挥官套牌 +lblPlanarDeck=时空竞逐套牌 +lblVanguard=先锋 +lblHuman=人类 +lblAI=AI +lblOpen=打开 +lblUseSimulation=使用模拟 +lblGetaNewRandomName=获取一个新的随机名称 +lblArchenemy=魔王 +lblHeroes=英雄 +lblRemove=移除 +ttlblAvatar=左击:选择头像,右击:随机头像 +lblReady=准备好 +lblKick=踢 +lblReallyKick=准备好踢 %s? +#ForgeMenu.java +lblRestart=重启 +lblExit=退出 +#LayoutMenu.java +lblLayout=布局 +lblView=视图 +lblFile=文件 +lblTheme=主题 +lblBackgroundImage=背景图片 +lblPanelTabs=窗格表格 +lblSaveCurrentLayout=保存当前布局 +lblRefresh=刷新 +lblSetWindowSize=设置窗口大小 +lblChooseNewWindowSize=选择一个新的窗口大小 +lblFullScreen=全屏 +lblExitFullScreen=退出全屏 +#HelpMenu.java +lblHelp=帮助 +lblAboutForge=关于Forge +lblTroubleshooting=故障排除 +lblArticles=文章 +lblGettingStarted=如何开始 +lblHowtoPlay=如何玩 +lblForgeLicense=Forge许可证 +lblReleaseNotes=更新日志 +#GameMenu.java +lblGame=游戏 +lblSoundEffects=音效 +lblUndo=撤销 +lblAlphaStrike=先攻 +lblEndTurn=结束回合 +lblTargetingArcs=瞄准弧 +lblOff=关闭 +lblCardMouseOver=卡牌悬停 +lblAlwaysOn=总是打开 +lblAutoYields=自动让过 +lblDeckList=套牌列表 +lblClose=关闭 +lblExitForge=退出Forge +#ConstructedGameMenu.java +lblSelectAvatarFor=选择头像为%s +lblRemoveSmallCreatures=将1/1和0/X生物从生成套牌中移除。 +lblRemoveArtifacts=将神器从生成套牌中移除 +PreventNonLandDuplicates=防止生成套牌中出现重复的非地牌 +#PlayerPanel.java +lblName=名称 +lblTeam=团队 +#InputConfirmMulligan.java +lblKeep=保留 +lblYouAreGoingFirst=你先手 +lblIsGoingFirst=是先手 +lblYouAreGoing=你将 +lblMulligan=调度 +lblDoYouWantToKeepYourHand=你想保留这个手牌吗? +lblReturnForLondon=放回%n张牌到牌库底 +lblOk=确认 +lblReset=重置 +lblAuto=自动 +#VAssignDamage.java +lbLAssignDamageDealtBy=分配对%s造成的伤害 +lblLClickDamageMessage=左键单击:分配一点伤害。(左键加Ctrl):分配致命伤害。 +lblRClickDamageMessage=右键单击:取消分配一点伤害。(左键加Ctrl):取消分配的所有伤害 +lblTotalDamageText=可用的伤害值:未知 +lblAssignRemainingText=对受到致命伤害的对象分配过量的伤害 +lblLethal=致死 +#KeyboardShortcuts.java +lblSHORTCUT_SHOWSTACK=匹配:显示堆叠面板 +lblSHORTCUT_SHOWCOMBAT=匹配:显示战斗面板 +lblSHORTCUT_SHOWCONSOLE=匹配:显示控制台面板 +lblSHORTCUT_SHOWDEV=匹配:显示开发人员模式面板 +lblSHORTCUT_CONCEDE=匹配:认输 +lblSHORTCUT_ENDTURN=匹配:让过优先权直到回合结束或者下一个堆叠事件 +lblSHORTCUT_ALPHASTRIKE=匹配:先攻 +lblSHORTCUT_SHOWTARGETING=匹配:切换视觉叠加层 +lblSHORTCUT_AUTOYIELD_ALWAYS_YES=匹配:自动让过堆叠中的异能(所有都选是) +lblSHORTCUT_AUTOYIELD_ALWAYS_NO=匹配:自动让过堆叠中的异能(所有都选否) +lblSHORTCUT_MACRO_RECORD=匹配:记录操作宏的动作序列 +lblSHORTCUT_MACRO_NEXT_ACTION=匹配:在录制的宏中执行下一个操作 +lblSHORTCUT_CARD_ZOOM=匹配:缩放当前选定的图片 +#VSubmenuDraft.java +lblBoosterDraft=轮抓 +lblHeaderBoosterDraft=游戏模式:轮抓 +lblPlayAnOpponent=所有对手 +lblPlayAll7opponents=全部7个对手 +lblBuildorselectadeck=构建或选择一个套牌 +lblDraftText1=在轮抓模式中,三个补充包在8个玩家中传递 +lblDraftText2=从你选的牌中组一套牌。AI也会这样做 +lblDraftText3=然后对抗一个或多个AI对手 +lblNewBoosterDraftGame=新的补充包轮抓 +lblDraftDecks=轮抓套牌 +#CSubmenuDraft.java +lblNoDeckSelected=没有为人类选择套牌。\n(您可能要建立一个新的套牌) +lblNoDeck=没有套牌 +lblChooseDraftFormat=选择轮抓模式 +#VSubmenuSealed.java +lblSealedDeck=现开 +lblSealedDecks=现开套牌 +lblHeaderSealed=游戏模式:现开 +lblSealedText1=构建或选择一个套牌 +lblSealedText2=在现开模式中,您可以从补充包里(最多10个)构建一套牌 +lblSealedText3=从你得到的牌中组一套牌。AI也会这样做 +lblSealedText4=然后对抗一个或多个AI对手 +btnBuildNewSealedDeck=构建新的现开套牌 +#FDeckChooser.java +lblViewDeck=查看套牌 +lblRandomDeck=随机套牌 +lblRandomColors=随机颜色 +#GameType.java +lblSealed=现开 +lblDraft=轮抓 +lblWinston=温斯顿 +lblGauntlet=决斗 +lblTournament=锦标赛 +lblQuest=冒险 +lblQuestDraft=冒险轮抓 +lblPlanarConquest=时空竞逐征服 +lblPuzzle=谜题 +lblPuzzleDesc=从给定的游戏状态解谜 +lblDeckManager=套牌管理 +lblVanguardDesc=每个牌手在游戏中都有一个具有特殊能力的“Avatar”。 +lblCommander=指挥官 +lblCommanderDesc=每个玩家都有一张传奇牌,可以随时释放并以此确定套牌颜色 +lblOathbreaker=破誓者 +lblOathbreakerDesc=每个玩家都有一张鹏洛克牌作为他的“破誓者”,可以随时释放该鹏洛克并以此鹏洛克确定套牌的颜色。每个玩家还有一个“专属咒语”,当他们的“破誓者”在战场上时才能释放。 +lblTinyLeaders=小指挥官 +lblTinyLeadersDesc=每个玩家都有一张传奇牌,可以随时释放并以此确定套牌颜色,但每张牌的总法术力费用必须小于4 +lblBrawl=争锋 +lblBrawlDesc=每个玩家都有一张传奇牌,可以随时释放并以此确定套牌颜色,但牌池仅限于标准赛制 +lblPlaneswalker=时空幻境 +lblPlaneswalkerDesc=每个牌手都有一个随时可以释放的鹏洛客 +lblPlanechase=时空竞逐 +lblPlanechaseDesc=当玩家掷骰子到“时空牌”时,时空将改变。时空牌对全局生效。 +lblArchenemyDesc=一个玩家是魔王,使用阴谋牌与其他玩家对战 +lblArchenemyRumble=魔王混斗 +lblArchenemyRumbleDesc=每个玩家都是魔王,可以使用阴谋牌 +lblMomirBasic=莫秘维 +lblMomirBasicDesc=每位牌手使用由60基本地组成的套牌和Momir徽记。 +lblMoJhoSto=MoJhoSto +lblMoJhoStoDesc=每位牌手使用60基本地组成的套牌和Momir,Jhoira,Stonehewer徽记。 +#VSubmenuDuels.java +lblQuestDuels=探索决斗 +lblQuestModeDuels=冒险之旅:决斗 +lblSelectNextDuel=选择你将进行的下一场决斗 +lblNoDuelDeck=当前没有设置套牌 +lblNextChallengeNotYet=没有确定下次胜利后的挑战 +btnUnlockSets=解锁系列 +btnTravel=时空旅行 +btnBazaar=珍宝集市 +btnSpellShop=卡牌商店 +cbSummonPlant=召唤植物 +cbLaunchZeppelin=启动飞艇 +#VSubmenuQuest.java +lblQuestData=冒险之旅 +lblLoadQuestData=加载冒险之旅 +lblStartanewQuest=开始新的冒险之旅 +lblOldQuestData=冒险之旅?放入%s并重新启动Forge。 +rbEasy=简单 +rbMedium=中等 +rbHard=困难 +rbExpert=专家 +rbFantasyMode=幻想模式 +rbCommanderSubformat=指挥官模式 +lblStartingWorld=初始时空 +lblStartingPool=初始牌池 +lblAllCardsAvailable=所有牌都可用 +lblStarterEventdeck=初始/活动套牌 +lblSanctionedformat=合法赛制: +lblCustomdeck=自定义套牌 +lblDefineCustomFormat=定义自定义赛制 +lblSelectFormat=选择赛制 +lblStartWithAllCards=从所选系列的所有牌开始 +lblAllowDuplicateCards=允许重复的卡牌 +lblStartingPoolDistribution=初始牌池分配 +lblChooseDistribution=选择分配 +lblPrizedCards=奖励卡 +lblAllCardsAvailableWin=获胜将提供的的所有牌 +lblOnlySetsInStarting=只有初始池才可用 +lblAllowUnlockAdEd=允许解锁其他版本 +lblEmbark=开始! +lblboxCompleteSet=你将使用所选系列的每张卡中的4张开始探索 +lblboxAllowDuplicates=生成初始牌池时,可能包含重复的卡。 +lblSameAsStartingPool=与初始牌池相同 +lblNewLoadQuest=新建/载入 +#CSubmenuQChallenges.java +lblLaunchaZeppelin=启动一个飞艇. +lblPlant=植物 +lblChallenges=挑战 +lblMatchBestof=匹配-BO +lblDuels=决斗 +#CSubmenuQuestData.java +lblNotFormatDefined=你已经将自定义赛制设置为不包含任何系列。\n这将选择所有系列而不受限制为奖品。\n\n继续? +lbldckStartPool=你还没有选择一个套牌来开始。 +lblCannotStartaQuest=无法开始一个探索 +lblFromDeck=从套牌 +MsgQuestNewName=诗人会记住你的探索 +TitQuestNewName=探索名 +lblQuestNameEmpty=请指定探索名 +lblQuestExists=已存在具有该名称的探索。请选择一个其他探索名 +#CSubmenuQuestDecks.java +lblCreateaDeck=创建一个套牌 +#CSubmenuQuestPrefs.java +lblEnteraNumber=输入一个数 +lblSavefailed=保存错误 +#DialogChooseFormats.java +cbWantReprints=允许来自其他系列的重印牌 +lblChooseFormats=选择赛制 +lblSanctioned=合法 +lblOther=其他 +lblHistoric=十几 +lblCancel=取消 +#DialogChoosePoolDistribution.java +lblBlack=黑 +lblBlue=蓝 +lblGreen=绿 +lblRed=红 +lblWhite=白 +lblColorless=无色 +lblIncludeArtifacts=包含神器 +lblBalanced=均衡 +lblTrueRandom=随机 +lblSurpriseMe=惊喜 +lblBoosters=补充包 +lblClearAll=清除所有 +lblNumberofBoosters=补充包数量 +lblColors=颜色 +lblnoSettings=没有可用于此选择的设置 +lblDistribution=分配 +lblHoverforDescription=将鼠标悬停在每个选项上以获得更详细的说明 +lblradBalanced=“均衡”将在每种选定的颜色中提供数量均衡的卡牌。 +lblradRandom=“随机”将随机分配卡牌和颜色。 +lblradSurpriseMe=随机挑选颜色并提供数量均衡的随机卡牌。 +lblradBoosters=忽略所有颜色设置,从指定数量的补充包中生成牌池 +lblcbxArtifacts=选择后无论选择的颜色如何,神器都包涵在牌池中,这模拟了旧牌池的行为。 +#VSubmenuChallenges.java +lblQuestChallenges=冒险挑战 +htmlLaunchZeppelin=启动
飞艇 +lblQuestModeChallenges=冒险之旅:挑战 +lblWhichChallenge=你会尝试哪个挑战? +#VSubmenuQuestDraft.java +lblTournaments=锦标赛 +lblQuestModeDraftTournament=冒险之旅:轮抓锦标赛 +lblSelectaTournament=选择要加入的锦标赛 +lblNoTournaments=目前没有锦标赛 +btnEditDeck=编辑套牌 +btnLeaveTournament=离开锦标赛 +btnSpendToken=比赛门票 +btnStartMatchSmall=开始下一场比赛 +lblUndetermined=未确定 +btnSpendTokenTT=创建一个立即游戏的锦标赛 +lblPastResults=结果 +#VSubmenuQuestDecks.java +lblQuestDecks=套牌管理 +lblQuestDesc1=一开始你可以从有限的牌池中构建套牌。 +lblQuestDesc2=随着冒险之旅的进行,你的牌池逐渐增长,可以构建出更强的套牌。 +lblQuestDesc3=并且在与AI的决斗和挑战对抗中可以解锁更多牌。 +lblBuildaNewDeck=构建一个新套牌 +#Decktype.java +lblCustomUserDecks=自定义用户套牌 +lblConstructedDecks=构筑套牌 +lblCommanderDecks=指挥官套牌 +lblRandomCommanderDecks=随机指挥官套牌 +lblRandomCommanderCard-basedDecks=随机基本牌指挥官套牌 +lblOathbreakerDecks=破誓者套牌 +lblTinyLeadersDecks=小指挥官套牌 +lblBrawlDecks=争锋套牌 +lblSchemeDecks=魔王套牌 +lblPlanarDecks=时空竞逐套牌 +lblPreconstructedDecks=预组套牌 +lblQuestOpponentDecks=冒险之旅套牌 +lblRandomColorDecks=随机颜色套牌 +lblRandomStandardArchetypeDecks=随机标准原型套牌 +lblRandomModernArchetypeDecks=随机摩登原型套牌 +lblRandomLegacyArchetypeDecks=随机薪传原型套牌 +lblRandomVintageArchetypeDecks=随机特选原型套牌 +lblRandomStandardColorDecks=随机标准颜色套牌 +lblRandomModernColorDecks=随机摩登颜色套牌 +lblRandomThemeDecks=随机主题套牌 +lblRandomDecks=随机套牌 +lblNetDecks=网络套牌 +lblNetCommanderDecks=网络指挥官套牌 +#VSubmenuPuzzleSolve.java +lblSolve=解谜 +lblPuzzleModeSolve=谜题模式:解谜 +#VSubmenuPuzzleCreate.java +lblPuzzleModeCreate=谜题模式:创建 +lblCreate=创建 +#VSubmenuGauntletLoad.java +lblQuickGauntlets=快速决斗 +lblQuickGauntlet=快速决斗 +lblLoadGauntlet=载入决斗场 +lblLoadaGauntlet=载入决斗场 +lblLoadaPreviousGauntlet=载入决斗场(使用起始套牌) +#VSubmenuGauntletQuick.java +lblQuickGauntletBuilder=快速进入决斗 +lblDecklistDesc=双击一个非随机套牌作为套牌列表 +lblOptions=选项 +lblMatchesperGauntlet=匹配每场决斗 +lblAllowedDeckTypes=允许的套牌类型 +lblAutosaveInf=生成一个新的决斗场。可以在“载入决斗场”中选择。 +#VSubmenuGauntletContests.java +lblGauntletContests=天命战场 +lblPickaContest=选择一个决斗场 +lblGauntletStartedDesc=使用一个套牌直到战胜所有决斗者。 +#VSubmenuGauntletBuild.java +lblGauntletBuilder=新建决斗场 +lblGauntletDesc1=左/右方向键添加或者删除套牌 +lblGauntletDesc2=上/下箭头改变对手的顺序 +lblDecklist=双击一个非随机套牌作为套牌列表 +btnUp=将这个套牌在决斗中向上移动 +btnDown=将这个套牌在决斗中向下移动 +btnRight=添加套牌至决斗 +btnLeft=将套牌从决斗中移除 +btnSaveGauntlet=保存这个决斗 +btnNewGauntlet=构建一个新的决斗 +btnLoadaGauntlet=载入决斗场 +lblGauntletName=决斗名 +lblBuildAGauntlet=新建决斗场 +lblSave=变更没有保存 +#QuestUtil.java +lblTravelBetweenWorlds=在时空旅行 +lblWhereDoYouWishToTravel=你想去哪里旅行? +lblUncompleteChallengesWarning=警告:未完成挑战 +lblUncompleteChallengesDesc=你当前的时空有未完成的挑战。如果你现在离开,他们将会失败!\n你确定要离开吗?\n(选“否”返回并完成当前的时空挑战。) +lblDontSummonAPet=不要召唤宠物 +lblSummon=召唤%n +lblMatchBestOf1=匹配-BO1 +lblMatchBestOf3=匹配-BO3 +lblMatchBestOf5=匹配-BO5 +lblCredits=积分 +lblLife=生命 +lblWins=胜利 +lblLosses=失败 +lblWorld=时空 +lblNone=没有 +lblnextChallengeInWins0=你的战绩已被注意到。对手挑战了你。 +lblnextChallengeInWins1=赢得1场胜利后,将面临新的挑战。 +lblnextChallengeInWins2=赢得%n场胜利后,将面临新的挑战。 +lblWinStreak=连胜 +lblBest=最好 +lblBuildAndSelectaDeck=构建,然后在“冒险套牌”子菜单中选择一个套牌。 +lblCurrentDeck=你现在的套牌是%n +PleaseCreateAQuestBefore=请在%n之前创建套牌。 +lblNoQuest=没有探索 +lblVisitTheSpellShop=参观卡牌商店 +lblVisitTheBazaar=参观珍宝集市 +lblUnlockEditions=解锁新的时空 +lblUnlocked=你已经成功解锁%n +titleUnlocked=%n解锁! +lblStartADuel=开始决斗! +lblSelectAQuestDeck=请选择一个冒险套牌。 +lblInvalidDeck=错误的套牌 +lblInvalidDeckDesc=您的套牌%n请编辑或者选择其他套牌 +#VSubmenuQuestPrefs.java +lblQuestPreferences=冒险偏好 +lblRewardsError=奖励错误 +lblDifficultyError=难度错误 +lblBoosterError=补充包错误 +lblShopError=商店错误 +lblDraftTournamentsError=轮抓锦标赛错误 +lblRewards=奖励 +lblBoosterPackRatios=补充包比例 +lblDifficultyAdjustments=挑战难度 +lblShopPreferences=商店偏好 +lblDraftTournaments=轮抓锦标赛 +lblBaseWinnings=基本胜利 +lblNoLosses=没有损失 +lblPoisonWin=侵染胜利 +lblMillingWin=磨牌胜利 +lblMulligan0Win=调度到0胜利 +lblAlternativeWin=特殊胜利 +lblBonusMultiplierperWin=每赢一次奖金加倍 +ttBonusMultiplierperWin=赢得比赛后每次胜利奖金都会增加。 +lblMaxWinsforMultiplier=最大胜利倍数 +ttMaxWinsforMultiplier=获得这么多胜利后奖励会停止。 +lblWinbyTurn15=15回合内胜利 +lblWinbyTurn10=10回合内胜利 +lblWinbyTurn5=5回合内胜利 +lblFirstTurnWin=第一回合胜利 +lblMaxLifeDiffBonus=最大生命值差。奖金 +lblEasy=简单 +lblMedium=中等 +lblHard=难 +lblExpert=专家 +lblWinsforBooster=获得补充包所需的胜利 +lblWinsforRankIncrease=排名增加所需的胜利 +lblWinsforMediumAI=匹配中等难度AI所需的胜利 +lblWinsforHardAI=匹配困难难度AI所需的胜利 +lblWinsforExpertAI=匹配专家难度AI所需的胜利 +lblStartingCommons=初始铁 +lblStartingUncommons=初始银 +lblStartingRares=初始金 +lblStartingCredits=初始积分 +lblWinsforNewChallenge=新挑战所需的胜利 +lblStartingSnowLands=初始雪境地 +lblColorBias=颜色偏差(1-100%) +ttColorBias=初始卡池中您选择的颜色的百分比 +lblPenaltyforLoss=失败补偿 +lblMoreDuelChoices=更多决斗选择 +lblCommon=铁 +lblUncommon=银 +lblRare=金 +lblSpecialBoosters=特殊补充包 +ttSpecialBoosters=允许特定颜色补充包出现在商店并作为匹配奖励。 +lblMaximumPacks=最多补充包 +lblMinimumPacks=最少补充包 +lblStartingPacks=初始包 +lblWinsforPack=胜利奖励包 +lblWinsperSetUnlock=胜利解锁系列 +lblAllowFarUnlocks=允许远解锁 +lblUnlockDistanceMultiplier=解锁距离倍数 +lblCommonSingles=单张铁 +lblUncommonSingles=单张银 +lblRareSingles=单张金 +lblCardSalePercentageBase=出售牌的系数 +lblCardSalePercentageCap=出售牌的系数上限 +lblCardSalePriceCap=出售牌的价格上限 +lblWinstoUncapSalePrice=胜利解锁价格系数 +lblPlaysetSize=玩家收藏大小 +ttPlaysetSize=在售卖卡牌时要保留的卡牌数量 +lblPlaysetSizeBasicLand=玩家收藏大小:基本地 +ttPlaysetSizeBasicLand=在售卖卡牌时要保留的基本地数量 +lblPlaysetSizeAnyNumber=玩家收藏大小:任意数量 +ttPlaysetSizeAnyNumber=售卖卡牌时不保留卡牌 +lblItemLevelRestriction=物品等级限制 +lblFoilfilterAlwaysOn=闪卡过滤器始终开启 +lblRatingsfilterAlwaysOn=评级过滤器始终开启。 +lblSimulateAIvsAIResults=模拟AI VS AI的结果。 +ttSimulateAIvsAIResults=如果设置为1,则不会播放AI VS AI的轮抓。而是快速确定其对局结果。 +lblWinsforNewDraft=新轮抓所需的胜利 +lblWinsperDraftRotation=每次轮抓胜利轮替 +ttWinsperDraftRotation=如果轮抓没有赢这么多场,那么它将被删除或者替换。 +lblRotationType=轮替类型 +ttRotationType=如果设置为0,旧系列消失,如果设置为1,则用不同系列替换。 +#StatTypeFilter.java +lblclicktotoogle=单击以切换筛选器,右键单机以仅显示 +#SItemManagerUtil.java +lblWhitecards=白色牌 +lblBluecards=蓝色牌 +lblBlackcards=黑色牌 +lblRedcards=红色牌 +lblGreencards=绿色牌 +lblColorlesscards=无色牌 +lblMulticolorcards=多色牌 +lblPackordeck=卡包和预组套牌 +lblLands=地 +lblArtifacts=神器 +lblCreatures=生物 +lblEnchantments=结界 +lblPlaneswalkers=鹏洛客 +lblInstants=瞬间 +lblSorceries=法术 +lblCCMC0=法术力费用为0的牌 +lblCCMC1=法术力费用为1的牌 +lblCCMC2=法术力费用为2的牌 +lblCCMC3=法术力费用为3的牌 +lblCCMC4=法术力费用为4的牌 +lblCCMC5=法术力费用为5的牌 +lblCCMC6orMore=法术力费用为6+的牌 +lblWhitedecks=白色套牌 +lblBluedecks=蓝色套牌 +lblBlackdecks=黑色套牌 +lblReddecks=红色套牌 +lblGreendecks=绿色套牌 +lblColorlessdecks=无色套牌 +lblMulticolordecks=多色套牌 +lblOldstyleFoilcards=旧风格闪卡 +lblNewstyleFoilcards=新风格闪卡 +lblNon-Foilcards=非闪卡 +lblUnratedcards=未分级的卡 +lbl1starcards=1星级卡 +lbl2starcards=2星级卡 +lbl3starcards=3星级卡 +lbl4starcards=4星级卡 +lbl5starcards=5星级卡 +lblXcopiesof=X个副本 +lblcopiesof=副本 +#ItemListView.java +lblUniqueCardsOnly=每张牌都只显示一个画 +ttUniqueCardsOnly=切换是否每张牌都只显示一个画 +#ACEditorBase.java +lblAddcard=添加牌 +ttAddcard=将选定的牌添加到当前套牌(双击该行或者空格) +lblAdd4ofcard=添加4张牌 +ttAdd4ofcard=将最多4张牌添加到当前套牌 +lblRemovecard=移除卡 +ttRemovecard=从当前套牌移除所选牌(双击该行或者空格) +lblRemove4ofcard=移除4张牌 +ttRemove4ofcard=最多可以将4张所选牌从当前套牌移除 +lblAddBasicLands=添加基本地 +ttAddBasicLands=添加基本地到套牌 +lblCardCatalog=卡牌目录 +lblJumptoprevioustable=跳转到上一个表格 +lblJumptopnexttable=跳转到下一个表格 +lblJumptotextfilter=跳转到文本筛选器 +lblChooseavalueforX=选择X的值 +#VCurrentDeck.java +lblVCurrentDeck=当前套牌 +ttbtnSave=保存套牌(Ctrl+S) +ttbtnSaveAs=保存套牌到(Ctrl+E) +ttbtnLoadDeck=打开套牌(Ctrl+O) +ttbtnNewDeck=新建套牌(Ctrl+N) +ttbtnPrintProxies=打印到HTML文件(Ctrl+P) +lblImport=导入 +ttImportDeck=尝试从非Forge格式导入套牌(Ctrl+I) +lblTitle=标题 +#ImageView.java +lblExpandallgroups=展开所有组 +lblCollapseallgroups=折叠所有组 +lblGroupby=分组 +lblPileby=堆积 +lblColumns=行 +#CEditorVariant.java, CEditorConstructed.java +lblCatalog=目录 +lblAdd=添加 +lbltodeck=到套牌 +lblfromdeck=从套牌 +lbltosideboard=到备牌 +lblfromsideboard=从备牌 +lblascommander=是指挥官 +lblasoathbreaker=是破誓者 +lblassignaturespell=是专属咒语 +lblasavatar=作为头像 +lblfromschemedeck=从魔王套牌 +lblfromplanardeck=从时空竞逐套牌 +lblfromconspiracydeck=从诡局套牌 +lbltoschemedeck=到魔王套牌 +lbltoplanardeck=到时空竞逐套牌 +lbltoconspiracydeck=到诡局套牌 +lblMove=移到 +#VDock.java +lblDock=Dock +lblViewDeckList=查看套牌列表 +lblRevertLayout=还原布局 +lblOpenLayout=打开布局 +lblSaveLayout=保存布局 +#GroupDef.java +lblColor=颜色 +lblColorIdentity=颜色特征 +lblSet=系列 +lblSet2=系列 +#Set word has different meanings in other languages +lblDefault=默认 +lblType=类型 +lblPlaneswalkerDeckSort=鹏洛客套牌排序 +lblRarity=稀有度 +lblConvertToFoil=闪卡 +lblMulticolor=多色 +#DeckFileMenu.java +lblNewDeck=新建套牌 +lblOpenDeck=打开套牌 +lblImportDeck=导入套牌 +lblSaveDeck=保存套牌 +lblSaveDeckAs=保存套牌到 +lblPrinttoHTMLfile=打印成HTML文件 +#PaperCard.java +lblCard=牌 +#CardManager.java +lblFormat=赛制 +lblFormats=赛制 +lblQuestWorld=冒险时空 +lblSets=系列 +lblTypes=类型 +lblConvertedManaCosts=总法术力 +lblCMCRange=总法术力费用范围 +lblPowerRange=力量范围 +lblToughnessRange=防御范围 +lblFoil=闪卡 +lblPersonalRating=个人评价 +lblAdvanced=高级 +#VDeckgen.java +lblDeckGeneration=套牌生成 +btnRandCardpool=随机牌池 +ttbtnRandCardpool=在当前牌池中生成套牌 +btnRandDeck2=构筑(双色) +ttbtnRandDeck2=在当前牌池中生成双色套牌 +btnRandDeck3=构筑(三色) +ttbtnRandDeck3=在当前牌池中生成三色套牌 +btnRandDeck5=构筑(五色) +ttbtnRandDeck5=在当前牌池中生成五色套牌 +#DeckCotroller.java +lblCurrentDeck2=当前标题 +lblUntitled=无标题 +#VPrompt.java +lblPrompt=提示 +lblGameSetup=游戏设置 +#ColumnDef.java +lblAIStatus=AI状态 +lblCMC=总法术力费用 +ttCMC=总法术力费用 +lblCN=编号 +ttCN=收藏编号顺序 +ttColor=颜色 +lblCost=费用 +ttCost=费用 +lblDecks=套牌 +lblDeleteEdit=删除/编辑 +lblSetEdition=神秘行。我们不知道他做了什么和能做什么。 +ttFavorite=喜好 +lblFolder=文件夹 +ttFormats=套牌在赛制中合法 +lblMain=主牌 +ttMain=主牌 +lblQty=数量 +lblQuantity=数量 +lblSide=备牌 +lblSideboard=备牌 +lblNew=新建 +lblOwned=拥有 +lblPower=力量 +ttPower=力量 +lblPrice=价格 +ttPrice=价格 +lblRanking=排名 +lblDraftRanking=轮抓排名 +lblToughness=防御 +ttToughness=防御 +ttType=类型 +#HomeScreen.java +lblNewGame=新游戏 +lblLoadGame=加载游戏 +lblPlayOnline=在线游戏 +lblSettings=设置 \ No newline at end of file diff --git a/forge-gui/res/lists/TypeLists.txt b/forge-gui/res/lists/TypeLists.txt index c8d312fea8e..01da5b29239 100644 --- a/forge-gui/res/lists/TypeLists.txt +++ b/forge-gui/res/lists/TypeLists.txt @@ -156,6 +156,7 @@ Nephilim:Nephilims Nightmare:Nightmares Nightstalker:Nightstalkers Ninja:Ninjas +Noble:Nobles Noggle:Noggles Nomad:Nomads Nymph:Nymphs @@ -243,6 +244,7 @@ Vedalken:Vedalkens Viashino:Viashinos Volver:Volvers Wall:Walls +Warlock:Warlocks Warrior:Warriors Weird:Weirds Werewolf:Werewolves @@ -258,6 +260,7 @@ Yeti:Yetis Zombie:Zombies Zubera:Zuberas [SpellTypes] +Adventure Arcane Trap [EnchantmentTypes] @@ -270,6 +273,7 @@ Shrine Clue Contraption Equipment +Food Fortification Treasure Vehicle @@ -303,6 +307,7 @@ Nahiri Narset Nissa Nixilis +Oko Ral Rowan Saheeli diff --git a/forge-gui/res/puzzle/PS_M208.pzl b/forge-gui/res/puzzle/PS_M208.pzl new file mode 100644 index 00000000000..255f8ffd930 --- /dev/null +++ b/forge-gui/res/puzzle/PS_M208.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Magic Core Set 2020 #08 +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/08/127.-M208.jpg +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. One of your Temple Gardens is enchanted with New Horizons (controlled by you). +[state] +humanlife=20 +ailife=12 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Ancient Animus;Dauntless Bodyguard;Band Together;Demonic Vigor +humanbattlefield=Ajani's Pridemate;Angelic Guardian;Trapjaw Tyrant|Counters:P1P1=1;Sorin, Vengeful Bloodlord|Counters:LOYALTY=3;Temple Garden|Id:10|NoETBTrigs;Temple Garden|NoETBTrigs;New Horizons|AttachedTo:10;Godless Shrine|NoETBTrigs;Godless Shrine|NoETBTrigs +aibattlefield=Polyraptor;Shalai, Voice of Plenty;Imperial Ceratops;Ghalta, Primal Hunger diff --git a/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt b/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt new file mode 100644 index 00000000000..6f5aeeb6a74 --- /dev/null +++ b/forge-gui/res/tokenscripts/bg_2_2_wolf_garruk.txt @@ -0,0 +1,8 @@ +Name:Wolf +ManaCost:no cost +Types:Creature Wolf +Colors:black,green +PT:2/2 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ When this creature dies, put a loyalty counter on each Garruk you control. +SVar:TrigPutCounter:DB$ PutCounterAll | ValidCards$ Garruk.YouCtrl | CounterType$ LOYALTY | CounterNum$ 1 +Oracle:When this creature dies, put a loyalty counter on each Garruk you control. diff --git a/forge-gui/res/tokenscripts/c_a_food_sac.txt b/forge-gui/res/tokenscripts/c_a_food_sac.txt new file mode 100644 index 00000000000..7d14f0658a2 --- /dev/null +++ b/forge-gui/res/tokenscripts/c_a_food_sac.txt @@ -0,0 +1,5 @@ +Name:Food +ManaCost:no cost +Types:Artifact Food +A:AB$ GainLife | Cost$ 2 T Sac<1/CARDNAME> | Defined$ You | LifeAmount$ 3 | SpellDescription$ You gain 3 life. +Oracle:{2}, {T}, Sacrifice this artifact: You gain 3 life. diff --git a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java index b52029fbb89..178cab2932c 100644 --- a/forge-gui/src/main/java/forge/achievement/AchievementCollection.java +++ b/forge-gui/src/main/java/forge/achievement/AchievementCollection.java @@ -81,7 +81,7 @@ public abstract class AchievementCollection implements Iterable { } protected AchievementCollection(String name0, String filename0, boolean isLimitedFormat0) { - this(name0, filename0, isLimitedFormat0, (String) null); + this(name0, filename0, isLimitedFormat0, null); } protected AchievementCollection(String name0, String filename0, boolean isLimitedFormat0, String path0) { @@ -125,7 +125,7 @@ public abstract class AchievementCollection implements Iterable { final List achievementListFile = FileUtil.readFile(path); for (final String s : achievementListFile) { if (!s.isEmpty()) { - String k[] = StringUtils.split(s, "|"); + String[] k = StringUtils.split(s, "|"); add(k[0],k[1],k[2]); } } diff --git a/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java b/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java index 4765d8c9c1f..f159ad97243 100644 --- a/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java +++ b/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java @@ -72,11 +72,8 @@ public class ChallengeAchievements extends AchievementCollection { } public static boolean checkValidGameMode(final Game game) { - if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto) - || game.getRules().hasAppliedVariant(GameType.Puzzle)) { - // these modes use a fixed pre-defined deck format, so challenge achievements don't apply in them - return false; - } - return true; + // these modes use a fixed pre-defined deck format, so challenge achievements don't apply in them + return !game.getRules().hasAppliedVariant(GameType.MomirBasic) && !game.getRules().hasAppliedVariant(GameType.MoJhoSto) + && !game.getRules().hasAppliedVariant(GameType.Puzzle); } } diff --git a/forge-gui/src/main/java/forge/achievement/Domain.java b/forge-gui/src/main/java/forge/achievement/Domain.java index 93b6a397889..0fba442df1c 100644 --- a/forge-gui/src/main/java/forge/achievement/Domain.java +++ b/forge-gui/src/main/java/forge/achievement/Domain.java @@ -37,7 +37,7 @@ public class Domain extends ProgressiveAchievement { return false; } if (player.getOutcome().hasWon()) { - Set basicLands = new HashSet(); + Set basicLands = new HashSet<>(); for (Card c : player.getCardsIn(ZoneType.Battlefield)) { String name = c.getName(); if (c.isBasicLand() && basicLandMap.containsKey(name)) { diff --git a/forge-gui/src/main/java/forge/achievement/MatchWinStreak.java b/forge-gui/src/main/java/forge/achievement/MatchWinStreak.java index 47bb95c6b56..a876029d2e5 100644 --- a/forge-gui/src/main/java/forge/achievement/MatchWinStreak.java +++ b/forge-gui/src/main/java/forge/achievement/MatchWinStreak.java @@ -15,10 +15,7 @@ public class MatchWinStreak extends StreakAchievement { @Override protected Boolean eval(Player player, Game game) { if (game.getMatch().isMatchOver()) { - if (game.getMatch().isWonBy(player.getLobbyPlayer())) { - return true; - } - return false; + return game.getMatch().isWonBy(player.getLobbyPlayer()); } return null; } diff --git a/forge-gui/src/main/java/forge/achievement/VariantWins.java b/forge-gui/src/main/java/forge/achievement/VariantWins.java index 9e1630dc810..77a7e38f71d 100644 --- a/forge-gui/src/main/java/forge/achievement/VariantWins.java +++ b/forge-gui/src/main/java/forge/achievement/VariantWins.java @@ -24,7 +24,7 @@ public class VariantWins extends ProgressiveAchievement { return true; } if (variant == GameType.Archenemy && game.getRules().hasAppliedVariant(GameType.ArchenemyRumble)) { - return true; //lump Archenemy Rumble into same achievement as Archenemy + return true; //lump Archenemy Rumble into same achievement as Archenemy } } return false; diff --git a/forge-gui/src/main/java/forge/assets/FSkinProp.java b/forge-gui/src/main/java/forge/assets/FSkinProp.java index 2a3fd620fd6..91ac4331eed 100644 --- a/forge-gui/src/main/java/forge/assets/FSkinProp.java +++ b/forge-gui/src/main/java/forge/assets/FSkinProp.java @@ -297,7 +297,7 @@ public enum FSkinProp { private int[] coords; private PropType type; - private FSkinProp(final int[] coords0, final PropType type0) { + FSkinProp(final int[] coords0, final PropType type0) { coords = coords0; type = type0; } diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index 54e92455c8d..8a0a7c3e2a3 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -46,7 +46,7 @@ public class CardDetailUtil { public final int r, g, b; - private DetailColors(final int r0, final int g0, final int b0) { + DetailColors(final int r0, final int g0, final int b0) { r = r0; g = g0; b = b0; @@ -69,7 +69,7 @@ public class CardDetailUtil { return getBorderColors(colorSet, false, true, true); } private static List getBorderColors(final ColorSet cardColors, final boolean isLand, final boolean canShow, final boolean supportMultiple) { - final List borderColors = new ArrayList(); + final List borderColors = new ArrayList<>(); if (cardColors == null || !canShow) { borderColors.add(DetailColors.FACE_DOWN); @@ -339,7 +339,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append(c.getKey().getName() + " counters: "); + area.append(c.getKey().getName()).append(" counters: "); area.append(c.getValue()); } } @@ -351,7 +351,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("Damage: " + damage); + area.append("Damage: ").append(damage); } } if (state.isCreature() || state.isPlaneswalker()) { @@ -360,7 +360,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("Assigned Damage: " + assigned); + area.append("Assigned Damage: ").append(assigned); } } @@ -416,7 +416,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("(chosen player: " + card.getChosenPlayer() + ")"); + area.append("(chosen player: ").append(card.getChosenPlayer()).append(")"); } // chosen mode @@ -424,7 +424,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("(chosen mode: " + card.getChosenMode() + ")"); + area.append("(chosen mode: ").append(card.getChosenMode()).append(")"); } // named card @@ -506,7 +506,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("Haunting " + card.getHaunting()); + area.append("Haunting ").append(card.getHaunting()); } // Cipher @@ -514,7 +514,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("Encoded: " + card.getEncodedCards()); + area.append("Encoded: ").append(card.getEncodedCards()); } // must block @@ -523,7 +523,7 @@ public class CardDetailUtil { area.append("\n"); } final String mustBlockThese = Lang.joinHomogenous(card.getMustBlockCards()); - area.append("Must block " + mustBlockThese); + area.append("Must block ").append(mustBlockThese); } // exerted @@ -550,7 +550,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n\n"); } - area.append("Current Storm Count: " + gameView.getStormCount()); + area.append("Current Storm Count: ").append(gameView.getStormCount()); } } return area.toString(); diff --git a/forge-gui/src/main/java/forge/card/CardPreferences.java b/forge-gui/src/main/java/forge/card/CardPreferences.java index c271d55ac07..ffda9881370 100644 --- a/forge-gui/src/main/java/forge/card/CardPreferences.java +++ b/forge-gui/src/main/java/forge/card/CardPreferences.java @@ -22,7 +22,7 @@ import org.w3c.dom.NodeList; * */ public class CardPreferences { - private static Map allPrefs = new HashMap(); + private static Map allPrefs = new HashMap<>(); public static CardPreferences getPrefs(IPaperCard card) { String cardName = card.getName(); diff --git a/forge-gui/src/main/java/forge/card/CardReaderExperiments.java b/forge-gui/src/main/java/forge/card/CardReaderExperiments.java index 91159243231..00acd98e5fa 100644 --- a/forge-gui/src/main/java/forge/card/CardReaderExperiments.java +++ b/forge-gui/src/main/java/forge/card/CardReaderExperiments.java @@ -18,12 +18,12 @@ public class CardReaderExperiments { if (args.length < 2) { return; } int totalParsedCount = 0; - final List> output = new ArrayList>(); + final List> output = new ArrayList<>(); for (int i = 1; i < args.length; i++) { - output.add(new ArrayList()); + output.add(new ArrayList<>()); } - final List allFiles = CardStorageReader.collectCardFiles(new ArrayList(), new File(ForgeConstants.CARD_DATA_DIR)); + final List allFiles = CardStorageReader.collectCardFiles(new ArrayList<>(), new File(ForgeConstants.CARD_DATA_DIR)); Charset charset = Charset.forName(CardStorageReader.DEFAULT_CHARSET_NAME); final CardRules.Reader rulesReader = new CardRules.Reader(); for (File file : allFiles) { @@ -162,9 +162,9 @@ public class CardReaderExperiments { Matcher m = p.matcher(line); if (m.matches()) { StringBuilder newLineBuilder = new StringBuilder(); - newLineBuilder.append(line.substring(0, m.start(1))); + newLineBuilder.append(line, 0, m.start(1)); for (String sym : m.group(1).split(" ")) { - newLineBuilder.append("{" + sym + "}"); + newLineBuilder.append("{").append(sym).append("}"); } newLineBuilder.append(line.substring(m.end(1) - 1)); //-1 so final space appended updated = true; diff --git a/forge-gui/src/main/java/forge/card/CardScriptParser.java b/forge-gui/src/main/java/forge/card/CardScriptParser.java index a62037712cc..55947f13095 100644 --- a/forge-gui/src/main/java/forge/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/card/CardScriptParser.java @@ -344,10 +344,7 @@ public final class CardScriptParser { if (DEFINED_CARDS.contains(defined)) { return true; } - if (Iterables.any(DEFINED_CARDS_STARTSWITH, startsWith(defined))) { - return true; - } - return false; + return Iterables.any(DEFINED_CARDS_STARTSWITH, startsWith(defined)); } private static boolean isDefinedPlayerLegal(final String defined) { final boolean non = defined.startsWith("Non"), flipped = defined.startsWith("Flipped"); @@ -363,10 +360,7 @@ public final class CardScriptParser { if (DEFINED_PLAYERS.contains(defined)) { return true; } - if (Iterables.any(DEFINED_PLAYERS_STARTSWITH, startsWith(defined))) { - return true; - } - return false; + return Iterables.any(DEFINED_PLAYERS_STARTSWITH, startsWith(defined)); } private static final Set VALID_INCLUSIVE = ImmutableSortedSet.of( @@ -472,10 +466,7 @@ public final class CardScriptParser { if (VALID_EXCLUSIVE.contains(valid)) { return true; } - if (Iterables.any(VALID_EXCLUSIVE_STARTSWITH, startsWith(valid))) { - return true; - } - return false; + return Iterables.any(VALID_EXCLUSIVE_STARTSWITH, startsWith(valid)); } private static final class KeyValuePair { diff --git a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java index 264724df198..799364cff24 100644 --- a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java @@ -32,10 +32,10 @@ import forge.util.maps.MapOfLists; public class FControlGameEventHandler extends IGameEventVisitor.Base { private final PlayerControllerHuman humanController; private final IGuiGame matchController; - private final Set cardsUpdate = new HashSet(); - private final Set cardsRefreshDetails = new HashSet(); - private final Set livesUpdate = new HashSet(); - private final Set manaPoolUpdate = new HashSet(); + private final Set cardsUpdate = new HashSet<>(); + private final Set cardsRefreshDetails = new HashSet<>(); + private final Set livesUpdate = new HashSet<>(); + private final Set manaPoolUpdate = new HashSet<>(); private final PlayerZoneUpdates zonesUpdate = new PlayerZoneUpdates(); private boolean processEventsQueued, needPhaseUpdate, needCombatUpdate, needStackUpdate, needPlayerControlUpdate; @@ -301,7 +301,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public Void visit(final GameEventBlockersDeclared event) { - final Set cards = new HashSet(); + final Set cards = new HashSet<>(); for (final MapOfLists kv : event.blockers.values()) { for (final Collection blockers : kv.values()) { cards.addAll(blockers); diff --git a/forge-gui/src/main/java/forge/deck/ArchetypeDeckGenerator.java b/forge-gui/src/main/java/forge/deck/ArchetypeDeckGenerator.java index 74aefb8da64..bc2d523de60 100644 --- a/forge-gui/src/main/java/forge/deck/ArchetypeDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/ArchetypeDeckGenerator.java @@ -15,7 +15,7 @@ import java.util.List; */ public class ArchetypeDeckGenerator extends DeckProxy implements Comparable { public static List getMatrixDecks(GameFormat format, boolean isForAi){ - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for(Archetype archetype: CardArchetypeLDAGenerator.ldaArchetypes.get(format.getName())) { decks.add(new ArchetypeDeckGenerator(archetype, format, isForAi)); } diff --git a/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java b/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java index 1d38d76c8ac..ddcc82a3e02 100644 --- a/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardArchetypeLDAGenerator.java @@ -69,7 +69,7 @@ public final class CardArchetypeLDAGenerator { public static Map>>> loadFormat(List lda) throws Exception{ List>> topics = new ArrayList<>(); - Set cards = new HashSet(); + Set cards = new HashSet<>(); for (int t = 0; t < lda.size(); ++t) { List> topic = new ArrayList<>(); Set topicCards = new HashSet<>(); @@ -80,7 +80,7 @@ public final class CardArchetypeLDAGenerator { System.out.print("t" + t + ": "); int i = 0; while (topic.size()<=40&&i=0.005d) { topicCards.add(cardName); diff --git a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java index c8ef0a89a58..6c9c7e74687 100644 --- a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java @@ -62,7 +62,7 @@ public final class CardRelationMatrixGenerator { } public static HashMap>> initializeFormat(GameFormat format){ - IStorage decks = new StorageImmediatelySerialized("Generator", new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR+ForgeConstants.PATH_SEPARATOR+format.getName()), + IStorage decks = new StorageImmediatelySerialized<>("Generator", new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR + ForgeConstants.PATH_SEPARATOR + format.getName()), ForgeConstants.DECK_GEN_DIR, false), true); @@ -100,7 +100,7 @@ public final class CardRelationMatrixGenerator { for (PaperCard card:cardList){ int col=cardIntegerMap.get(card.getName()); int[] distances = matrix[col]; - int max = (Integer) Collections.max(Arrays.asList(ArrayUtils.toObject(distances))); + int max = Collections.max(Arrays.asList(ArrayUtils.toObject(distances))); if (max>0) { ArrayIndexComparator comparator = new ArrayIndexComparator(ArrayUtils.toObject(distances)); Integer[] indices = comparator.createIndexArray(); @@ -117,8 +117,8 @@ public final class CardRelationMatrixGenerator { if(!cardToAdd.getRules().getMainPart().getType().isLand()){//need x non-land cards ++j; } - deckPool.add(new AbstractMap.SimpleEntry(cardToAdd,distances[indices[cardList.size()-1-k]])); - }; + deckPool.add(new AbstractMap.SimpleEntry<>(cardToAdd, distances[indices[cardList.size() - 1 - k]])); + } if(excludeThisCard){ continue; } @@ -129,9 +129,9 @@ public final class CardRelationMatrixGenerator { } public static HashMap>> initializeCommanderFormat(DeckFormat format){ - IStorage decks = new StorageImmediatelySerialized("Generator", + IStorage decks = new StorageImmediatelySerialized<>("Generator", new DeckStorage(new File(ForgeConstants.DECK_GEN_DIR, format.toString()), - ForgeConstants.DECK_GEN_DIR, false), + ForgeConstants.DECK_GEN_DIR, false), true); //get all cards @@ -181,12 +181,12 @@ public final class CardRelationMatrixGenerator { for (PaperCard card:legends){ int col=legendIntegerMap.get(card.getName()); int[] distances = matrix[col]; - int max = (Integer) Collections.max(Arrays.asList(ArrayUtils.toObject(distances))); + int max = Collections.max(Arrays.asList(ArrayUtils.toObject(distances))); if (max>0) { List> deckPool=new ArrayList<>(); for(int k=0;k0){ - deckPool.add(new AbstractMap.SimpleEntry(integerCardMap.get(k),matrix[col][k])); + deckPool.add(new AbstractMap.SimpleEntry<>(integerCardMap.get(k), matrix[col][k])); } } cardPools.put(card.getName(), deckPool); diff --git a/forge-gui/src/main/java/forge/deck/CardThemedDeckGenerator.java b/forge-gui/src/main/java/forge/deck/CardThemedDeckGenerator.java index f9cff56d778..dad5e42face 100644 --- a/forge-gui/src/main/java/forge/deck/CardThemedDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardThemedDeckGenerator.java @@ -13,7 +13,7 @@ import java.util.List; */ public class CardThemedDeckGenerator extends DeckProxy implements Comparable { public static List getMatrixDecks(GameFormat format, boolean isForAi){ - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for(String card: CardArchetypeLDAGenerator.ldaPools.get(format.getName()).keySet()) { //exclude non AI playables as keycards for AI decks if(isForAi&&FModel.getMagicDb().getCommonCards().getUniqueByName(card).getRules().getAiHints().getRemAIDecks()){ diff --git a/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java b/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java index 284542da98e..19d782305f9 100644 --- a/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java @@ -13,7 +13,7 @@ public class ColorDeckGenerator extends DeckProxy implements Comparable getColorDecks(final IItemManager lstDecks0, final Predicate formatFilter0, final boolean isAi0) { final String[] colors = new String[] { "Random 1", "Random 2", "Random 3", "White", "Blue", "Black", "Red", "Green" }; - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for (int i = 0; i < colors.length; i++) { decks.add(new ColorDeckGenerator(colors[i], i, lstDecks0, formatFilter0, isAi0)); } @@ -56,7 +56,7 @@ public class ColorDeckGenerator extends DeckProxy implements Comparable selection = new ArrayList(); + final List selection = new ArrayList<>(); for (final DeckProxy deck : lstDecks.getSelectedItems()) { selection.add(deck.getName()); } diff --git a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java index 88938d11d34..12c7b84d0ff 100644 --- a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java @@ -24,7 +24,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable(PaperCard.class); + uniqueCards = new ItemPool<>(PaperCard.class); String matrixKey = (format.equals(DeckFormat.TinyLeaders) ? DeckFormat.Commander : format).toString(); //use Commander for Tiny Leaders Iterable legendNames = CardRelationMatrixGenerator.cardPools.get(matrixKey).keySet(); for (String legendName : legendNames) { @@ -44,7 +44,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable decks = new ArrayList(); + final List decks = new ArrayList<>(); for (PaperCard legend: legends) { decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen)); } @@ -54,7 +54,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable getBrawlDecks(final DeckFormat format, boolean isForAi, boolean isCardGen){ ItemPool uniqueCards; if (isCardGen){ - uniqueCards = new ItemPool(PaperCard.class); + uniqueCards = new ItemPool<>(PaperCard.class); //TODO: update to actual Brawl model from real Brawl decks Iterable legendNames=CardArchetypeLDAGenerator.ldaPools.get(FModel.getFormats().getStandard().getName()).keySet(); for (String legendName : legendNames) { @@ -70,7 +70,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable decks = new ArrayList(); + final List decks = new ArrayList<>(); for (PaperCard legend: legends) { decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen)); } diff --git a/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java b/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java index 281425fd157..8cc0a5c94f5 100644 --- a/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java +++ b/forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java @@ -72,7 +72,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { * @return a {@link java.util.ArrayList} object. */ public static final List getThemeNames() { - final List ltNames = new ArrayList(); + final List ltNames = new ArrayList<>(); final File file = new File(ForgeConstants.THEMES_DIR); @@ -124,7 +124,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { final float p = (float) (g.percentage * .01); final int grpCnt = (int) (p * size); final int cnSize = g.cardnames.size(); - errorBuilder.append("Group" + i + ":" + grpCnt + "\n"); + errorBuilder.append("Group").append(i).append(":").append(grpCnt).append("\n"); for (int j = 0; j < grpCnt; j++) { s = g.cardnames.get(MyRandom.getRandom().nextInt(cnSize)); @@ -150,7 +150,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { tDeck.add(pool.getCard(ss[0],ss[1])); } cardCounts.put(ss[0], n + 1); - errorBuilder.append(s + "\n"); + errorBuilder.append(s).append("\n"); } } @@ -162,15 +162,15 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { numBLands = size - tDeck.countAll(); } - errorBuilder.append("numBLands:" + numBLands + "\n"); + errorBuilder.append("numBLands:").append(numBLands).append("\n"); addBasicLand(numBLands,basicLandSet); - errorBuilder.append("DeckSize:" + tDeck.countAll() + "\n"); + errorBuilder.append("DeckSize:").append(tDeck.countAll()).append("\n"); adjustDeckSize(size); - errorBuilder.append("DeckSize:" + tDeck.countAll() + "\n"); + errorBuilder.append("DeckSize:").append(tDeck.countAll()).append("\n"); if (!testing) { errorBuilder.delete(0, errorBuilder.length()); //clear if not testing } @@ -180,7 +180,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { private class Grp { /** The Cardnames. */ - private final List cardnames = new ArrayList(); + private final List cardnames = new ArrayList<>(); /** The Max cnt. */ private int maxCnt; @@ -190,7 +190,7 @@ public class DeckGeneratorTheme extends DeckGeneratorBase { } private List readGroups(List lines) { - final List groups = new ArrayList(); + final List groups = new ArrayList<>(); Grp g = null; for (String s : lines) { diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java index d8182d211d0..e8d19779752 100644 --- a/forge-gui/src/main/java/forge/deck/DeckImportController.java +++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java @@ -19,7 +19,7 @@ public class DeckImportController { private final ICheckBox newEditionCheck, dateTimeCheck, onlyCoreExpCheck; private final IComboBox monthDropdown; private final IComboBox yearDropdown; - private final List tokens = new ArrayList(); + private final List tokens = new ArrayList<>(); public DeckImportController(boolean replacingDeck0, ICheckBox newEditionCheck0, ICheckBox dateTimeCheck0, ICheckBox onlyCoreExpCheck0, IComboBox monthDropdown0, IComboBox yearDropdown0) { replacingDeck = replacingDeck0; diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index 8502e9b49a5..01e46db5ecf 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -172,7 +172,7 @@ public class DeckProxy implements InventoryItem { //track phyrexian and hybrid costs separately as they won't always affect color if (shard.isPhyrexian() || shard.isOr2Generic() || !shard.isMonoColor()) { if (nonReqColors == null) { - nonReqColors = new HashSet(); + nonReqColors = new HashSet<>(); } nonReqColors.add(shard.getColorMask()); } @@ -350,7 +350,7 @@ public class DeckProxy implements InventoryItem { return getAllConstructedDecks(null); } public static Iterable getAllConstructedDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Constructed", GameType.Constructed, result, "", FModel.getDecks().getConstructed(), filter); return result; } @@ -359,7 +359,7 @@ public class DeckProxy implements InventoryItem { return getAllCommanderDecks(null); } public static Iterable getAllCommanderDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Commander", GameType.Commander, result, "", FModel.getDecks().getCommander(), filter); return result; } @@ -368,7 +368,7 @@ public class DeckProxy implements InventoryItem { return getAllOathbreakerDecks(null); } public static Iterable getAllOathbreakerDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Oathbreaker", GameType.Oathbreaker, result, "", FModel.getDecks().getOathbreaker(), filter); return result; } @@ -377,7 +377,7 @@ public class DeckProxy implements InventoryItem { return getAllTinyLeadersDecks(null); } public static Iterable getAllTinyLeadersDecks(Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); if (filter == null) { filter = DeckFormat.TinyLeaders.hasLegalCardsPredicate(); } @@ -392,7 +392,7 @@ public class DeckProxy implements InventoryItem { return getAllBrawlDecks(null); } public static Iterable getAllBrawlDecks(Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); if (filter == null) { filter = DeckFormat.Brawl.hasLegalCardsPredicate(); } @@ -407,7 +407,7 @@ public class DeckProxy implements InventoryItem { return getAllSchemeDecks(null); } public static Iterable getAllSchemeDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Scheme", GameType.Archenemy, result, "", FModel.getDecks().getScheme(), filter); return result; } @@ -416,7 +416,7 @@ public class DeckProxy implements InventoryItem { return getAllPlanarDecks(null); } public static Iterable getAllPlanarDecks(final Predicate filter) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); addDecksRecursivelly("Plane", GameType.Planechase, result, "", FModel.getDecks().getPlane(), filter); return result; } @@ -510,7 +510,7 @@ public class DeckProxy implements InventoryItem { } public static List getAllThemeDecks() { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for (final String s : DeckGeneratorTheme.getThemeNames()) { decks.add(new ThemeDeckGenerator(s)); } @@ -519,7 +519,7 @@ public class DeckProxy implements InventoryItem { @SuppressWarnings("unchecked") public static List getAllPreconstructedDecks(final IStorage iStorage) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for (final PreconDeck preconDeck : iStorage) { decks.add(new DeckProxy(preconDeck, "Precon", (Function)(Object)PreconDeck.FN_GET_DECK, null, iStorage)); } @@ -527,7 +527,7 @@ public class DeckProxy implements InventoryItem { } public static List getAllQuestEventAndChallenges() { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); final QuestController quest = FModel.getQuest(); for (final QuestEvent e : quest.getDuelsManager().getAllDuels()) { decks.add(new DeckProxy(e.getEventDeck(), "Quest Event", null, null)); @@ -540,7 +540,7 @@ public class DeckProxy implements InventoryItem { @SuppressWarnings("unchecked") public static List getAllSealedDecks() { - final List humanDecks = new ArrayList(); + final List humanDecks = new ArrayList<>(); final IStorage sealed = FModel.getDecks().getSealed(); // Since AI decks are tied directly to the human choice, @@ -552,7 +552,7 @@ public class DeckProxy implements InventoryItem { } public static List getAllQuestDecks(final IStorage storage) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); if (storage != null) { for (final Deck deck : storage) { decks.add(new DeckProxy(deck, "Quest", GameType.Quest, storage)); @@ -563,7 +563,7 @@ public class DeckProxy implements InventoryItem { @SuppressWarnings("unchecked") public static List getAllDraftDecks() { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); final IStorage draft = FModel.getDecks().getDraft(); for (final DeckGroup d : draft) { decks.add(new DeckProxy(d, "Draft", ((Function)(Object)DeckGroup.FN_HUMAN_DECK), GameType.Draft, draft)); @@ -573,7 +573,7 @@ public class DeckProxy implements InventoryItem { @SuppressWarnings("unchecked") public static List getWinstonDecks(final IStorage draft) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); for (final DeckGroup d : draft) { decks.add(new DeckProxy(d, "Winston", ((Function)(Object)DeckGroup.FN_HUMAN_DECK), GameType.Winston, draft)); } @@ -581,7 +581,7 @@ public class DeckProxy implements InventoryItem { } public static List getNetDecks(final NetDeckCategory category) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); if (category != null) { addDecksRecursivelly("Constructed", GameType.Constructed, decks, "", category, null); } diff --git a/forge-gui/src/main/java/forge/deck/DeckType.java b/forge-gui/src/main/java/forge/deck/DeckType.java index 2b25e3533a4..83867dc6d50 100644 --- a/forge-gui/src/main/java/forge/deck/DeckType.java +++ b/forge-gui/src/main/java/forge/deck/DeckType.java @@ -85,7 +85,7 @@ public enum DeckType { } private String value; - private DeckType(final String value) { + DeckType(final String value) { final Localizer localizer = Localizer.getInstance(); this.value = localizer.getMessage(value); } diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 0f27b16d038..67dd9217b04 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -389,7 +389,7 @@ public class DeckgenUtil { public static Deck getRandomColorDeck(Predicate formatFilter, boolean forAi) { final int[] colorCount = new int[] {1, 2, 3}; final int count = colorCount[MyRandom.getRandom().nextInt(colorCount.length)]; - final List selection = new ArrayList(); + final List selection = new ArrayList<>(); // A simulated selection of "random 1" will trigger the AI selection process. for (int i = 0; i < count; i++) { selection.add("Random"); } @@ -400,7 +400,7 @@ public class DeckgenUtil { public static Deck getRandomColorDeck(boolean forAi) { final int[] colorCount = new int[] {1, 2, 3, 5}; final int count = colorCount[MyRandom.getRandom().nextInt(colorCount.length)]; - final List selection = new ArrayList(); + final List selection = new ArrayList<>(); // A simulated selection of "random 1" will trigger the AI selection process. for (int i = 0; i < count; i++) { selection.add("Random"); } @@ -430,7 +430,7 @@ public class DeckgenUtil { } public static Deck getRandomQuestDeck() { - final List allQuestDecks = new ArrayList(); + final List allQuestDecks = new ArrayList<>(); QuestController qCtrl = FModel.getQuest(); for (final QuestEvent e : qCtrl.getDuelsManager().getAllDuels()) { @@ -512,7 +512,7 @@ public class DeckgenUtil { public static CardPool generateSchemePool() { CardPool schemes = new CardPool(); - List allSchemes = new ArrayList(); + List allSchemes = new ArrayList<>(); for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { if (c.getRules().getType().isScheme()) { allSchemes.add(c); @@ -544,7 +544,7 @@ public class DeckgenUtil { public static CardPool generatePlanarPool() { CardPool res = new CardPool(); - List allPlanars = new ArrayList(); + List allPlanars = new ArrayList<>(); for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { if (c.getRules().getType().isPlane() || c.getRules().getType().isPhenomenon()) { allPlanars.add(c); @@ -622,9 +622,8 @@ public class DeckgenUtil { } } }else { - List> potentialCards = new ArrayList<>(); String matrixKey = (format.equals(DeckFormat.TinyLeaders) ? DeckFormat.Commander : format).toString(); //use Commander for Tiny Leaders - potentialCards.addAll(CardRelationMatrixGenerator.cardPools.get(matrixKey).get(commander.getName())); + List> potentialCards = new ArrayList<>(CardRelationMatrixGenerator.cardPools.get(matrixKey).get(commander.getName())); Collections.shuffle(potentialCards, MyRandom.getRandom()); for(Map.Entry pair:potentialCards){ if(format.isLegalCard(pair.getKey())) { diff --git a/forge-gui/src/main/java/forge/deck/NetDeckCategory.java b/forge-gui/src/main/java/forge/deck/NetDeckCategory.java index 75fcdbec995..809d60056a1 100644 --- a/forge-gui/src/main/java/forge/deck/NetDeckCategory.java +++ b/forge-gui/src/main/java/forge/deck/NetDeckCategory.java @@ -24,7 +24,7 @@ public class NetDeckCategory extends StorageBase { private static Map constructed, commander; private static Map loadCategories(String filename) { - Map categories = new TreeMap(); + Map categories = new TreeMap<>(); if (FileUtil.doesFileExist(filename)) { List lines = FileUtil.readFile(filename); for (String line : lines) { @@ -108,7 +108,7 @@ public class NetDeckCategory extends StorageBase { private final String url; private NetDeckCategory(String name0, String url0) { - super(name0, ForgeConstants.DECK_NET_DIR + name0, new HashMap()); + super(name0, ForgeConstants.DECK_NET_DIR + name0, new HashMap<>()); url = url0; } diff --git a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java index 4c2d999abce..8837c75ad1b 100644 --- a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java @@ -20,7 +20,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable getRandomDecks(final IHasGameType lstDecks0, final boolean isAi0) { - final List decks = new ArrayList(); + final List decks = new ArrayList<>(); decks.add(new RandomDeckGenerator("Random Generated Deck", RandomDeckType.Generated, lstDecks0, isAi0)); decks.add(new RandomDeckGenerator("Random User Deck", RandomDeckType.User, lstDecks0, isAi0)); @@ -96,7 +96,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable colors = new ArrayList(); + List colors = new ArrayList<>(); int count = Aggregates.randomInt(1, 3); for (int i = 1; i <= count; i++) { colors.add("Random " + i); @@ -111,14 +111,14 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable(); + colors = new ArrayList<>(); count = Aggregates.randomInt(1, 3); for (int i = 1; i <= count; i++) { colors.add("Random " + i); } return DeckgenUtil.buildColorDeck(colors, FModel.getFormats().getStandard().getFilterPrinted(), isAi); case MODERN_COLOR_DECK: - colors = new ArrayList(); + colors = new ArrayList<>(); count = Aggregates.randomInt(1, 3); for (int i = 1; i <= count; i++) { colors.add("Random " + i); diff --git a/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java b/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java index 3e2f6205b2a..cb5c58ccab5 100644 --- a/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java +++ b/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java @@ -24,7 +24,7 @@ import org.w3c.dom.NodeList; public class DeckPreferences { private static String selectedDeckType = "", currentDeck = "", draftDeck = "", sealedDeck = "", commanderDeck = "", oathbreakerDeck = "", tinyLeadersDeck = "", brawlDeck = "", planarDeck = "", schemeDeck = ""; - private static Map allPrefs = new HashMap(); + private static Map allPrefs = new HashMap<>(); public static DeckType getSelectedDeckType() { return selectedDeckType.isEmpty() ? DeckType.CONSTRUCTED_DECK : DeckType.valueOf(selectedDeckType); diff --git a/forge-gui/src/main/java/forge/deck/io/DeckRecords.java b/forge-gui/src/main/java/forge/deck/io/DeckRecords.java index 385799853cc..3588662674b 100644 --- a/forge-gui/src/main/java/forge/deck/io/DeckRecords.java +++ b/forge-gui/src/main/java/forge/deck/io/DeckRecords.java @@ -14,7 +14,7 @@ import forge.game.player.RegisteredPlayer; @SuppressWarnings("unused") public class DeckRecords { - private static final Map recordLookup = new HashMap(); + private static final Map recordLookup = new HashMap<>(); public static void recordMatchOutcome(Match match) { for (RegisteredPlayer p1 : match.getPlayers()) { @@ -25,7 +25,7 @@ public class DeckRecords { } } - private final List matches = new ArrayList(); + private final List matches = new ArrayList<>(); public void addMatch(Match match, LobbyPlayer player) { matches.add(new DeckMatch(match, player)); diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadPicturesHQ.java b/forge-gui/src/main/java/forge/download/GuiDownloadPicturesHQ.java index cd97aacc017..7783f2872de 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadPicturesHQ.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadPicturesHQ.java @@ -38,7 +38,7 @@ public class GuiDownloadPicturesHQ extends GuiDownloadService { @Override protected final Map getNeededFiles() { File f = new File(ForgeConstants.CACHE_CARD_PICS_DIR); - existingImages = new ArrayList(Arrays.asList(f.list())); + existingImages = new ArrayList<>(Arrays.asList(f.list())); existingSets = retrieveManifestDirectory(); for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) { diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java b/forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java index 6bcbee8ce0a..8faf330004f 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java @@ -39,7 +39,7 @@ public class GuiDownloadPicturesLQ extends GuiDownloadService { @Override protected final Map getNeededFiles() { File f = new File(ForgeConstants.CACHE_CARD_PICS_DIR); - existingImages = new ArrayList(Arrays.asList(f.list())); + existingImages = new ArrayList<>(Arrays.asList(f.list())); existingSets = retrieveManifestDirectory(); for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) { diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadService.java b/forge-gui/src/main/java/forge/download/GuiDownloadService.java index 88f39d77b95..d6183fe207c 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadService.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadService.java @@ -264,7 +264,11 @@ public abstract class GuiDownloadService implements Runnable { count++; cardSkipped = true; //assume skipped unless saved successfully String url = kv.getValue(); - //decode URL Key + /* + * decode URL Key, Reverted to old version, + * on Android 6.0 it throws an error + * when you download the card price + */ String decodedKey = URLDecoder.decode(kv.getKey()); final File fileDest = new File(decodedKey); final String filePath = fileDest.getPath(); diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java b/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java index d7c0c88ddd3..f1d1dc9b8d4 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadZipService.java @@ -48,7 +48,7 @@ public class GuiDownloadZipService extends GuiDownloadService { @Override protected final Map getNeededFiles() { - final Map files = new HashMap(); + final Map files = new HashMap<>(); files.put("_", "_"); return files; //not needed by zip service, so just return map of size 1 } @@ -181,7 +181,7 @@ public class GuiDownloadZipService extends GuiDownloadService { int count; long total = 0; - final byte data[] = new byte[1024]; + final byte[] data = new byte[1024]; while ((count = input.read(data)) != -1) { if (cancel) { break; } diff --git a/forge-gui/src/main/java/forge/error/ExceptionHandler.java b/forge-gui/src/main/java/forge/error/ExceptionHandler.java index 18463eca1ed..1851ab83937 100644 --- a/forge-gui/src/main/java/forge/error/ExceptionHandler.java +++ b/forge-gui/src/main/java/forge/error/ExceptionHandler.java @@ -61,7 +61,7 @@ public class ExceptionHandler implements UncaughtExceptionHandler { int i = 0; while (logFile.exists() && !logFile.delete()) { - String pathname = logFile.getPath().replaceAll("[0-9]{0,2}.log$", String.valueOf(i++) + ".log"); + String pathname = logFile.getPath().replaceAll("[0-9]{0,2}.log$", i++ + ".log"); logFile = new File(pathname); } diff --git a/forge-gui/src/main/java/forge/gauntlet/GauntletData.java b/forge-gui/src/main/java/forge/gauntlet/GauntletData.java index 91d2a04967f..e9b470cf10a 100644 --- a/forge-gui/src/main/java/forge/gauntlet/GauntletData.java +++ b/forge-gui/src/main/java/forge/gauntlet/GauntletData.java @@ -30,8 +30,8 @@ public final class GauntletData { private int completed; private String timestamp; - private List eventRecords = new ArrayList(); - private List eventNames = new ArrayList(); + private List eventRecords = new ArrayList<>(); + private List eventNames = new ArrayList<>(); private Deck userDeck; private List decks; @@ -64,7 +64,7 @@ public final class GauntletData { public void stamp() { final DateFormat dateFormat = new SimpleDateFormat("MM-dd-yy, H:m"); - timestamp = dateFormat.format(new Date()).toString(); + timestamp = dateFormat.format(new Date()); } /** Resets a gauntlet data to an unplayed state, then stamps and saves. */ @@ -101,7 +101,7 @@ public final class GauntletData { } public List getDeckNames() { - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final Deck d : decks) { names.add(d.getName()); } return names; } diff --git a/forge-gui/src/main/java/forge/gauntlet/GauntletUtil.java b/forge-gui/src/main/java/forge/gauntlet/GauntletUtil.java index 46d73a1552d..65b784084a5 100644 --- a/forge-gui/src/main/java/forge/gauntlet/GauntletUtil.java +++ b/forge-gui/src/main/java/forge/gauntlet/GauntletUtil.java @@ -18,8 +18,8 @@ public class GauntletUtil { // Generate gauntlet decks Deck deck; - final List eventNames = new ArrayList(); - final List decks = new ArrayList(); + final List eventNames = new ArrayList<>(); + final List decks = new ArrayList<>(); final Object[] netDeckNames = netDecks != null ? netDecks.getItemNames().toArray() : null; @@ -86,7 +86,7 @@ public class GauntletUtil { public static void setDefaultGauntletName(GauntletData gauntlet, String prefix) { final File[] arrFiles = GauntletIO.getGauntletFilesUnlocked(prefix); - final Set setNames = new HashSet(); + final Set setNames = new HashSet<>(); for (File f : arrFiles) { setNames.add(f.getName()); } diff --git a/forge-gui/src/main/java/forge/interfaces/IDevModeCheats.java b/forge-gui/src/main/java/forge/interfaces/IDevModeCheats.java index 43d36633c6d..dd62238991e 100644 --- a/forge-gui/src/main/java/forge/interfaces/IDevModeCheats.java +++ b/forge-gui/src/main/java/forge/interfaces/IDevModeCheats.java @@ -61,7 +61,7 @@ public interface IDevModeCheats { * Implementation of {@link IDevModeCheats} that disallows cheating by * performing no action whatsoever when any of its methods is called. */ - public static final IDevModeCheats NO_CHEAT = new IDevModeCheats() { + IDevModeCheats NO_CHEAT = new IDevModeCheats() { @Override public void winGame() { } diff --git a/forge-gui/src/main/java/forge/interfaces/IMayViewCards.java b/forge-gui/src/main/java/forge/interfaces/IMayViewCards.java index 9aeeab0f934..ec84e61ab54 100644 --- a/forge-gui/src/main/java/forge/interfaces/IMayViewCards.java +++ b/forge-gui/src/main/java/forge/interfaces/IMayViewCards.java @@ -22,7 +22,7 @@ public interface IMayViewCards { boolean mayFlip(CardView c); /** {@link IMayViewCards} that lets you view all cards unconditionally. */ - public static final IMayViewCards ALL = new IMayViewCards() { + IMayViewCards ALL = new IMayViewCards() { @Override public boolean mayView(final CardView c) { return true; diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java index 65cd449f1c3..129924ef861 100644 --- a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java @@ -139,7 +139,7 @@ public class AdvancedSearch { @Override protected Set getItemValues(PaperCard input) { final CardType type = input.getRules().getType(); - final Set types = new HashSet(); + final Set types = new HashSet<>(); for (Supertype t : type.getSupertypes()) { types.add(t.name()); } @@ -209,7 +209,7 @@ public class AdvancedSearch { List cards = FModel.getMagicDb().getCommonCards().getAllCards(input.getName()); if (cards.size() <= 1) { return true; } - Collections.sort(cards, FModel.getMagicDb().getEditions().CARD_EDITION_COMPARATOR); + cards.sort(FModel.getMagicDb().getEditions().CARD_EDITION_COMPARATOR); return cards.get(0) == input; } }), @@ -363,7 +363,7 @@ public class AdvancedSearch { private final FilterOperator[] operatorOptions; private final FilterEvaluator evaluator; - private FilterOption(String name0, Class type0, FilterOperator[] operatorOptions0, FilterEvaluator evaluator0) { + FilterOption(String name0, Class type0, FilterOperator[] operatorOptions0, FilterEvaluator evaluator0) { name = name0; type = type0; operatorOptions = operatorOptions0; @@ -680,7 +680,7 @@ public class AdvancedSearch { private final FilterValueCount valueCount; private final OperatorEvaluator evaluator; - private FilterOperator(String caption0, String formatStr0, FilterValueCount valueCount0, OperatorEvaluator evaluator0) { + FilterOperator(String caption0, String formatStr0, FilterValueCount valueCount0, OperatorEvaluator evaluator0) { caption = caption0; formatStr = formatStr0; valueCount = valueCount0; @@ -736,7 +736,7 @@ public class AdvancedSearch { } }; } - return new Filter(option, operator, caption, predicate); + return new Filter<>(option, operator, caption, predicate); } protected abstract List getValues(FilterOption option, FilterOperator operator); @@ -754,7 +754,7 @@ public class AdvancedSearch { @Override protected List getValues(FilterOption option, FilterOperator operator) { - List values = new ArrayList(); + List values = new ArrayList<>(); values.add(operator == FilterOperator.IS_TRUE); //just always add a single boolean value so other logic works return values; } @@ -785,7 +785,7 @@ public class AdvancedSearch { Integer lowerBound = SGuiChoose.getInteger(message, min, max); if (lowerBound == null) { return null; } - final List values = new ArrayList(); + final List values = new ArrayList<>(); values.add(lowerBound); if (operator.valueCount == FilterValueCount.TWO) { //prompt for upper bound if needed @@ -825,7 +825,7 @@ public class AdvancedSearch { initialInput = value; //store value as initial input for next time - List values = new ArrayList(); + List values = new ArrayList<>(); values.add(value); return values; } @@ -886,12 +886,12 @@ public class AdvancedSearch { return formatValue(values.get(0)) + finalDelim + formatValue(values.get(1)); default: int lastValueIdx = valueCount - 1; - String result = formatValue(values.get(0)); + StringBuilder result = new StringBuilder(formatValue(values.get(0))); for (int i = 1; i < lastValueIdx; i++) { - result += delim + formatValue(values.get(i)); + result.append(delim).append(formatValue(values.get(i))); } - result += delim.trim() + finalDelim + formatValue(values.get(lastValueIdx)); - return result; + result.append(delim.trim()).append(finalDelim).append(formatValue(values.get(lastValueIdx))); + return result.toString(); } } @@ -934,10 +934,10 @@ public class AdvancedSearch { if (amount == null) { return null; } } - Map map = new HashMap(); + Map map = new HashMap<>(); map.put(card.getName(), amount); - List> values = new ArrayList>(); + List> values = new ArrayList<>(); values.add(map); return values; } @@ -958,7 +958,7 @@ public class AdvancedSearch { final FilterOption defaultOption = editFilter == null ? null : editFilter.option; if (defaultOption == null || reselectOption) { //build list of filter options based on ItemManager type - List options = new ArrayList(); + List options = new ArrayList<>(); if (editFilter != null) { options.add(FilterOption.NONE); //provide option to clear existing filter } @@ -1051,8 +1051,8 @@ public class AdvancedSearch { public static class Model { private static final String EMPTY_FILTER_TEXT = "Select Filter..."; - private final List expression = new ArrayList(); - private final List> controls = new ArrayList>(); + private final List expression = new ArrayList<>(); + private final List> controls = new ArrayList<>(); private IButton label; public Model() { @@ -1233,15 +1233,15 @@ public class AdvancedSearch { StringBuilder builder = new StringBuilder(); builder.append("Filter:\n"); - String indent = ""; + StringBuilder indent = new StringBuilder(); for (Object piece : expression) { - if (piece.equals(Operator.CLOSE_PAREN) && !indent.isEmpty()) { - indent = indent.substring(2); //trim an indent level when a close paren is hit + if (piece.equals(Operator.CLOSE_PAREN) && (indent.length() > 0)) { + indent = new StringBuilder(indent.substring(2)); //trim an indent level when a close paren is hit } - builder.append("\n" + indent + piece.toString().trim()); + builder.append("\n").append(indent).append(piece.toString().trim()); if (piece.equals(Operator.OPEN_PAREN)) { - indent += " "; //add an indent level when an open paren is hit + indent.append(" "); //add an indent level when an open paren is hit } } return GuiBase.getInterface().encodeSymbols(builder.toString(), false); @@ -1302,7 +1302,7 @@ public class AdvancedSearch { private final String token; - private Operator(String token0) { + Operator(String token0) { token = token0; } diff --git a/forge-gui/src/main/java/forge/itemmanager/BooleanExpression.java b/forge-gui/src/main/java/forge/itemmanager/BooleanExpression.java index 291bc5f1441..995cbccd033 100644 --- a/forge-gui/src/main/java/forge/itemmanager/BooleanExpression.java +++ b/forge-gui/src/main/java/forge/itemmanager/BooleanExpression.java @@ -43,7 +43,7 @@ public class BooleanExpression { public Predicate evaluate() { - String currentValue = ""; + StringBuilder currentValue = new StringBuilder(); boolean escapeNext = false; while (expression.hasNext()) { @@ -59,7 +59,7 @@ public class BooleanExpression { operator = Operator.OPEN_PAREN; } else if (token.equals(Operator.CLOSE_PAREN.token)) { operator = Operator.CLOSE_PAREN; - } else if (token.equals(Operator.NOT.token) && currentValue.trim().isEmpty()) { //Ignore ! operators that aren't the first token in a search term (Don't use '!' in 'Kaboom!') + } else if (token.equals(Operator.NOT.token) && currentValue.toString().trim().isEmpty()) { //Ignore ! operators that aren't the first token in a search term (Don't use '!' in 'Kaboom!') operator = Operator.NOT; } else if (token.equals(Operator.ESCAPE.token)) { escapeNext = true; @@ -67,20 +67,20 @@ public class BooleanExpression { } if (operator == null) { - currentValue += token; + currentValue.append(token); } else { if (escapeNext) { escapeNext = false; - currentValue += token; + currentValue.append(token); continue; } - if (!currentValue.trim().isEmpty()) { - operands.push(valueOf(currentValue.trim())); + if (!currentValue.toString().trim().isEmpty()) { + operands.push(valueOf(currentValue.toString().trim())); } - currentValue = ""; + currentValue = new StringBuilder(); if (!operators.isEmpty() && operator.precedence < operators.peek().precedence) { resolve(true); @@ -98,8 +98,8 @@ public class BooleanExpression { } - if (!currentValue.trim().isEmpty()) { - operands.push(valueOf(currentValue.trim())); + if (!currentValue.toString().trim().isEmpty()) { + operands.push(valueOf(currentValue.toString().trim())); } while (!operators.isEmpty()) { diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index f39870fb687..2fc2578911e 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -282,7 +282,7 @@ public enum GroupDef { private static Map setGroupMap; private static String[] getSetGroups() { - setGroupMap = new HashMap(); //cache mappings to make lookup quicker later + setGroupMap = new HashMap<>(); //cache mappings to make lookup quicker later //build sorted list of sets List sortedSets = Lists.newArrayList(FModel.getMagicDb().getEditions()); diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java b/forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java index e6e202bba64..c4c8c550464 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemColumnConfig.java @@ -7,7 +7,7 @@ import com.google.common.base.Function; import forge.item.InventoryItem; public class ItemColumnConfig { - public static enum SortState { + public enum SortState { NONE, ASC, DESC diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java index 0280c8ab604..0404e78939d 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java @@ -114,20 +114,20 @@ public enum ItemManagerConfig { private Prop imageColumnCount; private Prop viewIndex; - private ItemManagerConfig(final Map cols0, boolean showUniqueCardsOption0, boolean uniqueCardsOnly0, boolean hideFilters0, GroupDef groupBy0, ColumnDef pileBy0, int imageColumnCount0, int viewIndex0) { + ItemManagerConfig(final Map cols0, boolean showUniqueCardsOption0, boolean uniqueCardsOnly0, boolean hideFilters0, GroupDef groupBy0, ColumnDef pileBy0, int imageColumnCount0, int viewIndex0) { cols = cols0; for (ItemColumnConfig colConfig : cols.values()) { colConfig.establishDefaults(); } showUniqueCardsOption = showUniqueCardsOption0; - uniqueCardsOnly = new Prop(uniqueCardsOnly0); - hideFilters = new Prop(hideFilters0); - compactListView = new Prop(FModel.getPreferences().getPrefBoolean(FPref.UI_COMPACT_LIST_ITEMS)); //use main setting to determine default - groupBy = new Prop(groupBy0); - pileBy = new Prop(pileBy0); - imageColumnCount = new Prop(imageColumnCount0); - viewIndex = new Prop(viewIndex0); + uniqueCardsOnly = new Prop<>(uniqueCardsOnly0); + hideFilters = new Prop<>(hideFilters0); + compactListView = new Prop<>(FModel.getPreferences().getPrefBoolean(FPref.UI_COMPACT_LIST_ITEMS)); //use main setting to determine default + groupBy = new Prop<>(groupBy0); + pileBy = new Prop<>(pileBy0); + imageColumnCount = new Prop<>(imageColumnCount0); + viewIndex = new Prop<>(viewIndex0); } private class Prop { diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java index a55282600a2..cb634c6f120 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerModel.java @@ -18,10 +18,8 @@ package forge.itemmanager; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import forge.item.InventoryItem; @@ -38,7 +36,7 @@ public final class ItemManagerModel { private final CascadeManager cascadeManager = new CascadeManager(); public ItemManagerModel(final Class genericType0) { - data = new ItemPool(genericType0); + data = new ItemPool<>(genericType0); } public void clear() { @@ -47,7 +45,7 @@ public final class ItemManagerModel { // same thing as above, it was copied to provide sorting (needed by table // views in deck editors) - private final transient List> itemsOrdered = new ArrayList>(); + private final transient List> itemsOrdered = new ArrayList<>(); protected transient boolean isListInSync = false; @@ -126,12 +124,12 @@ public final class ItemManagerModel { public void refreshSort() { if (getOrderedList().isEmpty()) { return; } - Collections.sort(getOrderedList(), new MyComparator()); + getOrderedList().sort(new MyComparator()); } //Manages sorting orders for multiple depths of sorting public final class CascadeManager { - private final List colsToSort = new ArrayList(3); + private final List colsToSort = new ArrayList<>(3); private Sorter sorter = null; // Adds a column to sort cascade list. @@ -185,12 +183,12 @@ public final class ItemManagerModel { } private Sorter createSorter() { - final List> oneColSorters = new ArrayList>(maxSortDepth); + final List> oneColSorters = new ArrayList<>(maxSortDepth); for (final ItemColumn col : colsToSort) { - oneColSorters.add(new ItemPoolSorter( + oneColSorters.add(new ItemPoolSorter<>( col.getFnSort(), - col.getConfig().getSortState().equals(SortState.ASC) ? true : false)); + col.getConfig().getSortState().equals(SortState.ASC))); } return new Sorter(oneColSorters); diff --git a/forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java b/forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java index f77db9dfcec..b3c73ac443a 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SColumnUtil.java @@ -34,7 +34,7 @@ import forge.itemmanager.ItemColumnConfig.SortState; public final class SColumnUtil { public static Map getColumns(Iterable colDefs) { int i = 0; - final Map columns = new HashMap(); + final Map columns = new HashMap<>(); for (ColumnDef colDef : colDefs) { ItemColumnConfig column = new ItemColumnConfig(colDef); column.setIndex(i++); @@ -44,7 +44,7 @@ public final class SColumnUtil { } public static Map getStringColumn() { - Map columns = new HashMap(); + Map columns = new HashMap<>(); ItemColumnConfig column = new ItemColumnConfig(ColumnDef.STRING); column.setSortPriority(1); columns.put(ColumnDef.STRING, column); @@ -56,7 +56,7 @@ public final class SColumnUtil { } private static Map getCardColumns(ColumnDef quantityColDef, boolean includeFavorite, boolean includeOwned, boolean includePrice, boolean includeNew, boolean includeDecks) { - List colDefs = new ArrayList(); + List colDefs = new ArrayList<>(); if (includeFavorite) { colDefs.add(ColumnDef.FAVORITE); } @@ -128,7 +128,7 @@ public final class SColumnUtil { } public static Map getSpecialCardPoolDefaultColumns() { - List colDefs = new ArrayList(); + List colDefs = new ArrayList<>(); colDefs.add(ColumnDef.FAVORITE); colDefs.add(ColumnDef.NAME); colDefs.add(ColumnDef.TYPE); @@ -195,7 +195,7 @@ public final class SColumnUtil { } public static Map getConquestCommandersDefaultColumns() { - List colDefs = new ArrayList(); + List colDefs = new ArrayList<>(); colDefs.add(ColumnDef.NAME); colDefs.add(ColumnDef.COLOR); @@ -206,7 +206,7 @@ public final class SColumnUtil { } public static Map getDecksDefaultColumns(boolean allowEdit, boolean includeFolder) { - List colDefs = new ArrayList(); + List colDefs = new ArrayList<>(); colDefs.add(ColumnDef.DECK_FAVORITE); if (allowEdit) { colDefs.add(ColumnDef.DECK_ACTIONS); diff --git a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java index 2f6a7291536..d0b49c98364 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SFilterUtil.java @@ -70,16 +70,16 @@ public class SFilterUtil { private static List getSplitText(String text) { boolean inQuotes = false; - String entry = ""; - List splitText = new ArrayList(); + StringBuilder entry = new StringBuilder(); + List splitText = new ArrayList<>(); for (int i = 0; i < text.length(); i++) { char ch = text.charAt(i); switch (ch) { case ' ': if (!inQuotes) { //if not in quotes, end current entry if (entry.length() > 0) { - splitText.add(entry); - entry = ""; + splitText.add(entry.toString()); + entry = new StringBuilder(); } continue; } @@ -99,10 +99,10 @@ public class SFilterUtil { } break; } - entry += ch; + entry.append(ch); } if (entry.length() > 0) { - splitText.add(entry); + splitText.add(entry.toString()); } return splitText; } diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index b880cf717b6..eb960d86a2c 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -12,7 +12,6 @@ import forge.util.ComparableOp; import forge.util.Localizer; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map.Entry; @@ -28,7 +27,7 @@ import java.util.Map.Entry; */ public final class SItemManagerUtil { /** An enum to encapsulate metadata for the stats/filter objects. */ - public static enum StatTypes implements IHasSkinProp { + public enum StatTypes implements IHasSkinProp { WHITE (FSkinProp.IMG_MANA_W, CardRulesPredicates.Presets.IS_WHITE, "lblWhitecards"), BLUE (FSkinProp.IMG_MANA_U, CardRulesPredicates.Presets.IS_BLUE, "lblBluecards"), BLACK (FSkinProp.IMG_MANA_B, CardRulesPredicates.Presets.IS_BLACK, "lblBlackcards"), @@ -78,7 +77,7 @@ public final class SItemManagerUtil { public final Predicate predicate; public final String label; - private StatTypes(final FSkinProp skinProp0, final Predicate predicate0, final String label0) { + StatTypes(final FSkinProp skinProp0, final Predicate predicate0, final String label0) { skinProp = skinProp0; predicate = predicate0; final Localizer localizer = Localizer.getInstance(); @@ -92,7 +91,7 @@ public final class SItemManagerUtil { } public static String getItemDisplayString(final InventoryItem item, final int qty, final boolean forTitle) { - final List items = new ArrayList(); + final List items = new ArrayList<>(); items.add(item); return getItemDisplayString(items, qty, forTitle); } @@ -143,11 +142,11 @@ public final class SItemManagerUtil { } public static String buildDisplayList(final Iterable> items) { - final List> sorted = new ArrayList>(); + final List> sorted = new ArrayList<>(); for (final Entry itemEntry : items) { sorted.add(itemEntry); } - Collections.sort(sorted, new Comparator>() { + sorted.sort(new Comparator>() { @Override public int compare(final Entry x, final Entry y) { return x.getKey().toString().compareTo(y.getKey().toString()); @@ -155,7 +154,7 @@ public final class SItemManagerUtil { }); final StringBuilder builder = new StringBuilder(); for (final Entry itemEntry : sorted) { - builder.append("\n" + itemEntry.getValue() + " * " + itemEntry.getKey().toString()); + builder.append("\n").append(itemEntry.getValue()).append(" * ").append(itemEntry.getKey().toString()); } return builder.toString(); } diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraft.java b/forge-gui/src/main/java/forge/limited/BoosterDraft.java index ef22d7b8e76..f3f58037b5b 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraft.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraft.java @@ -158,7 +158,7 @@ public class BoosterDraft implements IBoosterDraft { if (myDrafts.isEmpty()) { SOptionPane.showMessageDialog("No custom draft files found."); } else { - Collections.sort(myDrafts, new Comparator() { + myDrafts.sort(new Comparator() { @Override public int compare(CustomLimited o1, CustomLimited o2) { return o1.getName().compareTo(o2.getName()); @@ -346,7 +346,7 @@ public class BoosterDraft implements IBoosterDraft { @Override public Deck[] getDecks() { - Deck decks[] = new Deck[7]; + Deck[] decks = new Deck[7]; for (int i = 1; i < N_PLAYERS; i++) { decks[i - 1] = ((LimitedPlayerAI) this.players.get(i)).buildDeck(); } diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java b/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java index 3ac539038de..86f83429d97 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java @@ -40,8 +40,8 @@ public class BoosterDraftAI { protected static final int N_DECKS = 7; // holds all the cards for each of the computer's decks - protected final List> decks = new ArrayList>(); - protected final List playerColors = new ArrayList(); + protected final List> decks = new ArrayList<>(); + protected final List playerColors = new ArrayList<>(); /** *

@@ -95,7 +95,7 @@ public class BoosterDraftAI { public BoosterDraftAI() { // Initialize deck array and playerColors list for (int i = 0; i < N_DECKS; i++) { - this.decks.add(new ArrayList()); + this.decks.add(new ArrayList<>()); this.playerColors.add(new DeckColors()); } } // BoosterDraftAI() diff --git a/forge-gui/src/main/java/forge/limited/CardRanker.java b/forge-gui/src/main/java/forge/limited/CardRanker.java index 295acb7c1e9..91f12774e2e 100644 --- a/forge-gui/src/main/java/forge/limited/CardRanker.java +++ b/forge-gui/src/main/java/forge/limited/CardRanker.java @@ -135,8 +135,7 @@ public class CardRanker { } private static List getCardsExceptOne(List cache, int i) { - List otherCards = new ArrayList<>(); - otherCards.addAll(cache.subList(0, i)); + List otherCards = new ArrayList<>(cache.subList(0, i)); if (i + 1 < cache.size()) { otherCards.addAll(cache.subList(i + 1, cache.size())); } @@ -171,7 +170,7 @@ public class CardRanker { } private static List sortAndCreateList(List> cardScores) { - Collections.sort(cardScores, Collections.reverseOrder(new CardRankingComparator())); + cardScores.sort(Collections.reverseOrder(new CardRankingComparator())); List rankedCards = new ArrayList<>(cardScores.size()); for (Pair pair : cardScores) { diff --git a/forge-gui/src/main/java/forge/limited/CardThemedConquestDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedConquestDeckBuilder.java index b618dd63c6b..b126ef47b27 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedConquestDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedConquestDeckBuilder.java @@ -44,7 +44,7 @@ public class CardThemedConquestDeckBuilder extends CardThemedDeckBuilder { } numSpellsNeeded = ((Double)Math.floor(targetSize*(getCreaturePercentage()+getSpellPercentage()))).intValue(); numCreaturesToStart = ((Double)Math.ceil(targetSize*(getCreaturePercentage()))).intValue(); - landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue();; + landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue(); if (logColorsToConsole) { System.out.println(keyCard.getName()); System.out.println("Pre Colors: " + colors.toEnumSet().toString()); diff --git a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java index 769e7a34801..a1521f88113 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java @@ -132,7 +132,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } numSpellsNeeded = ((Double)Math.floor(targetSize*(getCreaturePercentage()+getSpellPercentage()))).intValue(); numCreaturesToStart = ((Double)Math.ceil(targetSize*(getCreaturePercentage()))).intValue(); - landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue();; + landsNeeded = ((Double)Math.ceil(targetSize*(getLandPercentage()))).intValue(); if (logColorsToConsole) { System.out.println(keyCard.getName()); System.out.println("Pre Colors: " + colors.toEnumSet().toString()); @@ -948,7 +948,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { - final Map creatureCosts = new HashMap(); + final Map creatureCosts = new HashMap<>(); for (int i = 1; i < 7; i++) { creatureCosts.put(i, 0); } diff --git a/forge-gui/src/main/java/forge/limited/CustomLimited.java b/forge-gui/src/main/java/forge/limited/CustomLimited.java index dda54f28604..b87b0b8bfbc 100644 --- a/forge-gui/src/main/java/forge/limited/CustomLimited.java +++ b/forge-gui/src/main/java/forge/limited/CustomLimited.java @@ -98,7 +98,7 @@ public class CustomLimited extends DeckBase { public static CustomLimited parse(final List dfData, final IStorage cubes) { final FileSection data = FileSection.parse(dfData, ":"); - List> slots = new ArrayList>(); + List> slots = new ArrayList<>(); String boosterData = data.get("Booster"); if (StringUtils.isNotEmpty(boosterData)) { final String[] booster = TextUtil.splitWithParenthesis(boosterData, ','); diff --git a/forge-gui/src/main/java/forge/limited/GauntletMini.java b/forge-gui/src/main/java/forge/limited/GauntletMini.java index d58b865a479..2a953e318bc 100644 --- a/forge-gui/src/main/java/forge/limited/GauntletMini.java +++ b/forge-gui/src/main/java/forge/limited/GauntletMini.java @@ -47,7 +47,7 @@ public class GauntletMini { private int losses; private boolean gauntletDraft; // Means: Draft game is in Gauntlet-mode, not a single match private GameType gauntletType; - private final List aiOpponents = new ArrayList(); + private final List aiOpponents = new ArrayList<>(); public GauntletMini() { currentRound = 1; @@ -135,7 +135,7 @@ public class GauntletMini { * Starts the tournament. */ private void startRound() { - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); final RegisteredPlayer human = new RegisteredPlayer(humanDeck).setPlayer(GamePlayerUtil.getGuiPlayer()); starter.add(human); starter.add(aiOpponents.get(currentRound - 1).setPlayer(GamePlayerUtil.createAiPlayer())); diff --git a/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java index 28c653301de..7f89655fb03 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java @@ -56,8 +56,8 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { protected Predicate hasColor; protected final List availableList; protected final List aiPlayables; - protected final List deckList = new ArrayList(); - protected final List setsWithBasicLands = new ArrayList(); + protected final List deckList = new ArrayList<>(); + protected final List setsWithBasicLands = new ArrayList<>(); protected List rankedColorList; protected final List draftedConspiracies; @@ -324,7 +324,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { * Find the sets that have basic lands for the available cards. */ private void findBasicLandSets() { - final Set sets = new HashSet(); + final Set sets = new HashSet<>(); for (final PaperCard cp : aiPlayables) { final CardEdition ee = FModel.getMagicDb().getEditions().get(cp.getEdition()); if( !sets.contains(cp.getEdition()) && CardEdition.Predicates.hasBasicLands.apply(ee)) { @@ -348,7 +348,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { private void addLands(final int[] clrCnts, final String landSetCode) { // basic lands that are available in the deck final Iterable basicLands = Iterables.filter(aiPlayables, Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard.FN_GET_RULES)); - final Set snowLands = new HashSet(); + final Set snowLands = new HashSet<>(); // total of all ClrCnts int totalColor = 0; @@ -598,7 +598,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { final PaperCard card = it.next(); final CardAiHints ai = card.getRules().getAiHints(); if (ai.getRemRandomDecks()) { - final List comboCards = new ArrayList(); + final List comboCards = new ArrayList<>(); if (ai.getDeckNeeds() != null && ai.getDeckNeeds().isValid()) { final DeckHints needs = ai.getDeckNeeds(); comboCards.addAll(needs.filter(deckList)); @@ -676,7 +676,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { * number to add */ private void addManaCurveCreatures(final Iterable creatures, int num) { - final Map creatureCosts = new HashMap(); + final Map creatureCosts = new HashMap<>(); for (int i = 1; i < 7; i++) { creatureCosts.put(i, 0); } diff --git a/forge-gui/src/main/java/forge/limited/LimitedPoolType.java b/forge-gui/src/main/java/forge/limited/LimitedPoolType.java index 2f52015e1e8..7ce7fbd8828 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedPoolType.java +++ b/forge-gui/src/main/java/forge/limited/LimitedPoolType.java @@ -8,7 +8,7 @@ public enum LimitedPoolType { Chaos("Chaos Draft"); private final String displayName; - private LimitedPoolType(String name) { + LimitedPoolType(String name) { displayName = name; } diff --git a/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java b/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java index d8556fb2aaa..81b117adb39 100644 --- a/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java +++ b/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java @@ -25,12 +25,12 @@ public class ReadDraftRankings { *

*/ public ReadDraftRankings() { - this.setSizes = new HashMap(); + this.setSizes = new HashMap<>(); this.draftRankings = this.readFile(FileUtil.readFile(ForgeConstants.DRAFT_RANKINGS_FILE)); } // setup() public ReadDraftRankings(String customFile) { - this.setSizes = new HashMap(); + this.setSizes = new HashMap<>(); this.draftRankings = this.readFile(FileUtil.readFile(ForgeConstants.DRAFT_DIR + customFile)); } @@ -45,7 +45,7 @@ public class ReadDraftRankings { */ private Map> readFile(List lines) { - final Map> map = new HashMap>(); + final Map> map = new HashMap<>(); for (String line : lines) { // stop reading if end of file or blank line is read if (line == null || line.length() == 0) { @@ -64,7 +64,7 @@ public class ReadDraftRankings { try { final int rank = Integer.parseInt(rankStr); if (!map.containsKey(edition)) { - map.put(edition, new HashMap()); + map.put(edition, new HashMap<>()); } map.get(edition).put(name, rank); if (setSizes.containsKey(edition)) { diff --git a/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java b/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java index d975ea30ce3..89323950028 100644 --- a/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java +++ b/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java @@ -60,7 +60,7 @@ import java.util.Stack; public class SealedCardPoolGenerator { public static final String FILE_EXT = ".sealed"; - private final List product = new ArrayList(); + private final List product = new ArrayList<>(); /** The Land set code. */ private String landSetCode = null; @@ -168,7 +168,7 @@ public class SealedCardPoolGenerator { case Block: case FantasyBlock: - List blocks = new ArrayList(); + List blocks = new ArrayList<>(); Iterable src = poolType == LimitedPoolType.Block ? FModel.getBlocks() : FModel.getFantasyBlocks(); for (CardBlock b : src) { blocks.add(b); @@ -178,7 +178,7 @@ public class SealedCardPoolGenerator { if (block == null) { return; } final int nPacks = block.getCntBoostersSealed(); - final Stack sets = new Stack(); + final Stack sets = new Stack<>(); for (CardEdition edition : block.getSets()) { sets.add(edition.getCode()); @@ -218,7 +218,7 @@ public class SealedCardPoolGenerator { case Custom: String[] dList; - final List customs = new ArrayList(); + final List customs = new ArrayList<>(); // get list of custom draft files final File dFolder = new File(ForgeConstants.SEALED_DIR); @@ -283,7 +283,7 @@ public class SealedCardPoolGenerator { private static List getSetCombos(final List setz, final int nPacks) { // TODO These permutations really should be completely generated String[] sets = setz.toArray(ArrayUtils.EMPTY_STRING_ARRAY); - List setCombos = new ArrayList(); + List setCombos = new ArrayList<>(); if (nPacks == 3) { if (sets.length >= 2) { diff --git a/forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java index 4a87f4ed6ab..6cde57b09b4 100644 --- a/forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java @@ -30,7 +30,7 @@ public class SealedDeckBuilder extends LimitedDeckBuilder { */ private ColorSet chooseColors() { // choose colors based on top 33% of cards - final List colorChooserList = new ArrayList(); + final List colorChooserList = new ArrayList<>(); // this is not exactly right, because the rankings here are taking into account deckhints // for the whole set of cards, when some of those cards could be in colors that won't // make it into the deck @@ -54,8 +54,8 @@ public class SealedDeckBuilder extends LimitedDeckBuilder { int[] countsCopy = Arrays.copyOf(colorCounts, 5); Arrays.sort(countsCopy); - List maxColors = new ArrayList(); - List secondColors = new ArrayList(); + List maxColors = new ArrayList<>(); + List secondColors = new ArrayList<>(); for (int i = 0; i < 5; i++) { if (countsCopy[4] == colorCounts[i]) { maxColors.add(MagicColor.Constant.ONLY_COLORS.get(i)); diff --git a/forge-gui/src/main/java/forge/limited/WinstonDraft.java b/forge-gui/src/main/java/forge/limited/WinstonDraft.java index bb12c63d5b1..ff75cc5a827 100644 --- a/forge-gui/src/main/java/forge/limited/WinstonDraft.java +++ b/forge-gui/src/main/java/forge/limited/WinstonDraft.java @@ -38,7 +38,7 @@ public class WinstonDraft extends BoosterDraft { } private void initializeWinstonDraft() { - this.deck = new Stack(); + this.deck = new Stack<>(); for (int i = 0; i < this.product.size(); i++) { final Supplier> supply = this.product.get(i); for(int j = 0; j < NUM_PLAYERS; j++) { @@ -53,7 +53,7 @@ public class WinstonDraft extends BoosterDraft { // Create three Winston piles, adding the top card from the Winston deck to start each pile this.piles = new ArrayList<>(); for(int i = 0; i < NUM_PILES; i++) { - final List pile = new ArrayList(); + final List pile = new ArrayList<>(); pile.add(this.deck.pop()); this.piles.add(pile); } diff --git a/forge-gui/src/main/java/forge/limited/WinstonDraftAI.java b/forge-gui/src/main/java/forge/limited/WinstonDraftAI.java index 92cc5ebe276..edc6b7b2a87 100644 --- a/forge-gui/src/main/java/forge/limited/WinstonDraftAI.java +++ b/forge-gui/src/main/java/forge/limited/WinstonDraftAI.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import forge.deck.CardPool; -import forge.item.PaperCard; import forge.util.MyRandom; public class WinstonDraftAI extends BoosterDraftAI{ @@ -25,7 +24,7 @@ public class WinstonDraftAI extends BoosterDraftAI{ this.decks.clear(); this.playerColors.clear(); for (int i = 0; i < N_DECKS; i++) { - this.decks.add(new ArrayList()); + this.decks.add(new ArrayList<>()); this.playerColors.add(new DeckColors()); } } diff --git a/forge-gui/src/main/java/forge/match/GameLobby.java b/forge-gui/src/main/java/forge/match/GameLobby.java index 9951217dcb3..6f9bfd78659 100644 --- a/forge-gui/src/main/java/forge/match/GameLobby.java +++ b/forge-gui/src/main/java/forge/match/GameLobby.java @@ -158,7 +158,7 @@ public abstract class GameLobby implements IHasGameType { public void addSlot() { final int newIndex = getNumberOfSlots(); final LobbySlotType type = allowNetworking ? LobbySlotType.OPEN : LobbySlotType.AI; - addSlot(new LobbySlot(type, null, newIndex, newIndex, false, !allowNetworking, Collections.emptySet())); + addSlot(new LobbySlot(type, null, newIndex, newIndex, false, !allowNetworking, Collections.emptySet())); } protected final void addSlot(final LobbySlot slot) { if (slot == null) { @@ -407,7 +407,7 @@ public abstract class GameLobby implements IHasGameType { } } - final List players = new ArrayList(); + final List players = new ArrayList<>(); final Map guis = Maps.newHashMap(); final Map playerToSlot = Maps.newHashMap(); boolean hasNameBeenSet = false; @@ -485,7 +485,7 @@ public abstract class GameLobby implements IHasGameType { return null; } } - schemes = schemePool == null ? Collections.emptyList() : schemePool.toFlatList(); + schemes = schemePool == null ? Collections.emptyList() : schemePool.toFlatList(); } //Planechase @@ -498,7 +498,7 @@ public abstract class GameLobby implements IHasGameType { return null; } } - planes = planePool == null ? Collections.emptyList() : planePool.toFlatList(); + planes = planePool == null ? Collections.emptyList() : planePool.toFlatList(); } //Vanguard diff --git a/forge-gui/src/main/java/forge/match/HostedMatch.java b/forge-gui/src/main/java/forge/match/HostedMatch.java index 7535a28d20f..fa57ea0a654 100644 --- a/forge-gui/src/main/java/forge/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/match/HostedMatch.java @@ -1,7 +1,6 @@ package forge.match; import java.util.Collection; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -98,7 +97,7 @@ public class HostedMatch { throw new IllegalArgumentException(); } - this.guis = guis == null ? ImmutableMap.of() : guis; + this.guis = guis == null ? ImmutableMap.of() : guis; final boolean useRandomFoil = FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL); for (final RegisteredPlayer rp : players) { rp.setRandomFoil(useRandomFoil); @@ -109,8 +108,9 @@ public class HostedMatch { } final List sortedPlayers = Lists.newArrayList(players); - Collections.sort(sortedPlayers, new Comparator() { - @Override public final int compare(final RegisteredPlayer p1, final RegisteredPlayer p2) { + sortedPlayers.sort(new Comparator() { + @Override + public final int compare(final RegisteredPlayer p1, final RegisteredPlayer p2) { final int v1 = p1.getPlayer() instanceof LobbyPlayerHuman ? 0 : 1; final int v2 = p2.getPlayer() instanceof LobbyPlayerHuman ? 0 : 1; return Integer.compare(v1, v2); @@ -160,7 +160,7 @@ public class HostedMatch { final GameView gameView = getGameView(); humanCount = 0; - final MapOfLists playersPerGui = new HashMapOfLists(CollectionSuppliers.arrayLists()); + final MapOfLists playersPerGui = new HashMapOfLists<>(CollectionSuppliers.arrayLists()); for (int iPlayer = 0; iPlayer < players.size(); iPlayer++) { final RegisteredPlayer rp = match.getPlayers().get(iPlayer); final Player p = players.get(iPlayer); @@ -197,11 +197,12 @@ public class HostedMatch { } for (final Entry> e : playersPerGui.entrySet()) { - e.getKey().openView(new TrackableCollection(e.getValue())); + e.getKey().openView(new TrackableCollection<>(e.getValue())); } if (humanCount == 0) { //watch game but do not participate final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); + gui.setGameView(null); //clear the view so when the game restarts again, it updates correctly gui.setGameView(gameView); final PlayerControllerHuman humanController = new WatchLocalGame(game, new LobbyPlayerHuman("Spectator"), gui); diff --git a/forge-gui/src/main/java/forge/match/LobbySlot.java b/forge-gui/src/main/java/forge/match/LobbySlot.java index 9deb226fe04..bd33cff83e9 100644 --- a/forge-gui/src/main/java/forge/match/LobbySlot.java +++ b/forge-gui/src/main/java/forge/match/LobbySlot.java @@ -137,7 +137,7 @@ public final class LobbySlot implements Serializable { } public void setAiOptions(final Set aiOptions) { - this.aiOptions = aiOptions == null ? ImmutableSet.of() : ImmutableSet.copyOf(aiOptions); + this.aiOptions = aiOptions == null ? ImmutableSet.of() : ImmutableSet.copyOf(aiOptions); } } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/match/LobbySlotType.java b/forge-gui/src/main/java/forge/match/LobbySlotType.java index 8e764b232b4..2c8e6bce624 100644 --- a/forge-gui/src/main/java/forge/match/LobbySlotType.java +++ b/forge-gui/src/main/java/forge/match/LobbySlotType.java @@ -4,5 +4,5 @@ public enum LobbySlotType { LOCAL, AI, OPEN, - REMOTE; + REMOTE } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/match/LocalLobby.java b/forge-gui/src/main/java/forge/match/LocalLobby.java index ca7b66724ad..f8fa6f7a8e7 100644 --- a/forge-gui/src/main/java/forge/match/LocalLobby.java +++ b/forge-gui/src/main/java/forge/match/LocalLobby.java @@ -3,7 +3,6 @@ package forge.match; import java.util.Collections; import forge.GuiBase; -import forge.ai.AIOption; import forge.interfaces.IGuiGame; public final class LocalLobby extends GameLobby { @@ -15,10 +14,10 @@ public final class LocalLobby extends GameLobby { final String humanName = localName(); final int[] avatarIndices = localAvatarIndices(); - final LobbySlot slot0 = new LobbySlot(LobbySlotType.LOCAL, humanName, avatarIndices[0], 0, true, true, Collections.emptySet()); + final LobbySlot slot0 = new LobbySlot(LobbySlotType.LOCAL, humanName, avatarIndices[0], 0, true, true, Collections.emptySet()); addSlot(slot0); - final LobbySlot slot1 = new LobbySlot(LobbySlotType.AI, null, avatarIndices[1], 1, false, true, Collections.emptySet()); + final LobbySlot slot1 = new LobbySlot(LobbySlotType.AI, null, avatarIndices[1], 1, false, true, Collections.emptySet()); addSlot(slot1); } diff --git a/forge-gui/src/main/java/forge/match/NextGameDecision.java b/forge-gui/src/main/java/forge/match/NextGameDecision.java index 88e11189c41..52cf84d9b0d 100644 --- a/forge-gui/src/main/java/forge/match/NextGameDecision.java +++ b/forge-gui/src/main/java/forge/match/NextGameDecision.java @@ -3,5 +3,5 @@ package forge.match; public enum NextGameDecision { NEW, CONTINUE, - QUIT; + QUIT } diff --git a/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java b/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java index f413918e55e..24e2a6a1d19 100644 --- a/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java +++ b/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java @@ -63,11 +63,11 @@ public class InputConfirmMulligan extends InputSyncronizedBase { final StringBuilder sb = new StringBuilder(); if (startingPlayer == player) { - sb.append(player).append(", "+ localizer.getMessage("lblYouAreGoingFirst") +"\n\n"); + sb.append(player).append(", ").append(localizer.getMessage("lblYouAreGoingFirst")).append("\n\n"); } else { - sb.append(startingPlayer.getName()).append(" " + localizer.getMessage("lblIsGoingFirst") +".\n"); - sb.append(player).append(", "+ localizer.getMessage("lblYouAreGoing") + " ").append(Lang.getOrdinal(game.getPosition(player, startingPlayer))).append(".\n\n"); + sb.append(startingPlayer.getName()).append(" ").append(localizer.getMessage("lblIsGoingFirst")).append(".\n"); + sb.append(player).append(", ").append(localizer.getMessage("lblYouAreGoing")).append(" ").append(Lang.getOrdinal(game.getPosition(player, startingPlayer))).append(".\n\n"); } getController().getGui().updateButtons(getOwner(), localizer.getMessage("lblKeep"), localizer.getMessage("lblMulligan"), true, true, true); diff --git a/forge-gui/src/main/java/forge/match/input/InputLockUI.java b/forge-gui/src/main/java/forge/match/input/InputLockUI.java index 5b525ee7c69..657f77ec96f 100644 --- a/forge-gui/src/main/java/forge/match/input/InputLockUI.java +++ b/forge-gui/src/main/java/forge/match/input/InputLockUI.java @@ -55,7 +55,7 @@ public class InputLockUI implements Input { } FThreads.invokeInEdtLater(showMessageFromEdt); } - }; + } private final Runnable showMessageFromEdt = new Runnable() { @Override diff --git a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java index d793efba100..adff270db60 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java +++ b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java @@ -134,7 +134,7 @@ public class InputPassPriority extends InputSyncronizedBase { final SpellAbility ability = getController().getAbilityToPlay(card, abilities, triggerEvent); if (ability != null) { - chosenSa = new ArrayList(); + chosenSa = new ArrayList<>(); chosenSa.add(ability); if (otherCardsToSelect != null && ability.isManaAbility()) { //if mana ability activated, activate same ability on other cards to select if possible @@ -172,7 +172,7 @@ public class InputPassPriority extends InputSyncronizedBase { @Override public boolean selectAbility(final SpellAbility ab) { if (ab != null) { - chosenSa = new ArrayList(); + chosenSa = new ArrayList<>(); chosenSa.add(ab); stop(); return true; diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index 516fa477976..76573d288b3 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -43,7 +43,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { protected ManaCostBeingPaid manaCost; protected final SpellAbility saPaidFor; private final boolean wasFloatingMana; - private final Queue delaySelectCards = new LinkedList(); + private final Queue delaySelectCards = new LinkedList<>(); private boolean bPaid = false; protected Boolean canPayManaCost = null; @@ -141,7 +141,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { } public List getUsefulManaAbilities(Card card) { - List abilities = new ArrayList(); + List abilities = new ArrayList<>(); if (card.getController() != player) { return abilities; @@ -362,7 +362,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { final Card source = am.getHostCard(); final Player activator = am.getActivatingPlayer(); final Game g = source.getGame(); - final HashMap repParams = new HashMap(); + final HashMap repParams = new HashMap<>(); repParams.put("Event", "ProduceMana"); repParams.put("Mana", m.getOrigProduced()); repParams.put("Affected", source); diff --git a/forge-gui/src/main/java/forge/match/input/InputProxy.java b/forge-gui/src/main/java/forge/match/input/InputProxy.java index 15c9774310a..b503dc8ae74 100644 --- a/forge-gui/src/main/java/forge/match/input/InputProxy.java +++ b/forge-gui/src/main/java/forge/match/input/InputProxy.java @@ -43,7 +43,7 @@ import forge.util.ITriggerEvent; public class InputProxy implements Observer { /** The input. */ - private AtomicReference input = new AtomicReference(); + private AtomicReference input = new AtomicReference<>(); private final PlayerControllerHuman controller; // private static final boolean DEBUG_INPUT = true; // false; @@ -136,7 +136,7 @@ public class InputProxy implements Observer { final Card c = getCard(cv); if (c != null) { if (otherCardsToSelect == null) { - otherCardsToSelect = new ArrayList(); + otherCardsToSelect = new ArrayList<>(); } otherCardsToSelect.add(c); } diff --git a/forge-gui/src/main/java/forge/match/input/InputQueue.java b/forge-gui/src/main/java/forge/match/input/InputQueue.java index ad64c4126a7..2b745dcd1b1 100644 --- a/forge-gui/src/main/java/forge/match/input/InputQueue.java +++ b/forge-gui/src/main/java/forge/match/input/InputQueue.java @@ -33,7 +33,7 @@ import forge.player.PlayerControllerHuman; * @version $Id: InputQueue.java 24769 2014-02-09 13:56:04Z Hellfish $ */ public class InputQueue extends Observable { - private final BlockingDeque inputStack = new LinkedBlockingDeque(); + private final BlockingDeque inputStack = new LinkedBlockingDeque<>(); private final Game game; public InputQueue(final Game game, final InputProxy inputProxy) { diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java b/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java index cfbc2826b67..bfe0d22beb8 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java @@ -26,7 +26,7 @@ import forge.util.ITriggerEvent; public final class InputSelectCardsForConvokeOrImprovise extends InputSelectManyBase { private static final long serialVersionUID = -1779224307654698954L; - private final Map> chosenCards = new HashMap>(); + private final Map> chosenCards = new HashMap<>(); private final ManaCostBeingPaid remainingCost; private final Player player; private final CardCollectionView availableCards; @@ -115,7 +115,7 @@ public final class InputSelectCardsForConvokeOrImprovise extends InputSelectMany } public Map getConvokeMap() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); if(!hasCancelled()) { for(final Entry> c : chosenCards.entrySet()) { result.put(c.getKey(), c.getValue().right); diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index 374573b19f3..fc8b962b19c 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -23,7 +23,7 @@ public class InputSelectEntitiesFromList extends InputSele private static final long serialVersionUID = -6609493252672573139L; private final FCollectionView validChoices; - protected final FCollection selected = new FCollection(); + protected final FCollection selected = new FCollection<>(); protected Iterable zonesShown; // want to hide these zones when input done public InputSelectEntitiesFromList(final PlayerControllerHuman controller, final int min, final int max, final FCollectionView validChoices0) { @@ -36,7 +36,7 @@ public class InputSelectEntitiesFromList extends InputSele if (min > validChoices.size()) { // pfps does this really do anything useful?? System.out.println(String.format("Trying to choose at least %d things from a list with only %d things!", min, validChoices.size())); } - ArrayList vCards = new ArrayList(); + ArrayList vCards = new ArrayList<>(); for ( T c : validChoices0 ) { if ( c instanceof Card ) { vCards.add(((Card)c).getView()) ; diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java index 46cdd2f2f75..d67b78b4698 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java @@ -29,7 +29,7 @@ import forge.FThreads; public final class InputSelectTargets extends InputSyncronizedBase { private final List choices; // some cards can be targeted several times (eg: distribute damage as you choose) - private final Map targetDepth = new HashMap(); + private final Map targetDepth = new HashMap<>(); private final TargetRestrictions tgt; private final SpellAbility sa; private Card lastTarget = null; @@ -172,7 +172,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { // If all cards must have different controllers if (tgt.isDifferentControllers()) { - final List targetedControllers = new ArrayList(); + final List targetedControllers = new ArrayList<>(); for (final GameObject o : targetDepth.keySet()) { if (o instanceof Card) { final Player p = ((Card) o).getController(); diff --git a/forge-gui/src/main/java/forge/model/CardBlock.java b/forge-gui/src/main/java/forge/model/CardBlock.java index a3893102354..ec4f45cff3d 100644 --- a/forge-gui/src/main/java/forge/model/CardBlock.java +++ b/forge-gui/src/main/java/forge/model/CardBlock.java @@ -44,7 +44,7 @@ public final class CardBlock implements Comparable { private final int orderNum; private final String name; private final List sets; - private final Map metaSets = new TreeMap(); + private final Map metaSets = new TreeMap<>(); private final CardEdition landSet; private final int cntBoostersDraft; private final int cntBoostersSealed; @@ -139,7 +139,7 @@ public final class CardBlock implements Comparable { } private Predicate buildFilter() { - final List setCodes = new ArrayList(); + final List setCodes = new ArrayList<>(); for (final CardEdition set : this.sets) { setCodes.add(set.getCode()); } @@ -246,8 +246,8 @@ public final class CardBlock implements Comparable { int sealedBoosters = StringUtils.isNumeric(numbers[1]) ? Integer.parseInt(numbers[1]) : 0; CardEdition landSet = editions.getEditionByCodeOrThrow(numbers[2]); - List sets = new ArrayList(); - List metas = new ArrayList(); + List sets = new ArrayList<>(); + List metas = new ArrayList<>(); String[] setNames = TextUtil.splitWithParenthesis(sParts[2], ' ' ); for(final String set : setNames ) { diff --git a/forge-gui/src/main/java/forge/model/CardCollections.java b/forge-gui/src/main/java/forge/model/CardCollections.java index 9f1e16d5598..aea26ca713d 100644 --- a/forge-gui/src/main/java/forge/model/CardCollections.java +++ b/forge-gui/src/main/java/forge/model/CardCollections.java @@ -50,7 +50,7 @@ public class CardCollections { public final IStorage getConstructed() { if (constructed == null) { - constructed = new StorageImmediatelySerialized("Constructed decks", + constructed = new StorageImmediatelySerialized<>("Constructed decks", new DeckStorage(new File(ForgeConstants.DECK_CONSTRUCTED_DIR), ForgeConstants.DECK_BASE_DIR, true), true); } @@ -59,7 +59,7 @@ public class CardCollections { public final IStorage getDraft() { if (draft == null) { - draft = new StorageImmediatelySerialized("Draft deck sets", + draft = new StorageImmediatelySerialized<>("Draft deck sets", new DeckGroupSerializer(new File(ForgeConstants.DECK_DRAFT_DIR), ForgeConstants.DECK_BASE_DIR)); } return draft; @@ -67,7 +67,7 @@ public class CardCollections { public IStorage getSealed() { if (sealed == null) { - sealed = new StorageImmediatelySerialized("Sealed deck sets", + sealed = new StorageImmediatelySerialized<>("Sealed deck sets", new DeckGroupSerializer(new File(ForgeConstants.DECK_SEALED_DIR), ForgeConstants.DECK_BASE_DIR)); } return sealed; @@ -75,7 +75,7 @@ public class CardCollections { public final IStorage getWinston() { if (winston == null) { - winston = new StorageImmediatelySerialized("Winston draft deck sets", + winston = new StorageImmediatelySerialized<>("Winston draft deck sets", new DeckGroupSerializer(new File(ForgeConstants.DECK_WINSTON_DIR), ForgeConstants.DECK_BASE_DIR)); } return winston; @@ -83,7 +83,7 @@ public class CardCollections { public final IStorage getCubes() { if (cube == null) { - cube = new StorageImmediatelySerialized("Cubes", + cube = new StorageImmediatelySerialized<>("Cubes", new DeckStorage(new File(ForgeConstants.DECK_CUBE_DIR), ForgeConstants.RES_DIR)); } return cube; @@ -91,7 +91,7 @@ public class CardCollections { public IStorage getScheme() { if (scheme == null) { - scheme = new StorageImmediatelySerialized("Archenemy decks", + scheme = new StorageImmediatelySerialized<>("Archenemy decks", new DeckStorage(new File(ForgeConstants.DECK_SCHEME_DIR), ForgeConstants.DECK_BASE_DIR)); } return scheme; @@ -99,7 +99,7 @@ public class CardCollections { public IStorage getPlane() { if (plane == null) { - plane = new StorageImmediatelySerialized("Planechase decks", + plane = new StorageImmediatelySerialized<>("Planechase decks", new DeckStorage(new File(ForgeConstants.DECK_PLANE_DIR), ForgeConstants.DECK_BASE_DIR)); } return plane; @@ -107,7 +107,7 @@ public class CardCollections { public IStorage getCommander() { if (commander == null) { - commander = new StorageImmediatelySerialized("Commander decks", + commander = new StorageImmediatelySerialized<>("Commander decks", new DeckStorage(new File(ForgeConstants.DECK_COMMANDER_DIR), ForgeConstants.DECK_BASE_DIR)); } return commander; @@ -115,7 +115,7 @@ public class CardCollections { public IStorage getOathbreaker() { if (oathbreaker == null) { - oathbreaker = new StorageImmediatelySerialized("Oathbreaker decks", + oathbreaker = new StorageImmediatelySerialized<>("Oathbreaker decks", new DeckStorage(new File(ForgeConstants.DECK_OATHBREAKER_DIR), ForgeConstants.DECK_BASE_DIR)); } return oathbreaker; @@ -123,7 +123,7 @@ public class CardCollections { public IStorage getTinyLeaders() { if (tinyLeaders == null) { - tinyLeaders = new StorageImmediatelySerialized("Tiny Leaders decks", + tinyLeaders = new StorageImmediatelySerialized<>("Tiny Leaders decks", new DeckStorage(new File(ForgeConstants.DECK_TINY_LEADERS_DIR), ForgeConstants.DECK_BASE_DIR)); } return tinyLeaders; @@ -131,7 +131,7 @@ public class CardCollections { public IStorage getBrawl() { if (brawl == null) { - brawl = new StorageImmediatelySerialized("Brawl decks", + brawl = new StorageImmediatelySerialized<>("Brawl decks", new DeckStorage(new File(ForgeConstants.DECK_BRAWL_DIR), ForgeConstants.DECK_BASE_DIR)); } return brawl; diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index edbe8779551..2e2f04ba571 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -276,7 +276,7 @@ public final class FModel { } else if (s.length() > 1) { if (tList != null) { if (s.contains(":")) { - String k[] = s.split(":"); + String[] k = s.split(":"); tList.add(k[0]); CardType.Constant.pluralTypes.put(k[0], k[1]); } else { diff --git a/forge-gui/src/main/java/forge/model/MetaSet.java b/forge-gui/src/main/java/forge/model/MetaSet.java index 9da30c7dbf7..ee881f7e512 100644 --- a/forge-gui/src/main/java/forge/model/MetaSet.java +++ b/forge-gui/src/main/java/forge/model/MetaSet.java @@ -108,7 +108,7 @@ public class MetaSet { private final String shortHand; public final String descriptiveName; - private MetaSetType(String shortname, String descName) { + MetaSetType(String shortname, String descName) { shortHand = shortname; descriptiveName = descName; } diff --git a/forge-gui/src/main/java/forge/model/UnOpenedMeta.java b/forge-gui/src/main/java/forge/model/UnOpenedMeta.java index 0a819c54d26..b704188dc4a 100644 --- a/forge-gui/src/main/java/forge/model/UnOpenedMeta.java +++ b/forge-gui/src/main/java/forge/model/UnOpenedMeta.java @@ -54,7 +54,7 @@ public class UnOpenedMeta implements IUnOpenedProduct { * the GuiBase.getInterface(). */ private UnOpenedMeta(final String creationString, final JoinOperation op) { - metaSets = new ArrayList(); + metaSets = new ArrayList<>(); operation = op; for (String m : TextUtil.splitWithParenthesis(creationString, ';')) { @@ -107,7 +107,7 @@ public class UnOpenedMeta implements IUnOpenedProduct { return newBooster.get(); case SelectAll: - List allCards = new ArrayList(); + List allCards = new ArrayList<>(); for (MetaSet ms : metaSets) { allCards.addAll(ms.getBooster().get()); } diff --git a/forge-gui/src/main/java/forge/net/OfflineLobby.java b/forge-gui/src/main/java/forge/net/OfflineLobby.java index 18827184027..e8827558e1a 100644 --- a/forge-gui/src/main/java/forge/net/OfflineLobby.java +++ b/forge-gui/src/main/java/forge/net/OfflineLobby.java @@ -2,7 +2,6 @@ package forge.net; import java.util.Collections; -import forge.ai.AIOption; import forge.interfaces.IGuiGame; import forge.match.GameLobby; import forge.match.LobbySlot; @@ -16,10 +15,10 @@ public final class OfflineLobby extends GameLobby { final String humanName = localName(); final int[] avatarIndices = localAvatarIndices(); - final LobbySlot slot0 = new LobbySlot(LobbySlotType.LOCAL, humanName, avatarIndices[0], 0, true, false, Collections.emptySet()); + final LobbySlot slot0 = new LobbySlot(LobbySlotType.LOCAL, humanName, avatarIndices[0], 0, true, false, Collections.emptySet()); addSlot(slot0); - final LobbySlot slot1 = new LobbySlot(LobbySlotType.OPEN, null, -1, -1, false, false, Collections.emptySet()); + final LobbySlot slot1 = new LobbySlot(LobbySlotType.OPEN, null, -1, -1, false, false, Collections.emptySet()); addSlot(slot1); } diff --git a/forge-gui/src/main/java/forge/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/net/ProtocolMethod.java index b75acdce1cf..e220668832f 100644 --- a/forge-gui/src/main/java/forge/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/net/ProtocolMethod.java @@ -101,23 +101,23 @@ public enum ProtocolMethod { CLIENT(IGameController.class); private final Class toInvoke; - private Mode(final Class toInvoke) { + Mode(final Class toInvoke) { this.toInvoke = toInvoke; } - }; + } private final ProtocolMethod.Mode mode; private final Class returnType; private final Class[] args; - private ProtocolMethod(final ProtocolMethod.Mode mode) { + ProtocolMethod(final ProtocolMethod.Mode mode) { this(mode, Void.TYPE); } - private ProtocolMethod(final ProtocolMethod.Mode mode, final Class returnType) { + ProtocolMethod(final ProtocolMethod.Mode mode, final Class returnType) { this(mode, returnType, (Class[]) null); } @SafeVarargs - private ProtocolMethod(final ProtocolMethod.Mode mode, final Class returnType, final Class ... args) { + ProtocolMethod(final ProtocolMethod.Mode mode, final Class returnType, final Class... args) { this.mode = mode; this.returnType = returnType; this.args = args == null ? new Class[] {} : args; diff --git a/forge-gui/src/main/java/forge/net/client/GameClientHandler.java b/forge-gui/src/main/java/forge/net/client/GameClientHandler.java index 93f11d7be96..60eebcaabfc 100644 --- a/forge-gui/src/main/java/forge/net/client/GameClientHandler.java +++ b/forge-gui/src/main/java/forge/net/client/GameClientHandler.java @@ -206,7 +206,7 @@ final class GameClientHandler extends GameProtocolHandler { } final List sortedPlayers = Lists.newArrayList(players); - Collections.sort(sortedPlayers, new Comparator() { + sortedPlayers.sort(new Comparator() { @Override public final int compare(final RegisteredPlayer p1, final RegisteredPlayer p2) { final int v1 = p1.getPlayer() instanceof LobbyPlayerHuman ? 0 : 1; @@ -231,7 +231,7 @@ final class GameClientHandler extends GameProtocolHandler { if (trackableObject.getTracker() == null) { trackableObject.setTracker(this.tracker); // walk the props - EnumMap props = (EnumMap) trackableObject.getProps(); + EnumMap props = trackableObject.getProps(); if (!(props == null)) { for (Object propObj : props.values()) { updateTrackers(new Object[]{propObj}); diff --git a/forge-gui/src/main/java/forge/net/server/FServerManager.java b/forge-gui/src/main/java/forge/net/server/FServerManager.java index 826dd0ea895..4a17201fd69 100644 --- a/forge-gui/src/main/java/forge/net/server/FServerManager.java +++ b/forge-gui/src/main/java/forge/net/server/FServerManager.java @@ -223,7 +223,7 @@ public final class FServerManager { NetworkInterface n = NetworkInterface.getByInetAddress(s.getLocalAddress()); Enumeration en = n.getInetAddresses(); while (en.hasMoreElements()) { - InetAddress addr = (InetAddress) en.nextElement(); + InetAddress addr = en.nextElement(); if (addr instanceof Inet4Address) { if (preferIPv6) { continue; diff --git a/forge-gui/src/main/java/forge/net/server/ServerGameLobby.java b/forge-gui/src/main/java/forge/net/server/ServerGameLobby.java index 84c489c40c5..9fd87b8b132 100644 --- a/forge-gui/src/main/java/forge/net/server/ServerGameLobby.java +++ b/forge-gui/src/main/java/forge/net/server/ServerGameLobby.java @@ -4,7 +4,6 @@ import java.util.Collections; import org.apache.commons.lang3.StringUtils; -import forge.ai.AIOption; import forge.interfaces.IGuiGame; import forge.match.GameLobby; import forge.match.LobbySlot; @@ -14,8 +13,8 @@ public final class ServerGameLobby extends GameLobby { public ServerGameLobby() { super(true); - addSlot(new LobbySlot(LobbySlotType.LOCAL, localName(), localAvatarIndices()[0], 0, true, false, Collections.emptySet())); - addSlot(new LobbySlot(LobbySlotType.OPEN, null, -1, 1, false, false, Collections.emptySet())); + addSlot(new LobbySlot(LobbySlotType.LOCAL, localName(), localAvatarIndices()[0], 0, true, false, Collections.emptySet())); + addSlot(new LobbySlot(LobbySlotType.OPEN, null, -1, 1, false, false, Collections.emptySet())); } public int connectPlayer(final String name, final int avatarIndex) { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestAwardPool.java b/forge-gui/src/main/java/forge/planarconquest/ConquestAwardPool.java index c6584392c97..077981baee7 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestAwardPool.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestAwardPool.java @@ -8,10 +8,10 @@ public class ConquestAwardPool { public final List commons, uncommons, rares, mythics; public ConquestAwardPool(Iterable cards) { - commons = new ArrayList(); - uncommons = new ArrayList(); - rares = new ArrayList(); - mythics = new ArrayList(); + commons = new ArrayList<>(); + uncommons = new ArrayList<>(); + rares = new ArrayList<>(); + mythics = new ArrayList<>(); for (PaperCard c : cards) { switch (c.getRarity()) { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java b/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java index 74048caf5b2..6bff8b41e60 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java @@ -29,10 +29,7 @@ public class ConquestCommander implements InventoryItem, IXmlWritable { @Override public boolean apply(PaperCard pc) { CardRules rules = pc.getRules(); - if (rules.canBeCommander() || rules.getType().isPlaneswalker()) { - return false; //prevent including additional commanders or planeswalkers in starting deck - } - return true; + return !rules.canBeCommander() && !rules.getType().isPlaneswalker(); //prevent including additional commanders or planeswalkers in starting deck } })), false), null); } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java index c0ce7625964..41dba7860ac 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java @@ -73,7 +73,7 @@ public class ConquestController { File decksDir = new File(model.getDirectory(), "decks"); FileUtil.ensureDirectoryExists(decksDir); DeckStorage storage = new DeckStorage(decksDir, ForgeConstants.CONQUEST_SAVE_DIR); - decks = new StorageImmediatelySerialized(model.getName() + " decks", storage); + decks = new StorageImmediatelySerialized<>(model.getName() + " decks", storage); } public IStorage getDecks() { @@ -121,7 +121,7 @@ public class ConquestController { aiPlayerName += " (AI)"; //ensure player names are distinct } - final List starter = new ArrayList(); + final List starter = new ArrayList<>(); humanPlayer = new LobbyPlayerHuman(humanPlayerName); humanPlayer.setAvatarCardImageKey(commander.getCard().getImageKey(false)); starter.add(humanStart.setPlayer(humanPlayer)); @@ -151,9 +151,9 @@ public class ConquestController { private List generatePlanarPool() { String planeName = model.getCurrentPlane().getName(); - List pool = new ArrayList(); - List otherPlanes = new ArrayList(); - List phenomenons = new ArrayList(); + List pool = new ArrayList<>(); + List otherPlanes = new ArrayList<>(); + List phenomenons = new ArrayList<>(); for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { CardType type = c.getRules().getType(); @@ -196,7 +196,7 @@ public class ConquestController { public List awardBooster(ConquestAwardPool pool) { ConquestPreferences prefs = FModel.getConquestPreferences(); - List rewards = new ArrayList(); + List rewards = new ArrayList<>(); int boostersPerMythic = prefs.getPrefInt(CQPref.BOOSTERS_PER_MYTHIC); int raresPerBooster = prefs.getPrefInt(CQPref.BOOSTER_RARES); for (int i = 0; i < raresPerBooster; i++) { @@ -220,7 +220,7 @@ public class ConquestController { //also build list of all rewards including replacement shards for each duplicate card //build this list in reverse order so commons appear first int shards = 0; - final List allRewards = new ArrayList(); + final List allRewards = new ArrayList<>(); for (int i = rewards.size() - 1; i >= 0; i--) { int replacementShards = 0; PaperCard card = rewards.get(i); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java index 3ce5ee53c50..f1fd227ecc9 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java @@ -51,11 +51,11 @@ public final class ConquestData { private int planeswalkEmblems; private final ConquestRecord chaosBattleRecord; - private final Map planeDataMap = new HashMap(); - private final HashSet unlockedCards = new HashSet(); - private final List commanders = new ArrayList(); - private final HashSet newCards = new HashSet(); - private final HashSet exiledCards = new HashSet(); + private final Map planeDataMap = new HashMap<>(); + private final HashSet unlockedCards = new HashSet<>(); + private final List commanders = new ArrayList<>(); + private final HashSet newCards = new HashSet<>(); + private final HashSet exiledCards = new HashSet<>(); public ConquestData(String name0, ConquestPlane startingPlane0, PaperCard startingPlaneswalker0, PaperCard startingCommander0) { name = name0; @@ -153,7 +153,7 @@ public final class ConquestData { } public Iterable getSortedPlaneswalkers() { - List planeswalkers = new ArrayList(); + List planeswalkers = new ArrayList<>(); for (PaperCard card : unlockedCards) { if (card.getRules().getType().isPlaneswalker() && !isInExile(card)) { planeswalkers.add(card); @@ -270,14 +270,14 @@ public final class ConquestData { List commandersBeingExiled = null; - String message = "Exile the following " + cardStr + " to receive {AE}" + value + "?\n"; + StringBuilder message = new StringBuilder("Exile the following " + cardStr + " to receive {AE}" + value + "?\n"); for (PaperCard card : cards) { if (planeswalker == card) { SOptionPane.showMessageDialog("Current planeswalker cannot be exiled.", title, SOptionPane.INFORMATION_ICON); return false; } - String commandersUsingCard = ""; + StringBuilder commandersUsingCard = new StringBuilder(); for (ConquestCommander commander : commanders) { if (commander.getCard() == card) { if (!commander.getDeck().getMain().isEmpty()) { @@ -285,24 +285,24 @@ public final class ConquestData { return false; } if (commandersBeingExiled == null) { - commandersBeingExiled = new ArrayList(); + commandersBeingExiled = new ArrayList<>(); } commandersBeingExiled.add(commander); //cache commander to make it easier to remove later } if (commander.getDeck().getMain().contains(card)) { - commandersUsingCard += "\n" + commander.getName(); + commandersUsingCard.append("\n").append(commander.getName()); } } - if (!commandersUsingCard.isEmpty()) { + if (commandersUsingCard.length() > 0) { SOptionPane.showMessageDialog(card.getName() + " is in use by the following commanders and cannot be exiled:\n" + commandersUsingCard, title, SOptionPane.INFORMATION_ICON); return false; } - message += "\n" + card.getName(); + message.append("\n").append(card.getName()); } - if (SOptionPane.showConfirmDialog(message, title, "OK", "Cancel")) { + if (SOptionPane.showConfirmDialog(message.toString(), title, "OK", "Cancel")) { if (exiledCards.addAll(cards)) { if (commandersBeingExiled != null) { commanders.removeAll(commandersBeingExiled); @@ -326,11 +326,11 @@ public final class ConquestData { return false; } - String message = "Spend {AE}" + cost + " to retrieve the following " + cardStr + " from exile?\n"; + StringBuilder message = new StringBuilder("Spend {AE}" + cost + " to retrieve the following " + cardStr + " from exile?\n"); for (PaperCard card : cards) { - message += "\n" + card.getName(); + message.append("\n").append(card.getName()); } - if (SOptionPane.showConfirmDialog(message, title, "OK", "Cancel")) { + if (SOptionPane.showConfirmDialog(message.toString(), title, "OK", "Cancel")) { if (exiledCards.removeAll(cards)) { for (PaperCard card : cards) { if (card.getRules().canBeCommander()) { //add back commander for card if needed @@ -537,7 +537,7 @@ public final class ConquestData { }; public static Map getColOverrides(ItemManagerConfig config) { - Map colOverrides = new HashMap(); + Map colOverrides = new HashMap<>(); ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, fnNewCompare, fnNewGet); return colOverrides; } @@ -548,8 +548,8 @@ public final class ConquestData { } private class PathFinder { - private final HashSet closedSet = new HashSet(); - private final HashSet openSet = new HashSet(); + private final HashSet closedSet = new HashSet<>(); + private final HashSet openSet = new HashSet<>(); private final Node[][] map; private PathFinder() { @@ -585,7 +585,7 @@ public final class ConquestData { //if we've reach goal, reconstruct path and return it if (current == goal) { - List path = new ArrayList(); + List path = new ArrayList<>(); while (current != null) { path.add(current.loc); current = current.came_from; diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java b/forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java index c85a7cd9edd..a73053cf441 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestLocation.java @@ -78,7 +78,7 @@ public class ConquestLocation implements IXmlWritable { public static List getNeighbors(ConquestPlane plane0, int regionIndex0, int row0, int col0) { int regionCount = plane0.getRegions().size(); - List locations = new ArrayList(); + List locations = new ArrayList<>(); //add location above if (row0 < plane0.getRowsPerRegion() - 1) { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java index 0e67a770e08..4415fec32fc 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java @@ -136,7 +136,7 @@ public class ConquestPlane { public FCollectionView getPlaneCards() { if (planeCards == null) { - planeCards = new FCollection(); + planeCards = new FCollection<>(); CardDb variantCards = FModel.getMagicDb().getVariantCards(); List planeCardNames = FileUtil.readFile(directory + "plane_cards.txt"); @@ -160,7 +160,7 @@ public class ConquestPlane { if (regions != null) { return; } //load regions - regions = new FCollection(new ConquestRegion.Reader(this)); + regions = new FCollection<>(new ConquestRegion.Reader(this)); //load events int eventIndex = 0; @@ -168,7 +168,7 @@ public class ConquestPlane { int regionEndIndex = eventsPerRegion; events = new ConquestEvent[regions.size() * eventsPerRegion]; for (ConquestRegion region : regions) { - FCollection regionEvents = new FCollection(new ConquestEvent.Reader(region)); + FCollection regionEvents = new FCollection<>(new ConquestEvent.Reader(region)); for (ConquestEvent event : regionEvents) { events[eventIndex++] = event; if (eventIndex == regionEndIndex) { @@ -184,11 +184,11 @@ public class ConquestPlane { //load card pool cardPool = new DeckGenPool(); - commanders = new FCollection(); + commanders = new FCollection<>(); CardDb commonCards = FModel.getMagicDb().getCommonCards(); List bannedCards = FileUtil.readFile(directory + "banned_cards.txt"); - Set bannedCardSet = bannedCards.isEmpty() ? null : new HashSet(bannedCards); + Set bannedCardSet = bannedCards.isEmpty() ? null : new HashSet<>(bannedCards); List setCodes = FileUtil.readFile(directory + "sets.txt"); for (String setCode : setCodes) { @@ -292,7 +292,7 @@ public class ConquestPlane { } public static Set getAllPlanesOfCard(PaperCard card) { - Set planes = new HashSet(); + Set planes = new HashSet<>(); for (ConquestPlane plane : FModel.getPlanes()) { if (plane.cardPool.contains(card)) { planes.add(plane); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java index 8e7bec55fe3..e5878551219 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java @@ -27,7 +27,7 @@ public class ConquestPreferences extends PreferencesStore getCommanders() { - FCollection commanders = new FCollection(); + FCollection commanders = new FCollection<>(); for (PaperCard commander : plane.getCommanders()) { if (cardPool.contains(commander)) { commanders.add(commander); @@ -172,7 +172,7 @@ public class ConquestRegion { } public static Set getAllRegionsOfCard(PaperCard card) { - Set regions = new HashSet(); + Set regions = new HashSet<>(); for (ConquestPlane plane : FModel.getPlanes()) { if (plane.getCardPool().contains(card)) { for (ConquestRegion region : plane.getRegions()) { @@ -186,7 +186,7 @@ public class ConquestRegion { } public static List getAllRegions() { - List regions = new ArrayList(); + List regions = new ArrayList<>(); for (ConquestPlane plane : FModel.getPlanes()) { for (ConquestRegion region : plane.getRegions()) { regions.add(region); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java index 0ec44d20da0..df54a02c9fa 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java @@ -206,7 +206,7 @@ public class ConquestUtil { } } - public static enum AEtherFilter implements IHasSkinProp { + public enum AEtherFilter implements IHasSkinProp { C (null, new ColorFilter(MagicColor.COLORLESS), "Playable in {C}"), W (null, new ColorFilter(MagicColor.WHITE), "Playable in {W}"), U (null, new ColorFilter(MagicColor.BLUE), "Playable in {U}"), @@ -262,7 +262,7 @@ public class ConquestUtil { private final Predicate predicate; private String caption; - private AEtherFilter(final FSkinProp skinProp0, final Predicate predicate0, final String caption0) { + AEtherFilter(final FSkinProp skinProp0, final Predicate predicate0, final String caption0) { skinProp = skinProp0; predicate = predicate0; caption = caption0; @@ -311,13 +311,13 @@ public class ConquestUtil { } public static AEtherFilter getColorFilter(ColorSet color) { - String name = ""; + StringBuilder name = new StringBuilder(); for (ManaCostShard s : color.getOrderedShards()) { - name += s.toString(); + name.append(s.toString()); } - name = name.replaceAll("[{}]", ""); //remove all brackets + name = new StringBuilder(name.toString().replaceAll("[{}]", "")); //remove all brackets try { - return AEtherFilter.valueOf(name); + return AEtherFilter.valueOf(name.toString()); } catch (Exception e) { System.err.println("No color filter with name " + name); @@ -462,7 +462,7 @@ public class ConquestUtil { double baseOdds = 0; double remainingOdds = 1; CardRarity baseRarity = null; - String caption = ""; + StringBuilder caption = new StringBuilder(); for (CardRarity rarity : rarityOdds.keySet()) { Double odds = oddsLookup.get(rarity); @@ -479,16 +479,16 @@ public class ConquestUtil { final String display = rounded < 1d ? Double.toString(rounded) // Display decimal if < 1% : Long.toString(Math.round(rounded)); - caption += ", " + rarity.getLongName() + " (" + display + "%)"; + caption.append(", ").append(rarity.getLongName()).append(" (").append(display).append("%)"); rarityOdds.put(rarity, odds); } } //prepend base rarity and odds - caption = baseRarity.getLongName() + " (" + (Math.round(1000 * remainingOdds) / 10) + "%)" + caption; + caption.insert(0, baseRarity.getLongName() + " (" + (Math.round(1000 * remainingOdds) / 10) + "%)"); rarityOdds.put(baseRarity, remainingOdds); - return caption; + return caption.toString(); } @Override @@ -509,8 +509,7 @@ public class ConquestUtil { public boolean apply(PaperCard card) { int cardCmc = card.getRules().getManaCost().getCMC(); if (cardCmc < cmcMin) { return false; } - if (cmcMax != -1 && cardCmc > cmcMax) { return false; } - return true; + return cmcMax == -1 || cardCmc <= cmcMax; } } } diff --git a/forge-gui/src/main/java/forge/player/GamePlayerUtil.java b/forge-gui/src/main/java/forge/player/GamePlayerUtil.java index 448670a30ce..a7a93d85006 100644 --- a/forge-gui/src/main/java/forge/player/GamePlayerUtil.java +++ b/forge-gui/src/main/java/forge/player/GamePlayerUtil.java @@ -17,7 +17,7 @@ import forge.util.MyRandom; import forge.util.gui.SOptionPane; public final class GamePlayerUtil { - private GamePlayerUtil() { }; + private GamePlayerUtil() { } private static final LobbyPlayer guiPlayer = new LobbyPlayerHuman("Human"); public static final LobbyPlayer getGuiPlayer() { diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 02e4ec6c80b..22d379ddf5b 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -73,7 +73,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(final CostChooseCreatureType cost) { - final String choice = controller.chooseSomeType("Creature", ability, new ArrayList(CardType.Constant.CREATURE_TYPES), new ArrayList(), true); + final String choice = controller.chooseSomeType("Creature", ability, new ArrayList<>(CardType.Constant.CREATURE_TYPES), new ArrayList<>(), true); if (null == choice) { return null; } @@ -159,7 +159,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { return PaymentDecision.card(discarded); } - final String type = new String(discardType); + final String type = discardType; final String[] validType = type.split(";"); hand = CardLists.getValidCards(hand, validType, player, source, ability); @@ -282,7 +282,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (!cost.sameZone) { return exileFromMiscZone(cost, ability, c, list); } final FCollectionView players = game.getPlayers(); - final List payableZone = new ArrayList(); + final List payableZone = new ArrayList<>(); for (final Player p : players) { final CardCollection enoughType = CardLists.filter(list, CardPredicates.isOwner(p)); if (enoughType.size() < c) { @@ -332,8 +332,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { Integer c = cost.convertAmount(); final String type = cost.getType(); - final List saList = new ArrayList(); - final List descList = new ArrayList(); + final List saList = new ArrayList<>(); + final List descList = new ArrayList<>(); for (final SpellAbilityStackInstance si : game.getStack()) { final Card stC = si.getSourceCard(); @@ -366,7 +366,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { return null; } - final List exiled = new ArrayList(); + final List exiled = new ArrayList<>(); for (int i = 0; i < c; i++) { //Have to use the stack descriptions here because some copied spells have no description otherwise final String o = controller.getGui().oneOrNone("Exile from Stack", descList); @@ -545,7 +545,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } } - final List oppsThatCanGainLife = new ArrayList(); + final List oppsThatCanGainLife = new ArrayList<>(); for (final Player opp : cost.getPotentialTargets(player, source)) { if (opp.canGainLife()) { oppsThatCanGainLife.add(opp); @@ -677,7 +677,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (cost.sameZone){ final FCollectionView players = player.getGame().getPlayers(); - final List payableZone = new ArrayList(); + final List payableZone = new ArrayList<>(); for (final Player p : players) { final CardCollectionView enoughType = CardLists.filter(list, CardPredicates.isOwner(p)); if (enoughType.size() < c) { @@ -860,7 +860,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } if (num == 0) { return PaymentDecision.number(0); - }; + } inp = new InputSelectCardsFromList(controller, num, num, hand, ability); inp.setMessage("Select %d more " + cost.getDescriptiveType() + " card(s) to reveal."); @@ -898,7 +898,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { inp.showAndWait(); final Card selected = inp.getFirstSelected(); final Map tgtCounters = selected.getCounters(); - final List typeChoices = new ArrayList(); + final List typeChoices = new ArrayList<>(); for (final CounterType key : tgtCounters.keySet()) { if (tgtCounters.get(key) > 0) { typeChoices.add(key); @@ -922,7 +922,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { super(controller, cntCounters, cntCounters, sa); this.validChoices = validCards; counterType = cType; - cardsChosen = cntCounters > 0 ? new HashMap() : null; + cardsChosen = cntCounters > 0 ? new HashMap<>() : null; } @Override diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index c1e1325af7d..bf9244ffd0c 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -274,7 +274,7 @@ public class HumanPlay { } final List parts = CostAdjustment.adjust(cost, sourceAbility).getCostParts(); - final List remainingParts = new ArrayList(parts); + final List remainingParts = new ArrayList<>(parts); CostPart costPart = null; if (!parts.isEmpty()) { costPart = parts.get(0); @@ -319,7 +319,7 @@ public class HumanPlay { } else if (part instanceof CostDraw) { final int amount = getAmountFromPart(part, source, sourceAbility); - List res = new ArrayList(); + List res = new ArrayList<>(); String type = part.getType(); for (Player player : p.getGame().getPlayers()) { if (player.isValid(type, p, source, sourceAbility) && player.canDraw()) { @@ -333,7 +333,7 @@ public class HumanPlay { StringBuilder sb = new StringBuilder("Do you want to "); sb.append(res.contains(p) ? "" : "let that player "); - sb.append("draw " + Lang.nounWithAmount(amount, " card") + "?" + orString); + sb.append("draw ").append(Lang.nounWithAmount(amount, " card")).append("?").append(orString); if (!p.getController().confirmPayment(part, sb.toString(), sourceAbility)) { return false; @@ -455,7 +455,7 @@ public class HumanPlay { } Card selected = inp.getFirstSelected(); final Map tgtCounters = selected.getCounters(); - final List typeChoices = new ArrayList(); + final List typeChoices = new ArrayList<>(); for (CounterType key : tgtCounters.keySet()) { if (tgtCounters.get(key) > 0) { typeChoices.add(key); @@ -514,7 +514,7 @@ public class HumanPlay { } } else if (part instanceof CostPutCardToLib) { - int amount = Integer.parseInt(((CostPutCardToLib) part).getAmount()); + int amount = Integer.parseInt(part.getAmount()); final ZoneType from = ((CostPutCardToLib) part).getFrom(); final boolean sameZone = ((CostPutCardToLib) part).isSameZone(); CardCollectionView listView; @@ -528,7 +528,7 @@ public class HumanPlay { if (sameZone) { // Jotun Grunt FCollectionView players = p.getGame().getPlayers(); - List payableZone = new ArrayList(); + List payableZone = new ArrayList<>(); for (Player player : players) { CardCollectionView enoughType = CardLists.filter(list, CardPredicates.isOwner(player)); if (enoughType.size() < amount) { @@ -576,7 +576,7 @@ public class HumanPlay { part.payAsDecided(p, pd, sourceAbility); } else if (part instanceof CostGainControl) { - int amount = Integer.parseInt(((CostGainControl)part).getAmount()); + int amount = Integer.parseInt(part.getAmount()); CardCollectionView list = CardLists.getValidCards(p.getGame().getCardsIn(ZoneType.Battlefield), part.getType(), p, source); boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "gain control." + orString); if (!hasPaid) { return false; } diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index d02362f46cc..84c5bd0555d 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -335,7 +335,7 @@ public class HumanPlaySpellAbility { for (final String aVar : announce.split(",")) { final String varName = aVar.trim(); if ("CreatureType".equals(varName)) { - final String choice = pc.chooseSomeType("Creature", ability, CardType.Constant.CREATURE_TYPES, Collections.emptyList()); + final String choice = pc.chooseSomeType("Creature", ability, CardType.Constant.CREATURE_TYPES, Collections.emptyList()); ability.getHostCard().setChosenType(choice); } if ("ChooseNumber".equals(varName)) { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index c7fefdc1b5d..eb4dc80fa2f 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -136,7 +136,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return mayLookAtAllCards; } - private final ArrayList tempShownCards = new ArrayList(); + private final ArrayList tempShownCards = new ArrayList<>(); public void tempShow(final Iterable objects) { for (final T t : objects) { @@ -337,7 +337,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (min == 0) { builder.append("up to "); } - builder.append("%d " + message + "(s) to " + action + "."); + builder.append("%d ").append(message).append("(s) to ").append(action).append("."); final InputSelectCardsFromList inp = new InputSelectCardsFromList(this, min, max, valid, sa); inp.setMessage(builder.toString()); @@ -446,7 +446,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShow(delayedReveal.getCards()); } if (useSelectCardsInput(optionList)) { - final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, isOptional ? 0 : 1, 1, + final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList<>(this, isOptional ? 0 : 1, 1, optionList, sa); input.setCancelAllowed(isOptional); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); @@ -485,7 +485,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShow(optionList); if (useSelectCardsInput(optionList)) { - final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, min, max, + final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList<>(this, min, max, optionList, sa); input.setCancelAllowed(true); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); @@ -544,8 +544,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (SpellAbility spellAbility : spells) { spellViewCache.put(spellAbility.getView(), spellAbility); } - List choices = new ArrayList<>(); - choices.addAll(spellViewCache.keySet()); + List choices = new ArrayList<>(spellViewCache.keySet()); Object choice = getGui().one(title, choices); // Human is supposed to read the message and understand from it what to @@ -634,13 +633,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } final Map tos = sa.getTriggeringObjects(); if (tos.containsKey("Attacker")) { - buildQuestion.append("\nAttacker: " + tos.get("Attacker")); + buildQuestion.append("\nAttacker: ").append(tos.get("Attacker")); } if (tos.containsKey("Card")) { final Card card = (Card) tos.get("Card"); if (card != null && (card.getController() == player || game.getZoneOf(card) == null || game.getZoneOf(card).getZoneType().isKnown())) { - buildQuestion.append("\nTriggered by: " + tos.get("Card")); + buildQuestion.append("\nTriggered by: ").append(tos.get("Card")); } } @@ -661,8 +660,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final String prompt = String.format( "%s, you %s\n\nWho would you like to start this game? (Click on the portrait.)", player.getName(), isFirstGame ? " have won the coin toss." : " lost the last game."); - final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, 1, 1, - new FCollection(game.getPlayersInTurnOrder())); + final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList<>(this, 1, 1, + new FCollection<>(game.getPlayersInTurnOrder())); input.setMessage(prompt); input.showAndWait(); return input.getFirstSelected(); @@ -684,9 +683,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont mapCVtoC.put(card.getView(), card); } List chosen; - List choices = new ArrayList(mapCVtoC.keySet()); + List choices = new ArrayList<>(mapCVtoC.keySet()); chosen = getGui().order("Exert Attackers?", "Exerted", 0, choices.size(), choices, null, null, false); - List chosenCards = new ArrayList(); + List chosenCards = new ArrayList<>(); for (CardView cardView : chosen) { chosenCards.add(mapCVtoC.get(cardView)); } @@ -776,7 +775,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } else { toBottom = game.getCardList(getGui().many("Select cards to be put on the bottom of your library", "Cards to put on the bottom", -1, CardView.getCollection(topN), null)); - topN.removeAll((Collection) toBottom); + topN.removeAll(toBottom); if (topN.isEmpty()) { toTop = null; } else if (topN.size() == 1) { @@ -814,7 +813,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } else { toGrave = game.getCardList(getGui().many("Select cards to be put into the graveyard", "Cards to put in the graveyard", -1, CardView.getCollection(topN), null)); - topN.removeAll((Collection) toGrave); + topN.removeAll(toGrave); if (topN.isEmpty()) { toTop = null; } else if (topN.size() == 1) { @@ -1147,7 +1146,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // create sorted list from map from least to most frequent List> sortedList = Lists.newArrayList(typesInDeck.entrySet()); - Collections.sort(sortedList, new Comparator>() { + sortedList.sort(new Comparator>() { public int compare(Entry o1, Entry o2) { return o1.getValue().compareTo(o2.getValue()); } @@ -1404,7 +1403,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final boolean call) { final String[] labelsSrc = call ? new String[] { "heads", "tails" } : new String[] { "win the flip", "lose the flip" }; - final ImmutableList.Builder strResults = ImmutableList.builder(); + final ImmutableList.Builder strResults = ImmutableList.builder(); for (int i = 0; i < results.length; i++) { strResults.add(labelsSrc[results[i] ? 0 : 1]); } @@ -1623,7 +1622,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // for the purpose of pre-ordering, no need for extra granularity Integer idxAdditionalInfo = firstStr.indexOf(" ["); - String saLookupKey = idxAdditionalInfo != -1 ? firstStr.substring(0, idxAdditionalInfo - 1) : firstStr; + StringBuilder saLookupKey = new StringBuilder(idxAdditionalInfo != -1 ? firstStr.substring(0, idxAdditionalInfo - 1) : firstStr); char delim = (char) 5; for (int i = 1; i < activePlayerSAs.size(); i++) { @@ -1635,14 +1634,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // are the same } - saLookupKey += delim + saStr; + saLookupKey.append(delim).append(saStr); idxAdditionalInfo = saLookupKey.indexOf(" ["); if (idxAdditionalInfo != -1) { - saLookupKey = saLookupKey.substring(0, idxAdditionalInfo - 1); + saLookupKey = new StringBuilder(saLookupKey.substring(0, idxAdditionalInfo - 1)); } } if (needPrompt) { - List savedOrder = orderedSALookup.get(saLookupKey); + List savedOrder = orderedSALookup.get(saLookupKey.toString()); List orderedSAVs = Lists.newArrayList(); // create a mapping between a spell's view and the spell itself @@ -1665,8 +1664,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont boolean preselect = FModel.getPreferences() .getPrefBoolean(FPref.UI_PRESELECT_PREVIOUS_ABILITY_ORDER); orderedSAVs = getGui().order("Reorder simultaneous abilities", "Resolve first", 0, 0, - preselect ? Lists.newArrayList() : orderedSAVs, - preselect ? orderedSAVs : Lists.newArrayList(), null, false); + preselect ? Lists.newArrayList() : orderedSAVs, + preselect ? orderedSAVs : Lists.newArrayList(), null, false); } else { orderedSAVs = getGui().order("Select order for simultaneous abilities", "Resolve first", orderedSAVs, null); @@ -1681,7 +1680,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (SpellAbility sa : orderedSAs) { savedOrder.add(activePlayerSAs.indexOf(sa)); } - orderedSALookup.put(saLookupKey, savedOrder); + orderedSALookup.put(saLookupKey.toString(), savedOrder); } } for (int i = orderedSAs.size() - 1; i >= 0; i--) { @@ -1829,10 +1828,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return false; } final Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); - if (priorityPlayer == null || priorityPlayer != player) { - return false; - } - return true; + return priorityPlayer != null && priorityPlayer == player; } @Override @@ -2741,7 +2737,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (final Player player : game.getPlayers()) { if (player.getId() == entity.getKey()) { found = true; - rememberedActions.add(Pair.of((GameEntityView) player.getView(), true)); + rememberedActions.add(Pair.of(player.getView(), true)); break; } } @@ -2749,7 +2745,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (final Card card : cards) { if (card.getId() == entity.getKey()) { found = true; - rememberedActions.add(Pair.of((GameEntityView) card.getView(), false)); + rememberedActions.add(Pair.of(card.getView(), false)); break; } } @@ -2861,7 +2857,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont for (Card card : cards) { mapCVtoC.put(card.getView(), card); } - List choices = new ArrayList(mapCVtoC.keySet()); + List choices = new ArrayList<>(mapCVtoC.keySet()); List chosen; chosen = getGui().many( "Choose cards to Splice onto", @@ -2871,7 +2867,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont choices, sa.getHostCard().getView() ); - List chosenCards = new ArrayList(); + List chosenCards = new ArrayList<>(); for (CardView cardView : chosen) { chosenCards.add(mapCVtoC.get(cardView)); } diff --git a/forge-gui/src/main/java/forge/player/PlayerZoneUpdates.java b/forge-gui/src/main/java/forge/player/PlayerZoneUpdates.java index 7d48de0651f..17f71d1e6e2 100644 --- a/forge-gui/src/main/java/forge/player/PlayerZoneUpdates.java +++ b/forge-gui/src/main/java/forge/player/PlayerZoneUpdates.java @@ -12,7 +12,7 @@ import forge.game.player.PlayerView; public class PlayerZoneUpdates implements Iterable, Serializable { private static final long serialVersionUID = 7023549243041119023L; - private final Map updates = Collections.synchronizedMap(Maps.newHashMap()); + private final Map updates = Collections.synchronizedMap(Maps.newHashMap()); public PlayerZoneUpdates() { } diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index 70fd7b72cfc..deced7b9fb8 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -194,7 +194,7 @@ public class TargetSelection { else if (zz.is(ZoneType.Stack)) crdsStack.add(cardView); else if (zz.is(ZoneType.Ante)) crdsAnte.add(cardView); } - List choicesFiltered = new ArrayList(); + List choicesFiltered = new ArrayList<>(); if (!crdsBattle.isEmpty()) { choicesFiltered.add("--CARDS ON BATTLEFIELD:--"); choicesFiltered.addAll(crdsBattle); @@ -251,7 +251,7 @@ public class TargetSelection { final TargetRestrictions tgt = this.getTgt(); final String message = tgt.getVTSelection(); // Find what's targetable, then allow human to choose - final List selectOptions = new ArrayList(); + final List selectOptions = new ArrayList<>(); HashMap stackItemViewCache = new HashMap<>(); final Game game = ability.getActivatingPlayer().getGame(); diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index 342d2184991..7ff4316eb99 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -306,7 +306,7 @@ public final class ForgeConstants { public static final String GRAVEYARD_ORDERING_ALWAYS = "Always"; // Set boolean constant for landscape mode for gdx port - public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini") ? true : false; + public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini"); public enum CounterDisplayLocation { diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index d4a35b4db97..9aa8e691bd0 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -240,7 +240,7 @@ public class ForgePreferences extends PreferencesStore { private final String strDefaultVal; - private FPref(final String s0) { + FPref(final String s0) { this.strDefaultVal = s0; } diff --git a/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java b/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java index 25a8dbce4dd..78cd5278860 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java +++ b/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java @@ -74,7 +74,7 @@ public class ForgeProfileProperties { cardPicsDir = getDir(props, CARD_PICS_DIR_KEY, cacheDir + "pics" + File.separator + "cards" + File.separator); cardPicsSubDirs = getMap(props, CARD_PICS_SUB_DIRS_KEY); decksDir = getDir(props, DECKS_DIR_KEY, userDir + "decks" + File.separator); - decksConstructedDir = getDir(props, DECKS_CONSTRUCTED_DIR_KEY, decksDir + "constructed" + File.separator);; + decksConstructedDir = getDir(props, DECKS_CONSTRUCTED_DIR_KEY, decksDir + "constructed" + File.separator); serverPort = getInt(props, SERVER_PORT_KEY, 36743); // "Forge" using phone keypad //ensure directories exist @@ -212,16 +212,16 @@ public class ForgeProfileProperties { //only append values that aren't equal to defaults final StringBuilder sb = new StringBuilder(); if (!userDir.equals(defaultUserDir)) { //ensure backslashes are escaped - sb.append(USER_DIR_KEY + "=" + userDir.replace("\\", "\\\\") + "\n"); + sb.append(USER_DIR_KEY + "=").append(userDir.replace("\\", "\\\\")).append("\n"); } if (!decksDir.equals(defaultDecksDir)) { - sb.append(DECKS_DIR_KEY + "=" + decksDir.replace("\\", "\\\\") + "\n"); + sb.append(DECKS_DIR_KEY + "=").append(decksDir.replace("\\", "\\\\")).append("\n"); } if (!cacheDir.equals(defaultCacheDir)) { - sb.append(CACHE_DIR_KEY + "=" + cacheDir.replace("\\", "\\\\") + "\n"); + sb.append(CACHE_DIR_KEY + "=").append(cacheDir.replace("\\", "\\\\")).append("\n"); } if (!cardPicsDir.equals(defaultCardPicsDir)) { - sb.append(CARD_PICS_DIR_KEY + "=" + cardPicsDir.replace("\\", "\\\\") + "\n"); + sb.append(CARD_PICS_DIR_KEY + "=").append(cardPicsDir.replace("\\", "\\\\")).append("\n"); } if (cardPicsSubDirs.size() > 0) { sb.append(CARD_PICS_SUB_DIRS_KEY + "="); @@ -230,12 +230,12 @@ public class ForgeProfileProperties { if (needDelim) { sb.append("|"); } - sb.append(entry.getKey() + "->" + entry.getValue()); + sb.append(entry.getKey()).append("->").append(entry.getValue()); } sb.append("\n"); } if (serverPort != 0) { - sb.append(SERVER_PORT_KEY + "=" + serverPort); + sb.append(SERVER_PORT_KEY + "=").append(serverPort); } if (sb.length() > 0) { FileUtil.writeFile(ForgeConstants.PROFILE_FILE, sb.toString()); diff --git a/forge-gui/src/main/java/forge/properties/PreferencesStore.java b/forge-gui/src/main/java/forge/properties/PreferencesStore.java index 9fd0a15d116..39da97b9e99 100644 --- a/forge-gui/src/main/java/forge/properties/PreferencesStore.java +++ b/forge-gui/src/main/java/forge/properties/PreferencesStore.java @@ -36,7 +36,7 @@ public abstract class PreferencesStore> { private final String filename; public PreferencesStore(final String filename0, final Class clasz) { - preferenceValues = new EnumMap(clasz); + preferenceValues = new EnumMap<>(clasz); filename = filename0; final List lines = FileUtil.readFile(filename); diff --git a/forge-gui/src/main/java/forge/puzzle/Puzzle.java b/forge-gui/src/main/java/forge/puzzle/Puzzle.java index b513fc0732a..39904881b7e 100644 --- a/forge-gui/src/main/java/forge/puzzle/Puzzle.java +++ b/forge-gui/src/main/java/forge/puzzle/Puzzle.java @@ -222,6 +222,6 @@ public class Puzzle extends GameState implements InventoryItem, Comparable cards) { //sort cards alphabetically so colors appear together and rares appear on top - Collections.sort(cards, new Comparator() { + cards.sort(new Comparator() { @Override public int compare(PaperCard c1, PaperCard c2) { return c1.getName().compareTo(c2.getName()); } }); - Collections.sort(cards, new Comparator() { + cards.sort(new Comparator() { @Override public int compare(PaperCard c1, PaperCard c2) { return c1.getRules().getColor().compareTo(c2.getRules().getColor()); } }); - Collections.sort(cards, new Comparator() { + cards.sort(new Comparator() { @Override public int compare(PaperCard c1, PaperCard c2) { return c2.getRarity().compareTo(c1.getRarity()); diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index f679f7e954a..86fc937f89a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -161,7 +161,7 @@ public class QuestController { public IStorage getDraftDecks() { if (draftDecks == null) { - draftDecks = new QuestDeckGroupMap(new HashMap()); + draftDecks = new QuestDeckGroupMap(new HashMap<>()); } final QuestAchievements achievements = this.getAchievements(); if (achievements != null && (achievements.getCurrentDraftIndex() == -1 || achievements.getCurrentDraft() == null)) { @@ -208,18 +208,18 @@ public class QuestController { public static IStorage getPrecons() { if (null == preconManager) { // read with a special class, that will fill sell rules as it processes each PreconDeck - preconManager = new StorageBase("Quest shop decks", new PreconDeck.Reader(new File(ForgeConstants.QUEST_PRECON_DIR)){ + preconManager = new StorageBase<>("Quest shop decks", new PreconDeck.Reader(new File(ForgeConstants.QUEST_PRECON_DIR)) { @Override - protected PreconDeck getPreconDeckFromSections(java.util.Map> sections) { + protected PreconDeck getPreconDeckFromSections(java.util.Map> sections) { PreconDeck result = super.getPreconDeckFromSections(sections); preconDeals.put(result.getName(), new SellRules(sections.get("shop"))); return result; - }; + } }); } return QuestController.preconManager; } - private final static Map preconDeals = new TreeMap(); + private final static Map preconDeals = new TreeMap<>(); public static SellRules getPreconDeals(PreconDeck deck) { return preconDeals.get(deck.getName()); } @@ -558,11 +558,11 @@ public class QuestController { public final void regenerateChallenges() { final QuestAchievements achievements = model.getAchievements(); - final List unlockedChallengeIds = new ArrayList(); + final List unlockedChallengeIds = new ArrayList<>(); final List availableChallengeIds = achievements.getCurrentChallenges(); // clean up challenges potentially coming over from a different quest world - List nonExistentIds = new ArrayList(); + List nonExistentIds = new ArrayList<>(); for (String cid : availableChallengeIds) { if (this.getChallenges().get(cid) == null) { System.out.println("Warning: removing a challenge that does not exist in the current quest world: " + cid); diff --git a/forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java b/forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java index c6a78556d2b..4ef703fc1b5 100644 --- a/forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java +++ b/forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java @@ -32,7 +32,7 @@ public class QuestDeckGroupMap extends StorageBase { * Instantiates a new quest deck map. */ public QuestDeckGroupMap(Map in) { - super("Quest draft decks", null, in == null ? new HashMap() : in); + super("Quest draft decks", null, in == null ? new HashMap<>() : in); } diff --git a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java index 54a67f8f575..68b63ad1846 100644 --- a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java +++ b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java @@ -427,11 +427,7 @@ public class QuestDraftUtils { String sid1 = qd.getStandings()[offset]; String sid2 = qd.getStandings()[offset + 1]; - if (sid1.equals(QuestEventDraft.HUMAN) || sid2.equals(QuestEventDraft.HUMAN)) { - return false; - } - - return true; + return !sid1.equals(QuestEventDraft.HUMAN) && !sid2.equals(QuestEventDraft.HUMAN); } public static boolean injectRandomMatchOutcome(boolean simHumanMatches) { diff --git a/forge-gui/src/main/java/forge/quest/QuestEventChallenge.java b/forge-gui/src/main/java/forge/quest/QuestEventChallenge.java index 2f1b1fbd1cc..9009b97c441 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventChallenge.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventChallenge.java @@ -61,10 +61,10 @@ public class QuestEventChallenge extends QuestEvent { // Other cards used in assignment: starting, and reward. /** The human extra cards. */ - private List humanExtraCards = new ArrayList(); + private List humanExtraCards = new ArrayList<>(); /** The ai extra cards. */ - private List aiExtraCards = new ArrayList(); + private List aiExtraCards = new ArrayList<>(); /** If persistent, the challenge does not disappear if the player fails it. */ private boolean persistent = false; diff --git a/forge-gui/src/main/java/forge/quest/QuestEventDifficulty.java b/forge-gui/src/main/java/forge/quest/QuestEventDifficulty.java index 5111f0576bf..cfdb7d2b65a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventDifficulty.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventDifficulty.java @@ -15,7 +15,7 @@ public enum QuestEventDifficulty { private final String inFile; private final double multiplier; - private QuestEventDifficulty(final String storedInFile, final double multiplier) { + QuestEventDifficulty(final String storedInFile, final double multiplier) { inFile = storedInFile; this.multiplier = multiplier; } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java index d60a180a0c6..4f58b2f0437 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventDraft.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventDraft.java @@ -701,17 +701,17 @@ public class QuestEventDraft implements IQuestEvent { if (edition != null) { return edition.getName() + " (" + edition.getCode() + ")"; } - String blockString = block.getName() + " ("; + StringBuilder blockString = new StringBuilder(block.getName() + " ("); List sets = block.getSets(); for (int i = 0; i < sets.size(); i++) { CardEdition cardEdition = sets.get(i); - blockString += cardEdition.getCode(); + blockString.append(cardEdition.getCode()); if (i < sets.size() - 1) { - blockString += ", "; + blockString.append(", "); } } - blockString += ")"; - return blockString; + blockString.append(")"); + return blockString.toString(); } public String getName() { @@ -971,14 +971,14 @@ public class QuestEventDraft implements IQuestEvent { final String s0c = sets.get(0).getCode(); if (sets.size() == 1) { int numBoosters = block.getCntBoostersDraft(); - String combination = ""; + StringBuilder combination = new StringBuilder(); for (int i = 0; i < numBoosters; i++) { - combination += s0c; + combination.append(s0c); if (i < numBoosters - 1) { - combination += "/"; + combination.append("/"); } } - possibleCombinations.add(combination); + possibleCombinations.add(combination.toString()); return possibleCombinations; } @@ -991,7 +991,7 @@ public class QuestEventDraft implements IQuestEvent { } final boolean oldSetsFirst = sets.get(0).getDate().before(FModel.getMagicDb().getEditions().get("SOM").getDate()); - Collections.sort(allowedSets, new Comparator() { + allowedSets.sort(new Comparator() { @Override public int compare(final CardEdition edition1, final CardEdition edition2) { if (edition1.getDate().before(edition2.getDate())) { @@ -1022,7 +1022,6 @@ public class QuestEventDraft implements IQuestEvent { if (allowedSets.size() == 2) { final boolean draftOrder2016 = set0.getDate().after(FModel.getMagicDb().getEditions().get("BFZ").getDate()) || set1.getDate().after(FModel.getMagicDb().getEditions().get("BFZ").getDate()); -; if (draftOrder2016) { if (set0.isLargeSet()) { possibleCombinations.add(TextUtil.concatNoSpace(set1.getCode(), "/", set1.getCode(), "/", set0.getCode())); @@ -1100,15 +1099,15 @@ public class QuestEventDraft implements IQuestEvent { } public String getBoosterList() { - String boosterList = ""; + StringBuilder boosterList = new StringBuilder(); String[] boosterArray = boosterConfiguration.split("/"); for (int i = 0; i < boosterArray.length; i++) { - boosterList += FModel.getMagicDb().getEditions().get(boosterArray[i]).getName(); + boosterList.append(FModel.getMagicDb().getEditions().get(boosterArray[i]).getName()); if (i != boosterArray.length - 1) { - boosterList += " | "; + boosterList.append(" | "); } } - return boosterList; + return boosterList.toString(); } @Override diff --git a/forge-gui/src/main/java/forge/quest/QuestEventDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventDuelManager.java index 7d54e178f13..138176ed248 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventDuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventDuelManager.java @@ -40,7 +40,7 @@ import java.util.*; */ public class QuestEventDuelManager implements QuestEventDuelManagerInterface { - private final MapOfLists sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); + private final MapOfLists sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); private final IStorage allDuels; /** @@ -218,10 +218,10 @@ public class QuestEventDuelManager implements QuestEventDuelManagerInterface { private void assembleDuelDifficultyLists() { sortedDuels.clear(); - sortedDuels.put(QuestEventDifficulty.EASY, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.MEDIUM, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.HARD, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.EXPERT, new ArrayList()); + sortedDuels.put(QuestEventDifficulty.EASY, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.MEDIUM, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.HARD, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.EXPERT, new ArrayList<>()); for (final QuestEventDuel qd : allDuels) { sortedDuels.add(qd.getDifficulty(), qd); diff --git a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java index 0fdc9660461..424701015de 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventLDADuelManager.java @@ -42,7 +42,7 @@ import java.util.List; public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface { private List archetypes; - private final MapOfLists sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); + private final MapOfLists sortedDuels = new EnumMapOfLists<>(QuestEventDifficulty.class, CollectionSuppliers.arrayLists()); private GameFormat baseFormat; public QuestEventLDADuelManager(GameFormat baseFormat){ @@ -54,10 +54,10 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface private void assembleDuelDifficultyLists() { sortedDuels.clear(); - sortedDuels.put(QuestEventDifficulty.EASY, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.MEDIUM, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.HARD, new ArrayList()); - sortedDuels.put(QuestEventDifficulty.EXPERT, new ArrayList()); + sortedDuels.put(QuestEventDifficulty.EASY, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.MEDIUM, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.HARD, new ArrayList<>()); + sortedDuels.put(QuestEventDifficulty.EXPERT, new ArrayList<>()); int i=0; for(Archetype archetype : archetypes){ @@ -223,7 +223,7 @@ public class QuestEventLDADuelManager implements QuestEventDuelManagerInterface @Override public Iterable getAllDuels() { - return new ArrayList(); + return new ArrayList<>(); } public Iterable getDuels(QuestEventDifficulty difficulty) { diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCard.java b/forge-gui/src/main/java/forge/quest/QuestRewardCard.java index 024fd3c56bc..9b0541dbc91 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCard.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCard.java @@ -19,27 +19,27 @@ public abstract class QuestRewardCard implements IQuestRewardCard { return defaultDescription; } - String buildDesc = null; + StringBuilder buildDesc = null; for (final String s : input) { if (s.startsWith("desc:") || s.startsWith("Desc:")) { final String[] tmp = s.split(":"); if (tmp.length > 1) { - buildDesc = new String(tmp[1]); + buildDesc = new StringBuilder(tmp[1]); } else { - buildDesc = new String(); + buildDesc = new StringBuilder(); } } else if (buildDesc != null) { if (s.contains(":")) { - return buildDesc; + return buildDesc.toString(); } else { - buildDesc = buildDesc + " " + s; + buildDesc.append(" ").append(s); } } } if (buildDesc != null) { - return buildDesc; + return buildDesc.toString(); } return defaultDescription; } @@ -59,7 +59,7 @@ public abstract class QuestRewardCard implements IQuestRewardCard { if (tmp.length > 1) { final String [] setcodes = tmp[1].split(","); if (setcodes.length > 0) { - final List sets = new ArrayList(); + final List sets = new ArrayList<>(); for (final String code : setcodes) { if (FModel.getMagicDb().getEditions().contains(code)) { // System.out.println("Set " + code + " was found!"); diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java index 8441b22ac9b..9850681e4e1 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardChooser.java @@ -98,7 +98,7 @@ public class QuestRewardCardChooser extends QuestRewardCard { final ItemPool playerCards = FModel.getQuest().getAssets().getCardPool(); if (!playerCards.isEmpty()) { // Maybe a redundant check since it's hard to win a duel without any cards... - List cardChoices = new ArrayList(); + List cardChoices = new ArrayList<>(); for (final Map.Entry card : playerCards) { cardChoices.add(card.getKey()); } @@ -108,7 +108,7 @@ public class QuestRewardCardChooser extends QuestRewardCard { } } else if (type == poolType.predicateFilter) { - List cardChoices = new ArrayList(); + List cardChoices = new ArrayList<>(); for (final PaperCard card : Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), predicates)) { cardChoices.add(card); diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java index 4c6014e1cb0..4b6a0e66df9 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java @@ -60,7 +60,7 @@ public class QuestRewardCardDuplicate implements IQuestRewardCard { final ItemPool playerCards = FModel.getQuest().getAssets().getCardPool(); if (!playerCards.isEmpty()) { // Maybe a redundant check since it's hard to win a duel without any cards... - final List cardChoices = new ArrayList(); + final List cardChoices = new ArrayList<>(); for (final Map.Entry card : playerCards) { cardChoices.add(card.getKey()); } diff --git a/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java b/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java index 3e05da19c27..ba565e9b774 100644 --- a/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java +++ b/forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java @@ -60,7 +60,7 @@ public class QuestRewardCardFiltered extends QuestRewardCard { */ @Override public final List getChoices() { - List cardChoices = new ArrayList(); + List cardChoices = new ArrayList<>(); for (final PaperCard card : Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), predicates)) { cardChoices.add(card); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 46ab8eda6fa..03b336a36cf 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -323,7 +323,7 @@ public class QuestUtil { view.getCbxMatchLength().removeAllItems(); boolean activeCharms = false; StringBuilder matchLength = new StringBuilder(); - matchLength.append(localizer.getMessage("lblMatchBestof") + " ").append(qCtrl.getMatchLength()); + matchLength.append(localizer.getMessage("lblMatchBestof")).append(" ").append(qCtrl.getMatchLength()); if (qCtrl.getAssets().hasItem(QuestItemType.CHARM_VIM)) { view.getCbxMatchLength().addItem(localizer.getMessage("lblMatchBestOf1")); activeCharms = true; @@ -677,7 +677,7 @@ public class QuestUtil { } public static String getDeckConformanceProblems(Deck deck){ - String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java index d7881334f57..ffbad1ca8f3 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java @@ -67,7 +67,7 @@ public class QuestUtilUnlockSets { final ReadPriceList prices = new ReadPriceList(); final Map mapPrices = prices.getPriceList(); - final List> setPrices = new ArrayList>(); + final List> setPrices = new ArrayList<>(); Double multiplier = 1d; int j = 0; @@ -90,7 +90,7 @@ public class QuestUtilUnlockSets { } final String setPrompt = "You have " + qData.getAssets().getCredits() + " credits. Unlock:"; - List options = new ArrayList(); + List options = new ArrayList<>(); for (ImmutablePair ee : setPrices) { options.add(TextUtil.concatNoSpace(ee.left.getName()," [PRICE: ", String.valueOf(ee.right), " credits]")); } @@ -130,7 +130,7 @@ public class QuestUtilUnlockSets { * * @return unmodifiable list, assorted sets that are not currently in the format. */ - private static final List emptyEditions = ImmutableList.of(); + private static final List emptyEditions = ImmutableList.of(); private static final EnumSet unlockableSetTypes = EnumSet.of(CardEdition.Type.CORE, CardEdition.Type.EXPANSION, CardEdition.Type.REPRINT, CardEdition.Type.STARTER); @@ -142,7 +142,7 @@ public class QuestUtilUnlockSets { if (qData.getUnlocksTokens() < 1) { // Should never happen if we made it this far but better safe than sorry... throw new RuntimeException("BUG? Could not find unlockable sets even though we should."); } - List options = new ArrayList(); + List options = new ArrayList<>(); // Sort current sets by date List allowedSets = Lists.newArrayList(Iterables.transform(qData.getFormat().getAllowedSetCodes(), FModel.getMagicDb().getEditions().FN_EDITION_BY_CODE)); @@ -153,7 +153,7 @@ public class QuestUtilUnlockSets { Collections.sort(excludedSets); // get a number of sets between an excluded and any included set - List> excludedWithDistances = new ArrayList>(); + List> excludedWithDistances = new ArrayList<>(); for (CardEdition ex : excludedSets) { if (!unlockableSetTypes.contains(ex.getType())) // don't add non-traditional sets continue; @@ -168,7 +168,7 @@ public class QuestUtilUnlockSets { } // sort by distance, then by code desc - Collections.sort(excludedWithDistances, new Comparator>() { + excludedWithDistances.sort(new Comparator>() { @Override public int compare(ImmutablePair o1, ImmutablePair o2) { long delta = o2.right - o1.right; @@ -205,7 +205,7 @@ public class QuestUtilUnlockSets { qData.getFormat().unlockSet(additionalSet); } - List cardsWon = new ArrayList(); + List cardsWon = new ArrayList<>(); if (starters.contains(unlockedSet.getCode())) { UnOpenedProduct starter = new UnOpenedProduct(starters.get(unlockedSet.getCode())); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 265ea61bb58..bcf80b0526d 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -227,7 +227,7 @@ public class QuestWinLoseController { sb.append(" opponent: ").append(credBase).append(" credits.\n"); if(qEvent.getIsRandomMatch()){ - sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + sb.append("Random Opponent Bonus: ").append(credBase).append(" credit").append(credBase > 1 ? "s." : ".").append("\n"); credBase += credBase; } diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index cc44ae603c7..b5a27b5b04c 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -145,8 +145,8 @@ public class QuestWorld implements Comparable{ String useDir = null; GameFormatQuest useFormat = null; - final List sets = new ArrayList(); - final List bannedCards = new ArrayList(); // if both empty, no format + final List sets = new ArrayList<>(); + final List bannedCards = new ArrayList<>(); // if both empty, no format String key, value; String[] pieces = line.split("\\|"); @@ -234,7 +234,7 @@ public class QuestWorld implements Comparable{ } public static Set getAllQuestWorldsOfCard(PaperCard card) { - Set result = new HashSet(); + Set result = new HashSet<>(); for (QuestWorld qw : FModel.getWorlds()) { GameFormat format = qw.getFormat(); if (format == null) { @@ -248,7 +248,7 @@ public class QuestWorld implements Comparable{ } public static Set getAllQuestWorldsOfDeck(Deck deck) { - Set result = new HashSet(); + Set result = new HashSet<>(); for (QuestWorld qw : FModel.getWorlds()) { GameFormat format = qw.getFormat(); if (format == null) { diff --git a/forge-gui/src/main/java/forge/quest/SellRules.java b/forge-gui/src/main/java/forge/quest/SellRules.java index 8d8ca9e8d45..36de28da65f 100644 --- a/forge-gui/src/main/java/forge/quest/SellRules.java +++ b/forge-gui/src/main/java/forge/quest/SellRules.java @@ -60,11 +60,7 @@ public class SellRules { if (quest.getWin() < minWins) { return false; } - if (quest.getDifficulty() < minDifficulty || quest.getDifficulty() > maxDifficulty) { - return false; - } - - return true; + return quest.getDifficulty() >= minDifficulty && quest.getDifficulty() <= maxDifficulty; } /** diff --git a/forge-gui/src/main/java/forge/quest/StartingPoolType.java b/forge-gui/src/main/java/forge/quest/StartingPoolType.java index 513a49f1da0..dc1bd6dbe3c 100644 --- a/forge-gui/src/main/java/forge/quest/StartingPoolType.java +++ b/forge-gui/src/main/java/forge/quest/StartingPoolType.java @@ -12,7 +12,7 @@ public enum StartingPoolType { private final String caption; - private StartingPoolType(String caption0) { + StartingPoolType(String caption0) { caption = caption0; } diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestBazaarManager.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestBazaarManager.java index de2905fb8ed..6e3db328e7a 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestBazaarManager.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestBazaarManager.java @@ -122,10 +122,10 @@ public class QuestBazaarManager { } /** Constant stalls. */ - private final Map stalls = new TreeMap(); + private final Map stalls = new TreeMap<>(); /** Constant items. */ - private final Map> itemsOnStalls = new TreeMap>(String.CASE_INSENSITIVE_ORDER); - private final Map items = new TreeMap(); + private final Map> itemsOnStalls = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + private final Map items = new TreeMap<>(); /** *

@@ -149,7 +149,7 @@ public class QuestBazaarManager { * and maps to appropriate merchant. */ public void buildItems(final QuestController qCtrl) { - final Map itemSet = new HashMap(); + final Map itemSet = new HashMap<>(); for (int iSlot = 0; iSlot < QuestController.MAX_PET_SLOTS; iSlot++) { @@ -164,7 +164,7 @@ public class QuestBazaarManager { itemsOnStalls.clear(); for (final QuestStallDefinition thisStall : stalls.values()) { - final SortedSet set = new TreeSet(); + final SortedSet set = new TreeSet<>(); for (final String itemName : thisStall.getItems()) { final IQuestBazaarItem item = itemSet.get(itemName); @@ -184,7 +184,7 @@ public class QuestBazaarManager { public List getItems(final QuestController qCtrl, final String stallName) { buildItems(qCtrl); - final List ret = new ArrayList(); + final List ret = new ArrayList<>(); final QuestAssets qA = FModel.getQuest().getAssets(); for (final IQuestBazaarItem purchasable : itemsOnStalls.get(stallName)) { diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestItemType.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestItemType.java index 86ac871228b..07cb6165f9e 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestItemType.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestItemType.java @@ -53,8 +53,8 @@ public enum QuestItemType { private final Class bazaarControllerClass; private final Class modelClass; - private QuestItemType(final String key, final Class controllerClass0, - final Class modelClass0) { + QuestItemType(final String key, final Class controllerClass0, + final Class modelClass0) { this.saveFileKey = key; this.bazaarControllerClass = controllerClass0; this.modelClass = modelClass0; diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetController.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetController.java index 455b4b114aa..0b84a69e5b0 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetController.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetController.java @@ -49,7 +49,7 @@ public class QuestPetController implements IQuestBazaarItem { @XStreamAsAttribute() private final int maxLevel; - private final List levels = new ArrayList(); + private final List levels = new ArrayList<>(); @XStreamAsAttribute() private final String name; diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java index 00216780b9f..899f7c93d4a 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestPetStorage.java @@ -29,9 +29,9 @@ import java.util.Map; */ public class QuestPetStorage { - private Map> petsBySlot = new HashMap>(); + private Map> petsBySlot = new HashMap<>(); - private Map petsByName = new HashMap(); + private Map petsByName = new HashMap<>(); /** * TODO: Write javadoc for Constructor. @@ -89,9 +89,13 @@ public class QuestPetStorage { */ private void addToMap(final QuestPetController petCtrl) { final int iSlot = petCtrl.getSlot(); + /* + * Refactoring this to List list = this.petsBySlot.computeIfAbsent(Integer.valueOf(iSlot), k -> new ArrayList()); + * will cause Android not to compile + * */ List list = this.petsBySlot.get(Integer.valueOf(iSlot)); if (null == list) { - list = new ArrayList(); + list = new ArrayList<>(); this.petsBySlot.put(Integer.valueOf(iSlot), list); } this.petsByName.put(petCtrl.getName(), petCtrl); @@ -116,7 +120,7 @@ public class QuestPetStorage { * @return List */ public List getAvaliablePets(final int iSlot, final QuestAssets qA) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); final List allPossible = this.petsBySlot.get(Integer.valueOf(iSlot)); if (null != allPossible) { for (final QuestPetController c : allPossible) { @@ -135,12 +139,10 @@ public class QuestPetStorage { * @return List */ public List getAllPets(final int iSlot) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); final List allPossible = this.petsBySlot.get(Integer.valueOf(iSlot)); if (null != allPossible) { - for (final QuestPetController c : allPossible) { - result.add(c); - } + result.addAll(allPossible); } return result; } diff --git a/forge-gui/src/main/java/forge/quest/bazaar/QuestStallDefinition.java b/forge-gui/src/main/java/forge/quest/bazaar/QuestStallDefinition.java index 64420a85b9f..af107ee7355 100644 --- a/forge-gui/src/main/java/forge/quest/bazaar/QuestStallDefinition.java +++ b/forge-gui/src/main/java/forge/quest/bazaar/QuestStallDefinition.java @@ -69,7 +69,7 @@ public class QuestStallDefinition { name = null; displayName = null; description = null; - items = new ArrayList(); + items = new ArrayList<>(); icon = null; } diff --git a/forge-gui/src/main/java/forge/quest/data/GameFormatQuest.java b/forge-gui/src/main/java/forge/quest/data/GameFormatQuest.java index 6b6876dff77..b7da238eb3e 100644 --- a/forge-gui/src/main/java/forge/quest/data/GameFormatQuest.java +++ b/forge-gui/src/main/java/forge/quest/data/GameFormatQuest.java @@ -75,7 +75,7 @@ public final class GameFormatQuest extends GameFormat { */ public List getLockedSets() { - List exSets = new ArrayList(); + List exSets = new ArrayList<>(); if (this.allowedSetCodes.isEmpty()) { return exSets; } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java index 6140c1d5b64..98e03b13394 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -41,7 +41,7 @@ public class QuestAssets { // Cards associated with quest /** The card pool. */ - private final ItemPool cardPool = new ItemPool(PaperCard.class); // player's + private final ItemPool cardPool = new ItemPool<>(PaperCard.class); // player's /** The credits. */ private long credits; // this money is good for all modes // game @@ -49,25 +49,25 @@ public class QuestAssets { // Decks collected by player /** The my decks. */ - private final HashMap myDecks = new HashMap(); + private final HashMap myDecks = new HashMap<>(); // current // shop // list /** The new card list. */ - private final ItemPool newCardList = new ItemPool(InventoryItem.class); // cards + private final ItemPool newCardList = new ItemPool<>(InventoryItem.class); // cards // belonging /** The shop list. */ - private final ItemPool shopList = new ItemPool(InventoryItem.class); // the + private final ItemPool shopList = new ItemPool<>(InventoryItem.class); // the // gadgets /** The inventory items. */ - private final Map inventoryItems = new EnumMap( + private final Map inventoryItems = new EnumMap<>( QuestItemType.class); // Much the same like other map, but keyed by string (to support a lot of custom pets) - private final Map combatPets = new HashMap(); + private final Map combatPets = new HashMap<>(); - private final HashMap draftDecks = new HashMap(); + private final HashMap draftDecks = new HashMap<>(); /** * Checks for item. * diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index 41574634113..1d41cc4b013 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -66,7 +66,7 @@ public final class QuestData { private final Map petSlots = new HashMap<>(); private int matchLength = 3; - public HashSet Ratings = new HashSet(); + public HashSet Ratings = new HashSet<>(); public String currentDeck = "DEFAULT"; diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index c64544b11b8..2aebea27992 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -540,14 +540,14 @@ public class QuestDataIO { writer.endNode(); writer.startNode("packs"); - String output = ""; + StringBuilder output = new StringBuilder(); for (int i = 0; i < draft.getBoosterConfiguration().length; i++) { - output += draft.getBoosterConfiguration()[i]; + output.append(draft.getBoosterConfiguration()[i]); if (i != draft.getBoosterConfiguration().length - 1) { - output += "/"; + output.append("/"); } } - writer.setValue(output); + writer.setValue(output.toString()); writer.endNode(); writer.startNode("entryFee"); diff --git a/forge-gui/src/main/java/forge/sound/EventVisualizer.java b/forge-gui/src/main/java/forge/sound/EventVisualizer.java index 057293b7e60..69ce7a8fba1 100644 --- a/forge-gui/src/main/java/forge/sound/EventVisualizer.java +++ b/forge-gui/src/main/java/forge/sound/EventVisualizer.java @@ -199,40 +199,40 @@ public class EventVisualizer extends IGameEventVisitor.Base imp resultSound = SoundEffectType.ScriptedEffect; } else { // I want to get all real colors this land can produce - no interest in colorless or devoid - String fullManaColors = ""; + StringBuilder fullManaColors = new StringBuilder(); for (final SpellAbility sa : land.getManaAbilities()) { String currManaColor = sa.getManaPartRecursive().getOrigProduced(); if(!"C".equals(currManaColor)) { - fullManaColors = fullManaColors + currManaColor; + fullManaColors.append(currManaColor); } } // No interest if "colors together" or "alternative colors" - only interested in colors themselves - fullManaColors = fullManaColors.replaceAll("\\s", ""); + fullManaColors = new StringBuilder(fullManaColors.toString().replaceAll("\\s", "")); int fullManaColorsLength = fullManaColors.length(); if(fullManaColorsLength >= 3) { // three color land - fullManaColors = fullManaColors.substring(0,3); - if (fullManaColors.contains("W") && fullManaColors.contains("U") && fullManaColors.contains("B") && SoundSystem.instance.hasResource(SoundEffectType.WhiteBlueBlackLand)) { + fullManaColors = new StringBuilder(fullManaColors.substring(0, 3)); + if (fullManaColors.toString().contains("W") && fullManaColors.toString().contains("U") && fullManaColors.toString().contains("B") && SoundSystem.instance.hasResource(SoundEffectType.WhiteBlueBlackLand)) { resultSound = SoundEffectType.WhiteBlueBlackLand; - } else if (fullManaColors.contains("W") && fullManaColors.contains("G") && fullManaColors.contains("U") && SoundSystem.instance.hasResource(SoundEffectType.WhiteGreenBlueLand)) { + } else if (fullManaColors.toString().contains("W") && fullManaColors.toString().contains("G") && fullManaColors.toString().contains("U") && SoundSystem.instance.hasResource(SoundEffectType.WhiteGreenBlueLand)) { resultSound = SoundEffectType.WhiteGreenBlueLand; - } else if (fullManaColors.contains("W") && fullManaColors.contains("R") && fullManaColors.contains("B") && SoundSystem.instance.hasResource(SoundEffectType.WhiteRedBlackLand)) { + } else if (fullManaColors.toString().contains("W") && fullManaColors.toString().contains("R") && fullManaColors.toString().contains("B") && SoundSystem.instance.hasResource(SoundEffectType.WhiteRedBlackLand)) { resultSound = SoundEffectType.WhiteRedBlackLand; - } else if (fullManaColors.contains("B") && fullManaColors.contains("W") && fullManaColors.contains("G") && SoundSystem.instance.hasResource(SoundEffectType.BlackWhiteGreenLand)) { + } else if (fullManaColors.toString().contains("B") && fullManaColors.toString().contains("W") && fullManaColors.toString().contains("G") && SoundSystem.instance.hasResource(SoundEffectType.BlackWhiteGreenLand)) { resultSound = SoundEffectType.BlackWhiteGreenLand; - } else if (fullManaColors.contains("B") && fullManaColors.contains("R") && fullManaColors.contains("G") && SoundSystem.instance.hasResource(SoundEffectType.BlackRedGreenLand)) { + } else if (fullManaColors.toString().contains("B") && fullManaColors.toString().contains("R") && fullManaColors.toString().contains("G") && SoundSystem.instance.hasResource(SoundEffectType.BlackRedGreenLand)) { resultSound = SoundEffectType.BlackRedGreenLand; - } else if (fullManaColors.contains("U") && fullManaColors.contains("B") && fullManaColors.contains("R") && SoundSystem.instance.hasResource(SoundEffectType.BlueBlackRedLand)) { + } else if (fullManaColors.toString().contains("U") && fullManaColors.toString().contains("B") && fullManaColors.toString().contains("R") && SoundSystem.instance.hasResource(SoundEffectType.BlueBlackRedLand)) { resultSound = SoundEffectType.BlueBlackRedLand; - } else if (fullManaColors.contains("G") && fullManaColors.contains("U") && fullManaColors.contains("R") && SoundSystem.instance.hasResource(SoundEffectType.GreenBlueRedLand)) { + } else if (fullManaColors.toString().contains("G") && fullManaColors.toString().contains("U") && fullManaColors.toString().contains("R") && SoundSystem.instance.hasResource(SoundEffectType.GreenBlueRedLand)) { resultSound = SoundEffectType.GreenBlueRedLand; - } else if (fullManaColors.contains("G") && fullManaColors.contains("B") && fullManaColors.contains("U") && SoundSystem.instance.hasResource(SoundEffectType.GreenBlackBlueLand)) { + } else if (fullManaColors.toString().contains("G") && fullManaColors.toString().contains("B") && fullManaColors.toString().contains("U") && SoundSystem.instance.hasResource(SoundEffectType.GreenBlackBlueLand)) { resultSound = SoundEffectType.GreenBlackBlueLand; - } else if (fullManaColors.contains("G") && fullManaColors.contains("R") && fullManaColors.contains("W") && SoundSystem.instance.hasResource(SoundEffectType.GreenRedWhiteLand)) { + } else if (fullManaColors.toString().contains("G") && fullManaColors.toString().contains("R") && fullManaColors.toString().contains("W") && SoundSystem.instance.hasResource(SoundEffectType.GreenRedWhiteLand)) { resultSound = SoundEffectType.GreenRedWhiteLand; - } else if (fullManaColors.contains("R") && fullManaColors.contains("U") && fullManaColors.contains("W") && SoundSystem.instance.hasResource(SoundEffectType.RedBlueWhiteLand)) { + } else if (fullManaColors.toString().contains("R") && fullManaColors.toString().contains("U") && fullManaColors.toString().contains("W") && SoundSystem.instance.hasResource(SoundEffectType.RedBlueWhiteLand)) { resultSound = SoundEffectType.RedBlueWhiteLand; } } @@ -240,26 +240,26 @@ public class EventVisualizer extends IGameEventVisitor.Base imp if(resultSound == null && fullManaColorsLength >= 2) { // three color land without sounds installed, or two color land // lets try - fullManaColors = fullManaColors.substring(0,2); - if (fullManaColors.contains("W") && (fullManaColors.contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteBlueLand)) { + fullManaColors = new StringBuilder(fullManaColors.substring(0, 2)); + if (fullManaColors.toString().contains("W") && (fullManaColors.toString().contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteBlueLand)) { resultSound = SoundEffectType.WhiteBlueLand; - } else if (fullManaColors.contains("W") && (fullManaColors.contains("G")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteGreenLand)) { + } else if (fullManaColors.toString().contains("W") && (fullManaColors.toString().contains("G")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteGreenLand)) { resultSound = SoundEffectType.WhiteGreenLand; - } else if (fullManaColors.contains("W") && (fullManaColors.contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteRedLand)) { + } else if (fullManaColors.toString().contains("W") && (fullManaColors.toString().contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.WhiteRedLand)) { resultSound = SoundEffectType.WhiteRedLand; - } else if (fullManaColors.contains("B") && (fullManaColors.contains("W")) && SoundSystem.instance.hasResource(SoundEffectType.BlackWhiteLand)) { + } else if (fullManaColors.toString().contains("B") && (fullManaColors.toString().contains("W")) && SoundSystem.instance.hasResource(SoundEffectType.BlackWhiteLand)) { resultSound = SoundEffectType.BlackWhiteLand; - } else if (fullManaColors.contains("B") && (fullManaColors.contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.BlackRedLand)) { + } else if (fullManaColors.toString().contains("B") && (fullManaColors.toString().contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.BlackRedLand)) { resultSound = SoundEffectType.BlackRedLand; - } else if (fullManaColors.contains("U") && (fullManaColors.contains("B")) && SoundSystem.instance.hasResource(SoundEffectType.BlueBlackLand)) { + } else if (fullManaColors.toString().contains("U") && (fullManaColors.toString().contains("B")) && SoundSystem.instance.hasResource(SoundEffectType.BlueBlackLand)) { resultSound = SoundEffectType.BlueBlackLand; - } else if (fullManaColors.contains("G") && (fullManaColors.contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.GreenBlueLand)) { + } else if (fullManaColors.toString().contains("G") && (fullManaColors.toString().contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.GreenBlueLand)) { resultSound = SoundEffectType.GreenBlueLand; - } else if (fullManaColors.contains("G") && (fullManaColors.contains("B")) && SoundSystem.instance.hasResource(SoundEffectType.GreenBlackLand)) { + } else if (fullManaColors.toString().contains("G") && (fullManaColors.toString().contains("B")) && SoundSystem.instance.hasResource(SoundEffectType.GreenBlackLand)) { resultSound = SoundEffectType.GreenBlackLand; - } else if (fullManaColors.contains("G") && (fullManaColors.contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.GreenRedLand)) { + } else if (fullManaColors.toString().contains("G") && (fullManaColors.toString().contains("R")) && SoundSystem.instance.hasResource(SoundEffectType.GreenRedLand)) { resultSound = SoundEffectType.GreenRedLand; - } else if (fullManaColors.contains("R") && (fullManaColors.contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.RedBlueLand)) { + } else if (fullManaColors.toString().contains("R") && (fullManaColors.toString().contains("U")) && SoundSystem.instance.hasResource(SoundEffectType.RedBlueLand)) { resultSound = SoundEffectType.RedBlueLand; } } @@ -268,17 +268,17 @@ public class EventVisualizer extends IGameEventVisitor.Base imp // multicolor land without sounds installed, or single mana land, or colorless/devoid land // in case of multicolor, lets take only the 1st color of the list, it sure has sound if(fullManaColorsLength >= 2) { - fullManaColors = fullManaColors.substring(0,1); + fullManaColors = new StringBuilder(fullManaColors.substring(0, 1)); } - if (fullManaColors.contains("B")) { + if (fullManaColors.toString().contains("B")) { resultSound = SoundEffectType.BlackLand; - } else if (fullManaColors.contains("U")) { + } else if (fullManaColors.toString().contains("U")) { resultSound = SoundEffectType.BlueLand; - } else if (fullManaColors.contains("G")) { + } else if (fullManaColors.toString().contains("G")) { resultSound = SoundEffectType.GreenLand; - } else if (fullManaColors.contains("R")) { + } else if (fullManaColors.toString().contains("R")) { resultSound = SoundEffectType.RedLand; - } else if (fullManaColors.contains("W")) { + } else if (fullManaColors.toString().contains("W")) { resultSound = SoundEffectType.WhiteLand; } else { resultSound = SoundEffectType.OtherLand; @@ -301,7 +301,7 @@ public class EventVisualizer extends IGameEventVisitor.Base imp if (null != c) { effect = c.getSVar("SoundEffect"); } - return effect.isEmpty() ? false : true; + return !effect.isEmpty(); } diff --git a/forge-gui/src/main/java/forge/sound/IAudioClip.java b/forge-gui/src/main/java/forge/sound/IAudioClip.java index 1fc08bb123c..479eccc4da3 100644 --- a/forge-gui/src/main/java/forge/sound/IAudioClip.java +++ b/forge-gui/src/main/java/forge/sound/IAudioClip.java @@ -1,8 +1,8 @@ package forge.sound; public interface IAudioClip { - public void play(); - public boolean isDone(); - public void stop(); - public void loop(); + void play(); + boolean isDone(); + void stop(); + void loop(); } diff --git a/forge-gui/src/main/java/forge/sound/MusicPlaylist.java b/forge-gui/src/main/java/forge/sound/MusicPlaylist.java index c5cbbb3d1ea..d5acc57718d 100644 --- a/forge-gui/src/main/java/forge/sound/MusicPlaylist.java +++ b/forge-gui/src/main/java/forge/sound/MusicPlaylist.java @@ -14,7 +14,7 @@ public enum MusicPlaylist { private int mostRecentTrackIdx = -1; private String[] filenames; - private MusicPlaylist(String subDir0) { + MusicPlaylist(String subDir0) { subDir = subDir0; } diff --git a/forge-gui/src/main/java/forge/sound/SoundSystem.java b/forge-gui/src/main/java/forge/sound/SoundSystem.java index a7e23a1d176..8e69ef87e0b 100644 --- a/forge-gui/src/main/java/forge/sound/SoundSystem.java +++ b/forge-gui/src/main/java/forge/sound/SoundSystem.java @@ -23,8 +23,8 @@ public class SoundSystem { public static final int DELAY = 30; private static final IAudioClip emptySound = new NoSoundClip(); - private static final Map loadedClips = new EnumMap(SoundEffectType.class); - private static final Map loadedScriptClips = new HashMap(); + private static final Map loadedClips = new EnumMap<>(SoundEffectType.class); + private static final Map loadedScriptClips = new HashMap<>(); private final EventVisualizer visualizer; diff --git a/forge-gui/src/main/java/forge/tournament/TournamentData.java b/forge-gui/src/main/java/forge/tournament/TournamentData.java index 66c76ffd74e..7064ce4b024 100644 --- a/forge-gui/src/main/java/forge/tournament/TournamentData.java +++ b/forge-gui/src/main/java/forge/tournament/TournamentData.java @@ -23,8 +23,8 @@ public class TournamentData { private int completed; private String timestamp; - private List eventRecords = new ArrayList(); - private List eventNames = new ArrayList(); + private List eventRecords = new ArrayList<>(); + private List eventNames = new ArrayList<>(); private Deck userDeck; private List decks; @@ -57,7 +57,7 @@ public class TournamentData { public void stamp() { final DateFormat dateFormat = new SimpleDateFormat("MM-dd-yy, H:m"); - timestamp = dateFormat.format(new Date()).toString(); + timestamp = dateFormat.format(new Date()); } /** Resets a Tournament data to an unplayed state, then stamps and saves. */ @@ -94,7 +94,7 @@ public class TournamentData { } public List getDeckNames() { - final List names = new ArrayList(); + final List names = new ArrayList<>(); for (final Deck d : decks) { names.add(d.getName()); } return names; } diff --git a/forge-gui/src/main/java/forge/tournament/TournamentUtil.java b/forge-gui/src/main/java/forge/tournament/TournamentUtil.java index 5176fb8856b..ebf1c426e60 100644 --- a/forge-gui/src/main/java/forge/tournament/TournamentUtil.java +++ b/forge-gui/src/main/java/forge/tournament/TournamentUtil.java @@ -20,8 +20,8 @@ public class TournamentUtil { // Generate tournament decks Deck deck; - final List eventNames = new ArrayList(); - final List decks = new ArrayList(); + final List eventNames = new ArrayList<>(); + final List decks = new ArrayList<>(); for (int i = 0; i < numOpponents; i++) { int randType = (int)Math.floor(MyRandom.getRandom().nextDouble() * allowedDeckTypes.size()); @@ -81,7 +81,7 @@ public class TournamentUtil { public static void setDefaultTournamentName(TournamentData tournament, String prefix) { final File[] arrFiles = TournamentIO.getTournamentFilesUnlocked(prefix); - final Set setNames = new HashSet(); + final Set setNames = new HashSet<>(); for (File f : arrFiles) { setNames.add(f.getName()); } diff --git a/forge-gui/src/main/java/forge/tournament/system/AbstractTournament.java b/forge-gui/src/main/java/forge/tournament/system/AbstractTournament.java index e658f3cac29..b70a9b526da 100644 --- a/forge-gui/src/main/java/forge/tournament/system/AbstractTournament.java +++ b/forge-gui/src/main/java/forge/tournament/system/AbstractTournament.java @@ -109,21 +109,21 @@ public abstract class AbstractTournament implements Serializable { public void sortAllPlayers(String sortType) { if (sortType.equals("score")) { - Collections.sort(allPlayers, new Comparator() { + allPlayers.sort(new Comparator() { @Override public int compare(TournamentPlayer o1, TournamentPlayer o2) { return o2.getScore() - o1.getScore(); } }); } else if (sortType.equals("index")) { - Collections.sort(allPlayers, new Comparator() { + allPlayers.sort(new Comparator() { @Override public int compare(TournamentPlayer o1, TournamentPlayer o2) { return o2.getIndex() - o1.getIndex(); } }); } else if (sortType.equals("swiss")) { - Collections.sort(allPlayers, new Comparator() { + allPlayers.sort(new Comparator() { @Override public int compare(TournamentPlayer o1, TournamentPlayer o2) { return o2.getSwissScore() - o1.getSwissScore(); diff --git a/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java b/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java index a49c54fae00..1a7df43b495 100644 --- a/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java +++ b/forge-gui/src/main/java/forge/tournament/system/TournamentSwiss.java @@ -57,7 +57,7 @@ public class TournamentSwiss extends AbstractTournament { if (byePlayer != null) { groupPlayers.remove(byePlayer); - TournamentPairing byePair = new TournamentPairing(activeRound, Lists.newArrayList(byePlayer)); + TournamentPairing byePair = new TournamentPairing(activeRound, Lists.newArrayList(byePlayer)); byePair.setBye(true); activePairings.add(byePair); } @@ -129,7 +129,7 @@ public class TournamentSwiss extends AbstractTournament { return pairSwissGroup(players); } - Collections.sort(players, new Comparator() { + players.sort(new Comparator() { @Override public int compare(TournamentPlayer o1, TournamentPlayer o2) { return availableOpponents.get(o1).size() - availableOpponents.get(o2).size(); diff --git a/forge-gui/src/main/java/forge/util/IgnoringXStream.java b/forge-gui/src/main/java/forge/util/IgnoringXStream.java index bb4c0a12ce6..e8b5e997818 100644 --- a/forge-gui/src/main/java/forge/util/IgnoringXStream.java +++ b/forge-gui/src/main/java/forge/util/IgnoringXStream.java @@ -16,7 +16,7 @@ import java.util.List; * (but are there any fields?) */ public class IgnoringXStream extends XStream { - private final List ignoredFields = new ArrayList(); + private final List ignoredFields = new ArrayList<>(); @Override protected MapperWrapper wrapMapper(final MapperWrapper next) { diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index fa08293340f..cf219331dc8 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -118,7 +118,7 @@ public abstract class ImageFetcher { protected abstract Runnable getDownloadTask(String[] toArray, String destPath, Runnable notifyObservers); - public static interface Callback { - public void onImageFetched(); + public interface Callback { + void onImageFetched(); } } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/util/LineReader.java b/forge-gui/src/main/java/forge/util/LineReader.java index b89057a0214..7657bd949b3 100644 --- a/forge-gui/src/main/java/forge/util/LineReader.java +++ b/forge-gui/src/main/java/forge/util/LineReader.java @@ -118,7 +118,7 @@ public class LineReader implements Iterable, Closeable { * @return The lines read from the stream. */ public Collection readLines() { - final Collection lines = new ArrayList(); + final Collection lines = new ArrayList<>(); for (final String line : this) { lines.add(line); } diff --git a/forge-gui/src/main/java/forge/util/RestartUtil.java b/forge-gui/src/main/java/forge/util/RestartUtil.java index c74c05297f1..a4fcf54679a 100644 --- a/forge-gui/src/main/java/forge/util/RestartUtil.java +++ b/forge-gui/src/main/java/forge/util/RestartUtil.java @@ -45,10 +45,10 @@ public class RestartUtil { // program main is a jar if (mainCommand[0].endsWith(".jar")) { // if it's a jar, add -jar mainJar - cmd.append("-jar " + new File(mainCommand[0]).getPath()); + cmd.append("-jar ").append(new File(mainCommand[0]).getPath()); } else { // else it's a .class, add the classpath and mainClass - cmd.append("-cp \"" + System.getProperty("java.class.path") + "\" " + mainCommand[0]); + cmd.append("-cp \"").append(System.getProperty("java.class.path")).append("\" ").append(mainCommand[0]); } // finally add program arguments for (int i = 1; i < mainCommand.length; i++) { diff --git a/forge-gui/src/main/java/forge/util/XmlReader.java b/forge-gui/src/main/java/forge/util/XmlReader.java index 9b2c3eeabae..5af330e66a4 100644 --- a/forge-gui/src/main/java/forge/util/XmlReader.java +++ b/forge-gui/src/main/java/forge/util/XmlReader.java @@ -69,19 +69,19 @@ public class XmlReader { return parseChildElements(key, null, collectionType, paperCardBuilder); } public T read(String key, Class type) { - return parseChildElements(key, new GenericBuilder(type)); + return parseChildElements(key, new GenericBuilder<>(type)); } public > void read(String key, T collectionToLoad, Class elementType) { - parseChildElements(key, collectionToLoad, null, new GenericBuilder(elementType)); + parseChildElements(key, collectionToLoad, null, new GenericBuilder<>(elementType)); } public > T read(String key, Class collectionType, Class elementType) { - return parseChildElements(key, null, collectionType, new GenericBuilder(elementType)); + return parseChildElements(key, null, collectionType, new GenericBuilder<>(elementType)); } public void read(final String key, final V[] array, final Class elementType) { parseChildElements(key, new Evaluator() { @Override public Void evaluate() { - final GenericBuilder builder = new GenericBuilder(elementType); + final GenericBuilder builder = new GenericBuilder<>(elementType); return parseChildElements(null, new Evaluator() { @Override public Void evaluate() { @@ -107,7 +107,7 @@ public class XmlReader { parseChildElements(key, new Evaluator() { @Override public Void evaluate() { - final GenericBuilder builder = new GenericBuilder(valueType); + final GenericBuilder builder = new GenericBuilder<>(valueType); return parseChildElements(null, new Evaluator() { @Override public Void evaluate() { @@ -131,7 +131,7 @@ public class XmlReader { parseChildElements(key, new Evaluator() { @Override public Void evaluate() { - final GenericBuilder builder = new GenericBuilder(valueType); + final GenericBuilder builder = new GenericBuilder<>(valueType); return parseChildElements(null, new Evaluator() { @Override public Void evaluate() { diff --git a/forge-gui/src/main/java/forge/util/XmlWriter.java b/forge-gui/src/main/java/forge/util/XmlWriter.java index 09b406f50c2..3c6cddcaaf6 100644 --- a/forge-gui/src/main/java/forge/util/XmlWriter.java +++ b/forge-gui/src/main/java/forge/util/XmlWriter.java @@ -17,7 +17,7 @@ import forge.item.PaperCard; public class XmlWriter { private final Document document; private final String filename; - private final Stack parentElements = new Stack(); + private final Stack parentElements = new Stack<>(); private Element currentElement; diff --git a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java index 0575d80adb6..4b8fcb3d860 100644 --- a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java +++ b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java @@ -105,7 +105,7 @@ public class SGuiChoose { return getInteger(message, min, max); } - final List choices = new ArrayList(); + final List choices = new ArrayList<>(); for (int i = min; i <= cutoff; i++) { choices.add(Integer.valueOf(i)); } diff --git a/pom.xml b/pom.xml index d3d17cf28d0..6a943a4ba4f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.28-SNAPSHOT + 1.6.29-SNAPSHOT Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules.