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 5386d56ed51..b28fa87f45f 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 @@ -27,6 +27,7 @@ */ package mage.abilities.effects.common.continuous; +import mage.MageObjectReference; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffectImpl; import mage.cards.repository.CardRepository; @@ -40,7 +41,7 @@ import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; /** - * @author jeff + * @author jeffwadsworth */ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { @@ -76,86 +77,105 @@ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { return new BecomesCreatureAttachedEffect(this); } + @Override + public void init(Ability source, Game game) { + super.init(source, game); + Permanent attachedPermanent = game.getPermanent(source.getSourceId()); + if (attachedPermanent != null) { + Permanent permanentAttachedTo = game.getPermanent(attachedPermanent.getAttachedTo()); + if (permanentAttachedTo != null) { + affectedObjectList.add(new MageObjectReference(permanentAttachedTo, game)); + } + } + } + @Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + boolean attachedExists = false; Permanent enchantment = game.getPermanent(source.getSourceId()); if (enchantment != null) { - Permanent permanent = game.getPermanent(enchantment.getAttachedTo()); - if (permanent != null) { - switch (layer) { - case TypeChangingEffects_4: - if (sublayer == SubLayer.NA) { - for (String t : token.getSupertype()) { - if (!permanent.getSupertype().contains(t)) { - permanent.getSupertype().add(t); + for (MageObjectReference mageObjectReference : affectedObjectList) { + Permanent permanentAttachedTo = mageObjectReference.getPermanent(game); + if (permanentAttachedTo != null) { + attachedExists = true; + switch (layer) { + case TypeChangingEffects_4: + if (sublayer == SubLayer.NA) { + for (String superType : token.getSupertype()) { + if (!permanentAttachedTo.getSupertype().contains(superType)) { + permanentAttachedTo.getSupertype().add(superType); + } } - } - // card type - switch (loseType) { - case ALL: - case ALL_BUT_COLOR: - permanent.getCardType().clear(); - break; - } - for (CardType t : token.getCardType()) { - permanent.getCardType().add(t); - } - - // sub type - switch (loseType) { - case ALL: - case ALL_BUT_COLOR: - case ABILITIES_SUBTYPE_AND_PT: - permanent.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); - break; - } - for (String t : token.getSubtype(game)) { - if (!permanent.getSubtype(game).contains(t)) { - permanent.getSubtype(game).add(t); + // card type + switch (loseType) { + case ALL: + case ALL_BUT_COLOR: + permanentAttachedTo.getCardType().clear(); + break; + } + for (CardType cardType : token.getCardType()) { + permanentAttachedTo.getCardType().add(cardType); } - } - } - break; - case ColorChangingEffects_5: - if (sublayer == SubLayer.NA) { - if (loseType == LoseType.ALL) { - permanent.getColor(game).setBlack(false); - permanent.getColor(game).setGreen(false); - permanent.getColor(game).setBlue(false); - permanent.getColor(game).setWhite(false); - permanent.getColor(game).setRed(false); - } - if (token.getColor(game).hasColor()) { - permanent.getColor(game).setColor(token.getColor(game)); - } - } - break; - case AbilityAddingRemovingEffects_6: - if (sublayer == SubLayer.NA) { - switch (loseType) { - case ALL: - case ALL_BUT_COLOR: - case ABILITIES: - case ABILITIES_SUBTYPE_AND_PT: - permanent.removeAllAbilities(source.getSourceId(), game); - break; - } - for (Ability ability : token.getAbilities()) { - permanent.addAbility(ability, source.getSourceId(), game); - } + // sub type + switch (loseType) { + case ALL: + case ALL_BUT_COLOR: + case ABILITIES_SUBTYPE_AND_PT: + permanentAttachedTo.getSubtype(game).retainAll(CardRepository.instance.getLandTypes()); + break; + } + for (String subType : token.getSubtype(game)) { + if (!permanentAttachedTo.getSubtype(game).contains(subType)) { + permanentAttachedTo.getSubtype(game).add(subType); + } + } - } - break; - case PTChangingEffects_7: - if (sublayer == SubLayer.SetPT_7b) { - permanent.getPower().setValue(token.getPower().getValue()); - permanent.getToughness().setValue(token.getToughness().getValue()); + } break; - } + case ColorChangingEffects_5: + if (sublayer == SubLayer.NA) { + if (loseType == LoseType.ALL) { + permanentAttachedTo.getColor(game).setBlack(false); + permanentAttachedTo.getColor(game).setGreen(false); + permanentAttachedTo.getColor(game).setBlue(false); + permanentAttachedTo.getColor(game).setWhite(false); + permanentAttachedTo.getColor(game).setRed(false); + } + if (token.getColor(game).hasColor()) { + permanentAttachedTo.getColor(game).setColor(token.getColor(game)); + } + } + break; + case AbilityAddingRemovingEffects_6: + if (sublayer == SubLayer.NA) { + switch (loseType) { + case ALL: + case ALL_BUT_COLOR: + case ABILITIES: + case ABILITIES_SUBTYPE_AND_PT: + permanentAttachedTo.removeAllAbilities(source.getSourceId(), game); + break; + } + for (Ability ability : token.getAbilities()) { + permanentAttachedTo.addAbility(ability, source.getSourceId(), game); + } + + } + break; + case PTChangingEffects_7: + if (sublayer == SubLayer.SetPT_7b) { + permanentAttachedTo.getPower().setValue(token.getPower().getValue()); + permanentAttachedTo.getToughness().setValue(token.getToughness().getValue()); + break; + } + } } + if (!attachedExists) { + discard(); + } + return true; } - return true; } return false; } @@ -167,7 +187,10 @@ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { @Override public boolean hasLayer(Layer layer) { - return layer == Layer.PTChangingEffects_7 || layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.ColorChangingEffects_5 || layer == Layer.TypeChangingEffects_4; + return layer == Layer.PTChangingEffects_7 + || layer == Layer.AbilityAddingRemovingEffects_6 + || layer == Layer.ColorChangingEffects_5 + || layer == Layer.TypeChangingEffects_4; } }