diff --git a/src/main/java/forge/card/TriggerReplacementBase.java b/src/main/java/forge/card/TriggerReplacementBase.java index a9a07073ddd..07e887cab43 100644 --- a/src/main/java/forge/card/TriggerReplacementBase.java +++ b/src/main/java/forge/card/TriggerReplacementBase.java @@ -277,7 +277,6 @@ public abstract class TriggerReplacementBase { if (!Expressions.compare(left, presentCompare, right)) { return false; } - } if (params.containsKey("CheckSVar")) { @@ -288,8 +287,7 @@ public abstract class TriggerReplacementBase { } final String svarOperator = comparator.substring(0, 2); final String svarOperand = comparator.substring(2); - final int operandValue = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), - svarOperand, null); + final int operandValue = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), svarOperand, null); if (!Expressions.compare(sVar, svarOperator, operandValue)) { return false; } diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java index 8d9299d8e7e..e8c73f818d5 100644 --- a/src/main/java/forge/card/ability/AbilityUtils.java +++ b/src/main/java/forge/card/ability/AbilityUtils.java @@ -493,11 +493,7 @@ public class AbilityUtils { if (calcX[0].startsWith("TriggeredPlayer") || calcX[0].startsWith("TriggeredTarget")) { final SpellAbility root = ability.getRootAbility(); Object o = root.getTriggeringObject(calcX[0].substring(9)); - final List players = new ArrayList(); - if (o instanceof Player) { - players.add((Player) o); - } - return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; + return o instanceof Player ? CardFactoryUtil.playerXProperty((Player) o, calcX[1], card) * multiplier : 0; } if(calcX[0].equals("TriggeredSpellAbility")) { final SpellAbility root = ability.getRootAbility(); diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 99b31c778d7..d2552088a3f 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -917,7 +917,6 @@ public class CardFactoryUtil { if (players.size() == 0) { return 0; } - final GameState game = source.getGame(); final String[] l = s.split("/"); final String m = extractOperators(s); @@ -927,9 +926,7 @@ public class CardFactoryUtil { // methods for getting the highest/lowest playerXCount from a range of players if (l[0].startsWith("Highest")) { for (final Player player : players) { - final ArrayList temp = new ArrayList(); - temp.add(player); - final int current = playerXCount(temp, s.replace("Highest", ""), source); + final int current = playerXProperty(player, s.replace("Highest", ""), source); if (current > n) { n = current; } @@ -939,41 +936,14 @@ public class CardFactoryUtil { } else if (l[0].startsWith("Lowest")) { n = 99999; // if no players have fewer than 99999 valids, the game is frozen anyway for (final Player player : players) { - final ArrayList temp = new ArrayList(); - temp.add(player); - final int current = playerXCount(temp, s.replace("Lowest", ""), source); + final int current = playerXProperty(player, s.replace("Lowest", ""), source); if (current < n) { n = current; } } - return doXMath(n, m, source); } - // count valid cards in any specified zone/s - if (l[0].startsWith("Valid") && !l[0].contains("Valid ")) { - String[] lparts = l[0].split(" ", 2); - final List vZone = ZoneType.listValueOf(lparts[0].split("Valid")[1]); - String restrictions = l[0].replace(lparts[0] + " ", ""); - final String[] rest = restrictions.split(","); - List cards = game.getCardsIn(vZone); - cards = CardLists.getValidCards(cards, rest, players.get(0), source); - - n = cards.size(); - - return doXMath(n, m, source); - } - // count valid cards on the battlefield - if (l[0].startsWith("Valid ")) { - final String restrictions = l[0].substring(6); - final String[] rest = restrictions.split(","); - List cardsonbattlefield = game.getCardsIn(ZoneType.Battlefield); - cardsonbattlefield = CardLists.getValidCards(cardsonbattlefield, rest, players.get(0), source); - - n = cardsonbattlefield.size(); - - return doXMath(n, m, source); - } final String[] sq; sq = l[0].split("\\."); @@ -982,16 +952,56 @@ public class CardFactoryUtil { if (sq[0].equals("Amount")) { return doXMath(players.size(), m, source); } - - if (sq[0].contains("CardsInHand")) { - if (players.size() > 0) { - return doXMath(players.get(0).getCardsIn(ZoneType.Hand).size(), m, source); + if (sq[0].contains("DamageThisTurn")) { + int totDmg = 0; + for (Player p : players) { + totDmg += p.getAssignedDamage(); } + return doXMath(totDmg, m, source); } - if (sq[0].contains("DomainPlayer")) { + if(players.size() > 0) + return playerXProperty(players.get(0), s, source); + + return doXMath(n, m, source); + } + + public static int playerXProperty(Player player, String s, Card source) { + final String[] l = s.split("/"); + final String m = extractOperators(s); + + final GameState game = player.getGame(); + + // count valid cards in any specified zone/s + if (l[0].startsWith("Valid") && !l[0].contains("Valid ")) { + String[] lparts = l[0].split(" ", 2); + final List vZone = ZoneType.listValueOf(lparts[0].split("Valid")[1]); + String restrictions = l[0].replace(lparts[0] + " ", ""); + final String[] rest = restrictions.split(","); + List cards = game.getCardsIn(vZone); + cards = CardLists.getValidCards(cards, rest, player, source); + return doXMath(cards.size(), m, source); + } + // count valid cards on the battlefield + if (l[0].startsWith("Valid ")) { + final String restrictions = l[0].substring(6); + final String[] rest = restrictions.split(","); + List cardsonbattlefield = game.getCardsIn(ZoneType.Battlefield); + cardsonbattlefield = CardLists.getValidCards(cardsonbattlefield, rest, player, source); + return doXMath(cardsonbattlefield.size(), m, source); + } + + final String[] sq = l[0].split("\\."); + final String value = sq[0]; + + if (value.contains("CardsInHand")) { + return doXMath(player.getCardsIn(ZoneType.Hand).size(), m, source); + } + + if (value.contains("DomainPlayer")) { + int n = 0; final List someCards = new ArrayList(); - someCards.addAll(players.get(0).getCardsIn(ZoneType.Battlefield)); + someCards.addAll(player.getCardsIn(ZoneType.Battlefield)); final String[] basic = { "Forest", "Plains", "Mountain", "Island", "Swamp" }; for (int i = 0; i < basic.length; i++) { @@ -1002,118 +1012,74 @@ public class CardFactoryUtil { return doXMath(n, m, source); } - if (sq[0].contains("CardsInLibrary")) { - if (players.size() > 0) { - return doXMath(players.get(0).getCardsIn(ZoneType.Library).size(), m, source); - } + if (value.contains("CardsInLibrary")) { + return doXMath(player.getCardsIn(ZoneType.Library).size(), m, source); } - if (sq[0].contains("CardsInGraveyard")) { - if (players.size() > 0) { - return doXMath(players.get(0).getCardsIn(ZoneType.Graveyard).size(), m, source); - } + if (value.contains("CardsInGraveyard")) { + return doXMath(player.getCardsIn(ZoneType.Graveyard).size(), m, source); } - if (sq[0].contains("LandsInGraveyard")) { - if (players.size() > 0) { - return doXMath(CardLists.getType(players.get(0).getCardsIn(ZoneType.Graveyard), "Land").size(), m, - source); - } + if (value.contains("LandsInGraveyard")) { + return doXMath(CardLists.getType(player.getCardsIn(ZoneType.Graveyard), "Land").size(), m, source); } - if (sq[0].contains("CreaturesInPlay")) { - if (players.size() > 0) { - return doXMath(players.get(0).getCreaturesInPlay().size(), m, source); - } + if (value.contains("CreaturesInPlay")) { + return doXMath(player.getCreaturesInPlay().size(), m, source); } - if (sq[0].contains("CardsInPlay")) { - if (players.size() > 0) { - return doXMath(players.get(0).getCardsIn(ZoneType.Battlefield).size(), m, source); - } + if (value.contains("CardsInPlay")) { + return doXMath(player.getCardsIn(ZoneType.Battlefield).size(), m, source); } - if (sq[0].contains("LifeTotal")) { - if (players.size() > 0) { - return doXMath(players.get(0).getLife(), m, source); - } + if (value.contains("LifeTotal")) { + return doXMath(player.getLife(), m, source); } - if (sq[0].contains("LifeLostThisTurn")) { - if (players.size() > 0) { - return doXMath(players.get(0).getLifeLostThisTurn(), m, source); - } + if (value.contains("LifeLostThisTurn")) { + return doXMath(player.getLifeLostThisTurn(), m, source); } - if (sq[0].contains("LifeGainedThisTurn")) { - if (players.size() > 0) { - return doXMath(players.get(0).getLifeGainedThisTurn(), m, source); - } + if (value.contains("LifeGainedThisTurn")) { + return doXMath(player.getLifeGainedThisTurn(), m, source); } - if (sq[0].contains("PoisonCounters")) { - if (players.size() > 0) { - return doXMath(players.get(0).getPoisonCounters(), m, source); - } + if (value.contains("PoisonCounters")) { + return doXMath(player.getPoisonCounters(), m, source); } - if (sq[0].contains("TopOfLibraryCMC")) { - if (players.size() > 0) { - return doXMath(Aggregates.sum(players.get(0).getCardsIn(ZoneType.Library, 1), CardPredicates.Accessors.fnGetCmc), - m, source); - } + if (value.contains("TopOfLibraryCMC")) { + return doXMath(Aggregates.sum(player.getCardsIn(ZoneType.Library, 1), CardPredicates.Accessors.fnGetCmc), m, source); } - if (sq[0].contains("LandsPlayed")) { - if (players.size() > 0) { - return doXMath(players.get(0).getNumLandsPlayed(), m, source); - } + if (value.contains("LandsPlayed")) { + return doXMath(player.getNumLandsPlayed(), m, source); } - if (sq[0].contains("CardsDrawn")) { - if (players.size() > 0) { - return doXMath(players.get(0).getNumDrawnThisTurn(), m, source); - } + if (value.contains("CardsDrawn")) { + return doXMath(player.getNumDrawnThisTurn(), m, source); } - if (sq[0].contains("CardsDiscardedThisTurn")) { - if (players.size() > 0) { - return doXMath(players.get(0).getNumDiscardedThisTurn(), m, source); - } + if (value.contains("CardsDiscardedThisTurn")) { + return doXMath(player.getNumDiscardedThisTurn(), m, source); } - if (sq[0].contains("AttackersDeclared")) { - if (players.size() > 0) { - return doXMath(players.get(0).getAttackersDeclaredThisTurn(), m, source); - } + if (value.contains("AttackersDeclared")) { + return doXMath(player.getAttackersDeclaredThisTurn(), m, source); } - if (sq[0].equals("DamageDoneToPlayerBy")) { - if (players.size() > 0) { - return doXMath(source.getDamageDoneToPlayerBy(players.get(0).getName()), m, source); - } + if (value.equals("DamageDoneToPlayerBy")) { + return doXMath(source.getDamageDoneToPlayerBy(player.getName()), m, source); } - if (sq[0].contains("DamageToOppsThisTurn")) { - if (players.size() > 0) { - int oppDmg = 0; - for (Player opp : players.get(0).getOpponents()) { - oppDmg += opp.getAssignedDamage(); - } - return doXMath(oppDmg, m, source); + if (value.contains("DamageToOppsThisTurn")) { + int oppDmg = 0; + for (Player opp : player.getOpponents()) { + oppDmg += opp.getAssignedDamage(); } + return doXMath(oppDmg, m, source); } - - if (sq[0].contains("DamageThisTurn")) { - if (players.size() > 0) { - int totDmg = 0; - for (Player p : players) { - totDmg += p.getAssignedDamage(); - } - return doXMath(totDmg, m, source); - } - } - - return doXMath(n, m, source); + + return doXMath(0, m, source); } /** @@ -1323,12 +1289,14 @@ public class CardFactoryUtil { if (sq[0].contains("YourPoisonCounters")) return doXMath(cc.getPoisonCounters(), m, c); if (sq[0].contains("OppPoisonCounters")) return doXMath(ccOpp.getPoisonCounters(), m, c); - if (sq[0].contains("OppDamageThisTurn")) return doXMath(cc.getOpponent().getAssignedDamage(), m, c); + if (sq[0].contains("OppDamageThisTurn")) return doXMath(ccOpp.getAssignedDamage(), m, c); if (sq[0].contains("YourDamageThisTurn")) return doXMath(cc.getAssignedDamage(), m, c); // Count$YourTypeDamageThisTurn Type if (sq[0].contains("YourTypeDamageThisTurn")) return doXMath(cc.getAssignedDamage(sq[0].split(" ")[1]), m, c); + if (sq[0].contains("YourLandsPlayed")) return doXMath(cc.getNumLandsPlayed(), m, c); + if (sq[0].contains("OppLandsPlayed")) return doXMath(ccOpp.getNumLandsPlayed(), m, c); // Count$HighestLifeTotal diff --git a/src/main/java/forge/card/trigger/Trigger.java b/src/main/java/forge/card/trigger/Trigger.java index 2f3ce456e1d..727c0a64a39 100644 --- a/src/main/java/forge/card/trigger/Trigger.java +++ b/src/main/java/forge/card/trigger/Trigger.java @@ -273,7 +273,7 @@ public abstract class Trigger extends TriggerReplacementBase { * a {@link java.util.HashMap} object. * @return a boolean. */ - public final boolean requirementsCheck(GameState game, final Map runParams2) { + public final boolean requirementsCheck(GameState game, final Map runParams) { if (this.getMapParams().containsKey("APlayerHasMoreLifeThanEachOther")) { int highestLife = -50; // Negative base just in case a few Lich's or Platinum Angels are running around @@ -318,8 +318,11 @@ public abstract class Trigger extends TriggerReplacementBase { if ( !meetsCommonRequirements(getMapParams())) return false; + if ( !meetsRequirementsOnTriggeredObjects(runParams) ) + return false; + if ("True".equals(getMapParams().get("EvolveCondition"))) { - final Card moved = (Card) runParams2.get("Card"); + final Card moved = (Card) runParams.get("Card"); if (moved == null) { return false; // final StringBuilder sb = new StringBuilder(); @@ -335,7 +338,7 @@ public abstract class Trigger extends TriggerReplacementBase { String condition = getMapParams().get("Condition"); if( "AltCost".equals(condition) ) { - final Card moved = (Card) runParams2.get("Card"); + final Card moved = (Card) runParams.get("Card"); if( null != moved && !moved.isOptionalCostPaid(OptionalCost.AltCost)) return false; } @@ -344,6 +347,12 @@ public abstract class Trigger extends TriggerReplacementBase { return true; } + + private boolean meetsRequirementsOnTriggeredObjects(Map runParams) { + // Check number of lands ETB this turn on triggered card's controller + return true; + } + /** *

* isSecondary.