diff --git a/Mage.Sets/src/mage/cards/a/AquitectsWill.java b/Mage.Sets/src/mage/cards/a/AquitectsWill.java index 2076f905aba..c1f9df1e485 100644 --- a/Mage.Sets/src/mage/cards/a/AquitectsWill.java +++ b/Mage.Sets/src/mage/cards/a/AquitectsWill.java @@ -4,12 +4,9 @@ import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; -import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -19,10 +16,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetLandPermanent; -import java.util.List; -import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; /** * @author ilcartographer @@ -60,10 +54,10 @@ public final class AquitectsWill extends CardImpl { } } -class AquitectsWillEffect extends ContinuousEffectImpl { +class AquitectsWillEffect extends BecomesBasicLandTargetEffect { AquitectsWillEffect() { - super(Duration.EndOfGame, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); + super(Duration.Custom, false, false, SubType.ISLAND); staticText = "That land is an Island in addition to its other types for as long as it has a flood counter on it"; } @@ -79,25 +73,10 @@ class AquitectsWillEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { Permanent land = game.getPermanent(this.targetPointer.getFirst(game, source)); - if (land == null - || land.getCounters(game).getCount(CounterType.FLOOD) < 1) { + if (land == null || land.getCounters(game).getCount(CounterType.FLOOD) < 1) { discard(); return false; } - // The land is an island intrinsically so the ability is added at layer 4, not layer 6 - land.addSubType(game, SubType.ISLAND); - if (!land.getAbilities(game).containsClass(BlueManaAbility.class)) { - land.addAbility(new BlueManaAbility(), source.getSourceId(), game); - } - return true; - } - - @Override - public Set isDependentTo(List allEffectsInLayer) { - return allEffectsInLayer - .stream() - .filter(effect -> effect.getDependencyTypes().contains(DependencyType.BecomeIsland)) - .map(Effect::getId) - .collect(Collectors.toSet()); + return super.apply(game, source); } } diff --git a/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java b/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java index cfd1f6faa2e..ded892c4d58 100644 --- a/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java +++ b/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java @@ -96,7 +96,7 @@ class QuicksilverFountainEffect extends OneShotEffect { Permanent landChosen = game.getPermanent(source.getFirstTarget()); landChosen.addCounters(CounterType.FLOOD.createInstance(), player.getId(), source, game); ContinuousEffect becomesBasicLandTargetEffect - = new BecomesBasicLandTargetEffect(Duration.Custom, false, SubType.ISLAND); + = new BecomesBasicLandTargetEffect(Duration.Custom, SubType.ISLAND); ConditionalContinuousEffect effect = new ConditionalContinuousEffect(becomesBasicLandTargetEffect, new LandHasFloodCounterCondition(), staticText); diff --git a/Mage.Sets/src/mage/cards/s/SealockMonster.java b/Mage.Sets/src/mage/cards/s/SealockMonster.java index 872089234e6..448b3d7e90c 100644 --- a/Mage.Sets/src/mage/cards/s/SealockMonster.java +++ b/Mage.Sets/src/mage/cards/s/SealockMonster.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; -import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect; +import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; import mage.abilities.keyword.MonstrosityAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -40,7 +40,7 @@ public final class SealockMonster extends CardImpl { // When Sealock Monster becomes monstrous, target land becomes an island in addition to its other types. Ability ability = new BecomesMonstrousSourceTriggeredAbility( - new AddCardSubTypeTargetEffect(SubType.ISLAND, Duration.Custom) + new BecomesBasicLandTargetEffect(Duration.EndOfGame, false, false, SubType.ISLAND) ); ability.addTarget(new TargetLandPermanent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TundraKavu.java b/Mage.Sets/src/mage/cards/t/TundraKavu.java index f04ff13ab7d..e8cb2e1bc25 100644 --- a/Mage.Sets/src/mage/cards/t/TundraKavu.java +++ b/Mage.Sets/src/mage/cards/t/TundraKavu.java @@ -52,7 +52,7 @@ public final class TundraKavu extends CardImpl { class TundraKavuEffect extends BecomesBasicLandTargetEffect { public TundraKavuEffect() { - super(Duration.EndOfTurn, false, true); + super(Duration.EndOfTurn); staticText = "Target land becomes a Plains or an Island until end of turn."; } 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 d73b816f046..33d5cddc00e 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 @@ -6,10 +6,12 @@ import mage.abilities.mana.*; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.util.CardUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { @@ -18,7 +20,11 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { public BecomesBasicLandEnchantedEffect(SubType... landNames) { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Detriment); landTypes.addAll(Arrays.asList(landNames)); - this.staticText = setText(); + this.staticText = "enchanted land is " + CardUtil.addArticle(CardUtil.concatWithAnd(landTypes + .stream() + .map(SubType::getDescription) + .collect(Collectors.toList()) + )); } public BecomesBasicLandEnchantedEffect(final BecomesBasicLandEnchantedEffect effect) { @@ -76,21 +82,4 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { } return true; } - - private String setText() { - StringBuilder sb = new StringBuilder("Enchanted land is a "); - int i = 1; - for (SubType landType : landTypes) { - if (i > 1) { - if (i == landTypes.size()) { - sb.append(" and "); - } else { - sb.append(", "); - } - } - i++; - sb.append(landType); - } - return sb.toString(); - } } 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 2c4adcb1d6e..a571909ee99 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 @@ -1,5 +1,6 @@ package mage.abilities.effects.common.continuous; +import mage.abilities.Abilities; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.mana.*; @@ -9,11 +10,13 @@ import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; /** * http://mtgsalvation.gamepedia.com/Land_changers @@ -24,7 +27,6 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { protected boolean chooseLandType; protected List landTypes = new ArrayList<>(); - private final List landTypesToAdd = new ArrayList<>(); private final boolean loseOther; // loses all other abilities, card types, and creature types public BecomesBasicLandTargetEffect(Duration duration) { @@ -58,15 +60,13 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { dependencyTypes.add(DependencyType.BecomePlains); } this.chooseLandType = chooseLandType; - this.staticText = setText(); this.loseOther = loseOther; - + this.staticText = setText(); } public BecomesBasicLandTargetEffect(final BecomesBasicLandTargetEffect effect) { super(effect); this.landTypes.addAll(effect.landTypes); - this.landTypesToAdd.addAll(effect.landTypesToAdd); this.chooseLandType = effect.chooseLandType; this.loseOther = effect.loseOther; } @@ -90,9 +90,6 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { return; } } - if (loseOther) { - landTypesToAdd.addAll(landTypes); - } } @Override @@ -112,33 +109,37 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { land.removeAllAbilities(source.getSourceId(), game); // 305.7 land.removeAllSubTypes(game, SubTypeSet.NonBasicLandType); - land.addSubType(game, landTypes); - } else { - landTypesToAdd.clear(); - for (SubType subtype : landTypes) { - if (!land.hasSubtype(subtype, game)) { - land.addSubType(game, subtype); - landTypesToAdd.add(subtype); - } - } } + land.addSubType(game, landTypes); + // add intrinsic land abilities here not in layer 6 - for (SubType landType : landTypesToAdd) { + Abilities landAbilities = land.getAbilities(game); + for (SubType landType : landTypes) { switch (landType) { case PLAINS: - land.addAbility(new WhiteManaAbility(), source.getSourceId(), game); + if (!landAbilities.containsClass(WhiteManaAbility.class)) { + land.addAbility(new WhiteManaAbility(), source.getSourceId(), game); + } break; case ISLAND: - land.addAbility(new BlueManaAbility(), source.getSourceId(), game); + if (!landAbilities.containsClass(BlueManaAbility.class)) { + land.addAbility(new BlueManaAbility(), source.getSourceId(), game); + } break; case SWAMP: - land.addAbility(new BlackManaAbility(), source.getSourceId(), game); + if (!landAbilities.containsClass(BlackManaAbility.class)) { + land.addAbility(new BlackManaAbility(), source.getSourceId(), game); + } break; case MOUNTAIN: - land.addAbility(new RedManaAbility(), source.getSourceId(), game); + if (!landAbilities.containsClass(RedManaAbility.class)) { + land.addAbility(new RedManaAbility(), source.getSourceId(), game); + } break; case FOREST: - land.addAbility(new GreenManaAbility(), source.getSourceId(), game); + if (!landAbilities.containsClass(GreenManaAbility.class)) { + land.addAbility(new GreenManaAbility(), source.getSourceId(), game); + } break; } } @@ -147,23 +148,18 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { } private String setText() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder("target land becomes "); if (chooseLandType) { - sb.append("Target land becomes the basic land type of your choice"); + sb.append("the basic land type of your choice"); } else { - sb.append("Target land becomes a "); - int i = 1; - for (SubType landType : landTypes) { - if (i > 1) { - if (i == landTypes.size()) { - sb.append(" and "); - } else { - sb.append(", "); - } - } - i++; - sb.append(landType); - } + sb.append(CardUtil.addArticle(CardUtil.concatWithAnd(landTypes + .stream() + .map(SubType::getDescription) + .collect(Collectors.toList()) + ))); + } + if (!loseOther) { + sb.append(" in addition to its other types"); } if (!duration.toString().isEmpty() && duration != Duration.EndOfGame) { sb.append(' ').append(duration.toString());