From 1dc7dcc94c9a2d7f4b78c1e85dfcf866d1bbb117 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Fri, 21 Apr 2023 11:39:03 +0400 Subject: [PATCH] Fixed images info copy in morph and other copy abilities --- .../mage/cards/m/MetamorphicAlteration.java | 5 ++- .../abilities/effects/common/CopyEffect.java | 33 +------------- .../mage/abilities/keyword/MorphAbility.java | 7 ++- .../abilities/keyword/TransformAbility.java | 5 ++- .../mage/game/permanent/PermanentToken.java | 2 +- Mage/src/main/java/mage/util/CardUtil.java | 45 +++++++++++++++++++ 6 files changed, 61 insertions(+), 36 deletions(-) diff --git a/Mage.Sets/src/mage/cards/m/MetamorphicAlteration.java b/Mage.Sets/src/mage/cards/m/MetamorphicAlteration.java index 1be84b12bfc..07e108f01db 100644 --- a/Mage.Sets/src/mage/cards/m/MetamorphicAlteration.java +++ b/Mage.Sets/src/mage/cards/m/MetamorphicAlteration.java @@ -17,6 +17,7 @@ import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; import java.util.UUID; @@ -123,7 +124,9 @@ class MetamorphicAlterationEffect extends ContinuousEffectImpl { permanent.setName(copied.getName()); permanent.getManaCost().clear(); permanent.getManaCost().addAll(copied.getManaCost()); - permanent.setExpansionSetCode(copied.getExpansionSetCode()); + + CardUtil.copySetAndCardNumber(permanent, copied); + permanent.getSuperType().clear(); for (SuperType t : copied.getSuperType()) { permanent.addSuperType(t); diff --git a/Mage/src/main/java/mage/abilities/effects/common/CopyEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CopyEffect.java index 3430b7d27a7..71137853e0a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CopyEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CopyEffect.java @@ -143,38 +143,7 @@ public class CopyEffect extends ContinuousEffectImpl { permanent.setFlipCardName(targetPermanent.getFlipCardName()); } - // to get the image of the copied permanent copy number und expansionCode - String needSetCode; - String needCardNumber; - int needTokenType; - if (copyFromObject instanceof CommandObject) { - needSetCode = ((CommandObject) copyFromObject).getExpansionSetCodeForImage(); - needCardNumber = "0"; - needTokenType = 0; - } else if (copyFromObject instanceof PermanentCard) { - needSetCode = ((PermanentCard) copyFromObject).getExpansionSetCode(); - needCardNumber = ((PermanentCard) copyFromObject).getCardNumber(); - needTokenType = 0; - } else if (copyFromObject instanceof PermanentToken) { - needSetCode = ((PermanentToken) copyFromObject).getToken().getOriginalExpansionSetCode(); - needCardNumber = ((PermanentToken) copyFromObject).getToken().getOriginalCardNumber(); - needTokenType = ((PermanentToken) copyFromObject).getToken().getTokenType(); - } else if (copyFromObject instanceof Card) { - needSetCode = ((Card) copyFromObject).getExpansionSetCode(); - needCardNumber = ((Card) copyFromObject).getCardNumber(); - needTokenType = 0; - } else { - throw new IllegalStateException("Unsupported copyFromObject class: " + copyFromObject.getClass().getSimpleName()); - } - - if (permanent instanceof PermanentToken) { - ((PermanentToken) permanent).getToken().setOriginalExpansionSetCode(needSetCode); - ((PermanentToken) permanent).getToken().setExpansionSetCodeForImage(needSetCode); - ((PermanentToken) permanent).getToken().setTokenType(needTokenType); - } else { - permanent.setExpansionSetCode(needSetCode); - permanent.setCardNumber(needCardNumber); - } + CardUtil.copySetAndCardNumber(permanent, copyFromObject); return true; } diff --git a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java index 4feb4e33428..22242466b7b 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java @@ -17,6 +17,7 @@ import mage.constants.Rarity; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.Spell; +import mage.util.CardUtil; /** * 702.36. Morph @@ -144,8 +145,12 @@ public class MorphAbility extends AlternativeSourceCostsImpl { mageObject.removeAllSubTypes(game); mageObject.getSuperType().clear(); mageObject.getManaCost().clear(); + + // TODO: add morph image here? if (mageObject instanceof Permanent) { - ((Permanent) mageObject).setExpansionSetCode(""); + // hide image info + CardUtil.copySetAndCardNumber((Permanent) mageObject, "", "", 0); + // hide rarity info ((Permanent) mageObject).setRarity(Rarity.SPECIAL); } } diff --git a/Mage/src/main/java/mage/abilities/keyword/TransformAbility.java b/Mage/src/main/java/mage/abilities/keyword/TransformAbility.java index bf57719e2da..8f395b8672d 100644 --- a/Mage/src/main/java/mage/abilities/keyword/TransformAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/TransformAbility.java @@ -10,6 +10,7 @@ import mage.game.Game; import mage.game.MageObjectAttribute; import mage.game.permanent.Permanent; import mage.game.stack.Spell; +import mage.util.CardUtil; /** * @author nantuko @@ -57,7 +58,9 @@ public class TransformAbility extends SimpleStaticAbility { for (SuperType type : sourceCard.getSuperType()) { permanent.addSuperType(type); } - permanent.setExpansionSetCode(sourceCard.getExpansionSetCode()); + + CardUtil.copySetAndCardNumber(permanent, sourceCard); + permanent.getAbilities().clear(); for (Ability ability : sourceCard.getAbilities()) { // source == null -- call from init card (e.g. own abilities) diff --git a/Mage/src/main/java/mage/game/permanent/PermanentToken.java b/Mage/src/main/java/mage/game/permanent/PermanentToken.java index 8e9a0f754fc..01df044f60c 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentToken.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentToken.java @@ -138,6 +138,6 @@ public class PermanentToken extends PermanentImpl { @Override public void setExpansionSetCode(String expansionSetCode) { - throw new IllegalArgumentException("Wrong code usage: you can't change a token's set code"); + throw new IllegalArgumentException("Wrong code usage: you can't change a token's set code, use CardUtils.copySetAndCardNumber instead"); } } diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index bdc3f257891..03614595f3a 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -32,11 +32,13 @@ import mage.filter.predicate.mageobject.NamePredicate; import mage.game.CardState; import mage.game.Game; import mage.game.GameState; +import mage.game.command.CommandObject; import mage.game.command.Commander; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; import mage.game.permanent.PermanentMeld; +import mage.game.permanent.PermanentToken; import mage.game.permanent.token.Token; import mage.game.stack.Spell; import mage.players.Player; @@ -1769,4 +1771,47 @@ public final class CardUtil { } return str.substring(0, Math.min(str.length(), maxLength)); } + + + /** + * Copy image related data from one object to another (card number, set code, token type) + * Use it in copy/transform effects + */ + public static void copySetAndCardNumber(Permanent permanent, MageObject copyFromObject) { + String needSetCode; + String needCardNumber; + int needTokenType; + if (copyFromObject instanceof CommandObject) { + needSetCode = ((CommandObject) copyFromObject).getExpansionSetCodeForImage(); + needCardNumber = "0"; + needTokenType = 0; + } else if (copyFromObject instanceof PermanentCard) { + needSetCode = ((PermanentCard) copyFromObject).getExpansionSetCode(); + needCardNumber = ((PermanentCard) copyFromObject).getCardNumber(); + needTokenType = 0; + } else if (copyFromObject instanceof PermanentToken) { + needSetCode = ((PermanentToken) copyFromObject).getToken().getOriginalExpansionSetCode(); + needCardNumber = ((PermanentToken) copyFromObject).getToken().getOriginalCardNumber(); + needTokenType = ((PermanentToken) copyFromObject).getToken().getTokenType(); + } else if (copyFromObject instanceof Card) { + needSetCode = ((Card) copyFromObject).getExpansionSetCode(); + needCardNumber = ((Card) copyFromObject).getCardNumber(); + needTokenType = 0; + } else { + throw new IllegalStateException("Unsupported copyFromObject class: " + copyFromObject.getClass().getSimpleName()); + } + + copySetAndCardNumber(permanent, needSetCode, needCardNumber, needTokenType); + } + + public static void copySetAndCardNumber(Permanent permanent, String newSetCode, String newCardNumber, Integer newTokenType) { + if (permanent instanceof PermanentToken) { + ((PermanentToken) permanent).getToken().setOriginalExpansionSetCode(newSetCode); + ((PermanentToken) permanent).getToken().setExpansionSetCodeForImage(newCardNumber); + ((PermanentToken) permanent).getToken().setTokenType(newTokenType); + } else { + permanent.setExpansionSetCode(newSetCode); + permanent.setCardNumber(newCardNumber); + } + } }