diff --git a/.gitignore b/.gitignore index 227cae92d1f..6f5e1ab0f1b 100644 --- a/.gitignore +++ b/.gitignore @@ -92,6 +92,7 @@ hs_err*.log *.txt Mage.Client/serverlist.txt /bin/ +/out/ /target/ client_secrets.json diff --git a/Mage.Common/src/mage/utils/DeckBuilder.java b/Mage.Common/src/mage/utils/DeckBuilder.java index 9173994ea50..025a73bd370 100644 --- a/Mage.Common/src/mage/utils/DeckBuilder.java +++ b/Mage.Common/src/mage/utils/DeckBuilder.java @@ -247,9 +247,9 @@ public class DeckBuilder { int type; if (card.getCardType().contains(CardType.CREATURE)) { type = 10; - } else if (card.getSubtype().contains("Equipment")) { + } else if (card.getSubtype(null).contains("Equipment")) { type = 8; - } else if (card.getSubtype().contains("Aura")) { + } else if (card.getSubtype(null).contains("Aura")) { type = 5; } else if (card.getCardType().contains(CardType.INSTANT)) { type = 7; diff --git a/Mage.Common/src/mage/view/CardView.java b/Mage.Common/src/mage/view/CardView.java index e484b258d6f..7a4f6732481 100644 --- a/Mage.Common/src/mage/view/CardView.java +++ b/Mage.Common/src/mage/view/CardView.java @@ -272,7 +272,7 @@ public class CardView extends SimpleCardView { this.power = Integer.toString(card.getPower().getValue()); this.toughness = Integer.toString(card.getToughness().getValue()); this.cardTypes = card.getCardType(); - this.subTypes = card.getSubtype(); + this.subTypes = card.getSubtype(game); this.superTypes = card.getSupertype(); this.color = card.getColor(game); this.canTransform = card.canTransform(); @@ -347,7 +347,7 @@ public class CardView extends SimpleCardView { this.loyalty = ""; } this.cardTypes = object.getCardType(); - this.subTypes = object.getSubtype(); + this.subTypes = object.getSubtype(null); this.superTypes = object.getSupertype(); this.color = object.getColor(null); this.manaCost = object.getManaCost().getSymbols(); @@ -453,7 +453,7 @@ public class CardView extends SimpleCardView { this.toughness = token.getToughness().toString(); this.loyalty = ""; this.cardTypes = token.getCardType(); - this.subTypes = token.getSubtype(); + this.subTypes = token.getSubtype(null); this.superTypes = token.getSupertype(); this.color = token.getColor(null); this.manaCost = token.getManaCost().getSymbols(); diff --git a/Mage.Common/src/mage/view/StackAbilityView.java b/Mage.Common/src/mage/view/StackAbilityView.java index 815c0ec13d1..9b195d1b5bb 100644 --- a/Mage.Common/src/mage/view/StackAbilityView.java +++ b/Mage.Common/src/mage/view/StackAbilityView.java @@ -64,12 +64,12 @@ public class StackAbilityView extends CardView { this.loyalty = ""; this.cardTypes = ability.getCardType(); - this.subTypes = ability.getSubtype(); + this.subTypes = ability.getSubtype(game); this.superTypes = ability.getSupertype(); this.color = ability.getColor(game); this.manaCost = ability.getManaCost().getSymbols(); this.cardTypes = ability.getCardType(); - this.subTypes = ability.getSubtype(); + this.subTypes = ability.getSubtype(game); this.superTypes = ability.getSupertype(); this.color = ability.getColor(game); this.manaCost = ability.getManaCost().getSymbols(); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java index 27e8cc0f061..9b0c0171975 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/ArtificialScoringSystem.java @@ -55,7 +55,7 @@ public class ArtificialScoringSystem { //score + =cardDefinition.getActivations().size()*50; //score += cardDefinition.getManaActivations().size()*80; } else { - if (permanent.getSubtype().contains("Equipment")) { + if (permanent.getSubtype(game).contains("Equipment")) { score += 100; } } diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index c485aa78f21..6264e603016 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -1340,9 +1340,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { for (Permanent permanent : game.getBattlefield().getActivePermanents(this.getId(), game)) { if (game.getOpponents(this.getId()).contains(permanent.getControllerId()) && permanent.getCardType().contains(CardType.CREATURE) - && permanent.getSubtype().size() > 0) { - if (choice.getChoices().contains(permanent.getSubtype().get(0))) { - choice.setChoice(permanent.getSubtype().get(0)); + && permanent.getSubtype(game).size() > 0) { + if (choice.getChoices().contains(permanent.getSubtype(game).get(0))) { + choice.setChoice(permanent.getSubtype(game).get(0)); break; } } @@ -1352,9 +1352,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { for (UUID opponentId : game.getOpponents(this.getId())) { Player opponent = game.getPlayer(opponentId); for (Card card : opponent.getGraveyard().getCards(game)) { - if (card != null && card.getCardType().contains(CardType.CREATURE) && card.getSubtype().size() > 0) { - if (choice.getChoices().contains(card.getSubtype().get(0))) { - choice.setChoice(card.getSubtype().get(0)); + if (card != null && card.getCardType().contains(CardType.CREATURE) && card.getSubtype(game).size() > 0) { + if (choice.getChoices().contains(card.getSubtype(game).get(0))) { + choice.setChoice(card.getSubtype(game).get(0)); break; } } @@ -1368,9 +1368,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { // choose a creature type of hand or library for (UUID cardId : this.getHand()) { Card card = game.getCard(cardId); - if (card != null && card.getCardType().contains(CardType.CREATURE) && card.getSubtype().size() > 0) { - if (choice.getChoices().contains(card.getSubtype().get(0))) { - choice.setChoice(card.getSubtype().get(0)); + if (card != null && card.getCardType().contains(CardType.CREATURE) && card.getSubtype(game).size() > 0) { + if (choice.getChoices().contains(card.getSubtype(game).get(0))) { + choice.setChoice(card.getSubtype(game).get(0)); break; } } @@ -1378,9 +1378,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (!choice.isChosen()) { for (UUID cardId : this.getLibrary().getCardList()) { Card card = game.getCard(cardId); - if (card != null && card.getCardType().contains(CardType.CREATURE) && card.getSubtype().size() > 0) { - if (choice.getChoices().contains(card.getSubtype().get(0))) { - choice.setChoice(card.getSubtype().get(0)); + if (card != null && card.getCardType().contains(CardType.CREATURE) && card.getSubtype(game).size() > 0) { + if (choice.getChoices().contains(card.getSubtype(game).get(0))) { + choice.setChoice(card.getSubtype(game).get(0)); break; } } diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/utils/RateCard.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/utils/RateCard.java index 1ea25df2e14..2bb13cb4a44 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/utils/RateCard.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/utils/RateCard.java @@ -16,7 +16,7 @@ import java.io.InputStream; import java.util.*; /** - * Class responsible for reading ratings from resources and rating gived cards. + * Class responsible for reading ratings from resources and rating given cards. * Based on card relative ratings from resources and card parameters. * * @author nantuko @@ -61,9 +61,9 @@ public class RateCard { type = 15; } else if (card.getCardType().contains(CardType.CREATURE)) { type = 10; - } else if (card.getSubtype().contains("Equipment")) { + } else if (card.getSubtype(null).contains("Equipment")) { type = 8; - } else if (card.getSubtype().contains("Aura")) { + } else if (card.getSubtype(null).contains("Aura")) { type = 5; } else if (card.getCardType().contains(CardType.INSTANT)) { type = 7; @@ -78,7 +78,7 @@ public class RateCard { } private static int isRemoval(Card card) { - if (card.getSubtype().contains("Aura") || card.getCardType().contains(CardType.INSTANT) + if (card.getSubtype(null).contains("Aura") || card.getCardType().contains(CardType.INSTANT) || card.getCardType().contains(CardType.SORCERY)) { for (Ability ability : card.getAbilities()) { diff --git a/Mage.Sets/src/mage/sets/antiquities/Tetravus.java b/Mage.Sets/src/mage/sets/antiquities/Tetravus.java index 0a25fb5ff1f..6992afa74fe 100644 --- a/Mage.Sets/src/mage/sets/antiquities/Tetravus.java +++ b/Mage.Sets/src/mage/sets/antiquities/Tetravus.java @@ -120,7 +120,7 @@ class CantBeEnchantedAbility extends StaticAbility { public boolean canTarget(MageObject source, Game game) { if (source.getCardType().contains(CardType.ENCHANTMENT) && - source.hasSubtype("Aura")) { + source.hasSubtype("Aura", game)) { return false; } return true; diff --git a/Mage.Sets/src/mage/sets/arabiannights/DesertNomads.java b/Mage.Sets/src/mage/sets/arabiannights/DesertNomads.java index 99a006378c4..22f9eb25904 100644 --- a/Mage.Sets/src/mage/sets/arabiannights/DesertNomads.java +++ b/Mage.Sets/src/mage/sets/arabiannights/DesertNomads.java @@ -96,7 +96,7 @@ class PreventDamageToSourceBySubtypeEffect extends PreventAllDamageToSourceEffec @Override public boolean applies(GameEvent event, Ability source, Game game) { if (super.applies(event, source, game)) { - if (game.getObject(event.getSourceId()).hasSubtype(subtype)){ + if (game.getObject(event.getSourceId()).hasSubtype(subtype, game)){ if (event.getTargetId().equals(source.getSourceId())) { return true; } diff --git a/Mage.Sets/src/mage/sets/arabiannights/GuardianBeast.java b/Mage.Sets/src/mage/sets/arabiannights/GuardianBeast.java index b357ed6dea9..c33d7886ee2 100644 --- a/Mage.Sets/src/mage/sets/arabiannights/GuardianBeast.java +++ b/Mage.Sets/src/mage/sets/arabiannights/GuardianBeast.java @@ -145,7 +145,7 @@ class GuardianBeastConditionalEffect extends ContinuousRuleModifyingEffectImpl { } StackObject spell = game.getStack().getStackObject(event.getSourceId()); - if (event.getType() == EventType.LOSE_CONTROL || event.getType() == EventType.ATTACH || event.getType() == EventType.TARGET && spell != null && spell.getCardType().contains(CardType.ENCHANTMENT) && spell.getSubtype().contains("Aura")) { + if (event.getType() == EventType.LOSE_CONTROL || event.getType() == EventType.ATTACH || event.getType() == EventType.TARGET && spell != null && spell.getCardType().contains(CardType.ENCHANTMENT) && spell.getSubtype(game).contains("Aura")) { for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { if (perm != null && perm.getId() == targetPermanent.getId() && !perm.getCardType().contains(CardType.CREATURE)) { return true; diff --git a/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java b/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java index 747c9bb6b93..168126031ca 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/CavernOfSouls.java @@ -142,7 +142,7 @@ class CavernOfSoulsManaCondition extends CreatureCastManaCondition { if (super.apply(game, source)) { // check: ... of the chosen type MageObject object = game.getObject(source.getSourceId()); - if (creatureType != null && object.hasSubtype(creatureType)) { + if (creatureType != null && object.hasSubtype(creatureType, game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DefyDeath.java b/Mage.Sets/src/mage/sets/avacynrestored/DefyDeath.java index 37c0c83d9a8..f057639f9da 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/DefyDeath.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/DefyDeath.java @@ -87,7 +87,7 @@ class DefyDeathEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent != null && permanent.hasSubtype("Angel")) { + if (permanent != null && permanent.hasSubtype("Angel", game)) { permanent.addCounters(CounterType.P1P1.createInstance(2), game); return true; } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DescendantsPath.java b/Mage.Sets/src/mage/sets/avacynrestored/DescendantsPath.java index 0bb9524661a..fb11b985cae 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/DescendantsPath.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/DescendantsPath.java @@ -103,7 +103,7 @@ class DescendantsPathEffect extends OneShotEffect { FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); boolean found = false; for (Permanent permanent: game.getBattlefield().getAllActivePermanents(filter, controller.getId(), game)) { - if (CardUtil.shareSubtypes(card, permanent)) { + if (CardUtil.shareSubtypes(card, permanent, game)) { found = true; break; } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/DreadSlaver.java b/Mage.Sets/src/mage/sets/avacynrestored/DreadSlaver.java index ff086a81a0f..3d2af34277f 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/DreadSlaver.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/DreadSlaver.java @@ -133,7 +133,7 @@ class DreadSlaverContiniousEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - creature.getSubtype().add("Zombie"); + creature.getSubtype(game).add("Zombie"); } break; case ColorChangingEffects_5: diff --git a/Mage.Sets/src/mage/sets/avacynrestored/EatenBySpiders.java b/Mage.Sets/src/mage/sets/avacynrestored/EatenBySpiders.java index 2165ed9c23b..ccfd4e3b7d4 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/EatenBySpiders.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/EatenBySpiders.java @@ -99,7 +99,7 @@ class EatenBySpidersEffect extends OneShotEffect { for (UUID attachmentId : attachments) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment.hasSubtype("Equipment")) { + if (attachment.hasSubtype("Equipment", game)) { attachment.destroy(source.getSourceId(), game, false); } } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/HeraldOfWar.java b/Mage.Sets/src/mage/sets/avacynrestored/HeraldOfWar.java index 30e25ad36b8..ac3bc380356 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/HeraldOfWar.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/HeraldOfWar.java @@ -107,7 +107,7 @@ class HeraldOfWarCostReductionEffect extends CostModificationEffectImpl { public boolean applies(Ability abilityToModify, Ability source, Game game) { if (abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility) { Card sourceCard = game.getCard(abilityToModify.getSourceId()); - if (sourceCard != null && abilityToModify.getControllerId().equals(source.getControllerId()) && (sourceCard.hasSubtype("Angel") || sourceCard.hasSubtype("Human"))) { + if (sourceCard != null && abilityToModify.getControllerId().equals(source.getControllerId()) && (sourceCard.hasSubtype("Angel", game) || sourceCard.hasSubtype("Human", game))) { return true; } } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/HolyJusticiar.java b/Mage.Sets/src/mage/sets/avacynrestored/HolyJusticiar.java index 6d30460f2b9..704f6251b3d 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/HolyJusticiar.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/HolyJusticiar.java @@ -91,7 +91,7 @@ class HolyJusticiarEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent creature = game.getPermanent(source.getFirstTarget()); if (creature != null) { - if (creature.hasSubtype("Zombie")) { + if (creature.hasSubtype("Zombie", game)) { creature.tap(game); creature.moveToExile(source.getSourceId(), creature.getName(), source.getSourceId(), game); } else { diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/AkoumHellkite.java b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumHellkite.java index b1987a95f8f..25a8dff3e51 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/AkoumHellkite.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/AkoumHellkite.java @@ -146,7 +146,7 @@ class AkoumHellkiteDamageEffect extends OneShotEffect { Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); Player player = game.getPlayer(source.getFirstTarget()); if (land != null && player != null) { - if (land.hasSubtype("Mountain")) { + if (land.hasSubtype("Mountain", game)) { player.damage(2, source.getSourceId(), game, false, true); } else { player.damage(1, source.getSourceId(), game, false, true); @@ -155,7 +155,7 @@ class AkoumHellkiteDamageEffect extends OneShotEffect { } Permanent permanent = game.getPermanent(source.getFirstTarget()); if (land != null && permanent != null) { - if (land.hasSubtype("Mountain")) { + if (land.hasSubtype("Mountain", game)) { permanent.damage(2, source.getSourceId(), game, false, true); } else { permanent.damage(1, source.getSourceId(), game, false, true); diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EmeriaShepherd.java b/Mage.Sets/src/mage/sets/battleforzendikar/EmeriaShepherd.java index 315406fcb09..c334f2516f1 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/EmeriaShepherd.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/EmeriaShepherd.java @@ -109,7 +109,7 @@ class EmeriaShepherdReturnToHandTargetEffect extends OneShotEffect { return false; } Zone toZone = Zone.HAND; - if (triggeringLand.getSubtype().contains("Plains") + if (triggeringLand.getSubtype(game).contains("Plains") && controller.chooseUse(Outcome.PutCardInPlay, "Put the card to battlefield instead?", source, game)) { toZone = Zone.BATTLEFIELD; } diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java b/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java index 3df407ef198..776c768c47f 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java @@ -152,7 +152,7 @@ class GuardianOfTazeemEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); Permanent targetCreature = game.getPermanent(source.getFirstTarget()); - if (land != null && targetCreature != null && land.hasSubtype("Island")) { + if (land != null && targetCreature != null && land.hasSubtype("Island", game)) { ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("that creature"); effect.setTargetPointer(new FixedTarget(targetCreature, game)); game.addEffect(effect, source); diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GuulDrazOverseer.java b/Mage.Sets/src/mage/sets/battleforzendikar/GuulDrazOverseer.java index 3260c68f2c7..2e15699f028 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/GuulDrazOverseer.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/GuulDrazOverseer.java @@ -96,7 +96,7 @@ class GuulDrazOverseerEffect extends OneShotEffect { Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); if (controller != null && land != null) { int boost = 1; - if (land.getSubtype().contains("Swamp")) { + if (land.getSubtype(game).contains("Swamp")) { boost = 2; } game.addEffect(new BoostControlledEffect(boost, 0, Duration.EndOfTurn, true), source); diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java b/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java index a997e01fd4b..4773b8a0a57 100644 --- a/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java +++ b/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java @@ -144,7 +144,7 @@ class OranRiefHydraEffect extends OneShotEffect { Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); Permanent sourcePermanent = game.getPermanent(source.getSourceId()); if (land != null && sourcePermanent != null) { - if (land.hasSubtype("Forest")) { + if (land.hasSubtype("Forest", game)) { sourcePermanent.addCounters(CounterType.P1P1.createInstance(2), game); } else { sourcePermanent.addCounters(CounterType.P1P1.createInstance(), game); diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/Shuriken.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/Shuriken.java index 3ea7e2a5c70..19dbf6056a1 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/Shuriken.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/Shuriken.java @@ -208,7 +208,7 @@ class ShurikenControlEffect extends OneShotEffect { if (equipment != null) { Permanent creature = game.getPermanent(source.getSourceId()); if (creature != null) { - if (!creature.hasSubtype("Ninja")) { + if (!creature.hasSubtype("Ninja", game)) { Permanent damagedCreature = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (damagedCreature == null) { damagedCreature = (Permanent) game.getLastKnownInformation(this.getTargetPointer().getFirst(game, source), Zone.BATTLEFIELD); diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/SlumberingTora.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/SlumberingTora.java index a1c1da76e86..b4e170ad999 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/SlumberingTora.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/SlumberingTora.java @@ -99,7 +99,7 @@ public class SlumberingTora extends CardImpl { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { permanent.getCardType().add(CardType.CREATURE); - permanent.getSubtype().add("Cat"); + permanent.getSubtype(game).add("Cat"); } break; case PTChangingEffects_7: diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/UncheckedGrowth.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/UncheckedGrowth.java index 82ec17eac9c..f45695f5e38 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/UncheckedGrowth.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/UncheckedGrowth.java @@ -93,7 +93,7 @@ public class UncheckedGrowth extends CardImpl { int affectedTargets = 0; for (UUID permanentId : targetPointer.getTargets(game, source)) { Permanent permanent = game.getPermanent(permanentId); - if (permanent != null && permanent.hasSubtype("Spirit")) { + if (permanent != null && permanent.hasSubtype("Spirit", game)) { permanent.addAbility(TrampleAbility.getInstance(), game); affectedTargets++; } diff --git a/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java b/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java index dc091c0b57f..d3c5cc03a72 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/EverflameEidolon.java @@ -98,7 +98,7 @@ class EverflameEidolonEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (sourceObject != null) { - if (sourceObject.getSubtype().contains("Aura")) { + if (sourceObject.getSubtype(game).contains("Aura")) { new BoostEnchantedEffect(1, 0, Duration.EndOfTurn).apply(game, source); } else { game.addEffect(new BoostSourceEffect(1, 0, Duration.EndOfTurn), source); diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/FloatingDreamZubera.java b/Mage.Sets/src/mage/sets/championsofkamigawa/FloatingDreamZubera.java index 37b726e4745..7eba0295632 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/FloatingDreamZubera.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/FloatingDreamZubera.java @@ -97,7 +97,7 @@ class ZuberasDiedWatcher extends Watcher { public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).isDiesEvent()) { MageObject card = game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); - if (card != null && card.hasSubtype("Zubera")) { + if (card != null && card.hasSubtype("Zubera", game)) { zuberasDiedThisTurn++; } } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/KondasBanner.java b/Mage.Sets/src/mage/sets/championsofkamigawa/KondasBanner.java index ede835d57b0..2a46977a015 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/KondasBanner.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/KondasBanner.java @@ -116,7 +116,7 @@ class KondasBannerTypeBoostEffect extends BoostAllEffect { Permanent equipedCreature = game.getPermanent(equipment.getAttachedTo()); if (equipedCreature != null) { for (Permanent perm : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { - if (CardUtil.shareSubtypes(perm, equipedCreature)) { + if (CardUtil.shareSubtypes(perm, equipedCreature, game)) { perm.addPower(power.calculate(game, source, this)); perm.addToughness(toughness.calculate(game, source, this)); diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SeshiroTheAnointed.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SeshiroTheAnointed.java index 1f472f80a0f..ba64bc49613 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SeshiroTheAnointed.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SeshiroTheAnointed.java @@ -106,7 +106,7 @@ class SeshiroTheAnointedAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { DamagedPlayerEvent damageEvent = (DamagedPlayerEvent)event; Permanent p = game.getPermanent(event.getSourceId()); - if (damageEvent.isCombatDamage() && p != null && p.hasSubtype("Snake") && p.getControllerId().equals(controllerId)) { + if (damageEvent.isCombatDamage() && p != null && p.hasSubtype("Snake", game) && p.getControllerId().equals(controllerId)) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java index 8cdf926c72c..039cf7e2ffa 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java @@ -117,7 +117,7 @@ class SosukeSonOfSeshiroTriggeredAbility extends TriggeredAbilityImpl { Permanent sourceCreature = game.getPermanent(event.getSourceId()); Permanent targetCreature = game.getPermanent(event.getTargetId()); if (sourceCreature != null && sourceCreature.getControllerId().equals(this.getControllerId()) - && targetCreature != null && sourceCreature.hasSubtype("Warrior")) { + && targetCreature != null && sourceCreature.hasSubtype("Warrior", game)) { this.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); return true; } diff --git a/Mage.Sets/src/mage/sets/coldsnap/HaakonStromgaldScourge.java b/Mage.Sets/src/mage/sets/coldsnap/HaakonStromgaldScourge.java index 3905fb266aa..efdfee96f58 100644 --- a/Mage.Sets/src/mage/sets/coldsnap/HaakonStromgaldScourge.java +++ b/Mage.Sets/src/mage/sets/coldsnap/HaakonStromgaldScourge.java @@ -186,7 +186,7 @@ class HaakonPlayKnightsFromGraveyardEffect extends AsThoughEffectImpl { if (affectedControllerId.equals(source.getControllerId())) { Card knightToCast = game.getCard(objectId); if (knightToCast != null - && knightToCast.hasSubtype("Knight") + && knightToCast.hasSubtype("Knight", game) && knightToCast.getOwnerId().equals(source.getControllerId()) && game.getState().getZone(objectId) == Zone.GRAVEYARD) { return true; diff --git a/Mage.Sets/src/mage/sets/coldsnap/Jokulmorder.java b/Mage.Sets/src/mage/sets/coldsnap/Jokulmorder.java index f35509c7ac3..1b0d645afe1 100644 --- a/Mage.Sets/src/mage/sets/coldsnap/Jokulmorder.java +++ b/Mage.Sets/src/mage/sets/coldsnap/Jokulmorder.java @@ -110,7 +110,7 @@ class JokulmorderTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent land = game.getPermanent(event.getTargetId()); - return land.getSubtype().contains("Island") + return land.getSubtype(game).contains("Island") && land.getControllerId().equals(this.controllerId); } diff --git a/Mage.Sets/src/mage/sets/commander2014/MyriadLandscape.java b/Mage.Sets/src/mage/sets/commander2014/MyriadLandscape.java index 17c47b39b64..1549853659b 100644 --- a/Mage.Sets/src/mage/sets/commander2014/MyriadLandscape.java +++ b/Mage.Sets/src/mage/sets/commander2014/MyriadLandscape.java @@ -110,11 +110,11 @@ class TargetCardInLibrarySharingLandType extends TargetCardInLibrary { if (landCard != null) { if (landTypes == null) { landTypes = new HashSet<>(); - landTypes.addAll(landCard.getSubtype()); + landTypes.addAll(landCard.getSubtype(game)); } else { for (Iterator iterator = landTypes.iterator(); iterator.hasNext();) { String next = iterator.next(); - if (!landCard.getSubtype().contains(next)) { + if (!landCard.getSubtype(game).contains(next)) { iterator.remove(); } } @@ -125,7 +125,7 @@ class TargetCardInLibrarySharingLandType extends TargetCardInLibrary { if (card != null && landTypes != null) { for (Iterator iterator = landTypes.iterator(); iterator.hasNext();) { String next = iterator.next(); - if (card.getSubtype().contains(next)) { + if (card.getSubtype(game).contains(next)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/commander2014/NecromanticSelection.java b/Mage.Sets/src/mage/sets/commander2014/NecromanticSelection.java index 80547d636a6..103d72ad18e 100644 --- a/Mage.Sets/src/mage/sets/commander2014/NecromanticSelection.java +++ b/Mage.Sets/src/mage/sets/commander2014/NecromanticSelection.java @@ -158,8 +158,8 @@ class NecromanticSelectionContinuousEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - if (!creature.getSubtype().contains("Zombie")) { - creature.getSubtype().add("Zombie"); + if (!creature.getSubtype(game).contains("Zombie")) { + creature.getSubtype(game).add("Zombie"); } } break; diff --git a/Mage.Sets/src/mage/sets/commander2014/SongOfTheDryads.java b/Mage.Sets/src/mage/sets/commander2014/SongOfTheDryads.java index 41009ed74a2..bc0eb63a6be 100644 --- a/Mage.Sets/src/mage/sets/commander2014/SongOfTheDryads.java +++ b/Mage.Sets/src/mage/sets/commander2014/SongOfTheDryads.java @@ -121,8 +121,8 @@ class BecomesColorlessForestLandEffect extends ContinuousEffectImpl { case TypeChangingEffects_4: permanent.getCardType().clear(); permanent.getCardType().add(CardType.LAND); - permanent.getSubtype().clear(); - permanent.getSubtype().add("Forest"); + permanent.getSubtype(game).clear(); + permanent.getSubtype(game).add("Forest"); break; } return true; diff --git a/Mage.Sets/src/mage/sets/commander2015/KasetoOrochiArchmage.java b/Mage.Sets/src/mage/sets/commander2015/KasetoOrochiArchmage.java index 02f9e111977..5651717c57d 100644 --- a/Mage.Sets/src/mage/sets/commander2015/KasetoOrochiArchmage.java +++ b/Mage.Sets/src/mage/sets/commander2015/KasetoOrochiArchmage.java @@ -97,7 +97,7 @@ class KasetoEffect extends OneShotEffect { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent != null) { game.addEffect(new CantBeBlockedTargetEffect(Duration.EndOfTurn), source); - if (permanent.getSubtype().contains("Snake")) { + if (permanent.getSubtype(game).contains("Snake")) { game.addEffect(new BoostTargetEffect(2,2,Duration.EndOfTurn), source); } return true; diff --git a/Mage.Sets/src/mage/sets/conflux/DragonsoulKnight.java b/Mage.Sets/src/mage/sets/conflux/DragonsoulKnight.java index 81cb99049bd..9bd4e2c8884 100644 --- a/Mage.Sets/src/mage/sets/conflux/DragonsoulKnight.java +++ b/Mage.Sets/src/mage/sets/conflux/DragonsoulKnight.java @@ -117,8 +117,8 @@ public class DragonsoulKnight extends CardImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - permanent.getSubtype().clear(); - permanent.getSubtype().add("Dragon"); + permanent.getSubtype(game).clear(); + permanent.getSubtype(game).add("Dragon"); } break; } diff --git a/Mage.Sets/src/mage/sets/conflux/ParagonOfTheAmesha.java b/Mage.Sets/src/mage/sets/conflux/ParagonOfTheAmesha.java index 314a165e37d..87a26e54347 100644 --- a/Mage.Sets/src/mage/sets/conflux/ParagonOfTheAmesha.java +++ b/Mage.Sets/src/mage/sets/conflux/ParagonOfTheAmesha.java @@ -117,8 +117,8 @@ public class ParagonOfTheAmesha extends CardImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - permanent.getSubtype().clear(); - permanent.getSubtype().add("Angel"); + permanent.getSubtype(game).clear(); + permanent.getSubtype(game).add("Angel"); } break; } diff --git a/Mage.Sets/src/mage/sets/conspiracy/IgnitionTeam.java b/Mage.Sets/src/mage/sets/conspiracy/IgnitionTeam.java index b85f110fe1f..ef9b702c64f 100644 --- a/Mage.Sets/src/mage/sets/conspiracy/IgnitionTeam.java +++ b/Mage.Sets/src/mage/sets/conspiracy/IgnitionTeam.java @@ -121,7 +121,7 @@ class IgnitionTeamToken extends Token { public IgnitionTeamToken() { super("", "4/4 red Elemental creature"); this.cardType.add(CardType.CREATURE); - this.getSubtype().add("Elemental"); + this.getSubtype(null).add("Elemental"); this.color.setRed(true); this.power = new MageInt(4); diff --git a/Mage.Sets/src/mage/sets/darkascension/AvacynsCollar.java b/Mage.Sets/src/mage/sets/darkascension/AvacynsCollar.java index 209dd59ee25..5a54ce770ef 100644 --- a/Mage.Sets/src/mage/sets/darkascension/AvacynsCollar.java +++ b/Mage.Sets/src/mage/sets/darkascension/AvacynsCollar.java @@ -103,7 +103,7 @@ class AvacynsCollarTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (((ZoneChangeEvent) event).isDiesEvent()) { Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); - if (permanent.getAttachments().contains(this.getSourceId()) && permanent.hasSubtype("Human")) { + if (permanent.getAttachments().contains(this.getSourceId()) && permanent.hasSubtype("Human", game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/darkascension/CallToTheKindred.java b/Mage.Sets/src/mage/sets/darkascension/CallToTheKindred.java index 391a2a3fa2f..3be4ffa0d58 100644 --- a/Mage.Sets/src/mage/sets/darkascension/CallToTheKindred.java +++ b/Mage.Sets/src/mage/sets/darkascension/CallToTheKindred.java @@ -127,7 +127,7 @@ class CallToTheKindredEffect extends OneShotEffect { if (!creature.getAbilities().contains(ChangelingAbility.getInstance())) { StringBuilder sb = new StringBuilder("creature card with at least one subtype from: "); ArrayList> subtypes = new ArrayList<>(); - for (String subtype : creature.getSubtype()) { + for (String subtype : creature.getSubtype(game)) { subtypes.add(new SubtypePredicate(subtype)); sb.append(subtype).append(", "); } diff --git a/Mage.Sets/src/mage/sets/darkascension/CurseOfMisfortunes.java b/Mage.Sets/src/mage/sets/darkascension/CurseOfMisfortunes.java index 29dae5d38ef..e0296f35708 100644 --- a/Mage.Sets/src/mage/sets/darkascension/CurseOfMisfortunes.java +++ b/Mage.Sets/src/mage/sets/darkascension/CurseOfMisfortunes.java @@ -108,7 +108,7 @@ class CurseOfMisfortunesEffect extends OneShotEffect { // get the names of attached Curses for (UUID attachmentId: targetPlayer.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype().contains("Curse")) { + if (attachment != null && attachment.getSubtype(game).contains("Curse")) { filter.add(Predicates.not(new NamePredicate(attachment.getName()))); } } diff --git a/Mage.Sets/src/mage/sets/darkascension/CurseOfThirst.java b/Mage.Sets/src/mage/sets/darkascension/CurseOfThirst.java index 9a5b75ad48d..974ff0568ec 100644 --- a/Mage.Sets/src/mage/sets/darkascension/CurseOfThirst.java +++ b/Mage.Sets/src/mage/sets/darkascension/CurseOfThirst.java @@ -136,7 +136,7 @@ class CursesAttachedCount implements DynamicValue { if (player != null) { for (UUID attachmentId: player.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype().contains("Curse")) + if (attachment != null && attachment.getSubtype(game).contains("Curse")) count++; } } diff --git a/Mage.Sets/src/mage/sets/darkascension/DeathsCaress.java b/Mage.Sets/src/mage/sets/darkascension/DeathsCaress.java index e3bc4a4706b..5f665cc52d0 100644 --- a/Mage.Sets/src/mage/sets/darkascension/DeathsCaress.java +++ b/Mage.Sets/src/mage/sets/darkascension/DeathsCaress.java @@ -89,7 +89,7 @@ class DeathsCaressEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); Permanent creature = (Permanent) game.getLastKnownInformation(source.getFirstTarget(), Zone.BATTLEFIELD); - if (player != null && creature != null && creature.hasSubtype("Human")) { + if (player != null && creature != null && creature.hasSubtype("Human", game)) { player.gainLife(creature.getToughness().getValue(), game); return true; } diff --git a/Mage.Sets/src/mage/sets/darkascension/FalkenrathAristocrat.java b/Mage.Sets/src/mage/sets/darkascension/FalkenrathAristocrat.java index 75e242e0968..be9fb20d4c1 100644 --- a/Mage.Sets/src/mage/sets/darkascension/FalkenrathAristocrat.java +++ b/Mage.Sets/src/mage/sets/darkascension/FalkenrathAristocrat.java @@ -106,7 +106,7 @@ class FalkenrathAristocratEffect extends OneShotEffect { if (cost instanceof SacrificeTargetCost) { Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0); Permanent sourceCreature = game.getPermanent(source.getSourceId()); - if (sacrificedCreature.hasSubtype("Human") && sourceCreature != null) { + if (sacrificedCreature.hasSubtype("Human", game) && sourceCreature != null) { sourceCreature.addCounters(CounterType.P1P1.createInstance(), game); return true; } diff --git a/Mage.Sets/src/mage/sets/darkascension/FalkenrathTorturer.java b/Mage.Sets/src/mage/sets/darkascension/FalkenrathTorturer.java index 23c6d8e3d2d..2fbd5451b19 100644 --- a/Mage.Sets/src/mage/sets/darkascension/FalkenrathTorturer.java +++ b/Mage.Sets/src/mage/sets/darkascension/FalkenrathTorturer.java @@ -102,7 +102,7 @@ class FalkenrathTorturerEffect extends OneShotEffect { if (cost instanceof SacrificeTargetCost) { Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0); Permanent sourceCreature = game.getPermanent(source.getSourceId()); - if (sacrificedCreature.hasSubtype("Human") && sourceCreature != null) { + if (sacrificedCreature.hasSubtype("Human", game) && sourceCreature != null) { sourceCreature.addCounters(CounterType.P1P1.createInstance(), game); return true; } diff --git a/Mage.Sets/src/mage/sets/darkascension/LostInTheWoods.java b/Mage.Sets/src/mage/sets/darkascension/LostInTheWoods.java index fd593d07e72..66178ce6d29 100644 --- a/Mage.Sets/src/mage/sets/darkascension/LostInTheWoods.java +++ b/Mage.Sets/src/mage/sets/darkascension/LostInTheWoods.java @@ -96,7 +96,7 @@ class LostInTheWoodsEffect extends OneShotEffect { controller.revealCards(sourceObject.getName(), cards, game); if (card != null) { - if (card.getSubtype().contains("Forest")) { + if (card.getSubtype(game).contains("Forest")) { Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); if (permanent != null) { permanent.removeFromCombat(game); diff --git a/Mage.Sets/src/mage/sets/darkascension/MikaeusTheUnhallowed.java b/Mage.Sets/src/mage/sets/darkascension/MikaeusTheUnhallowed.java index b0df33eda0a..3b1f5ef6de0 100644 --- a/Mage.Sets/src/mage/sets/darkascension/MikaeusTheUnhallowed.java +++ b/Mage.Sets/src/mage/sets/darkascension/MikaeusTheUnhallowed.java @@ -114,7 +114,7 @@ class MikaeusTheUnhallowedAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getTargetId().equals(this.controllerId)) { Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null && permanent.hasSubtype("Human")) { + if (permanent != null && permanent.hasSubtype("Human", game)) { this.getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId())); return true; } diff --git a/Mage.Sets/src/mage/sets/darksteel/MurderousSpoils.java b/Mage.Sets/src/mage/sets/darksteel/MurderousSpoils.java index 80c5130db5a..c63973265c0 100644 --- a/Mage.Sets/src/mage/sets/darksteel/MurderousSpoils.java +++ b/Mage.Sets/src/mage/sets/darksteel/MurderousSpoils.java @@ -100,7 +100,7 @@ class MurderousSpoilsEffect extends OneShotEffect { List attachments = new ArrayList(); for (UUID uuid : target.getAttachments()) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached.getSubtype().contains("Equipment")) { + if (attached.getSubtype(game).contains("Equipment")) { attachments.add(attached); } } diff --git a/Mage.Sets/src/mage/sets/darksteel/WireflyHive.java b/Mage.Sets/src/mage/sets/darksteel/WireflyHive.java index 0bdba0a96cf..53040b5ea2a 100644 --- a/Mage.Sets/src/mage/sets/darksteel/WireflyHive.java +++ b/Mage.Sets/src/mage/sets/darksteel/WireflyHive.java @@ -115,7 +115,7 @@ class WireflyToken extends Token { this.setOriginalExpansionSetCode("DST"); this.getPower().modifyBaseValue(2); this.getToughness().modifyBaseValue(2); - this.getSubtype().add("Insect"); + this.getSubtype(null).add("Insect"); this.getCardType().add(CardType.ARTIFACT); this.getCardType().add(CardType.CREATURE); } diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/MazesEnd.java b/Mage.Sets/src/mage/sets/dragonsmaze/MazesEnd.java index b8ff5248c04..da6ced7f428 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/MazesEnd.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/MazesEnd.java @@ -114,7 +114,7 @@ class MazesEndEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { List names = new ArrayList(); for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { - if (permanent.hasSubtype("Gate")) { + if (permanent.hasSubtype("Gate", game)) { if (!names.contains(permanent.getName())) { names.add(permanent.getName()); } diff --git a/Mage.Sets/src/mage/sets/dragonsoftarkir/HavenOfTheSpiritDragon.java b/Mage.Sets/src/mage/sets/dragonsoftarkir/HavenOfTheSpiritDragon.java index 8e7a0c3a87c..30f30abf37d 100644 --- a/Mage.Sets/src/mage/sets/dragonsoftarkir/HavenOfTheSpiritDragon.java +++ b/Mage.Sets/src/mage/sets/dragonsoftarkir/HavenOfTheSpiritDragon.java @@ -124,7 +124,7 @@ class HavenOfTheSpiritManaCondition extends CreatureCastManaCondition { public boolean apply(Game game, Ability source, UUID manaProducer, Cost costToPay) { if (super.apply(game, source)) { MageObject object = game.getObject(source.getSourceId()); - if (object.hasSubtype("Dragon") + if (object.hasSubtype("Dragon", game) && object.getCardType().contains(CardType.CREATURE)) { return true; } @@ -141,7 +141,7 @@ class DragonCreatureCardPredicate implements Predicate { @Override public boolean apply(Card input, Game game) { return input.getCardType().contains(CardType.CREATURE) - && input.getSubtype().contains("Dragon"); + && input.getSubtype(game).contains("Dragon"); } @Override diff --git a/Mage.Sets/src/mage/sets/eldritchmoon/CemeteryRecruitment.java b/Mage.Sets/src/mage/sets/eldritchmoon/CemeteryRecruitment.java index e4c7690482e..162d6c4ea86 100644 --- a/Mage.Sets/src/mage/sets/eldritchmoon/CemeteryRecruitment.java +++ b/Mage.Sets/src/mage/sets/eldritchmoon/CemeteryRecruitment.java @@ -89,7 +89,7 @@ class CemeteryRecruitmentEffect extends OneShotEffect { Card card = game.getCard(targetPointer.getFirst(game, source)); if (card != null) { if (controller.moveCards(card, Zone.HAND, source, game) - && card.getSubtype().contains("Zombie")) { + && card.getSubtype(game).contains("Zombie")) { controller.drawCards(1, game); } } diff --git a/Mage.Sets/src/mage/sets/eldritchmoon/CoaxFromTheBlindEternities.java b/Mage.Sets/src/mage/sets/eldritchmoon/CoaxFromTheBlindEternities.java index b09d3e29171..38cc856af3f 100644 --- a/Mage.Sets/src/mage/sets/eldritchmoon/CoaxFromTheBlindEternities.java +++ b/Mage.Sets/src/mage/sets/eldritchmoon/CoaxFromTheBlindEternities.java @@ -110,7 +110,7 @@ class CoaxFromTheBlindEternitiesEffect extends OneShotEffect { filteredCards.add(sideboardCard.getId()); } for (Card exileCard : exile) { - if (exileCard.getOwnerId().equals(source.getControllerId()) && exileCard.hasSubtype("Eldrazi")) { + if (exileCard.getOwnerId().equals(source.getControllerId()) && exileCard.hasSubtype("Eldrazi", game)) { filteredCards.add(exileCard); } } diff --git a/Mage.Sets/src/mage/sets/eldritchmoon/GisaAndGeralf.java b/Mage.Sets/src/mage/sets/eldritchmoon/GisaAndGeralf.java index 840dea61695..58a485db995 100644 --- a/Mage.Sets/src/mage/sets/eldritchmoon/GisaAndGeralf.java +++ b/Mage.Sets/src/mage/sets/eldritchmoon/GisaAndGeralf.java @@ -175,7 +175,7 @@ class GisaAndGeralfWatcher extends Watcher { public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getZone() == Zone.GRAVEYARD) { Spell spell = (Spell) game.getObject(event.getTargetId()); - if (spell.getCardType().contains(CardType.CREATURE) && spell.getSubtype().contains("Zombie")) { + if (spell.getCardType().contains(CardType.CREATURE) && spell.getSubtype(game).contains("Zombie")) { abilityUsed = true; } } diff --git a/Mage.Sets/src/mage/sets/eldritchmoon/ImprisonedInTheMoon.java b/Mage.Sets/src/mage/sets/eldritchmoon/ImprisonedInTheMoon.java index 194a3b54a32..d8d012752b5 100644 --- a/Mage.Sets/src/mage/sets/eldritchmoon/ImprisonedInTheMoon.java +++ b/Mage.Sets/src/mage/sets/eldritchmoon/ImprisonedInTheMoon.java @@ -136,7 +136,7 @@ class BecomesColorlessLandEffect extends ContinuousEffectImpl { permanent.getCardType().clear(); permanent.getCardType().add(CardType.LAND); if (!isLand) { - permanent.getSubtype().clear(); + permanent.getSubtype(game).clear(); } break; } diff --git a/Mage.Sets/src/mage/sets/eldritchmoon/SlayersCleaver.java b/Mage.Sets/src/mage/sets/eldritchmoon/SlayersCleaver.java index b59fd670a74..b98dab2ec3a 100644 --- a/Mage.Sets/src/mage/sets/eldritchmoon/SlayersCleaver.java +++ b/Mage.Sets/src/mage/sets/eldritchmoon/SlayersCleaver.java @@ -90,7 +90,7 @@ class SlayersCleaverEffect extends RequirementEffect { @Override public boolean applies(Permanent permanent, Ability source, Game game) { - return permanent.canBlock(source.getSourceId(), game) && permanent.hasSubtype("Eldrazi"); + return permanent.canBlock(source.getSourceId(), game) && permanent.hasSubtype("Eldrazi", game); } @Override diff --git a/Mage.Sets/src/mage/sets/fallenempires/HomaridSpawningBed.java b/Mage.Sets/src/mage/sets/fallenempires/HomaridSpawningBed.java index eac5d491f81..3f53f2733b8 100644 --- a/Mage.Sets/src/mage/sets/fallenempires/HomaridSpawningBed.java +++ b/Mage.Sets/src/mage/sets/fallenempires/HomaridSpawningBed.java @@ -85,7 +85,7 @@ class CamaridToken extends Token { this.getPower().modifyBaseValue(1); this.getToughness().modifyBaseValue(1); this.color.setBlue(true); - this.getSubtype().add("Camarid"); + this.getSubtype(null).add("Camarid"); this.getCardType().add(CardType.CREATURE); } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/fatereforged/CrucibleOfTheSpiritDragon.java b/Mage.Sets/src/mage/sets/fatereforged/CrucibleOfTheSpiritDragon.java index 3e7c8fe5cb1..2781288eb52 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/CrucibleOfTheSpiritDragon.java +++ b/Mage.Sets/src/mage/sets/fatereforged/CrucibleOfTheSpiritDragon.java @@ -115,7 +115,7 @@ class CrucibleOfTheSpiritDragonManaCondition implements Condition { @Override public boolean apply(Game game, Ability source) { MageObject object = game.getObject(source.getSourceId()); - if (object != null && object.hasSubtype("Dragon")) { + if (object != null && object.hasSubtype("Dragon", game)) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/fatereforged/FearsomeAwakening.java b/Mage.Sets/src/mage/sets/fatereforged/FearsomeAwakening.java index 671506b30a4..f0da8455568 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/FearsomeAwakening.java +++ b/Mage.Sets/src/mage/sets/fatereforged/FearsomeAwakening.java @@ -86,7 +86,7 @@ class FearsomeAwakeningEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent != null && permanent.hasSubtype("Dragon")) { + if (permanent != null && permanent.hasSubtype("Dragon", game)) { permanent.addCounters(CounterType.P1P1.createInstance(2), game); return true; } diff --git a/Mage.Sets/src/mage/sets/fatereforged/MarduWoeReaper.java b/Mage.Sets/src/mage/sets/fatereforged/MarduWoeReaper.java index 77ef5b6b78b..8679ee65ea9 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/MarduWoeReaper.java +++ b/Mage.Sets/src/mage/sets/fatereforged/MarduWoeReaper.java @@ -99,7 +99,7 @@ class MarduWoeReaperTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getPlayerId().equals(this.getControllerId())) { Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && (permanent.getId().equals(this.getSourceId()) || permanent.hasSubtype("Warrior"))) { + if (permanent != null && (permanent.getId().equals(this.getSourceId()) || permanent.hasSubtype("Warrior", game))) { return true; } } diff --git a/Mage.Sets/src/mage/sets/fifthdawn/ChimericCoils.java b/Mage.Sets/src/mage/sets/fifthdawn/ChimericCoils.java index 0f433f8637f..7cbcffd78a1 100644 --- a/Mage.Sets/src/mage/sets/fifthdawn/ChimericCoils.java +++ b/Mage.Sets/src/mage/sets/fifthdawn/ChimericCoils.java @@ -96,7 +96,7 @@ class ChimericCoilsEffect extends ContinuousEffectImpl { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { permanent.getCardType().add(CardType.CREATURE); - permanent.getSubtype().add("Construct"); + permanent.getSubtype(game).add("Construct"); } break; case PTChangingEffects_7: diff --git a/Mage.Sets/src/mage/sets/fifthdawn/GoblinBrawler.java b/Mage.Sets/src/mage/sets/fifthdawn/GoblinBrawler.java index 5851db67059..702bf3486d6 100644 --- a/Mage.Sets/src/mage/sets/fifthdawn/GoblinBrawler.java +++ b/Mage.Sets/src/mage/sets/fifthdawn/GoblinBrawler.java @@ -99,7 +99,7 @@ class CantBeEquippedSourceEffect extends ContinuousRuleModifyingEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { if (event.getTargetId().equals(source.getSourceId())) { Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null && permanent.getSubtype().contains("Equipment")) { + if (permanent != null && permanent.getSubtype(game).contains("Equipment")) { return true; } } diff --git a/Mage.Sets/src/mage/sets/fifthdawn/MephidrossVampire.java b/Mage.Sets/src/mage/sets/fifthdawn/MephidrossVampire.java index 91ab6c921f8..b39c3013eb7 100644 --- a/Mage.Sets/src/mage/sets/fifthdawn/MephidrossVampire.java +++ b/Mage.Sets/src/mage/sets/fifthdawn/MephidrossVampire.java @@ -118,8 +118,8 @@ class MephidrossVampireEffect extends ContinuousEffectImpl { creature.addAbility(new DealsDamageToACreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, false, false), source.getSourceId(), game); break; case TypeChangingEffects_4: - if (!creature.getSubtype().contains("Vampire")) { - creature.getSubtype().add("Vampire"); + if (!creature.getSubtype(game).contains("Vampire")) { + creature.getSubtype(game).add("Vampire"); } break; } diff --git a/Mage.Sets/src/mage/sets/fourthedition/SirensCall.java b/Mage.Sets/src/mage/sets/fourthedition/SirensCall.java index 654864c4e3f..e686777a4ad 100644 --- a/Mage.Sets/src/mage/sets/fourthedition/SirensCall.java +++ b/Mage.Sets/src/mage/sets/fourthedition/SirensCall.java @@ -135,7 +135,7 @@ class SirensCallDestroyEffect extends OneShotEffect { if (player != null) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(player.getId())) { // Walls are safe. - if (permanent.getSubtype().contains("Wall")) { + if (permanent.getSubtype(game).contains("Wall")) { continue; } // Creatures that attacked are safe. diff --git a/Mage.Sets/src/mage/sets/futuresight/DaybreakCoronet.java b/Mage.Sets/src/mage/sets/futuresight/DaybreakCoronet.java index fcb3ab20ff3..d547809722c 100644 --- a/Mage.Sets/src/mage/sets/futuresight/DaybreakCoronet.java +++ b/Mage.Sets/src/mage/sets/futuresight/DaybreakCoronet.java @@ -115,7 +115,7 @@ class AuraAttachedPredicate implements Predicate { if (!uuid.equals(ownId)) { Permanent attachment = game.getPermanent(uuid); if (attachment != null - && attachment.getSubtype().contains("Aura")) { + && attachment.getSubtype(game).contains("Aura")) { return true; } } diff --git a/Mage.Sets/src/mage/sets/futuresight/MagusOfTheMoon.java b/Mage.Sets/src/mage/sets/futuresight/MagusOfTheMoon.java index 75a6a5cb076..527d0afde72 100644 --- a/Mage.Sets/src/mage/sets/futuresight/MagusOfTheMoon.java +++ b/Mage.Sets/src/mage/sets/futuresight/MagusOfTheMoon.java @@ -113,8 +113,8 @@ public class MagusOfTheMoon extends CardImpl { // 305.7 Note that this doesn't remove any abilities that were granted to the land by other effects // So the ability removing has to be done before Layer 6 land.removeAllAbilities(source.getSourceId(), game); - land.getSubtype().removeAll(CardRepository.instance.getLandTypes()); - land.getSubtype().add("Mountain"); + land.getSubtype(game).removeAll(CardRepository.instance.getLandTypes()); + land.getSubtype(game).add("Mountain"); break; case AbilityAddingRemovingEffects_6: land.addAbility(new RedManaAbility(), source.getSourceId(), game); diff --git a/Mage.Sets/src/mage/sets/gatecrash/DeathcultRogue.java b/Mage.Sets/src/mage/sets/gatecrash/DeathcultRogue.java index 3680ee53789..1ea9096b60b 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/DeathcultRogue.java +++ b/Mage.Sets/src/mage/sets/gatecrash/DeathcultRogue.java @@ -92,7 +92,7 @@ class DeathcultRogueRestrictionEffect extends RestrictionEffect { @Override public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (blocker.getSubtype().contains("Rogue")) { + if (blocker.getSubtype(game).contains("Rogue")) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/gatecrash/Hydroform.java b/Mage.Sets/src/mage/sets/gatecrash/Hydroform.java index 41f3e451aac..8987e73d151 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/Hydroform.java +++ b/Mage.Sets/src/mage/sets/gatecrash/Hydroform.java @@ -70,7 +70,7 @@ class HydroformToken extends Token { public HydroformToken() { super("", "3/3 Elemental creature with flying"); this.cardType.add(CardType.CREATURE); - this.getSubtype().add("Elemental"); + this.getSubtype(null).add("Elemental"); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/sets/gatecrash/LazavDimirMastermind.java b/Mage.Sets/src/mage/sets/gatecrash/LazavDimirMastermind.java index de7f4c2013e..c81084b0101 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/LazavDimirMastermind.java +++ b/Mage.Sets/src/mage/sets/gatecrash/LazavDimirMastermind.java @@ -129,10 +129,10 @@ class LazavDimirEffect extends ContinuousEffectImpl { permanent.getCardType().add(type); } } - permanent.getSubtype().clear(); - for (String type : cardToCopy.getSubtype()) { - if (!permanent.getSubtype().contains(type)) { - permanent.getSubtype().add(type); + permanent.getSubtype(game).clear(); + for (String type : cardToCopy.getSubtype(game)) { + if (!permanent.getSubtype(game).contains(type)) { + permanent.getSubtype(game).add(type); } } permanent.getSupertype().clear(); diff --git a/Mage.Sets/src/mage/sets/gatecrash/OrzhovCharm.java b/Mage.Sets/src/mage/sets/gatecrash/OrzhovCharm.java index c30464641e9..c28725d324b 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/OrzhovCharm.java +++ b/Mage.Sets/src/mage/sets/gatecrash/OrzhovCharm.java @@ -119,7 +119,7 @@ class OrzhovCharmReturnToHandEffect extends OneShotEffect { for (UUID attachmentId : attachments) { Permanent attachment = game.getPermanent(attachmentId); if (attachment != null && attachment.getControllerId().equals(source.getControllerId()) - && attachment.getSubtype().contains("Aura")) { + && attachment.getSubtype(game).contains("Aura")) { attachment.moveToZone(Zone.HAND, source.getSourceId(), game, false); } } diff --git a/Mage.Sets/src/mage/sets/gatecrash/Realmwright.java b/Mage.Sets/src/mage/sets/gatecrash/Realmwright.java index 3b07a6c97c3..c46dc8123e5 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/Realmwright.java +++ b/Mage.Sets/src/mage/sets/gatecrash/Realmwright.java @@ -111,8 +111,8 @@ class RealmwrightEffect2 extends ContinuousEffectImpl { if (land != null) { switch (layer) { case TypeChangingEffects_4: - if (sublayer == SubLayer.NA && !land.getSubtype().contains(choice)) { - land.getSubtype().add(choice); + if (sublayer == SubLayer.NA && !land.getSubtype(game).contains(choice)) { + land.getSubtype(game).add(choice); } break; case AbilityAddingRemovingEffects_6: diff --git a/Mage.Sets/src/mage/sets/homelands/DrudgeSpell.java b/Mage.Sets/src/mage/sets/homelands/DrudgeSpell.java index 1600dac4b56..a26cfde7a2f 100644 --- a/Mage.Sets/src/mage/sets/homelands/DrudgeSpell.java +++ b/Mage.Sets/src/mage/sets/homelands/DrudgeSpell.java @@ -94,7 +94,7 @@ class SkeletonToken extends Token { this.getPower().modifyBaseValue(1); this.getToughness().modifyBaseValue(1); this.color.setBlack(true); - this.getSubtype().add("Skeleton"); + this.getSubtype(null).add("Skeleton"); this.getCardType().add(CardType.CREATURE); this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B}"))); diff --git a/Mage.Sets/src/mage/sets/iceage/NakedSingularity.java b/Mage.Sets/src/mage/sets/iceage/NakedSingularity.java index 1c086143d87..9ce0597bfcb 100644 --- a/Mage.Sets/src/mage/sets/iceage/NakedSingularity.java +++ b/Mage.Sets/src/mage/sets/iceage/NakedSingularity.java @@ -103,19 +103,19 @@ class NakedSingularityEffect extends ReplacementEffectImpl { Permanent permanent = game.getPermanent(event.getSourceId()); Choice choice = new ChoiceImpl(true); choice.setMessage("Pick a color to produce"); - if (permanent.hasSubtype("Plains")) { + if (permanent.hasSubtype("Plains", game)) { choice.getChoices().add("Red"); } - if (permanent.hasSubtype("Island")) { + if (permanent.hasSubtype("Island", game)) { choice.getChoices().add("Green"); } - if (permanent.hasSubtype("Swamp")) { + if (permanent.hasSubtype("Swamp", game)) { choice.getChoices().add("White"); } - if (permanent.hasSubtype("Mountain")) { + if (permanent.hasSubtype("Mountain", game)) { choice.getChoices().add("Blue"); } - if (permanent.hasSubtype("Forest")) { + if (permanent.hasSubtype("Forest", game)) { choice.getChoices().add("Black"); } String chosenColor; @@ -159,10 +159,10 @@ class NakedSingularityEffect extends ReplacementEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { Permanent permanent = game.getPermanent(event.getSourceId()); return permanent != null - && (permanent.hasSubtype("Plains") - || permanent.hasSubtype("Island") - || permanent.hasSubtype("Swamp") - || permanent.hasSubtype("Mountain") - || permanent.hasSubtype("Forest")); + && (permanent.hasSubtype("Plains", game) + || permanent.hasSubtype("Island", game) + || permanent.hasSubtype("Swamp", game) + || permanent.hasSubtype("Mountain", game) + || permanent.hasSubtype("Forest", game)); } } diff --git a/Mage.Sets/src/mage/sets/innistrad/DearlyDeparted.java b/Mage.Sets/src/mage/sets/innistrad/DearlyDeparted.java index 1e67b099e0f..a4439988c35 100644 --- a/Mage.Sets/src/mage/sets/innistrad/DearlyDeparted.java +++ b/Mage.Sets/src/mage/sets/innistrad/DearlyDeparted.java @@ -94,7 +94,7 @@ class DearlyDepartedEntersBattlefieldEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget(); - if (permanent != null && permanent.getControllerId().equals(source.getControllerId()) && permanent.hasSubtype("Human")) { + if (permanent != null && permanent.getControllerId().equals(source.getControllerId()) && permanent.hasSubtype("Human", game)) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/innistrad/ElderCathar.java b/Mage.Sets/src/mage/sets/innistrad/ElderCathar.java index 00f6d7b3604..cb68160b045 100644 --- a/Mage.Sets/src/mage/sets/innistrad/ElderCathar.java +++ b/Mage.Sets/src/mage/sets/innistrad/ElderCathar.java @@ -96,7 +96,7 @@ class ElderCatharAddCountersTargetEffect extends OneShotEffect { Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); if (permanent != null) { if (counter != null) { - if (permanent.hasSubtype("Human")) { + if (permanent.hasSubtype("Human", game)) { permanent.addCounters(counter2.copy(), game); } else { permanent.addCounters(counter.copy(), game); diff --git a/Mage.Sets/src/mage/sets/innistrad/GrimoireOfTheDead.java b/Mage.Sets/src/mage/sets/innistrad/GrimoireOfTheDead.java index 32a9a853fe8..566782c7eea 100644 --- a/Mage.Sets/src/mage/sets/innistrad/GrimoireOfTheDead.java +++ b/Mage.Sets/src/mage/sets/innistrad/GrimoireOfTheDead.java @@ -159,7 +159,7 @@ class GrimoireOfTheDeadEffect2 extends ContinuousEffectImpl { break; case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - permanent.getSubtype().add("Zombie"); + permanent.getSubtype(game).add("Zombie"); } break; } diff --git a/Mage.Sets/src/mage/sets/innistrad/RakishHeir.java b/Mage.Sets/src/mage/sets/innistrad/RakishHeir.java index 5b243df62e9..e29edc94c1f 100644 --- a/Mage.Sets/src/mage/sets/innistrad/RakishHeir.java +++ b/Mage.Sets/src/mage/sets/innistrad/RakishHeir.java @@ -96,7 +96,7 @@ class RakishHeirTriggeredAbility extends TriggeredAbilityImpl { DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; Permanent permanent = game.getPermanent(event.getSourceId()); if (damageEvent.isCombatDamage() && permanent != null - && permanent.hasSubtype("Vampire") && permanent.getControllerId().equals(controllerId)) { + && permanent.hasSubtype("Vampire", game) && permanent.getControllerId().equals(controllerId)) { this.getEffects().clear(); AddCountersTargetEffect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance()); effect.setTargetPointer(new FixedTarget(permanent.getId())); diff --git a/Mage.Sets/src/mage/sets/innistrad/RooftopStorm.java b/Mage.Sets/src/mage/sets/innistrad/RooftopStorm.java index 283ccafdad8..db849adf882 100644 --- a/Mage.Sets/src/mage/sets/innistrad/RooftopStorm.java +++ b/Mage.Sets/src/mage/sets/innistrad/RooftopStorm.java @@ -95,7 +95,7 @@ class RooftopStormCostReductionEffect extends CostModificationEffectImpl { Ability spell = abilityToModify; if (spell.getControllerId().equals(source.getControllerId())) { Card sourceCard = game.getCard(spell.getSourceId()); - if (sourceCard != null && sourceCard.hasSubtype("Zombie")) { + if (sourceCard != null && sourceCard.hasSubtype("Zombie", game)) { Player player = game.getPlayer(spell.getControllerId()); if (player != null && (CardUtil.isCheckPlayableMode(spell) || player.chooseUse(Outcome.Benefit, "Pay {0} rather than pay the mana cost for Zombie creature", source, game))) { diff --git a/Mage.Sets/src/mage/sets/innistrad/UndeadAlchemist.java b/Mage.Sets/src/mage/sets/innistrad/UndeadAlchemist.java index 4bc0fd520eb..e94afbc38e7 100644 --- a/Mage.Sets/src/mage/sets/innistrad/UndeadAlchemist.java +++ b/Mage.Sets/src/mage/sets/innistrad/UndeadAlchemist.java @@ -152,7 +152,7 @@ class UndeadAlchemistEffect extends ReplacementEffectImpl { DamagePlayerEvent damageEvent = (DamagePlayerEvent) event; if (damageEvent.isCombatDamage()) { Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null && permanent.hasSubtype("Zombie")) { + if (permanent != null && permanent.hasSubtype("Zombie", game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/innistrad/VillageCannibals.java b/Mage.Sets/src/mage/sets/innistrad/VillageCannibals.java index 5bceae86f7c..5391761e43c 100644 --- a/Mage.Sets/src/mage/sets/innistrad/VillageCannibals.java +++ b/Mage.Sets/src/mage/sets/innistrad/VillageCannibals.java @@ -95,7 +95,7 @@ class VillageCannibalsTriggeredAbility extends TriggeredAbilityImpl { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) { Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); - if (permanent != null && permanent.getCardType().contains(CardType.CREATURE) && permanent.hasSubtype("Human") + if (permanent != null && permanent.getCardType().contains(CardType.CREATURE) && permanent.hasSubtype("Human", game) && !permanent.getId().equals(this.getSourceId())) { return true; } diff --git a/Mage.Sets/src/mage/sets/innistrad/WitchbaneOrb.java b/Mage.Sets/src/mage/sets/innistrad/WitchbaneOrb.java index bbfc2c0f8d9..a051baa2d32 100644 --- a/Mage.Sets/src/mage/sets/innistrad/WitchbaneOrb.java +++ b/Mage.Sets/src/mage/sets/innistrad/WitchbaneOrb.java @@ -88,7 +88,7 @@ class WitchbaneOrbEffect extends OneShotEffect { if (player != null) { for (UUID attachmentId: player.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype().contains("Curse")) { + if (attachment != null && attachment.getSubtype(game).contains("Curse")) { attachment.destroy(source.getSourceId(), game, false); } } diff --git a/Mage.Sets/src/mage/sets/innistrad/WoodenStake.java b/Mage.Sets/src/mage/sets/innistrad/WoodenStake.java index 27f60255123..0addb69bb32 100644 --- a/Mage.Sets/src/mage/sets/innistrad/WoodenStake.java +++ b/Mage.Sets/src/mage/sets/innistrad/WoodenStake.java @@ -97,7 +97,7 @@ class WoodenStakeBlocksOrBecomesBlockedTriggeredAbility extends TriggeredAbility if (equipment != null && equipment.getAttachedTo() != null) { if (event.getSourceId().equals(equipment.getAttachedTo())) { Permanent blocks = game.getPermanent(event.getTargetId()); - if (blocks != null && blocks.hasSubtype("Vampire")) { + if (blocks != null && blocks.hasSubtype("Vampire", game)) { for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(event.getTargetId())); } @@ -107,7 +107,7 @@ class WoodenStakeBlocksOrBecomesBlockedTriggeredAbility extends TriggeredAbility } if (event.getTargetId().equals(equipment.getAttachedTo())) { Permanent blockedBy = game.getPermanent(event.getSourceId()); - if (blockedBy != null && blockedBy.hasSubtype("Vampire")) { + if (blockedBy != null && blockedBy.hasSubtype("Vampire", game)) { for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(event.getSourceId())); } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/Deicide.java b/Mage.Sets/src/mage/sets/journeyintonyx/Deicide.java index 17897310452..983920adea3 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/Deicide.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/Deicide.java @@ -92,7 +92,7 @@ class DeicideExileEffect extends SearchTargetGraveyardHandLibraryForCardNameAndE // if it is a God. For each of the Gods in the Theros block, it won’t matter what your // devotion to its color(s) was. The card is a God card when not on the battlefield. Card cardInExile = game.getExile().getCard(targetEnchantment.getId(), game); - if (cardInExile != null && cardInExile.hasSubtype("God")) { + if (cardInExile != null && cardInExile.hasSubtype("God", game)) { Player enchantmentController = game.getPlayer(targetEnchantment.getControllerId()); return super.applySearchAndExile(game, source, cardInExile.getName(), enchantmentController.getId()); } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/SilenceTheBelievers.java b/Mage.Sets/src/mage/sets/journeyintonyx/SilenceTheBelievers.java index f576b3dfcfc..7cd3e095934 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/SilenceTheBelievers.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/SilenceTheBelievers.java @@ -99,7 +99,7 @@ class SilenceTheBelieversExileEffect extends OneShotEffect { ArrayList attachments = new ArrayList<>(creature.getAttachments()); for (UUID attachmentId: attachments) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype().contains("Aura")) { + if (attachment != null && attachment.getSubtype(game).contains("Aura")) { controller.moveCardToExileWithInfo(attachment, null, null, source.getSourceId(), game, Zone.BATTLEFIELD, true); } } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/RaidersSpoils.java b/Mage.Sets/src/mage/sets/khansoftarkir/RaidersSpoils.java index 6ef96c8ac13..31e5ce888e2 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/RaidersSpoils.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/RaidersSpoils.java @@ -96,7 +96,7 @@ class RaidersSpoilsTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; Permanent permanent = game.getPermanent(event.getSourceId()); - if (damageEvent.isCombatDamage() && permanent != null && permanent.hasSubtype("Warrior") && permanent.getControllerId().equals(controllerId)) { + if (damageEvent.isCombatDamage() && permanent != null && permanent.hasSubtype("Warrior", game) && permanent.getControllerId().equals(controllerId)) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/SarkhanTheDragonspeaker.java b/Mage.Sets/src/mage/sets/khansoftarkir/SarkhanTheDragonspeaker.java index 2b79450a3fd..a34bf6882df 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/SarkhanTheDragonspeaker.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/SarkhanTheDragonspeaker.java @@ -126,8 +126,8 @@ class SarkhanTheDragonspeakerEffect extends ContinuousEffectImpl { if (sublayer == SubLayer.NA) { permanent.getCardType().clear(); permanent.getCardType().add(CardType.CREATURE); - permanent.getSubtype().clear(); - permanent.getSubtype().add("Dragon"); + permanent.getSubtype(game).clear(); + permanent.getSubtype(game).add("Dragon"); permanent.getSupertype().clear(); permanent.getSupertype().add("Legendary"); } diff --git a/Mage.Sets/src/mage/sets/legends/BartelRuneaxe.java b/Mage.Sets/src/mage/sets/legends/BartelRuneaxe.java index d4e3d3d89cf..98bf1734c3b 100644 --- a/Mage.Sets/src/mage/sets/legends/BartelRuneaxe.java +++ b/Mage.Sets/src/mage/sets/legends/BartelRuneaxe.java @@ -114,7 +114,7 @@ class BartelRuneaxeEffect extends ContinuousRuleModifyingEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { StackObject stackObject = (StackObject) game.getStack().getStackObject(event.getSourceId()); if (stackObject != null && event.getTargetId().equals(source.getSourceId())) { - if (stackObject.getSubtype().contains("Aura")) { + if (stackObject.getSubtype(game).contains("Aura")) { return true; } } diff --git a/Mage.Sets/src/mage/sets/legends/TetsuoUmezawa.java b/Mage.Sets/src/mage/sets/legends/TetsuoUmezawa.java index 1391bd81399..631d63b31cf 100644 --- a/Mage.Sets/src/mage/sets/legends/TetsuoUmezawa.java +++ b/Mage.Sets/src/mage/sets/legends/TetsuoUmezawa.java @@ -135,7 +135,7 @@ class TetsuoUmezawaEffect extends ContinuousRuleModifyingEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { StackObject stackObject = (StackObject) game.getStack().getStackObject(event.getSourceId()); if (stackObject != null && event.getTargetId().equals(source.getSourceId())) { - if (stackObject.getSubtype().contains("Aura")) { + if (stackObject.getSubtype(game).contains("Aura")) { return true; } } diff --git a/Mage.Sets/src/mage/sets/legions/GoblinAssassin.java b/Mage.Sets/src/mage/sets/legions/GoblinAssassin.java index 35866b1d301..29667964e1b 100644 --- a/Mage.Sets/src/mage/sets/legions/GoblinAssassin.java +++ b/Mage.Sets/src/mage/sets/legions/GoblinAssassin.java @@ -97,7 +97,7 @@ class GoblinAssassinTriggeredAbiliy extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { UUID targetId = event.getTargetId(); Permanent permanent = game.getPermanent(targetId); - if ((targetId.equals(this.getSourceId())) || (permanent.hasSubtype("Goblin") && !targetId.equals(this.getSourceId()))) { + if ((targetId.equals(this.getSourceId())) || (permanent.hasSubtype("Goblin", game) && !targetId.equals(this.getSourceId()))) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/legions/ToxinSliver.java b/Mage.Sets/src/mage/sets/legions/ToxinSliver.java index be0a4e660ac..4641e0d1bab 100644 --- a/Mage.Sets/src/mage/sets/legions/ToxinSliver.java +++ b/Mage.Sets/src/mage/sets/legions/ToxinSliver.java @@ -97,7 +97,7 @@ class DealsDamageTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (game.getPermanent(event.getSourceId()).hasSubtype("Sliver")) { + if (game.getPermanent(event.getSourceId()).hasSubtype("Sliver", game)) { if (setTargetPointer) { for (Effect effect : this.getEffects()) { effect.setTargetPointer(new FixedTarget(game.getControllerId(event.getTargetId()))); diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Conversion.java b/Mage.Sets/src/mage/sets/limitedalpha/Conversion.java index ebd5524d656..38ad356aa2d 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/Conversion.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/Conversion.java @@ -112,8 +112,8 @@ public class Conversion extends CardImpl { land.addAbility(new WhiteManaAbility(), source.getSourceId(), game); break; case TypeChangingEffects_4: - land.getSubtype().clear(); - land.getSubtype().add("Plains"); + land.getSubtype(game).clear(); + land.getSubtype(game).add("Plains"); break; } } diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Invisibility.java b/Mage.Sets/src/mage/sets/limitedalpha/Invisibility.java index 7c2b83ec59b..18d294fd410 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/Invisibility.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/Invisibility.java @@ -101,7 +101,7 @@ class CantBeBlockedByWallsEffect extends RestrictionEffect { @Override public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (!blocker.hasSubtype("Wall")) { + if (!blocker.hasSubtype("Wall", game)) { return false; } return true; diff --git a/Mage.Sets/src/mage/sets/limitedalpha/PhantasmalTerrain.java b/Mage.Sets/src/mage/sets/limitedalpha/PhantasmalTerrain.java index d7de486907b..6397f9ec79e 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/PhantasmalTerrain.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/PhantasmalTerrain.java @@ -113,8 +113,8 @@ class PhantasmalTerrainContinuousEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - land.getSubtype().clear(); - land.getSubtype().add(choice); + land.getSubtype(game).clear(); + land.getSubtype(game).add(choice); } break; case AbilityAddingRemovingEffects_6: diff --git a/Mage.Sets/src/mage/sets/lorwyn/EgoErasure.java b/Mage.Sets/src/mage/sets/lorwyn/EgoErasure.java index 3eaebdac2a4..838e36688de 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/EgoErasure.java +++ b/Mage.Sets/src/mage/sets/lorwyn/EgoErasure.java @@ -110,7 +110,7 @@ class EgoErasureLoseEffect extends ContinuousEffectImpl { for (Iterator it = affectedObjectList.iterator(); it.hasNext();) { Permanent permanent = it.next().getPermanent(game); if (permanent != null) { - permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); + permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); } else { it.remove(); } diff --git a/Mage.Sets/src/mage/sets/lorwyn/MistbindClique.java b/Mage.Sets/src/mage/sets/lorwyn/MistbindClique.java index 33f9ef68035..e56b7b808cb 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/MistbindClique.java +++ b/Mage.Sets/src/mage/sets/lorwyn/MistbindClique.java @@ -108,7 +108,7 @@ class MistbindCliqueAbility extends ZoneChangeTriggeredAbility { && event.getSourceId().equals(getSourceId()) && !event.getSourceId().equals(event.getTargetId())) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getTarget() != null && zEvent.getTarget().hasSubtype("Faerie")) { + if (zEvent.getTarget() != null && zEvent.getTarget().hasSubtype("Faerie", game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2010/CoatOfArms.java b/Mage.Sets/src/mage/sets/magic2010/CoatOfArms.java index 6641c9bb585..b88db65e9a9 100644 --- a/Mage.Sets/src/mage/sets/magic2010/CoatOfArms.java +++ b/Mage.Sets/src/mage/sets/magic2010/CoatOfArms.java @@ -92,16 +92,16 @@ class CoatOfArmsEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game); for (Permanent permanent : permanents) { - int amount = getAmount(permanents, permanent); + int amount = getAmount(permanents, permanent, game); permanent.addPower(amount); permanent.addToughness(amount); } return true; } - private int getAmount(List permanents, Permanent target) { + private int getAmount(List permanents, Permanent target, Game game) { int amount = 0; - List targetSubtype = target.getSubtype(); + List targetSubtype = target.getSubtype(game); if (target.getAbilities().contains(ChangelingAbility.getInstance())) { return permanents.size() - 1; } @@ -109,7 +109,7 @@ class CoatOfArmsEffect extends ContinuousEffectImpl { if (!permanent.getId().equals(target.getId())) { for (String subtype : targetSubtype) { if (!CardUtil.isNonCreatureSubtype(subtype)) { - if (permanent.hasSubtype(subtype)) { + if (permanent.hasSubtype(subtype, game)) { amount++; break; } diff --git a/Mage.Sets/src/mage/sets/magic2010/ConvincingMirage.java b/Mage.Sets/src/mage/sets/magic2010/ConvincingMirage.java index 97bf8288a25..57d7babaac0 100644 --- a/Mage.Sets/src/mage/sets/magic2010/ConvincingMirage.java +++ b/Mage.Sets/src/mage/sets/magic2010/ConvincingMirage.java @@ -112,8 +112,8 @@ class ConvincingMirageContinousEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - land.getSubtype().clear(); - land.getSubtype().add(choice); + land.getSubtype(game).clear(); + land.getSubtype(game).add(choice); } break; case AbilityAddingRemovingEffects_6: diff --git a/Mage.Sets/src/mage/sets/magic2010/RiseFromTheGrave.java b/Mage.Sets/src/mage/sets/magic2010/RiseFromTheGrave.java index 7a6ca7f3494..7406b70e14f 100644 --- a/Mage.Sets/src/mage/sets/magic2010/RiseFromTheGrave.java +++ b/Mage.Sets/src/mage/sets/magic2010/RiseFromTheGrave.java @@ -93,7 +93,7 @@ class RiseFromTheGraveEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - creature.getSubtype().add("Zombie"); + creature.getSubtype(game).add("Zombie"); } break; case ColorChangingEffects_5: diff --git a/Mage.Sets/src/mage/sets/magic2011/CaptivatingVampire.java b/Mage.Sets/src/mage/sets/magic2011/CaptivatingVampire.java index c64555e37d8..95fff54b8ec 100644 --- a/Mage.Sets/src/mage/sets/magic2011/CaptivatingVampire.java +++ b/Mage.Sets/src/mage/sets/magic2011/CaptivatingVampire.java @@ -124,8 +124,8 @@ class CaptivatingVampireEffect extends ContinuousEffectImpl { break; case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - if (!permanent.getSubtype().contains("Vampire")) { - permanent.getSubtype().add("Vampire"); + if (!permanent.getSubtype(game).contains("Vampire")) { + permanent.getSubtype(game).add("Vampire"); } } break; diff --git a/Mage.Sets/src/mage/sets/magic2011/StormtideLeviathan.java b/Mage.Sets/src/mage/sets/magic2011/StormtideLeviathan.java index b1b6d5c116e..d15216983a2 100644 --- a/Mage.Sets/src/mage/sets/magic2011/StormtideLeviathan.java +++ b/Mage.Sets/src/mage/sets/magic2011/StormtideLeviathan.java @@ -114,8 +114,8 @@ class StormtideLeviathanEffect extends ContinuousEffectImpl { for (Permanent land : game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), game)) { switch (layer) { case TypeChangingEffects_4: - if (!land.getSubtype().contains("Island")) { - land.getSubtype().add("Island"); + if (!land.getSubtype(game).contains("Island")) { + land.getSubtype(game).add("Island"); } break; case AbilityAddingRemovingEffects_6: diff --git a/Mage.Sets/src/mage/sets/magic2012/AdaptiveAutomaton.java b/Mage.Sets/src/mage/sets/magic2012/AdaptiveAutomaton.java index 60b4ad65cd1..48293fa30d7 100644 --- a/Mage.Sets/src/mage/sets/magic2012/AdaptiveAutomaton.java +++ b/Mage.Sets/src/mage/sets/magic2012/AdaptiveAutomaton.java @@ -102,8 +102,8 @@ class AdaptiveAutomatonAddSubtypeEffect extends ContinuousEffectImpl { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { String subtype = (String) game.getState().getValue(permanent.getId() + "_type"); - if (subtype != null && !permanent.getSubtype().contains(subtype)) { - permanent.getSubtype().add(subtype); + if (subtype != null && !permanent.getSubtype(game).contains(subtype)) { + permanent.getSubtype(game).add(subtype); } } return true; diff --git a/Mage.Sets/src/mage/sets/magic2012/PhantasmalImage.java b/Mage.Sets/src/mage/sets/magic2012/PhantasmalImage.java index 09011fd34c9..f05106b8f64 100644 --- a/Mage.Sets/src/mage/sets/magic2012/PhantasmalImage.java +++ b/Mage.Sets/src/mage/sets/magic2012/PhantasmalImage.java @@ -54,8 +54,8 @@ public class PhantasmalImage extends CardImpl { ApplyToPermanent phantasmalImageApplier = new ApplyToPermanent() { @Override public Boolean apply(Game game, Permanent permanent) { - if (!permanent.getSubtype().contains("Illusion")) { - permanent.getSubtype().add("Illusion"); + if (!permanent.getSubtype(game).contains("Illusion")) { + permanent.getSubtype(game).add("Illusion"); } // Add directly because the created permanent is only used to copy from, so there is no need to add the ability to e.g. TriggeredAbilities permanent.getAbilities().add(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect())); @@ -65,8 +65,8 @@ public class PhantasmalImage extends CardImpl { @Override public Boolean apply(Game game, MageObject mageObject) { - if (!mageObject.getSubtype().contains("Illusion")) { - mageObject.getSubtype().add("Illusion"); + if (!mageObject.getSubtype(game).contains("Illusion")) { + mageObject.getSubtype(game).add("Illusion"); } // Add directly because the created permanent is only used to copy from, so there is no need to add the ability to e.g. TriggeredAbilities mageObject.getAbilities().add(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect())); diff --git a/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java b/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java index 762b3646b08..4363d0dc306 100644 --- a/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java +++ b/Mage.Sets/src/mage/sets/magic2014/AjanisChosen.java @@ -99,7 +99,7 @@ class AjanisChosenEffect extends OneShotEffect { Token token = new CatToken(); if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) { Permanent enchantment = game.getPermanent(this.getTargetPointer().getFirst(game, source)); - if (enchantment != null && enchantment.getSubtype().contains("Aura")) { + if (enchantment != null && enchantment.getSubtype(game).contains("Aura")) { for (UUID tokenId : token.getLastAddedTokenIds()) { Permanent tokenPermanent = game.getPermanent(tokenId); if (tokenPermanent != null) { diff --git a/Mage.Sets/src/mage/sets/magic2014/DismissIntoDream.java b/Mage.Sets/src/mage/sets/magic2014/DismissIntoDream.java index 407a60a2325..2d09c50da5d 100644 --- a/Mage.Sets/src/mage/sets/magic2014/DismissIntoDream.java +++ b/Mage.Sets/src/mage/sets/magic2014/DismissIntoDream.java @@ -107,8 +107,8 @@ class DismissIntoDreamEffect extends ContinuousEffectImpl { object.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect()), source.getSourceId(), game); break; case TypeChangingEffects_4: - if (!object.getSubtype().contains("Illusion")) { - object.getSubtype().add("Illusion"); + if (!object.getSubtype(game).contains("Illusion")) { + object.getSubtype(game).add("Illusion"); } break; } diff --git a/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java b/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java index 335d18e3d16..5a342a704b1 100644 --- a/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java +++ b/Mage.Sets/src/mage/sets/magic2014/DoorOfDestinies.java @@ -153,7 +153,7 @@ class BoostCreatureEffectEffect extends ContinuousEffectImpl { String subtype = (String) game.getState().getValue(permanent.getId() + "_type"); if (subtype != null) { for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { - if (perm.hasSubtype(subtype)) { + if (perm.hasSubtype(subtype, game)) { int boost = permanent.getCounters().getCount(CounterType.CHARGE); perm.addPower(boost); perm.addToughness(boost); diff --git a/Mage.Sets/src/mage/sets/magic2015/BlastfireBolt.java b/Mage.Sets/src/mage/sets/magic2015/BlastfireBolt.java index b6e8253013c..b8c08cd48e7 100644 --- a/Mage.Sets/src/mage/sets/magic2015/BlastfireBolt.java +++ b/Mage.Sets/src/mage/sets/magic2015/BlastfireBolt.java @@ -93,7 +93,7 @@ class DestroyAllAttachedEquipmentEffect extends OneShotEffect { ArrayList attachments = new ArrayList<>(target.getAttachments()); for (UUID attachmentId : attachments) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype().contains("Equipment")) { + if (attachment != null && attachment.getSubtype(game).contains("Equipment")) { attachment.destroy(source.getSourceId(), game, false); } } diff --git a/Mage.Sets/src/mage/sets/magic2015/NecromancersStockpile.java b/Mage.Sets/src/mage/sets/magic2015/NecromancersStockpile.java index 575766661b8..41f52d14c70 100644 --- a/Mage.Sets/src/mage/sets/magic2015/NecromancersStockpile.java +++ b/Mage.Sets/src/mage/sets/magic2015/NecromancersStockpile.java @@ -101,7 +101,7 @@ class NecromancersStockpileDiscardTargetCost extends CostImpl { if (card == null) { return false; } - isZombieCard = card.getSubtype().contains("Zombie"); + isZombieCard = card.getSubtype(game).contains("Zombie"); paid |= player.discard(card, null, game); } diff --git a/Mage.Sets/src/mage/sets/magic2015/ObeliskOfUrd.java b/Mage.Sets/src/mage/sets/magic2015/ObeliskOfUrd.java index 40eb7eb1579..e8f7304b591 100644 --- a/Mage.Sets/src/mage/sets/magic2015/ObeliskOfUrd.java +++ b/Mage.Sets/src/mage/sets/magic2015/ObeliskOfUrd.java @@ -101,7 +101,7 @@ class ObeliskOfUrdBoostEffect extends ContinuousEffectImpl { String subtype = (String) game.getState().getValue(permanent.getId() + "_type"); if (subtype != null) { for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { - if (perm.hasSubtype(subtype)) { + if (perm.hasSubtype(subtype, game)) { perm.addPower(2); perm.addToughness(2); } diff --git a/Mage.Sets/src/mage/sets/magic2015/PolymorphistsJest.java b/Mage.Sets/src/mage/sets/magic2015/PolymorphistsJest.java index ac4a4108615..142fbd5b8b0 100644 --- a/Mage.Sets/src/mage/sets/magic2015/PolymorphistsJest.java +++ b/Mage.Sets/src/mage/sets/magic2015/PolymorphistsJest.java @@ -108,8 +108,8 @@ class PolymorphistsJestEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - permanent.getSubtype().clear(); - permanent.getSubtype().add("Frog"); + permanent.getSubtype(game).clear(); + permanent.getSubtype(game).add("Frog"); } break; diff --git a/Mage.Sets/src/mage/sets/magic2015/SliverHive.java b/Mage.Sets/src/mage/sets/magic2015/SliverHive.java index 1e3e3f90288..ef90a404ea8 100644 --- a/Mage.Sets/src/mage/sets/magic2015/SliverHive.java +++ b/Mage.Sets/src/mage/sets/magic2015/SliverHive.java @@ -127,7 +127,7 @@ class SliverHiveManaCondition extends CreatureCastManaCondition { public boolean apply(Game game, Ability source, UUID manaProducer, Cost costToPay) { if (super.apply(game, source)) { MageObject object = game.getObject(source.getSourceId()); - if (object.hasSubtype("Sliver")) { + if (object.hasSubtype("Sliver", game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/magicorigins/GnarlrootTrapper.java b/Mage.Sets/src/mage/sets/magicorigins/GnarlrootTrapper.java index 70ba66c9f4f..107210049ba 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/GnarlrootTrapper.java +++ b/Mage.Sets/src/mage/sets/magicorigins/GnarlrootTrapper.java @@ -117,7 +117,7 @@ class GnarlrootTrapperManaCondition extends CreatureCastManaCondition { public boolean apply(Game game, Ability source) { if (super.apply(game, source)) { MageObject object = game.getObject(source.getSourceId()); - if (object.hasSubtype("Elf") + if (object.hasSubtype("Elf", game) && object.getCardType().contains(CardType.CREATURE)) { return true; } diff --git a/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java b/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java index a0c75b41380..269229d548a 100644 --- a/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java +++ b/Mage.Sets/src/mage/sets/magicorigins/NissaSageAnimist.java @@ -137,7 +137,7 @@ class NissaSageAnimistToken extends Token { this.getPower().modifyBaseValue(4); this.getToughness().modifyBaseValue(4); this.color.setGreen(true); - this.getSubtype().add("Elemental"); + this.getSubtype(null).add("Elemental"); this.getCardType().add(CardType.CREATURE); } } @@ -168,8 +168,8 @@ class NissaSageAnimistMinusSevenEffect extends ContinuousEffectImpl { if (!permanent.getCardType().contains(CardType.CREATURE)) { permanent.getCardType().add(CardType.CREATURE); } - if (!permanent.getSubtype().contains("Elemental")) { - permanent.getSubtype().add("Elemental"); + if (!permanent.getSubtype(game).contains("Elemental")) { + permanent.getSubtype(game).add("Elemental"); } break; case PTChangingEffects_7: diff --git a/Mage.Sets/src/mage/sets/masterseditionii/EbonPraetor.java b/Mage.Sets/src/mage/sets/masterseditionii/EbonPraetor.java index 04ed4d15c0e..729729b1be0 100644 --- a/Mage.Sets/src/mage/sets/masterseditionii/EbonPraetor.java +++ b/Mage.Sets/src/mage/sets/masterseditionii/EbonPraetor.java @@ -115,7 +115,7 @@ class EbonPraetorEffect extends OneShotEffect { if (cost instanceof SacrificeTargetCost) { Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0); Permanent sourceCreature = game.getPermanent(source.getSourceId()); - if (sacrificedCreature.hasSubtype("Thrull") && sourceCreature != null) { + if (sacrificedCreature.hasSubtype("Thrull", game) && sourceCreature != null) { sourceCreature.addCounters(CounterType.P1P0.createInstance(), game); return true; } diff --git a/Mage.Sets/src/mage/sets/masterseditionii/SoulExchange.java b/Mage.Sets/src/mage/sets/masterseditionii/SoulExchange.java index 215fec4f80d..b95517356af 100644 --- a/Mage.Sets/src/mage/sets/masterseditionii/SoulExchange.java +++ b/Mage.Sets/src/mage/sets/masterseditionii/SoulExchange.java @@ -102,7 +102,7 @@ class SoulExchangeEffect extends OneShotEffect{ if (c.isPaid() && c instanceof ExileTargetCost) { for (Permanent exiled : ((ExileTargetCost) c).getPermanents()) { if (exiled != null){ - if(exiled.getSubtype().contains("Thrull")){ + if(exiled.getSubtype(game).contains("Thrull")){ game.getPermanent(source.getFirstTarget()).addCounters(CounterType.P2P2.createInstance(), game); return true; } diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/SerendibDjinn.java b/Mage.Sets/src/mage/sets/masterseditioniv/SerendibDjinn.java index e3cf9ec727f..a1c030851e0 100644 --- a/Mage.Sets/src/mage/sets/masterseditioniv/SerendibDjinn.java +++ b/Mage.Sets/src/mage/sets/masterseditioniv/SerendibDjinn.java @@ -108,7 +108,7 @@ class SerendibDjinnEffect extends OneShotEffect { Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { permanent.sacrifice(source.getSourceId(), game); - if (permanent.hasSubtype("Island")) { + if (permanent.hasSubtype("Island", game)) { controller.damage(3, source.getSourceId(), game, false, true); } } diff --git a/Mage.Sets/src/mage/sets/mercadianmasques/Conspiracy.java b/Mage.Sets/src/mage/sets/mercadianmasques/Conspiracy.java new file mode 100644 index 00000000000..6e36dda6130 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mercadianmasques/Conspiracy.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mercadianmasques; + +import java.util.UUID; +import mage.constants.Rarity; + +/** + * + * @author anonymous + */ +public class Conspiracy extends mage.sets.timeshifted.Conspiracy { + + public Conspiracy(UUID ownerId) { + super(ownerId); + this.cardNumber = "127"; + this.expansionSetCode = "MMQ"; + this.rarity = Rarity.RARE; + } + + public Conspiracy(final Conspiracy card) { + super(card); + } + + @Override + public Conspiracy copy() { + return new Conspiracy(this); + } +} diff --git a/Mage.Sets/src/mage/sets/mirage/CloakOfInvisibility.java b/Mage.Sets/src/mage/sets/mirage/CloakOfInvisibility.java index 1e9f7b1c966..62851f72d78 100644 --- a/Mage.Sets/src/mage/sets/mirage/CloakOfInvisibility.java +++ b/Mage.Sets/src/mage/sets/mirage/CloakOfInvisibility.java @@ -105,7 +105,7 @@ class CantBeBlockedByWallsEffect extends RestrictionEffect { @Override public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (!blocker.hasSubtype("Wall")) { + if (!blocker.hasSubtype("Wall", game)) { return false; } return true; diff --git a/Mage.Sets/src/mage/sets/mirrodin/Duplicant.java b/Mage.Sets/src/mage/sets/mirrodin/Duplicant.java index 26d33de22e7..6f3def7a345 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/Duplicant.java +++ b/Mage.Sets/src/mage/sets/mirrodin/Duplicant.java @@ -151,7 +151,7 @@ class DuplicantContinuousEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - permanent.getSubtype().addAll(card.getSubtype()); + permanent.getSubtype(game).addAll(card.getSubtype(game)); } break; diff --git a/Mage.Sets/src/mage/sets/mirrodin/GoblinCharbelcher.java b/Mage.Sets/src/mage/sets/mirrodin/GoblinCharbelcher.java index 6729cd5d162..42cde37c645 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GoblinCharbelcher.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GoblinCharbelcher.java @@ -106,7 +106,7 @@ class GoblinCharbelcherEffect extends OneShotEffect { cards.add(card); if (card.getCardType().contains(CardType.LAND)){ landFound = true; - if(card.getSubtype().contains("Mountain")){ + if(card.getSubtype(game).contains("Mountain")){ isMountain = true; } break; diff --git a/Mage.Sets/src/mage/sets/mirrodin/GolemSkinGauntlets.java b/Mage.Sets/src/mage/sets/mirrodin/GolemSkinGauntlets.java index d9109c627fd..0ab5bcc40b0 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/GolemSkinGauntlets.java +++ b/Mage.Sets/src/mage/sets/mirrodin/GolemSkinGauntlets.java @@ -88,7 +88,7 @@ class GolemSkinGauntletsAttachedCount implements DynamicValue { List attachments = permanent.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype().contains("Equipment")) { + if (attached != null && attached.getSubtype(game).contains("Equipment")) { count++; } } diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/KembasLegion.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/KembasLegion.java index 8d497edf85f..74825c9ebb2 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/KembasLegion.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/KembasLegion.java @@ -102,7 +102,7 @@ class KembasLegionEffect extends ContinuousEffectImpl { int count = 0; for (UUID attachmentId : attachments) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.hasSubtype("Equipment")) { + if (attachment != null && attachment.hasSubtype("Equipment", game)) { count++; } } diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/TrainingDrone.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/TrainingDrone.java index 1c386f9dd4e..74309d66195 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/TrainingDrone.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/TrainingDrone.java @@ -86,7 +86,7 @@ class TrainingDroneEffect extends RestrictionEffect { List attachments = permanent.getAttachments(); for (UUID uuid : attachments) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached.getSubtype().contains("Equipment")) { + if (attached.getSubtype(game).contains("Equipment")) { return false; } } diff --git a/Mage.Sets/src/mage/sets/modernmasters/WarrenPilferers.java b/Mage.Sets/src/mage/sets/modernmasters/WarrenPilferers.java index a6b93a5abf9..f50ec5b53d1 100644 --- a/Mage.Sets/src/mage/sets/modernmasters/WarrenPilferers.java +++ b/Mage.Sets/src/mage/sets/modernmasters/WarrenPilferers.java @@ -97,7 +97,7 @@ class WarrenPilferersReturnEffect extends OneShotEffect { Card card = game.getCard(source.getFirstTarget()); if (card != null) { card.moveToZone(Zone.HAND, source.getSourceId(), game, false); - if (card.getSubtype().contains("Goblin")) { + if (card.getSubtype(game).contains("Goblin")) { game.addEffect(new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.EndOfTurn), source); } return true; diff --git a/Mage.Sets/src/mage/sets/morningtide/BoldwyrIntimidator.java b/Mage.Sets/src/mage/sets/morningtide/BoldwyrIntimidator.java index e7a229c1b25..d67b6d66cf3 100644 --- a/Mage.Sets/src/mage/sets/morningtide/BoldwyrIntimidator.java +++ b/Mage.Sets/src/mage/sets/morningtide/BoldwyrIntimidator.java @@ -113,8 +113,8 @@ class BoldwyrIntimidatorEffect extends RestrictionEffect { public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { if (attacker != null && blocker != null) { Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if (sourcePermanent != null && attacker.getSubtype().contains("Warrior")) { - return !blocker.getSubtype().contains("Coward"); + if (sourcePermanent != null && attacker.getSubtype(game).contains("Warrior")) { + return !blocker.getSubtype(game).contains("Coward"); } } return true; diff --git a/Mage.Sets/src/mage/sets/morningtide/BramblewoodParagon.java b/Mage.Sets/src/mage/sets/morningtide/BramblewoodParagon.java index 14d5283152e..3b338deb77b 100644 --- a/Mage.Sets/src/mage/sets/morningtide/BramblewoodParagon.java +++ b/Mage.Sets/src/mage/sets/morningtide/BramblewoodParagon.java @@ -112,7 +112,7 @@ class BramblewoodParagonReplacementEffect extends ReplacementEffectImpl { Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget(); return creature != null && creature.getControllerId().equals(source.getControllerId()) && creature.getCardType().contains(CardType.CREATURE) - && creature.hasSubtype("Warrior") + && creature.hasSubtype("Warrior", game) && !event.getTargetId().equals(source.getSourceId()); } diff --git a/Mage.Sets/src/mage/sets/morningtide/GreatbowDoyen.java b/Mage.Sets/src/mage/sets/morningtide/GreatbowDoyen.java index 42398310d1b..145d525c60a 100644 --- a/Mage.Sets/src/mage/sets/morningtide/GreatbowDoyen.java +++ b/Mage.Sets/src/mage/sets/morningtide/GreatbowDoyen.java @@ -115,7 +115,7 @@ class GreatbowDoyenTriggeredAbility extends TriggeredAbilityImpl { Permanent damagedCreature = game.getPermanent(event.getTargetId()); if (creature != null && damagedCreature != null && creature.getCardType().contains(CardType.CREATURE) - && creature.hasSubtype("Archer") + && creature.hasSubtype("Archer", game) && creature.getControllerId().equals(controllerId)) { this.getEffects().get(0).setValue("damageAmount", event.getAmount()); this.getEffects().get(0).setValue("controller", damagedCreature.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/morningtide/OonasBlackguard.java b/Mage.Sets/src/mage/sets/morningtide/OonasBlackguard.java index e652196c9d1..085cd722d3b 100644 --- a/Mage.Sets/src/mage/sets/morningtide/OonasBlackguard.java +++ b/Mage.Sets/src/mage/sets/morningtide/OonasBlackguard.java @@ -106,7 +106,7 @@ class OonasBlackguardReplacementEffect extends ReplacementEffectImpl { Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget(); if (creature != null && creature.getControllerId().equals(source.getControllerId()) && creature.getCardType().contains(CardType.CREATURE) - && creature.hasSubtype("Rogue") + && creature.hasSubtype("Rogue", game) && !event.getTargetId().equals(source.getSourceId())) { return true; } diff --git a/Mage.Sets/src/mage/sets/morningtide/PrimalBeyond.java b/Mage.Sets/src/mage/sets/morningtide/PrimalBeyond.java index 77b9ec0548e..858408fea60 100644 --- a/Mage.Sets/src/mage/sets/morningtide/PrimalBeyond.java +++ b/Mage.Sets/src/mage/sets/morningtide/PrimalBeyond.java @@ -110,6 +110,6 @@ class PrimalBeyondManaCondition implements Condition { @Override public boolean apply(Game game, Ability source) { MageObject object = game.getObject(source.getSourceId()); - return object != null && object.hasSubtype("Elemental"); + return object != null && object.hasSubtype("Elemental", game); } } diff --git a/Mage.Sets/src/mage/sets/morningtide/ReinsOfTheVinesteed.java b/Mage.Sets/src/mage/sets/morningtide/ReinsOfTheVinesteed.java index 91540d9e816..f31ee055465 100644 --- a/Mage.Sets/src/mage/sets/morningtide/ReinsOfTheVinesteed.java +++ b/Mage.Sets/src/mage/sets/morningtide/ReinsOfTheVinesteed.java @@ -115,7 +115,7 @@ class ReinsOfTheVinesteedEffect extends OneShotEffect { FilterCreaturePermanent FILTER = new FilterCreaturePermanent(); StringBuilder sb = new StringBuilder("creature that shares a creature type with the formerly attached creature: "); ArrayList> subtypes = new ArrayList<>(); - for (String subtype : lastStateCreature.getSubtype()) { + for (String subtype : lastStateCreature.getSubtype(game)) { subtypes.add(new SubtypePredicate(subtype)); sb.append(subtype).append(", "); } diff --git a/Mage.Sets/src/mage/sets/morningtide/SageOfFables.java b/Mage.Sets/src/mage/sets/morningtide/SageOfFables.java index ee007b91f51..e3f57e7d0db 100644 --- a/Mage.Sets/src/mage/sets/morningtide/SageOfFables.java +++ b/Mage.Sets/src/mage/sets/morningtide/SageOfFables.java @@ -103,7 +103,7 @@ class SageOfFablesReplacementEffect extends ReplacementEffectImpl { Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget(); return creature != null && creature.getControllerId().equals(source.getControllerId()) && creature.getCardType().contains(CardType.CREATURE) - && creature.getSubtype().contains("Wizard") + && creature.getSubtype(game).contains("Wizard") && !event.getTargetId().equals(source.getSourceId()); } diff --git a/Mage.Sets/src/mage/sets/morningtide/SharedAnimosity.java b/Mage.Sets/src/mage/sets/morningtide/SharedAnimosity.java index ac628391e26..8c68b316cdf 100644 --- a/Mage.Sets/src/mage/sets/morningtide/SharedAnimosity.java +++ b/Mage.Sets/src/mage/sets/morningtide/SharedAnimosity.java @@ -105,7 +105,7 @@ class SharedAnimosityEffect extends ContinuousEffectImpl { filter.add(Predicates.not(new PermanentIdPredicate(this.targetPointer.getFirst(game, source)))); filter.add(new AttackingPredicate()); boolean allCreatureTypes = false; - if (permanent.getSubtype().contains(ChangelingAbility.ALL_CREATURE_TYPE)) { + if (permanent.getSubtype(game).contains(ChangelingAbility.ALL_CREATURE_TYPE)) { allCreatureTypes = true; } else { for(Ability ability : permanent.getAbilities()){ @@ -116,7 +116,7 @@ class SharedAnimosityEffect extends ContinuousEffectImpl { } if(!allCreatureTypes){ ArrayList> predicateList = new ArrayList<>(); - for(String subtype : permanent.getSubtype()){ + for(String subtype : permanent.getSubtype(game)){ predicateList.add(new SubtypePredicate(subtype)); } filter.add(Predicates.or(predicateList)); diff --git a/Mage.Sets/src/mage/sets/morningtide/WeightOfConscience.java b/Mage.Sets/src/mage/sets/morningtide/WeightOfConscience.java index 674c38b324c..b39f2163db5 100644 --- a/Mage.Sets/src/mage/sets/morningtide/WeightOfConscience.java +++ b/Mage.Sets/src/mage/sets/morningtide/WeightOfConscience.java @@ -143,7 +143,7 @@ class WeightOfConscienceTarget extends TargetControlledCreaturePermanent { // Choosing first target if (this.getTargets().isEmpty()) { for (Permanent permanent : game.getBattlefield().getActivePermanents(filterUntapped, sourceControllerId, game)) { - for (String subtype : permanent.getSubtype()) { + for (String subtype : permanent.getSubtype(game)) { if (!CardUtil.isNonCreatureSubtype(subtype)) { if (game.getBattlefield().contains(new FilterControlledCreaturePermanent(subtype, subtype), sourceControllerId, game, 2)) { possibleTargets.add(permanent.getId()); @@ -158,7 +158,7 @@ class WeightOfConscienceTarget extends TargetControlledCreaturePermanent { Permanent firstTargetCreature = game.getPermanent(firstTargetId); if (firstTargetCreature != null) { for (Permanent permanent : game.getBattlefield().getActivePermanents(filterUntapped, sourceControllerId, game)) { - if (!permanent.getId().equals(firstTargetId) && CardUtil.shareSubtypes(firstTargetCreature, permanent)) { + if (!permanent.getId().equals(firstTargetId) && CardUtil.shareSubtypes(firstTargetCreature, permanent, game)) { possibleTargets.add(permanent.getId()); } } @@ -172,7 +172,7 @@ class WeightOfConscienceTarget extends TargetControlledCreaturePermanent { public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { for (Permanent permanent1 : game.getBattlefield().getActivePermanents(filterUntapped, sourceControllerId, game)) { for (Permanent permanent2 : game.getBattlefield().getActivePermanents(filterUntapped, sourceControllerId, game)) { - if (permanent1 != permanent2 && CardUtil.shareSubtypes(permanent1, permanent2)) { + if (permanent1 != permanent2 && CardUtil.shareSubtypes(permanent1, permanent2, game)) { return true; } } @@ -187,7 +187,7 @@ class WeightOfConscienceTarget extends TargetControlledCreaturePermanent { if (targetPermanent != null) { if (this.getTargets().isEmpty()) { for (Permanent permanent : game.getBattlefield().getActivePermanents(filterUntapped, source.getControllerId(), game)) { - for (String subtype : permanent.getSubtype()) { + for (String subtype : permanent.getSubtype(game)) { if (!CardUtil.isNonCreatureSubtype(subtype)) { if (game.getBattlefield().contains(new FilterControlledCreaturePermanent(subtype, subtype), source.getControllerId(), game, 2)) { return true; @@ -198,7 +198,7 @@ class WeightOfConscienceTarget extends TargetControlledCreaturePermanent { } else { Permanent firstTarget = game.getPermanent(this.getTargets().get(0)); - if (firstTarget != null && CardUtil.shareSubtypes(firstTarget, targetPermanent)) { + if (firstTarget != null && CardUtil.shareSubtypes(firstTarget, targetPermanent, game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/BludgeonBrawl.java b/Mage.Sets/src/mage/sets/newphyrexia/BludgeonBrawl.java index 96d15473a7a..6c03057173a 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/BludgeonBrawl.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/BludgeonBrawl.java @@ -119,7 +119,7 @@ class BludgeonBrawlAddSubtypeEffect extends ContinuousEffectImpl { List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game); for (Permanent permanent : permanents) { if (permanent != null) { - permanent.getSubtype().add("Equipment"); + permanent.getSubtype(game).add("Equipment"); affectedPermanents.add(permanent.getId()); } } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java b/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java index 70e5258ad9c..45c585dae9f 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java @@ -121,7 +121,7 @@ class KarnLiberatedEffect extends OneShotEffect { for (ExileZone zone : game.getExile().getExileZones()) { if (zone.getId().equals(exileId)) { for (Card card : zone.getCards(game)) { - if (!card.getSubtype().contains("Aura") && CardUtil.isPermanentCard(card)) { + if (!card.getSubtype(game).contains("Aura") && CardUtil.isPermanentCard(card)) { cards.add(card); } } @@ -150,7 +150,7 @@ class KarnLiberatedEffect extends OneShotEffect { } for (Card card : cards) { game.getState().setZone(card.getId(), Zone.EXILED); - if (CardUtil.isPermanentCard(card) && !card.getSubtype().contains("Aura")) { + if (CardUtil.isPermanentCard(card) && !card.getSubtype(game).contains("Aura")) { game.getExile().add(exileId, sourceObject.getIdName(), card); } } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/Xenograft.java b/Mage.Sets/src/mage/sets/newphyrexia/Xenograft.java index 2d33de50f56..110c56dd4d0 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/Xenograft.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/Xenograft.java @@ -89,8 +89,8 @@ class XenograftAddSubtypeEffect extends ContinuousEffectImpl { if (subtype != null) { List permanents = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), game); for (Permanent permanent : permanents) { - if (permanent != null && !permanent.getSubtype().contains(subtype)) { - permanent.getSubtype().add(subtype); + if (permanent != null && !permanent.getSubtype(game).contains(subtype)) { + permanent.getSubtype(game).add(subtype); } } return true; diff --git a/Mage.Sets/src/mage/sets/ninthedition/BloodMoon.java b/Mage.Sets/src/mage/sets/ninthedition/BloodMoon.java index 6fbd5ff4f7e..60f5a0fad54 100644 --- a/Mage.Sets/src/mage/sets/ninthedition/BloodMoon.java +++ b/Mage.Sets/src/mage/sets/ninthedition/BloodMoon.java @@ -106,8 +106,8 @@ class BloodMoonEffect extends ContinuousEffectImpl { // 305.7 Note that this doesn't remove any abilities that were granted to the land by other effects // So the ability removing has to be done before Layer 6 land.removeAllAbilities(source.getSourceId(), game); - land.getSubtype().removeAll(CardRepository.instance.getLandTypes()); - land.getSubtype().add("Mountain"); + land.getSubtype(game).removeAll(CardRepository.instance.getLandTypes()); + land.getSubtype(game).add("Mountain"); break; case AbilityAddingRemovingEffects_6: land.addAbility(new RedManaAbility(), source.getSourceId(), game); diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/DeceiverOfForm.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/DeceiverOfForm.java index 6b1019e768e..320d2422674 100644 --- a/Mage.Sets/src/mage/sets/oathofthegatewatch/DeceiverOfForm.java +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/DeceiverOfForm.java @@ -168,10 +168,10 @@ class DeceiverOfFormCopyEffect extends ContinuousEffectImpl { permanent.getCardType().add(type); } } - permanent.getSubtype().clear(); - for (String type : card.getSubtype()) { - if (!permanent.getSubtype().contains(type)) { - permanent.getSubtype().add(type); + permanent.getSubtype(game).clear(); + for (String type : card.getSubtype(game)) { + if (!permanent.getSubtype(game).contains(type)) { + permanent.getSubtype(game).add(type); } } permanent.getSupertype().clear(); diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/StoneforgeMasterwork.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/StoneforgeMasterwork.java index 85203c93926..fe01e28ea71 100644 --- a/Mage.Sets/src/mage/sets/oathofthegatewatch/StoneforgeMasterwork.java +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/StoneforgeMasterwork.java @@ -86,7 +86,7 @@ class StoneforgeMasterworkDynamicValue implements DynamicValue { if (equipped != null) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), sourceAbility.getControllerId(), game)) { if (!permanent.getId().equals(equipped.getId())) { - if (CardUtil.shareSubtypes(equipped, permanent)) { + if (CardUtil.shareSubtypes(equipped, permanent, game)) { xValue++; } } diff --git a/Mage.Sets/src/mage/sets/odyssey/TestamentOfFaith.java b/Mage.Sets/src/mage/sets/odyssey/TestamentOfFaith.java index 233dddfdd54..706811649d7 100644 --- a/Mage.Sets/src/mage/sets/odyssey/TestamentOfFaith.java +++ b/Mage.Sets/src/mage/sets/odyssey/TestamentOfFaith.java @@ -118,10 +118,10 @@ class TestamentOfFaithBecomesCreatureSourceEffect extends ContinuousEffectImpl i } } if ("".equals(type) || type == null) { - permanent.getSubtype().clear(); + permanent.getSubtype(game).clear(); } - if (token.getSubtype().size() > 0) { - permanent.getSubtype().addAll(token.getSubtype()); + if (token.getSubtype(game).size() > 0) { + permanent.getSubtype(game).addAll(token.getSubtype(game)); } } break; diff --git a/Mage.Sets/src/mage/sets/onslaught/AEtherCharge.java b/Mage.Sets/src/mage/sets/onslaught/AEtherCharge.java index 5c22f29cead..22c324da728 100644 --- a/Mage.Sets/src/mage/sets/onslaught/AEtherCharge.java +++ b/Mage.Sets/src/mage/sets/onslaught/AEtherCharge.java @@ -97,7 +97,7 @@ class AEtherChargeTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent.getCardType().contains(CardType.CREATURE) && permanent.getSubtype().contains("Beast") + if (permanent.getCardType().contains(CardType.CREATURE) && permanent.getSubtype(game).contains("Beast") && permanent.getControllerId().equals(this.controllerId)) { Effect effect = this.getEffects().get(0); effect.setValue("damageSource", event.getTargetId()); diff --git a/Mage.Sets/src/mage/sets/onslaught/CoverOfDarkness.java b/Mage.Sets/src/mage/sets/onslaught/CoverOfDarkness.java index 2bdbcb69775..da0e5f2187c 100644 --- a/Mage.Sets/src/mage/sets/onslaught/CoverOfDarkness.java +++ b/Mage.Sets/src/mage/sets/onslaught/CoverOfDarkness.java @@ -89,7 +89,7 @@ class FilterCoverOfDarkness extends FilterCreaturePermanent { public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { if (super.match(permanent, sourceId, playerId, game)) { String subtype = (String) game.getState().getValue(sourceId + "_type"); - if (subtype != null && !subtype.equals("") && permanent.hasSubtype(subtype)) { + if (subtype != null && !subtype.equals("") && permanent.hasSubtype(subtype, game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/onslaught/CrypticGateway.java b/Mage.Sets/src/mage/sets/onslaught/CrypticGateway.java index 0334234694f..a1a8b64e788 100644 --- a/Mage.Sets/src/mage/sets/onslaught/CrypticGateway.java +++ b/Mage.Sets/src/mage/sets/onslaught/CrypticGateway.java @@ -192,24 +192,24 @@ class CrypticGatewayEffect extends OneShotEffect { boolean commonSubType = false; boolean changeling = false; boolean changeling2 = false; - if (creature.getAbilities().containsKey(ChangelingAbility.getInstance().getId()) || creature.getSubtype().contains(ChangelingAbility.ALL_CREATURE_TYPE)) { + if (creature.getAbilities().containsKey(ChangelingAbility.getInstance().getId()) || creature.getSubtype(game).contains(ChangelingAbility.ALL_CREATURE_TYPE)) { changeling = true; } - if (creature2.getAbilities().containsKey(ChangelingAbility.getInstance().getId()) || creature2.getSubtype().contains(ChangelingAbility.ALL_CREATURE_TYPE)) { + if (creature2.getAbilities().containsKey(ChangelingAbility.getInstance().getId()) || creature2.getSubtype(game).contains(ChangelingAbility.ALL_CREATURE_TYPE)) { changeling2 = true; } ArrayList subtypes = new ArrayList<>(); - for (String subtype : creature.getSubtype()) { - if (creature2.getSubtype().contains(subtype) || changeling2) { + for (String subtype : creature.getSubtype(game)) { + if (creature2.getSubtype(game).contains(subtype) || changeling2) { subtypes.add(new SubtypePredicate(subtype)); commonSubType = true; } } - for (String subtype : creature2.getSubtype()) { - if (creature.getSubtype().contains(subtype) || changeling) { + for (String subtype : creature2.getSubtype(game)) { + if (creature.getSubtype(game).contains(subtype) || changeling) { subtypes.add(new SubtypePredicate(subtype)); commonSubType = true; } diff --git a/Mage.Sets/src/mage/sets/onslaught/ManaEchoes.java b/Mage.Sets/src/mage/sets/onslaught/ManaEchoes.java index a213593f1cf..5fc662911b6 100644 --- a/Mage.Sets/src/mage/sets/onslaught/ManaEchoes.java +++ b/Mage.Sets/src/mage/sets/onslaught/ManaEchoes.java @@ -92,7 +92,7 @@ class ManaEchoesEffect extends OneShotEffect { if (controller != null && permanent != null) { int foundCreatures = 0; for (Permanent perm : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), game)) { - if (CardUtil.shareSubtypes(permanent, perm)) { + if (CardUtil.shareSubtypes(permanent, perm, game)) { foundCreatures++; } } diff --git a/Mage.Sets/src/mage/sets/onslaught/RiptideShapeshifter.java b/Mage.Sets/src/mage/sets/onslaught/RiptideShapeshifter.java index e88838cc372..bd3dcddb452 100644 --- a/Mage.Sets/src/mage/sets/onslaught/RiptideShapeshifter.java +++ b/Mage.Sets/src/mage/sets/onslaught/RiptideShapeshifter.java @@ -111,7 +111,7 @@ class RiptideShapeshifterEffect extends OneShotEffect { Cards revealedCards = new CardsImpl(); while (controller.getLibrary().size() > 0) { Card card = controller.getLibrary().removeFromTop(game); - if (card.getCardType().contains(CardType.CREATURE) && card.getSubtype().contains(choice.getChoice())) { + if (card.getCardType().contains(CardType.CREATURE) && card.getSubtype(game).contains(choice.getChoice())) { controller.moveCards(card, Zone.BATTLEFIELD, source, game); break; } diff --git a/Mage.Sets/src/mage/sets/onslaught/SteelyResolve.java b/Mage.Sets/src/mage/sets/onslaught/SteelyResolve.java index e7718d04e23..23154151bf8 100644 --- a/Mage.Sets/src/mage/sets/onslaught/SteelyResolve.java +++ b/Mage.Sets/src/mage/sets/onslaught/SteelyResolve.java @@ -87,7 +87,7 @@ class FilterSteelyResolve extends FilterCreaturePermanent { public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { if (super.match(permanent, sourceId, playerId, game)) { String subtype = (String) game.getState().getValue(sourceId + "_type"); - if (subtype != null && !subtype.equals("") && permanent.hasSubtype(subtype)) { + if (subtype != null && !subtype.equals("") && permanent.hasSubtype(subtype, game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java b/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java index f798f676eb6..03e6bbcd7b2 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java +++ b/Mage.Sets/src/mage/sets/planarchaos/JeditOjanenOfEfrava.java @@ -77,8 +77,8 @@ class CatWarriorToken extends Token { this.getPower().modifyBaseValue(2); this.getToughness().modifyBaseValue(2); this.color.setGreen(true); - this.getSubtype().add("Cat"); - this.getSubtype().add("Warrior"); + this.getSubtype(null).add("Cat"); + this.getSubtype(null).add("Warrior"); this.getCardType().add(CardType.CREATURE); this.addAbility(new ForestwalkAbility()); } diff --git a/Mage.Sets/src/mage/sets/planarchaos/LifeAndLimb.java b/Mage.Sets/src/mage/sets/planarchaos/LifeAndLimb.java index c072b39034b..5bd13ed5d4b 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/LifeAndLimb.java +++ b/Mage.Sets/src/mage/sets/planarchaos/LifeAndLimb.java @@ -103,14 +103,14 @@ class LifeAndLimbEffect extends ContinuousEffectImpl { if (!permanent.getCardType().contains(CardType.CREATURE)) { permanent.getCardType().add(CardType.CREATURE); } - if (!permanent.getSubtype().contains("Saproling")) { - permanent.getSubtype().add("Saproling"); + if (!permanent.getSubtype(game).contains("Saproling")) { + permanent.getSubtype(game).add("Saproling"); } if (!permanent.getCardType().contains(CardType.LAND)) { permanent.getCardType().add(CardType.LAND); } - if (!permanent.getSubtype().contains("Forest")) { - permanent.getSubtype().add("Forest"); + if (!permanent.getSubtype(game).contains("Forest")) { + permanent.getSubtype(game).add("Forest"); } break; case ColorChangingEffects_5: diff --git a/Mage.Sets/src/mage/sets/planarchaos/UrborgTombOfYawgmoth.java b/Mage.Sets/src/mage/sets/planarchaos/UrborgTombOfYawgmoth.java index a81e54f99cb..afd9f450289 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/UrborgTombOfYawgmoth.java +++ b/Mage.Sets/src/mage/sets/planarchaos/UrborgTombOfYawgmoth.java @@ -87,8 +87,8 @@ class AddCardSubtypeAllEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { for (Permanent perm : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { - if (perm != null && !perm.getSubtype().contains(addedSubtype)) { - perm.getSubtype().add(addedSubtype); + if (perm != null && !perm.getSubtype(game).contains(addedSubtype)) { + perm.getSubtype(game).add(addedSubtype); } } return true; diff --git a/Mage.Sets/src/mage/sets/planechase/Smokebraider.java b/Mage.Sets/src/mage/sets/planechase/Smokebraider.java index 19cc167aedd..d8b1331ba79 100644 --- a/Mage.Sets/src/mage/sets/planechase/Smokebraider.java +++ b/Mage.Sets/src/mage/sets/planechase/Smokebraider.java @@ -97,7 +97,7 @@ class SmokebraiderManaCondition implements Condition { @Override public boolean apply(Game game, Ability source) { MageObject object = game.getObject(source.getSourceId()); - if (object != null && object.hasSubtype("Elemental")) { + if (object != null && object.hasSubtype("Elemental", game)) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/planechase2012/RivalsDuel.java b/Mage.Sets/src/mage/sets/planechase2012/RivalsDuel.java index 748b2824421..aeb60f15275 100644 --- a/Mage.Sets/src/mage/sets/planechase2012/RivalsDuel.java +++ b/Mage.Sets/src/mage/sets/planechase2012/RivalsDuel.java @@ -88,7 +88,7 @@ class TargetCreaturePermanentWithDifferentTypes extends TargetCreaturePermanent for (Object object : getTargets()) { UUID targetId = (UUID) object; Permanent selectedCreature = game.getPermanent(targetId); - if (CardUtil.shareSubtypes(creature, selectedCreature)) { + if (CardUtil.shareSubtypes(creature, selectedCreature, game)) { return false; } } diff --git a/Mage.Sets/src/mage/sets/ravnica/CopyEnchantment.java b/Mage.Sets/src/mage/sets/ravnica/CopyEnchantment.java index 55f158921cb..7564f012ada 100644 --- a/Mage.Sets/src/mage/sets/ravnica/CopyEnchantment.java +++ b/Mage.Sets/src/mage/sets/ravnica/CopyEnchantment.java @@ -88,7 +88,7 @@ class CopyEnchantmentEffect extends CopyPermanentEffect { if (super.apply(game, source)) { Permanent permanentToCopy = getBluePrintPermanent(); if (permanentToCopy != null) { - if (permanentToCopy.getSubtype().contains("Aura")) { + if (permanentToCopy.getSubtype(game).contains("Aura")) { Target target = getBluePrintPermanent().getSpellAbility().getTargets().get(0); Outcome auraOutcome = Outcome.BoostCreature; Ability: diff --git a/Mage.Sets/src/mage/sets/ravnica/DimirDoppelganger.java b/Mage.Sets/src/mage/sets/ravnica/DimirDoppelganger.java index 56ae353e31f..adcbb401cbe 100644 --- a/Mage.Sets/src/mage/sets/ravnica/DimirDoppelganger.java +++ b/Mage.Sets/src/mage/sets/ravnica/DimirDoppelganger.java @@ -116,10 +116,10 @@ class DimirDoppelgangerEffect extends ContinuousEffectImpl { permanent.getCardType().add(type); } } - permanent.getSubtype().clear(); - for (String type : cardToCopy.getSubtype()) { - if (!permanent.getSubtype().contains(type)) { - permanent.getSubtype().add(type); + permanent.getSubtype(game).clear(); + for (String type : cardToCopy.getSubtype(game)) { + if (!permanent.getSubtype(game).contains(type)) { + permanent.getSubtype(game).add(type); } } permanent.getSupertype().clear(); diff --git a/Mage.Sets/src/mage/sets/ravnica/Terraformer.java b/Mage.Sets/src/mage/sets/ravnica/Terraformer.java index 6817e2f14ad..5979753a32e 100644 --- a/Mage.Sets/src/mage/sets/ravnica/Terraformer.java +++ b/Mage.Sets/src/mage/sets/ravnica/Terraformer.java @@ -140,8 +140,8 @@ class TerraformerContinuousEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - land.getSubtype().clear(); - land.getSubtype().add(choice); + land.getSubtype(game).clear(); + land.getSubtype(game).add(choice); } break; case AbilityAddingRemovingEffects_6: diff --git a/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java b/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java index f7917933865..067e540d2b0 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java @@ -182,7 +182,7 @@ class GraveBetrayalContiniousEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - creature.getSubtype().add("Zombie"); + creature.getSubtype(game).add("Zombie"); } break; case ColorChangingEffects_5: diff --git a/Mage.Sets/src/mage/sets/returntoravnica/StreetSweeper.java b/Mage.Sets/src/mage/sets/returntoravnica/StreetSweeper.java index bb56267821c..c9ea4c4c438 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/StreetSweeper.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/StreetSweeper.java @@ -109,7 +109,7 @@ class StreetSweeperDestroyEffect extends OneShotEffect { for(UUID uuid : attachments) { Permanent aura = game.getPermanent(uuid); - if(aura != null && aura.getSubtype().contains("Aura")) + if(aura != null && aura.getSubtype(game).contains("Aura")) { aura.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/EldraziTemple.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/EldraziTemple.java index 70959b92df0..04496d743fe 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/EldraziTemple.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/EldraziTemple.java @@ -96,6 +96,6 @@ class EldraziTempleCondition implements Condition { @Override public boolean apply(Game game, Ability source) { MageObject object = game.getObject(source.getSourceId()); - return object != null && object.hasSubtype("Eldrazi") && object.getColor(game).isColorless(); + return object != null && object.hasSubtype("Eldrazi", game) && object.getColor(game).isColorless(); } } diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/AshesOfTheFallen.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/AshesOfTheFallen.java index 368893a6cea..4c63a6bd834 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/AshesOfTheFallen.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/AshesOfTheFallen.java @@ -92,8 +92,8 @@ class AshesOfTheFallenEffect extends ContinuousEffectImpl { String subtype = (String) game.getState().getValue(permanent.getId() + "_type"); for (UUID cardId : controller.getGraveyard()) { Card card = game.getCard(cardId); - if (card != null && card.getCardType().contains(CardType.CREATURE) && !card.getSubtype().contains(subtype)) { - card.getSubtype().add(subtype); + if (card != null && card.getCardType().contains(CardType.CREATURE) && !card.getSubtype(game).contains(subtype)) { + game.getState().getCreateCardAttribute(card).getSubtype().add(subtype); } } return true; diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SakashimaTheImpostor.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SakashimaTheImpostor.java index c6fa592d4fd..9d8a4ef4a71 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SakashimaTheImpostor.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SakashimaTheImpostor.java @@ -83,7 +83,7 @@ class SakashimaTheImpostorApplier extends ApplyToPermanent { @Override public Boolean apply(Game game, Permanent permanent) { if (!permanent.getSupertype().contains("Legendary")) { - permanent.getSubtype().add("Legendary"); + permanent.getSupertype().add("Legendary"); } permanent.setName("Sakashima the Impostor"); // {2}{U}{U}: Return Sakashima the Impostor to its owner's hand at the beginning of the next end step @@ -97,7 +97,7 @@ class SakashimaTheImpostorApplier extends ApplyToPermanent { @Override public Boolean apply(Game game, MageObject mageObject) { if (!mageObject.getSupertype().contains("Legendary")) { - mageObject.getSubtype().add("Legendary"); + mageObject.getSupertype().add("Legendary"); } mageObject.setName("Sakashima the Impostor"); // {2}{U}{U}: Return Sakashima the Impostor to its owner's hand at the beginning of the next end step diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/LiegeOfTheTangle.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/LiegeOfTheTangle.java index 8f38fa706ac..6f46999fee7 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/LiegeOfTheTangle.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/LiegeOfTheTangle.java @@ -140,7 +140,7 @@ class LiegeOfTheTangleEffect extends ContinuousEffectImpl { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { perm.getCardType().addAll(token.getCardType()); - perm.getSubtype().addAll(token.getSubtype()); + perm.getSubtype(game).addAll(token.getSubtype(game)); } break; case ColorChangingEffects_5: diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrReservoir.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrReservoir.java index b9a1eb76f37..c72891194b1 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrReservoir.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MyrReservoir.java @@ -114,7 +114,7 @@ class MyrManaCondition implements Condition { @Override public boolean apply(Game game, Ability source) { MageObject object = game.getObject(source.getSourceId()); - if (object != null && object.hasSubtype("Myr")) { + if (object != null && object.hasSubtype("Myr", game)) { return true; } return false; diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/PrecursorGolem.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/PrecursorGolem.java index fe658b91e2a..404a6bc624e 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/PrecursorGolem.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/PrecursorGolem.java @@ -114,7 +114,7 @@ class PrecursorGolemCopyTriggeredAbility extends TriggeredAbilityImpl { Target targetInstance = addr.getTarget(spell); for (UUID target : targetInstance.getTargets()) { Permanent permanent = game.getPermanent(target); - if (permanent == null || !permanent.hasSubtype("Golem")) { + if (permanent == null || !permanent.hasSubtype("Golem", game)) { return false; } if (targetGolem == null) { diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/TurnToSlag.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/TurnToSlag.java index 9d95d5f3855..1828424c002 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/TurnToSlag.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/TurnToSlag.java @@ -84,7 +84,7 @@ class TurnToSlagEffect extends OneShotEffect { List attachments = new ArrayList(); for (UUID uuid : target.getAttachments()) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached.getSubtype().contains("Equipment")) { + if (attached.getSubtype(game).contains("Equipment")) { attachments.add(attached); } } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/ElsewhereFlask.java b/Mage.Sets/src/mage/sets/shadowmoor/ElsewhereFlask.java index 933ce3485e7..6634c381809 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/ElsewhereFlask.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/ElsewhereFlask.java @@ -140,8 +140,8 @@ class ElsewhereFlaskContinuousEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - land.getSubtype().clear(); - land.getSubtype().add(choice); + land.getSubtype(game).clear(); + land.getSubtype(game).add(choice); } break; case AbilityAddingRemovingEffects_6: diff --git a/Mage.Sets/src/mage/sets/shadowmoor/PrismaticOmen.java b/Mage.Sets/src/mage/sets/shadowmoor/PrismaticOmen.java index 1893f7162fd..eea89b65f21 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/PrismaticOmen.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/PrismaticOmen.java @@ -133,8 +133,8 @@ class BecomesBasicLandTypeAllEffect extends ContinuousEffectImpl { break; case TypeChangingEffects_4: for (String subtype : landTypes) { - if (!land.getSubtype().contains(subtype)) { - land.getSubtype().add(subtype); + if (!land.getSubtype(game).contains(subtype)) { + land.getSubtype(game).add(subtype); } } break; diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BriarbridgePatrol.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BriarbridgePatrol.java index 6197e3a86c4..c1879ed9c1f 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BriarbridgePatrol.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/BriarbridgePatrol.java @@ -94,7 +94,7 @@ class BriarbridgePatrolCondition implements Condition { if (sacrificedPermanents != null && !sacrificedPermanents.isEmpty()) { int amountOfClues = 0; for (Permanent permanent : sacrificedPermanents) { - if (permanent.getSubtype().contains("Clue")) { + if (permanent.getSubtype(game).contains("Clue")) { amountOfClues++; } } diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DaringSleuth.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DaringSleuth.java index f87e984175e..9eed6042321 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DaringSleuth.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/DaringSleuth.java @@ -95,7 +95,7 @@ class DaringSleuthTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype().contains("Clue"); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains("Clue"); } @Override diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/EssenceFlux.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/EssenceFlux.java index 56f29a50c61..2be742d2830 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/EssenceFlux.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/EssenceFlux.java @@ -129,7 +129,7 @@ class EssenceFluxEffect extends OneShotEffect { controller.moveCards(cardsToBattlefield.getCards(game), Zone.BATTLEFIELD, source, game, false, false, true, null); for (UUID cardId : cardsToBattlefield) { Permanent permanent = game.getPermanent(cardId); - if (permanent != null && permanent.getSubtype().contains("Spirit")) { + if (permanent != null && permanent.getSubtype(game).contains("Spirit")) { Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance()); effect.setTargetPointer(new FixedTarget(permanent, game)); return effect.apply(game, source); diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/EverAfter.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/EverAfter.java index e112d582f09..05e9789561a 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/EverAfter.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/EverAfter.java @@ -98,7 +98,7 @@ class EverAfterEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - card.getSubtype().add("Zombie"); + card.getSubtype(game).add("Zombie"); } break; case ColorChangingEffects_5: diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FleetingMemories.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FleetingMemories.java index 39ca92a5dc7..9d654204ea5 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FleetingMemories.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FleetingMemories.java @@ -103,7 +103,7 @@ class FleetingMemoriesTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype().contains("Clue"); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains("Clue"); } @Override diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/GrafMole.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/GrafMole.java index 85d78240d77..b410e642e3e 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/GrafMole.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/GrafMole.java @@ -91,7 +91,7 @@ class GrafMoleTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype().contains("Clue"); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains("Clue"); } @Override diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SilverfurPartisan.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SilverfurPartisan.java index 095ca138a71..9d1ec2862ee 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SilverfurPartisan.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SilverfurPartisan.java @@ -100,7 +100,7 @@ class CreaturesYouControlBecomesTargetTriggeredAbility extends TriggeredAbilityI @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getControllerId().equals(this.controllerId) && (permanent.getSubtype().contains("Wolf") || permanent.getSubtype().contains("Werewolf"))) { + if (permanent != null && permanent.getControllerId().equals(this.controllerId) && (permanent.getSubtype(game).contains("Wolf") || permanent.getSubtype(game).contains("Werewolf"))) { MageObject object = game.getObject(event.getSourceId()); if (object != null && object instanceof Spell) { Card c = (Spell) object; diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SlayersPlate.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SlayersPlate.java index da45995fcbf..bc5f77a8f3b 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SlayersPlate.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SlayersPlate.java @@ -101,7 +101,7 @@ class SlayersPlateTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (((ZoneChangeEvent) event).isDiesEvent()) { Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); - if (permanent.getAttachments().contains(this.getSourceId()) && permanent.hasSubtype("Human")) { + if (permanent.getAttachments().contains(this.getSourceId()) && permanent.hasSubtype("Human", game)) { return true; } } diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/StensiaMasquerade.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/StensiaMasquerade.java index e3578968b72..dbcf9746b4f 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/StensiaMasquerade.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/StensiaMasquerade.java @@ -114,7 +114,7 @@ class StensiaMasqueradeTriggeredAbility extends TriggeredAbilityImpl { DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; Permanent permanent = game.getPermanent(event.getSourceId()); if (damageEvent.isCombatDamage() && permanent != null - && permanent.hasSubtype("Vampire") && permanent.getControllerId().equals(controllerId)) { + && permanent.hasSubtype("Vampire", game) && permanent.getControllerId().equals(controllerId)) { this.getEffects().clear(); AddCountersTargetEffect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance()); effect.setTargetPointer(new FixedTarget(permanent.getId())); diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TirelessTracker.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TirelessTracker.java index 027303b6e1a..8cd8d7d936e 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TirelessTracker.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/TirelessTracker.java @@ -106,7 +106,7 @@ class TirelessTrackerTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype().contains("Clue"); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains("Clue"); } @Override diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UlvenwaldMysteries.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UlvenwaldMysteries.java index 92f2aa9c735..749b214c310 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UlvenwaldMysteries.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UlvenwaldMysteries.java @@ -107,7 +107,7 @@ class UlvenwaldMysteriesTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype().contains("Clue"); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains("Clue"); } @Override diff --git a/Mage.Sets/src/mage/sets/shardsofalara/TezzeretTheSeeker.java b/Mage.Sets/src/mage/sets/shardsofalara/TezzeretTheSeeker.java index a0aae514022..b95982960a8 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/TezzeretTheSeeker.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/TezzeretTheSeeker.java @@ -166,7 +166,7 @@ class TezzeretTheSeekerEffect3 extends ContinuousEffectImpl { if (!permanent.getCardType().contains(CardType.CREATURE)) { permanent.getCardType().add(CardType.CREATURE); } - permanent.getSubtype().clear(); + permanent.getSubtype(game).clear(); } break; case PTChangingEffects_7: diff --git a/Mage.Sets/src/mage/sets/tempest/Excavator.java b/Mage.Sets/src/mage/sets/tempest/Excavator.java index 9b9918a9fbb..b1d90e6acd5 100644 --- a/Mage.Sets/src/mage/sets/tempest/Excavator.java +++ b/Mage.Sets/src/mage/sets/tempest/Excavator.java @@ -116,23 +116,23 @@ class ExcavatorEffect extends ContinuousEffectImpl implements SourceEffect { if(cost instanceof SacrificeTargetCost) { SacrificeTargetCost sacrificeCost = (SacrificeTargetCost) cost; for(Permanent permanent : sacrificeCost.getPermanents()) { - if(permanent.hasSubtype("Forest")) + if(permanent.hasSubtype("Forest", game)) { abilities.add(new ForestwalkAbility()); } - if(permanent.hasSubtype("Plains")) + if(permanent.hasSubtype("Plains", game)) { abilities.add(new PlainswalkAbility()); } - if(permanent.hasSubtype("Island")) + if(permanent.hasSubtype("Island", game)) { abilities.add(new IslandwalkAbility()); } - if(permanent.hasSubtype("Mountain")) + if(permanent.hasSubtype("Mountain", game)) { abilities.add(new MountainwalkAbility()); } - if(permanent.hasSubtype("Swamp")) + if(permanent.hasSubtype("Swamp", game)) { abilities.add(new SwampwalkAbility()); } diff --git a/Mage.Sets/src/mage/sets/thedark/GoblinCaves.java b/Mage.Sets/src/mage/sets/thedark/GoblinCaves.java index 641d77f9a0c..79f48dfedad 100644 --- a/Mage.Sets/src/mage/sets/thedark/GoblinCaves.java +++ b/Mage.Sets/src/mage/sets/thedark/GoblinCaves.java @@ -92,7 +92,7 @@ class AttachedToBasicMountainCondition implements Condition { if (enchantment != null) { Permanent enchanted = game.getPermanent(enchantment.getAttachedTo()); if (enchanted != null) { - if (enchanted.hasSubtype("Mountain") && enchanted.getSupertype().contains("Basic")) { + if (enchanted.hasSubtype("Mountain", game) && enchanted.getSupertype().contains("Basic")) { return true; } } diff --git a/Mage.Sets/src/mage/sets/thedark/Venom.java b/Mage.Sets/src/mage/sets/thedark/Venom.java index 5c736ca71e6..4bae921beae 100644 --- a/Mage.Sets/src/mage/sets/thedark/Venom.java +++ b/Mage.Sets/src/mage/sets/thedark/Venom.java @@ -112,13 +112,13 @@ class VenomTriggeredAbility extends TriggeredAbilityImpl { Permanent enchantedCreature = game.getPermanent(enchantment.getAttachedTo()); if (enchantedCreature != null) { if (blocker != null && blocker != enchantedCreature - && !blocker.getSubtype().contains("Wall") + && !blocker.getSubtype(game).contains("Wall") && blocked == enchantedCreature) { this.getEffects().get(0).setTargetPointer(new FixedTarget(blocker.getId())); return true; } if (blocker != null && blocker == enchantedCreature - && !blocked.getSubtype().contains("Wall")) { + && !blocked.getSubtype(game).contains("Wall")) { this.getEffects().get(0).setTargetPointer(new FixedTarget(blocked.getId())); return true; } diff --git a/Mage.Sets/src/mage/sets/theros/AshiokNightmareWeaver.java b/Mage.Sets/src/mage/sets/theros/AshiokNightmareWeaver.java index a87905e2fdf..2a44f49eb19 100644 --- a/Mage.Sets/src/mage/sets/theros/AshiokNightmareWeaver.java +++ b/Mage.Sets/src/mage/sets/theros/AshiokNightmareWeaver.java @@ -206,7 +206,7 @@ class AshiokNightmareWeaverAddTypeEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - creature.getSubtype().add("Nightmare"); + creature.getSubtype(game).add("Nightmare"); } break; } diff --git a/Mage.Sets/src/mage/sets/theros/NyleasPresence.java b/Mage.Sets/src/mage/sets/theros/NyleasPresence.java index cafe4bbf2b0..27884eeb6be 100644 --- a/Mage.Sets/src/mage/sets/theros/NyleasPresence.java +++ b/Mage.Sets/src/mage/sets/theros/NyleasPresence.java @@ -151,8 +151,8 @@ class NyleasPresenceLandTypeEffect extends ContinuousEffectImpl { break; case TypeChangingEffects_4: for (String subtype : landTypes) { - if (!land.getSubtype().contains(subtype)) { - land.getSubtype().add(subtype); + if (!land.getSubtype(game).contains(subtype)) { + land.getSubtype(game).add(subtype); } } break; diff --git a/Mage.Sets/src/mage/sets/theros/ProwlersHelm.java b/Mage.Sets/src/mage/sets/theros/ProwlersHelm.java index ed0f8f890d2..dbb4683ce91 100644 --- a/Mage.Sets/src/mage/sets/theros/ProwlersHelm.java +++ b/Mage.Sets/src/mage/sets/theros/ProwlersHelm.java @@ -94,7 +94,7 @@ class CantBeBlockedByWallsEffect extends RestrictionEffect { @Override public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - if (!blocker.hasSubtype("Wall")) { + if (!blocker.hasSubtype("Wall", game)) { return false; } return true; diff --git a/Mage.Sets/src/mage/sets/theros/SealockMonster.java b/Mage.Sets/src/mage/sets/theros/SealockMonster.java index 04a68fad775..dbeb753766d 100644 --- a/Mage.Sets/src/mage/sets/theros/SealockMonster.java +++ b/Mage.Sets/src/mage/sets/theros/SealockMonster.java @@ -122,8 +122,8 @@ class SealockMonsterBecomesIslandTargetEffect extends ContinuousEffectImpl { } break; case TypeChangingEffects_4: - if (!land.getSubtype().contains("Island")) { - land.getSubtype().add("Island"); + if (!land.getSubtype(game).contains("Island")) { + land.getSubtype(game).add("Island"); } break; } diff --git a/Mage.Sets/src/mage/sets/timeshifted/CelestialDawn.java b/Mage.Sets/src/mage/sets/timeshifted/CelestialDawn.java index ce72b1a20dd..0d50506149a 100644 --- a/Mage.Sets/src/mage/sets/timeshifted/CelestialDawn.java +++ b/Mage.Sets/src/mage/sets/timeshifted/CelestialDawn.java @@ -123,8 +123,8 @@ class CelestialDawnToPlainsEffect extends ContinuousEffectImpl { land.addAbility(new WhiteManaAbility(), source.getSourceId(), game); break; case TypeChangingEffects_4: - land.getSubtype().clear(); - land.getSubtype().add("Plains"); + land.getSubtype(game).clear(); + land.getSubtype(game).add("Plains"); break; } } diff --git a/Mage.Sets/src/mage/sets/timeshifted/Conspiracy.java b/Mage.Sets/src/mage/sets/timeshifted/Conspiracy.java new file mode 100644 index 00000000000..c6d9ae9edbb --- /dev/null +++ b/Mage.Sets/src/mage/sets/timeshifted/Conspiracy.java @@ -0,0 +1,187 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.timeshifted; + +import java.util.Iterator; +import java.util.List; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.repository.CardRepository; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; +import mage.players.Player; + +/** + * + * @author anonymous + */ +public class Conspiracy extends CardImpl { + + public Conspiracy(UUID ownerId) { + super(ownerId, 39, "Conspiracy", Rarity.SPECIAL, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); + this.expansionSetCode = "TSB"; + + // As Conspiracy enters the battlefield, choose a creature type. + this.addAbility(new EntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.Neutral))); + // Creature cards you own that aren't on the battlefield, creature spells you control, and creatures you control are the chosen type. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConspiracyEffect())); + } + + public Conspiracy(final Conspiracy card) { + super(card); + } + + @Override + public Conspiracy copy() { + return new Conspiracy(this); + } +} + +class ConspiracyEffect extends ContinuousEffectImpl { + + public ConspiracyEffect() { + super(Duration.WhileOnBattlefield, Outcome.Neutral); + staticText = "Creature cards you own that aren't on the battlefield, creature spells you control, and creatures you control are the chosen type"; + } + + public ConspiracyEffect(final ConspiracyEffect effect) { + super(effect); + } + + @Override + public ConspiracyEffect copy() { + return new ConspiracyEffect(this); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + String choice = (String) game.getState().getValue(source.getSourceId().toString() + "_type"); + if (controller != null && choice != null) { + // Creature cards you own that aren't on the battlefield + // in graveyard + for (UUID cardId : controller.getGraveyard()) { + Card card = game.getCard(cardId); + if (card.getCardType().contains(CardType.CREATURE)) { + setCreatureSubtype(card, choice, game); + } + } + // on Hand + for (UUID cardId : controller.getHand()) { + Card card = game.getCard(cardId); + if (card.getCardType().contains(CardType.CREATURE)) { + setCreatureSubtype(card, choice, game); + } + } + // in Exile + for (Card card : game.getState().getExile().getAllCards(game)) { + if (card.getOwnerId().equals(controller.getId()) && card.getCardType().contains(CardType.CREATURE)) { + setCreatureSubtype(card, choice, game); + } + } + // in Library (e.g. for Mystical Teachings) + for (Card card : controller.getLibrary().getCards(game)) { + if (card.getOwnerId().equals(controller.getId()) && card.getCardType().contains(CardType.CREATURE)) { + setCreatureSubtype(card, choice, game); + } + } + // commander in command zone + if (controller.getCommanderId() != null && game.getState().getZone(controller.getCommanderId()).equals(Zone.COMMAND)) { + Card card = game.getCard(controller.getCommanderId()); + if (card.getCardType().contains(CardType.CREATURE)) { + setCreatureSubtype(card, choice, game); + } + } + // creature spells you control + for (Iterator iterator = game.getStack().iterator(); iterator.hasNext();) { + StackObject stackObject = iterator.next(); + if (stackObject instanceof Spell && + stackObject.getControllerId().equals(source.getControllerId()) && + stackObject.getCardType().contains(CardType.CREATURE)) { + Card card = ((Spell) stackObject).getCard(); + setCreatureSubtype(card, choice, game); + } + } + // creatures you control + List creatures = game.getBattlefield().getAllActivePermanents( + new FilterControlledCreaturePermanent(), source.getControllerId(), game); + for (Permanent creature : creatures) { + setCreatureSubtype(creature, choice, game); + } + return true; + } + return false; + } + + private void setCreatureSubtype(MageObject object, String subtype, Game game) { + if (object != null) { + if (object instanceof Card) { + Card card = (Card) object; + setChosenSubtype( + game.getState().getCreateCardAttribute(card).getSubtype(), + subtype); + } else { + setChosenSubtype(object.getSubtype(game), subtype); + } + } + } + + private void setChosenSubtype(List subtype, String choice) { + if (subtype.size() != 1 || !subtype.contains(choice)) { + subtype.removeAll(CardRepository.instance.getCreatureTypes()); + subtype.add(choice); + } + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.TypeChangingEffects_4; + } +} diff --git a/Mage.Sets/src/mage/sets/timeshifted/EssenceSliver.java b/Mage.Sets/src/mage/sets/timeshifted/EssenceSliver.java index 3afdd8d5ce6..cc0393e1e8a 100644 --- a/Mage.Sets/src/mage/sets/timeshifted/EssenceSliver.java +++ b/Mage.Sets/src/mage/sets/timeshifted/EssenceSliver.java @@ -98,7 +98,7 @@ class DealsDamageAllTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent creature = game.getPermanent(event.getSourceId()); - if (creature != null && creature.hasSubtype("Sliver")) { + if (creature != null && creature.hasSubtype("Sliver", game)) { for (Effect effect : this.getEffects()) { effect.setValue("damage", event.getAmount()); } diff --git a/Mage.Sets/src/mage/sets/urzaslegacy/TreefolkMystic.java b/Mage.Sets/src/mage/sets/urzaslegacy/TreefolkMystic.java index 49a574c82d9..95de6728101 100644 --- a/Mage.Sets/src/mage/sets/urzaslegacy/TreefolkMystic.java +++ b/Mage.Sets/src/mage/sets/urzaslegacy/TreefolkMystic.java @@ -97,7 +97,7 @@ class TreefolkMysticEffect extends OneShotEffect { for(UUID uuid : attachments) { Permanent aura = game.getPermanent(uuid); - if(aura != null && aura.getSubtype().contains("Aura")) + if(aura != null && aura.getSubtype(game).contains("Aura")) { aura.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/sets/urzassaga/ChimericStaff.java b/Mage.Sets/src/mage/sets/urzassaga/ChimericStaff.java index e15593ea949..51a65f3a0e3 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/ChimericStaff.java +++ b/Mage.Sets/src/mage/sets/urzassaga/ChimericStaff.java @@ -91,7 +91,7 @@ class ChimericStaffEffect extends ContinuousEffectImpl { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { permanent.getCardType().add(CardType.CREATURE); - permanent.getSubtype().add("Construct"); + permanent.getSubtype(game).add("Construct"); } break; case PTChangingEffects_7: diff --git a/Mage.Sets/src/mage/sets/vintagemasters/VolrathsShapeshifter.java b/Mage.Sets/src/mage/sets/vintagemasters/VolrathsShapeshifter.java index 98aeac7b4a3..4130f7d831f 100644 --- a/Mage.Sets/src/mage/sets/vintagemasters/VolrathsShapeshifter.java +++ b/Mage.Sets/src/mage/sets/vintagemasters/VolrathsShapeshifter.java @@ -117,10 +117,10 @@ class VolrathsShapeshifterEffect extends ContinuousEffectImpl { } } - permanent.getSubtype().clear(); - for (String type : card.getSubtype()) { - if (!permanent.getSubtype().contains(type)) { - permanent.getSubtype().add(type); + permanent.getSubtype(game).clear(); + for (String type : card.getSubtype(game)) { + if (!permanent.getSubtype(game).contains(type)) { + permanent.getSubtype(game).add(type); } } diff --git a/Mage.Sets/src/mage/sets/visions/Necromancy.java b/Mage.Sets/src/mage/sets/visions/Necromancy.java index 034abf30319..7444758609e 100644 --- a/Mage.Sets/src/mage/sets/visions/Necromancy.java +++ b/Mage.Sets/src/mage/sets/visions/Necromancy.java @@ -211,8 +211,8 @@ class NecromancyChangeAbilityEffect extends ContinuousEffectImpl implements Sour switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - if (!permanent.getSubtype().contains("Aura")) { - permanent.getSubtype().add("Aura"); + if (!permanent.getSubtype(game).contains("Aura")) { + permanent.getSubtype(game).add("Aura"); } } break; diff --git a/Mage.Sets/src/mage/sets/visions/VisionCharm.java b/Mage.Sets/src/mage/sets/visions/VisionCharm.java index 9a218243d33..82074430876 100644 --- a/Mage.Sets/src/mage/sets/visions/VisionCharm.java +++ b/Mage.Sets/src/mage/sets/visions/VisionCharm.java @@ -135,8 +135,8 @@ class VisionCharmEffect extends ContinuousEffectImpl { filter.add(new SubtypePredicate(targetLandType)); for (Permanent land : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { //Remove all existing subtypes and replace them with the selected Basic Land Type - land.getSubtype().removeAll(land.getSubtype()); - land.getSubtype().add(targetBasicLandType); + land.getSubtype(game).removeAll(land.getSubtype(game)); + land.getSubtype(game).add(targetBasicLandType); /* Remove the existing abilities and replace them with the ability of the chosen basic land */ diff --git a/Mage.Sets/src/mage/sets/worldwake/AgadeemOccultist.java b/Mage.Sets/src/mage/sets/worldwake/AgadeemOccultist.java index 1991164395b..6973d85b0af 100644 --- a/Mage.Sets/src/mage/sets/worldwake/AgadeemOccultist.java +++ b/Mage.Sets/src/mage/sets/worldwake/AgadeemOccultist.java @@ -98,7 +98,7 @@ class AgadeemOccultistEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); int allycount = 0; for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { - if (permanent.hasSubtype("Ally")) { + if (permanent.hasSubtype("Ally", game)) { allycount++; } } diff --git a/Mage.Sets/src/mage/sets/worldwake/KalastriaHighborn.java b/Mage.Sets/src/mage/sets/worldwake/KalastriaHighborn.java index 7b2bd15a0f8..ea588156652 100644 --- a/Mage.Sets/src/mage/sets/worldwake/KalastriaHighborn.java +++ b/Mage.Sets/src/mage/sets/worldwake/KalastriaHighborn.java @@ -111,7 +111,7 @@ class KalastriaHighbornTriggeredAbility extends TriggeredAbilityImpl { zEvent.getToZone() == Zone.GRAVEYARD && zEvent.getFromZone() == Zone.BATTLEFIELD && (permanent.getControllerId().equals(this.getControllerId()) && - permanent.hasSubtype("Vampire") || permanent.getId().equals(this.getSourceId())); + permanent.hasSubtype("Vampire", game) || permanent.getId().equals(this.getSourceId())); } @Override diff --git a/Mage.Sets/src/mage/sets/worldwake/TalusPaladin.java b/Mage.Sets/src/mage/sets/worldwake/TalusPaladin.java index bfd0764de8e..8da95e4aa52 100644 --- a/Mage.Sets/src/mage/sets/worldwake/TalusPaladin.java +++ b/Mage.Sets/src/mage/sets/worldwake/TalusPaladin.java @@ -111,7 +111,7 @@ class TalusPaladinTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { Permanent ally = game.getPermanent(event.getTargetId()); if (ally != null) { - if (ally.hasSubtype("Ally") + if (ally.hasSubtype("Ally", game) && ally.getControllerId().equals(this.getControllerId())) { if (event.getTargetId().equals(this.getSourceId()) || event.getTargetId().equals(ally.getId())) { diff --git a/Mage.Sets/src/mage/sets/worldwake/TuktukScrapper.java b/Mage.Sets/src/mage/sets/worldwake/TuktukScrapper.java index ea14edc842f..cac12c44dbe 100644 --- a/Mage.Sets/src/mage/sets/worldwake/TuktukScrapper.java +++ b/Mage.Sets/src/mage/sets/worldwake/TuktukScrapper.java @@ -103,7 +103,7 @@ class TuktukScrapperTriggeredAbility extends TriggeredAbilityImpl { if (permanent.getId().equals(this.getSourceId())) { return true; } - if (permanent.hasSubtype("Ally") + if (permanent.hasSubtype("Ally", game) && permanent.getControllerId().equals(this.getControllerId())) { return true; } diff --git a/Mage.Sets/src/mage/sets/zendikar/ArmamentMaster.java b/Mage.Sets/src/mage/sets/zendikar/ArmamentMaster.java index 98ec453898f..7c4c8aade04 100644 --- a/Mage.Sets/src/mage/sets/zendikar/ArmamentMaster.java +++ b/Mage.Sets/src/mage/sets/zendikar/ArmamentMaster.java @@ -123,7 +123,7 @@ class ArmamentMasterEffect extends ContinuousEffectImpl { List attachments = p.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype().contains("Equipment")) { + if (attached != null && attached.getSubtype(game).contains("Equipment")) { count++; } } diff --git a/Mage.Sets/src/mage/sets/zendikar/BladeOfTheBloodchief.java b/Mage.Sets/src/mage/sets/zendikar/BladeOfTheBloodchief.java index 1d58f3eca48..9bc2a6711bf 100644 --- a/Mage.Sets/src/mage/sets/zendikar/BladeOfTheBloodchief.java +++ b/Mage.Sets/src/mage/sets/zendikar/BladeOfTheBloodchief.java @@ -54,7 +54,7 @@ public class BladeOfTheBloodchief extends CardImpl { public BladeOfTheBloodchief(UUID ownerId) { super(ownerId, 196, "Blade of the Bloodchief", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{1}"); this.expansionSetCode = "ZEN"; - this.getSubtype().add("Equipment"); + this.getSubtype(null).add("Equipment"); this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(1))); this.addAbility(new BladeOfTheBloodChiefTriggeredAbility()); @@ -130,7 +130,7 @@ class BladeOfTheBloodchiefEffect extends OneShotEffect { if (enchantment != null && enchantment.getAttachedTo() != null) { Permanent creature = game.getPermanent(enchantment.getAttachedTo()); if (creature != null) { - if (creature.hasSubtype("Vampire")) { + if (creature.hasSubtype("Vampire", game)) { creature.addCounters(CounterType.P1P1.createInstance(2), game); } else { creature.addCounters(CounterType.P1P1.createInstance(), game); diff --git a/Mage.Sets/src/mage/sets/zendikar/BlazingTorch.java b/Mage.Sets/src/mage/sets/zendikar/BlazingTorch.java index b86ce408897..f52b3c56ed8 100644 --- a/Mage.Sets/src/mage/sets/zendikar/BlazingTorch.java +++ b/Mage.Sets/src/mage/sets/zendikar/BlazingTorch.java @@ -109,7 +109,7 @@ class BlazingTorchEvasionEffect extends RestrictionEffect { @Override public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { - return !blocker.hasSubtype("Vampire") && !blocker.hasSubtype("Zombie"); + return !blocker.hasSubtype("Vampire", game) && !blocker.hasSubtype("Zombie", game); } @Override diff --git a/Mage.Sets/src/mage/sets/zendikar/KorDuelist.java b/Mage.Sets/src/mage/sets/zendikar/KorDuelist.java index a9a2d1e76df..a7e11ce5548 100644 --- a/Mage.Sets/src/mage/sets/zendikar/KorDuelist.java +++ b/Mage.Sets/src/mage/sets/zendikar/KorDuelist.java @@ -84,7 +84,7 @@ class SourceIsEquiped implements Condition { for (UUID attachmentUUID : attachments) { Permanent attachment = game.getPermanent(attachmentUUID); if (attachment != null) { - if (attachment.getSubtype().contains("Equipment")) { + if (attachment.getSubtype(game).contains("Equipment")) { return true; } } diff --git a/Mage.Sets/src/mage/sets/zendikar/MerfolkWayfinder.java b/Mage.Sets/src/mage/sets/zendikar/MerfolkWayfinder.java index 84efa542d4c..93bc0b7f453 100644 --- a/Mage.Sets/src/mage/sets/zendikar/MerfolkWayfinder.java +++ b/Mage.Sets/src/mage/sets/zendikar/MerfolkWayfinder.java @@ -103,7 +103,7 @@ class MerfolkWayfinderEffect extends OneShotEffect { Card card = player.getLibrary().removeFromTop(game); if (card != null) { cardsToReveal.add(card); - if (card.hasSubtype("Island")) { + if (card.hasSubtype("Island", game)) { card.moveToZone(Zone.HAND, source.getSourceId(), game, false); } else { cards.add(card); diff --git a/Mage.Sets/src/mage/sets/zendikar/TrapfindersTrick.java b/Mage.Sets/src/mage/sets/zendikar/TrapfindersTrick.java index 15a70885903..93c5e7a1c32 100644 --- a/Mage.Sets/src/mage/sets/zendikar/TrapfindersTrick.java +++ b/Mage.Sets/src/mage/sets/zendikar/TrapfindersTrick.java @@ -91,7 +91,7 @@ class TrapfindersTrickEffect extends OneShotEffect { player.revealCards("Trapfinder's Trick", hand, game); Set cards = hand.getCards(game); for (Card card : cards) { - if (card != null && card.hasSubtype("Trap")) { + if (card != null && card.hasSubtype("Trap", game)) { player.discard(card, source, game); } } diff --git a/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java b/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java index 952d1512c16..61739f0009d 100644 --- a/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java +++ b/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java @@ -107,7 +107,7 @@ class ValakutTheMoltenPinnacleTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && permanent.getCardType().contains(CardType.LAND) && permanent.getControllerId().equals(this.getControllerId())) { - if (permanent.hasSubtype("Mountain")) { + if (permanent.hasSubtype("Mountain", game)) { return true; } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/LazavDimirMastermindTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/LazavDimirMastermindTest.java index 0614fbfb556..bba2800208a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/LazavDimirMastermindTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/LazavDimirMastermindTest.java @@ -48,7 +48,7 @@ public class LazavDimirMastermindTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Lazav, Dimir Mastermind", 3, 2); Permanent lazav = getPermanent("Lazav, Dimir Mastermind", playerA.getId()); - Assert.assertTrue(lazav.getSubtype().contains("Griffin")); + Assert.assertTrue(lazav.getSubtype(currentGame).contains("Griffin")); Assert.assertTrue("Lazav, Dimir Mastermind must have flying",lazav.getAbilities().contains(FlyingAbility.getInstance())); } @@ -74,8 +74,8 @@ public class LazavDimirMastermindTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Lazav, Dimir Mastermind", 1); assertPowerToughness(playerA, "Lazav, Dimir Mastermind", 3, 3); Permanent lazav = getPermanent("Lazav, Dimir Mastermind", playerA.getId()); - Assert.assertTrue(lazav.getSubtype().contains("Ogre")); - Assert.assertTrue(lazav.getSubtype().contains("Rogue")); + Assert.assertTrue(lazav.getSubtype(currentGame).contains("Ogre")); + Assert.assertTrue(lazav.getSubtype(currentGame).contains("Rogue")); Permanent gutterSkulk = getPermanent("Gutter Skulk", playerA.getId()); Assert.assertTrue("Gutter Skulk should have deathtouch but hasn't", gutterSkulk.getAbilities().contains(DeathtouchAbility.getInstance())); @@ -116,7 +116,7 @@ public class LazavDimirMastermindTest extends CardTestPlayerBase { Permanent lazav = getPermanent("Lazav, Dimir Mastermind", playerA.getId()); Assert.assertTrue(lazav.getAbilities().contains(FlyingAbility.getInstance())); - Assert.assertTrue(lazav.getSubtype().contains("Specter")); + Assert.assertTrue(lazav.getSubtype(currentGame).contains("Specter")); Assert.assertTrue(lazav.getSupertype().contains("Legendary")); assertPermanentCount(playerA, "Silvercoat Lion", 1); @@ -146,7 +146,7 @@ public class LazavDimirMastermindTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Lazav, Dimir Mastermind", 2, 2); Permanent lazav = getPermanent("Lazav, Dimir Mastermind", playerA.getId()); - Assert.assertTrue(lazav.getSubtype().contains("Cat")); + Assert.assertTrue(lazav.getSubtype(currentGame).contains("Cat")); Assert.assertTrue(lazav.getSupertype().contains("Legendary")); } @@ -190,7 +190,7 @@ public class LazavDimirMastermindTest extends CardTestPlayerBase { assertPermanentCount(playerA, "Lazav, Dimir Mastermind", 1); assertPowerToughness(playerA, "Lazav, Dimir Mastermind", 3, 3); Permanent lazav = getPermanent("Lazav, Dimir Mastermind", playerA.getId()); - Assert.assertFalse(lazav.getSubtype().contains("Griffin")); // no Griffin type + Assert.assertFalse(lazav.getSubtype(currentGame).contains("Griffin")); // no Griffin type Assert.assertFalse("Lazav, Dimir Mastermind must have flying",lazav.getAbilities().contains(FlyingAbility.getInstance())); @@ -226,7 +226,7 @@ public class LazavDimirMastermindTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Lazav, Dimir Mastermind", 3, 2); Permanent lazav = getPermanent("Lazav, Dimir Mastermind", playerA.getId()); - Assert.assertTrue(lazav.getSubtype().contains("Griffin")); + Assert.assertTrue(lazav.getSubtype(currentGame).contains("Griffin")); Assert.assertTrue("Lazav, Dimir Mastermind must have flying",lazav.getAbilities().contains(FlyingAbility.getInstance())); } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/VolrathsShapshifterTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/VolrathsShapshifterTest.java index 2e6bdca9691..72e517ed034 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/VolrathsShapshifterTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/VolrathsShapshifterTest.java @@ -43,7 +43,7 @@ public class VolrathsShapshifterTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Assault Griffin", 3, 2); Permanent shapeshifter = getPermanent("Assault Griffin", playerA.getId()); - Assert.assertTrue(shapeshifter.getSubtype().contains("Griffin")); + Assert.assertTrue(shapeshifter.getSubtype(currentGame).contains("Griffin")); Assert.assertTrue("Volrath's Shapeshifter must have flying", shapeshifter.getAbilities().contains(FlyingAbility.getInstance())); Assert.assertTrue("Volrath's Shapeshifter must have {2} : Discard a card", hasShapeshiftersOriginalAbility(shapeshifter)); } @@ -73,7 +73,7 @@ public class VolrathsShapshifterTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Volrath's Shapeshifter", 0, 1); Permanent shapeshifter = getPermanent("Volrath's Shapeshifter", playerA.getId()); - Assert.assertTrue(shapeshifter.getSubtype().contains("Shapeshifter")); + Assert.assertTrue(shapeshifter.getSubtype(currentGame).contains("Shapeshifter")); Assert.assertTrue("Volrath's Shapeshifter must have {2} : Discard a card", hasShapeshiftersOriginalAbility(shapeshifter)); } @@ -100,7 +100,7 @@ public class VolrathsShapshifterTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Dutiful Thrull", 1, 1); Permanent shapeshifter = getPermanent("Dutiful Thrull", playerA.getId()); - Assert.assertTrue(shapeshifter.getSubtype().contains("Thrull")); + Assert.assertTrue(shapeshifter.getSubtype(currentGame).contains("Thrull")); Assert.assertTrue("Volrath's Shapeshifter must have {2} : Discard a card", hasShapeshiftersOriginalAbility(shapeshifter)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/enchantments/LignifyTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/enchantments/LignifyTest.java index 19b7c61c5e3..483c3a6bc0a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/enchantments/LignifyTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/enchantments/LignifyTest.java @@ -70,7 +70,7 @@ public class LignifyTest extends CardTestPlayerBase { Permanent hivelord = getPermanent("Sliver Hivelord", playerB); - Assert.assertFalse("Sliver Hivelord may not be of subtype Sliver", hivelord.getSubtype().contains("Sliver")); + Assert.assertFalse("Sliver Hivelord may not be of subtype Sliver", hivelord.getSubtype(currentGame).contains("Sliver")); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/emn/SoulSeparatorTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/emn/SoulSeparatorTest.java index a9920940d3a..933223c0d40 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/emn/SoulSeparatorTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/emn/SoulSeparatorTest.java @@ -40,7 +40,7 @@ public class SoulSeparatorTest extends CardTestPlayerBase { Permanent saToken = getPermanent("Sylvan Advocate", playerA); Assert.assertTrue(saToken.getAbilities().contains(FlyingAbility.getInstance())); - Assert.assertTrue(saToken.getSubtype().contains("Spirit")); + Assert.assertTrue(saToken.getSubtype(currentGame).contains("Spirit")); Assert.assertTrue(saToken.getAbilities().contains(VigilanceAbility.getInstance())); assertPowerToughness(playerA, "Sylvan Advocate", 1, 1); } @@ -76,7 +76,7 @@ public class SoulSeparatorTest extends CardTestPlayerBase { Permanent treeToken = getPermanent("Tree of Perdition", playerA); Assert.assertTrue(treeToken.getAbilities().contains(FlyingAbility.getInstance())); - Assert.assertTrue(treeToken.getSubtype().contains("Spirit")); + Assert.assertTrue(treeToken.getSubtype(currentGame).contains("Spirit")); Assert.assertTrue(treeToken.getAbilities().contains(DefenderAbility.getInstance())); assertLife(playerA, 20); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/FathomMageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/FathomMageTest.java index bfb822c8952..c9191ff2554 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/FathomMageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/FathomMageTest.java @@ -60,7 +60,7 @@ public class FathomMageTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Fathom Mage", 3, 3); Permanent fathomMage = getPermanent("Fathom Mage", playerA); - Assert.assertEquals("Fathom Mage has to be a Mutant", true, fathomMage.getSubtype().contains("Mutant")); + Assert.assertEquals("Fathom Mage has to be a Mutant", true, fathomMage.getSubtype(currentGame).contains("Mutant")); assertHandCount(playerA, 2); } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 37fdf374e92..e4177371fc9 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -716,7 +716,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement Assert.assertTrue("(Battlefield) card type not found (" + cardName + ":" + type + ")", found.getCardType().contains(type)); - Assert.assertTrue("(Battlefield) card sub-type not equal (" + cardName + ":" + subType + ")", found.getSubtype().contains(subType)); + Assert.assertTrue("(Battlefield) card sub-type not equal (" + cardName + ":" + subType + ")", found.getSubtype(currentGame).contains(subType)); } /** diff --git a/Mage/src/main/java/mage/MageObject.java b/Mage/src/main/java/mage/MageObject.java index 545ba0dd156..5e3fb97dea2 100644 --- a/Mage/src/main/java/mage/MageObject.java +++ b/Mage/src/main/java/mage/MageObject.java @@ -24,9 +24,9 @@ public interface MageObject extends MageItem, Serializable { List getCardType(); - List getSubtype(); + List getSubtype(Game game); - boolean hasSubtype(String subtype); + boolean hasSubtype(String subtype, Game game); List getSupertype(); diff --git a/Mage/src/main/java/mage/MageObjectImpl.java b/Mage/src/main/java/mage/MageObjectImpl.java index ebb8fc674f9..82d082df6d6 100644 --- a/Mage/src/main/java/mage/MageObjectImpl.java +++ b/Mage/src/main/java/mage/MageObjectImpl.java @@ -122,7 +122,7 @@ public abstract class MageObjectImpl implements MageObject { } @Override - public List getSubtype() { + public List getSubtype(Game game) { return subtype; } @@ -182,11 +182,12 @@ public abstract class MageObjectImpl implements MageObject { } @Override - public boolean hasSubtype(String value) { + public boolean hasSubtype(String value, Game game) { if (value == null) { return false; } - if (this.subtype.contains(value)) { + List subtypes = this.getSubtype(game); + if (subtypes.contains(value)) { return true; } else { // checking for Changeling @@ -196,7 +197,7 @@ public abstract class MageObjectImpl implements MageObject { return false; } // as it is creature subtype, then check the existence of Changeling - return abilities.contains(ChangelingAbility.getInstance()) || this.subtype.contains(ChangelingAbility.ALL_CREATURE_TYPE); + return abilities.contains(ChangelingAbility.getInstance()) || subtypes.contains(ChangelingAbility.ALL_CREATURE_TYPE); } } diff --git a/Mage/src/main/java/mage/abilities/abilityword/KinshipAbility.java b/Mage/src/main/java/mage/abilities/abilityword/KinshipAbility.java index fa645b0f604..201b23fca8f 100644 --- a/Mage/src/main/java/mage/abilities/abilityword/KinshipAbility.java +++ b/Mage/src/main/java/mage/abilities/abilityword/KinshipAbility.java @@ -126,7 +126,7 @@ class KinshipBaseEffect extends OneShotEffect { if (card != null) { Cards cards = new CardsImpl(card); controller.lookAtCards(sourcePermanent.getName(), cards, game); - if (CardUtil.shareSubtypes(sourcePermanent, card)) { + if (CardUtil.shareSubtypes(sourcePermanent, card, game)) { if (controller.chooseUse(outcome,new StringBuilder("Kinship - Reveal ").append(card.getLogName()).append("?").toString(), source, game)) { controller.revealCards(sourcePermanent.getName(), cards, game); for (Effect effect: kinshipEffects) { diff --git a/Mage/src/main/java/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java index 9252d5d9e0d..512b881b524 100644 --- a/Mage/src/main/java/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java @@ -58,7 +58,7 @@ public class AllyEntersBattlefieldTriggeredAbility extends TriggeredAbilityImpl EntersTheBattlefieldEvent ebe = (EntersTheBattlefieldEvent) event; if (ebe.getTarget().getControllerId().equals(this.controllerId) && (event.getTargetId().equals(this.getSourceId()) - || (ebe.getTarget().hasSubtype("Ally") && !event.getTargetId().equals(this.getSourceId())))) { + || (ebe.getTarget().hasSubtype("Ally", game) && !event.getTargetId().equals(this.getSourceId())))) { return true; } return false; diff --git a/Mage/src/main/java/mage/abilities/common/AuraAttachedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AuraAttachedTriggeredAbility.java index cb4dca44ccc..4ab0f259efe 100644 --- a/Mage/src/main/java/mage/abilities/common/AuraAttachedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AuraAttachedTriggeredAbility.java @@ -57,7 +57,7 @@ public class AuraAttachedTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getTargetId().equals(this.getSourceId())) { Permanent attachment = game.getPermanent(event.getSourceId()); - if (attachment != null && attachment.getSubtype().contains("Aura")) { + if (attachment != null && attachment.getSubtype(game).contains("Aura")) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/common/LicidAbility.java b/Mage/src/main/java/mage/abilities/common/LicidAbility.java index 1c5a3e4232c..1b8381c8bbb 100644 --- a/Mage/src/main/java/mage/abilities/common/LicidAbility.java +++ b/Mage/src/main/java/mage/abilities/common/LicidAbility.java @@ -140,8 +140,8 @@ class LicidContinuousEffect extends ContinuousEffectImpl { case TypeChangingEffects_4: licid.getCardType().clear(); licid.getCardType().add(CardType.ENCHANTMENT); - licid.getSubtype().clear(); - licid.getSubtype().add("Aura"); + licid.getSubtype(game).clear(); + licid.getSubtype(game).add("Aura"); break; case AbilityAddingRemovingEffects_6: for (Ability ability : licid.getAbilities(game)) { diff --git a/Mage/src/main/java/mage/abilities/condition/common/EquippedHasSubtypeCondition.java b/Mage/src/main/java/mage/abilities/condition/common/EquippedHasSubtypeCondition.java index 4a06baeb869..3f2bf3cdc02 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/EquippedHasSubtypeCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/EquippedHasSubtypeCondition.java @@ -61,12 +61,12 @@ public class EquippedHasSubtypeCondition implements Condition { } if (attachedTo != null) { if (subType != null) { - if (attachedTo.hasSubtype(this.subType)) { + if (attachedTo.hasSubtype(this.subType, game)) { return true; } } else { for (String s : subTypes) { - if (attachedTo.hasSubtype(s)) { + if (attachedTo.hasSubtype(s, game)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/EquippedSourceCondition.java b/Mage/src/main/java/mage/abilities/condition/common/EquippedSourceCondition.java index 304c8930874..22badda22c9 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/EquippedSourceCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/EquippedSourceCondition.java @@ -52,7 +52,7 @@ public class EquippedSourceCondition implements Condition { if (permanent != null) { for (UUID uuid : permanent.getAttachments()) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached != null && attached.getSubtype().contains("Equipment")) { + if (attached != null && attached.getSubtype(game).contains("Equipment")) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/SourceHasSubtypeCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SourceHasSubtypeCondition.java index bcd187e2c08..3d246b24178 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/SourceHasSubtypeCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/SourceHasSubtypeCondition.java @@ -1,7 +1,6 @@ package mage.abilities.condition.common; import java.util.List; -import java.util.Set; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.game.Game; @@ -24,7 +23,7 @@ public class SourceHasSubtypeCondition implements Condition { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { for (String subtype : subtypes) { - if (permanent.hasSubtype(subtype)) { + if (permanent.hasSubtype(subtype, game)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/TargetHasSubtypeCondition.java b/Mage/src/main/java/mage/abilities/condition/common/TargetHasSubtypeCondition.java index 97541140a95..cecd3593e96 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/TargetHasSubtypeCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/TargetHasSubtypeCondition.java @@ -50,7 +50,7 @@ public class TargetHasSubtypeCondition implements Condition { if (!source.getTargets().isEmpty()) { Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - return permanent.hasSubtype(subtype); + return permanent.hasSubtype(subtype, game); } } return false; diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/AuraAttachedCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/AuraAttachedCount.java index be484456be7..0f6daf25624 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/AuraAttachedCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/AuraAttachedCount.java @@ -63,7 +63,7 @@ public class AuraAttachedCount implements DynamicValue { List attachments = p.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype().contains("Aura")) { + if (attached != null && attached.getSubtype(game).contains("Aura")) { count++; } } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/DomainValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/DomainValue.java index 5b4f6da09b8..75311da6f6e 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/DomainValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/DomainValue.java @@ -62,19 +62,19 @@ public class DomainValue implements DynamicValue { } for (Permanent p : game.getBattlefield().getAllActivePermanents(targetPlayer)) { if (p.getCardType().contains(CardType.LAND)) { - if (havePlains == 0 && p.getSubtype().contains("Plains")) { + if (havePlains == 0 && p.getSubtype(game).contains("Plains")) { havePlains = 1; } - if (haveIslands == 0 && p.getSubtype().contains("Island")) { + if (haveIslands == 0 && p.getSubtype(game).contains("Island")) { haveIslands = 1; } - if (haveMountains == 0 && p.getSubtype().contains("Mountain")) { + if (haveMountains == 0 && p.getSubtype(game).contains("Mountain")) { haveMountains = 1; } - if (haveSwamps == 0 && p.getSubtype().contains("Swamp")) { + if (haveSwamps == 0 && p.getSubtype(game).contains("Swamp")) { haveSwamps = 1; } - if (haveForests == 0 && p.getSubtype().contains("Forest")) { + if (haveForests == 0 && p.getSubtype(game).contains("Forest")) { haveForests = 1; } } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java index 6bc0e8c51c2..c7881cdc35e 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java @@ -63,7 +63,7 @@ public class EquipmentAttachedCount implements DynamicValue { List attachments = permanent.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype().contains("Equipment")) { + if (attached != null && attached.getSubtype(game).contains("Equipment")) { count++; } } diff --git a/Mage/src/main/java/mage/abilities/effects/AuraReplacementEffect.java b/Mage/src/main/java/mage/abilities/effects/AuraReplacementEffect.java index 13b3c5e5fd3..d63917d5f58 100644 --- a/Mage/src/main/java/mage/abilities/effects/AuraReplacementEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/AuraReplacementEffect.java @@ -206,12 +206,12 @@ public class AuraReplacementEffect extends ReplacementEffectImpl { if (((ZoneChangeEvent) event).getToZone().equals(Zone.BATTLEFIELD) && !(((ZoneChangeEvent) event).getFromZone().equals(Zone.STACK))) { Card card = game.getCard(event.getTargetId()); - if (card != null && (card.getCardType().contains(CardType.ENCHANTMENT) && card.hasSubtype("Aura") + if (card != null && (card.getCardType().contains(CardType.ENCHANTMENT) && card.hasSubtype("Aura", game) || // in case of transformable enchantments (game.getState().getValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + card.getId()) != null && card.getSecondCardFace() != null && card.getSecondCardFace().getCardType().contains(CardType.ENCHANTMENT) - && card.getSecondCardFace().hasSubtype("Aura")))) { + && card.getSecondCardFace().hasSubtype("Aura", game)))) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/AmplifyEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AmplifyEffect.java index b05ddd626c1..1a210a2ce6e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AmplifyEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/AmplifyEffect.java @@ -100,7 +100,7 @@ public class AmplifyEffect extends ReplacementEffectImpl { if (controller != null && sourceCreature != null) { FilterCreatureCard filter = new FilterCreatureCard("creatures cards to reveal"); List filterSubtypes = new ArrayList<>(); - for (String subtype : sourceCreature.getSubtype()) { + for (String subtype : sourceCreature.getSubtype(game)) { filterSubtypes.add(new SubtypePredicate((subtype))); } if (filterSubtypes.size() > 1) { 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 5c83a3ccf6a..7b472f6566a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CopyEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CopyEffect.java @@ -126,9 +126,9 @@ public class CopyEffect extends ContinuousEffectImpl { for (CardType type : copyFromObject.getCardType()) { permanent.getCardType().add(type); } - permanent.getSubtype().clear(); - for (String type : copyFromObject.getSubtype()) { - permanent.getSubtype().add(type); + permanent.getSubtype(game).clear(); + for (String type : copyFromObject.getSubtype(game)) { + permanent.getSubtype(game).add(type); } permanent.getSupertype().clear(); for (String type : copyFromObject.getSupertype()) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/CopyTokenEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CopyTokenEffect.java index bf909df626d..60f09fb7d17 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CopyTokenEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CopyTokenEffect.java @@ -34,9 +34,9 @@ public class CopyTokenEffect extends ContinuousEffectImpl { for (CardType type: token.getCardType()) { permanent.getCardType().add(type); } - permanent.getSubtype().clear(); - for (String type: token.getSubtype()) { - permanent.getSubtype().add(type); + permanent.getSubtype(game).clear(); + for (String type: token.getSubtype(game)) { + permanent.getSubtype(game).add(type); } permanent.getSupertype().clear(); for (String type: token.getSupertype()) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/DevourEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DevourEffect.java index 42b8294aeb7..e7b40e0e742 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DevourEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DevourEffect.java @@ -150,7 +150,7 @@ public class DevourEffect extends ReplacementEffectImpl { for (UUID targetId : target.getTargets()) { Permanent targetCreature = game.getPermanent(targetId); if (targetCreature != null) { - cardSubtypes.add((ArrayList) targetCreature.getSubtype()); + cardSubtypes.add((ArrayList) targetCreature.getSubtype(game)); } if (targetCreature == null || !targetCreature.sacrifice(source.getSourceId(), game)) { return false; diff --git a/Mage/src/main/java/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java index 69af814f099..43d7439afbd 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java @@ -198,8 +198,8 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { if (tokenToughness != Integer.MIN_VALUE) { token.setToughness(tokenToughness); } - if (additionalSubType != null && !token.getSubtype().contains(additionalSubType)) { - token.getSubtype().add(additionalSubType); + if (additionalSubType != null && !token.getSubtype(game).contains(additionalSubType)) { + token.getSubtype(game).add(additionalSubType); } token.putOntoBattlefield(number, game, source.getSourceId(), playerId == null ? source.getControllerId() : playerId, tapped, attacking, attackedPlayer); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubTypeTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubTypeTargetEffect.java index 908fe8f140a..7a988a5bbcd 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubTypeTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubTypeTargetEffect.java @@ -58,8 +58,8 @@ public class AddCardSubTypeTargetEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { Permanent target = game.getPermanent(targetPointer.getFirst(game, source)); if (target != null) { - if (!target.hasSubtype(addedSubType)) { - target.getSubtype().add(addedSubType); + if (!target.hasSubtype(addedSubType, game)) { + target.getSubtype(game).add(addedSubType); } } else { if (Duration.Custom.equals(duration)) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAttachedEffect.java index a93ce7b8193..8811d631cce 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAttachedEffect.java @@ -59,8 +59,8 @@ public class AddCardSubtypeAttachedEffect extends ContinuousEffectImpl { Permanent equipment = game.getPermanent(source.getSourceId()); if (equipment != null && equipment.getAttachedTo() != null) { Permanent target = game.getPermanent(equipment.getAttachedTo()); - if (target != null && !target.getSubtype().contains(addedSubtype)) - target.getSubtype().add(addedSubtype); + if (target != null && !target.getSubtype(game).contains(addedSubtype)) + target.getSubtype(game).add(addedSubtype); } return true; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAuraSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAuraSourceEffect.java index ff4f1a1c67f..dc731efe9e3 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAuraSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAuraSourceEffect.java @@ -83,8 +83,8 @@ public class BecomesAuraSourceEffect extends ContinuousEffectImpl implements Sou switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - if (!permanent.getSubtype().contains("Aura")) { - permanent.getSubtype().add("Aura"); + if (!permanent.getSubtype(game).contains("Aura")) { + permanent.getSubtype(game).add("Aura"); } } break; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java index a340937034d..a34d51a7345 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java @@ -98,27 +98,27 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { for (String landType : landTypes) { switch (landType) { case "Swamp": - if (permanent.getSubtype().contains("Swamp")) { // type can be removed by other effect with newer timestamp, so no ability adding + if (permanent.getSubtype(game).contains("Swamp")) { // type can be removed by other effect with newer timestamp, so no ability adding permanent.addAbility(new BlackManaAbility(), source.getSourceId(), game); } break; case "Mountain": - if (permanent.getSubtype().contains("Mountain")) { + if (permanent.getSubtype(game).contains("Mountain")) { permanent.addAbility(new RedManaAbility(), source.getSourceId(), game); } break; case "Forest": - if (permanent.getSubtype().contains("Forest")) { + if (permanent.getSubtype(game).contains("Forest")) { permanent.addAbility(new GreenManaAbility(), source.getSourceId(), game); } break; case "Island": - if (permanent.getSubtype().contains("Island")) { + if (permanent.getSubtype(game).contains("Island")) { permanent.addAbility(new BlueManaAbility(), source.getSourceId(), game); } break; case "Plains": - if (permanent.getSubtype().contains("Plains")) { + if (permanent.getSubtype(game).contains("Plains")) { permanent.addAbility(new WhiteManaAbility(), source.getSourceId(), game); } break; @@ -127,8 +127,8 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { break; case TypeChangingEffects_4: // subtypes are all removed by changing the subtype to a land type. - permanent.getSubtype().removeAll(allLandTypes); - permanent.getSubtype().addAll(landTypes); + permanent.getSubtype(game).removeAll(allLandTypes); + permanent.getSubtype(game).addAll(landTypes); break; } return true; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java index a5c61a9b47f..7f6ad973d03 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java @@ -132,7 +132,7 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { for (UUID targetPermanent : targetPointer.getTargets(game, source)) { Permanent land = game.getPermanent(targetPermanent); if (land != null) { - for (String type : land.getSubtype()) { + for (String type : land.getSubtype(game)) { if (!landTypes.contains(type)) { landTypes.add(type); } @@ -157,8 +157,8 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { // So the ability removing has to be done before Layer 6 land.removeAllAbilities(source.getSourceId(), game); // 305.7 - land.getSubtype().removeAll(CardRepository.instance.getLandTypes()); - land.getSubtype().addAll(landTypes); + land.getSubtype(game).removeAll(CardRepository.instance.getLandTypes()); + land.getSubtype(game).addAll(landTypes); break; case AbilityAddingRemovingEffects_6: for (String landType : landTypes) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java index 775fe1e9184..f146091597b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAllEffect.java @@ -84,10 +84,10 @@ public class BecomesCreatureAllEffect extends ContinuousEffectImpl { } } if (type == null) { - permanent.getSubtype().clear(); + permanent.getSubtype(game).clear(); } - if (token.getSubtype().size() > 0) { - permanent.getSubtype().addAll(token.getSubtype()); + if (token.getSubtype(game).size() > 0) { + permanent.getSubtype(game).addAll(token.getSubtype(game)); } } break; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java index b8e69a3278d..454f0000e66 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java @@ -112,13 +112,13 @@ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { case ALL: case ALL_BUT_COLOR: case ABILITIES_SUBTYPE_AND_PT: - permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); + permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); break; } - if (token.getSubtype().size() > 0) { - for (String t : token.getSubtype()) { - if (!permanent.getSubtype().contains(t)) { - permanent.getSubtype().add(t); + if (token.getSubtype(game).size() > 0) { + for (String t : token.getSubtype(game)) { + if (!permanent.getSubtype(game).contains(t)) { + permanent.getSubtype(game).add(t); } } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java index 99399d7c278..23c90cd6866 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java @@ -121,10 +121,10 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements } } if ("".equals(type) || type == null && permanent.getCardType().contains(CardType.LAND)) { - permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); + permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); } - if (token.getSubtype().size() > 0) { - permanent.getSubtype().addAll(token.getSubtype()); + if (token.getSubtype(game).size() > 0) { + permanent.getSubtype(game).addAll(token.getSubtype(game)); } } break; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTargetEffect.java index 25181520e27..00475d4f93d 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTargetEffect.java @@ -88,13 +88,13 @@ public class BecomesCreatureTargetEffect extends ContinuousEffectImpl { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { if (loseAllAbilities) { - permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); - permanent.getSubtype().addAll(token.getSubtype()); + permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); + permanent.getSubtype(game).addAll(token.getSubtype(game)); } else { - if (token.getSubtype().size() > 0) { - for (String subtype : token.getSubtype()) { - if (!permanent.getSubtype().contains(subtype)) { - permanent.getSubtype().add(subtype); + if (token.getSubtype(game).size() > 0) { + for (String subtype : token.getSubtype(game)) { + if (!permanent.getSubtype(game).contains(subtype)) { + permanent.getSubtype(game).add(subtype); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTypeTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTypeTargetEffect.java index 7360ea3205e..4837e258e1f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTypeTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTypeTargetEffect.java @@ -72,12 +72,12 @@ public class BecomesCreatureTypeTargetEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (loseOther) { - permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); - permanent.getSubtype().addAll(subtypes); + permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); + permanent.getSubtype(game).addAll(subtypes); } else { for (String subtype : subtypes) { - if (!permanent.getSubtype().contains(subtype)) { - permanent.getSubtype().add(subtype); + if (!permanent.getSubtype(game).contains(subtype)) { + permanent.getSubtype(game).add(subtype); } } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureAllEffect.java index 5c151f364a4..ab16ec1f15a 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureAllEffect.java @@ -110,7 +110,7 @@ public class BecomesFaceDownCreatureAllEffect extends ContinuousEffectImpl imple permanent.getSupertype().clear(); permanent.getCardType().clear(); permanent.getCardType().add(CardType.CREATURE); - permanent.getSubtype().clear(); + permanent.getSubtype(game).clear(); permanent.getManaCost().clear(); break; case ColorChangingEffects_5: diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java index 4e80d92298b..0afee43a10f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesFaceDownCreatureEffect.java @@ -166,7 +166,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen permanent.getSupertype().clear(); permanent.getCardType().clear(); permanent.getCardType().add(CardType.CREATURE); - permanent.getSubtype().clear(); + permanent.getSubtype(game).clear(); break; case ColorChangingEffects_5: permanent.getColor(game).setColor(new ObjectColor()); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java index 5b126ac4b5a..e1967e797a8 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java @@ -75,12 +75,12 @@ public class BecomesSubtypeAllEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: if (loseOther) { - permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); - permanent.getSubtype().addAll(subtypes); + permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); + permanent.getSubtype(game).addAll(subtypes); } else { for (String subtype : subtypes) { - if (!permanent.getSubtype().contains(subtype)) { - permanent.getSubtype().add(subtype); + if (!permanent.getSubtype(game).contains(subtype)) { + permanent.getSubtype(game).add(subtype); } } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java index 57282f413e7..5fd13d97e02 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BoostAllOfChosenSubtypeEffect.java @@ -40,7 +40,7 @@ public class BoostAllOfChosenSubtypeEffect extends BoostAllEffect { @Override protected boolean selectedByRuntimeData(Permanent permanent, Ability source, Game game) { if (subtype != null) { - return permanent.hasSubtype(subtype); + return permanent.hasSubtype(subtype, game); } return false; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllOfChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllOfChosenSubtypeEffect.java index 66d8367dd7f..9d6030bfd30 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllOfChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAllOfChosenSubtypeEffect.java @@ -36,7 +36,7 @@ public class GainAbilityAllOfChosenSubtypeEffect extends GainAbilityAllEffect { @Override protected boolean selectedByRuntimeData(Permanent permanent, Ability source, Game game) { if (subtype != null) { - return permanent.hasSubtype(subtype); + return permanent.hasSubtype(subtype, game); } return false; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseAllCreatureTypesTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseAllCreatureTypesTargetEffect.java index 508b89b17f7..26181be4d3c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseAllCreatureTypesTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseAllCreatureTypesTargetEffect.java @@ -61,7 +61,7 @@ public class LoseAllCreatureTypesTargetEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (permanent != null) { - return permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); + return permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); } return false; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseCreatureTypeSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseCreatureTypeSourceEffect.java index 50bc86f6a93..533b2f8393c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseCreatureTypeSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/LoseCreatureTypeSourceEffect.java @@ -85,7 +85,7 @@ public class LoseCreatureTypeSourceEffect extends ContinuousEffectImpl implement case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { permanent.getCardType().remove(CardType.CREATURE); - permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); + permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); if (permanent.isAttacking() || permanent.getBlocking() > 0) { permanent.removeFromCombat(game); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/SetCardSubtypeAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/SetCardSubtypeAttachedEffect.java index 55d47b6a05b..f6636df1e23 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/SetCardSubtypeAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/SetCardSubtypeAttachedEffect.java @@ -74,8 +74,8 @@ public class SetCardSubtypeAttachedEffect extends ContinuousEffectImpl { if (equipment != null && equipment.getAttachedTo() != null) { Permanent target = game.getPermanent(equipment.getAttachedTo()); if (target != null) { - target.getSubtype().retainAll(CardRepository.instance.getLandTypes()); - target.getSubtype().addAll(setSubtypes); + target.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); + target.getSubtype(game).addAll(setSubtypes); } } return true; diff --git a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java index 77997477791..83731edbf58 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/cost/SpellsCostReductionAllOfChosenSubtypeEffect.java @@ -33,7 +33,7 @@ public class SpellsCostReductionAllOfChosenSubtypeEffect extends SpellsCostReduc protected boolean selectedByRuntimeData(Card card, Ability source, Game game) { String subtype = (String) game.getState().getValue(source.getSourceId() + "_type"); if (subtype != null) { - return card.hasSubtype(subtype); + return card.hasSubtype(subtype, game); } return false; } diff --git a/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java b/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java index cf985787910..c1ede4ef173 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java @@ -93,7 +93,7 @@ class AuraSwapEffect extends OneShotEffect { if (controller != null) { Permanent auraSourcePermanent = game.getPermanent(source.getSourceId()); if (auraSourcePermanent != null - && auraSourcePermanent.getSubtype().contains("Aura") + && auraSourcePermanent.getSubtype(game).contains("Aura") && auraSourcePermanent.getOwnerId().equals(source.getControllerId())) { Permanent enchantedPermanent = game.getPermanent(auraSourcePermanent.getAttachedTo()); filterCardToCheck.add(new AuraCardCanAttachToPermanentId(enchantedPermanent.getId())); diff --git a/Mage/src/main/java/mage/abilities/keyword/BestowAbility.java b/Mage/src/main/java/mage/abilities/keyword/BestowAbility.java index 16b440e2e6e..fffff63fb24 100644 --- a/Mage/src/main/java/mage/abilities/keyword/BestowAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/BestowAbility.java @@ -175,15 +175,15 @@ public class BestowAbility extends SpellAbility { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { if (permanent.getAttachedTo() == null) { - if (wasAttached && permanent.getSubtype().contains("Aura")) { - permanent.getSubtype().remove("Aura"); + if (wasAttached && permanent.getSubtype(game).contains("Aura")) { + permanent.getSubtype(game).remove("Aura"); wasAttached = false; } } else { permanent.getCardType().remove(CardType.CREATURE); - permanent.getSubtype().retainAll(CardRepository.instance.getLandTypes()); - if (!permanent.getSubtype().contains("Aura")) { - permanent.getSubtype().add("Aura"); + permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); + if (!permanent.getSubtype(game).contains("Aura")) { + permanent.getSubtype(game).add("Aura"); } wasAttached = true; } diff --git a/Mage/src/main/java/mage/abilities/keyword/EquipAbility.java b/Mage/src/main/java/mage/abilities/keyword/EquipAbility.java index 7e6ff39582f..256a493b772 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EquipAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EquipAbility.java @@ -59,7 +59,7 @@ public class EquipAbility extends ActivatedAbilityImpl { public boolean canActivate(UUID playerId, Game game) { if(super.canActivate(playerId, game)){ Permanent permanent = game.getPermanent(sourceId); - if(permanent != null && permanent.hasSubtype("Equipment")){ + if(permanent != null && permanent.hasSubtype("Equipment", game)){ return true; } } diff --git a/Mage/src/main/java/mage/abilities/keyword/FlyingAbility.java b/Mage/src/main/java/mage/abilities/keyword/FlyingAbility.java index 0cc5d45fac0..9b9422c20f8 100644 --- a/Mage/src/main/java/mage/abilities/keyword/FlyingAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/FlyingAbility.java @@ -90,7 +90,7 @@ class FlyingEffect extends RestrictionEffect implements MageSingleton { public boolean canBeBlocked(Permanent attacker, Permanent blocker, Ability source, Game game) { return blocker.getAbilities().containsKey(FlyingAbility.getInstance().getId()) || blocker.getAbilities().containsKey(ReachAbility.getInstance().getId()) - || (game.getContinuousEffects().asThough(blocker.getId(), AsThoughEffectType.BLOCK_DRAGON, source, blocker.getControllerId(), game) && attacker.hasSubtype("Dragon")) ; + || (game.getContinuousEffects().asThough(blocker.getId(), AsThoughEffectType.BLOCK_DRAGON, source, blocker.getControllerId(), game) && attacker.hasSubtype("Dragon", game)) ; } @Override diff --git a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java index c77fa4c893e..9369b1bb8a5 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java @@ -302,7 +302,7 @@ public class MorphAbility extends StaticAbility implements AlternativeSourceCost mageObject.setName(""); mageObject.getCardType().clear(); mageObject.getCardType().add(CardType.CREATURE); - mageObject.getSubtype().clear(); + mageObject.getSubtype(null).clear(); mageObject.getSupertype().clear(); mageObject.getManaCost().clear(); if (mageObject instanceof Permanent) { diff --git a/Mage/src/main/java/mage/abilities/keyword/ProwlAbility.java b/Mage/src/main/java/mage/abilities/keyword/ProwlAbility.java index 6b84f8b42e3..b61921457fc 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ProwlAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ProwlAbility.java @@ -123,7 +123,7 @@ public class ProwlAbility extends StaticAbility implements AlternativeSourceCost throw new IllegalArgumentException("Params can't be null"); } boolean canProwl = false; - for (String subtype : card.getSubtype()) { + for (String subtype : card.getSubtype(game)) { if (prowlWatcher.hasSubtypeMadeCombatDamage(ability.getControllerId(), subtype)) { canProwl = true; break; @@ -187,18 +187,8 @@ public class ProwlAbility extends StaticAbility implements AlternativeSourceCost } private void setReminderText(Card card) { - StringBuilder sb = new StringBuilder("(You may cast this for its prowl cost if you dealt combat damage to a player this turn with a "); - int i = 0; - for (String subtype : card.getSubtype()) { - i++; - sb.append(subtype); - if (card.getSubtype().size() > 1 && i < card.getSubtype().size()) { - sb.append(" or "); - } - } - sb.append(".)"); - - reminderText = sb.toString(); + reminderText = + "(You may cast this for its prowl cost if you dealt combat damage to a player this turn with a creature that shared a creature type with {this}"; } @Override diff --git a/Mage/src/main/java/mage/abilities/keyword/SpliceOntoArcaneAbility.java b/Mage/src/main/java/mage/abilities/keyword/SpliceOntoArcaneAbility.java index 2efde5b235a..e0d1475826b 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SpliceOntoArcaneAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SpliceOntoArcaneAbility.java @@ -182,7 +182,7 @@ class SpliceOntoArcaneEffect extends SpliceCardEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { MageObject object = game.getObject(abilityToModify.getSourceId()); - if (object != null && object.getSubtype().contains("Arcane")) { + if (object != null && object.getSubtype(game).contains("Arcane")) { return spliceSpellCanBeActivated(source, game); } return false; diff --git a/Mage/src/main/java/mage/abilities/keyword/TransformAbility.java b/Mage/src/main/java/mage/abilities/keyword/TransformAbility.java index 643623d4ef2..a46b8fe347a 100644 --- a/Mage/src/main/java/mage/abilities/keyword/TransformAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/TransformAbility.java @@ -79,9 +79,9 @@ public class TransformAbility extends SimpleStaticAbility { for (CardType type : sourceCard.getCardType()) { permanent.getCardType().add(type); } - permanent.getSubtype().clear(); - for (String type : sourceCard.getSubtype()) { - permanent.getSubtype().add(type); + permanent.getSubtype(game).clear(); + for (String type : sourceCard.getSubtype(game)) { + permanent.getSubtype(game).add(type); } permanent.getSupertype().clear(); for (String type : sourceCard.getSupertype()) { diff --git a/Mage/src/main/java/mage/cards/CardImpl.java b/Mage/src/main/java/mage/cards/CardImpl.java index 44e85568ca5..050e5d5ee02 100644 --- a/Mage/src/main/java/mage/cards/CardImpl.java +++ b/Mage/src/main/java/mage/cards/CardImpl.java @@ -762,6 +762,17 @@ public abstract class CardImpl extends MageObjectImpl implements Card { return cardAttribute.getColor(); } } - return super.getColor(game); //To change body of generated methods, choose Tools | Templates. + return super.getColor(game); + } + + @Override + public List getSubtype(Game game) { + if (game != null) { + CardAttribute cardAttribute = game.getState().getCardAttribute(getId()); + if (cardAttribute != null) { + return cardAttribute.getSubtype(); + } + } + return super.getSubtype(game); } } diff --git a/Mage/src/main/java/mage/cards/repository/CardInfo.java b/Mage/src/main/java/mage/cards/repository/CardInfo.java index 6b2e1576428..92b0a4e817e 100644 --- a/Mage/src/main/java/mage/cards/repository/CardInfo.java +++ b/Mage/src/main/java/mage/cards/repository/CardInfo.java @@ -139,7 +139,7 @@ public class CardInfo { this.white = card.getColor(null).isWhite(); this.setTypes(card.getCardType()); - this.setSubtypes(card.getSubtype()); + this.setSubtypes(card.getSubtype(null)); this.setSuperTypes(card.getSupertype()); this.setManaCosts(card.getManaCost().getSymbols()); diff --git a/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java b/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java index ca732ec3f98..3b8e30b0c95 100644 --- a/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/mageobject/ChosenSubtypePredicate.java @@ -47,7 +47,7 @@ public class ChosenSubtypePredicate implements Predicate { @Override public boolean apply(MageObject input, Game game) { String subtype = (String) game.getState().getValue(cardID + "_type"); - return input.hasSubtype(subtype); + return input.hasSubtype(subtype, game); } @Override diff --git a/Mage/src/main/java/mage/filter/predicate/mageobject/SubtypePredicate.java b/Mage/src/main/java/mage/filter/predicate/mageobject/SubtypePredicate.java index fc6fd26957b..0bf0755905c 100644 --- a/Mage/src/main/java/mage/filter/predicate/mageobject/SubtypePredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/mageobject/SubtypePredicate.java @@ -45,7 +45,7 @@ public class SubtypePredicate implements Predicate { @Override public boolean apply(MageObject input, Game game) { - return input.hasSubtype(subtype); + return input.hasSubtype(subtype, game); } @Override diff --git a/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java b/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java index 7522494175f..0456fdfc951 100644 --- a/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java @@ -66,7 +66,7 @@ public class CardTextPredicate implements Predicate { } } - for (String subType : input.getSubtype()) { + for (String subType : input.getSubtype(game)) { if (subType.equalsIgnoreCase(token)) { found = true; break; diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/EquippedPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/EquippedPredicate.java index 9e69dd0030c..a6c2abbee1c 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/EquippedPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/EquippedPredicate.java @@ -20,7 +20,7 @@ public class EquippedPredicate implements Predicate { public boolean apply(Permanent input, Game game) { for (UUID attachmentId : input.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype().contains("Equipment")) { + if (attachment != null && attachment.getSubtype(game).contains("Equipment")) { return true; } } diff --git a/Mage/src/main/java/mage/game/CardAttribute.java b/Mage/src/main/java/mage/game/CardAttribute.java index ec3b6fb9655..6ed2cd7326d 100644 --- a/Mage/src/main/java/mage/game/CardAttribute.java +++ b/Mage/src/main/java/mage/game/CardAttribute.java @@ -6,6 +6,8 @@ package mage.game; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; import mage.ObjectColor; import mage.cards.Card; @@ -17,13 +19,16 @@ import mage.cards.Card; public class CardAttribute implements Serializable { protected ObjectColor color; + protected List subtype; public CardAttribute(Card card) { color = card.getColor(null).copy(); + subtype = new ArrayList(card.getSubtype(null)); } public CardAttribute(CardAttribute cardAttribute) { this.color = cardAttribute.color; + this.subtype = cardAttribute.subtype; } public CardAttribute copy() { @@ -34,4 +39,8 @@ public class CardAttribute implements Serializable { return color; } + public List getSubtype() { + return subtype; + } + } diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 2617e3ff0ae..1a543b15f00 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -1848,9 +1848,9 @@ public abstract class GameImpl implements Game, Serializable { Permanent attachment = getPermanent(attachmentId); if (attachment != null && (attachment.getCardType().contains(CardType.CREATURE) - || !(attachment.getSubtype().contains("Aura") - || attachment.getSubtype().contains("Equipment") - || attachment.getSubtype().contains("Fortification")))) { + || !(attachment.getSubtype(this).contains("Aura") + || attachment.getSubtype(this).contains("Equipment") + || attachment.getSubtype(this).contains("Fortification")))) { if (perm.removeAttachment(attachment.getId(), this)) { somethingHappened = true; break; @@ -1875,7 +1875,7 @@ public abstract class GameImpl implements Game, Serializable { // This is called the "planeswalker uniqueness rule." if (planeswalkers.size() > 1) { //don't bother checking if less than 2 planeswalkers in play for (Permanent planeswalker : planeswalkers) { - for (String planeswalkertype : planeswalker.getSubtype()) { + for (String planeswalkertype : planeswalker.getSubtype(this)) { FilterPlaneswalkerPermanent filterPlaneswalker = new FilterPlaneswalkerPermanent(); filterPlaneswalker.add(new SubtypePredicate(planeswalkertype)); filterPlaneswalker.add(new ControllerIdPredicate(planeswalker.getControllerId())); diff --git a/Mage/src/main/java/mage/game/command/Commander.java b/Mage/src/main/java/mage/game/command/Commander.java index 0f6c5e3183b..ccfbe86e535 100644 --- a/Mage/src/main/java/mage/game/command/Commander.java +++ b/Mage/src/main/java/mage/game/command/Commander.java @@ -112,18 +112,18 @@ public class Commander implements CommandObject { } @Override - public List getSubtype() { - return card.getSubtype(); + public List getSubtype(Game game) { + return card.getSubtype(game); } @Override - public boolean hasSubtype(String subtype) { - return card.hasSubtype(subtype); + public boolean hasSubtype(String subtype, Game game) { + return card.hasSubtype(subtype, game); } @Override public List getSupertype() { - return card.getSubtype(); + return card.getSupertype(); } @Override diff --git a/Mage/src/main/java/mage/game/command/Emblem.java b/Mage/src/main/java/mage/game/command/Emblem.java index e7d3044495f..f4984fb8a9e 100644 --- a/Mage/src/main/java/mage/game/command/Emblem.java +++ b/Mage/src/main/java/mage/game/command/Emblem.java @@ -125,12 +125,12 @@ public class Emblem implements CommandObject { } @Override - public List getSubtype() { + public List getSubtype(Game game) { return emptyList; } @Override - public boolean hasSubtype(String subtype) { + public boolean hasSubtype(String subtype, Game game) { return false; } diff --git a/Mage/src/main/java/mage/game/permanent/PermanentCard.java b/Mage/src/main/java/mage/game/permanent/PermanentCard.java index 6fd8f345743..8323a19e762 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentCard.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentCard.java @@ -63,7 +63,7 @@ public class PermanentCard extends PermanentImpl { private void init(Card card, Game game) { power = card.getPower().copy(); toughness = card.getToughness().copy(); - copyFromCard(card); + copyFromCard(card, game); // if temporary added abilities to the spell/card exist, you need to add it to the permanent derived from that card Abilities otherAbilities = game.getState().getAllOtherAbilities(card.getId()); if (otherAbilities != null) { @@ -95,13 +95,13 @@ public class PermanentCard extends PermanentImpl { public void reset(Game game) { // when the permanent is reset, copy all original values from the card // must copy card each reset so that the original values don't get modified - copyFromCard(card); + copyFromCard(card, game); power.resetToBaseValue(); toughness.resetToBaseValue(); super.reset(game); } - protected void copyFromCard(final Card card) { + protected void copyFromCard(final Card card, final Game game) { this.name = card.getName(); this.abilities.clear(); if (this.faceDown) { @@ -123,7 +123,7 @@ public class PermanentCard extends PermanentImpl { this.maxLevelCounters = ((PermanentCard) card).maxLevelCounters; } this.subtype.clear(); - this.subtype.addAll(card.getSubtype()); + this.subtype.addAll(card.getSubtype(game)); this.supertype.clear(); this.supertype.addAll(card.getSupertype()); this.expansionSetCode = card.getExpansionSetCode(); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 72dd7ad03ca..08462ac5664 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -992,7 +992,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { @Override public boolean cantBeEnchantedBy(MageObject source, Game game) { for (ProtectionAbility ability : abilities.getProtectionAbilities()) { - if (!(source.getSubtype().contains("Aura") + if (!(source.getSubtype(game).contains("Aura") && !ability.removesAuras()) && !source.getId().equals(ability.getAuraIdNotToBeRemoved()) && !ability.canTarget(source, game)) { diff --git a/Mage/src/main/java/mage/game/permanent/PermanentToken.java b/Mage/src/main/java/mage/game/permanent/PermanentToken.java index 68c80536769..595da012e2c 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentToken.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentToken.java @@ -85,7 +85,7 @@ public class PermanentToken extends PermanentImpl { this.power.modifyBaseValue(token.getPower().getBaseValueModified()); this.toughness.modifyBaseValue(token.getToughness().getBaseValueModified()); this.supertype = token.getSupertype(); - this.subtype = token.getSubtype(); + this.subtype = token.getSubtype(game); this.tokenDescriptor = token.getTokenDescriptor(); } diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 03532152c90..fac945694d5 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -223,7 +223,7 @@ public class Spell extends StackObjImpl implements Card { } counter(null, game); return false; - } else if (this.getCardType().contains(CardType.ENCHANTMENT) && this.getSubtype().contains("Aura")) { + } else if (this.getCardType().contains(CardType.ENCHANTMENT) && this.getSubtype(game).contains("Aura")) { if (ability.getTargets().stillLegal(ability, game)) { updateOptionalCosts(0); boolean bestow = ability instanceof BestowAbility; @@ -231,7 +231,7 @@ public class Spell extends StackObjImpl implements Card { // Must be removed first time, after that will be removed by continous effect // Otherwise effects like evolve trigger from creature comes into play event card.getCardType().remove(CardType.CREATURE); - card.getSubtype().add("Aura"); + card.getSubtype(game).add("Aura"); } if (controller.moveCards(card, Zone.BATTLEFIELD, ability, game, false, faceDown, false, null)) { if (bestow) { @@ -241,7 +241,7 @@ public class Spell extends StackObjImpl implements Card { if (permanent != null && permanent instanceof PermanentCard) { permanent.setSpellAbility(ability); // otherwise spell ability without bestow will be set ((PermanentCard) permanent).getCard().getCardType().add(CardType.CREATURE); - ((PermanentCard) permanent).getCard().getSubtype().remove("Aura"); + ((PermanentCard) permanent).getCard().getSubtype(game).remove("Aura"); } } return ability.resolve(game); @@ -431,27 +431,27 @@ public class Spell extends StackObjImpl implements Card { } @Override - public List getSubtype() { + public List getSubtype(Game game) { if (this.getSpellAbility() instanceof BestowAbility) { List subtypes = new ArrayList<>(); - subtypes.addAll(card.getSubtype()); + subtypes.addAll(card.getSubtype(game)); subtypes.add("Aura"); return subtypes; } - return card.getSubtype(); + return card.getSubtype(game); } @Override - public boolean hasSubtype(String subtype) { + public boolean hasSubtype(String subtype, Game game) { if (this.getSpellAbility() instanceof BestowAbility) { // workaround for Bestow (don't like it) List subtypes = new ArrayList<>(); - subtypes.addAll(card.getSubtype()); + subtypes.addAll(card.getSubtype(game)); subtypes.add("Aura"); if (subtypes.contains(subtype)) { return true; } } - return card.hasSubtype(subtype); + return card.hasSubtype(subtype, game); } @Override diff --git a/Mage/src/main/java/mage/game/stack/StackAbility.java b/Mage/src/main/java/mage/game/stack/StackAbility.java index 46e0a94458e..33f836d8a49 100644 --- a/Mage/src/main/java/mage/game/stack/StackAbility.java +++ b/Mage/src/main/java/mage/game/stack/StackAbility.java @@ -162,12 +162,12 @@ public class StackAbility extends StackObjImpl implements Ability { } @Override - public List getSubtype() { + public List getSubtype(Game game) { return emptyString; } @Override - public boolean hasSubtype(String subtype) { + public boolean hasSubtype(String subtype, Game game) { return false; } diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index aa1f9751fa7..7c665b64cb5 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -118,7 +118,7 @@ public class CardUtil { * @param card2 * @return */ - public static boolean shareSubtypes(Card card1, Card card2) { + public static boolean shareSubtypes(Card card1, Card card2, Game game) { if (card1 == null || card2 == null) { throw new IllegalArgumentException("Params can't be null"); @@ -126,14 +126,14 @@ public class CardUtil { if (card1.getCardType().contains(CardType.CREATURE) && card2.getCardType().contains(CardType.CREATURE)) { if (card1.getAbilities().contains(ChangelingAbility.getInstance()) - || card1.getSubtype().contains(ChangelingAbility.ALL_CREATURE_TYPE) + || card1.getSubtype(game).contains(ChangelingAbility.ALL_CREATURE_TYPE) || card2.getAbilities().contains(ChangelingAbility.getInstance()) - || card2.getSubtype().contains(ChangelingAbility.ALL_CREATURE_TYPE)) { + || card2.getSubtype(game).contains(ChangelingAbility.ALL_CREATURE_TYPE)) { return true; } } - for (String subtype : card1.getSubtype()) { - if (card2.getSubtype().contains(subtype)) { + for (String subtype : card1.getSubtype(game)) { + if (card2.getSubtype(game).contains(subtype)) { return true; } } diff --git a/Mage/src/main/java/mage/util/functions/AddSubtypeApplier.java b/Mage/src/main/java/mage/util/functions/AddSubtypeApplier.java index 4c156910455..e0bacd05644 100644 --- a/Mage/src/main/java/mage/util/functions/AddSubtypeApplier.java +++ b/Mage/src/main/java/mage/util/functions/AddSubtypeApplier.java @@ -23,16 +23,16 @@ public class AddSubtypeApplier extends ApplyToPermanent { @Override public Boolean apply(Game game, Permanent permanent) { - if (!permanent.getSubtype().contains(subtype)) { - permanent.getSubtype().add(subtype); + if (!permanent.getSubtype(game).contains(subtype)) { + permanent.getSubtype(game).add(subtype); } return true; } @Override public Boolean apply(Game game, MageObject mageObject) { - if (!mageObject.getSubtype().contains(subtype)) { - mageObject.getSubtype().add(subtype); + if (!mageObject.getSubtype(game).contains(subtype)) { + mageObject.getSubtype(game).add(subtype); } return true; } diff --git a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java index f10e9bd2c4d..28be2fb7b9c 100644 --- a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java +++ b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java @@ -96,9 +96,9 @@ public class CopyTokenFunction implements Function { for (CardType type : sourceObj.getCardType()) { target.getCardType().add(type); } - target.getSubtype().clear(); - for (String type : sourceObj.getSubtype()) { - target.getSubtype().add(type); + target.getSubtype(null).clear(); + for (String type : sourceObj.getSubtype(null)) { + target.getSubtype(null).add(type); } target.getSupertype().clear(); for (String type : sourceObj.getSupertype()) { diff --git a/Mage/src/main/java/mage/watchers/common/ProwlWatcher.java b/Mage/src/main/java/mage/watchers/common/ProwlWatcher.java index b7f7f96c6ce..40469145d19 100644 --- a/Mage/src/main/java/mage/watchers/common/ProwlWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/ProwlWatcher.java @@ -77,14 +77,14 @@ public class ProwlWatcher extends Watcher { if (dEvent.isCombatDamage()) { Permanent creature = game.getPermanent(dEvent.getSourceId()); if (creature != null && !allSubtypes.contains(creature.getControllerId())) { - if (creature.getAbilities().containsKey(ChangelingAbility.getInstance().getId()) || creature.getSubtype().contains(ChangelingAbility.ALL_CREATURE_TYPE)) { + if (creature.getAbilities().containsKey(ChangelingAbility.getInstance().getId()) || creature.getSubtype(game).contains(ChangelingAbility.ALL_CREATURE_TYPE)) { allSubtypes.add(creature.getControllerId()); } else { Set subtypes = damagingSubtypes.get(creature.getControllerId()); if (subtypes == null) { subtypes = new LinkedHashSet<>(); } - subtypes.addAll(creature.getSubtype()); + subtypes.addAll(creature.getSubtype(game)); damagingSubtypes.put(creature.getControllerId(), subtypes); } }