From 6f42fcdc2603a5973292e7c646fe6d2788b05fb5 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Tue, 24 May 2022 22:36:57 +0200 Subject: [PATCH] Make charm choices for triggers more like other SA --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 14 ++++++-------- .../src/main/java/forge/ai/PlayerControllerAi.java | 5 +++++ .../src/main/java/forge/ai/ability/CharmAi.java | 9 --------- .../src/main/java/forge/game/zone/MagicStack.java | 11 ----------- .../src/main/java/forge/player/HumanPlay.java | 14 ++++++-------- 5 files changed, 17 insertions(+), 36 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 83520cd8c55..5aeb2b21e7c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -131,10 +131,9 @@ public class ComputerUtil { sa = GameActionUtil.addExtraKeywordCost(sa); - if (sa.getApi() == ApiType.Charm && !sa.isWrapper()) { - if (!CharmEffect.makeChoices(sa)) { - return false; - } + if (sa.getApi() == ApiType.Charm && !sa.isCopied() && !CharmEffect.makeChoices(sa)) { + // 603.3c If no mode is chosen, the ability is removed from the stack. + return false; } if (chooseTargets != null) { chooseTargets.run(); @@ -295,10 +294,9 @@ public class ComputerUtil { if (newSA.isSpell() && !source.isCopiedSpell()) { newSA.setHostCard(game.getAction().moveToStack(source, newSA)); - if (newSA.getApi() == ApiType.Charm && !newSA.isWrapper()) { - if (!CharmEffect.makeChoices(newSA)) { - return false; - } + if (newSA.getApi() == ApiType.Charm && !sa.isCopied() && !CharmEffect.makeChoices(newSA)) { + // 603.3c If no mode is chosen, the ability is removed from the stack. + return false; } } diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 990ab51e3df..4d944408df0 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -34,6 +34,7 @@ import forge.game.GameObject; import forge.game.GameType; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; +import forge.game.ability.effects.CharmEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; @@ -1064,6 +1065,10 @@ public class PlayerControllerAi extends PlayerController { } private boolean prepareSingleSa(final Card host, final SpellAbility sa, boolean isMandatory) { + if (sa.getApi() == ApiType.Charm && !sa.isCopied() && !CharmEffect.makeChoices(sa)) { + // 603.3c If no mode is chosen, the ability is removed from the stack. + return false; + } if (sa.hasParam("TargetingPlayer")) { Player targetingPlayer = AbilityUtils.getDefinedPlayers(host, sa.getParam("TargetingPlayer"), sa).get(0); sa.setTargetingPlayer(targetingPlayer); diff --git a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java index a78406df498..15dc3b6ad26 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java @@ -255,15 +255,6 @@ public class CharmAi extends SpellAbilityAi { return Aggregates.random(opponents); } - @Override - protected boolean doTriggerAINoCost(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { - // already done by chooseOrderOfSimultaneousStackEntry - if (sa.getChosenList() != null) { - return true; - } - return super.doTriggerAINoCost(aiPlayer, sa, mandatory); - } - @Override public boolean chkDrawbackWithSubs(Player aiPlayer, AbilitySub ab) { // choices were already targeted 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 48efbd76acd..f81487fd80c 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -41,7 +41,6 @@ import forge.game.GameObject; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; -import forge.game.ability.effects.CharmEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardUtil; @@ -826,19 +825,10 @@ public class MagicStack /* extends MyObservable */ implements Iterable activePlayerSAs = Lists.newArrayList(); - final List failedSAs = Lists.newArrayList(); for (int i = 0; i < simultaneousStackEntryList.size(); i++) { SpellAbility sa = simultaneousStackEntryList.get(i); Player activator = sa.getActivatingPlayer(); - if (sa.getApi() == ApiType.Charm) { - if (!CharmEffect.makeChoices(sa)) { - // 603.3c If no mode is chosen, the ability is removed from the stack. - failedSAs.add(sa); - continue; - } - } - if (activator == null) { if (sa.getHostCard().getController().equals(activePlayer)) { activePlayerSAs.add(sa); @@ -850,7 +840,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable