- Fixed targeting issue with copySpellontoStack (part 1).

This commit is contained in:
Sloth
2012-02-02 17:22:45 +00:00
parent aabac6f990
commit fc9209b51f
13 changed files with 213 additions and 81 deletions

View File

@@ -906,7 +906,7 @@ public class MagicStack extends MyObservable {
this.finishResolving(sa, true);
} else if (sa.getAbilityFactory() != null) {
AllZone.getGameLog().add("ResolveStack", sa.getStackDescription(), 2);
AbilityFactory.handleRemembering(sa.getAbilityFactory());
AbilityFactory.handleRemembering(sa, sa.getAbilityFactory());
AbilityFactory.resolve(sa, true);
} else {
AllZone.getGameLog().add("ResolveStack", sa.getStackDescription(), 2);

View File

@@ -53,6 +53,37 @@ public class AbilityFactory {
private Card hostC = null;
/**
* <p>
* Constructor for AbilityFactory.
* </p>
*/
public AbilityFactory() {
}
/**
* <p>
* Constructor for AbilityFactory.
* </p>
*
* @param af
* a AbilityFactory object.
*/
public AbilityFactory(final AbilityFactory af) {
this.abCost = af.getAbCost();
this.abTgt = af.getAbTgt();
this.api = af.getAPI();
this.hasSpDesc = af.hasSpDescription();
this.hasSubAb = af.hasSubAbility();
this.hasValid = af.hasValid();
this.hostC = af.getHostCard();
this.isAb = af.isAbility();
this.isDb = af.isDrawback();
this.isSp = af.isSpell();
this.isTargeted = af.isTargeted();
this.mapParams = af.getMapParams();
}
/**
* <p>
* getHostCard.
@@ -64,6 +95,16 @@ public class AbilityFactory {
return this.hostC;
}
/**
* <p>
* setHostCard.
* </p>
*
*/
public final void setHostCard(Card host) {
this.hostC = host;
}
private HashMap<String, String> mapParams = new HashMap<String, String>();
/**
@@ -164,6 +205,17 @@ public class AbilityFactory {
return this.abTgt;
}
/**
* <p>
* Setter for the field <code>abTgt</code>.
* </p>
* @param target
* a target object.
*/
public final void setAbTgt(Target target) {
this.abTgt = target;
}
/**
* <p>
* isCurse.
@@ -2290,10 +2342,12 @@ public class AbilityFactory {
* handleRemembering.
* </p>
*
* @param sa
* a SpellAbility object.
* @param af
* a {@link forge.card.abilityfactory.AbilityFactory} object.
*/
public static void handleRemembering(final AbilityFactory af) {
public static void handleRemembering(final SpellAbility sa, final AbilityFactory af) {
final HashMap<String, String> params = af.getMapParams();
Card host;
@@ -2307,7 +2361,7 @@ public class AbilityFactory {
host.clearRemembered();
}
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (params.containsKey("RememberTargets")) {
final ArrayList<Object> tgts = (tgt == null) ? new ArrayList<Object>() : tgt.getTargets();

View File

@@ -226,7 +226,7 @@ public class AbilityFactoryAlterLife {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -422,7 +422,7 @@ public class AbilityFactoryAlterLife {
final int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa);
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if ((tgt != null) && !params.containsKey("Defined")) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -613,7 +613,7 @@ public class AbilityFactoryAlterLife {
}
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -819,7 +819,7 @@ public class AbilityFactoryAlterLife {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1024,7 +1024,7 @@ public class AbilityFactoryAlterLife {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1067,7 +1067,7 @@ public class AbilityFactoryAlterLife {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1315,7 +1315,7 @@ public class AbilityFactoryAlterLife {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1514,7 +1514,7 @@ public class AbilityFactoryAlterLife {
final int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa);
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if ((tgt != null) && !params.containsKey("Defined")) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1667,7 +1667,7 @@ public class AbilityFactoryAlterLife {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1780,7 +1780,7 @@ public class AbilityFactoryAlterLife {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if ((tgt != null) && !params.containsKey("Defined")) {
tgtPlayers = tgt.getTargetPlayers();
} else {

View File

@@ -218,7 +218,7 @@ public final class AbilityFactoryAnimate {
sb.append(sa.getSourceCard().getName()).append(" - ");
}
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
ArrayList<Card> tgts;
if (tgt != null) {
tgts = tgt.getTargetCards();
@@ -309,7 +309,7 @@ public final class AbilityFactoryAnimate {
private static boolean animateCanPlayAI(final AbilityFactory af, final SpellAbility sa) {
final HashMap<String, String> params = af.getMapParams();
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
final Card source = sa.getSourceCard();
boolean useAbility = true;
@@ -565,7 +565,7 @@ public final class AbilityFactoryAnimate {
sVars.addAll(Arrays.asList(params.get("sVars").split(",")));
}
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
ArrayList<Card> tgts;
if (tgt != null) {
tgts = tgt.getTargetCards();
@@ -1174,7 +1174,7 @@ public final class AbilityFactoryAnimate {
CardList list;
ArrayList<Player> tgtPlayers = null;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else if (params.containsKey("Defined")) {

View File

@@ -239,7 +239,7 @@ public class AbilityFactoryAttach {
ArrayList<Object> targets;
// Should never allow more than one Attachment per card
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
targets = tgt.getTargets();
} else {
@@ -956,7 +956,7 @@ public class AbilityFactoryAttach {
// Check if there are any valid targets
ArrayList<Object> targets = new ArrayList<Object>();
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt == null) {
targets = AbilityFactory.getDefinedObjects(sa.getSourceCard(), params.get("Defined"), sa);
}
@@ -1000,7 +1000,7 @@ public class AbilityFactoryAttach {
ArrayList<Object> targets;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
targets = tgt.getTargets();
// TODO Remove invalid targets (although more likely this will just

View File

@@ -217,11 +217,11 @@ public final class AbilityFactoryChangeZone {
final HashMap<String, String> params = af.getMapParams();
final List<Constant.Zone> origin = Constant.Zone.listValueOf(params.get("Origin"));
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
// Don't set the zone if it targets a player
if ((tgt != null) && !tgt.canTgtPlayer()) {
af.getAbTgt().setZone(origin);
sa.getTarget().setZone(origin);
}
if (!(sa instanceof AbilitySub)) {
@@ -402,7 +402,7 @@ public final class AbilityFactoryChangeZone {
ArrayList<Player> pDefined = new ArrayList<Player>();
pDefined.add(source.getController());
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if ((tgt != null) && tgt.canTgtPlayer()) {
if (af.isCurse()) {
tgt.addTarget(AllZone.getHumanPlayer());
@@ -471,7 +471,7 @@ public final class AbilityFactoryChangeZone {
private static boolean changeHiddenOriginPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
// if putting cards from hand to library and parent is drawing cards
// make sure this will actually do something:
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if ((tgt != null) && tgt.canTgtPlayer()) {
if (af.isCurse()) {
tgt.addTarget(AllZone.getHumanPlayer());
@@ -515,7 +515,7 @@ public final class AbilityFactoryChangeZone {
}
ArrayList<Player> pDefined;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if ((tgt != null) && tgt.canTgtPlayer()) {
if (af.isCurse()) {
if (AllZone.getHumanPlayer().canBeTargetedBy(sa)) {
@@ -707,8 +707,8 @@ public final class AbilityFactoryChangeZone {
Player chooser = null;
if (params.containsKey("Chooser")) {
final String choose = params.get("Chooser");
if (choose.equals("Targeted") && (af.getAbTgt().getTargetPlayers() != null)) {
chooser = af.getAbTgt().getTargetPlayers().get(0);
if (choose.equals("Targeted") && (sa.getTarget().getTargetPlayers() != null)) {
chooser = sa.getTarget().getTargetPlayers().get(0);
} else {
chooser = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), choose, sa).get(0);
}
@@ -744,7 +744,7 @@ public final class AbilityFactoryChangeZone {
final Card card = sa.getSourceCard();
final boolean defined = params.containsKey("Defined");
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
final ArrayList<Player> players = tgt.getTargetPlayers();
player = players.get(0);
@@ -926,8 +926,8 @@ public final class AbilityFactoryChangeZone {
*/
private static void changeHiddenOriginResolveAI(final AbilityFactory af, final SpellAbility sa, Player player) {
final HashMap<String, String> params = af.getMapParams();
final Target tgt = af.getAbTgt();
final Card card = af.getHostCard();
final Target tgt = sa.getTarget();
final Card card = sa.getSourceCard();
final boolean defined = params.containsKey("Defined");
if (tgt != null) {
@@ -1233,7 +1233,7 @@ public final class AbilityFactoryChangeZone {
// prevent run-away activations - first time will always return true
boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getRestrictions().getNumberTurnActivations());
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
if (!AbilityFactoryChangeZone.changeKnownPreferredTarget(af, sa, false)) {
return false;
@@ -1331,7 +1331,7 @@ public final class AbilityFactoryChangeZone {
final Card source = sa.getSourceCard();
final Zone origin = Zone.smartValueOf(params.get("Origin"));
final Zone destination = Zone.smartValueOf(params.get("Destination"));
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
final AbilitySub abSub = sa.getSubAbility();
String subAPI = "";
@@ -1536,7 +1536,7 @@ public final class AbilityFactoryChangeZone {
final Card source = sa.getSourceCard();
final Zone origin = Zone.smartValueOf(params.get("Origin"));
final Zone destination = Zone.smartValueOf(params.get("Destination"));
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
CardList list = AllZoneUtil.getCardsIn(origin);
list = list.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), source);
@@ -1664,8 +1664,8 @@ public final class AbilityFactoryChangeZone {
final StringBuilder sbTargets = new StringBuilder();
ArrayList<Card> tgts;
if (af.getAbTgt() != null) {
tgts = af.getAbTgt().getTargetCards();
if (sa.getTarget() != null) {
tgts = sa.getTarget().getTargetCards();
} else {
// otherwise add self to list and go from there
tgts = new ArrayList<Card>();
@@ -1675,7 +1675,7 @@ public final class AbilityFactoryChangeZone {
}
for (final Card c : tgts) {
sbTargets.append(" ").append(c.getName());
sbTargets.append(" ").append(c);
}
final String targetname = sbTargets.toString();
@@ -1776,7 +1776,7 @@ public final class AbilityFactoryChangeZone {
private static void changeKnownOriginResolve(final AbilityFactory af, final SpellAbility sa) {
ArrayList<Card> tgtCards;
final HashMap<String, String> params = af.getMapParams();
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
final Player player = sa.getActivatingPlayer();
final Card hostCard = af.getHostCard();
@@ -2081,7 +2081,7 @@ public final class AbilityFactoryChangeZone {
// TODO improve restrictions on when the AI would want to use this
// spBounceAll has some AI we can compare to.
if (origin.equals(Zone.Hand) || origin.equals(Zone.Library)) {
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
if (AllZone.getHumanPlayer().getCardsIn(Zone.Hand).isEmpty()
|| !AllZone.getHumanPlayer().canBeTargetedBy(sa)) {
@@ -2114,7 +2114,7 @@ public final class AbilityFactoryChangeZone {
return false;
}
} else if (origin.equals(Zone.Graveyard)) {
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
if (AllZone.getHumanPlayer().getCardsIn(Zone.Graveyard).isEmpty()
|| !AllZone.getHumanPlayer().canBeTargetedBy(sa)) {
@@ -2247,7 +2247,7 @@ public final class AbilityFactoryChangeZone {
ArrayList<Player> tgtPlayers = null;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else if (params.containsKey("Defined")) {

View File

@@ -195,7 +195,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -291,7 +291,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -557,7 +557,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -636,7 +636,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -840,7 +840,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -919,7 +919,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1089,7 +1089,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1157,7 +1157,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1327,7 +1327,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1415,7 +1415,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1632,7 +1632,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -1700,7 +1700,7 @@ public final class AbilityFactoryChoose {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {

View File

@@ -171,8 +171,7 @@ public final class AbilityFactoryClash {
}
private static boolean clashCanPlayAI(final SpellAbility sa) {
final AbilityFactory af = sa.getAbilityFactory();
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
if (!AllZone.getHumanPlayer().canBeTargetedBy(sa)) {
return false;
@@ -578,7 +577,7 @@ public final class AbilityFactoryClash {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -624,7 +623,7 @@ public final class AbilityFactoryClash {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {

View File

@@ -435,7 +435,7 @@ public final class AbilityFactoryCombat {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -508,7 +508,7 @@ public final class AbilityFactoryCombat {
ArrayList<Player> tgtPlayers;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if ((tgt != null) && !params.containsKey("Defined")) {
tgtPlayers = tgt.getTargetPlayers();
} else {
@@ -651,7 +651,7 @@ public final class AbilityFactoryCombat {
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -721,7 +721,7 @@ public final class AbilityFactoryCombat {
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if ((tgt != null) && !params.containsKey("Defined")) {
tgtCards = tgt.getTargetCards();
} else {
@@ -866,7 +866,7 @@ public final class AbilityFactoryCombat {
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -998,7 +998,7 @@ public final class AbilityFactoryCombat {
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {

View File

@@ -190,7 +190,7 @@ public final class AbilityFactoryCopy {
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -349,7 +349,7 @@ public final class AbilityFactoryCopy {
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -617,7 +617,7 @@ public final class AbilityFactoryCopy {
ArrayList<SpellAbility> tgtSpells;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtSpells = tgt.getTargetSAs();
} else {
@@ -713,7 +713,7 @@ public final class AbilityFactoryCopy {
ArrayList<SpellAbility> tgtSpells;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtSpells = tgt.getTargetSAs();
} else {

View File

@@ -193,7 +193,7 @@ public class AbilityFactoryPermanentState {
sb.append(params.get("UntapType")).append("s");
} else {
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -321,7 +321,7 @@ public class AbilityFactoryPermanentState {
*/
private static boolean untapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
// AI cannot use this properly until he can use SAs during Humans turn
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
boolean randomReturn = true;
@@ -555,7 +555,7 @@ public class AbilityFactoryPermanentState {
private static void untapResolve(final AbilityFactory af, final SpellAbility sa) {
final HashMap<String, String> params = af.getMapParams();
final Card card = sa.getSourceCard();
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
ArrayList<Card> tgtCards = null;
if (params.containsKey("UntapUpTo")) {
@@ -752,7 +752,7 @@ public class AbilityFactoryPermanentState {
sb.append("Tap ");
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -792,7 +792,7 @@ public class AbilityFactoryPermanentState {
// AI cannot use this properly until he can use SAs during Humans turn
final HashMap<String, String> params = af.getMapParams();
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
final Card source = sa.getSourceCard();
final Random r = MyRandom.getRandom();
@@ -891,7 +891,7 @@ public class AbilityFactoryPermanentState {
*/
private static boolean tapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
// AI cannot use this properly until he can use SAs during Humans turn
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
final Card source = sa.getSourceCard();
boolean randomReturn = true;
@@ -1125,7 +1125,7 @@ public class AbilityFactoryPermanentState {
final Card card = sa.getSourceCard();
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -1286,7 +1286,7 @@ public class AbilityFactoryPermanentState {
valid = params.get("ValidCards");
}
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else if (params.containsKey("Defined")) {
@@ -1506,7 +1506,7 @@ public class AbilityFactoryPermanentState {
ArrayList<Player> tgtPlayers = null;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtPlayers = tgt.getTargetPlayers();
} else if (params.containsKey("Defined")) {
@@ -1671,7 +1671,7 @@ public class AbilityFactoryPermanentState {
CardList validTappables = AbilityFactoryPermanentState.getTapAllTargets(valid, source);
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgt.resetTargets();
@@ -1861,7 +1861,7 @@ public class AbilityFactoryPermanentState {
sb.append("Tap or untap ");
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -1901,7 +1901,7 @@ public class AbilityFactoryPermanentState {
// AI cannot use this properly until he can use SAs during Humans turn
final HashMap<String, String> params = af.getMapParams();
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
final Card source = sa.getSourceCard();
final Random r = MyRandom.getRandom();
@@ -1990,7 +1990,7 @@ public class AbilityFactoryPermanentState {
*/
private static boolean tapOrUntapPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
// AI cannot use this properly until he can use SAs during Humans turn
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
final Card source = sa.getSourceCard();
boolean randomReturn = true;
@@ -2194,7 +2194,7 @@ public class AbilityFactoryPermanentState {
}
ArrayList<Card> tgtCards;
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
if (tgt != null) {
tgtCards = tgt.getTargetCards();
} else {
@@ -2311,7 +2311,7 @@ public class AbilityFactoryPermanentState {
*/
private static boolean phasesPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) {
// AI cannot use this properly until he can use SAs during Humans turn
final Target tgt = af.getAbTgt();
final Target tgt = sa.getTarget();
boolean randomReturn = true;

View File

@@ -43,6 +43,7 @@ import forge.Counters;
import forge.GameActionUtil;
import forge.Player;
import forge.PlayerZone;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.cost.Cost;
import forge.card.spellability.Ability;
import forge.card.spellability.AbilityActivated;
@@ -264,6 +265,17 @@ public abstract class AbstractCardFactory implements CardFactoryInterface {
c.setCopiedSpell(true);
final SpellAbility copySA = sa.copy();
if (sa.getTarget() != null) {
Target target = new Target(sa.getTarget());
target.setSourceCard(c);
copySA.setTarget(target);
/*if (copySA.getAbilityFactory() != null) {
AbilityFactory af = new AbilityFactory(sa.getAbilityFactory());
af.setAbTgt(target);
af.setHostCard(source);
copySA.setAbilityFactory(af);
}*/
}
copySA.setSourceCard(c);
if (bCopyDetails) {

View File

@@ -45,6 +45,29 @@ public class Target {
private boolean singleZone = false;
private TargetChoices choice = null;
/**
* <p>
* getSourceCard.
* </p>
*
* @return a Card object.
*/
public final Card getSourceCard() {
return this.srcCard;
}
/**
* <p>
* setSourceCard.
* </p>
*
* @param source
* a Card object.
*/
public final void setSourceCard(final Card source) {
this.srcCard = source;
}
/**
* <p>
* getTargetChoices.
@@ -133,6 +156,14 @@ public class Target {
private String minTargets;
private String maxTargets;
public final String getMinTargets() {
return this.minTargets;
}
public final String getMaxTargets() {
return this.maxTargets;
}
/**
* <p>
* Getter for the field <code>minTargets</code>.
@@ -397,6 +428,25 @@ public class Target {
this.choice = null;
}
/**
* <p>
* Constructor for Target.
* </p>
*
* @param target
*/
public Target(final Target target) {
this.tgtValid = true;
this.srcCard = target.getSourceCard();
this.vtSelection = target.getVTSelection();
this.validTgts = target.getValidTgts();
this.minTargets = target.getMinTargets();
this.maxTargets = target.getMaxTargets();
this.tgtZone = target.getZone();
this.targetSpellAbilityType = target.getTargetSpellAbilityType();
}
/**
* <p>
* Constructor for Target.
@@ -690,4 +740,21 @@ public class Target {
public final void setSingleZone(final boolean single) {
this.singleZone = single;
}
/**
* <p>
* copy.
* </p>
*
* @return a {@link forge.card.spellability.Target} object.
*/
public Target copy() {
Target clone = null;
try {
clone = (Target) this.clone();
} catch (final CloneNotSupportedException e) {
System.err.println(e);
}
return clone;
}
}