images: fixed miss images for double faced tokens like Incubator/Phyrexian (closes #11535);

This commit is contained in:
Oleg Agafonov 2023-12-10 15:59:27 +04:00
parent 725a27d6ad
commit d5b582c1b3
2 changed files with 64 additions and 1 deletions

View file

@ -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));
}
}

View file

@ -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<Permanent> needTokens = new ArrayList<>();
List<Permanent> 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);