diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index c80ed7a58e8..488489664e1 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -1753,7 +1753,7 @@ public class Card extends GameEntity implements Comparable { * @param c * an ArrayList object. */ - public final void setChosenCard(final ArrayList c) { + public final void setChosenCard(final List c) { this.chosenCard = c; } diff --git a/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java b/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java index e22022e2bb0..5b1de90683b 100644 --- a/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java +++ b/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java @@ -39,35 +39,33 @@ public class ChoosePlayerEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { + Player chosen = null; if (p.isHuman()) { // Was if (sa.getActivatingPlayer().isHuman()) but defined player was being // overwritten by activatingPlayer (or controller if no activator was set). // Revert if it causes issues and remove Goblin Festival from card database. - final Object o = GuiChoose.one(choiceDesc, choices); - if (null == o) { - return; - } - final Player chosen = (Player) o; - card.setChosenPlayer(chosen); - + chosen = GuiChoose.one(choiceDesc, choices); } else { if ("Curse".equals(sa.getParam("AILogic"))) { for (Player pc : choices) { if (pc.isOpponentOf(p)) { - card.setChosenPlayer(pc); + chosen = pc; break; } } - if (card.getChosenPlayer() == null) { + if (chosen == null) { System.out.println("No good curse choices. Picking first available: " + choices.get(0)); - card.setChosenPlayer(choices.get(0)); + chosen = choices.get(0); } } else if ("Pump".equals(sa.getParam("AILogic"))) { - card.setChosenPlayer(choices.contains(p) ? p : choices.get(0)); + chosen = choices.contains(p) ? p : choices.get(0); } else { - card.setChosenPlayer(p); + chosen = p; } } + + if( null != chosen ) + card.setChosenPlayer(chosen); } } } diff --git a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java index dee1ecdd19b..836814b3c94 100644 --- a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java +++ b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java @@ -38,7 +38,6 @@ public class ChooseSourceEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card host = sa.getSourceCard(); - final ArrayList chosen = new ArrayList(); final GameState game = sa.getActivatingPlayer().getGame(); final Target tgt = sa.getTarget(); @@ -126,6 +125,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect { final int validAmount = StringUtils.isNumeric(numericAmount) ? Integer.parseInt(numericAmount) : CardFactoryUtil.xCount(host, host.getSVar(numericAmount)); for (final Player p : tgtPlayers) { + final List chosen = new ArrayList(); if ((tgt == null) || p.canBeTargetedBy(sa)) { for (int i = 0; i < validAmount; i++) { if (p.isHuman()) { diff --git a/src/main/java/forge/card/ability/effects/ShuffleEffect.java b/src/main/java/forge/card/ability/effects/ShuffleEffect.java index eb6fb37486a..8c03948851a 100644 --- a/src/main/java/forge/card/ability/effects/ShuffleEffect.java +++ b/src/main/java/forge/card/ability/effects/ShuffleEffect.java @@ -3,18 +3,15 @@ package forge.card.ability.effects; import java.util.Iterator; import java.util.List; -import forge.Card; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.game.player.Player; -import forge.gui.GuiDialog; public class ShuffleEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - final Card host = sa.getSourceCard(); final boolean optional = sa.hasParam("Optional"); final List tgtPlayers = getTargetPlayers(sa); @@ -23,7 +20,7 @@ public class ShuffleEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { - boolean mustShuffle = !optional || sa.getActivatingPlayer().isComputer() || GuiDialog.confirm(host, "Have " + p + " shuffle?"); + boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, "Have " + p + " shuffle?"); if (mustShuffle) p.shuffle(); } diff --git a/src/main/java/forge/card/ability/effects/UntapEffect.java b/src/main/java/forge/card/ability/effects/UntapEffect.java index 5ec72eafd11..5de3d4e99b9 100644 --- a/src/main/java/forge/card/ability/effects/UntapEffect.java +++ b/src/main/java/forge/card/ability/effects/UntapEffect.java @@ -88,16 +88,10 @@ public class UntapEffect extends SpellAbilityEffect { for( Card c : sc.getSelected() ) c.untap(); } else { - - int count = 0; - while ((list.size() != 0) && (count < num)) { - for (int i = 0; (i < list.size()) && (count < num); i++) { - - final Card c = ComputerUtilCard.getBestLandAI(list); - c.untap(); - list.remove(c); - count++; - } + for (int count = 0; !list.isEmpty() && count < num; count++) { + final Card c = ComputerUtilCard.getBestLandAI(list); + c.untap(); + list.remove(c); } } } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index bfd3c17939e..2f1a63f5df9 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -2751,7 +2751,6 @@ public class CardFactoryUtil { // need to do it this way because I don't know quite how to // make TriggerHandler respect BeforePayMana. if (card.getController().isHuman()) { - final InputSelectCards target = new InputSelectCards(1, 1) { private static final long serialVersionUID = 1981791992623774490L; @Override @@ -3141,54 +3140,46 @@ public class CardFactoryUtil { final String magnitude = k[1]; // final String player = card.getController(); - final int[] numCreatures = new int[1]; - + + final GameState game = card.getGame(); final Command intoPlay = new Command() { private static final long serialVersionUID = -7530312713496897814L; + private void devour(Card eater, Card dinner) { + eater.addDevoured(dinner); + game.getAction().sacrifice(dinner, null); + final HashMap runParams = new HashMap(); + runParams.put("Devoured", dinner); + game.getTriggerHandler().runTrigger(TriggerType.Devoured, runParams, false); + } + @Override public void run() { final List creats = card.getController().getCreaturesInPlay(); - final GameState game = card.getGame(); + creats.remove(card); + card.clearDevoured(); // System.out.println("Creats size: " + creats.size()); - card.clearDevoured(); + List selection = new ArrayList(); + if (card.getController().isHuman()) { if (creats.size() > 0) { - final List selection = GuiChoose.order("Devour", "Devouring", -1, creats, null, card); - numCreatures[0] = selection.size(); + selection = GuiChoose.order("Devour", "Devouring", -1, creats, null, card); + } + } else { + for(Card c : creats) { + if ((c.getNetAttack() <= 1) && ((c.getNetAttack() + c.getNetDefense()) <= 3)) + selection.add(c); + } + } - for (Object o : selection) { - Card dinner = (Card) o; - card.addDevoured(dinner); - game.getAction().sacrifice(dinner, null); - final HashMap runParams = new HashMap(); - runParams.put("Devoured", dinner); - card.getController().getGame().getTriggerHandler() - .runTrigger(TriggerType.Devoured, runParams, false); - } - } - } // human - else { - int count = 0; - for (int i = 0; i < creats.size(); i++) { - final Card c = creats.get(i); - if ((c.getNetAttack() <= 1) && ((c.getNetAttack() + c.getNetDefense()) <= 3)) { - card.addDevoured(c); - game.getAction().sacrifice(c, null); - final HashMap runParams = new HashMap(); - runParams.put("Devoured", c); - card.getController().getGame().getTriggerHandler() - .runTrigger(TriggerType.Devoured, runParams, false); - count++; - } - } - numCreatures[0] = count; + for (Card dinner : selection) { + devour(card, dinner); } final int multiplier = magnitude.equals("X") ? AbilityUtils.calculateAmount(card, magnitude, null) : Integer.parseInt(magnitude); - final int totalCounters = numCreatures[0] * multiplier; + final int totalCounters = selection.size() * multiplier; card.addCounter(CounterType.P1P1, totalCounters, true); diff --git a/src/main/java/forge/card/replacement/ReplacementEffect.java b/src/main/java/forge/card/replacement/ReplacementEffect.java index 417a4296e8b..0835769264d 100644 --- a/src/main/java/forge/card/replacement/ReplacementEffect.java +++ b/src/main/java/forge/card/replacement/ReplacementEffect.java @@ -57,7 +57,7 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { * @return true, if is secondary */ public final boolean isSecondary() { - return this.mapParams.containsKey("Secondary"); + return this.getMapParams().containsKey("Secondary"); } /** @@ -67,24 +67,24 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { * @param ai * @return true, if successful */ - public final boolean aiShouldRun(final SpellAbility sa, Player ai) { - if (this.mapParams.containsKey("AICheckSVar")) { + public final static boolean aiShouldRun(final ReplacementEffect effect, final SpellAbility sa, Player ai) { + if (effect.getMapParams().containsKey("AICheckSVar")) { System.out.println("aiShouldRun?" + sa); - final String svarToCheck = this.mapParams.get("AICheckSVar"); + final String svarToCheck = effect.getMapParams().get("AICheckSVar"); String comparator = "GE"; int compareTo = 1; - if (this.mapParams.containsKey("AISVarCompare")) { - final String fullCmp = this.mapParams.get("AISVarCompare"); + if (effect.getMapParams().containsKey("AISVarCompare")) { + final String fullCmp = effect.getMapParams().get("AISVarCompare"); comparator = fullCmp.substring(0, 2); final String strCmpTo = fullCmp.substring(2); try { compareTo = Integer.parseInt(strCmpTo); } catch (final Exception ignored) { if (sa == null) { - compareTo = CardFactoryUtil.xCount(this.hostCard, this.hostCard.getSVar(strCmpTo)); + compareTo = CardFactoryUtil.xCount(effect.hostCard, effect.hostCard.getSVar(strCmpTo)); } else { - compareTo = AbilityUtils.calculateAmount(this.hostCard, this.hostCard.getSVar(strCmpTo), sa); + compareTo = AbilityUtils.calculateAmount(effect.hostCard, effect.hostCard.getSVar(strCmpTo), sa); } } } @@ -92,9 +92,9 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { int left = 0; if (sa == null) { - left = CardFactoryUtil.xCount(this.hostCard, this.hostCard.getSVar(svarToCheck)); + left = CardFactoryUtil.xCount(effect.hostCard, effect.hostCard.getSVar(svarToCheck)); } else { - left = AbilityUtils.calculateAmount(this.hostCard, svarToCheck, sa); + left = AbilityUtils.calculateAmount(effect.hostCard, svarToCheck, sa); } System.out.println("aiShouldRun?" + left + comparator + compareTo); if (Expressions.compare(left, comparator, compareTo)) { diff --git a/src/main/java/forge/card/replacement/ReplacementHandler.java b/src/main/java/forge/card/replacement/ReplacementHandler.java index 5196fdbf2f4..761a9ef0e7c 100644 --- a/src/main/java/forge/card/replacement/ReplacementHandler.java +++ b/src/main/java/forge/card/replacement/ReplacementHandler.java @@ -33,7 +33,6 @@ import forge.game.player.HumanPlay; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; -import forge.gui.GuiDialog; import forge.util.FileSection; /** @@ -213,20 +212,11 @@ public class ReplacementHandler { mapParams.get("OptionalDecider"), effectSA).get(0); } - if (optDecider.isHuman()) { - final StringBuilder buildQuestion = new StringBuilder("Apply replacement effect of "); - buildQuestion.append(replacementEffect.getHostCard()); - buildQuestion.append("?\r\n("); - buildQuestion.append(replacementEffect.toString().replace("CARDNAME", replacementEffect.getHostCard().getName())); - buildQuestion.append(")"); - if (!GuiDialog.confirm(replacementEffect.getHostCard(), buildQuestion.toString())) { - return ReplacementResult.NotReplaced; - } - } else { - // AI-logic - if (!replacementEffect.aiShouldRun(effectSA, optDecider)) { - return ReplacementResult.NotReplaced; - } + String effectDesc = replacementEffect.toString().replace("CARDNAME", replacementEffect.getHostCard().getName()); + final String question = String.format("Apply replacement effect of %s?\r\n(%s)", replacementEffect.getHostCard(), effectDesc); + boolean confirmed = optDecider.getController().confirmReplacementEffect(replacementEffect, effectSA, question); + if (!confirmed) { + return ReplacementResult.NotReplaced; } } diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index 95a7366fe82..7a13070b94a 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -733,6 +733,8 @@ public class AiController { AbilitySub subAb = sa.getSubAbility(); return subAb != null && subAb.getAi().chkDrawbackWithSubs(player, subAb); + case Shuffle: // ai could analyze parameter denoting the player to shuffle + return true; default: } diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 2a4e0a8c505..4fff5103646 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -10,6 +10,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import forge.Card; import forge.GameEntity; import forge.card.mana.Mana; +import forge.card.replacement.ReplacementEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.control.input.Input; @@ -137,4 +138,5 @@ public abstract class PlayerController { public abstract Mana chooseManaFromPool(List manaChoices); public abstract String chooseSomeType(String kindOfType, String aiLogic, List validTypes, List invalidTypes); + public abstract boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, String question); } diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index 8d00855420c..e4b92c9faaf 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -15,6 +15,7 @@ import forge.CardLists; import forge.CardPredicates; import forge.GameEntity; import forge.card.mana.Mana; +import forge.card.replacement.ReplacementEffect; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; @@ -278,5 +279,13 @@ public class PlayerControllerAi extends PlayerController { return ComputerUtil.chooseSomeType(player, kindOfType, aiLogic, invalidTypes); } + /* (non-Javadoc) + * @see forge.game.player.PlayerController#confirmReplacementEffect(forge.card.replacement.ReplacementEffect, forge.card.spellability.SpellAbility, java.lang.String) + */ + @Override + public boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, String question) { + return ReplacementEffect.aiShouldRun(replacementEffect, effectSA, player); + } + } diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 6aa7351c07c..50efced2318 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -15,6 +15,7 @@ import forge.Card; import forge.FThreads; import forge.GameEntity; import forge.card.mana.Mana; +import forge.card.replacement.ReplacementEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.card.spellability.TargetSelection; @@ -458,4 +459,12 @@ public class PlayerControllerHuman extends PlayerController { return GuiChoose.one("Choose a " + kindOfType.toLowerCase() + " type", validTypes); } + /* (non-Javadoc) + * @see forge.game.player.PlayerController#confirmReplacementEffect(forge.card.replacement.ReplacementEffect, forge.card.spellability.SpellAbility, java.lang.String) + */ + @Override + public boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, String question) { + return GuiDialog.confirm(replacementEffect.getHostCard(), question); + } + }