diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index 83dac98417b..0dbad4b828e 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -275,11 +275,9 @@ public class AiBlockController { } if (mode == TriggerType.DamageDone) { - if ((!trigParams.containsKey("ValidSource") - || trigger.matchesValid(attacker, trigParams.get("ValidSource").split(","))) + if (trigger.matchesValidParam("ValidSource", attacker) && attacker.getNetCombatDamage() > 0 - && (!trigParams.containsKey("ValidTarget") - || trigger.matchesValid(combat.getDefenderByAttacker(attacker), trigParams.get("ValidTarget").split(",")))) { + && trigger.matchesValidParam("ValidTarget", combat.getDefenderByAttacker(attacker))) { value += 50; } } else if (mode == TriggerType.AttackerUnblocked) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index d4c79223fc0..9ff0c3f8b41 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2664,15 +2664,15 @@ public class ComputerUtil { for (Trigger trigger : theTriggers) { final Card source = trigger.getHostCard(); + if (trigger.getMode() != TriggerType.SpellCast) { + continue; + } if (!trigger.zonesCheck(game.getZoneOf(source))) { continue; } if (!trigger.requirementsCheck(game)) { continue; } - if (trigger.getMode() != TriggerType.SpellCast) { - continue; - } if (trigger.hasParam("ValidCard")) { if (!card.isValid(trigger.getParam("ValidCard").split(","), source.getController(), source, sa)) { continue; @@ -2724,6 +2724,12 @@ public class ComputerUtil { for (Trigger trigger : theTriggers) { final Card source = trigger.getHostCard(); + if (trigger.getMode() != TriggerType.ChangesZone) { + continue; + } + if (!"Battlefield".equals(trigger.getParam("Destination"))) { + continue; + } if (!trigger.zonesCheck(game.getZoneOf(source))) { continue; } @@ -2734,12 +2740,6 @@ public class ComputerUtil { && AbilityUtils.getDefinedCards(permanent, source.getSVar(trigger.getParam("CheckOnTriggeredCard").split(" ")[0]), null).isEmpty()) { continue; } - if (trigger.getMode() != TriggerType.ChangesZone) { - continue; - } - if (!"Battlefield".equals(trigger.getParam("Destination"))) { - continue; - } if (trigger.hasParam("ValidCard")) { if (!permanent.isValid(trigger.getParam("ValidCard"), source.getController(), source, null)) { continue; diff --git a/forge-core/src/main/java/forge/card/DeckHints.java b/forge-core/src/main/java/forge/card/DeckHints.java index b7d7c96d4ac..a9499445681 100644 --- a/forge-core/src/main/java/forge/card/DeckHints.java +++ b/forge-core/src/main/java/forge/card/DeckHints.java @@ -176,7 +176,14 @@ public class DeckHints { case TYPE: String[] types = param.split("\\|"); for (String t : types) { - Iterables.addAll(cards, getMatchingItems(cardList, CardRulesPredicates.subType(t), PaperCard.FN_GET_RULES)); + Predicate op; + if (t.contains(".")) { + String[] typeParts = t.split("\\."); + op = Predicates.and(CardRulesPredicates.coreType(true, typeParts[0]), CardRulesPredicates.subType(typeParts[1])); + } else { + op = Predicates.or(CardRulesPredicates.coreType(true, t), CardRulesPredicates.subType(t)); + } + Iterables.addAll(cards, getMatchingItems(cardList, op, PaperCard.FN_GET_RULES)); } break; case NONE: diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 52b6b9722bc..0b52009c340 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -356,19 +356,19 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, } CardCollection list = new CardCollection(); if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getCardsIn(presentZone)); + list.addAll(hostController.getCardsIn(presentZone)); } if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { - for (final Player p : this.getHostCard().getController().getOpponents()) { + for (final Player p : hostController.getOpponents()) { list.addAll(p.getCardsIn(presentZone)); } } if (presentPlayer.equals("Any")) { - for (final Player p : this.getHostCard().getController().getAllies()) { + for (final Player p : hostController.getAllies()) { list.addAll(p.getCardsIn(presentZone)); } } - list = CardLists.getValidCards(list, sIsPresent, this.getHostCard().getController(), this.getHostCard(), this); + list = CardLists.getValidCards(list, sIsPresent, hostController, this.getHostCard(), this); final String rightString = presentCompare.substring(2); int right = AbilityUtils.calculateAmount(getHostCard(), rightString, this); @@ -389,15 +389,15 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, } CardCollection list = new CardCollection(); if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { - list.addAll(this.getHostCard().getController().getCardsIn(presentZone)); + list.addAll(hostController.getCardsIn(presentZone)); } if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { - for (final Player p : this.getHostCard().getController().getOpponents()) { + for (final Player p : hostController.getOpponents()) { list.addAll(p.getCardsIn(presentZone)); } } - list = CardLists.getValidCards(list, sIsPresent, this.getHostCard().getController(), this.getHostCard(), this); + list = CardLists.getValidCards(list, sIsPresent, hostController, this.getHostCard(), this); final String rightString = presentCompare.substring(2); int right = AbilityUtils.calculateAmount(getHostCard(), rightString, this); diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java index e71dcb07162..e33ad113279 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java @@ -130,7 +130,7 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { * the run params * @return true, if successful */ - public abstract boolean canReplace (final Map runParams); + public abstract boolean canReplace(final Map runParams); /** *

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 1ebcd148d82..9c3dacfdcb1 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -614,8 +614,8 @@ public class AbilityManaPart implements java.io.Serializable { for (final Player p : g.getPlayers()) { for (final Card crd : p.getAllCards()) { for (final ReplacementEffect replacementEffect : crd.getReplacementEffects()) { - if (replacementEffect.requirementsCheck(g) - && replacementEffect.getMode() == ReplacementType.ProduceMana + if (replacementEffect.getMode() == ReplacementType.ProduceMana + && replacementEffect.requirementsCheck(g) && replacementEffect.canReplace(repParams) && replacementEffect.zonesCheck(g.getZoneOf(crd))) { return true; 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 4cc4345efce..8cc1569dd8a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -272,7 +272,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return true; } - return this.subAbility != null ? this.subAbility.canProduce(s) : false; + return this.subAbility != null && this.subAbility.canProduce(s); } public boolean isManaAbilityFor(SpellAbility saPaidFor, byte colorNeeded) { @@ -290,7 +290,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (mp != null && metConditions() && mp.meetsManaRestrictions(saPaidFor) && mp.abilityProducesManaColor(this, colorNeeded)) { return true; } - return this.subAbility != null ? this.subAbility.isManaAbilityFor(saPaidFor, colorNeeded) : false; + return this.subAbility != null && this.subAbility.isManaAbilityFor(saPaidFor, colorNeeded); } public boolean isManaCannotCounter(SpellAbility saPaidFor) { @@ -298,7 +298,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (mp != null && metConditions() && mp.meetsManaRestrictions(saPaidFor) && mp.cannotCounterPaidWith(saPaidFor)) { return true; } - return this.subAbility != null ? this.subAbility.isManaCannotCounter(saPaidFor) : false; + return this.subAbility != null && this.subAbility.isManaCannotCounter(saPaidFor); } public int amountOfManaGenerated(boolean multiply) { 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 b11b6cfce8e..e6ecb374d02 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -369,7 +369,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { if (getPresentDefined() != null) { list = AbilityUtils.getDefinedObjects(host, getPresentDefined(), sa); } else { - list = new FCollection(game.getCardsIn(getPresentZone())); + list = new FCollection<>(game.getCardsIn(getPresentZone())); } final int left = Iterables.size(Iterables.filter(list, GameObjectPredicates.restriction(getIsPresent().split(","), sa.getActivatingPlayer(), host, sa)));