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