From d5b582c1b300b912e7af9d9db4f1c50b80cba3b4 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 10 Dec 2023 15:59:27 +0400 Subject: [PATCH] images: fixed miss images for double faced tokens like Incubator/Phyrexian (closes #11535); --- .../mage/test/serverside/TokenImagesTest.java | 42 ++++++++++++++++++- .../mage/game/permanent/token/TokenImpl.java | 23 ++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/TokenImagesTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/TokenImagesTest.java index eb908de7af2..c681d15b033 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/TokenImagesTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/TokenImagesTest.java @@ -1,6 +1,7 @@ package org.mage.test.serverside; import mage.MageObject; +import mage.MageObjectImpl; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -267,7 +268,7 @@ public class TokenImagesTest extends CardTestPlayerBase { .filter(card -> card instanceof PermanentToken) .sorted(Comparator.comparing(Card::getExpansionSetCode)) .map(card -> (PermanentToken) card) - .map(perm -> perm.getToken().getImageNumber()) + .map(MageObjectImpl::getImageNumber) .collect(Collectors.toSet()); GameView gameView = new GameView(currentGame.getState(), currentGame, playerA.getId(), null); @@ -610,4 +611,43 @@ public class TokenImagesTest extends CardTestPlayerBase { assert_SacredCat(3 + 5 + 1, "AKH=3", "AKR=5", "MB1=1"); } + + @Test + public void test_Abilities_Incubator_MustTransformWithSameSettings() { + // bug with miss image data in tranformed incubator token: https://github.com/magefree/mage/issues/11535 + + // make sure random images take all 3 diff images + int needIncubatorTokens = 30; + int needPhyrexianTokens = 30 / 2; + + // When Sculpted Perfection enters the battlefield, incubate 2. (Create an Incubator token with two +1/+1 + // counters on it and “{2}: Transform this artifact.” It transforms into a 0/0 Phyrexian artifact creature.) + prepareCards_Inner(Zone.HAND, "Sculpted Perfection", 0, "MOM=" + needIncubatorTokens); // {2}{W}{B} + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3 * needIncubatorTokens); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1 * needIncubatorTokens); + // + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2 * needIncubatorTokens); // for transform + + // prepare incubator tokens + activate_Inner(needIncubatorTokens, "Cast Sculpted Perfection"); + + // transform tokens to Phyrexian + activate_Inner(needPhyrexianTokens, "{2}: Transform"); + + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + // same set + assert_Inner("Sculpted Perfection", 0, 0, needIncubatorTokens, + "Incubator Token", needPhyrexianTokens, false, "MOM=" + needPhyrexianTokens); + assert_Inner("Sculpted Perfection", 0, 0, needIncubatorTokens, + "Phyrexian Token", needPhyrexianTokens, false, "MOM=" + needPhyrexianTokens); + + // MOM-Incubator has 1 image (number is 0) + assert_TokenImageNumber("Incubator Token", Arrays.asList(0)); + // MOM-Phyrexian has 3 images + assert_TokenImageNumber("Phyrexian Token", Arrays.asList(1, 2, 3)); + } } diff --git a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java index fd3791a854b..ce7cfaecf39 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java +++ b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java @@ -279,10 +279,17 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { } // choose token's set code due source + // front side TokenInfo tokenInfo = TokenImpl.generateTokenInfo((TokenImpl) token, game, source == null ? null : source.getSourceId()); token.setExpansionSetCode(tokenInfo.getSetCode()); //token.setCardNumber(""); // if token from a card then don't change a card number token.setImageNumber(tokenInfo.getImageNumber()); + if (token.getBackFace() != null) { + // back side + tokenInfo = TokenImpl.generateTokenInfo((TokenImpl) token.getBackFace(), game, source == null ? null : source.getSourceId()); + token.getBackFace().setExpansionSetCode(tokenInfo.getSetCode()); + token.getBackFace().setImageNumber(tokenInfo.getImageNumber()); + } List needTokens = new ArrayList<>(); List allowedTokens = new ArrayList<>(); @@ -484,6 +491,22 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { return this.entersTransformed && this.backFace != null; } + @Override + public void setExpansionSetCode(String expansionSetCode) { + super.setExpansionSetCode(expansionSetCode); + + // backface can have diff images (example: Incubator/Phyrexian in MOM set) + // so it must be setup/copied manually + } + + @Override + public void setImageNumber(Integer imageNumber) { + super.setImageNumber(imageNumber); + + // backface can have diff images (example: Incubator/Phyrexian in MOM set) + // so it must be setup/copied manually + } + public static TokenImpl createTokenByClassName(String fullClassName) { try { Class c = Class.forName(fullClassName);