Fix Navigator's Compass not working while casting spells

This commit is contained in:
Alex W. Jackson 2022-02-20 13:24:57 -05:00
parent 8243c19fdf
commit dd8d86ba95
6 changed files with 49 additions and 85 deletions

View file

@ -4,12 +4,9 @@ import mage.abilities.Ability;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.decorator.ConditionalOneShotEffect; 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.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.mana.BlueManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
@ -19,10 +16,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetLandPermanent; import mage.target.common.TargetLandPermanent;
import java.util.List;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
/** /**
* @author ilcartographer * @author ilcartographer
@ -60,10 +54,10 @@ public final class AquitectsWill extends CardImpl {
} }
} }
class AquitectsWillEffect extends ContinuousEffectImpl { class AquitectsWillEffect extends BecomesBasicLandTargetEffect {
AquitectsWillEffect() { 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"; 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 @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent land = game.getPermanent(this.targetPointer.getFirst(game, source)); Permanent land = game.getPermanent(this.targetPointer.getFirst(game, source));
if (land == null if (land == null || land.getCounters(game).getCount(CounterType.FLOOD) < 1) {
|| land.getCounters(game).getCount(CounterType.FLOOD) < 1) {
discard(); discard();
return false; return false;
} }
// The land is an island intrinsically so the ability is added at layer 4, not layer 6 return super.apply(game, source);
land.addSubType(game, SubType.ISLAND);
if (!land.getAbilities(game).containsClass(BlueManaAbility.class)) {
land.addAbility(new BlueManaAbility(), source.getSourceId(), game);
}
return true;
}
@Override
public Set<UUID> isDependentTo(List<ContinuousEffect> allEffectsInLayer) {
return allEffectsInLayer
.stream()
.filter(effect -> effect.getDependencyTypes().contains(DependencyType.BecomeIsland))
.map(Effect::getId)
.collect(Collectors.toSet());
} }
} }

View file

@ -96,7 +96,7 @@ class QuicksilverFountainEffect extends OneShotEffect {
Permanent landChosen = game.getPermanent(source.getFirstTarget()); Permanent landChosen = game.getPermanent(source.getFirstTarget());
landChosen.addCounters(CounterType.FLOOD.createInstance(), player.getId(), source, game); landChosen.addCounters(CounterType.FLOOD.createInstance(), player.getId(), source, game);
ContinuousEffect becomesBasicLandTargetEffect ContinuousEffect becomesBasicLandTargetEffect
= new BecomesBasicLandTargetEffect(Duration.Custom, false, SubType.ISLAND); = new BecomesBasicLandTargetEffect(Duration.Custom, SubType.ISLAND);
ConditionalContinuousEffect effect ConditionalContinuousEffect effect
= new ConditionalContinuousEffect(becomesBasicLandTargetEffect, = new ConditionalContinuousEffect(becomesBasicLandTargetEffect,
new LandHasFloodCounterCondition(), staticText); new LandHasFloodCounterCondition(), staticText);

View file

@ -5,7 +5,7 @@ import mage.abilities.Ability;
import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent; 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.abilities.keyword.MonstrosityAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; 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. // When Sealock Monster becomes monstrous, target land becomes an island in addition to its other types.
Ability ability = new BecomesMonstrousSourceTriggeredAbility( Ability ability = new BecomesMonstrousSourceTriggeredAbility(
new AddCardSubTypeTargetEffect(SubType.ISLAND, Duration.Custom) new BecomesBasicLandTargetEffect(Duration.EndOfGame, false, false, SubType.ISLAND)
); );
ability.addTarget(new TargetLandPermanent()); ability.addTarget(new TargetLandPermanent());
this.addAbility(ability); this.addAbility(ability);

View file

@ -52,7 +52,7 @@ public final class TundraKavu extends CardImpl {
class TundraKavuEffect extends BecomesBasicLandTargetEffect { class TundraKavuEffect extends BecomesBasicLandTargetEffect {
public TundraKavuEffect() { public TundraKavuEffect() {
super(Duration.EndOfTurn, false, true); super(Duration.EndOfTurn);
staticText = "Target land becomes a Plains or an Island until end of turn."; staticText = "Target land becomes a Plains or an Island until end of turn.";
} }

View file

@ -6,10 +6,12 @@ import mage.abilities.mana.*;
import mage.constants.*; import mage.constants.*;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.util.CardUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl {
@ -18,7 +20,11 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl {
public BecomesBasicLandEnchantedEffect(SubType... landNames) { public BecomesBasicLandEnchantedEffect(SubType... landNames) {
super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Detriment); super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Detriment);
landTypes.addAll(Arrays.asList(landNames)); 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) { public BecomesBasicLandEnchantedEffect(final BecomesBasicLandEnchantedEffect effect) {
@ -76,21 +82,4 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl {
} }
return true; 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();
}
} }

View file

@ -1,5 +1,6 @@
package mage.abilities.effects.common.continuous; package mage.abilities.effects.common.continuous;
import mage.abilities.Abilities;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.mana.*; import mage.abilities.mana.*;
@ -9,11 +10,13 @@ import mage.constants.*;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.util.CardUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
/** /**
* http://mtgsalvation.gamepedia.com/Land_changers * http://mtgsalvation.gamepedia.com/Land_changers
@ -24,7 +27,6 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl {
protected boolean chooseLandType; protected boolean chooseLandType;
protected List<SubType> landTypes = new ArrayList<>(); protected List<SubType> landTypes = new ArrayList<>();
private final List<SubType> landTypesToAdd = new ArrayList<>();
private final boolean loseOther; // loses all other abilities, card types, and creature types private final boolean loseOther; // loses all other abilities, card types, and creature types
public BecomesBasicLandTargetEffect(Duration duration) { public BecomesBasicLandTargetEffect(Duration duration) {
@ -58,15 +60,13 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl {
dependencyTypes.add(DependencyType.BecomePlains); dependencyTypes.add(DependencyType.BecomePlains);
} }
this.chooseLandType = chooseLandType; this.chooseLandType = chooseLandType;
this.staticText = setText();
this.loseOther = loseOther; this.loseOther = loseOther;
this.staticText = setText();
} }
public BecomesBasicLandTargetEffect(final BecomesBasicLandTargetEffect effect) { public BecomesBasicLandTargetEffect(final BecomesBasicLandTargetEffect effect) {
super(effect); super(effect);
this.landTypes.addAll(effect.landTypes); this.landTypes.addAll(effect.landTypes);
this.landTypesToAdd.addAll(effect.landTypesToAdd);
this.chooseLandType = effect.chooseLandType; this.chooseLandType = effect.chooseLandType;
this.loseOther = effect.loseOther; this.loseOther = effect.loseOther;
} }
@ -90,9 +90,6 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl {
return; return;
} }
} }
if (loseOther) {
landTypesToAdd.addAll(landTypes);
}
} }
@Override @Override
@ -112,33 +109,37 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl {
land.removeAllAbilities(source.getSourceId(), game); land.removeAllAbilities(source.getSourceId(), game);
// 305.7 // 305.7
land.removeAllSubTypes(game, SubTypeSet.NonBasicLandType); 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 // add intrinsic land abilities here not in layer 6
for (SubType landType : landTypesToAdd) { Abilities<Ability> landAbilities = land.getAbilities(game);
for (SubType landType : landTypes) {
switch (landType) { switch (landType) {
case PLAINS: case PLAINS:
land.addAbility(new WhiteManaAbility(), source.getSourceId(), game); if (!landAbilities.containsClass(WhiteManaAbility.class)) {
land.addAbility(new WhiteManaAbility(), source.getSourceId(), game);
}
break; break;
case ISLAND: case ISLAND:
land.addAbility(new BlueManaAbility(), source.getSourceId(), game); if (!landAbilities.containsClass(BlueManaAbility.class)) {
land.addAbility(new BlueManaAbility(), source.getSourceId(), game);
}
break; break;
case SWAMP: case SWAMP:
land.addAbility(new BlackManaAbility(), source.getSourceId(), game); if (!landAbilities.containsClass(BlackManaAbility.class)) {
land.addAbility(new BlackManaAbility(), source.getSourceId(), game);
}
break; break;
case MOUNTAIN: case MOUNTAIN:
land.addAbility(new RedManaAbility(), source.getSourceId(), game); if (!landAbilities.containsClass(RedManaAbility.class)) {
land.addAbility(new RedManaAbility(), source.getSourceId(), game);
}
break; break;
case FOREST: case FOREST:
land.addAbility(new GreenManaAbility(), source.getSourceId(), game); if (!landAbilities.containsClass(GreenManaAbility.class)) {
land.addAbility(new GreenManaAbility(), source.getSourceId(), game);
}
break; break;
} }
} }
@ -147,23 +148,18 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl {
} }
private String setText() { private String setText() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder("target land becomes ");
if (chooseLandType) { if (chooseLandType) {
sb.append("Target land becomes the basic land type of your choice"); sb.append("the basic land type of your choice");
} else { } else {
sb.append("Target land becomes a "); sb.append(CardUtil.addArticle(CardUtil.concatWithAnd(landTypes
int i = 1; .stream()
for (SubType landType : landTypes) { .map(SubType::getDescription)
if (i > 1) { .collect(Collectors.toList())
if (i == landTypes.size()) { )));
sb.append(" and "); }
} else { if (!loseOther) {
sb.append(", "); sb.append(" in addition to its other types");
}
}
i++;
sb.append(landType);
}
} }
if (!duration.toString().isEmpty() && duration != Duration.EndOfGame) { if (!duration.toString().isEmpty() && duration != Duration.EndOfGame) {
sb.append(' ').append(duration.toString()); sb.append(' ').append(duration.toString());