diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index b5c5ee8de86..7fe53d882d8 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -340,8 +340,6 @@ public class Card extends GameEntity implements Comparable { private Card cloneOrigin = null; private ArrayList clones = new ArrayList(); - private Card currentlyCloningCard = null; - private Command cloneLeavesPlayCommand = null; private ArrayList gainControlTargets = new ArrayList(); private ArrayList gainControlReleaseCommands = new ArrayList(); @@ -1052,52 +1050,6 @@ public class Card extends GameEntity implements Comparable { cloneOrigin = name; } - /** - *

- * Getter for the field cloneLeavesPlayCommand. - *

- * - * @return a {@link forge.Command} object. - */ - public final Command getCloneLeavesPlayCommand() { - return cloneLeavesPlayCommand; - } - - /** - *

- * Setter for the field cloneLeavesPlayCommand. - *

- * - * @param com - * a {@link forge.Command} object. - */ - public final void setCloneLeavesPlayCommand(final Command com) { - cloneLeavesPlayCommand = com; - } - - /** - *

- * Getter for the field currentlyCloningCard. - *

- * - * @return a {@link forge.Card} object. - */ - public final Card getCurrentlyCloningCard() { - return currentlyCloningCard; - } - - /** - *

- * Setter for the field currentlyCloningCard. - *

- * - * @param c - * a {@link forge.Card} object. - */ - public final void setCurrentlyCloningCard(final Card c) { - currentlyCloningCard = c; - } - /** *

* Getter for the field sacrificeAtEOT. @@ -2081,6 +2033,10 @@ public class Card extends GameEntity implements Comparable { sb.append("\r\n \r\nNon ability features: \r\n"); sb.append(nonAbilityText.replaceAll("CARDNAME", getName())); } + + if(characteristicsMap.get("Cloner") != null) { + sb.append("\r\nCloned by:").append(characteristicsMap.get("Cloner").getName()).append(" (").append(getUniqueNumber()).append(")"); + } return sb.toString(); } diff --git a/src/main/java/forge/card/cardfactory/AbstractCardFactory.java b/src/main/java/forge/card/cardfactory/AbstractCardFactory.java index 875548597f5..03bbb9fb75c 100644 --- a/src/main/java/forge/card/cardfactory/AbstractCardFactory.java +++ b/src/main/java/forge/card/cardfactory/AbstractCardFactory.java @@ -1713,59 +1713,64 @@ public abstract class AbstractCardFactory implements CardFactoryInterface { else if (cardName.equals("Copy Artifact") || cardName.equals("Sculpting Steel")) { final CardFactoryInterface cfact = this; final Card[] copyTarget = new Card[1]; - final Card[] cloned = new Card[1]; - - final Command leaves = new Command() { - private static final long serialVersionUID = 6212378498863558380L; - - @Override - public void execute() { - - final Card orig = cfact.getCard(card.getName(), card.getController()); - final PlayerZone dest = AllZone.getZoneOf(card.getCurrentlyCloningCard()); - AllZone.getGameAction().moveTo(dest, orig); - dest.remove(card.getCurrentlyCloningCard()); - - } - }; final SpellAbility copy = new Spell(card) { - private static final long serialVersionUID = 4236580139968159802L; - - @Override - public boolean canPlayAI() { - final CardList arts = AllZoneUtil.getCardsIn(Zone.Battlefield).filter(CardListFilter.ARTIFACTS); - return !arts.isEmpty(); - } + private static final long serialVersionUID = 4496978456522751302L; @Override public void resolve() { if (card.getController().isComputer()) { - final CardList arts = AllZoneUtil.getCardsIn(Zone.Battlefield).filter(CardListFilter.ARTIFACTS); - if (!arts.isEmpty()) { - copyTarget[0] = CardFactoryUtil.getBestArtifactAI(arts); + final CardList creatures = AllZoneUtil.getCreaturesInPlay(); + if (!creatures.isEmpty()) { + copyTarget[0] = CardFactoryUtil.getBestCreatureAI(creatures); } } if (copyTarget[0] != null) { - cloned[0] = CardFactoryUtil.copyStats(copyTarget[0]); - cloned[0].setOwner(card.getController()); - if (cardName.equals("Copy Artifact")) { - cloned[0].addType("Enchantment"); + Card cloned; + + cloned = cfact.getCard(copyTarget[0].getState("Original").getName(), card.getOwner()); + card.addAlternateState("Cloner"); + card.switchStates("Original", "Cloner"); + card.setState("Original"); + + if(copyTarget[0].getCurState().equals("Transformed") && copyTarget[0].isDoubleFaced()) { + cloned.setState("Transformed"); } - cloned[0].setCloneOrigin(card); - cloned[0].addLeavesPlayCommand(leaves); - cloned[0].setCloneLeavesPlayCommand(leaves); - cloned[0].setCurSetCode(copyTarget[0].getCurSetCode()); - cloned[0].setImageFilename(copyTarget[0].getImageFilename()); + + CardFactoryUtil.copyCharacteristics(cloned,card); + this.grantExtras(); + - for (final SpellAbility sa : copyTarget[0].getSpellAbilities()) { - cloned[0].addSpellAbility(sa); + //If target is a flipped card, also copy the flipped state. + if(copyTarget[0].isFlip()) { + cloned.setState("Flipped"); + cloned.setImageFilename(CardUtil.buildFilename(cloned)); + card.addAlternateState("Flipped"); + card.setState("Flipped"); + CardFactoryUtil.copyCharacteristics(cloned,card); + this.grantExtras(); + + card.setFlip(true); + + card.setState("Original"); } - - AllZone.getGameAction().moveToPlay(cloned[0]); - card.setCurrentlyCloningCard(cloned[0]); + else { + card.setFlip(false); + } + + } + + AllZone.getGameAction().moveToPlay(card); + } + + private void grantExtras() { + //Grant stuff from specific cloners + if(cardName.equals("Copy Artifact")) { + card.addType("Enchantment"); + } + } }; // SpellAbility