CloneEffect now has own Choices Params and doesn't need ChooseCard anymore

This commit is contained in:
Hanmac
2017-04-22 15:42:05 +00:00
parent 4d88cf1451
commit b8fc526a88
2 changed files with 53 additions and 15 deletions

View File

@@ -1,9 +1,14 @@
package forge.ai.ability; package forge.ai.ability;
import java.util.List;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi; import forge.ai.SpellAbilityAi;
import forge.game.Game; import forge.game.Game;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
@@ -11,8 +16,6 @@ import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions; import forge.game.spellability.TargetRestrictions;
import java.util.List;
public class CloneAi extends SpellAbilityAi { public class CloneAi extends SpellAbilityAi {
@Override @Override
@@ -152,4 +155,34 @@ public class CloneAi extends SpellAbilityAi {
return false; return false;
} }
/*
* (non-Javadoc)
*
* @see forge.ai.SpellAbilityAi#chooseSingleCard(forge.game.player.Player,
* forge.game.spellability.SpellAbility, java.lang.Iterable, boolean,
* forge.game.player.Player)
*/
@Override
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional,
Player targetedPlayer) {
final Card host = sa.getHostCard();
final Player ctrl = host.getController();
final boolean isVesuva = "Vesuva".equals(host.getName());
final String filter = !isVesuva ? "Permanent.YouDontCtrl,Permanent.nonLegendary"
: "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva";
CardCollection newOptions = CardLists.getValidCards(options, filter.split(","), ctrl, host, sa);
if (!newOptions.isEmpty()) {
options = newOptions;
}
Card choice = ComputerUtilCard.getBestAI(options);
if (isVesuva && "Vesuva".equals(choice.getName())) {
choice = null;
}
return choice;
}
} }

View File

@@ -9,20 +9,21 @@ import forge.game.ability.AbilityFactory;
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.CardCollectionView;
import forge.game.card.CardState; import forge.game.card.CardState;
import forge.game.card.CardFactory; import forge.game.card.CardFactory;
import forge.game.card.CardFactoryUtil; import forge.game.card.CardFactoryUtil;
import forge.game.card.CardLists;
import forge.game.card.CardUtil; import forge.game.card.CardUtil;
import forge.game.event.GameEventCardStatsChanged; import forge.game.event.GameEventCardStatsChanged;
import forge.game.player.Player;
import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementEffect;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.staticability.StaticAbility; import forge.game.staticability.StaticAbility;
import forge.game.trigger.Trigger; import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler; import forge.game.trigger.TriggerHandler;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -37,13 +38,12 @@ public class CloneEffect extends SpellAbilityEffect {
Card tgtCard = host; Card tgtCard = host;
Card cardToCopy = host; Card cardToCopy = host;
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (sa.hasParam("Defined")) { if (sa.hasParam("Defined")) {
List<Card> cloneSources = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa); List<Card> cloneSources = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa);
if (!cloneSources.isEmpty()) { if (!cloneSources.isEmpty()) {
cardToCopy = cloneSources.get(0); cardToCopy = cloneSources.get(0);
} }
} else if (tgt != null) { } else if (sa.usesTargeting()) {
cardToCopy = sa.getTargets().getFirstTargetedCard(); cardToCopy = sa.getTargets().getFirstTargetedCard();
} }
@@ -61,19 +61,26 @@ public class CloneEffect extends SpellAbilityEffect {
@Override @Override
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
final Card host = sa.getHostCard(); final Card host = sa.getHostCard();
final Player activator = sa.getActivatingPlayer();
Card tgtCard = host; Card tgtCard = host;
final Map<String, String> origSVars = host.getSVars(); final Map<String, String> origSVars = host.getSVars();
final Game game = sa.getActivatingPlayer().getGame(); final Game game = activator.getGame();
// find cloning source i.e. thing to be copied // find cloning source i.e. thing to be copied
Card cardToCopy = null; Card cardToCopy = null;
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (sa.hasParam("Defined")) { if (sa.hasParam("Choices")) {
CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card ";
cardToCopy = activator.getController().chooseSingleEntityForEffect(choices, sa, title, true);
} else if (sa.hasParam("Defined")) {
List<Card> cloneSources = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa); List<Card> cloneSources = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa);
if (!cloneSources.isEmpty()) { if (!cloneSources.isEmpty()) {
cardToCopy = cloneSources.get(0); cardToCopy = cloneSources.get(0);
} }
} else if (tgt != null) { } else if (sa.usesTargeting()) {
cardToCopy = sa.getTargets().getFirstTargetedCard(); cardToCopy = sa.getTargets().getFirstTargetedCard();
} }
if (cardToCopy == null) { if (cardToCopy == null) {
@@ -228,10 +235,8 @@ public class CloneEffect extends SpellAbilityEffect {
} }
// triggers to add to clone // triggers to add to clone
final List<String> triggers = new ArrayList<String>();
if (sa.hasParam("AddTriggers")) { if (sa.hasParam("AddTriggers")) {
triggers.addAll(Arrays.asList(sa.getParam("AddTriggers").split(","))); for (final String s : Arrays.asList(sa.getParam("AddTriggers").split(","))) {
for (final String s : triggers) {
if (origSVars.containsKey(s)) { if (origSVars.containsKey(s)) {
final String actualTrigger = origSVars.get(s); final String actualTrigger = origSVars.get(s);
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, tgtCard, true); final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, tgtCard, true);
@@ -262,9 +267,9 @@ public class CloneEffect extends SpellAbilityEffect {
} }
// keywords to add to clone // keywords to add to clone
final List<String> keywords = new ArrayList<String>();
if (sa.hasParam("AddKeywords")) { if (sa.hasParam("AddKeywords")) {
keywords.addAll(Arrays.asList(sa.getParam("AddKeywords").split(" & "))); final List<String> keywords = Arrays.asList(sa.getParam("AddKeywords").split(" & "));
// allow SVar substitution for keywords // allow SVar substitution for keywords
for (int i = 0; i < keywords.size(); i++) { for (int i = 0; i < keywords.size(); i++) {
String k = keywords.get(i); String k = keywords.get(i);