diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index b517c913fc5..cd23b2b8bae 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -1,11 +1,9 @@ package forge.game.ability.effects; -import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import forge.ai.ComputerUtilCard; import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaCostShard; @@ -19,7 +17,6 @@ import forge.game.player.Player; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; -import forge.game.zone.ZoneType; public class ManaEffect extends SpellAbilityEffect { @@ -45,59 +42,32 @@ public class ManaEffect extends SpellAbilityEffect { int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(card, sa.getParam("Amount"), sa) : 1; if (tgt == null || p.canBeTargetedBy(sa)) { Player activator = sa.getActivatingPlayer(); - // AI color choice is set in ComputerUtils so only human players need to make a choice - if (activator.isHuman()) { - //String colorsNeeded = abMana.getExpressChoice(); - String[] colorsProduced = abMana.getComboColors().split(" "); - - - final StringBuilder choiceString = new StringBuilder(); - ColorSet colorOptions = null; - if (!abMana.isAnyMana()) { - colorOptions = ColorSet.fromNames(colorsProduced); - } - else { - colorOptions = ColorSet.fromNames(MagicColor.Constant.ONLY_COLORS); - } - for (int nMana = 1; nMana <= amount; nMana++) { - String choice = ""; - byte chosenColor = activator.getController().chooseColor("Select Mana to Produce", sa, colorOptions); - if (chosenColor == 0) { - final StringBuilder sb = new StringBuilder(); - sb.append("AbilityFactoryMana::manaResolve() - Human color mana choice is empty for "); - sb.append(card.getName()); - throw new RuntimeException(sb.toString()); - } else { - choice = MagicColor.toShortString(chosenColor); - if (nMana != 1) { - choiceString.append(" "); - } - choiceString.append(choice); - } - } - abMana.setExpressChoice(choiceString.toString()); + //String colorsNeeded = abMana.getExpressChoice(); + String[] colorsProduced = abMana.getComboColors().split(" "); + + + final StringBuilder choiceString = new StringBuilder(); + ColorSet colorOptions = null; + if (!abMana.isAnyMana()) { + colorOptions = ColorSet.fromNames(colorsProduced); } else { - // TODO: Add some logic for AI choice (ArsenalNut 2012/09/16) - if (!sa.hasParam("AILogic") || sa.getParam("AILogic").equals("MostProminentInComputerHand")) { - String chosen = MagicColor.Constant.BLACK; - List hand = new ArrayList(activator.getCardsIn(ZoneType.Hand)); - hand.addAll(activator.getCardsIn(ZoneType.Stack)); - chosen = ComputerUtilCard.getMostProminentColor(hand); - if (chosen.equals("")) { - chosen = MagicColor.Constant.BLACK; - } - game.action.nofityOfValue(sa, card, "Computer picked" + chosen, activator); - String manaString = ""; - for (int i = 0; i < amount; i++) { - manaString = manaString + MagicColor.toShortString(chosen) + " "; - } - abMana.setExpressChoice(manaString); - } - if (abMana.getExpressChoice().isEmpty() && amount > 0) { - System.out.println("AbilityFactoryMana::manaResolve() - combo mana color choice is empty for " + card.getName()); - } + colorOptions = ColorSet.fromNames(MagicColor.Constant.ONLY_COLORS); } + for (int nMana = 1; nMana <= amount; nMana++) { + String choice = ""; + byte chosenColor = activator.getController().chooseColor("Select Mana to Produce", sa, colorOptions); + if (chosenColor == 0) + throw new RuntimeException("AbilityFactoryMana::manaResolve() - " + activator + " color mana choice is empty for " + card.getName()); + + choice = MagicColor.toShortString(chosenColor); + if (nMana != 1) { + choiceString.append(" "); + } + choiceString.append(choice); + } + game.action.nofityOfValue(sa, card, activator + " picked" + choiceString, activator); + abMana.setExpressChoice(choiceString.toString()); } } } @@ -106,56 +76,25 @@ public class ManaEffect extends SpellAbilityEffect { if (tgt == null || p.canBeTargetedBy(sa)) { Player act = sa.getActivatingPlayer(); // AI color choice is set in ComputerUtils so only human players need to make a choice - if (act.isHuman()) { - String colorsNeeded = abMana.getExpressChoice(); - String choice = ""; - if (colorsNeeded.length() == 1) { - choice = colorsNeeded; - } - else { - ColorSet colorMenu = null; - if (colorsNeeded.length() > 1 && colorsNeeded.length() < 5) { - byte mask = 0; - //loop through colors to make menu - for (int nChar = 0; nChar < colorsNeeded.length(); nChar++) { - mask |= forge.card.MagicColor.fromName(colorsNeeded.substring(nChar, nChar + 1)); - } - colorMenu = ColorSet.fromMask(mask); - } - else { - colorMenu = ColorSet.fromNames(MagicColor.Constant.ONLY_COLORS); - } - byte val = act.getController().chooseColor("Select Mana to Produce", sa, colorMenu); - if (0 == val) { - final StringBuilder sb = new StringBuilder(); - sb.append("AbilityFactoryMana::manaResolve() - Human color mana choice is empty for "); - sb.append(card.getName()); - throw new RuntimeException(sb.toString()); - } - choice = MagicColor.toShortString(val); - } - abMana.setExpressChoice(choice); + + String colorsNeeded = abMana.getExpressChoice(); + String choice = ""; + + ColorSet colorMenu = null; + byte mask = 0; + //loop through colors to make menu + for (int nChar = 0; nChar < colorsNeeded.length(); nChar++) { + mask |= MagicColor.fromName(colorsNeeded.charAt(nChar)); } - else { - if (abMana.getExpressChoice().isEmpty()) { - final String logic = sa.hasParam("AILogic") ? sa.getParam("AILogic") : null; - String chosen = MagicColor.Constant.BLACK; - if (logic == null || logic.equals("MostProminentInComputerHand")) { - chosen = ComputerUtilCard.getMostProminentColor(act.getCardsIn(ZoneType.Hand)); - } - if (chosen.equals("")) { - chosen = MagicColor.Constant.GREEN; - } - game.action.nofityOfValue(sa, card, "Computer picked " + chosen, act); - abMana.setExpressChoice(MagicColor.toShortString(chosen)); - } - if (abMana.getExpressChoice().isEmpty()) { - final StringBuilder sb = new StringBuilder(); - sb.append("AbilityFactoryMana::manaResolve() - any color mana choice is empty for "); - sb.append(card.getName()); - throw new RuntimeException(sb.toString()); - } + colorMenu = ColorSet.fromMask(mask); + byte val = act.getController().chooseColor("Select Mana to Produce", sa, colorMenu); + if (0 == val) { + throw new RuntimeException("AbilityFactoryMana::manaResolve() - " + act + " color mana choice is empty for " + card.getName()); } + choice = MagicColor.toShortString(val); + + game.action.nofityOfValue(sa, card, act + " picked " + choice, act); + abMana.setExpressChoice(choice); } } } @@ -166,30 +105,29 @@ public class ManaEffect extends SpellAbilityEffect { if (type.equals("EnchantedManaCost")) { Card enchanted = card.getEnchantingCard(); - if (enchanted != null ) { - - StringBuilder sb = new StringBuilder(); - int generic = enchanted.getManaCost().getGenericCost(); - if( generic > 0 ) - sb.append(generic); + if (enchanted == null ) + continue; - for (ManaCostShard s : enchanted.getManaCost()) { - ColorSet cs = ColorSet.fromMask(s.getColorMask()); - if(cs.isColorless()) - continue; - sb.append(' '); - if (cs.isMonoColor()) - sb.append(MagicColor.toShortString(s.getColorMask())); - else /* (cs.isMulticolor()) */ { - byte chosenColor = sa.getActivatingPlayer().getController().chooseColor("Choose a single color from " + s.toString(), sa, cs); - sb.append(MagicColor.toShortString(chosenColor)); - } + StringBuilder sb = new StringBuilder(); + int generic = enchanted.getManaCost().getGenericCost(); + if( generic > 0 ) + sb.append(generic); + + for (ManaCostShard s : enchanted.getManaCost()) { + ColorSet cs = ColorSet.fromMask(s.getColorMask()); + if(cs.isColorless()) + continue; + sb.append(' '); + if (cs.isMonoColor()) + sb.append(MagicColor.toShortString(s.getColorMask())); + else /* (cs.isMulticolor()) */ { + byte chosenColor = sa.getActivatingPlayer().getController().chooseColor("Choose a single color from " + s.toString(), sa, cs); + sb.append(MagicColor.toShortString(chosenColor)); } - abMana.setExpressChoice(sb.toString().trim()); } + abMana.setExpressChoice(sb.toString().trim()); } - if (abMana.getExpressChoice().isEmpty()) { System.out.println("AbilityFactoryMana::manaResolve() - special mana effect is empty for " + sa.getSourceCard().getName()); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java index 29f9d837fc7..4e72e9c6560 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java @@ -53,7 +53,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect { * a {@link forge.game.player.Player} object. * @return a {@link java.lang.String} object. */ - private static String generatedReflectedMana(final SpellAbility sa, final Collection colors, final Player player) { + private String generatedReflectedMana(final SpellAbility sa, final Collection colors, final Player player) { // Calculate generated mana here for stack description and resolving final int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("Amount"), sa) : 1; @@ -64,12 +64,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect { } else if (colors.size() == 1) { baseMana = MagicColor.toShortString(colors.iterator().next()); } else { - if (player.isHuman()) { - baseMana = MagicColor.toShortString(player.getController().chooseColor("Select Mana to Produce", sa, ColorSet.fromNames(colors))); - } else { - // AI doesn't really have anything here yet - baseMana = sa.getManaPart().getExpressChoice(); - } + baseMana = MagicColor.toShortString(player.getController().chooseColor("Select Mana to Produce", sa, ColorSet.fromNames(colors))); } final StringBuilder sb = new StringBuilder(); diff --git a/forge-game/src/main/java/forge/game/player/PlayerControllerAi.java b/forge-game/src/main/java/forge/game/player/PlayerControllerAi.java index 799d3292db6..d92b53117c7 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/forge-game/src/main/java/forge/game/player/PlayerControllerAi.java @@ -551,8 +551,14 @@ public class PlayerControllerAi extends PlayerController { @Override public byte chooseColor(String message, SpellAbility sa, ColorSet colors) { - final String c = ComputerUtilCard.getMostProminentColor(player.getCardsIn(ZoneType.Hand)); + // You may switch on sa.getApi() here and use sa.getParam("AILogic") + List hand = new ArrayList(player.getCardsIn(ZoneType.Hand)); + if( sa.getApi() == ApiType.Mana ) + hand.addAll(player.getCardsIn(ZoneType.Stack)); + final String c = ComputerUtilCard.getMostProminentColor(hand); byte chosenColorMask = MagicColor.fromName(c); + + if ((colors.getColor() & chosenColorMask) != 0) { return chosenColorMask; } else { 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 661cf489371..274c8eeb1f2 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -224,21 +224,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable - * removeFromFrozenStack. - *

- * @param sa - * a SpellAbility. - */ - public final void removeFromFrozenStack(SpellAbility sa) { - SpellAbilityStackInstance si = this.getInstanceFromSpellAbility(sa); - this.frozenStack.remove(si); - if (this.frozenStack.isEmpty()) { - clearFrozen(); - } - } - /** *

* setResolving. @@ -484,8 +469,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable