move counters no longer uses gui

This commit is contained in:
Maxmtg
2013-12-06 06:10:51 +00:00
parent b431315e88
commit 51a37e896d
6 changed files with 49 additions and 59 deletions

View File

@@ -3,13 +3,12 @@ package forge.game.ability.effects;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CounterType; import forge.game.card.CounterType;
import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.gui.GuiChoose;
public class CountersMoveEffect extends SpellAbilityEffect { public class CountersMoveEffect extends SpellAbilityEffect {
@@ -51,9 +50,9 @@ public class CountersMoveEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
final Card host = sa.getSourceCard(); final Card host = sa.getSourceCard();
final String counterName = sa.getParam("CounterType"); final String counterName = sa.getParam("CounterType");
int amount = 0; int cntToMove = 0;
if (!sa.getParam("CounterNum").equals("All")) { if (!sa.getParam("CounterNum").equals("All")) {
amount = AbilityUtils.calculateAmount(host, sa.getParam("CounterNum"), sa); cntToMove = AbilityUtils.calculateAmount(host, sa.getParam("CounterNum"), sa);
} }
CounterType cType = null; CounterType cType = null;
@@ -72,7 +71,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
source = srcCards.get(0); source = srcCards.get(0);
} }
if (sa.getParam("CounterNum").equals("All")) { if (sa.getParam("CounterNum").equals("All")) {
amount = source.getCounters(cType); cntToMove = source.getCounters(cType);
} }
List<Card> tgtCards = getDefinedCardsOrTargeted(sa); List<Card> tgtCards = getDefinedCardsOrTargeted(sa);
@@ -84,70 +83,42 @@ public class CountersMoveEffect extends SpellAbilityEffect {
} }
if (!"Any".matches(counterName)) { if (!"Any".matches(counterName)) {
if (dest.canReceiveCounters(cType) if (dest.canReceiveCounters(cType)
&& source.getCounters(cType) >= amount) { && source.getCounters(cType) >= cntToMove) {
dest.addCounter(cType, amount, true); dest.addCounter(cType, cntToMove, true);
source.subtractCounter(cType, amount); source.subtractCounter(cType, cntToMove);
} }
} else { } else {
if (dest.hasKeyword("CARDNAME can't have counters placed on it.")) { if (dest.hasKeyword("CARDNAME can't have counters placed on it.")) {
return; return;
} }
boolean check = false; boolean canPlaceM1M1Counters = true;
for (final Card c : dest.getController().getCreaturesInPlay()) {//Melira, Sylvok Outcast for (final Card c : dest.getController().getCreaturesInPlay()) {//Melira, Sylvok Outcast
if (c.hasKeyword("Creatures you control can't have -1/-1 counters placed on them.")) { if (c.hasKeyword("Creatures you control can't have -1/-1 counters placed on them.")) {
check = true; canPlaceM1M1Counters = false;
} }
} }
while (amount > 0 && source.hasCounters()) { while (cntToMove > 0 && source.hasCounters()) {
final Map<CounterType, Integer> tgtCounters = source.getCounters(); final Map<CounterType, Integer> tgtCounters = source.getCounters();
CounterType chosenType = null;
int chosenAmount;
if (sa.getActivatingPlayer().isHuman()) {
final ArrayList<CounterType> typeChoices = new ArrayList<CounterType>(); final ArrayList<CounterType> typeChoices = new ArrayList<CounterType>();
// get types of counters // get types of counters
for (CounterType key : tgtCounters.keySet()) { for (CounterType ct : tgtCounters.keySet()) {
if (tgtCounters.get(key) > 0 && !(key == CounterType.M1M1 && check)) { if (ct != CounterType.M1M1 || canPlaceM1M1Counters) {
typeChoices.add(key); typeChoices.add(ct);
} }
} }
if (typeChoices.isEmpty()) { if (typeChoices.isEmpty()) {
return; return;
} }
if (typeChoices.size() > 1) {
String prompt = "Select type counters to remove"; PlayerController pc = sa.getActivatingPlayer().getController();
chosenType = GuiChoose.one(prompt, typeChoices); CounterType chosenType = pc.chooseCounterType(typeChoices, sa, "Select type counters to remove");
} else {
chosenType = typeChoices.get(0);
}
chosenAmount = tgtCounters.get(chosenType);
if (chosenAmount > amount) {
chosenAmount = amount;
}
// make list of amount choices
if (chosenAmount > 1) {
final List<Integer> choices = new ArrayList<Integer>();
for (int i = 1; i <= chosenAmount; i++) {
choices.add(Integer.valueOf(i));
}
String prompt = "Select the number of " + chosenType.getName() + " counters to remove"; String prompt = "Select the number of " + chosenType.getName() + " counters to remove";
chosenAmount = GuiChoose.one(prompt, choices); int chosenAmount = pc.chooseNumber(sa, prompt, 1, Math.min(tgtCounters.get(chosenType), cntToMove));
}
} else {
for (Object key : tgtCounters.keySet()) {
if (tgtCounters.get(key) > 0) {
chosenType = (CounterType) key;
break;
}
}
// subtract all of selected type
chosenAmount = tgtCounters.get(chosenType);
if (chosenAmount > amount) {
chosenAmount = amount;
}
}
dest.addCounter(chosenType, chosenAmount, true); dest.addCounter(chosenType, chosenAmount, true);
source.subtractCounter(chosenType, chosenAmount); source.subtractCounter(chosenType, chosenAmount);
amount -= chosenAmount; cntToMove -= chosenAmount;
} }
} }
} }

