mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 04:08:01 +00:00
CloneEffect now has own Choices Params and doesn't need ChooseCard anymore
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user