diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java index 97829948e05..eb4ae7458aa 100644 --- a/src/main/java/forge/card/ability/AbilityUtils.java +++ b/src/main/java/forge/card/ability/AbilityUtils.java @@ -1,7 +1,6 @@ package forge.card.ability; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; @@ -14,7 +13,6 @@ import com.google.common.collect.Iterables; import forge.Card; import forge.CardLists; import forge.CardUtil; -import forge.Constant; import forge.CounterType; import forge.ITargetable; import forge.card.cardfactory.CardFactoryUtil; @@ -995,30 +993,6 @@ public class AbilityUtils { return sas; } - public static ArrayList getProtectionList(final SpellAbility sa) { - final ArrayList gains = new ArrayList(); - - final String gainStr = sa.getParam("Gains"); - if (gainStr.equals("Choice")) { - String choices = sa.getParam("Choices"); - - // Replace AnyColor with the 5 colors - if (choices.contains("AnyColor")) { - gains.addAll(Constant.Color.ONLY_COLORS); - choices = choices.replaceAll("AnyColor,?", ""); - } - // Add any remaining choices - if (choices.length() > 0) { - gains.addAll(Arrays.asList(choices.split(","))); - } - } else { - gains.addAll(Arrays.asList(gainStr.split(","))); - } - return gains; - } - - - ///////////////////////////////////////////////////////////////////////////////////// // diff --git a/src/main/java/forge/card/ability/ai/ProtectAi.java b/src/main/java/forge/card/ability/ai/ProtectAi.java index fcbda0067f9..15644c0928c 100644 --- a/src/main/java/forge/card/ability/ai/ProtectAi.java +++ b/src/main/java/forge/card/ability/ai/ProtectAi.java @@ -10,6 +10,7 @@ import forge.CardLists; import forge.Constant; import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityAi; +import forge.card.ability.effects.ProtectEffect; import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.TargetRestrictions; @@ -37,7 +38,7 @@ public class ProtectAi extends SpellAbilityAi { return card.hasKeyword(protection); } - private static boolean hasProtectionFromAny(final Card card, final ArrayList colors) { + private static boolean hasProtectionFromAny(final Card card, final Iterable colors) { boolean protect = false; for (final String color : colors) { protect |= hasProtectionFrom(card, color); @@ -45,16 +46,14 @@ public class ProtectAi extends SpellAbilityAi { return protect; } - private static boolean hasProtectionFromAll(final Card card, final ArrayList colors) { + private static boolean hasProtectionFromAll(final Card card, final Iterable colors) { boolean protect = true; - if (colors.isEmpty()) { - return false; - } - + boolean isEmpty = true; for (final String color : colors) { protect &= hasProtectionFrom(card, color); + isEmpty = false; } - return protect; + return protect && !isEmpty; } /** @@ -67,7 +66,7 @@ public class ProtectAi extends SpellAbilityAi { * @return a {@link forge.CardList} object. */ private static List getProtectCreatures(final Player ai, final SpellAbility sa) { - final ArrayList gains = AbilityUtils.getProtectionList(sa); + final List gains = ProtectEffect.getProtectionList(sa); final Game game = ai.getGame(); final Combat combat = game.getCombat(); @@ -269,14 +268,14 @@ public class ProtectAi extends SpellAbilityAi { pref = CardLists.filter(pref, new Predicate() { @Override public boolean apply(final Card c) { - return !hasProtectionFromAll(c, AbilityUtils.getProtectionList(sa)); + return !hasProtectionFromAll(c, ProtectEffect.getProtectionList(sa)); } }); final List pref2 = CardLists.filterControlledBy(list, ai); pref = CardLists.filter(pref, new Predicate() { @Override public boolean apply(final Card c) { - return !hasProtectionFromAny(c, AbilityUtils.getProtectionList(sa)); + return !hasProtectionFromAny(c, ProtectEffect.getProtectionList(sa)); } }); final List forced = CardLists.filterControlledBy(list, ai); diff --git a/src/main/java/forge/card/ability/effects/ProtectAllEffect.java b/src/main/java/forge/card/ability/effects/ProtectAllEffect.java index 9462e363f41..dff975522a1 100644 --- a/src/main/java/forge/card/ability/effects/ProtectAllEffect.java +++ b/src/main/java/forge/card/ability/effects/ProtectAllEffect.java @@ -16,7 +16,7 @@ import forge.game.Game; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; -import forge.gui.GuiDialog; +import forge.util.Lang; public class ProtectAllEffect extends SpellAbilityEffect { @@ -43,10 +43,11 @@ public class ProtectAllEffect extends SpellAbilityEffect { final Game game = sa.getActivatingPlayer().getGame(); final boolean isChoice = sa.getParam("Gains").contains("Choice"); - final ArrayList choices = AbilityUtils.getProtectionList(sa); - final ArrayList gains = new ArrayList(); + final List choices = ProtectEffect.getProtectionList(sa); + final List gains = new ArrayList(); if (isChoice) { - if (sa.getActivatingPlayer().isHuman()) { + Player choser = sa.getActivatingPlayer(); + if (choser.isHuman()) { final String choice = GuiChoose.one("Choose a protection", choices); if (null == choice) { return; @@ -56,8 +57,8 @@ public class ProtectAllEffect extends SpellAbilityEffect { // TODO - needs improvement final String choice = choices.get(0); gains.add(choice); - GuiDialog.message("Computer chooses " + gains, host.toString()); } + game.getAction().nofityOfValue(sa, choser, Lang.joinHomogenous(gains), choser); } else { if (sa.getParam("Gains").equals("ChosenColor")) { for (final String color : host.getChosenColor()) { diff --git a/src/main/java/forge/card/ability/effects/ProtectEffect.java b/src/main/java/forge/card/ability/effects/ProtectEffect.java index f1415d00cb8..90ab94d207a 100644 --- a/src/main/java/forge/card/ability/effects/ProtectEffect.java +++ b/src/main/java/forge/card/ability/effects/ProtectEffect.java @@ -1,6 +1,7 @@ package forge.card.ability.effects; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; @@ -8,7 +9,7 @@ import forge.Card; import forge.CardLists; import forge.CardUtil; import forge.Command; -import forge.card.ability.AbilityUtils; +import forge.Constant; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.card.spellability.TargetRestrictions; @@ -16,7 +17,7 @@ import forge.game.Game; import forge.game.ai.ComputerUtilCard; import forge.game.player.Player; import forge.gui.GuiChoose; -import forge.gui.GuiDialog; +import forge.util.Lang; public class ProtectEffect extends SpellAbilityEffect { @@ -27,7 +28,7 @@ public class ProtectEffect extends SpellAbilityEffect { @Override protected String getStackDescription(SpellAbility sa) { - final ArrayList gains = AbilityUtils.getProtectionList(sa); + final List gains = getProtectionList(sa); final boolean choose = (sa.hasParam("Choices")) ? true : false; final String joiner = choose ? "or" : "and"; @@ -100,35 +101,32 @@ public class ProtectEffect extends SpellAbilityEffect { final Game game = sa.getActivatingPlayer().getGame(); final boolean isChoice = sa.getParam("Gains").contains("Choice"); - final ArrayList choices = AbilityUtils.getProtectionList(sa); - final ArrayList gains = new ArrayList(); - if (isChoice) { - - if (sa.getActivatingPlayer().isHuman()) { + final List choices = getProtectionList(sa); + final List gains = new ArrayList(); + if (isChoice && !choices.isEmpty()) { + Player choser = sa.getActivatingPlayer(); + + if (choser.isHuman()) { final String choice = GuiChoose.one("Choose a protection", choices); - if (null == choice) { - return; - } gains.add(choice); } else { - Player ai = sa.getActivatingPlayer(); String choice = choices.get(0); final String logic = sa.getParam("AILogic"); if (logic == null || logic.equals("MostProminentHumanCreatures")) { List list = new ArrayList(); - for (Player opp : ai.getOpponents()) { + for (Player opp : choser.getOpponents()) { list.addAll(opp.getCreaturesInPlay()); } if (list.isEmpty()) { - list = CardLists.filterControlledBy(game.getCardsInGame(), ai.getOpponents()); + list = CardLists.filterControlledBy(game.getCardsInGame(), choser.getOpponents()); } if (!list.isEmpty()) { choice = ComputerUtilCard.getMostProminentColor(list); } } gains.add(choice); - GuiDialog.message("Computer chooses " + gains, host.toString()); } + game.getAction().nofityOfValue(sa, choser, Lang.joinHomogenous(gains), choser); } else { if (sa.getParam("Gains").equals("ChosenColor")) { for (final String color : host.getChosenColor()) { @@ -220,4 +218,29 @@ public class ProtectEffect extends SpellAbilityEffect { } } } // protectResolve() + + + public static List getProtectionList(final SpellAbility sa) { + final ArrayList gains = new ArrayList(); + + final String gainStr = sa.getParam("Gains"); + if (gainStr.equals("Choice")) { + String choices = sa.getParam("Choices"); + + // Replace AnyColor with the 5 colors + if (choices.contains("AnyColor")) { + gains.addAll(Constant.Color.ONLY_COLORS); + choices = choices.replaceAll("AnyColor,?", ""); + } + // Add any remaining choices + if (choices.length() > 0) { + gains.addAll(Arrays.asList(choices.split(","))); + } + } else { + gains.addAll(Arrays.asList(gainStr.split(","))); + } + return gains; + } + + } diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 24a18872a81..c643715fc3c 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -158,7 +158,4 @@ public abstract class PlayerController { public abstract boolean chooseBinary(SpellAbility sa, String question, boolean isCoin); public abstract boolean chooseFilpResult(SpellAbility sa, Player flipper, boolean[] results, boolean call); - - - } diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index d9945255526..9faba09eb9e 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -680,6 +680,9 @@ public class PlayerControllerHuman extends PlayerController { return sa.hasParam("NoCall") ? String.format("%s flip comes up %s", Lang.getPossesive(flipper), value) : String.format("%s %s the flip", flipper, Lang.joinVerb(flipper, value)); + case Protection: + String choser = StringUtils.capitalize(mayBeYou(target, player)); + return String.format("%s %s protection from %s", choser, Lang.joinVerb(choser, "choose"), value); default: return String.format("%s effect's value for %s is %s", sa.getSourceCard().getName(), mayBeYou(target, player), value); }