mirror of
https://github.com/magefree/mage.git
synced 2025-12-25 21:12:04 -08:00
- Fixed BecomesCreatureAttachedEffect(). Rule 611.2c. Fixes https://github.com/magefree/mage/issues/3011
This commit is contained in:
parent
8da4f72f8d
commit
ff489446fe
1 changed files with 94 additions and 71 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue