diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index 4f08eb0e0e0..928cdb3b384 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -176,7 +176,7 @@ public abstract class SpellAbilityAi { public final boolean doTriggerNoCostWithSubs(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { - if (!doTriggerAINoCost(aiPlayer, sa, mandatory)) { + if (!doTriggerAINoCost(aiPlayer, sa, mandatory) && !"Always".equals(sa.getParam("AILogic"))) { return false; } final AbilitySub subAb = sa.getSubAbility(); 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 c0f0216ead4..a76e47054e7 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -237,7 +237,6 @@ public class CostAdjustment { } } if (sa.getHostCard().hasKeyword(Keyword.CONVOKE)) { - sa.getHostCard().clearConvoked(); adjustCostByConvokeOrImprovise(cost, sa, false, test); } if (sa.getHostCard().hasKeyword(Keyword.IMPROVISE)) { @@ -262,11 +261,10 @@ public class CostAdjustment { Map convokedCards = sa.getActivatingPlayer().getController().chooseCardsForConvokeOrImprovise(sa, cost.toManaCost(), untappedCards, improvise); - // Convoked creats are tapped here with triggers suppressed, - // Then again when payment is done(In InputPayManaCost.done()) with suppression cleared. + // Convoked creats are tapped here, setting up their taps triggers, + // Then again when payment is done(In InputPayManaCost.done()) with suppression of Taps triggers. // This is to make sure that triggers go off at the right time // AND that you can't use mana tapabilities of convoked creatures to pay the convoked cost. - sa.getActivatingPlayer().getGame().getTriggerHandler().suppressMode(TriggerType.Taps); for (final Entry conv : convokedCards.entrySet()) { sa.addTappedForConvoke(conv.getKey()); cost.decreaseShard(conv.getValue(), 1); @@ -277,7 +275,6 @@ public class CostAdjustment { } } } - sa.getActivatingPlayer().getGame().getTriggerHandler().clearSuppression(TriggerType.Taps); } private static void adjustCostByOffering(final ManaCostBeingPaid cost, final SpellAbility sa) { diff --git a/forge-gui/res/cardsfolder/v/venerated_loxodon.txt b/forge-gui/res/cardsfolder/v/venerated_loxodon.txt index 09f861fd655..0c3e6b477cf 100644 --- a/forge-gui/res/cardsfolder/v/venerated_loxodon.txt +++ b/forge-gui/res/cardsfolder/v/venerated_loxodon.txt @@ -4,6 +4,6 @@ Types:Creature Elephant Cleric PT:4/4 K:Convoke T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounterAll | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on each creature that convoked it. -SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.convoked | CounterType$ P1P1 | CounterNum$ 1 +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.convoked | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ Always DeckHas:Ability$Counters Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of the creature's color.)\nWhen Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it. diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 8e7b84f42e3..cd5ab73816e 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -903,10 +903,12 @@ public class HumanPlay { } } if (ability.getTappedForConvoke() != null) { + activator.getGame().getTriggerHandler().suppressMode(TriggerType.Taps); for (final Card c : ability.getTappedForConvoke()) { c.setTapped(false); c.tap(); } + activator.getGame().getTriggerHandler().clearSuppression(TriggerType.Taps); ability.clearTappedForConvoke(); } return handleOfferingConvokeAndDelve(ability, cardsToDelve, false);