From 0ad678ff56db71445899a00d17f12e1bf8ad9936 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Tue, 19 Sep 2023 01:41:40 -0400 Subject: [PATCH] enable multiple added subtypes in CreateTokenCopyTargetEffect (#11181) fix #11176 --- Mage.Sets/src/mage/cards/a/AstralDragon.java | 2 +- .../mage/cards/b/BrenardGingerSculptor.java | 4 +- .../src/mage/cards/d/DollhouseOfHorrors.java | 2 +- .../src/mage/cards/f/ForceProjection.java | 2 +- .../mage/cards/g/GenestealerPatriarch.java | 45 +------------------ .../src/mage/cards/g/GhastlyMimicry.java | 2 +- .../src/mage/cards/h/HauntingImitation.java | 2 +- .../src/mage/cards/h/HofriGhostforge.java | 2 +- .../mage/cards/k/KayaIntangibleSlayer.java | 2 +- .../src/mage/cards/n/NightmareShepherd.java | 4 +- .../src/mage/cards/r/RatadrabikOfUrborg.java | 2 +- Mage.Sets/src/mage/cards/s/Seance.java | 2 +- Mage.Sets/src/mage/cards/s/SoulSeparator.java | 2 +- .../src/mage/cards/t/TheApprenticesFolly.java | 3 +- .../src/mage/cards/u/UrzaPrinceOfKroog.java | 2 +- .../common/CreateTokenCopyTargetEffect.java | 14 +++--- 16 files changed, 25 insertions(+), 67 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AstralDragon.java b/Mage.Sets/src/mage/cards/a/AstralDragon.java index 4e4d72b2b7f..59640b2b6a5 100644 --- a/Mage.Sets/src/mage/cards/a/AstralDragon.java +++ b/Mage.Sets/src/mage/cards/a/AstralDragon.java @@ -42,7 +42,7 @@ public final class AstralDragon extends CardImpl { false, null, 3, 3, true); effect.setText("create two tokens that are copies of target noncreature permanent, " + "except they're 3/3 Dragon creatures in addition to their other types, and they have flying"); - effect.setAdditionalSubType(SubType.DRAGON); + effect.withAdditionalSubType(SubType.DRAGON); Ability ability = new EntersBattlefieldTriggeredAbility(effect); ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability.withFlavorWord("Project Image")); diff --git a/Mage.Sets/src/mage/cards/b/BrenardGingerSculptor.java b/Mage.Sets/src/mage/cards/b/BrenardGingerSculptor.java index e84690f3bc5..5e8a142e5ac 100644 --- a/Mage.Sets/src/mage/cards/b/BrenardGingerSculptor.java +++ b/Mage.Sets/src/mage/cards/b/BrenardGingerSculptor.java @@ -106,8 +106,8 @@ class BrenardGingerSculptorEffect extends OneShotEffect { ); effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game) + 1)); effect.setBecomesArtifact(true); - effect.setAdditionalSubType(SubType.FOOD); - effect.setAdditionalSubType(SubType.GOLEM); + effect.withAdditionalSubType(SubType.FOOD); + effect.withAdditionalSubType(SubType.GOLEM); effect.addAdditionalAbilities(new FoodAbility(false)); player.moveCards(card, Zone.EXILED, source, game); diff --git a/Mage.Sets/src/mage/cards/d/DollhouseOfHorrors.java b/Mage.Sets/src/mage/cards/d/DollhouseOfHorrors.java index 9a84a166615..5a679831783 100644 --- a/Mage.Sets/src/mage/cards/d/DollhouseOfHorrors.java +++ b/Mage.Sets/src/mage/cards/d/DollhouseOfHorrors.java @@ -90,7 +90,7 @@ class DollhouseOfHorrorsEffect extends OneShotEffect { false, null, 0, 0, false ); effect.setSavedPermanent(new PermanentCard(CardUtil.getDefaultCardSideForBattlefield(game, card), source.getControllerId(), game)); - effect.setAdditionalSubType(SubType.CONSTRUCT); + effect.withAdditionalSubType(SubType.CONSTRUCT); effect.addAdditionalAbilities(new SimpleStaticAbility(new BoostSourceEffect( xValue, xValue, diff --git a/Mage.Sets/src/mage/cards/f/ForceProjection.java b/Mage.Sets/src/mage/cards/f/ForceProjection.java index 511431b16f5..f33c8abd226 100644 --- a/Mage.Sets/src/mage/cards/f/ForceProjection.java +++ b/Mage.Sets/src/mage/cards/f/ForceProjection.java @@ -73,7 +73,7 @@ class ForceProjectionEffect extends OneShotEffect { effect.setTargetPointer(new FixedTarget(permanent, game)); // except that it is an Illusion in addition to its other types - effect.setAdditionalSubType(SubType.SPIRIT); + effect.withAdditionalSubType(SubType.SPIRIT); // and gains "When this creature becomes the target of a spell, sacrifice it." effect.addAdditionalAbilities(new SourceBecomesTargetTriggeredAbility(new SacrificeSourceEffect(), new FilterSpell())); diff --git a/Mage.Sets/src/mage/cards/g/GenestealerPatriarch.java b/Mage.Sets/src/mage/cards/g/GenestealerPatriarch.java index 24ae47a2b65..7fcd21a6518 100644 --- a/Mage.Sets/src/mage/cards/g/GenestealerPatriarch.java +++ b/Mage.Sets/src/mage/cards/g/GenestealerPatriarch.java @@ -2,7 +2,6 @@ package mage.cards.g; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -13,18 +12,14 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.DefendingPlayerControlsSourceAttackingPredicate; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; -import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -73,44 +68,6 @@ public final class GenestealerPatriarch extends CardImpl { } } -class GenestealerPatriarchTriggeredAbility extends TriggeredAbilityImpl { - - public GenestealerPatriarchTriggeredAbility() { - super(Zone.BATTLEFIELD, new GenestealerPatriarchCloneEffect()); - setTriggerPhrase("Whenever a creature with an infection counter on it dies, "); - ; - } - - private GenestealerPatriarchTriggeredAbility(final GenestealerPatriarchTriggeredAbility ability) { - super(ability); - } - - @Override - public GenestealerPatriarchTriggeredAbility copy() { - return new GenestealerPatriarchTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.isDiesEvent()) { - Permanent permanent = game.getPermanentOrLKIBattlefield(zEvent.getTargetId()); - if (permanent != null - && permanent.isCreature(game) - && permanent.getCounters(game).containsKey(CounterType.INFECTION)) { - this.getEffects().setTargetPointer(new FixedTarget(event.getTargetId(), game)); - return true; - } - } - return false; - } -} - class GenestealerPatriarchCloneEffect extends OneShotEffect { public GenestealerPatriarchCloneEffect() { @@ -137,7 +94,7 @@ class GenestealerPatriarchCloneEffect extends OneShotEffect { } CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(source.getControllerId()); effect.setSavedPermanent(creature); - effect.setAdditionalSubType(SubType.TYRANID); + effect.withAdditionalSubType(SubType.TYRANID); return effect.apply(game, source); } } diff --git a/Mage.Sets/src/mage/cards/g/GhastlyMimicry.java b/Mage.Sets/src/mage/cards/g/GhastlyMimicry.java index 054d3a5bf29..b8a0b6497d9 100644 --- a/Mage.Sets/src/mage/cards/g/GhastlyMimicry.java +++ b/Mage.Sets/src/mage/cards/g/GhastlyMimicry.java @@ -88,7 +88,7 @@ class GhastlyMimicryEffect extends OneShotEffect { return false; } CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(); - effect.setAdditionalSubType(SubType.SPIRIT); + effect.withAdditionalSubType(SubType.SPIRIT); return effect.setTargetPointer(new FixedTarget(attached, game)).apply(game, source); } } diff --git a/Mage.Sets/src/mage/cards/h/HauntingImitation.java b/Mage.Sets/src/mage/cards/h/HauntingImitation.java index 67bd5fbe30a..d8237b1d4ba 100644 --- a/Mage.Sets/src/mage/cards/h/HauntingImitation.java +++ b/Mage.Sets/src/mage/cards/h/HauntingImitation.java @@ -86,7 +86,7 @@ class HauntingImitationEffect extends OneShotEffect { source.getControllerId(), null, false, 1, false, false, null, 1, 1, true ); - effect.setAdditionalSubType(SubType.SPIRIT); + effect.withAdditionalSubType(SubType.SPIRIT); for (Card card : cards.getCards(game)) { effect.setSavedPermanent(new PermanentCard(CardUtil.getDefaultCardSideForBattlefield(game, card), source.getControllerId(), game)); effect.apply(game, source); diff --git a/Mage.Sets/src/mage/cards/h/HofriGhostforge.java b/Mage.Sets/src/mage/cards/h/HofriGhostforge.java index b2a1c708343..1ef5d0e009b 100644 --- a/Mage.Sets/src/mage/cards/h/HofriGhostforge.java +++ b/Mage.Sets/src/mage/cards/h/HofriGhostforge.java @@ -109,7 +109,7 @@ class HofriGhostforgeEffect extends OneShotEffect { player.moveCards(card, Zone.EXILED, source, game); CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(source.getControllerId()); effect.setTargetPointer(new FixedTarget(card, game)); - effect.setAdditionalSubType(SubType.SPIRIT); + effect.withAdditionalSubType(SubType.SPIRIT); effect.addAdditionalAbilities(new ZoneChangeTriggeredAbility( Zone.ALL, Zone.BATTLEFIELD, null, new HofriGhostforgeReturnEffect(card, game), "When this creature leaves the battlefield, ", false diff --git a/Mage.Sets/src/mage/cards/k/KayaIntangibleSlayer.java b/Mage.Sets/src/mage/cards/k/KayaIntangibleSlayer.java index e4761c7513f..2265ad9e61f 100644 --- a/Mage.Sets/src/mage/cards/k/KayaIntangibleSlayer.java +++ b/Mage.Sets/src/mage/cards/k/KayaIntangibleSlayer.java @@ -134,7 +134,7 @@ class KayaIntangibleSlayerExileEffect extends OneShotEffect { ); effect.setSavedPermanent(permanent); effect.setOnlyColor(ObjectColor.WHITE); - effect.setAdditionalSubType(SubType.SPIRIT); + effect.withAdditionalSubType(SubType.SPIRIT); effect.apply(game, source); return true; } diff --git a/Mage.Sets/src/mage/cards/n/NightmareShepherd.java b/Mage.Sets/src/mage/cards/n/NightmareShepherd.java index b4de651cda7..47f3b535724 100644 --- a/Mage.Sets/src/mage/cards/n/NightmareShepherd.java +++ b/Mage.Sets/src/mage/cards/n/NightmareShepherd.java @@ -91,9 +91,9 @@ class NightmareShepherdEffect extends OneShotEffect { false, null, 1, 1, false ); effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game) + 1)); - effect.setAdditionalSubType(SubType.NIGHTMARE); + effect.withAdditionalSubType(SubType.NIGHTMARE); player.moveCards(card, Zone.EXILED, source, game); effect.apply(game, source); return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/r/RatadrabikOfUrborg.java b/Mage.Sets/src/mage/cards/r/RatadrabikOfUrborg.java index 9e858ba6fbe..45cea3b9955 100644 --- a/Mage.Sets/src/mage/cards/r/RatadrabikOfUrborg.java +++ b/Mage.Sets/src/mage/cards/r/RatadrabikOfUrborg.java @@ -99,7 +99,7 @@ class RatadrabikOfUrborgEffect extends OneShotEffect { return false; } CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(controller.getId(), null, false,1,false,false,null,2,2,false); - effect.setAdditionalSubType(SubType.ZOMBIE); + effect.withAdditionalSubType(SubType.ZOMBIE); effect.setIsntLegendary(true); effect.setTargetPointer(new FixedTarget(copyFrom.getId(),game)); ObjectColor colors = copyFrom.getColor(); diff --git a/Mage.Sets/src/mage/cards/s/Seance.java b/Mage.Sets/src/mage/cards/s/Seance.java index c0dc61aa8f0..7a793114b4a 100644 --- a/Mage.Sets/src/mage/cards/s/Seance.java +++ b/Mage.Sets/src/mage/cards/s/Seance.java @@ -72,7 +72,7 @@ class SeanceEffect extends OneShotEffect { controller.moveCards(card, Zone.EXILED, source, game); // Also if the move to exile is replaced, the copy takes place CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(source.getControllerId(), null, false); effect.setTargetPointer(new FixedTarget(card, game)); - effect.setAdditionalSubType(SubType.SPIRIT); + effect.withAdditionalSubType(SubType.SPIRIT); effect.apply(game, source); ExileTargetEffect exileEffect = new ExileTargetEffect(); exileEffect.setTargetPointer(new FixedTargets(effect.getAddedPermanents(), game)); diff --git a/Mage.Sets/src/mage/cards/s/SoulSeparator.java b/Mage.Sets/src/mage/cards/s/SoulSeparator.java index 2f63d6d64a4..55f7e505746 100644 --- a/Mage.Sets/src/mage/cards/s/SoulSeparator.java +++ b/Mage.Sets/src/mage/cards/s/SoulSeparator.java @@ -41,7 +41,7 @@ public final class SoulSeparator extends CardImpl { // “create” those tokens. CreateTokenCopyTargetEffect copyEffect = new CreateTokenCopyTargetEffect(null, null, false, 1, false, false, null, 1, 1, true); - copyEffect.setAdditionalSubType(SubType.SPIRIT); + copyEffect.withAdditionalSubType(SubType.SPIRIT); copyEffect.setText("Exile target creature card from your graveyard. Create a token that's a copy of that card, except it's 1/1, it's a Spirit in addition to its other types, and it has flying"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, copyEffect, new ManaCostsImpl<>("{5}")); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/t/TheApprenticesFolly.java b/Mage.Sets/src/mage/cards/t/TheApprenticesFolly.java index cffad08ddd1..a7fb14d4256 100644 --- a/Mage.Sets/src/mage/cards/t/TheApprenticesFolly.java +++ b/Mage.Sets/src/mage/cards/t/TheApprenticesFolly.java @@ -10,7 +10,6 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SagaChapter; import mage.constants.SubType; -import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.ObjectSourcePlayer; @@ -49,7 +48,7 @@ public final class TheApprenticesFolly extends CardImpl { sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, new CreateTokenCopyTargetEffect(null, null, true, 1) .setIsntLegendary(true) - .setAdditionalSubType(SubType.REFLECTION) + .withAdditionalSubType(SubType.REFLECTION) .setText("choose target nontoken creature you control that doesn't have the same name as a " + "token you control. Create a token that's a copy of it, except it isn't legendary, " + "is a Reflection in addition to its other types, and has haste"), diff --git a/Mage.Sets/src/mage/cards/u/UrzaPrinceOfKroog.java b/Mage.Sets/src/mage/cards/u/UrzaPrinceOfKroog.java index 6d78c70e51d..f5935e7575a 100644 --- a/Mage.Sets/src/mage/cards/u/UrzaPrinceOfKroog.java +++ b/Mage.Sets/src/mage/cards/u/UrzaPrinceOfKroog.java @@ -42,7 +42,7 @@ public final class UrzaPrinceOfKroog extends CardImpl { Ability ability = new SimpleActivatedAbility(new CreateTokenCopyTargetEffect( null, CardType.CREATURE, false, 1, false, false, null, 1, 1, false - ).setAdditionalSubType(SubType.SOLDIER).setText("create a token that's a copy of target artifact you control, " + + ).withAdditionalSubType(SubType.SOLDIER).setText("create a token that's a copy of target artifact you control, " + "except it's a 1/1 Soldier creature in addition to its other types"), new GenericManaCost(6)); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT)); this.addAbility(ability); diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java index 6435bab08da..44c1530d9be 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java @@ -40,7 +40,7 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { private final List addedTokenPermanents; private final List additionalAbilities; private final CardType additionalCardType; - private SubType additionalSubType; + private final List additionalSubTypes = new ArrayList<>(); private final UUID attackedPlayer; private UUID attachedTo = null; private final boolean attacking; @@ -133,7 +133,7 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { this.addedTokenPermanents = new ArrayList<>(effect.addedTokenPermanents); this.additionalAbilities = new ArrayList<>(effect.additionalAbilities); this.additionalCardType = effect.additionalCardType; - this.additionalSubType = effect.additionalSubType; + this.additionalSubTypes.addAll(effect.additionalSubTypes); this.attackedPlayer = effect.attackedPlayer; this.attachedTo = effect.attachedTo; this.attacking = effect.attacking; @@ -236,8 +236,10 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { token.removeAllCreatureTypes(); token.addSubType(onlySubType); } - if (additionalSubType != null) { - token.addSubType(additionalSubType); + if (!additionalSubTypes.isEmpty()) { + for (SubType additionalSubType : additionalSubTypes) { + token.addSubType(additionalSubType); + } } if (color != null) { token.setColor(color); @@ -322,8 +324,8 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { return addedTokenPermanents; } - public CreateTokenCopyTargetEffect setAdditionalSubType(SubType additionalSubType) { - this.additionalSubType = additionalSubType; + public CreateTokenCopyTargetEffect withAdditionalSubType(SubType additionalSubType) { + this.additionalSubTypes.add(additionalSubType); return this; }