View File

@@ -179,4 +179,5 @@ public abstract class PlayerController {
public abstract PaperCard chooseSinglePaperCard(SpellAbility sa, String message, Predicate<PaperCard> cpp, String name); public abstract PaperCard chooseSinglePaperCard(SpellAbility sa, String message, Predicate<PaperCard> cpp, String name);
public abstract List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options); public abstract List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options);
public abstract CounterType chooseCounterType(Collection<CounterType> options, SpellAbility sa, String prompt);
} }

View File

@@ -15,6 +15,7 @@ import org.apache.commons.lang3.tuple.Pair;
import com.esotericsoftware.minlog.Log; import com.esotericsoftware.minlog.Log;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.ai.AiBlockController; import forge.ai.AiBlockController;
@@ -515,4 +516,10 @@ public class PlayerControllerAi extends PlayerController {
public List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options) { public List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options) {
return ComputerUtilCard.chooseColor(sa, min, max, options); return ComputerUtilCard.chooseColor(sa, min, max, options);
} }
@Override
public CounterType chooseCounterType(Collection<CounterType> options, SpellAbility sa, String prompt) {
// may write a smarter AI if you need to (with calls to AI-clas for given API ability)
return Iterables.getFirst(options, null);
}
} }

View File

@@ -370,9 +370,9 @@ public class PlayerControllerHuman extends PlayerController {
@Override @Override
public int chooseNumber(SpellAbility sa, String title, int min, int max) { public int chooseNumber(SpellAbility sa, String title, int min, int max) {
final Integer[] choices = new Integer[max + 1]; final Integer[] choices = new Integer[max + 1 - min];
for (int i = min; i <= max; i++) { for (int i = 0; i <= max - min; i++) {
choices[i] = Integer.valueOf(i); choices[i] = Integer.valueOf(i + min);
} }
return GuiChoose.one(title, choices).intValue(); return GuiChoose.one(title, choices).intValue();
} }
@@ -870,4 +870,11 @@ public class PlayerControllerHuman extends PlayerController {
Collections.sort(cards); Collections.sort(cards);
return GuiChoose.one(message, cards); return GuiChoose.one(message, cards);
} }
@Override
public CounterType chooseCounterType(Collection<CounterType> options, SpellAbility sa, String prompt) {
if( options.size() <= 1)
return Iterables.getFirst(options, null);
return GuiChoose.one(prompt, options);
}
} }

View File

@@ -31,7 +31,6 @@ import forge.Singletons;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.card.IUnOpenedProduct; import forge.card.IUnOpenedProduct;
import forge.card.UnOpenedProduct; import forge.card.UnOpenedProduct;
import forge.card.CardEdition.Collection;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.util.TextUtil; import forge.util.TextUtil;

View File

@@ -454,4 +454,9 @@ public class PlayerControllerForTests extends PlayerController {
public List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options) { public List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options) {
throw new UnsupportedOperationException("No idea how a test player controller would choose colors"); throw new UnsupportedOperationException("No idea how a test player controller would choose colors");
} }
@Override
public CounterType chooseCounterType(Collection<CounterType> options, SpellAbility sa, String prompt) {
return Iterables.getFirst(options, CounterType.P1P1);
}
} }