instantSorceryCount = new HashMap<>();
public ArclightPhoenixWatcher() {
super(ArclightPhoenixWatcher.class.getSimpleName(), WatcherScope.GAME);
diff --git a/Mage.Sets/src/mage/cards/a/ArgothianEnchantress.java b/Mage.Sets/src/mage/cards/a/ArgothianEnchantress.java
index 27cd7898b10..f6e8dd769a1 100644
--- a/Mage.Sets/src/mage/cards/a/ArgothianEnchantress.java
+++ b/Mage.Sets/src/mage/cards/a/ArgothianEnchantress.java
@@ -1,7 +1,5 @@
-
package mage.cards.a;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
@@ -13,8 +11,9 @@ import mage.constants.SubType;
import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.CardTypePredicate;
+import java.util.UUID;
+
/**
- *
* @author Backfir3
*/
public final class ArgothianEnchantress extends CardImpl {
@@ -26,16 +25,18 @@ public final class ArgothianEnchantress extends CardImpl {
}
public ArgothianEnchantress(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.DRUID);
this.power = new MageInt(0);
this.toughness = new MageInt(1);
+ // Shroud
this.addAbility(ShroudAbility.getInstance());
+
// Whenever you cast an Enchantment spell, you draw a card.
- this.addAbility(new SpellCastControllerTriggeredAbility(new DrawCardSourceControllerEffect(1), filter, false));
+ this.addAbility(new SpellCastControllerTriggeredAbility(new DrawCardSourceControllerEffect(1, "you"), filter, false));
}
public ArgothianEnchantress(final ArgothianEnchantress card) {
diff --git a/Mage.Sets/src/mage/cards/a/ArrestersAdmonition.java b/Mage.Sets/src/mage/cards/a/ArrestersAdmonition.java
new file mode 100644
index 00000000000..27656402f5c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/a/ArrestersAdmonition.java
@@ -0,0 +1,41 @@
+package mage.cards.a;
+
+import mage.abilities.condition.common.AddendumCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ArrestersAdmonition extends CardImpl {
+
+ public ArrestersAdmonition(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}");
+
+ // Return target creature to its owner's hand.
+ this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Addendum — If you cast this spell during your main phase, draw a card.
+ this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
+ new DrawCardSourceControllerEffect(1), AddendumCondition.instance,
+ "
Addendum — If you cast this spell during your main phase, draw a card."
+ ));
+ }
+
+ private ArrestersAdmonition(final ArrestersAdmonition card) {
+ super(card);
+ }
+
+ @Override
+ public ArrestersAdmonition copy() {
+ return new ArrestersAdmonition(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/a/ArrestersZeal.java b/Mage.Sets/src/mage/cards/a/ArrestersZeal.java
new file mode 100644
index 00000000000..9d488e442a4
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/a/ArrestersZeal.java
@@ -0,0 +1,70 @@
+package mage.cards.a;
+
+import mage.abilities.Ability;
+import mage.abilities.condition.common.AddendumCondition;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class ArrestersZeal extends CardImpl {
+
+ public ArrestersZeal(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}");
+
+
+ // Target creature gets +2/+2 until end of turn.
+ this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Addendum — If you cast this spell during your main phase, that creature gains flying until end of turn.
+ this.getSpellAbility().addEffect(new ArrestersZealEffect());
+ }
+
+ public ArrestersZeal(final ArrestersZeal card) {
+ super(card);
+ }
+
+ @Override
+ public ArrestersZeal copy() {
+ return new ArrestersZeal(this);
+ }
+}
+
+class ArrestersZealEffect extends OneShotEffect {
+
+ ArrestersZealEffect() {
+ super(Outcome.Benefit);
+ staticText = "
Addendum — If you cast this spell during your main phase, that creature gains flying until end of turn.";
+ }
+
+ private ArrestersZealEffect(final ArrestersZealEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ArrestersZealEffect copy() {
+ return new ArrestersZealEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ if (!AddendumCondition.instance.apply(game, source)) {
+ return false;
+ }
+ game.addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn), source);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/a/ArtifactMutation.java b/Mage.Sets/src/mage/cards/a/ArtifactMutation.java
index 2aaa2ef0272..43c0240f8e0 100644
--- a/Mage.Sets/src/mage/cards/a/ArtifactMutation.java
+++ b/Mage.Sets/src/mage/cards/a/ArtifactMutation.java
@@ -25,7 +25,7 @@ public final class ArtifactMutation extends CardImpl {
this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
// create X 1/1 green Saproling creature tokens, where X is that artifact's converted mana cost.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), new TargetConvertedManaCost()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), TargetConvertedManaCost.instance));
}
public ArtifactMutation(final ArtifactMutation card) {
diff --git a/Mage.Sets/src/mage/cards/a/ArtificersAssistant.java b/Mage.Sets/src/mage/cards/a/ArtificersAssistant.java
index d8c5d76f4fa..2a610e18b0e 100644
--- a/Mage.Sets/src/mage/cards/a/ArtificersAssistant.java
+++ b/Mage.Sets/src/mage/cards/a/ArtificersAssistant.java
@@ -22,7 +22,7 @@ public final class ArtificersAssistant extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a historic spell");
static {
- filter.add(new HistoricPredicate());
+ filter.add(HistoricPredicate.instance);
}
public ArtificersAssistant(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java b/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java
index 86ad83f7f44..b260e580119 100644
--- a/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java
+++ b/Mage.Sets/src/mage/cards/a/AryelKnightOfWindgrace.java
@@ -80,7 +80,7 @@ class AryelTapXTargetCost extends VariableCostImpl {
static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Knights you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.KNIGHT));
}
diff --git a/Mage.Sets/src/mage/cards/a/AsForetold.java b/Mage.Sets/src/mage/cards/a/AsForetold.java
index f27e6900ebe..01dc7cb5670 100644
--- a/Mage.Sets/src/mage/cards/a/AsForetold.java
+++ b/Mage.Sets/src/mage/cards/a/AsForetold.java
@@ -91,17 +91,17 @@ class SpellWithManaCostLessThanOrEqualToCondition implements Condition {
class AsForetoldAlternativeCost extends AlternativeCostSourceAbility {
private UUID sourceAsForetold;
- boolean activated;
+ private boolean wasActivated;
AsForetoldAlternativeCost(UUID sourceAsForetold, int timeCounters) {
super(new ManaCostsImpl("{0}"), new SpellWithManaCostLessThanOrEqualToCondition(timeCounters));
this.sourceAsForetold = sourceAsForetold;
}
- AsForetoldAlternativeCost(final AsForetoldAlternativeCost ability) {
+ private AsForetoldAlternativeCost(final AsForetoldAlternativeCost ability) {
super(ability);
this.sourceAsForetold = ability.sourceAsForetold;
- this.activated = ability.activated;
+ this.wasActivated = ability.wasActivated;
}
@Override
@@ -116,19 +116,18 @@ class AsForetoldAlternativeCost extends AlternativeCostSourceAbility {
if (controller != null
&& asForetold != null) {
if (controller.chooseUse(Outcome.Neutral, "Do you wish to use " + asForetold.getLogName() + " to pay the alternative cost ?", ability, game)) {
- activated = super.askToActivateAlternativeCosts(ability, game);
- if (activated) {
+ wasActivated = super.askToActivateAlternativeCosts(ability, game);
+ if (wasActivated) {
// Get the watcher
AsForetoldAltCostUsedWatcher asForetoldAltCostUsedWatcher
- = (AsForetoldAltCostUsedWatcher) game.getState().getWatchers()
- .get("asForetoldAltCostUsedWatcher", sourceAsForetold);
+ = game.getState().getWatcher(AsForetoldAltCostUsedWatcher.class, sourceAsForetold);
// Mark as used
asForetoldAltCostUsedWatcher.markUsedThisTurn();
}
}
}
- return activated;
+ return wasActivated;
}
}
@@ -161,8 +160,8 @@ class AsForetoldAddAltCostEffect extends ContinuousEffectImpl {
if (sourcePermanent != null) {
// Get the watcher
AsForetoldAltCostUsedWatcher asForetoldAltCostUsedWatcher
- = (AsForetoldAltCostUsedWatcher) game.getState().getWatchers()
- .get("asForetoldAltCostUsedWatcher", sourcePermanent.getId());
+ = game.getState().getWatcher(
+ AsForetoldAltCostUsedWatcher.class, sourcePermanent.getId());
// If we haven't used it yet this turn, give the option of using the zero alternative cost
if (!asForetoldAltCostUsedWatcher.hasBeenUsedThisTurn()) {
diff --git a/Mage.Sets/src/mage/cards/a/AshenSkinZubera.java b/Mage.Sets/src/mage/cards/a/AshenSkinZubera.java
index 55f6c44791d..050b2493a30 100644
--- a/Mage.Sets/src/mage/cards/a/AshenSkinZubera.java
+++ b/Mage.Sets/src/mage/cards/a/AshenSkinZubera.java
@@ -27,7 +27,7 @@ public final class AshenSkinZubera extends CardImpl {
this.power = new MageInt(1);
this.toughness = new MageInt(2);
- Ability ability = new DiesTriggeredAbility(new DiscardTargetEffect(new ZuberasDiedDynamicValue()));
+ Ability ability = new DiesTriggeredAbility(new DiscardTargetEffect(ZuberasDiedDynamicValue.instance));
ability.addTarget(new TargetOpponent());
this.addAbility(ability, new ZuberasDiedWatcher());
}
diff --git a/Mage.Sets/src/mage/cards/a/AshenmoorCohort.java b/Mage.Sets/src/mage/cards/a/AshenmoorCohort.java
index 8609bb3fa8d..c791c256806 100644
--- a/Mage.Sets/src/mage/cards/a/AshenmoorCohort.java
+++ b/Mage.Sets/src/mage/cards/a/AshenmoorCohort.java
@@ -29,7 +29,7 @@ public final class AshenmoorCohort extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.BLACK));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
private static final String rule = "Ashenmoor Cohort gets +1/+1 as long as you control another black creature";
diff --git a/Mage.Sets/src/mage/cards/a/AsmiraHolyAvenger.java b/Mage.Sets/src/mage/cards/a/AsmiraHolyAvenger.java
index 60cb57bd4f0..7fa11e14739 100644
--- a/Mage.Sets/src/mage/cards/a/AsmiraHolyAvenger.java
+++ b/Mage.Sets/src/mage/cards/a/AsmiraHolyAvenger.java
@@ -95,7 +95,7 @@ class AsmiraHolyAvengerDynamicValue implements DynamicValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
- AsmiraHolyAvengerWatcher watcher = (AsmiraHolyAvengerWatcher) game.getState().getWatchers().get(AsmiraHolyAvengerWatcher.class.getSimpleName(), sourceAbility.getControllerId());
+ AsmiraHolyAvengerWatcher watcher = game.getState().getWatcher(AsmiraHolyAvengerWatcher.class, sourceAbility.getControllerId());
if (watcher != null) {
return watcher.getCreaturesCount();
}
diff --git a/Mage.Sets/src/mage/cards/a/Asphyxiate.java b/Mage.Sets/src/mage/cards/a/Asphyxiate.java
index 030206e5790..d5275dc2966 100644
--- a/Mage.Sets/src/mage/cards/a/Asphyxiate.java
+++ b/Mage.Sets/src/mage/cards/a/Asphyxiate.java
@@ -20,7 +20,7 @@ public final class Asphyxiate extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creature");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public Asphyxiate(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/Assassinate.java b/Mage.Sets/src/mage/cards/a/Assassinate.java
index 891a186397e..47355573df1 100644
--- a/Mage.Sets/src/mage/cards/a/Assassinate.java
+++ b/Mage.Sets/src/mage/cards/a/Assassinate.java
@@ -20,7 +20,7 @@ public final class Assassinate extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public Assassinate(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AssassinsBlade.java b/Mage.Sets/src/mage/cards/a/AssassinsBlade.java
index fe2b98e641a..6f530833e28 100644
--- a/Mage.Sets/src/mage/cards/a/AssassinsBlade.java
+++ b/Mage.Sets/src/mage/cards/a/AssassinsBlade.java
@@ -29,7 +29,7 @@ public final class AssassinsBlade extends CardImpl {
static {
filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK)));
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public AssassinsBlade(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AssaultFormation.java b/Mage.Sets/src/mage/cards/a/AssaultFormation.java
index 8895519cf38..645fec98a5e 100644
--- a/Mage.Sets/src/mage/cards/a/AssaultFormation.java
+++ b/Mage.Sets/src/mage/cards/a/AssaultFormation.java
@@ -1,26 +1,27 @@
package mage.cards.a;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderTargetEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect;
import mage.abilities.keyword.DefenderAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Zone;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AbilityPredicate;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
-import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class AssaultFormation extends CardImpl {
@@ -32,10 +33,10 @@ public final class AssaultFormation extends CardImpl {
}
public AssaultFormation(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
// Each creature you control assigns combat damage equal to its toughness rather than its power.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AssaultFormationCombatDamageRuleEffect()));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CombatDamageByToughnessEffect(StaticFilters.FILTER_PERMANENT_CREATURE, true)));
// {G}: Target creature with defender can attack this turn as though it didn't have defender.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CanAttackAsThoughItDidntHaveDefenderTargetEffect(Duration.EndOfTurn), new ManaCostsImpl("{G}"));
@@ -43,11 +44,11 @@ public final class AssaultFormation extends CardImpl {
this.addAbility(ability);
// {2}{G}: Creatures you control get +0/+1 until end of turn.
- this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostControlledEffect(0,1,Duration.EndOfTurn), new ManaCostsImpl("{2}{G}")));
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostControlledEffect(0, 1, Duration.EndOfTurn), new ManaCostsImpl("{2}{G}")));
}
- public AssaultFormation(final AssaultFormation card) {
+ private AssaultFormation(final AssaultFormation card) {
super(card);
}
@@ -56,40 +57,3 @@ public final class AssaultFormation extends CardImpl {
return new AssaultFormation(this);
}
}
-
-class AssaultFormationCombatDamageRuleEffect extends ContinuousEffectImpl {
-
- public AssaultFormationCombatDamageRuleEffect() {
- super(Duration.WhileOnBattlefield, Outcome.Detriment);
- staticText = "Each creature you control assigns combat damage equal to its toughness rather than its power";
- }
-
- public AssaultFormationCombatDamageRuleEffect(final AssaultFormationCombatDamageRuleEffect effect) {
- super(effect);
- }
-
- @Override
- public AssaultFormationCombatDamageRuleEffect copy() {
- return new AssaultFormationCombatDamageRuleEffect(this);
- }
-
- @Override
- public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- // Change the rule
- FilterCreaturePermanent filter = new FilterCreaturePermanent();
- filter.add(new ControllerIdPredicate(source.getControllerId()));
- game.getCombat().setUseToughnessForDamage(true);
- game.getCombat().addUseToughnessForDamageFilter(filter);
- return true;
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return false;
- }
-
- @Override
- public boolean hasLayer(Layer layer) {
- return layer == Layer.RulesEffects;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/AsylumVisitor.java b/Mage.Sets/src/mage/cards/a/AsylumVisitor.java
index bf7ea122ece..d31eb4c5705 100644
--- a/Mage.Sets/src/mage/cards/a/AsylumVisitor.java
+++ b/Mage.Sets/src/mage/cards/a/AsylumVisitor.java
@@ -1,7 +1,5 @@
-
package mage.cards.a;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -19,8 +17,9 @@ import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.TargetController;
+import java.util.UUID;
+
/**
- *
* @author escplan9 (Derek Monturo - dmontur1 at gmail dot com)
*/
public final class AsylumVisitor extends CardImpl {
@@ -33,11 +32,11 @@ public final class AsylumVisitor extends CardImpl {
this.toughness = new MageInt(1);
// At the beginning of each player's upkeep, if that player has no cards in hand, you draw a card and you lose 1 life.
- Ability ability = new ConditionalInterveningIfTriggeredAbility(new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(1), TargetController.ANY, false),
+ Ability ability = new ConditionalInterveningIfTriggeredAbility(
+ new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(1, "you"), TargetController.ANY, false),
new CardsInHandCondition(ComparisonType.EQUAL_TO, 0, null, TargetController.ACTIVE),
"At the beginning of each player's upkeep, if that player has no cards in hand, you draw a card and you lose 1 life.");
Effect effect = new LoseLifeSourceControllerEffect(1);
- effect.setText("and you lose 1 life");
ability.addEffect(effect);
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/a/AtalyaSamiteMaster.java b/Mage.Sets/src/mage/cards/a/AtalyaSamiteMaster.java
index 386cb7f67d7..38c00a82ce0 100644
--- a/Mage.Sets/src/mage/cards/a/AtalyaSamiteMaster.java
+++ b/Mage.Sets/src/mage/cards/a/AtalyaSamiteMaster.java
@@ -41,7 +41,7 @@ public final class AtalyaSamiteMaster extends CardImpl {
this.toughness = new MageInt(3);
// {X}, {tap}: Choose one - Prevent the next X damage that would be dealt to target creature this turn; or you gain X life. Spend only white mana on X.
- PreventDamageToTargetEffect effect = new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, new ManacostVariableValue());
+ PreventDamageToTargetEffect effect = new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, ManacostVariableValue.instance);
effect.setText("Prevent the next X damage that would be dealt to target creature this turn. Spend only white mana on X.");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}"));
ability.addCost(new TapSourceCost());
@@ -55,7 +55,7 @@ public final class AtalyaSamiteMaster extends CardImpl {
// or you gain X life
Mode mode = new Mode();
- mode.addEffect(new GainLifeEffect(new ManacostVariableValue()).setText("You gain X life. Spend only white mana on X."));
+ mode.addEffect(new GainLifeEffect(ManacostVariableValue.instance).setText("You gain X life. Spend only white mana on X."));
ability.addMode(mode);
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/a/AthreosGodOfPassage.java b/Mage.Sets/src/mage/cards/a/AthreosGodOfPassage.java
index fbd70641c0a..c2d40f3fb84 100644
--- a/Mage.Sets/src/mage/cards/a/AthreosGodOfPassage.java
+++ b/Mage.Sets/src/mage/cards/a/AthreosGodOfPassage.java
@@ -36,7 +36,7 @@ public final class AthreosGodOfPassage extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you own");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new OwnerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/a/Atogatog.java b/Mage.Sets/src/mage/cards/a/Atogatog.java
index 107f7ccbbe1..0f17b1a8a08 100644
--- a/Mage.Sets/src/mage/cards/a/Atogatog.java
+++ b/Mage.Sets/src/mage/cards/a/Atogatog.java
@@ -37,7 +37,7 @@ public final class Atogatog extends CardImpl {
this.power = new MageInt(5);
this.toughness = new MageInt(5);
- DynamicValue xValue = new SacrificeCostCreaturesPower();
+ DynamicValue xValue = SacrificeCostCreaturesPower.instance;
// Sacrifice an Atog creature: Atogatog gets +X/+X until end of turn, where X is the sacrificed creature's power.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD,
new BoostSourceEffect(xValue, xValue,Duration.EndOfTurn),
diff --git a/Mage.Sets/src/mage/cards/a/AtzocanArcher.java b/Mage.Sets/src/mage/cards/a/AtzocanArcher.java
index dfb3b1bbfd6..c07989dd627 100644
--- a/Mage.Sets/src/mage/cards/a/AtzocanArcher.java
+++ b/Mage.Sets/src/mage/cards/a/AtzocanArcher.java
@@ -25,7 +25,7 @@ public final class AtzocanArcher extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public AtzocanArcher(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AuraGraft.java b/Mage.Sets/src/mage/cards/a/AuraGraft.java
index 414c76e5b1b..7e0293246cc 100644
--- a/Mage.Sets/src/mage/cards/a/AuraGraft.java
+++ b/Mage.Sets/src/mage/cards/a/AuraGraft.java
@@ -120,7 +120,7 @@ class MoveTargetAuraEffect extends OneShotEffect {
}
FilterPermanent filter = new FilterPermanent("another permanent " + enchantment.getLogName() + " can enchant");
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new PermanentCanBeAttachedToPredicate(enchantment));
Target target = new TargetPermanent(filter);
target.setNotTarget(true);
diff --git a/Mage.Sets/src/mage/cards/a/AuraMutation.java b/Mage.Sets/src/mage/cards/a/AuraMutation.java
index 6586f22e633..7eaad0d970c 100644
--- a/Mage.Sets/src/mage/cards/a/AuraMutation.java
+++ b/Mage.Sets/src/mage/cards/a/AuraMutation.java
@@ -25,7 +25,7 @@ public final class AuraMutation extends CardImpl {
this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetEnchantmentPermanent());
// create X 1/1 green Saproling creature tokens, where X is that enchantment's converted mana cost.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), new TargetConvertedManaCost()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), TargetConvertedManaCost.instance));
}
public AuraMutation(final AuraMutation card) {
diff --git a/Mage.Sets/src/mage/cards/a/AuraOfDominion.java b/Mage.Sets/src/mage/cards/a/AuraOfDominion.java
index e0956632a61..2f7be843a01 100644
--- a/Mage.Sets/src/mage/cards/a/AuraOfDominion.java
+++ b/Mage.Sets/src/mage/cards/a/AuraOfDominion.java
@@ -31,7 +31,7 @@ public final class AuraOfDominion extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
diff --git a/Mage.Sets/src/mage/cards/a/AureliasFury.java b/Mage.Sets/src/mage/cards/a/AureliasFury.java
index 30fd2f477bd..01d4800511d 100644
--- a/Mage.Sets/src/mage/cards/a/AureliasFury.java
+++ b/Mage.Sets/src/mage/cards/a/AureliasFury.java
@@ -1,7 +1,6 @@
package mage.cards.a;
-import java.util.*;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
@@ -27,6 +26,10 @@ import mage.target.common.TargetAnyTargetAmount;
import mage.target.targetpointer.FixedTarget;
import mage.watchers.Watcher;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
* GATECRASH FAQ 11.01.2013
*
@@ -59,7 +62,7 @@ public final class AureliasFury extends CardImpl {
// Aurelia's Fury deals X damage divided as you choose among any number of target creatures and/or players.
// Tap each creature dealt damage this way. Players dealt damage this way can't cast noncreature spells this turn.
- DynamicValue xValue = new ManacostVariableValue();
+ DynamicValue xValue = ManacostVariableValue.instance;
this.getSpellAbility().addEffect(new DamageMultiEffect(xValue));
this.getSpellAbility().addEffect(new AureliasFuryEffect());
this.getSpellAbility().addTarget(new TargetAnyTargetAmount(xValue));
@@ -67,7 +70,7 @@ public final class AureliasFury extends CardImpl {
}
- public AureliasFury(final AureliasFury card) {
+ private AureliasFury(final AureliasFury card) {
super(card);
}
@@ -79,12 +82,12 @@ public final class AureliasFury extends CardImpl {
class AureliasFuryEffect extends OneShotEffect {
- public AureliasFuryEffect() {
+ AureliasFuryEffect() {
super(Outcome.Benefit);
this.staticText = "Tap each creature dealt damage this way. Players dealt damage this way can't cast noncreature spells this turn";
}
- public AureliasFuryEffect(final AureliasFuryEffect effect) {
+ private AureliasFuryEffect(final AureliasFuryEffect effect) {
super(effect);
}
@@ -95,15 +98,15 @@ class AureliasFuryEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- AureliasFuryDamagedByWatcher watcher = (AureliasFuryDamagedByWatcher) game.getState().getWatchers().get(AureliasFuryDamagedByWatcher.class.getSimpleName(), source.getSourceId());
+ AureliasFuryDamagedByWatcher watcher = game.getState().getWatcher(AureliasFuryDamagedByWatcher.class, source.getSourceId());
if (watcher != null) {
- for (UUID creatureId : watcher.damagedCreatures) {
+ for (UUID creatureId : watcher.getDamagedCreatures()) {
Permanent permanent = game.getPermanent(creatureId);
if (permanent != null) {
permanent.tap(game);
}
}
- for (UUID playerId : watcher.damagedPlayers) {
+ for (UUID playerId : watcher.getDamagedPlayers()) {
ContinuousEffect effect = new AureliasFuryCantCastEffect();
effect.setTargetPointer(new FixedTarget(playerId));
game.addEffect(effect, source);
@@ -117,12 +120,12 @@ class AureliasFuryEffect extends OneShotEffect {
class AureliasFuryCantCastEffect extends ContinuousRuleModifyingEffectImpl {
- public AureliasFuryCantCastEffect() {
+ AureliasFuryCantCastEffect() {
super(Duration.EndOfTurn, Outcome.Benefit);
staticText = "Players dealt damage this way can't cast noncreature spells this turn";
}
- public AureliasFuryCantCastEffect(final AureliasFuryCantCastEffect effect) {
+ private AureliasFuryCantCastEffect(final AureliasFuryCantCastEffect effect) {
super(effect);
}
@@ -165,14 +168,14 @@ class AureliasFuryCantCastEffect extends ContinuousRuleModifyingEffectImpl {
class AureliasFuryDamagedByWatcher extends Watcher {
- public Set damagedCreatures = new HashSet<>();
- public Set damagedPlayers = new HashSet<>();
+ private final Set damagedCreatures = new HashSet<>();
+ private final Set damagedPlayers = new HashSet<>();
- public AureliasFuryDamagedByWatcher() {
+ AureliasFuryDamagedByWatcher() {
super(AureliasFuryDamagedByWatcher.class.getSimpleName(), WatcherScope.CARD);
}
- public AureliasFuryDamagedByWatcher(final AureliasFuryDamagedByWatcher watcher) {
+ private AureliasFuryDamagedByWatcher(final AureliasFuryDamagedByWatcher watcher) {
super(watcher);
this.damagedCreatures.addAll(watcher.damagedCreatures);
this.damagedPlayers.addAll(watcher.damagedPlayers);
@@ -210,4 +213,11 @@ class AureliasFuryDamagedByWatcher extends Watcher {
damagedPlayers.clear();
}
+ Set getDamagedCreatures() {
+ return damagedCreatures;
+ }
+
+ Set getDamagedPlayers() {
+ return damagedPlayers;
+ }
}
diff --git a/Mage.Sets/src/mage/cards/a/AuriokChampion.java b/Mage.Sets/src/mage/cards/a/AuriokChampion.java
index 4b0fa72273e..6bb9d6e8fea 100644
--- a/Mage.Sets/src/mage/cards/a/AuriokChampion.java
+++ b/Mage.Sets/src/mage/cards/a/AuriokChampion.java
@@ -24,7 +24,7 @@ public final class AuriokChampion extends CardImpl {
private static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public AuriokChampion(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/Aurochs.java b/Mage.Sets/src/mage/cards/a/Aurochs.java
index d1b68781a73..ddd1acbe40a 100644
--- a/Mage.Sets/src/mage/cards/a/Aurochs.java
+++ b/Mage.Sets/src/mage/cards/a/Aurochs.java
@@ -27,7 +27,7 @@ public final class Aurochs extends CardImpl {
static {
filter1.add(new SubtypePredicate(SubType.AUROCHS));
- filter1.add(new AnotherPredicate());
+ filter1.add(AnotherPredicate.instance);
}
public Aurochs(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AurochsHerd.java b/Mage.Sets/src/mage/cards/a/AurochsHerd.java
index ab0b6b6ef20..62223e8f2ef 100644
--- a/Mage.Sets/src/mage/cards/a/AurochsHerd.java
+++ b/Mage.Sets/src/mage/cards/a/AurochsHerd.java
@@ -33,7 +33,7 @@ public final class AurochsHerd extends CardImpl {
static {
filter1.add(new SubtypePredicate(SubType.AUROCHS));
filter2.add(new SubtypePredicate(SubType.AUROCHS));
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
}
public AurochsHerd(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AuroraChampion.java b/Mage.Sets/src/mage/cards/a/AuroraChampion.java
index 365bb5f82ec..b4932d81b25 100644
--- a/Mage.Sets/src/mage/cards/a/AuroraChampion.java
+++ b/Mage.Sets/src/mage/cards/a/AuroraChampion.java
@@ -25,7 +25,7 @@ public final class AuroraChampion extends CardImpl {
private static final FilterTeamPermanent filter = new FilterTeamPermanent(SubType.WARRIOR, "another Warrior");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public AuroraChampion(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java b/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java
index b09ac13a395..3ec0575da4f 100644
--- a/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java
+++ b/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java
@@ -1,8 +1,5 @@
-
package mage.cards.a;
-import java.util.List;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
@@ -27,8 +24,10 @@ import mage.players.Player;
import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author Styxo
*/
public final class AurraSingBaneOfJedi extends CardImpl {
@@ -39,17 +38,17 @@ public final class AurraSingBaneOfJedi extends CardImpl {
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3));
- // +1:You may have {this} deal 2 damage to target creature. If you don't, {this} deals 1 damage to you.
+ // +1: You may have {this} deal 2 damage to target creature. If you don't, {this} deals 1 damage to you.
Ability ability = new LoyaltyAbility(new AurraSingBaneOfJediEffect(), +1);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
- // -4:Target player gets an emblem wiht "Whenever a nontoken creature you control leave the battlefied, discard a card.".
+ // -4: Target player gets an emblem wiht "Whenever a nontoken creature you control leave the battlefied, discard a card.".
ability = new LoyaltyAbility(new GetEmblemTargetPlayerEffect(new AurraSingBaneOfJediEmblem()), -4);
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
- // -6:Each player discards their hand and sacrificies all creatures he or she controls. Each player's life total becomes 1."
+ // -6: Each player discards their hand and sacrificies all creatures he or she controls. Each player's life total becomes 1."
ability = new LoyaltyAbility(new DiscardHandAllEffect(), -6);
ability.addEffect(new SacrificeAllEffect());
Effect effect = new SetPlayerLifeAllEffect(1, TargetController.ANY);
diff --git a/Mage.Sets/src/mage/cards/a/AvacynGuardianAngel.java b/Mage.Sets/src/mage/cards/a/AvacynGuardianAngel.java
index ec6d5355c2e..acc437a5726 100644
--- a/Mage.Sets/src/mage/cards/a/AvacynGuardianAngel.java
+++ b/Mage.Sets/src/mage/cards/a/AvacynGuardianAngel.java
@@ -33,7 +33,7 @@ public final class AvacynGuardianAngel extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public AvacynGuardianAngel(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AvacynThePurifier.java b/Mage.Sets/src/mage/cards/a/AvacynThePurifier.java
index e3ff29da23e..47dfa768b66 100644
--- a/Mage.Sets/src/mage/cards/a/AvacynThePurifier.java
+++ b/Mage.Sets/src/mage/cards/a/AvacynThePurifier.java
@@ -107,7 +107,7 @@ class AvacynThePurifierEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
FilterCreaturePermanent filter = new FilterCreaturePermanent("each other creature");
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game);
for (Permanent permanent : permanents) {
permanent.damage(3, source.getSourceId(), game, false, true);
diff --git a/Mage.Sets/src/mage/cards/a/Avalanche.java b/Mage.Sets/src/mage/cards/a/Avalanche.java
index ed9bbbeb213..703bd8f95a3 100644
--- a/Mage.Sets/src/mage/cards/a/Avalanche.java
+++ b/Mage.Sets/src/mage/cards/a/Avalanche.java
@@ -1,40 +1,32 @@
package mage.cards.a;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SuperType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
import mage.game.Game;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class Avalanche extends CardImpl {
- private static final FilterLandPermanent filter = new FilterLandPermanent("snow lands");
-
public Avalanche(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{2}{R}{R}");
// Destroy X target snow lands.
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target snow lands"));
- this.getSpellAbility().addTarget(new TargetPermanent(filter));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetPermanent(xValue, xValue, filter, false));
- }
+ this.getSpellAbility().setTargetAdjuster(AvalancheAdjuster.instance);
}
public Avalanche(final Avalanche card) {
@@ -46,3 +38,19 @@ public final class Avalanche extends CardImpl {
return new Avalanche(this);
}
}
+
+enum AvalancheAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPermanent filter = new FilterLandPermanent("snow lands");
+
+ static {
+ filter.add(new SupertypePredicate(SuperType.SNOW));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.addTarget(new TargetPermanent(xValue, xValue, filter, false));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/a/AvatarOfTheResolute.java b/Mage.Sets/src/mage/cards/a/AvatarOfTheResolute.java
index 1265256eb77..987d7a0122a 100644
--- a/Mage.Sets/src/mage/cards/a/AvatarOfTheResolute.java
+++ b/Mage.Sets/src/mage/cards/a/AvatarOfTheResolute.java
@@ -28,7 +28,7 @@ public final class AvatarOfTheResolute extends CardImpl {
static {
filter.add(new CounterPredicate(CounterType.P1P1));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public AvatarOfTheResolute(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AvenSoulgazer.java b/Mage.Sets/src/mage/cards/a/AvenSoulgazer.java
index 52e9da2dc82..551df4191a8 100644
--- a/Mage.Sets/src/mage/cards/a/AvenSoulgazer.java
+++ b/Mage.Sets/src/mage/cards/a/AvenSoulgazer.java
@@ -33,7 +33,7 @@ public final class AvenSoulgazer extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("face down creature");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
}
public AvenSoulgazer(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AvengingArrow.java b/Mage.Sets/src/mage/cards/a/AvengingArrow.java
index eb277e62ce9..e04ff459b60 100644
--- a/Mage.Sets/src/mage/cards/a/AvengingArrow.java
+++ b/Mage.Sets/src/mage/cards/a/AvengingArrow.java
@@ -53,7 +53,7 @@ class AvengingArrowTarget extends TargetPermanent {
@Override
public boolean canTarget(UUID id, Ability source, Game game) {
- SourceDidDamageWatcher watcher = (SourceDidDamageWatcher) game.getState().getWatchers().get(SourceDidDamageWatcher.class.getSimpleName());
+ SourceDidDamageWatcher watcher = game.getState().getWatcher(SourceDidDamageWatcher.class);
if (watcher != null) {
if (watcher.damageSources.contains(id)) {
return super.canTarget(id, source, game);
@@ -66,7 +66,7 @@ class AvengingArrowTarget extends TargetPermanent {
public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
Set availablePossibleTargets = super.possibleTargets(sourceId, sourceControllerId, game);
Set possibleTargets = new HashSet<>();
- SourceDidDamageWatcher watcher = (SourceDidDamageWatcher) game.getState().getWatchers().get(SourceDidDamageWatcher.class.getSimpleName());
+ SourceDidDamageWatcher watcher = game.getState().getWatcher(SourceDidDamageWatcher.class);
if (watcher != null) {
for (UUID targetId : availablePossibleTargets) {
Permanent permanent = game.getPermanent(targetId);
diff --git a/Mage.Sets/src/mage/cards/a/AviaryMechanic.java b/Mage.Sets/src/mage/cards/a/AviaryMechanic.java
index 37acc4e67e9..59a64bd2345 100644
--- a/Mage.Sets/src/mage/cards/a/AviaryMechanic.java
+++ b/Mage.Sets/src/mage/cards/a/AviaryMechanic.java
@@ -21,7 +21,7 @@ public final class AviaryMechanic extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another permanent you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public AviaryMechanic(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AwakenTheErstwhile.java b/Mage.Sets/src/mage/cards/a/AwakenTheErstwhile.java
new file mode 100644
index 00000000000..75403136dc9
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/a/AwakenTheErstwhile.java
@@ -0,0 +1,85 @@
+package mage.cards.a;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.game.permanent.token.ZombieToken;
+import mage.players.Player;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class AwakenTheErstwhile extends CardImpl {
+
+ public AwakenTheErstwhile(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}{B}");
+
+ // Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens.
+ this.getSpellAbility().addEffect(new AwakenTheErstwhileEffect());
+ }
+
+ public AwakenTheErstwhile(final AwakenTheErstwhile card) {
+ super(card);
+ }
+
+ @Override
+ public AwakenTheErstwhile copy() {
+ return new AwakenTheErstwhile(this);
+ }
+}
+
+class AwakenTheErstwhileEffect extends OneShotEffect {
+
+ public AwakenTheErstwhileEffect() {
+ super(Outcome.Detriment);
+ this.staticText = "each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens";
+ }
+
+ public AwakenTheErstwhileEffect(final AwakenTheErstwhileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public AwakenTheErstwhileEffect copy() {
+ return new AwakenTheErstwhileEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ // discard hands
+ Map cardsAmount = new HashMap<>();
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ int cardsInHand = player.getHand().size();
+ if (cardsInHand > 0) {
+ player.discard(cardsInHand, false, source, game);
+ cardsAmount.put(playerId, cardsInHand);
+ }
+ }
+ }
+
+ // create tokens
+ for (UUID playerId : cardsAmount.keySet()) {
+ Player player = game.getPlayer(playerId);
+ int tokensCount = cardsAmount.get(playerId);
+ if (player != null && tokensCount > 0) {
+ new ZombieToken().putOntoBattlefield(tokensCount, game, source.getSourceId(), player.getId());
+ }
+ }
+
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/a/AweForTheGuilds.java b/Mage.Sets/src/mage/cards/a/AweForTheGuilds.java
index f1569e4915a..4a0ee0ad5ff 100644
--- a/Mage.Sets/src/mage/cards/a/AweForTheGuilds.java
+++ b/Mage.Sets/src/mage/cards/a/AweForTheGuilds.java
@@ -22,7 +22,7 @@ public final class AweForTheGuilds extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Monocolored creatures");
static {
- filter.add(Predicates.not(new MulticoloredPredicate()));
+ filter.add(Predicates.not(MulticoloredPredicate.instance));
}
public AweForTheGuilds(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/a/AxebaneBeast.java b/Mage.Sets/src/mage/cards/a/AxebaneBeast.java
new file mode 100644
index 00000000000..f620a5ff30a
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/a/AxebaneBeast.java
@@ -0,0 +1,32 @@
+package mage.cards.a;
+
+import java.util.UUID;
+
+import mage.MageInt;
+import mage.constants.SubType;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+
+/**
+ * @author TheElk801
+ */
+public final class AxebaneBeast extends CardImpl {
+
+ public AxebaneBeast(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
+
+ this.subtype.add(SubType.BEAST);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+ }
+
+ private AxebaneBeast(final AxebaneBeast card) {
+ super(card);
+ }
+
+ @Override
+ public AxebaneBeast copy() {
+ return new AxebaneBeast(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/a/AyliEternalPilgrim.java b/Mage.Sets/src/mage/cards/a/AyliEternalPilgrim.java
index d552596e349..4e6c3c32821 100644
--- a/Mage.Sets/src/mage/cards/a/AyliEternalPilgrim.java
+++ b/Mage.Sets/src/mage/cards/a/AyliEternalPilgrim.java
@@ -45,7 +45,7 @@ public final class AyliEternalPilgrim extends CardImpl {
this.addAbility(DeathtouchAbility.getInstance());
// {1}, Sacrifice another creature: You gain life equal to the sacrificed creature's toughness.
- Effect effect = new GainLifeEffect(new SacrificeCostCreaturesToughness());
+ Effect effect = new GainLifeEffect(SacrificeCostCreaturesToughness.instance);
effect.setText("You gain life equal to the sacrificed creature's toughness");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(1));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)));
diff --git a/Mage.Sets/src/mage/cards/a/AzamiLadyOfScrolls.java b/Mage.Sets/src/mage/cards/a/AzamiLadyOfScrolls.java
index 456b3bd39b4..0c3d861582f 100644
--- a/Mage.Sets/src/mage/cards/a/AzamiLadyOfScrolls.java
+++ b/Mage.Sets/src/mage/cards/a/AzamiLadyOfScrolls.java
@@ -27,7 +27,7 @@ public final class AzamiLadyOfScrolls extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Wizard you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.WIZARD));
}
diff --git a/Mage.Sets/src/mage/cards/a/AzoriusKnightArbiter.java b/Mage.Sets/src/mage/cards/a/AzoriusKnightArbiter.java
new file mode 100644
index 00000000000..11f763bf98d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/a/AzoriusKnightArbiter.java
@@ -0,0 +1,41 @@
+package mage.cards.a;
+
+import mage.MageInt;
+import mage.abilities.keyword.CantBeBlockedSourceAbility;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class AzoriusKnightArbiter extends CardImpl {
+
+ public AzoriusKnightArbiter(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{U}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.KNIGHT);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(5);
+
+ // Vigilance
+ this.addAbility(VigilanceAbility.getInstance());
+
+ // Azorius Knight-Arbiter can't be blocked.
+ this.addAbility(new CantBeBlockedSourceAbility());
+ }
+
+ private AzoriusKnightArbiter(final AzoriusKnightArbiter card) {
+ super(card);
+ }
+
+ @Override
+ public AzoriusKnightArbiter copy() {
+ return new AzoriusKnightArbiter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/a/AzoriusLocket.java b/Mage.Sets/src/mage/cards/a/AzoriusLocket.java
new file mode 100644
index 00000000000..8f78a48347d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/a/AzoriusLocket.java
@@ -0,0 +1,45 @@
+package mage.cards.a;
+
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Zone;
+
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class AzoriusLocket extends CardImpl {
+
+ public AzoriusLocket(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
+
+ // {T}: Add {W} or {U}.
+ this.addAbility(new WhiteManaAbility());
+ this.addAbility(new BlueManaAbility());
+
+ // {W/U}{W/U}{W/U}{W/U}, {T}, Sacrifice Azorius Locket: Draw two cards.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new ManaCostsImpl<>("{W/U}{W/U}{W/U}{W/U}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public AzoriusLocket(final AzoriusLocket card) {
+ super(card);
+ }
+
+ @Override
+ public AzoriusLocket copy() {
+ return new AzoriusLocket(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/a/AzoriusSkyguard.java b/Mage.Sets/src/mage/cards/a/AzoriusSkyguard.java
new file mode 100644
index 00000000000..58cb054d70c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/a/AzoriusSkyguard.java
@@ -0,0 +1,47 @@
+package mage.cards.a;
+
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.continuous.BoostOpponentsEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class AzoriusSkyguard extends CardImpl {
+
+ public AzoriusSkyguard(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{U}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.KNIGHT);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+
+ // Creatures your opponents control get -1/-0.
+ this.addAbility(new SimpleStaticAbility(new BoostOpponentsEffect(-1, 0, Duration.WhileOnBattlefield)));
+ }
+
+ private AzoriusSkyguard(final AzoriusSkyguard card) {
+ super(card);
+ }
+
+ @Override
+ public AzoriusSkyguard copy() {
+ return new AzoriusSkyguard(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/Backlash.java b/Mage.Sets/src/mage/cards/b/Backlash.java
index 274ab604164..b054f340c30 100644
--- a/Mage.Sets/src/mage/cards/b/Backlash.java
+++ b/Mage.Sets/src/mage/cards/b/Backlash.java
@@ -24,7 +24,7 @@ public final class Backlash extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creature");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public Backlash(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BalduvianRage.java b/Mage.Sets/src/mage/cards/b/BalduvianRage.java
index 832c748b7c4..9f3e910722f 100644
--- a/Mage.Sets/src/mage/cards/b/BalduvianRage.java
+++ b/Mage.Sets/src/mage/cards/b/BalduvianRage.java
@@ -25,7 +25,7 @@ public final class BalduvianRage extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{R}");
// Target attacking creature gets +X/+0 until end of turn.
- this.getSpellAbility().addEffect(new BoostTargetEffect(new ManacostVariableValue(), new StaticValue(0), Duration.EndOfTurn));
+ this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.instance, new StaticValue(0), Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterAttackingCreature()));
// Draw a card at the beginning of the next turn's upkeep.
diff --git a/Mage.Sets/src/mage/cards/b/BalduvianTradingPost.java b/Mage.Sets/src/mage/cards/b/BalduvianTradingPost.java
index 9c4c948a5a5..d133e2483a8 100644
--- a/Mage.Sets/src/mage/cards/b/BalduvianTradingPost.java
+++ b/Mage.Sets/src/mage/cards/b/BalduvianTradingPost.java
@@ -34,7 +34,7 @@ public final class BalduvianTradingPost extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.MOUNTAIN));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public BalduvianTradingPost(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BalduvianWarlord.java b/Mage.Sets/src/mage/cards/b/BalduvianWarlord.java
index 1adf661c5c1..4a18b913d88 100644
--- a/Mage.Sets/src/mage/cards/b/BalduvianWarlord.java
+++ b/Mage.Sets/src/mage/cards/b/BalduvianWarlord.java
@@ -89,7 +89,7 @@ class BalduvianWarlordUnblockEffect extends OneShotEffect {
effect.apply(game, source);
// Make blocked creatures unblocked
- BlockedByOnlyOneCreatureThisCombatWatcher watcher = (BlockedByOnlyOneCreatureThisCombatWatcher) game.getState().getWatchers().get(BlockedByOnlyOneCreatureThisCombatWatcher.class.getSimpleName());
+ BlockedByOnlyOneCreatureThisCombatWatcher watcher = game.getState().getWatcher(BlockedByOnlyOneCreatureThisCombatWatcher.class);
if (watcher != null) {
Set combatGroups = watcher.getBlockedOnlyByCreature(permanent.getId());
if (combatGroups != null) {
diff --git a/Mage.Sets/src/mage/cards/b/BalefulForce.java b/Mage.Sets/src/mage/cards/b/BalefulForce.java
index 09b09a0e70c..4107df58401 100644
--- a/Mage.Sets/src/mage/cards/b/BalefulForce.java
+++ b/Mage.Sets/src/mage/cards/b/BalefulForce.java
@@ -1,7 +1,5 @@
-
package mage.cards.b;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -14,24 +12,24 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class BalefulForce extends CardImpl {
public BalefulForce(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{B}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{B}{B}");
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(7);
this.toughness = new MageInt(7);
// At the beginning of each upkeep, you draw a card and you lose 1 life.
- Ability ability = new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(1), TargetController.ANY, false);
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(new DrawCardSourceControllerEffect(1, "you"), TargetController.ANY, false);
Effect effect = new LoseLifeSourceControllerEffect(1);
- effect.setText("and you lose 1 life");
- ability.addEffect(effect);
+ ability.addEffect(effect.concatBy("and"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/b/BallistaSquad.java b/Mage.Sets/src/mage/cards/b/BallistaSquad.java
index 232a7b75f18..b52ad56e1d1 100644
--- a/Mage.Sets/src/mage/cards/b/BallistaSquad.java
+++ b/Mage.Sets/src/mage/cards/b/BallistaSquad.java
@@ -30,7 +30,7 @@ public final class BallistaSquad extends CardImpl {
this.toughness = new MageInt(2);
// {X}{W}, {T}: Ballista Squad deals X damage to target attacking or blocking creature.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}{W}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.instance), new ManaCostsImpl("{X}{W}"));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetAttackingOrBlockingCreature());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/b/BallynockCohort.java b/Mage.Sets/src/mage/cards/b/BallynockCohort.java
index 564920405b7..e241fcec13a 100644
--- a/Mage.Sets/src/mage/cards/b/BallynockCohort.java
+++ b/Mage.Sets/src/mage/cards/b/BallynockCohort.java
@@ -32,7 +32,7 @@ public final class BallynockCohort extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.WHITE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
private String rule = "{this} gets +1/+1 as long as you control another white creature";
diff --git a/Mage.Sets/src/mage/cards/b/BalothCageTrap.java b/Mage.Sets/src/mage/cards/b/BalothCageTrap.java
index 9d419b79214..4c86becb5b9 100644
--- a/Mage.Sets/src/mage/cards/b/BalothCageTrap.java
+++ b/Mage.Sets/src/mage/cards/b/BalothCageTrap.java
@@ -50,7 +50,7 @@ enum BalothCageTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PermanentsEnteredBattlefieldWatcher watcher = (PermanentsEnteredBattlefieldWatcher) game.getState().getWatchers().get(PermanentsEnteredBattlefieldWatcher.class.getSimpleName());
+ PermanentsEnteredBattlefieldWatcher watcher = game.getState().getWatcher(PermanentsEnteredBattlefieldWatcher.class);
if (watcher != null) {
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
List permanents = watcher.getThisTurnEnteringPermanents(opponentId);
diff --git a/Mage.Sets/src/mage/cards/b/BalthorTheStout.java b/Mage.Sets/src/mage/cards/b/BalthorTheStout.java
index ef768145d4d..1e280dd027f 100644
--- a/Mage.Sets/src/mage/cards/b/BalthorTheStout.java
+++ b/Mage.Sets/src/mage/cards/b/BalthorTheStout.java
@@ -28,7 +28,7 @@ public final class BalthorTheStout extends CardImpl {
static {
filter1.add(new SubtypePredicate(SubType.BARBARIAN));
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
filter2.add(new SubtypePredicate(SubType.BARBARIAN));
}
diff --git a/Mage.Sets/src/mage/cards/b/BaneOfTheLiving.java b/Mage.Sets/src/mage/cards/b/BaneOfTheLiving.java
index e37a695bc91..a68033931f4 100644
--- a/Mage.Sets/src/mage/cards/b/BaneOfTheLiving.java
+++ b/Mage.Sets/src/mage/cards/b/BaneOfTheLiving.java
@@ -32,7 +32,7 @@ public final class BaneOfTheLiving extends CardImpl {
// Morph {X}{B}{B}
this.addAbility(new MorphAbility(this, new ManaCostsImpl("{X}{B}{B}")));
// When Bane of the Living is turned face up, all creatures get -X/-X until end of turn.
- DynamicValue morphX = new SignInversionDynamicValue(new MorphManacostVariableValue());
+ DynamicValue morphX = new SignInversionDynamicValue(MorphManacostVariableValue.instance);
this.addAbility(new TurnedFaceUpSourceTriggeredAbility(new BoostAllEffect(morphX, morphX, Duration.EndOfTurn, new FilterCreaturePermanent("all creatures"), false, "", true)));
}
diff --git a/Mage.Sets/src/mage/cards/b/Banefire.java b/Mage.Sets/src/mage/cards/b/Banefire.java
index 29d3a6a2fcc..b74cddb4a94 100644
--- a/Mage.Sets/src/mage/cards/b/Banefire.java
+++ b/Mage.Sets/src/mage/cards/b/Banefire.java
@@ -106,7 +106,7 @@ class BaneFireEffect extends OneShotEffect {
class BanefireCantCounterEffect extends ContinuousRuleModifyingEffectImpl {
- Condition condition = new testCondition(new ManacostVariableValue(), 5);
+ Condition condition = new testCondition(ManacostVariableValue.instance, 5);
public BanefireCantCounterEffect() {
super(Duration.WhileOnStack, Outcome.Benefit);
diff --git a/Mage.Sets/src/mage/cards/b/BanefulOmen.java b/Mage.Sets/src/mage/cards/b/BanefulOmen.java
index 9643aacd05d..31d22c9a48a 100644
--- a/Mage.Sets/src/mage/cards/b/BanefulOmen.java
+++ b/Mage.Sets/src/mage/cards/b/BanefulOmen.java
@@ -1,8 +1,6 @@
package mage.cards.b;
-import java.util.Set;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.OneShotEffect;
@@ -15,15 +13,16 @@ import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.players.Player;
+import java.util.Set;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class BanefulOmen extends CardImpl {
public BanefulOmen(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{B}{B}{B}");
-
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{B}{B}{B}");
// At the beginning of your end step, you may reveal the top card of your library. If you do, each opponent loses life equal to that card's converted mana cost.
this.addAbility(new BanefulOmenTriggeredAbility());
@@ -40,11 +39,11 @@ public final class BanefulOmen extends CardImpl {
class BanefulOmenTriggeredAbility extends TriggeredAbilityImpl {
- public BanefulOmenTriggeredAbility() {
+ BanefulOmenTriggeredAbility() {
super(Zone.BATTLEFIELD, new BanefulOmenEffect(), true);
}
- public BanefulOmenTriggeredAbility(BanefulOmenTriggeredAbility ability) {
+ private BanefulOmenTriggeredAbility(BanefulOmenTriggeredAbility ability) {
super(ability);
}
@@ -71,11 +70,11 @@ public final class BanefulOmen extends CardImpl {
static class BanefulOmenEffect extends OneShotEffect {
- public BanefulOmenEffect() {
+ BanefulOmenEffect() {
super(Outcome.Benefit);
}
- public BanefulOmenEffect(final BanefulOmenEffect effect) {
+ private BanefulOmenEffect(final BanefulOmenEffect effect) {
super(effect);
}
@@ -85,24 +84,26 @@ public final class BanefulOmen extends CardImpl {
if (player == null) {
return false;
}
- if (player.getLibrary().hasCards()) {
- Card card = player.getLibrary().getFromTop(game);
- Cards cards = new CardsImpl();
- cards.add(card);
- player.revealCards("Baneful Omen", cards, game);
+ if (!player.getLibrary().hasCards()) {
+ return false;
+ }
+ Card card = player.getLibrary().getFromTop(game);
+ Cards cards = new CardsImpl();
+ cards.add(card);
+ player.revealCards("Baneful Omen", cards, game);
- if (card != null) {
- int loseLife = card.getConvertedManaCost();
- Set opponents = game.getOpponents(source.getControllerId());
- for (UUID opponentUuid : opponents) {
- Player opponent = game.getPlayer(opponentUuid);
- if (opponent != null) {
- opponent.loseLife(loseLife, game, false);
- }
- }
+ if (card == null) {
+ return false;
+ }
+ int loseLife = card.getConvertedManaCost();
+ Set opponents = game.getOpponents(source.getControllerId());
+ for (UUID opponentUuid : opponents) {
+ Player opponent = game.getPlayer(opponentUuid);
+ if (opponent != null) {
+ opponent.loseLife(loseLife, game, false);
}
}
- return false;
+ return true;
}
@Override
diff --git a/Mage.Sets/src/mage/cards/b/BankruptInBlood.java b/Mage.Sets/src/mage/cards/b/BankruptInBlood.java
new file mode 100644
index 00000000000..f858051b679
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BankruptInBlood.java
@@ -0,0 +1,35 @@
+package mage.cards.b;
+
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BankruptInBlood extends CardImpl {
+
+ public BankruptInBlood(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}");
+
+ // As an additional cost to cast this spell, sacrifice two creatures.
+ this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(2)));
+
+ // Draw three cards.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3));
+ }
+
+ private BankruptInBlood(final BankruptInBlood card) {
+ super(card);
+ }
+
+ @Override
+ public BankruptInBlood copy() {
+ return new BankruptInBlood(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/Banshee.java b/Mage.Sets/src/mage/cards/b/Banshee.java
index b2392191ad1..3d0b460a5d5 100644
--- a/Mage.Sets/src/mage/cards/b/Banshee.java
+++ b/Mage.Sets/src/mage/cards/b/Banshee.java
@@ -32,9 +32,9 @@ public final class Banshee extends CardImpl {
this.toughness = new MageInt(1);
// {X}, {T}: Banshee deals half X damage, rounded down, to any target, and half X damage, rounded up, to you.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new HalfValue(new ManacostVariableValue(), false)).setText("Banshee deals half X damage, rounded down, to any target,"), new ManaCostsImpl("{X}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new HalfValue(ManacostVariableValue.instance, false)).setText("Banshee deals half X damage, rounded down, to any target,"), new ManaCostsImpl("{X}"));
ability.addCost(new TapSourceCost());
- ability.addEffect(new DamageControllerEffect(new HalfValue(new ManacostVariableValue(), true)).setText(" and half X damage, rounded up, to you"));
+ ability.addEffect(new DamageControllerEffect(new HalfValue(ManacostVariableValue.instance, true)).setText(" and half X damage, rounded up, to you"));
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/b/BantSureblade.java b/Mage.Sets/src/mage/cards/b/BantSureblade.java
index 15c2410d1a1..e39241c04ed 100644
--- a/Mage.Sets/src/mage/cards/b/BantSureblade.java
+++ b/Mage.Sets/src/mage/cards/b/BantSureblade.java
@@ -29,8 +29,8 @@ public final class BantSureblade extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another multicolor permanent");
static {
- filter.add(new MulticoloredPredicate());
- filter.add(new AnotherPredicate());
+ filter.add(MulticoloredPredicate.instance);
+ filter.add(AnotherPredicate.instance);
}
public BantSureblade(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BaronSengir.java b/Mage.Sets/src/mage/cards/b/BaronSengir.java
index f69bada8d5e..41375fb1ce3 100644
--- a/Mage.Sets/src/mage/cards/b/BaronSengir.java
+++ b/Mage.Sets/src/mage/cards/b/BaronSengir.java
@@ -32,7 +32,7 @@ public final class BaronSengir extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.VAMPIRE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BaronSengir(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BarrageTyrant.java b/Mage.Sets/src/mage/cards/b/BarrageTyrant.java
index 1c95a11f61e..8f4b20d1274 100644
--- a/Mage.Sets/src/mage/cards/b/BarrageTyrant.java
+++ b/Mage.Sets/src/mage/cards/b/BarrageTyrant.java
@@ -31,8 +31,8 @@ public final class BarrageTyrant extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another colorless creature");
static {
- filter.add(new AnotherPredicate());
- filter.add(new ColorlessPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(ColorlessPredicate.instance);
}
public BarrageTyrant(UUID ownerId, CardSetInfo setInfo) {
@@ -45,7 +45,7 @@ public final class BarrageTyrant extends CardImpl {
this.addAbility(new DevoidAbility(this.color));
// {2}{R}, Sacrifice another colorless creature: Barrage Tyrant deals damage equal to the sacrificed creature's power to any target.
- Effect effect = new DamageTargetEffect(new SacrificeCostCreaturesPower());
+ Effect effect = new DamageTargetEffect(SacrificeCostCreaturesPower.instance);
effect.setText("{this} deals damage equal to the sacrificed creature's power to any target");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}{R}"));
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter)));
diff --git a/Mage.Sets/src/mage/cards/b/BarrenGlory.java b/Mage.Sets/src/mage/cards/b/BarrenGlory.java
index 78113c6343c..29ae7eb6666 100644
--- a/Mage.Sets/src/mage/cards/b/BarrenGlory.java
+++ b/Mage.Sets/src/mage/cards/b/BarrenGlory.java
@@ -24,7 +24,7 @@ public final class BarrenGlory extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BarrenGlory(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BartelRuneaxe.java b/Mage.Sets/src/mage/cards/b/BartelRuneaxe.java
index a5ca949ea84..8c020d57cc4 100644
--- a/Mage.Sets/src/mage/cards/b/BartelRuneaxe.java
+++ b/Mage.Sets/src/mage/cards/b/BartelRuneaxe.java
@@ -81,7 +81,7 @@ class BartelRuneaxeEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- StackObject stackObject = (StackObject) game.getStack().getStackObject(event.getSourceId());
+ StackObject stackObject = game.getStack().getStackObject(event.getSourceId());
if (stackObject != null && event.getTargetId().equals(source.getSourceId())) {
if (stackObject.hasSubtype(SubType.AURA, game)) {
return true;
diff --git a/Mage.Sets/src/mage/cards/b/BasilicaBellHaunt.java b/Mage.Sets/src/mage/cards/b/BasilicaBellHaunt.java
new file mode 100644
index 00000000000..1fd93559398
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BasilicaBellHaunt.java
@@ -0,0 +1,42 @@
+package mage.cards.b;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BasilicaBellHaunt extends CardImpl {
+
+ public BasilicaBellHaunt(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{W}{B}{B}");
+
+ this.subtype.add(SubType.SPIRIT);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+
+ // When Basilica Bell-Haunt enters the battlefield, each opponent discards a card and you gain 3 life.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardEachPlayerEffect(TargetController.OPPONENT));
+ ability.addEffect(new GainLifeEffect(3).setText("and you gain 3 life"));
+ this.addAbility(ability);
+ }
+
+ private BasilicaBellHaunt(final BasilicaBellHaunt card) {
+ super(card);
+ }
+
+ @Override
+ public BasilicaBellHaunt copy() {
+ return new BasilicaBellHaunt(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/BastionProtector.java b/Mage.Sets/src/mage/cards/b/BastionProtector.java
index 14844a9c4db..ba1fdaac309 100644
--- a/Mage.Sets/src/mage/cards/b/BastionProtector.java
+++ b/Mage.Sets/src/mage/cards/b/BastionProtector.java
@@ -27,7 +27,7 @@ public final class BastionProtector extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("Commander creatures");
static {
- filter.add(new CommanderPredicate());
+ filter.add(CommanderPredicate.instance);
}
public BastionProtector(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BattleAtTheBridge.java b/Mage.Sets/src/mage/cards/b/BattleAtTheBridge.java
index b7d906149ef..6aced560b88 100644
--- a/Mage.Sets/src/mage/cards/b/BattleAtTheBridge.java
+++ b/Mage.Sets/src/mage/cards/b/BattleAtTheBridge.java
@@ -27,10 +27,10 @@ public final class BattleAtTheBridge extends CardImpl {
addAbility(new ImproviseAbility());
// Target creature gets -X/-X until end of turn. You gain X life.
- DynamicValue x = new SignInversionDynamicValue(new ManacostVariableValue());
+ DynamicValue x = new SignInversionDynamicValue(ManacostVariableValue.instance);
this.getSpellAbility().addEffect(new BoostTargetEffect(x, x, Duration.EndOfTurn, true));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
- this.getSpellAbility().addEffect(new GainLifeEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.instance));
}
public BattleAtTheBridge(final BattleAtTheBridge card) {
diff --git a/Mage.Sets/src/mage/cards/b/BattleScreech.java b/Mage.Sets/src/mage/cards/b/BattleScreech.java
index 2fc92e6c6bf..2a9f3d72cdc 100644
--- a/Mage.Sets/src/mage/cards/b/BattleScreech.java
+++ b/Mage.Sets/src/mage/cards/b/BattleScreech.java
@@ -27,7 +27,7 @@ public final class BattleScreech extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.WHITE));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public BattleScreech(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BattletideAlchemist.java b/Mage.Sets/src/mage/cards/b/BattletideAlchemist.java
index 1c94669e7c7..345086c7dfd 100644
--- a/Mage.Sets/src/mage/cards/b/BattletideAlchemist.java
+++ b/Mage.Sets/src/mage/cards/b/BattletideAlchemist.java
@@ -94,8 +94,4 @@ class BattletideAlchemistEffect extends PreventionEffectImpl {
return event.getType() == EventType.DAMAGE_PLAYER;
}
- @Override
- public boolean applies(GameEvent event, Ability source, Game game) {
- return super.applies(event, source, game);
- }
}
diff --git a/Mage.Sets/src/mage/cards/b/BazaarKrovod.java b/Mage.Sets/src/mage/cards/b/BazaarKrovod.java
index 672dcfb1ec6..858ae9db6a1 100644
--- a/Mage.Sets/src/mage/cards/b/BazaarKrovod.java
+++ b/Mage.Sets/src/mage/cards/b/BazaarKrovod.java
@@ -28,7 +28,7 @@ public final class BazaarKrovod extends CardImpl {
static final FilterAttackingCreature filter = new FilterAttackingCreature("another target attacking creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BazaarKrovod(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BazaarOfWonders.java b/Mage.Sets/src/mage/cards/b/BazaarOfWonders.java
index f63d0ebc8ad..542403fb70b 100644
--- a/Mage.Sets/src/mage/cards/b/BazaarOfWonders.java
+++ b/Mage.Sets/src/mage/cards/b/BazaarOfWonders.java
@@ -76,7 +76,7 @@ class BazaarOfWondersEffect extends OneShotEffect {
String spellName = spell.getName();
FilterPermanent filter1 = new FilterPermanent();
filter1.add(new NamePredicate(spellName));
- filter1.add(Predicates.not(new TokenPredicate()));
+ filter1.add(Predicates.not(TokenPredicate.instance));
if (!game.getBattlefield().getActivePermanents(filter1, source.getControllerId(), game).isEmpty()) {
spell.counter(source.getControllerId(), game);
return true;
diff --git a/Mage.Sets/src/mage/cards/b/BeastmastersMagemark.java b/Mage.Sets/src/mage/cards/b/BeastmastersMagemark.java
index 98fd1d3bef4..418c6e671a2 100644
--- a/Mage.Sets/src/mage/cards/b/BeastmastersMagemark.java
+++ b/Mage.Sets/src/mage/cards/b/BeastmastersMagemark.java
@@ -29,7 +29,7 @@ public final class BeastmastersMagemark extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control that are enchanted");
static {
- filter.add(new EnchantedPredicate());
+ filter.add(EnchantedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/b/BeastsOfBogardan.java b/Mage.Sets/src/mage/cards/b/BeastsOfBogardan.java
index b9035891f6d..0564015c88c 100644
--- a/Mage.Sets/src/mage/cards/b/BeastsOfBogardan.java
+++ b/Mage.Sets/src/mage/cards/b/BeastsOfBogardan.java
@@ -30,7 +30,7 @@ public final class BeastsOfBogardan extends CardImpl {
static {
controlFilter.add(new ColorPredicate(ObjectColor.WHITE));
- controlFilter.add(Predicates.not(new TokenPredicate()));
+ controlFilter.add(Predicates.not(TokenPredicate.instance));
}
public BeastsOfBogardan(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BedeckBedazzle.java b/Mage.Sets/src/mage/cards/b/BedeckBedazzle.java
new file mode 100644
index 00000000000..83c3d03a178
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BedeckBedazzle.java
@@ -0,0 +1,83 @@
+package mage.cards.b;
+
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardSetInfo;
+import mage.cards.SplitCard;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.SpellAbilityType;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetLandPermanent;
+import mage.target.common.TargetOpponentOrPlaneswalker;
+import mage.target.targetpointer.FixedTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BedeckBedazzle extends SplitCard {
+
+ public BedeckBedazzle(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B/R}{B/R}", "{4}{B}{R}", SpellAbilityType.SPLIT);
+
+ // Bedeck
+ // Target creature gets +3/-3 until end of turn.
+ this.getLeftHalfCard().getSpellAbility().addEffect(
+ new BoostTargetEffect(3, -3, Duration.EndOfTurn)
+ );
+ this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Bedazzle
+ // Destroy target nonbasic land. Bedazzle deals 2 damage to target opponent or planeswalker.
+ this.getRightHalfCard().getSpellAbility().addEffect(new BedazzleEffect());
+ this.getRightHalfCard().getSpellAbility().addTarget(new TargetLandPermanent());
+ this.getRightHalfCard().getSpellAbility().addTarget(new TargetOpponentOrPlaneswalker());
+ }
+
+ private BedeckBedazzle(final BedeckBedazzle card) {
+ super(card);
+ }
+
+ @Override
+ public BedeckBedazzle copy() {
+ return new BedeckBedazzle(this);
+ }
+}
+
+class BedazzleEffect extends OneShotEffect {
+
+ BedazzleEffect() {
+ super(Outcome.Benefit);
+ staticText = "Destroy target nonbasic land. {this} deals 2 damage to target opponent or planeswalker.";
+ }
+
+ private BedazzleEffect(final BedazzleEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BedazzleEffect copy() {
+ return new BedazzleEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ if (permanent != null) {
+ permanent.destroy(source.getSourceId(), game, false);
+ }
+ Effect effect = new DamageTargetEffect(new StaticValue(2), true, "", true);
+ effect.setTargetPointer(new FixedTarget(source.getTargets().get(0).getFirstTarget(), game));
+ effect.apply(game, source);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/b/BelbesArmor.java b/Mage.Sets/src/mage/cards/b/BelbesArmor.java
index e1e54a3e326..d9cc57f6a26 100644
--- a/Mage.Sets/src/mage/cards/b/BelbesArmor.java
+++ b/Mage.Sets/src/mage/cards/b/BelbesArmor.java
@@ -29,8 +29,8 @@ public final class BelbesArmor extends CardImpl {
Ability ability = new SimpleActivatedAbility(
Zone.BATTLEFIELD,
new BoostTargetEffect(
- new MultipliedValue(new ManacostVariableValue(), -1),
- new ManacostVariableValue(),
+ new MultipliedValue(ManacostVariableValue.instance, -1),
+ ManacostVariableValue.instance,
Duration.EndOfTurn
),
new ManaCostsImpl("{X}"));
diff --git a/Mage.Sets/src/mage/cards/b/BelligerentBrontodon.java b/Mage.Sets/src/mage/cards/b/BelligerentBrontodon.java
index a5de154190f..e6243b73c8c 100644
--- a/Mage.Sets/src/mage/cards/b/BelligerentBrontodon.java
+++ b/Mage.Sets/src/mage/cards/b/BelligerentBrontodon.java
@@ -1,21 +1,19 @@
package mage.cards.b;
-import java.util.UUID;
-
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
-import mage.game.Game;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.filter.StaticFilters;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class BelligerentBrontodon extends CardImpl {
@@ -28,10 +26,10 @@ public final class BelligerentBrontodon extends CardImpl {
this.toughness = new MageInt(6);
// Each creature you control assigns combat damage equal to its toughness rather than its power.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BelligerentBrontodonCombatDamageRuleEffect()));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CombatDamageByToughnessEffect(StaticFilters.FILTER_PERMANENT_CREATURE, true)));
}
- public BelligerentBrontodon(final BelligerentBrontodon card) {
+ private BelligerentBrontodon(final BelligerentBrontodon card) {
super(card);
}
@@ -40,40 +38,3 @@ public final class BelligerentBrontodon extends CardImpl {
return new BelligerentBrontodon(this);
}
}
-
-class BelligerentBrontodonCombatDamageRuleEffect extends ContinuousEffectImpl {
-
- public BelligerentBrontodonCombatDamageRuleEffect() {
- super(Duration.WhileOnBattlefield, Outcome.Detriment);
- staticText = "Each creature you control assigns combat damage equal to its toughness rather than its power";
- }
-
- public BelligerentBrontodonCombatDamageRuleEffect(final BelligerentBrontodonCombatDamageRuleEffect effect) {
- super(effect);
- }
-
- @Override
- public BelligerentBrontodonCombatDamageRuleEffect copy() {
- return new BelligerentBrontodonCombatDamageRuleEffect(this);
- }
-
- @Override
- public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- // Change the rule
- FilterCreaturePermanent filter = new FilterCreaturePermanent();
- filter.add(new ControllerIdPredicate(source.getControllerId()));
- game.getCombat().setUseToughnessForDamage(true);
- game.getCombat().addUseToughnessForDamageFilter(filter);
- return true;
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return false;
- }
-
- @Override
- public boolean hasLayer(Layer layer) {
- return layer == Layer.RulesEffects;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/b/BellowingAegisaur.java b/Mage.Sets/src/mage/cards/b/BellowingAegisaur.java
index e5942e94a59..e12a62d4bb7 100644
--- a/Mage.Sets/src/mage/cards/b/BellowingAegisaur.java
+++ b/Mage.Sets/src/mage/cards/b/BellowingAegisaur.java
@@ -27,7 +27,7 @@ public final class BellowingAegisaur extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BellowingAegisaur(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BelltollDragon.java b/Mage.Sets/src/mage/cards/b/BelltollDragon.java
index f2f6f73f80d..1a0407c5ce6 100644
--- a/Mage.Sets/src/mage/cards/b/BelltollDragon.java
+++ b/Mage.Sets/src/mage/cards/b/BelltollDragon.java
@@ -27,7 +27,7 @@ public final class BelltollDragon extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other Dragon creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.DRAGON));
}
diff --git a/Mage.Sets/src/mage/cards/b/BelltowerSphinx.java b/Mage.Sets/src/mage/cards/b/BelltowerSphinx.java
index 5835f6115cd..832d83f0d6f 100644
--- a/Mage.Sets/src/mage/cards/b/BelltowerSphinx.java
+++ b/Mage.Sets/src/mage/cards/b/BelltowerSphinx.java
@@ -1,7 +1,5 @@
-
package mage.cards.b;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.dynamicvalue.common.StaticValue;
@@ -18,19 +16,23 @@ import mage.game.events.GameEvent.EventType;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
* @author nantuko
*/
public final class BelltowerSphinx extends CardImpl {
public BelltowerSphinx(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}");
this.subtype.add(SubType.SPHINX);
this.power = new MageInt(2);
this.toughness = new MageInt(5);
+ // Flying
this.addAbility(FlyingAbility.getInstance());
+
// Whenever a source deals damage to Belltower Sphinx, that source's controller puts that many cards from the top of their library into their graveyard.
this.addAbility(new BelltowerSphinxEffect());
}
diff --git a/Mage.Sets/src/mage/cards/b/BenBenAkkiHermit.java b/Mage.Sets/src/mage/cards/b/BenBenAkkiHermit.java
index c8b93e3272e..a32d8b03f08 100644
--- a/Mage.Sets/src/mage/cards/b/BenBenAkkiHermit.java
+++ b/Mage.Sets/src/mage/cards/b/BenBenAkkiHermit.java
@@ -30,7 +30,7 @@ public final class BenBenAkkiHermit extends CardImpl {
private static final FilterLandPermanent filter = new FilterLandPermanent("untapped Mountain you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.MOUNTAIN));
}
diff --git a/Mage.Sets/src/mage/cards/b/BenalishMissionary.java b/Mage.Sets/src/mage/cards/b/BenalishMissionary.java
index d0d4b011fe0..952a930598f 100644
--- a/Mage.Sets/src/mage/cards/b/BenalishMissionary.java
+++ b/Mage.Sets/src/mage/cards/b/BenalishMissionary.java
@@ -27,7 +27,7 @@ public final class BenalishMissionary extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("blocked creature");
static {
- filter.add(new BlockedPredicate());
+ filter.add(BlockedPredicate.instance);
}
public BenalishMissionary(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BenthicBiomancer.java b/Mage.Sets/src/mage/cards/b/BenthicBiomancer.java
new file mode 100644
index 00000000000..54e0b622c0b
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BenthicBiomancer.java
@@ -0,0 +1,47 @@
+package mage.cards.b;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.OneOrMoreCountersAddedTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.discard.DiscardControllerEffect;
+import mage.abilities.keyword.AdaptAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BenthicBiomancer extends CardImpl {
+
+ public BenthicBiomancer(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}");
+
+ this.subtype.add(SubType.MERFOLK);
+ this.subtype.add(SubType.WIZARD);
+ this.subtype.add(SubType.MUTANT);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {1}{U}: Adapt 1.
+ this.addAbility(new AdaptAbility(1, "{1}{U}"));
+
+ // Whenever one or more +1/+1 counters are put on Benthic Biomancer, draw a card, then discard a card.
+ Ability ability = new OneOrMoreCountersAddedTriggeredAbility(new DrawCardSourceControllerEffect(1));
+ ability.addEffect(new DiscardControllerEffect(1).setText(", then discard a card"));
+ this.addAbility(ability);
+ }
+
+ private BenthicBiomancer(final BenthicBiomancer card) {
+ super(card);
+ }
+
+ @Override
+ public BenthicBiomancer copy() {
+ return new BenthicBiomancer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/Benthicore.java b/Mage.Sets/src/mage/cards/b/Benthicore.java
index 9ca093b8612..48424e9d860 100644
--- a/Mage.Sets/src/mage/cards/b/Benthicore.java
+++ b/Mage.Sets/src/mage/cards/b/Benthicore.java
@@ -33,7 +33,7 @@ public final class Benthicore extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Merfolk you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.MERFOLK));
}
diff --git a/Mage.Sets/src/mage/cards/b/Berserk.java b/Mage.Sets/src/mage/cards/b/Berserk.java
index 3d38da94d83..d1f990e57e3 100644
--- a/Mage.Sets/src/mage/cards/b/Berserk.java
+++ b/Mage.Sets/src/mage/cards/b/Berserk.java
@@ -1,7 +1,6 @@
package mage.cards.b;
-import java.util.UUID;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
@@ -26,8 +25,9 @@ import mage.target.targetpointer.FixedTarget;
import mage.watchers.Watcher;
import mage.watchers.common.AttackedThisTurnWatcher;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class Berserk extends CardImpl {
@@ -43,7 +43,7 @@ public final class Berserk extends CardImpl {
Effect effect = new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn);
effect.setText("Target creature gains trample");
this.getSpellAbility().addEffect(effect);
- effect = new BoostTargetEffect(new TargetPermanentPowerCount(), new StaticValue(0), Duration.EndOfTurn, true);
+ effect = new BoostTargetEffect(TargetPermanentPowerCount.instance, new StaticValue(0), Duration.EndOfTurn, true);
effect.setText("and gets +X/+0 until end of turn, where X is its power");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addEffect(new BerserkDestroyEffect());
@@ -76,7 +76,7 @@ class BerserkReplacementEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == GameEvent.EventType.CAST_SPELL && event.getSourceId().equals(source.getSourceId())) {
- CombatDamageStepStartedWatcher watcher = (CombatDamageStepStartedWatcher) game.getState().getWatchers().get(CombatDamageStepStartedWatcher.class.getSimpleName());
+ CombatDamageStepStartedWatcher watcher = game.getState().getWatcher(CombatDamageStepStartedWatcher.class);
return watcher == null || watcher.conditionMet();
}
return false;
@@ -96,7 +96,7 @@ class BerserkReplacementEffect extends ContinuousRuleModifyingEffectImpl {
class CombatDamageStepStartedWatcher extends Watcher {
public CombatDamageStepStartedWatcher() {
- super(CombatDamageStepStartedWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(CombatDamageStepStartedWatcher.class, WatcherScope.GAME);
}
public CombatDamageStepStartedWatcher(final CombatDamageStepStartedWatcher watcher) {
@@ -170,11 +170,9 @@ class BerserkDelayedDestroyEffect extends OneShotEffect {
if (controller != null) {
Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source));
if (permanent != null) {
- Watcher watcher = game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
- if (watcher instanceof AttackedThisTurnWatcher) {
- if (((AttackedThisTurnWatcher) watcher).getAttackedThisTurnCreatures().contains(new MageObjectReference(permanent, game))) {
- return permanent.destroy(source.getSourceId(), game, false);
- }
+ AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
+ if (watcher.getAttackedThisTurnCreatures().contains(new MageObjectReference(permanent, game))) {
+ return permanent.destroy(source.getSourceId(), game, false);
}
}
}
diff --git a/Mage.Sets/src/mage/cards/b/Betrayal.java b/Mage.Sets/src/mage/cards/b/Betrayal.java
index 46d61656e4a..89f60dd1d12 100644
--- a/Mage.Sets/src/mage/cards/b/Betrayal.java
+++ b/Mage.Sets/src/mage/cards/b/Betrayal.java
@@ -1,7 +1,5 @@
-
package mage.cards.b;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BecomesTappedAttachedTriggeredAbility;
import mage.abilities.effects.common.AttachEffect;
@@ -18,8 +16,9 @@ import mage.filter.predicate.permanent.ControllerPredicate;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author LoneFox
*/
public final class Betrayal extends CardImpl {
@@ -31,7 +30,7 @@ public final class Betrayal extends CardImpl {
}
public Betrayal(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}");
this.subtype.add(SubType.AURA);
// Enchant creature an opponent controls
@@ -40,8 +39,9 @@ public final class Betrayal extends CardImpl {
this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
Ability ability = new EnchantAbility(auraTarget.getTargetName());
this.addAbility(ability);
+
// Whenever enchanted creature becomes tapped, you draw a card.
- this.addAbility(new BecomesTappedAttachedTriggeredAbility(new DrawCardSourceControllerEffect(1), "enchanted creature"));
+ this.addAbility(new BecomesTappedAttachedTriggeredAbility(new DrawCardSourceControllerEffect(1, "you"), "enchanted creature"));
}
public Betrayal(final Betrayal card) {
diff --git a/Mage.Sets/src/mage/cards/b/BetrothedOfFire.java b/Mage.Sets/src/mage/cards/b/BetrothedOfFire.java
index 95fbfb8440f..bb4ac7ecfb6 100644
--- a/Mage.Sets/src/mage/cards/b/BetrothedOfFire.java
+++ b/Mage.Sets/src/mage/cards/b/BetrothedOfFire.java
@@ -32,7 +32,7 @@ public final class BetrothedOfFire extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("an untapped creature");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public BetrothedOfFire(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/Bifurcate.java b/Mage.Sets/src/mage/cards/b/Bifurcate.java
index 4faba2a2605..397ab59792e 100644
--- a/Mage.Sets/src/mage/cards/b/Bifurcate.java
+++ b/Mage.Sets/src/mage/cards/b/Bifurcate.java
@@ -29,7 +29,7 @@ public final class Bifurcate extends CardImpl {
private static FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creatures");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public Bifurcate(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BindingMummy.java b/Mage.Sets/src/mage/cards/b/BindingMummy.java
index 7ebaf193383..69217bf9a99 100644
--- a/Mage.Sets/src/mage/cards/b/BindingMummy.java
+++ b/Mage.Sets/src/mage/cards/b/BindingMummy.java
@@ -26,7 +26,7 @@ public final class BindingMummy extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.ZOMBIE));
}
diff --git a/Mage.Sets/src/mage/cards/b/BiogenicOoze.java b/Mage.Sets/src/mage/cards/b/BiogenicOoze.java
new file mode 100644
index 00000000000..7f6d1b87f4b
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BiogenicOoze.java
@@ -0,0 +1,67 @@
+package mage.cards.b;
+
+import mage.MageInt;
+import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.counter.AddCountersAllEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+import mage.counters.CounterType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.permanent.token.BiogenicOozeToken;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BiogenicOoze extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterControlledPermanent("Ooze you control");
+
+ static {
+ filter.add(new SubtypePredicate(SubType.OOZE));
+ }
+
+ public BiogenicOoze(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
+
+ this.subtype.add(SubType.OOZE);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // When Biogenic Ooze enters the battlefield, create a 2/2 green Ooze creature token.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new CreateTokenEffect(new BiogenicOozeToken())
+ ));
+
+ // At the beginning if your end step, put a +1/+1 counter on each Ooze you control.
+ this.addAbility(new BeginningOfEndStepTriggeredAbility(
+ new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter),
+ TargetController.YOU, false
+ ));
+
+ // {1}{G}{G}{G}: Create a 2/2 green Ooze creature token.
+ this.addAbility(new SimpleActivatedAbility(
+ new CreateTokenEffect(new BiogenicOozeToken()),
+ new ManaCostsImpl("{1}{G}{G}{G}")
+ ));
+ }
+
+ private BiogenicOoze(final BiogenicOoze card) {
+ super(card);
+ }
+
+ @Override
+ public BiogenicOoze copy() {
+ return new BiogenicOoze(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/BiogenicUpgrade.java b/Mage.Sets/src/mage/cards/b/BiogenicUpgrade.java
new file mode 100644
index 00000000000..8d0622f6e4d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BiogenicUpgrade.java
@@ -0,0 +1,78 @@
+package mage.cards.b;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.abilities.effects.common.counter.DistributeCountersEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCreaturePermanentAmount;
+import mage.target.targetpointer.FixedTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BiogenicUpgrade extends CardImpl {
+
+ public BiogenicUpgrade(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}{G}");
+
+ // Distribute three +1/+1 counters among one, two, or three target creatures, then double the number of +1/+1 counters on each of those creatures.
+ this.getSpellAbility().addEffect(new DistributeCountersEffect(
+ CounterType.P1P1, 3, false,
+ "one, two, or three target creatures"
+ ));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(3));
+ this.getSpellAbility().addEffect(new BiogenicUpgradeEffect());
+ }
+
+ private BiogenicUpgrade(final BiogenicUpgrade card) {
+ super(card);
+ }
+
+ @Override
+ public BiogenicUpgrade copy() {
+ return new BiogenicUpgrade(this);
+ }
+}
+
+class BiogenicUpgradeEffect extends OneShotEffect {
+
+ BiogenicUpgradeEffect() {
+ super(Outcome.Benefit);
+ staticText = ", then double the number of +1/+1 counters on each of those creatures.";
+ }
+
+ private BiogenicUpgradeEffect(final BiogenicUpgradeEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BiogenicUpgradeEffect copy() {
+ return new BiogenicUpgradeEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ for (UUID permanentId : source.getTargets().get(0).getTargets()) {
+ Permanent permanent = game.getPermanent(permanentId);
+ if (permanent == null) {
+ continue;
+ }
+ Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(
+ permanent.getCounters(game).getCount(CounterType.P1P1)
+ ));
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ effect.apply(game, source);
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/b/BiomancersFamiliar.java b/Mage.Sets/src/mage/cards/b/BiomancersFamiliar.java
new file mode 100644
index 00000000000..4adf05b96ef
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BiomancersFamiliar.java
@@ -0,0 +1,159 @@
+package mage.cards.b;
+
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.ActivatedAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.effects.common.cost.CostModificationEffectImpl;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.choices.ChoiceImpl;
+import mage.constants.*;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCreaturePermanent;
+import mage.util.CardUtil;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BiomancersFamiliar extends CardImpl {
+
+ public BiomancersFamiliar(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{U}");
+
+ this.subtype.add(SubType.MUTANT);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Activated abilities of creatures you control cost {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BiomancersFamiliarCostReductionEffect()));
+
+ // {T}: The next time target creature adapts this turn, it adapts as though it had no +1/+1 counters on it.
+ Ability ability = new SimpleActivatedAbility(
+ new BiomancersFamiliarReplacementEffect(), new TapSourceCost()
+ );
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ private BiomancersFamiliar(final BiomancersFamiliar card) {
+ super(card);
+ }
+
+ @Override
+ public BiomancersFamiliar copy() {
+ return new BiomancersFamiliar(this);
+ }
+}
+
+class BiomancersFamiliarCostReductionEffect extends CostModificationEffectImpl {
+
+ private static final String effectText = "Activated abilities of creatures you control cost {2} less to activate. " +
+ "This effect can't reduce the amount of mana an ability costs to activate to less than one mana";
+
+ BiomancersFamiliarCostReductionEffect() {
+ super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST);
+ staticText = effectText;
+ }
+
+ private BiomancersFamiliarCostReductionEffect(final BiomancersFamiliarCostReductionEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source, Ability abilityToModify) {
+ Player controller = game.getPlayer(abilityToModify.getControllerId());
+ if (controller != null) {
+ Mana mana = abilityToModify.getManaCostsToPay().getMana();
+ int reduceMax = mana.getGeneric();
+ if (reduceMax > 0 && mana.count() == mana.getGeneric()) {
+ reduceMax--;
+ }
+ if (reduceMax > 2) {
+ reduceMax = 2;
+ }
+ if (reduceMax > 0) {
+ ChoiceImpl choice = new ChoiceImpl(true);
+ Set set = new LinkedHashSet<>();
+
+ for (int i = 0; i <= reduceMax; i++) {
+ set.add(String.valueOf(i));
+ }
+ choice.setChoices(set);
+ choice.setMessage("Reduce ability cost");
+ if (!controller.choose(Outcome.Benefit, choice, game)) {
+ return false;
+ }
+ int reduce = Integer.parseInt(choice.getChoice());
+ CardUtil.reduceCost(abilityToModify, reduce);
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean applies(Ability abilityToModify, Ability source, Game game) {
+ if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED
+ || (abilityToModify.getAbilityType() == AbilityType.MANA && abilityToModify instanceof ActivatedAbility)) {
+ //Activated abilities of creatures you control
+ Permanent permanent = game.getPermanent(abilityToModify.getSourceId());
+ if (permanent != null && permanent.isControlledBy(source.getControllerId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public BiomancersFamiliarCostReductionEffect copy() {
+ return new BiomancersFamiliarCostReductionEffect(this);
+ }
+}
+
+class BiomancersFamiliarReplacementEffect extends ReplacementEffectImpl {
+
+ BiomancersFamiliarReplacementEffect() {
+ super(Duration.EndOfTurn, Outcome.Benefit);
+ staticText = "The next time target creature adapts this turn, " +
+ "it adapts as though it had no +1/+1 counters on it.";
+ }
+
+ private BiomancersFamiliarReplacementEffect(final BiomancersFamiliarReplacementEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BiomancersFamiliarReplacementEffect copy() {
+ return new BiomancersFamiliarReplacementEffect(this);
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ADAPT;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ return event.getTargetId().equals(targetPointer.getFirst(game, source));
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ event.setFlag(true);
+ discard();
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/b/BiomassMutation.java b/Mage.Sets/src/mage/cards/b/BiomassMutation.java
index eaf52684665..cbd6af34074 100644
--- a/Mage.Sets/src/mage/cards/b/BiomassMutation.java
+++ b/Mage.Sets/src/mage/cards/b/BiomassMutation.java
@@ -22,7 +22,7 @@ public final class BiomassMutation extends CardImpl {
// Creatures you control have base power and toughness X/X until end of turn.
- DynamicValue variableMana = new ManacostVariableValue();
+ DynamicValue variableMana = ManacostVariableValue.instance;
this.getSpellAbility().addEffect(new SetPowerToughnessAllEffect(variableMana, variableMana, Duration.EndOfTurn, new FilterControlledCreaturePermanent("Creatures you control"), true));
}
diff --git a/Mage.Sets/src/mage/cards/b/BirchloreRangers.java b/Mage.Sets/src/mage/cards/b/BirchloreRangers.java
index c6ff1dbc105..749f216e295 100644
--- a/Mage.Sets/src/mage/cards/b/BirchloreRangers.java
+++ b/Mage.Sets/src/mage/cards/b/BirchloreRangers.java
@@ -26,7 +26,7 @@ public final class BirchloreRangers extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Elves you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.ELF));
}
diff --git a/Mage.Sets/src/mage/cards/b/BirthingPod.java b/Mage.Sets/src/mage/cards/b/BirthingPod.java
index 2242e3886d6..179040611b0 100644
--- a/Mage.Sets/src/mage/cards/b/BirthingPod.java
+++ b/Mage.Sets/src/mage/cards/b/BirthingPod.java
@@ -1,7 +1,6 @@
package mage.cards.b;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.Cost;
@@ -17,7 +16,7 @@ import mage.constants.ComparisonType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterCard;
-import static mage.filter.StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT;
+import mage.filter.StaticFilters;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
@@ -26,6 +25,8 @@ import mage.players.Player;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.UUID;
+
/**
* @author Loki
*/
@@ -36,9 +37,13 @@ public final class BirthingPod extends CardImpl {
// {1}{G/P}, {tap}, Sacrifice a creature: Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost,
// put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery.
- Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new BirthingPodEffect(), new ManaCostsImpl("{1}{G/P}"));
+ Ability ability = new ActivateAsSorceryActivatedAbility(
+ Zone.BATTLEFIELD, new BirthingPodEffect(), new ManaCostsImpl("{1}{G/P}")
+ );
ability.addCost(new TapSourceCost());
- ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT)));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(
+ StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT
+ )));
this.addAbility(ability);
}
@@ -56,11 +61,12 @@ class BirthingPodEffect extends OneShotEffect {
BirthingPodEffect() {
super(Outcome.Benefit);
- staticText = "Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card "
- + "onto the battlefield, then shuffle your library";
+ staticText = "Search your library for a creature card with converted mana cost equal to 1 " +
+ "plus the sacrificed creature's converted mana cost, put that card " +
+ "onto the battlefield, then shuffle your library";
}
- BirthingPodEffect(final BirthingPodEffect effect) {
+ private BirthingPodEffect(final BirthingPodEffect effect) {
super(effect);
}
@@ -77,20 +83,20 @@ class BirthingPodEffect extends OneShotEffect {
}
}
Player controller = game.getPlayer(source.getControllerId());
- if (sacrificedPermanent != null && controller != null) {
- int newConvertedCost = sacrificedPermanent.getConvertedManaCost() + 1;
- FilterCard filter = new FilterCard("creature card with converted mana cost " + newConvertedCost);
- filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, newConvertedCost));
- filter.add(new CardTypePredicate(CardType.CREATURE));
- TargetCardInLibrary target = new TargetCardInLibrary(filter);
- if (controller.searchLibrary(target, game)) {
- Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
- controller.moveCards(card, Zone.BATTLEFIELD, source, game);
- }
- controller.shuffleLibrary(source, game);
- return true;
+ if (sacrificedPermanent == null || controller == null) {
+ return false;
}
- return false;
+ int newConvertedCost = sacrificedPermanent.getConvertedManaCost() + 1;
+ FilterCard filter = new FilterCard("creature card with converted mana cost " + newConvertedCost);
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, newConvertedCost));
+ filter.add(new CardTypePredicate(CardType.CREATURE));
+ TargetCardInLibrary target = new TargetCardInLibrary(filter);
+ if (controller.searchLibrary(target, game)) {
+ Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
+ }
+ controller.shuffleLibrary(source, game);
+ return true;
}
@Override
diff --git a/Mage.Sets/src/mage/cards/b/BlackManaBattery.java b/Mage.Sets/src/mage/cards/b/BlackManaBattery.java
index 2423fc449b4..0aa099282e4 100644
--- a/Mage.Sets/src/mage/cards/b/BlackManaBattery.java
+++ b/Mage.Sets/src/mage/cards/b/BlackManaBattery.java
@@ -36,7 +36,7 @@ public final class BlackManaBattery extends CardImpl {
// {tap}, Remove any number of charge counters from Black Mana Battery: Add {B}, then add an additional {B} for each charge counter removed this way.
ability = new DynamicManaAbility(
Mana.BlackMana(1),
- new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
+ new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance),
new TapSourceCost(),
"Add {B}, then add {B} for each charge counter removed this way",
true, new CountersSourceCount(CounterType.CHARGE));
diff --git a/Mage.Sets/src/mage/cards/b/BlackOakOfOdunos.java b/Mage.Sets/src/mage/cards/b/BlackOakOfOdunos.java
index c27c99be182..22ef04c4630 100644
--- a/Mage.Sets/src/mage/cards/b/BlackOakOfOdunos.java
+++ b/Mage.Sets/src/mage/cards/b/BlackOakOfOdunos.java
@@ -30,8 +30,8 @@ public final class BlackOakOfOdunos extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another untapped creature you control");
static {
- filter.add(new AnotherPredicate());
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public BlackOakOfOdunos(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BladeJuggler.java b/Mage.Sets/src/mage/cards/b/BladeJuggler.java
new file mode 100644
index 00000000000..a9c5e82aee6
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BladeJuggler.java
@@ -0,0 +1,49 @@
+package mage.cards.b;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DamageControllerEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.SpectacleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BladeJuggler extends CardImpl {
+
+ public BladeJuggler(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.ROGUE);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Spectacle {2}{B}
+ this.addAbility(new SpectacleAbility(this, new ManaCostsImpl("{2}{B}")));
+
+ // When Blade Juggler enters the battlefield, it deals 1 damage to you and you draw a card.
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new DamageControllerEffect(1, "it")
+ );
+ ability.addEffect(new DrawCardSourceControllerEffect(1).setText("and you draw a card"));
+ this.addAbility(ability);
+ }
+
+ private BladeJuggler(final BladeJuggler card) {
+ super(card);
+ }
+
+ @Override
+ public BladeJuggler copy() {
+ return new BladeJuggler(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/Bladebrand.java b/Mage.Sets/src/mage/cards/b/Bladebrand.java
new file mode 100644
index 00000000000..472d4cc8092
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/Bladebrand.java
@@ -0,0 +1,40 @@
+package mage.cards.b;
+
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Bladebrand extends CardImpl {
+
+ public Bladebrand(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}");
+
+ // Target creature gains deathtouch until end of turn.
+ this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
+ DeathtouchAbility.getInstance(), Duration.EndOfTurn
+ ));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Draw a card.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+ }
+
+ private Bladebrand(final Bladebrand card) {
+ super(card);
+ }
+
+ @Override
+ public Bladebrand copy() {
+ return new Bladebrand(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/BlaringCaptain.java b/Mage.Sets/src/mage/cards/b/BlaringCaptain.java
index ab763490784..3a4c55c65cb 100644
--- a/Mage.Sets/src/mage/cards/b/BlaringCaptain.java
+++ b/Mage.Sets/src/mage/cards/b/BlaringCaptain.java
@@ -23,7 +23,7 @@ public final class BlaringCaptain extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.WARRIOR, "attacking Warriors");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public BlaringCaptain(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BlatantThievery.java b/Mage.Sets/src/mage/cards/b/BlatantThievery.java
index 39bfb83a74c..3a65bbec7d5 100644
--- a/Mage.Sets/src/mage/cards/b/BlatantThievery.java
+++ b/Mage.Sets/src/mage/cards/b/BlatantThievery.java
@@ -1,9 +1,7 @@
-
package mage.cards.b;
import java.util.*;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
@@ -18,6 +16,7 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.FixedTarget;
/**
@@ -31,34 +30,37 @@ public final class BlatantThievery extends CardImpl {
// For each opponent, gain control of target permanent that player controls.
this.getSpellAbility().addEffect(new BlatantThieveryEffect());
+ this.getSpellAbility().setTargetAdjuster(BlatantThieveryAdjuster.instance);
}
public BlatantThievery(final BlatantThievery card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- FilterPermanent filter = new FilterPermanent("Permanent of player " + opponent.getName());
- filter.add(new ControllerIdPredicate(opponentId));
- TargetPermanent targetPermanent = new TargetPermanent(filter);
- ability.addTarget(targetPermanent);
- }
- }
- }
- }
-
@Override
public BlatantThievery copy() {
return new BlatantThievery(this);
}
}
+enum BlatantThieveryAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null) {
+ FilterPermanent filter = new FilterPermanent("Permanent of player " + opponent.getName());
+ filter.add(new ControllerIdPredicate(opponentId));
+ TargetPermanent targetPermanent = new TargetPermanent(filter);
+ ability.addTarget(targetPermanent);
+ }
+ }
+ }
+}
+
class BlatantThieveryEffect extends OneShotEffect {
BlatantThieveryEffect() {
diff --git a/Mage.Sets/src/mage/cards/b/Blaze.java b/Mage.Sets/src/mage/cards/b/Blaze.java
index bbeead84810..d2b4c019217 100644
--- a/Mage.Sets/src/mage/cards/b/Blaze.java
+++ b/Mage.Sets/src/mage/cards/b/Blaze.java
@@ -20,7 +20,7 @@ public final class Blaze extends CardImpl {
// Blaze deals X damage to any target.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetAnyTarget());
}
diff --git a/Mage.Sets/src/mage/cards/b/BlazingShoal.java b/Mage.Sets/src/mage/cards/b/BlazingShoal.java
index 79e19d154d5..9f6238b97e4 100644
--- a/Mage.Sets/src/mage/cards/b/BlazingShoal.java
+++ b/Mage.Sets/src/mage/cards/b/BlazingShoal.java
@@ -38,7 +38,7 @@ public final class BlazingShoal extends CardImpl {
this.addAbility(new AlternativeCostSourceAbility(new ExileFromHandCost(new TargetCardInHand(filter),true)));
// Target creature gets +X/+0 until end of turn.
- this.getSpellAbility().addEffect(new BoostTargetEffect(new ExileFromHandCostCardConvertedMana(), new StaticValue(0), Duration.EndOfTurn));
+ this.getSpellAbility().addEffect(new BoostTargetEffect(ExileFromHandCostCardConvertedMana.instance, new StaticValue(0), Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/b/BlindSpotGiant.java b/Mage.Sets/src/mage/cards/b/BlindSpotGiant.java
index 52688ab0cfb..bb9a88fe7f6 100644
--- a/Mage.Sets/src/mage/cards/b/BlindSpotGiant.java
+++ b/Mage.Sets/src/mage/cards/b/BlindSpotGiant.java
@@ -25,7 +25,7 @@ public final class BlindSpotGiant extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.GIANT));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BlindSpotGiant(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BlistercoilWeird.java b/Mage.Sets/src/mage/cards/b/BlistercoilWeird.java
index e454c0342dd..8321019952a 100644
--- a/Mage.Sets/src/mage/cards/b/BlistercoilWeird.java
+++ b/Mage.Sets/src/mage/cards/b/BlistercoilWeird.java
@@ -1,7 +1,5 @@
-
package mage.cards.b;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
@@ -14,22 +12,23 @@ import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
+import java.util.UUID;
+
/**
* @author LevelX2
*/
public final class BlistercoilWeird extends CardImpl {
-
- public BlistercoilWeird(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U/R}");
- this.subtype.add(SubType.WEIRD);
+ public BlistercoilWeird(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U/R}");
+ this.subtype.add(SubType.WEIRD);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Whenever you cast an instant or sorcery spell, Blistercoil Weird gets +1/+1 until end of turn. Untap it.
- Ability ability = new SpellCastControllerTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY, false);
+ Ability ability = new SpellCastControllerTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false);
ability.addEffect(new UntapSourceEffect());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/b/Blockbuster.java b/Mage.Sets/src/mage/cards/b/Blockbuster.java
index 3dbb960768c..174ebca05f5 100644
--- a/Mage.Sets/src/mage/cards/b/Blockbuster.java
+++ b/Mage.Sets/src/mage/cards/b/Blockbuster.java
@@ -23,7 +23,7 @@ public final class Blockbuster extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public Blockbuster(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BloodChinFanatic.java b/Mage.Sets/src/mage/cards/b/BloodChinFanatic.java
index 5ad22400d94..a05a7f28575 100644
--- a/Mage.Sets/src/mage/cards/b/BloodChinFanatic.java
+++ b/Mage.Sets/src/mage/cards/b/BloodChinFanatic.java
@@ -31,7 +31,7 @@ public final class BloodChinFanatic extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another Warrior creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.WARRIOR));
}
@@ -42,9 +42,9 @@ public final class BloodChinFanatic extends CardImpl {
this.toughness = new MageInt(3);
// {1}{B}, Sacrifice another Warrior creature: Target player loses X life and you gain X life, where X is the sacrificed creature's power.
- Effect effect = new LoseLifeTargetEffect(new SacrificeCostCreaturesPower());
+ Effect effect = new LoseLifeTargetEffect(SacrificeCostCreaturesPower.instance);
effect.setText("Target player loses X life");
- Effect effect2 = new GainLifeEffect(new SacrificeCostCreaturesPower());
+ Effect effect2 = new GainLifeEffect(SacrificeCostCreaturesPower.instance);
effect2.setText("and you gain X life, where X is the sacrificed creature's power");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{B}"));
ability.addEffect(effect2);
diff --git a/Mage.Sets/src/mage/cards/b/BloodMoon.java b/Mage.Sets/src/mage/cards/b/BloodMoon.java
index ca52c9989c7..1eef0357ac4 100644
--- a/Mage.Sets/src/mage/cards/b/BloodMoon.java
+++ b/Mage.Sets/src/mage/cards/b/BloodMoon.java
@@ -1,11 +1,14 @@
-
package mage.cards.b;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.GreenManaAbility;
import mage.abilities.mana.RedManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@@ -22,7 +25,7 @@ import mage.game.permanent.Permanent;
public final class BloodMoon extends CardImpl {
public BloodMoon(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}");
// Nonbasic lands are Mountains.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BloodMoonEffect()));
@@ -72,12 +75,28 @@ class BloodMoonEffect extends ContinuousEffectImpl {
case TypeChangingEffects_4:
// 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(game).removeAll(SubType.getLandTypes(false));
+ //land.getSubtype(game).removeAll(SubType.getLandTypes(false));
+ land.getSubtype(game).clear();
land.getSubtype(game).add(SubType.MOUNTAIN);
+ land.removeAllAbilities(source.getSourceId(), game);
break;
case AbilityAddingRemovingEffects_6:
- land.addAbility(new RedManaAbility(), source.getSourceId(), game);
+ land.removeAllAbilities(source.getSourceId(), game);
+ if (land.getSubtype(game).contains(SubType.FOREST)) {
+ land.addAbility(new GreenManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.PLAINS)) {
+ land.addAbility(new WhiteManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.MOUNTAIN)) {
+ land.addAbility(new RedManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.ISLAND)) {
+ land.addAbility(new BlueManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.SWAMP)) {
+ land.addAbility(new BlackManaAbility(), source.getSourceId(), game);
+ }
break;
}
}
@@ -86,6 +105,7 @@ class BloodMoonEffect extends ContinuousEffectImpl {
@Override
public boolean hasLayer(Layer layer) {
- return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.TypeChangingEffects_4;
+ return layer == Layer.AbilityAddingRemovingEffects_6
+ || layer == Layer.TypeChangingEffects_4;
}
}
diff --git a/Mage.Sets/src/mage/cards/b/BloodTribute.java b/Mage.Sets/src/mage/cards/b/BloodTribute.java
index cd9587f4095..694c16ac064 100644
--- a/Mage.Sets/src/mage/cards/b/BloodTribute.java
+++ b/Mage.Sets/src/mage/cards/b/BloodTribute.java
@@ -37,7 +37,7 @@ public final class BloodTribute extends CardImpl {
TextPartSubType textPartVampire = (TextPartSubType) addTextPart(new TextPartSubType(SubType.VAMPIRE));
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped Vampire you control");
filter.add(new TextPartSubtypePredicate(textPartVampire));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
this.addAbility(new KickerAbility(new TapTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, true))));
// Target opponent loses half their life, rounded up.
diff --git a/Mage.Sets/src/mage/cards/b/Bloodbriar.java b/Mage.Sets/src/mage/cards/b/Bloodbriar.java
index f7920debb3e..644927bfcbf 100644
--- a/Mage.Sets/src/mage/cards/b/Bloodbriar.java
+++ b/Mage.Sets/src/mage/cards/b/Bloodbriar.java
@@ -25,7 +25,7 @@ public final class Bloodbriar extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public Bloodbriar(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BloodcrazedGoblin.java b/Mage.Sets/src/mage/cards/b/BloodcrazedGoblin.java
index a67946442bf..ab1708edb19 100644
--- a/Mage.Sets/src/mage/cards/b/BloodcrazedGoblin.java
+++ b/Mage.Sets/src/mage/cards/b/BloodcrazedGoblin.java
@@ -2,7 +2,6 @@
package mage.cards.b;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
@@ -17,15 +16,16 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.watchers.common.BloodthirstWatcher;
+import java.util.UUID;
+
/**
- *
* @author BetaSteward_at_googlemail.com
* @author North
*/
public final class BloodcrazedGoblin extends CardImpl {
public BloodcrazedGoblin(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.GOBLIN, SubType.BERSERKER);
this.power = new MageInt(2);
@@ -69,8 +69,8 @@ class BloodcrazedGoblinEffect extends RestrictionEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
if (permanent.getId().equals(source.getSourceId())) {
- BloodthirstWatcher watcher = (BloodthirstWatcher) game.getState().getWatchers().get(BloodthirstWatcher.class.getSimpleName(), source.getControllerId()); // BloodthirstWatcher
- return !watcher.conditionMet();
+ BloodthirstWatcher watcher = game.getState().getWatcher(BloodthirstWatcher.class, source.getControllerId()); // BloodthirstWatcher
+ return watcher != null && !watcher.conditionMet();
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/b/BloodcrazedPaladin.java b/Mage.Sets/src/mage/cards/b/BloodcrazedPaladin.java
index 979494a69d5..85cfe792f6c 100644
--- a/Mage.Sets/src/mage/cards/b/BloodcrazedPaladin.java
+++ b/Mage.Sets/src/mage/cards/b/BloodcrazedPaladin.java
@@ -34,7 +34,7 @@ public final class BloodcrazedPaladin extends CardImpl {
// Bloodcrazed Paladin enters the battlefield with a +1/+1 counter on it for each creature that died this turn.
Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance(0),
- new CreaturesDiedThisTurnCount(), true);
+ CreaturesDiedThisTurnCount.instance, true);
effect.setText("with a +1/+1 counter on it for each creature that died this turn.");
this.addAbility(new EntersBattlefieldAbility(effect), new CreaturesDiedWatcher());
}
diff --git a/Mage.Sets/src/mage/cards/b/BloodcurdlingScream.java b/Mage.Sets/src/mage/cards/b/BloodcurdlingScream.java
index 405349caa76..50d803fc36c 100644
--- a/Mage.Sets/src/mage/cards/b/BloodcurdlingScream.java
+++ b/Mage.Sets/src/mage/cards/b/BloodcurdlingScream.java
@@ -21,7 +21,7 @@ public final class BloodcurdlingScream extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{B}");
// Target creature gets +X/+0 until end of turn.
- this.getSpellAbility().addEffect(new BoostTargetEffect(new ExileFromHandCostCardConvertedMana(), new StaticValue(0), Duration.EndOfTurn));
+ this.getSpellAbility().addEffect(new BoostTargetEffect(ExileFromHandCostCardConvertedMana.instance, new StaticValue(0), Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/b/BloodhuskRitualist.java b/Mage.Sets/src/mage/cards/b/BloodhuskRitualist.java
index 4fb929dd9f9..d3cc620816a 100644
--- a/Mage.Sets/src/mage/cards/b/BloodhuskRitualist.java
+++ b/Mage.Sets/src/mage/cards/b/BloodhuskRitualist.java
@@ -32,7 +32,7 @@ public final class BloodhuskRitualist extends CardImpl {
this.addAbility(new MultikickerAbility("{B}"));
// When Bloodhusk Ritualist enters the battlefield, target opponent discards a card for each time it was kicked.
- Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(new MultikickerCount()));
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DiscardTargetEffect(MultikickerCount.instance));
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/b/BloodlordOfVaasgoth.java b/Mage.Sets/src/mage/cards/b/BloodlordOfVaasgoth.java
index adad0809f7d..5e951498c36 100644
--- a/Mage.Sets/src/mage/cards/b/BloodlordOfVaasgoth.java
+++ b/Mage.Sets/src/mage/cards/b/BloodlordOfVaasgoth.java
@@ -1,7 +1,6 @@
package mage.cards.b;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
@@ -18,6 +17,8 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
+import java.util.UUID;
+
/**
* @author nantuko
*/
@@ -31,7 +32,7 @@ public final class BloodlordOfVaasgoth extends CardImpl {
}
public BloodlordOfVaasgoth(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.subtype.add(SubType.VAMPIRE, SubType.WARRIOR);
this.power = new MageInt(3);
@@ -47,7 +48,7 @@ public final class BloodlordOfVaasgoth extends CardImpl {
this.addAbility(new SpellCastControllerTriggeredAbility(new BloodlordOfVaasgothEffect(), filter, false, true));
}
- public BloodlordOfVaasgoth(final BloodlordOfVaasgoth card) {
+ private BloodlordOfVaasgoth(final BloodlordOfVaasgoth card) {
super(card);
}
@@ -63,12 +64,12 @@ class BloodlordOfVaasgothEffect extends ContinuousEffectImpl {
private int zoneChangeCounter;
private UUID permanentId;
- public BloodlordOfVaasgothEffect() {
+ BloodlordOfVaasgothEffect() {
super(Duration.OneUse, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
staticText = "it gains bloodthirst 3";
}
- public BloodlordOfVaasgothEffect(final BloodlordOfVaasgothEffect effect) {
+ private BloodlordOfVaasgothEffect(final BloodlordOfVaasgothEffect effect) {
super(effect);
this.ability = effect.ability.copy();
this.zoneChangeCounter = effect.zoneChangeCounter;
@@ -95,7 +96,6 @@ class BloodlordOfVaasgothEffect extends ContinuousEffectImpl {
Permanent permanent = game.getPermanent(permanentId);
if (permanent != null && permanent.getZoneChangeCounter(game) <= zoneChangeCounter) {
permanent.addAbility(ability, source.getSourceId(), game);
- return true;
} else {
if (game.getState().getZoneChangeCounter(permanentId) >= zoneChangeCounter) {
discard();
diff --git a/Mage.Sets/src/mage/cards/b/BloodmistInfiltrator.java b/Mage.Sets/src/mage/cards/b/BloodmistInfiltrator.java
new file mode 100644
index 00000000000..1a523bb7395
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BloodmistInfiltrator.java
@@ -0,0 +1,54 @@
+package mage.cards.b;
+
+import mage.MageInt;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.common.TargetControlledPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BloodmistInfiltrator extends CardImpl {
+
+ private static final FilterControlledPermanent filter
+ = new FilterControlledCreaturePermanent("another creature");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
+
+ public BloodmistInfiltrator(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
+
+ this.subtype.add(SubType.VAMPIRE);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // Whenever Bloodmist Infiltrator attacks, you may sacrifice another creature. If you do, Bloodmist Infiltrator can't be blocked this turn.
+ this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
+ new CantBeBlockedSourceEffect(Duration.EndOfTurn),
+ new SacrificeTargetCost(new TargetControlledPermanent(filter))
+ ), false));
+ }
+
+ private BloodmistInfiltrator(final BloodmistInfiltrator card) {
+ super(card);
+ }
+
+ @Override
+ public BloodmistInfiltrator copy() {
+ return new BloodmistInfiltrator(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/BloodshotCyclops.java b/Mage.Sets/src/mage/cards/b/BloodshotCyclops.java
index 80aa19dbbb8..7cbe947de4d 100644
--- a/Mage.Sets/src/mage/cards/b/BloodshotCyclops.java
+++ b/Mage.Sets/src/mage/cards/b/BloodshotCyclops.java
@@ -33,7 +33,7 @@ public final class BloodshotCyclops extends CardImpl {
// {T}, Sacrifice a creature: Bloodshot Cyclops deals damage equal to the sacrificed
// creature's power to any target.
SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
- new DamageTargetEffect(new SacrificeCostCreaturesPower()),
+ new DamageTargetEffect(SacrificeCostCreaturesPower.instance),
new TapSourceCost());
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT)));
ability.addTarget(new TargetAnyTarget());
diff --git a/Mage.Sets/src/mage/cards/b/BloodswornSteward.java b/Mage.Sets/src/mage/cards/b/BloodswornSteward.java
index e9070d6d069..21ed7ccdc95 100644
--- a/Mage.Sets/src/mage/cards/b/BloodswornSteward.java
+++ b/Mage.Sets/src/mage/cards/b/BloodswornSteward.java
@@ -27,7 +27,7 @@ public final class BloodswornSteward extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("Commander creatures");
static {
- filter.add(new CommanderPredicate());
+ filter.add(CommanderPredicate.instance);
}
public BloodswornSteward(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BlueManaBattery.java b/Mage.Sets/src/mage/cards/b/BlueManaBattery.java
index 9283e18893c..05ad3bfc873 100644
--- a/Mage.Sets/src/mage/cards/b/BlueManaBattery.java
+++ b/Mage.Sets/src/mage/cards/b/BlueManaBattery.java
@@ -36,7 +36,7 @@ public final class BlueManaBattery extends CardImpl {
// {tap}, Remove any number of charge counters from Blue Mana Battery: Add {U}, then add an additional {U} for each charge counter removed this way.
ability = new DynamicManaAbility(
Mana.BlueMana(1),
- new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
+ new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance),
new TapSourceCost(),
"Add {U}, then add {U} for each charge counter removed this way",
true, new CountersSourceCount(CounterType.CHARGE));
diff --git a/Mage.Sets/src/mage/cards/b/BlueSunsZenith.java b/Mage.Sets/src/mage/cards/b/BlueSunsZenith.java
index 72d74af31fb..2e94941db50 100644
--- a/Mage.Sets/src/mage/cards/b/BlueSunsZenith.java
+++ b/Mage.Sets/src/mage/cards/b/BlueSunsZenith.java
@@ -21,7 +21,7 @@ public final class BlueSunsZenith extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{U}{U}{U}");
// Target player draws X cards. Shuffle Blue Sun's Zenith into its owner's library.
- this.getSpellAbility().addEffect(new DrawCardTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DrawCardTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addEffect(ShuffleSpellEffect.getInstance());
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/b/BoardTheWeatherlight.java b/Mage.Sets/src/mage/cards/b/BoardTheWeatherlight.java
index 7b232219997..cebfdf8ec6f 100644
--- a/Mage.Sets/src/mage/cards/b/BoardTheWeatherlight.java
+++ b/Mage.Sets/src/mage/cards/b/BoardTheWeatherlight.java
@@ -19,7 +19,7 @@ public final class BoardTheWeatherlight extends CardImpl {
private static final FilterCard filter = new FilterCard("a historic card");
static {
- filter.add(new HistoricPredicate());
+ filter.add(HistoricPredicate.instance);
}
public BoardTheWeatherlight(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BolracClanCrusher.java b/Mage.Sets/src/mage/cards/b/BolracClanCrusher.java
new file mode 100644
index 00000000000..5b41bafcf18
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BolracClanCrusher.java
@@ -0,0 +1,47 @@
+package mage.cards.b;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.RemoveCounterCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.counters.CounterType;
+import mage.target.common.TargetAnyTarget;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BolracClanCrusher extends CardImpl {
+
+ public BolracClanCrusher(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{G}");
+
+ this.subtype.add(SubType.OGRE);
+ this.subtype.add(SubType.WARRIOR);
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // {T}, Remove a +1/+1 counter from a creature you control: Bolrac-Clan Crusher deals 2 damage to any target.
+ Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(2), new TapSourceCost());
+ ability.addCost(new RemoveCounterCost(new TargetControlledCreaturePermanent(), CounterType.P1P1));
+ ability.addTarget(new TargetAnyTarget());
+ this.addAbility(ability);
+ }
+
+ private BolracClanCrusher(final BolracClanCrusher card) {
+ super(card);
+ }
+
+ @Override
+ public BolracClanCrusher copy() {
+ return new BolracClanCrusher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/BoltwingMarauder.java b/Mage.Sets/src/mage/cards/b/BoltwingMarauder.java
index 58c3574144b..230401b197f 100644
--- a/Mage.Sets/src/mage/cards/b/BoltwingMarauder.java
+++ b/Mage.Sets/src/mage/cards/b/BoltwingMarauder.java
@@ -26,7 +26,7 @@ public final class BoltwingMarauder extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature under your control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BoltwingMarauder(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BondOfAgony.java b/Mage.Sets/src/mage/cards/b/BondOfAgony.java
index 761c1ad9886..a6da60f30ec 100644
--- a/Mage.Sets/src/mage/cards/b/BondOfAgony.java
+++ b/Mage.Sets/src/mage/cards/b/BondOfAgony.java
@@ -18,7 +18,7 @@ public final class BondOfAgony extends CardImpl {
public BondOfAgony(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{B}");
- DynamicValue xValue = new ManacostVariableValue();
+ DynamicValue xValue = ManacostVariableValue.instance;
// As an additional cost to cast Bond of Agony, pay X life.
// magenoxx: here we don't use PayVariableLifeCost as {X} shouldn't actually be announced
diff --git a/Mage.Sets/src/mage/cards/b/BontuTheGlorified.java b/Mage.Sets/src/mage/cards/b/BontuTheGlorified.java
index 57662b4c40a..7ea8bac0b4f 100644
--- a/Mage.Sets/src/mage/cards/b/BontuTheGlorified.java
+++ b/Mage.Sets/src/mage/cards/b/BontuTheGlorified.java
@@ -98,7 +98,7 @@ class BontuTheGlorifiedRestrictionEffect extends RestrictionEffect {
public boolean applies(Permanent permanent, Ability source, Game game) {
if (permanent.getId().equals(source.getSourceId())) {
Player controller = game.getPlayer(source.getControllerId());
- CreaturesDiedWatcher watcher = (CreaturesDiedWatcher) game.getState().getWatchers().get(CreaturesDiedWatcher.class.getSimpleName());
+ CreaturesDiedWatcher watcher = game.getState().getWatcher(CreaturesDiedWatcher.class);
if (controller != null
&& watcher != null) {
return (watcher.getAmountOfCreaturesDiedThisTurnByController(controller.getId()) == 0);
diff --git a/Mage.Sets/src/mage/cards/b/Borrowing100000Arrows.java b/Mage.Sets/src/mage/cards/b/Borrowing100000Arrows.java
index 2d6bd827eec..47ba5f1cd41 100644
--- a/Mage.Sets/src/mage/cards/b/Borrowing100000Arrows.java
+++ b/Mage.Sets/src/mage/cards/b/Borrowing100000Arrows.java
@@ -62,7 +62,7 @@ class Borrowing100000ArrowsEffect extends OneShotEffect {
Player opponent = game.getPlayer(this.getTargetPointer().getFirst(game, source));
if (opponent != null) {
FilterCreaturePermanent filter = new FilterCreaturePermanent();
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
filter.add(new ControllerIdPredicate(opponent.getId()));
return new DrawCardSourceControllerEffect(game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game)).apply(game, source);
}
diff --git a/Mage.Sets/src/mage/cards/b/BorrowingTheEastWind.java b/Mage.Sets/src/mage/cards/b/BorrowingTheEastWind.java
index 9d5ab407c52..53f13e39bef 100644
--- a/Mage.Sets/src/mage/cards/b/BorrowingTheEastWind.java
+++ b/Mage.Sets/src/mage/cards/b/BorrowingTheEastWind.java
@@ -27,7 +27,7 @@ public final class BorrowingTheEastWind extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{G}{G}");
// Borrowing the East Wind deals X damage to each creature with horsemanship and each player.
- this.getSpellAbility().addEffect(new DamageEverythingEffect(new ManacostVariableValue(), filter)); }
+ this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.instance, filter)); }
public BorrowingTheEastWind(final BorrowingTheEastWind card) {
super(card);
diff --git a/Mage.Sets/src/mage/cards/b/BoseijuWhoSheltersAll.java b/Mage.Sets/src/mage/cards/b/BoseijuWhoSheltersAll.java
index 9e19d3430a9..15c1b4f486f 100644
--- a/Mage.Sets/src/mage/cards/b/BoseijuWhoSheltersAll.java
+++ b/Mage.Sets/src/mage/cards/b/BoseijuWhoSheltersAll.java
@@ -62,7 +62,7 @@ class BoseijuWhoSheltersAllWatcher extends Watcher {
private final String originalId;
public BoseijuWhoSheltersAllWatcher(UUID originalId) {
- super(BoseijuWhoSheltersAllWatcher.class.getSimpleName(), WatcherScope.CARD);
+ super(BoseijuWhoSheltersAllWatcher.class, WatcherScope.CARD);
this.originalId = originalId.toString();
}
@@ -137,7 +137,7 @@ class BoseijuWhoSheltersAllCantCounterEffect extends ContinuousRuleModifyingEffe
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- BoseijuWhoSheltersAllWatcher watcher = (BoseijuWhoSheltersAllWatcher) game.getState().getWatchers().get(BoseijuWhoSheltersAllWatcher.class.getSimpleName(), source.getSourceId());
+ BoseijuWhoSheltersAllWatcher watcher = game.getState().getWatcher(BoseijuWhoSheltersAllWatcher.class, source.getSourceId());
Spell spell = game.getStack().getSpell(event.getTargetId());
return spell != null && watcher != null && watcher.spellCantBeCountered(spell.getId());
}
diff --git a/Mage.Sets/src/mage/cards/b/BottleOfSuleiman.java b/Mage.Sets/src/mage/cards/b/BottleOfSuleiman.java
index efc5271eff4..9d82fd071f8 100644
--- a/Mage.Sets/src/mage/cards/b/BottleOfSuleiman.java
+++ b/Mage.Sets/src/mage/cards/b/BottleOfSuleiman.java
@@ -61,7 +61,7 @@ class BottleOfSuleimanEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player you = game.getPlayer(source.getControllerId());
if (you != null) {
- if (you.flipCoin(game)) {
+ if (you.flipCoin(source, game, true)) {
DjinnToken token = new DjinnToken();
token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
return true;
diff --git a/Mage.Sets/src/mage/cards/b/BottomlessVault.java b/Mage.Sets/src/mage/cards/b/BottomlessVault.java
index 8bd5f7fa137..caad3bf15cd 100644
--- a/Mage.Sets/src/mage/cards/b/BottomlessVault.java
+++ b/Mage.Sets/src/mage/cards/b/BottomlessVault.java
@@ -44,7 +44,7 @@ public final class BottomlessVault extends CardImpl {
// {tap}, Remove any number of storage counters from Bottomless Vault: Add {B} for each storage counter removed this way.
Ability ability = new DynamicManaAbility(
Mana.BlackMana(1),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new TapSourceCost(),
"Add {B} for each storage counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE));
diff --git a/Mage.Sets/src/mage/cards/b/BoundByMoonsilver.java b/Mage.Sets/src/mage/cards/b/BoundByMoonsilver.java
index 58c5928fdba..e3350aa8774 100644
--- a/Mage.Sets/src/mage/cards/b/BoundByMoonsilver.java
+++ b/Mage.Sets/src/mage/cards/b/BoundByMoonsilver.java
@@ -29,7 +29,7 @@ public final class BoundByMoonsilver extends CardImpl {
private final static FilterControlledPermanent filter = new FilterControlledPermanent("another permanent");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BoundByMoonsilver(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BraceForImpact.java b/Mage.Sets/src/mage/cards/b/BraceForImpact.java
index 28f17918e2c..6b5a458592c 100644
--- a/Mage.Sets/src/mage/cards/b/BraceForImpact.java
+++ b/Mage.Sets/src/mage/cards/b/BraceForImpact.java
@@ -25,7 +25,7 @@ public final class BraceForImpact extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("multicolored creature");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public BraceForImpact(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BrainInAJar.java b/Mage.Sets/src/mage/cards/b/BrainInAJar.java
index 161a5c9fcc3..78969941889 100644
--- a/Mage.Sets/src/mage/cards/b/BrainInAJar.java
+++ b/Mage.Sets/src/mage/cards/b/BrainInAJar.java
@@ -118,7 +118,7 @@ class BrainInAJarScryEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- int x = new RemovedCountersForCostValue().calculate(game, source, this);
+ int x = RemovedCountersForCostValue.instance.calculate(game, source, this);
if (x > 0) {
return controller.scry(x, source, game);
}
diff --git a/Mage.Sets/src/mage/cards/b/Braingeyser.java b/Mage.Sets/src/mage/cards/b/Braingeyser.java
index f3bd4083b03..75dad9a4f61 100644
--- a/Mage.Sets/src/mage/cards/b/Braingeyser.java
+++ b/Mage.Sets/src/mage/cards/b/Braingeyser.java
@@ -21,7 +21,7 @@ public final class Braingeyser extends CardImpl {
// Target player draws X cards.
- this.getSpellAbility().addEffect(new DrawCardTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DrawCardTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/b/Brainspoil.java b/Mage.Sets/src/mage/cards/b/Brainspoil.java
index d7422bbba5a..f49bcc4a40e 100644
--- a/Mage.Sets/src/mage/cards/b/Brainspoil.java
+++ b/Mage.Sets/src/mage/cards/b/Brainspoil.java
@@ -21,7 +21,7 @@ public final class Brainspoil extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature that isn't enchanted");
static {
- filter.add(Predicates.not(new EnchantedPredicate()));
+ filter.add(Predicates.not(EnchantedPredicate.instance));
}
public Brainspoil(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BrambleSovereign.java b/Mage.Sets/src/mage/cards/b/BrambleSovereign.java
index ab9ad76b56e..caa98f8bf6e 100644
--- a/Mage.Sets/src/mage/cards/b/BrambleSovereign.java
+++ b/Mage.Sets/src/mage/cards/b/BrambleSovereign.java
@@ -32,8 +32,8 @@ public final class BrambleSovereign extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
- filter.add(new AnotherPredicate());
+ filter.add(Predicates.not(TokenPredicate.instance));
+ filter.add(AnotherPredicate.instance);
}
public BrambleSovereign(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BrandedBrawlers.java b/Mage.Sets/src/mage/cards/b/BrandedBrawlers.java
index b7bff9ce2eb..469bfcc8850 100644
--- a/Mage.Sets/src/mage/cards/b/BrandedBrawlers.java
+++ b/Mage.Sets/src/mage/cards/b/BrandedBrawlers.java
@@ -28,7 +28,7 @@ public final class BrandedBrawlers extends CardImpl {
static final private FilterLandPermanent filter = new FilterLandPermanent("an untapped land");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
final static private String rule = "{this} can't block if you control an untapped land";
diff --git a/Mage.Sets/src/mage/cards/b/BrassTalonChimera.java b/Mage.Sets/src/mage/cards/b/BrassTalonChimera.java
index 4012646d0c0..6d80495ed51 100644
--- a/Mage.Sets/src/mage/cards/b/BrassTalonChimera.java
+++ b/Mage.Sets/src/mage/cards/b/BrassTalonChimera.java
@@ -1,4 +1,3 @@
-
package mage.cards.b;
import mage.MageInt;
@@ -22,7 +21,6 @@ import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class BrassTalonChimera extends CardImpl {
@@ -43,9 +41,9 @@ public final class BrassTalonChimera extends CardImpl {
// First strike
this.addAbility(FirstStrikeAbility.getInstance());
- // Sacrifice Brass-Talon Chimera: Put a +2/+2 counter on target Chimera creature. It gains first strike.
+ // Sacrifice Brass-Talon Chimera: Put a +2/+2 counter on target Chimera creature. It gains first strike. (This effect lasts indefinitely.)
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P2P2.createInstance()), new SacrificeSourceCost());
- ability.addEffect(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield));
+ ability.addEffect(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield).setText("It gains first strike. (This effect lasts indefinitely.)"));
ability.addTarget(new TargetCreaturePermanent(filter));
addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/b/BreachingHippocamp.java b/Mage.Sets/src/mage/cards/b/BreachingHippocamp.java
index dd74b144c30..3d192902243 100644
--- a/Mage.Sets/src/mage/cards/b/BreachingHippocamp.java
+++ b/Mage.Sets/src/mage/cards/b/BreachingHippocamp.java
@@ -23,7 +23,7 @@ public final class BreachingHippocamp extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BreachingHippocamp(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BreakOpen.java b/Mage.Sets/src/mage/cards/b/BreakOpen.java
index fcfc4f81e14..275c9fc7fb2 100644
--- a/Mage.Sets/src/mage/cards/b/BreakOpen.java
+++ b/Mage.Sets/src/mage/cards/b/BreakOpen.java
@@ -21,7 +21,7 @@ public final class BreakOpen extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Face-down creature an opponent controls");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
diff --git a/Mage.Sets/src/mage/cards/b/BreathstealersCrypt.java b/Mage.Sets/src/mage/cards/b/BreathstealersCrypt.java
index 503f832836f..aaeb5b471e2 100644
--- a/Mage.Sets/src/mage/cards/b/BreathstealersCrypt.java
+++ b/Mage.Sets/src/mage/cards/b/BreathstealersCrypt.java
@@ -46,7 +46,7 @@ class BreathstealersCryptEffect extends ReplacementEffectImpl {
public BreathstealersCryptEffect() {
super(Duration.WhileOnBattlefield, Outcome.LoseLife);
- staticText = "If a player would draw a card, instead he or she draws a card and reveals it. If it's a creature card, that player discards it unless he or she pays 3 life";
+ staticText = "If a player would draw a card, instead they draw a card and reveal it. If it's a creature card, that player discards it unless they pay 3 life";
}
public BreathstealersCryptEffect(final BreathstealersCryptEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/b/BriarberryCohort.java b/Mage.Sets/src/mage/cards/b/BriarberryCohort.java
index ea7b0b76495..888f21eede9 100644
--- a/Mage.Sets/src/mage/cards/b/BriarberryCohort.java
+++ b/Mage.Sets/src/mage/cards/b/BriarberryCohort.java
@@ -32,7 +32,7 @@ public final class BriarberryCohort extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.BLUE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
private String rule = "{this} gets +1/+1 as long as you control another blue creature";
diff --git a/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java b/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java
index 9995cf93e47..594613056ff 100644
--- a/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java
+++ b/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java
@@ -56,7 +56,7 @@ enum BriarbridgePatrolCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PermanentsSacrificedWatcher watcher = (PermanentsSacrificedWatcher) game.getState().getWatchers().get(PermanentsSacrificedWatcher.class.getSimpleName());
+ PermanentsSacrificedWatcher watcher = game.getState().getWatcher(PermanentsSacrificedWatcher.class);
if (watcher != null) {
List sacrificedPermanents = watcher.getThisTurnSacrificedPermanents(source.getControllerId());
if (sacrificedPermanents != null && !sacrificedPermanents.isEmpty()) {
diff --git a/Mage.Sets/src/mage/cards/b/BridgeFromBelow.java b/Mage.Sets/src/mage/cards/b/BridgeFromBelow.java
index fb1f645ac02..41df9ae8fa4 100644
--- a/Mage.Sets/src/mage/cards/b/BridgeFromBelow.java
+++ b/Mage.Sets/src/mage/cards/b/BridgeFromBelow.java
@@ -34,7 +34,7 @@ public final class BridgeFromBelow extends CardImpl {
static{
filter1.add(new ControllerPredicate(TargetController.YOU));
- filter1.add(Predicates.not(new TokenPredicate()));
+ filter1.add(Predicates.not(TokenPredicate.instance));
filter2.add(new ControllerPredicate(TargetController.OPPONENT));
}
diff --git a/Mage.Sets/src/mage/cards/b/Brightflame.java b/Mage.Sets/src/mage/cards/b/Brightflame.java
index 8e70b4a364b..54f8ab2edf0 100644
--- a/Mage.Sets/src/mage/cards/b/Brightflame.java
+++ b/Mage.Sets/src/mage/cards/b/Brightflame.java
@@ -29,7 +29,7 @@ public final class Brightflame extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{R}{R}{W}{W}");
// Radiance - Brightflame deals X damage to target creature and each other creature that shares a color with it. You gain life equal to the damage dealt this way.
- this.getSpellAbility().addEffect(new BrightflameEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new BrightflameEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().setAbilityWord(AbilityWord.RADIANCE);
}
diff --git a/Mage.Sets/src/mage/cards/b/BrimstoneVolley.java b/Mage.Sets/src/mage/cards/b/BrimstoneVolley.java
index dd37a947c6d..d0fca035254 100644
--- a/Mage.Sets/src/mage/cards/b/BrimstoneVolley.java
+++ b/Mage.Sets/src/mage/cards/b/BrimstoneVolley.java
@@ -53,8 +53,8 @@ class BrimstoneVolleyEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
int damage = 3;
- Watcher watcher = game.getState().getWatchers().get(MorbidWatcher.class.getSimpleName());
- if (watcher.conditionMet()) {
+ MorbidWatcher watcher = game.getState().getWatcher(MorbidWatcher.class);
+ if (watcher != null && watcher.conditionMet()) {
damage = 5;
}
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
diff --git a/Mage.Sets/src/mage/cards/b/BringToTrial.java b/Mage.Sets/src/mage/cards/b/BringToTrial.java
new file mode 100644
index 00000000000..bf7b058150e
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BringToTrial.java
@@ -0,0 +1,42 @@
+package mage.cards.b;
+
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class BringToTrial extends CardImpl {
+
+ static private final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power 4 or greater");
+
+ static {
+ filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 3));
+ }
+
+ public BringToTrial(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{W}");
+
+
+ // Exile target creature with power 4 or greater.
+ this.getSpellAbility().addEffect(new ExileTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ }
+
+ public BringToTrial(final BringToTrial card) {
+ super(card);
+ }
+
+ @Override
+ public BringToTrial copy() {
+ return new BringToTrial(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/BrionStoutarm.java b/Mage.Sets/src/mage/cards/b/BrionStoutarm.java
index f6939807c74..a39a9e10602 100644
--- a/Mage.Sets/src/mage/cards/b/BrionStoutarm.java
+++ b/Mage.Sets/src/mage/cards/b/BrionStoutarm.java
@@ -30,7 +30,7 @@ public final class BrionStoutarm extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature other than Brion Stoutarm");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BrionStoutarm(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BrokenAmbitions.java b/Mage.Sets/src/mage/cards/b/BrokenAmbitions.java
index 484e49a2109..b9d4be4d1a3 100644
--- a/Mage.Sets/src/mage/cards/b/BrokenAmbitions.java
+++ b/Mage.Sets/src/mage/cards/b/BrokenAmbitions.java
@@ -30,7 +30,7 @@ public final class BrokenAmbitions extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{U}");
// Counter target spell unless its controller pays {X}. Clash with an opponent. If you win, that spell's controller puts the top four cards of their library into their graveyard.
- this.getSpellAbility().addEffect(new BrokenAmbitionsEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new BrokenAmbitionsEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetSpell());
}
diff --git a/Mage.Sets/src/mage/cards/b/BrokenVisage.java b/Mage.Sets/src/mage/cards/b/BrokenVisage.java
index e250769885f..495b05ec36f 100644
--- a/Mage.Sets/src/mage/cards/b/BrokenVisage.java
+++ b/Mage.Sets/src/mage/cards/b/BrokenVisage.java
@@ -31,7 +31,7 @@ public final class BrokenVisage extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonartifact attacking creature");
static {
filter.add(Predicates.not(new CardTypePredicate(CardType.ARTIFACT)));
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public BrokenVisage(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BronzeHorse.java b/Mage.Sets/src/mage/cards/b/BronzeHorse.java
index 28180cf2bb4..bcd1ed31664 100644
--- a/Mage.Sets/src/mage/cards/b/BronzeHorse.java
+++ b/Mage.Sets/src/mage/cards/b/BronzeHorse.java
@@ -33,7 +33,7 @@ public final class BronzeHorse extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BronzeHorse(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BronzebeakMoa.java b/Mage.Sets/src/mage/cards/b/BronzebeakMoa.java
index b8d9f77917c..949498cd939 100644
--- a/Mage.Sets/src/mage/cards/b/BronzebeakMoa.java
+++ b/Mage.Sets/src/mage/cards/b/BronzebeakMoa.java
@@ -25,7 +25,7 @@ public final class BronzebeakMoa extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature under your control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BronzebeakMoa (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{W}");
diff --git a/Mage.Sets/src/mage/cards/b/BroodOfCockroaches.java b/Mage.Sets/src/mage/cards/b/BroodOfCockroaches.java
index cb7d25fffe5..cd838bcfd06 100644
--- a/Mage.Sets/src/mage/cards/b/BroodOfCockroaches.java
+++ b/Mage.Sets/src/mage/cards/b/BroodOfCockroaches.java
@@ -1,34 +1,33 @@
-
package mage.cards.b;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
-import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.game.Game;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
import static mage.constants.Outcome.Benefit;
/**
- *
* @author mpouedras
*/
public final class BroodOfCockroaches extends CardImpl {
public BroodOfCockroaches(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
-
+
this.subtype.add(SubType.INSECT);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
@@ -37,7 +36,7 @@ public final class BroodOfCockroaches extends CardImpl {
// at the beginning of the next end step,
// you lose 1 life
// and return Brood of Cockroaches to your hand.
- this.addAbility(new DiesTriggeredAbility(new BroodOfCockroachesEffect()));
+ this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new BroodOfCockroachesEffect(), false, true));
}
public BroodOfCockroaches(final BroodOfCockroaches card) {
@@ -51,7 +50,7 @@ public final class BroodOfCockroaches extends CardImpl {
}
class BroodOfCockroachesEffect extends OneShotEffect {
- private static final String effectText = "at the beginning of the next end step, you lose 1 life and return Brood of Cockroaches to your hand.";
+ private static final String effectText = "at the beginning of the next end step, you lose 1 life and return {this} to your hand.";
BroodOfCockroachesEffect() {
super(Benefit);
diff --git a/Mage.Sets/src/mage/cards/b/BroodingSaurian.java b/Mage.Sets/src/mage/cards/b/BroodingSaurian.java
index 9b71bf2e91c..221feab710f 100644
--- a/Mage.Sets/src/mage/cards/b/BroodingSaurian.java
+++ b/Mage.Sets/src/mage/cards/b/BroodingSaurian.java
@@ -50,7 +50,7 @@ class BroodingSaurianControlEffect extends ContinuousEffectImpl {
private static final FilterPermanent filter = new FilterPermanent();
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public BroodingSaurianControlEffect() {
diff --git a/Mage.Sets/src/mage/cards/b/BrothersYamazaki.java b/Mage.Sets/src/mage/cards/b/BrothersYamazaki.java
index 1cfb85d3243..bacf632163e 100644
--- a/Mage.Sets/src/mage/cards/b/BrothersYamazaki.java
+++ b/Mage.Sets/src/mage/cards/b/BrothersYamazaki.java
@@ -31,7 +31,7 @@ public final class BrothersYamazaki extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new NamePredicate("Brothers Yamazaki"));
}
diff --git a/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java b/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java
index 3ed5ff115ef..ef8d9f5b947 100644
--- a/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java
+++ b/Mage.Sets/src/mage/cards/b/BrudicladTelchorEngineer.java
@@ -31,7 +31,7 @@ public final class BrudicladTelchorEngineer extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature tokens you control");
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
}
public BrudicladTelchorEngineer(UUID ownerId, CardSetInfo setInfo) {
@@ -64,7 +64,7 @@ class BrudicladTelchorEngineerEffect extends OneShotEffect {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("token you control");
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
}
public BrudicladTelchorEngineerEffect() {
diff --git a/Mage.Sets/src/mage/cards/b/BrutalHordechief.java b/Mage.Sets/src/mage/cards/b/BrutalHordechief.java
index e3b37d68008..c6e43f6dc7e 100644
--- a/Mage.Sets/src/mage/cards/b/BrutalHordechief.java
+++ b/Mage.Sets/src/mage/cards/b/BrutalHordechief.java
@@ -74,7 +74,7 @@ public final class BrutalHordechief extends CardImpl {
@Override
public boolean apply(Game game, Ability source) {
- ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
+ ChooseBlockersRedundancyWatcher watcher = game.getState().getWatcher(ChooseBlockersRedundancyWatcher.class);
if (watcher != null) {
watcher.increment();
return true;
@@ -155,7 +155,10 @@ class BrutalHordechiefChooseBlockersEffect extends ContinuousRuleModifyingEffect
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
+ ChooseBlockersRedundancyWatcher watcher = game.getState().getWatcher(ChooseBlockersRedundancyWatcher.class);
+ if(watcher == null){
+ return false;
+ }
watcher.decrement();
if (watcher.copyCountApply > 0) {
game.informPlayers(source.getSourceObject(game).getIdName() + " didn't apply");
diff --git a/Mage.Sets/src/mage/cards/b/BrutalSuppression.java b/Mage.Sets/src/mage/cards/b/BrutalSuppression.java
index e45580406ed..0d332368773 100644
--- a/Mage.Sets/src/mage/cards/b/BrutalSuppression.java
+++ b/Mage.Sets/src/mage/cards/b/BrutalSuppression.java
@@ -58,7 +58,7 @@ class BrutalSuppressionAdditionalCostEffect extends CostModificationEffectImpl {
private static final FilterPermanent filter2 = new FilterPermanent("nontoken Rebels");
static{
filter2.add(new SubtypePredicate(SubType.REBEL));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
BrutalSuppressionAdditionalCostEffect() {
diff --git a/Mage.Sets/src/mage/cards/b/BuildersBane.java b/Mage.Sets/src/mage/cards/b/BuildersBane.java
index 094a17f47e8..7ee8821d2e8 100644
--- a/Mage.Sets/src/mage/cards/b/BuildersBane.java
+++ b/Mage.Sets/src/mage/cards/b/BuildersBane.java
@@ -1,11 +1,7 @@
package mage.cards.b;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -16,9 +12,13 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetArtifactPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
/**
- *
* @author sinsedrix
*/
public final class BuildersBane extends CardImpl {
@@ -29,15 +29,7 @@ public final class BuildersBane extends CardImpl {
// Destroy X target artifacts. Builder's Bane deals damage to each player equal to the number of artifacts he or she controlled put into a graveyard this way.
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
this.getSpellAbility().addEffect(new BuildersBaneEffect());
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetArtifactPermanent(xValue, xValue));
- }
+ this.getSpellAbility().setTargetAdjuster(BuildersBaneAdjuster.instance);
}
public BuildersBane(final BuildersBane card) {
@@ -50,11 +42,22 @@ public final class BuildersBane extends CardImpl {
}
}
+enum BuildersBaneAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.addTarget(new TargetArtifactPermanent(xValue, xValue));
+ }
+}
+
class BuildersBaneEffect extends OneShotEffect {
public BuildersBaneEffect() {
super(Outcome.DestroyPermanent);
- this.staticText = "Destroy X target artifacts. {this} deals damage to each player equal to the number of artifacts he or she controlled put into a graveyard this way";
+ this.staticText = "Destroy X target artifacts. {this} deals damage to each player equal to the number of artifacts they controlled that were put into a graveyard this way";
}
public BuildersBaneEffect(final BuildersBaneEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/b/BullAurochs.java b/Mage.Sets/src/mage/cards/b/BullAurochs.java
index 7f4e83734d8..7da88699f1b 100644
--- a/Mage.Sets/src/mage/cards/b/BullAurochs.java
+++ b/Mage.Sets/src/mage/cards/b/BullAurochs.java
@@ -27,7 +27,7 @@ public final class BullAurochs extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.AUROCHS));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BullAurochs(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BullRushBruiser.java b/Mage.Sets/src/mage/cards/b/BullRushBruiser.java
index ac0cfeaab98..b89ace249d7 100644
--- a/Mage.Sets/src/mage/cards/b/BullRushBruiser.java
+++ b/Mage.Sets/src/mage/cards/b/BullRushBruiser.java
@@ -24,7 +24,7 @@ public final class BullRushBruiser extends CardImpl {
private static final FilterTeamPermanent filter = new FilterTeamPermanent(SubType.WARRIOR, "another Warrior");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public BullRushBruiser(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/b/BurdenOfGreed.java b/Mage.Sets/src/mage/cards/b/BurdenOfGreed.java
index 124aac6ceb2..2f8ad795d0c 100644
--- a/Mage.Sets/src/mage/cards/b/BurdenOfGreed.java
+++ b/Mage.Sets/src/mage/cards/b/BurdenOfGreed.java
@@ -48,7 +48,7 @@ class BurdenOfGreedCount implements DynamicValue {
return 0;
}
FilterArtifactPermanent filter = new FilterArtifactPermanent();
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
filter.add(new ControllerIdPredicate(sourceAbility.getFirstTarget()));
return game.getBattlefield().count(filter, sourceAbility.getSourceId(), sourceAbility.getControllerId(), game);
}
diff --git a/Mage.Sets/src/mage/cards/b/BurnAtTheStake.java b/Mage.Sets/src/mage/cards/b/BurnAtTheStake.java
index b804747d354..7707490f2de 100644
--- a/Mage.Sets/src/mage/cards/b/BurnAtTheStake.java
+++ b/Mage.Sets/src/mage/cards/b/BurnAtTheStake.java
@@ -27,7 +27,7 @@ public final class BurnAtTheStake extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creatures you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public BurnAtTheStake(UUID ownerId, CardSetInfo setInfo) {
@@ -69,7 +69,7 @@ class BurnAtTheStakeEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- int amount = (new GetXValue()).calculate(game, source, this) * 3;
+ int amount = (GetXValue.instance).calculate(game, source, this) * 3;
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
if (permanent != null) {
diff --git a/Mage.Sets/src/mage/cards/b/BurnBright.java b/Mage.Sets/src/mage/cards/b/BurnBright.java
new file mode 100644
index 00000000000..bfc8e02a9d7
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BurnBright.java
@@ -0,0 +1,31 @@
+package mage.cards.b;
+
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BurnBright extends CardImpl {
+
+ public BurnBright(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}");
+
+ // Creatures you control get +2/+0 until end of turn.
+ this.getSpellAbility().addEffect(new BoostControlledEffect(2, 0, Duration.EndOfTurn));
+ }
+
+ private BurnBright(final BurnBright card) {
+ super(card);
+ }
+
+ @Override
+ public BurnBright copy() {
+ return new BurnBright(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/BurningCinderFuryOfCrimsonChaosFire.java b/Mage.Sets/src/mage/cards/b/BurningCinderFuryOfCrimsonChaosFire.java
index 1585222ed7b..ec620a455e0 100644
--- a/Mage.Sets/src/mage/cards/b/BurningCinderFuryOfCrimsonChaosFire.java
+++ b/Mage.Sets/src/mage/cards/b/BurningCinderFuryOfCrimsonChaosFire.java
@@ -184,7 +184,7 @@ class BurningCinderFuryOfCrimsonChaosFireCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- BurningCinderFuryOfCrimsonChaosFireWatcher watcher = (BurningCinderFuryOfCrimsonChaosFireWatcher) game.getState().getWatchers().get(BurningCinderFuryOfCrimsonChaosFireWatcher.class.getSimpleName());
+ BurningCinderFuryOfCrimsonChaosFireWatcher watcher = game.getState().getWatcher(BurningCinderFuryOfCrimsonChaosFireWatcher.class);
if (watcher != null) {
return !watcher.tappedNonlandThisTurn(game.getActivePlayerId());
}
diff --git a/Mage.Sets/src/mage/cards/b/BurningOfXinye.java b/Mage.Sets/src/mage/cards/b/BurningOfXinye.java
index 1d7ff56bc77..16a159d914d 100644
--- a/Mage.Sets/src/mage/cards/b/BurningOfXinye.java
+++ b/Mage.Sets/src/mage/cards/b/BurningOfXinye.java
@@ -89,7 +89,7 @@ class BurningOfXinyeEffect extends OneShotEffect{
}
for ( int idx = 0; idx < target.getTargets().size(); idx++) {
- Permanent permanent = game.getPermanent((UUID)target.getTargets().get(idx));
+ Permanent permanent = game.getPermanent(target.getTargets().get(idx));
if ( permanent != null ) {
abilityApplied |= permanent.destroy(source.getSourceId(), game, false);
diff --git a/Mage.Sets/src/mage/cards/b/BurningSands.java b/Mage.Sets/src/mage/cards/b/BurningSands.java
index a8c0af943b0..01f30e5a5d8 100644
--- a/Mage.Sets/src/mage/cards/b/BurningSands.java
+++ b/Mage.Sets/src/mage/cards/b/BurningSands.java
@@ -1,7 +1,6 @@
package mage.cards.b;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.effects.common.SacrificeEffect;
@@ -12,39 +11,29 @@ import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class BurningSands extends CardImpl {
- private final UUID originalId;
-
public BurningSands(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{R}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}{R}");
// Whenever a creature dies, that creature's controller sacrifices a land.
- Ability ability = new DiesCreatureTriggeredAbility(new SacrificeEffect(StaticFilters.FILTER_LAND, 1, "that creature's controller"), false, false, true);
- originalId = ability.getOriginalId();
+ Ability ability = new DiesCreatureTriggeredAbility(new SacrificeEffect(
+ StaticFilters.FILTER_LAND, 1, "that creature's controller"
+ ), false, false, true);
+ ability.setTargetAdjuster(BurningSandsAdjuster.instance);
this.addAbility(ability);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- UUID creatureId = ability.getEffects().get(0).getTargetPointer().getFirst(game, ability);
- Permanent creature = (Permanent) game.getLastKnownInformation(creatureId, Zone.BATTLEFIELD);
- if (creature != null) {
- ability.getEffects().get(0).setTargetPointer(new FixedTarget(creature.getControllerId()));
- }
- }
- }
-
public BurningSands(final BurningSands card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -52,3 +41,16 @@ public final class BurningSands extends CardImpl {
return new BurningSands(this);
}
}
+
+enum BurningSandsAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ UUID creatureId = ability.getEffects().get(0).getTargetPointer().getFirst(game, ability);
+ Permanent creature = game.getPermanentOrLKIBattlefield(creatureId);
+ if (creature != null) {
+ ability.getEffects().get(0).setTargetPointer(new FixedTarget(creature.getControllerId()));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/b/BurningTreeShaman.java b/Mage.Sets/src/mage/cards/b/BurningTreeShaman.java
index 52fd5e5c25c..18b29ddd9b7 100644
--- a/Mage.Sets/src/mage/cards/b/BurningTreeShaman.java
+++ b/Mage.Sets/src/mage/cards/b/BurningTreeShaman.java
@@ -1,7 +1,5 @@
-
package mage.cards.b;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.dynamicvalue.common.StaticValue;
@@ -19,14 +17,15 @@ import mage.game.events.GameEvent.EventType;
import mage.game.stack.StackAbility;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author Loki
*/
public final class BurningTreeShaman extends CardImpl {
public BurningTreeShaman(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{G}");
this.subtype.add(SubType.CENTAUR, SubType.SHAMAN);
this.power = new MageInt(3);
@@ -49,7 +48,7 @@ public final class BurningTreeShaman extends CardImpl {
class BurningTreeShamanTriggeredAbility extends TriggeredAbilityImpl {
BurningTreeShamanTriggeredAbility() {
- super(Zone.BATTLEFIELD, new DamageTargetEffect(new StaticValue(1), false, "that player", true));
+ super(Zone.BATTLEFIELD, new DamageTargetEffect(new StaticValue(1), true, "that player", true));
}
BurningTreeShamanTriggeredAbility(final BurningTreeShamanTriggeredAbility ability) {
diff --git a/Mage.Sets/src/mage/cards/b/BurningTreeVandal.java b/Mage.Sets/src/mage/cards/b/BurningTreeVandal.java
new file mode 100644
index 00000000000..fe6ea62ee96
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BurningTreeVandal.java
@@ -0,0 +1,46 @@
+package mage.cards.b;
+
+import mage.MageInt;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.costs.common.DiscardCardCost;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.RiotAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class BurningTreeVandal extends CardImpl {
+
+ public BurningTreeVandal(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.ROGUE);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Riot
+ this.addAbility(new RiotAbility());
+
+ // Whenever Burning-Tree Vandal attacks, you may discard a card. If you do, draw a card.
+ this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
+ new DrawCardSourceControllerEffect(1), new DiscardCardCost()
+ ), false));
+ }
+
+ private BurningTreeVandal(final BurningTreeVandal card) {
+ super(card);
+ }
+
+ @Override
+ public BurningTreeVandal copy() {
+ return new BurningTreeVandal(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/ByForce.java b/Mage.Sets/src/mage/cards/b/ByForce.java
index 2263b8fc364..5c42282251b 100644
--- a/Mage.Sets/src/mage/cards/b/ByForce.java
+++ b/Mage.Sets/src/mage/cards/b/ByForce.java
@@ -1,18 +1,18 @@
package mage.cards.b;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.game.Game;
import mage.target.common.TargetArtifactPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author spjspj
*/
public final class ByForce extends CardImpl {
@@ -23,15 +23,7 @@ public final class ByForce extends CardImpl {
// Destroy X target artifacts.
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target artifacts"));
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetArtifactPermanent(xValue, xValue));
- }
+ this.getSpellAbility().setTargetAdjuster(ByForceAdjuster.instance);
}
public ByForce(final ByForce card) {
@@ -43,3 +35,14 @@ public final class ByForce extends CardImpl {
return new ByForce(this);
}
}
+
+enum ByForceAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.addTarget(new TargetArtifactPermanent(xValue, xValue));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CabalInterrogator.java b/Mage.Sets/src/mage/cards/c/CabalInterrogator.java
index 7e8862fdb93..4fd7e496e3d 100644
--- a/Mage.Sets/src/mage/cards/c/CabalInterrogator.java
+++ b/Mage.Sets/src/mage/cards/c/CabalInterrogator.java
@@ -78,7 +78,7 @@ class CabalInterrogatorEffect extends OneShotEffect {
return false;
}
- int amountToReveal = (new ManacostVariableValue()).calculate(game, source, this);
+ int amountToReveal = (ManacostVariableValue.instance).calculate(game, source, this);
Cards revealedCards = new CardsImpl();
if (amountToReveal > 0 && targetPlayer.getHand().size() > amountToReveal) {
diff --git a/Mage.Sets/src/mage/cards/c/CacklingWitch.java b/Mage.Sets/src/mage/cards/c/CacklingWitch.java
index ec76eecd38d..37f93e1542a 100644
--- a/Mage.Sets/src/mage/cards/c/CacklingWitch.java
+++ b/Mage.Sets/src/mage/cards/c/CacklingWitch.java
@@ -33,7 +33,7 @@ public final class CacklingWitch extends CardImpl {
this.toughness = new MageInt(1);
// {X}{B}, {tap}, Discard a card: Target creature gets +X/+0 until end of turn.
- ManacostVariableValue manaX = new ManacostVariableValue();
+ ManacostVariableValue manaX = ManacostVariableValue.instance;
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new BoostTargetEffect(manaX, new StaticValue(0), Duration.EndOfTurn),
new ManaCostsImpl("{X}{B}"));
diff --git a/Mage.Sets/src/mage/cards/c/CalciformPools.java b/Mage.Sets/src/mage/cards/c/CalciformPools.java
index 72702e77fde..9d123691915 100644
--- a/Mage.Sets/src/mage/cards/c/CalciformPools.java
+++ b/Mage.Sets/src/mage/cards/c/CalciformPools.java
@@ -36,7 +36,7 @@ public final class CalciformPools extends CardImpl {
this.addAbility(ability);
// {1}, Remove X storage counters from Calciform Pools: Add X mana in any combination of {W} and/or {U}.
ability = new SimpleManaAbility(Zone.BATTLEFIELD,
- new AddManaInAnyCombinationEffect(new RemovedCountersForCostValue(), ColoredManaSymbol.W, ColoredManaSymbol.U),
+ new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, ColoredManaSymbol.W, ColoredManaSymbol.U),
new GenericManaCost(1));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance()));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/c/CallerOfTheClaw.java b/Mage.Sets/src/mage/cards/c/CallerOfTheClaw.java
index e5607074fe6..1a36673626a 100644
--- a/Mage.Sets/src/mage/cards/c/CallerOfTheClaw.java
+++ b/Mage.Sets/src/mage/cards/c/CallerOfTheClaw.java
@@ -114,7 +114,7 @@ class CallerOfTheClawDynamicValue implements DynamicValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
- CallerOfTheClawWatcher watcher = (CallerOfTheClawWatcher) game.getState().getWatchers().get(CallerOfTheClawWatcher.class.getSimpleName(), sourceAbility.getControllerId());
+ CallerOfTheClawWatcher watcher = game.getState().getWatcher(CallerOfTheClawWatcher.class, sourceAbility.getControllerId());
if (watcher != null) {
return watcher.getCreaturesCount();
}
diff --git a/Mage.Sets/src/mage/cards/c/CallerOfTheHunt.java b/Mage.Sets/src/mage/cards/c/CallerOfTheHunt.java
index f05249eeac4..37eb08abbed 100644
--- a/Mage.Sets/src/mage/cards/c/CallerOfTheHunt.java
+++ b/Mage.Sets/src/mage/cards/c/CallerOfTheHunt.java
@@ -1,14 +1,15 @@
package mage.cards.c;
-import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.CostAdjuster;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.InfoEffect;
import mage.abilities.effects.common.continuous.SetPowerSourceEffect;
import mage.abilities.effects.common.continuous.SetToughnessSourceEffect;
import mage.cards.CardImpl;
@@ -21,8 +22,9 @@ import mage.filter.predicate.mageobject.ChosenSubtypePredicate;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class CallerOfTheHunt extends CardImpl {
@@ -34,14 +36,24 @@ public final class CallerOfTheHunt extends CardImpl {
// As an additional cost to cast Caller of the Hunt, choose a creature type.
// Caller of the Hunt's power and toughness are each equal to the number of creatures of the chosen type on the battlefield.
- this.addAbility(new SimpleStaticAbility(Zone.ALL, new CallerOfTheHuntAdditionalCostEffect()));
-
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect("as an additional cost to cast this spell, choose a creature type. \r"
+ + "{this}'s power and toughness are each equal to the number of creatures of the chosen type on the battlefield")));
+ this.getSpellAbility().setCostAdjuster(CallerOfTheHuntAdjuster.instance);
}
public CallerOfTheHunt(final CallerOfTheHunt card) {
super(card);
}
+ @Override
+ public CallerOfTheHunt copy() {
+ return new CallerOfTheHunt(this);
+ }
+}
+
+enum CallerOfTheHuntAdjuster implements CostAdjuster {
+ instance;
+
@Override
public void adjustCosts(Ability ability, Game game) {
MageObject mageObject = game.getObject(ability.getSourceId());
@@ -56,34 +68,6 @@ public final class CallerOfTheHunt extends CardImpl {
game.addEffect(effectToughness, ability);
}
}
-
- @Override
- public CallerOfTheHunt copy() {
- return new CallerOfTheHunt(this);
- }
-}
-
-class CallerOfTheHuntAdditionalCostEffect extends OneShotEffect {
-
- public CallerOfTheHuntAdditionalCostEffect() {
- super(Outcome.Benefit);
- this.staticText = "as an additional cost to cast this spell, choose a creature type. \r"
- + "{this}'s power and toughness are each equal to the number of creatures of the chosen type on the battlefield";
- }
-
- public CallerOfTheHuntAdditionalCostEffect(final CallerOfTheHuntAdditionalCostEffect effect) {
- super(effect);
- }
-
- @Override
- public CallerOfTheHuntAdditionalCostEffect copy() {
- return new CallerOfTheHuntAdditionalCostEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return true;
- }
}
class ChooseCreatureTypeEffect extends OneShotEffect { // code by LevelX2, but that other version is not compatible with this card
@@ -116,5 +100,4 @@ class ChooseCreatureTypeEffect extends OneShotEffect { // code by LevelX2, but t
public ChooseCreatureTypeEffect copy() {
return new ChooseCreatureTypeEffect(this);
}
-
}
diff --git a/Mage.Sets/src/mage/cards/c/CalmingVerse.java b/Mage.Sets/src/mage/cards/c/CalmingVerse.java
index 8d94a2f0d86..08a66a28efc 100644
--- a/Mage.Sets/src/mage/cards/c/CalmingVerse.java
+++ b/Mage.Sets/src/mage/cards/c/CalmingVerse.java
@@ -50,7 +50,7 @@ class CalmingVerseEffect extends OneShotEffect {
static {
untappedLandFilter.add(new CardTypePredicate(CardType.LAND));
- untappedLandFilter.add(Predicates.not(new TappedPredicate()));
+ untappedLandFilter.add(Predicates.not(TappedPredicate.instance));
}
private static final FilterEnchantmentPermanent opponentEnchantmentsFilter = new FilterEnchantmentPermanent("enchantments you don't control");
diff --git a/Mage.Sets/src/mage/cards/c/CantonicaCasino.java b/Mage.Sets/src/mage/cards/c/CantonicaCasino.java
index 4c528b303d5..f91d45b6987 100644
--- a/Mage.Sets/src/mage/cards/c/CantonicaCasino.java
+++ b/Mage.Sets/src/mage/cards/c/CantonicaCasino.java
@@ -1,13 +1,9 @@
package mage.cards.c;
-import java.util.UUID;
-
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.RollDiceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -15,21 +11,21 @@ import mage.constants.Outcome;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author NinthWorld
*/
public final class CantonicaCasino extends CardImpl {
public CantonicaCasino(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
-
// {T}: Roll two six-sided dice. If you roll doubles, gain 10 life. Otherwise, lose 1 life.
this.addAbility(new SimpleActivatedAbility(new CantonicaCasinoEffect(), new TapSourceCost()));
}
- public CantonicaCasino(final CantonicaCasino card) {
+ private CantonicaCasino(final CantonicaCasino card) {
super(card);
}
@@ -41,33 +37,31 @@ public final class CantonicaCasino extends CardImpl {
class CantonicaCasinoEffect extends OneShotEffect {
- public CantonicaCasinoEffect() {
+ CantonicaCasinoEffect() {
super(Outcome.Neutral);
- staticText = "Roll two six-sided dice. If you roll doubles, gain 10 life. Otherwise, lose 1 life";
+ staticText = "Roll two six-sided dice. If you roll doubles, gain 10 life. Otherwise, you lose 1 life";
}
- public CantonicaCasinoEffect(final CantonicaCasinoEffect effect) {
+ private CantonicaCasinoEffect(final CantonicaCasinoEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Player you = game.getPlayer(source.getControllerId());
- if(you != null) {
+ if (you != null) {
// Roll two six-sided dice
int dice1 = you.rollDice(game, 6);
int dice2 = you.rollDice(game, 6);
- if(dice1 == dice2) {
+ if (dice1 == dice2) {
// If you roll doubles, gain 10 life
you.gainLife(10, game, source);
- return false;
- }
- else {
+ } else {
// Otherwise, lose 1 life
you.loseLife(1, game, false);
- return false;
}
+ return true;
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/c/CaptainOfTheMists.java b/Mage.Sets/src/mage/cards/c/CaptainOfTheMists.java
index 2a1470958ca..b936bb82bf2 100644
--- a/Mage.Sets/src/mage/cards/c/CaptainOfTheMists.java
+++ b/Mage.Sets/src/mage/cards/c/CaptainOfTheMists.java
@@ -31,7 +31,7 @@ public final class CaptainOfTheMists extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another Human");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.HUMAN));
}
diff --git a/Mage.Sets/src/mage/cards/c/CaptainPhasma.java b/Mage.Sets/src/mage/cards/c/CaptainPhasma.java
index 829342d2b6c..d37a042cd13 100644
--- a/Mage.Sets/src/mage/cards/c/CaptainPhasma.java
+++ b/Mage.Sets/src/mage/cards/c/CaptainPhasma.java
@@ -32,7 +32,7 @@ public final class CaptainPhasma extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.TROOPER));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
filterCard.add(new SubtypePredicate(SubType.TROOPER));
}
diff --git a/Mage.Sets/src/mage/cards/c/CaptivatingVampire.java b/Mage.Sets/src/mage/cards/c/CaptivatingVampire.java
index 7262d6bc79f..7ae21466188 100644
--- a/Mage.Sets/src/mage/cards/c/CaptivatingVampire.java
+++ b/Mage.Sets/src/mage/cards/c/CaptivatingVampire.java
@@ -34,7 +34,7 @@ public final class CaptivatingVampire extends CardImpl {
static {
filter1.add(new SubtypePredicate(SubType.VAMPIRE));
filter2.add(new SubtypePredicate(SubType.VAMPIRE));
- filter2.add(Predicates.not(new TappedPredicate()));
+ filter2.add(Predicates.not(TappedPredicate.instance));
}
public CaptivatingVampire(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CaptiveAudience.java b/Mage.Sets/src/mage/cards/c/CaptiveAudience.java
new file mode 100644
index 00000000000..1c1fc05480a
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CaptiveAudience.java
@@ -0,0 +1,138 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenTargetEffect;
+import mage.abilities.effects.common.SetPlayerLifeSourceEffect;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.abilities.effects.common.discard.DiscardHandControllerEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.TargetController;
+import mage.game.Game;
+import mage.game.permanent.token.ZombieToken;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.common.TargetOpponent;
+import mage.target.targetpointer.FixedTarget;
+
+import java.util.UUID;
+
+import static mage.constants.Outcome.Benefit;
+
+/**
+ * @author TheElk801
+ */
+public final class CaptiveAudience extends CardImpl {
+
+ public CaptiveAudience(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{5}{B}{R}");
+
+ // Captive Audience enters the battlefield under the control of an opponent of your choice.
+ this.addAbility(new EntersBattlefieldAbility(new CaptiveAudienceETBEffect()));
+
+ // At the beginning of your upkeep, choose one that hasn't been chosen —
+ // • Your life total becomes 4.
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(new SetPlayerLifeSourceEffect(4), TargetController.YOU, false);
+ ability.getModes().setEachModeOnlyOnce(true);
+
+ // • Discard your hand.
+ ability.addMode(new Mode(new DiscardHandControllerEffect()));
+
+ // • Each opponent creates five 2/2 black Zombie creature tokens.
+ ability.addMode(new Mode(new CaptiveAudienceCreateTokensEffect()));
+ this.addAbility(ability);
+ }
+
+ private CaptiveAudience(final CaptiveAudience card) {
+ super(card);
+ }
+
+ @Override
+ public CaptiveAudience copy() {
+ return new CaptiveAudience(this);
+ }
+}
+
+class CaptiveAudienceETBEffect extends OneShotEffect {
+
+ CaptiveAudienceETBEffect() {
+ super(Benefit);
+ staticText = "under the control of an opponent of your choice";
+ }
+
+ private CaptiveAudienceETBEffect(final CaptiveAudienceETBEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CaptiveAudienceETBEffect copy() {
+ return new CaptiveAudienceETBEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
+ return false;
+ }
+ Target target = new TargetOpponent();
+ target.setNotTarget(true);
+ if (!controller.choose(Outcome.Benefit, target, source.getSourceId(), game)) {
+ return false;
+ }
+ Player player = game.getPlayer(target.getFirstTarget());
+ if (player == null) {
+ return false;
+ }
+ ContinuousEffect continuousEffect = new GainControlTargetEffect(
+ Duration.WhileOnBattlefield, true, player.getId()
+ );
+ continuousEffect.setTargetPointer(
+ new FixedTarget(source.getSourceId(), source.getSourceObjectZoneChangeCounter())
+ );
+ game.addEffect(continuousEffect, source);
+ return true;
+ }
+}
+
+class CaptiveAudienceCreateTokensEffect extends OneShotEffect {
+
+ CaptiveAudienceCreateTokensEffect() {
+ super(Benefit);
+ staticText = "Each opponent creates five 2/2 black Zombie creature tokens.";
+ }
+
+ private CaptiveAudienceCreateTokensEffect(final CaptiveAudienceCreateTokensEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CaptiveAudienceCreateTokensEffect copy() {
+ return new CaptiveAudienceCreateTokensEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
+ return false;
+ }
+ for (Player player : game.getPlayers().values()) {
+ if (player != null && controller.hasOpponent(player.getId(), game)) {
+ Effect effect = new CreateTokenTargetEffect(new ZombieToken(), 5);
+ effect.setTargetPointer(new FixedTarget(player.getId(), game));
+ effect.apply(game, source);
+ }
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CarapaceForger.java b/Mage.Sets/src/mage/cards/c/CarapaceForger.java
index 03ce8bd225e..01d92bba753 100644
--- a/Mage.Sets/src/mage/cards/c/CarapaceForger.java
+++ b/Mage.Sets/src/mage/cards/c/CarapaceForger.java
@@ -2,40 +2,44 @@
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.MetalcraftCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
-import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.constants.Zone;
+import java.util.UUID;
+
/**
- *
* @author Loki
*/
public final class CarapaceForger extends CardImpl {
- private static final String text = "Metalcraft — Carapace Forger gets +2/+2 as long as you control three or more artifacts";
- public CarapaceForger (UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}");
+ public CarapaceForger(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.subtype.add(SubType.ELF);
this.subtype.add(SubType.ARTIFICER);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
- ContinuousEffect boostSource = new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield);
- ConditionalContinuousEffect effect = new ConditionalContinuousEffect(boostSource, MetalcraftCondition.instance, text);
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
+
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new ConditionalContinuousEffect(
+ new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield),
+ MetalcraftCondition.instance, "Metalcraft — {this} gets " +
+ "+2/+2 as long as you control three or more artifacts"
+ )
+ ));
}
- public CarapaceForger (final CarapaceForger card) {
+ public CarapaceForger(final CarapaceForger card) {
super(card);
}
diff --git a/Mage.Sets/src/mage/cards/c/CarefulConsideration.java b/Mage.Sets/src/mage/cards/c/CarefulConsideration.java
index 17f41df1874..f23ff03b5c6 100644
--- a/Mage.Sets/src/mage/cards/c/CarefulConsideration.java
+++ b/Mage.Sets/src/mage/cards/c/CarefulConsideration.java
@@ -2,7 +2,7 @@
package mage.cards.c;
import java.util.UUID;
-import mage.abilities.condition.common.MyMainPhaseCondition;
+import mage.abilities.condition.common.AddendumCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.DrawDiscardTargetEffect;
import mage.cards.CardImpl;
@@ -24,7 +24,7 @@ public final class CarefulConsideration extends CardImpl {
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new DrawDiscardTargetEffect(4,2),
new DrawDiscardTargetEffect(4,3),
- MyMainPhaseCondition.instance,
+ AddendumCondition.instance,
"Target player draws four cards, then discards three cards. If you cast this spell during your main phase, instead that player draws four cards, then discards two cards"));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/c/CaribouRange.java b/Mage.Sets/src/mage/cards/c/CaribouRange.java
index f2ae348ca77..4599b610cea 100644
--- a/Mage.Sets/src/mage/cards/c/CaribouRange.java
+++ b/Mage.Sets/src/mage/cards/c/CaribouRange.java
@@ -34,7 +34,7 @@ public final class CaribouRange extends CardImpl {
static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a Caribou token");
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
filter.add(new SubtypePredicate(SubType.CARIBOU));
}
diff --git a/Mage.Sets/src/mage/cards/c/CarnifexDemon.java b/Mage.Sets/src/mage/cards/c/CarnifexDemon.java
index 9d2bb438dd5..72a8bdb8689 100644
--- a/Mage.Sets/src/mage/cards/c/CarnifexDemon.java
+++ b/Mage.Sets/src/mage/cards/c/CarnifexDemon.java
@@ -28,7 +28,7 @@ public final class CarnifexDemon extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each other creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public CarnifexDemon(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CarnivalCarnage.java b/Mage.Sets/src/mage/cards/c/CarnivalCarnage.java
new file mode 100644
index 00000000000..e5cdc2a4437
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CarnivalCarnage.java
@@ -0,0 +1,82 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.cards.CardSetInfo;
+import mage.cards.SplitCard;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SpellAbilityType;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCreatureOrPlaneswalker;
+import mage.target.common.TargetOpponent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CarnivalCarnage extends SplitCard {
+
+ public CarnivalCarnage(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{B/R}", "{2}{B}{R}", SpellAbilityType.SPLIT);
+
+ // Carnival
+ // Carnival deals 1 damage to target creature or planeswalker and 1 damage to that permanent's controller.
+ this.getLeftHalfCard().getSpellAbility().addEffect(new CarnivalEffect());
+ this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
+
+ // Carnage
+ // Carnage deals 3 damage to target opponent. That player discards two cards.
+ this.getRightHalfCard().getSpellAbility().addEffect(new DamageTargetEffect(3));
+ this.getRightHalfCard().getSpellAbility().addEffect(
+ new DiscardTargetEffect(2).setText("That player discards two cards.")
+ );
+ this.getRightHalfCard().getSpellAbility().addTarget(new TargetOpponent());
+ }
+
+ private CarnivalCarnage(final CarnivalCarnage card) {
+ super(card);
+ }
+
+ @Override
+ public CarnivalCarnage copy() {
+ return new CarnivalCarnage(this);
+ }
+}
+
+class CarnivalEffect extends OneShotEffect {
+
+ CarnivalEffect() {
+ super(Outcome.Benefit);
+ staticText = "{this} deals 1 damage to target creature or planeswalker " +
+ "and 1 damage to that permanent's controller";
+ }
+
+ private CarnivalEffect(final CarnivalEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CarnivalEffect copy() {
+ return new CarnivalEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ if (permanent == null) {
+ return false;
+ }
+ permanent.damage(1, source.getSourceId(), game);
+ Player player = game.getPlayer(permanent.getControllerId());
+ if (player != null) {
+ player.damage(1, source.getSourceId(), game);
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/Carrion.java b/Mage.Sets/src/mage/cards/c/Carrion.java
index 335d1c595a4..befed330ea5 100644
--- a/Mage.Sets/src/mage/cards/c/Carrion.java
+++ b/Mage.Sets/src/mage/cards/c/Carrion.java
@@ -25,7 +25,7 @@ public final class Carrion extends CardImpl {
this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT)));
// Put X 0/1 black Insect creature tokens onto the battlefield, where X is the sacrificed creature's power.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new CarrionBlackInsectToken(), new SacrificeCostCreaturesPower()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new CarrionBlackInsectToken(), SacrificeCostCreaturesPower.instance));
}
public Carrion(final Carrion card) {
diff --git a/Mage.Sets/src/mage/cards/c/CarrionImp.java b/Mage.Sets/src/mage/cards/c/CarrionImp.java
new file mode 100644
index 00000000000..0804414d36b
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CarrionImp.java
@@ -0,0 +1,51 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterCreatureCard;
+import mage.target.common.TargetCardInGraveyard;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CarrionImp extends CardImpl {
+
+ private static final FilterCard filter = new FilterCreatureCard("creature card from a graveyard");
+
+ public CarrionImp(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
+
+ this.subtype.add(SubType.IMP);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // When Carrion Imp enters the battlefield, you may exile target creature card from a graveyard. If you do, you gain 2 life.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect(), true);
+ ability.addEffect(new GainLifeEffect(2).concatBy("If you do,"));
+ ability.addTarget(new TargetCardInGraveyard(filter));
+ this.addAbility(ability);
+ }
+
+ private CarrionImp(final CarrionImp card) {
+ super(card);
+ }
+
+ @Override
+ public CarrionImp copy() {
+ return new CarrionImp(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/CatacombCrocodile.java b/Mage.Sets/src/mage/cards/c/CatacombCrocodile.java
new file mode 100644
index 00000000000..d6beb926a3e
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CatacombCrocodile.java
@@ -0,0 +1,32 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CatacombCrocodile extends CardImpl {
+
+ public CatacombCrocodile(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}");
+
+ this.subtype.add(SubType.CROCODILE);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(7);
+ }
+
+ private CatacombCrocodile(final CatacombCrocodile card) {
+ super(card);
+ }
+
+ @Override
+ public CatacombCrocodile copy() {
+ return new CatacombCrocodile(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/CatacombSifter.java b/Mage.Sets/src/mage/cards/c/CatacombSifter.java
index 43f3e15b984..39d60404112 100644
--- a/Mage.Sets/src/mage/cards/c/CatacombSifter.java
+++ b/Mage.Sets/src/mage/cards/c/CatacombSifter.java
@@ -26,7 +26,7 @@ public final class CatacombSifter extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/c/CatapultMaster.java b/Mage.Sets/src/mage/cards/c/CatapultMaster.java
index 0664a36eb64..ea9a17d070a 100644
--- a/Mage.Sets/src/mage/cards/c/CatapultMaster.java
+++ b/Mage.Sets/src/mage/cards/c/CatapultMaster.java
@@ -28,7 +28,7 @@ public final class CatapultMaster extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Soldiers you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.SOLDIER));
}
public CatapultMaster(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CatapultSquad.java b/Mage.Sets/src/mage/cards/c/CatapultSquad.java
index db703b595e1..b8b9bd3af75 100644
--- a/Mage.Sets/src/mage/cards/c/CatapultSquad.java
+++ b/Mage.Sets/src/mage/cards/c/CatapultSquad.java
@@ -29,7 +29,7 @@ public final class CatapultSquad extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Soldiers you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.SOLDIER));
}
diff --git a/Mage.Sets/src/mage/cards/c/CathedralMembrane.java b/Mage.Sets/src/mage/cards/c/CathedralMembrane.java
index 01c4248f3f3..c68b2490952 100644
--- a/Mage.Sets/src/mage/cards/c/CathedralMembrane.java
+++ b/Mage.Sets/src/mage/cards/c/CathedralMembrane.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.*;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ZoneChangeTriggeredAbility;
@@ -15,6 +14,10 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.watchers.Watcher;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
* @author BetaSteward
*/
@@ -35,7 +38,7 @@ public final class CathedralMembrane extends CardImpl {
}
- public CathedralMembrane(final CathedralMembrane card) {
+ private CathedralMembrane(final CathedralMembrane card) {
super(card);
}
@@ -47,11 +50,11 @@ public final class CathedralMembrane extends CardImpl {
class CathedralMembraneAbility extends ZoneChangeTriggeredAbility {
- public CathedralMembraneAbility() {
+ CathedralMembraneAbility() {
super(Zone.BATTLEFIELD, Zone.GRAVEYARD, new CathedralMembraneEffect(), "When {this} dies during combat, ", false);
}
- public CathedralMembraneAbility(CathedralMembraneAbility ability) {
+ private CathedralMembraneAbility(CathedralMembraneAbility ability) {
super(ability);
}
@@ -74,12 +77,12 @@ class CathedralMembraneAbility extends ZoneChangeTriggeredAbility {
class CathedralMembraneEffect extends OneShotEffect {
- public CathedralMembraneEffect() {
+ CathedralMembraneEffect() {
super(Outcome.Damage);
staticText = "it deals 6 damage to each creature it blocked this combat";
}
- public CathedralMembraneEffect(final CathedralMembraneEffect effect) {
+ private CathedralMembraneEffect(final CathedralMembraneEffect effect) {
super(effect);
}
@@ -90,9 +93,9 @@ class CathedralMembraneEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- CathedralMembraneWatcher watcher = (CathedralMembraneWatcher) game.getState().getWatchers().get(CathedralMembraneWatcher.class.getSimpleName(), source.getSourceId());
+ CathedralMembraneWatcher watcher = game.getState().getWatcher(CathedralMembraneWatcher.class, source.getSourceId());
if (watcher != null) {
- for (UUID uuid : watcher.blockedCreatures) {
+ for (UUID uuid : watcher.getBlockedCreatures()) {
Permanent permanent = game.getPermanent(uuid);
if (permanent != null) {
permanent.damage(6, source.getSourceId(), game, false, true);
@@ -105,13 +108,13 @@ class CathedralMembraneEffect extends OneShotEffect {
class CathedralMembraneWatcher extends Watcher {
- public Set blockedCreatures = new HashSet<>();
+ private final Set blockedCreatures = new HashSet<>();
- public CathedralMembraneWatcher() {
+ CathedralMembraneWatcher() {
super(CathedralMembraneWatcher.class.getSimpleName(), WatcherScope.CARD);
}
- public CathedralMembraneWatcher(final CathedralMembraneWatcher watcher) {
+ private CathedralMembraneWatcher(final CathedralMembraneWatcher watcher) {
super(watcher);
this.blockedCreatures.addAll(watcher.blockedCreatures);
}
@@ -134,4 +137,7 @@ class CathedralMembraneWatcher extends Watcher {
blockedCreatures.clear();
}
+ Set getBlockedCreatures() {
+ return blockedCreatures;
+ }
}
diff --git a/Mage.Sets/src/mage/cards/c/CauldronHaze.java b/Mage.Sets/src/mage/cards/c/CauldronHaze.java
index db95a2d1e11..28f0e6d9c7e 100644
--- a/Mage.Sets/src/mage/cards/c/CauldronHaze.java
+++ b/Mage.Sets/src/mage/cards/c/CauldronHaze.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.PersistAbility;
import mage.cards.CardImpl;
@@ -10,13 +9,14 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class CauldronHaze extends CardImpl {
- private final String rule = "Choose any number of target creatures. Each of those creatures gains persist until end of turn";
+ private static final String rule = "Choose any number of target creatures. Each of those creatures gains persist until end of turn";
public CauldronHaze(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W/B}");
@@ -24,7 +24,6 @@ public final class CauldronHaze extends CardImpl {
// Choose any number of target creatures. Each of those creatures gains persist until end of turn.
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(new PersistAbility(), Duration.EndOfTurn, rule));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE));
-
}
public CauldronHaze(final CauldronHaze card) {
diff --git a/Mage.Sets/src/mage/cards/c/CavalcadeOfCalamity.java b/Mage.Sets/src/mage/cards/c/CavalcadeOfCalamity.java
new file mode 100644
index 00000000000..7c7f863bad6
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CavalcadeOfCalamity.java
@@ -0,0 +1,72 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAllTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CavalcadeOfCalamity extends CardImpl {
+
+ private static final FilterCreaturePermanent filter
+ = new FilterCreaturePermanent("creaure you control with power 1 or less");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 2));
+ }
+
+ public CavalcadeOfCalamity(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
+
+ // Whenever a creature you control with power 1 or less attacks, Cavalcade of Calamity deals 1 damage to the player or planeswalker that creature is attacking.
+ this.addAbility(new AttacksAllTriggeredAbility(
+ new CavalcadeOfCalamityEffect(), false, filter,
+ SetTargetPointer.PERMANENT, false, false
+ ));
+ }
+
+ private CavalcadeOfCalamity(final CavalcadeOfCalamity card) {
+ super(card);
+ }
+
+ @Override
+ public CavalcadeOfCalamity copy() {
+ return new CavalcadeOfCalamity(this);
+ }
+}
+
+class CavalcadeOfCalamityEffect extends OneShotEffect {
+
+ CavalcadeOfCalamityEffect() {
+ super(Outcome.Benefit);
+ staticText = "{this} deals 1 damage to the player or planeswalker that creature is attacking.";
+ }
+
+ private CavalcadeOfCalamityEffect(final CavalcadeOfCalamityEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CavalcadeOfCalamityEffect copy() {
+ return new CavalcadeOfCalamityEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return game.damagePlayerOrPlaneswalker(
+ game.getCombat().getDefenderId(targetPointer.getFirst(game, source)), 1,
+ source.getSourceId(), game, false, true
+ ) > 0;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CavalryPegasus.java b/Mage.Sets/src/mage/cards/c/CavalryPegasus.java
index 023e566e087..6d46fa8c7c9 100644
--- a/Mage.Sets/src/mage/cards/c/CavalryPegasus.java
+++ b/Mage.Sets/src/mage/cards/c/CavalryPegasus.java
@@ -25,7 +25,7 @@ public final class CavalryPegasus extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("each attacking Human");
static {
filter.add(new SubtypePredicate(SubType.HUMAN));
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public CavalryPegasus(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CavernOfSouls.java b/Mage.Sets/src/mage/cards/c/CavernOfSouls.java
index 87e9f839ebe..57d0c4482e4 100644
--- a/Mage.Sets/src/mage/cards/c/CavernOfSouls.java
+++ b/Mage.Sets/src/mage/cards/c/CavernOfSouls.java
@@ -197,7 +197,7 @@ class CavernOfSoulsCantCounterEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- CavernOfSoulsWatcher watcher = (CavernOfSoulsWatcher) game.getState().getWatchers().get(CavernOfSoulsWatcher.class.getSimpleName(), source.getSourceId());
+ CavernOfSoulsWatcher watcher = game.getState().getWatcher(CavernOfSoulsWatcher.class, source.getSourceId());
Spell spell = game.getStack().getSpell(event.getTargetId());
return spell != null && watcher != null && watcher.spellCantBeCountered(spell.getId());
}
diff --git a/Mage.Sets/src/mage/cards/c/CennsHeir.java b/Mage.Sets/src/mage/cards/c/CennsHeir.java
index ed5c3645f2b..c5dc2acad2a 100644
--- a/Mage.Sets/src/mage/cards/c/CennsHeir.java
+++ b/Mage.Sets/src/mage/cards/c/CennsHeir.java
@@ -25,7 +25,7 @@ public final class CennsHeir extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.KITHKIN));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public CennsHeir(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CephalidShrine.java b/Mage.Sets/src/mage/cards/c/CephalidShrine.java
index 4bd752a8408..63121de89df 100644
--- a/Mage.Sets/src/mage/cards/c/CephalidShrine.java
+++ b/Mage.Sets/src/mage/cards/c/CephalidShrine.java
@@ -109,7 +109,7 @@ class CephalidShrineEffect extends OneShotEffect {
}
// even if the cost is 0, we still offer
Cost cost = new GenericManaCost(count);
- if (game.getStack().contains((StackObject) spell)
+ if (game.getStack().contains(spell)
&& cost.canPay(source, source.getSourceId(), controller.getId(), game)
&& controller.chooseUse(outcome, "Pay " + cost.getText() + " to prevent countering " + spell.getName() + "?", source, game)
&& cost.pay(source, game, source.getSourceId(), controller.getId(), false)
diff --git a/Mage.Sets/src/mage/cards/c/CerebralVortex.java b/Mage.Sets/src/mage/cards/c/CerebralVortex.java
index 84217202544..eca4f82e049 100644
--- a/Mage.Sets/src/mage/cards/c/CerebralVortex.java
+++ b/Mage.Sets/src/mage/cards/c/CerebralVortex.java
@@ -66,7 +66,7 @@ class CerebralVortexEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player targetPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source));
if (targetPlayer != null) {
- CerebralVortexWatcher watcher = (CerebralVortexWatcher) game.getState().getWatchers().get(CerebralVortexWatcher.class.getSimpleName());
+ CerebralVortexWatcher watcher = game.getState().getWatcher(CerebralVortexWatcher.class);
if (watcher != null) {
targetPlayer.damage(watcher.getDraws(targetPlayer.getId()), source.getSourceId(), game, false, true);
return true;
diff --git a/Mage.Sets/src/mage/cards/c/CeremoniousRejection.java b/Mage.Sets/src/mage/cards/c/CeremoniousRejection.java
index c3aed499b7e..e8ef317b006 100644
--- a/Mage.Sets/src/mage/cards/c/CeremoniousRejection.java
+++ b/Mage.Sets/src/mage/cards/c/CeremoniousRejection.java
@@ -19,7 +19,7 @@ public final class CeremoniousRejection extends CardImpl {
private static final FilterSpell filter = new FilterSpell("colorless spell");
static{
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
}
public CeremoniousRejection(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/Cessation.java b/Mage.Sets/src/mage/cards/c/Cessation.java
index 1407222dcf6..c06f089f7c7 100644
--- a/Mage.Sets/src/mage/cards/c/Cessation.java
+++ b/Mage.Sets/src/mage/cards/c/Cessation.java
@@ -1,7 +1,5 @@
-
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -11,33 +9,31 @@ import mage.abilities.effects.common.combat.CantAttackAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author Backfir3
*/
public final class Cessation extends CardImpl {
public Cessation(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}");
this.subtype.add(SubType.AURA);
-
//Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
- this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
Ability ability = new EnchantAbility(auraTarget.getTargetName());
this.addAbility(ability);
+
//Enchanted creature can't attack.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackAttachedEffect(AttachmentType.AURA)));
+
//When Cessation is put into a graveyard from the battlefield, return Cessation to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
}
diff --git a/Mage.Sets/src/mage/cards/c/ChainsOfMephistopheles.java b/Mage.Sets/src/mage/cards/c/ChainsOfMephistopheles.java
index 04f12fe4cf8..4cba73bcdca 100644
--- a/Mage.Sets/src/mage/cards/c/ChainsOfMephistopheles.java
+++ b/Mage.Sets/src/mage/cards/c/ChainsOfMephistopheles.java
@@ -86,7 +86,7 @@ class ChainsOfMephistophelesReplacementEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (game.isActivePlayer(event.getPlayerId()) && game.getPhase().getStep().getType() == PhaseStep.DRAW) {
- CardsDrawnDuringDrawStepWatcher watcher = (CardsDrawnDuringDrawStepWatcher) game.getState().getWatchers().get(CardsDrawnDuringDrawStepWatcher.class.getSimpleName());
+ CardsDrawnDuringDrawStepWatcher watcher = game.getState().getWatcher(CardsDrawnDuringDrawStepWatcher.class);
if (watcher != null && watcher.getAmountCardsDrawn(event.getPlayerId()) > 0) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/c/ChamberSentry.java b/Mage.Sets/src/mage/cards/c/ChamberSentry.java
index 60c11825020..7e8969db2a5 100644
--- a/Mage.Sets/src/mage/cards/c/ChamberSentry.java
+++ b/Mage.Sets/src/mage/cards/c/ChamberSentry.java
@@ -44,7 +44,7 @@ public final class ChamberSentry extends CardImpl {
"with a +1/+1 counter on it for each color of mana spent to cast it"));
// {X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue())
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.instance)
.setText("It deals X damage to any target"),
new ManaCostsImpl("{X}"));
ability.addCost(new TapSourceCost());
diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfLambholt.java b/Mage.Sets/src/mage/cards/c/ChampionOfLambholt.java
index de10a0845e0..79b077a5d31 100644
--- a/Mage.Sets/src/mage/cards/c/ChampionOfLambholt.java
+++ b/Mage.Sets/src/mage/cards/c/ChampionOfLambholt.java
@@ -30,7 +30,7 @@ public final class ChampionOfLambholt extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfStraySouls.java b/Mage.Sets/src/mage/cards/c/ChampionOfStraySouls.java
index 24434b01b7f..f8e27453659 100644
--- a/Mage.Sets/src/mage/cards/c/ChampionOfStraySouls.java
+++ b/Mage.Sets/src/mage/cards/c/ChampionOfStraySouls.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -22,22 +21,23 @@ import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.permanent.AnotherPredicate;
import mage.game.Game;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class ChampionOfStraySouls extends CardImpl {
- private final UUID originalId;
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ChampionOfStraySouls(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}");
this.subtype.add(SubType.SKELETON);
this.subtype.add(SubType.WARRIOR);
@@ -49,7 +49,6 @@ public final class ChampionOfStraySouls extends CardImpl {
* ability, before you pay any costs. You can't target any of the
* creatures you sacrifice.
*/
- //TODO: Make ability properly copiable
// {3}{B}{B}, {T}, Sacrifice X other creatures: Return X target creatures from your graveyard to the battlefield.
Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect();
effect.setText("Return X target creatures from your graveyard to the battlefield");
@@ -57,32 +56,17 @@ public final class ChampionOfStraySouls extends CardImpl {
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeXTargetCost(filter));
ability.addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard")));
- originalId = ability.getOriginalId();
+ ability.setTargetAdjuster(ChampionOfStraySoulsAdjuster.instance);
this.addAbility(ability);
// {5}{B}{B}: Put Champion of Stray Souls on top of your library from your graveyard.
this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD,
new PutOnLibrarySourceEffect(true, "Put {this} on top of your library from your graveyard"),
new ManaCostsImpl("{5}{B}{B}")));
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- for (Effect effect : ability.getEffects()) {
- if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) {
- int xValue = new GetXValue().calculate(game, ability, null);
- ability.getTargets().clear();
- ability.addTarget(new TargetCardInYourGraveyard(xValue, xValue, new FilterCreatureCard("creature cards from your graveyard")));
- }
- }
- }
}
public ChampionOfStraySouls(final ChampionOfStraySouls card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -90,3 +74,18 @@ public final class ChampionOfStraySouls extends CardImpl {
return new ChampionOfStraySouls(this);
}
}
+
+enum ChampionOfStraySoulsAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ for (Effect effect : ability.getEffects()) {
+ if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) {
+ int xValue = GetXValue.instance.calculate(game, ability, null);
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCardInYourGraveyard(xValue, xValue, new FilterCreatureCard("creature cards from your graveyard")));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfTheParish.java b/Mage.Sets/src/mage/cards/c/ChampionOfTheParish.java
index 8e57197839b..617487fb233 100644
--- a/Mage.Sets/src/mage/cards/c/ChampionOfTheParish.java
+++ b/Mage.Sets/src/mage/cards/c/ChampionOfTheParish.java
@@ -24,7 +24,7 @@ public final class ChampionOfTheParish extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another Human");
static {
filter.add(new SubtypePredicate(SubType.HUMAN));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ChampionOfTheParish(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/ChanceEncounter.java b/Mage.Sets/src/mage/cards/c/ChanceEncounter.java
index 84d4fbbac84..20801608a89 100644
--- a/Mage.Sets/src/mage/cards/c/ChanceEncounter.java
+++ b/Mage.Sets/src/mage/cards/c/ChanceEncounter.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.TriggeredAbility;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -16,27 +15,29 @@ import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
+import mage.game.events.CoinFlippedEvent;
import mage.game.events.GameEvent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class ChanceEncounter extends CardImpl {
public ChanceEncounter(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{R}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}");
// Whenever you win a coin flip, put a luck counter on Chance Encounter.
this.addAbility(new ChanceEncounterTriggeredAbility());
-
+
// At the beginning of your upkeep, if Chance Encounter has ten or more luck counters on it, you win the game.
- TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new WinGameSourceControllerEffect(), TargetController.YOU, false);
+ TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new WinGameSourceControllerEffect(), TargetController.YOU, false);
this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceHasCounterCondition(CounterType.LUCK, 10, Integer.MAX_VALUE),
"At the beginning of your upkeep, if {this} has ten or more luck counters on it, you win the game"));
}
- public ChanceEncounter(final ChanceEncounter card) {
+ private ChanceEncounter(final ChanceEncounter card) {
super(card);
}
@@ -47,30 +48,33 @@ public final class ChanceEncounter extends CardImpl {
}
class ChanceEncounterTriggeredAbility extends TriggeredAbilityImpl {
-
- public ChanceEncounterTriggeredAbility() {
+
+ ChanceEncounterTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.LUCK.createInstance()), false);
}
-
- public ChanceEncounterTriggeredAbility(final ChanceEncounterTriggeredAbility ability) {
+
+ private ChanceEncounterTriggeredAbility(final ChanceEncounterTriggeredAbility ability) {
super(ability);
}
-
+
@Override
public ChanceEncounterTriggeredAbility copy() {
return new ChanceEncounterTriggeredAbility(this);
}
-
+
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.COIN_FLIPPED;
}
-
+
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- return this.isControlledBy(event.getPlayerId()) && event.getFlag();
+ CoinFlippedEvent flipEvent = (CoinFlippedEvent) event;
+ return flipEvent.getPlayerId().equals(controllerId)
+ && flipEvent.isWinnable()
+ && (flipEvent.getChosen() == flipEvent.getResult());
}
-
+
@Override
public String getRule() {
return "Whenever you win a coin flip, " + super.getRule();
diff --git a/Mage.Sets/src/mage/cards/c/ChaosMaw.java b/Mage.Sets/src/mage/cards/c/ChaosMaw.java
index 7916f847db4..c53c0263ea3 100644
--- a/Mage.Sets/src/mage/cards/c/ChaosMaw.java
+++ b/Mage.Sets/src/mage/cards/c/ChaosMaw.java
@@ -14,7 +14,7 @@ import mage.filter.predicate.permanent.AnotherPredicate;
public final class ChaosMaw extends CardImpl {
private static FilterCreaturePermanent filter = new FilterCreaturePermanent("other creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ChaosMaw(UUID ownerId, CardSetInfo cardSetInfo){
super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
diff --git a/Mage.Sets/src/mage/cards/c/ChaoticGoo.java b/Mage.Sets/src/mage/cards/c/ChaoticGoo.java
index 9e80008f076..d66c6778fea 100644
--- a/Mage.Sets/src/mage/cards/c/ChaoticGoo.java
+++ b/Mage.Sets/src/mage/cards/c/ChaoticGoo.java
@@ -67,7 +67,7 @@ class ChaoticGooEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId());
if (controller != null && permanent != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
game.informPlayers("Chaotic Goo: Won flip. Put a +1/+1 counter on Chaotic Goo.");
new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)).apply(game, source);
return true;
diff --git a/Mage.Sets/src/mage/cards/c/ChaoticStrike.java b/Mage.Sets/src/mage/cards/c/ChaoticStrike.java
index 49424f17232..2c97e2a4150 100644
--- a/Mage.Sets/src/mage/cards/c/ChaoticStrike.java
+++ b/Mage.Sets/src/mage/cards/c/ChaoticStrike.java
@@ -65,7 +65,7 @@ class ChaoticStrikeEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (controller != null && permanent != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
game.addEffect(new BoostTargetEffect(1, 1, Duration.EndOfTurn), source);
return true;
}
diff --git a/Mage.Sets/src/mage/cards/c/ChargingCinderhorn.java b/Mage.Sets/src/mage/cards/c/ChargingCinderhorn.java
index 52d71ff7668..28603c5d0f2 100644
--- a/Mage.Sets/src/mage/cards/c/ChargingCinderhorn.java
+++ b/Mage.Sets/src/mage/cards/c/ChargingCinderhorn.java
@@ -62,7 +62,7 @@ class ChargingCinderhornCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
if (watcher != null) {
return watcher.getAttackedThisTurnCreatures().isEmpty();
}
diff --git a/Mage.Sets/src/mage/cards/c/ChargingWarBoar.java b/Mage.Sets/src/mage/cards/c/ChargingWarBoar.java
new file mode 100644
index 00000000000..64cc6041eb9
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/ChargingWarBoar.java
@@ -0,0 +1,65 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPlaneswalkerPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ChargingWarBoar extends CardImpl {
+
+ private static final Condition condition
+ = new PermanentsOnTheBattlefieldCondition(new FilterControlledPlaneswalkerPermanent(SubType.DOMRI));
+
+ public ChargingWarBoar(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{G}");
+
+ this.subtype.add(SubType.BOAR);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+
+ // As long as you control a Domri planeswalker, Charging War Boar gets +1/+1 and has trample.
+ Ability ability = new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new ConditionalContinuousEffect(
+ new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield),
+ condition, "As long as you control a Domri planeswalker, {this} gets +1/+1"
+ )
+ );
+ ability.addEffect(new ConditionalContinuousEffect(
+ new GainAbilitySourceEffect(
+ TrampleAbility.getInstance(), Duration.WhileOnBattlefield
+ ), condition, "and has trample"
+ ));
+ this.addAbility(ability);
+ }
+
+ private ChargingWarBoar(final ChargingWarBoar card) {
+ super(card);
+ }
+
+ @Override
+ public ChargingWarBoar copy() {
+ return new ChargingWarBoar(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/CherishedHatchling.java b/Mage.Sets/src/mage/cards/c/CherishedHatchling.java
index 46363fd9170..a4bfcdfa488 100644
--- a/Mage.Sets/src/mage/cards/c/CherishedHatchling.java
+++ b/Mage.Sets/src/mage/cards/c/CherishedHatchling.java
@@ -1,7 +1,5 @@
-
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
@@ -27,8 +25,9 @@ import mage.game.stack.Spell;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class CherishedHatchling extends CardImpl {
@@ -67,7 +66,7 @@ class CherishedHatchlingTriggeredAbility extends DelayedTriggeredAbility {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public CherishedHatchlingTriggeredAbility() {
@@ -113,48 +112,3 @@ class CherishedHatchlingTriggeredAbility extends DelayedTriggeredAbility {
return "and whenever you cast a Dinosaur spell this turn, " + super.getRule();
}
}
-
-//class CherishedHatchlingGainAbilityEffect extends ContinuousEffectImpl {
-//
-// private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
-//
-// static {
-// filter.add(new AnotherPredicate());
-// }
-// private Ability abilityToAdd = null;
-// private Card relatedCard = null;
-//
-// public CherishedHatchlingGainAbilityEffect() {
-// super(Duration.EndOfTurn, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
-// staticText = "it gains \"When this creature enters the battlefield, you may have it fight another target creature.\"";
-// }
-//
-// public CherishedHatchlingGainAbilityEffect(final CherishedHatchlingGainAbilityEffect effect) {
-// super(effect);
-// this.abilityToAdd = effect.abilityToAdd;
-// this.relatedCard = effect.relatedCard;
-// }
-//
-// @Override
-// public CherishedHatchlingGainAbilityEffect copy() {
-// return new CherishedHatchlingGainAbilityEffect(this);
-// }
-//
-// @Override
-// public boolean apply(Game game, Ability source) {
-// if (relatedCard == null) {
-// Spell spell = game.getStack().getSpell(getTargetPointer().getFirst(game, source));
-// if (spell != null) {
-// relatedCard = game.getCard(spell.getSourceId());
-// Effect effect = new FightTargetSourceEffect();
-// effect.setText("you may have it fight another target creature");
-// abilityToAdd = new EntersBattlefieldTriggeredAbility(effect, true);
-// abilityToAdd.addTarget(new TargetCreaturePermanent(filter));
-// }
-// }
-// if (relatedCard != null) {
-// game.getState().addOtherAbility(relatedCard, abilityToAdd, false);
-// }
-// return true;
-// }
-//}
diff --git a/Mage.Sets/src/mage/cards/c/Chewbacca.java b/Mage.Sets/src/mage/cards/c/Chewbacca.java
index 66f13c8ea06..be15218f899 100644
--- a/Mage.Sets/src/mage/cards/c/Chewbacca.java
+++ b/Mage.Sets/src/mage/cards/c/Chewbacca.java
@@ -26,7 +26,7 @@ public final class Chewbacca extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public Chewbacca(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/ChewbaccaTheBeast.java b/Mage.Sets/src/mage/cards/c/ChewbaccaTheBeast.java
index d206feff7e5..f7ffe1d408b 100644
--- a/Mage.Sets/src/mage/cards/c/ChewbaccaTheBeast.java
+++ b/Mage.Sets/src/mage/cards/c/ChewbaccaTheBeast.java
@@ -27,8 +27,8 @@ public final class ChewbaccaTheBeast extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
- filter.add(new AttackingPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(AttackingPredicate.instance);
}
public ChewbaccaTheBeast(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/ChickenALaKing.java b/Mage.Sets/src/mage/cards/c/ChickenALaKing.java
index 54fc631a3b3..db786af300e 100644
--- a/Mage.Sets/src/mage/cards/c/ChickenALaKing.java
+++ b/Mage.Sets/src/mage/cards/c/ChickenALaKing.java
@@ -33,7 +33,7 @@ public final class ChickenALaKing extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Chicken you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.CHICKEN));
}
diff --git a/Mage.Sets/src/mage/cards/c/ChiefChirpa.java b/Mage.Sets/src/mage/cards/c/ChiefChirpa.java
index 4751f53f001..5cd547a4408 100644
--- a/Mage.Sets/src/mage/cards/c/ChiefChirpa.java
+++ b/Mage.Sets/src/mage/cards/c/ChiefChirpa.java
@@ -40,7 +40,7 @@ public final class ChiefChirpa extends CardImpl {
diedFilter.add(new ControllerPredicate(TargetController.YOU));
ewokFilter.add(new SubtypePredicate(SubType.EWOK));
- ewokFilter.add(new AnotherPredicate());
+ ewokFilter.add(AnotherPredicate.instance);
}
public ChiefChirpa(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/ChildrenOfKorlis.java b/Mage.Sets/src/mage/cards/c/ChildrenOfKorlis.java
index c38f2ec2f41..6275d1f0f3e 100644
--- a/Mage.Sets/src/mage/cards/c/ChildrenOfKorlis.java
+++ b/Mage.Sets/src/mage/cards/c/ChildrenOfKorlis.java
@@ -52,9 +52,9 @@ class SourceControllerLostLifeCount implements DynamicValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
- PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
+ PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class);
if (watcher != null) {
- return watcher.getLiveLost(sourceAbility.getControllerId());
+ return watcher.getLifeLost(sourceAbility.getControllerId());
}
return 0;
}
diff --git a/Mage.Sets/src/mage/cards/c/ChillHaunting.java b/Mage.Sets/src/mage/cards/c/ChillHaunting.java
index 2730c08155f..d13c2420f26 100644
--- a/Mage.Sets/src/mage/cards/c/ChillHaunting.java
+++ b/Mage.Sets/src/mage/cards/c/ChillHaunting.java
@@ -28,7 +28,7 @@ public final class ChillHaunting extends CardImpl {
// Target creature gets -X/-X until end of turn.
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
- DynamicValue xval = new SignInversionDynamicValue(new GetXValue());
+ DynamicValue xval = new SignInversionDynamicValue(GetXValue.instance);
this.getSpellAbility().addEffect(new BoostTargetEffect(xval, xval, Duration.EndOfTurn));
}
diff --git a/Mage.Sets/src/mage/cards/c/Chillbringer.java b/Mage.Sets/src/mage/cards/c/Chillbringer.java
new file mode 100644
index 00000000000..bd03de10b71
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/Chillbringer.java
@@ -0,0 +1,47 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.target.common.TargetOpponentsCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Chillbringer extends CardImpl {
+
+ public Chillbringer(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}");
+
+ this.subtype.add(SubType.ELEMENTAL);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // When Chillbringer enters the battlefield, tap target creature an opponent controls. It doesn't untap during its controller's next untap step.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect());
+ ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("It"));
+ ability.addTarget(new TargetOpponentsCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ private Chillbringer(final Chillbringer card) {
+ super(card);
+ }
+
+ @Override
+ public Chillbringer copy() {
+ return new Chillbringer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/ChimeOfNight.java b/Mage.Sets/src/mage/cards/c/ChimeOfNight.java
index 5f3a207f0b7..60ae0c61488 100644
--- a/Mage.Sets/src/mage/cards/c/ChimeOfNight.java
+++ b/Mage.Sets/src/mage/cards/c/ChimeOfNight.java
@@ -1,25 +1,25 @@
package mage.cards.c;
-import java.util.UUID;
import mage.ObjectColor;
-import mage.target.common.TargetCreaturePermanent;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
-import mage.constants.Outcome;
-import mage.target.TargetPermanent;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class ChimeOfNight extends CardImpl {
@@ -43,7 +43,7 @@ public final class ChimeOfNight extends CardImpl {
this.addAbility(ability);
// When Chime of Night is put into a graveyard from the battlefield, destroy target nonblack creature.
- ability = new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DestroyTargetEffect(), false);
+ ability = new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DestroyTargetEffect());
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/c/ChiseiHeartOfOceans.java b/Mage.Sets/src/mage/cards/c/ChiseiHeartOfOceans.java
index 207982df3b9..916b686a1cb 100644
--- a/Mage.Sets/src/mage/cards/c/ChiseiHeartOfOceans.java
+++ b/Mage.Sets/src/mage/cards/c/ChiseiHeartOfOceans.java
@@ -29,7 +29,7 @@ public final class ChiseiHeartOfOceans extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new CounterAnyPredicate());
+ filter.add(CounterAnyPredicate.instance);
}
public ChiseiHeartOfOceans(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/ChosenOfMarkov.java b/Mage.Sets/src/mage/cards/c/ChosenOfMarkov.java
index 5a31f0d5b8e..e4771fc0e7d 100644
--- a/Mage.Sets/src/mage/cards/c/ChosenOfMarkov.java
+++ b/Mage.Sets/src/mage/cards/c/ChosenOfMarkov.java
@@ -28,7 +28,7 @@ public final class ChosenOfMarkov extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Vampire you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.VAMPIRE));
}
diff --git a/Mage.Sets/src/mage/cards/c/ChromeMox.java b/Mage.Sets/src/mage/cards/c/ChromeMox.java
index b3b414ee191..75fd118e48c 100644
--- a/Mage.Sets/src/mage/cards/c/ChromeMox.java
+++ b/Mage.Sets/src/mage/cards/c/ChromeMox.java
@@ -1,8 +1,5 @@
package mage.cards.c;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
import mage.MageObject;
import mage.Mana;
import mage.ObjectColor;
@@ -30,8 +27,11 @@ import mage.target.TargetCard;
import mage.util.CardUtil;
import mage.util.GameLog;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author Plopman
*/
public final class ChromeMox extends CardImpl {
@@ -141,7 +141,7 @@ class ChromeMoxManaEffect extends ManaEffect {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
List imprinted = permanent.getImprinted();
- if (!imprinted.isEmpty()) {
+ if (imprinted != null && !imprinted.isEmpty()) {
Card imprintedCard = game.getCard(imprinted.get(0));
if (imprintedCard != null) {
ObjectColor color = imprintedCard.getColor(game);
@@ -172,7 +172,7 @@ class ChromeMoxManaEffect extends ManaEffect {
Player player = game.getPlayer(source.getControllerId());
if (permanent != null && player != null) {
List imprinted = permanent.getImprinted();
- if (!imprinted.isEmpty()) {
+ if (imprinted != null && !imprinted.isEmpty()) {
Card imprintedCard = game.getCard(imprinted.get(0));
if (imprintedCard != null) {
Choice choice = new ChoiceColor(true);
diff --git a/Mage.Sets/src/mage/cards/c/ChromeSteed.java b/Mage.Sets/src/mage/cards/c/ChromeSteed.java
index b0e34f7e10f..87b468f3c26 100644
--- a/Mage.Sets/src/mage/cards/c/ChromeSteed.java
+++ b/Mage.Sets/src/mage/cards/c/ChromeSteed.java
@@ -2,38 +2,42 @@
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.MetalcraftCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
-import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.constants.Zone;
+import java.util.UUID;
+
/**
- *
* @author Loki
*/
public final class ChromeSteed extends CardImpl {
- private static final String text = "Metalcraft — Chrome Steed gets +2/+2 as long as you control three or more artifacts";
- public ChromeSteed (UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}");
+ public ChromeSteed(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}");
this.subtype.add(SubType.HORSE);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
- ContinuousEffect boostSource = new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield);
- ConditionalContinuousEffect effect = new ConditionalContinuousEffect(boostSource, MetalcraftCondition.instance, text);
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
+
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new ConditionalContinuousEffect(
+ new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield),
+ MetalcraftCondition.instance, "Metalcraft — {this} gets " +
+ "+2/+2 as long as you control three or more artifacts"
+ )
+ ));
}
- public ChromeSteed (final ChromeSteed card) {
+ public ChromeSteed(final ChromeSteed card) {
super(card);
}
diff --git a/Mage.Sets/src/mage/cards/c/CinderCloud.java b/Mage.Sets/src/mage/cards/c/CinderCloud.java
index 24d02c18e8a..9cdc4082931 100644
--- a/Mage.Sets/src/mage/cards/c/CinderCloud.java
+++ b/Mage.Sets/src/mage/cards/c/CinderCloud.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
@@ -15,8 +14,9 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author ciaccona007
*/
public final class CinderCloud extends CardImpl {
@@ -43,7 +43,8 @@ class CinderCloudEffect extends OneShotEffect {
public CinderCloudEffect() {
super(Outcome.Benefit);
- this.staticText = "Destroy target creature. If a white creature dies this way, {this} deals damage to that creature's controller equal to the creature's power";
+ this.staticText = "Destroy target creature. If a white creature dies this way, " +
+ "{this} deals damage to that creature's controller equal to the creature's power";
}
public CinderCloudEffect(final CinderCloudEffect effect) {
@@ -71,6 +72,6 @@ class CinderCloudEffect extends OneShotEffect {
permanentController.damage(damage, source.getSourceId(), game, false, true);
}
}
- return true;
+ return false;
}
}
diff --git a/Mage.Sets/src/mage/cards/c/CinderElemental.java b/Mage.Sets/src/mage/cards/c/CinderElemental.java
index 8adeae708e2..16a0dfcae52 100644
--- a/Mage.Sets/src/mage/cards/c/CinderElemental.java
+++ b/Mage.Sets/src/mage/cards/c/CinderElemental.java
@@ -31,7 +31,7 @@ public final class CinderElemental extends CardImpl {
this.toughness = new MageInt(2);
// {X}{R}, {tap}, Sacrifice Cinder Elemental: Cinder Elemental deals X damage to any target.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}{R}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.instance), new ManaCostsImpl("{X}{R}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetAnyTarget());
diff --git a/Mage.Sets/src/mage/cards/c/CinderGiant.java b/Mage.Sets/src/mage/cards/c/CinderGiant.java
index bce7205df58..24cfbac2280 100644
--- a/Mage.Sets/src/mage/cards/c/CinderGiant.java
+++ b/Mage.Sets/src/mage/cards/c/CinderGiant.java
@@ -21,7 +21,7 @@ public final class CinderGiant extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("each other creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public CinderGiant(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/Cindervines.java b/Mage.Sets/src/mage/cards/c/Cindervines.java
new file mode 100644
index 00000000000..80233fc9451
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/Cindervines.java
@@ -0,0 +1,88 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SpellCastOpponentTriggeredAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SetTargetPointer;
+import mage.constants.Zone;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Cindervines extends CardImpl {
+
+ public Cindervines(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}{G}");
+
+ // Whenever an opponent casts a noncreature spell, Cindervines deals 1 damage to that player.
+ this.addAbility(new SpellCastOpponentTriggeredAbility(
+ Zone.BATTLEFIELD, new DamageTargetEffect(1, true, "that player"),
+ StaticFilters.FILTER_SPELL_NON_CREATURE, false, SetTargetPointer.PLAYER
+ ));
+
+ // {1}, Sacrifice Cindervines: Destroy target artifact or enchantment. Cindervines deals 2 damage to that permanent's controller.
+ Ability ability = new SimpleActivatedAbility(
+ new CindervinesEffect(), new GenericManaCost(1)
+ );
+ ability.addCost(new SacrificeSourceCost());
+ ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
+ this.addAbility(ability);
+ }
+
+ private Cindervines(final Cindervines card) {
+ super(card);
+ }
+
+ @Override
+ public Cindervines copy() {
+ return new Cindervines(this);
+ }
+}
+
+class CindervinesEffect extends OneShotEffect {
+
+ CindervinesEffect() {
+ super(Outcome.Benefit);
+ staticText = "Destroy target artifact or enchantment. " +
+ "{this} deals 2 damage to that permanent's controller.";
+ }
+
+ private CindervinesEffect(final CindervinesEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CindervinesEffect copy() {
+ return new CindervinesEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ if (permanent == null) {
+ return false;
+ }
+ Player player = game.getPlayer(permanent.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ permanent.destroy(source.getSourceId(), game, false);
+ player.damage(2, source.getSourceId(), game);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CircleOfAffliction.java b/Mage.Sets/src/mage/cards/c/CircleOfAffliction.java
index cc3962342fe..4091fb8bf09 100644
--- a/Mage.Sets/src/mage/cards/c/CircleOfAffliction.java
+++ b/Mage.Sets/src/mage/cards/c/CircleOfAffliction.java
@@ -1,4 +1,3 @@
-
package mage.cards.c;
import java.util.UUID;
@@ -29,7 +28,7 @@ import mage.target.TargetPlayer;
public final class CircleOfAffliction extends CardImpl {
public CircleOfAffliction(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
// As Circle of Affliction enters the battlefield, choose a color.
this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Neutral)));
@@ -69,12 +68,12 @@ class CircleOfAfflictionTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent circleOfAffliction = game.getPermanentOrLKIBattlefield(getSourceId());
- if (circleOfAffliction != null) {
+ if (circleOfAffliction != null && event.getTargetId().equals(getControllerId())) {
ObjectColor chosenColor = (ObjectColor) game.getState().getValue(circleOfAffliction.getId() + "_color");
if (chosenColor != null) {
MageObject damageSource = game.getObject(event.getSourceId());
if (damageSource != null) {
- if ( damageSource.getColor(game).shares(chosenColor) ) {
+ if (damageSource.getColor(game).shares(chosenColor)) {
return true;
}
}
@@ -92,4 +91,4 @@ class CircleOfAfflictionTriggeredAbility extends TriggeredAbilityImpl {
public String getRule() {
return "Whenever a source of the chosen color deals damage to you, you may pay {1}. If you do, target player loses 1 life and you gain 1 life.";
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/c/CitadelOfPain.java b/Mage.Sets/src/mage/cards/c/CitadelOfPain.java
index 40973164a4b..1cf2bbde90a 100644
--- a/Mage.Sets/src/mage/cards/c/CitadelOfPain.java
+++ b/Mage.Sets/src/mage/cards/c/CitadelOfPain.java
@@ -56,7 +56,7 @@ class CitadelOfPainEffect extends OneShotEffect {
}
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public CitadelOfPainEffect() {
diff --git a/Mage.Sets/src/mage/cards/c/CitadelSiege.java b/Mage.Sets/src/mage/cards/c/CitadelSiege.java
index 86093720e51..99948a47061 100644
--- a/Mage.Sets/src/mage/cards/c/CitadelSiege.java
+++ b/Mage.Sets/src/mage/cards/c/CitadelSiege.java
@@ -15,28 +15,33 @@ import mage.constants.CardType;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
+import mage.filter.predicate.Predicate;
import mage.game.Game;
+import mage.game.permanent.Permanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class CitadelSiege extends CardImpl {
private final static String ruleTrigger1 = "&bull Khans — At the beginning of combat on your turn, put two +1/+1 counters on target creature you control.";
private final static String ruleTrigger2 = "&bull Dragons — At the beginning of combat on each opponent's turn, tap target creature that player controls.";
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("creature controlled by the active player");
+
+ static {
+ filter.add(CitadelSiegePredicate.instance);
+ }
public CitadelSiege(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
// As Citadel Siege enters the battlefield, choose Khans or Dragons.
- this.addAbility(new EntersBattlefieldAbility(new ChooseModeEffect("Khans or Dragons?","Khans", "Dragons"),null,
- "As {this} enters the battlefield, choose Khans or Dragons.",""));
+ this.addAbility(new EntersBattlefieldAbility(new ChooseModeEffect("Khans or Dragons?", "Khans", "Dragons"), null,
+ "As {this} enters the battlefield, choose Khans or Dragons.", ""));
// * Khans - At the beginning of combat on your turn, put two +1/+1 counters on target creature you control.
Ability ability = new ConditionalTriggeredAbility(
@@ -51,21 +56,10 @@ public final class CitadelSiege extends CardImpl {
new BeginningOfCombatTriggeredAbility(new TapTargetEffect(), TargetController.OPPONENT, false),
new ModeChoiceSourceCondition("Dragons"),
ruleTrigger2);
- ability.addTarget(new TargetCreaturePermanent());
+ ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (this.getAbilities().contains(ability) && ability.getRule().startsWith("&bull Dragons")) {
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature that player controls");
- filter.add(new ControllerIdPredicate(game.getCombat().getAttackingPlayerId()));
- ability.getTargets().clear();
- ability.addTarget(new TargetCreaturePermanent(filter));
- }
- }
-
-
public CitadelSiege(final CitadelSiege card) {
super(card);
}
@@ -75,3 +69,12 @@ public final class CitadelSiege extends CardImpl {
return new CitadelSiege(this);
}
}
+
+enum CitadelSiegePredicate implements Predicate {
+ instance;
+
+ @Override
+ public boolean apply(Permanent input, Game game) {
+ return input.getControllerId().equals(game.getActivePlayerId());
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CityInABottle.java b/Mage.Sets/src/mage/cards/c/CityInABottle.java
index 00a469b7562..547ba0933ec 100644
--- a/Mage.Sets/src/mage/cards/c/CityInABottle.java
+++ b/Mage.Sets/src/mage/cards/c/CityInABottle.java
@@ -139,7 +139,7 @@ class CityInABottleStateTriggeredAbility extends StateTriggeredAbility {
private static final FilterPermanent filter = new FilterPermanent("a nontoken permanent originally printed in the Arabian Nights expansion other than City in a Bottle");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
filter.add(Predicates.or(getArabianNightsNamePredicates()));
}
@@ -173,7 +173,7 @@ class CityInABottleSacrificeEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterPermanent("a nontoken permanent originally printed in the Arabian Nights expansion other than City in a Bottle");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
filter.add(Predicates.or(getArabianNightsNamePredicates()));
}
diff --git a/Mage.Sets/src/mage/cards/c/CivicStalwart.java b/Mage.Sets/src/mage/cards/c/CivicStalwart.java
new file mode 100644
index 00000000000..b9f6fecc0e6
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CivicStalwart.java
@@ -0,0 +1,40 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.common.FilterCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class CivicStalwart extends CardImpl {
+
+ public CivicStalwart(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
+ this.subtype.add(SubType.ELEPHANT);
+ this.subtype.add(SubType.SOLDIER);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // When Civic Stalwart enters the battlefield, creatures you control get +1/+1 until end of turn.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new BoostControlledEffect(1, 1, Duration.EndOfTurn, new FilterCreaturePermanent("creatures"))));
+ }
+
+ public CivicStalwart(final CivicStalwart card) {
+ super(card);
+ }
+
+ @Override
+ public CivicStalwart copy() {
+ return new CivicStalwart(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/CivilizedScholar.java b/Mage.Sets/src/mage/cards/c/CivilizedScholar.java
index 775632b928a..0f3f1eb7d26 100644
--- a/Mage.Sets/src/mage/cards/c/CivilizedScholar.java
+++ b/Mage.Sets/src/mage/cards/c/CivilizedScholar.java
@@ -12,6 +12,7 @@ import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.h.HomicidalBruteWatcher;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Outcome;
@@ -54,31 +55,7 @@ public final class CivilizedScholar extends CardImpl {
}
}
-class HomicidalBruteWatcher extends Watcher {
- public HomicidalBruteWatcher() {
- super(HomicidalBruteWatcher.class.getSimpleName(), WatcherScope.CARD);
- }
-
- public HomicidalBruteWatcher(final HomicidalBruteWatcher watcher) {
- super(watcher);
- }
-
- @Override
- public HomicidalBruteWatcher copy() {
- return new HomicidalBruteWatcher(this);
- }
-
- @Override
- public void watch(GameEvent event, Game game) {
- if (condition == true) {
- return;
- }
- if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED && event.getSourceId().equals(sourceId)) {
- condition = true;
- }
- }
-}
class CivilizedScholarEffect extends OneShotEffect {
@@ -87,7 +64,7 @@ class CivilizedScholarEffect extends OneShotEffect {
staticText = "Draw a card, then discard a card. If a creature card is discarded this way, untap {this}, then transform it";
}
- public CivilizedScholarEffect(final CivilizedScholarEffect effect) {
+ private CivilizedScholarEffect(final CivilizedScholarEffect effect) {
super(effect);
}
diff --git a/Mage.Sets/src/mage/cards/c/ClaimFame.java b/Mage.Sets/src/mage/cards/c/ClaimFame.java
index f0444ad01af..5ebf4cfa89a 100644
--- a/Mage.Sets/src/mage/cards/c/ClaimFame.java
+++ b/Mage.Sets/src/mage/cards/c/ClaimFame.java
@@ -42,7 +42,7 @@ public final class ClaimFame extends SplitCard {
// Fame
// Aftermath
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Target creature gets +2/+0 and gains haste until end of turn.
getRightHalfCard().getSpellAbility().addEffect(new BoostTargetEffect(2, 0, Duration.EndOfTurn));
getRightHalfCard().getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)
diff --git a/Mage.Sets/src/mage/cards/c/ClamorShaman.java b/Mage.Sets/src/mage/cards/c/ClamorShaman.java
new file mode 100644
index 00000000000..3d8e5b0fea4
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/ClamorShaman.java
@@ -0,0 +1,49 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.effects.common.combat.CantBlockTargetEffect;
+import mage.abilities.keyword.RiotAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.target.common.TargetOpponentsCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ClamorShaman extends CardImpl {
+
+ public ClamorShaman(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
+
+ this.subtype.add(SubType.GOBLIN);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Riot
+ this.addAbility(new RiotAbility());
+
+ // Whenever Clamor Shaman attacks, target creature an opponent controls can't block this turn.
+ Ability ability = new AttacksTriggeredAbility(
+ new CantBlockTargetEffect(Duration.EndOfTurn), false
+ );
+ ability.addTarget(new TargetOpponentsCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ private ClamorShaman(final ClamorShaman card) {
+ super(card);
+ }
+
+ @Override
+ public ClamorShaman copy() {
+ return new ClamorShaman(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/ClanDefiance.java b/Mage.Sets/src/mage/cards/c/ClanDefiance.java
index 49d307e93ed..7400b1fb4f7 100644
--- a/Mage.Sets/src/mage/cards/c/ClanDefiance.java
+++ b/Mage.Sets/src/mage/cards/c/ClanDefiance.java
@@ -36,16 +36,16 @@ public final class ClanDefiance extends CardImpl {
this.getSpellAbility().getModes().setMinModes(1);
this.getSpellAbility().getModes().setMaxModes(3);
// Clan Defiance deals X damage to target creature with flying;
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
// Clan Defiance deals X damage to target creature without flying;
Mode mode1 = new Mode();
- mode1.addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ mode1.addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
mode1.addTarget(new TargetCreaturePermanent(filter2));
this.getSpellAbility().addMode(mode1);
// and/or Clan Defiance deals X damage to target player.
Mode mode2 = new Mode();
- mode2.addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ mode2.addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
mode2.addTarget(new TargetPlayerOrPlaneswalker());
this.getSpellAbility().addMode(mode2);
diff --git a/Mage.Sets/src/mage/cards/c/ClanGuildmage.java b/Mage.Sets/src/mage/cards/c/ClanGuildmage.java
new file mode 100644
index 00000000000..85ba5ee568d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/ClanGuildmage.java
@@ -0,0 +1,85 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.combat.CantBlockTargetEffect;
+import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.game.permanent.token.TokenImpl;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ClanGuildmage extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterControlledLandPermanent();
+
+ public ClanGuildmage(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}{G}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {1}{R}, {T}: Target creature can't block this turn.
+ Ability ability = new SimpleActivatedAbility(
+ new CantBlockTargetEffect(Duration.EndOfTurn), new ManaCostsImpl("{1}{R}")
+ );
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+
+ // {2}{G}, {T}: Target land you control becomes a 4/4 Elemental creature with haste until end of turn. It's still a land.
+ ability = new SimpleActivatedAbility(new BecomesCreatureTargetEffect(
+ new ClanGuildmageToken(), false, true, Duration.EndOfTurn
+ ), new ManaCostsImpl("{2}{G}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
+ }
+
+ private ClanGuildmage(final ClanGuildmage card) {
+ super(card);
+ }
+
+ @Override
+ public ClanGuildmage copy() {
+ return new ClanGuildmage(this);
+ }
+}
+
+class ClanGuildmageToken extends TokenImpl {
+
+ public ClanGuildmageToken() {
+ super("", "4/4 Elemental creature with haste");
+ this.cardType.add(CardType.CREATURE);
+ this.subtype.add(SubType.ELEMENTAL);
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ this.addAbility(HasteAbility.getInstance());
+ }
+
+ public ClanGuildmageToken(final ClanGuildmageToken token) {
+ super(token);
+ }
+
+ public ClanGuildmageToken copy() {
+ return new ClanGuildmageToken(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/ClashOfWills.java b/Mage.Sets/src/mage/cards/c/ClashOfWills.java
index 0108bc26916..a16fe93da3d 100644
--- a/Mage.Sets/src/mage/cards/c/ClashOfWills.java
+++ b/Mage.Sets/src/mage/cards/c/ClashOfWills.java
@@ -19,7 +19,7 @@ public final class ClashOfWills extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{U}");
// Counter target spell unless its controller pays {X}.
- this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetSpell());
}
diff --git a/Mage.Sets/src/mage/cards/c/ClearTheLand.java b/Mage.Sets/src/mage/cards/c/ClearTheLand.java
index abb2b345579..5f1a55058a8 100644
--- a/Mage.Sets/src/mage/cards/c/ClearTheLand.java
+++ b/Mage.Sets/src/mage/cards/c/ClearTheLand.java
@@ -25,7 +25,7 @@ public final class ClearTheLand extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}");
- // Each player reveals the top five cards of his or her library, puts all land cards revealed this way onto the battlefield tapped, and exiles the rest.
+ // Each player reveals the top five cards of their library, puts all land cards revealed this way onto the battlefield tapped, and exiles the rest.
getSpellAbility().addEffect(new ClearTheLandEffect());
}
@@ -43,7 +43,7 @@ class ClearTheLandEffect extends OneShotEffect {
public ClearTheLandEffect() {
super(Outcome.Benefit);
- this.staticText = "Each player reveals the top five cards of his or her library, puts all land cards revealed this way onto the battlefield tapped, and exiles the rest.";
+ this.staticText = "Each player reveals the top five cards of their library, puts all land cards revealed this way onto the battlefield tapped, and exiles the rest.";
}
public ClearTheLandEffect(final ClearTheLandEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/c/ClearTheMind.java b/Mage.Sets/src/mage/cards/c/ClearTheMind.java
new file mode 100644
index 00000000000..b92b0ae932a
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/ClearTheMind.java
@@ -0,0 +1,72 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetPlayer;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ClearTheMind extends CardImpl {
+
+ public ClearTheMind(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}");
+
+ // Target player shuffles their graveyard into their library.
+ this.getSpellAbility().addEffect(new ClearTheMindEffect());
+ this.getSpellAbility().addTarget(new TargetPlayer());
+
+ // Draw a card.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+ }
+
+ private ClearTheMind(final ClearTheMind card) {
+ super(card);
+ }
+
+ @Override
+ public ClearTheMind copy() {
+ return new ClearTheMind(this);
+ }
+}
+
+class ClearTheMindEffect extends OneShotEffect {
+
+ ClearTheMindEffect() {
+ super(Outcome.Benefit);
+ staticText = "Target player shuffles their graveyard into their library.";
+ }
+
+ private ClearTheMindEffect(final ClearTheMindEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ClearTheMindEffect copy() {
+ return new ClearTheMindEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getFirstTarget());
+ if (player == null) {
+ return false;
+ }
+ player.putCardsOnBottomOfLibrary(
+ new CardsImpl(player.getGraveyard().getCards(game)),
+ game, source, false
+ );
+ player.shuffleLibrary(source, game);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/ClearTheStage.java b/Mage.Sets/src/mage/cards/c/ClearTheStage.java
new file mode 100644
index 00000000000..fd5266eddff
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/ClearTheStage.java
@@ -0,0 +1,81 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.condition.common.FerociousCondition;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterCreatureCard;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ClearTheStage extends CardImpl {
+
+ private static final FilterCard filter = new FilterCreatureCard("creature card from your graveyard");
+
+ public ClearTheStage(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{B}");
+
+ // Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand.
+ this.getSpellAbility().addEffect(new ClearTheStageEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, filter));
+ }
+
+ private ClearTheStage(final ClearTheStage card) {
+ super(card);
+ }
+
+ @Override
+ public ClearTheStage copy() {
+ return new ClearTheStage(this);
+ }
+}
+
+class ClearTheStageEffect extends OneShotEffect {
+
+ ClearTheStageEffect() {
+ super(Outcome.Benefit);
+ staticText = "Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, " +
+ "you may return up to one target creature card from your graveyard to your hand.";
+ }
+
+ private ClearTheStageEffect(final ClearTheStageEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ClearTheStageEffect copy() {
+ return new ClearTheStageEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ game.addEffect(new BoostTargetEffect(-3, -3), source);
+ if (!FerociousCondition.instance.apply(game, source)) {
+ return true;
+ }
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null || !player.chooseUse(Outcome.Benefit, "Return a creature card from your graveyard to your hand?", source, game)) {
+ return false;
+ }
+ Card card = game.getCard(source.getTargets().get(1).getFirstTarget());
+ if (card == null) {
+ return false;
+ }
+ return player.moveCards(card, Zone.HAND, source, game);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/ClockOfOmens.java b/Mage.Sets/src/mage/cards/c/ClockOfOmens.java
index 3708f17477a..9b852701256 100644
--- a/Mage.Sets/src/mage/cards/c/ClockOfOmens.java
+++ b/Mage.Sets/src/mage/cards/c/ClockOfOmens.java
@@ -26,7 +26,7 @@ public final class ClockOfOmens extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.ARTIFACT));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public ClockOfOmens(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/Clockspinning.java b/Mage.Sets/src/mage/cards/c/Clockspinning.java
index 0c76c6572c1..2bb9c92c716 100644
--- a/Mage.Sets/src/mage/cards/c/Clockspinning.java
+++ b/Mage.Sets/src/mage/cards/c/Clockspinning.java
@@ -1,9 +1,5 @@
-
package mage.cards.c;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
@@ -23,8 +19,11 @@ import mage.players.Player;
import mage.target.common.TargetPermanentOrSuspendedCard;
import mage.target.targetpointer.FixedTarget;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
- *
* @author spjspj
*/
public final class Clockspinning extends CardImpl {
@@ -133,7 +132,6 @@ class ClockspinningAddOrRemoveCounterEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getFirstTarget());
- Card card = game.getCard(source.getFirstTarget());
if (player != null && permanent != null) {
if (player.chooseUse(Outcome.Neutral, "Do you want to to remove a counter?", source, game)) {
@@ -151,6 +149,8 @@ class ClockspinningAddOrRemoveCounterEffect extends OneShotEffect {
}
return true;
}
+
+ Card card = game.getCard(source.getFirstTarget());
if (player != null && card != null) {
if (player.chooseUse(Outcome.Neutral, "Do you want to to remove a counter?", source, game)) {
Counter counter = selectCounterType(game, source, card);
diff --git a/Mage.Sets/src/mage/cards/c/ClockworkAvian.java b/Mage.Sets/src/mage/cards/c/ClockworkAvian.java
index 7eabddb97fa..696fca568a1 100644
--- a/Mage.Sets/src/mage/cards/c/ClockworkAvian.java
+++ b/Mage.Sets/src/mage/cards/c/ClockworkAvian.java
@@ -63,7 +63,7 @@ public final class ClockworkAvian extends CardImpl {
Zone.BATTLEFIELD,
new AvianAddCountersSourceEffect(
CounterType.P1P0.createInstance(),
- new ManacostVariableValue(),
+ ManacostVariableValue.instance,
true, true
),
new ManaCostsImpl("{X}"),
diff --git a/Mage.Sets/src/mage/cards/c/ClockworkBeast.java b/Mage.Sets/src/mage/cards/c/ClockworkBeast.java
index e02f4434b43..9fa1356e13e 100644
--- a/Mage.Sets/src/mage/cards/c/ClockworkBeast.java
+++ b/Mage.Sets/src/mage/cards/c/ClockworkBeast.java
@@ -59,7 +59,7 @@ public final class ClockworkBeast extends CardImpl {
Zone.BATTLEFIELD,
new BeastAddCountersSourceEffect(
CounterType.P1P0.createInstance(),
- new ManacostVariableValue(),
+ ManacostVariableValue.instance,
true, true
),
new ManaCostsImpl("{X}"),
diff --git a/Mage.Sets/src/mage/cards/c/ClockworkSteed.java b/Mage.Sets/src/mage/cards/c/ClockworkSteed.java
index fe4557ef8dd..c2975f53d2c 100644
--- a/Mage.Sets/src/mage/cards/c/ClockworkSteed.java
+++ b/Mage.Sets/src/mage/cards/c/ClockworkSteed.java
@@ -70,7 +70,7 @@ public final class ClockworkSteed extends CardImpl {
Zone.BATTLEFIELD,
new ClockworkSteedAddCountersSourceEffect(
CounterType.P1P0.createInstance(),
- new ManacostVariableValue(),
+ ManacostVariableValue.instance,
true, true
),
new ManaCostsImpl("{X}"),
diff --git a/Mage.Sets/src/mage/cards/c/ClockworkSwarm.java b/Mage.Sets/src/mage/cards/c/ClockworkSwarm.java
index 4480d844ced..0cd0288d2e2 100644
--- a/Mage.Sets/src/mage/cards/c/ClockworkSwarm.java
+++ b/Mage.Sets/src/mage/cards/c/ClockworkSwarm.java
@@ -73,7 +73,7 @@ public final class ClockworkSwarm extends CardImpl {
Zone.BATTLEFIELD,
new SwarmAddCountersSourceEffect(
CounterType.P1P0.createInstance(),
- new ManacostVariableValue(),
+ ManacostVariableValue.instance,
true, true
),
new ManaCostsImpl("{X}"),
diff --git a/Mage.Sets/src/mage/cards/c/CloneShell.java b/Mage.Sets/src/mage/cards/c/CloneShell.java
index 4007df8bcd5..84171a085bd 100644
--- a/Mage.Sets/src/mage/cards/c/CloneShell.java
+++ b/Mage.Sets/src/mage/cards/c/CloneShell.java
@@ -1,8 +1,5 @@
-
package mage.cards.c;
-import java.util.List;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesTriggeredAbility;
@@ -20,6 +17,9 @@ import mage.players.Player;
import mage.target.TargetCard;
import mage.util.CardUtil;
+import java.util.List;
+import java.util.UUID;
+
/**
* @author nantuko
*/
@@ -115,11 +115,13 @@ class CloneShellDiesEffect extends OneShotEffect {
Permanent permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD);
if (permanent != null) {
List imprinted = permanent.getImprinted();
- if (!imprinted.isEmpty()) {
+ if (imprinted != null && !imprinted.isEmpty()) {
Card imprintedCard = game.getCard(imprinted.get(0));
- imprintedCard.setFaceDown(false, game);
- if (imprintedCard.isCreature()) {
- controller.moveCards(imprintedCard, Zone.BATTLEFIELD, source, game);
+ if (imprintedCard != null) {
+ imprintedCard.setFaceDown(false, game);
+ if (imprintedCard.isCreature()) {
+ controller.moveCards(imprintedCard, Zone.BATTLEFIELD, source, game);
+ }
}
}
}
diff --git a/Mage.Sets/src/mage/cards/c/CloudgoatRanger.java b/Mage.Sets/src/mage/cards/c/CloudgoatRanger.java
index 368b1c19149..11722998664 100644
--- a/Mage.Sets/src/mage/cards/c/CloudgoatRanger.java
+++ b/Mage.Sets/src/mage/cards/c/CloudgoatRanger.java
@@ -34,7 +34,7 @@ public final class CloudgoatRanger extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Kithkin you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.KITHKIN));
}
diff --git a/Mage.Sets/src/mage/cards/c/ClovenCasting.java b/Mage.Sets/src/mage/cards/c/ClovenCasting.java
index 91c8961b969..389fc161c12 100644
--- a/Mage.Sets/src/mage/cards/c/ClovenCasting.java
+++ b/Mage.Sets/src/mage/cards/c/ClovenCasting.java
@@ -27,7 +27,7 @@ public final class ClovenCasting extends CardImpl {
filter.add(Predicates.or(
new CardTypePredicate(CardType.INSTANT),
new CardTypePredicate(CardType.SORCERY)));
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public ClovenCasting(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CoastalPiracy.java b/Mage.Sets/src/mage/cards/c/CoastalPiracy.java
index f3a94fc0a6b..6eef0cd9d1e 100644
--- a/Mage.Sets/src/mage/cards/c/CoastalPiracy.java
+++ b/Mage.Sets/src/mage/cards/c/CoastalPiracy.java
@@ -61,7 +61,7 @@ class CoastalPiracyTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (((DamagedPlayerEvent) event).isCombatDamage()
- && game.getOpponents(this.controllerId).contains(((DamagedPlayerEvent) event).getPlayerId())) {
+ && game.getOpponents(this.controllerId).contains(event.getPlayerId())) {
Permanent creature = game.getPermanent(event.getSourceId());
if (creature != null && creature.isControlledBy(controllerId)) {
return true;
diff --git a/Mage.Sets/src/mage/cards/c/CoastalWizard.java b/Mage.Sets/src/mage/cards/c/CoastalWizard.java
index 54bb6b7b243..1ed09be1495 100644
--- a/Mage.Sets/src/mage/cards/c/CoastalWizard.java
+++ b/Mage.Sets/src/mage/cards/c/CoastalWizard.java
@@ -27,7 +27,7 @@ public final class CoastalWizard extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public CoastalWizard(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CobraTrap.java b/Mage.Sets/src/mage/cards/c/CobraTrap.java
index a84de7815de..6845197a353 100644
--- a/Mage.Sets/src/mage/cards/c/CobraTrap.java
+++ b/Mage.Sets/src/mage/cards/c/CobraTrap.java
@@ -55,7 +55,7 @@ enum CobraTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- CobraTrapWatcher watcher = (CobraTrapWatcher) game.getState().getWatchers().get(CobraTrapWatcher.class.getSimpleName());
+ CobraTrapWatcher watcher = game.getState().getWatcher(CobraTrapWatcher.class);
return watcher != null && watcher.conditionMet(source.getControllerId());
}
@@ -86,7 +86,7 @@ class CobraTrapWatcher extends Watcher {
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == EventType.DESTROYED_PERMANENT) {
- Permanent perm = (Permanent) game.getPermanentOrLKIBattlefield(event.getTargetId()); // can regenerate or be indestructible
+ Permanent perm = game.getPermanentOrLKIBattlefield(event.getTargetId()); // can regenerate or be indestructible
if (perm != null && !perm.isCreature()) {
if (!game.getStack().isEmpty()) {
StackObject spell = game.getStack().getStackObject(event.getSourceId());
diff --git a/Mage.Sets/src/mage/cards/c/Cocoon.java b/Mage.Sets/src/mage/cards/c/Cocoon.java
new file mode 100644
index 00000000000..ce5d8be5c5f
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/Cocoon.java
@@ -0,0 +1,115 @@
+
+package mage.cards.c;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.common.SourceHasCounterCondition;
+import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect;
+import mage.abilities.effects.common.TapEnchantedEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ * @author L_J
+ */
+public final class Cocoon extends CardImpl {
+
+ public Cocoon(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{G}");
+ this.subtype.add(SubType.AURA);
+
+ // Enchant creature you control
+ TargetPermanent auraTarget = new TargetControlledCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
+ this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
+
+ // When Cocoon enters the battlefield, tap enchanted creature and put three pupa counters on Cocoon.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect());
+ ability.addEffect(new AddCountersSourceEffect(CounterType.PUPA.createInstance(3)));
+ this.addAbility(ability);
+
+ // Enchanted creature doesn’t untap during your untap step if Cocoon has a pupa counter on it.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepEnchantedEffect(),
+ new SourceHasCounterCondition(CounterType.PUPA)).setText("Enchanted creature doesn't untap during its controller's untap step if Cocoon has a pupa counter on it")));
+
+ // At the beginning of your upkeep, remove a pupa counter from Cocoon. If you can’t, sacrifice it, put a +1/+1 counter on enchanted creature, and that creature gains flying.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CocoonEffect(), TargetController.YOU, false));
+
+ }
+
+ public Cocoon(final Cocoon card) {
+ super(card);
+ }
+
+ @Override
+ public Cocoon copy() {
+ return new Cocoon(this);
+ }
+}
+
+class CocoonEffect extends OneShotEffect {
+
+ CocoonEffect() {
+ super(Outcome.Sacrifice);
+ staticText = "remove a pupa counter from {this}. If you can’t, sacrifice it, put a +1/+1 counter on enchanted creature, and that creature gains flying";
+ }
+
+ CocoonEffect(final CocoonEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
+ if (permanent != null) {
+ int amount = permanent.getCounters(game).getCount(CounterType.PUPA);
+ if (amount > 0) {
+ permanent.removeCounters(CounterType.PUPA.createInstance(), game);
+ } else {
+ Permanent enchantedPermanent = game.getPermanent(permanent.getAttachedTo());
+ permanent.sacrifice(source.getSourceId(), game);
+ if (enchantedPermanent != null) {
+ Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance());
+ effect.setTargetPointer(new FixedTarget(enchantedPermanent, game));
+ effect.apply(game, source);
+ ContinuousEffect effect2 = new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.Custom);
+ effect2.setTargetPointer(new FixedTarget(enchantedPermanent, game));
+ game.addEffect(effect2, source);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public CocoonEffect copy() {
+ return new CocoonEffect(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/CodeOfConstraint.java b/Mage.Sets/src/mage/cards/c/CodeOfConstraint.java
new file mode 100644
index 00000000000..f548ade2784
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CodeOfConstraint.java
@@ -0,0 +1,73 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.condition.common.AddendumCondition;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CodeOfConstraint extends CardImpl {
+
+ public CodeOfConstraint(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}");
+
+ // Target creature gets -4/-0 until end of turn.
+ this.getSpellAbility().addEffect(new BoostTargetEffect(-4, 0));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ // Draw a card.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+
+ // Addendum — If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step.
+ this.getSpellAbility().addEffect(new CodeOfConstraintEffect());
+ }
+
+ private CodeOfConstraint(final CodeOfConstraint card) {
+ super(card);
+ }
+
+ @Override
+ public CodeOfConstraint copy() {
+ return new CodeOfConstraint(this);
+ }
+}
+
+class CodeOfConstraintEffect extends OneShotEffect {
+
+ CodeOfConstraintEffect() {
+ super(Outcome.Benefit);
+ staticText = "
Addendum — If you cast this spell during your main phase, " +
+ "tap that creature and it doesn't untap during its controller's next untap step.";
+ }
+
+ private CodeOfConstraintEffect(final CodeOfConstraintEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CodeOfConstraintEffect copy() {
+ return new CodeOfConstraintEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ if (AddendumCondition.instance.apply(game, source)) {
+ new TapTargetEffect().apply(game, source);
+ game.addEffect(new DontUntapInControllersNextUntapStepTargetEffect(), source);
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CollectiveEffort.java b/Mage.Sets/src/mage/cards/c/CollectiveEffort.java
index bdf26e0adb7..534bec0969d 100644
--- a/Mage.Sets/src/mage/cards/c/CollectiveEffort.java
+++ b/Mage.Sets/src/mage/cards/c/CollectiveEffort.java
@@ -44,7 +44,7 @@ public final class CollectiveEffort extends CardImpl {
private static final FilterPlayer filterPlayer = new FilterPlayer("player whose creatures get +1/+1 counters");
static {
- filterUntapped.add(Predicates.not(new TappedPredicate()));
+ filterUntapped.add(Predicates.not(TappedPredicate.instance));
filterDestroyCreature.add(new PowerPredicate(ComparisonType.MORE_THAN, 3));
}
diff --git a/Mage.Sets/src/mage/cards/c/CollisionColossus.java b/Mage.Sets/src/mage/cards/c/CollisionColossus.java
new file mode 100644
index 00000000000..74a9473184c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CollisionColossus.java
@@ -0,0 +1,60 @@
+package mage.cards.c;
+
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardSetInfo;
+import mage.cards.SplitCard;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SpellAbilityType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CollisionColossus extends SplitCard {
+
+ private static final FilterPermanent filter = new FilterCreaturePermanent("creature with flying");
+
+ static {
+ filter.add(new AbilityPredicate(FlyingAbility.class));
+ }
+
+ public CollisionColossus(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R/G}", "{R}{G}", SpellAbilityType.SPLIT);
+
+ // Collision
+ // Collision deals 6 damage to target creature with flying.
+ this.getLeftHalfCard().getSpellAbility().addEffect(new DamageTargetEffect(6));
+ this.getLeftHalfCard().getSpellAbility().addTarget(new TargetPermanent(filter));
+
+ // Colossus
+ // Target creature gets +4/+2 and gains trample until end of turn.
+ this.getRightHalfCard().getSpellAbility().addEffect(
+ new BoostTargetEffect(4, 2, Duration.EndOfTurn)
+ .setText("target creature gets +4/+2")
+ );
+ this.getRightHalfCard().getSpellAbility().addEffect(new GainAbilityTargetEffect(
+ TrampleAbility.getInstance(), Duration.EndOfTurn
+ ).setText("and gains trample until end of turn"));
+ this.getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ private CollisionColossus(final CollisionColossus card) {
+ super(card);
+ }
+
+ @Override
+ public CollisionColossus copy() {
+ return new CollisionColossus(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/CombineGuildmage.java b/Mage.Sets/src/mage/cards/c/CombineGuildmage.java
new file mode 100644
index 00000000000..82d0b72cd7c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CombineGuildmage.java
@@ -0,0 +1,143 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.counters.CounterType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CombineGuildmage extends CardImpl {
+
+ private static final FilterPermanent filter1
+ = new FilterControlledCreaturePermanent("creature you control (to remove a counter from)");
+ private static final FilterPermanent filter2
+ = new FilterControlledCreaturePermanent("creature you control (to move a counter to)");
+
+ public CombineGuildmage(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{U}");
+
+ this.subtype.add(SubType.MERFOLK);
+ this.subtype.add(SubType.WIZARD);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {1}{G}, {T}: This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it.
+ Ability ability = new SimpleActivatedAbility(
+ new CombineGuildmageReplacementEffect(), new ManaCostsImpl("{1}{G}")
+ );
+ ability.addCost(new TapSourceCost());
+ this.addAbility(ability);
+
+ // {1}{U}, {T}: Move a +1/+1 counter from target creature you control onto another target creature you control.
+ ability = new SimpleActivatedAbility(
+ new CombineGuildmageCounterEffect(), new ManaCostsImpl("{1}{U}")
+ );
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPermanent(filter1));
+ ability.addTarget(new TargetPermanent(filter2));
+ this.addAbility(ability);
+ }
+
+ private CombineGuildmage(final CombineGuildmage card) {
+ super(card);
+ }
+
+ @Override
+ public CombineGuildmage copy() {
+ return new CombineGuildmage(this);
+ }
+}
+
+class CombineGuildmageReplacementEffect extends ReplacementEffectImpl {
+
+ CombineGuildmageReplacementEffect() {
+ super(Duration.EndOfTurn, Outcome.BoostCreature);
+ this.staticText = "This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it";
+ }
+
+ private CombineGuildmageReplacementEffect(CombineGuildmageReplacementEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget();
+ return permanent != null && permanent.isControlledBy(source.getControllerId()) && permanent.isCreature();
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Permanent target = ((EntersTheBattlefieldEvent) event).getTarget();
+ if (target != null) {
+ target.addCounters(CounterType.P1P1.createInstance(), source, game, event.getAppliedEffects());
+ }
+ return false;
+ }
+
+ @Override
+ public CombineGuildmageReplacementEffect copy() {
+ return new CombineGuildmageReplacementEffect(this);
+ }
+}
+
+class CombineGuildmageCounterEffect extends OneShotEffect {
+
+ CombineGuildmageCounterEffect() {
+ super(Outcome.Benefit);
+ staticText = "Move a +1/+1 counter from target creature you control onto another target creature you control.";
+ }
+
+ private CombineGuildmageCounterEffect(final CombineGuildmageCounterEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CombineGuildmageCounterEffect copy() {
+ return new CombineGuildmageCounterEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent fromPermanent = game.getPermanent(source.getFirstTarget());
+ Permanent toPermanent = game.getPermanent(source.getTargets().get(1).getFirstTarget());
+ if (fromPermanent == null || toPermanent == null) {
+ return false;
+ }
+ if (fromPermanent.getCounters(game).getCount(CounterType.P1P1) > 0) {
+ fromPermanent.removeCounters(CounterType.P1P1.createInstance(), game);
+ toPermanent.addCounters(CounterType.P1P1.createInstance(), source, game);
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CometStorm.java b/Mage.Sets/src/mage/cards/c/CometStorm.java
index c88df06c348..41c3de1510c 100644
--- a/Mage.Sets/src/mage/cards/c/CometStorm.java
+++ b/Mage.Sets/src/mage/cards/c/CometStorm.java
@@ -1,9 +1,7 @@
-
package mage.cards.c;
import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.dynamicvalue.common.MultikickerCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.MultikickerAbility;
@@ -15,6 +13,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetAnyTarget;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
@@ -31,27 +30,30 @@ public final class CometStorm extends CardImpl {
// Choose any target, then choose another any target for each time Comet Storm was kicked. Comet Storm deals X damage to each of them.
this.getSpellAbility().addEffect(new CometStormEffect());
this.getSpellAbility().addTarget(new TargetAnyTarget(1));
+ this.getSpellAbility().setTargetAdjuster(CometStormAdjuster.instance);
}
public CometStorm(final CometStorm card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int numbTargets = new MultikickerCount().calculate(game, ability, null) + 1;
- ability.addTarget(new TargetAnyTarget(numbTargets));
- }
- }
-
@Override
public CometStorm copy() {
return new CometStorm(this);
}
}
+enum CometStormAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int numbTargets = MultikickerCount.instance.calculate(game, ability, null) + 1;
+ ability.addTarget(new TargetAnyTarget(numbTargets));
+ }
+}
+
class CometStormEffect extends OneShotEffect {
public CometStormEffect() {
diff --git a/Mage.Sets/src/mage/cards/c/CommanderCody.java b/Mage.Sets/src/mage/cards/c/CommanderCody.java
index 94867b369dc..2b20b390fa4 100644
--- a/Mage.Sets/src/mage/cards/c/CommanderCody.java
+++ b/Mage.Sets/src/mage/cards/c/CommanderCody.java
@@ -25,7 +25,7 @@ public final class CommanderCody extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-token Trooper creatures");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
filter.add(new SubtypePredicate(SubType.TROOPER));
}
diff --git a/Mage.Sets/src/mage/cards/c/CommitMemory.java b/Mage.Sets/src/mage/cards/c/CommitMemory.java
index 4d6c2e77e37..a0fb02b1e59 100644
--- a/Mage.Sets/src/mage/cards/c/CommitMemory.java
+++ b/Mage.Sets/src/mage/cards/c/CommitMemory.java
@@ -45,7 +45,7 @@ public final class CommitMemory extends SplitCard {
// Memory
// Aftermath
// Each player shuffles their hand and graveyard into their library, then draws seven cards.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new ShuffleHandGraveyardAllEffect());
Effect effect = new DrawCardAllEffect(7);
effect.setText(", then draws seven cards");
diff --git a/Mage.Sets/src/mage/cards/c/CommuneWithLava.java b/Mage.Sets/src/mage/cards/c/CommuneWithLava.java
index 6f4f3bb193a..30392efead8 100644
--- a/Mage.Sets/src/mage/cards/c/CommuneWithLava.java
+++ b/Mage.Sets/src/mage/cards/c/CommuneWithLava.java
@@ -17,7 +17,6 @@ import java.util.Set;
import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public final class CommuneWithLava extends CardImpl {
@@ -60,7 +59,7 @@ class CommuneWithLavaEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Card sourceCard = game.getCard(source.getSourceId());
- if (controller != null) {
+ if (controller != null && sourceCard != null) {
int amount = source.getManaCostsToPay().getX();
Set cards = controller.getLibrary().getTopCards(game, amount);
controller.moveCardsToExile(cards, source, game, true, CardUtil.getCardExileZoneId(game, source), sourceCard.getIdName());
@@ -105,9 +104,7 @@ class CommuneWithLavaMayPlayEffect extends AsThoughEffectImpl {
@Override
public boolean isInactive(Ability source, Game game) {
if (castOnTurn != game.getTurnNum() && game.getPhase().getStep().getType() == PhaseStep.END_TURN) {
- if (game.isActivePlayer(source.getControllerId())) {
- return true;
- }
+ return game.isActivePlayer(source.getControllerId());
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/c/Condescend.java b/Mage.Sets/src/mage/cards/c/Condescend.java
index 05ce5af84c0..26c8ceb6f9c 100644
--- a/Mage.Sets/src/mage/cards/c/Condescend.java
+++ b/Mage.Sets/src/mage/cards/c/Condescend.java
@@ -21,7 +21,7 @@ public final class Condescend extends CardImpl {
// Counter target spell unless its controller pays {X}.
- this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetSpell());
// Scry 2.
this.getSpellAbility().addEffect(new ScryEffect(2));
diff --git a/Mage.Sets/src/mage/cards/c/ConduitOfRuin.java b/Mage.Sets/src/mage/cards/c/ConduitOfRuin.java
index 3dc843647f1..c3bb6e17822 100644
--- a/Mage.Sets/src/mage/cards/c/ConduitOfRuin.java
+++ b/Mage.Sets/src/mage/cards/c/ConduitOfRuin.java
@@ -38,7 +38,7 @@ public final class ConduitOfRuin extends CardImpl {
private static final FilterCreatureCard filterCost = new FilterCreatureCard("The first creature spell");
static {
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
filter.add(new ConvertedManaCostPredicate(ComparisonType.MORE_THAN, 6));
filterCost.add(new FirstCastCreatureSpellPredicate());
}
@@ -117,7 +117,7 @@ class FirstCastCreatureSpellPredicate implements ObjectPlayerPredicate input, Game game) {
if (input.getObject() instanceof Spell
&& ((Spell) input.getObject()).isCreature()) {
- ConduitOfRuinWatcher watcher = (ConduitOfRuinWatcher) game.getState().getWatchers().get(ConduitOfRuinWatcher.class.getSimpleName());
+ ConduitOfRuinWatcher watcher = game.getState().getWatcher(ConduitOfRuinWatcher.class);
return watcher != null && watcher.creatureSpellsCastThisTurn(input.getPlayerId()) == 0;
}
return false;
diff --git a/Mage.Sets/src/mage/cards/c/ConfusionInTheRanks.java b/Mage.Sets/src/mage/cards/c/ConfusionInTheRanks.java
index 388e46d2bc9..fe65023e65f 100644
--- a/Mage.Sets/src/mage/cards/c/ConfusionInTheRanks.java
+++ b/Mage.Sets/src/mage/cards/c/ConfusionInTheRanks.java
@@ -1,10 +1,6 @@
package mage.cards.c;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.effects.Effect;
@@ -22,9 +18,14 @@ import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+import java.util.UUID;
/**
- *
* @author anonymous
*/
public final class ConfusionInTheRanks extends CardImpl {
@@ -38,7 +39,6 @@ public final class ConfusionInTheRanks extends CardImpl {
new CardTypePredicate(CardType.ENCHANTMENT)
));
}
- private final UUID originalId;
public ConfusionInTheRanks(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}{R}");
@@ -49,54 +49,18 @@ public final class ConfusionInTheRanks extends CardImpl {
new ExchangeControlTargetEffect(
Duration.EndOfGame,
"its controller chooses target permanent "
- + "another player controls that shares a card type with it. "
- + "Exchange control of those permanents"
+ + "another player controls that shares a card type with it. "
+ + "Exchange control of those permanents"
),
filter, false, SetTargetPointer.PERMANENT, null
);
ability.addTarget(new TargetPermanent());
- originalId = ability.getOriginalId();
+ ability.setTargetAdjuster(ConfusionInTheRanksAdjuster.instance);
this.addAbility(ability);
}
public ConfusionInTheRanks(final ConfusionInTheRanks card) {
super(card);
- this.originalId = card.originalId;
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- UUID enteringPermanentId = null;
- for (Effect effect : ability.getEffects()) {
- enteringPermanentId = effect.getTargetPointer().getFirst(game, ability);
- }
- if (enteringPermanentId == null) {
- return;
- }
- Permanent enteringPermanent = game.getPermanent(enteringPermanentId);
- if (enteringPermanent == null) {
- return;
- }
- ability.getTargets().clear();
- FilterPermanent filterTarget = new FilterPermanent();
- String message = "";
- filterTarget.add(Predicates.not(new ControllerIdPredicate(enteringPermanent.getControllerId())));
- Set cardTypesPredicates = new HashSet<>(1);
- for (CardType cardTypeEntering : enteringPermanent.getCardType()) {
- cardTypesPredicates.add(new CardTypePredicate(cardTypeEntering));
- if (!message.isEmpty()) {
- message += "or ";
- }
- message += cardTypeEntering.toString().toLowerCase(Locale.ENGLISH) + ' ';
- }
- filterTarget.add(Predicates.or(cardTypesPredicates));
- message += "you don't control";
- filterTarget.setMessage(message);
- TargetPermanent target = new TargetPermanent(filterTarget);
- target.setTargetController(enteringPermanent.getControllerId());
- ability.getTargets().add(target);
- }
}
@Override
@@ -104,3 +68,40 @@ public final class ConfusionInTheRanks extends CardImpl {
return new ConfusionInTheRanks(this);
}
}
+
+enum ConfusionInTheRanksAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ UUID enteringPermanentId = null;
+ for (Effect effect : ability.getEffects()) {
+ enteringPermanentId = effect.getTargetPointer().getFirst(game, ability);
+ }
+ if (enteringPermanentId == null) {
+ return;
+ }
+ Permanent enteringPermanent = game.getPermanent(enteringPermanentId);
+ if (enteringPermanent == null) {
+ return;
+ }
+ ability.getTargets().clear();
+ FilterPermanent filterTarget = new FilterPermanent();
+ String message = "";
+ filterTarget.add(Predicates.not(new ControllerIdPredicate(enteringPermanent.getControllerId())));
+ Set cardTypesPredicates = new HashSet<>(1);
+ for (CardType cardTypeEntering : enteringPermanent.getCardType()) {
+ cardTypesPredicates.add(new CardTypePredicate(cardTypeEntering));
+ if (!message.isEmpty()) {
+ message += "or ";
+ }
+ message += cardTypeEntering.toString().toLowerCase(Locale.ENGLISH) + ' ';
+ }
+ filterTarget.add(Predicates.or(cardTypesPredicates));
+ message += "you don't control";
+ filterTarget.setMessage(message);
+ TargetPermanent target = new TargetPermanent(filterTarget);
+ target.setTargetController(enteringPermanent.getControllerId());
+ ability.getTargets().add(target);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CongregationAtDawn.java b/Mage.Sets/src/mage/cards/c/CongregationAtDawn.java
index 822d0addf2f..cdfd7c2e605 100644
--- a/Mage.Sets/src/mage/cards/c/CongregationAtDawn.java
+++ b/Mage.Sets/src/mage/cards/c/CongregationAtDawn.java
@@ -67,7 +67,7 @@ class CongregationAtDawnEffect extends OneShotEffect {
if (controller.searchLibrary(target, game)) {
if (!target.getTargets().isEmpty()) {
Cards revealed = new CardsImpl();
- for (UUID cardId : (List) target.getTargets()) {
+ for (UUID cardId : target.getTargets()) {
Card card = controller.getLibrary().remove(cardId, game);
revealed.add(card);
}
diff --git a/Mage.Sets/src/mage/cards/c/ConsecrateConsume.java b/Mage.Sets/src/mage/cards/c/ConsecrateConsume.java
new file mode 100644
index 00000000000..72fc2b36a95
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/ConsecrateConsume.java
@@ -0,0 +1,94 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.effects.common.SacrificeEffect;
+import mage.cards.CardSetInfo;
+import mage.cards.SplitCard;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.Outcome;
+import mage.constants.SpellAbilityType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.TargetPlayer;
+import mage.target.common.TargetCardInGraveyard;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ConsecrateConsume extends SplitCard {
+
+ public ConsecrateConsume(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{1}{W/B}", "{2}{W}{B}", SpellAbilityType.SPLIT);
+
+ // Consecrate
+ // Exile target card from a graveyard.
+ this.getLeftHalfCard().getSpellAbility().addEffect(new ExileTargetEffect());
+ this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCardInGraveyard());
+
+ // Draw a card.
+ this.getLeftHalfCard().getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+
+ // Consume
+ // Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power.
+ this.getRightHalfCard().getSpellAbility().addEffect(new ConsumeEffect());
+ this.getRightHalfCard().getSpellAbility().addTarget(new TargetPlayer());
+ }
+
+ private ConsecrateConsume(final ConsecrateConsume card) {
+ super(card);
+ }
+
+ @Override
+ public ConsecrateConsume copy() {
+ return new ConsecrateConsume(this);
+ }
+}
+
+class ConsumeEffect extends OneShotEffect {
+
+ ConsumeEffect() {
+ super(Outcome.Benefit);
+ staticText = "Target player sacrifices a creature " +
+ "with the greatest power among creatures they control. " +
+ "You gain life equal to its power.";
+ }
+
+ private ConsumeEffect(final ConsumeEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ConsumeEffect copy() {
+ return new ConsumeEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Player player = game.getPlayer(source.getFirstTarget());
+ if (player == null || controller == null) {
+ return false;
+ }
+ int greatestPower = 0;
+ for (Permanent permanent : game.getBattlefield().getAllActivePermanents(player.getId())) {
+ if (permanent != null && permanent.isCreature()) {
+ greatestPower = Math.max(permanent.getPower().getValue(), greatestPower);
+ }
+ }
+ FilterPermanent filter = new FilterCreaturePermanent("creature with power " + greatestPower);
+ filter.add(new PowerPredicate(ComparisonType.EQUAL_TO, greatestPower));
+ new SacrificeEffect(filter, 1, "").apply(game, source);
+ controller.gainLife(greatestPower, game, source);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/ConsecratedByBlood.java b/Mage.Sets/src/mage/cards/c/ConsecratedByBlood.java
index 6b03575c2a6..cc1b5456e10 100644
--- a/Mage.Sets/src/mage/cards/c/ConsecratedByBlood.java
+++ b/Mage.Sets/src/mage/cards/c/ConsecratedByBlood.java
@@ -32,7 +32,7 @@ public final class ConsecratedByBlood extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("two other creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ConsecratedByBlood(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/ConsignOblivion.java b/Mage.Sets/src/mage/cards/c/ConsignOblivion.java
index 8a46e4a0d39..f54697f3d1a 100644
--- a/Mage.Sets/src/mage/cards/c/ConsignOblivion.java
+++ b/Mage.Sets/src/mage/cards/c/ConsignOblivion.java
@@ -29,7 +29,7 @@ public final class ConsignOblivion extends SplitCard {
// Oblivion {4}{B}
// Sorcery
// Aftermath
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Target opponent discards two cards.
getRightHalfCard().getSpellAbility().addEffect(new DiscardTargetEffect(2));
getRightHalfCard().getSpellAbility().addTarget(new TargetOpponent());
diff --git a/Mage.Sets/src/mage/cards/c/ConsignToThePit.java b/Mage.Sets/src/mage/cards/c/ConsignToThePit.java
new file mode 100644
index 00000000000..18a9df9d95a
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/ConsignToThePit.java
@@ -0,0 +1,69 @@
+package mage.cards.c;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ConsignToThePit extends CardImpl {
+
+ public ConsignToThePit(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{5}{B}");
+
+ // Destroy target creature. Consign to the Pit deals 2 damage to that creature's controller.
+ this.getSpellAbility().addEffect(new ConsignToThePitEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ private ConsignToThePit(final ConsignToThePit card) {
+ super(card);
+ }
+
+ @Override
+ public ConsignToThePit copy() {
+ return new ConsignToThePit(this);
+ }
+}
+
+class ConsignToThePitEffect extends OneShotEffect {
+
+ ConsignToThePitEffect() {
+ super(Outcome.Benefit);
+ staticText = "Destroy target creature. {this} deals 2 damage to that creature's controller.";
+ }
+
+ private ConsignToThePitEffect(final ConsignToThePitEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ConsignToThePitEffect copy() {
+ return new ConsignToThePitEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ if (permanent == null) {
+ return false;
+ }
+ Player player = game.getPlayer(permanent.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ permanent.destroy(source.getSourceId(), game, false);
+ player.damage(2, source.getSourceId(), game);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/Conspiracy.java b/Mage.Sets/src/mage/cards/c/Conspiracy.java
index dcac9387fbb..c9d92287aa4 100644
--- a/Mage.Sets/src/mage/cards/c/Conspiracy.java
+++ b/Mage.Sets/src/mage/cards/c/Conspiracy.java
@@ -1,9 +1,5 @@
-
package mage.cards.c;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
@@ -22,8 +18,11 @@ import mage.game.stack.StackObject;
import mage.players.Player;
import mage.util.SubTypeList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author anonymous
*/
public final class Conspiracy extends CardImpl {
@@ -72,14 +71,14 @@ class ConspiracyEffect extends ContinuousEffectImpl {
// in graveyard
for (UUID cardId : controller.getGraveyard()) {
Card card = game.getCard(cardId);
- if (card.isCreature()) {
+ if (card != null && card.isCreature()) {
setCreatureSubtype(card, subType, game);
}
}
// on Hand
for (UUID cardId : controller.getHand()) {
Card card = game.getCard(cardId);
- if (card.isCreature()) {
+ if (card != null && card.isCreature()) {
setCreatureSubtype(card, subType, game);
}
}
@@ -99,13 +98,13 @@ class ConspiracyEffect extends ContinuousEffectImpl {
for (UUID commanderId : controller.getCommandersIds()) {
if (game.getState().getZone(commanderId) == Zone.COMMAND) {
Card card = game.getCard(commanderId);
- if (card.isCreature()) {
+ if (card != null && card.isCreature()) {
setCreatureSubtype(card, subType, game);
}
}
}
// creature spells you control
- for (Iterator iterator = game.getStack().iterator(); iterator.hasNext();) {
+ for (Iterator iterator = game.getStack().iterator(); iterator.hasNext(); ) {
StackObject stackObject = iterator.next();
if (stackObject instanceof Spell
&& stackObject.isControlledBy(source.getControllerId())
diff --git a/Mage.Sets/src/mage/cards/c/ConsulsShieldguard.java b/Mage.Sets/src/mage/cards/c/ConsulsShieldguard.java
index a2a81ff2a78..16798cb14c1 100644
--- a/Mage.Sets/src/mage/cards/c/ConsulsShieldguard.java
+++ b/Mage.Sets/src/mage/cards/c/ConsulsShieldguard.java
@@ -29,7 +29,7 @@ public final class ConsulsShieldguard extends CardImpl {
private final static FilterAttackingCreature filter = new FilterAttackingCreature();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ConsulsShieldguard(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/ContainmentPriest.java b/Mage.Sets/src/mage/cards/c/ContainmentPriest.java
index e3cffabc67c..701eb3aa4a0 100644
--- a/Mage.Sets/src/mage/cards/c/ContainmentPriest.java
+++ b/Mage.Sets/src/mage/cards/c/ContainmentPriest.java
@@ -1,6 +1,5 @@
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
@@ -10,19 +9,16 @@ import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.players.Player;
import mage.watchers.common.CreatureWasCastWatcher;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class ContainmentPriest extends CardImpl {
@@ -94,16 +90,14 @@ class ContainmentPriestReplacementEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (((ZoneChangeEvent) event).getToZone() == Zone.BATTLEFIELD) {
- Card card = game.getCard(event.getTargetId());
Object entersTransformed = game.getState().getValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + event.getTargetId());
- if (entersTransformed instanceof Boolean && (Boolean) entersTransformed && card.getSecondCardFace() != null) {
+ Card card = game.getCard(event.getTargetId());
+ if (card != null && entersTransformed instanceof Boolean && (Boolean) entersTransformed && card.getSecondCardFace() != null) {
card = card.getSecondCardFace();
}
- if (card.isCreature()) { // TODO: Bestow Card cast as Enchantment probably not handled correctly
- CreatureWasCastWatcher watcher = (CreatureWasCastWatcher) game.getState().getWatchers().get(CreatureWasCastWatcher.class.getSimpleName());
- if (watcher != null && !watcher.wasCreatureCastThisTurn(event.getTargetId())) {
- return true;
- }
+ if (card != null && card.isCreature()) { // TODO: Bestow Card cast as Enchantment probably not handled correctly
+ CreatureWasCastWatcher watcher = game.getState().getWatcher(CreatureWasCastWatcher.class);
+ return watcher != null && !watcher.wasCreatureCastThisTurn(event.getTargetId());
}
}
return false;
diff --git a/Mage.Sets/src/mage/cards/c/Conversion.java b/Mage.Sets/src/mage/cards/c/Conversion.java
index 24f0ef8d1f5..8731aaba764 100644
--- a/Mage.Sets/src/mage/cards/c/Conversion.java
+++ b/Mage.Sets/src/mage/cards/c/Conversion.java
@@ -1,4 +1,3 @@
-
package mage.cards.c;
import java.util.List;
@@ -13,11 +12,14 @@ import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.RedManaAbility;
import mage.abilities.mana.WhiteManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
-import mage.filter.common.FilterLandPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -27,13 +29,15 @@ import mage.game.permanent.Permanent;
*/
public final class Conversion extends CardImpl {
- private static final FilterLandPermanent filter = new FilterLandPermanent(SubType.MOUNTAIN, "Mountains");
-
public Conversion(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
// At the beginning of your upkeep, sacrifice Conversion unless you pay {W}{W}.
- this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{W}{W}")), TargetController.YOU, false));
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ new SacrificeSourceUnlessPaysEffect(
+ new ManaCostsImpl("{W}{W}")),
+ TargetController.YOU,
+ false));
// All Mountains are Plains.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConversionEffect()));
@@ -72,15 +76,45 @@ public final class Conversion extends CardImpl {
@Override
public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- for (Permanent land : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) {
+ for (Permanent land : game.getBattlefield().getAllActivePermanents(CardType.LAND)) {
switch (layer) {
- case AbilityAddingRemovingEffects_6:
- land.removeAllAbilities(source.getSourceId(), game);
- land.addAbility(new WhiteManaAbility(), source.getSourceId(), game);
- break;
case TypeChangingEffects_4:
- land.getSubtype(game).clear();
- land.getSubtype(game).add(SubType.PLAINS);
+ if (land.getSubtype(game).contains(SubType.MOUNTAIN)) {
+ land.getSubtype(game).clear();
+ land.getSubtype(game).add(SubType.PLAINS);
+ game.getState().setValue("conversion"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game),
+ "true");
+ }
+ break;
+ case AbilityAddingRemovingEffects_6:
+ if (game.getState().getValue("conversion"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game)) != null
+ && game.getState().getValue("conversion"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game)).equals("true")) {
+ land.removeAllAbilities(source.getSourceId(), game);
+ if (land.getSubtype(game).contains(SubType.FOREST)) {
+ land.addAbility(new GreenManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.PLAINS)) {
+ land.addAbility(new WhiteManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.MOUNTAIN)) {
+ land.addAbility(new RedManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.ISLAND)) {
+ land.addAbility(new BlueManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.SWAMP)) {
+ land.addAbility(new BlackManaAbility(), source.getSourceId(), game);
+ }
+ }
break;
}
}
@@ -89,20 +123,17 @@ public final class Conversion extends CardImpl {
@Override
public boolean hasLayer(Layer layer) {
- return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.TypeChangingEffects_4;
+ return layer == Layer.AbilityAddingRemovingEffects_6
+ || layer == Layer.TypeChangingEffects_4;
}
@Override
public Set isDependentTo(List allEffectsInLayer) {
- // the dependent classes needs to be an enclosed class for dependent check of continuous effects
return allEffectsInLayer
.stream()
- .filter(effect->effect.getDependencyTypes().contains(DependencyType.BecomeMountain))
+ .filter(effect -> effect.getDependencyTypes().contains(DependencyType.BecomePlains))
.map(Effect::getId)
.collect(Collectors.toSet());
-
}
-
}
-
}
diff --git a/Mage.Sets/src/mage/cards/c/CopperLeafAngel.java b/Mage.Sets/src/mage/cards/c/CopperLeafAngel.java
index 8fe61fdfd93..a894eec2486 100644
--- a/Mage.Sets/src/mage/cards/c/CopperLeafAngel.java
+++ b/Mage.Sets/src/mage/cards/c/CopperLeafAngel.java
@@ -35,7 +35,7 @@ public final class CopperLeafAngel extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// {tap}, Sacrifice X lands: Put X +1/+1 counters on Copper-Leaf Angel.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(),new GetXValue(), false), new TapSourceCost());
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(),GetXValue.instance, false), new TapSourceCost());
ability.addCost(new SacrificeXTargetCost(new FilterControlledLandPermanent("lands"), false));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/c/CopperhoofVorrac.java b/Mage.Sets/src/mage/cards/c/CopperhoofVorrac.java
index ea42ffd4a07..0a48307d1fe 100644
--- a/Mage.Sets/src/mage/cards/c/CopperhoofVorrac.java
+++ b/Mage.Sets/src/mage/cards/c/CopperhoofVorrac.java
@@ -28,7 +28,7 @@ public final class CopperhoofVorrac extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("untapped permanent your opponents control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
diff --git a/Mage.Sets/src/mage/cards/c/CoralAtoll.java b/Mage.Sets/src/mage/cards/c/CoralAtoll.java
index 0fc9f416938..92a7ab94cf9 100644
--- a/Mage.Sets/src/mage/cards/c/CoralAtoll.java
+++ b/Mage.Sets/src/mage/cards/c/CoralAtoll.java
@@ -30,7 +30,7 @@ public final class CoralAtoll extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ISLAND));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public CoralAtoll(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CoralCommando.java b/Mage.Sets/src/mage/cards/c/CoralCommando.java
new file mode 100644
index 00000000000..16b2ed94393
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CoralCommando.java
@@ -0,0 +1,33 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CoralCommando extends CardImpl {
+
+ public CoralCommando(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
+
+ this.subtype.add(SubType.MERFOLK);
+ this.subtype.add(SubType.WARRIOR);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+ }
+
+ private CoralCommando(final CoralCommando card) {
+ super(card);
+ }
+
+ @Override
+ public CoralCommando copy() {
+ return new CoralCommando(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/CoralReef.java b/Mage.Sets/src/mage/cards/c/CoralReef.java
index a15a7c6afc2..24093ec4c58 100644
--- a/Mage.Sets/src/mage/cards/c/CoralReef.java
+++ b/Mage.Sets/src/mage/cards/c/CoralReef.java
@@ -40,7 +40,7 @@ public final class CoralReef extends CardImpl {
static {
islandFilter.add(new SubtypePredicate(SubType.ISLAND));
- untappedBlueCreatureFilter.add(Predicates.not(new TappedPredicate()));
+ untappedBlueCreatureFilter.add(Predicates.not(TappedPredicate.instance));
untappedBlueCreatureFilter.add(new ColorPredicate(ObjectColor.BLUE));
}
diff --git a/Mage.Sets/src/mage/cards/c/CorrosiveGale.java b/Mage.Sets/src/mage/cards/c/CorrosiveGale.java
index 3a4ca7d2346..e5a5ccb8e41 100644
--- a/Mage.Sets/src/mage/cards/c/CorrosiveGale.java
+++ b/Mage.Sets/src/mage/cards/c/CorrosiveGale.java
@@ -27,7 +27,7 @@ public final class CorrosiveGale extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{G/P}");
- this.getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filter));
+ this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.instance, filter));
}
public CorrosiveGale(final CorrosiveGale card) {
diff --git a/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java b/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java
index b135e5b7e78..d33404a5451 100644
--- a/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java
+++ b/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java
@@ -31,7 +31,7 @@ public final class CorrosiveOoze extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("equipped creature");
static {
- filter.add(new EquippedPredicate());
+ filter.add(EquippedPredicate.instance);
}
public CorrosiveOoze(UUID ownerId, CardSetInfo setInfo) {
@@ -76,7 +76,7 @@ class CorrosiveOozeEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- CorrosiveOozeCombatWatcher watcher = (CorrosiveOozeCombatWatcher) game.getState().getWatchers().get(CorrosiveOozeCombatWatcher.class.getSimpleName());
+ CorrosiveOozeCombatWatcher watcher = game.getState().getWatcher(CorrosiveOozeCombatWatcher.class);
if (controller != null && watcher != null) {
MageObjectReference sourceMor = new MageObjectReference(source.getSourceObject(game), game);
// get equipmentsToDestroy of creatres already left the battlefield
@@ -118,8 +118,8 @@ class CorrosiveOozeEffect extends OneShotEffect {
class CorrosiveOozeCombatWatcher extends Watcher {
- public final HashMap> oozeBlocksOrBlocked = new HashMap<>();
- public final HashMap> oozeEquipmentsToDestroy = new HashMap<>();
+ private final Map> oozeBlocksOrBlocked = new HashMap<>();
+ private final Map> oozeEquipmentsToDestroy = new HashMap<>();
public CorrosiveOozeCombatWatcher() {
super(CorrosiveOozeCombatWatcher.class.getSimpleName(), WatcherScope.GAME);
@@ -127,11 +127,11 @@ class CorrosiveOozeCombatWatcher extends Watcher {
public CorrosiveOozeCombatWatcher(final CorrosiveOozeCombatWatcher watcher) {
super(watcher);
- for (Map.Entry> entry : watcher.oozeBlocksOrBlocked.entrySet()) {
- HashSet newSet = new HashSet<>(entry.getValue());
+ for (Map.Entry> entry : watcher.oozeBlocksOrBlocked.entrySet()) {
+ Set newSet = new HashSet<>(entry.getValue());
oozeBlocksOrBlocked.put(entry.getKey(), newSet);
}
- for (Map.Entry> entry : watcher.oozeEquipmentsToDestroy.entrySet()) {
+ for (Map.Entry> entry : watcher.oozeEquipmentsToDestroy.entrySet()) {
HashSet newSet = new HashSet<>(entry.getValue());
oozeEquipmentsToDestroy.put(entry.getKey(), newSet);
}
@@ -148,7 +148,7 @@ class CorrosiveOozeCombatWatcher extends Watcher {
if (attacker != null && CardUtil.haveSameNames(attacker.getName(), "Corrosive Ooze")) { // To check for name is not working if Ooze is copied but name changed
if (blocker != null && hasAttachedEquipment(game, blocker)) {
MageObjectReference oozeMor = new MageObjectReference(attacker, game);
- HashSet relatedCreatures = oozeBlocksOrBlocked.getOrDefault(oozeMor, new HashSet<>());
+ Set relatedCreatures = oozeBlocksOrBlocked.getOrDefault(oozeMor, new HashSet<>());
relatedCreatures.add(new MageObjectReference(event.getSourceId(), game));
oozeBlocksOrBlocked.put(oozeMor, relatedCreatures);
}
@@ -156,7 +156,7 @@ class CorrosiveOozeCombatWatcher extends Watcher {
if (blocker != null && CardUtil.haveSameNames(blocker.getName(), "Corrosive Ooze")) {
if (attacker != null && hasAttachedEquipment(game, attacker)) {
MageObjectReference oozeMor = new MageObjectReference(blocker, game);
- HashSet relatedCreatures = oozeBlocksOrBlocked.getOrDefault(oozeMor, new HashSet<>());
+ Set relatedCreatures = oozeBlocksOrBlocked.getOrDefault(oozeMor, new HashSet<>());
relatedCreatures.add(new MageObjectReference(event.getTargetId(), game));
oozeBlocksOrBlocked.put(oozeMor, relatedCreatures);
}
@@ -167,14 +167,14 @@ class CorrosiveOozeCombatWatcher extends Watcher {
if (((ZoneChangeEvent) event).getFromZone() == Zone.BATTLEFIELD) {
if (game.getTurn() != null && TurnPhase.COMBAT == game.getTurn().getPhaseType()) {
// Check if a previous blocked or blocked by creatures is leaving the battlefield
- for (Map.Entry> entry : oozeBlocksOrBlocked.entrySet()) {
+ for (Map.Entry> entry : oozeBlocksOrBlocked.entrySet()) {
for (MageObjectReference mor : entry.getValue()) {
if (mor.refersTo(((ZoneChangeEvent) event).getTarget(), game)) {
// check for equipments and remember
for (UUID attachmentId : ((ZoneChangeEvent) event).getTarget().getAttachments()) {
Permanent attachment = game.getPermanent(attachmentId);
if (attachment != null && attachment.hasSubtype(SubType.EQUIPMENT, game)) {
- HashSet toDestroy = oozeEquipmentsToDestroy.getOrDefault(entry.getKey(), new HashSet<>());
+ Set toDestroy = oozeEquipmentsToDestroy.getOrDefault(entry.getKey(), new HashSet<>());
toDestroy.add(new MageObjectReference(attachment, game));
oozeEquipmentsToDestroy.put(entry.getKey(), toDestroy);
}
diff --git a/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java b/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java
index bf527160874..a6e289d8f46 100644
--- a/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java
+++ b/Mage.Sets/src/mage/cards/c/CouncilOfTheAbsolute.java
@@ -93,9 +93,7 @@ class CouncilOfTheAbsoluteReplacementEffect extends ContinuousRuleModifyingEffec
if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) {
MageObject object = game.getObject(event.getSourceId());
String needName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
- if (object != null && CardUtil.haveSameNames(object.getName(), needName)) {
- return true;
- }
+ return object != null && CardUtil.haveSameNames(object.getName(), needName);
}
return false;
}
@@ -123,8 +121,10 @@ class CouncilOfTheAbsoluteCostReductionEffect extends CostModificationEffectImpl
if ((abilityToModify instanceof SpellAbility)
&& abilityToModify.isControlledBy(source.getControllerId())) {
Card card = game.getCard(abilityToModify.getSourceId());
- String needName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
- return CardUtil.haveSameNames(card.getName(), needName);
+ if (card != null) {
+ String needName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
+ return CardUtil.haveSameNames(card.getName(), needName);
+ }
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/c/CourtStreetDenizen.java b/Mage.Sets/src/mage/cards/c/CourtStreetDenizen.java
index 4706b03adb8..6c4fad4bf0e 100644
--- a/Mage.Sets/src/mage/cards/c/CourtStreetDenizen.java
+++ b/Mage.Sets/src/mage/cards/c/CourtStreetDenizen.java
@@ -29,7 +29,7 @@ public final class CourtStreetDenizen extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("another white creature");
private static final FilterCreaturePermanent filterOpponentCreature = new FilterCreaturePermanent("creature an opponent controls");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ColorPredicate(ObjectColor.WHITE));
filter.add(new ControllerPredicate(TargetController.YOU));
filterOpponentCreature.add(new ControllerPredicate(TargetController.OPPONENT));
diff --git a/Mage.Sets/src/mage/cards/c/CovetedJewel.java b/Mage.Sets/src/mage/cards/c/CovetedJewel.java
index 01cf2199b55..0e068ed2a5c 100644
--- a/Mage.Sets/src/mage/cards/c/CovetedJewel.java
+++ b/Mage.Sets/src/mage/cards/c/CovetedJewel.java
@@ -1,6 +1,5 @@
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -13,20 +12,16 @@ import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Layer;
-import mage.constants.Outcome;
-import mage.constants.SubLayer;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class CovetedJewel extends CardImpl {
@@ -130,7 +125,7 @@ class CovetedJewelControlEffect extends ContinuousEffectImpl {
Player newControllingPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
if (permanent == null || newControllingPlayer == null || !newControllingPlayer.isInGame()) {
this.discard();
- return true;
+ return false;
}
permanent.changeControllerId(getTargetPointer().getFirst(game, source), game);
return true;
diff --git a/Mage.Sets/src/mage/cards/c/CovetedPeacock.java b/Mage.Sets/src/mage/cards/c/CovetedPeacock.java
index 9b748f40682..dbe7642a590 100644
--- a/Mage.Sets/src/mage/cards/c/CovetedPeacock.java
+++ b/Mage.Sets/src/mage/cards/c/CovetedPeacock.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
@@ -11,18 +10,23 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
-import mage.game.Game;
-import mage.target.common.TargetCreaturePermanent;
+import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class CovetedPeacock extends CardImpl {
- private final UUID originalId;
+ public static final FilterPermanent filter = new FilterCreaturePermanent("creature defending player controls");
+
+ static {
+ filter.add(DefendingPlayerControlsPredicate.instance);
+ }
public CovetedPeacock(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
@@ -36,26 +40,12 @@ public final class CovetedPeacock extends CardImpl {
// Whenever Coveted Peacock attacks, you may goad target creature defending player controls.
Ability ability = new AttacksTriggeredAbility(new GoadTargetEffect(), true, "Whenever {this} attacks, you may goad target creature defending player controls.");
- ability.addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature defending player controls")));
- originalId = ability.getOriginalId();
+ ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
public CovetedPeacock(final CovetedPeacock card) {
super(card);
- this.originalId = card.originalId;
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- ability.getTargets().clear();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
- UUID defenderId = game.getCombat().getDefenderId(ability.getSourceId());
- filter.add(new ControllerIdPredicate(defenderId));
- TargetCreaturePermanent target = new TargetCreaturePermanent(filter);
- ability.addTarget(target);
- }
}
@Override
diff --git a/Mage.Sets/src/mage/cards/c/CrabappleCohort.java b/Mage.Sets/src/mage/cards/c/CrabappleCohort.java
index 3cc760d1094..aa536b97243 100644
--- a/Mage.Sets/src/mage/cards/c/CrabappleCohort.java
+++ b/Mage.Sets/src/mage/cards/c/CrabappleCohort.java
@@ -33,7 +33,7 @@ public final class CrabappleCohort extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.GREEN));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public CrabappleCohort(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/Crackleburr.java b/Mage.Sets/src/mage/cards/c/Crackleburr.java
index b958d200618..d970807b973 100644
--- a/Mage.Sets/src/mage/cards/c/Crackleburr.java
+++ b/Mage.Sets/src/mage/cards/c/Crackleburr.java
@@ -38,10 +38,10 @@ public final class Crackleburr extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.RED));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter2.add(new ColorPredicate(ObjectColor.BLUE));
- filter2.add(new TappedPredicate());
+ filter2.add(TappedPredicate.instance);
}
public Crackleburr(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CracklingPerimeter.java b/Mage.Sets/src/mage/cards/c/CracklingPerimeter.java
index b2a49d8229e..0c1e9fc08f7 100644
--- a/Mage.Sets/src/mage/cards/c/CracklingPerimeter.java
+++ b/Mage.Sets/src/mage/cards/c/CracklingPerimeter.java
@@ -27,7 +27,7 @@ public final class CracklingPerimeter extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.GATE));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public CracklingPerimeter(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CrashingBoars.java b/Mage.Sets/src/mage/cards/c/CrashingBoars.java
index 9e47943bd4b..26678b713cb 100644
--- a/Mage.Sets/src/mage/cards/c/CrashingBoars.java
+++ b/Mage.Sets/src/mage/cards/c/CrashingBoars.java
@@ -53,7 +53,7 @@ class CrashingBoarsEffect extends OneShotEffect {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
CrashingBoarsEffect() {
diff --git a/Mage.Sets/src/mage/cards/c/CratersClaws.java b/Mage.Sets/src/mage/cards/c/CratersClaws.java
index 7d212220f11..acdea1c74a7 100644
--- a/Mage.Sets/src/mage/cards/c/CratersClaws.java
+++ b/Mage.Sets/src/mage/cards/c/CratersClaws.java
@@ -24,8 +24,8 @@ public final class CratersClaws extends CardImpl {
// Crater's Claws deals X damage to any target.
// Ferocious — Crater's Claws deals X plus 2 damage to that creature or player instead if you control a creature with power 4 or greater.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
- new DamageTargetEffect(new IntPlusDynamicValue(2, new ManacostVariableValue())),
- new DamageTargetEffect(new ManacostVariableValue()),
+ new DamageTargetEffect(new IntPlusDynamicValue(2, ManacostVariableValue.instance)),
+ new DamageTargetEffect(ManacostVariableValue.instance),
FerociousCondition.instance,
"{this} deals X damage to any target."
+ "
Ferocious — {this} deals X plus 2 damage to that permanent or player instead if you control a creature with power 4 or greater"));
diff --git a/Mage.Sets/src/mage/cards/c/CrazedFirecat.java b/Mage.Sets/src/mage/cards/c/CrazedFirecat.java
index fdc96f3f9ae..dac9cfa97ac 100644
--- a/Mage.Sets/src/mage/cards/c/CrazedFirecat.java
+++ b/Mage.Sets/src/mage/cards/c/CrazedFirecat.java
@@ -66,7 +66,7 @@ class CrazedFirecatEffect extends OneShotEffect {
Permanent sourceObject = game.getPermanent(source.getSourceId());
if (controller != null && sourceObject != null) {
int flipsWon = 0;
- while (controller.flipCoin(game)) {
+ while (controller.flipCoin(source, game, true)) {
flipsWon++;
}
sourceObject.addCounters(CounterType.P1P1.createInstance(flipsWon), source, game);
diff --git a/Mage.Sets/src/mage/cards/c/CreatureBond.java b/Mage.Sets/src/mage/cards/c/CreatureBond.java
index a1a84630738..7a6fff4437a 100644
--- a/Mage.Sets/src/mage/cards/c/CreatureBond.java
+++ b/Mage.Sets/src/mage/cards/c/CreatureBond.java
@@ -35,7 +35,7 @@ public final class CreatureBond extends CardImpl {
this.addAbility(ability);
// When enchanted creature dies, Creature Bond deals damage equal to that creature's toughness to the creature's controller.
- this.addAbility( new DiesAttachedTriggeredAbility(new DamageAttachedControllerEffect(new AttachedPermanentToughnessValue()), "enchanted creature"));
+ this.addAbility( new DiesAttachedTriggeredAbility(new DamageAttachedControllerEffect(AttachedPermanentToughnessValue.instance), "enchanted creature"));
}
public CreatureBond(final CreatureBond card) {
diff --git a/Mage.Sets/src/mage/cards/c/CreepyDoll.java b/Mage.Sets/src/mage/cards/c/CreepyDoll.java
index ad0b08e0992..71c3056523a 100644
--- a/Mage.Sets/src/mage/cards/c/CreepyDoll.java
+++ b/Mage.Sets/src/mage/cards/c/CreepyDoll.java
@@ -100,7 +100,7 @@ class CreepyDollEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
- if (player.flipCoin(game)) {
+ if (player.flipCoin(source, game, true)) {
UUID targetId = getTargetPointer().getFirst(game, source);
Permanent permanent = game.getPermanent(targetId);
if (permanent != null) {
diff --git a/Mage.Sets/src/mage/cards/c/CrimsonHellkite.java b/Mage.Sets/src/mage/cards/c/CrimsonHellkite.java
index a929af7dfd1..f9f867142d4 100644
--- a/Mage.Sets/src/mage/cards/c/CrimsonHellkite.java
+++ b/Mage.Sets/src/mage/cards/c/CrimsonHellkite.java
@@ -43,7 +43,7 @@ public final class CrimsonHellkite extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// {X}, {tap}: Crimson Hellkite deals X damage to target creature. Spend only red mana on X.
- Effect effect = new DamageTargetEffect(new ManacostVariableValue());
+ Effect effect = new DamageTargetEffect(ManacostVariableValue.instance);
effect.setText("{this} deals X damage to target creature. Spend only red mana on X");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}"));
ability.addCost(new TapSourceCost());
diff --git a/Mage.Sets/src/mage/cards/c/CrimsonHonorGuard.java b/Mage.Sets/src/mage/cards/c/CrimsonHonorGuard.java
index 341e4494f54..147aeb97ba3 100644
--- a/Mage.Sets/src/mage/cards/c/CrimsonHonorGuard.java
+++ b/Mage.Sets/src/mage/cards/c/CrimsonHonorGuard.java
@@ -56,7 +56,7 @@ class CrimsonHonorGuardEffect extends OneShotEffect {
private final static FilterPermanent filter = new FilterPermanent("Commander");
static {
- filter.add(new CommanderPredicate());
+ filter.add(CommanderPredicate.instance);
}
public CrimsonHonorGuardEffect() {
diff --git a/Mage.Sets/src/mage/cards/c/CrookOfCondemnation.java b/Mage.Sets/src/mage/cards/c/CrookOfCondemnation.java
index 71016541e7a..8770fff76c4 100644
--- a/Mage.Sets/src/mage/cards/c/CrookOfCondemnation.java
+++ b/Mage.Sets/src/mage/cards/c/CrookOfCondemnation.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.ExileSourceCost;
@@ -15,29 +14,28 @@ import mage.constants.CardType;
import mage.constants.Zone;
import mage.target.common.TargetCardInGraveyard;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class CrookOfCondemnation extends CardImpl {
-
- private UUID exileId = UUID.randomUUID();
public CrookOfCondemnation(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
-
+
// {1}, {t}: Exile target card from a graveyard.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new ManaCostsImpl("{1}"));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetCardInGraveyard());
this.addAbility(ability);
-
+
// {1}, Exile Crook of Condemnation: Exile all cards from all graveyards.
Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileGraveyardAllPlayersEffect(), new ManaCostsImpl("{1}"));
ability2.addCost(new ExileSourceCost());
this.addAbility(ability2);
-
+
}
public CrookOfCondemnation(final CrookOfCondemnation card) {
diff --git a/Mage.Sets/src/mage/cards/c/CrookclawElder.java b/Mage.Sets/src/mage/cards/c/CrookclawElder.java
index a570f6c7f96..54f59b87c56 100644
--- a/Mage.Sets/src/mage/cards/c/CrookclawElder.java
+++ b/Mage.Sets/src/mage/cards/c/CrookclawElder.java
@@ -33,9 +33,9 @@ public final class CrookclawElder extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.BIRD));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter2.add(new SubtypePredicate(SubType.WIZARD));
- filter2.add(Predicates.not(new TappedPredicate()));
+ filter2.add(Predicates.not(TappedPredicate.instance));
}
public CrookclawElder(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CrookedScales.java b/Mage.Sets/src/mage/cards/c/CrookedScales.java
index 6a0e880cf7e..0b19ce0bc44 100644
--- a/Mage.Sets/src/mage/cards/c/CrookedScales.java
+++ b/Mage.Sets/src/mage/cards/c/CrookedScales.java
@@ -72,7 +72,7 @@ class CrookedScalesEffect extends OneShotEffect {
Cost cost;
String message = "You lost the flip. Pay {3} to prevent your creature from being destroyed?";
do {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
if (theirGuy != null) {
theirGuy.destroy(controller.getId(), game, false);
}
diff --git a/Mage.Sets/src/mage/cards/c/CrownOfConvergence.java b/Mage.Sets/src/mage/cards/c/CrownOfConvergence.java
index 0aa256d1170..c23faefedb9 100644
--- a/Mage.Sets/src/mage/cards/c/CrownOfConvergence.java
+++ b/Mage.Sets/src/mage/cards/c/CrownOfConvergence.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -20,11 +19,12 @@ import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.StaticFilters;
-import mage.filter.common.FilterControlledCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
+import java.util.UUID;
+
/**
* @author jeffwadsworth
*/
@@ -46,7 +46,7 @@ public final class CrownOfConvergence extends CardImpl {
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CrownOfConvergenceEffect(), new ManaCostsImpl("{G}{W}")));
}
- public CrownOfConvergence(final CrownOfConvergence card) {
+ private CrownOfConvergence(final CrownOfConvergence card) {
super(card);
}
@@ -58,8 +58,6 @@ public final class CrownOfConvergence extends CardImpl {
class CrownOfConvergenceColorBoostEffect extends BoostAllEffect {
- private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creatures you control");
-
private static final String effectText = "creatures you control that share a color with that card get +1/+1";
CrownOfConvergenceColorBoostEffect() {
@@ -67,7 +65,7 @@ class CrownOfConvergenceColorBoostEffect extends BoostAllEffect {
staticText = effectText;
}
- CrownOfConvergenceColorBoostEffect(CrownOfConvergenceColorBoostEffect effect) {
+ private CrownOfConvergenceColorBoostEffect(CrownOfConvergenceColorBoostEffect effect) {
super(effect);
}
@@ -77,7 +75,7 @@ class CrownOfConvergenceColorBoostEffect extends BoostAllEffect {
if (you != null) {
Card topCard = you.getLibrary().getFromTop(game);
if (topCard != null) {
- for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_CONTROLLED_CREATURE, source.getControllerId(), source.getSourceId(), game)) {
if (permanent.getColor(game).shares(topCard.getColor(game)) && !permanent.getColor(game).isColorless()) {
permanent.addPower(power.calculate(game, source, this));
permanent.addToughness(toughness.calculate(game, source, this));
@@ -97,12 +95,12 @@ class CrownOfConvergenceColorBoostEffect extends BoostAllEffect {
class CrownOfConvergenceEffect extends OneShotEffect {
- public CrownOfConvergenceEffect() {
+ CrownOfConvergenceEffect() {
super(Outcome.Neutral);
staticText = "Put the top card of your library on the bottom of your library";
}
- public CrownOfConvergenceEffect(final CrownOfConvergenceEffect effect) {
+ private CrownOfConvergenceEffect(final CrownOfConvergenceEffect effect) {
super(effect);
}
diff --git a/Mage.Sets/src/mage/cards/c/CrucibleOfTheSpiritDragon.java b/Mage.Sets/src/mage/cards/c/CrucibleOfTheSpiritDragon.java
index 1eb974792d8..0b8fe29b228 100644
--- a/Mage.Sets/src/mage/cards/c/CrucibleOfTheSpiritDragon.java
+++ b/Mage.Sets/src/mage/cards/c/CrucibleOfTheSpiritDragon.java
@@ -44,7 +44,7 @@ public final class CrucibleOfTheSpiritDragon extends CardImpl {
// {T}, Remove X storage counters from Crucible of the Spirit Dragon: Add X mana in any combination of colors. Spend this mana only to cast Dragon spells or activate abilities of Dragons.
ability = new ConditionalAnyColorManaAbility(
new TapSourceCost(),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new CrucibleOfTheSpiritDragonManaBuilder(),
false
);
diff --git a/Mage.Sets/src/mage/cards/c/CruelRevival.java b/Mage.Sets/src/mage/cards/c/CruelRevival.java
index cfc5ba90496..8b06c4f8365 100644
--- a/Mage.Sets/src/mage/cards/c/CruelRevival.java
+++ b/Mage.Sets/src/mage/cards/c/CruelRevival.java
@@ -1,7 +1,5 @@
-
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
@@ -21,8 +19,9 @@ import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCardInYourGraveyard;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class CruelRevival extends CardImpl {
@@ -37,7 +36,7 @@ public final class CruelRevival extends CardImpl {
}
public CruelRevival(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{B}");
// Destroy target non-Zombie creature. It can't be regenerated. Return up to one target Zombie card from your graveyard to your hand.
@@ -70,10 +69,11 @@ class CruelRevivalEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent targetDestroy = game.getPermanent(source.getFirstTarget());
- Card targetRetrieve = game.getCard(source.getTargets().get(1).getFirstTarget());
if (targetDestroy != null) {
targetDestroy.destroy(source.getSourceId(), game, true);
}
+
+ Card targetRetrieve = game.getCard(source.getTargets().get(1).getFirstTarget());
if (targetRetrieve != null) {
targetRetrieve.moveToZone(Zone.HAND, source.getSourceId(), game, true);
}
diff --git a/Mage.Sets/src/mage/cards/c/CruelSadist.java b/Mage.Sets/src/mage/cards/c/CruelSadist.java
index 3be03cd96ea..63e7c85fac2 100644
--- a/Mage.Sets/src/mage/cards/c/CruelSadist.java
+++ b/Mage.Sets/src/mage/cards/c/CruelSadist.java
@@ -44,7 +44,7 @@ public final class CruelSadist extends CardImpl {
this.addAbility(ability);
// {2}{B}, {T}, Remove X +1/+1 counters from Cruel Sadist: Cruel Sadist deals X damage to target creature.
- Effect effect = new DamageTargetEffect(new RemovedCountersForCostValue());
+ Effect effect = new DamageTargetEffect(RemovedCountersForCostValue.instance);
effect.setText("{this} deals X damage to target creature");
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}{B}"));
ability.addCost(new TapSourceCost());
diff --git a/Mage.Sets/src/mage/cards/c/CruelUltimatum.java b/Mage.Sets/src/mage/cards/c/CruelUltimatum.java
index f4df0d42232..490c2d4d4f8 100644
--- a/Mage.Sets/src/mage/cards/c/CruelUltimatum.java
+++ b/Mage.Sets/src/mage/cards/c/CruelUltimatum.java
@@ -1,7 +1,5 @@
-
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
@@ -21,8 +19,9 @@ import mage.players.Player;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetOpponent;
+import java.util.UUID;
+
/**
- *
* @author North
*/
public final class CruelUltimatum extends CardImpl {
@@ -80,7 +79,8 @@ class CruelUltimatumEffect extends OneShotEffect {
if (card == null) {
return false;
}
- controller.moveCards(card, Zone.HAND, source, game);
+
+ return controller.moveCards(card, Zone.HAND, source, game);
}
return true;
}
diff --git a/Mage.Sets/src/mage/cards/c/CryOfTheCarnarium.java b/Mage.Sets/src/mage/cards/c/CryOfTheCarnarium.java
new file mode 100644
index 00000000000..23ac8658fcb
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CryOfTheCarnarium.java
@@ -0,0 +1,126 @@
+package mage.cards.c;
+
+import mage.MageObjectReference;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.cards.*;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.ZoneChangeEvent;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.watchers.common.CardsPutIntoGraveyardWatcher;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class CryOfTheCarnarium extends CardImpl {
+
+ public CryOfTheCarnarium(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}{B}");
+
+ // All creatures get -2/-2 until end of turn. Exile all creature cards in all graveyards that were put there from the battlefield this turn. If a creature would die this turn, exile it instead.
+ this.getSpellAbility().addEffect(new BoostAllEffect(-2, -2, Duration.EndOfTurn));
+ this.getSpellAbility().addEffect(new CryOfTheCarnariumExileEffect());
+ this.getSpellAbility().addEffect(new CryOfTheCarnariumReplacementEffect());
+ this.getSpellAbility().addWatcher(new CardsPutIntoGraveyardWatcher());
+ }
+
+ private CryOfTheCarnarium(final CryOfTheCarnarium card) {
+ super(card);
+ }
+
+ @Override
+ public CryOfTheCarnarium copy() {
+ return new CryOfTheCarnarium(this);
+ }
+}
+
+class CryOfTheCarnariumExileEffect extends OneShotEffect {
+
+ CryOfTheCarnariumExileEffect() {
+ super(Outcome.Benefit);
+ staticText = "Exile all creature cards in all graveyards that were put there from the battlefield this turn.";
+ }
+
+ private CryOfTheCarnariumExileEffect(final CryOfTheCarnariumExileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CryOfTheCarnariumExileEffect copy() {
+ return new CryOfTheCarnariumExileEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ CardsPutIntoGraveyardWatcher watcher = game.getState().getWatcher(CardsPutIntoGraveyardWatcher.class);
+ if (player == null || watcher == null) {
+ return false;
+ }
+ Cards cards = new CardsImpl();
+ for (MageObjectReference mor : watcher.getCardsPutToGraveyardFromBattlefield()) {
+ if (game.getState().getZoneChangeCounter(mor.getSourceId()) == mor.getZoneChangeCounter()) {
+ Card card = mor.getCard(game);
+ if (card != null && card.isCreature()) {
+ cards.add(card);
+ }
+ }
+ }
+ player.moveCards(cards, Zone.EXILED, source, game);
+ return true;
+ }
+}
+
+class CryOfTheCarnariumReplacementEffect extends ReplacementEffectImpl {
+
+ CryOfTheCarnariumReplacementEffect() {
+ super(Duration.EndOfTurn, Outcome.Exile);
+ staticText = " If a creature would die this turn, exile it instead.";
+ }
+
+ private CryOfTheCarnariumReplacementEffect(final CryOfTheCarnariumReplacementEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CryOfTheCarnariumReplacementEffect copy() {
+ return new CryOfTheCarnariumReplacementEffect(this);
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Permanent permanent = ((ZoneChangeEvent) event).getTarget();
+ if (permanent != null) {
+ Player player = game.getPlayer(permanent.getControllerId());
+ if (player != null) {
+ return player.moveCards(permanent, Zone.EXILED, source, game);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ZONE_CHANGE;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
+ return zEvent.getTarget() != null
+ && zEvent.getTarget().isCreature()
+ && zEvent.getFromZone() == Zone.BATTLEFIELD
+ && zEvent.getToZone() == Zone.GRAVEYARD;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/c/CryptRats.java b/Mage.Sets/src/mage/cards/c/CryptRats.java
index f19332295b1..d5dfc118933 100644
--- a/Mage.Sets/src/mage/cards/c/CryptRats.java
+++ b/Mage.Sets/src/mage/cards/c/CryptRats.java
@@ -38,7 +38,7 @@ public final class CryptRats extends CardImpl {
this.toughness = new MageInt(1);
// {X}: Crypt Rats deals X damage to each creature and each player. Spend only black mana on X.
- Effect effect = new DamageEverythingEffect(new ManacostVariableValue());
+ Effect effect = new DamageEverythingEffect(ManacostVariableValue.instance);
effect.setText("{this} deals X damage to each creature and each player. Spend only black mana on X");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect,new ManaCostsImpl("{X}"));
VariableCost variableCost = ability.getManaCostsToPay().getVariableCosts().get(0);
diff --git a/Mage.Sets/src/mage/cards/c/Cryptbreaker.java b/Mage.Sets/src/mage/cards/c/Cryptbreaker.java
index 446fe224f6f..71255d87091 100644
--- a/Mage.Sets/src/mage/cards/c/Cryptbreaker.java
+++ b/Mage.Sets/src/mage/cards/c/Cryptbreaker.java
@@ -1,7 +1,5 @@
-
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -25,8 +23,9 @@ import mage.filter.predicate.permanent.TappedPredicate;
import mage.game.permanent.token.ZombieToken;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class Cryptbreaker extends CardImpl {
@@ -34,12 +33,12 @@ public final class Cryptbreaker extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Zombies you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.ZOMBIE));
}
public Cryptbreaker(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
this.subtype.add(SubType.ZOMBIE);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
@@ -51,12 +50,10 @@ public final class Cryptbreaker extends CardImpl {
this.addAbility(ability);
// Tap three untapped Zombies you control: You draw a card and you lose 1 life.
- Effect effect = new DrawCardSourceControllerEffect(1);
- effect.setText("You draw a card");
+ Effect effect = new DrawCardSourceControllerEffect(1, "you");
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapTargetCost(new TargetControlledCreaturePermanent(3, 3, filter, true)));
effect = new LoseLifeSourceControllerEffect(1);
- effect.setText("and you lose 1 life");
- ability.addEffect(effect);
+ ability.addEffect(effect.concatBy("and"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/c/CrypticGateway.java b/Mage.Sets/src/mage/cards/c/CrypticGateway.java
index 704e9dc48bd..ea840305cfb 100644
--- a/Mage.Sets/src/mage/cards/c/CrypticGateway.java
+++ b/Mage.Sets/src/mage/cards/c/CrypticGateway.java
@@ -39,7 +39,7 @@ public final class CrypticGateway extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creatures you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
TargetControlledPermanent target;
@@ -70,7 +70,7 @@ class CrypticGatewayCost extends CostImpl {
TargetControlledPermanent target;
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public CrypticGatewayCost(TargetControlledPermanent target) {
@@ -87,7 +87,7 @@ class CrypticGatewayCost extends CostImpl {
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) {
int numTargets = 0;
while (numTargets < 2 && target.choose(Outcome.Tap, controllerId, sourceId, game)) {
- for (UUID targetId : (List) target.getTargets()) {
+ for (UUID targetId : target.getTargets()) {
Permanent permanent = game.getPermanent(targetId);
if (permanent == null) {
return false;
diff --git a/Mage.Sets/src/mage/cards/c/Cryptoplasm.java b/Mage.Sets/src/mage/cards/c/Cryptoplasm.java
index ac76c4b3397..2fcf2c30d97 100644
--- a/Mage.Sets/src/mage/cards/c/Cryptoplasm.java
+++ b/Mage.Sets/src/mage/cards/c/Cryptoplasm.java
@@ -28,7 +28,7 @@ public final class Cryptoplasm extends CardImpl {
final static FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public Cryptoplasm(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CultGuildmage.java b/Mage.Sets/src/mage/cards/c/CultGuildmage.java
new file mode 100644
index 00000000000..7fa8895aaeb
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/c/CultGuildmage.java
@@ -0,0 +1,54 @@
+package mage.cards.c;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.target.TargetPlayer;
+import mage.target.common.TargetOpponentOrPlaneswalker;
+
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class CultGuildmage extends CardImpl {
+
+ public CultGuildmage(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{R}");
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {3}{B}, {T}: Target player discards a card. Activate this ability only any time you could cast a sorcery.
+ Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new DiscardTargetEffect(1), new ManaCostsImpl("{3}{B}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+
+ // {R}, {T}: Cult Guildmage deals 1 damage to target opponent or planeswalker.
+ ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl("{R}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetOpponentOrPlaneswalker());
+ this.addAbility(ability);
+ }
+
+ public CultGuildmage(final CultGuildmage card) {
+ super(card);
+ }
+
+ @Override
+ public CultGuildmage copy() {
+ return new CultGuildmage(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/c/CultivatorDrone.java b/Mage.Sets/src/mage/cards/c/CultivatorDrone.java
index 6c86c444542..9dc80b53106 100644
--- a/Mage.Sets/src/mage/cards/c/CultivatorDrone.java
+++ b/Mage.Sets/src/mage/cards/c/CultivatorDrone.java
@@ -92,7 +92,7 @@ class CultivatorDroneManaCondition extends ManaCondition implements Condition {
}
}
if (costToPay instanceof ManaCost) {
- return ((ManaCost) costToPay).getText().contains("{C}");
+ return costToPay.getText().contains("{C}");
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/c/CuombajjWitches.java b/Mage.Sets/src/mage/cards/c/CuombajjWitches.java
index 2bb7d7a7772..5d58744bdbb 100644
--- a/Mage.Sets/src/mage/cards/c/CuombajjWitches.java
+++ b/Mage.Sets/src/mage/cards/c/CuombajjWitches.java
@@ -1,7 +1,6 @@
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -11,68 +10,42 @@ import mage.abilities.effects.common.DamageTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetAnyTarget;
import mage.target.common.TargetOpponent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LoneFox
-
*/
public final class CuombajjWitches extends CardImpl {
- private final UUID originalId;
-
public CuombajjWitches(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{B}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(1);
this.toughness = new MageInt(3);
- //TODO: Make ability properly copiable
// {T}: Cuombajj Witches deals 1 damage to any target and 1 damage to any target of an opponent's choice.
Effect effect = new DamageTargetEffect(1);
effect.setText("{this} deals 1 damage to any target and 1 damage to any target of an opponent's choice");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost());
ability.addTarget(new TargetAnyTarget());
ability.addTarget(new TargetAnyTarget());
+ ability.setTargetAdjuster(CuombajjWitchesAdjuster.instance);
this.addAbility(ability);
- originalId = ability.getOriginalId();
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if(ability.getOriginalId().equals(originalId)) {
- Player controller = game.getPlayer(ability.getControllerId());
- if(controller != null) {
- UUID opponentId = null;
- if(game.getOpponents(controller.getId()).size() > 1) {
- Target target = new TargetOpponent(true);
- if(controller.chooseTarget(Outcome.Neutral, target, ability, game)) {
- opponentId = target.getFirstTarget();
- }
- }
- else {
- opponentId = game.getOpponents(controller.getId()).iterator().next();
- }
-
- if(opponentId != null) {
- ability.getTargets().get(1).setTargetController(opponentId);
- }
- }
- }
}
public CuombajjWitches(final CuombajjWitches card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -80,3 +53,26 @@ public final class CuombajjWitches extends CardImpl {
return new CuombajjWitches(this);
}
}
+
+enum CuombajjWitchesAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller != null) {
+ UUID opponentId = null;
+ if (game.getOpponents(controller.getId()).size() > 1) {
+ Target target = new TargetOpponent(true);
+ if (controller.chooseTarget(Outcome.Neutral, target, ability, game)) {
+ opponentId = target.getFirstTarget();
+ }
+ } else {
+ opponentId = game.getOpponents(controller.getId()).iterator().next();
+ }
+ if (opponentId != null) {
+ ability.getTargets().get(1).setTargetController(opponentId);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/c/CurseOfExhaustion.java b/Mage.Sets/src/mage/cards/c/CurseOfExhaustion.java
index d08a2bb66ff..ea636fef2a4 100644
--- a/Mage.Sets/src/mage/cards/c/CurseOfExhaustion.java
+++ b/Mage.Sets/src/mage/cards/c/CurseOfExhaustion.java
@@ -77,7 +77,7 @@ class CurseOfExhaustionEffect extends ContinuousRuleModifyingEffectImpl {
if (enchantment != null && enchantment.getAttachedTo() != null) {
Player player = game.getPlayer(enchantment.getAttachedTo());
if (player != null && event.getPlayerId().equals(player.getId())) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) > 0) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java b/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java
index cc40d560843..0414cd2ef06 100644
--- a/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java
+++ b/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java
@@ -1,15 +1,10 @@
package mage.cards.c;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
@@ -18,9 +13,13 @@ import mage.game.permanent.Permanent;
import mage.game.permanent.token.CurseOfTheSwineBoarToken;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class CurseOfTheSwine extends CardImpl {
@@ -31,15 +30,7 @@ public final class CurseOfTheSwine extends CardImpl {
// Exile X target creatures. For each creature exiled this way, its controller creates a 2/2 green Boar creature token.
this.getSpellAbility().addEffect(new CurseOfTheSwineEffect());
// Correct number of targets will be set in adjustTargets
- this.getSpellAbility().addTarget(new TargetCreaturePermanent());
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility && ability.getAbilityType() == AbilityType.SPELL) {
- ability.getTargets().clear();
- ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX()));
- }
+ this.getSpellAbility().setTargetAdjuster(CurseOfTheSwineAdjuster.instance);
}
public CurseOfTheSwine(final CurseOfTheSwine card) {
@@ -52,6 +43,16 @@ public final class CurseOfTheSwine extends CardImpl {
}
}
+enum CurseOfTheSwineAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX()));
+ }
+}
+
class CurseOfTheSwineEffect extends OneShotEffect {
public CurseOfTheSwineEffect() {
diff --git a/Mage.Sets/src/mage/cards/c/CurtainOfLight.java b/Mage.Sets/src/mage/cards/c/CurtainOfLight.java
index c96889ff7a4..5f1e7056ef7 100644
--- a/Mage.Sets/src/mage/cards/c/CurtainOfLight.java
+++ b/Mage.Sets/src/mage/cards/c/CurtainOfLight.java
@@ -31,8 +31,8 @@ public final class CurtainOfLight extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("unblocked attacking creature");
static {
- filter.add(new AttackingPredicate());
- filter.add(Predicates.not(new BlockedPredicate()));
+ filter.add(AttackingPredicate.instance);
+ filter.add(Predicates.not(BlockedPredicate.instance));
}
public CurtainOfLight(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CustodiSoulbinders.java b/Mage.Sets/src/mage/cards/c/CustodiSoulbinders.java
index 2653f5d1f35..ab23d88f7d7 100644
--- a/Mage.Sets/src/mage/cards/c/CustodiSoulbinders.java
+++ b/Mage.Sets/src/mage/cards/c/CustodiSoulbinders.java
@@ -29,7 +29,7 @@ public final class CustodiSoulbinders extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public CustodiSoulbinders(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CustodiSoulcaller.java b/Mage.Sets/src/mage/cards/c/CustodiSoulcaller.java
index ae27d4bddab..1f19992beca 100644
--- a/Mage.Sets/src/mage/cards/c/CustodiSoulcaller.java
+++ b/Mage.Sets/src/mage/cards/c/CustodiSoulcaller.java
@@ -1,10 +1,6 @@
package mage.cards.c;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
@@ -12,7 +8,10 @@ import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffec
import mage.abilities.keyword.MeleeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.SubType;
+import mage.constants.WatcherScope;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.Predicates;
@@ -23,16 +22,21 @@ import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.watchers.Watcher;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
- *
* @author L_J
*/
public final class CustodiSoulcaller extends CardImpl {
public CustodiSoulcaller(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.CLERIC);
this.power = new MageInt(1);
@@ -45,25 +49,10 @@ public final class CustodiSoulcaller extends CardImpl {
Ability ability = new AttacksTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), false);
ability.addWatcher(new CustodiSoulcallerWatcher());
ability.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card with converted mana cost X or less from your graveyard, where X is the number of players you attacked with a creature this combat")));
+ ability.setTargetAdjuster(CustodiSoulcallerAdjuster.instance);
this.addAbility(ability);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getClass().equals(AttacksTriggeredAbility.class)) {
- ability.getTargets().clear();
- CustodiSoulcallerWatcher watcher = (CustodiSoulcallerWatcher) game.getState().getWatchers().get(CustodiSoulcallerWatcher.class.getSimpleName());
- Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId());
- if (watcher != null && watcher.playersAttacked != null) {
- int xValue = watcher.getNumberOfAttackedPlayers(sourcePermanent.getControllerId());
- FilterCard filter = new FilterCard("creature card with converted mana cost " + xValue + " or less");
- filter.add(new CardTypePredicate(CardType.CREATURE));
- filter.add(Predicates.or(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue), new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue)));
- ability.getTargets().add(new TargetCardInYourGraveyard(filter));
- }
- }
- }
-
public CustodiSoulcaller(final CustodiSoulcaller card) {
super(card);
}
@@ -74,9 +63,27 @@ public final class CustodiSoulcaller extends CardImpl {
}
}
+enum CustodiSoulcallerAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ CustodiSoulcallerWatcher watcher = (CustodiSoulcallerWatcher) game.getState().getWatchers().get(CustodiSoulcallerWatcher.class.getSimpleName());
+ Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId());
+ if (watcher != null) {
+ int xValue = watcher.getNumberOfAttackedPlayers(sourcePermanent.getControllerId());
+ FilterCard filter = new FilterCard("creature card with converted mana cost " + xValue + " or less");
+ filter.add(new CardTypePredicate(CardType.CREATURE));
+ filter.add(Predicates.or(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue), new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue)));
+ ability.getTargets().add(new TargetCardInYourGraveyard(filter));
+ }
+ }
+}
+
class CustodiSoulcallerWatcher extends Watcher {
- protected final HashMap> playersAttacked = new HashMap<>(0);
+ private final HashMap> playersAttacked = new HashMap<>(0);
CustodiSoulcallerWatcher() {
super("CustodiSoulcallerWatcher", WatcherScope.GAME);
@@ -91,8 +98,7 @@ class CustodiSoulcallerWatcher extends Watcher {
public void watch(GameEvent event, Game game) {
if (event.getType() == EventType.BEGIN_COMBAT_STEP_PRE) {
this.playersAttacked.clear();
- }
- else if (event.getType() == EventType.ATTACKER_DECLARED) {
+ } else if (event.getType() == EventType.ATTACKER_DECLARED) {
Set attackedPlayers = this.playersAttacked.getOrDefault(event.getPlayerId(), new HashSet<>(1));
attackedPlayers.add(event.getTargetId());
this.playersAttacked.put(event.getPlayerId(), attackedPlayers);
diff --git a/Mage.Sets/src/mage/cards/c/CutRibbons.java b/Mage.Sets/src/mage/cards/c/CutRibbons.java
index 4378f21ff68..b29a27ae096 100644
--- a/Mage.Sets/src/mage/cards/c/CutRibbons.java
+++ b/Mage.Sets/src/mage/cards/c/CutRibbons.java
@@ -28,8 +28,8 @@ public final class CutRibbons extends SplitCard {
// to
// Ribbons
// Each opponent loses X life.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
- getRightHalfCard().getSpellAbility().addEffect(new LoseLifeOpponentsEffect(new ManacostVariableValue()));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().getSpellAbility().addEffect(new LoseLifeOpponentsEffect(ManacostVariableValue.instance));
}
diff --git a/Mage.Sets/src/mage/cards/c/CutTheEarthlyBond.java b/Mage.Sets/src/mage/cards/c/CutTheEarthlyBond.java
index 2eb73ac3d34..a3f122cd61c 100644
--- a/Mage.Sets/src/mage/cards/c/CutTheEarthlyBond.java
+++ b/Mage.Sets/src/mage/cards/c/CutTheEarthlyBond.java
@@ -21,7 +21,7 @@ public final class CutTheEarthlyBond extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("enchanted permanent");
static {
- filter.add(new EnchantedPredicate());
+ filter.add(EnchantedPredicate.instance);
}
public CutTheEarthlyBond(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/c/CyclopeanTomb.java b/Mage.Sets/src/mage/cards/c/CyclopeanTomb.java
index b37803bd255..b548a8db00a 100644
--- a/Mage.Sets/src/mage/cards/c/CyclopeanTomb.java
+++ b/Mage.Sets/src/mage/cards/c/CyclopeanTomb.java
@@ -1,9 +1,5 @@
package mage.cards.c;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
@@ -34,8 +30,9 @@ import mage.target.common.TargetLandPermanent;
import mage.target.targetpointer.FixedTarget;
import mage.watchers.Watcher;
+import java.util.*;
+
/**
- *
* @author MTGfan
*/
public final class CyclopeanTomb extends CardImpl {
@@ -55,11 +52,12 @@ public final class CyclopeanTomb extends CardImpl {
ability.addTarget(new TargetLandPermanent(filter));
ability.addEffect(new BecomeSwampEffect(Duration.Custom, false, true, SubType.SWAMP));
this.addAbility(ability, new CyclopeanTombCounterWatcher());
+
// When Cyclopean Tomb is put into a graveyard from the battlefield, at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with Cyclopean Tomb but that a mire counter has not been removed from with Cyclopean Tomb.
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CyclopeanTombCreateTriggeredEffect()));
}
- public CyclopeanTomb(final CyclopeanTomb card) {
+ private CyclopeanTomb(final CyclopeanTomb card) {
super(card);
}
@@ -71,12 +69,12 @@ public final class CyclopeanTomb extends CardImpl {
class BecomeSwampEffect extends BecomesBasicLandTargetEffect {
- public BecomeSwampEffect(Duration duration, boolean chooseLandType, boolean loseOther, SubType... landNames) {
+ BecomeSwampEffect(Duration duration, boolean chooseLandType, boolean loseOther, SubType... landNames) {
super(duration, chooseLandType, loseOther, landNames);
staticText = "That land is a Swamp for as long as it has a mire counter on it";
}
- public BecomeSwampEffect(final BecomeSwampEffect effect) {
+ private BecomeSwampEffect(final BecomeSwampEffect effect) {
super(effect);
}
@@ -101,12 +99,12 @@ class BecomeSwampEffect extends BecomesBasicLandTargetEffect {
class CyclopeanTombCreateTriggeredEffect extends OneShotEffect {
- public CyclopeanTombCreateTriggeredEffect() {
+ CyclopeanTombCreateTriggeredEffect() {
super(Outcome.Benefit);
this.staticText = "at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with {this} but that a mire counter has not been removed from with {this}";
}
- public CyclopeanTombCreateTriggeredEffect(final CyclopeanTombCreateTriggeredEffect effect) {
+ private CyclopeanTombCreateTriggeredEffect(final CyclopeanTombCreateTriggeredEffect effect) {
super(effect);
}
@@ -132,12 +130,12 @@ class CyclopeanTombCreateTriggeredEffect extends OneShotEffect {
class CyclopeanTombEffect extends OneShotEffect {
- public CyclopeanTombEffect() {
+ CyclopeanTombEffect() {
super(Outcome.Benefit);
this.staticText = "At the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with {this} but that a mire counter has not been removed from with {this}";
}
- public CyclopeanTombEffect(final CyclopeanTombEffect effect) {
+ private CyclopeanTombEffect(final CyclopeanTombEffect effect) {
super(effect);
}
@@ -150,7 +148,7 @@ class CyclopeanTombEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObjectReference mor = new MageObjectReference(source.getSourceId(), source.getSourceObjectZoneChangeCounter(), game);
- CyclopeanTombCounterWatcher watcher = (CyclopeanTombCounterWatcher) game.getState().getWatchers().get(CyclopeanTombCounterWatcher.class.getSimpleName());
+ CyclopeanTombCounterWatcher watcher = game.getState().getWatcher(CyclopeanTombCounterWatcher.class);
if (controller != null && watcher != null) {
Set landRef = watcher.landMiredByCyclopeanTombInstance(mor, game);
@@ -168,8 +166,8 @@ class CyclopeanTombEffect extends OneShotEffect {
filter.add(Predicates.or(idPref));
TargetLandPermanent target = new TargetLandPermanent(1, 1, filter, true);
/*Player must choose a land each upkeep. Using the message are above the player hand where frequent interactions
- * take place is the most logical way to prompt for this scenario. A new constructor added to provide a not optional
- * option for any cards like this where the player must choose a target in such the way this card requires.
+ * take place is the most logical way to prompt for this scenario. A new constructor added to provide a not optional
+ * option for any cards like this where the player must choose a target in such the way this card requires.
*/
if (controller.chooseTarget(Outcome.Neutral, target, source, game)) {
Permanent chosenLand = game.getPermanent(target.getFirstTarget());
@@ -189,13 +187,13 @@ class CyclopeanTombEffect extends OneShotEffect {
class CyclopeanTombCounterWatcher extends Watcher {
- public HashMap> counterData = new HashMap<>();
+ private final Map> counterData = new HashMap<>();
- public CyclopeanTombCounterWatcher() {
+ CyclopeanTombCounterWatcher() {
super(CyclopeanTombCounterWatcher.class.getSimpleName(), WatcherScope.GAME);
}
- public CyclopeanTombCounterWatcher(final CyclopeanTombCounterWatcher watcher) {
+ private CyclopeanTombCounterWatcher(final CyclopeanTombCounterWatcher watcher) {
super(watcher);
for (MageObjectReference mageObjectReference : watcher.counterData.keySet()) {
Set miredLands = new HashSet<>();
@@ -228,11 +226,6 @@ class CyclopeanTombCounterWatcher extends Watcher {
}
}
- @Override
- public void reset() {
- super.reset();
- }
-
public Set landMiredByCyclopeanTombInstance(MageObjectReference mor, Game game) {
if (counterData.containsKey(mor)) {
return counterData.get(mor);
diff --git a/Mage.Sets/src/mage/cards/c/CytoplastRootKin.java b/Mage.Sets/src/mage/cards/c/CytoplastRootKin.java
index 427e58c7980..56b2902961e 100644
--- a/Mage.Sets/src/mage/cards/c/CytoplastRootKin.java
+++ b/Mage.Sets/src/mage/cards/c/CytoplastRootKin.java
@@ -32,7 +32,7 @@ public final class CytoplastRootKin extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other creature you control that has a +1/+1 counter on it");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new CounterPredicate(CounterType.P1P1));
}
diff --git a/Mage.Sets/src/mage/cards/d/DAvenantTrapper.java b/Mage.Sets/src/mage/cards/d/DAvenantTrapper.java
index d763b44edb7..313cb115944 100644
--- a/Mage.Sets/src/mage/cards/d/DAvenantTrapper.java
+++ b/Mage.Sets/src/mage/cards/d/DAvenantTrapper.java
@@ -23,7 +23,7 @@ public final class DAvenantTrapper extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a historic spell");
static {
- filter.add(new HistoricPredicate());
+ filter.add(HistoricPredicate.instance);
}
public DAvenantTrapper(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DaggerCaster.java b/Mage.Sets/src/mage/cards/d/DaggerCaster.java
new file mode 100644
index 00000000000..b505371fee8
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DaggerCaster.java
@@ -0,0 +1,49 @@
+package mage.cards.d;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.DamageAllEffect;
+import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+import mage.filter.StaticFilters;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DaggerCaster extends CardImpl {
+
+ public DaggerCaster(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
+
+ this.subtype.add(SubType.VIASHINO);
+ this.subtype.add(SubType.ROGUE);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // When Dagger Caster enters the battlefield, it deals 1 damage to each opponent and 1 damage to each creature your opponents control.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(
+ 1, TargetController.OPPONENT, "it"
+ ));
+ ability.addEffect(
+ new DamageAllEffect(1, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)
+ .setText("and 1 damage to each creature your opponents control")
+ );
+ this.addAbility(ability);
+ }
+
+ private DaggerCaster(final DaggerCaster card) {
+ super(card);
+ }
+
+ @Override
+ public DaggerCaster copy() {
+ return new DaggerCaster(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DamiaSageOfStone.java b/Mage.Sets/src/mage/cards/d/DamiaSageOfStone.java
index 2ca4be33812..4b750825856 100644
--- a/Mage.Sets/src/mage/cards/d/DamiaSageOfStone.java
+++ b/Mage.Sets/src/mage/cards/d/DamiaSageOfStone.java
@@ -59,7 +59,7 @@ public final class DamiaSageOfStone extends CardImpl {
class DamiaSageOfStoneTriggeredAbility extends BeginningOfUpkeepTriggeredAbility {
DamiaSageOfStoneTriggeredAbility() {
- super(new DrawCardSourceControllerEffect(new IntPlusDynamicValue(7, new MultipliedValue(new CardsInControllerHandCount(), -1))), TargetController.YOU, false);
+ super(new DrawCardSourceControllerEffect(new IntPlusDynamicValue(7, new MultipliedValue(CardsInControllerHandCount.instance, -1))), TargetController.YOU, false);
}
DamiaSageOfStoneTriggeredAbility(final DamiaSageOfStoneTriggeredAbility ability) {
diff --git a/Mage.Sets/src/mage/cards/d/DampingEngine.java b/Mage.Sets/src/mage/cards/d/DampingEngine.java
index 2884c643d09..573f507d551 100644
--- a/Mage.Sets/src/mage/cards/d/DampingEngine.java
+++ b/Mage.Sets/src/mage/cards/d/DampingEngine.java
@@ -27,7 +27,6 @@
*/
package mage.cards.d;
-import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.SpecialAction;
@@ -39,11 +38,7 @@ import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.TargetController;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
@@ -51,8 +46,9 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetControlledPermanent;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public class DampingEngine extends CardImpl {
@@ -119,8 +115,7 @@ class DampingEngineEffect extends ContinuousRuleModifyingEffectImpl {
Player player = game.getPlayer(event.getPlayerId());
Permanent dampingEngine = game.getPermanent(source.getSourceId());
final Card card = game.getCard(event.getSourceId());
- if (player != null
- || card != null) {
+ if (player != null || card != null) {
// check type of spell
if (card.isCreature()
|| card.isArtifact()
@@ -129,13 +124,10 @@ class DampingEngineEffect extends ContinuousRuleModifyingEffectImpl {
// check to see if the player has more permanents
if (new ControlsMorePermanentsThanEachOtherPlayer(player).apply(game, source)) {
// check to see if the player choose to ignore the effect
- if (game.getState().getValue("ignoreEffect") != null
- && dampingEngine != null
- && game.getState().getValue("ignoreEffect").equals
- (dampingEngine.getId() + "ignoreEffect" + game.getState().getPriorityPlayerId() + game.getState().getTurnNum())) {
- return false;
- }
- return true;
+ return game.getState().getValue("ignoreEffect") == null
+ || dampingEngine == null
+ || !game.getState().getValue("ignoreEffect").equals
+ (dampingEngine.getId() + "ignoreEffect" + game.getState().getPriorityPlayerId() + game.getState().getTurnNum());
}
}
}
diff --git a/Mage.Sets/src/mage/cards/d/DampingSphere.java b/Mage.Sets/src/mage/cards/d/DampingSphere.java
index 8447bc0aed4..b4780d80d7f 100644
--- a/Mage.Sets/src/mage/cards/d/DampingSphere.java
+++ b/Mage.Sets/src/mage/cards/d/DampingSphere.java
@@ -103,7 +103,7 @@ class DampingSphereIncreasementAllEffect extends SpellsCostIncreasementAllEffect
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null) {
int additionalCost = watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(abilityToModify.getControllerId());
CardUtil.increaseCost(abilityToModify, additionalCost);
diff --git a/Mage.Sets/src/mage/cards/d/DanceOfMany.java b/Mage.Sets/src/mage/cards/d/DanceOfMany.java
index e99a8ca72ed..6b58f60fe46 100644
--- a/Mage.Sets/src/mage/cards/d/DanceOfMany.java
+++ b/Mage.Sets/src/mage/cards/d/DanceOfMany.java
@@ -39,7 +39,7 @@ public final class DanceOfMany extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public DanceOfMany(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DaringArchaeologist.java b/Mage.Sets/src/mage/cards/d/DaringArchaeologist.java
index 9ee2191281c..133b8784685 100644
--- a/Mage.Sets/src/mage/cards/d/DaringArchaeologist.java
+++ b/Mage.Sets/src/mage/cards/d/DaringArchaeologist.java
@@ -27,7 +27,7 @@ public final class DaringArchaeologist extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a historic spell");
static {
- filter.add(new HistoricPredicate());
+ filter.add(HistoricPredicate.instance);
}
public DaringArchaeologist(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DarkProphecy.java b/Mage.Sets/src/mage/cards/d/DarkProphecy.java
index 91c3f34f599..4881da9516f 100644
--- a/Mage.Sets/src/mage/cards/d/DarkProphecy.java
+++ b/Mage.Sets/src/mage/cards/d/DarkProphecy.java
@@ -1,7 +1,5 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.effects.Effect;
@@ -14,28 +12,27 @@ import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class DarkProphecy extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature you control");
+
static {
filter.add(new ControllerPredicate(TargetController.YOU));
}
public DarkProphecy(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{B}{B}{B}");
-
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}{B}{B}");
// Whenever a creature you control dies, you draw a card and you lose 1 life.
- Effect effect = new DrawCardSourceControllerEffect(1);
- effect.setText("you draw a card");
+ Effect effect = new DrawCardSourceControllerEffect(1, "you");
Ability ability = new DiesCreatureTriggeredAbility(effect, false, filter);
effect = new LoseLifeSourceControllerEffect(1);
- effect.setText("and you lose 1 life");
- ability.addEffect(effect);
+ ability.addEffect(effect.concatBy("and"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/d/DarkSalvation.java b/Mage.Sets/src/mage/cards/d/DarkSalvation.java
index 30100994acd..9c0b24555c4 100644
--- a/Mage.Sets/src/mage/cards/d/DarkSalvation.java
+++ b/Mage.Sets/src/mage/cards/d/DarkSalvation.java
@@ -34,7 +34,7 @@ public final class DarkSalvation extends CardImpl {
// Target player creates X 2/2 black Zombie creature tokens, then up to one target creature gets -1/-1 until end of turn for each Zombie that player controls.
this.getSpellAbility().addTarget(new TargetPlayer());
- Effect effect = new CreateTokenTargetEffect(new ZombieToken(), new ManacostVariableValue());
+ Effect effect = new CreateTokenTargetEffect(new ZombieToken(), ManacostVariableValue.instance);
effect.setText("Target player creates X 2/2 black Zombie creature tokens");
this.getSpellAbility().addEffect(effect);
DynamicValue value = new ZombiesControlledByTargetPlayerCount();
diff --git a/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java b/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java
index 85a91830aa8..f87221674b7 100644
--- a/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java
+++ b/Mage.Sets/src/mage/cards/d/DarkbladeAgent.java
@@ -1,8 +1,5 @@
package mage.cards.d;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
@@ -12,19 +9,18 @@ import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.DeathtouchAbility;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.WatcherScope;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.watchers.Watcher;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class DarkbladeAgent extends CardImpl {
@@ -46,7 +42,7 @@ public final class DarkbladeAgent extends CardImpl {
Duration.WhileOnBattlefield
), DarkbladeAgentCondition.instance,
"As long as you've surveilled this turn, "
- + "{this} has deathtouch"
+ + "{this} has deathtouch"
)
);
ability.addEffect(new ConditionalContinuousEffect(
@@ -56,7 +52,7 @@ public final class DarkbladeAgent extends CardImpl {
), Duration.WhileOnBattlefield
), DarkbladeAgentCondition.instance,
"and \"Whenever this creature deals "
- + "combat damage to a player, draw a card.\""
+ + "combat damage to a player, draw a card.\""
));
this.addAbility(ability, new DarkbladeAgentWatcher());
}
@@ -77,9 +73,8 @@ enum DarkbladeAgentCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
DarkbladeAgentWatcher watcher
- = (DarkbladeAgentWatcher) game.getState().getWatchers().get(
- DarkbladeAgentWatcher.class.getSimpleName()
- );
+ = game.getState().getWatcher(
+ DarkbladeAgentWatcher.class);
return watcher != null
&& watcher.getSurveiledThisTurn(source.getControllerId());
}
@@ -87,10 +82,10 @@ enum DarkbladeAgentCondition implements Condition {
class DarkbladeAgentWatcher extends Watcher {
- private final Set surveiledThisTurn = new HashSet();
+ private final Set surveiledThisTurn = new HashSet<>();
public DarkbladeAgentWatcher() {
- super(DarkbladeAgentWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(DarkbladeAgentWatcher.class, WatcherScope.GAME);
}
public DarkbladeAgentWatcher(final DarkbladeAgentWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/d/DarkslickShores.java b/Mage.Sets/src/mage/cards/d/DarkslickShores.java
index 1739e630876..0dffdd6e4b2 100644
--- a/Mage.Sets/src/mage/cards/d/DarkslickShores.java
+++ b/Mage.Sets/src/mage/cards/d/DarkslickShores.java
@@ -26,7 +26,7 @@ public final class DarkslickShores extends CardImpl {
private final static FilterLandPermanent filter = new FilterLandPermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DarkslickShores(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java b/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java
index 1e684d94f6d..dbf5f6a79d5 100644
--- a/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java
+++ b/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java
@@ -1,4 +1,3 @@
-
package mage.cards.d;
import java.util.UUID;
@@ -12,8 +11,6 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
-import mage.filter.common.FilterControlledCreaturePermanent;
-import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
@@ -50,12 +47,6 @@ public final class DaruSpiritualist extends CardImpl {
class DaruSpiritualistTriggeredAbility extends TriggeredAbilityImpl {
- private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Cleric creature you control");
-
- static {
- filter.add(new SubtypePredicate(SubType.CLERIC));
- }
-
public DaruSpiritualistTriggeredAbility(Effect effect) {
super(Zone.BATTLEFIELD, effect);
}
@@ -77,7 +68,7 @@ class DaruSpiritualistTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent creature = game.getPermanent(event.getTargetId());
- if (creature != null && filter.match(creature, getSourceId(), getControllerId(), game)) {
+ if (creature != null && creature.hasSubtype(SubType.CLERIC, game) && creature.getControllerId().equals(getControllerId()) && creature.isCreature()) {
this.getEffects().setTargetPointer(new FixedTarget(creature, game));
return true;
}
diff --git a/Mage.Sets/src/mage/cards/d/DauntlessBodyguard.java b/Mage.Sets/src/mage/cards/d/DauntlessBodyguard.java
index 1d7eedc6ade..6b28ec08fce 100644
--- a/Mage.Sets/src/mage/cards/d/DauntlessBodyguard.java
+++ b/Mage.Sets/src/mage/cards/d/DauntlessBodyguard.java
@@ -65,7 +65,7 @@ class DauntlessBodyguardChooseCreatureEffect extends OneShotEffect {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DauntlessBodyguardChooseCreatureEffect() {
diff --git a/Mage.Sets/src/mage/cards/d/DauntlessDourbark.java b/Mage.Sets/src/mage/cards/d/DauntlessDourbark.java
index 15fb9b45822..be7b60f0b46 100644
--- a/Mage.Sets/src/mage/cards/d/DauntlessDourbark.java
+++ b/Mage.Sets/src/mage/cards/d/DauntlessDourbark.java
@@ -36,7 +36,7 @@ public final class DauntlessDourbark extends CardImpl {
filter.add(Predicates.or(new SubtypePredicate(SubType.FOREST),
new SubtypePredicate(SubType.TREEFOLK)));
filter2.add(new SubtypePredicate(SubType.TREEFOLK));
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
}
final static private String rule = "{this} has trample as long as you control another Treefolk";
diff --git a/Mage.Sets/src/mage/cards/d/DawnglowInfusion.java b/Mage.Sets/src/mage/cards/d/DawnglowInfusion.java
index a6527a52fee..7faec30b05a 100644
--- a/Mage.Sets/src/mage/cards/d/DawnglowInfusion.java
+++ b/Mage.Sets/src/mage/cards/d/DawnglowInfusion.java
@@ -25,7 +25,7 @@ public final class DawnglowInfusion extends CardImpl {
// You gain X life if {G} was spent to cast Dawnglow Infusion and X life if {W} was spent to cast it.
- DynamicValue xValue = new ManacostVariableValue();
+ DynamicValue xValue = ManacostVariableValue.instance;
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new GainLifeEffect(xValue),
new ManaWasSpentCondition(ColoredManaSymbol.G), "You gain X life if {G} was spent to cast {this}"));
diff --git a/Mage.Sets/src/mage/cards/d/DazzlingBeauty.java b/Mage.Sets/src/mage/cards/d/DazzlingBeauty.java
index 4e6416c9e54..88bb01666ea 100644
--- a/Mage.Sets/src/mage/cards/d/DazzlingBeauty.java
+++ b/Mage.Sets/src/mage/cards/d/DazzlingBeauty.java
@@ -32,8 +32,8 @@ public final class DazzlingBeauty extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("unblocked attacking creature");
static {
- filter.add(new AttackingPredicate());
- filter.add(Predicates.not(new BlockedPredicate()));
+ filter.add(AttackingPredicate.instance);
+ filter.add(Predicates.not(BlockedPredicate.instance));
}
public DazzlingBeauty(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DeadRevels.java b/Mage.Sets/src/mage/cards/d/DeadRevels.java
new file mode 100644
index 00000000000..b0c8368e773
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DeadRevels.java
@@ -0,0 +1,41 @@
+package mage.cards.d;
+
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
+import mage.abilities.keyword.SpectacleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterCreatureCard;
+import mage.target.common.TargetCardInYourGraveyard;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DeadRevels extends CardImpl {
+
+ private static final FilterCard filter = new FilterCreatureCard("creature cards from your graveyard");
+
+ public DeadRevels(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}");
+
+ // Return up to two target creature cards from your graveyard to your hand.
+ this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 2, filter));
+
+ // Spectacle {1}{B}
+ this.addAbility(new SpectacleAbility(this, new ManaCostsImpl("{1}{B}")));
+ }
+
+ private DeadRevels(final DeadRevels card) {
+ super(card);
+ }
+
+ @Override
+ public DeadRevels copy() {
+ return new DeadRevels(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DeadeyeHarpooner.java b/Mage.Sets/src/mage/cards/d/DeadeyeHarpooner.java
index eeb855dd357..a8c31839c7a 100644
--- a/Mage.Sets/src/mage/cards/d/DeadeyeHarpooner.java
+++ b/Mage.Sets/src/mage/cards/d/DeadeyeHarpooner.java
@@ -27,7 +27,7 @@ public final class DeadeyeHarpooner extends CardImpl {
private final static FilterOpponentsCreaturePermanent filter = new FilterOpponentsCreaturePermanent("tapped creature an opponent controls");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public DeadeyeHarpooner(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DeathCloud.java b/Mage.Sets/src/mage/cards/d/DeathCloud.java
index c239907ad62..1ce4f411208 100644
--- a/Mage.Sets/src/mage/cards/d/DeathCloud.java
+++ b/Mage.Sets/src/mage/cards/d/DeathCloud.java
@@ -25,7 +25,7 @@ public final class DeathCloud extends CardImpl {
// Each player loses X life, discards X cards, sacrifices X creatures, then sacrifices X lands.
- DynamicValue xValue = new ManacostVariableValue();
+ DynamicValue xValue = ManacostVariableValue.instance;
this.getSpellAbility().addEffect(new LoseLifeAllPlayersEffect(xValue));
Effect effect = new DiscardEachPlayerEffect(xValue, false);
effect.setText(", discards X cards");
diff --git a/Mage.Sets/src/mage/cards/d/DeathDenied.java b/Mage.Sets/src/mage/cards/d/DeathDenied.java
index e54bf6697ee..baf509a483b 100644
--- a/Mage.Sets/src/mage/cards/d/DeathDenied.java
+++ b/Mage.Sets/src/mage/cards/d/DeathDenied.java
@@ -2,7 +2,6 @@
package mage.cards.d;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.cards.CardImpl;
@@ -13,35 +12,24 @@ import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class DeathDenied extends CardImpl {
public DeathDenied(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{B}{B}");
this.subtype.add(SubType.ARCANE);
// Return X target creature cards from your graveyard to your hand.
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
effect.setText("Return X target creature cards from your graveyard to your hand");
this.getSpellAbility().addEffect(effect);
- this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(1, new FilterCreatureCard()));
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- Target target = new TargetCardInYourGraveyard(xValue, new FilterCreatureCard((xValue != 1 ? " creature cards" : "creature card") + " from your graveyard"));
- ability.addTarget(target);
- }
+ this.getSpellAbility().setTargetAdjuster(DeathDeniedAdjuster.instance);
}
public DeathDenied(final DeathDenied card) {
@@ -53,3 +41,15 @@ public final class DeathDenied extends CardImpl {
return new DeathDenied(this);
}
}
+
+enum DeathDeniedAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ Target target = new TargetCardInYourGraveyard(xValue, new FilterCreatureCard(new StringBuilder(xValue).append(xValue != 1 ? " creature cards" : "creature card").append(" from your graveyard").toString()));
+ ability.addTarget(target);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DeathGrasp.java b/Mage.Sets/src/mage/cards/d/DeathGrasp.java
index e0e3426b6e5..114635e43cc 100644
--- a/Mage.Sets/src/mage/cards/d/DeathGrasp.java
+++ b/Mage.Sets/src/mage/cards/d/DeathGrasp.java
@@ -21,8 +21,8 @@ public final class DeathGrasp extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{W}{B}");
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
- this.getSpellAbility().addEffect(new GainLifeEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
+ this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetAnyTarget());
}
diff --git a/Mage.Sets/src/mage/cards/d/DeathMatch.java b/Mage.Sets/src/mage/cards/d/DeathMatch.java
index d5827dfbd02..389b27cd260 100644
--- a/Mage.Sets/src/mage/cards/d/DeathMatch.java
+++ b/Mage.Sets/src/mage/cards/d/DeathMatch.java
@@ -1,7 +1,5 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
@@ -13,17 +11,16 @@ import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.FirstTargetPointer;
+import java.util.UUID;
+
/**
- *
* @author LoneFox
- *
*/
public final class DeathMatch extends CardImpl {
- private final UUID originalId;
-
public DeathMatch(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
@@ -32,24 +29,12 @@ public final class DeathMatch extends CardImpl {
Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new DeathMatchEffect(),
StaticFilters.FILTER_PERMANENT_CREATURE, false, SetTargetPointer.PLAYER, "");
ability.addTarget(new TargetCreaturePermanent());
+ ability.setTargetAdjuster(DeathMatchAdjuster.instance);
this.addAbility(ability);
- originalId = ability.getOriginalId();
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- UUID controllerId = ability.getEffects().get(0).getTargetPointer().getFirst(game, ability);
- if (controllerId != null) {
- ability.getTargets().get(0).setTargetController(controllerId);
- ability.getEffects().get(0).setTargetPointer(new FirstTargetPointer());
- }
- }
}
public DeathMatch(final DeathMatch card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -58,6 +43,19 @@ public final class DeathMatch extends CardImpl {
}
}
+enum DeathMatchAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ UUID controllerId = ability.getEffects().get(0).getTargetPointer().getFirst(game, ability);
+ if (controllerId != null) {
+ ability.getTargets().get(0).setTargetController(controllerId);
+ ability.getEffects().get(0).setTargetPointer(new FirstTargetPointer());
+ }
+ }
+}
+
class DeathMatchEffect extends OneShotEffect {
public DeathMatchEffect() {
diff --git a/Mage.Sets/src/mage/cards/d/DeathMutation.java b/Mage.Sets/src/mage/cards/d/DeathMutation.java
index d24bec85c23..879b21f6d89 100644
--- a/Mage.Sets/src/mage/cards/d/DeathMutation.java
+++ b/Mage.Sets/src/mage/cards/d/DeathMutation.java
@@ -35,7 +35,7 @@ public final class DeathMutation extends CardImpl {
this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
this.getSpellAbility().addTarget(new TargetPermanent(filter));
// create X 1/1 green Saproling creature tokens, where X is that creature's converted mana cost.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), new TargetConvertedManaCost()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), TargetConvertedManaCost.instance));
}
public DeathMutation(final DeathMutation card) {
diff --git a/Mage.Sets/src/mage/cards/d/DeathStroke.java b/Mage.Sets/src/mage/cards/d/DeathStroke.java
index c47e389c792..db727116c47 100644
--- a/Mage.Sets/src/mage/cards/d/DeathStroke.java
+++ b/Mage.Sets/src/mage/cards/d/DeathStroke.java
@@ -19,7 +19,7 @@ public final class DeathStroke extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public DeathStroke(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DeathWind.java b/Mage.Sets/src/mage/cards/d/DeathWind.java
index 69fbaadadfc..663ba2f6043 100644
--- a/Mage.Sets/src/mage/cards/d/DeathWind.java
+++ b/Mage.Sets/src/mage/cards/d/DeathWind.java
@@ -22,7 +22,7 @@ public final class DeathWind extends CardImpl {
// Target creature gets -X/-X until end of turn.
- DynamicValue x = new SignInversionDynamicValue(new ManacostVariableValue());
+ DynamicValue x = new SignInversionDynamicValue(ManacostVariableValue.instance);
this.getSpellAbility().addEffect(new BoostTargetEffect(x, x, Duration.EndOfTurn, true));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/d/DeathbringerRegent.java b/Mage.Sets/src/mage/cards/d/DeathbringerRegent.java
index 4aa59062ae6..023015b9e0d 100644
--- a/Mage.Sets/src/mage/cards/d/DeathbringerRegent.java
+++ b/Mage.Sets/src/mage/cards/d/DeathbringerRegent.java
@@ -29,7 +29,7 @@ public final class DeathbringerRegent extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DeathbringerRegent(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DeathforgeShaman.java b/Mage.Sets/src/mage/cards/d/DeathforgeShaman.java
index a9c707fd5a9..7ebbe2c241c 100644
--- a/Mage.Sets/src/mage/cards/d/DeathforgeShaman.java
+++ b/Mage.Sets/src/mage/cards/d/DeathforgeShaman.java
@@ -69,7 +69,7 @@ class DeathforgeShamanEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- DynamicValue value = new MultikickerCount();
+ DynamicValue value = MultikickerCount.instance;
int damage = value.calculate(game, source, this) * 2;
return new DamageTargetEffect(damage).apply(game, source);
}
diff --git a/Mage.Sets/src/mage/cards/d/DeathlessAncient.java b/Mage.Sets/src/mage/cards/d/DeathlessAncient.java
index 5d7e6046821..6719a9fafa6 100644
--- a/Mage.Sets/src/mage/cards/d/DeathlessAncient.java
+++ b/Mage.Sets/src/mage/cards/d/DeathlessAncient.java
@@ -27,7 +27,7 @@ public final class DeathlessAncient extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Vampires you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.VAMPIRE));
}
diff --git a/Mage.Sets/src/mage/cards/d/DeathsShadow.java b/Mage.Sets/src/mage/cards/d/DeathsShadow.java
index 2591c2d11fa..5fa0ee15d9d 100644
--- a/Mage.Sets/src/mage/cards/d/DeathsShadow.java
+++ b/Mage.Sets/src/mage/cards/d/DeathsShadow.java
@@ -28,7 +28,7 @@ public final class DeathsShadow extends CardImpl {
this.toughness = new MageInt(13);
// Death's Shadow gets -X/-X, where X is your life total.
- SignInversionDynamicValue x = new SignInversionDynamicValue(new ControllerLifeCount(), false);
+ SignInversionDynamicValue x = new SignInversionDynamicValue(ControllerLifeCount.instance, false);
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(x, x, Duration.WhileOnBattlefield)));
}
diff --git a/Mage.Sets/src/mage/cards/d/DebtorsTransport.java b/Mage.Sets/src/mage/cards/d/DebtorsTransport.java
new file mode 100644
index 00000000000..ef22d1d33f8
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DebtorsTransport.java
@@ -0,0 +1,36 @@
+package mage.cards.d;
+
+import mage.MageInt;
+import mage.abilities.keyword.AfterlifeAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DebtorsTransport extends CardImpl {
+
+ public DebtorsTransport(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}");
+
+ this.subtype.add(SubType.THRULL);
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(3);
+
+ // Afterlife 2
+ this.addAbility(new AfterlifeAbility(2));
+ }
+
+ private DebtorsTransport(final DebtorsTransport card) {
+ super(card);
+ }
+
+ @Override
+ public DebtorsTransport copy() {
+ return new DebtorsTransport(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DecayingSoil.java b/Mage.Sets/src/mage/cards/d/DecayingSoil.java
index dec74944c59..8c709b42aa5 100644
--- a/Mage.Sets/src/mage/cards/d/DecayingSoil.java
+++ b/Mage.Sets/src/mage/cards/d/DecayingSoil.java
@@ -40,7 +40,7 @@ public final class DecayingSoil extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static{
filter.add(new OwnerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public DecayingSoil(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DeceiverOfForm.java b/Mage.Sets/src/mage/cards/d/DeceiverOfForm.java
index 1cce7d6d6f9..d11d20163ec 100644
--- a/Mage.Sets/src/mage/cards/d/DeceiverOfForm.java
+++ b/Mage.Sets/src/mage/cards/d/DeceiverOfForm.java
@@ -76,7 +76,7 @@ class DeceiverOfFormEffect extends OneShotEffect {
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, controller.getId(), game)) {
if (!permanent.getId().equals(sourceObject.getId())) {
Permanent newBluePrint = null;
- newBluePrint = new PermanentCard((Card) copyFromCard, source.getControllerId(), game);
+ newBluePrint = new PermanentCard(copyFromCard, source.getControllerId(), game);
newBluePrint.assignNewId();
CopyEffect copyEffect = new CopyEffect(Duration.EndOfTurn, newBluePrint, permanent.getId());
copyEffect.newId();
diff --git a/Mage.Sets/src/mage/cards/d/DecimatorBeetle.java b/Mage.Sets/src/mage/cards/d/DecimatorBeetle.java
index 2d0c35432a3..75e0cc4bb4e 100644
--- a/Mage.Sets/src/mage/cards/d/DecimatorBeetle.java
+++ b/Mage.Sets/src/mage/cards/d/DecimatorBeetle.java
@@ -1,7 +1,6 @@
package mage.cards.d;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
@@ -13,24 +12,29 @@ import mage.abilities.effects.common.counter.RemoveCounterTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
+import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author spjspj
*/
public final class DecimatorBeetle extends CardImpl {
- private final UUID originalId;
+ public static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
+
+ static {
+ filter.add(DefendingPlayerControlsPredicate.instance);
+ }
public DecimatorBeetle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{G}");
@@ -46,29 +50,14 @@ public final class DecimatorBeetle extends CardImpl {
this.addAbility(ability);
// Whenever Decimator Beetle attacks, remove a -1/-1 counter from target creature you control and put a -1/-1 counter on up to one target creature defending player controls.
- Ability ability2 = new AttacksTriggeredAbility(new DecimatorBeetleEffect(), false);
- ability2.addTarget(new TargetControlledCreaturePermanent());
- ability2.addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature defending player controls")));
- this.addAbility(ability2);
- this.originalId = ability2.getOriginalId();
+ ability = new AttacksTriggeredAbility(new DecimatorBeetleEffect(), false);
+ ability.addTarget(new TargetControlledCreaturePermanent());
+ ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false));
+ this.addAbility(ability);
}
public DecimatorBeetle(final DecimatorBeetle card) {
super(card);
- this.originalId = card.originalId;
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- ability.getTargets().clear();
- ability.addTarget(new TargetControlledCreaturePermanent());
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
- UUID defenderId = game.getCombat().getDefenderId(ability.getSourceId());
- filter.add(new ControllerIdPredicate(defenderId));
- TargetCreaturePermanent target = new TargetCreaturePermanent(0, 1, filter, false);
- ability.addTarget(target);
- }
}
@Override
diff --git a/Mage.Sets/src/mage/cards/d/DecoratedChampion.java b/Mage.Sets/src/mage/cards/d/DecoratedChampion.java
index aff6d8543bc..bdae9b0118c 100644
--- a/Mage.Sets/src/mage/cards/d/DecoratedChampion.java
+++ b/Mage.Sets/src/mage/cards/d/DecoratedChampion.java
@@ -22,7 +22,7 @@ public final class DecoratedChampion extends CardImpl {
private static final FilterTeamPermanent filter = new FilterTeamPermanent(SubType.WARRIOR, "another Warrior");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DecoratedChampion(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DecreeOfJustice.java b/Mage.Sets/src/mage/cards/d/DecreeOfJustice.java
index 27aa099dcd8..2da79ce805e 100644
--- a/Mage.Sets/src/mage/cards/d/DecreeOfJustice.java
+++ b/Mage.Sets/src/mage/cards/d/DecreeOfJustice.java
@@ -32,7 +32,7 @@ public final class DecreeOfJustice extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{2}{W}{W}");
// Create X 4/4 white Angel creature tokens with flying.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), ManacostVariableValue.instance));
// Cycling {2}{W}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}{W}")));
diff --git a/Mage.Sets/src/mage/cards/d/DeeprootElite.java b/Mage.Sets/src/mage/cards/d/DeeprootElite.java
index 8f2133da262..ca4130031cb 100644
--- a/Mage.Sets/src/mage/cards/d/DeeprootElite.java
+++ b/Mage.Sets/src/mage/cards/d/DeeprootElite.java
@@ -26,7 +26,7 @@ public final class DeeprootElite extends CardImpl {
private static final FilterPermanent filterYourAnotherMerfolk = new FilterPermanent(SubType.MERFOLK, "another " + SubType.MERFOLK.toString());
static {
- filterYourAnotherMerfolk.add(new AnotherPredicate());
+ filterYourAnotherMerfolk.add(AnotherPredicate.instance);
filterYourAnotherMerfolk.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/d/Deface.java b/Mage.Sets/src/mage/cards/d/Deface.java
new file mode 100644
index 00000000000..fa2d602b2e2
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/Deface.java
@@ -0,0 +1,50 @@
+package mage.cards.d;
+
+import mage.abilities.Mode;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.keyword.DefenderAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetArtifactPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Deface extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterCreaturePermanent("creature with defender");
+
+ static {
+ filter.add(new AbilityPredicate(DefenderAbility.class));
+ }
+
+ public Deface(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}");
+
+ // Choose one —
+ // • Destroy target artifact.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetArtifactPermanent());
+
+ // • Destroy target creature with defender.
+ Mode mode = new Mode(new DestroyTargetEffect());
+ mode.addTarget(new TargetPermanent(filter));
+ this.getSpellAbility().addMode(mode);
+ }
+
+ private Deface(final Deface card) {
+ super(card);
+ }
+
+ @Override
+ public Deface copy() {
+ return new Deface(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DefiantGreatmaw.java b/Mage.Sets/src/mage/cards/d/DefiantGreatmaw.java
index b71d27ff4f1..731df0f5c73 100644
--- a/Mage.Sets/src/mage/cards/d/DefiantGreatmaw.java
+++ b/Mage.Sets/src/mage/cards/d/DefiantGreatmaw.java
@@ -60,7 +60,7 @@ class DefiantGreatmawTriggeredAbility extends TriggeredAbilityImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/d/DefilerOfSouls.java b/Mage.Sets/src/mage/cards/d/DefilerOfSouls.java
index 0e97a8be107..2e1f05f99d6 100644
--- a/Mage.Sets/src/mage/cards/d/DefilerOfSouls.java
+++ b/Mage.Sets/src/mage/cards/d/DefilerOfSouls.java
@@ -72,7 +72,7 @@ class DefilerOfSoulsEffect extends OneShotEffect {
if (player == null) {
return false;
}
- filter.add(new MonocoloredPredicate());
+ filter.add(MonocoloredPredicate.instance);
int amount;
int realCount = game.getBattlefield().countAll(filter, player.getId(), game);
@@ -90,7 +90,7 @@ class DefilerOfSoulsEffect extends OneShotEffect {
}
for ( int idx = 0; idx < target.getTargets().size(); idx++) {
- Permanent permanent = game.getPermanent((UUID)target.getTargets().get(idx));
+ Permanent permanent = game.getPermanent(target.getTargets().get(idx));
if ( permanent != null ) {
abilityApplied |= permanent.sacrifice(source.getSourceId(), game);
diff --git a/Mage.Sets/src/mage/cards/d/DelayTactic.java b/Mage.Sets/src/mage/cards/d/DelayTactic.java
index a51d607b436..7607fe00f80 100644
--- a/Mage.Sets/src/mage/cards/d/DelayTactic.java
+++ b/Mage.Sets/src/mage/cards/d/DelayTactic.java
@@ -41,7 +41,7 @@ public final class DelayTactic extends CardImpl {
this.getSpellAbility().addEffect(new GainAbilityAllEffect(HexproofAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent())
.setText("Creatures you control gain hexproof until end of turn"));
- // Creatures target opponent controls don't untap during his or her next untap step.
+ // Creatures target opponent controls don't untap during their next untap step.
Mode mode = new Mode();
mode.addEffect(new DelayTacticEffect());
mode.addTarget(new TargetOpponent());
@@ -63,7 +63,7 @@ class DelayTacticEffect extends OneShotEffect {
DelayTacticEffect() {
super(Outcome.Benefit);
- this.staticText = "Creatures target opponent controls don't untap during his or her next untap step";
+ this.staticText = "Creatures target opponent controls don't untap during their next untap step";
}
DelayTacticEffect(final DelayTacticEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/d/Demonfire.java b/Mage.Sets/src/mage/cards/d/Demonfire.java
index 71711b70c12..b8dfbc7148c 100644
--- a/Mage.Sets/src/mage/cards/d/Demonfire.java
+++ b/Mage.Sets/src/mage/cards/d/Demonfire.java
@@ -31,7 +31,7 @@ public final class Demonfire extends CardImpl {
// Demonfire deals X damage to any target.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
- new DamageTargetEffect(new ManacostVariableValue()),
+ new DamageTargetEffect(ManacostVariableValue.instance),
new InvertCondition(HellbentCondition.instance),
"{this} deals X damage to any target"));
@@ -41,7 +41,7 @@ public final class Demonfire extends CardImpl {
// Hellbent - If you have no cards in hand, Demonfire can't be countered and the damage can't be prevented.
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
- new DamageTargetEffect(new ManacostVariableValue(), false),
+ new DamageTargetEffect(ManacostVariableValue.instance, false),
HellbentCondition.instance,
"
Hellbent — If you have no cards in hand, this spell can't be countered and the damage can't be prevented."));
// can't be countered
diff --git a/Mage.Sets/src/mage/cards/d/DemonicTaskmaster.java b/Mage.Sets/src/mage/cards/d/DemonicTaskmaster.java
index 252b91460ca..13671d2f68c 100644
--- a/Mage.Sets/src/mage/cards/d/DemonicTaskmaster.java
+++ b/Mage.Sets/src/mage/cards/d/DemonicTaskmaster.java
@@ -24,7 +24,7 @@ public final class DemonicTaskmaster extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a creature other than Demonic Taskmaster");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DemonicTaskmaster(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DemonlordOfAshmouth.java b/Mage.Sets/src/mage/cards/d/DemonlordOfAshmouth.java
index e409e89cb4b..23928b343ac 100644
--- a/Mage.Sets/src/mage/cards/d/DemonlordOfAshmouth.java
+++ b/Mage.Sets/src/mage/cards/d/DemonlordOfAshmouth.java
@@ -24,7 +24,7 @@ public final class DemonlordOfAshmouth extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(" another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DemonlordOfAshmouth(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/Denied.java b/Mage.Sets/src/mage/cards/d/Denied.java
index a896f1e1630..b5825c8b1ea 100644
--- a/Mage.Sets/src/mage/cards/d/Denied.java
+++ b/Mage.Sets/src/mage/cards/d/Denied.java
@@ -58,7 +58,7 @@ class DeniedEffect extends OneShotEffect {
return true;
}
Player player = game.getPlayer(targetSpell.getControllerId());
- Object object = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
+ Object object = game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
if (player != null && object instanceof String) {
player.revealCards("Denied!", player.getHand(), game, true);
String namedCard = (String) object;
diff --git a/Mage.Sets/src/mage/cards/d/DenizenOfTheDeep.java b/Mage.Sets/src/mage/cards/d/DenizenOfTheDeep.java
index 7797d8b3cec..806ce42168b 100644
--- a/Mage.Sets/src/mage/cards/d/DenizenOfTheDeep.java
+++ b/Mage.Sets/src/mage/cards/d/DenizenOfTheDeep.java
@@ -22,7 +22,7 @@ public final class DenizenOfTheDeep extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
static{
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DenizenOfTheDeep(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DeposeDeploy.java b/Mage.Sets/src/mage/cards/d/DeposeDeploy.java
new file mode 100644
index 00000000000..b7a040e204f
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DeposeDeploy.java
@@ -0,0 +1,54 @@
+package mage.cards.d;
+
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.cards.CardSetInfo;
+import mage.cards.SplitCard;
+import mage.constants.CardType;
+import mage.constants.SpellAbilityType;
+import mage.filter.StaticFilters;
+import mage.game.permanent.token.ThopterColorlessToken;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DeposeDeploy extends SplitCard {
+
+ public DeposeDeploy(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W/U}", "{2}{W}{U}", SpellAbilityType.SPLIT);
+
+ // Depose
+ // Tap target creature.
+ // Draw a card.
+ this.getLeftHalfCard().getSpellAbility().addEffect(new TapTargetEffect());
+ this.getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getLeftHalfCard().getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
+
+ // Deploy
+ // Creature two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control.
+ this.getRightHalfCard().getSpellAbility().addEffect(
+ new CreateTokenEffect(new ThopterColorlessToken(), 2)
+ );
+ this.getRightHalfCard().getSpellAbility().addEffect(
+ new GainLifeEffect(new PermanentsOnBattlefieldCount(
+ StaticFilters.FILTER_CONTROLLED_CREATURES
+ )).setText(", then you gain 1 life for each creature you control.")
+ );
+
+ }
+
+ private DeposeDeploy(final DeposeDeploy card) {
+ super(card);
+ }
+
+ @Override
+ public DeposeDeploy copy() {
+ return new DeposeDeploy(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DeputyOfAcquittals.java b/Mage.Sets/src/mage/cards/d/DeputyOfAcquittals.java
index ffdc206d10c..da6d0e5ba6d 100644
--- a/Mage.Sets/src/mage/cards/d/DeputyOfAcquittals.java
+++ b/Mage.Sets/src/mage/cards/d/DeputyOfAcquittals.java
@@ -26,7 +26,7 @@ public final class DeputyOfAcquittals extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/d/DeputyOfDetention.java b/Mage.Sets/src/mage/cards/d/DeputyOfDetention.java
new file mode 100644
index 00000000000..d59bc25d3b7
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DeputyOfDetention.java
@@ -0,0 +1,110 @@
+package mage.cards.d;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterNonlandPermanent;
+import mage.filter.predicate.mageobject.NamePredicate;
+import mage.filter.predicate.permanent.ControllerIdPredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.TargetPermanent;
+import mage.util.CardUtil;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DeputyOfDetention extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterNonlandPermanent("nonland permanent an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public DeputyOfDetention(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{U}");
+
+ this.subtype.add(SubType.VEDALKEN);
+ this.subtype.add(SubType.WIZARD);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(3);
+
+ // When Deputy of Detention enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until Deputy of Detention leaves the battlefield.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DeputyOfDetentionExileEffect(), false);
+ ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
+ }
+
+ private DeputyOfDetention(final DeputyOfDetention card) {
+ super(card);
+ }
+
+ @Override
+ public DeputyOfDetention copy() {
+ return new DeputyOfDetention(this);
+ }
+}
+
+class DeputyOfDetentionExileEffect extends OneShotEffect {
+
+ DeputyOfDetentionExileEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "exile target nonland permanent an opponent controls " +
+ "and all other nonland permanents that player controls " +
+ "with the same name as that permanent until {this} leaves the battlefield";
+ }
+
+ private DeputyOfDetentionExileEffect(final DeputyOfDetentionExileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ Permanent targeted = game.getPermanent(source.getFirstTarget());
+
+ if (permanent == null || controller == null || targeted == null) {
+ return false;
+ }
+
+ FilterPermanent filter = new FilterNonlandPermanent();
+ filter.add(new ControllerIdPredicate(targeted.getControllerId()));
+ filter.add(new NamePredicate(targeted.getName()));
+
+ Set toExile = new LinkedHashSet<>();
+ for (Permanent creature : game.getBattlefield().getActivePermanents(filter, controller.getId(), game)) {
+ toExile.add(creature);
+ }
+
+ if (!toExile.isEmpty()) {
+ controller.moveCardsToExile(toExile, source, game, true, CardUtil.getCardExileZoneId(game, source), permanent.getIdName());
+ new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()).apply(game, source);
+ }
+ return true;
+ }
+
+ @Override
+ public DeputyOfDetentionExileEffect copy() {
+ return new DeputyOfDetentionExileEffect(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/d/DescendantOfSoramaro.java b/Mage.Sets/src/mage/cards/d/DescendantOfSoramaro.java
index aad9696a80d..ce8cde5bd0d 100644
--- a/Mage.Sets/src/mage/cards/d/DescendantOfSoramaro.java
+++ b/Mage.Sets/src/mage/cards/d/DescendantOfSoramaro.java
@@ -28,7 +28,7 @@ public final class DescendantOfSoramaro extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(3);
// {1}{U}: Look at the top X cards of your library, where X is the number of cards in your hand, then put them back in any order.
- Effect effect = new LookLibraryControllerEffect(new CardsInControllerHandCount());
+ Effect effect = new LookLibraryControllerEffect(CardsInControllerHandCount.instance);
effect.setText("Look at the top X cards of your library, where X is the number of cards in your hand, then put them back in any order");
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD,
effect, new ManaCostsImpl("{1}{U}")));
diff --git a/Mage.Sets/src/mage/cards/d/Desert.java b/Mage.Sets/src/mage/cards/d/Desert.java
index e901bdf3d17..06a6c85466a 100644
--- a/Mage.Sets/src/mage/cards/d/Desert.java
+++ b/Mage.Sets/src/mage/cards/d/Desert.java
@@ -27,7 +27,7 @@ public final class Desert extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creature");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public Desert(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/Desolation.java b/Mage.Sets/src/mage/cards/d/Desolation.java
index bed641377a5..89418192eaf 100644
--- a/Mage.Sets/src/mage/cards/d/Desolation.java
+++ b/Mage.Sets/src/mage/cards/d/Desolation.java
@@ -69,7 +69,7 @@ class DesolationEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- DesolationWatcher watcher = (DesolationWatcher) game.getState().getWatchers().get(DesolationWatcher.class.getSimpleName());
+ DesolationWatcher watcher = game.getState().getWatcher(DesolationWatcher.class);
if (watcher != null) {
for (UUID playerId : watcher.getPlayersTappedForMana()) {
Player player = game.getPlayer(playerId);
diff --git a/Mage.Sets/src/mage/cards/d/DesolationGiant.java b/Mage.Sets/src/mage/cards/d/DesolationGiant.java
index ebe02abc01c..5ca7943adbd 100644
--- a/Mage.Sets/src/mage/cards/d/DesolationGiant.java
+++ b/Mage.Sets/src/mage/cards/d/DesolationGiant.java
@@ -27,8 +27,8 @@ public final class DesolationGiant extends CardImpl {
private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("other creatures you control");
static {
- filter.add(new AnotherPredicate());
- filter2.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter2.add(AnotherPredicate.instance);
filter2.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/d/DesperateGambit.java b/Mage.Sets/src/mage/cards/d/DesperateGambit.java
index bce9512aa1d..80351f9dd66 100644
--- a/Mage.Sets/src/mage/cards/d/DesperateGambit.java
+++ b/Mage.Sets/src/mage/cards/d/DesperateGambit.java
@@ -8,7 +8,6 @@ import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.PreventionEffectImpl;
-import mage.abilities.effects.common.PreventDamageBySourceEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -21,7 +20,6 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.stack.StackObject;
import mage.filter.FilterObject;
-import mage.filter.predicate.permanent.ControllerPredicate;
import mage.players.Player;
import mage.target.TargetSource;
import mage.util.CardUtil;
@@ -70,7 +68,7 @@ class DesperateGambitEffect extends PreventionEffectImpl {
this.target.choose(Outcome.Benefit, source.getControllerId(), source.getSourceId(), game);
Player you = game.getPlayer(source.getControllerId());
if(you != null) {
- wonFlip = you.flipCoin(game);
+ wonFlip = you.flipCoin(source, game, true);
super.init(source, game);
}
}
diff --git a/Mage.Sets/src/mage/cards/d/DestinedLead.java b/Mage.Sets/src/mage/cards/d/DestinedLead.java
index b07578b6e83..d9529003d25 100644
--- a/Mage.Sets/src/mage/cards/d/DestinedLead.java
+++ b/Mage.Sets/src/mage/cards/d/DestinedLead.java
@@ -35,7 +35,7 @@ public final class DestinedLead extends SplitCard {
// to
// Lead
// All creatures able to block target creature this turn must do so.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
getRightHalfCard().getSpellAbility().addEffect(new MustBeBlockedByAllTargetEffect(Duration.EndOfTurn));
}
diff --git a/Mage.Sets/src/mage/cards/d/Detonate.java b/Mage.Sets/src/mage/cards/d/Detonate.java
index ff84de2a351..782f5af864c 100644
--- a/Mage.Sets/src/mage/cards/d/Detonate.java
+++ b/Mage.Sets/src/mage/cards/d/Detonate.java
@@ -1,9 +1,7 @@
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetControllerEffect;
@@ -16,33 +14,25 @@ import mage.filter.common.FilterArtifactPermanent;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.target.common.TargetArtifactPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LoneFox
*/
public final class Detonate extends CardImpl {
public Detonate(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}");
// Destroy target artifact with converted mana cost X. It can't be regenerated. Detonate deals X damage to that artifact's controller.
this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
this.getSpellAbility().addTarget(new TargetArtifactPermanent(new FilterArtifactPermanent("artifact with converted mana cost X")));
- Effect effect = new DamageTargetControllerEffect(new ManacostVariableValue());
+ Effect effect = new DamageTargetControllerEffect(ManacostVariableValue.instance);
effect.setText("{this} deals X damage to that artifact's controller");
this.getSpellAbility().addEffect(effect);
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if(ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact with converted mana cost X");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
- ability.addTarget(new TargetArtifactPermanent(filter));
- }
+ this.getSpellAbility().setTargetAdjuster(DetonateAdjuster.instance);
}
public Detonate(final Detonate card) {
@@ -54,3 +44,16 @@ public final class Detonate extends CardImpl {
return new Detonate(this);
}
}
+
+enum DetonateAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact with converted mana cost X");
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
+ ability.addTarget(new TargetArtifactPermanent(filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/d/DevastatingDreams.java b/Mage.Sets/src/mage/cards/d/DevastatingDreams.java
index cebed2d85a4..ee0d2b5b276 100644
--- a/Mage.Sets/src/mage/cards/d/DevastatingDreams.java
+++ b/Mage.Sets/src/mage/cards/d/DevastatingDreams.java
@@ -32,10 +32,10 @@ public final class DevastatingDreams extends CardImpl {
this.getSpellAbility().addCost(new DevastatingDreamsAdditionalCost());
// Each player sacrifices X lands.
- this.getSpellAbility().addEffect(new SacrificeAllEffect(new GetXValue(), new FilterControlledLandPermanent("lands")));
+ this.getSpellAbility().addEffect(new SacrificeAllEffect(GetXValue.instance, new FilterControlledLandPermanent("lands")));
// Devastating Dreams deals X damage to each creature.
- this.getSpellAbility().addEffect(new DamageAllEffect(new GetXValue(), new FilterCreaturePermanent()));
+ this.getSpellAbility().addEffect(new DamageAllEffect(GetXValue.instance, new FilterCreaturePermanent()));
}
public DevastatingDreams(final DevastatingDreams card) {
diff --git a/Mage.Sets/src/mage/cards/d/DevastatingSummons.java b/Mage.Sets/src/mage/cards/d/DevastatingSummons.java
index e15ae2af9f5..c5521add77c 100644
--- a/Mage.Sets/src/mage/cards/d/DevastatingSummons.java
+++ b/Mage.Sets/src/mage/cards/d/DevastatingSummons.java
@@ -55,8 +55,8 @@ class DevastatingSummonsEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
DevastatingSummonsElementalToken token = new DevastatingSummonsElementalToken();
- token.getPower().modifyBaseValue(new GetXValue().calculate(game, source, this));
- token.getToughness().modifyBaseValue(new GetXValue().calculate(game, source, this));
+ token.getPower().modifyBaseValue(GetXValue.instance.calculate(game, source, this));
+ token.getToughness().modifyBaseValue(GetXValue.instance.calculate(game, source, this));
token.putOntoBattlefield(2, game, source.getSourceId(), source.getControllerId());
diff --git a/Mage.Sets/src/mage/cards/d/DevilsPlay.java b/Mage.Sets/src/mage/cards/d/DevilsPlay.java
index 111f906c868..fad1267f4cb 100644
--- a/Mage.Sets/src/mage/cards/d/DevilsPlay.java
+++ b/Mage.Sets/src/mage/cards/d/DevilsPlay.java
@@ -23,7 +23,7 @@ public final class DevilsPlay extends CardImpl {
// Devil's Play deals X damage to any target.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetAnyTarget());
// Flashback {X}{R}{R}{R}
this.addAbility(new FlashbackAbility(new ManaCostsImpl("{X}{R}{R}{R}"), TimingRule.SORCERY));
diff --git a/Mage.Sets/src/mage/cards/d/DevoutChaplain.java b/Mage.Sets/src/mage/cards/d/DevoutChaplain.java
index 2f601ef3447..02b3d391f4d 100644
--- a/Mage.Sets/src/mage/cards/d/DevoutChaplain.java
+++ b/Mage.Sets/src/mage/cards/d/DevoutChaplain.java
@@ -30,7 +30,7 @@ public final class DevoutChaplain extends CardImpl {
private static final FilterControlledPermanent humanFilter = new FilterControlledPermanent("untapped Human you control");
static {
- humanFilter.add(Predicates.not(new TappedPredicate()));
+ humanFilter.add(Predicates.not(TappedPredicate.instance));
humanFilter.add(new SubtypePredicate(SubType.HUMAN));
}
diff --git a/Mage.Sets/src/mage/cards/d/DevoutInvocation.java b/Mage.Sets/src/mage/cards/d/DevoutInvocation.java
index b9a459fb356..ea6d47b2c79 100644
--- a/Mage.Sets/src/mage/cards/d/DevoutInvocation.java
+++ b/Mage.Sets/src/mage/cards/d/DevoutInvocation.java
@@ -48,7 +48,7 @@ class DevoutInvocationEffect extends OneShotEffect {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creatures you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public DevoutInvocationEffect() {
diff --git a/Mage.Sets/src/mage/cards/d/DiabolicRevelation.java b/Mage.Sets/src/mage/cards/d/DiabolicRevelation.java
index cd93dc22aa1..bdac351e7ba 100644
--- a/Mage.Sets/src/mage/cards/d/DiabolicRevelation.java
+++ b/Mage.Sets/src/mage/cards/d/DiabolicRevelation.java
@@ -58,7 +58,7 @@ class DiabolicRevelationEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- int amount = new ManacostVariableValue().calculate(game, source, this);
+ int amount = ManacostVariableValue.instance.calculate(game, source, this);
TargetCardInLibrary target = new TargetCardInLibrary(0, amount, new FilterCard());
Player player = game.getPlayer(source.getControllerId());
diff --git a/Mage.Sets/src/mage/cards/d/DiamondKaleidoscope.java b/Mage.Sets/src/mage/cards/d/DiamondKaleidoscope.java
index c586f768b79..b34727c950b 100644
--- a/Mage.Sets/src/mage/cards/d/DiamondKaleidoscope.java
+++ b/Mage.Sets/src/mage/cards/d/DiamondKaleidoscope.java
@@ -29,7 +29,7 @@ public final class DiamondKaleidoscope extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Prism token");
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
filter.add(new SubtypePredicate(SubType.PRISM));
}
diff --git a/Mage.Sets/src/mage/cards/d/DiamondValley.java b/Mage.Sets/src/mage/cards/d/DiamondValley.java
index a1a75bb9486..530bbee905c 100644
--- a/Mage.Sets/src/mage/cards/d/DiamondValley.java
+++ b/Mage.Sets/src/mage/cards/d/DiamondValley.java
@@ -25,7 +25,7 @@ public final class DiamondValley extends CardImpl {
public DiamondValley(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
- Effect effect = new GainLifeEffect(new SacrificeCostCreaturesToughness());
+ Effect effect = new GainLifeEffect(SacrificeCostCreaturesToughness.instance);
effect.setText("You gain life equal to the sacrificed creature's toughness");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost());
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT)));
diff --git a/Mage.Sets/src/mage/cards/d/Dichotomancy.java b/Mage.Sets/src/mage/cards/d/Dichotomancy.java
index c788c4dc8f3..a2bcbcadb8a 100644
--- a/Mage.Sets/src/mage/cards/d/Dichotomancy.java
+++ b/Mage.Sets/src/mage/cards/d/Dichotomancy.java
@@ -59,7 +59,7 @@ class DichotomancyEffect extends OneShotEffect {
private static final FilterNonlandPermanent filter = new FilterNonlandPermanent();
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public DichotomancyEffect() {
diff --git a/Mage.Sets/src/mage/cards/d/DiligentExcavator.java b/Mage.Sets/src/mage/cards/d/DiligentExcavator.java
index 005b0a09bed..5723ceb284c 100644
--- a/Mage.Sets/src/mage/cards/d/DiligentExcavator.java
+++ b/Mage.Sets/src/mage/cards/d/DiligentExcavator.java
@@ -23,7 +23,7 @@ public final class DiligentExcavator extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a historic spell");
static {
- filter.add(new HistoricPredicate());
+ filter.add(HistoricPredicate.instance);
}
public DiligentExcavator(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DiluvianPrimordial.java b/Mage.Sets/src/mage/cards/d/DiluvianPrimordial.java
index 69905e94701..98bde31f8f6 100644
--- a/Mage.Sets/src/mage/cards/d/DiluvianPrimordial.java
+++ b/Mage.Sets/src/mage/cards/d/DiluvianPrimordial.java
@@ -1,7 +1,6 @@
package mage.cards.d;
-import java.util.UUID;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
@@ -13,11 +12,7 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.SubType;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
@@ -29,10 +24,12 @@ import mage.game.events.ZoneChangeEvent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCardInOpponentsGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class DiluvianPrimordial extends CardImpl {
@@ -48,24 +45,9 @@ public final class DiluvianPrimordial extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Diluvian Primordial enters the battlefield, for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(), false));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- ability.getTargets().clear();
- for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- FilterCard filter = new FilterCard("instant or sorcery card from " + opponent.getLogName() + "'s graveyard");
- filter.add(new OwnerIdPredicate(opponentId));
- filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY)));
- TargetCardInOpponentsGraveyard target = new TargetCardInOpponentsGraveyard(0, 1, filter);
- ability.addTarget(target);
- }
- }
- }
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(), false);
+ ability.setTargetAdjuster(DiluvianPrimordialAdjuster.instance);
+ this.addAbility(ability);
}
public DiluvianPrimordial(final DiluvianPrimordial card) {
@@ -78,6 +60,26 @@ public final class DiluvianPrimordial extends CardImpl {
}
}
+enum DiluvianPrimordialAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent == null) {
+ continue;
+ }
+ FilterCard filter = new FilterCard("instant or sorcery card from " + opponent.getLogName() + "'s graveyard");
+ filter.add(new OwnerIdPredicate(opponentId));
+ filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY)));
+ TargetCardInOpponentsGraveyard target = new TargetCardInOpponentsGraveyard(0, 1, filter);
+ ability.addTarget(target);
+ }
+ }
+}
+
class DiluvianPrimordialEffect extends OneShotEffect {
public DiluvianPrimordialEffect() {
@@ -161,6 +163,6 @@ class DiluvianPrimordialReplacementEffect extends ReplacementEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
return zEvent.getToZone() == Zone.GRAVEYARD
- && ((ZoneChangeEvent) event).getTargetId().equals(getTargetPointer().getFirst(game, source));
+ && event.getTargetId().equals(getTargetPointer().getFirst(game, source));
}
}
diff --git a/Mage.Sets/src/mage/cards/d/DimirCutpurse.java b/Mage.Sets/src/mage/cards/d/DimirCutpurse.java
index 90bdf07a64c..54476bf662f 100644
--- a/Mage.Sets/src/mage/cards/d/DimirCutpurse.java
+++ b/Mage.Sets/src/mage/cards/d/DimirCutpurse.java
@@ -1,7 +1,5 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
@@ -9,20 +7,20 @@ import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
- *
*/
public final class DimirCutpurse extends CardImpl {
public DimirCutpurse(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{B}");
this.subtype.add(SubType.SPIRIT);
this.power = new MageInt(2);
@@ -30,7 +28,6 @@ public final class DimirCutpurse extends CardImpl {
// Whenever Dimir Cutpurse deals combat damage to a player, that player discards a card and you draw a card.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DimirCutpurseEffect(), false, true));
-
}
public DimirCutpurse(final DimirCutpurse card) {
diff --git a/Mage.Sets/src/mage/cards/d/DimirDoppelganger.java b/Mage.Sets/src/mage/cards/d/DimirDoppelganger.java
index 388d4d7bfbf..e972261d61c 100644
--- a/Mage.Sets/src/mage/cards/d/DimirDoppelganger.java
+++ b/Mage.Sets/src/mage/cards/d/DimirDoppelganger.java
@@ -81,7 +81,7 @@ class DimirDoppelgangerEffect extends OneShotEffect {
Cards cardsToExile = new CardsImpl();
cardsToExile.add(copyFromCard);
controller.moveCards(cardsToExile, Zone.EXILED, source, game);
- newBluePrint = new PermanentCard((Card) copyFromCard, source.getControllerId(), game);
+ newBluePrint = new PermanentCard(copyFromCard, source.getControllerId(), game);
newBluePrint.assignNewId();
ApplyToPermanent applier = new DimirDoppelgangerApplier();
applier.apply(game, newBluePrint, source, dimirDoppelganger.getId());
diff --git a/Mage.Sets/src/mage/cards/d/DireFleetCaptain.java b/Mage.Sets/src/mage/cards/d/DireFleetCaptain.java
index 10efe1d3897..45e32a2b7d7 100644
--- a/Mage.Sets/src/mage/cards/d/DireFleetCaptain.java
+++ b/Mage.Sets/src/mage/cards/d/DireFleetCaptain.java
@@ -25,7 +25,7 @@ public final class DireFleetCaptain extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.PIRATE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DireFleetCaptain(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DireFleetDaredevil.java b/Mage.Sets/src/mage/cards/d/DireFleetDaredevil.java
index f49e33e7050..5302dbb2d16 100644
--- a/Mage.Sets/src/mage/cards/d/DireFleetDaredevil.java
+++ b/Mage.Sets/src/mage/cards/d/DireFleetDaredevil.java
@@ -179,7 +179,7 @@ class DireFleetDaredevilReplacementEffect extends ReplacementEffectImpl {
StackObject stackObject = game.getStack().getStackObject(eventObject);
if (stackObject != null) {
if (stackObject instanceof Spell) {
- game.rememberLKI(stackObject.getId(), Zone.STACK, (Spell) stackObject);
+ game.rememberLKI(stackObject.getId(), Zone.STACK, stackObject);
}
if (stackObject instanceof Card
&& stackObject.getSourceId().equals(((FixedTarget) getTargetPointer()).getTarget())
@@ -201,6 +201,6 @@ class DireFleetDaredevilReplacementEffect extends ReplacementEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
return zEvent.getToZone() == Zone.GRAVEYARD
- && ((ZoneChangeEvent) event).getTargetId().equals(((FixedTarget) getTargetPointer()).getTarget());
+ && event.getTargetId().equals(((FixedTarget) getTargetPointer()).getTarget());
}
}
diff --git a/Mage.Sets/src/mage/cards/d/DireFleetPoisoner.java b/Mage.Sets/src/mage/cards/d/DireFleetPoisoner.java
index 3e97583f2dc..f9199a211b6 100644
--- a/Mage.Sets/src/mage/cards/d/DireFleetPoisoner.java
+++ b/Mage.Sets/src/mage/cards/d/DireFleetPoisoner.java
@@ -30,7 +30,7 @@ public final class DireFleetPoisoner extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public DireFleetPoisoner(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/Disappear.java b/Mage.Sets/src/mage/cards/d/Disappear.java
index 43b6fa78a8a..a02d0bf1289 100644
--- a/Mage.Sets/src/mage/cards/d/Disappear.java
+++ b/Mage.Sets/src/mage/cards/d/Disappear.java
@@ -70,7 +70,7 @@ class DisappearEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Permanent aura = (Permanent) game.getPermanentOrLKIBattlefield(source.getSourceId());
+ Permanent aura = game.getPermanentOrLKIBattlefield(source.getSourceId());
Player controller = game.getPlayer(source.getControllerId());
if (controller != null
&& aura != null
diff --git a/Mage.Sets/src/mage/cards/d/Disembowel.java b/Mage.Sets/src/mage/cards/d/Disembowel.java
index 3e1f1d500dc..6aa70be2abc 100644
--- a/Mage.Sets/src/mage/cards/d/Disembowel.java
+++ b/Mage.Sets/src/mage/cards/d/Disembowel.java
@@ -1,9 +1,7 @@
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -13,30 +11,21 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LoneFox
*/
public final class Disembowel extends CardImpl {
public Disembowel(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{B}");
// Destroy target creature with converted mana cost X.
- this.getSpellAbility().addEffect(new DestroyTargetEffect());
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with converted mana cost X")));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if(ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost X");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
- ability.addTarget(new TargetCreaturePermanent(filter));
- }
+ this.getSpellAbility().addEffect(new DestroyTargetEffect("creature with converted mana cost X"));
+ this.getSpellAbility().setTargetAdjuster(DisembowelAdjuster.instance);
}
public Disembowel(final Disembowel card) {
@@ -48,3 +37,16 @@ public final class Disembowel extends CardImpl {
return new Disembowel(this);
}
}
+
+enum DisembowelAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost X");
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java b/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java
index ab9a61804ff..7b67d4bc805 100644
--- a/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java
+++ b/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java
@@ -1,6 +1,5 @@
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -16,8 +15,9 @@ import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class DisinformationCampaign extends CardImpl {
@@ -27,11 +27,9 @@ public final class DisinformationCampaign extends CardImpl {
// When Disinformation Campaign enters the battlefield, you draw a card and each opponent discards a card.
Ability ability = new EntersBattlefieldTriggeredAbility(
- new DrawCardSourceControllerEffect(1).setText("you draw a card")
- );
+ new DrawCardSourceControllerEffect(1, "you"));
ability.addEffect(new DiscardEachPlayerEffect(
- new StaticValue(1), false, TargetController.OPPONENT
- ).setText("and each opponent discards a card"));
+ new StaticValue(1), false, TargetController.OPPONENT).concatBy("and"));
this.addAbility(ability);
// Whenever you surveil, return Disinformation Campaign to its owner's hand.
diff --git a/Mage.Sets/src/mage/cards/d/Disintegrate.java b/Mage.Sets/src/mage/cards/d/Disintegrate.java
index bcd68137633..8b0f12edb55 100644
--- a/Mage.Sets/src/mage/cards/d/Disintegrate.java
+++ b/Mage.Sets/src/mage/cards/d/Disintegrate.java
@@ -23,7 +23,7 @@ public final class Disintegrate extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}");
// Disintegrate deals X damage to any target. That creature can't be regenerated this turn. If the creature would die this turn, exile it instead.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addEffect(new CantRegenerateTargetEffect(Duration.EndOfTurn, "That creature"));
Effect effect = new ExileTargetIfDiesEffect();
effect.setText("If the creature would die this turn, exile it instead");
diff --git a/Mage.Sets/src/mage/cards/d/DissensionInTheRanks.java b/Mage.Sets/src/mage/cards/d/DissensionInTheRanks.java
index ef89d09984f..13d14c9460d 100644
--- a/Mage.Sets/src/mage/cards/d/DissensionInTheRanks.java
+++ b/Mage.Sets/src/mage/cards/d/DissensionInTheRanks.java
@@ -20,7 +20,7 @@ public final class DissensionInTheRanks extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("blocking creature");
static {
- filter.add(new BlockingPredicate());
+ filter.add(BlockingPredicate.instance);
}
public DissensionInTheRanks(UUID ownerId, CardSetInfo setInfo) {
@@ -34,7 +34,7 @@ public final class DissensionInTheRanks extends CardImpl {
FilterCreaturePermanent filter2 = new FilterCreaturePermanent("another target blocking creature");
filter2.add(new AnotherTargetPredicate(2));
- filter2.add(new BlockingPredicate());
+ filter2.add(BlockingPredicate.instance);
TargetCreaturePermanent target2 = new TargetCreaturePermanent(filter2);
target2.setTargetTag(2);
this.getSpellAbility().addTarget(target2);
diff --git a/Mage.Sets/src/mage/cards/d/DistortingWake.java b/Mage.Sets/src/mage/cards/d/DistortingWake.java
index 6f0491c67be..e03c667af13 100644
--- a/Mage.Sets/src/mage/cards/d/DistortingWake.java
+++ b/Mage.Sets/src/mage/cards/d/DistortingWake.java
@@ -1,9 +1,7 @@
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
@@ -13,22 +11,23 @@ import mage.filter.common.FilterNonlandPermanent;
import mage.game.Game;
import mage.target.Target;
import mage.target.common.TargetNonlandPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class DistortingWake extends CardImpl {
public DistortingWake(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{U}{U}");
-
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{U}{U}{U}");
// Return X target nonland permanents to their owners' hands.
Effect effect = new ReturnToHandTargetEffect();
effect.setText("Return X target nonland permanents to their owners' hands");
this.getSpellAbility().addEffect(effect);
- this.getSpellAbility().addTarget(new TargetNonlandPermanent());
+ this.getSpellAbility().setTargetAdjuster(DistortingWakeAdjuster.instance);
}
public DistortingWake(final DistortingWake card) {
@@ -39,16 +38,17 @@ public final class DistortingWake extends CardImpl {
public DistortingWake copy() {
return new DistortingWake(this);
}
+}
+
+enum DistortingWakeAdjuster implements TargetAdjuster {
+ instance;
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- int xValue = ability.getManaCostsToPay().getX();
- Target target = new TargetNonlandPermanent(xValue, xValue,
- new FilterNonlandPermanent(xValue + " target nonland permanent(s)"), false);
- ability.getTargets().clear();
- ability.getTargets().add(target);
- }
+ int xValue = ability.getManaCostsToPay().getX();
+ Target target = new TargetNonlandPermanent(xValue, xValue,
+ new FilterNonlandPermanent(xValue + " target nonland permanent(s)"), false);
+ ability.getTargets().clear();
+ ability.getTargets().add(target);
}
-
-}
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/d/DiversionaryTactics.java b/Mage.Sets/src/mage/cards/d/DiversionaryTactics.java
index 2e9c582c229..79ff36ae6b0 100644
--- a/Mage.Sets/src/mage/cards/d/DiversionaryTactics.java
+++ b/Mage.Sets/src/mage/cards/d/DiversionaryTactics.java
@@ -24,7 +24,7 @@ public final class DiversionaryTactics extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creatures you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public DiversionaryTactics(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DivineOffering.java b/Mage.Sets/src/mage/cards/d/DivineOffering.java
index 8682ffefdd8..02ddd7a87e8 100644
--- a/Mage.Sets/src/mage/cards/d/DivineOffering.java
+++ b/Mage.Sets/src/mage/cards/d/DivineOffering.java
@@ -23,7 +23,7 @@ public final class DivineOffering extends CardImpl {
// Destroy target artifact. You gain life equal to its converted mana cost.
this.getSpellAbility().addEffect(new DestroyTargetEffect());
- Effect effect = new GainLifeEffect(new TargetConvertedManaCost());
+ Effect effect = new GainLifeEffect(TargetConvertedManaCost.instance);
effect.setText("You gain life equal to its converted mana cost");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
diff --git a/Mage.Sets/src/mage/cards/d/DivinersWand.java b/Mage.Sets/src/mage/cards/d/DivinersWand.java
index b1387f89270..50087532215 100644
--- a/Mage.Sets/src/mage/cards/d/DivinersWand.java
+++ b/Mage.Sets/src/mage/cards/d/DivinersWand.java
@@ -1,7 +1,5 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.DrawCardControllerTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
@@ -23,40 +21,46 @@ import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class DivinersWand extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("a Wizard creature");
+
static {
filter.add(new SubtypePredicate(SubType.WIZARD));
}
public DivinersWand(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.TRIBAL,CardType.ARTIFACT},"{3}");
+ super(ownerId, setInfo, new CardType[]{CardType.TRIBAL, CardType.ARTIFACT}, "{3}");
this.subtype.add(SubType.WIZARD);
this.subtype.add(SubType.EQUIPMENT);
- // Equipped creature has "Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn" and "{4}: Draw a card."
- Ability gainedAbility = new DrawCardControllerTriggeredAbility(new BoostSourceEffect(1,1, Duration.EndOfTurn), false);
- gainedAbility.addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn));
- Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.EQUIPMENT);
- effect.setText("Equipped creature has \"Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn\"");
- Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect);
- effect = new GainAbilityAttachedEffect(
- new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(4)), AttachmentType.EQUIPMENT);
- effect.setText("and \"{4}: Draw a card.\"");
- ability.addEffect(effect);
- this.addAbility(ability);
-
// Whenever a Wizard creature enters the battlefield, you may attach Diviner's Wand to it.
this.addAbility(new EntersBattlefieldAllTriggeredAbility(
Zone.BATTLEFIELD, new AttachEffect(Outcome.Detriment, "attach {source} to it"),
filter, true, SetTargetPointer.PERMANENT, null));
+
// Equip {3}
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(3)));
+
+ // Equipped creature has "Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn" and "{4}: Draw a card."
+ // new abilities
+ Ability newBoost = new DrawCardControllerTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false);
+ newBoost.addEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.EndOfTurn).concatBy("and"));
+ Ability newDraw = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new GenericManaCost(4));
+ // gain new abilities
+ Effect effectBoost = new GainAbilityAttachedEffect(newBoost, AttachmentType.EQUIPMENT)
+ .setText("Equipped creature has \"Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn\"");
+ Effect effectDraw = new GainAbilityAttachedEffect(newDraw, AttachmentType.EQUIPMENT)
+ .setText("\"{4}: Draw a card.\"");
+ // total ability
+ Ability totalAbility = new SimpleStaticAbility(Zone.BATTLEFIELD, effectBoost);
+ totalAbility.addEffect(effectDraw.concatBy("and"));
+ this.addAbility(totalAbility);
}
public DivinersWand(final DivinersWand card) {
diff --git a/Mage.Sets/src/mage/cards/d/DoggedHunter.java b/Mage.Sets/src/mage/cards/d/DoggedHunter.java
index 2f5c0600365..b5e8dd7b435 100644
--- a/Mage.Sets/src/mage/cards/d/DoggedHunter.java
+++ b/Mage.Sets/src/mage/cards/d/DoggedHunter.java
@@ -24,7 +24,7 @@ public final class DoggedHunter extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature token");
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
}
public DoggedHunter(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DolmenGate.java b/Mage.Sets/src/mage/cards/d/DolmenGate.java
index b5172e1baed..24cad2f4d3d 100644
--- a/Mage.Sets/src/mage/cards/d/DolmenGate.java
+++ b/Mage.Sets/src/mage/cards/d/DolmenGate.java
@@ -21,7 +21,7 @@ public final class DolmenGate extends CardImpl {
private static final FilterControlledCreatureInPlay filter = new FilterControlledCreatureInPlay("attacking creatures you control");
static {
- filter.getCreatureFilter().add(new AttackingPredicate());
+ filter.getCreatureFilter().add(AttackingPredicate.instance);
}
public DolmenGate(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/Dominate.java b/Mage.Sets/src/mage/cards/d/Dominate.java
index 7ad2e93a8cd..d9c74afb3c6 100644
--- a/Mage.Sets/src/mage/cards/d/Dominate.java
+++ b/Mage.Sets/src/mage/cards/d/Dominate.java
@@ -1,9 +1,6 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -15,38 +12,43 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class Dominate extends CardImpl {
public Dominate(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{1}{U}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{1}{U}{U}");
// Gain control of target creature with converted mana cost X or less.
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true));
this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with converted mana cost X or less")));
+ this.getSpellAbility().setTargetAdjuster(DominateAdjuster.instance);
}
public Dominate(final Dominate card) {
super(card);
}
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if(ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost X or less");
- filter.add(Predicates.not(new ConvertedManaCostPredicate(ComparisonType.MORE_THAN, xValue)));
- ability.addTarget(new TargetCreaturePermanent(filter));
- }
- }
@Override
public Dominate copy() {
return new Dominate(this);
}
}
+
+enum DominateAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost X or less");
+ filter.add(Predicates.not(new ConvertedManaCostPredicate(ComparisonType.MORE_THAN, xValue)));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/d/DominatorDrone.java b/Mage.Sets/src/mage/cards/d/DominatorDrone.java
index 3a06feb1f12..ece62e0d2a4 100644
--- a/Mage.Sets/src/mage/cards/d/DominatorDrone.java
+++ b/Mage.Sets/src/mage/cards/d/DominatorDrone.java
@@ -28,8 +28,8 @@ public final class DominatorDrone extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another colorless creature");
static {
- filter.add(new AnotherPredicate());
- filter.add(new ColorlessPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(ColorlessPredicate.instance);
}
public DominatorDrone(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DomineeringWill.java b/Mage.Sets/src/mage/cards/d/DomineeringWill.java
index 808966caefd..384ad50460c 100644
--- a/Mage.Sets/src/mage/cards/d/DomineeringWill.java
+++ b/Mage.Sets/src/mage/cards/d/DomineeringWill.java
@@ -33,7 +33,7 @@ public final class DomineeringWill extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonattacking creatures");
static {
- filter.add(Predicates.not(new AttackingPredicate()));
+ filter.add(Predicates.not(AttackingPredicate.instance));
}
public DomineeringWill(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DomriChaosBringer.java b/Mage.Sets/src/mage/cards/d/DomriChaosBringer.java
new file mode 100644
index 00000000000..d05415185a7
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DomriChaosBringer.java
@@ -0,0 +1,144 @@
+package mage.cards.d;
+
+import mage.MageObject;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.DelayedTriggeredAbility;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.GetEmblemEffect;
+import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
+import mage.abilities.effects.common.ManaEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect;
+import mage.abilities.effects.mana.BasicManaEffect;
+import mage.abilities.keyword.RiotAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.FilterSpell;
+import mage.filter.StaticFilters;
+import mage.filter.predicate.mageobject.CardIdPredicate;
+import mage.game.Game;
+import mage.game.command.emblems.DomriChaosBringerEmblem;
+import mage.game.events.GameEvent;
+import mage.players.Player;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DomriChaosBringer extends CardImpl {
+
+ public DomriChaosBringer(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{G}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.DOMRI);
+ this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5));
+
+ // +1: Add {R} or {G}. If that mana is spent on a creature spell, it gains riot.
+ this.addAbility(new LoyaltyAbility(new DomriChaosBringerEffect(), 1));
+
+ // −3: Look at the top four cards of your library. You may reveal up to two creature cards from among them and put them into your hand. Put the rest on the bottom of your library in a random order.
+ this.addAbility(new LoyaltyAbility(new LookLibraryAndPickControllerEffect(
+ new StaticValue(4), false, new StaticValue(2),
+ StaticFilters.FILTER_CARD_CREATURE, Zone.LIBRARY, false,
+ true, true, Zone.HAND, false, false, false
+ ).setText(
+ "Look at the top four cards of your library. " +
+ "You may reveal up to two creature cards from among them " +
+ "and put them into your hand. Put the rest on the bottom of your library " +
+ "in a random order."
+ ), -3));
+
+ // −8: You get an emblem with "At the beginning of each end step, create a 4/4 red and green Beast creature token with trample."
+ this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new DomriChaosBringerEmblem()), -8));
+ }
+
+ private DomriChaosBringer(final DomriChaosBringer card) {
+ super(card);
+ }
+
+ @Override
+ public DomriChaosBringer copy() {
+ return new DomriChaosBringer(this);
+ }
+}
+
+class DomriChaosBringerEffect extends OneShotEffect {
+
+ DomriChaosBringerEffect() {
+ super(Outcome.Benefit);
+ staticText = "Add {R} or {G}. If that mana is spent on a creature spell, it gains riot.";
+ }
+
+ private DomriChaosBringerEffect(final DomriChaosBringerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DomriChaosBringerEffect copy() {
+ return new DomriChaosBringerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ ManaEffect manaEffect;
+ if (player.chooseUse(Outcome.PutManaInPool, "Choose red or green mana", "", "Red", "Green", source, game)) {
+ manaEffect = new BasicManaEffect(Mana.RedMana(1));
+ } else {
+ manaEffect = new BasicManaEffect(Mana.GreenMana(1));
+ }
+ game.addDelayedTriggeredAbility(new DomriChaosBringerTriggeredAbility(source.getSourceId()), source);
+ return manaEffect.apply(game, source);
+ }
+}
+
+class DomriChaosBringerTriggeredAbility extends DelayedTriggeredAbility {
+
+ private final UUID spellId;
+
+ DomriChaosBringerTriggeredAbility(UUID spellId) {
+ super(null, Duration.EndOfStep, true);
+ this.spellId = spellId;
+ this.usesStack = false;
+ }
+
+ private DomriChaosBringerTriggeredAbility(final DomriChaosBringerTriggeredAbility ability) {
+ super(ability);
+ this.spellId = ability.spellId;
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.MANA_PAID;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (!event.getSourceId().equals(spellId)) {
+ return false;
+ }
+ MageObject mo = game.getObject(event.getTargetId());
+ if (mo == null || !mo.isCreature()) {
+ return false;
+ }
+ this.getEffects().clear();
+ FilterSpell filter = new FilterSpell();
+ filter.add(new CardIdPredicate(event.getTargetId()));
+ this.addEffect(new GainAbilityControlledSpellsEffect(new RiotAbility(), filter));
+ return true;
+ }
+
+ @Override
+ public DomriChaosBringerTriggeredAbility copy() {
+ return new DomriChaosBringerTriggeredAbility(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DomriCitySmasher.java b/Mage.Sets/src/mage/cards/d/DomriCitySmasher.java
new file mode 100644
index 00000000000..2475c5f7d1c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DomriCitySmasher.java
@@ -0,0 +1,69 @@
+package mage.cards.d;
+
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.effects.common.counter.AddCountersAllEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.counters.CounterType;
+import mage.filter.StaticFilters;
+import mage.target.common.TargetAnyTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DomriCitySmasher extends CardImpl {
+
+ public DomriCitySmasher(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{R}{G}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.DOMRI);
+ this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4));
+
+ // +2: Creatures you control get +1/+1 and gain haste until end of turn.
+ Ability ability = new LoyaltyAbility(new BoostControlledEffect(
+ 1, 1, Duration.EndOfTurn
+ ).setText("creatures you control get +1/+1"), 2);
+ ability.addEffect(new GainAbilityControlledEffect(
+ HasteAbility.getInstance(), Duration.EndOfTurn
+ ).setText("and gain haste until end of turn"));
+ this.addAbility(ability);
+
+ // -3: Domri, City Smasher deals 3 damage to any target.
+ ability = new LoyaltyAbility(new DamageTargetEffect(3), -3);
+ ability.addTarget(new TargetAnyTarget());
+ this.addAbility(ability);
+
+ // -8: Put three +1/+1 counters on each creature you control. Those creatures gain trample until end of turn.
+ ability = new LoyaltyAbility(new AddCountersAllEffect(
+ CounterType.P1P1.createInstance(3),
+ StaticFilters.FILTER_CONTROLLED_CREATURE
+ ), -8);
+ ability.addEffect(new GainAbilityControlledEffect(
+ TrampleAbility.getInstance(), Duration.EndOfTurn
+ ).setText("Those creatures gain trample until end of turn"));
+ this.addAbility(ability);
+ }
+
+ private DomriCitySmasher(final DomriCitySmasher card) {
+ super(card);
+ }
+
+ @Override
+ public DomriCitySmasher copy() {
+ return new DomriCitySmasher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DomrisNodorog.java b/Mage.Sets/src/mage/cards/d/DomrisNodorog.java
new file mode 100644
index 00000000000..2c289dd233a
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DomrisNodorog.java
@@ -0,0 +1,51 @@
+package mage.cards.d;
+
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.NamePredicate;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DomrisNodorog extends CardImpl {
+
+ private static final FilterCard filter = new FilterCard("card named Domri, City Smasher");
+
+ static {
+ filter.add(new NamePredicate("Domri, City Smasher"));
+ }
+
+ public DomrisNodorog(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{G}");
+
+ this.subtype.add(SubType.BEAST);
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(2);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // When Domri's Nodorog enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new SearchLibraryGraveyardPutInHandEffect(filter, false, true)
+ ));
+ }
+
+ private DomrisNodorog(final DomrisNodorog card) {
+ super(card);
+ }
+
+ @Override
+ public DomrisNodorog copy() {
+ return new DomrisNodorog(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java b/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java
index 03c4f0c6f18..984b2342ec1 100644
--- a/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java
+++ b/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java
@@ -1,19 +1,20 @@
package mage.cards.d;
-import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.constants.Zone;
import mage.filter.StaticFilters;
-import mage.game.Game;
+
+import java.util.UUID;
/**
- *
* 613.10. Some continuous effects affect game rules rather than objects. For
* example, effects may modify a player's maximum hand size, or say that a
* creature must attack this turn if able. These effects are applied after all
@@ -22,7 +23,6 @@ import mage.game.Game;
* in rule 601.2e. All other such effects are applied in timestamp order. See
* also the rules for timestamp order and dependency (rules 613.6 and 613.7)
*
- *
* @author LevelX2
*/
public final class DoranTheSiegeTower extends CardImpl {
@@ -37,10 +37,15 @@ public final class DoranTheSiegeTower extends CardImpl {
this.toughness = new MageInt(5);
// Each creature assigns combat damage equal to its toughness rather than its power.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DoranTheSiegeTowerCombatDamageRuleEffect()));
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new CombatDamageByToughnessEffect(
+ StaticFilters.FILTER_PERMANENT_CREATURE, false
+ )
+ ));
}
- public DoranTheSiegeTower(final DoranTheSiegeTower card) {
+ private DoranTheSiegeTower(final DoranTheSiegeTower card) {
super(card);
}
@@ -49,38 +54,3 @@ public final class DoranTheSiegeTower extends CardImpl {
return new DoranTheSiegeTower(this);
}
}
-
-class DoranTheSiegeTowerCombatDamageRuleEffect extends ContinuousEffectImpl {
-
- public DoranTheSiegeTowerCombatDamageRuleEffect() {
- super(Duration.WhileOnBattlefield, Outcome.Detriment);
- staticText = "Each creature assigns combat damage equal to its toughness rather than its power";
- }
-
- public DoranTheSiegeTowerCombatDamageRuleEffect(final DoranTheSiegeTowerCombatDamageRuleEffect effect) {
- super(effect);
- }
-
- @Override
- public DoranTheSiegeTowerCombatDamageRuleEffect copy() {
- return new DoranTheSiegeTowerCombatDamageRuleEffect(this);
- }
-
- @Override
- public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- // Change the rule
- game.getCombat().setUseToughnessForDamage(true);
- game.getCombat().addUseToughnessForDamageFilter(StaticFilters.FILTER_PERMANENT_CREATURES);
- return true;
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return false;
- }
-
- @Override
- public boolean hasLayer(Layer layer) {
- return layer == Layer.RulesEffects;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/d/DormantVolcano.java b/Mage.Sets/src/mage/cards/d/DormantVolcano.java
index d43f82f6174..8ee5e9f5bbf 100644
--- a/Mage.Sets/src/mage/cards/d/DormantVolcano.java
+++ b/Mage.Sets/src/mage/cards/d/DormantVolcano.java
@@ -30,7 +30,7 @@ public final class DormantVolcano extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.MOUNTAIN));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public DormantVolcano(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DovinArchitectOfLaw.java b/Mage.Sets/src/mage/cards/d/DovinArchitectOfLaw.java
new file mode 100644
index 00000000000..997df68c943
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DovinArchitectOfLaw.java
@@ -0,0 +1,56 @@
+package mage.cards.d;
+
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
+import mage.abilities.effects.common.*;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.filter.StaticFilters;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetOpponent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DovinArchitectOfLaw extends CardImpl {
+
+ public DovinArchitectOfLaw(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{W}{U}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.DOVIN);
+ this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5));
+
+ // +1: You gain 2 life and draw a card.
+ Ability ability = new LoyaltyAbility(new GainLifeEffect(2), 1);
+ ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and"));
+ this.addAbility(ability);
+
+ // -1: Tap target creature. It doesn't untap during its controller's next untap step.
+ ability = new LoyaltyAbility(new TapTargetEffect(), -1);
+ ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("It"));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+
+ // -9: Tap all permanents target opponent controls. That player skips their next untap step.
+ ability = new LoyaltyAbility(new TapAllTargetPlayerControlsEffect(StaticFilters.FILTER_PERMANENT), -9);
+ ability.addEffect(new SkipNextPlayerUntapStepEffect("That player"));
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+ }
+
+ private DovinArchitectOfLaw(final DovinArchitectOfLaw card) {
+ super(card);
+ }
+
+ @Override
+ public DovinArchitectOfLaw copy() {
+ return new DovinArchitectOfLaw(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DovinGrandArbiter.java b/Mage.Sets/src/mage/cards/d/DovinGrandArbiter.java
new file mode 100644
index 00000000000..ea2400d975b
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DovinGrandArbiter.java
@@ -0,0 +1,107 @@
+package mage.cards.d;
+
+import mage.abilities.Ability;
+import mage.abilities.DelayedTriggeredAbility;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.counters.CounterType;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.game.events.DamagedPlayerEvent;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.ThopterColorlessToken;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DovinGrandArbiter extends CardImpl {
+
+ public DovinGrandArbiter(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{W}{U}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.DOVIN);
+ this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3));
+
+ // +1: Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on Dovin, Grand Arbiter.
+ this.addAbility(new LoyaltyAbility(new CreateDelayedTriggeredAbilityEffect(
+ new DovinGrandArbiterDelayedTriggeredAbility(), false
+ ), 1));
+
+ // -1: Create a 1/1 colorless Thopter artifact creature token with flying. You gain 1 life.
+ Ability ability = new LoyaltyAbility(new CreateTokenEffect(new ThopterColorlessToken()), -1);
+ ability.addEffect(new GainLifeEffect(1).setText("You gain 1 life."));
+ this.addAbility(ability);
+
+ // -7: Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order.
+ this.addAbility(new LoyaltyAbility(new LookLibraryAndPickControllerEffect(
+ new StaticValue(10), false,
+ new StaticValue(3), StaticFilters.FILTER_CARD,
+ Zone.LIBRARY, false, false, false,
+ Zone.HAND, false, false, false
+ ).setBackInRandomOrder(true).setText("Look at the top ten cards of your library. " +
+ "Put three of them into your hand and the rest " +
+ "on the bottom of your library in a random order."
+ ), -7));
+ }
+
+ private DovinGrandArbiter(final DovinGrandArbiter card) {
+ super(card);
+ }
+
+ @Override
+ public DovinGrandArbiter copy() {
+ return new DovinGrandArbiter(this);
+ }
+}
+
+class DovinGrandArbiterDelayedTriggeredAbility extends DelayedTriggeredAbility {
+
+ DovinGrandArbiterDelayedTriggeredAbility() {
+ super(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance()), Duration.EndOfTurn, false);
+ }
+
+ private DovinGrandArbiterDelayedTriggeredAbility(final DovinGrandArbiterDelayedTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public DovinGrandArbiterDelayedTriggeredAbility copy() {
+ return new DovinGrandArbiterDelayedTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (((DamagedPlayerEvent) event).isCombatDamage()) {
+ Permanent creature = game.getPermanent(event.getSourceId());
+ if (creature != null && creature.isControlledBy(controllerId)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Until end of turn, whenever a creature you control " +
+ "deals combat damage to a player, " +
+ "put a loyalty counter on {this}.";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DovinsAcuity.java b/Mage.Sets/src/mage/cards/d/DovinsAcuity.java
new file mode 100644
index 00000000000..96efb5f9772
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DovinsAcuity.java
@@ -0,0 +1,72 @@
+package mage.cards.d;
+
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.decorator.ConditionalTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.ReturnToHandSourceEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.TurnPhase;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.game.Game;
+
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DovinsAcuity extends CardImpl {
+
+ private static final FilterSpell filter = new FilterSpell();
+
+ static {
+ filter.add(new CardTypePredicate(CardType.INSTANT));
+ }
+
+ public DovinsAcuity(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{U}");
+
+ // When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(2));
+ ability.addEffect(new DrawCardSourceControllerEffect(1).setText("and draw a card"));
+ this.addAbility(ability);
+
+ // Whenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand.
+ this.addAbility(new ConditionalTriggeredAbility(
+ new SpellCastControllerTriggeredAbility(
+ new ReturnToHandSourceEffect(true), filter, true
+ ), DovinsAcuityCondition.instance,
+ "Whenever you cast an instant spell during your main phase, " +
+ "you may return {this} to its owner's hand."
+ ));
+ }
+
+ private DovinsAcuity(final DovinsAcuity card) {
+ super(card);
+ }
+
+ @Override
+ public DovinsAcuity copy() {
+ return new DovinsAcuity(this);
+ }
+}
+
+enum DovinsAcuityCondition implements Condition {
+
+ instance;
+ private static final Set turnPhases = EnumSet.of(TurnPhase.PRECOMBAT_MAIN, TurnPhase.POSTCOMBAT_MAIN);
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return game.isActivePlayer(source.getControllerId())
+ && turnPhases.contains(game.getTurn().getPhase().getType());
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/d/DovinsAutomaton.java b/Mage.Sets/src/mage/cards/d/DovinsAutomaton.java
new file mode 100644
index 00000000000..e1e17cde995
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DovinsAutomaton.java
@@ -0,0 +1,61 @@
+package mage.cards.d;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPlaneswalkerPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DovinsAutomaton extends CardImpl {
+
+ private static final Condition condition
+ = new PermanentsOnTheBattlefieldCondition(new FilterControlledPlaneswalkerPermanent(SubType.DOVIN));
+
+ public DovinsAutomaton(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}");
+
+ this.subtype.add(SubType.HOMUNCULUS);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // As long as you control a Dovin planeswalker, Dovin's Automaton gets +2/+2 and has vigilance.
+ Ability ability = new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new ConditionalContinuousEffect(
+ new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield),
+ condition, "As long as you control a Dovin planeswalker, {this} gets +2/+2"
+ )
+ );
+ ability.addEffect(new ConditionalContinuousEffect(
+ new GainAbilitySourceEffect(
+ VigilanceAbility.getInstance(), Duration.WhileOnBattlefield
+ ), condition, "and has vigilance"
+ ));
+ this.addAbility(ability);
+ }
+
+ private DovinsAutomaton(final DovinsAutomaton card) {
+ super(card);
+ }
+
+ @Override
+ public DovinsAutomaton copy() {
+ return new DovinsAutomaton(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DovinsDismissal.java b/Mage.Sets/src/mage/cards/d/DovinsDismissal.java
new file mode 100644
index 00000000000..598029d98b5
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DovinsDismissal.java
@@ -0,0 +1,49 @@
+package mage.cards.d;
+
+import mage.abilities.effects.common.PutOnLibraryTargetEffect;
+import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.filter.FilterCard;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.NamePredicate;
+import mage.filter.predicate.permanent.TappedPredicate;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DovinsDismissal extends CardImpl {
+
+ private static final FilterCard filter = new FilterCard("card named Dovin, Architect of Law");
+ private static final FilterPermanent filter2 = new FilterCreaturePermanent("tapped creature");
+
+ static {
+ filter.add(new NamePredicate("Dovin, Architect of Law"));
+ filter2.add(TappedPredicate.instance);
+ }
+
+ public DovinsDismissal(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}{U}");
+
+ // Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it.
+ this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true));
+ this.getSpellAbility().addEffect(
+ new SearchLibraryGraveyardPutInHandEffect(filter, false, true)
+ );
+ this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter2, false));
+ }
+
+ private DovinsDismissal(final DovinsDismissal card) {
+ super(card);
+ }
+
+ @Override
+ public DovinsDismissal copy() {
+ return new DovinsDismissal(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DraconicRoar.java b/Mage.Sets/src/mage/cards/d/DraconicRoar.java
index 2eb1d61e95d..34102c4f395 100644
--- a/Mage.Sets/src/mage/cards/d/DraconicRoar.java
+++ b/Mage.Sets/src/mage/cards/d/DraconicRoar.java
@@ -1,15 +1,14 @@
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
+import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.common.RevealTargetFromHandCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.InfoEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
@@ -22,23 +21,19 @@ import mage.target.common.TargetCardInHand;
import mage.target.common.TargetCreaturePermanent;
import mage.watchers.common.DragonOnTheBattlefieldWhileSpellWasCastWatcher;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class DraconicRoar extends CardImpl {
- private static final FilterCard filter = new FilterCard("a Dragon card from your hand (you don't have to)");
-
- static {
- filter.add(new SubtypePredicate(SubType.DRAGON));
- }
-
public DraconicRoar(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}");
// As an additional cost to cast Draconic Roar, you may reveal a Dragon card from your hand.
this.getSpellAbility().addEffect(new InfoEffect("as an additional cost to cast this spell, you may reveal a Dragon card from your hand"));
+ this.getSpellAbility().setCostAdjuster(DraconicRoarAdjuster.instance);
// Draconic Roar deals 3 damage to target creature. If you revealed a Dragon card or controlled a Dragon as you cast Draconic Roar, Draconic Roar deals 3 damage to that creature's controller.
this.getSpellAbility().addEffect(new DamageTargetEffect(3));
@@ -47,18 +42,6 @@ public final class DraconicRoar extends CardImpl {
this.getSpellAbility().addWatcher(new DragonOnTheBattlefieldWhileSpellWasCastWatcher());
}
- @Override
- public void adjustCosts(Ability ability, Game game) {
- if (ability.getAbilityType() == AbilityType.SPELL) {
- Player controller = game.getPlayer(ability.getControllerId());
- if (controller != null) {
- if (controller.getHand().count(filter, game) > 0) {
- ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0,1, filter)));
- }
- }
- }
- }
-
public DraconicRoar(final DraconicRoar card) {
super(card);
}
@@ -69,6 +52,25 @@ public final class DraconicRoar extends CardImpl {
}
}
+enum DraconicRoarAdjuster implements CostAdjuster {
+ instance;
+
+ private static final FilterCard filter = new FilterCard("a Dragon card from your hand (you don't have to)");
+
+ static {
+ filter.add(new SubtypePredicate(SubType.DRAGON));
+ }
+
+ @Override
+ public void adjustCosts(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller != null) {
+ if (controller.getHand().count(filter, game) > 0) {
+ ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0, 1, filter)));
+ }
+ }
+ }
+}
class DraconicRoarEffect extends OneShotEffect {
@@ -90,7 +92,7 @@ class DraconicRoarEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- DragonOnTheBattlefieldWhileSpellWasCastWatcher watcher = (DragonOnTheBattlefieldWhileSpellWasCastWatcher) game.getState().getWatchers().get(DragonOnTheBattlefieldWhileSpellWasCastWatcher.class.getSimpleName());
+ DragonOnTheBattlefieldWhileSpellWasCastWatcher watcher = game.getState().getWatcher(DragonOnTheBattlefieldWhileSpellWasCastWatcher.class);
if (watcher != null && watcher.castWithConditionTrue(source.getId())) {
Permanent permanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
if (permanent != null) {
diff --git a/Mage.Sets/src/mage/cards/d/Dracoplasm.java b/Mage.Sets/src/mage/cards/d/Dracoplasm.java
index aa478448c10..974da8aa9d5 100644
--- a/Mage.Sets/src/mage/cards/d/Dracoplasm.java
+++ b/Mage.Sets/src/mage/cards/d/Dracoplasm.java
@@ -63,7 +63,7 @@ class DracoplasmEffect extends ReplacementEffectImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public DracoplasmEffect() {
diff --git a/Mage.Sets/src/mage/cards/d/DragonArch.java b/Mage.Sets/src/mage/cards/d/DragonArch.java
index 6b9c444feeb..5a152ea0134 100644
--- a/Mage.Sets/src/mage/cards/d/DragonArch.java
+++ b/Mage.Sets/src/mage/cards/d/DragonArch.java
@@ -24,7 +24,7 @@ public final class DragonArch extends CardImpl {
private static final FilterCreatureCard filter = new FilterCreatureCard("a multicolored creature card");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public DragonArch(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DragonlordsPrerogative.java b/Mage.Sets/src/mage/cards/d/DragonlordsPrerogative.java
index 6ce626db3fa..f90f8c05ee4 100644
--- a/Mage.Sets/src/mage/cards/d/DragonlordsPrerogative.java
+++ b/Mage.Sets/src/mage/cards/d/DragonlordsPrerogative.java
@@ -1,11 +1,11 @@
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.Cost;
+import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.common.RevealTargetFromHandCost;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.ContinuousRuleModifyingEffect;
@@ -25,24 +25,20 @@ import mage.game.stack.Spell;
import mage.players.Player;
import mage.target.common.TargetCardInHand;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class DragonlordsPrerogative extends CardImpl {
- private static final FilterCard filter = new FilterCard("a Dragon card from your hand");
-
- static {
- filter.add(new SubtypePredicate(SubType.DRAGON));
- }
-
public DragonlordsPrerogative(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{U}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{U}{U}");
// As an additional cost to cast Dragonlord's Prerogative, you may reveal a Dragon card from your hand.
this.getSpellAbility().addEffect(new InfoEffect("as an additional cost to cast this spell, you may reveal a Dragon card from your hand"));
-
+ this.getSpellAbility().setCostAdjuster(DragonlordsPrerogativeAdjuster.instance);
+
// If you revealed a Dragon card or controlled a Dragon as you cast Dragonlord's Prerogative, Dragonlord's Prerogative can't be countered.
Condition condition = new DragonlordsPrerogativeCondition();
ContinuousRuleModifyingEffect cantBeCountered = new CantBeCounteredSourceEffect();
@@ -50,22 +46,12 @@ public final class DragonlordsPrerogative extends CardImpl {
conditionalCantBeCountered.setText("
If you revealed a Dragon card or controlled a Dragon as you cast {this}, this spell can't be countered");
Ability ability = new SimpleStaticAbility(Zone.STACK, conditionalCantBeCountered);
this.addAbility(ability);
-
+
// Draw four cards.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(4));
}
-
- @Override
- public void adjustCosts(Ability ability, Game game) {
- Player controller = game.getPlayer(ability.getControllerId());
- if (controller != null) {
- if (controller.getHand().count(filter, game) > 0) {
- ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0,1, filter)));
- }
- }
- }
-
+
public DragonlordsPrerogative(final DragonlordsPrerogative card) {
super(card);
}
@@ -76,6 +62,25 @@ public final class DragonlordsPrerogative extends CardImpl {
}
}
+enum DragonlordsPrerogativeAdjuster implements CostAdjuster {
+ instance;
+ private static final FilterCard filter = new FilterCard("a Dragon card from your hand");
+
+ static {
+ filter.add(new SubtypePredicate(SubType.DRAGON));
+ }
+
+ @Override
+ public void adjustCosts(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller != null) {
+ if (controller.getHand().count(filter, game) > 0) {
+ ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0, 1, filter)));
+ }
+ }
+ }
+}
+
class DragonlordsPrerogativeCondition implements Condition {
private final static FilterControlledPermanent filter = new FilterControlledPermanent("Dragon");
@@ -89,7 +94,7 @@ class DragonlordsPrerogativeCondition implements Condition {
boolean applies = false;
Spell spell = game.getStack().getSpell(source.getSourceId());
if (spell != null && spell.getSpellAbility() != null) {
- for(Cost cost: spell.getSpellAbility().getCosts()) {
+ for (Cost cost : spell.getSpellAbility().getCosts()) {
if (cost instanceof RevealTargetFromHandCost) {
applies = !cost.getTargets().isEmpty();
break;
diff --git a/Mage.Sets/src/mage/cards/d/Dragonrage.java b/Mage.Sets/src/mage/cards/d/Dragonrage.java
index 410fe9bdc59..d378be9433a 100644
--- a/Mage.Sets/src/mage/cards/d/Dragonrage.java
+++ b/Mage.Sets/src/mage/cards/d/Dragonrage.java
@@ -28,7 +28,7 @@ public final class Dragonrage extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("attacking creature you control");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
diff --git a/Mage.Sets/src/mage/cards/d/DragonscaleGeneral.java b/Mage.Sets/src/mage/cards/d/DragonscaleGeneral.java
index e9ba1f5213d..ed089609426 100644
--- a/Mage.Sets/src/mage/cards/d/DragonscaleGeneral.java
+++ b/Mage.Sets/src/mage/cards/d/DragonscaleGeneral.java
@@ -24,7 +24,7 @@ public final class DragonscaleGeneral extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creatures you control");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/d/DranaKalastriaBloodchief.java b/Mage.Sets/src/mage/cards/d/DranaKalastriaBloodchief.java
index 025eb357746..404fafb5f75 100644
--- a/Mage.Sets/src/mage/cards/d/DranaKalastriaBloodchief.java
+++ b/Mage.Sets/src/mage/cards/d/DranaKalastriaBloodchief.java
@@ -37,8 +37,8 @@ public final class DranaKalastriaBloodchief extends CardImpl {
this.toughness = new MageInt(4);
this.addAbility(FlyingAbility.getInstance());
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(new StaticValue(0), new SignInversionDynamicValue(new ManacostVariableValue()), Duration.EndOfTurn), new ManaCostsImpl("{X}{B}{B}"));
- ability.addEffect(new BoostSourceEffect(new ManacostVariableValue(), new StaticValue(0), Duration.EndOfTurn));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(new StaticValue(0), new SignInversionDynamicValue(ManacostVariableValue.instance), Duration.EndOfTurn), new ManaCostsImpl("{X}{B}{B}"));
+ ability.addEffect(new BoostSourceEffect(ManacostVariableValue.instance, new StaticValue(0), Duration.EndOfTurn));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/d/DranasChosen.java b/Mage.Sets/src/mage/cards/d/DranasChosen.java
index 3afa5ccd687..d0dd78f5487 100644
--- a/Mage.Sets/src/mage/cards/d/DranasChosen.java
+++ b/Mage.Sets/src/mage/cards/d/DranasChosen.java
@@ -31,7 +31,7 @@ public final class DranasChosen extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ALLY));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public DranasChosen(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DrasticRevelation.java b/Mage.Sets/src/mage/cards/d/DrasticRevelation.java
index e6d3c98266a..faec9cf5da6 100644
--- a/Mage.Sets/src/mage/cards/d/DrasticRevelation.java
+++ b/Mage.Sets/src/mage/cards/d/DrasticRevelation.java
@@ -1,7 +1,5 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
@@ -13,18 +11,15 @@ import mage.constants.Outcome;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class DrasticRevelation extends CardImpl {
public DrasticRevelation(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}{B}{R}");
-
-
-
-
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{B}{R}");
// Discard your hand. Draw seven cards, then discard three cards at random.
this.getSpellAbility().addEffect(new DrasticRevelationEffect());
@@ -54,8 +49,8 @@ class DrasticRevelationEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player you = game.getPlayer(source.getControllerId());
- if(you != null) {
- you.discardToMax(game);
+ if (you != null) {
+ you.discard(you.getHand().size(), false, source, game);
you.drawCards(7, game);
Cards hand = you.getHand();
for (int i = 0; i < 3; i++) {
diff --git a/Mage.Sets/src/mage/cards/d/DreadCacodemon.java b/Mage.Sets/src/mage/cards/d/DreadCacodemon.java
index 9b8e1ad205d..2df82acf881 100644
--- a/Mage.Sets/src/mage/cards/d/DreadCacodemon.java
+++ b/Mage.Sets/src/mage/cards/d/DreadCacodemon.java
@@ -32,7 +32,7 @@ public final class DreadCacodemon extends CardImpl {
private static final FilterCreaturePermanent otherCreaturesYouControl = new FilterCreaturePermanent("other creatures you control");
static {
otherCreaturesYouControl.add(new ControllerPredicate(TargetController.YOU));
- otherCreaturesYouControl.add(new AnotherPredicate());
+ otherCreaturesYouControl.add(AnotherPredicate.instance);
}
public DreadCacodemon(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DreadSlag.java b/Mage.Sets/src/mage/cards/d/DreadSlag.java
index dd7548175b1..bebbcd720d7 100644
--- a/Mage.Sets/src/mage/cards/d/DreadSlag.java
+++ b/Mage.Sets/src/mage/cards/d/DreadSlag.java
@@ -32,7 +32,7 @@ public final class DreadSlag extends CardImpl {
// Trample
this.addAbility(TrampleAbility.getInstance());
// Dread Slag gets -4/-4 for each card in your hand.
- DynamicValue amount = new MultipliedValue(new CardsInControllerHandCount(), -4);
+ DynamicValue amount = new MultipliedValue(CardsInControllerHandCount.instance, -4);
Effect effect = new BoostSourceEffect(amount, amount, Duration.WhileOnBattlefield);
effect.setText("{this} gets -4/-4 for each card in your hand");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
diff --git a/Mage.Sets/src/mage/cards/d/DreadWight.java b/Mage.Sets/src/mage/cards/d/DreadWight.java
index 0bdf71c0ee8..e3225c405f5 100644
--- a/Mage.Sets/src/mage/cards/d/DreadWight.java
+++ b/Mage.Sets/src/mage/cards/d/DreadWight.java
@@ -98,10 +98,6 @@ class DreadWightTriggeredAbility extends TriggeredAbilityImpl {
return false;
}
- @Override
- public String getRule() {
- return super.getRule();
- }
}
class DreadWightEffect extends OneShotEffect {
diff --git a/Mage.Sets/src/mage/cards/d/DreadshipReef.java b/Mage.Sets/src/mage/cards/d/DreadshipReef.java
index 7073e04f11d..53a75729b99 100644
--- a/Mage.Sets/src/mage/cards/d/DreadshipReef.java
+++ b/Mage.Sets/src/mage/cards/d/DreadshipReef.java
@@ -36,7 +36,7 @@ public final class DreadshipReef extends CardImpl {
this.addAbility(ability);
// {1}, Remove X storage counters from Dreadship Reef: Add X mana in any combination of {U} and/or {B}.
ability = new SimpleManaAbility(Zone.BATTLEFIELD,
- new AddManaInAnyCombinationEffect(new RemovedCountersForCostValue(), ColoredManaSymbol.U, ColoredManaSymbol.B),
+ new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, ColoredManaSymbol.U, ColoredManaSymbol.B),
new GenericManaCost(1));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance()));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/d/DreamChisel.java b/Mage.Sets/src/mage/cards/d/DreamChisel.java
index 705fe64cc21..8508e9b24bf 100644
--- a/Mage.Sets/src/mage/cards/d/DreamChisel.java
+++ b/Mage.Sets/src/mage/cards/d/DreamChisel.java
@@ -20,7 +20,7 @@ public final class DreamChisel extends CardImpl {
private static final FilterCreatureCard filter = new FilterCreatureCard("Face-down creature spells");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
}
public DreamChisel(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DreamSalvage.java b/Mage.Sets/src/mage/cards/d/DreamSalvage.java
index fcd535a32d7..6d8ad465fcc 100644
--- a/Mage.Sets/src/mage/cards/d/DreamSalvage.java
+++ b/Mage.Sets/src/mage/cards/d/DreamSalvage.java
@@ -49,7 +49,7 @@ class CardsDiscardedThisTurnWatcher extends Watcher {
private final Map amountOfCardsDiscardedThisTurn = new HashMap<>();
public CardsDiscardedThisTurnWatcher() {
- super(CardsDiscardedThisTurnWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(CardsDiscardedThisTurnWatcher.class, WatcherScope.GAME);
}
public CardsDiscardedThisTurnWatcher(final CardsDiscardedThisTurnWatcher watcher) {
@@ -102,7 +102,7 @@ class DreamSalvageEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- CardsDiscardedThisTurnWatcher watcher = (CardsDiscardedThisTurnWatcher) game.getState().getWatchers().get(CardsDiscardedThisTurnWatcher.class.getSimpleName());
+ CardsDiscardedThisTurnWatcher watcher = game.getState().getWatcher(CardsDiscardedThisTurnWatcher.class);
Player targetOpponent = game.getPlayer(source.getFirstTarget());
Player controller = game.getPlayer(source.getControllerId());
if (targetOpponent != null
diff --git a/Mage.Sets/src/mage/cards/d/DreamThief.java b/Mage.Sets/src/mage/cards/d/DreamThief.java
index 1be3f20e765..4777110118e 100644
--- a/Mage.Sets/src/mage/cards/d/DreamThief.java
+++ b/Mage.Sets/src/mage/cards/d/DreamThief.java
@@ -57,7 +57,7 @@ class CastBlueSpellThisTurnCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName());
+ SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class);
if (watcher != null) {
List spells = watcher.getSpellsCastThisTurn(source.getControllerId());
if (spells != null) {
diff --git a/Mage.Sets/src/mage/cards/d/DreamTides.java b/Mage.Sets/src/mage/cards/d/DreamTides.java
index 965adba3808..6f15d52bf11 100644
--- a/Mage.Sets/src/mage/cards/d/DreamTides.java
+++ b/Mage.Sets/src/mage/cards/d/DreamTides.java
@@ -59,7 +59,7 @@ class DreamTidesEffect extends OneShotEffect {
static {
filter.add(Predicates.not(new ColorPredicate(ObjectColor.GREEN)));
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
DreamTidesEffect() {
diff --git a/Mage.Sets/src/mage/cards/d/DreambornMuse.java b/Mage.Sets/src/mage/cards/d/DreambornMuse.java
index 66cc27162bd..169107a55c2 100644
--- a/Mage.Sets/src/mage/cards/d/DreambornMuse.java
+++ b/Mage.Sets/src/mage/cards/d/DreambornMuse.java
@@ -25,7 +25,7 @@ public final class DreambornMuse extends CardImpl {
this.toughness = new MageInt(2);
// At the beginning of each player's upkeep, that player puts the top X cards of their library into their graveyard, where X is the number of cards in their hand.
- PutLibraryIntoGraveTargetEffect effect = new PutLibraryIntoGraveTargetEffect(new CardsInTargetPlayerHandCount());
+ PutLibraryIntoGraveTargetEffect effect = new PutLibraryIntoGraveTargetEffect(CardsInTargetPlayerHandCount.instance);
effect.setText("that player puts the top X cards of their library into their graveyard, where X is the number of cards in their hand.");
this.addAbility(new BeginningOfUpkeepTriggeredAbility(effect, TargetController.ANY, false));
diff --git a/Mage.Sets/src/mage/cards/d/DreamcallerSiren.java b/Mage.Sets/src/mage/cards/d/DreamcallerSiren.java
index 01d62c7422f..c0550a27942 100644
--- a/Mage.Sets/src/mage/cards/d/DreamcallerSiren.java
+++ b/Mage.Sets/src/mage/cards/d/DreamcallerSiren.java
@@ -32,7 +32,7 @@ public final class DreamcallerSiren extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.PIRATE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java b/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java
index a819a8abf70..06412ef6bf5 100644
--- a/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java
+++ b/Mage.Sets/src/mage/cards/d/DregsOfSorrow.java
@@ -1,10 +1,7 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
@@ -16,39 +13,25 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class DregsOfSorrow extends CardImpl {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonblack creatures");
-
- static {
- filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK)));
- }
-
public DregsOfSorrow(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{4}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{4}{B}");
// Destroy X target nonblack creatures. Draw X cards.
this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy X target nonblack creatures"));
- this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(new ManacostVariableValue()));
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.instance));
+ this.getSpellAbility().setTargetAdjuster(DregsOfSorrowAdjuster.instance);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetCreaturePermanent(xValue, xValue, filter, false));
- }
- }
-
-
public DregsOfSorrow(final DregsOfSorrow card) {
super(card);
}
@@ -58,3 +41,19 @@ public final class DregsOfSorrow extends CardImpl {
return new DregsOfSorrow(this);
}
}
+
+enum DregsOfSorrowAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonblack creatures");
+
+ static {
+ filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK)));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.addTarget(new TargetCreaturePermanent(xValue, xValue, filter, false));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/d/DrillBit.java b/Mage.Sets/src/mage/cards/d/DrillBit.java
new file mode 100644
index 00000000000..d229ba4d020
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/d/DrillBit.java
@@ -0,0 +1,41 @@
+package mage.cards.d;
+
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
+import mage.abilities.keyword.SpectacleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.TargetController;
+import mage.filter.StaticFilters;
+import mage.target.TargetPlayer;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class DrillBit extends CardImpl {
+
+ public DrillBit(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}");
+
+ // Target player reveals their hand. You choose a nonland card from it. That player discards that card.
+ this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(
+ StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY
+ ));
+ this.getSpellAbility().addTarget(new TargetPlayer());
+
+ // Spectacle {B}
+ this.addAbility(new SpectacleAbility(this, new ManaCostsImpl("{B}")));
+ }
+
+ private DrillBit(final DrillBit card) {
+ super(card);
+ }
+
+ @Override
+ public DrillBit copy() {
+ return new DrillBit(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DrillSkimmer.java b/Mage.Sets/src/mage/cards/d/DrillSkimmer.java
index 0b60594721b..d379e662a37 100644
--- a/Mage.Sets/src/mage/cards/d/DrillSkimmer.java
+++ b/Mage.Sets/src/mage/cards/d/DrillSkimmer.java
@@ -30,7 +30,7 @@ public final class DrillSkimmer extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("you control another artifact creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new CardTypePredicate(CardType.ARTIFACT));
}
diff --git a/Mage.Sets/src/mage/cards/d/DrippingTongueZubera.java b/Mage.Sets/src/mage/cards/d/DrippingTongueZubera.java
index a5d6b4d3f33..ed36a32932b 100644
--- a/Mage.Sets/src/mage/cards/d/DrippingTongueZubera.java
+++ b/Mage.Sets/src/mage/cards/d/DrippingTongueZubera.java
@@ -27,7 +27,7 @@ public final class DrippingTongueZubera extends CardImpl {
this.power = new MageInt(1);
this.toughness = new MageInt(2);
- this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new SpiritToken(), new ZuberasDiedDynamicValue()), false), new ZuberasDiedWatcher());
+ this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new SpiritToken(), ZuberasDiedDynamicValue.instance), false), new ZuberasDiedWatcher());
}
public DrippingTongueZubera (final DrippingTongueZubera card) {
diff --git a/Mage.Sets/src/mage/cards/d/DrivenDespair.java b/Mage.Sets/src/mage/cards/d/DrivenDespair.java
index 7f9b0af2532..09d29f92ce9 100644
--- a/Mage.Sets/src/mage/cards/d/DrivenDespair.java
+++ b/Mage.Sets/src/mage/cards/d/DrivenDespair.java
@@ -36,7 +36,7 @@ public final class DrivenDespair extends SplitCard {
// Despair {1}{B}
// Sorcery
// Aftermath
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Until end of turn, creatures you control gain menace and "Whenever this creature deals combat damage to a player, that player discards a card."
getRightHalfCard().getSpellAbility().addEffect(new GainAbilityControlledEffect(new MenaceAbility(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES));
ability = new DealsCombatDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1), false, true);
diff --git a/Mage.Sets/src/mage/cards/d/DrogskolCavalry.java b/Mage.Sets/src/mage/cards/d/DrogskolCavalry.java
index 3a2c558bfaf..d0613ac5203 100644
--- a/Mage.Sets/src/mage/cards/d/DrogskolCavalry.java
+++ b/Mage.Sets/src/mage/cards/d/DrogskolCavalry.java
@@ -28,7 +28,7 @@ public final class DrogskolCavalry extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("another Spirit");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.SPIRIT));
}
diff --git a/Mage.Sets/src/mage/cards/d/DrownerOfSecrets.java b/Mage.Sets/src/mage/cards/d/DrownerOfSecrets.java
index 149ce963f0a..65596971ff4 100644
--- a/Mage.Sets/src/mage/cards/d/DrownerOfSecrets.java
+++ b/Mage.Sets/src/mage/cards/d/DrownerOfSecrets.java
@@ -29,7 +29,7 @@ public final class DrownerOfSecrets extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.MERFOLK));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public DrownerOfSecrets(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DrudgeSpell.java b/Mage.Sets/src/mage/cards/d/DrudgeSpell.java
index 91a2755db40..efd94be9900 100644
--- a/Mage.Sets/src/mage/cards/d/DrudgeSpell.java
+++ b/Mage.Sets/src/mage/cards/d/DrudgeSpell.java
@@ -32,7 +32,7 @@ public final class DrudgeSpell extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.SKELETON));
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
}
public DrudgeSpell(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DualNature.java b/Mage.Sets/src/mage/cards/d/DualNature.java
index fa4e3322710..21051057904 100644
--- a/Mage.Sets/src/mage/cards/d/DualNature.java
+++ b/Mage.Sets/src/mage/cards/d/DualNature.java
@@ -37,7 +37,7 @@ public final class DualNature extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public DualNature(UUID ownerId, CardSetInfo setInfo) {
@@ -130,7 +130,7 @@ class DualNatureCreatureLeavesEffect extends OneShotEffect {
Permanent creature = game.getPermanentOrLKIBattlefield(this.getTargetPointer().getFirst(game, source));
if (creature != null) {
FilterPermanent filter = new FilterPermanent();
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
filter.add(new NamePredicate(creature.getName()));
new ExileAllEffect(filter).apply(game, source);
return true;
diff --git a/Mage.Sets/src/mage/cards/d/DuelingGrounds.java b/Mage.Sets/src/mage/cards/d/DuelingGrounds.java
index 92c0cbe0413..25418a7d7ca 100644
--- a/Mage.Sets/src/mage/cards/d/DuelingGrounds.java
+++ b/Mage.Sets/src/mage/cards/d/DuelingGrounds.java
@@ -74,7 +74,10 @@ class NoMoreThanOneCreatureCanAttackEachTurnEffect extends RestrictionEffect {
if (!game.getCombat().getAttackers().isEmpty()) {
return false;
}
- AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
+ if(watcher == null){
+ return false;
+ }
Set attackedThisTurnCreatures = watcher.getAttackedThisTurnCreatures();
return attackedThisTurnCreatures.isEmpty()
|| (attackedThisTurnCreatures.size() == 1 && attackedThisTurnCreatures.contains(new MageObjectReference(attacker, game)));
@@ -108,7 +111,10 @@ class NoMoreThanOneCreatureCanBlockEachTurnEffect extends RestrictionEffect {
if (!game.getCombat().getBlockers().isEmpty()) {
return false;
}
- BlockedThisTurnWatcher watcher = (BlockedThisTurnWatcher) game.getState().getWatchers().get(BlockedThisTurnWatcher.class.getSimpleName());
+ BlockedThisTurnWatcher watcher = game.getState().getWatcher(BlockedThisTurnWatcher.class);
+ if(watcher == null){
+ return false;
+ }
Set blockedThisTurnCreatures = watcher.getBlockedThisTurnCreatures();
MageObjectReference blockerReference = new MageObjectReference(blocker.getId(), blocker.getZoneChangeCounter(game), game);
return blockedThisTurnCreatures.isEmpty()
diff --git a/Mage.Sets/src/mage/cards/d/DuneDiviner.java b/Mage.Sets/src/mage/cards/d/DuneDiviner.java
index 72e74cd8e1d..55a9939923c 100644
--- a/Mage.Sets/src/mage/cards/d/DuneDiviner.java
+++ b/Mage.Sets/src/mage/cards/d/DuneDiviner.java
@@ -29,7 +29,7 @@ public final class DuneDiviner extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.DESERT));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public DuneDiviner(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java b/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java
index 26117bd3dfc..51aa92f4616 100644
--- a/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java
+++ b/Mage.Sets/src/mage/cards/d/DunesOfTheDead.java
@@ -1,7 +1,5 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.mana.ColorlessManaAbility;
@@ -11,21 +9,23 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.permanent.token.ZombieToken;
+import java.util.UUID;
+
/**
- *
* @author ciaccona007
*/
public final class DunesOfTheDead extends CardImpl {
public DunesOfTheDead(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
+
this.subtype.add(SubType.DESERT);
// {T}: Add {C}.
addAbility(new ColorlessManaAbility());
+
// When Dunes of the Dead is put into a graveyard from the battlefield, create a 2/2 black Zombie creature token.
- this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 1), false));
+ this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CreateTokenEffect(new ZombieToken(), 1)));
}
public DunesOfTheDead(final DunesOfTheDead card) {
diff --git a/Mage.Sets/src/mage/cards/d/Duplicant.java b/Mage.Sets/src/mage/cards/d/Duplicant.java
index 4abfea60c3f..0915c8c8da3 100644
--- a/Mage.Sets/src/mage/cards/d/Duplicant.java
+++ b/Mage.Sets/src/mage/cards/d/Duplicant.java
@@ -1,8 +1,5 @@
-
package mage.cards.d;
-import java.util.List;
-import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
@@ -22,8 +19,10 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author Plopman
*/
public final class Duplicant extends CardImpl {
@@ -31,7 +30,7 @@ public final class Duplicant extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public Duplicant(UUID ownerId, CardSetInfo setInfo) {
@@ -117,6 +116,9 @@ class DuplicantContinuousEffect extends ContinuousEffectImpl {
if (permanent != null) {
if (!permanent.getImprinted().isEmpty()) {
List imprinted = permanent.getImprinted();
+ if (imprinted == null || imprinted.isEmpty()) {
+ return false;
+ }
Card card = game.getCard(imprinted.get(imprinted.size() - 1));
if (card != null && card.isCreature()) {
switch (layer) {
@@ -134,7 +136,6 @@ class DuplicantContinuousEffect extends ContinuousEffectImpl {
}
}
return true;
-
}
}
diff --git a/Mage.Sets/src/mage/cards/d/DuskDawn.java b/Mage.Sets/src/mage/cards/d/DuskDawn.java
index 0a5469bcd40..567d818d68d 100644
--- a/Mage.Sets/src/mage/cards/d/DuskDawn.java
+++ b/Mage.Sets/src/mage/cards/d/DuskDawn.java
@@ -43,7 +43,7 @@ public final class DuskDawn extends SplitCard {
// Dawn
// Return all creature cards with power less than or equal to 2 from your graveyard to your hand.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new DawnEffect());
}
diff --git a/Mage.Sets/src/mage/cards/d/DuskLegionZealot.java b/Mage.Sets/src/mage/cards/d/DuskLegionZealot.java
index ff374e32e4c..a80dddca0d5 100644
--- a/Mage.Sets/src/mage/cards/d/DuskLegionZealot.java
+++ b/Mage.Sets/src/mage/cards/d/DuskLegionZealot.java
@@ -1,24 +1,24 @@
-
package mage.cards.d;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
-import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
- *
* @author JayDi85
*/
-public final class DuskLegionZealot extends CardImpl {
+public final class DuskLegionZealot extends CardImpl {
- public DuskLegionZealot (UUID ownerId, CardSetInfo setInfo) {
+ public DuskLegionZealot(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
this.subtype.add(SubType.VAMPIRE);
@@ -27,21 +27,19 @@ public final class DuskLegionZealot extends CardImpl {
this.toughness = new MageInt(1);
// When Dusk Legion Zealot enters the battlefield, you draw a card and you lose 1 life.
- Effect drawEffect = new DrawCardSourceControllerEffect(1);
- drawEffect.setText("you draw a card");
+ Effect drawEffect = new DrawCardSourceControllerEffect(1, "you");
Ability ability = new EntersBattlefieldTriggeredAbility(drawEffect);
Effect lifeEffect = new LoseLifeSourceControllerEffect(1);
- lifeEffect.setText("and you lose 1 life");
- ability.addEffect(lifeEffect);
+ ability.addEffect(lifeEffect.concatBy("and"));
this.addAbility(ability);
}
- public DuskLegionZealot (final DuskLegionZealot card) {
+ public DuskLegionZealot(final DuskLegionZealot card) {
super(card);
}
@Override
- public DuskLegionZealot copy() {
- return new DuskLegionZealot (this);
+ public DuskLegionZealot copy() {
+ return new DuskLegionZealot(this);
}
}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/d/DuskborneSkymarcher.java b/Mage.Sets/src/mage/cards/d/DuskborneSkymarcher.java
index 17462b8f9dc..77a3726456f 100644
--- a/Mage.Sets/src/mage/cards/d/DuskborneSkymarcher.java
+++ b/Mage.Sets/src/mage/cards/d/DuskborneSkymarcher.java
@@ -28,7 +28,7 @@ public final class DuskborneSkymarcher extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.VAMPIRE, "attacking Vampire");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public DuskborneSkymarcher(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DustStalker.java b/Mage.Sets/src/mage/cards/d/DustStalker.java
index c1d604b5888..4a156722407 100644
--- a/Mage.Sets/src/mage/cards/d/DustStalker.java
+++ b/Mage.Sets/src/mage/cards/d/DustStalker.java
@@ -28,8 +28,8 @@ public final class DustStalker extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("if you control no other colorless creatures");
static {
- filter.add(new AnotherPredicate());
- filter.add(new ColorlessPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(ColorlessPredicate.instance);
}
public DustStalker(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DwarvenBloodboiler.java b/Mage.Sets/src/mage/cards/d/DwarvenBloodboiler.java
index 8d143825c2c..1638cf682b4 100644
--- a/Mage.Sets/src/mage/cards/d/DwarvenBloodboiler.java
+++ b/Mage.Sets/src/mage/cards/d/DwarvenBloodboiler.java
@@ -29,7 +29,7 @@ public final class DwarvenBloodboiler extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("an untapped Dwarf you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.DWARF));
}
diff --git a/Mage.Sets/src/mage/cards/d/DwarvenHold.java b/Mage.Sets/src/mage/cards/d/DwarvenHold.java
index bfc1a8c95c1..5c8e97d9e2f 100644
--- a/Mage.Sets/src/mage/cards/d/DwarvenHold.java
+++ b/Mage.Sets/src/mage/cards/d/DwarvenHold.java
@@ -44,7 +44,7 @@ public final class DwarvenHold extends CardImpl {
// {tap}, Remove any number of storage counters from Dwarven Hold: Add {R} for each storage counter removed this way.
Ability ability = new DynamicManaAbility(
Mana.RedMana(1),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new TapSourceCost(),
"Add {R} for each storage counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE));
diff --git a/Mage.Sets/src/mage/cards/d/DwarvenLandslide.java b/Mage.Sets/src/mage/cards/d/DwarvenLandslide.java
index 1b7f92f62a9..056980f8959 100644
--- a/Mage.Sets/src/mage/cards/d/DwarvenLandslide.java
+++ b/Mage.Sets/src/mage/cards/d/DwarvenLandslide.java
@@ -1,9 +1,7 @@
-
package mage.cards.d;
import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.costs.Cost;
import mage.abilities.costs.Costs;
@@ -19,6 +17,7 @@ import mage.filter.common.FilterControlledLandPermanent;
import mage.game.Game;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetLandPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
@@ -27,34 +26,38 @@ import mage.target.common.TargetLandPermanent;
public final class DwarvenLandslide extends CardImpl {
public DwarvenLandslide(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}");
// Kicker-{2}{R}, Sacrifice a land.
Costs kickerCosts = new CostsImpl<>();
kickerCosts.add(new ManaCostsImpl<>("{2}{R}"));
kickerCosts.add(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land"))));
this.addAbility(new KickerAbility(kickerCosts));
+
// Destroy target land. If Dwarven Landslide was kicked, destroy another target land.
getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target land. if this spell was kicked, destroy another target land"));
getSpellAbility().addTarget(new TargetLandPermanent());
+ getSpellAbility().setTargetAdjuster(DwarvenLandslideAdjuster.instance);
}
public DwarvenLandslide(final DwarvenLandslide card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- if (KickedCondition.instance.apply(game, ability)) {
- ability.getTargets().clear();
- getSpellAbility().addTarget(new TargetLandPermanent(2));
- }
- }
- }
-
@Override
public DwarvenLandslide copy() {
return new DwarvenLandslide(this);
}
}
+
+enum DwarvenLandslideAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetLandPermanent(2));
+ }
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/d/DwynenGiltLeafDaen.java b/Mage.Sets/src/mage/cards/d/DwynenGiltLeafDaen.java
index 73a10a2f16e..fb4ee16fc5b 100644
--- a/Mage.Sets/src/mage/cards/d/DwynenGiltLeafDaen.java
+++ b/Mage.Sets/src/mage/cards/d/DwynenGiltLeafDaen.java
@@ -24,7 +24,7 @@ public final class DwynenGiltLeafDaen extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(SubType.ELF, "attacking Elf you control");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public DwynenGiltLeafDaen(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/d/DwynensElite.java b/Mage.Sets/src/mage/cards/d/DwynensElite.java
index 394a7071b5c..4e9e11890b2 100644
--- a/Mage.Sets/src/mage/cards/d/DwynensElite.java
+++ b/Mage.Sets/src/mage/cards/d/DwynensElite.java
@@ -27,7 +27,7 @@ public final class DwynensElite extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Elf");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.ELF));
}
diff --git a/Mage.Sets/src/mage/cards/e/EarlOfSquirrel.java b/Mage.Sets/src/mage/cards/e/EarlOfSquirrel.java
index 20259b9d8b6..37c2081f546 100644
--- a/Mage.Sets/src/mage/cards/e/EarlOfSquirrel.java
+++ b/Mage.Sets/src/mage/cards/e/EarlOfSquirrel.java
@@ -33,7 +33,7 @@ public final class EarlOfSquirrel extends CardImpl {
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
filter2.add(new SubtypePredicate(SubType.SQUIRREL));
}
diff --git a/Mage.Sets/src/mage/cards/e/Earthcraft.java b/Mage.Sets/src/mage/cards/e/Earthcraft.java
index c89ff398bc7..9db0d2926b1 100644
--- a/Mage.Sets/src/mage/cards/e/Earthcraft.java
+++ b/Mage.Sets/src/mage/cards/e/Earthcraft.java
@@ -29,7 +29,7 @@ public final class Earthcraft extends CardImpl {
private static final FilterControlledPermanent filterLand = new FilterControlledPermanent("basic land");
static {
- filterCreature.add(Predicates.not(new TappedPredicate()));
+ filterCreature.add(Predicates.not(TappedPredicate.instance));
filterLand.add(new CardTypePredicate(CardType.LAND));
filterLand.add(new SupertypePredicate(SuperType.BASIC));
}
diff --git a/Mage.Sets/src/mage/cards/e/Earthlore.java b/Mage.Sets/src/mage/cards/e/Earthlore.java
index 78808360e16..2a511fba605 100644
--- a/Mage.Sets/src/mage/cards/e/Earthlore.java
+++ b/Mage.Sets/src/mage/cards/e/Earthlore.java
@@ -43,7 +43,7 @@ public final class Earthlore extends CardImpl {
private static final FilterPermanent filterUntapped = new FilterPermanent("enchanted land is untapped");
static {
- filterUntapped.add(Predicates.not(new TappedPredicate()));
+ filterUntapped.add(Predicates.not(TappedPredicate.instance));
}
public Earthlore(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/Earthquake.java b/Mage.Sets/src/mage/cards/e/Earthquake.java
index d653f3182d3..da844b150df 100644
--- a/Mage.Sets/src/mage/cards/e/Earthquake.java
+++ b/Mage.Sets/src/mage/cards/e/Earthquake.java
@@ -29,7 +29,7 @@ public final class Earthquake extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{R}");
// Hurricane deals X damage to each creature with flying and each player.
- this.getSpellAbility().addEffect(new DamageEverythingEffect(new ManacostVariableValue(), filter));
+ this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.instance, filter));
}
public Earthquake(final Earthquake card) {
diff --git a/Mage.Sets/src/mage/cards/e/EarthshakerKhenra.java b/Mage.Sets/src/mage/cards/e/EarthshakerKhenra.java
index 0d399a8ab4e..d00de4b0c05 100644
--- a/Mage.Sets/src/mage/cards/e/EarthshakerKhenra.java
+++ b/Mage.Sets/src/mage/cards/e/EarthshakerKhenra.java
@@ -1,38 +1,38 @@
package mage.cards.e;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.ContinuousEffect;
-import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.combat.CantBlockTargetEffect;
import mage.abilities.keyword.EternalizeAbility;
import mage.abilities.keyword.HasteAbility;
+import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.ComparisonType;
import mage.constants.Duration;
-import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.mageobject.PowerPredicate;
+import mage.filter.predicate.ObjectSourcePlayer;
+import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
-import mage.target.targetpointer.FixedTarget;
+
+import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public final class EarthshakerKhenra extends CardImpl {
- private final UUID originalId;
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power less than or equal to {this}'s power");
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power less than or equal to this creature's power");
+
+ static {
+ filter.add(EarthshakerKhenraPredicate.instance);
+ }
public EarthshakerKhenra(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
@@ -46,32 +46,20 @@ public final class EarthshakerKhenra extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// When Earthshaker Khenra enters the battlefield, target creature with power less than or equal to Earthshaker Khenra's power can't block this turn.
- Ability ability = new EntersBattlefieldTriggeredAbility(new EarthshakerKhenraEffect());
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new CantBlockTargetEffect(Duration.EndOfTurn)
+ .setText("target creature with power less than or equal " +
+ "to {this}'s power can't block this turn")
+ );
ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability);
- originalId = ability.getOriginalId();
// Eternalize {4}{R}{R}
this.addAbility(new EternalizeAbility(new ManaCostsImpl("{4}{R}{R}"), this));
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- Permanent sourcePermanent = game.getPermanent(ability.getSourceId());
- if (sourcePermanent != null) {
- FilterCreaturePermanent targetFilter = new FilterCreaturePermanent("creature with power less than or equal to " + getLogName() + "'s power");
- targetFilter.add(new PowerPredicate(ComparisonType.FEWER_THAN, sourcePermanent.getPower().getValue() + 1));
- ability.getTargets().clear();
- ability.getTargets().add(new TargetCreaturePermanent(targetFilter));
- }
- }
}
public EarthshakerKhenra(final EarthshakerKhenra card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -80,39 +68,12 @@ public final class EarthshakerKhenra extends CardImpl {
}
}
-class EarthshakerKhenraEffect extends OneShotEffect {
-
- public EarthshakerKhenraEffect() {
- super(Outcome.UnboostCreature);
- this.staticText = "target creature with power less than or equal to {this}'s power can't block this turn";
- }
-
- public EarthshakerKhenraEffect(final EarthshakerKhenraEffect effect) {
- super(effect);
- }
+enum EarthshakerKhenraPredicate implements ObjectSourcePlayerPredicate> {
+ instance;
@Override
- public EarthshakerKhenraEffect copy() {
- return new EarthshakerKhenraEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId());
- if (sourceObject != null) {
- Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
- /*
- 27.06.2017 The target creature's power is checked when you target it with Earthshaker Khenra's ability
- and when that ability resolves. Once the ability resolves, if the creature's power increases
- or Earthshaker Khenra's power decreases, the target creature will still be unable to block.
- */
- if (targetCreature != null && targetCreature.getPower().getValue() <= sourceObject.getPower().getValue()) {
- ContinuousEffect effect = new CantBlockTargetEffect(Duration.EndOfTurn);
- effect.setTargetPointer(new FixedTarget(targetCreature, game));
- game.addEffect(effect, source);
- }
- return true;
- }
- return false;
+ public boolean apply(ObjectSourcePlayer input, Game game) {
+ Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(input.getSourceId());
+ return sourcePermanent != null && input.getObject().getPower().getValue() <= sourcePermanent.getPower().getValue();
}
}
diff --git a/Mage.Sets/src/mage/cards/e/EaterOfHope.java b/Mage.Sets/src/mage/cards/e/EaterOfHope.java
index 7cd660c058c..0524a4b541e 100644
--- a/Mage.Sets/src/mage/cards/e/EaterOfHope.java
+++ b/Mage.Sets/src/mage/cards/e/EaterOfHope.java
@@ -30,7 +30,7 @@ public final class EaterOfHope extends CardImpl {
private static final FilterControlledCreaturePermanent destroyFilter = new FilterControlledCreaturePermanent("two other creatures");
static {
- destroyFilter.add(new AnotherPredicate());
+ destroyFilter.add(AnotherPredicate.instance);
}
public EaterOfHope(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EbonyHorse.java b/Mage.Sets/src/mage/cards/e/EbonyHorse.java
index f5bcac6c36e..610dd3291cf 100644
--- a/Mage.Sets/src/mage/cards/e/EbonyHorse.java
+++ b/Mage.Sets/src/mage/cards/e/EbonyHorse.java
@@ -30,7 +30,7 @@ public final class EbonyHorse extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creature you control");
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public EbonyHorse(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EddytrailHawk.java b/Mage.Sets/src/mage/cards/e/EddytrailHawk.java
index 2c312f1ba26..e7bf591e8c8 100644
--- a/Mage.Sets/src/mage/cards/e/EddytrailHawk.java
+++ b/Mage.Sets/src/mage/cards/e/EddytrailHawk.java
@@ -29,7 +29,7 @@ public final class EddytrailHawk extends CardImpl {
private final static FilterAttackingCreature filter = new FilterAttackingCreature();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public EddytrailHawk(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EdricSpymasterOfTrest.java b/Mage.Sets/src/mage/cards/e/EdricSpymasterOfTrest.java
index e43a5f513c2..57e194e74fc 100644
--- a/Mage.Sets/src/mage/cards/e/EdricSpymasterOfTrest.java
+++ b/Mage.Sets/src/mage/cards/e/EdricSpymasterOfTrest.java
@@ -69,7 +69,7 @@ class EdricSpymasterOfTrestTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (((DamagedPlayerEvent) event).isCombatDamage() &&
- game.getOpponents(this.controllerId).contains(((DamagedPlayerEvent) event).getPlayerId())) {
+ game.getOpponents(this.controllerId).contains(event.getPlayerId())) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(game.getPermanent(event.getSourceId()).getControllerId()));
}
diff --git a/Mage.Sets/src/mage/cards/e/EfreetWeaponmaster.java b/Mage.Sets/src/mage/cards/e/EfreetWeaponmaster.java
index a0d9d1f5bae..0f71859daea 100644
--- a/Mage.Sets/src/mage/cards/e/EfreetWeaponmaster.java
+++ b/Mage.Sets/src/mage/cards/e/EfreetWeaponmaster.java
@@ -61,7 +61,7 @@ class EfreetWeaponmasterAbility extends TriggeredAbilityImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public EfreetWeaponmasterAbility() {
diff --git a/Mage.Sets/src/mage/cards/e/EldraziAggressor.java b/Mage.Sets/src/mage/cards/e/EldraziAggressor.java
index 142cfa2b255..6538c6ac1de 100644
--- a/Mage.Sets/src/mage/cards/e/EldraziAggressor.java
+++ b/Mage.Sets/src/mage/cards/e/EldraziAggressor.java
@@ -29,8 +29,8 @@ public final class EldraziAggressor extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another colorless creature");
static {
- filter.add(new AnotherPredicate());
- filter.add(new ColorlessPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(ColorlessPredicate.instance);
}
public EldraziAggressor(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EldraziDisplacer.java b/Mage.Sets/src/mage/cards/e/EldraziDisplacer.java
index c5dc494d1f1..8618e6afb6b 100644
--- a/Mage.Sets/src/mage/cards/e/EldraziDisplacer.java
+++ b/Mage.Sets/src/mage/cards/e/EldraziDisplacer.java
@@ -28,7 +28,7 @@ public final class EldraziDisplacer extends CardImpl {
private static final FilterCreaturePermanent FILTER = new FilterCreaturePermanent("another target creature");
static {
- FILTER.add(new AnotherPredicate());
+ FILTER.add(AnotherPredicate.instance);
}
public EldraziDisplacer(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EldraziMimic.java b/Mage.Sets/src/mage/cards/e/EldraziMimic.java
index d90c7e78385..657a7a8565c 100644
--- a/Mage.Sets/src/mage/cards/e/EldraziMimic.java
+++ b/Mage.Sets/src/mage/cards/e/EldraziMimic.java
@@ -28,8 +28,8 @@ public final class EldraziMimic extends CardImpl {
private static final FilterCreaturePermanent FILTER = new FilterCreaturePermanent("another colorless creature");
static {
- FILTER.add(new AnotherPredicate());
- FILTER.add(new ColorlessPredicate());
+ FILTER.add(AnotherPredicate.instance);
+ FILTER.add(ColorlessPredicate.instance);
}
public EldraziMimic(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/Electrodominance.java b/Mage.Sets/src/mage/cards/e/Electrodominance.java
new file mode 100644
index 00000000000..4b9342fcaac
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/Electrodominance.java
@@ -0,0 +1,35 @@
+package mage.cards.e;
+
+import mage.abilities.dynamicvalue.common.ManacostVariableValue;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.cost.CastWithoutPayingManaCostEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.target.common.TargetAnyTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Electrodominance extends CardImpl {
+
+ public Electrodominance(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{R}{R}");
+
+ // Electrodominance deals X damage to any target. You may cast a card with converted mana cost X or less from your hand without paying its mana cost.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
+ this.getSpellAbility().addTarget(new TargetAnyTarget());
+ this.getSpellAbility().addEffect(new CastWithoutPayingManaCostEffect(ManacostVariableValue.instance));
+ }
+
+ private Electrodominance(final Electrodominance card) {
+ super(card);
+ }
+
+ @Override
+ public Electrodominance copy() {
+ return new Electrodominance(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java b/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java
index 9b6b3c855a4..34910dc22e6 100644
--- a/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java
+++ b/Mage.Sets/src/mage/cards/e/EliminateTheCompetition.java
@@ -1,4 +1,3 @@
-
package mage.cards.e;
import java.util.UUID;
@@ -9,11 +8,11 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
@@ -22,7 +21,7 @@ import mage.target.common.TargetCreaturePermanent;
public final class EliminateTheCompetition extends CardImpl {
public EliminateTheCompetition(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}");
// As an additional cost to cast Eliminate the Competition, sacrifice X creatures.
this.getSpellAbility().addCost(new SacrificeXTargetCost(new FilterControlledCreaturePermanent("creatures"), true));
@@ -32,23 +31,26 @@ public final class EliminateTheCompetition extends CardImpl {
effect.setText("Destroy X target creatures");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().setTargetAdjuster(EliminateTheCompetitionAdjuster.instance);
}
public EliminateTheCompetition(final EliminateTheCompetition card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getAbilityType() == AbilityType.SPELL) {
- ability.getTargets().clear();
- int sac = new GetXValue().calculate(game, ability, null);
- ability.addTarget(new TargetCreaturePermanent(sac, sac));
- }
- }
-
@Override
public EliminateTheCompetition copy() {
return new EliminateTheCompetition(this);
}
}
+
+enum EliminateTheCompetitionAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int sac = GetXValue.instance.calculate(game, ability, null);
+ ability.addTarget(new TargetCreaturePermanent(sac, sac));
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/EliteArcanist.java b/Mage.Sets/src/mage/cards/e/EliteArcanist.java
index b44d6aef399..9ca13d7fa50 100644
--- a/Mage.Sets/src/mage/cards/e/EliteArcanist.java
+++ b/Mage.Sets/src/mage/cards/e/EliteArcanist.java
@@ -1,12 +1,12 @@
package mage.cards.e;
-import java.util.UUID;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
@@ -25,8 +25,9 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetCard;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class EliteArcanist extends CardImpl {
@@ -45,6 +46,7 @@ public final class EliteArcanist extends CardImpl {
// {X}, {T}: Copy the exiled card. You may cast the copy without paying its mana cost. X is the converted mana cost of the exiled card.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new EliteArcanistCopyEffect(), new ManaCostsImpl("{X}"));
ability.addCost(new TapSourceCost());
+ ability.setCostAdjuster(EliteArcanistAdjuster.instance);
this.addAbility(ability);
}
@@ -52,29 +54,35 @@ public final class EliteArcanist extends CardImpl {
super(card);
}
- @Override
- public void adjustCosts(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
- Permanent sourcePermanent = game.getPermanent(ability.getSourceId());
- if (sourcePermanent != null && sourcePermanent.getImprinted() != null && !sourcePermanent.getImprinted().isEmpty()) {
- Card imprintedInstant = game.getCard(sourcePermanent.getImprinted().get(0));
- if (imprintedInstant != null) {
- int cmc = imprintedInstant.getConvertedManaCost();
- if (cmc > 0) {
- ability.getManaCostsToPay().clear();
- ability.getManaCostsToPay().add(new GenericManaCost(cmc));
- }
- }
- }
- }
- }
-
@Override
public EliteArcanist copy() {
return new EliteArcanist(this);
}
}
+enum EliteArcanistAdjuster implements CostAdjuster {
+ instance;
+
+ @Override
+ public void adjustCosts(Ability ability, Game game) {
+ Permanent sourcePermanent = game.getPermanent(ability.getSourceId());
+ if (sourcePermanent == null
+ || sourcePermanent.getImprinted() == null
+ || sourcePermanent.getImprinted().isEmpty()) {
+ return;
+ }
+ Card imprintedInstant = game.getCard(sourcePermanent.getImprinted().get(0));
+ if (imprintedInstant == null) {
+ return;
+ }
+ int cmc = imprintedInstant.getConvertedManaCost();
+ if (cmc > 0) {
+ ability.getManaCostsToPay().clear();
+ ability.getManaCostsToPay().add(new GenericManaCost(cmc));
+ }
+ }
+}
+
class EliteArcanistImprintEffect extends OneShotEffect {
private static final FilterCard filter = new FilterCard("instant card from your hand");
diff --git a/Mage.Sets/src/mage/cards/e/EliteArrester.java b/Mage.Sets/src/mage/cards/e/EliteArrester.java
new file mode 100644
index 00000000000..570589d44e1
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/EliteArrester.java
@@ -0,0 +1,47 @@
+package mage.cards.e;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class EliteArrester extends CardImpl {
+
+ public EliteArrester(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SOLDIER);
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(3);
+
+ // {1}{U}, {T}: Tap target creature.
+ Ability ability = new SimpleActivatedAbility(
+ new TapTargetEffect(), new ManaCostsImpl("{1}{U}")
+ );
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ private EliteArrester(final EliteArrester card) {
+ super(card);
+ }
+
+ @Override
+ public EliteArrester copy() {
+ return new EliteArrester(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/EliteScaleguard.java b/Mage.Sets/src/mage/cards/e/EliteScaleguard.java
index 332e040f55c..b2c5911d85b 100644
--- a/Mage.Sets/src/mage/cards/e/EliteScaleguard.java
+++ b/Mage.Sets/src/mage/cards/e/EliteScaleguard.java
@@ -1,12 +1,10 @@
package mage.cards.e;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksCreatureYouControlTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.effects.keyword.BolsterEffect;
import mage.cards.CardImpl;
@@ -16,25 +14,29 @@ import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.filter.predicate.permanent.CounterPredicate;
+import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author emerald000
*/
public final class EliteScaleguard extends CardImpl {
-
+
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature you control with a +1/+1 counter on it");
+ private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creature defending player controls");
+
static {
filter.add(new CounterPredicate(CounterType.P1P1));
+ filter2.add(DefendingPlayerControlsPredicate.instance);
}
public EliteScaleguard(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SOLDIER);
this.power = new MageInt(2);
@@ -42,32 +44,16 @@ public final class EliteScaleguard extends CardImpl {
// When Elite Scaleguard enters the battlefield, bolster 2.
this.addAbility(new EntersBattlefieldTriggeredAbility(new BolsterEffect(2)));
-
+
// Whenever a creature you control with a +1/+1 counter on it attacks, tap target creature defending player controls.
Ability ability = new AttacksCreatureYouControlTriggeredAbility(new EliteScaleguardTapEffect(), false, filter, true);
- ability.addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature defending player controls")));
+ ability.addTarget(new TargetCreaturePermanent(filter2));
this.addAbility(ability);
}
public EliteScaleguard(final EliteScaleguard card) {
super(card);
}
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof AttacksCreatureYouControlTriggeredAbility) {
- FilterCreaturePermanent filterDefender = new FilterCreaturePermanent("creature defending player controls");
- for (Effect effect : ability.getEffects()) {
- if (effect instanceof EliteScaleguardTapEffect) {
- filterDefender.add(new ControllerIdPredicate(game.getCombat().getDefendingPlayerId(effect.getTargetPointer().getFirst(game, ability), game)));
- break;
- }
- }
- ability.getTargets().clear();
- TargetCreaturePermanent target = new TargetCreaturePermanent(filterDefender);
- ability.addTarget(target);
- }
- }
@Override
public EliteScaleguard copy() {
@@ -76,20 +62,20 @@ public final class EliteScaleguard extends CardImpl {
}
class EliteScaleguardTapEffect extends TapTargetEffect {
-
+
EliteScaleguardTapEffect() {
super();
}
-
+
EliteScaleguardTapEffect(final EliteScaleguardTapEffect effect) {
super(effect);
}
-
+
@Override
public EliteScaleguardTapEffect copy() {
return new EliteScaleguardTapEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getFirstTarget());
diff --git a/Mage.Sets/src/mage/cards/e/ElvishScout.java b/Mage.Sets/src/mage/cards/e/ElvishScout.java
index fb03e934950..01a924b85e7 100644
--- a/Mage.Sets/src/mage/cards/e/ElvishScout.java
+++ b/Mage.Sets/src/mage/cards/e/ElvishScout.java
@@ -30,7 +30,7 @@ public final class ElvishScout extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("attacking creature you control");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public ElvishScout(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/ElvishVanguard.java b/Mage.Sets/src/mage/cards/e/ElvishVanguard.java
index a31344e7368..7591f622131 100644
--- a/Mage.Sets/src/mage/cards/e/ElvishVanguard.java
+++ b/Mage.Sets/src/mage/cards/e/ElvishVanguard.java
@@ -24,7 +24,7 @@ public final class ElvishVanguard extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ELF));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ElvishVanguard(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EmbalmersTools.java b/Mage.Sets/src/mage/cards/e/EmbalmersTools.java
index c81514acd8f..4ca900ff9f9 100644
--- a/Mage.Sets/src/mage/cards/e/EmbalmersTools.java
+++ b/Mage.Sets/src/mage/cards/e/EmbalmersTools.java
@@ -35,7 +35,7 @@ public final class EmbalmersTools extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Zombie you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.ZOMBIE));
}
diff --git a/Mage.Sets/src/mage/cards/e/EmberFistZubera.java b/Mage.Sets/src/mage/cards/e/EmberFistZubera.java
index 0a79c71c41e..acfe8a486ca 100644
--- a/Mage.Sets/src/mage/cards/e/EmberFistZubera.java
+++ b/Mage.Sets/src/mage/cards/e/EmberFistZubera.java
@@ -28,7 +28,7 @@ public final class EmberFistZubera extends CardImpl {
this.power = new MageInt(1);
this.toughness = new MageInt(2);
- Ability ability = new DiesTriggeredAbility(new DamageTargetEffect(new ZuberasDiedDynamicValue()));
+ Ability ability = new DiesTriggeredAbility(new DamageTargetEffect(ZuberasDiedDynamicValue.instance));
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability, new ZuberasDiedWatcher());
}
diff --git a/Mage.Sets/src/mage/cards/e/EmergencyPowers.java b/Mage.Sets/src/mage/cards/e/EmergencyPowers.java
index c206d8450f5..e2495e3607e 100644
--- a/Mage.Sets/src/mage/cards/e/EmergencyPowers.java
+++ b/Mage.Sets/src/mage/cards/e/EmergencyPowers.java
@@ -1,7 +1,8 @@
package mage.cards.e;
-import mage.abilities.condition.common.MyMainPhaseCondition;
-import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.Ability;
+import mage.abilities.condition.common.AddendumCondition;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardAllEffect;
import mage.abilities.effects.common.ExileSpellEffect;
import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect;
@@ -10,8 +11,10 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
+import mage.constants.Outcome;
import mage.filter.common.FilterPermanentCard;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
import java.util.UUID;
@@ -20,30 +23,15 @@ import java.util.UUID;
*/
public final class EmergencyPowers extends CardImpl {
- public static final FilterPermanentCard filter
- = new FilterPermanentCard("a permanent card with converted mana cost 7 or less");
-
- static {
- filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 8));
- }
-
public EmergencyPowers(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{W}{U}");
// Each player shuffles their hand and graveyard into their library, then draws seven cards. Exile Emergency Powers.
this.getSpellAbility().addEffect(new ShuffleHandGraveyardAllEffect());
this.getSpellAbility().addEffect(new DrawCardAllEffect(7).setText(", then draws seven cards"));
- this.getSpellAbility().addEffect(ExileSpellEffect.getInstance());
// Addendum — If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield.
- this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
- new PutCardFromHandOntoBattlefieldEffect(filter),
- MyMainPhaseCondition.instance,
- "
Addendum — " +
- "If you cast this spell during your main phase, " +
- "you may put a permanent card with converted mana cost 7 or less " +
- "from your hand onto the battlefield."
- ));
+ this.getSpellAbility().addEffect(new EmergencyPowersEffect());
}
private EmergencyPowers(final EmergencyPowers card) {
@@ -55,4 +43,37 @@ public final class EmergencyPowers extends CardImpl {
return new EmergencyPowers(this);
}
}
+
+class EmergencyPowersEffect extends OneShotEffect {
+
+ public static final FilterPermanentCard filter
+ = new FilterPermanentCard("a permanent card with converted mana cost 7 or less");
+
+ static {
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 8));
+ }
+
+ EmergencyPowersEffect() {
+ super(Outcome.Benefit);
+ staticText = "Exile {this}.
Addendum — If you cast this spell during your main phase, " +
+ "you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield.";
+ }
+
+ private EmergencyPowersEffect(final EmergencyPowersEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public EmergencyPowersEffect copy() {
+ return new EmergencyPowersEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ if (AddendumCondition.instance.apply(game, source)) {
+ new PutCardFromHandOntoBattlefieldEffect(filter).apply(game, source);
+ }
+ return ExileSpellEffect.getInstance().apply(game, source);
+ }
+}
// I am the senate!
diff --git a/Mage.Sets/src/mage/cards/e/EmmaraTandris.java b/Mage.Sets/src/mage/cards/e/EmmaraTandris.java
index e51f33d7129..11d0794557e 100644
--- a/Mage.Sets/src/mage/cards/e/EmmaraTandris.java
+++ b/Mage.Sets/src/mage/cards/e/EmmaraTandris.java
@@ -21,7 +21,7 @@ public final class EmmaraTandris extends CardImpl {
private static final FilterCreatureOrPlayer filter = new FilterCreatureOrPlayer("creature tokens you control");
static {
- filter.getCreatureFilter().add(new TokenPredicate());
+ filter.getCreatureFilter().add(TokenPredicate.instance);
filter.getCreatureFilter().add(new ControllerPredicate(TargetController.YOU));
filter.getPlayerFilter().add(new PlayerIdPredicate(UUID.randomUUID()));
}
diff --git a/Mage.Sets/src/mage/cards/e/EmptyThePits.java b/Mage.Sets/src/mage/cards/e/EmptyThePits.java
index f2bfbd27fb1..fb2337fd5e6 100644
--- a/Mage.Sets/src/mage/cards/e/EmptyThePits.java
+++ b/Mage.Sets/src/mage/cards/e/EmptyThePits.java
@@ -24,7 +24,7 @@ public final class EmptyThePits extends CardImpl {
this.addAbility(new DelveAbility());
// create X 2/2 black Zombie creature tokens tapped.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken(), new ManacostVariableValue(), true, false));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken(), ManacostVariableValue.instance, true, false));
}
public EmptyThePits(final EmptyThePits card) {
diff --git a/Mage.Sets/src/mage/cards/e/EmpyrialArmor.java b/Mage.Sets/src/mage/cards/e/EmpyrialArmor.java
index 9ae1b61d026..de4b1ffa237 100644
--- a/Mage.Sets/src/mage/cards/e/EmpyrialArmor.java
+++ b/Mage.Sets/src/mage/cards/e/EmpyrialArmor.java
@@ -38,7 +38,7 @@ public final class EmpyrialArmor extends CardImpl {
this.addAbility(ability);
// Enchanted creature gets +1/+1 for each card in your hand.
- DynamicValue xValue = new CardsInControllerHandCount();
+ DynamicValue xValue = CardsInControllerHandCount.instance;
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(xValue, xValue, Duration.WhileOnBattlefield)));
}
diff --git a/Mage.Sets/src/mage/cards/e/EmpyrialPlate.java b/Mage.Sets/src/mage/cards/e/EmpyrialPlate.java
index d43fe32b16d..4116555856a 100644
--- a/Mage.Sets/src/mage/cards/e/EmpyrialPlate.java
+++ b/Mage.Sets/src/mage/cards/e/EmpyrialPlate.java
@@ -25,7 +25,7 @@ public final class EmpyrialPlate extends CardImpl {
this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +1/+1 for each card in your hand.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(new CardsInControllerHandCount(), new CardsInControllerHandCount())));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(CardsInControllerHandCount.instance, CardsInControllerHandCount.instance)));
// Equip {2}
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(2)));
diff --git a/Mage.Sets/src/mage/cards/e/EmrakulTheAeonsTorn.java b/Mage.Sets/src/mage/cards/e/EmrakulTheAeonsTorn.java
index 9d4c6f1fdb4..b08775abcbc 100644
--- a/Mage.Sets/src/mage/cards/e/EmrakulTheAeonsTorn.java
+++ b/Mage.Sets/src/mage/cards/e/EmrakulTheAeonsTorn.java
@@ -28,7 +28,7 @@ public final class EmrakulTheAeonsTorn extends CardImpl {
private static final FilterSpell filter = new FilterSpell("colored spells");
static {
- filter.add(Predicates.not(new ColorlessPredicate()));
+ filter.add(Predicates.not(ColorlessPredicate.instance));
}
public EmrakulTheAeonsTorn(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EmrakulsEvangel.java b/Mage.Sets/src/mage/cards/e/EmrakulsEvangel.java
index 15c20aff649..33faa4a9660 100644
--- a/Mage.Sets/src/mage/cards/e/EmrakulsEvangel.java
+++ b/Mage.Sets/src/mage/cards/e/EmrakulsEvangel.java
@@ -61,7 +61,7 @@ class EmrakulsEvangelCost extends CostImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("non-Eldrazi creatures you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(Predicates.not(new SubtypePredicate(SubType.ELDRAZI)));
}
diff --git a/Mage.Sets/src/mage/cards/e/EnclaveElite.java b/Mage.Sets/src/mage/cards/e/EnclaveElite.java
index 58f5df9c835..de61d1239d1 100644
--- a/Mage.Sets/src/mage/cards/e/EnclaveElite.java
+++ b/Mage.Sets/src/mage/cards/e/EnclaveElite.java
@@ -36,7 +36,7 @@ public final class EnclaveElite extends CardImpl {
// Enclave Elite enters the battlefield with a +1/+1 counter on it for each time it was kicked.
this.addAbility(new EntersBattlefieldAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), new MultikickerCount(), true),
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), MultikickerCount.instance, true),
"with a +1/+1 counter on it for each time it was kicked"));
}
diff --git a/Mage.Sets/src/mage/cards/e/EndRazeForerunners.java b/Mage.Sets/src/mage/cards/e/EndRazeForerunners.java
new file mode 100644
index 00000000000..f189c0b9ab3
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/EndRazeForerunners.java
@@ -0,0 +1,65 @@
+package mage.cards.e;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.StaticFilters;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class EndRazeForerunners extends CardImpl {
+
+ public EndRazeForerunners(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}{G}{G}");
+
+ this.subtype.add(SubType.BOAR);
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(7);
+
+ // Vigilance
+ this.addAbility(VigilanceAbility.getInstance());
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+
+ // When End-Raze Forerunners enters the battlefield, other creatures you control get +2/+2 and gain vigilance and trample until end of turn.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new BoostControlledEffect(
+ 2, 2, Duration.EndOfTurn,
+ StaticFilters.FILTER_PERMANENT_CREATURE, true
+ ).setText("other creatures you control get +2/+2"));
+ ability.addEffect(new GainAbilityControlledEffect(
+ VigilanceAbility.getInstance(), Duration.EndOfTurn,
+ StaticFilters.FILTER_PERMANENT_CREATURE, true
+ ).setText("and gain vigilance"));
+ ability.addEffect(new GainAbilityControlledEffect(
+ TrampleAbility.getInstance(), Duration.EndOfTurn,
+ StaticFilters.FILTER_PERMANENT_CREATURE, true
+ ).setText("and trample until end of turn"));
+ this.addAbility(ability);
+ }
+
+ private EndRazeForerunners(final EndRazeForerunners card) {
+ super(card);
+ }
+
+ @Override
+ public EndRazeForerunners copy() {
+ return new EndRazeForerunners(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/EndlessSwarm.java b/Mage.Sets/src/mage/cards/e/EndlessSwarm.java
index f3eac93fad2..a33c4084634 100644
--- a/Mage.Sets/src/mage/cards/e/EndlessSwarm.java
+++ b/Mage.Sets/src/mage/cards/e/EndlessSwarm.java
@@ -22,7 +22,7 @@ public final class EndlessSwarm extends CardImpl {
// Create a 1/1 green Snake creature token for each card in your hand.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new SnakeToken(), new CardsInControllerHandCount()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new SnakeToken(), CardsInControllerHandCount.instance));
// Epic
this.getSpellAbility().addEffect(new EpicEffect());
diff --git a/Mage.Sets/src/mage/cards/e/EnemyOfTheGuildpact.java b/Mage.Sets/src/mage/cards/e/EnemyOfTheGuildpact.java
index eb2fc372c1a..ee59ff16cb6 100644
--- a/Mage.Sets/src/mage/cards/e/EnemyOfTheGuildpact.java
+++ b/Mage.Sets/src/mage/cards/e/EnemyOfTheGuildpact.java
@@ -20,7 +20,7 @@ public final class EnemyOfTheGuildpact extends CardImpl {
private static final FilterObject filter = new FilterObject("multicolored");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public EnemyOfTheGuildpact(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EnergyBolt.java b/Mage.Sets/src/mage/cards/e/EnergyBolt.java
index ef5fe784bbc..216c983a537 100644
--- a/Mage.Sets/src/mage/cards/e/EnergyBolt.java
+++ b/Mage.Sets/src/mage/cards/e/EnergyBolt.java
@@ -22,10 +22,10 @@ public final class EnergyBolt extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{W}");
// Choose one - Energy Bolt deals X damage to target player; or target player gains X life.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker());
Mode mode = new Mode();
- mode.addEffect(new GainLifeTargetEffect(new ManacostVariableValue()));
+ mode.addEffect(new GainLifeTargetEffect(ManacostVariableValue.instance));
mode.addTarget(new TargetPlayer());
this.getSpellAbility().addMode(mode);
}
diff --git a/Mage.Sets/src/mage/cards/e/EnergyTap.java b/Mage.Sets/src/mage/cards/e/EnergyTap.java
index ef1aaadbf82..0b8e57fcd82 100644
--- a/Mage.Sets/src/mage/cards/e/EnergyTap.java
+++ b/Mage.Sets/src/mage/cards/e/EnergyTap.java
@@ -25,7 +25,7 @@ public final class EnergyTap extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public EnergyTap(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/Enrage.java b/Mage.Sets/src/mage/cards/e/Enrage.java
index 83c2876c0ca..9d83d33659c 100644
--- a/Mage.Sets/src/mage/cards/e/Enrage.java
+++ b/Mage.Sets/src/mage/cards/e/Enrage.java
@@ -22,7 +22,7 @@ public final class Enrage extends CardImpl {
// Target creature gets +X/+0 until end of turn.
- this.getSpellAbility().addEffect(new BoostTargetEffect(new ManacostVariableValue(), new StaticValue(0), Duration.EndOfTurn));
+ this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.instance, new StaticValue(0), Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/e/EnragedCeratok.java b/Mage.Sets/src/mage/cards/e/EnragedCeratok.java
new file mode 100644
index 00000000000..5098f50a5de
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/EnragedCeratok.java
@@ -0,0 +1,50 @@
+package mage.cards.e;
+
+import mage.MageInt;
+import mage.abilities.common.SimpleEvasionAbility;
+import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class EnragedCeratok extends CardImpl {
+
+ private static final FilterCreaturePermanent filter
+ = new FilterCreaturePermanent("creatures with power 2 or less");
+
+ static {
+ filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
+ }
+
+ public EnragedCeratok(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
+
+ this.subtype.add(SubType.RHINO);
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Enraged Ceratok can't be blocked by creatures with power 2 or less.
+ this.addAbility(new SimpleEvasionAbility(
+ new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield)
+ ));
+ }
+
+ private EnragedCeratok(final EnragedCeratok card) {
+ super(card);
+ }
+
+ @Override
+ public EnragedCeratok copy() {
+ return new EnragedCeratok(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/EnshrinedMemories.java b/Mage.Sets/src/mage/cards/e/EnshrinedMemories.java
index 224dcc1d44b..9dbaf7728b2 100644
--- a/Mage.Sets/src/mage/cards/e/EnshrinedMemories.java
+++ b/Mage.Sets/src/mage/cards/e/EnshrinedMemories.java
@@ -20,7 +20,7 @@ public final class EnshrinedMemories extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{G}");
// Reveal the top X cards of your library. Put all creature cards revealed this way into your hand and the rest on the bottom of your library in any order.
- this.getSpellAbility().addEffect(new RevealLibraryPutIntoHandEffect(new ManacostVariableValue(), new FilterCreatureCard(), Zone.LIBRARY, true));
+ this.getSpellAbility().addEffect(new RevealLibraryPutIntoHandEffect(ManacostVariableValue.instance, new FilterCreatureCard(), Zone.LIBRARY, true));
}
public EnshrinedMemories(final EnshrinedMemories card) {
diff --git a/Mage.Sets/src/mage/cards/e/EnslavedHorror.java b/Mage.Sets/src/mage/cards/e/EnslavedHorror.java
index 3fbba05fa12..c8362a0ca20 100644
--- a/Mage.Sets/src/mage/cards/e/EnslavedHorror.java
+++ b/Mage.Sets/src/mage/cards/e/EnslavedHorror.java
@@ -32,7 +32,7 @@ public final class EnslavedHorror extends CardImpl {
this.power = new MageInt(4);
this.toughness = new MageInt(4);
- // When Enslaved Horror enters the battlefield, each other player may return a creature card from his or her graveyard to the battlefield.
+ // When Enslaved Horror enters the battlefield, each other player may return a creature card from their graveyard to the battlefield.
this.addAbility(new EntersBattlefieldTriggeredAbility(new EnslavedHorrorEffect()));
}
diff --git a/Mage.Sets/src/mage/cards/e/EntanglingVines.java b/Mage.Sets/src/mage/cards/e/EntanglingVines.java
index 808eb3b5605..49bd76d564d 100644
--- a/Mage.Sets/src/mage/cards/e/EntanglingVines.java
+++ b/Mage.Sets/src/mage/cards/e/EntanglingVines.java
@@ -26,7 +26,7 @@ public final class EntanglingVines extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public EntanglingVines(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EntrancingMelody.java b/Mage.Sets/src/mage/cards/e/EntrancingMelody.java
index 4c14d0ee0c7..5fb62884989 100644
--- a/Mage.Sets/src/mage/cards/e/EntrancingMelody.java
+++ b/Mage.Sets/src/mage/cards/e/EntrancingMelody.java
@@ -1,9 +1,7 @@
package mage.cards.e;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -14,38 +12,45 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class EntrancingMelody extends CardImpl {
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost X");
+
public EntrancingMelody(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{U}{U}");
// Gain control of target creature with converted mana cost X.
this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.Custom, true));
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with converted mana cost X")));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ this.getSpellAbility().setTargetAdjuster(EntrancingMelodyAdjuster.instance);
}
public EntrancingMelody(final EntrancingMelody card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost X");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
- ability.addTarget(new TargetCreaturePermanent(filter));
- }
- }
-
@Override
public EntrancingMelody copy() {
return new EntrancingMelody(this);
}
}
+
+enum EntrancingMelodyAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost " + xValue);
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/e/EntrapmentManeuver.java b/Mage.Sets/src/mage/cards/e/EntrapmentManeuver.java
index 2853d798b76..846af092c69 100644
--- a/Mage.Sets/src/mage/cards/e/EntrapmentManeuver.java
+++ b/Mage.Sets/src/mage/cards/e/EntrapmentManeuver.java
@@ -66,7 +66,7 @@ class EntrapmentManeuverSacrificeEffect extends OneShotEffect {
return false;
}
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
int realCount = game.getBattlefield().countAll(filter, player.getId(), game);
if (realCount > 0) {
Target target = new TargetControlledPermanent(1, 1, filter, true);
diff --git a/Mage.Sets/src/mage/cards/e/EntreatTheAngels.java b/Mage.Sets/src/mage/cards/e/EntreatTheAngels.java
index e398ee5b5b1..234618f3517 100644
--- a/Mage.Sets/src/mage/cards/e/EntreatTheAngels.java
+++ b/Mage.Sets/src/mage/cards/e/EntreatTheAngels.java
@@ -22,7 +22,7 @@ public final class EntreatTheAngels extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{W}{W}{W}");
// Create X 4/4 white Angel creature tokens with flying.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new AngelToken(), ManacostVariableValue.instance));
// Miracle {X}{W}{W}
this.addAbility(new MiracleAbility(this, new ManaCostsImpl("{X}{W}{W}")));
diff --git a/Mage.Sets/src/mage/cards/e/EntreatTheDead.java b/Mage.Sets/src/mage/cards/e/EntreatTheDead.java
index 86d76b7b4a5..58b597c89ff 100644
--- a/Mage.Sets/src/mage/cards/e/EntreatTheDead.java
+++ b/Mage.Sets/src/mage/cards/e/EntreatTheDead.java
@@ -2,7 +2,6 @@ package mage.cards.e;
import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.keyword.MiracleAbility;
@@ -14,6 +13,7 @@ import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
@@ -27,25 +27,10 @@ public final class EntreatTheDead extends CardImpl {
// Return X target creature cards from your graveyard to the battlefield.
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(1, StaticFilters.FILTER_CARD_CREATURE));
+ this.getSpellAbility().setTargetAdjuster(EntreatTheDeadAdjuster.instance);
// Miracle {X}{B}{B}
this.addAbility(new MiracleAbility(this, new ManaCostsImpl("{X}{B}{B}")));
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- String filterName = xValue
- + (xValue != 1 ? " creature cards" : "creature card")
- + " from your graveyard";
- Target target = new TargetCardInYourGraveyard(
- xValue, new FilterCreatureCard(filterName)
- );
- ability.addTarget(target);
- }
}
public EntreatTheDead(final EntreatTheDead card) {
@@ -57,3 +42,20 @@ public final class EntreatTheDead extends CardImpl {
return new EntreatTheDead(this);
}
}
+
+enum EntreatTheDeadAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ String filterName = xValue
+ + (xValue != 1 ? " creature cards" : "creature card")
+ + " from your graveyard";
+ Target target = new TargetCardInYourGraveyard(
+ xValue, new FilterCreatureCard(filterName)
+ );
+ ability.addTarget(target);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/EntropicSpecter.java b/Mage.Sets/src/mage/cards/e/EntropicSpecter.java
index 1102b8e1ba3..ef504ece33d 100644
--- a/Mage.Sets/src/mage/cards/e/EntropicSpecter.java
+++ b/Mage.Sets/src/mage/cards/e/EntropicSpecter.java
@@ -1,7 +1,6 @@
package mage.cards.e;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
@@ -19,8 +18,9 @@ import mage.constants.*;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class EntropicSpecter extends CardImpl {
@@ -42,7 +42,7 @@ public final class EntropicSpecter extends CardImpl {
// Entropic Specter's power and toughness are each equal to the number of cards in the chosen player's hand.
this.addAbility(new SimpleStaticAbility(Zone.ALL,
// back to the graveyard or if the choosen player left the gane it's again a 0/0
- new SetPowerToughnessSourceEffect(new CardsInTargetPlayerHandCount(), Duration.WhileOnBattlefield, SubLayer.CharacteristicDefining_7a)));
+ new SetPowerToughnessSourceEffect(CardsInTargetPlayerHandCount.instance, Duration.WhileOnBattlefield, SubLayer.CharacteristicDefining_7a)));
// Whenever Entropic Specter deals damage to a player, that player discards a card.
this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new DiscardTargetEffect(1, false), false, true));
@@ -58,7 +58,8 @@ public final class EntropicSpecter extends CardImpl {
}
}
-class CardsInTargetPlayerHandCount implements DynamicValue {
+enum CardsInTargetPlayerHandCount implements DynamicValue {
+ instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
@@ -74,7 +75,7 @@ class CardsInTargetPlayerHandCount implements DynamicValue {
@Override
public DynamicValue copy() {
- return new mage.abilities.dynamicvalue.common.CardsInControllerHandCount();
+ return instance;
}
@Override
diff --git a/Mage.Sets/src/mage/cards/e/EpharaGodOfThePolis.java b/Mage.Sets/src/mage/cards/e/EpharaGodOfThePolis.java
index 8f149ba496b..c3ae62a97ad 100644
--- a/Mage.Sets/src/mage/cards/e/EpharaGodOfThePolis.java
+++ b/Mage.Sets/src/mage/cards/e/EpharaGodOfThePolis.java
@@ -70,7 +70,7 @@ enum HadAnotherCreatureEnterTheBattlefieldCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
- PermanentsEnteredBattlefieldWatcher watcher = (PermanentsEnteredBattlefieldWatcher) game.getState().getWatchers().get(PermanentsEnteredBattlefieldWatcher.class.getSimpleName());
+ PermanentsEnteredBattlefieldWatcher watcher = game.getState().getWatcher(PermanentsEnteredBattlefieldWatcher.class);
return sourcePermanent != null
&& watcher != null
&& watcher.anotherCreatureEnteredBattlefieldUnderPlayersControlLastTurn(sourcePermanent, game);
diff --git a/Mage.Sets/src/mage/cards/e/ErayoSoratamiAscendant.java b/Mage.Sets/src/mage/cards/e/ErayoSoratamiAscendant.java
index 6f50051ae6c..6841c7760f4 100644
--- a/Mage.Sets/src/mage/cards/e/ErayoSoratamiAscendant.java
+++ b/Mage.Sets/src/mage/cards/e/ErayoSoratamiAscendant.java
@@ -78,7 +78,7 @@ class ErayoSoratamiAscendantTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
return watcher != null && watcher.getAmountOfSpellsAllPlayersCastOnCurrentTurn() == 4;
}
@@ -134,7 +134,7 @@ class ErayosEssenceTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (game.getOpponents(getControllerId()).contains(event.getPlayerId())) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 1) {
for (Effect effect : getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
diff --git a/Mage.Sets/src/mage/cards/e/ErdwalIlluminator.java b/Mage.Sets/src/mage/cards/e/ErdwalIlluminator.java
index c5e6480f446..c303a87b821 100644
--- a/Mage.Sets/src/mage/cards/e/ErdwalIlluminator.java
+++ b/Mage.Sets/src/mage/cards/e/ErdwalIlluminator.java
@@ -66,7 +66,7 @@ class ErdwalIlluminatorTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- InvestigatedWatcher watcher = (InvestigatedWatcher) game.getState().getWatchers().get(InvestigatedWatcher.class.getSimpleName());
+ InvestigatedWatcher watcher = game.getState().getWatcher(InvestigatedWatcher.class);
return watcher != null && watcher.getTimesInvestigated(getControllerId()) == 1;
}
diff --git a/Mage.Sets/src/mage/cards/e/ErgRaiders.java b/Mage.Sets/src/mage/cards/e/ErgRaiders.java
index fbf0ea92e35..01899e227c4 100644
--- a/Mage.Sets/src/mage/cards/e/ErgRaiders.java
+++ b/Mage.Sets/src/mage/cards/e/ErgRaiders.java
@@ -55,8 +55,8 @@ class ErgRaidersCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
Permanent raiders = game.getPermanentOrLKIBattlefield(source.getSourceId());
- AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
// wasControlledFromStartOfControllerTurn should be checked during resolution I guess, but shouldn't be relevant
- return raiders.wasControlledFromStartOfControllerTurn() && !watcher.getAttackedThisTurnCreatures().contains(new MageObjectReference(raiders, game));
+ return raiders != null &&raiders.wasControlledFromStartOfControllerTurn() && watcher != null && !watcher.getAttackedThisTurnCreatures().contains(new MageObjectReference(raiders, game));
}
}
diff --git a/Mage.Sets/src/mage/cards/e/ErrantMinion.java b/Mage.Sets/src/mage/cards/e/ErrantMinion.java
new file mode 100644
index 00000000000..53844a3a82d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/ErrantMinion.java
@@ -0,0 +1,121 @@
+package mage.cards.e;
+
+import java.util.UUID;
+import mage.constants.SubType;
+import mage.target.common.TargetCreaturePermanent;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.PreventDamageToTargetEffect;
+import mage.constants.Outcome;
+import mage.target.TargetPermanent;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class ErrantMinion extends CardImpl {
+
+ public ErrantMinion(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
+
+ this.subtype.add(SubType.AURA);
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // At the beginning of the upkeep of enchanted creature's controller, that player may pay any amount of mana. Errant Minion deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ Zone.BATTLEFIELD,
+ new ErrantMinionEffect(),
+ TargetController.CONTROLLER_ATTACHED_TO,
+ false));
+
+ }
+
+ private ErrantMinion(final ErrantMinion card) {
+ super(card);
+ }
+
+ @Override
+ public ErrantMinion copy() {
+ return new ErrantMinion(this);
+ }
+}
+
+class ErrantMinionEffect extends OneShotEffect {
+
+ public ErrantMinionEffect() {
+ super(Outcome.Damage);
+ this.staticText = "that player may pay any amount of mana. Errant Minion deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way";
+ }
+
+ public ErrantMinionEffect(final ErrantMinionEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ErrantMinionEffect copy() {
+ return new ErrantMinionEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent errantMinion = game.getPermanentOrLKIBattlefield(source.getSourceId());
+ if (errantMinion == null) {
+ return false;
+ }
+ Permanent enchantedCreature = game.getPermanentOrLKIBattlefield(errantMinion.getAttachedTo());
+ if (enchantedCreature == null) {
+ return false;
+ }
+ Player controllerOfEnchantedCreature = game.getPlayer(enchantedCreature.getControllerId());
+ if (controllerOfEnchantedCreature != null) {
+ int manaPaid = playerPaysXGenericMana(controllerOfEnchantedCreature, source, game);
+ PreventDamageToTargetEffect effect = new PreventDamageToTargetEffect(Duration.OneUse, manaPaid);
+ effect.setTargetPointer(new FixedTarget(controllerOfEnchantedCreature.getId()));
+ game.addEffect(effect, source);
+ DamageTargetEffect effect2 = new DamageTargetEffect(2);
+ effect2.setTargetPointer(new FixedTarget(controllerOfEnchantedCreature.getId()));
+ effect2.apply(game, source);
+ return true;
+ }
+ return false;
+ }
+
+ protected static int playerPaysXGenericMana(Player player, Ability source, Game game) {
+ int xValue = 0;
+ boolean payed = false;
+ while (!payed) {
+ xValue = player.announceXMana(0, Integer.MAX_VALUE, "How much mana will you pay?", game, source);
+ if (xValue > 0) {
+ Cost cost = new GenericManaCost(xValue);
+ payed = cost.pay(source, game, source.getSourceId(), player.getId(), false, null);
+ } else {
+ payed = true;
+ }
+ }
+ game.informPlayers(player.getLogName() + " pays {" + xValue + '}');
+ return xValue;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/e/EsperStormblade.java b/Mage.Sets/src/mage/cards/e/EsperStormblade.java
index a326fa966ca..04f376a441a 100644
--- a/Mage.Sets/src/mage/cards/e/EsperStormblade.java
+++ b/Mage.Sets/src/mage/cards/e/EsperStormblade.java
@@ -29,8 +29,8 @@ public final class EsperStormblade extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another multicolor permanent");
static {
- filter.add(new MulticoloredPredicate());
- filter.add(new AnotherPredicate());
+ filter.add(MulticoloredPredicate.instance);
+ filter.add(AnotherPredicate.instance);
}
public EsperStormblade(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EssenceCapture.java b/Mage.Sets/src/mage/cards/e/EssenceCapture.java
new file mode 100644
index 00000000000..7af749c4492
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/EssenceCapture.java
@@ -0,0 +1,43 @@
+package mage.cards.e;
+
+import mage.abilities.effects.common.CounterTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.counters.CounterType;
+import mage.filter.common.FilterCreatureSpell;
+import mage.target.TargetSpell;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.targetpointer.SecondTargetPointer;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class EssenceCapture extends CardImpl {
+
+ public EssenceCapture(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}{U}");
+
+ // Counter target creature spell.
+ this.getSpellAbility().addEffect(new CounterTargetEffect());
+ this.getSpellAbility().addTarget(new TargetSpell(new FilterCreatureSpell()));
+
+ // Put a +1/+1 counter on up to one target creature you control.
+ this.getSpellAbility().addEffect(new AddCountersTargetEffect(
+ CounterType.P1P1.createInstance()
+ ).setTargetPointer(new SecondTargetPointer()));
+ this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(0, 1));
+ }
+
+ private EssenceCapture(final EssenceCapture card) {
+ super(card);
+ }
+
+ @Override
+ public EssenceCapture copy() {
+ return new EssenceCapture(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/EssenceWarden.java b/Mage.Sets/src/mage/cards/e/EssenceWarden.java
index c66cb98aa79..d260fedbd5e 100644
--- a/Mage.Sets/src/mage/cards/e/EssenceWarden.java
+++ b/Mage.Sets/src/mage/cards/e/EssenceWarden.java
@@ -21,7 +21,7 @@ public final class EssenceWarden extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public EssenceWarden(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EstridTheMasked.java b/Mage.Sets/src/mage/cards/e/EstridTheMasked.java
index 9cc5c30fc42..25f0afb81c3 100644
--- a/Mage.Sets/src/mage/cards/e/EstridTheMasked.java
+++ b/Mage.Sets/src/mage/cards/e/EstridTheMasked.java
@@ -38,8 +38,8 @@ public final class EstridTheMasked extends CardImpl {
private static final FilterPermanent filter2 = new FilterPermanent("another permanent");
static {
- filter.add(new EnchantedPredicate());
- filter2.add(new AnotherPredicate());
+ filter.add(EnchantedPredicate.instance);
+ filter2.add(AnotherPredicate.instance);
}
public EstridTheMasked(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EtherealAbsolution.java b/Mage.Sets/src/mage/cards/e/EtherealAbsolution.java
new file mode 100644
index 00000000000..49bb668e5a1
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/EtherealAbsolution.java
@@ -0,0 +1,91 @@
+package mage.cards.e;
+
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.continuous.BoostOpponentsEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.game.permanent.token.WhiteBlackSpiritToken;
+import mage.players.Player;
+import mage.target.common.TargetCardInOpponentsGraveyard;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class EtherealAbsolution extends CardImpl {
+
+ public EtherealAbsolution(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{W}{B}");
+
+ // Creatures you control get +1/+1.
+ this.addAbility(new SimpleStaticAbility(
+ new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield)
+ ));
+
+ // Creatures your opponents control get -1/-1.
+ this.addAbility(new SimpleStaticAbility(
+ new BoostOpponentsEffect(-1, -1, Duration.WhileOnBattlefield)
+ ));
+
+ // {2}{W}{B}: Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying.
+ Ability ability = new SimpleActivatedAbility(
+ new EtherealAbsolutionEffect(), new ManaCostsImpl("{2}{W}{B}")
+ );
+ ability.addTarget(new TargetCardInOpponentsGraveyard(StaticFilters.FILTER_CARD));
+ this.addAbility(ability);
+ }
+
+ private EtherealAbsolution(final EtherealAbsolution card) {
+ super(card);
+ }
+
+ @Override
+ public EtherealAbsolution copy() {
+ return new EtherealAbsolution(this);
+ }
+}
+
+class EtherealAbsolutionEffect extends OneShotEffect {
+
+ EtherealAbsolutionEffect() {
+ super(Outcome.Benefit);
+ staticText = "Exile target card from an opponent's graveyard. " +
+ "If it was a creature card, you create a 1/1 white and black Spirit creature token with flying.";
+ }
+
+ private EtherealAbsolutionEffect(final EtherealAbsolutionEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public EtherealAbsolutionEffect copy() {
+ return new EtherealAbsolutionEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ Card card = game.getCard(source.getFirstTarget());
+ if (player == null || card == null) {
+ return false;
+ }
+ if (card.isCreature()) {
+ new CreateTokenEffect(new WhiteBlackSpiritToken()).apply(game, source);
+ }
+ return player.moveCards(card, Zone.EXILED, source, game);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/e/EtherswornCanonist.java b/Mage.Sets/src/mage/cards/e/EtherswornCanonist.java
index 8c0fa6561f1..754304f2e47 100644
--- a/Mage.Sets/src/mage/cards/e/EtherswornCanonist.java
+++ b/Mage.Sets/src/mage/cards/e/EtherswornCanonist.java
@@ -116,7 +116,7 @@ class EtherswornCanonistReplacementEffect extends ContinuousRuleModifyingEffectI
public boolean applies(GameEvent event, Ability source, Game game) {
Card card = game.getCard(event.getSourceId());
if (card != null && !card.isArtifact()) {
- EtherswornCanonistWatcher watcher = (EtherswornCanonistWatcher) game.getState().getWatchers().get(EtherswornCanonistWatcher.class.getSimpleName());
+ EtherswornCanonistWatcher watcher = game.getState().getWatcher(EtherswornCanonistWatcher.class);
return watcher != null && watcher.castNonArtifactSpell(event.getPlayerId());
}
return false;
diff --git a/Mage.Sets/src/mage/cards/e/EverflowingChalice.java b/Mage.Sets/src/mage/cards/e/EverflowingChalice.java
index 98755ba1972..256f062d985 100644
--- a/Mage.Sets/src/mage/cards/e/EverflowingChalice.java
+++ b/Mage.Sets/src/mage/cards/e/EverflowingChalice.java
@@ -33,7 +33,7 @@ public final class EverflowingChalice extends CardImpl {
// Everflowing Chalice enters the battlefield with a charge counter on it for each time it was kicked.
this.addAbility(new EntersBattlefieldAbility(
- new AddCountersSourceEffect(CounterType.CHARGE.createInstance(0), new MultikickerCount(), true),
+ new AddCountersSourceEffect(CounterType.CHARGE.createInstance(0), MultikickerCount.instance, true),
"with a charge counter on it for each time it was kicked"));
// {T}: Add {C} for each charge counter on Everflowing Chalice.
diff --git a/Mage.Sets/src/mage/cards/e/Everglades.java b/Mage.Sets/src/mage/cards/e/Everglades.java
index 13c7fb1c36d..8e2b3ceae0c 100644
--- a/Mage.Sets/src/mage/cards/e/Everglades.java
+++ b/Mage.Sets/src/mage/cards/e/Everglades.java
@@ -30,7 +30,7 @@ public final class Everglades extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.SWAMP));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public Everglades(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/ExavaRakdosBloodWitch.java b/Mage.Sets/src/mage/cards/e/ExavaRakdosBloodWitch.java
index 86225e14cb9..89feff77394 100644
--- a/Mage.Sets/src/mage/cards/e/ExavaRakdosBloodWitch.java
+++ b/Mage.Sets/src/mage/cards/e/ExavaRakdosBloodWitch.java
@@ -29,7 +29,7 @@ public final class ExavaRakdosBloodWitch extends CardImpl {
filter.add(new CardTypePredicate(CardType.CREATURE));
filter.add(new ControllerPredicate(TargetController.YOU));
filter.add(new CounterPredicate(CounterType.P1P1));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
static final String rule = "Each other creature you control with a +1/+1 counter on it has haste";
diff --git a/Mage.Sets/src/mage/cards/e/Excise.java b/Mage.Sets/src/mage/cards/e/Excise.java
index 119914cc3be..a232c410858 100644
--- a/Mage.Sets/src/mage/cards/e/Excise.java
+++ b/Mage.Sets/src/mage/cards/e/Excise.java
@@ -20,7 +20,7 @@ public final class Excise extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creature");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public Excise(UUID ownerId, CardSetInfo setInfo) {
@@ -28,7 +28,7 @@ public final class Excise extends CardImpl {
// Excise target nonwhite attacking creature unless its controller pays {X}.
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
- this.getSpellAbility().addEffect(new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new ExileTargetEffect(), new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new ExileTargetEffect(), ManacostVariableValue.instance));
}
public Excise(final Excise card) {
diff --git a/Mage.Sets/src/mage/cards/e/Excoriate.java b/Mage.Sets/src/mage/cards/e/Excoriate.java
index a015078ba52..fc376d02c18 100644
--- a/Mage.Sets/src/mage/cards/e/Excoriate.java
+++ b/Mage.Sets/src/mage/cards/e/Excoriate.java
@@ -19,7 +19,7 @@ public final class Excoriate extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public Excoriate(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/ExecutionersSwing.java b/Mage.Sets/src/mage/cards/e/ExecutionersSwing.java
index 668225ef536..dbcf5fd062d 100644
--- a/Mage.Sets/src/mage/cards/e/ExecutionersSwing.java
+++ b/Mage.Sets/src/mage/cards/e/ExecutionersSwing.java
@@ -56,7 +56,7 @@ class TargetCreaturePermanentThatDealtDamageThisTurn extends TargetPermanent {
@Override
public boolean canTarget(UUID id, Ability source, Game game) {
- SourceDidDamageWatcher watcher = (SourceDidDamageWatcher) game.getState().getWatchers().get(SourceDidDamageWatcher.class.getSimpleName());
+ SourceDidDamageWatcher watcher = game.getState().getWatcher(SourceDidDamageWatcher.class);
if (watcher != null) {
if (watcher.damageSources.contains(id)) {
return super.canTarget(id, source, game);
@@ -73,7 +73,7 @@ class TargetCreaturePermanentThatDealtDamageThisTurn extends TargetPermanent {
}
int count = 0;
MageObject targetSource = game.getObject(sourceId);
- SourceDidDamageWatcher watcher = (SourceDidDamageWatcher) game.getState().getWatchers().get(SourceDidDamageWatcher.class.getSimpleName());
+ SourceDidDamageWatcher watcher = game.getState().getWatcher(SourceDidDamageWatcher.class);
if (watcher != null && targetSource != null) {
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
if (!targets.containsKey(permanent.getId()) && watcher.damageSources.contains(permanent.getId())) {
@@ -93,7 +93,7 @@ class TargetCreaturePermanentThatDealtDamageThisTurn extends TargetPermanent {
public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
Set availablePossibleTargets = super.possibleTargets(sourceId, sourceControllerId, game);
Set possibleTargets = new HashSet<>();
- SourceDidDamageWatcher watcher = (SourceDidDamageWatcher) game.getState().getWatchers().get(SourceDidDamageWatcher.class.getSimpleName());
+ SourceDidDamageWatcher watcher = game.getState().getWatcher(SourceDidDamageWatcher.class);
if (watcher != null) {
for (UUID targetId : availablePossibleTargets) {
Permanent permanent = game.getPermanent(targetId);
diff --git a/Mage.Sets/src/mage/cards/e/Exile.java b/Mage.Sets/src/mage/cards/e/Exile.java
index 13067c94399..a8d28191980 100644
--- a/Mage.Sets/src/mage/cards/e/Exile.java
+++ b/Mage.Sets/src/mage/cards/e/Exile.java
@@ -29,7 +29,7 @@ public final class Exile extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonwhite attacking creature");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
filter.add(Predicates.not(new ColorPredicate(ObjectColor.WHITE)));
}
diff --git a/Mage.Sets/src/mage/cards/e/ExperimentKraj.java b/Mage.Sets/src/mage/cards/e/ExperimentKraj.java
index e45f52bd337..d4c20acec30 100644
--- a/Mage.Sets/src/mage/cards/e/ExperimentKraj.java
+++ b/Mage.Sets/src/mage/cards/e/ExperimentKraj.java
@@ -60,7 +60,7 @@ class ExperimentKrajEffect extends ContinuousEffectImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
filter.add(new CounterPredicate(CounterType.P1P1));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ExperimentKrajEffect() {
diff --git a/Mage.Sets/src/mage/cards/e/ExposeToDaylight.java b/Mage.Sets/src/mage/cards/e/ExposeToDaylight.java
new file mode 100644
index 00000000000..7de10992de1
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/ExposeToDaylight.java
@@ -0,0 +1,35 @@
+package mage.cards.e;
+
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.keyword.ScryEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.filter.StaticFilters;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ExposeToDaylight extends CardImpl {
+
+ public ExposeToDaylight(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}");
+
+ // Destroy target artifact or enchantment. Scry 1.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addEffect(new ScryEffect(1));
+ this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
+ }
+
+ private ExposeToDaylight(final ExposeToDaylight card) {
+ super(card);
+ }
+
+ @Override
+ public ExposeToDaylight copy() {
+ return new ExposeToDaylight(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/ExtractorDemon.java b/Mage.Sets/src/mage/cards/e/ExtractorDemon.java
index 651e5e955b6..0576b6b22e5 100644
--- a/Mage.Sets/src/mage/cards/e/ExtractorDemon.java
+++ b/Mage.Sets/src/mage/cards/e/ExtractorDemon.java
@@ -27,7 +27,7 @@ public final class ExtractorDemon extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ExtractorDemon(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/ExtricatorOfSin.java b/Mage.Sets/src/mage/cards/e/ExtricatorOfSin.java
index 1322d056ffa..90dfa5684c4 100644
--- a/Mage.Sets/src/mage/cards/e/ExtricatorOfSin.java
+++ b/Mage.Sets/src/mage/cards/e/ExtricatorOfSin.java
@@ -32,7 +32,7 @@ public final class ExtricatorOfSin extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another permanent");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ExtricatorOfSin(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/e/EyeOfTheStorm.java b/Mage.Sets/src/mage/cards/e/EyeOfTheStorm.java
index 2860e35ddf2..563fb12b5ca 100644
--- a/Mage.Sets/src/mage/cards/e/EyeOfTheStorm.java
+++ b/Mage.Sets/src/mage/cards/e/EyeOfTheStorm.java
@@ -1,7 +1,5 @@
-
package mage.cards.e;
-import java.util.UUID;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
@@ -23,8 +21,9 @@ import mage.target.TargetCard;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
+import java.util.UUID;
+
/**
- *
* @author spjspj
*/
public final class EyeOfTheStorm extends CardImpl {
@@ -111,7 +110,7 @@ class EyeOfTheStormEffect1 extends OneShotEffect {
Card card = spell.getCard();
if (spellController == null
|| card == null
- || !StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY.match(spell, game)) {
+ || !StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY.match(spell, game)) {
return false;
}
if (!noLongerOnStack) {// the spell is still on the stack, so exile it
@@ -125,11 +124,9 @@ class EyeOfTheStormEffect1 extends OneShotEffect {
&& !eyeOfTheStorm.getImprinted().isEmpty()) {
CardsImpl copiedCards = new CardsImpl();
for (UUID uuid : eyeOfTheStorm.getImprinted()) {
- card = game.getCard(uuid);
-
// Check if owner of card is still in game
- if (card != null
- && game.getPlayer(card.getOwnerId()) != null) {
+ card = game.getCard(uuid);
+ if (card != null && game.getPlayer(card.getOwnerId()) != null) {
if (card.isSplitCard()) {
copiedCards.add(((SplitCard) card).getLeftHalfCard());
copiedCards.add(((SplitCard) card).getRightHalfCard());
diff --git a/Mage.Sets/src/mage/cards/e/EyeOfUgin.java b/Mage.Sets/src/mage/cards/e/EyeOfUgin.java
index 67223f4db30..0fef45898fe 100644
--- a/Mage.Sets/src/mage/cards/e/EyeOfUgin.java
+++ b/Mage.Sets/src/mage/cards/e/EyeOfUgin.java
@@ -31,8 +31,8 @@ public final class EyeOfUgin extends CardImpl {
private static final FilterCard filterSpells = new FilterCard("Colorless Eldrazi spells");
static {
- filter.add(new ColorlessPredicate());
- filterSpells.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
+ filterSpells.add(ColorlessPredicate.instance);
filterSpells.add(new SubtypePredicate(SubType.ELDRAZI));
}
diff --git a/Mage.Sets/src/mage/cards/e/EyesEverywhere.java b/Mage.Sets/src/mage/cards/e/EyesEverywhere.java
new file mode 100644
index 00000000000..701e6ef5606
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/e/EyesEverywhere.java
@@ -0,0 +1,53 @@
+package mage.cards.e;
+
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.ExchangeControlTargetEffect;
+import mage.abilities.effects.keyword.ScryEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.target.common.TargetNonlandPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class EyesEverywhere extends CardImpl {
+
+ public EyesEverywhere(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
+
+ // At the beginning of your upkeep, scry 1.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ Zone.BATTLEFIELD, new ScryEffect(1),
+ TargetController.YOU, false
+ ));
+
+ // {5}{U}: Exchange control of Eyes Everywhere and target nonland permanent. Activate this ability only any time you could cast a sorcery.
+ Ability ability = new ActivateAsSorceryActivatedAbility(
+ Zone.BATTLEFIELD,
+ new ExchangeControlTargetEffect(
+ Duration.EndOfGame, "Exchange control of {this} " +
+ "and target nonland permanent", true
+ ), new ManaCostsImpl("{5}{U}")
+ );
+ ability.addTarget(new TargetNonlandPermanent());
+ this.addAbility(ability);
+ }
+
+ private EyesEverywhere(final EyesEverywhere card) {
+ super(card);
+ }
+
+ @Override
+ public EyesEverywhere copy() {
+ return new EyesEverywhere(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/e/EzuriClawOfProgress.java b/Mage.Sets/src/mage/cards/e/EzuriClawOfProgress.java
index 6ade1dc5b7e..ac296ce2ddb 100644
--- a/Mage.Sets/src/mage/cards/e/EzuriClawOfProgress.java
+++ b/Mage.Sets/src/mage/cards/e/EzuriClawOfProgress.java
@@ -31,7 +31,7 @@ public final class EzuriClawOfProgress extends CardImpl {
static {
filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
}
String rule = "Whenever a creature with power 2 or less enters the battlefield under your control, you get an experience counter.";
diff --git a/Mage.Sets/src/mage/cards/f/FacelessButcher.java b/Mage.Sets/src/mage/cards/f/FacelessButcher.java
index f44aec4ce8c..42bc86ffe65 100644
--- a/Mage.Sets/src/mage/cards/f/FacelessButcher.java
+++ b/Mage.Sets/src/mage/cards/f/FacelessButcher.java
@@ -30,7 +30,7 @@ public final class FacelessButcher extends CardImpl {
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
diff --git a/Mage.Sets/src/mage/cards/f/FacelessDevourer.java b/Mage.Sets/src/mage/cards/f/FacelessDevourer.java
index aa573b1fa10..4148034851d 100644
--- a/Mage.Sets/src/mage/cards/f/FacelessDevourer.java
+++ b/Mage.Sets/src/mage/cards/f/FacelessDevourer.java
@@ -30,7 +30,7 @@ public final class FacelessDevourer extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new AbilityPredicate(ShadowAbility.class));
}
diff --git a/Mage.Sets/src/mage/cards/f/FaerieArtisans.java b/Mage.Sets/src/mage/cards/f/FaerieArtisans.java
index db39e5549a3..f02fa39ba42 100644
--- a/Mage.Sets/src/mage/cards/f/FaerieArtisans.java
+++ b/Mage.Sets/src/mage/cards/f/FaerieArtisans.java
@@ -32,7 +32,7 @@ public final class FaerieArtisans extends CardImpl {
private static final FilterCreaturePermanent filterNontoken = new FilterCreaturePermanent("nontoken creature");
static {
- filterNontoken.add(Predicates.not(new TokenPredicate()));
+ filterNontoken.add(Predicates.not(TokenPredicate.instance));
filterNontoken.add(new ControllerPredicate(TargetController.OPPONENT));
}
diff --git a/Mage.Sets/src/mage/cards/f/FaerieDuelist.java b/Mage.Sets/src/mage/cards/f/FaerieDuelist.java
new file mode 100644
index 00000000000..25297814548
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FaerieDuelist.java
@@ -0,0 +1,50 @@
+package mage.cards.f;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.keyword.FlashAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.target.common.TargetOpponentsCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class FaerieDuelist extends CardImpl {
+
+ public FaerieDuelist(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
+
+ this.subtype.add(SubType.FAERIE);
+ this.subtype.add(SubType.ROGUE);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // Flash
+ this.addAbility(FlashAbility.getInstance());
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // When Faerie Duelist enters the battlefield, target creature an opponent controls gets -2/-0 until end of turn.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(-2, 0));
+ ability.addTarget(new TargetOpponentsCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ private FaerieDuelist(final FaerieDuelist card) {
+ super(card);
+ }
+
+ @Override
+ public FaerieDuelist copy() {
+ return new FaerieDuelist(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FaerieImpostor.java b/Mage.Sets/src/mage/cards/f/FaerieImpostor.java
index 1a4b526b131..f744e080133 100644
--- a/Mage.Sets/src/mage/cards/f/FaerieImpostor.java
+++ b/Mage.Sets/src/mage/cards/f/FaerieImpostor.java
@@ -58,7 +58,7 @@ class FaerieImpostorEffect extends OneShotEffect {
private static final String effectText = "sacrifice it unless you return another creature you control to its owner's hand";
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
FaerieImpostorEffect() {
diff --git a/Mage.Sets/src/mage/cards/f/FaerieMiscreant.java b/Mage.Sets/src/mage/cards/f/FaerieMiscreant.java
index bedb618045e..aa826d306aa 100644
--- a/Mage.Sets/src/mage/cards/f/FaerieMiscreant.java
+++ b/Mage.Sets/src/mage/cards/f/FaerieMiscreant.java
@@ -30,7 +30,7 @@ public final class FaerieMiscreant extends CardImpl {
static {
filter.add(new NamePredicate("Faerie Miscreant"));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/f/FailureComply.java b/Mage.Sets/src/mage/cards/f/FailureComply.java
index 1dc66399d62..e7cdbbc5fb0 100644
--- a/Mage.Sets/src/mage/cards/f/FailureComply.java
+++ b/Mage.Sets/src/mage/cards/f/FailureComply.java
@@ -37,7 +37,7 @@ public final class FailureComply extends SplitCard {
// to
// Comply
// Choose a card name. Until your next turn, your opponents can't cast spells with the chosen name
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
Effect effect = new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL);
effect.setText("Choose a card name");
getRightHalfCard().getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/f/FairgroundsTrumpeter.java b/Mage.Sets/src/mage/cards/f/FairgroundsTrumpeter.java
index 8a4959443ba..da246d46243 100644
--- a/Mage.Sets/src/mage/cards/f/FairgroundsTrumpeter.java
+++ b/Mage.Sets/src/mage/cards/f/FairgroundsTrumpeter.java
@@ -57,7 +57,7 @@ enum FairgroundsTrumpeterCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- FairgroundsTrumpeterWatcher watcher = (FairgroundsTrumpeterWatcher) game.getState().getWatchers().get(FairgroundsTrumpeterWatcher.class.getSimpleName());
+ FairgroundsTrumpeterWatcher watcher = game.getState().getWatcher(FairgroundsTrumpeterWatcher.class);
return watcher != null && watcher.p1p1AddedToPermanent(source.getControllerId());
}
diff --git a/Mage.Sets/src/mage/cards/f/FaithsReward.java b/Mage.Sets/src/mage/cards/f/FaithsReward.java
index cf449635657..1987daeffbe 100644
--- a/Mage.Sets/src/mage/cards/f/FaithsReward.java
+++ b/Mage.Sets/src/mage/cards/f/FaithsReward.java
@@ -57,7 +57,7 @@ class FaithsRewardEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- FaithsRewardWatcher watcher = (FaithsRewardWatcher) game.getState().getWatchers().get(FaithsRewardWatcher.class.getSimpleName());
+ FaithsRewardWatcher watcher = game.getState().getWatcher(FaithsRewardWatcher.class);
if (watcher != null) {
for (UUID id : watcher.cards) {
Card c = game.getCard(id);
@@ -80,7 +80,7 @@ class FaithsRewardWatcher extends Watcher {
List cards = new ArrayList<>();
public FaithsRewardWatcher() {
- super(FaithsRewardWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(FaithsRewardWatcher.class, WatcherScope.GAME);
}
public FaithsRewardWatcher(final FaithsRewardWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/f/FallOfTheTitans.java b/Mage.Sets/src/mage/cards/f/FallOfTheTitans.java
index 71a44fc473f..1b45b0e00f7 100644
--- a/Mage.Sets/src/mage/cards/f/FallOfTheTitans.java
+++ b/Mage.Sets/src/mage/cards/f/FallOfTheTitans.java
@@ -21,7 +21,7 @@ public final class FallOfTheTitans extends CardImpl {
// Fall of the Titans deals X damage to each of up to two target creatures and/or players.
this.getSpellAbility().addTarget(new TargetAnyTarget(0, 2));
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
// Surge {X}{R}
addAbility(new SurgeAbility(this, "{X}{R}"));
diff --git a/Mage.Sets/src/mage/cards/f/FallingTimber.java b/Mage.Sets/src/mage/cards/f/FallingTimber.java
index 90a39c76143..492c7e6f343 100644
--- a/Mage.Sets/src/mage/cards/f/FallingTimber.java
+++ b/Mage.Sets/src/mage/cards/f/FallingTimber.java
@@ -1,4 +1,3 @@
-
package mage.cards.f;
import java.util.UUID;
@@ -16,38 +15,30 @@ import mage.filter.common.FilterControlledLandPermanent;
import mage.game.Game;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
* @author LoneFox
-
+ *
*/
public final class FallingTimber extends CardImpl {
- private final UUID originalId;
-
public FallingTimber(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}");
// Kicker-Sacrifice a land.
this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, new FilterControlledLandPermanent("a land"), true))));
+
// Prevent all combat damage target creature would deal this turn. If Falling Timber was kicked, prevent all combat damage another target creature would deal this turn.
Effect effect = new PreventDamageByTargetEffect(Duration.EndOfTurn, true);
effect.setText("Prevent all combat damage target creature would deal this turn. if this spell was kicked, prevent all combat damage another target creature would deal this turn.");
this.getSpellAbility().addEffect(effect);
- originalId = this.getSpellAbility().getOriginalId();
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if(ability.getOriginalId().equals(originalId)) {
- ability.addTarget(new TargetCreaturePermanent(KickedCondition.instance.apply(game, ability) ? 2 : 1));
- }
+ this.getSpellAbility().setTargetAdjuster(FallingTimberAdjuster.instance);
}
public FallingTimber(final FallingTimber card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -55,3 +46,13 @@ public final class FallingTimber extends CardImpl {
return new FallingTimber(this);
}
}
+
+enum FallingTimberAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanent(KickedCondition.instance.apply(game, ability) ? 2 : 1));
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FalseOrders.java b/Mage.Sets/src/mage/cards/f/FalseOrders.java
index f4c8066db61..7a3279720b0 100644
--- a/Mage.Sets/src/mage/cards/f/FalseOrders.java
+++ b/Mage.Sets/src/mage/cards/f/FalseOrders.java
@@ -104,7 +104,7 @@ class FalseOrdersUnblockEffect extends OneShotEffect {
effect.apply(game, source);
// Make blocked creatures unblocked
- BlockedByOnlyOneCreatureThisCombatWatcher watcher = (BlockedByOnlyOneCreatureThisCombatWatcher) game.getState().getWatchers().get(BlockedByOnlyOneCreatureThisCombatWatcher.class.getSimpleName());
+ BlockedByOnlyOneCreatureThisCombatWatcher watcher = game.getState().getWatcher(BlockedByOnlyOneCreatureThisCombatWatcher.class);
if (watcher != null) {
Set combatGroups = watcher.getBlockedOnlyByCreature(permanent.getId());
if (combatGroups != null) {
diff --git a/Mage.Sets/src/mage/cards/f/FangOfThePack.java b/Mage.Sets/src/mage/cards/f/FangOfThePack.java
index 71cda8c6bd9..353b13f54e1 100644
--- a/Mage.Sets/src/mage/cards/f/FangOfThePack.java
+++ b/Mage.Sets/src/mage/cards/f/FangOfThePack.java
@@ -26,7 +26,7 @@ public final class FangOfThePack extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FangOfThePack(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FanningTheFlames.java b/Mage.Sets/src/mage/cards/f/FanningTheFlames.java
index 4fe03dc2dac..e7d224f7e5f 100644
--- a/Mage.Sets/src/mage/cards/f/FanningTheFlames.java
+++ b/Mage.Sets/src/mage/cards/f/FanningTheFlames.java
@@ -23,7 +23,7 @@ public final class FanningTheFlames extends CardImpl {
this.addAbility(new BuybackAbility("{3}"));
// Fanning the Flames deals X damage to any target.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetAnyTarget());
}
diff --git a/Mage.Sets/src/mage/cards/f/FarmMarket.java b/Mage.Sets/src/mage/cards/f/FarmMarket.java
index 3b280cd7845..53c665b919e 100644
--- a/Mage.Sets/src/mage/cards/f/FarmMarket.java
+++ b/Mage.Sets/src/mage/cards/f/FarmMarket.java
@@ -28,7 +28,7 @@ public final class FarmMarket extends SplitCard {
// Market {2}{U}
// Sorcery
// Aftermath
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Draw two cards, then discard two cards
getRightHalfCard().getSpellAbility().addEffect(new DrawDiscardControllerEffect(2, 2));
diff --git a/Mage.Sets/src/mage/cards/f/Fascination.java b/Mage.Sets/src/mage/cards/f/Fascination.java
index d53a9219841..e3aa3f389d9 100644
--- a/Mage.Sets/src/mage/cards/f/Fascination.java
+++ b/Mage.Sets/src/mage/cards/f/Fascination.java
@@ -22,11 +22,11 @@ public final class Fascination extends CardImpl {
// Choose one -
// * Each player draws X cards.
- this.getSpellAbility().addEffect(new DrawCardAllEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DrawCardAllEffect(ManacostVariableValue.instance));
// * Each player puts the top X cards of their library into their graveyard.
Mode mode = new Mode();
- mode.addEffect(new PutTopCardOfLibraryIntoGraveEachPlayerEffect(new ManacostVariableValue(), TargetController.ANY));
+ mode.addEffect(new PutTopCardOfLibraryIntoGraveEachPlayerEffect(ManacostVariableValue.instance, TargetController.ANY));
this.getSpellAbility().addMode(mode);
}
diff --git a/Mage.Sets/src/mage/cards/f/FatalFrenzy.java b/Mage.Sets/src/mage/cards/f/FatalFrenzy.java
index a3e9ebd5d32..6b074158208 100644
--- a/Mage.Sets/src/mage/cards/f/FatalFrenzy.java
+++ b/Mage.Sets/src/mage/cards/f/FatalFrenzy.java
@@ -35,7 +35,7 @@ public final class FatalFrenzy extends CardImpl {
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)
.setText("Until end of turn, target creature you control gains trample")
);
- this.getSpellAbility().addEffect(new BoostTargetEffect(new TargetPermanentPowerCount(), new StaticValue(0), Duration.EndOfTurn, true)
+ this.getSpellAbility().addEffect(new BoostTargetEffect(TargetPermanentPowerCount.instance, new StaticValue(0), Duration.EndOfTurn, true)
.setText("and gets +X/+0, where X is its power.")
);
this.getSpellAbility().addEffect(new FatalFrenzyEffect());
diff --git a/Mage.Sets/src/mage/cards/f/FatefulShowdown.java b/Mage.Sets/src/mage/cards/f/FatefulShowdown.java
index 02b4db6762f..11f60f05011 100644
--- a/Mage.Sets/src/mage/cards/f/FatefulShowdown.java
+++ b/Mage.Sets/src/mage/cards/f/FatefulShowdown.java
@@ -21,7 +21,7 @@ public final class FatefulShowdown extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{R}{R}");
// Fateful Showdown deals damage to any target equal to the number of cards in your hand. Discard all the cards in your hand, then draw that many cards.
- Effect effect = new DamageTargetEffect(new CardsInControllerHandCount());
+ Effect effect = new DamageTargetEffect(CardsInControllerHandCount.instance);
effect.setText("{this} deals damage to any target equal to the number of cards in your hand");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetAnyTarget());
diff --git a/Mage.Sets/src/mage/cards/f/Fatestitcher.java b/Mage.Sets/src/mage/cards/f/Fatestitcher.java
index dc642fbbbf4..aec4bcc54a7 100644
--- a/Mage.Sets/src/mage/cards/f/Fatestitcher.java
+++ b/Mage.Sets/src/mage/cards/f/Fatestitcher.java
@@ -26,7 +26,7 @@ public final class Fatestitcher extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("another target permanent");
static{
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public Fatestitcher(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FathomFleetBoarder.java b/Mage.Sets/src/mage/cards/f/FathomFleetBoarder.java
index 90c40439fae..c697a74221e 100644
--- a/Mage.Sets/src/mage/cards/f/FathomFleetBoarder.java
+++ b/Mage.Sets/src/mage/cards/f/FathomFleetBoarder.java
@@ -26,7 +26,7 @@ public final class FathomFleetBoarder extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.PIRATE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FathomFleetBoarder(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FathomFleetCaptain.java b/Mage.Sets/src/mage/cards/f/FathomFleetCaptain.java
index d4f6bf40264..ba624da7933 100644
--- a/Mage.Sets/src/mage/cards/f/FathomFleetCaptain.java
+++ b/Mage.Sets/src/mage/cards/f/FathomFleetCaptain.java
@@ -31,8 +31,8 @@ public final class FathomFleetCaptain extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.PIRATE));
- filter.add(new AnotherPredicate());
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public FathomFleetCaptain(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FeastOfDreams.java b/Mage.Sets/src/mage/cards/f/FeastOfDreams.java
index 96f547e448d..b42e154268b 100644
--- a/Mage.Sets/src/mage/cards/f/FeastOfDreams.java
+++ b/Mage.Sets/src/mage/cards/f/FeastOfDreams.java
@@ -22,7 +22,7 @@ public final class FeastOfDreams extends CardImpl {
static {
filter.add(Predicates.or(
- new EnchantedPredicate(),
+ EnchantedPredicate.instance,
new CardTypePredicate(CardType.ENCHANTMENT)
));
}
diff --git a/Mage.Sets/src/mage/cards/f/FeastOnTheFallen.java b/Mage.Sets/src/mage/cards/f/FeastOnTheFallen.java
index 22d1800804d..78c8edfd69e 100644
--- a/Mage.Sets/src/mage/cards/f/FeastOnTheFallen.java
+++ b/Mage.Sets/src/mage/cards/f/FeastOnTheFallen.java
@@ -54,10 +54,10 @@ enum FeastOnTheFallenCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
+ PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class);
if (watcher != null) {
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
- if (watcher.getLiveLostLastTurn(opponentId) > 0) {
+ if (watcher.getLifeLostLastTurn(opponentId) > 0) {
return true;
}
}
diff --git a/Mage.Sets/src/mage/cards/f/FeedThePack.java b/Mage.Sets/src/mage/cards/f/FeedThePack.java
index 24957df34a6..181022e5ef0 100644
--- a/Mage.Sets/src/mage/cards/f/FeedThePack.java
+++ b/Mage.Sets/src/mage/cards/f/FeedThePack.java
@@ -48,7 +48,7 @@ class FeedThePackEffect extends OneShotEffect {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public FeedThePackEffect() {
diff --git a/Mage.Sets/src/mage/cards/f/Feint.java b/Mage.Sets/src/mage/cards/f/Feint.java
new file mode 100644
index 00000000000..bccd33ddceb
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/Feint.java
@@ -0,0 +1,85 @@
+
+package mage.cards.f;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.PreventionEffect;
+import mage.abilities.effects.common.PreventDamageByTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.game.combat.CombatGroup;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetAttackingCreature;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author L_J
+ */
+public final class Feint extends CardImpl {
+
+ public Feint(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{R}");
+
+ // Tap all creatures blocking target attacking creature. Prevent all combat damage that would be dealt this turn by that creature and each creature blocking it.
+ this.getSpellAbility().addEffect(new PreventDamageByTargetEffect(Duration.EndOfTurn, true).setText(""));
+ this.getSpellAbility().addEffect(new FeintEffect());
+ this.getSpellAbility().addTarget(new TargetAttackingCreature());
+ }
+
+ public Feint(final Feint card) {
+ super(card);
+ }
+
+ @Override
+ public Feint copy() {
+ return new Feint(this);
+ }
+
+}
+
+class FeintEffect extends OneShotEffect {
+
+ public FeintEffect() {
+ super(Outcome.ReturnToHand);
+ this.staticText = "Tap all creatures blocking target attacking creature. Prevent all combat damage that would be dealt this turn by that creature and each creature blocking it";
+ }
+
+ public FeintEffect(final FeintEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FeintEffect copy() {
+ return new FeintEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (controller != null && creature != null) {
+ for (CombatGroup combatGroup : game.getCombat().getGroups()) {
+ if (combatGroup.getAttackers().contains(creature.getId())) {
+ for (UUID blockerId : combatGroup.getBlockers()) {
+ Permanent blocker = game.getPermanent(blockerId);
+ if (blocker != null) {
+ blocker.tap(game);
+ PreventionEffect effect = new PreventDamageByTargetEffect(Duration.EndOfTurn, true);
+ effect.setTargetPointer(new FixedTarget(blocker.getId()));
+ game.addEffect(effect, source);
+ }
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FelhideBrawler.java b/Mage.Sets/src/mage/cards/f/FelhideBrawler.java
index 03b687ceadb..119599817eb 100644
--- a/Mage.Sets/src/mage/cards/f/FelhideBrawler.java
+++ b/Mage.Sets/src/mage/cards/f/FelhideBrawler.java
@@ -24,7 +24,7 @@ public final class FelhideBrawler extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.MINOTAUR));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FelhideBrawler(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FelhideSpiritbinder.java b/Mage.Sets/src/mage/cards/f/FelhideSpiritbinder.java
index 2360250bd87..4b7c6561837 100644
--- a/Mage.Sets/src/mage/cards/f/FelhideSpiritbinder.java
+++ b/Mage.Sets/src/mage/cards/f/FelhideSpiritbinder.java
@@ -33,7 +33,7 @@ public final class FelhideSpiritbinder extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FelhideSpiritbinder(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FelidarGuardian.java b/Mage.Sets/src/mage/cards/f/FelidarGuardian.java
index 9931f38d368..cbd687eea89 100644
--- a/Mage.Sets/src/mage/cards/f/FelidarGuardian.java
+++ b/Mage.Sets/src/mage/cards/f/FelidarGuardian.java
@@ -25,7 +25,7 @@ public final class FelidarGuardian extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another target permanent you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FelidarGuardian(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FellShepherd.java b/Mage.Sets/src/mage/cards/f/FellShepherd.java
index 626237217f5..44f9007fe64 100644
--- a/Mage.Sets/src/mage/cards/f/FellShepherd.java
+++ b/Mage.Sets/src/mage/cards/f/FellShepherd.java
@@ -65,7 +65,7 @@ class FellShepherdWatcher extends Watcher {
private Set creatureIds = new HashSet<>();
public FellShepherdWatcher() {
- super(FellShepherdWatcher.class.getSimpleName(), WatcherScope.PLAYER);
+ super(FellShepherdWatcher.class, WatcherScope.PLAYER);
condition = true;
}
@@ -118,7 +118,7 @@ class FellShepherdEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- FellShepherdWatcher watcher = (FellShepherdWatcher) game.getState().getWatchers().get(FellShepherdWatcher.class.getSimpleName(), source.getControllerId());
+ FellShepherdWatcher watcher = game.getState().getWatcher(FellShepherdWatcher.class, source.getControllerId());
if (watcher != null) {
StringBuilder sb = new StringBuilder();
for (UUID creatureId : watcher.getCreaturesIds()) {
diff --git a/Mage.Sets/src/mage/cards/f/FenStalker.java b/Mage.Sets/src/mage/cards/f/FenStalker.java
index d0e606cb071..e1821d199b6 100644
--- a/Mage.Sets/src/mage/cards/f/FenStalker.java
+++ b/Mage.Sets/src/mage/cards/f/FenStalker.java
@@ -28,7 +28,7 @@ public final class FenStalker extends CardImpl {
private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent();
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public FenStalker(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FencersMagemark.java b/Mage.Sets/src/mage/cards/f/FencersMagemark.java
index 593ad6407cb..60aad9afb0b 100644
--- a/Mage.Sets/src/mage/cards/f/FencersMagemark.java
+++ b/Mage.Sets/src/mage/cards/f/FencersMagemark.java
@@ -27,7 +27,7 @@ public final class FencersMagemark extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control that are enchanted");
static {
- filter.add(new EnchantedPredicate());
+ filter.add(EnchantedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/f/FeralMaaka.java b/Mage.Sets/src/mage/cards/f/FeralMaaka.java
new file mode 100644
index 00000000000..fabc1d3d6fb
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FeralMaaka.java
@@ -0,0 +1,32 @@
+package mage.cards.f;
+
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class FeralMaaka extends CardImpl {
+
+ public FeralMaaka(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
+
+ this.subtype.add(SubType.CAT);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+ }
+
+ private FeralMaaka(final FeralMaaka card) {
+ super(card);
+ }
+
+ @Override
+ public FeralMaaka copy() {
+ return new FeralMaaka(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FestivalOfTheGuildpact.java b/Mage.Sets/src/mage/cards/f/FestivalOfTheGuildpact.java
index 414368c1abb..be5027f5187 100644
--- a/Mage.Sets/src/mage/cards/f/FestivalOfTheGuildpact.java
+++ b/Mage.Sets/src/mage/cards/f/FestivalOfTheGuildpact.java
@@ -20,7 +20,7 @@ public final class FestivalOfTheGuildpact extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{W}");
// Prevent the next X damage that would be dealt to you this turn.
- this.getSpellAbility().addEffect(new PreventDamageToControllerEffect(Duration.EndOfTurn, false, true, new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new PreventDamageToControllerEffect(Duration.EndOfTurn, false, true, ManacostVariableValue.instance));
// Draw a card.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
diff --git a/Mage.Sets/src/mage/cards/f/Fettergeist.java b/Mage.Sets/src/mage/cards/f/Fettergeist.java
index 63082827305..cb52e0ad48b 100644
--- a/Mage.Sets/src/mage/cards/f/Fettergeist.java
+++ b/Mage.Sets/src/mage/cards/f/Fettergeist.java
@@ -56,7 +56,7 @@ class FettergeistUnlessPaysEffect extends OneShotEffect {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FettergeistUnlessPaysEffect() {
diff --git a/Mage.Sets/src/mage/cards/f/FickleEfreet.java b/Mage.Sets/src/mage/cards/f/FickleEfreet.java
index 3d0cf974d48..4e67afe38fa 100644
--- a/Mage.Sets/src/mage/cards/f/FickleEfreet.java
+++ b/Mage.Sets/src/mage/cards/f/FickleEfreet.java
@@ -71,7 +71,7 @@ class FickleEfreetChangeControlEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
if (controller != null) {
- if (!controller.flipCoin(game)) {
+ if (!controller.flipCoin(source, game, true)) {
if (sourcePermanent != null) {
Target target = new TargetOpponent(true);
if (target.canChoose(source.getSourceId(), controller.getId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/f/FieldOfSouls.java b/Mage.Sets/src/mage/cards/f/FieldOfSouls.java
index 3389be54d9a..16dd2e04da1 100644
--- a/Mage.Sets/src/mage/cards/f/FieldOfSouls.java
+++ b/Mage.Sets/src/mage/cards/f/FieldOfSouls.java
@@ -23,7 +23,7 @@ public final class FieldOfSouls extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static{
filter.add(new OwnerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public FieldOfSouls(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FieldSurgeon.java b/Mage.Sets/src/mage/cards/f/FieldSurgeon.java
index 7931385c8e3..93b62fb1f88 100644
--- a/Mage.Sets/src/mage/cards/f/FieldSurgeon.java
+++ b/Mage.Sets/src/mage/cards/f/FieldSurgeon.java
@@ -28,7 +28,7 @@ public final class FieldSurgeon extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public FieldSurgeon(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FiendBinder.java b/Mage.Sets/src/mage/cards/f/FiendBinder.java
index 64a65b75064..1cbc7e0cc79 100644
--- a/Mage.Sets/src/mage/cards/f/FiendBinder.java
+++ b/Mage.Sets/src/mage/cards/f/FiendBinder.java
@@ -22,7 +22,7 @@ public final class FiendBinder extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
static {
- filter.add(new DefendingPlayerControlsPredicate());
+ filter.add(DefendingPlayerControlsPredicate.instance);
}
public FiendBinder(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FiendHunter.java b/Mage.Sets/src/mage/cards/f/FiendHunter.java
index c1ab64d1b23..bd868bf9c8d 100644
--- a/Mage.Sets/src/mage/cards/f/FiendHunter.java
+++ b/Mage.Sets/src/mage/cards/f/FiendHunter.java
@@ -25,7 +25,7 @@ public final class FiendHunter extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FiendHunter(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FiendslayerPaladin.java b/Mage.Sets/src/mage/cards/f/FiendslayerPaladin.java
index 3749823252d..e1a9eb05d94 100644
--- a/Mage.Sets/src/mage/cards/f/FiendslayerPaladin.java
+++ b/Mage.Sets/src/mage/cards/f/FiendslayerPaladin.java
@@ -94,7 +94,7 @@ class FiendslayerPaladinEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
Card targetCard = game.getCard(event.getTargetId());
- StackObject stackObject = (StackObject) game.getStack().getStackObject(event.getSourceId());
+ StackObject stackObject = game.getStack().getStackObject(event.getSourceId());
if (targetCard != null && stackObject != null && targetCard.getId().equals(source.getSourceId())) {
if (stackObject.getColor(game).isBlack() || stackObject.getColor(game).isRed()) {
if (!stackObject.isControlledBy(source.getControllerId())
diff --git a/Mage.Sets/src/mage/cards/f/FieryGambit.java b/Mage.Sets/src/mage/cards/f/FieryGambit.java
index 3a5ab06bdf3..36177cf86d1 100644
--- a/Mage.Sets/src/mage/cards/f/FieryGambit.java
+++ b/Mage.Sets/src/mage/cards/f/FieryGambit.java
@@ -64,7 +64,7 @@ class FieryGambitEffect extends OneShotEffect {
if (controller != null && sourceObject != null) {
int flipsWon = 0;
boolean controllerStopped = false;
- while (controller.flipCoin(game)) {
+ while (controller.flipCoin(source, game, true)) {
++flipsWon;
if (!controller.chooseUse(outcome, "You won " + flipsWon + (flipsWon == 1 ? " flip." : " flips.") +
" Flip another coin?", source, game)) {
diff --git a/Mage.Sets/src/mage/cards/f/FightToTheDeath.java b/Mage.Sets/src/mage/cards/f/FightToTheDeath.java
index 7f958784000..b0b1ec365d7 100644
--- a/Mage.Sets/src/mage/cards/f/FightToTheDeath.java
+++ b/Mage.Sets/src/mage/cards/f/FightToTheDeath.java
@@ -21,8 +21,8 @@ public final class FightToTheDeath extends CardImpl {
static {
filter.add(Predicates.or(
- new BlockingPredicate(),
- new BlockedPredicate()));
+ BlockingPredicate.instance,
+ BlockedPredicate.instance));
}
public FightToTheDeath(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FightWithFire.java b/Mage.Sets/src/mage/cards/f/FightWithFire.java
index ebad07ad966..67b7b683a84 100644
--- a/Mage.Sets/src/mage/cards/f/FightWithFire.java
+++ b/Mage.Sets/src/mage/cards/f/FightWithFire.java
@@ -1,9 +1,7 @@
-
package mage.cards.f;
import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.DamageMultiEffect;
@@ -16,6 +14,7 @@ import mage.game.Game;
import mage.target.common.TargetAnyTarget;
import mage.target.common.TargetAnyTargetAmount;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
@@ -39,26 +38,29 @@ public final class FightWithFire extends CardImpl {
+ " (Those targets can include players and planeswalkers.)"
));
this.getSpellAbility().addTarget(new TargetAnyTarget());
+ this.getSpellAbility().setTargetAdjuster(FightWithFireAdjuster.instance);
}
public FightWithFire(final FightWithFire card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- ability.getTargets().clear();
- if (ability instanceof SpellAbility) {
- if (KickedCondition.instance.apply(game, ability)) {
- ability.addTarget(new TargetAnyTargetAmount(10));
- } else {
- ability.addTarget(new TargetCreaturePermanent());
- }
- }
- }
-
@Override
public FightWithFire copy() {
return new FightWithFire(this);
}
}
+
+enum FightWithFireAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.addTarget(new TargetAnyTargetAmount(10));
+ } else {
+ ability.addTarget(new TargetCreaturePermanent());
+ }
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FightingChance.java b/Mage.Sets/src/mage/cards/f/FightingChance.java
index 896e01dcfea..d67bef03c3d 100644
--- a/Mage.Sets/src/mage/cards/f/FightingChance.java
+++ b/Mage.Sets/src/mage/cards/f/FightingChance.java
@@ -61,7 +61,7 @@ class FightingChanceEffect extends OneShotEffect {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
for (UUID blocker : game.getCombat().getBlockers()) {
- if (player.flipCoin(game)) {
+ if (player.flipCoin(source, game, true)) {
PreventDamageByTargetEffect effect = new PreventDamageByTargetEffect(Duration.EndOfTurn, true);
effect.setTargetPointer(new FixedTarget(blocker));
game.addEffect(effect, source);
diff --git a/Mage.Sets/src/mage/cards/f/FinalParting.java b/Mage.Sets/src/mage/cards/f/FinalParting.java
index 76239b9c4bb..132b8f9f257 100644
--- a/Mage.Sets/src/mage/cards/f/FinalParting.java
+++ b/Mage.Sets/src/mage/cards/f/FinalParting.java
@@ -69,7 +69,7 @@ class FinalPartingEffect extends OneShotEffect {
if (controller.searchLibrary(target, game)) {
if (!target.getTargets().isEmpty()) {
Cards searched = new CardsImpl();
- for (UUID cardId : (List) target.getTargets()) {
+ for (UUID cardId : target.getTargets()) {
Card card = controller.getLibrary().getCard(cardId, game);
searched.add(card);
}
diff --git a/Mage.Sets/src/mage/cards/f/FinalPayment.java b/Mage.Sets/src/mage/cards/f/FinalPayment.java
new file mode 100644
index 00000000000..22486309c38
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FinalPayment.java
@@ -0,0 +1,60 @@
+package mage.cards.f;
+
+import java.util.UUID;
+
+import mage.abilities.costs.AlternativeCostSourceAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.OptionalAdditionalCost;
+import mage.abilities.costs.OrCost;
+import mage.abilities.costs.common.PayLifeCost;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesToughness;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetOpponentsCreaturePermanent;
+
+/**
+ *
+ * @author FateRevoked
+ */
+public final class FinalPayment extends CardImpl {
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("a creature or enchantment");
+
+ static {
+ filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.ENCHANTMENT)));
+ }
+
+ public FinalPayment(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}{B}");
+
+ // As an additional cost to cast this spell, pay 5 life or sacrifice a creature or enchantment.
+ final Cost lifeCost = new PayLifeCost(5);
+ final Cost sacrificeCost = new SacrificeTargetCost(new TargetControlledPermanent(filter));
+
+ this.getSpellAbility().addCost(new OrCost(lifeCost, sacrificeCost,
+ "pay 5 life or sacrifice a creature or enchantment"));
+
+ // Destroy target creature
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ public FinalPayment(final FinalPayment card) {
+ super(card);
+ }
+
+ @Override
+ public FinalPayment copy() {
+ return new FinalPayment(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FinalPunishment.java b/Mage.Sets/src/mage/cards/f/FinalPunishment.java
index f4dc817ccc2..abf048a6360 100644
--- a/Mage.Sets/src/mage/cards/f/FinalPunishment.java
+++ b/Mage.Sets/src/mage/cards/f/FinalPunishment.java
@@ -45,7 +45,7 @@ class FinalPunishmentAmount implements DynamicValue {
@Override
public int calculate(Game game, Ability source, Effect effect) {
AmountOfDamageAPlayerReceivedThisTurnWatcher watcher
- = (AmountOfDamageAPlayerReceivedThisTurnWatcher) game.getState().getWatchers().get(AmountOfDamageAPlayerReceivedThisTurnWatcher.class.getSimpleName());
+ = game.getState().getWatcher(AmountOfDamageAPlayerReceivedThisTurnWatcher.class);
if(watcher != null) {
return watcher.getAmountOfDamageReceivedThisTurn(source.getFirstTarget());
}
diff --git a/Mage.Sets/src/mage/cards/f/FinalStrike.java b/Mage.Sets/src/mage/cards/f/FinalStrike.java
index 4cd4c7f1670..6881b640206 100644
--- a/Mage.Sets/src/mage/cards/f/FinalStrike.java
+++ b/Mage.Sets/src/mage/cards/f/FinalStrike.java
@@ -26,7 +26,7 @@ public final class FinalStrike extends CardImpl {
this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT)));
// Final Strike deals damage to target opponent equal to the sacrificed creature's power.
- Effect effect = new DamageTargetEffect(new SacrificeCostCreaturesPower());
+ Effect effect = new DamageTargetEffect(SacrificeCostCreaturesPower.instance);
effect.setText("{this} deals damage to target opponent or planeswalker equal to the sacrificed creature's power");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetOpponentOrPlaneswalker());
diff --git a/Mage.Sets/src/mage/cards/f/Finn.java b/Mage.Sets/src/mage/cards/f/Finn.java
index b4429e90ae7..6408b55ac2c 100644
--- a/Mage.Sets/src/mage/cards/f/Finn.java
+++ b/Mage.Sets/src/mage/cards/f/Finn.java
@@ -28,7 +28,7 @@ public final class Finn extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public Finn(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FireAndBrimstone.java b/Mage.Sets/src/mage/cards/f/FireAndBrimstone.java
index 72ce9e2c9dd..92e9f2cf2a1 100644
--- a/Mage.Sets/src/mage/cards/f/FireAndBrimstone.java
+++ b/Mage.Sets/src/mage/cards/f/FireAndBrimstone.java
@@ -59,7 +59,7 @@ class FireAndBrimstonePredicate extends PlayerPredicate {
if (player == null || playerId == null) {
return false;
}
- AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
if (watcher != null) {
if (!watcher.getAttackedThisTurnCreatures().isEmpty()) {
return player.getId().equals(game.getActivePlayerId());
diff --git a/Mage.Sets/src/mage/cards/f/FireAnts.java b/Mage.Sets/src/mage/cards/f/FireAnts.java
index 208565fb1bc..a8bed48f784 100644
--- a/Mage.Sets/src/mage/cards/f/FireAnts.java
+++ b/Mage.Sets/src/mage/cards/f/FireAnts.java
@@ -27,7 +27,7 @@ public final class FireAnts extends CardImpl {
static {
filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class)));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FireAnts(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FireAtWill.java b/Mage.Sets/src/mage/cards/f/FireAtWill.java
index 706a5cee467..efe7a67bce6 100644
--- a/Mage.Sets/src/mage/cards/f/FireAtWill.java
+++ b/Mage.Sets/src/mage/cards/f/FireAtWill.java
@@ -23,8 +23,8 @@ public final class FireAtWill extends CardImpl {
static {
filter.add(Predicates.or(
- new AttackingPredicate(),
- new BlockingPredicate()));
+ AttackingPredicate.instance,
+ BlockingPredicate.instance));
}
public FireAtWill(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FireCovenant.java b/Mage.Sets/src/mage/cards/f/FireCovenant.java
index ae9870a467a..80f8f729097 100644
--- a/Mage.Sets/src/mage/cards/f/FireCovenant.java
+++ b/Mage.Sets/src/mage/cards/f/FireCovenant.java
@@ -25,7 +25,7 @@ public final class FireCovenant extends CardImpl {
this.getSpellAbility().addCost(new PayVariableLifeCost(true));
// Fire Covenant deals X damage divided as you choose among any number of target creatures.
- DynamicValue xValue = new GetXValue();
+ DynamicValue xValue = GetXValue.instance;
this.getSpellAbility().addEffect(new DamageMultiEffect(xValue));
this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(xValue));
}
diff --git a/Mage.Sets/src/mage/cards/f/Fireball.java b/Mage.Sets/src/mage/cards/f/Fireball.java
index df0543c9c68..7e56cf80172 100644
--- a/Mage.Sets/src/mage/cards/f/Fireball.java
+++ b/Mage.Sets/src/mage/cards/f/Fireball.java
@@ -1,8 +1,8 @@
package mage.cards.f;
-import java.util.*;
import mage.abilities.Ability;
+import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
@@ -14,8 +14,9 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetAnyTarget;
+import java.util.*;
+
/**
- *
* @author BetaSteward_at_googlemail.com
*/
public final class Fireball extends CardImpl {
@@ -27,14 +28,7 @@ public final class Fireball extends CardImpl {
// Fireball costs 1 more to cast for each target beyond the first.
this.getSpellAbility().addTarget(new FireballTargetCreatureOrPlayer(0, Integer.MAX_VALUE));
this.getSpellAbility().addEffect(new FireballEffect());
- }
-
- @Override
- public void adjustCosts(Ability ability, Game game) {
- int numTargets = ability.getTargets().isEmpty() ? 0 : ability.getTargets().get(0).getTargets().size();
- if (numTargets > 1) {
- ability.getManaCostsToPay().add(new GenericManaCost(numTargets - 1));
- }
+ this.getSpellAbility().setCostAdjuster(FireballAdjuster.instance);
}
public Fireball(final Fireball card) {
@@ -47,6 +41,18 @@ public final class Fireball extends CardImpl {
}
}
+enum FireballAdjuster implements CostAdjuster {
+ instance;
+
+ @Override
+ public void adjustCosts(Ability ability, Game game) {
+ int numTargets = ability.getTargets().isEmpty() ? 0 : ability.getTargets().get(0).getTargets().size();
+ if (numTargets > 1) {
+ ability.getManaCostsToPay().add(new GenericManaCost(numTargets - 1));
+ }
+ }
+}
+
class FireballEffect extends OneShotEffect {
public FireballEffect() {
diff --git a/Mage.Sets/src/mage/cards/f/FirebladeArtist.java b/Mage.Sets/src/mage/cards/f/FirebladeArtist.java
new file mode 100644
index 00000000000..e11b412cc7b
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FirebladeArtist.java
@@ -0,0 +1,116 @@
+package mage.cards.f;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.DelayedTriggeredAbility;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.SendOptionUsedEventEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.common.TargetOpponentOrPlaneswalker;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class FirebladeArtist extends CardImpl {
+
+ public FirebladeArtist(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{R}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+
+ // At the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ new DoIfCostPaid(
+ new FirebladeArtistCreateReflexiveTriggerEffect(),
+ new SacrificeTargetCost(new TargetControlledPermanent(
+ StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT
+ )), "Sacrifice a creature to deal 2 damage to an opponent or planeswalker?"
+ ).setText("you may sacrifice a creature. When you do, " +
+ "{this} deals 2 damage to target opponent or planeswalker."),
+ TargetController.YOU, false
+ ));
+ }
+
+ private FirebladeArtist(final FirebladeArtist card) {
+ super(card);
+ }
+
+ @Override
+ public FirebladeArtist copy() {
+ return new FirebladeArtist(this);
+ }
+}
+
+class FirebladeArtistCreateReflexiveTriggerEffect extends OneShotEffect {
+
+ FirebladeArtistCreateReflexiveTriggerEffect() {
+ super(Outcome.Benefit);
+ }
+
+ private FirebladeArtistCreateReflexiveTriggerEffect(final FirebladeArtistCreateReflexiveTriggerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FirebladeArtistCreateReflexiveTriggerEffect copy() {
+ return new FirebladeArtistCreateReflexiveTriggerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ game.addDelayedTriggeredAbility(new FirebladeArtistReflexiveTriggeredAbility(), source);
+ return new SendOptionUsedEventEffect().apply(game, source);
+ }
+}
+
+class FirebladeArtistReflexiveTriggeredAbility extends DelayedTriggeredAbility {
+
+ FirebladeArtistReflexiveTriggeredAbility() {
+ super(new DamageTargetEffect(2), Duration.OneUse, true);
+ this.addTarget(new TargetOpponentOrPlaneswalker());
+ }
+
+ private FirebladeArtistReflexiveTriggeredAbility(final FirebladeArtistReflexiveTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public FirebladeArtistReflexiveTriggeredAbility copy() {
+ return new FirebladeArtistReflexiveTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.OPTION_USED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return event.getPlayerId().equals(this.getControllerId())
+ && event.getSourceId().equals(this.getSourceId());
+ }
+
+ @Override
+ public String getRule() {
+ return "{this} deals 2 damage to target opponent or planeswalker.";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/Firestorm.java b/Mage.Sets/src/mage/cards/f/Firestorm.java
index 584afbec575..b489ee21b62 100644
--- a/Mage.Sets/src/mage/cards/f/Firestorm.java
+++ b/Mage.Sets/src/mage/cards/f/Firestorm.java
@@ -1,4 +1,3 @@
-
package mage.cards.f;
import java.util.UUID;
@@ -16,6 +15,7 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetAnyTarget;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
@@ -24,32 +24,36 @@ import mage.target.common.TargetAnyTarget;
public final class Firestorm extends CardImpl {
public Firestorm(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{R}");
-
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}");
// As an additional cost to cast Firestorm, discard X cards.
this.getSpellAbility().addCost(new DiscardXTargetCost(new FilterCard("cards"), true));
// Firestorm deals X damage to each of X target creatures and/or players.
this.getSpellAbility().addEffect(new FirestormEffect());
+ this.getSpellAbility().setTargetAdjuster(FirestormAdjuster.instance);
}
public Firestorm(final Firestorm card) {
super(card);
}
+ @Override
+ public Firestorm copy() {
+ return new Firestorm(this);
+ }
+}
+
+enum FirestormAdjuster implements TargetAdjuster {
+ instance;
+
@Override
public void adjustTargets(Ability ability, Game game) {
- int xValue = new GetXValue().calculate(game, ability, null);
+ int xValue = GetXValue.instance.calculate(game, ability, null);
if (xValue > 0) {
Target target = new TargetAnyTarget(xValue);
ability.addTarget(target);
}
}
-
- @Override
- public Firestorm copy() {
- return new Firestorm(this);
- }
}
class FirestormEffect extends OneShotEffect {
@@ -66,7 +70,7 @@ class FirestormEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player you = game.getPlayer(source.getControllerId());
- int amount = (new GetXValue()).calculate(game, source, this);
+ int amount = (GetXValue.instance).calculate(game, source, this);
if (you != null) {
if (!source.getTargets().isEmpty()) {
for (UUID targetId : this.getTargetPointer().getTargets(game, source)) {
@@ -85,9 +89,6 @@ class FirestormEffect extends OneShotEffect {
}
return false;
}
-
-
-
@Override
public FirestormEffect copy() {
diff --git a/Mage.Sets/src/mage/cards/f/FlagstonesOfTrokair.java b/Mage.Sets/src/mage/cards/f/FlagstonesOfTrokair.java
index 674adbeb784..522d33e1176 100644
--- a/Mage.Sets/src/mage/cards/f/FlagstonesOfTrokair.java
+++ b/Mage.Sets/src/mage/cards/f/FlagstonesOfTrokair.java
@@ -1,7 +1,5 @@
-
package mage.cards.f;
-import java.util.UUID;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.abilities.mana.WhiteManaAbility;
@@ -14,8 +12,9 @@ import mage.filter.common.FilterLandCard;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.target.common.TargetCardInLibrary;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class FlagstonesOfTrokair extends CardImpl {
@@ -34,7 +33,7 @@ public final class FlagstonesOfTrokair extends CardImpl {
this.addAbility(new WhiteManaAbility());
// When Flagstones of Trokair is put into a graveyard from the battlefield, you may search your library for a Plains card and put it onto the battlefield tapped. If you do, shuffle your library.
- this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(FILTER), true, false), true));
+ this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(FILTER), true, false), true, false));
}
public FlagstonesOfTrokair(final FlagstonesOfTrokair card) {
diff --git a/Mage.Sets/src/mage/cards/f/FlameKinWarScout.java b/Mage.Sets/src/mage/cards/f/FlameKinWarScout.java
index f255bdf5361..73580ab86c0 100644
--- a/Mage.Sets/src/mage/cards/f/FlameKinWarScout.java
+++ b/Mage.Sets/src/mage/cards/f/FlameKinWarScout.java
@@ -29,7 +29,7 @@ public final class FlameKinWarScout extends CardImpl {
private static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FlameKinWarScout(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/Flamebreak.java b/Mage.Sets/src/mage/cards/f/Flamebreak.java
index f80450b3a62..1e834bd05a4 100644
--- a/Mage.Sets/src/mage/cards/f/Flamebreak.java
+++ b/Mage.Sets/src/mage/cards/f/Flamebreak.java
@@ -76,7 +76,7 @@ class FlamebreakCantRegenerateEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == EventType.REGENERATE) {
- DamagedByWatcher watcher = (DamagedByWatcher) game.getState().getWatchers().get(DamagedByWatcher.class.getSimpleName(), source.getSourceId());
+ DamagedByWatcher watcher = game.getState().getWatcher(DamagedByWatcher.class, source.getSourceId());
if (watcher != null) {
return watcher.wasDamaged(event.getTargetId(), game);
}
diff --git a/Mage.Sets/src/mage/cards/f/FlamerushRider.java b/Mage.Sets/src/mage/cards/f/FlamerushRider.java
index e6ed2e29da3..be2c67e9fd8 100644
--- a/Mage.Sets/src/mage/cards/f/FlamerushRider.java
+++ b/Mage.Sets/src/mage/cards/f/FlamerushRider.java
@@ -35,8 +35,8 @@ public final class FlamerushRider extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target attacking creature");
static {
- filter.add(new AnotherPredicate());
- filter.add(new AttackingPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(AttackingPredicate.instance);
}
public FlamerushRider(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FlamesOfTheRazeBoar.java b/Mage.Sets/src/mage/cards/f/FlamesOfTheRazeBoar.java
new file mode 100644
index 00000000000..57230b6b870
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FlamesOfTheRazeBoar.java
@@ -0,0 +1,78 @@
+package mage.cards.f;
+
+import mage.abilities.Ability;
+import mage.abilities.condition.common.FerociousCondition;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageAllEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.permanent.ControllerIdPredicate;
+import mage.filter.predicate.permanent.PermanentIdPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetOpponentsCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class FlamesOfTheRazeBoar extends CardImpl {
+
+ public FlamesOfTheRazeBoar(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{R}");
+
+ // Flames of the Raze-Boar deals 4 damage to target creature an opponent controls. Then Flames of the Raze-Boar deals 2 damage to each other creature that player controls if you control a creature with power 4 or greater.
+ this.getSpellAbility().addEffect(new FlamesOfTheRazeBoarEffect());
+ this.getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent());
+ }
+
+ private FlamesOfTheRazeBoar(final FlamesOfTheRazeBoar card) {
+ super(card);
+ }
+
+ @Override
+ public FlamesOfTheRazeBoar copy() {
+ return new FlamesOfTheRazeBoar(this);
+ }
+}
+
+class FlamesOfTheRazeBoarEffect extends OneShotEffect {
+
+ FlamesOfTheRazeBoarEffect() {
+ super(Outcome.Benefit);
+ staticText = "{this} deals 4 damage to target creature an opponent controls. " +
+ "Then {this} deals 2 damage to each other creature that player controls " +
+ "if you control a creature with power 4 or greater.";
+ }
+
+ private FlamesOfTheRazeBoarEffect(final FlamesOfTheRazeBoarEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FlamesOfTheRazeBoarEffect copy() {
+ return new FlamesOfTheRazeBoarEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ if (permanent == null) {
+ return false;
+ }
+ permanent.damage(4, source.getSourceId(), game);
+ if (!FerociousCondition.instance.apply(game, source)) {
+ return true;
+ }
+ FilterPermanent filter = new FilterCreaturePermanent();
+ filter.add(new ControllerIdPredicate(permanent.getControllerId()));
+ filter.add(Predicates.not(new PermanentIdPredicate(permanent.getId())));
+ return new DamageAllEffect(2, filter).apply(game, source);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/f/FlameshadowConjuring.java b/Mage.Sets/src/mage/cards/f/FlameshadowConjuring.java
index c490eb81919..9db0cd39359 100644
--- a/Mage.Sets/src/mage/cards/f/FlameshadowConjuring.java
+++ b/Mage.Sets/src/mage/cards/f/FlameshadowConjuring.java
@@ -33,7 +33,7 @@ public final class FlameshadowConjuring extends CardImpl {
private static final FilterControlledCreaturePermanent filterNontoken = new FilterControlledCreaturePermanent("nontoken creature");
static {
- filterNontoken.add(Predicates.not(new TokenPredicate()));
+ filterNontoken.add(Predicates.not(TokenPredicate.instance));
}
public FlameshadowConjuring(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FlayerDrone.java b/Mage.Sets/src/mage/cards/f/FlayerDrone.java
index 19482d906b7..548e19f0181 100644
--- a/Mage.Sets/src/mage/cards/f/FlayerDrone.java
+++ b/Mage.Sets/src/mage/cards/f/FlayerDrone.java
@@ -27,8 +27,8 @@ public final class FlayerDrone extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another colorless creature");
static {
- filter.add(new AnotherPredicate());
- filter.add(new ColorlessPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(ColorlessPredicate.instance);
}
public FlayerDrone(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FlayingTendrils.java b/Mage.Sets/src/mage/cards/f/FlayingTendrils.java
index 03e66175359..4531b660354 100644
--- a/Mage.Sets/src/mage/cards/f/FlayingTendrils.java
+++ b/Mage.Sets/src/mage/cards/f/FlayingTendrils.java
@@ -67,7 +67,7 @@ class FlayingTendrilsReplacementEffect extends ReplacementEffectImpl {
Permanent permanent = ((ZoneChangeEvent) event).getTarget();
Player controller = game.getPlayer(source.getControllerId());
if (controller != null && permanent != null) {
- return controller.moveCards((Card) permanent, Zone.EXILED, source, game);
+ return controller.moveCards(permanent, Zone.EXILED, source, game);
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/f/FleshAllergy.java b/Mage.Sets/src/mage/cards/f/FleshAllergy.java
index fb92c9a5c14..6206824743b 100644
--- a/Mage.Sets/src/mage/cards/f/FleshAllergy.java
+++ b/Mage.Sets/src/mage/cards/f/FleshAllergy.java
@@ -57,7 +57,7 @@ class FleshAllergyWatcher extends Watcher {
public int creaturesDiedThisTurn = 0;
public FleshAllergyWatcher() {
- super(FleshAllergyWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(FleshAllergyWatcher.class, WatcherScope.GAME);
}
public FleshAllergyWatcher(final FleshAllergyWatcher watcher) {
@@ -105,7 +105,7 @@ class FleshAllergyEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- FleshAllergyWatcher watcher = (FleshAllergyWatcher) game.getState().getWatchers().get(FleshAllergyWatcher.class.getSimpleName());
+ FleshAllergyWatcher watcher = game.getState().getWatcher(FleshAllergyWatcher.class);
Permanent permanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
if (permanent != null && watcher != null) {
Player player = game.getPlayer(permanent.getControllerId());
diff --git a/Mage.Sets/src/mage/cards/f/FleshmadSteed.java b/Mage.Sets/src/mage/cards/f/FleshmadSteed.java
index 491b9ce5f15..8b8a9ca914a 100644
--- a/Mage.Sets/src/mage/cards/f/FleshmadSteed.java
+++ b/Mage.Sets/src/mage/cards/f/FleshmadSteed.java
@@ -20,7 +20,7 @@ public final class FleshmadSteed extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public FleshmadSteed(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/Flicker.java b/Mage.Sets/src/mage/cards/f/Flicker.java
index b4631281520..dd16b1d1cb0 100644
--- a/Mage.Sets/src/mage/cards/f/Flicker.java
+++ b/Mage.Sets/src/mage/cards/f/Flicker.java
@@ -21,7 +21,7 @@ public final class Flicker extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("nontoken permanent");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public Flicker(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/Flickerwisp.java b/Mage.Sets/src/mage/cards/f/Flickerwisp.java
index 828b1b8d3b5..b4af63cae71 100644
--- a/Mage.Sets/src/mage/cards/f/Flickerwisp.java
+++ b/Mage.Sets/src/mage/cards/f/Flickerwisp.java
@@ -33,7 +33,7 @@ public final class Flickerwisp extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("another target permanent");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public Flickerwisp(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/Fling.java b/Mage.Sets/src/mage/cards/f/Fling.java
index 422ec3263ee..67de60eca99 100644
--- a/Mage.Sets/src/mage/cards/f/Fling.java
+++ b/Mage.Sets/src/mage/cards/f/Fling.java
@@ -22,7 +22,7 @@ public final class Fling extends CardImpl {
public Fling(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}");
- Effect effect = new DamageTargetEffect(new SacrificeCostCreaturesPower());
+ Effect effect = new DamageTargetEffect(SacrificeCostCreaturesPower.instance);
effect.setText("{this} deals damage equal to the sacrificed creature's power to any target");
this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT)));
this.getSpellAbility().addTarget(new TargetAnyTarget());
diff --git a/Mage.Sets/src/mage/cards/f/FloatingDreamZubera.java b/Mage.Sets/src/mage/cards/f/FloatingDreamZubera.java
index a5aa32a32a1..f2e77e0b509 100644
--- a/Mage.Sets/src/mage/cards/f/FloatingDreamZubera.java
+++ b/Mage.Sets/src/mage/cards/f/FloatingDreamZubera.java
@@ -25,7 +25,7 @@ public final class FloatingDreamZubera extends CardImpl {
this.power = new MageInt(1);
this.toughness = new MageInt(2);
- this.addAbility(new DiesTriggeredAbility(new DrawCardSourceControllerEffect(new ZuberasDiedDynamicValue())), new ZuberasDiedWatcher());
+ this.addAbility(new DiesTriggeredAbility(new DrawCardSourceControllerEffect(ZuberasDiedDynamicValue.instance)), new ZuberasDiedWatcher());
}
public FloatingDreamZubera(final FloatingDreamZubera card) {
diff --git a/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java b/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java
index 79ac3e5e977..018f5f3b239 100644
--- a/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java
+++ b/Mage.Sets/src/mage/cards/f/FlockOfRabidSheep.java
@@ -59,7 +59,7 @@ class FlockOfRabidSheepEffect extends OneShotEffect {
int repeat = source.getManaCostsToPay().getX();
int wonCount = 0;
for (int i = 1; i <= repeat; i++) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
wonCount++;
}
}
diff --git a/Mage.Sets/src/mage/cards/f/FloralSpuzzem.java b/Mage.Sets/src/mage/cards/f/FloralSpuzzem.java
index c418a879265..8fde7de47c1 100644
--- a/Mage.Sets/src/mage/cards/f/FloralSpuzzem.java
+++ b/Mage.Sets/src/mage/cards/f/FloralSpuzzem.java
@@ -27,7 +27,7 @@ public final class FloralSpuzzem extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.ARTIFACT));
- filter.add(new DefendingPlayerControlsPredicate());
+ filter.add(DefendingPlayerControlsPredicate.instance);
}
public FloralSpuzzem(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/FlowstoneSlide.java b/Mage.Sets/src/mage/cards/f/FlowstoneSlide.java
index 479d9f124be..fe68ae63e8b 100644
--- a/Mage.Sets/src/mage/cards/f/FlowstoneSlide.java
+++ b/Mage.Sets/src/mage/cards/f/FlowstoneSlide.java
@@ -20,8 +20,8 @@ public final class FlowstoneSlide extends CardImpl {
public FlowstoneSlide(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{2}{R}{R}");
- DynamicValue xPos = new ManacostVariableValue();
- DynamicValue xNeg = new SignInversionDynamicValue(new ManacostVariableValue());
+ DynamicValue xPos = ManacostVariableValue.instance;
+ DynamicValue xNeg = new SignInversionDynamicValue(ManacostVariableValue.instance);
// All creatures get +X/-X until end of turn.
this.getSpellAbility().addEffect(new BoostAllEffect(xPos, xNeg, Duration.EndOfTurn));
diff --git a/Mage.Sets/src/mage/cards/f/Fluxcharger.java b/Mage.Sets/src/mage/cards/f/Fluxcharger.java
index fecfe06e928..5f31edb2b66 100644
--- a/Mage.Sets/src/mage/cards/f/Fluxcharger.java
+++ b/Mage.Sets/src/mage/cards/f/Fluxcharger.java
@@ -1,7 +1,5 @@
-
package mage.cards.f;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.continuous.SwitchPowerToughnessSourceEffect;
@@ -9,18 +7,19 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.filter.StaticFilters;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class Fluxcharger extends CardImpl {
public Fluxcharger(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{R}");
this.subtype.add(SubType.WEIRD);
this.power = new MageInt(1);
@@ -29,7 +28,7 @@ public final class Fluxcharger extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever you cast an instant or sorcery spell, you may switch Fluxcharger's power and toughness until end of turn.
- this.addAbility(new SpellCastControllerTriggeredAbility(new SwitchPowerToughnessSourceEffect(Duration.EndOfTurn), StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY, true));
+ this.addAbility(new SpellCastControllerTriggeredAbility(new SwitchPowerToughnessSourceEffect(Duration.EndOfTurn), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, true));
}
diff --git a/Mage.Sets/src/mage/cards/f/FontOfAgonies.java b/Mage.Sets/src/mage/cards/f/FontOfAgonies.java
new file mode 100644
index 00000000000..4abcc4eb09a
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FontOfAgonies.java
@@ -0,0 +1,83 @@
+package mage.cards.f;
+
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.RemoveCountersSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class FontOfAgonies extends CardImpl {
+
+ public FontOfAgonies(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
+
+ // Whenever you pay life, put that many blood counters on Font of Agonies.
+ this.addAbility(new FontOfAgoniesTriggeredAbility());
+
+ // {1}{B}, Remove four blood counters from Font of Agonies: Destroy target creature.
+ Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect(), new ManaCostsImpl("{1}{B}"));
+ ability.addCost(new RemoveCountersSourceCost(CounterType.BLOOD.createInstance(4)));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ private FontOfAgonies(final FontOfAgonies card) {
+ super(card);
+ }
+
+ @Override
+ public FontOfAgonies copy() {
+ return new FontOfAgonies(this);
+ }
+}
+
+class FontOfAgoniesTriggeredAbility extends TriggeredAbilityImpl {
+
+ FontOfAgoniesTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.BLOOD.createInstance()), false);
+ }
+
+ private FontOfAgoniesTriggeredAbility(final FontOfAgoniesTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public FontOfAgoniesTriggeredAbility copy() {
+ return new FontOfAgoniesTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType().equals(GameEvent.EventType.LIFE_PAID);
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getPlayerId().equals(controllerId) && event.getAmount() > 0) {
+ this.getEffects().clear();
+ this.addEffect(new AddCountersSourceEffect(CounterType.BLOOD.createInstance(event.getAmount())));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you pay life, put that many blood counters on {this}.";
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/f/FootlightFiend.java b/Mage.Sets/src/mage/cards/f/FootlightFiend.java
new file mode 100644
index 00000000000..6d7d41f9794
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FootlightFiend.java
@@ -0,0 +1,41 @@
+package mage.cards.f;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.target.common.TargetAnyTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class FootlightFiend extends CardImpl {
+
+ public FootlightFiend(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B/R}");
+
+ this.subtype.add(SubType.DEVIL);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // When Footlight Fiend dies, it deals 1 damage to any target.
+ Ability ability = new DiesTriggeredAbility(new DamageTargetEffect(1, "it"));
+ ability.addTarget(new TargetAnyTarget());
+ this.addAbility(ability);
+ }
+
+ private FootlightFiend(final FootlightFiend card) {
+ super(card);
+ }
+
+ @Override
+ public FootlightFiend copy() {
+ return new FootlightFiend(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/ForbiddingSpirit.java b/Mage.Sets/src/mage/cards/f/ForbiddingSpirit.java
new file mode 100644
index 00000000000..b96e38211d1
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/ForbiddingSpirit.java
@@ -0,0 +1,47 @@
+package mage.cards.f;
+
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.common.combat.CantAttackYouUnlessPayManaAllEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ForbiddingSpirit extends CardImpl {
+
+ public ForbiddingSpirit(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
+
+ this.subtype.add(SubType.SPIRIT);
+ this.subtype.add(SubType.CLERIC);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // When Forbidding Spirit enters the battlefield, until your next turn, creatures can't attack you or a planeswalker you control unless their controller pays {2} for each of those creatures.
+ ContinuousEffect effect = new CantAttackYouUnlessPayManaAllEffect(
+ new ManaCostsImpl("{2}"), true
+ );
+ effect.setDuration(Duration.UntilYourNextTurn);
+ effect.setText("until your next turn, creatures can't attack you or a planeswalker you control " +
+ "unless their controller pays {2} for each of those creatures.");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect));
+ }
+
+ private ForbiddingSpirit(final ForbiddingSpirit card) {
+ super(card);
+ }
+
+ @Override
+ public ForbiddingSpirit copy() {
+ return new ForbiddingSpirit(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/ForceLightning.java b/Mage.Sets/src/mage/cards/f/ForceLightning.java
index 64b07aa29d1..46793dcd5d9 100644
--- a/Mage.Sets/src/mage/cards/f/ForceLightning.java
+++ b/Mage.Sets/src/mage/cards/f/ForceLightning.java
@@ -24,7 +24,7 @@ public final class ForceLightning extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}");
// Force Lightning deals X damage to any target.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetAnyTarget());
// Scry X.
diff --git a/Mage.Sets/src/mage/cards/f/Forcefield.java b/Mage.Sets/src/mage/cards/f/Forcefield.java
index e225e7c328a..9534b45eb50 100644
--- a/Mage.Sets/src/mage/cards/f/Forcefield.java
+++ b/Mage.Sets/src/mage/cards/f/Forcefield.java
@@ -53,7 +53,7 @@ class ForcefieldEffect extends OneShotEffect {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("an unblocked creature");
static {
- filter.add(new UnblockedPredicate());
+ filter.add(UnblockedPredicate.instance);
}
ForcefieldEffect() {
diff --git a/Mage.Sets/src/mage/cards/f/ForerunnerOfSlaughter.java b/Mage.Sets/src/mage/cards/f/ForerunnerOfSlaughter.java
index 710d7d12970..75685ca33fc 100644
--- a/Mage.Sets/src/mage/cards/f/ForerunnerOfSlaughter.java
+++ b/Mage.Sets/src/mage/cards/f/ForerunnerOfSlaughter.java
@@ -28,7 +28,7 @@ public final class ForerunnerOfSlaughter extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("colorless creature");
static {
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
}
public ForerunnerOfSlaughter(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/ForerunnerOfTheCoalition.java b/Mage.Sets/src/mage/cards/f/ForerunnerOfTheCoalition.java
index bb62690e7de..1cd38f8a524 100644
--- a/Mage.Sets/src/mage/cards/f/ForerunnerOfTheCoalition.java
+++ b/Mage.Sets/src/mage/cards/f/ForerunnerOfTheCoalition.java
@@ -26,7 +26,7 @@ public final class ForerunnerOfTheCoalition extends CardImpl {
private static final FilterPermanent filterAnotherPirate = new FilterPermanent(SubType.PIRATE, "another " + SubType.PIRATE.toString());
static {
- filterAnotherPirate.add(new AnotherPredicate());
+ filterAnotherPirate.add(AnotherPredicate.instance);
filterAnotherPirate.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/f/ForerunnerOfTheHeralds.java b/Mage.Sets/src/mage/cards/f/ForerunnerOfTheHeralds.java
index c1eef1e04dd..1a161bba1c0 100644
--- a/Mage.Sets/src/mage/cards/f/ForerunnerOfTheHeralds.java
+++ b/Mage.Sets/src/mage/cards/f/ForerunnerOfTheHeralds.java
@@ -28,7 +28,7 @@ public final class ForerunnerOfTheHeralds extends CardImpl {
private static final FilterPermanent filterAnotherMerfolk = new FilterPermanent(SubType.MERFOLK, "another " + SubType.MERFOLK.toString());
static {
- filterAnotherMerfolk.add(new AnotherPredicate());
+ filterAnotherMerfolk.add(AnotherPredicate.instance);
filterAnotherMerfolk.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/f/ForerunnerOfTheLegion.java b/Mage.Sets/src/mage/cards/f/ForerunnerOfTheLegion.java
index 2ada4b8d5a1..f5efb3eea30 100644
--- a/Mage.Sets/src/mage/cards/f/ForerunnerOfTheLegion.java
+++ b/Mage.Sets/src/mage/cards/f/ForerunnerOfTheLegion.java
@@ -26,7 +26,7 @@ public final class ForerunnerOfTheLegion extends CardImpl {
private static final FilterPermanent filterAnotherVampire = new FilterPermanent(SubType.VAMPIRE, "another " + SubType.VAMPIRE.toString());
static {
- filterAnotherVampire.add(new AnotherPredicate());
+ filterAnotherVampire.add(AnotherPredicate.instance);
filterAnotherVampire.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/f/Foreshadow.java b/Mage.Sets/src/mage/cards/f/Foreshadow.java
index e1d86d5e569..01fabc683ef 100644
--- a/Mage.Sets/src/mage/cards/f/Foreshadow.java
+++ b/Mage.Sets/src/mage/cards/f/Foreshadow.java
@@ -29,7 +29,7 @@ public final class Foreshadow extends CardImpl {
// Choose a card name, then target opponent puts the top card of their library into their graveyard. If that card has the chosen name, you draw a card.
this.getSpellAbility().addEffect(new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL));
- this.getSpellAbility().addEffect(new ForeshadowEffect());
+ this.getSpellAbility().addEffect(new ForeshadowEffect().concatBy("then"));
this.getSpellAbility().addTarget(new TargetOpponent());
// Draw a card at the beginning of the next turn's upkeep.
@@ -51,7 +51,7 @@ class ForeshadowEffect extends OneShotEffect {
public ForeshadowEffect() {
super(Outcome.DrawCard);
- this.staticText = ", then target opponent puts the top card of their library into their graveyard. If that card has the chosen name, you draw a card";
+ this.staticText = "target opponent puts the top card of their library into their graveyard. If that card has the chosen name, you draw a card";
}
public ForeshadowEffect(final ForeshadowEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/f/ForgeOfHeroes.java b/Mage.Sets/src/mage/cards/f/ForgeOfHeroes.java
index e3e24edaa2c..b745f928008 100644
--- a/Mage.Sets/src/mage/cards/f/ForgeOfHeroes.java
+++ b/Mage.Sets/src/mage/cards/f/ForgeOfHeroes.java
@@ -29,7 +29,7 @@ public final class ForgeOfHeroes extends CardImpl {
= new FilterPermanent("commander that entered the battlefield this turn");
static {
- filter.add(new CommanderPredicate());
+ filter.add(CommanderPredicate.instance);
filter.add(new EnteredThisTurnPredicate());
}
diff --git a/Mage.Sets/src/mage/cards/f/ForgottenAncient.java b/Mage.Sets/src/mage/cards/f/ForgottenAncient.java
index 6693a73de18..dc8393e5afd 100644
--- a/Mage.Sets/src/mage/cards/f/ForgottenAncient.java
+++ b/Mage.Sets/src/mage/cards/f/ForgottenAncient.java
@@ -35,7 +35,7 @@ import java.util.UUID;
public final class ForgottenAncient extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ForgottenAncient(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/f/ForgottenLore.java b/Mage.Sets/src/mage/cards/f/ForgottenLore.java
index 62ec82fcf46..8798d3f7555 100644
--- a/Mage.Sets/src/mage/cards/f/ForgottenLore.java
+++ b/Mage.Sets/src/mage/cards/f/ForgottenLore.java
@@ -1,7 +1,5 @@
-
package mage.cards.f;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.costs.Cost;
import mage.abilities.costs.mana.ManaCostsImpl;
@@ -18,14 +16,16 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInGraveyard;
import mage.target.common.TargetOpponent;
+
+import java.util.UUID;
+
/**
- *
* @author LoneFox
*/
public final class ForgottenLore extends CardImpl {
public ForgottenLore(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{G}");
// Target opponent chooses a card in your graveyard. You may pay {G}. If you do, repeat this process except that opponent can't choose a card already chosen for Forgotten Lore. Then put the last chosen card into your hand.
this.getSpellAbility().addEffect(new ForgottenLoreEffect());
@@ -62,8 +62,7 @@ class ForgottenLoreEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player you = game.getPlayer(source.getControllerId());
Player opponent = game.getPlayer(targetPointer.getFirst(game, source));
- if(you != null && opponent != null)
- {
+ if (you != null && opponent != null) {
FilterCard filter = new FilterCard();
filter.add(new OwnerIdPredicate(you.getId()));
Cost cost = new ManaCostsImpl("{G}");
@@ -73,31 +72,31 @@ class ForgottenLoreEffect extends OneShotEffect {
do {
chosenCard = new TargetCardInGraveyard(filter);
chosenCard.setNotTarget(true);
- if(chosenCard.canChoose(opponent.getId(), game)) {
+ if (chosenCard.canChoose(opponent.getId(), game)) {
opponent.chooseTarget(Outcome.ReturnToHand, chosenCard, source, game);
card = game.getCard(chosenCard.getFirstTarget());
- filter.add(Predicates.not(new CardIdPredicate(card.getId())));
- game.informPlayers("Forgotten Lore: " + opponent.getLogName() + " has chosen " + card.getLogName());
- }
- else {
+ if (card != null) {
+ filter.add(Predicates.not(new CardIdPredicate(card.getId())));
+ game.informPlayers("Forgotten Lore: " + opponent.getLogName() + " has chosen " + card.getLogName());
+ }
+ } else {
done = true;
}
- if(!done) {
- if(cost.canPay(source, source.getSourceId(), you.getId(), game) && you.chooseUse(Outcome.Benefit, "Pay {G} to choose a different card ?", source, game)) {
+ if (!done) {
+ if (cost.canPay(source, source.getSourceId(), you.getId(), game) && you.chooseUse(Outcome.Benefit, "Pay {G} to choose a different card ?", source, game)) {
cost.clearPaid();
- if(!cost.pay(source, game, source.getSourceId(), you.getId(), false, null)) {
+ if (!cost.pay(source, game, source.getSourceId(), you.getId(), false, null)) {
done = true;
}
- }
- else {
+ } else {
done = true;
}
}
- } while(!done);
+ } while (!done);
- if(card != null) {
+ if (card != null) {
Cards cardsToHand = new CardsImpl();
cardsToHand.add(card);
you.moveCards(cardsToHand, Zone.HAND, source, game);
diff --git a/Mage.Sets/src/mage/cards/f/FoulTongueInvocation.java b/Mage.Sets/src/mage/cards/f/FoulTongueInvocation.java
index 629c797974f..cb2a1d7d70b 100644
--- a/Mage.Sets/src/mage/cards/f/FoulTongueInvocation.java
+++ b/Mage.Sets/src/mage/cards/f/FoulTongueInvocation.java
@@ -1,15 +1,14 @@
package mage.cards.f;
-import java.util.UUID;
import mage.abilities.Ability;
+import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.common.RevealTargetFromHandCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.InfoEffect;
import mage.abilities.effects.common.SacrificeEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AbilityType;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
@@ -22,23 +21,19 @@ import mage.target.TargetPlayer;
import mage.target.common.TargetCardInHand;
import mage.watchers.common.DragonOnTheBattlefieldWhileSpellWasCastWatcher;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class FoulTongueInvocation extends CardImpl {
- private static final FilterCard filter = new FilterCard("a Dragon card from your hand (you don't have to)");
-
- static {
- filter.add(new SubtypePredicate(SubType.DRAGON));
- }
-
public FoulTongueInvocation(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}");
// As an additional cost to cast Foul-Tongue Invocation, you may reveal a Dragon card from your hand.
this.getSpellAbility().addEffect(new InfoEffect("as an additional cost to cast this spell, you may reveal a Dragon card from your hand"));
+ this.getSpellAbility().setCostAdjuster(FoulTongueInvocationAdjuster.instance);
// Target player sacrifices a creature. If you revealed a Dragon card or controlled a Dragon as you cast Foul-Tongue Invocation, you gain 4 life.
this.getSpellAbility().addTarget(new TargetPlayer());
@@ -47,18 +42,6 @@ public final class FoulTongueInvocation extends CardImpl {
this.getSpellAbility().addWatcher(new DragonOnTheBattlefieldWhileSpellWasCastWatcher());
}
- @Override
- public void adjustCosts(Ability ability, Game game) {
- if (ability.getAbilityType() == AbilityType.SPELL) {
- Player controller = game.getPlayer(ability.getControllerId());
- if (controller != null) {
- if (controller.getHand().count(filter, game) > 0) {
- ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0, 1, filter)));
- }
- }
- }
- }
-
public FoulTongueInvocation(final FoulTongueInvocation card) {
super(card);
}
@@ -69,6 +52,25 @@ public final class FoulTongueInvocation extends CardImpl {
}
}
+enum FoulTongueInvocationAdjuster implements CostAdjuster {
+ instance;
+ private static final FilterCard filter = new FilterCard("a Dragon card from your hand (you don't have to)");
+
+ static {
+ filter.add(new SubtypePredicate(SubType.DRAGON));
+ }
+
+ @Override
+ public void adjustCosts(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller != null) {
+ if (controller.getHand().count(filter, game) > 0) {
+ ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0, 1, filter)));
+ }
+ }
+ }
+}
+
class FoulTongueInvocationEffect extends OneShotEffect {
public FoulTongueInvocationEffect() {
@@ -89,7 +91,7 @@ class FoulTongueInvocationEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- DragonOnTheBattlefieldWhileSpellWasCastWatcher watcher = (DragonOnTheBattlefieldWhileSpellWasCastWatcher) game.getState().getWatchers().get(DragonOnTheBattlefieldWhileSpellWasCastWatcher.class.getSimpleName());
+ DragonOnTheBattlefieldWhileSpellWasCastWatcher watcher = game.getState().getWatcher(DragonOnTheBattlefieldWhileSpellWasCastWatcher.class);
if (watcher != null && watcher.castWithConditionTrue(source.getId())) {
controller.gainLife(4, game, source);
}
diff --git a/Mage.Sets/src/mage/cards/f/FoundryStreetDenizen.java b/Mage.Sets/src/mage/cards/f/FoundryStreetDenizen.java
index 49fb7989716..e60bfdec3b7 100644
--- a/Mage.Sets/src/mage/cards/f/FoundryStreetDenizen.java
+++ b/Mage.Sets/src/mage/cards/f/FoundryStreetDenizen.java
@@ -27,7 +27,7 @@ public final class FoundryStreetDenizen extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("another red creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
filter.add(new ColorPredicate(ObjectColor.RED));
}
diff --git a/Mage.Sets/src/mage/cards/f/FountainOfCho.java b/Mage.Sets/src/mage/cards/f/FountainOfCho.java
index 566c64e58f9..1686099ab5e 100644
--- a/Mage.Sets/src/mage/cards/f/FountainOfCho.java
+++ b/Mage.Sets/src/mage/cards/f/FountainOfCho.java
@@ -34,7 +34,7 @@ public final class FountainOfCho extends CardImpl {
// {T}, Remove any number of storage counters from Fountain of Cho: Add {W} for each storage counter removed this way.
Ability ability = new DynamicManaAbility(
Mana.WhiteMana(1),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new TapSourceCost(),
"Add {W} for each storage counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE));
diff --git a/Mage.Sets/src/mage/cards/f/FrayingSanity.java b/Mage.Sets/src/mage/cards/f/FrayingSanity.java
index c53c85c054d..501a6e021fe 100644
--- a/Mage.Sets/src/mage/cards/f/FrayingSanity.java
+++ b/Mage.Sets/src/mage/cards/f/FrayingSanity.java
@@ -113,7 +113,7 @@ class FrayingSanityEffect extends OneShotEffect {
}
Player enchantedPlayer = game.getPlayer(enchantment.getAttachedTo());
if (enchantedPlayer != null) {
- CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get(CardsPutIntoGraveyardWatcher.class.getSimpleName());
+ CardsPutIntoGraveyardWatcher watcher = game.getState().getWatcher(CardsPutIntoGraveyardWatcher.class);
if (watcher != null) {
xAmount = watcher.getAmountCardsPutToGraveyard(enchantedPlayer.getId());
}
diff --git a/Mage.Sets/src/mage/cards/f/FreeRangeChicken.java b/Mage.Sets/src/mage/cards/f/FreeRangeChicken.java
index 47310ccc4b2..2bc8ed23a36 100644
--- a/Mage.Sets/src/mage/cards/f/FreeRangeChicken.java
+++ b/Mage.Sets/src/mage/cards/f/FreeRangeChicken.java
@@ -75,7 +75,7 @@ class FreeRangeChickenEffect extends OneShotEffect {
if (firstRoll == secondRoll) {
game.addEffect(new BoostSourceEffect(firstRoll, firstRoll, Duration.EndOfTurn), source);
}
- FreeRangeChickenWatcher watcher = (FreeRangeChickenWatcher) game.getState().getWatchers().get(FreeRangeChickenWatcher.class.getSimpleName());
+ FreeRangeChickenWatcher watcher = game.getState().getWatcher(FreeRangeChickenWatcher.class);
if (watcher != null) {
int totalRoll = firstRoll + secondRoll;
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
@@ -98,7 +98,7 @@ class FreeRangeChickenWatcher extends Watcher {
private final Map totalRolls = new HashMap<>();
public FreeRangeChickenWatcher() {
- super(FreeRangeChickenWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(FreeRangeChickenWatcher.class, WatcherScope.GAME);
}
public FreeRangeChickenWatcher(final FreeRangeChickenWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/f/FreneticEfreet.java b/Mage.Sets/src/mage/cards/f/FreneticEfreet.java
index b2f407420be..e5d37014a01 100644
--- a/Mage.Sets/src/mage/cards/f/FreneticEfreet.java
+++ b/Mage.Sets/src/mage/cards/f/FreneticEfreet.java
@@ -69,7 +69,7 @@ class FreneticEfreetEffect extends OneShotEffect {
if (controller == null) {
return false;
}
- boolean flip = controller.flipCoin(game);
+ boolean flip = controller.flipCoin(source, game, true);
if (permanent == null) {
return false;
}
diff --git a/Mage.Sets/src/mage/cards/f/FreneticSliver.java b/Mage.Sets/src/mage/cards/f/FreneticSliver.java
index 6655f21dbd4..e054ecb968f 100644
--- a/Mage.Sets/src/mage/cards/f/FreneticSliver.java
+++ b/Mage.Sets/src/mage/cards/f/FreneticSliver.java
@@ -76,7 +76,7 @@ class FreneticSliverEffect extends OneShotEffect {
if (player == null || perm == null) {
return false;
}
- if (player.flipCoin(game)) {
+ if (player.flipCoin(source, game, true)) {
return new ExileReturnBattlefieldOwnerNextEndStepSourceEffect(true).apply(game, source);
} else {
return perm.sacrifice(source.getSourceId(), game);
diff --git a/Mage.Sets/src/mage/cards/f/FreshMeat.java b/Mage.Sets/src/mage/cards/f/FreshMeat.java
index 886d76becdd..99386549264 100644
--- a/Mage.Sets/src/mage/cards/f/FreshMeat.java
+++ b/Mage.Sets/src/mage/cards/f/FreshMeat.java
@@ -41,7 +41,7 @@ class FreshMeatDynamicValue implements DynamicValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
- CreaturesDiedWatcher watcher = (CreaturesDiedWatcher) game.getState().getWatchers().get(CreaturesDiedWatcher.class.getSimpleName());
+ CreaturesDiedWatcher watcher = game.getState().getWatcher(CreaturesDiedWatcher.class);
if (watcher != null) {
return watcher.getAmountOfCreaturesDiedThisTurnByController(sourceAbility.getControllerId());
}
diff --git a/Mage.Sets/src/mage/cards/f/FretworkColony.java b/Mage.Sets/src/mage/cards/f/FretworkColony.java
index 6c08fb8a163..5521f29bbb6 100644
--- a/Mage.Sets/src/mage/cards/f/FretworkColony.java
+++ b/Mage.Sets/src/mage/cards/f/FretworkColony.java
@@ -1,7 +1,5 @@
-
package mage.cards.f;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -16,14 +14,15 @@ import mage.constants.SubType;
import mage.constants.TargetController;
import mage.counters.CounterType;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class FretworkColony extends CardImpl {
public FretworkColony(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
this.subtype.add(SubType.INSECT);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
@@ -34,8 +33,7 @@ public final class FretworkColony extends CardImpl {
// At the beginning of your upkeep, put a +1/+1 counter on Fretwork Colony and you lose 1 life.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), TargetController.YOU, false);
Effect effect = new LoseLifeSourceControllerEffect(1);
- effect.setText("and you lose 1 life");
- ability.addEffect(effect);
+ ability.addEffect(effect.concatBy("and"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/f/FreyaliseSupplicant.java b/Mage.Sets/src/mage/cards/f/FreyaliseSupplicant.java
new file mode 100644
index 00000000000..92a0ce7e204
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FreyaliseSupplicant.java
@@ -0,0 +1,61 @@
+package mage.cards.f;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.dynamicvalue.common.HalfValue;
+import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.constants.SubType;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.target.common.TargetAnyTarget;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class FreyaliseSupplicant extends CardImpl {
+
+ private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("red or white creature");
+
+ static {
+ filter.add(Predicates.or(new ColorPredicate(ObjectColor.RED),
+ new ColorPredicate(ObjectColor.WHITE)));
+ }
+
+ public FreyaliseSupplicant(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.CLERIC);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {tap}, Sacrifice a red or white creature: Freyalise Supplicant deals damage to any target equal to half the sacrificed creature's power, rounded down.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new HalfValue(SacrificeCostCreaturesPower.instance, false)), new TapSourceCost());
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter)));
+ ability.addTarget(new TargetAnyTarget());
+ this.addAbility(ability);
+
+ }
+
+ private FreyaliseSupplicant(final FreyaliseSupplicant card) {
+ super(card);
+ }
+
+ @Override
+ public FreyaliseSupplicant copy() {
+ return new FreyaliseSupplicant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FreyalisesCharm.java b/Mage.Sets/src/mage/cards/f/FreyalisesCharm.java
index 2690555929c..35a573cb4fe 100644
--- a/Mage.Sets/src/mage/cards/f/FreyalisesCharm.java
+++ b/Mage.Sets/src/mage/cards/f/FreyalisesCharm.java
@@ -1,7 +1,5 @@
-
package mage.cards.f;
-import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastOpponentTriggeredAbility;
@@ -15,8 +13,9 @@ import mage.constants.CardType;
import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ColorPredicate;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class FreyalisesCharm extends CardImpl {
@@ -33,7 +32,7 @@ public final class FreyalisesCharm extends CardImpl {
// Whenever an opponent casts a black spell, you may pay {G}{G}. If you do, you draw a card.
this.addAbility(new SpellCastOpponentTriggeredAbility(
new DoIfCostPaid(
- new DrawCardSourceControllerEffect(1),
+ new DrawCardSourceControllerEffect(1, "you"),
new ManaCostsImpl("{G}{G}")
), filter, false
));
diff --git a/Mage.Sets/src/mage/cards/f/FreyalisesWinds.java b/Mage.Sets/src/mage/cards/f/FreyalisesWinds.java
new file mode 100644
index 00000000000..1c5b0a09220
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FreyalisesWinds.java
@@ -0,0 +1,93 @@
+package mage.cards.f;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.BecomesTappedTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.filter.FilterPermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class FreyalisesWinds extends CardImpl {
+
+ public FreyalisesWinds(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}");
+
+ // Whenever a permanent becomes tapped, put a wind counter on it.
+ Effect effect = new AddCountersTargetEffect(CounterType.WIND.createInstance());
+ effect.setText("put a wind counter on it.");
+ this.addAbility(new BecomesTappedTriggeredAbility(effect, false, new FilterPermanent("a permanent"), true));
+
+ // If a permanent with a wind counter on it would untap during its controller's untap step, remove all wind counters from it instead.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new FreyalisesWindsReplacementEffect()));
+
+ }
+
+ private FreyalisesWinds(final FreyalisesWinds card) {
+ super(card);
+ }
+
+ @Override
+ public FreyalisesWinds copy() {
+ return new FreyalisesWinds(this);
+ }
+}
+
+class FreyalisesWindsReplacementEffect extends ReplacementEffectImpl {
+
+ FreyalisesWindsReplacementEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Benefit);
+ staticText = "If a permanent with a wind counter on it would untap during its controller's untap step, remove all wind counters from it instead";
+ }
+
+ FreyalisesWindsReplacementEffect(final FreyalisesWindsReplacementEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FreyalisesWindsReplacementEffect copy() {
+ return new FreyalisesWindsReplacementEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Permanent permanentUntapping = game.getPermanent(event.getTargetId());
+ permanentUntapping.removeCounters(CounterType.WIND.createInstance(), game);
+ return true;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return (event.getType() == GameEvent.EventType.UNTAP
+ && game.getPhase().getStep().getType() == PhaseStep.UNTAP);
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ Permanent permanentUntapping = game.getPermanent(event.getTargetId());
+ return (permanentUntapping != null
+ && event.getPlayerId().equals(permanentUntapping.getControllerId())
+ && permanentUntapping.getCounters(game).getCount(CounterType.WIND) > 0);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FrilledMystic.java b/Mage.Sets/src/mage/cards/f/FrilledMystic.java
new file mode 100644
index 00000000000..c8332b4a853
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FrilledMystic.java
@@ -0,0 +1,48 @@
+package mage.cards.f;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.CounterTargetEffect;
+import mage.abilities.keyword.FlashAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.target.TargetSpell;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class FrilledMystic extends CardImpl {
+
+ public FrilledMystic(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{G}{U}{U}");
+
+ this.subtype.add(SubType.ELF);
+ this.subtype.add(SubType.LIZARD);
+ this.subtype.add(SubType.WIZARD);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Flash
+ this.addAbility(FlashAbility.getInstance());
+
+ // When Frilled Mystic enters the battlefield, you may counter target spell.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new CounterTargetEffect(), true);
+ ability.addTarget(new TargetSpell());
+ this.addAbility(ability);
+ }
+
+ private FrilledMystic(final FrilledMystic card) {
+ super(card);
+ }
+
+ @Override
+ public FrilledMystic copy() {
+ return new FrilledMystic(this);
+ }
+}
+// nonagon infinity opens the door
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/f/FungalReaches.java b/Mage.Sets/src/mage/cards/f/FungalReaches.java
index 92598fdd615..69f0a3cbe66 100644
--- a/Mage.Sets/src/mage/cards/f/FungalReaches.java
+++ b/Mage.Sets/src/mage/cards/f/FungalReaches.java
@@ -38,7 +38,7 @@ public final class FungalReaches extends CardImpl {
// {1}, Remove X storage counters from Fungal Reaches: Add X mana in any combination of {R} and/or {G}.
ability = new SimpleManaAbility(Zone.BATTLEFIELD,
- new AddManaInAnyCombinationEffect(new RemovedCountersForCostValue(), ColoredManaSymbol.R, ColoredManaSymbol.G),
+ new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, ColoredManaSymbol.R, ColoredManaSymbol.G),
new GenericManaCost(1));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance()));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/f/FungalSprouting.java b/Mage.Sets/src/mage/cards/f/FungalSprouting.java
index d363b9a9ed4..66923625376 100644
--- a/Mage.Sets/src/mage/cards/f/FungalSprouting.java
+++ b/Mage.Sets/src/mage/cards/f/FungalSprouting.java
@@ -19,7 +19,7 @@ public final class FungalSprouting extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}");
// create X 1/1 green Saproling creature tokens, where X is the greatest power among creatures you control.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), new GreatestPowerAmongControlledCreaturesValue()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new SaprolingToken(), GreatestPowerAmongControlledCreaturesValue.instance));
}
public FungalSprouting(final FungalSprouting card) {
diff --git a/Mage.Sets/src/mage/cards/f/FyndhornDruid.java b/Mage.Sets/src/mage/cards/f/FyndhornDruid.java
index 78c6ef165ea..a1b1fb15afa 100644
--- a/Mage.Sets/src/mage/cards/f/FyndhornDruid.java
+++ b/Mage.Sets/src/mage/cards/f/FyndhornDruid.java
@@ -50,7 +50,7 @@ class SourceWasBlockedThisTurnCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
- WasBlockedThisTurnWatcher watcher = (WasBlockedThisTurnWatcher) game.getState().getWatchers().get(WasBlockedThisTurnWatcher.class.getSimpleName());
- return sourcePermanent != null && watcher.getWasBlockedThisTurnCreatures().contains(new MageObjectReference(sourcePermanent, game));
+ WasBlockedThisTurnWatcher watcher = game.getState().getWatcher(WasBlockedThisTurnWatcher.class);
+ return sourcePermanent != null && watcher != null && watcher.getWasBlockedThisTurnCreatures().contains(new MageObjectReference(sourcePermanent, game));
}
}
diff --git a/Mage.Sets/src/mage/cards/g/GOTOJAIL.java b/Mage.Sets/src/mage/cards/g/GOTOJAIL.java
index 90a1fcb9fc8..f7eea87ac1b 100644
--- a/Mage.Sets/src/mage/cards/g/GOTOJAIL.java
+++ b/Mage.Sets/src/mage/cards/g/GOTOJAIL.java
@@ -118,7 +118,7 @@ class GoToJailTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- return event.getPlayerId().equals((UUID) game.getState().getValue(this.getSourceId().toString() + ChooseOpponentEffect.VALUE_KEY));
+ return event.getPlayerId().equals(game.getState().getValue(this.getSourceId().toString() + ChooseOpponentEffect.VALUE_KEY));
}
@Override
diff --git a/Mage.Sets/src/mage/cards/g/GaeasLiege.java b/Mage.Sets/src/mage/cards/g/GaeasLiege.java
index b5c0f24259f..0b4a5d87def 100644
--- a/Mage.Sets/src/mage/cards/g/GaeasLiege.java
+++ b/Mage.Sets/src/mage/cards/g/GaeasLiege.java
@@ -1,6 +1,6 @@
-
package mage.cards.g;
+import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -28,14 +28,12 @@ import mage.game.combat.CombatGroup;
import mage.game.permanent.Permanent;
import mage.target.common.TargetLandPermanent;
-import java.util.UUID;
-
/**
*
* @author anonymous
*/
public final class GaeasLiege extends CardImpl {
-
+
final static FilterControlledPermanent filterLands = new FilterControlledPermanent("Forests you control");
static {
@@ -44,7 +42,7 @@ public final class GaeasLiege extends CardImpl {
public GaeasLiege(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}{G}");
-
+
this.subtype.add(SubType.AVATAR);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
@@ -55,8 +53,8 @@ public final class GaeasLiege extends CardImpl {
new SetPowerToughnessSourceEffect(new DefendersForestCount(), Duration.EndOfCombat),
new InvertCondition(SourceAttackingCondition.instance),
"As long as {this} isn't attacking, its power and toughness are each equal to the number of Forests you control. As long as {this} is attacking, its power and toughness are each equal to the number of Forests defending player controls.")));
- // {tap}: Target land becomes a Forest until Gaea's Liege leaves the battlefield.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.WhileOnBattlefield, SubType.FOREST), new TapSourceCost());
+ // {T}: Target land becomes a Forest until Gaea's Liege leaves the battlefield.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesBasicLandTargetEffect(Duration.UntilSourceLeavesBattlefield, SubType.FOREST), new TapSourceCost());
ability.addTarget(new TargetLandPermanent());
this.addAbility(ability);
}
@@ -75,7 +73,7 @@ class DefendersForestCount implements DynamicValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
- for (CombatGroup group :game.getCombat().getGroups()) {
+ for (CombatGroup group : game.getCombat().getGroups()) {
if (group.getAttackers().contains(sourceAbility.getSourceId())) {
UUID defenderId = group.getDefenderId();
if (group.isDefenderIsPlaneswalker()) {
@@ -84,7 +82,7 @@ class DefendersForestCount implements DynamicValue {
defenderId = permanent.getControllerId();
}
}
-
+
FilterLandPermanent filter = new FilterLandPermanent("forest");
filter.add(new SubtypePredicate(SubType.FOREST));
return game.getBattlefield().countAll(filter, defenderId, game);
diff --git a/Mage.Sets/src/mage/cards/g/GalecasterColossus.java b/Mage.Sets/src/mage/cards/g/GalecasterColossus.java
index 93ed2f360e3..9c00fb80e7d 100644
--- a/Mage.Sets/src/mage/cards/g/GalecasterColossus.java
+++ b/Mage.Sets/src/mage/cards/g/GalecasterColossus.java
@@ -34,7 +34,7 @@ public final class GalecasterColossus extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.NOT_YOU));
filter2.add(new SubtypePredicate(SubType.WIZARD));
- filter2.add(Predicates.not(new TappedPredicate()));
+ filter2.add(Predicates.not(TappedPredicate.instance));
}
public GalecasterColossus(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GalepowderMage.java b/Mage.Sets/src/mage/cards/g/GalepowderMage.java
index 28a2c19cce9..f59ef1f9271 100644
--- a/Mage.Sets/src/mage/cards/g/GalepowderMage.java
+++ b/Mage.Sets/src/mage/cards/g/GalepowderMage.java
@@ -1,7 +1,5 @@
-
package mage.cards.g;
-import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
@@ -15,8 +13,8 @@ import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.AnotherPredicate;
@@ -26,8 +24,9 @@ import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class GalepowderMage extends CardImpl {
@@ -35,11 +34,11 @@ public final class GalepowderMage extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GalepowderMage(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
this.subtype.add(SubType.KITHKIN);
this.subtype.add(SubType.WIZARD);
@@ -87,10 +86,10 @@ class GalepowderMageEffect extends OneShotEffect {
if (controller != null && sourceObject != null) {
if (getTargetPointer().getFirst(game, source) != null) {
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
- Card card = game.getCard(getTargetPointer().getFirst(game, source));
if (permanent != null) {
UUID exileId = UUID.randomUUID();
if (controller.moveCardToExileWithInfo(permanent, exileId, sourceObject.getIdName(), source.getSourceId(), game, Zone.BATTLEFIELD, true)) {
+ Card card = game.getCard(getTargetPointer().getFirst(game, source));
if (card != null) {
Effect effect = new ReturnToBattlefieldUnderOwnerControlTargetEffect();
effect.setTargetPointer(new FixedTarget(card.getId(), game.getState().getZoneChangeCounter(card.getId())));
diff --git a/Mage.Sets/src/mage/cards/g/Galestrike.java b/Mage.Sets/src/mage/cards/g/Galestrike.java
index 372e5bcb889..01a3fd7702d 100644
--- a/Mage.Sets/src/mage/cards/g/Galestrike.java
+++ b/Mage.Sets/src/mage/cards/g/Galestrike.java
@@ -20,7 +20,7 @@ public final class Galestrike extends CardImpl {
private static FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public Galestrike(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GallopingLizrog.java b/Mage.Sets/src/mage/cards/g/GallopingLizrog.java
new file mode 100644
index 00000000000..34362d524e8
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GallopingLizrog.java
@@ -0,0 +1,87 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.common.RemoveVariableCountersTargetCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.counters.CounterType;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.players.Player;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GallopingLizrog extends CardImpl {
+
+ public GallopingLizrog(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{U}");
+
+ this.subtype.add(SubType.FROG);
+ this.subtype.add(SubType.LIZARD);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // When Galloping Lizrog enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on Galloping Lizrog.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new GallopingLizrogEffect(), true));
+ }
+
+ private GallopingLizrog(final GallopingLizrog card) {
+ super(card);
+ }
+
+ @Override
+ public GallopingLizrog copy() {
+ return new GallopingLizrog(this);
+ }
+}
+
+class GallopingLizrogEffect extends OneShotEffect {
+
+ GallopingLizrogEffect() {
+ super(Outcome.Benefit);
+ staticText = "remove any number of +1/+1 counters from among creatures you control. " +
+ "If you do, put twice that many +1/+1 counters on {this}";
+ }
+
+ private GallopingLizrogEffect(final GallopingLizrogEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GallopingLizrogEffect copy() {
+ return new GallopingLizrogEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ RemoveVariableCountersTargetCost variableCost
+ = new RemoveVariableCountersTargetCost(StaticFilters.FILTER_CONTROLLED_CREATURE, CounterType.P1P1);
+ int toPay = variableCost.announceXValue(source, game);
+ Cost cost = variableCost.getFixedCostsFromAnnouncedValue(toPay);
+ if (!cost.pay(source, game, source.getSourceId(), source.getControllerId(), true)) {
+ return false;
+ }
+ return new AddCountersSourceEffect(
+ CounterType.P1P1.createInstance(2 * toPay)
+ ).apply(game, source);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/g/GallowsAtWillowHill.java b/Mage.Sets/src/mage/cards/g/GallowsAtWillowHill.java
index c8ca0944f9a..c7ce35b44fd 100644
--- a/Mage.Sets/src/mage/cards/g/GallowsAtWillowHill.java
+++ b/Mage.Sets/src/mage/cards/g/GallowsAtWillowHill.java
@@ -35,7 +35,7 @@ public final class GallowsAtWillowHill extends CardImpl {
private static final FilterControlledPermanent humanFilter = new FilterControlledPermanent("untapped Human you control");
static {
- humanFilter.add(Predicates.not(new TappedPredicate()));
+ humanFilter.add(Predicates.not(TappedPredicate.instance));
humanFilter.add(new SubtypePredicate(SubType.HUMAN));
}
diff --git a/Mage.Sets/src/mage/cards/g/GameOfChaos.java b/Mage.Sets/src/mage/cards/g/GameOfChaos.java
index 6c5f2f9386c..53010b05fa4 100644
--- a/Mage.Sets/src/mage/cards/g/GameOfChaos.java
+++ b/Mage.Sets/src/mage/cards/g/GameOfChaos.java
@@ -63,7 +63,7 @@ class GameOfChaosEffect extends OneShotEffect {
if (you != null && targetOpponent != null) {
boolean continueFlipping = true;
- boolean youWonFlip = you.flipCoin(game); // controller flips first
+ boolean youWonFlip = you.flipCoin(source, game, true); // controller flips first
boolean youWonLastFlip = false; // tracks if you won the flip last, negation of it means opponent won last
int lifeAmount = 1; // starts stakes with 1 life
@@ -88,7 +88,7 @@ class GameOfChaosEffect extends OneShotEffect {
if (continueFlipping) {
lifeAmount *= 2; // double the life each time
- youWonFlip = youWonLastFlip ? you.flipCoin(game) : !targetOpponent.flipCoin(game); // negate the opponent's results for proper evaluation of if you won in next iteration
+ youWonFlip = youWonLastFlip ? you.flipCoin(source, game, true) : !targetOpponent.flipCoin(source, game, true); // negate the opponent's results for proper evaluation of if you won in next iteration
}
}
diff --git a/Mage.Sets/src/mage/cards/g/GangUp.java b/Mage.Sets/src/mage/cards/g/GangUp.java
index 7c68d54158b..a49f70ff1d3 100644
--- a/Mage.Sets/src/mage/cards/g/GangUp.java
+++ b/Mage.Sets/src/mage/cards/g/GangUp.java
@@ -1,9 +1,7 @@
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.keyword.AssistAbility;
import mage.cards.CardImpl;
@@ -14,9 +12,11 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class GangUp extends CardImpl {
@@ -28,27 +28,29 @@ public final class GangUp extends CardImpl {
this.addAbility(new AssistAbility());
// Destroy target creature with power X or less.
- this.getSpellAbility().addEffect(new DestroyTargetEffect());
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with power X or less")));
+ this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with power X or less"));
+ this.getSpellAbility().setTargetAdjuster(GangUpAdjuster.instance);
}
public GangUp(final GangUp card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- int xValue = ability.getManaCostsToPay().getX();
- ability.getTargets().clear();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power " + xValue + " or less");
- filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1));
- ability.addTarget(new TargetCreaturePermanent(filter));
- }
- }
-
@Override
public GangUp copy() {
return new GangUp(this);
}
}
+
+enum GangUpAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.getTargets().clear();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power " + xValue + " or less");
+ filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/g/GargantuanGorilla.java b/Mage.Sets/src/mage/cards/g/GargantuanGorilla.java
index d7a31647a16..31c0bbbcf4b 100644
--- a/Mage.Sets/src/mage/cards/g/GargantuanGorilla.java
+++ b/Mage.Sets/src/mage/cards/g/GargantuanGorilla.java
@@ -51,7 +51,7 @@ public final class GargantuanGorilla extends CardImpl {
// {T}: Gargantuan Gorilla deals damage equal to its power to another target creature. That creature deals damage equal to its power to Gargantuan Gorilla.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GargantuanGorillaFightEffect(), new TapSourceCost());
FilterCreaturePermanent filter = new FilterCreaturePermanent();
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/g/GarnaTheBloodflame.java b/Mage.Sets/src/mage/cards/g/GarnaTheBloodflame.java
index 74585b1ffe8..45dbfaa66c0 100644
--- a/Mage.Sets/src/mage/cards/g/GarnaTheBloodflame.java
+++ b/Mage.Sets/src/mage/cards/g/GarnaTheBloodflame.java
@@ -80,7 +80,7 @@ class GarnaTheBloodflameEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- GarnaTheBloodflameWatcher watcher = (GarnaTheBloodflameWatcher) game.getState().getWatchers().get(GarnaTheBloodflameWatcher.class.getSimpleName());
+ GarnaTheBloodflameWatcher watcher = game.getState().getWatcher(GarnaTheBloodflameWatcher.class);
if (watcher != null) {
Set toHand = new HashSet<>();
for (UUID cardId : watcher.getCardsPutToGraveyardThisTurn()) {
diff --git a/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java b/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java
index 58e8d5284b5..c3675b96765 100644
--- a/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java
+++ b/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java
@@ -1,7 +1,5 @@
-
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
@@ -12,7 +10,10 @@ import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.GetEmblemTargetPlayerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.permanent.AnotherPredicate;
@@ -25,8 +26,9 @@ import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class GarrukApexPredator extends CardImpl {
@@ -35,7 +37,7 @@ public final class GarrukApexPredator extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.PLANESWALKER));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GarrukApexPredator(UUID ownerId, CardSetInfo setInfo) {
@@ -62,7 +64,6 @@ public final class GarrukApexPredator extends CardImpl {
// -8: Target opponent gets an emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn."
Effect effect = new GetEmblemTargetPlayerEffect(new GarrukApexPredatorEmblem());
- effect.setText("Target opponent gets an emblem with \"Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn.\"");
ability = new LoyaltyAbility(effect, -8);
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/g/GarruksPackleader.java b/Mage.Sets/src/mage/cards/g/GarruksPackleader.java
index 52fbd222054..92a47c10164 100644
--- a/Mage.Sets/src/mage/cards/g/GarruksPackleader.java
+++ b/Mage.Sets/src/mage/cards/g/GarruksPackleader.java
@@ -25,7 +25,7 @@ public final class GarruksPackleader extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature with power 3 or greater");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 2));
}
diff --git a/Mage.Sets/src/mage/cards/g/GateColossus.java b/Mage.Sets/src/mage/cards/g/GateColossus.java
index 161b449d1dc..0855be3d71c 100644
--- a/Mage.Sets/src/mage/cards/g/GateColossus.java
+++ b/Mage.Sets/src/mage/cards/g/GateColossus.java
@@ -65,7 +65,7 @@ public final class GateColossus extends CardImpl {
class GateColossusCostReductionEffect extends CostModificationEffectImpl {
- static final FilterControlledPermanent filter = new FilterControlledPermanent();
+ static final FilterControlledPermanent filter = new FilterControlledPermanent("a Gate");
static {
filter.add(new SubtypePredicate(SubType.GATE));
diff --git a/Mage.Sets/src/mage/cards/g/GateToTheAfterlife.java b/Mage.Sets/src/mage/cards/g/GateToTheAfterlife.java
index 8bc4dba224e..5ffff388271 100644
--- a/Mage.Sets/src/mage/cards/g/GateToTheAfterlife.java
+++ b/Mage.Sets/src/mage/cards/g/GateToTheAfterlife.java
@@ -42,7 +42,7 @@ public final class GateToTheAfterlife extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public GateToTheAfterlife(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GatebreakerRam.java b/Mage.Sets/src/mage/cards/g/GatebreakerRam.java
new file mode 100644
index 00000000000..5a9a159ea42
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GatebreakerRam.java
@@ -0,0 +1,76 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GatebreakerRam extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterControlledPermanent();
+
+ static {
+ filter.add(new SubtypePredicate(SubType.GATE));
+ }
+
+ private static final DynamicValue xValue
+ = new PermanentsOnBattlefieldCount(filter);
+ private static final Condition condition
+ = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1);
+
+ public GatebreakerRam(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
+
+ this.subtype.add(SubType.SHEEP);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Gatebreaker Ram gets +1/+1 for each Gate you control.
+ this.addAbility(new SimpleStaticAbility(
+ new BoostSourceEffect(xValue, xValue, Duration.WhileOnBattlefield)
+ .setText("{this} gets +1/+1 for each Gate you control.")
+ ));
+
+ // As long as you control two or more Gates, Gatebreaker Ram has vigilance and trample.
+ Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
+ new GainAbilitySourceEffect(VigilanceAbility.getInstance()),
+ condition, "As long as you control two or more Gates, {this} has vigilance"
+ ));
+ ability.addEffect(new ConditionalContinuousEffect(
+ new GainAbilitySourceEffect(TrampleAbility.getInstance()),
+ condition, "and trample"
+ ));
+ this.addAbility(ability);
+ }
+
+ private GatebreakerRam(final GatebreakerRam card) {
+ super(card);
+ }
+
+ @Override
+ public GatebreakerRam copy() {
+ return new GatebreakerRam(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GatesAblaze.java b/Mage.Sets/src/mage/cards/g/GatesAblaze.java
new file mode 100644
index 00000000000..780aa83f1af
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GatesAblaze.java
@@ -0,0 +1,46 @@
+package mage.cards.g;
+
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.effects.common.DamageAllEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GatesAblaze extends CardImpl {
+
+ private static final FilterPermanent filter
+ = new FilterControlledPermanent("the number of Gates you control");
+
+ static {
+ filter.add(new SubtypePredicate(SubType.GATE));
+ }
+
+ private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter);
+
+ public GatesAblaze(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}");
+
+ // Gates Ablaze deals X damage to each creature, where X is the number of Gates you control.
+ this.getSpellAbility().addEffect(new DamageAllEffect(xValue, StaticFilters.FILTER_PERMANENT_CREATURE));
+ }
+
+ private GatesAblaze(final GatesAblaze card) {
+ super(card);
+ }
+
+ @Override
+ public GatesAblaze copy() {
+ return new GatesAblaze(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GatewayShade.java b/Mage.Sets/src/mage/cards/g/GatewayShade.java
index 684d873a8e2..cb36365322d 100644
--- a/Mage.Sets/src/mage/cards/g/GatewayShade.java
+++ b/Mage.Sets/src/mage/cards/g/GatewayShade.java
@@ -28,7 +28,7 @@ public final class GatewayShade extends CardImpl {
private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("untapped Gate you control");
static {
filter.add(new SubtypePredicate(SubType.GATE));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public GatewayShade(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GatewaySneak.java b/Mage.Sets/src/mage/cards/g/GatewaySneak.java
new file mode 100644
index 00000000000..9d0596cb775
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GatewaySneak.java
@@ -0,0 +1,51 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GatewaySneak extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterPermanent(SubType.GATE, "a Gate");
+
+ public GatewaySneak(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
+
+ this.subtype.add(SubType.VEDALKEN);
+ this.subtype.add(SubType.ROGUE);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(3);
+
+ // Whenever a Gate enters the battlefield under your control, Gateway Sneak can't be blocked this turn.
+ this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
+ new CantBeBlockedSourceEffect(Duration.EndOfTurn), filter
+ ));
+
+ // Whenever Gateway Sneak deals combat damage to a player, draw a card.
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
+ new DrawCardSourceControllerEffect(1), false
+ ));
+ }
+
+ private GatewaySneak(final GatewaySneak card) {
+ super(card);
+ }
+
+ @Override
+ public GatewaySneak copy() {
+ return new GatewaySneak(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GatherSpecimens.java b/Mage.Sets/src/mage/cards/g/GatherSpecimens.java
index 812e8a993e5..9efc66b27bd 100644
--- a/Mage.Sets/src/mage/cards/g/GatherSpecimens.java
+++ b/Mage.Sets/src/mage/cards/g/GatherSpecimens.java
@@ -1,7 +1,5 @@
-
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.cards.Card;
@@ -16,14 +14,15 @@ import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class GatherSpecimens extends CardImpl {
public GatherSpecimens(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{U}{U}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}{U}{U}");
// If a creature would enter the battlefield under an opponent's control this turn, it enters the battlefield under your control instead.
this.getSpellAbility().addEffect(new GatherSpecimensReplacementEffect());
@@ -70,7 +69,7 @@ class GatherSpecimensReplacementEffect extends ReplacementEffectImpl {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE
&& ((ZoneChangeEvent) event).getToZone().match(Zone.BATTLEFIELD)) {
Card card = game.getCard(event.getTargetId());
- if (card.isCreature()) { // TODO: Bestow Card cast as Enchantment probably not handled correctly
+ if (card != null && card.isCreature()) { // TODO: Bestow Card cast as Enchantment probably not handled correctly
Player controller = game.getPlayer(source.getControllerId());
if (controller != null && controller.hasOpponent(event.getPlayerId(), game)) {
return true;
@@ -79,9 +78,7 @@ class GatherSpecimensReplacementEffect extends ReplacementEffectImpl {
}
if (event.getType() == GameEvent.EventType.CREATE_TOKEN && event.getFlag()) { // flag indicates if it's a creature token
Player controller = game.getPlayer(source.getControllerId());
- if (controller != null && controller.hasOpponent(event.getPlayerId(), game)) {
- return true;
- }
+ return controller != null && controller.hasOpponent(event.getPlayerId(), game);
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/g/GavonyUnhallowed.java b/Mage.Sets/src/mage/cards/g/GavonyUnhallowed.java
index f8d8ce3d8e5..17b8d03727f 100644
--- a/Mage.Sets/src/mage/cards/g/GavonyUnhallowed.java
+++ b/Mage.Sets/src/mage/cards/g/GavonyUnhallowed.java
@@ -24,7 +24,7 @@ public final class GavonyUnhallowed extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/g/GazeOfJustice.java b/Mage.Sets/src/mage/cards/g/GazeOfJustice.java
index 4735ad605b7..10b93cd0ba4 100644
--- a/Mage.Sets/src/mage/cards/g/GazeOfJustice.java
+++ b/Mage.Sets/src/mage/cards/g/GazeOfJustice.java
@@ -28,7 +28,7 @@ public final class GazeOfJustice extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.WHITE));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public GazeOfJustice(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GazeOfTheGorgon.java b/Mage.Sets/src/mage/cards/g/GazeOfTheGorgon.java
index ecdd1863e5f..c2889337d5c 100644
--- a/Mage.Sets/src/mage/cards/g/GazeOfTheGorgon.java
+++ b/Mage.Sets/src/mage/cards/g/GazeOfTheGorgon.java
@@ -98,7 +98,7 @@ class GazeOfTheGorgonEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null && targetCreature != null) {
- BlockedAttackerWatcher watcher = (BlockedAttackerWatcher) game.getState().getWatchers().get(BlockedAttackerWatcher.class.getSimpleName());
+ BlockedAttackerWatcher watcher = game.getState().getWatcher(BlockedAttackerWatcher.class);
if (watcher != null) {
List toDestroy = new ArrayList<>();
for (Permanent creature : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/g/GeneralHux.java b/Mage.Sets/src/mage/cards/g/GeneralHux.java
index 653a5381f2a..42bfd880d24 100644
--- a/Mage.Sets/src/mage/cards/g/GeneralHux.java
+++ b/Mage.Sets/src/mage/cards/g/GeneralHux.java
@@ -29,7 +29,7 @@ public final class GeneralHux extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public GeneralHux(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GeneratorServant.java b/Mage.Sets/src/mage/cards/g/GeneratorServant.java
index 567c43884d7..9ecc3a190dd 100644
--- a/Mage.Sets/src/mage/cards/g/GeneratorServant.java
+++ b/Mage.Sets/src/mage/cards/g/GeneratorServant.java
@@ -63,7 +63,7 @@ class GeneratorServantWatcher extends Watcher {
public List creatures = new ArrayList<>();
public GeneratorServantWatcher() {
- super(GeneratorServantWatcher.class.getSimpleName(), WatcherScope.CARD);
+ super(GeneratorServantWatcher.class, WatcherScope.CARD);
}
public GeneratorServantWatcher(final GeneratorServantWatcher watcher) {
@@ -114,7 +114,7 @@ class GeneratorServantHasteEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
- GeneratorServantWatcher watcher = (GeneratorServantWatcher) game.getState().getWatchers().get(GeneratorServantWatcher.class.getSimpleName(), source.getSourceId());
+ GeneratorServantWatcher watcher = game.getState().getWatcher(GeneratorServantWatcher.class, source.getSourceId());
if (watcher != null) {
for (Permanent perm : game.getBattlefield().getAllActivePermanents()) {
if (watcher.creatures.contains(perm.getId())) {
diff --git a/Mage.Sets/src/mage/cards/g/GenesisChamber.java b/Mage.Sets/src/mage/cards/g/GenesisChamber.java
index 709aa2b5237..a739a91f3c9 100644
--- a/Mage.Sets/src/mage/cards/g/GenesisChamber.java
+++ b/Mage.Sets/src/mage/cards/g/GenesisChamber.java
@@ -30,7 +30,7 @@ public final class GenesisChamber extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public GenesisChamber(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GeodeGolem.java b/Mage.Sets/src/mage/cards/g/GeodeGolem.java
index f4842176da5..d35482b02e4 100644
--- a/Mage.Sets/src/mage/cards/g/GeodeGolem.java
+++ b/Mage.Sets/src/mage/cards/g/GeodeGolem.java
@@ -1,6 +1,5 @@
package mage.cards.g;
-import java.util.UUID;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
@@ -20,8 +19,9 @@ import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author spjspj
*/
public final class GeodeGolem extends CardImpl {
@@ -68,7 +68,6 @@ class GeodeGolemEffect extends OneShotEffect {
for (UUID commanderId : controller.getCommandersIds()) {
if (game.getState().getZone(commanderId) == Zone.COMMAND) {
Card commander = game.getCard(commanderId);
-
if (commander != null && game.getState().getZone(commanderId) == Zone.COMMAND) {
SpellAbility ability = commander.getSpellAbility();
SpellAbility newAbility = commander.getSpellAbility().copy();
diff --git a/Mage.Sets/src/mage/cards/g/GeralfsMasterpiece.java b/Mage.Sets/src/mage/cards/g/GeralfsMasterpiece.java
index 629686108cc..f5137eb43b0 100644
--- a/Mage.Sets/src/mage/cards/g/GeralfsMasterpiece.java
+++ b/Mage.Sets/src/mage/cards/g/GeralfsMasterpiece.java
@@ -41,7 +41,7 @@ public final class GeralfsMasterpiece extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Geralf's Masterpiece gets -1/-1 for each card in your hand.
- DynamicValue count = new SignInversionDynamicValue(new CardsInControllerHandCount());
+ DynamicValue count = new SignInversionDynamicValue(CardsInControllerHandCount.instance);
Effect effect = new BoostSourceEffect(count, count, Duration.WhileOnBattlefield);
effect.setText("{this} gets -1/-1 for each card in your hand");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
diff --git a/Mage.Sets/src/mage/cards/g/GerrardsWisdom.java b/Mage.Sets/src/mage/cards/g/GerrardsWisdom.java
index 23e378f90a5..27694f04d26 100644
--- a/Mage.Sets/src/mage/cards/g/GerrardsWisdom.java
+++ b/Mage.Sets/src/mage/cards/g/GerrardsWisdom.java
@@ -20,7 +20,7 @@ public final class GerrardsWisdom extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{W}{W}");
// You gain 2 life for each card in your hand.
- this.getSpellAbility().addEffect(new GainLifeEffect(new MultipliedValue(new CardsInControllerHandCount(), 2),
+ this.getSpellAbility().addEffect(new GainLifeEffect(new MultipliedValue(CardsInControllerHandCount.instance, 2),
"You gain 2 life for each card in your hand"));
}
diff --git a/Mage.Sets/src/mage/cards/g/GetThePoint.java b/Mage.Sets/src/mage/cards/g/GetThePoint.java
new file mode 100644
index 00000000000..1e618822375
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GetThePoint.java
@@ -0,0 +1,34 @@
+package mage.cards.g;
+
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.keyword.ScryEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GetThePoint extends CardImpl {
+
+ public GetThePoint(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{B}{R}");
+
+ // Destroy target creature. Scry 1.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addEffect(new ScryEffect(1));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ private GetThePoint(final GetThePoint card) {
+ super(card);
+ }
+
+ @Override
+ public GetThePoint copy() {
+ return new GetThePoint(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GhirapurAetherGrid.java b/Mage.Sets/src/mage/cards/g/GhirapurAetherGrid.java
index da3c5fdb830..68ee5462a09 100644
--- a/Mage.Sets/src/mage/cards/g/GhirapurAetherGrid.java
+++ b/Mage.Sets/src/mage/cards/g/GhirapurAetherGrid.java
@@ -26,7 +26,7 @@ public final class GhirapurAetherGrid extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.ARTIFACT));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public GhirapurAetherGrid(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GhituFire.java b/Mage.Sets/src/mage/cards/g/GhituFire.java
index 4da3bde52b3..02c5fb90c3d 100644
--- a/Mage.Sets/src/mage/cards/g/GhituFire.java
+++ b/Mage.Sets/src/mage/cards/g/GhituFire.java
@@ -23,7 +23,7 @@ public final class GhituFire extends CardImpl {
public GhituFire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}");
- Effect effect = new DamageTargetEffect(new ManacostVariableValue());
+ Effect effect = new DamageTargetEffect(ManacostVariableValue.instance);
// You may cast Ghitu Fire as though it had flash if you pay {2} more to cast it.
Ability ability = new PayMoreToCastAsThoughtItHadFlashAbility(this, new ManaCostsImpl("{2}"));
ability.addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/g/GhituJourneymage.java b/Mage.Sets/src/mage/cards/g/GhituJourneymage.java
index 2c7c677c62f..8075d92fd95 100644
--- a/Mage.Sets/src/mage/cards/g/GhituJourneymage.java
+++ b/Mage.Sets/src/mage/cards/g/GhituJourneymage.java
@@ -26,7 +26,7 @@ public final class GhituJourneymage extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Wizard");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.WIZARD));
}
diff --git a/Mage.Sets/src/mage/cards/g/GhorClanWrecker.java b/Mage.Sets/src/mage/cards/g/GhorClanWrecker.java
new file mode 100644
index 00000000000..eaa24ff1726
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GhorClanWrecker.java
@@ -0,0 +1,41 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.keyword.MenaceAbility;
+import mage.abilities.keyword.RiotAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GhorClanWrecker extends CardImpl {
+
+ public GhorClanWrecker(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.WARRIOR);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Riot
+ this.addAbility(new RiotAbility());
+
+ // Menace
+ this.addAbility(new MenaceAbility());
+ }
+
+ private GhorClanWrecker(final GhorClanWrecker card) {
+ super(card);
+ }
+
+ @Override
+ public GhorClanWrecker copy() {
+ return new GhorClanWrecker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GhostlyWings.java b/Mage.Sets/src/mage/cards/g/GhostlyWings.java
index 68832eec277..0451e1a3879 100644
--- a/Mage.Sets/src/mage/cards/g/GhostlyWings.java
+++ b/Mage.Sets/src/mage/cards/g/GhostlyWings.java
@@ -80,7 +80,7 @@ class GhostlyWingsReturnEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Permanent permanent = (Permanent) game.getPermanentOrLKIBattlefield(source.getSourceId());
+ Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
Player controller = game.getPlayer(source.getControllerId());
if (controller != null && permanent != null && permanent.getAttachedTo() != null) {
Permanent enchantedCreature = game.getPermanent(permanent.getAttachedTo());
diff --git a/Mage.Sets/src/mage/cards/g/Ghostway.java b/Mage.Sets/src/mage/cards/g/Ghostway.java
index 5f965b71af6..957731373be 100644
--- a/Mage.Sets/src/mage/cards/g/Ghostway.java
+++ b/Mage.Sets/src/mage/cards/g/Ghostway.java
@@ -76,7 +76,7 @@ class GhostwayEffect extends OneShotEffect {
Cards cardsToReturn = new CardsImpl();
for (Card exiled : toExile) {
- if (((Permanent) exiled).getZoneChangeCounter(game) == game.getState().getZoneChangeCounter(exiled.getId()) - 1) {
+ if (exiled.getZoneChangeCounter(game) == game.getState().getZoneChangeCounter(exiled.getId()) - 1) {
cardsToReturn.add(exiled);
}
}
diff --git a/Mage.Sets/src/mage/cards/g/GhoulcallerGisa.java b/Mage.Sets/src/mage/cards/g/GhoulcallerGisa.java
index 273ee197600..89b9458fc49 100644
--- a/Mage.Sets/src/mage/cards/g/GhoulcallerGisa.java
+++ b/Mage.Sets/src/mage/cards/g/GhoulcallerGisa.java
@@ -40,7 +40,7 @@ public final class GhoulcallerGisa extends CardImpl {
this.toughness = new MageInt(4);
// {B}, {tap}, Sacrifice another creature: create X 2/2 black Zombie creature tokens, where X is the sacrificed creature's power.
- DynamicValue xValue = new SacrificeCostCreaturesPower();
+ DynamicValue xValue = SacrificeCostCreaturesPower.instance;
Token zombie = new ZombieToken();
zombie.setTokenType(2);
Effect effect = new CreateTokenEffect(zombie, xValue);
diff --git a/Mage.Sets/src/mage/cards/g/GiantOyster.java b/Mage.Sets/src/mage/cards/g/GiantOyster.java
index 53e103906b8..6b4dacd0288 100644
--- a/Mage.Sets/src/mage/cards/g/GiantOyster.java
+++ b/Mage.Sets/src/mage/cards/g/GiantOyster.java
@@ -37,7 +37,7 @@ public final class GiantOyster extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public GiantOyster(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GiantSlug.java b/Mage.Sets/src/mage/cards/g/GiantSlug.java
new file mode 100644
index 00000000000..8cfc8d42f3d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GiantSlug.java
@@ -0,0 +1,104 @@
+
+package mage.cards.g;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.delayed.AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.LandwalkAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.choices.ChoiceBasicLandType;
+import mage.choices.ChoiceImpl;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+
+/**
+ *
+ * @author L_J
+ */
+public final class GiantSlug extends CardImpl {
+
+ public GiantSlug(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}");
+ this.subtype.add(SubType.SLUG);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {5}: At the beginning of your next upkeep, choose a basic land type. Giant Slug gains landwalk of the chosen type until the end of that turn.
+ AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility ability = new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(new GiantSlugEffect());
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateDelayedTriggeredAbilityEffect(ability), new ManaCostsImpl("{5}")));
+ }
+
+ public GiantSlug(final GiantSlug card) {
+ super(card);
+ }
+
+ @Override
+ public GiantSlug copy() {
+ return new GiantSlug(this);
+ }
+
+}
+
+class GiantSlugEffect extends OneShotEffect {
+
+ public GiantSlugEffect() {
+ super(Outcome.AddAbility);
+ this.staticText = "At the beginning of your next upkeep, choose a basic land type. {this} gains landwalk of the chosen type until the end of that turn";
+ }
+
+ public GiantSlugEffect(final GiantSlugEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GiantSlugEffect copy() {
+ return new GiantSlugEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
+ if (controller != null && sourcePermanent != null) {
+ ChoiceImpl choices = new ChoiceBasicLandType();
+ if (controller.choose(outcome, choices, game)) {
+ game.informPlayers(sourcePermanent.getName() + ": Chosen basic land type is " + choices.getChoice());
+ FilterLandPermanent filter = new FilterLandPermanent(choices.getChoice());
+ if (choices.getChoice().equals("Plains")) {
+ filter.add(new SubtypePredicate(SubType.PLAINS));
+ }
+ if (choices.getChoice().equals("Island")) {
+ filter.add(new SubtypePredicate(SubType.ISLAND));
+ }
+ if (choices.getChoice().equals("Swamp")) {
+ filter.add(new SubtypePredicate(SubType.SWAMP));
+ }
+ if (choices.getChoice().equals("Mountain")) {
+ filter.add(new SubtypePredicate(SubType.MOUNTAIN));
+ }
+ if (choices.getChoice().equals("Forest")) {
+ filter.add(new SubtypePredicate(SubType.FOREST));
+ }
+ Ability landwalkAbility = new LandwalkAbility(filter);
+ game.addEffect(new GainAbilitySourceEffect(landwalkAbility, Duration.EndOfTurn, false), source);
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GiantTurtle.java b/Mage.Sets/src/mage/cards/g/GiantTurtle.java
index 6d0e100c751..fb72e5c8488 100644
--- a/Mage.Sets/src/mage/cards/g/GiantTurtle.java
+++ b/Mage.Sets/src/mage/cards/g/GiantTurtle.java
@@ -63,7 +63,7 @@ class CantAttackIfAttackedLastTurnEffect extends RestrictionEffect {
@Override
public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game) {
- AttackedLastTurnWatcher watcher = (AttackedLastTurnWatcher) game.getState().getWatchers().get(AttackedLastTurnWatcher.class.getSimpleName());
+ AttackedLastTurnWatcher watcher = game.getState().getWatcher(AttackedLastTurnWatcher.class);
if (watcher != null) {
Set attackingCreatures = watcher.getAttackedLastTurnCreatures(attacker.getControllerId());
MageObjectReference mor = new MageObjectReference(attacker, game);
diff --git a/Mage.Sets/src/mage/cards/g/GideonJura.java b/Mage.Sets/src/mage/cards/g/GideonJura.java
index d18f5028910..12c783c9ed9 100644
--- a/Mage.Sets/src/mage/cards/g/GideonJura.java
+++ b/Mage.Sets/src/mage/cards/g/GideonJura.java
@@ -35,7 +35,7 @@ public final class GideonJura extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public GideonJura(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/Gigantoplasm.java b/Mage.Sets/src/mage/cards/g/Gigantoplasm.java
index 2b0eab220b3..df6f0f4eaee 100644
--- a/Mage.Sets/src/mage/cards/g/Gigantoplasm.java
+++ b/Mage.Sets/src/mage/cards/g/Gigantoplasm.java
@@ -57,7 +57,7 @@ class GigantoplasmApplyToPermanent extends ApplyToPermanent {
@Override
public boolean apply(Game game, Permanent permanent, Ability source, UUID copyToObjectId) {
- DynamicValue variableMana = new ManacostVariableValue();
+ DynamicValue variableMana = ManacostVariableValue.instance;
Effect effect = new SetPowerToughnessSourceEffect(variableMana, Duration.WhileOnBattlefield, SubLayer.SetPT_7b);
effect.setText("This creature has base power and toughness X/X");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}"));
@@ -67,7 +67,7 @@ class GigantoplasmApplyToPermanent extends ApplyToPermanent {
@Override
public boolean apply(Game game, MageObject mageObject, Ability source, UUID copyToObjectId) {
- DynamicValue variableMana = new ManacostVariableValue();
+ DynamicValue variableMana = ManacostVariableValue.instance;
Effect effect = new SetPowerToughnessSourceEffect(variableMana, Duration.WhileOnBattlefield, SubLayer.SetPT_7b);
effect.setText("This creature has base power and toughness X/X");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}"));
diff --git a/Mage.Sets/src/mage/cards/g/GildedCerodon.java b/Mage.Sets/src/mage/cards/g/GildedCerodon.java
index c2abfda6960..f89e51e141e 100644
--- a/Mage.Sets/src/mage/cards/g/GildedCerodon.java
+++ b/Mage.Sets/src/mage/cards/g/GildedCerodon.java
@@ -1,4 +1,3 @@
-
package mage.cards.g;
import java.util.UUID;
@@ -66,12 +65,8 @@ class GildedCerodonCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- if (controller != null
- && (!game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game).isEmpty()
- || controller.getGraveyard().count(filter2, game) > 0)) {
- return true;
- }
- return false;
+ return (!game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game).isEmpty()
+ || !controller.getGraveyard().getCards(filter2, game).isEmpty());
}
@Override
diff --git a/Mage.Sets/src/mage/cards/g/GiltspireAvenger.java b/Mage.Sets/src/mage/cards/g/GiltspireAvenger.java
index 82ac97ef3c9..1c0fd0e8693 100644
--- a/Mage.Sets/src/mage/cards/g/GiltspireAvenger.java
+++ b/Mage.Sets/src/mage/cards/g/GiltspireAvenger.java
@@ -68,7 +68,7 @@ class GiltspireAvengerTarget extends TargetPermanent {
@Override
public boolean canTarget(UUID id, Ability source, Game game) {
- PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get(PlayerDamagedBySourceWatcher.class.getSimpleName(), source.getControllerId());
+ PlayerDamagedBySourceWatcher watcher = game.getState().getWatcher(PlayerDamagedBySourceWatcher.class, source.getControllerId());
if (watcher != null && watcher.hasSourceDoneDamage(id, game)) {
return super.canTarget(id, source, game);
}
@@ -79,7 +79,7 @@ class GiltspireAvengerTarget extends TargetPermanent {
public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
Set availablePossibleTargets = super.possibleTargets(sourceId, sourceControllerId, game);
Set possibleTargets = new HashSet<>();
- PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get(PlayerDamagedBySourceWatcher.class.getSimpleName(), sourceControllerId);
+ PlayerDamagedBySourceWatcher watcher = game.getState().getWatcher(PlayerDamagedBySourceWatcher.class, sourceControllerId);
for (UUID targetId : availablePossibleTargets) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null && watcher != null && watcher.hasSourceDoneDamage(targetId, game)) {
@@ -97,7 +97,7 @@ class GiltspireAvengerTarget extends TargetPermanent {
}
int count = 0;
MageObject targetSource = game.getObject(sourceId);
- PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get(PlayerDamagedBySourceWatcher.class.getSimpleName(), sourceControllerId);
+ PlayerDamagedBySourceWatcher watcher = game.getState().getWatcher(PlayerDamagedBySourceWatcher.class, sourceControllerId);
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)
&& watcher != null && watcher.hasSourceDoneDamage(permanent.getId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/g/GisaAndGeralf.java b/Mage.Sets/src/mage/cards/g/GisaAndGeralf.java
index 66e7d23cbd8..78c98594496 100644
--- a/Mage.Sets/src/mage/cards/g/GisaAndGeralf.java
+++ b/Mage.Sets/src/mage/cards/g/GisaAndGeralf.java
@@ -120,8 +120,8 @@ class GisaAndGeralfCastFromGraveyardEffect extends AsThoughEffectImpl {
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (objectId.equals(getTargetPointer().getFirst(game, source))) {
if (affectedControllerId.equals(source.getControllerId())) {
- GisaAndGeralfWatcher watcher = (GisaAndGeralfWatcher) game.getState().getWatchers().get(GisaAndGeralfWatcher.class.getSimpleName(), source.getSourceId());
- return !watcher.isAbilityUsed();
+ GisaAndGeralfWatcher watcher = game.getState().getWatcher(GisaAndGeralfWatcher.class, source.getSourceId());
+ return watcher != null && !watcher.isAbilityUsed();
}
}
return false;
@@ -145,7 +145,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.isCreature() && spell.hasSubtype(SubType.ZOMBIE, game)) {
+ if (spell != null && spell.isCreature() && spell.hasSubtype(SubType.ZOMBIE, game)) {
abilityUsed = true;
}
}
diff --git a/Mage.Sets/src/mage/cards/g/Glaciers.java b/Mage.Sets/src/mage/cards/g/Glaciers.java
new file mode 100644
index 00000000000..6d2ae05de93
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/Glaciers.java
@@ -0,0 +1,133 @@
+package mage.cards.g;
+
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.RedManaAbility;
+
+/**
+ *
+ * @author jmharmon
+ */
+public final class Glaciers extends CardImpl {
+
+ public Glaciers(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{U}");
+
+ // At the beginning of your upkeep, sacrifice Glaciers unless you pay {W}{U}.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{W}{U}")), TargetController.YOU, false));
+
+ // All Mountains are Plains.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GlaciersEffect()));
+ }
+
+ public Glaciers(final Glaciers card) {
+ super(card);
+ }
+
+ @Override
+ public Glaciers copy() {
+ return new Glaciers(this);
+ }
+
+ static class GlaciersEffect extends ContinuousEffectImpl {
+
+ GlaciersEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
+ this.staticText = "All Mountains are Plains";
+ }
+
+ GlaciersEffect(final GlaciersEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
+
+ @Override
+ public GlaciersEffect copy() {
+ return new GlaciersEffect(this);
+ }
+
+ @Override
+ public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
+ for (Permanent land : game.getBattlefield().getAllActivePermanents(CardType.LAND)) {
+ switch (layer) {
+ case TypeChangingEffects_4:
+ if (land.getSubtype(game).contains(SubType.MOUNTAIN)) {
+ land.getSubtype(game).clear();
+ land.getSubtype(game).add(SubType.PLAINS);
+ game.getState().setValue("glaciers"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game), "true");
+ }
+ break;
+ case AbilityAddingRemovingEffects_6:
+ if (game.getState().getValue("glaciers"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game)) != null
+ && game.getState().getValue("glaciers"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game)).equals("true")) {
+ land.removeAllAbilities(source.getSourceId(), game);
+ if (land.getSubtype(game).contains(SubType.FOREST)) {
+ land.addAbility(new GreenManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.PLAINS)) {
+ land.addAbility(new WhiteManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.MOUNTAIN)) {
+ land.addAbility(new RedManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.ISLAND)) {
+ land.addAbility(new BlueManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.SWAMP)) {
+ land.addAbility(new BlackManaAbility(), source.getSourceId(), game);
+ }
+ }
+ break;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean hasLayer(Layer layer) {
+ return layer == Layer.AbilityAddingRemovingEffects_6
+ || layer == Layer.TypeChangingEffects_4;
+ }
+
+ @Override
+ public Set isDependentTo(List allEffectsInLayer) {
+ return allEffectsInLayer
+ .stream()
+ .filter(effect -> effect.getDependencyTypes().contains(DependencyType.BecomePlains))
+ .map(Effect::getId)
+ .collect(Collectors.toSet());
+ }
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GlareOfSubdual.java b/Mage.Sets/src/mage/cards/g/GlareOfSubdual.java
index 372a87e19dd..8683602db50 100644
--- a/Mage.Sets/src/mage/cards/g/GlareOfSubdual.java
+++ b/Mage.Sets/src/mage/cards/g/GlareOfSubdual.java
@@ -28,7 +28,7 @@ public final class GlareOfSubdual extends CardImpl {
private static final FilterPermanent filterTarget = new FilterPermanent("artifact or creature");
static {
- filterCost.add(Predicates.not(new TappedPredicate()));
+ filterCost.add(Predicates.not(TappedPredicate.instance));
filterTarget.add(Predicates.or(
new CardTypePredicate(CardType.ARTIFACT),
new CardTypePredicate(CardType.CREATURE)));
diff --git a/Mage.Sets/src/mage/cards/g/GlassOfTheGuildpact.java b/Mage.Sets/src/mage/cards/g/GlassOfTheGuildpact.java
new file mode 100644
index 00000000000..a5e095017ff
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GlassOfTheGuildpact.java
@@ -0,0 +1,43 @@
+package mage.cards.g;
+
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.MulticoloredPredicate;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GlassOfTheGuildpact extends CardImpl {
+
+ private static final FilterCreaturePermanent filter
+ = new FilterCreaturePermanent("multicolored creatures");
+
+ static {
+ filter.add(MulticoloredPredicate.instance);
+ }
+
+ public GlassOfTheGuildpact(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
+
+ // Multicolored creatures you control get +1/+1.
+ this.addAbility(new SimpleStaticAbility(
+ new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter)
+ ));
+ }
+
+ private GlassOfTheGuildpact(final GlassOfTheGuildpact card) {
+ super(card);
+ }
+
+ @Override
+ public GlassOfTheGuildpact copy() {
+ return new GlassOfTheGuildpact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GlassdustHulk.java b/Mage.Sets/src/mage/cards/g/GlassdustHulk.java
index 419a50f73a4..69c9f6c2bd5 100644
--- a/Mage.Sets/src/mage/cards/g/GlassdustHulk.java
+++ b/Mage.Sets/src/mage/cards/g/GlassdustHulk.java
@@ -30,7 +30,7 @@ public final class GlassdustHulk extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GlassdustHulk(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GlazeFiend.java b/Mage.Sets/src/mage/cards/g/GlazeFiend.java
index b4e70d85d34..ca91ea31291 100644
--- a/Mage.Sets/src/mage/cards/g/GlazeFiend.java
+++ b/Mage.Sets/src/mage/cards/g/GlazeFiend.java
@@ -24,7 +24,7 @@ public final class GlazeFiend extends CardImpl {
private static final FilterArtifactPermanent filter = new FilterArtifactPermanent("another artifact");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/g/Gleancrawler.java b/Mage.Sets/src/mage/cards/g/Gleancrawler.java
index 9b183e132c5..1daa26ff289 100644
--- a/Mage.Sets/src/mage/cards/g/Gleancrawler.java
+++ b/Mage.Sets/src/mage/cards/g/Gleancrawler.java
@@ -73,7 +73,7 @@ class GleancrawlerEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get(CardsPutIntoGraveyardWatcher.class.getSimpleName());
+ CardsPutIntoGraveyardWatcher watcher = game.getState().getWatcher(CardsPutIntoGraveyardWatcher.class);
Player controller = game.getPlayer(source.getControllerId());
if (controller != null && watcher != null) {
Set cardsToGraveyardThisTurn = watcher.getCardsPutToGraveyardFromBattlefield();
diff --git a/Mage.Sets/src/mage/cards/g/GlimmerdustNap.java b/Mage.Sets/src/mage/cards/g/GlimmerdustNap.java
index 55bfd2f7493..ced28deab94 100644
--- a/Mage.Sets/src/mage/cards/g/GlimmerdustNap.java
+++ b/Mage.Sets/src/mage/cards/g/GlimmerdustNap.java
@@ -26,7 +26,7 @@ public final class GlimmerdustNap extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public GlimmerdustNap(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GlimmerpointStag.java b/Mage.Sets/src/mage/cards/g/GlimmerpointStag.java
index d4b7a1630c2..4258c96d373 100644
--- a/Mage.Sets/src/mage/cards/g/GlimmerpointStag.java
+++ b/Mage.Sets/src/mage/cards/g/GlimmerpointStag.java
@@ -33,7 +33,7 @@ public final class GlimmerpointStag extends CardImpl {
private final static FilterPermanent filter = new FilterPermanent("another target permanent");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GlimmerpointStag(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GlimpseTheSunGod.java b/Mage.Sets/src/mage/cards/g/GlimpseTheSunGod.java
index 4ab2832a675..f0c457aa4fe 100644
--- a/Mage.Sets/src/mage/cards/g/GlimpseTheSunGod.java
+++ b/Mage.Sets/src/mage/cards/g/GlimpseTheSunGod.java
@@ -1,20 +1,21 @@
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
+
+import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES;
/**
- *
* @author LevelX2
*/
public final class GlimpseTheSunGod extends CardImpl {
@@ -24,26 +25,27 @@ public final class GlimpseTheSunGod extends CardImpl {
// Tap X target creatures. Scry 1.
this.getSpellAbility().addEffect(new TapTargetEffect("X target creatures"));
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, FILTER_PERMANENT_CREATURES, false));
this.getSpellAbility().addEffect(new ScryEffect(1));
+ this.getSpellAbility().setTargetAdjuster(GlimpseTheSunGodAdjuster.instance);
}
public GlimpseTheSunGod(final GlimpseTheSunGod card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int numberToTap = ability.getManaCostsToPay().getX();
- numberToTap = Math.min(game.getBattlefield().count(FILTER_PERMANENT_CREATURES, ability.getSourceId(), ability.getControllerId(), game), numberToTap);
- ability.addTarget(new TargetCreaturePermanent(numberToTap, numberToTap, FILTER_PERMANENT_CREATURES, false));
- }
- }
-
@Override
public GlimpseTheSunGod copy() {
return new GlimpseTheSunGod(this);
}
}
+
+enum GlimpseTheSunGodAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int numberToTap = ability.getManaCostsToPay().getX();
+ ability.addTarget(new TargetCreaturePermanent(numberToTap, numberToTap, FILTER_PERMANENT_CREATURES, false));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/g/GlintHawkIdol.java b/Mage.Sets/src/mage/cards/g/GlintHawkIdol.java
index 5352599b85e..ceb983bfbf0 100644
--- a/Mage.Sets/src/mage/cards/g/GlintHawkIdol.java
+++ b/Mage.Sets/src/mage/cards/g/GlintHawkIdol.java
@@ -28,7 +28,7 @@ public final class GlintHawkIdol extends CardImpl {
private static final FilterPermanent filter = new FilterArtifactPermanent("another artifact");
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GlintHawkIdol (UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GlintSleeveSiphoner.java b/Mage.Sets/src/mage/cards/g/GlintSleeveSiphoner.java
index 09d2a2af102..27d9623720a 100644
--- a/Mage.Sets/src/mage/cards/g/GlintSleeveSiphoner.java
+++ b/Mage.Sets/src/mage/cards/g/GlintSleeveSiphoner.java
@@ -1,7 +1,5 @@
-
package mage.cards.g;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
@@ -19,8 +17,9 @@ import mage.constants.SubType;
import mage.constants.TargetController;
import mage.constants.Zone;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class GlintSleeveSiphoner extends CardImpl {
@@ -42,8 +41,7 @@ public final class GlintSleeveSiphoner extends CardImpl {
// At the beginning of your upkeep, you may pay {E}{E}. If you do, draw a card and you lose 1 life.
DoIfCostPaid doIfCostPaidEffect = new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new PayEnergyCost(2));
Effect effect = new LoseLifeSourceControllerEffect(1);
- effect.setText("and you lose 1 life");
- doIfCostPaidEffect.addEffect(effect);
+ doIfCostPaidEffect.addEffect(effect.concatBy("and"));
this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, doIfCostPaidEffect, TargetController.YOU, false, false,
"At the beginning of your upkeep, "));
}
diff --git a/Mage.Sets/src/mage/cards/g/GlissaTheTraitor.java b/Mage.Sets/src/mage/cards/g/GlissaTheTraitor.java
index 35a5e605402..04337ad939d 100644
--- a/Mage.Sets/src/mage/cards/g/GlissaTheTraitor.java
+++ b/Mage.Sets/src/mage/cards/g/GlissaTheTraitor.java
@@ -64,7 +64,7 @@ class GlissaTheTraitorTriggeredAbility extends TriggeredAbilityImpl {
}
GlissaTheTraitorTriggeredAbility() {
- super(Zone.BATTLEFIELD, new ReturnToHandTargetEffect());
+ super(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), true);
this.addTarget(new TargetCardInYourGraveyard(filter));
}
@@ -95,6 +95,6 @@ class GlissaTheTraitorTriggeredAbility extends TriggeredAbilityImpl {
@Override
public String getRule() {
- return "Whenever a creature an opponent controls is put into a graveyard from the battlefield, you may " + super.getRule();
+ return "Whenever a creature an opponent controls is put into a graveyard from the battlefield, " + super.getRule();
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/g/GlitteringWish.java b/Mage.Sets/src/mage/cards/g/GlitteringWish.java
index 9b063c47ff8..355eb718f94 100644
--- a/Mage.Sets/src/mage/cards/g/GlitteringWish.java
+++ b/Mage.Sets/src/mage/cards/g/GlitteringWish.java
@@ -19,7 +19,7 @@ public final class GlitteringWish extends CardImpl {
private static final FilterCard filter = new FilterCard("a multicolored card");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public GlitteringWish(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GlyphKeeper.java b/Mage.Sets/src/mage/cards/g/GlyphKeeper.java
index 697acf46964..69d358409e1 100644
--- a/Mage.Sets/src/mage/cards/g/GlyphKeeper.java
+++ b/Mage.Sets/src/mage/cards/g/GlyphKeeper.java
@@ -79,7 +79,7 @@ class GlyphKeeperAbility extends TriggeredAbilityImpl {
if (event.getTargetId().equals(this.getSourceId())) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.isCreature()) {
- NumberOfTimesPermanentTargetedATurnWatcher watcher = (NumberOfTimesPermanentTargetedATurnWatcher) game.getState().getWatchers().get(NumberOfTimesPermanentTargetedATurnWatcher.class.getSimpleName());
+ NumberOfTimesPermanentTargetedATurnWatcher watcher = game.getState().getWatcher(NumberOfTimesPermanentTargetedATurnWatcher.class);
if (watcher != null
&& watcher.notMoreThanOnceTargetedThisTurn(permanent, game)) {
for (Effect effect : getEffects()) {
diff --git a/Mage.Sets/src/mage/cards/g/GlyphOfDestruction.java b/Mage.Sets/src/mage/cards/g/GlyphOfDestruction.java
index 29a587f8cd9..016c25f35a5 100644
--- a/Mage.Sets/src/mage/cards/g/GlyphOfDestruction.java
+++ b/Mage.Sets/src/mage/cards/g/GlyphOfDestruction.java
@@ -25,7 +25,7 @@ public final class GlyphOfDestruction extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.WALL));
- filter.add(new BlockingPredicate());
+ filter.add(BlockingPredicate.instance);
}
public GlyphOfDestruction(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GlyphOfDoom.java b/Mage.Sets/src/mage/cards/g/GlyphOfDoom.java
index ea23f5b02b7..5862096bd5d 100644
--- a/Mage.Sets/src/mage/cards/g/GlyphOfDoom.java
+++ b/Mage.Sets/src/mage/cards/g/GlyphOfDoom.java
@@ -106,7 +106,7 @@ class GlyphOfDoomEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null && targetCreature != null) {
- BlockedAttackerWatcher watcher = (BlockedAttackerWatcher) game.getState().getWatchers().get(BlockedAttackerWatcher.class.getSimpleName());
+ BlockedAttackerWatcher watcher = game.getState().getWatcher(BlockedAttackerWatcher.class);
if (watcher != null) {
List toDestroy = new ArrayList<>();
for (Permanent creature : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/g/GlyphOfReincarnation.java b/Mage.Sets/src/mage/cards/g/GlyphOfReincarnation.java
new file mode 100644
index 00000000000..94068e41efb
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GlyphOfReincarnation.java
@@ -0,0 +1,129 @@
+
+package mage.cards.g;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import mage.MageObjectReference;
+import mage.abilities.Ability;
+import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility;
+import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
+import mage.abilities.condition.common.AfterCombatCondition;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.InfoEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.StaticFilters;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.other.OwnerIdPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.common.TargetCardInGraveyard;
+import mage.target.common.TargetCreaturePermanent;
+import mage.watchers.common.BlockedAttackerWatcher;
+
+/**
+ *
+ * @author L_J
+ */
+public final class GlyphOfReincarnation extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Wall creature");
+
+ static {
+ filter.add(new SubtypePredicate(SubType.WALL));
+ }
+
+ public GlyphOfReincarnation(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G}");
+
+ // Cast this spell only after combat.
+ this.addAbility(new CastOnlyDuringPhaseStepSourceAbility(null, null, AfterCombatCondition.instance, "Cast this spell only after combat"));
+
+ // Destroy all creatures that were blocked by target Wall this turn. They can’t be regenerated. For each creature that died this way, put a creature card from the graveyard of the player who controlled that creature the last time it became blocked by that Wall onto the battlefield under its owner’s control.
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ this.getSpellAbility().addEffect(new GlyphOfReincarnationEffect());
+ this.getSpellAbility().addWatcher(new BlockedAttackerWatcher());
+ }
+
+ public GlyphOfReincarnation(final GlyphOfReincarnation card) {
+ super(card);
+ }
+
+ @Override
+ public GlyphOfReincarnation copy() {
+ return new GlyphOfReincarnation(this);
+ }
+}
+
+class GlyphOfReincarnationEffect extends OneShotEffect {
+
+ public GlyphOfReincarnationEffect() {
+ super(Outcome.DestroyPermanent);
+ this.staticText = "Destroy all creatures that were blocked by target Wall this turn. They can’t be regenerated. For each creature that died this way, put a creature card from the graveyard of the player who controlled that creature the last time it became blocked by that Wall onto the battlefield under its owner’s control";
+ }
+
+ public GlyphOfReincarnationEffect(final GlyphOfReincarnationEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GlyphOfReincarnationEffect copy() {
+ return new GlyphOfReincarnationEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent targetWall = game.getPermanentOrLKIBattlefield(source.getFirstTarget());
+ if (controller != null && targetWall != null) {
+ BlockedAttackerWatcher watcher = (BlockedAttackerWatcher) game.getState().getWatchers().get(BlockedAttackerWatcher.class.getSimpleName());
+ if (watcher != null) {
+ Map destroyed = new HashMap<>();
+ for (Permanent creature : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game)) {
+ if (!creature.getId().equals(targetWall.getId())) {
+ if (watcher.creatureHasBlockedAttacker(new MageObjectReference(creature, game), new MageObjectReference(targetWall, game), game)) {
+ if (creature.destroy(source.getSourceId(), game, true)
+ && game.getState().getZone(creature.getId()) == Zone.GRAVEYARD) { // If a commander is replaced to command zone, the creature does not die
+ Player permController = game.getPlayer(creature.getControllerId());
+ if (permController != null) {
+ destroyed.put(creature.getId(), permController);
+ }
+ }
+ }
+ }
+ }
+ // For each creature that died this way, put a creature card from the graveyard of the player who controlled that creature the last time it became blocked by that Wall
+ // onto the battlefield under its owner’s control
+ for (Map.Entry entry : destroyed.entrySet()) {
+ Permanent permanent = (Permanent) game.getLastKnownInformation(entry.getKey(), Zone.BATTLEFIELD);
+ Player player = entry.getValue();
+ if (permanent != null && player != null) {
+ FilterCreatureCard filter = new FilterCreatureCard("a creature card from " + player.getName() + "'s graveyard");
+ filter.add(new OwnerIdPredicate(player.getId()));
+ Target targetCreature = new TargetCardInGraveyard(filter);
+ targetCreature.setNotTarget(true);
+ if (targetCreature.canChoose(source.getSourceId(), controller.getId(), game)
+ && controller.chooseTarget(outcome, targetCreature, source, game)) {
+ Card card = game.getCard(targetCreature.getFirstTarget());
+ if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) {
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game, false, false, true, null);
+ }
+ }
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GnarlidPack.java b/Mage.Sets/src/mage/cards/g/GnarlidPack.java
index 24ce6b741ac..63e7c60edb7 100644
--- a/Mage.Sets/src/mage/cards/g/GnarlidPack.java
+++ b/Mage.Sets/src/mage/cards/g/GnarlidPack.java
@@ -31,7 +31,7 @@ public final class GnarlidPack extends CardImpl {
// Gnarlid Pack enters the battlefield with a +1/+1 counter on it for each time it was kicked.
this.addAbility(new EntersBattlefieldAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), new MultikickerCount(), true),
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), MultikickerCount.instance, true),
"with a +1/+1 counter on it for each time it was kicked"));
}
diff --git a/Mage.Sets/src/mage/cards/g/GnarlrootTrapper.java b/Mage.Sets/src/mage/cards/g/GnarlrootTrapper.java
index 69e6f81b231..a58d85839da 100644
--- a/Mage.Sets/src/mage/cards/g/GnarlrootTrapper.java
+++ b/Mage.Sets/src/mage/cards/g/GnarlrootTrapper.java
@@ -38,7 +38,7 @@ public final class GnarlrootTrapper extends CardImpl {
private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("attacking ELf you control");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
filter.add(new SubtypePredicate(SubType.ELF));
}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinArchaeologist.java b/Mage.Sets/src/mage/cards/g/GoblinArchaeologist.java
index 78a1c2c1944..5b04f0b8fe5 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinArchaeologist.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinArchaeologist.java
@@ -75,7 +75,7 @@ class GoblinArchaeologistEffect extends OneShotEffect {
Player player = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId());
if (player != null && permanent != null) {
- if (!player.flipCoin(game)) {
+ if (!player.flipCoin(source, game, true)) {
permanent.sacrifice(source.getSourceId(), game);
}else{
Permanent targetArtifact = game.getPermanent(source.getFirstTarget());
diff --git a/Mage.Sets/src/mage/cards/g/GoblinArtisans.java b/Mage.Sets/src/mage/cards/g/GoblinArtisans.java
index 97b830bea1a..876e1ee6dc8 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinArtisans.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinArtisans.java
@@ -78,7 +78,7 @@ class GoblinArtisansEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
controller.drawCards(1, game);
} else {
List artifacts = game.getBattlefield().getActivePermanents(new FilterControlledArtifactPermanent(), source.getControllerId(), game);
diff --git a/Mage.Sets/src/mage/cards/g/GoblinAssassin.java b/Mage.Sets/src/mage/cards/g/GoblinAssassin.java
index d872d6b038e..c94cb90e398 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinAssassin.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinAssassin.java
@@ -99,7 +99,7 @@ class GoblinAssassinTriggeredEffect extends OneShotEffect {
if (controller != null) {
for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
- if (player != null && !player.flipCoin(game)) {
+ if (player != null && !player.flipCoin(source, game, false)) {
TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent();
target.setNotTarget(true);
if (target.canChoose(player.getId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/g/GoblinBangchuckers.java b/Mage.Sets/src/mage/cards/g/GoblinBangchuckers.java
index 2f7b0c8669f..ff27db96dae 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinBangchuckers.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinBangchuckers.java
@@ -63,7 +63,7 @@ class GoblinBangchuckersEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
if (permanent != null) {
permanent.damage(2, source.getSourceId(), game, false, true);
diff --git a/Mage.Sets/src/mage/cards/g/GoblinBarrage.java b/Mage.Sets/src/mage/cards/g/GoblinBarrage.java
index cfc82c92486..57f2fef6e78 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinBarrage.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinBarrage.java
@@ -1,7 +1,6 @@
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.costs.common.SacrificeTargetCost;
@@ -19,19 +18,28 @@ import mage.game.Game;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetPlayerOrPlaneswalker;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class GoblinBarrage extends CardImpl {
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("an artifact or Goblin");
+
+ static {
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.ARTIFACT),
+ new SubtypePredicate(SubType.GOBLIN)
+ ));
+ }
+
public GoblinBarrage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}");
// Kicker—Sacrifice an artifact or Goblin.
- FilterControlledPermanent filter = new FilterControlledPermanent("an artifact or Goblin");
- filter.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT), new SubtypePredicate(SubType.GOBLIN)));
this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(filter))));
// Goblin Barrage deals 4 damage to target creature. If this spell was kicked, it also deals 4 damage to target player or planeswalker.
@@ -40,13 +48,7 @@ public final class GoblinBarrage extends CardImpl {
+ "it also deals 4 damage to target player or planeswalker")
);
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (KickedCondition.instance.apply(game, ability)) {
- ability.addTarget(new TargetPlayerOrPlaneswalker());
- }
+ this.getSpellAbility().setTargetAdjuster(GoblinBarrageAdjuster.instance);
}
public GoblinBarrage(final GoblinBarrage card) {
@@ -58,3 +60,14 @@ public final class GoblinBarrage extends CardImpl {
return new GoblinBarrage(this);
}
}
+
+enum GoblinBarrageAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.addTarget(new TargetPlayerOrPlaneswalker());
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/g/GoblinBomb.java b/Mage.Sets/src/mage/cards/g/GoblinBomb.java
index fdab4e863cb..a8ced2d7823 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinBomb.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinBomb.java
@@ -72,7 +72,7 @@ class GoblinBombEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId());
if (controller != null && permanent != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
game.informPlayers("Goblin Bomb: Won flip. Put a fuse counter on Goblin Bomb.");
new AddCountersSourceEffect(CounterType.FUSE.createInstance(1)).apply(game, source);
return true;
diff --git a/Mage.Sets/src/mage/cards/g/GoblinBoomKeg.java b/Mage.Sets/src/mage/cards/g/GoblinBoomKeg.java
index 14007b84d9f..25eece23e9b 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinBoomKeg.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinBoomKeg.java
@@ -1,11 +1,8 @@
-
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.cards.CardImpl;
@@ -14,20 +11,21 @@ import mage.constants.CardType;
import mage.constants.TargetController;
import mage.target.common.TargetAnyTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class GoblinBoomKeg extends CardImpl {
public GoblinBoomKeg(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// At the beginning of your upkeep, sacrifice Goblin Boom Keg.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect(), TargetController.YOU, false));
// When Goblin Boom Keg is put into a graveyard from the battlefield, it deals 3 damage to any target.
- Ability ability = new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DamageTargetEffect(3, "it"), false);
+ Ability ability = new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DamageTargetEffect(3, "it"));
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinCohort.java b/Mage.Sets/src/mage/cards/g/GoblinCohort.java
index 592c7e67594..452b58b2bc5 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinCohort.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinCohort.java
@@ -69,7 +69,7 @@ class GoblinCohortEffect extends RestrictionEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
if (permanent.getId().equals(source.getSourceId())) {
- PlayerCastCreatureWatcher watcher = (PlayerCastCreatureWatcher) game.getState().getWatchers().get(PlayerCastCreatureWatcher.class.getSimpleName());
+ PlayerCastCreatureWatcher watcher = game.getState().getWatcher(PlayerCastCreatureWatcher.class);
if (watcher != null && !watcher.playerDidCastCreatureThisTurn(source.getControllerId())) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java b/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java
index ae1334c38e1..9b54aac730e 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java
@@ -29,7 +29,7 @@ public final class GoblinCratermaker extends CardImpl {
= new FilterNonlandPermanent("colorless nonland permanent");
static {
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
}
public GoblinCratermaker(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GoblinDynamo.java b/Mage.Sets/src/mage/cards/g/GoblinDynamo.java
index 557ca2341d0..207bfd0dfb8 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinDynamo.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinDynamo.java
@@ -35,7 +35,7 @@ public final class GoblinDynamo extends CardImpl {
this.addAbility(ability);
//{X}{R}, {T}, Sacrifice Goblin Dynamo: Goblin Dynamo deals X damage to any target.
- ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}{R}"));
+ ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,new DamageTargetEffect(ManacostVariableValue.instance), new ManaCostsImpl("{X}{R}"));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/g/GoblinFestival.java b/Mage.Sets/src/mage/cards/g/GoblinFestival.java
index 9c4b52b88f2..e8e202928f3 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinFestival.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinFestival.java
@@ -68,7 +68,7 @@ class GoblinFestivalChangeControlEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
if (controller != null) {
- if (!controller.flipCoin(game)) {
+ if (!controller.flipCoin(source, game, true)) {
if (sourcePermanent != null) {
Target target = new TargetOpponent(true);
if (target.canChoose(source.getSourceId(), controller.getId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/g/GoblinGathering.java b/Mage.Sets/src/mage/cards/g/GoblinGathering.java
new file mode 100644
index 00000000000..3c6dec39ae2
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GoblinGathering.java
@@ -0,0 +1,78 @@
+package mage.cards.g;
+
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.NamePredicate;
+import mage.game.Game;
+import mage.game.permanent.token.GoblinToken;
+import mage.players.Player;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GoblinGathering extends CardImpl {
+
+ public GoblinGathering(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}");
+
+ // Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named Goblin Gathering in your graveyard.
+ this.getSpellAbility().addEffect(new CreateTokenEffect(
+ new GoblinToken(), GoblinGatheringDynamicValue.instance
+ ));
+ }
+
+ private GoblinGathering(final GoblinGathering card) {
+ super(card);
+ }
+
+ @Override
+ public GoblinGathering copy() {
+ return new GoblinGathering(this);
+ }
+}
+
+enum GoblinGatheringDynamicValue implements DynamicValue {
+
+ instance;
+ private static final FilterCard filter = new FilterCard();
+
+ static {
+ filter.add(new NamePredicate("Goblin Gathering"));
+ }
+
+ @Override
+ public int calculate(Game game, Ability sourceAbility, Effect effect) {
+ int amount = 0;
+ Player player = game.getPlayer(sourceAbility.getControllerId());
+ if (player != null) {
+ amount += player.getGraveyard().count(
+ filter, sourceAbility.getSourceId(),
+ sourceAbility.getControllerId(), game
+ );
+ }
+ return amount + 2;
+ }
+
+ @Override
+ public GoblinGatheringDynamicValue copy() {
+ return instance;
+ }
+
+ @Override
+ public String toString() {
+ return "1";
+ }
+
+ @Override
+ public String getMessage() {
+ return "two plus the number of cards named Goblin Gathering in your graveyard";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinGoliath.java b/Mage.Sets/src/mage/cards/g/GoblinGoliath.java
index b8ac5dc92cf..a6a7c02f607 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinGoliath.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinGoliath.java
@@ -34,7 +34,7 @@ public final class GoblinGoliath extends CardImpl {
this.toughness = new MageInt(4);
// When Goblin Goliath enters the battlefield, create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have.
- Effect effect = new CreateTokenEffect(new GoblinToken(), new OpponentsCount());
+ Effect effect = new CreateTokenEffect(new GoblinToken(), OpponentsCount.instance);
effect.setText("create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have");
this.addAbility(new EntersBattlefieldTriggeredAbility(effect));
diff --git a/Mage.Sets/src/mage/cards/g/GoblinKaboomist.java b/Mage.Sets/src/mage/cards/g/GoblinKaboomist.java
index 16db093cebf..2df939fa0da 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinKaboomist.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinKaboomist.java
@@ -70,7 +70,7 @@ class GoblinKaboomistFlipCoinEffect extends OneShotEffect {
Player player = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId());
if (player != null && permanent != null) {
- if (!player.flipCoin(game)) {
+ if (!player.flipCoin(source, game, true)) {
String message = permanent.getLogName() + " deals 2 damage to itself";
game.informPlayers(message);
permanent.damage(2, source.getSourceId(), game, false, true);
diff --git a/Mage.Sets/src/mage/cards/g/GoblinKites.java b/Mage.Sets/src/mage/cards/g/GoblinKites.java
index 1f3216e8e3b..cc2e03fef09 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinKites.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinKites.java
@@ -69,7 +69,7 @@ class GoblinKitesEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId());
if (controller != null && permanent != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
return true;
} else {
new SacrificeSourceEffect().apply(game, source);
diff --git a/Mage.Sets/src/mage/cards/g/GoblinLyre.java b/Mage.Sets/src/mage/cards/g/GoblinLyre.java
index e06192a2a50..1626668511f 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinLyre.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinLyre.java
@@ -65,7 +65,7 @@ class GoblinLyreEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Player opponent = game.getPlayerOrPlaneswalkerController(getTargetPointer().getFirst(game, source));
if (controller != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
int damage = new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent()).calculate(game, source, this);
if (opponent != null) {
return game.damagePlayerOrPlaneswalker(source.getFirstTarget(), damage, source.getSourceId(), game, false, true) > 0;
diff --git a/Mage.Sets/src/mage/cards/g/GoblinMutant.java b/Mage.Sets/src/mage/cards/g/GoblinMutant.java
index 9bc7a1e2663..aaa38655474 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinMutant.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinMutant.java
@@ -30,7 +30,7 @@ public final class GoblinMutant extends CardImpl {
static final private FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creatures with power 3 or greater");
static {
- filter.add(Predicates.and(new PowerPredicate(ComparisonType.MORE_THAN, 2), Predicates.not(new TappedPredicate())));
+ filter.add(Predicates.and(new PowerPredicate(ComparisonType.MORE_THAN, 2), Predicates.not(TappedPredicate.instance)));
filter2.add(new PowerPredicate(ComparisonType.MORE_THAN, 2));
}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinOffensive.java b/Mage.Sets/src/mage/cards/g/GoblinOffensive.java
index 58cb3f35e5e..326309a34a2 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinOffensive.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinOffensive.java
@@ -19,7 +19,7 @@ public final class GoblinOffensive extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{1}{R}{R}");
// create X 1/1 red Goblin creature tokens.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new GoblinToken(), new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new GoblinToken(), ManacostVariableValue.instance));
}
public GoblinOffensive(final GoblinOffensive card) {
diff --git a/Mage.Sets/src/mage/cards/g/GoblinPiledriver.java b/Mage.Sets/src/mage/cards/g/GoblinPiledriver.java
index bdf07184766..1c355d90913 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinPiledriver.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinPiledriver.java
@@ -28,7 +28,7 @@ public final class GoblinPiledriver extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.GOBLIN));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GoblinPiledriver(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GoblinPsychopath.java b/Mage.Sets/src/mage/cards/g/GoblinPsychopath.java
index 611aab051c4..e2499125198 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinPsychopath.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinPsychopath.java
@@ -60,7 +60,7 @@ class GoblinPsychopathEffect extends ReplacementEffectImpl {
@Override
public void init(Ability source, Game game) {
- this.wonFlip = game.getPlayer(source.getControllerId()).flipCoin(game);
+ this.wonFlip = game.getPlayer(source.getControllerId()).flipCoin(source, game, true);
super.init(source, game);
}
diff --git a/Mage.Sets/src/mage/cards/g/GoblinRabblemaster.java b/Mage.Sets/src/mage/cards/g/GoblinRabblemaster.java
index 8c844215c66..813b051f727 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinRabblemaster.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinRabblemaster.java
@@ -32,11 +32,11 @@ public final class GoblinRabblemaster extends CardImpl {
private static final FilterCreaturePermanent attackingFilter = new FilterCreaturePermanent(SubType.GOBLIN, "other attacking Goblin");
static {
- otherGoblinFilter.add(new AnotherPredicate());
+ otherGoblinFilter.add(AnotherPredicate.instance);
otherGoblinFilter.add(new ControllerPredicate(TargetController.YOU));
- attackingFilter.add(new AttackingPredicate());
- attackingFilter.add(new AnotherPredicate());
+ attackingFilter.add(AttackingPredicate.instance);
+ attackingFilter.add(AnotherPredicate.instance);
}
public GoblinRabblemaster(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GoblinRacketeer.java b/Mage.Sets/src/mage/cards/g/GoblinRacketeer.java
index a4c3c44b11e..c70dbf9aacd 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinRacketeer.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinRacketeer.java
@@ -1,8 +1,6 @@
package mage.cards.g;
-import java.util.UUID;
-
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
@@ -12,16 +10,21 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
-import mage.game.Game;
+import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
* @author TheElk801
*/
public final class GoblinRacketeer extends CardImpl {
- private final UUID originalId;
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
+
+ static {
+ filter.add(DefendingPlayerControlsPredicate.instance);
+ }
public GoblinRacketeer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
@@ -33,27 +36,12 @@ public final class GoblinRacketeer extends CardImpl {
// Whenever Goblin Racketeer attacks, you may goad target creature defending player controls.
Ability ability = new AttacksTriggeredAbility(new GoadTargetEffect(), true, "Whenever {this} attacks, you may goad target creature defending player controls");
- ability.addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature defending player controls")));
- originalId = ability.getOriginalId();
+ ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability);
}
public GoblinRacketeer(final GoblinRacketeer card) {
super(card);
- this.originalId = card.originalId;
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- ability.getTargets().clear();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
- UUID defenderId = game.getCombat().getDefenderId(ability.getSourceId());
- filter.add(new ControllerIdPredicate(defenderId));
- TargetCreaturePermanent target = new TargetCreaturePermanent(filter);
- ability.addTarget(target);
- }
}
@Override
diff --git a/Mage.Sets/src/mage/cards/g/GoblinRockSled.java b/Mage.Sets/src/mage/cards/g/GoblinRockSled.java
index fa2d9fd3782..6c3defd2244 100644
--- a/Mage.Sets/src/mage/cards/g/GoblinRockSled.java
+++ b/Mage.Sets/src/mage/cards/g/GoblinRockSled.java
@@ -96,7 +96,7 @@ class DontUntapIfAttackedLastTurnSourceEffect extends ContinuousRuleModifyingEff
&& event.getTargetId().equals(source.getSourceId())) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null && permanent.isControlledBy(game.getActivePlayerId())) {
- AttackedLastTurnWatcher watcher = (AttackedLastTurnWatcher) game.getState().getWatchers().get(AttackedLastTurnWatcher.class.getSimpleName());
+ AttackedLastTurnWatcher watcher = game.getState().getWatcher(AttackedLastTurnWatcher.class);
if (watcher != null) {
Set attackingCreatures = watcher.getAttackedLastTurnCreatures(permanent.getControllerId());
MageObjectReference mor = new MageObjectReference(permanent, game);
diff --git a/Mage.Sets/src/mage/cards/g/GodheadOfAwe.java b/Mage.Sets/src/mage/cards/g/GodheadOfAwe.java
index 153484a72db..44a6fde8fd5 100644
--- a/Mage.Sets/src/mage/cards/g/GodheadOfAwe.java
+++ b/Mage.Sets/src/mage/cards/g/GodheadOfAwe.java
@@ -27,7 +27,7 @@ public final class GodheadOfAwe extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.CREATURE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GodheadOfAwe(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GodhunterOctopus.java b/Mage.Sets/src/mage/cards/g/GodhunterOctopus.java
index 1817d450213..b3b5bd14eca 100644
--- a/Mage.Sets/src/mage/cards/g/GodhunterOctopus.java
+++ b/Mage.Sets/src/mage/cards/g/GodhunterOctopus.java
@@ -26,7 +26,7 @@ public final class GodhunterOctopus extends CardImpl {
static {
filter.add(Predicates.or(
new CardTypePredicate(CardType.ENCHANTMENT),
- new EnchantedPredicate()));
+ EnchantedPredicate.instance));
}
public GodhunterOctopus(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GodoBanditWarlord.java b/Mage.Sets/src/mage/cards/g/GodoBanditWarlord.java
index e57e96692dd..8087a50f4c6 100644
--- a/Mage.Sets/src/mage/cards/g/GodoBanditWarlord.java
+++ b/Mage.Sets/src/mage/cards/g/GodoBanditWarlord.java
@@ -32,7 +32,7 @@ public final class GodoBanditWarlord extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.EQUIPMENT));
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
}
public GodoBanditWarlord(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GodsEyeGateToTheReikai.java b/Mage.Sets/src/mage/cards/g/GodsEyeGateToTheReikai.java
index 675f616ec23..52055a07e13 100644
--- a/Mage.Sets/src/mage/cards/g/GodsEyeGateToTheReikai.java
+++ b/Mage.Sets/src/mage/cards/g/GodsEyeGateToTheReikai.java
@@ -1,7 +1,5 @@
-
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.mana.ColorlessManaAbility;
@@ -11,19 +9,22 @@ import mage.constants.CardType;
import mage.constants.SuperType;
import mage.game.permanent.token.SpiritToken;
+import java.util.UUID;
+
/**
- *
* @author Loki
*/
public final class GodsEyeGateToTheReikai extends CardImpl {
public GodsEyeGateToTheReikai(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.LAND},"");
+ super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
addSuperType(SuperType.LEGENDARY);
+
// {tap}: Add {C}.
this.addAbility(new ColorlessManaAbility());
+
// When Gods' Eye, Gate to the Reikai is put into a graveyard from the battlefield, create a 1/1 colorless Spirit creature token.
- this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CreateTokenEffect(new SpiritToken(), 1), false));
+ this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CreateTokenEffect(new SpiritToken(), 1)));
}
public GodsEyeGateToTheReikai(final GodsEyeGateToTheReikai card) {
diff --git a/Mage.Sets/src/mage/cards/g/GoldenGuardian.java b/Mage.Sets/src/mage/cards/g/GoldenGuardian.java
index c96c531112d..3ec9d69dd6e 100644
--- a/Mage.Sets/src/mage/cards/g/GoldenGuardian.java
+++ b/Mage.Sets/src/mage/cards/g/GoldenGuardian.java
@@ -38,7 +38,7 @@ public final class GoldenGuardian extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GoldenGuardian(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GoldnightRedeemer.java b/Mage.Sets/src/mage/cards/g/GoldnightRedeemer.java
index 6291d17185c..856e6dfbc37 100644
--- a/Mage.Sets/src/mage/cards/g/GoldnightRedeemer.java
+++ b/Mage.Sets/src/mage/cards/g/GoldnightRedeemer.java
@@ -24,7 +24,7 @@ public final class GoldnightRedeemer extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GoldnightRedeemer(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GolgariGermination.java b/Mage.Sets/src/mage/cards/g/GolgariGermination.java
index bbcfdc53ee4..f6890106e67 100644
--- a/Mage.Sets/src/mage/cards/g/GolgariGermination.java
+++ b/Mage.Sets/src/mage/cards/g/GolgariGermination.java
@@ -24,7 +24,7 @@ public final class GolgariGermination extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public GolgariGermination(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GolgothianSylex.java b/Mage.Sets/src/mage/cards/g/GolgothianSylex.java
index c2b9261d128..1bf1c09124d 100644
--- a/Mage.Sets/src/mage/cards/g/GolgothianSylex.java
+++ b/Mage.Sets/src/mage/cards/g/GolgothianSylex.java
@@ -51,7 +51,7 @@ class GolgothianSylexEffect extends OneShotEffect {
static {
filter.add(Predicates.and(
new ExpansionSetPredicate("ATQ"),
- Predicates.not(new TokenPredicate())
+ Predicates.not(TokenPredicate.instance)
));
}
diff --git a/Mage.Sets/src/mage/cards/g/Gomazoa.java b/Mage.Sets/src/mage/cards/g/Gomazoa.java
index f609015e0f4..c6b38885841 100644
--- a/Mage.Sets/src/mage/cards/g/Gomazoa.java
+++ b/Mage.Sets/src/mage/cards/g/Gomazoa.java
@@ -86,7 +86,7 @@ class GomazoaEffect extends OneShotEffect {
players.add(gomazoa.getOwnerId());
}
- BlockedByWatcher watcher = (BlockedByWatcher) game.getState().getWatchers().get(BlockedByWatcher.class.getSimpleName(), source.getSourceId());
+ BlockedByWatcher watcher = game.getState().getWatcher(BlockedByWatcher.class, source.getSourceId());
creaturesBlocked = watcher.blockedByWatcher;
for (UUID blockedById : creaturesBlocked) {
diff --git a/Mage.Sets/src/mage/cards/g/GontisMachinations.java b/Mage.Sets/src/mage/cards/g/GontisMachinations.java
index 513d8867123..270526ad693 100644
--- a/Mage.Sets/src/mage/cards/g/GontisMachinations.java
+++ b/Mage.Sets/src/mage/cards/g/GontisMachinations.java
@@ -68,7 +68,7 @@ class GontisMachinationsTriggeredAbility extends TriggeredAbilityImpl {
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getPlayerId().equals(getControllerId())) {
GontisMachinationsFirstLostLifeThisTurnWatcher watcher
- = (GontisMachinationsFirstLostLifeThisTurnWatcher) game.getState().getWatchers().get(GontisMachinationsFirstLostLifeThisTurnWatcher.class.getSimpleName());
+ = game.getState().getWatcher(GontisMachinationsFirstLostLifeThisTurnWatcher.class);
if (watcher != null && watcher.timesLostLifeThisTurn(event.getTargetId()) < 2) {
return true;
}
@@ -92,7 +92,7 @@ class GontisMachinationsFirstLostLifeThisTurnWatcher extends Watcher {
private final Map playersLostLife = new HashMap<>();
public GontisMachinationsFirstLostLifeThisTurnWatcher() {
- super(GontisMachinationsFirstLostLifeThisTurnWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(GontisMachinationsFirstLostLifeThisTurnWatcher.class, WatcherScope.GAME);
}
public GontisMachinationsFirstLostLifeThisTurnWatcher(final GontisMachinationsFirstLostLifeThisTurnWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/g/GossamerChains.java b/Mage.Sets/src/mage/cards/g/GossamerChains.java
index de7c0d7e2c1..0d253b122be 100644
--- a/Mage.Sets/src/mage/cards/g/GossamerChains.java
+++ b/Mage.Sets/src/mage/cards/g/GossamerChains.java
@@ -24,7 +24,7 @@ public final class GossamerChains extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("unblocked creature");
static {
- filter.add(new UnblockedPredicate());
+ filter.add(UnblockedPredicate.instance);
}
public GossamerChains(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GovernTheGuildless.java b/Mage.Sets/src/mage/cards/g/GovernTheGuildless.java
index e49428ecb09..edf5a2ab8dc 100644
--- a/Mage.Sets/src/mage/cards/g/GovernTheGuildless.java
+++ b/Mage.Sets/src/mage/cards/g/GovernTheGuildless.java
@@ -23,7 +23,7 @@ public final class GovernTheGuildless extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("monocolored creature");
static {
- filter.add(new MonocoloredPredicate());
+ filter.add(MonocoloredPredicate.instance);
}
public GovernTheGuildless(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GracefulAntelope.java b/Mage.Sets/src/mage/cards/g/GracefulAntelope.java
index ec579769380..2269ccbcf65 100644
--- a/Mage.Sets/src/mage/cards/g/GracefulAntelope.java
+++ b/Mage.Sets/src/mage/cards/g/GracefulAntelope.java
@@ -1,6 +1,6 @@
-
package mage.cards.g;
+import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
@@ -11,11 +11,8 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
-import mage.target.Target;
import mage.target.common.TargetLandPermanent;
-import java.util.UUID;
-
/**
*
* @author cbt33, Loki (Contaminated Ground), Plopman (Larceny)
@@ -23,7 +20,7 @@ import java.util.UUID;
public final class GracefulAntelope extends CardImpl {
public GracefulAntelope(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}");
this.subtype.add(SubType.ANTELOPE);
this.power = new MageInt(1);
@@ -32,9 +29,8 @@ public final class GracefulAntelope extends CardImpl {
// Plainswalk
this.addAbility(new PlainswalkAbility());
// Whenever Graceful Antelope deals combat damage to a player, you may have target land become a Plains until Graceful Antelope leaves the battlefield.
- Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new BecomesBasicLandTargetEffect(Duration.WhileOnBattlefield, SubType.PLAINS), true);
- Target target = new TargetLandPermanent();
- ability.addTarget(target);
+ Ability ability = new DealsCombatDamageToAPlayerTriggeredAbility(new BecomesBasicLandTargetEffect(Duration.UntilSourceLeavesBattlefield, SubType.PLAINS), true);
+ ability.addTarget(new TargetLandPermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/g/GrandArchitect.java b/Mage.Sets/src/mage/cards/g/GrandArchitect.java
index e599814dfc4..3060d391378 100644
--- a/Mage.Sets/src/mage/cards/g/GrandArchitect.java
+++ b/Mage.Sets/src/mage/cards/g/GrandArchitect.java
@@ -105,7 +105,7 @@ class GrandArchitectManaAbility extends ActivatedManaAbilityImpl {
static {
filter.add(new ColorPredicate(ObjectColor.BLUE));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
GrandArchitectManaAbility() {
diff --git a/Mage.Sets/src/mage/cards/g/GrandWarlordRadha.java b/Mage.Sets/src/mage/cards/g/GrandWarlordRadha.java
index 508844bc913..5f06e04c4fe 100644
--- a/Mage.Sets/src/mage/cards/g/GrandWarlordRadha.java
+++ b/Mage.Sets/src/mage/cards/g/GrandWarlordRadha.java
@@ -65,7 +65,7 @@ class CreaturesAttackedWatcher extends Watcher {
public final Set attackedThisTurnCreatures = new HashSet<>();
public CreaturesAttackedWatcher() {
- super(CreaturesAttackedWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(CreaturesAttackedWatcher.class, WatcherScope.GAME);
}
public CreaturesAttackedWatcher(final CreaturesAttackedWatcher watcher) {
@@ -153,7 +153,7 @@ class GrandWarlordRadhaEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- CreaturesAttackedWatcher watcher = (CreaturesAttackedWatcher) game.getState().getWatchers().get(CreaturesAttackedWatcher.class.getSimpleName());
+ CreaturesAttackedWatcher watcher = game.getState().getWatcher(CreaturesAttackedWatcher.class);
if (watcher != null) {
int attackingCreatures = 0;
for (MageObjectReference attacker : watcher.getAttackedThisTurnCreatures()) {
diff --git a/Mage.Sets/src/mage/cards/g/GraspOfFate.java b/Mage.Sets/src/mage/cards/g/GraspOfFate.java
index 271b67e7304..3fbb8169049 100644
--- a/Mage.Sets/src/mage/cards/g/GraspOfFate.java
+++ b/Mage.Sets/src/mage/cards/g/GraspOfFate.java
@@ -1,7 +1,6 @@
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility;
@@ -23,10 +22,12 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.util.CardUtil;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class GraspOfFate extends CardImpl {
@@ -36,8 +37,8 @@ public final class GraspOfFate extends CardImpl {
// When Grasp of Fate enters the battlefield, for each opponent, exile up to one target nonland permanent that player controls until Grasp of Fate leaves the battlefield.
Ability ability = new EntersBattlefieldTriggeredAbility(new GraspOfFateExileEffect());
- ability.addTarget(new TargetPermanent());
ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()));
+ ability.setTargetAdjuster(GraspOfFateAdjuster.instance);
this.addAbility(ability);
}
@@ -45,29 +46,32 @@ public final class GraspOfFate extends CardImpl {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- ability.getTargets().clear();
- for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- FilterPermanent filter = new FilterPermanent("nonland permanent from opponent " + opponent.getLogName());
- filter.add(new ControllerIdPredicate(opponentId));
- filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
- TargetPermanent target = new TargetPermanent(0, 1, filter, false);
- ability.addTarget(target);
- }
- }
- }
- }
-
@Override
public GraspOfFate copy() {
return new GraspOfFate(this);
}
}
+enum GraspOfFateAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent == null) {
+ continue;
+ }
+ FilterPermanent filter = new FilterPermanent("nonland permanent from opponent " + opponent.getLogName());
+ filter.add(new ControllerIdPredicate(opponentId));
+ filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
+ TargetPermanent target = new TargetPermanent(0, 1, filter, false);
+ ability.addTarget(target);
+ }
+ }
+}
+
class GraspOfFateExileEffect extends OneShotEffect {
public GraspOfFateExileEffect() {
diff --git a/Mage.Sets/src/mage/cards/g/GraspingThrull.java b/Mage.Sets/src/mage/cards/g/GraspingThrull.java
new file mode 100644
index 00000000000..c383888f514
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GraspingThrull.java
@@ -0,0 +1,48 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GraspingThrull extends CardImpl {
+
+ public GraspingThrull(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{B}");
+
+ this.subtype.add(SubType.THRULL);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // When Grasping Thrull enters the battlefield, it deals 2 damage to each opponent and you gain 2 life.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(
+ 2, TargetController.OPPONENT, "it"
+ ));
+ ability.addEffect(new GainLifeEffect(2).setText("and you gain 2 life"));
+ this.addAbility(ability);
+ }
+
+ private GraspingThrull(final GraspingThrull card) {
+ super(card);
+ }
+
+ @Override
+ public GraspingThrull copy() {
+ return new GraspingThrull(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GraveBetrayal.java b/Mage.Sets/src/mage/cards/g/GraveBetrayal.java
index 888925283e9..fb1ccc708ad 100644
--- a/Mage.Sets/src/mage/cards/g/GraveBetrayal.java
+++ b/Mage.Sets/src/mage/cards/g/GraveBetrayal.java
@@ -162,7 +162,7 @@ class GraveBetrayalReplacementEffect extends ReplacementEffectImpl {
ContinuousEffect effect = new BecomesBlackZombieAdditionEffect();
effect.setTargetPointer(new FixedTarget(creature.getId(), creature.getZoneChangeCounter(game) + 1));
game.addEffect(effect, source);
- discard();
+ //discard(); why?
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/g/GravelHideGoblin.java b/Mage.Sets/src/mage/cards/g/GravelHideGoblin.java
new file mode 100644
index 00000000000..1d5f4f2e1ce
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GravelHideGoblin.java
@@ -0,0 +1,42 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GravelHideGoblin extends CardImpl {
+
+ public GravelHideGoblin(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
+
+ this.subtype.add(SubType.GOBLIN);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // {3}{G}: Gravel-Hide Goblin gets +2/+2 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(
+ new BoostSourceEffect(2, 2, Duration.EndOfTurn), new ManaCostsImpl("{3}{G}")
+ ));
+ }
+
+ private GravelHideGoblin(final GravelHideGoblin card) {
+ super(card);
+ }
+
+ @Override
+ public GravelHideGoblin copy() {
+ return new GravelHideGoblin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GravenAbomination.java b/Mage.Sets/src/mage/cards/g/GravenAbomination.java
index c48c21d1234..18f67304719 100644
--- a/Mage.Sets/src/mage/cards/g/GravenAbomination.java
+++ b/Mage.Sets/src/mage/cards/g/GravenAbomination.java
@@ -1,7 +1,6 @@
package mage.cards.g;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
@@ -11,20 +10,22 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard;
-import mage.filter.predicate.other.OwnerIdPredicate;
-import mage.game.Game;
-import mage.players.Player;
+import mage.filter.predicate.permanent.DefendingPlayerOwnsCardPredicate;
import mage.target.common.TargetCardInGraveyard;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class GravenAbomination extends CardImpl {
- private final UUID originalId;
+ private static final String rule = "Whenever {this} attacks, exile target card from defending player's graveyard.";
+ private static final FilterCard filter = new FilterCard("card from defending player's graveyard");
- private final static String rule = "Whenever {this} attacks, exile target card from defending player's graveyard.";
+ static {
+ filter.add(new DefendingPlayerOwnsCardPredicate());
+ }
public GravenAbomination(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
@@ -35,30 +36,12 @@ public final class GravenAbomination extends CardImpl {
// Whenever Graven Abomination attacks, exile target card from defending player's graveyard.
Ability ability = new AttacksTriggeredAbility(new ExileTargetEffect(), false, rule);
- ability.addTarget(new TargetCardInGraveyard());
+ ability.addTarget(new TargetCardInGraveyard(filter));
this.addAbility(ability);
- originalId = ability.getOriginalId();
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- UUID gravenAbominationId = ability.getSourceId();
- FilterCard filter = new FilterCard("target card from defending player's graveyard");
- if (ability.getOriginalId().equals(originalId)) {
- UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(gravenAbominationId, game);
- Player defendingPlayer = game.getPlayer(defendingPlayerId);
- if (defendingPlayer != null) {
- filter.add(new OwnerIdPredicate(defendingPlayerId));
- ability.getTargets().clear();
- ability.getTargets().add(new TargetCardInGraveyard(filter));
- }
- }
}
public GravenAbomination(final GravenAbomination card) {
super(card);
- this.originalId = card.originalId;
}
@Override
diff --git a/Mage.Sets/src/mage/cards/g/GravenDominator.java b/Mage.Sets/src/mage/cards/g/GravenDominator.java
index eb01ba0deeb..39db2926a72 100644
--- a/Mage.Sets/src/mage/cards/g/GravenDominator.java
+++ b/Mage.Sets/src/mage/cards/g/GravenDominator.java
@@ -23,7 +23,7 @@ public final class GravenDominator extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each other creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GravenDominator(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GravespawnSovereign.java b/Mage.Sets/src/mage/cards/g/GravespawnSovereign.java
index 4a8f32c2c88..dad0cec4b61 100644
--- a/Mage.Sets/src/mage/cards/g/GravespawnSovereign.java
+++ b/Mage.Sets/src/mage/cards/g/GravespawnSovereign.java
@@ -30,7 +30,7 @@ public final class GravespawnSovereign extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ZOMBIE));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public GravespawnSovereign(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GravityNegator.java b/Mage.Sets/src/mage/cards/g/GravityNegator.java
index 77632558d05..17673de97b7 100644
--- a/Mage.Sets/src/mage/cards/g/GravityNegator.java
+++ b/Mage.Sets/src/mage/cards/g/GravityNegator.java
@@ -28,7 +28,7 @@ public final class GravityNegator extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GravityNegator(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GreatDefender.java b/Mage.Sets/src/mage/cards/g/GreatDefender.java
index 44d18590fe4..369c3eafd6f 100644
--- a/Mage.Sets/src/mage/cards/g/GreatDefender.java
+++ b/Mage.Sets/src/mage/cards/g/GreatDefender.java
@@ -22,7 +22,7 @@ public final class GreatDefender extends CardImpl {
// Target creature gets +0/+X until end of turn, where X is its converted mana cost.
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
- this.getSpellAbility().addEffect(new BoostTargetEffect(new StaticValue(0), new TargetConvertedManaCost(), Duration.EndOfTurn, true)
+ this.getSpellAbility().addEffect(new BoostTargetEffect(new StaticValue(0), TargetConvertedManaCost.instance, Duration.EndOfTurn, true)
.setText("Target creature gets +0/+X until end of turn, where X is its converted mana cost.")
);
}
diff --git a/Mage.Sets/src/mage/cards/g/GreaterAuramancy.java b/Mage.Sets/src/mage/cards/g/GreaterAuramancy.java
index befbb73a1b4..76c8afdeb80 100644
--- a/Mage.Sets/src/mage/cards/g/GreaterAuramancy.java
+++ b/Mage.Sets/src/mage/cards/g/GreaterAuramancy.java
@@ -31,7 +31,7 @@ public final class GreaterAuramancy extends CardImpl {
filter.add(new CardTypePredicate(CardType.ENCHANTMENT));
filter2.add(new ControllerPredicate(TargetController.YOU));
filter2.add(new CardTypePredicate(CardType.CREATURE));
- filter2.add(new EnchantedPredicate());
+ filter2.add(EnchantedPredicate.instance);
}
public GreaterAuramancy(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GreaterGood.java b/Mage.Sets/src/mage/cards/g/GreaterGood.java
index 7aa69e4d2bf..7fc94447bc5 100644
--- a/Mage.Sets/src/mage/cards/g/GreaterGood.java
+++ b/Mage.Sets/src/mage/cards/g/GreaterGood.java
@@ -26,7 +26,7 @@ public final class GreaterGood extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}");
// Sacrifice a creature: Draw cards equal to the sacrificed creature's power, then discard three cards.
- Effect effect = new DrawCardSourceControllerEffect(new SacrificeCostCreaturesPower());
+ Effect effect = new DrawCardSourceControllerEffect(SacrificeCostCreaturesPower.instance);
effect.setText("Draw cards equal to the sacrificed creature's power");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect,
new SacrificeTargetCost(new TargetControlledCreaturePermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT)));
diff --git a/Mage.Sets/src/mage/cards/g/GreelMindRaker.java b/Mage.Sets/src/mage/cards/g/GreelMindRaker.java
index f3543a1950d..bc79a60e01e 100644
--- a/Mage.Sets/src/mage/cards/g/GreelMindRaker.java
+++ b/Mage.Sets/src/mage/cards/g/GreelMindRaker.java
@@ -36,7 +36,7 @@ public final class GreelMindRaker extends CardImpl {
this.toughness = new MageInt(3);
// {X}{B}, {tap}, Discard two cards: Target player discards X cards at random.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DiscardTargetEffect(new ManacostVariableValue(), true), new ManaCostsImpl("{X}{B}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DiscardTargetEffect(ManacostVariableValue.instance, true), new ManaCostsImpl("{X}{B}"));
ability.addCost(new TapSourceCost());
ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, new FilterCard())));
ability.addTarget(new TargetPlayer());
diff --git a/Mage.Sets/src/mage/cards/g/GreenManaBattery.java b/Mage.Sets/src/mage/cards/g/GreenManaBattery.java
index d0bf8cdfc0b..9669605db22 100644
--- a/Mage.Sets/src/mage/cards/g/GreenManaBattery.java
+++ b/Mage.Sets/src/mage/cards/g/GreenManaBattery.java
@@ -36,7 +36,7 @@ public final class GreenManaBattery extends CardImpl {
// {tap}, Remove any number of charge counters from Green Mana Battery: Add {G}, then add an additional {G} for each charge counter removed this way.
ability = new DynamicManaAbility(
Mana.GreenMana(1),
- new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
+ new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance),
new TapSourceCost(),
"Add {G}, then add {G} for each charge counter removed this way",
true, new CountersSourceCount(CounterType.CHARGE));
diff --git a/Mage.Sets/src/mage/cards/g/Gridlock.java b/Mage.Sets/src/mage/cards/g/Gridlock.java
index a94c6e78489..23c6be94f65 100644
--- a/Mage.Sets/src/mage/cards/g/Gridlock.java
+++ b/Mage.Sets/src/mage/cards/g/Gridlock.java
@@ -1,9 +1,7 @@
package mage.cards.g;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.TapTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -11,41 +9,40 @@ import mage.constants.CardType;
import mage.filter.common.FilterNonlandPermanent;
import mage.game.Game;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class Gridlock extends CardImpl {
- private static final FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanents");
public Gridlock(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{U}");
-
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}");
// Tap X target nonland permanents.
- this.getSpellAbility().addEffect(new TapTargetEffect());
- // Correct number of targets will be set in adjustTargets
- this.getSpellAbility().addTarget(new TargetPermanent(0, 1,filter, false));
-
+ this.getSpellAbility().addEffect(new TapTargetEffect("X target nonland permanents"));
+ this.getSpellAbility().setTargetAdjuster(GridlockAdjuster.instance);
}
public Gridlock(final Gridlock card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int numberToTap = ability.getManaCostsToPay().getX();
- numberToTap = Math.min(game.getBattlefield().count(filter, ability.getSourceId(), ability.getControllerId(), game), numberToTap);
- ability.addTarget(new TargetPermanent(numberToTap, filter));
- }
- }
-
@Override
public Gridlock copy() {
return new Gridlock(this);
}
}
+
+enum GridlockAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanents");
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetPermanent(ability.getManaCostsToPay().getX(), filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/g/GrimHaruspex.java b/Mage.Sets/src/mage/cards/g/GrimHaruspex.java
index 858cdc62dfe..bf0c9d478ba 100644
--- a/Mage.Sets/src/mage/cards/g/GrimHaruspex.java
+++ b/Mage.Sets/src/mage/cards/g/GrimHaruspex.java
@@ -28,8 +28,8 @@ public final class GrimHaruspex extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another nontoken creature you control");
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public GrimHaruspex(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GrimPoppet.java b/Mage.Sets/src/mage/cards/g/GrimPoppet.java
index 4d2318472a1..2e4004752c9 100644
--- a/Mage.Sets/src/mage/cards/g/GrimPoppet.java
+++ b/Mage.Sets/src/mage/cards/g/GrimPoppet.java
@@ -28,7 +28,7 @@ public final class GrimPoppet extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GrimPoppet(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GrimReminder.java b/Mage.Sets/src/mage/cards/g/GrimReminder.java
index 6ad9da49df4..d25a47eed4c 100644
--- a/Mage.Sets/src/mage/cards/g/GrimReminder.java
+++ b/Mage.Sets/src/mage/cards/g/GrimReminder.java
@@ -93,7 +93,7 @@ class GrimReminderEffect extends OneShotEffect {
Cards cardsToReveal = new CardsImpl(card);
controller.revealCards(sourceObject.getIdName(), cardsToReveal, game);
String cardName = card.getName();
- GrimReminderWatcher watcher = (GrimReminderWatcher) game.getState().getWatchers().get(GrimReminderWatcher.class.getSimpleName());
+ GrimReminderWatcher watcher = game.getState().getWatcher(GrimReminderWatcher.class);
if (watcher != null) {
for (UUID playerId : watcher.getPlayersCastSpell(cardName)) {
Player player = game.getPlayer(playerId);
@@ -116,7 +116,7 @@ class GrimReminderWatcher extends Watcher {
private final Map> playersCastSpell = new HashMap<>();
public GrimReminderWatcher() {
- super(GrimReminderWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(GrimReminderWatcher.class, WatcherScope.GAME);
}
public GrimReminderWatcher(final GrimReminderWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/g/GrimReturn.java b/Mage.Sets/src/mage/cards/g/GrimReturn.java
index 19e46ebcaa0..9fb55552e82 100644
--- a/Mage.Sets/src/mage/cards/g/GrimReturn.java
+++ b/Mage.Sets/src/mage/cards/g/GrimReturn.java
@@ -1,9 +1,6 @@
package mage.cards.g;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
@@ -17,10 +14,14 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardIdPredicate;
import mage.game.Game;
import mage.target.common.TargetCardInGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.watchers.common.CardsPutIntoGraveyardWatcher;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class GrimReturn extends CardImpl {
@@ -28,13 +29,13 @@ public final class GrimReturn extends CardImpl {
private static final String textFilter = "creature card in a graveyard that was put there from the battlefield this turn";
public GrimReturn(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}");
// Choose target creature card in a graveyard that was put there from the battlefield this turn. Put that card onto the battlefield under your control.
Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect();
effect.setText("Choose target creature card in a graveyard that was put there from the battlefield this turn. Put that card onto the battlefield under your control");
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
- this.getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard(textFilter)));
+ this.getSpellAbility().setTargetAdjuster(GrimReturnAdjuster.instance);
this.getSpellAbility().addWatcher(new CardsPutIntoGraveyardWatcher());
}
@@ -46,22 +47,27 @@ public final class GrimReturn extends CardImpl {
public GrimReturn copy() {
return new GrimReturn(this);
}
+}
+
+enum GrimReturnAdjuster implements TargetAdjuster {
+ instance;
+ private static final String textFilter = "creature card in a graveyard that was put there from the battlefield this turn";
@Override
public void adjustTargets(Ability ability, Game game) {
- CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get(CardsPutIntoGraveyardWatcher.class.getSimpleName());
- if (watcher != null) {
- FilterCard filter = new FilterCreatureCard(textFilter);
- List uuidPredicates = new ArrayList<>();
- for (MageObjectReference mor : watcher.getCardsPutToGraveyardFromBattlefield()) {
- if (game.getState().getZoneChangeCounter(mor.getSourceId()) == mor.getZoneChangeCounter()) {
- uuidPredicates.add(new CardIdPredicate(mor.getSourceId()));
- }
- }
- filter.add(Predicates.or(uuidPredicates));
- ability.getTargets().clear();
- ability.addTarget(new TargetCardInGraveyard(filter));
+ CardsPutIntoGraveyardWatcher watcher = game.getState().getWatcher(CardsPutIntoGraveyardWatcher.class);
+ if (watcher == null) {
+ return;
}
-
+ FilterCard filter = new FilterCreatureCard(textFilter);
+ List uuidPredicates = new ArrayList<>();
+ for (MageObjectReference mor : watcher.getCardsPutToGraveyardFromBattlefield()) {
+ if (mor.zoneCounterIsCurrent(game)) {
+ uuidPredicates.add(new CardIdPredicate(mor.getSourceId()));
+ }
+ }
+ filter.add(Predicates.or(uuidPredicates));
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCardInGraveyard(filter));
}
-}
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/g/GrimStrider.java b/Mage.Sets/src/mage/cards/g/GrimStrider.java
index 52027151678..816259aad66 100644
--- a/Mage.Sets/src/mage/cards/g/GrimStrider.java
+++ b/Mage.Sets/src/mage/cards/g/GrimStrider.java
@@ -29,7 +29,7 @@ public final class GrimStrider extends CardImpl {
this.toughness = new MageInt(6);
// Grim Strider gets -1/-1 for each card in your hand.
- DynamicValue count = new SignInversionDynamicValue(new CardsInControllerHandCount());
+ DynamicValue count = new SignInversionDynamicValue(CardsInControllerHandCount.instance);
Effect effect = new BoostSourceEffect(count, count, Duration.WhileOnBattlefield);
effect.setText("{this} gets -1/-1 for each card in your hand");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
diff --git a/Mage.Sets/src/mage/cards/g/GrimlockDinobotLeader.java b/Mage.Sets/src/mage/cards/g/GrimlockDinobotLeader.java
index 26548048daf..3fd572c4713 100644
--- a/Mage.Sets/src/mage/cards/g/GrimlockDinobotLeader.java
+++ b/Mage.Sets/src/mage/cards/g/GrimlockDinobotLeader.java
@@ -38,7 +38,7 @@ public final class GrimlockDinobotLeader extends CardImpl{
static {
filter2.add(Predicates.not(new SubtypePredicate(SubType.DINOSAUR)));
filter2.add(Predicates.not(new SubtypePredicate(SubType.VEHICLE)));
- filter2.add(Predicates.or(new AbilityPredicate(TransformAbility.class), new TransformedPredicate()));
+ filter2.add(Predicates.or(new AbilityPredicate(TransformAbility.class), TransformedPredicate.instance));
}
public GrimlockDinobotLeader(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GrindDust.java b/Mage.Sets/src/mage/cards/g/GrindDust.java
index 28941ffe2c0..f6ca8ccfa39 100644
--- a/Mage.Sets/src/mage/cards/g/GrindDust.java
+++ b/Mage.Sets/src/mage/cards/g/GrindDust.java
@@ -34,7 +34,7 @@ public final class GrindDust extends SplitCard {
// Dust
// Aftermath
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Exile any number of target creatures that have -1/-1 counters on them.
getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect());
FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures that have -1/-1 counters on them");
diff --git a/Mage.Sets/src/mage/cards/g/GrixisGrimblade.java b/Mage.Sets/src/mage/cards/g/GrixisGrimblade.java
index 3a6d2b65f77..9f47971b9b0 100644
--- a/Mage.Sets/src/mage/cards/g/GrixisGrimblade.java
+++ b/Mage.Sets/src/mage/cards/g/GrixisGrimblade.java
@@ -29,8 +29,8 @@ public final class GrixisGrimblade extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another multicolor permanent");
static {
- filter.add(new MulticoloredPredicate());
- filter.add(new AnotherPredicate());
+ filter.add(MulticoloredPredicate.instance);
+ filter.add(AnotherPredicate.instance);
}
public GrixisGrimblade(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GrizzledAngler.java b/Mage.Sets/src/mage/cards/g/GrizzledAngler.java
index 543b5807b10..b1715bac1f4 100644
--- a/Mage.Sets/src/mage/cards/g/GrizzledAngler.java
+++ b/Mage.Sets/src/mage/cards/g/GrizzledAngler.java
@@ -55,7 +55,7 @@ class GrizzledAnglerEffect extends OneShotEffect {
private static final FilterCreatureCard filter = new FilterCreatureCard("a colorless creature card in your graveyard");
static {
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
}
public GrizzledAnglerEffect() {
diff --git a/Mage.Sets/src/mage/cards/g/GrotesqueDemise.java b/Mage.Sets/src/mage/cards/g/GrotesqueDemise.java
new file mode 100644
index 00000000000..8abc7e0bcf6
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GrotesqueDemise.java
@@ -0,0 +1,42 @@
+package mage.cards.g;
+
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.PowerPredicate;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GrotesqueDemise extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterCreaturePermanent("creature with power 3 or less");
+
+ static {
+ filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 4));
+ }
+
+ public GrotesqueDemise(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}");
+
+ // Exile target creature with power 3 or less.
+ this.getSpellAbility().addEffect(new ExileTargetEffect());
+ this.getSpellAbility().addTarget(new TargetPermanent(filter));
+ }
+
+ private GrotesqueDemise(final GrotesqueDemise card) {
+ super(card);
+ }
+
+ @Override
+ public GrotesqueDemise copy() {
+ return new GrotesqueDemise(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GrothamaAllDevouring.java b/Mage.Sets/src/mage/cards/g/GrothamaAllDevouring.java
index 27a39841c3c..d5013b28788 100644
--- a/Mage.Sets/src/mage/cards/g/GrothamaAllDevouring.java
+++ b/Mage.Sets/src/mage/cards/g/GrothamaAllDevouring.java
@@ -64,7 +64,7 @@ class GrothamaAllDevouringGainAbilityEffect extends GainAbilityAllEffect {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
GrothamaAllDevouringGainAbilityEffect() {
@@ -148,7 +148,7 @@ class GrothamaAllDevouringDrawCardsEffect extends OneShotEffect {
if (controller == null) {
return false;
}
- GrothamaAllDevouringWatcher watcher = (GrothamaAllDevouringWatcher) game.getState().getWatchers().get(GrothamaAllDevouringWatcher.class.getSimpleName());
+ GrothamaAllDevouringWatcher watcher = game.getState().getWatcher(GrothamaAllDevouringWatcher.class);
if (watcher == null) {
return false;
}
@@ -171,7 +171,7 @@ class GrothamaAllDevouringWatcher extends Watcher {
Map> damageMap = new HashMap<>();
GrothamaAllDevouringWatcher() {
- super(GrothamaAllDevouringWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(GrothamaAllDevouringWatcher.class, WatcherScope.GAME);
}
GrothamaAllDevouringWatcher(final GrothamaAllDevouringWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/g/GroveOfTheGuardian.java b/Mage.Sets/src/mage/cards/g/GroveOfTheGuardian.java
index f5ae5cbfd91..d7c445de70d 100644
--- a/Mage.Sets/src/mage/cards/g/GroveOfTheGuardian.java
+++ b/Mage.Sets/src/mage/cards/g/GroveOfTheGuardian.java
@@ -33,7 +33,7 @@ public final class GroveOfTheGuardian extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creatures you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public GroveOfTheGuardian(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GrowthChamberGuardian.java b/Mage.Sets/src/mage/cards/g/GrowthChamberGuardian.java
new file mode 100644
index 00000000000..07e23ab62a1
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GrowthChamberGuardian.java
@@ -0,0 +1,53 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.common.OneOrMoreCountersAddedTriggeredAbility;
+import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
+import mage.abilities.keyword.AdaptAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.NamePredicate;
+import mage.target.common.TargetCardInLibrary;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GrowthChamberGuardian extends CardImpl {
+
+ private static final FilterCard filter
+ = new FilterCard("a card named Growth-Chamber Guardian");
+
+ static {
+ filter.add(new NamePredicate("Growth-Chamber Guardian"));
+ }
+
+ public GrowthChamberGuardian(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
+
+ this.subtype.add(SubType.ELF);
+ this.subtype.add(SubType.CRAB);
+ this.subtype.add(SubType.WARRIOR);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {2}{G}: Adapt 2.
+ this.addAbility(new AdaptAbility(2, "{2}{G}"));
+
+ // Whenever one or more +1/+1 counters are put on Growth-Chamber Guardian, you may search your library for a card named Growth-Chamber Guardian, reveal it, put it into your hand, then shuffle your library.
+ this.addAbility(new OneOrMoreCountersAddedTriggeredAbility(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), true));
+ }
+
+ private GrowthChamberGuardian(final GrowthChamberGuardian card) {
+ super(card);
+ }
+
+ @Override
+ public GrowthChamberGuardian copy() {
+ return new GrowthChamberGuardian(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GruesomeSlaughter.java b/Mage.Sets/src/mage/cards/g/GruesomeSlaughter.java
index 9e7c23ffeea..944d82dd9d5 100644
--- a/Mage.Sets/src/mage/cards/g/GruesomeSlaughter.java
+++ b/Mage.Sets/src/mage/cards/g/GruesomeSlaughter.java
@@ -27,7 +27,7 @@ public final class GruesomeSlaughter extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("colorless creatures you control");
static {
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
}
public GruesomeSlaughter(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GruulBeastmaster.java b/Mage.Sets/src/mage/cards/g/GruulBeastmaster.java
new file mode 100644
index 00000000000..c0e203c35b0
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GruulBeastmaster.java
@@ -0,0 +1,64 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.keyword.RiotAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GruulBeastmaster extends CardImpl {
+
+ private static final FilterPermanent filter
+ = new FilterControlledCreaturePermanent("another target creature you control");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
+
+ private static final DynamicValue xValue = new SourcePermanentPowerCount(false);
+
+ public GruulBeastmaster(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Riot
+ this.addAbility(new RiotAbility());
+
+ // Whenever Gruul Beastmaster attacks, another target creature you control gets +X/+0 until end of turn, where X is Gruul Beastmaster's power.
+ Ability ability = new AttacksTriggeredAbility(new BoostTargetEffect(
+ xValue, StaticValue.getZeroValue(), Duration.EndOfTurn, true
+ ), false);
+ ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
+ }
+
+ private GruulBeastmaster(final GruulBeastmaster card) {
+ super(card);
+ }
+
+ @Override
+ public GruulBeastmaster copy() {
+ return new GruulBeastmaster(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GruulLocket.java b/Mage.Sets/src/mage/cards/g/GruulLocket.java
new file mode 100644
index 00000000000..465cbb52f34
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GruulLocket.java
@@ -0,0 +1,45 @@
+package mage.cards.g;
+
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Zone;
+
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class GruulLocket extends CardImpl {
+
+ public GruulLocket(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
+
+ // {T}: Add {R} or {G}.
+ this.addAbility(new RedManaAbility());
+ this.addAbility(new GreenManaAbility());
+
+ // {R/G}{R/G}{R/G}{R/G}, {T}, Sacrifice Gruul Locket: Draw two cards.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new ManaCostsImpl<>("{R/G}{R/G}{R/G}{R/G}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public GruulLocket(final GruulLocket card) {
+ super(card);
+ }
+
+ @Override
+ public GruulLocket copy() {
+ return new GruulLocket(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GruulWarChant.java b/Mage.Sets/src/mage/cards/g/GruulWarChant.java
index ca508dd10c7..d403a4a3670 100644
--- a/Mage.Sets/src/mage/cards/g/GruulWarChant.java
+++ b/Mage.Sets/src/mage/cards/g/GruulWarChant.java
@@ -26,7 +26,7 @@ public final class GruulWarChant extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creatures you control");
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public GruulWarChant(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GuanYus1000LiMarch.java b/Mage.Sets/src/mage/cards/g/GuanYus1000LiMarch.java
index 6a5e9d1f594..5d4d4adb66c 100644
--- a/Mage.Sets/src/mage/cards/g/GuanYus1000LiMarch.java
+++ b/Mage.Sets/src/mage/cards/g/GuanYus1000LiMarch.java
@@ -18,7 +18,7 @@ public final class GuanYus1000LiMarch extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creatures");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public GuanYus1000LiMarch(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GuardianOfTheGuildpact.java b/Mage.Sets/src/mage/cards/g/GuardianOfTheGuildpact.java
index e70bbd7cd59..d912fe35185 100644
--- a/Mage.Sets/src/mage/cards/g/GuardianOfTheGuildpact.java
+++ b/Mage.Sets/src/mage/cards/g/GuardianOfTheGuildpact.java
@@ -20,7 +20,7 @@ public final class GuardianOfTheGuildpact extends CardImpl {
private static final FilterCard filter = new FilterCard("monocolored");
static {
- filter.add(new MonocoloredPredicate());
+ filter.add(MonocoloredPredicate.instance);
}
public GuardianOfTheGuildpact(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GuardianProject.java b/Mage.Sets/src/mage/cards/g/GuardianProject.java
new file mode 100644
index 00000000000..fe7ac3aa846
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GuardianProject.java
@@ -0,0 +1,153 @@
+package mage.cards.g;
+
+import mage.MageObjectReference;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.filter.FilterCard;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardIdPredicate;
+import mage.filter.predicate.mageobject.NamePredicate;
+import mage.filter.predicate.other.OwnerIdPredicate;
+import mage.filter.predicate.permanent.ControllerIdPredicate;
+import mage.filter.predicate.permanent.TokenPredicate;
+import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
+import mage.game.events.GameEvent;
+import mage.game.events.ZoneChangeEvent;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GuardianProject extends CardImpl {
+
+ public GuardianProject(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");
+
+ // Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card.
+ this.addAbility(new GuardianProjectTriggeredAbility());
+ }
+
+ private GuardianProject(final GuardianProject card) {
+ super(card);
+ }
+
+ @Override
+ public GuardianProject copy() {
+ return new GuardianProject(this);
+ }
+}
+
+class GuardianProjectTriggeredAbility extends EntersBattlefieldAllTriggeredAbility {
+
+ public static final FilterPermanent filter = new FilterControlledCreaturePermanent();
+
+ static {
+ filter.add(Predicates.not(TokenPredicate.instance));
+ }
+
+ GuardianProjectTriggeredAbility() {
+ super(new GuardianProjectEffect(null), filter);
+ }
+
+ private GuardianProjectTriggeredAbility(final GuardianProjectTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public GuardianProjectTriggeredAbility copy() {
+ return new GuardianProjectTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget();
+ if (!filter.match(permanent, sourceId, controllerId, game)) {
+ return false;
+ }
+
+ if (checkCondition(permanent, controllerId, game)) {
+ this.getEffects().clear();
+ this.addEffect(new GuardianProjectEffect(new MageObjectReference(permanent, game)));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever a nontoken creature enters the battlefield under your control, " +
+ "if that creature does not have the same name as another creature you control " +
+ "or a creature card in your graveyard, draw a card.";
+ }
+
+ // This is needed as checkInterveningIfClause can't access trigger event information
+ static boolean checkCondition(Permanent permanent, UUID controllerId, Game game) {
+ Player player = game.getPlayer(controllerId);
+ if (player == null) {
+ return false;
+ }
+ if (!permanent.getName().isEmpty()) {
+ FilterCard filterCard = new FilterCard();
+ filterCard.add(new NamePredicate(permanent.getName()));
+ filterCard.add(new OwnerIdPredicate(controllerId));
+ if (player.getGraveyard().count(filterCard, game) > 0) {
+ return false;
+ }
+ }
+ FilterPermanent filterPermanent = new FilterCreaturePermanent();
+ filterPermanent.add(new NamePredicate(permanent.getName()));
+ filterPermanent.add(Predicates.not(new CardIdPredicate(permanent.getId())));
+ filterPermanent.add(new ControllerIdPredicate(controllerId));
+ if (game.getBattlefield().getActivePermanents(filterPermanent, controllerId, game).size() > 0) {
+ return false;
+ }
+ return true;
+ }
+}
+
+class GuardianProjectEffect extends OneShotEffect {
+
+ private final MageObjectReference mor;
+
+ GuardianProjectEffect(MageObjectReference mor) {
+ super(Outcome.Benefit);
+ this.mor = mor;
+ }
+
+ private GuardianProjectEffect(final GuardianProjectEffect effect) {
+ super(effect);
+ this.mor = effect.mor;
+ }
+
+ @Override
+ public GuardianProjectEffect copy() {
+ return new GuardianProjectEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ if (GuardianProjectTriggeredAbility.checkCondition(
+ mor.getPermanentOrLKIBattlefield(game), source.getControllerId(), game)
+ ) {
+ player.drawCards(1, game);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GuardianShieldBearer.java b/Mage.Sets/src/mage/cards/g/GuardianShieldBearer.java
index b880b36706c..944497e356d 100644
--- a/Mage.Sets/src/mage/cards/g/GuardianShieldBearer.java
+++ b/Mage.Sets/src/mage/cards/g/GuardianShieldBearer.java
@@ -26,7 +26,7 @@ public final class GuardianShieldBearer extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public GuardianShieldBearer(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GuardiansMagemark.java b/Mage.Sets/src/mage/cards/g/GuardiansMagemark.java
index e3f44eb59d6..b16ee18b66b 100644
--- a/Mage.Sets/src/mage/cards/g/GuardiansMagemark.java
+++ b/Mage.Sets/src/mage/cards/g/GuardiansMagemark.java
@@ -25,7 +25,7 @@ public final class GuardiansMagemark extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control that are enchanted");
static {
- filter.add(new EnchantedPredicate());
+ filter.add(EnchantedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/g/GuardiansOfKoilos.java b/Mage.Sets/src/mage/cards/g/GuardiansOfKoilos.java
index 792cbaca872..01d08304a57 100644
--- a/Mage.Sets/src/mage/cards/g/GuardiansOfKoilos.java
+++ b/Mage.Sets/src/mage/cards/g/GuardiansOfKoilos.java
@@ -26,8 +26,8 @@ public final class GuardiansOfKoilos extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another historic permanent you control");
static {
- filter.add(new AnotherPredicate());
- filter.add(new HistoricPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(HistoricPredicate.instance);
}
public GuardiansOfKoilos(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/GuildSummit.java b/Mage.Sets/src/mage/cards/g/GuildSummit.java
index a6d18e5a067..5f66810b15e 100644
--- a/Mage.Sets/src/mage/cards/g/GuildSummit.java
+++ b/Mage.Sets/src/mage/cards/g/GuildSummit.java
@@ -64,7 +64,7 @@ class GuildSummitEffect extends OneShotEffect {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.GATE));
}
diff --git a/Mage.Sets/src/mage/cards/g/GuildmagesForum.java b/Mage.Sets/src/mage/cards/g/GuildmagesForum.java
index 1a1792352e0..e87d34e10d0 100644
--- a/Mage.Sets/src/mage/cards/g/GuildmagesForum.java
+++ b/Mage.Sets/src/mage/cards/g/GuildmagesForum.java
@@ -88,11 +88,6 @@ class GuildmagesForumWatcher extends Watcher {
}
}
- @Override
- public void reset() {
- super.reset();
- }
-
}
class GuildmagesForumEntersBattlefieldEffect extends ReplacementEffectImpl {
diff --git a/Mage.Sets/src/mage/cards/g/GuildscornWard.java b/Mage.Sets/src/mage/cards/g/GuildscornWard.java
index d5b36ac2c5b..926493ff835 100644
--- a/Mage.Sets/src/mage/cards/g/GuildscornWard.java
+++ b/Mage.Sets/src/mage/cards/g/GuildscornWard.java
@@ -24,7 +24,7 @@ public final class GuildscornWard extends CardImpl {
private static final FilterObject filter = new FilterObject("multicolored");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public GuildscornWard(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/g/Gutterbones.java b/Mage.Sets/src/mage/cards/g/Gutterbones.java
new file mode 100644
index 00000000000..fe3aefee96c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/Gutterbones.java
@@ -0,0 +1,69 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalActivatedAbility;
+import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.watchers.common.PlayerLostLifeWatcher;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Gutterbones extends CardImpl {
+
+ public Gutterbones(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
+
+ this.subtype.add(SubType.SKELETON);
+ this.subtype.add(SubType.WARRIOR);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Gutterbones enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // {1}{B}: Return Gutterbones from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn.
+ this.addAbility(new ConditionalActivatedAbility(
+ Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(),
+ new ManaCostsImpl("{1}{B}"), GutterbonesCondition.instance
+ ));
+ }
+
+ private Gutterbones(final Gutterbones card) {
+ super(card);
+ }
+
+ @Override
+ public Gutterbones copy() {
+ return new Gutterbones(this);
+ }
+}
+
+enum GutterbonesCondition implements Condition {
+ instance;
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ if (game.isActivePlayer(source.getControllerId())) {
+ PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class);
+ return watcher != null && watcher.getAllOppLifeLost(source.getControllerId(), game) > 0;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "during your turn and only if an opponent lost life this turn";
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/g/GyreEngineer.java b/Mage.Sets/src/mage/cards/g/GyreEngineer.java
new file mode 100644
index 00000000000..94ee946a7d4
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/g/GyreEngineer.java
@@ -0,0 +1,40 @@
+package mage.cards.g;
+
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Zone;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class GyreEngineer extends CardImpl {
+
+ public GyreEngineer(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{U}");
+
+ this.subtype.add(SubType.VEDALKEN);
+ this.subtype.add(SubType.WIZARD);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {T}: Add {G}{U}.
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new Mana(0, 1, 1, 0, 0, 0, 0, 0), new TapSourceCost()));
+ }
+
+ private GyreEngineer(final GyreEngineer card) {
+ super(card);
+ }
+
+ @Override
+ public GyreEngineer copy() {
+ return new GyreEngineer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/g/GyrusWakerOfCorpses.java b/Mage.Sets/src/mage/cards/g/GyrusWakerOfCorpses.java
index b7224b44243..298ef39c257 100644
--- a/Mage.Sets/src/mage/cards/g/GyrusWakerOfCorpses.java
+++ b/Mage.Sets/src/mage/cards/g/GyrusWakerOfCorpses.java
@@ -57,7 +57,7 @@ public final class GyrusWakerOfCorpses extends CardImpl {
this.toughness = new MageInt(0);
// Gyrus, Walker of Corpses enters the battlefield with a number of +1/+1 counters on it equal to the amount of mana spent to cast it.
- Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), new ManaSpentToCastCount(), true);
+ Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), ManaSpentToCastCount.instance, true);
effect.setText("with a number of +1/+1 counters on it equal to the amount of mana spent to cast it");
this.addAbility(new EntersBattlefieldAbility(effect));
diff --git a/Mage.Sets/src/mage/cards/h/HaazdaOfficer.java b/Mage.Sets/src/mage/cards/h/HaazdaOfficer.java
new file mode 100644
index 00000000000..1f657213043
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/h/HaazdaOfficer.java
@@ -0,0 +1,42 @@
+package mage.cards.h;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class HaazdaOfficer extends CardImpl {
+
+ public HaazdaOfficer(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SOLDIER);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // When Haazda Officer enters the battlefield, target creature you control gets +1/+1 until end of turn.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(1, 1));
+ ability.addTarget(new TargetControlledCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ private HaazdaOfficer(final HaazdaOfficer card) {
+ super(card);
+ }
+
+ @Override
+ public HaazdaOfficer copy() {
+ return new HaazdaOfficer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/h/Hackrobat.java b/Mage.Sets/src/mage/cards/h/Hackrobat.java
new file mode 100644
index 00000000000..c2ad3229d6f
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/h/Hackrobat.java
@@ -0,0 +1,58 @@
+package mage.cards.h;
+
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ColoredManaCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.abilities.keyword.SpectacleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Hackrobat extends CardImpl {
+
+ public Hackrobat(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{R}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.ROGUE);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Spectacle {B}{R}
+ this.addAbility(new SpectacleAbility(this, new ManaCostsImpl("{B}{R}")));
+
+ // {B}: Hackrobat gains deathtouch until end of turn.
+ this.addAbility(new SimpleActivatedAbility(
+ Zone.BATTLEFIELD,
+ new GainAbilitySourceEffect(
+ DeathtouchAbility.getInstance(),
+ Duration.EndOfTurn
+ ), new ColoredManaCost(ColoredManaSymbol.B)
+ ));
+
+ // {R}: Hackrobat gets +2/-2 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(
+ Zone.BATTLEFIELD,
+ new BoostSourceEffect(2, -2, Duration.EndOfTurn),
+ new ColoredManaCost(ColoredManaSymbol.R)
+ ));
+ }
+
+ private Hackrobat(final Hackrobat card) {
+ super(card);
+ }
+
+ @Override
+ public Hackrobat copy() {
+ return new Hackrobat(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/h/HailOfArrows.java b/Mage.Sets/src/mage/cards/h/HailOfArrows.java
index 6fadd26e165..90020cd2c28 100644
--- a/Mage.Sets/src/mage/cards/h/HailOfArrows.java
+++ b/Mage.Sets/src/mage/cards/h/HailOfArrows.java
@@ -20,8 +20,8 @@ public final class HailOfArrows extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{W}");
// Hail of Arrows deals X damage divided as you choose among any number of target attacking creatures.
- this.getSpellAbility().addEffect(new DamageMultiEffect(new ManacostVariableValue()));
- this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(new ManacostVariableValue(), new FilterAttackingCreature()));
+ this.getSpellAbility().addEffect(new DamageMultiEffect(ManacostVariableValue.instance));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanentAmount(ManacostVariableValue.instance, new FilterAttackingCreature()));
}
public HailOfArrows(final HailOfArrows card) {
diff --git a/Mage.Sets/src/mage/cards/h/HairStrungKoto.java b/Mage.Sets/src/mage/cards/h/HairStrungKoto.java
index 9851b3a7a65..461113571c5 100644
--- a/Mage.Sets/src/mage/cards/h/HairStrungKoto.java
+++ b/Mage.Sets/src/mage/cards/h/HairStrungKoto.java
@@ -52,7 +52,7 @@ public final class HairStrungKoto extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public HairStrungKoto (UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/Halfdane.java b/Mage.Sets/src/mage/cards/h/Halfdane.java
index 9c0972d6112..d837c5c9b7b 100644
--- a/Mage.Sets/src/mage/cards/h/Halfdane.java
+++ b/Mage.Sets/src/mage/cards/h/Halfdane.java
@@ -27,7 +27,7 @@ public final class Halfdane extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("target creature other than Halfdane");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public Halfdane(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HallowedMoonlight.java b/Mage.Sets/src/mage/cards/h/HallowedMoonlight.java
index 90ccbbcf021..4665df8897a 100644
--- a/Mage.Sets/src/mage/cards/h/HallowedMoonlight.java
+++ b/Mage.Sets/src/mage/cards/h/HallowedMoonlight.java
@@ -83,7 +83,7 @@ class HallowedMoonlightEffect extends ReplacementEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
EntersTheBattlefieldEvent entersTheBattlefieldEvent = (EntersTheBattlefieldEvent) event;
if (entersTheBattlefieldEvent.getTarget().isCreature()) {
- CreatureWasCastWatcher watcher = (CreatureWasCastWatcher) game.getState().getWatchers().get(CreatureWasCastWatcher.class.getSimpleName());
+ CreatureWasCastWatcher watcher = game.getState().getWatcher(CreatureWasCastWatcher.class);
if (watcher != null && !watcher.wasCreatureCastThisTurn(event.getTargetId())) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/h/HallsOfMist.java b/Mage.Sets/src/mage/cards/h/HallsOfMist.java
index 1896bc612a1..72cb16de38c 100644
--- a/Mage.Sets/src/mage/cards/h/HallsOfMist.java
+++ b/Mage.Sets/src/mage/cards/h/HallsOfMist.java
@@ -62,7 +62,7 @@ class CantAttackIfAttackedLastTurnAllEffect extends RestrictionEffect {
@Override
public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game) {
- AttackedLastTurnWatcher watcher = (AttackedLastTurnWatcher) game.getState().getWatchers().get(AttackedLastTurnWatcher.class.getSimpleName());
+ AttackedLastTurnWatcher watcher = game.getState().getWatcher(AttackedLastTurnWatcher.class);
if (watcher != null) {
Set attackingCreatures = watcher.getAttackedLastTurnCreatures(attacker.getControllerId());
MageObjectReference mor = new MageObjectReference(attacker, game);
diff --git a/Mage.Sets/src/mage/cards/h/HammerheadCorvette.java b/Mage.Sets/src/mage/cards/h/HammerheadCorvette.java
index 4fcedfed348..c24bc7ef690 100644
--- a/Mage.Sets/src/mage/cards/h/HammerheadCorvette.java
+++ b/Mage.Sets/src/mage/cards/h/HammerheadCorvette.java
@@ -28,7 +28,7 @@ public final class HammerheadCorvette extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.STARSHIP));
- filter.add(new DefendingPlayerControlsPredicate());
+ filter.add(DefendingPlayerControlsPredicate.instance);
}
public HammerheadCorvette(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HanSoloScrumrat.java b/Mage.Sets/src/mage/cards/h/HanSoloScrumrat.java
index 9508f8e3189..27a92480897 100644
--- a/Mage.Sets/src/mage/cards/h/HanSoloScrumrat.java
+++ b/Mage.Sets/src/mage/cards/h/HanSoloScrumrat.java
@@ -31,7 +31,7 @@ public final class HanSoloScrumrat extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public HanSoloScrumrat(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HandOfJustice.java b/Mage.Sets/src/mage/cards/h/HandOfJustice.java
index 31dceaa7837..cb8f234b8aa 100644
--- a/Mage.Sets/src/mage/cards/h/HandOfJustice.java
+++ b/Mage.Sets/src/mage/cards/h/HandOfJustice.java
@@ -31,7 +31,7 @@ public final class HandOfJustice extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.WHITE));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public HandOfJustice(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HarbingerOfTheHunt.java b/Mage.Sets/src/mage/cards/h/HarbingerOfTheHunt.java
index 48abb7cf9a3..59df8b1227e 100644
--- a/Mage.Sets/src/mage/cards/h/HarbingerOfTheHunt.java
+++ b/Mage.Sets/src/mage/cards/h/HarbingerOfTheHunt.java
@@ -29,7 +29,7 @@ public final class HarbingerOfTheHunt extends CardImpl {
static {
filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class)));
filter2.add(new AbilityPredicate(FlyingAbility.class));
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
}
public HarbingerOfTheHunt(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HarbingerOfTheTides.java b/Mage.Sets/src/mage/cards/h/HarbingerOfTheTides.java
index c2f3051f35b..407f1fe645c 100644
--- a/Mage.Sets/src/mage/cards/h/HarbingerOfTheTides.java
+++ b/Mage.Sets/src/mage/cards/h/HarbingerOfTheTides.java
@@ -27,7 +27,7 @@ public final class HarbingerOfTheTides extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature an opponent controls");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
diff --git a/Mage.Sets/src/mage/cards/h/HardenedBerserker.java b/Mage.Sets/src/mage/cards/h/HardenedBerserker.java
index 5793f80ee18..dbcc074bfbc 100644
--- a/Mage.Sets/src/mage/cards/h/HardenedBerserker.java
+++ b/Mage.Sets/src/mage/cards/h/HardenedBerserker.java
@@ -62,7 +62,7 @@ class HardenedBerserkerSpellsCostReductionEffect extends CostModificationEffectI
@Override
public void init(Ability source, Game game) {
super.init(source, game);
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null) {
spellsCast = watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(source.getControllerId());
}
@@ -76,7 +76,7 @@ class HardenedBerserkerSpellsCostReductionEffect extends CostModificationEffectI
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null) {
if (watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(source.getControllerId()) > spellsCast) {
discard(); // only one use
diff --git a/Mage.Sets/src/mage/cards/h/HarmonyOfNature.java b/Mage.Sets/src/mage/cards/h/HarmonyOfNature.java
index 6a7f17e1d4d..33bcb4b7a72 100644
--- a/Mage.Sets/src/mage/cards/h/HarmonyOfNature.java
+++ b/Mage.Sets/src/mage/cards/h/HarmonyOfNature.java
@@ -49,7 +49,7 @@ class HarmonyOfNatureEffect extends OneShotEffect {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public HarmonyOfNatureEffect() {
diff --git a/Mage.Sets/src/mage/cards/h/HarnessTheStorm.java b/Mage.Sets/src/mage/cards/h/HarnessTheStorm.java
index 165ef34ebb7..d7eb201d296 100644
--- a/Mage.Sets/src/mage/cards/h/HarnessTheStorm.java
+++ b/Mage.Sets/src/mage/cards/h/HarnessTheStorm.java
@@ -61,7 +61,7 @@ class HarnessTheStormTriggeredAbility extends SpellCastControllerTriggeredAbilit
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (super.checkTrigger(event, game)) {
- CastFromHandWatcher watcher = (CastFromHandWatcher) game.getState().getWatchers().get(CastFromHandWatcher.class.getSimpleName());
+ CastFromHandWatcher watcher = game.getState().getWatcher(CastFromHandWatcher.class);
if (watcher != null && watcher.spellWasCastFromHand(event.getSourceId())) {
Spell spell = game.getState().getStack().getSpell(event.getSourceId());
if (spell != null) {
diff --git a/Mage.Sets/src/mage/cards/h/HarshJustice.java b/Mage.Sets/src/mage/cards/h/HarshJustice.java
index 6f763f7f431..b65e020c9bd 100644
--- a/Mage.Sets/src/mage/cards/h/HarshJustice.java
+++ b/Mage.Sets/src/mage/cards/h/HarshJustice.java
@@ -63,7 +63,7 @@ class HarshJusticeTriggeredAbility extends DelayedTriggeredAbility {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creature");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public HarshJusticeTriggeredAbility() {
diff --git a/Mage.Sets/src/mage/cards/h/HarshMentor.java b/Mage.Sets/src/mage/cards/h/HarshMentor.java
index 44fe93aa0a0..7a01484d2a9 100644
--- a/Mage.Sets/src/mage/cards/h/HarshMentor.java
+++ b/Mage.Sets/src/mage/cards/h/HarshMentor.java
@@ -1,7 +1,5 @@
-
package mage.cards.h;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.dynamicvalue.common.StaticValue;
@@ -20,8 +18,9 @@ import mage.game.events.GameEvent.EventType;
import mage.game.stack.StackAbility;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author spjspj
*/
public final class HarshMentor extends CardImpl {
@@ -51,7 +50,7 @@ public final class HarshMentor extends CardImpl {
class HarshMentorTriggeredAbility extends TriggeredAbilityImpl {
HarshMentorTriggeredAbility() {
- super(Zone.BATTLEFIELD, new DamageTargetEffect(new StaticValue(2), false, "that player", true));
+ super(Zone.BATTLEFIELD, new DamageTargetEffect(new StaticValue(2), true, "that player", true));
}
HarshMentorTriggeredAbility(final HarshMentorTriggeredAbility ability) {
diff --git a/Mage.Sets/src/mage/cards/h/HarvestPyre.java b/Mage.Sets/src/mage/cards/h/HarvestPyre.java
index 859ec2c1325..1c4f36caecd 100644
--- a/Mage.Sets/src/mage/cards/h/HarvestPyre.java
+++ b/Mage.Sets/src/mage/cards/h/HarvestPyre.java
@@ -26,7 +26,7 @@ public final class HarvestPyre extends CardImpl {
// Harvest Pyre deals X damage to target creature.
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
- this.getSpellAbility().addEffect(new DamageTargetEffect(new GetXValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance));
}
public HarvestPyre(final HarvestPyre card) {
diff --git a/Mage.Sets/src/mage/cards/h/HarvestSeason.java b/Mage.Sets/src/mage/cards/h/HarvestSeason.java
index f0652a5db11..02bbfdf85a8 100644
--- a/Mage.Sets/src/mage/cards/h/HarvestSeason.java
+++ b/Mage.Sets/src/mage/cards/h/HarvestSeason.java
@@ -50,7 +50,7 @@ class HarvestSeasonEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("tapped creature you control");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
HarvestSeasonEffect() {
diff --git a/Mage.Sets/src/mage/cards/h/HarvesterOfSouls.java b/Mage.Sets/src/mage/cards/h/HarvesterOfSouls.java
index 92bf69c0b24..487f203ec76 100644
--- a/Mage.Sets/src/mage/cards/h/HarvesterOfSouls.java
+++ b/Mage.Sets/src/mage/cards/h/HarvesterOfSouls.java
@@ -23,8 +23,8 @@ public final class HarvesterOfSouls extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
- filter.add(new AnotherPredicate());
+ filter.add(Predicates.not(TokenPredicate.instance));
+ filter.add(AnotherPredicate.instance);
}
public HarvesterOfSouls(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HatchingPlans.java b/Mage.Sets/src/mage/cards/h/HatchingPlans.java
index 586b5f0db62..ce66f5a1312 100644
--- a/Mage.Sets/src/mage/cards/h/HatchingPlans.java
+++ b/Mage.Sets/src/mage/cards/h/HatchingPlans.java
@@ -1,27 +1,26 @@
-
-
package mage.cards.h;
-import java.util.UUID;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import java.util.UUID;
+
/**
- *
* @author Loki
*/
public final class HatchingPlans extends CardImpl {
- public HatchingPlans (UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}");
+ public HatchingPlans(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
+ // When Hatching Plans is put into a graveyard from the battlefield, draw three cards.
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DrawCardSourceControllerEffect(3)));
}
- public HatchingPlans (final HatchingPlans card) {
+ public HatchingPlans(final HatchingPlans card) {
super(card);
}
diff --git a/Mage.Sets/src/mage/cards/h/Hatred.java b/Mage.Sets/src/mage/cards/h/Hatred.java
index fd01727fbda..1d096e1cb6a 100644
--- a/Mage.Sets/src/mage/cards/h/Hatred.java
+++ b/Mage.Sets/src/mage/cards/h/Hatred.java
@@ -26,7 +26,7 @@ public final class Hatred extends CardImpl {
this.getSpellAbility().addCost(new PayVariableLifeCost(true));
// Target creature gets +X/+0 until end of turn.
- DynamicValue xValue = new GetXValue();
+ DynamicValue xValue = GetXValue.instance;
this.getSpellAbility().addEffect(new BoostTargetEffect(xValue, new StaticValue(0), Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/h/HauntingHymn.java b/Mage.Sets/src/mage/cards/h/HauntingHymn.java
index a4f09875fb3..4ab5f76652f 100644
--- a/Mage.Sets/src/mage/cards/h/HauntingHymn.java
+++ b/Mage.Sets/src/mage/cards/h/HauntingHymn.java
@@ -2,7 +2,7 @@
package mage.cards.h;
import java.util.UUID;
-import mage.abilities.condition.common.MyMainPhaseCondition;
+import mage.abilities.condition.common.AddendumCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.discard.DiscardTargetEffect;
import mage.cards.CardImpl;
@@ -23,7 +23,7 @@ public final class HauntingHymn extends CardImpl {
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new DiscardTargetEffect(4),
new DiscardTargetEffect(2),
- MyMainPhaseCondition.instance,
+ AddendumCondition.instance,
"Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead"));
this.getSpellAbility().addTarget(new TargetPlayer());
diff --git a/Mage.Sets/src/mage/cards/h/HauntingMisery.java b/Mage.Sets/src/mage/cards/h/HauntingMisery.java
index aa4f0f4de2d..a6a2d25197f 100644
--- a/Mage.Sets/src/mage/cards/h/HauntingMisery.java
+++ b/Mage.Sets/src/mage/cards/h/HauntingMisery.java
@@ -24,7 +24,7 @@ public final class HauntingMisery extends CardImpl {
this.getSpellAbility().addCost(new ExileXFromYourGraveCost(new FilterCreatureCard()));
// Haunting Misery deals X damage to target player.
this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker());
- this.getSpellAbility().addEffect(new DamageTargetEffect(new GetXValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(GetXValue.instance));
}
public HauntingMisery(final HauntingMisery card) {
diff --git a/Mage.Sets/src/mage/cards/h/HavengulSkaab.java b/Mage.Sets/src/mage/cards/h/HavengulSkaab.java
index 6953a576d72..7cd46a2b7c0 100644
--- a/Mage.Sets/src/mage/cards/h/HavengulSkaab.java
+++ b/Mage.Sets/src/mage/cards/h/HavengulSkaab.java
@@ -50,7 +50,7 @@ class HavengulSkaabAbility extends TriggeredAbilityImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public HavengulSkaabAbility() {
diff --git a/Mage.Sets/src/mage/cards/h/HazyHomunculus.java b/Mage.Sets/src/mage/cards/h/HazyHomunculus.java
index 6a7ad243d61..67e4877ae4b 100644
--- a/Mage.Sets/src/mage/cards/h/HazyHomunculus.java
+++ b/Mage.Sets/src/mage/cards/h/HazyHomunculus.java
@@ -27,7 +27,7 @@ public final class HazyHomunculus extends CardImpl {
private static final FilterPermanent filter = new FilterLandPermanent();
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public HazyHomunculus(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HeadstrongBrute.java b/Mage.Sets/src/mage/cards/h/HeadstrongBrute.java
index e2cf1d102dd..d04c6920f60 100644
--- a/Mage.Sets/src/mage/cards/h/HeadstrongBrute.java
+++ b/Mage.Sets/src/mage/cards/h/HeadstrongBrute.java
@@ -29,7 +29,7 @@ public final class HeadstrongBrute extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.PIRATE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public HeadstrongBrute(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HearthCharm.java b/Mage.Sets/src/mage/cards/h/HearthCharm.java
index 5b6e3d7aece..af7d92eea0e 100644
--- a/Mage.Sets/src/mage/cards/h/HearthCharm.java
+++ b/Mage.Sets/src/mage/cards/h/HearthCharm.java
@@ -28,7 +28,7 @@ public final class HearthCharm extends CardImpl {
private static final FilterCreaturePermanent filter3 = new FilterCreaturePermanent("creature with power 2 or less");
static {
filter1.add(new CardTypePredicate(CardType.ARTIFACT));
- filter2.add(new AttackingPredicate());
+ filter2.add(AttackingPredicate.instance);
filter3.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
}
diff --git a/Mage.Sets/src/mage/cards/h/HeatRay.java b/Mage.Sets/src/mage/cards/h/HeatRay.java
index d05f13cf840..571dcae460c 100644
--- a/Mage.Sets/src/mage/cards/h/HeatRay.java
+++ b/Mage.Sets/src/mage/cards/h/HeatRay.java
@@ -19,7 +19,7 @@ public final class HeatRay extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{R}");
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/h/HeatStroke.java b/Mage.Sets/src/mage/cards/h/HeatStroke.java
index 130b465e313..6d4a1982bc6 100644
--- a/Mage.Sets/src/mage/cards/h/HeatStroke.java
+++ b/Mage.Sets/src/mage/cards/h/HeatStroke.java
@@ -66,8 +66,9 @@ class HeatStrokeEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- BlockedThisTurnWatcher blockedWatcher = (BlockedThisTurnWatcher) game.getState().getWatchers().get(BlockedThisTurnWatcher.class.getSimpleName());
- WasBlockedThisTurnWatcher wasBlockedThisTurnWatcher = (WasBlockedThisTurnWatcher) game.getState().getWatchers().get(WasBlockedThisTurnWatcher.class.getSimpleName());
+ BlockedThisTurnWatcher blockedWatcher = game.getState().getWatcher(BlockedThisTurnWatcher.class);
+ WasBlockedThisTurnWatcher wasBlockedThisTurnWatcher = game.getState().getWatcher(WasBlockedThisTurnWatcher.class);
+
Set inROI = new HashSet<>(game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game));
boolean toRet = false;
Set toDestroy = new HashSet<>();
diff --git a/Mage.Sets/src/mage/cards/h/HeavenEarth.java b/Mage.Sets/src/mage/cards/h/HeavenEarth.java
index 86dfdf57f59..51dad694db3 100644
--- a/Mage.Sets/src/mage/cards/h/HeavenEarth.java
+++ b/Mage.Sets/src/mage/cards/h/HeavenEarth.java
@@ -33,13 +33,13 @@ public final class HeavenEarth extends SplitCard {
// Falling
// Falling deals X damage to each creature with flying.
- getLeftHalfCard().getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filterFlying));
+ getLeftHalfCard().getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.instance, filterFlying));
// to
// Earth
// Earth deals X damage to each creature without flying.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
- getRightHalfCard().getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filterWithouFlying));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.instance, filterWithouFlying));
}
public HeavenEarth(final HeavenEarth card) {
diff --git a/Mage.Sets/src/mage/cards/h/HeavenlyQilin.java b/Mage.Sets/src/mage/cards/h/HeavenlyQilin.java
index 853fb730b87..1f3f0386ce2 100644
--- a/Mage.Sets/src/mage/cards/h/HeavenlyQilin.java
+++ b/Mage.Sets/src/mage/cards/h/HeavenlyQilin.java
@@ -24,7 +24,7 @@ public final class HeavenlyQilin extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public HeavenlyQilin(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/Hecatomb.java b/Mage.Sets/src/mage/cards/h/Hecatomb.java
index 30efd3863b8..ed9b77932cf 100644
--- a/Mage.Sets/src/mage/cards/h/Hecatomb.java
+++ b/Mage.Sets/src/mage/cards/h/Hecatomb.java
@@ -32,7 +32,7 @@ public final class Hecatomb extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.SWAMP));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public Hecatomb(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HelixPinnacle.java b/Mage.Sets/src/mage/cards/h/HelixPinnacle.java
index dc62fe13770..268d7f125b0 100644
--- a/Mage.Sets/src/mage/cards/h/HelixPinnacle.java
+++ b/Mage.Sets/src/mage/cards/h/HelixPinnacle.java
@@ -34,7 +34,7 @@ public final class HelixPinnacle extends CardImpl {
// {X}: Put X tower counters on Helix Pinnacle.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD,
- new AddCountersSourceEffect(CounterType.TOWER.createInstance(), new ManacostVariableValue(), true),
+ new AddCountersSourceEffect(CounterType.TOWER.createInstance(), ManacostVariableValue.instance, true),
new ManaCostsImpl("{X}")));
// At the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game.
diff --git a/Mage.Sets/src/mage/cards/h/Helldozer.java b/Mage.Sets/src/mage/cards/h/Helldozer.java
index 71f73bb478f..b1f5860b863 100644
--- a/Mage.Sets/src/mage/cards/h/Helldozer.java
+++ b/Mage.Sets/src/mage/cards/h/Helldozer.java
@@ -1,4 +1,3 @@
-
package mage.cards.h;
import java.util.UUID;
@@ -33,7 +32,10 @@ public final class Helldozer extends CardImpl {
this.toughness = new MageInt(5);
// {B}{B}{B}, {tap}: Destroy target land. If that land was nonbasic, untap Helldozer.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new HelldozerEffect(), new ManaCostsImpl("{B}{B}{B}"));
+ Ability ability = new SimpleActivatedAbility(
+ Zone.BATTLEFIELD,
+ new HelldozerEffect(),
+ new ManaCostsImpl("{B}{B}{B}"));
ability.addTarget(new TargetLandPermanent());
ability.addCost(new TapSourceCost());
this.addAbility(ability);
@@ -70,13 +72,13 @@ class HelldozerEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent helldozer = game.getPermanent(source.getSourceId());
Permanent landTarget = game.getPermanent(source.getFirstTarget());
- if (landTarget == null) {
- return false;
- }
- boolean wasNonBasic = !landTarget.isBasic();
- landTarget.destroy(id, game, false);
- if (wasNonBasic && helldozer != null) {
- return helldozer.untap(game);
+ if (landTarget != null) {
+ boolean wasNonBasic = !landTarget.isBasic();
+ landTarget.destroy(source.getSourceId(), game, false);
+ if (wasNonBasic
+ && helldozer != null) {
+ return helldozer.untap(game);
+ }
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java b/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java
index 3baa8970d36..902555e718a 100644
--- a/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java
+++ b/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java
@@ -25,7 +25,7 @@ public final class HellkiteWhelp extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.CREATURE));
- filter.add(new DefendingPlayerControlsPredicate());
+ filter.add(DefendingPlayerControlsPredicate.instance);
}
public HellkiteWhelp(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HelmOfObedience.java b/Mage.Sets/src/mage/cards/h/HelmOfObedience.java
index 4221686f3a2..bad8be25926 100644
--- a/Mage.Sets/src/mage/cards/h/HelmOfObedience.java
+++ b/Mage.Sets/src/mage/cards/h/HelmOfObedience.java
@@ -49,7 +49,7 @@ public final class HelmOfObedience extends CardImpl {
class HelmOfObedienceEffect extends OneShotEffect {
- private static final ManacostVariableValue amount = new ManacostVariableValue();
+ private static final ManacostVariableValue amount = ManacostVariableValue.instance;
public HelmOfObedienceEffect() {
super(Outcome.Detriment);
diff --git a/Mage.Sets/src/mage/cards/h/HeraldOfDromoka.java b/Mage.Sets/src/mage/cards/h/HeraldOfDromoka.java
index a5308cf18de..8e2fe33826a 100644
--- a/Mage.Sets/src/mage/cards/h/HeraldOfDromoka.java
+++ b/Mage.Sets/src/mage/cards/h/HeraldOfDromoka.java
@@ -28,7 +28,7 @@ public final class HeraldOfDromoka extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.CREATURE));
filter.add(new SubtypePredicate(SubType.WARRIOR));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public HeraldOfDromoka(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HeraldOfKozilek.java b/Mage.Sets/src/mage/cards/h/HeraldOfKozilek.java
index c83c25f0aa3..eb589cc5f70 100644
--- a/Mage.Sets/src/mage/cards/h/HeraldOfKozilek.java
+++ b/Mage.Sets/src/mage/cards/h/HeraldOfKozilek.java
@@ -23,7 +23,7 @@ public final class HeraldOfKozilek extends CardImpl {
private static final FilterCard filter = new FilterCard("Colorless spells");
static {
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
}
public HeraldOfKozilek(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HerdGnarr.java b/Mage.Sets/src/mage/cards/h/HerdGnarr.java
index 4bc79e2edc9..8fe90b62c83 100644
--- a/Mage.Sets/src/mage/cards/h/HerdGnarr.java
+++ b/Mage.Sets/src/mage/cards/h/HerdGnarr.java
@@ -23,7 +23,7 @@ public final class HerdGnarr extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public HerdGnarr(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HerdchaserDragon.java b/Mage.Sets/src/mage/cards/h/HerdchaserDragon.java
index 3f41bf6ec21..b8970974f37 100644
--- a/Mage.Sets/src/mage/cards/h/HerdchaserDragon.java
+++ b/Mage.Sets/src/mage/cards/h/HerdchaserDragon.java
@@ -27,7 +27,7 @@ public final class HerdchaserDragon extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other Dragon creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.DRAGON));
}
diff --git a/Mage.Sets/src/mage/cards/h/HeritageDruid.java b/Mage.Sets/src/mage/cards/h/HeritageDruid.java
index 546f91ed037..01419463c65 100644
--- a/Mage.Sets/src/mage/cards/h/HeritageDruid.java
+++ b/Mage.Sets/src/mage/cards/h/HeritageDruid.java
@@ -25,7 +25,7 @@ public final class HeritageDruid extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Elves you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.ELF));
}
diff --git a/Mage.Sets/src/mage/cards/h/HeroOfPrecinctOne.java b/Mage.Sets/src/mage/cards/h/HeroOfPrecinctOne.java
new file mode 100644
index 00000000000..925e811c209
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/h/HeroOfPrecinctOne.java
@@ -0,0 +1,42 @@
+package mage.cards.h;
+
+import mage.MageInt;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.StaticFilters;
+import mage.game.permanent.token.HumanToken;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class HeroOfPrecinctOne extends CardImpl {
+
+ public HeroOfPrecinctOne(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.WARRIOR);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever you cast a multicolored spell, create a 1/1 white Human creature token.
+ this.addAbility(new SpellCastControllerTriggeredAbility(
+ new CreateTokenEffect(new HumanToken()), StaticFilters.FILTER_SPELL_A_MULTICOLORED, false
+ ));
+ }
+
+ private HeroOfPrecinctOne(final HeroOfPrecinctOne card) {
+ super(card);
+ }
+
+ @Override
+ public HeroOfPrecinctOne copy() {
+ return new HeroOfPrecinctOne(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/h/HiddenRetreat.java b/Mage.Sets/src/mage/cards/h/HiddenRetreat.java
index b90d3d088a3..9569a11ab6e 100644
--- a/Mage.Sets/src/mage/cards/h/HiddenRetreat.java
+++ b/Mage.Sets/src/mage/cards/h/HiddenRetreat.java
@@ -9,15 +9,15 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import java.util.UUID;
import mage.filter.StaticFilters;
+import mage.game.Game;
import mage.game.events.DamageEvent;
+import mage.game.events.GameEvent;
import mage.target.TargetSpell;
+import java.util.UUID;
+
/**
- *
* @author bunchOfDevs
*/
public class HiddenRetreat extends CardImpl {
@@ -27,7 +27,7 @@ public class HiddenRetreat extends CardImpl {
//Put a card from your hand on top of your library: Prevent all damage that would be dealt by target instant or sorcery spell this turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new HiddenRetreatEffect(), new PutCardFromHandOnTopOfLibraryCost());
- ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY));
+ ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/h/HighAlert.java b/Mage.Sets/src/mage/cards/h/HighAlert.java
new file mode 100644
index 00000000000..c846241de82
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/h/HighAlert.java
@@ -0,0 +1,60 @@
+package mage.cards.h;
+
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.UntapTargetEffect;
+import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderAllEffect;
+import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Zone;
+import mage.filter.StaticFilters;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class HighAlert extends CardImpl {
+
+ public HighAlert(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{U}");
+
+
+ // Each creature you control assigns combat damage equal to its toughness rather than its power.
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new CombatDamageByToughnessEffect(
+ StaticFilters.FILTER_PERMANENT_CREATURE, true
+ )
+ ));
+
+ // Creatures you control can attack as though they didn't have defender.
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new CanAttackAsThoughItDidntHaveDefenderAllEffect(
+ Duration.WhileOnBattlefield,
+ StaticFilters.FILTER_CONTROLLED_CREATURES
+ )
+ ));
+
+ // {2}{W}{U}: Untap target creature.
+ Ability ability = new SimpleActivatedAbility(new UntapTargetEffect(), new ManaCostsImpl("{2}{W}{U}"));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ private HighAlert(final HighAlert card) {
+ super(card);
+ }
+
+ @Override
+ public HighAlert copy() {
+ return new HighAlert(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/h/HighSentinelsOfArashin.java b/Mage.Sets/src/mage/cards/h/HighSentinelsOfArashin.java
index 9f9da602608..44a2ab40721 100644
--- a/Mage.Sets/src/mage/cards/h/HighSentinelsOfArashin.java
+++ b/Mage.Sets/src/mage/cards/h/HighSentinelsOfArashin.java
@@ -32,7 +32,7 @@ public final class HighSentinelsOfArashin extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other creature you control with a +1/+1 counter on it");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new CounterPredicate(CounterType.P1P1));
}
diff --git a/Mage.Sets/src/mage/cards/h/HintOfInsanity.java b/Mage.Sets/src/mage/cards/h/HintOfInsanity.java
index 745149db0bb..1d299587214 100644
--- a/Mage.Sets/src/mage/cards/h/HintOfInsanity.java
+++ b/Mage.Sets/src/mage/cards/h/HintOfInsanity.java
@@ -1,14 +1,8 @@
-
package mage.cards.h;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
+import mage.cards.*;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.filter.FilterCard;
@@ -16,9 +10,11 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
import mage.target.common.TargetCardInHand;
+import mage.util.CardUtil;
+
+import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public final class HintOfInsanity extends CardImpl {
@@ -26,7 +22,7 @@ public final class HintOfInsanity extends CardImpl {
public HintOfInsanity(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}");
- // Target player reveals his or her hand. That player discards all nonland cards with the same name as another card in his or her hand.
+ // Target player reveals their hand. That player discards all nonland cards with the same name as another card in their hand.
this.getSpellAbility().addEffect(new HintOfInsanityEffect());
this.getSpellAbility().addTarget(new TargetPlayer());
@@ -62,7 +58,6 @@ class HintOfInsanityEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
FilterCard filter = new FilterCard("card from your hand");
Player targetPlayer = game.getPlayer(source.getFirstTarget());
- String nameOfChosenCard;
Card chosenCard;
if (targetPlayer != null) {
TargetCardInHand targetCard = new TargetCardInHand(filter);
@@ -73,10 +68,8 @@ class HintOfInsanityEffect extends OneShotEffect {
if (!cardsInHand.isEmpty()
&& targetPlayer.choose(Outcome.Discard, targetCard, source.getSourceId(), game)) {
chosenCard = game.getCard(targetCard.getFirstTarget());
- nameOfChosenCard = chosenCard.getName();
for (Card card : cardsInHand.getCards(game)) {
- if (card.getName().equals(nameOfChosenCard)
- && !card.isLand()) {
+ if (CardUtil.haveSameNames(card, chosenCard) && !card.isLand()) {
targetPlayer.discard(card, source, game);
}
}
diff --git a/Mage.Sets/src/mage/cards/h/HisokasGuard.java b/Mage.Sets/src/mage/cards/h/HisokasGuard.java
index c8479a741a9..0d11887e2aa 100644
--- a/Mage.Sets/src/mage/cards/h/HisokasGuard.java
+++ b/Mage.Sets/src/mage/cards/h/HisokasGuard.java
@@ -45,7 +45,7 @@ public final class HisokasGuard extends CardImpl {
// {1}{U}, {T}: Target creature you control other than Hisoka's Guard has shroud for as long as Hisoka's Guard remains tapped. (It can't be the target of spells or abilities.)
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new HisokasGuardGainAbilityTargetEffect(), new ManaCostsImpl("{1}{U}"));
ability.addCost(new TapSourceCost());
Target target = new TargetControlledCreaturePermanent(1, 1, filter, true);
diff --git a/Mage.Sets/src/mage/cards/h/HiveMind.java b/Mage.Sets/src/mage/cards/h/HiveMind.java
index 179a64073b6..4dd55146622 100644
--- a/Mage.Sets/src/mage/cards/h/HiveMind.java
+++ b/Mage.Sets/src/mage/cards/h/HiveMind.java
@@ -68,7 +68,7 @@ class HiveMindTriggeredAbility extends TriggeredAbilityImpl {
|| spell.isSorcery())) {
for (Effect effect : getEffects()) {
if (effect instanceof HiveMindEffect) {
- ((HiveMindEffect) effect).setTargetPointer(new FixedTarget(spell.getId()));
+ effect.setTargetPointer(new FixedTarget(spell.getId()));
}
}
return true;
diff --git a/Mage.Sets/src/mage/cards/h/HivisOfTheScale.java b/Mage.Sets/src/mage/cards/h/HivisOfTheScale.java
index 6e4b9110a0e..70b093b32b7 100644
--- a/Mage.Sets/src/mage/cards/h/HivisOfTheScale.java
+++ b/Mage.Sets/src/mage/cards/h/HivisOfTheScale.java
@@ -37,7 +37,7 @@ public final class HivisOfTheScale extends CardImpl {
private static final String rule = "Gain control of target Dragon for as long as you control Hivis and Hivis remains tapped.";
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
filterDragon.add(new SubtypePredicate(SubType.DRAGON));
}
diff --git a/Mage.Sets/src/mage/cards/h/HoldoutSettlement.java b/Mage.Sets/src/mage/cards/h/HoldoutSettlement.java
index 89f2c60b91d..cbf0f1ea91d 100644
--- a/Mage.Sets/src/mage/cards/h/HoldoutSettlement.java
+++ b/Mage.Sets/src/mage/cards/h/HoldoutSettlement.java
@@ -23,7 +23,7 @@ public final class HoldoutSettlement extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public HoldoutSettlement(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HollowOne.java b/Mage.Sets/src/mage/cards/h/HollowOne.java
index 6796e8ad3b9..495f14dd6fc 100644
--- a/Mage.Sets/src/mage/cards/h/HollowOne.java
+++ b/Mage.Sets/src/mage/cards/h/HollowOne.java
@@ -66,7 +66,7 @@ class HollowOneReductionEffect extends CostModificationEffectImpl {
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
- CardsCycledOrDiscardedThisTurnWatcher watcher = (CardsCycledOrDiscardedThisTurnWatcher) game.getState().getWatchers().get(CardsCycledOrDiscardedThisTurnWatcher.class.getSimpleName());
+ CardsCycledOrDiscardedThisTurnWatcher watcher = game.getState().getWatcher(CardsCycledOrDiscardedThisTurnWatcher.class);
if (watcher != null) {
CardUtil.reduceCost(abilityToModify, watcher.getNumberOfCardsCycledOrDiscardedThisTurn(source.getControllerId()) * 2);
return true;
diff --git a/Mage.Sets/src/mage/cards/h/HollowTrees.java b/Mage.Sets/src/mage/cards/h/HollowTrees.java
index 8213814aa0d..9922ba6e365 100644
--- a/Mage.Sets/src/mage/cards/h/HollowTrees.java
+++ b/Mage.Sets/src/mage/cards/h/HollowTrees.java
@@ -44,7 +44,7 @@ public final class HollowTrees extends CardImpl {
// {tap}, Remove any number of storage counters from Hollow Trees: Add {G} for each storage counter removed this way.
Ability ability = new DynamicManaAbility(
Mana.GreenMana(1),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new TapSourceCost(),
"Add {G} for each storage counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE));
diff --git a/Mage.Sets/src/mage/cards/h/HollowWarrior.java b/Mage.Sets/src/mage/cards/h/HollowWarrior.java
index d6a60e31123..66164064afa 100644
--- a/Mage.Sets/src/mage/cards/h/HollowWarrior.java
+++ b/Mage.Sets/src/mage/cards/h/HollowWarrior.java
@@ -55,9 +55,9 @@ class HollowWarriorCostToAttackBlockEffect extends PayCostToAttackBlockEffectImp
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped creature you control not declared as an attacking or blocking creature");
static {
- filter.add(Predicates.not(new AttackingPredicate()));
- filter.add(Predicates.not(new BlockingPredicate()));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(AttackingPredicate.instance));
+ filter.add(Predicates.not(BlockingPredicate.instance));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
HollowWarriorCostToAttackBlockEffect() {
diff --git a/Mage.Sets/src/mage/cards/h/HomicidalBrute.java b/Mage.Sets/src/mage/cards/h/HomicidalBrute.java
index 2575371fa1b..cfd0e442012 100644
--- a/Mage.Sets/src/mage/cards/h/HomicidalBrute.java
+++ b/Mage.Sets/src/mage/cards/h/HomicidalBrute.java
@@ -10,6 +10,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
+import mage.constants.WatcherScope;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
@@ -73,7 +74,7 @@ class HomicidalBruteTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getPlayerId().equals(this.controllerId)) {
- Watcher watcher = game.getState().getWatchers().get("HomicidalBruteWatcher", sourceId);
+ Watcher watcher = game.getState().getWatcher(HomicidalBruteWatcher.class, sourceId);
if (watcher == null || !watcher.conditionMet()) {
return true;
}
@@ -87,3 +88,5 @@ class HomicidalBruteTriggeredAbility extends TriggeredAbilityImpl {
}
}
+
+
diff --git a/Mage.Sets/src/mage/cards/h/HomicidalBruteWatcher.java b/Mage.Sets/src/mage/cards/h/HomicidalBruteWatcher.java
new file mode 100644
index 00000000000..c92ff72fcd7
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/h/HomicidalBruteWatcher.java
@@ -0,0 +1,32 @@
+package mage.cards.h;
+
+import mage.constants.WatcherScope;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.watchers.Watcher;
+
+public class HomicidalBruteWatcher extends Watcher {
+
+ public HomicidalBruteWatcher() {
+ super(HomicidalBruteWatcher.class.getSimpleName(), WatcherScope.CARD);
+ }
+
+ public HomicidalBruteWatcher(final HomicidalBruteWatcher watcher) {
+ super(watcher);
+ }
+
+ @Override
+ public HomicidalBruteWatcher copy() {
+ return new HomicidalBruteWatcher(this);
+ }
+
+ @Override
+ public void watch(GameEvent event, Game game) {
+ if (condition) {
+ return;
+ }
+ if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED && event.getSourceId().equals(sourceId)) {
+ condition = true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/h/HonorWornShaku.java b/Mage.Sets/src/mage/cards/h/HonorWornShaku.java
index bcd3f9aca53..b47eb2533a5 100644
--- a/Mage.Sets/src/mage/cards/h/HonorWornShaku.java
+++ b/Mage.Sets/src/mage/cards/h/HonorWornShaku.java
@@ -27,7 +27,7 @@ public final class HonorWornShaku extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped legendary permanent");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SupertypePredicate(SuperType.LEGENDARY));
}
diff --git a/Mage.Sets/src/mage/cards/h/HopeOfGhirapur.java b/Mage.Sets/src/mage/cards/h/HopeOfGhirapur.java
index 5df2aeefb87..fbc81094ee8 100644
--- a/Mage.Sets/src/mage/cards/h/HopeOfGhirapur.java
+++ b/Mage.Sets/src/mage/cards/h/HopeOfGhirapur.java
@@ -128,7 +128,7 @@ class HopeOfGhirapurPlayerLostLifePredicate implements ObjectSourcePlayerPredica
if (targetPlayer == null) {
return false;
}
- HopeOfGhirapurCombatDamageWatcher watcher = (HopeOfGhirapurCombatDamageWatcher) game.getState().getWatchers().get(HopeOfGhirapurCombatDamageWatcher.class.getSimpleName());
+ HopeOfGhirapurCombatDamageWatcher watcher = game.getState().getWatcher(HopeOfGhirapurCombatDamageWatcher.class);
if (watcher != null) {
return watcher.playerGotCombatDamage(input.getSourceId(), input.getObject().getId(), game);
}
diff --git a/Mage.Sets/src/mage/cards/h/HostageTaker.java b/Mage.Sets/src/mage/cards/h/HostageTaker.java
index 9a5c0a29697..bf8e4cd7ba6 100644
--- a/Mage.Sets/src/mage/cards/h/HostageTaker.java
+++ b/Mage.Sets/src/mage/cards/h/HostageTaker.java
@@ -41,7 +41,7 @@ public final class HostageTaker extends CardImpl {
private final static FilterPermanent filter = new FilterPermanent("another target artifact or creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(Predicates.or(
new CardTypePredicate(CardType.ARTIFACT),
new CardTypePredicate(CardType.CREATURE)));
diff --git a/Mage.Sets/src/mage/cards/h/HotheadedGiant.java b/Mage.Sets/src/mage/cards/h/HotheadedGiant.java
index 10100831b64..d5ac4b036f3 100644
--- a/Mage.Sets/src/mage/cards/h/HotheadedGiant.java
+++ b/Mage.Sets/src/mage/cards/h/HotheadedGiant.java
@@ -62,7 +62,7 @@ class CastRedSpellThisTurnCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- HotHeadedGiantWatcher watcher = (HotHeadedGiantWatcher) game.getState().getWatchers().get(HotHeadedGiantWatcher.class.getSimpleName(), source.getControllerId());
+ HotHeadedGiantWatcher watcher = game.getState().getWatcher(HotHeadedGiantWatcher.class, source.getControllerId());
if (watcher != null) {
return watcher.conditionMet();
}
diff --git a/Mage.Sets/src/mage/cards/h/HourOfEternity.java b/Mage.Sets/src/mage/cards/h/HourOfEternity.java
index ed2ced04216..918d40620dc 100644
--- a/Mage.Sets/src/mage/cards/h/HourOfEternity.java
+++ b/Mage.Sets/src/mage/cards/h/HourOfEternity.java
@@ -1,12 +1,8 @@
package mage.cards.h;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
@@ -21,10 +17,14 @@ import mage.game.permanent.token.EmptyToken;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.util.CardUtil;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
/**
- *
* @author emerald000
*/
public final class HourOfEternity extends CardImpl {
@@ -34,17 +34,7 @@ public final class HourOfEternity extends CardImpl {
// Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie.
this.getSpellAbility().addEffect(new HourOfEternityEffect());
- this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, Integer.MAX_VALUE, new FilterCreatureCard("creature cards from your graveyard")));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- Target target = new TargetCardInYourGraveyard(xValue, new FilterCreatureCard((xValue != 1 ? " creature cards" : "creature card") + " from your graveyard"));
- ability.addTarget(target);
- }
+ this.getSpellAbility().setTargetAdjuster(HourOfEternityAdjuster.instance);
}
public HourOfEternity(final HourOfEternity card) {
@@ -57,11 +47,25 @@ public final class HourOfEternity extends CardImpl {
}
}
+enum HourOfEternityAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ Target target = new TargetCardInYourGraveyard(xValue, new FilterCreatureCard((xValue != 1 ? " creature cards" : "creature card") + " from your graveyard"));
+ ability.addTarget(target);
+ }
+}
+
class HourOfEternityEffect extends OneShotEffect {
HourOfEternityEffect() {
super(Outcome.PutCreatureInPlay);
- this.staticText = "Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie";
+ this.staticText = "Exile X target creature cards from your graveyard. " +
+ "For each card exiled this way, create a token that's a copy of that card, " +
+ "except it's a 4/4 black Zombie";
}
HourOfEternityEffect(final HourOfEternityEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/h/HourOfReckoning.java b/Mage.Sets/src/mage/cards/h/HourOfReckoning.java
index 9287b5b8fc9..aca3d75b13b 100644
--- a/Mage.Sets/src/mage/cards/h/HourOfReckoning.java
+++ b/Mage.Sets/src/mage/cards/h/HourOfReckoning.java
@@ -20,7 +20,7 @@ public final class HourOfReckoning extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creatures");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public HourOfReckoning(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HowlFromBeyond.java b/Mage.Sets/src/mage/cards/h/HowlFromBeyond.java
index b580479cfbf..ec2c6e9dd4a 100644
--- a/Mage.Sets/src/mage/cards/h/HowlFromBeyond.java
+++ b/Mage.Sets/src/mage/cards/h/HowlFromBeyond.java
@@ -23,7 +23,7 @@ public final class HowlFromBeyond extends CardImpl {
// Target creature gets +X/+0 until end of turn.
- this.getSpellAbility().addEffect(new BoostTargetEffect(new ManacostVariableValue(), new StaticValue(0), Duration.EndOfTurn));
+ this.getSpellAbility().addEffect(new BoostTargetEffect(ManacostVariableValue.instance, new StaticValue(0), Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/h/HowlpackWolf.java b/Mage.Sets/src/mage/cards/h/HowlpackWolf.java
index 9adf3013f0f..4f9376a4ff2 100644
--- a/Mage.Sets/src/mage/cards/h/HowlpackWolf.java
+++ b/Mage.Sets/src/mage/cards/h/HowlpackWolf.java
@@ -25,7 +25,7 @@ public final class HowlpackWolf extends CardImpl {
static {
filter.add(Predicates.or(new SubtypePredicate(SubType.WOLF), new SubtypePredicate(SubType.WEREWOLF)));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public HowlpackWolf(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java b/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java
index 2cc5bf6d79b..2cf27ec2004 100644
--- a/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java
+++ b/Mage.Sets/src/mage/cards/h/HuatliWarriorPoet.java
@@ -45,7 +45,7 @@ public final class HuatliWarriorPoet extends CardImpl {
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3));
// +2: You gain life equal to the greatest power among creatures you control.
- this.addAbility(new LoyaltyAbility(new GainLifeEffect(new GreatestPowerAmongControlledCreaturesValue(), "You gain life equal to the greatest power among creatures you control"), 2));
+ this.addAbility(new LoyaltyAbility(new GainLifeEffect(GreatestPowerAmongControlledCreaturesValue.instance, "You gain life equal to the greatest power among creatures you control"), 2));
// 0: Create a 3/3 green Dinosaur creature token with trample.
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new DinosaurToken()), 0));
diff --git a/Mage.Sets/src/mage/cards/h/Humongulus.java b/Mage.Sets/src/mage/cards/h/Humongulus.java
new file mode 100644
index 00000000000..63ffdadc366
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/h/Humongulus.java
@@ -0,0 +1,36 @@
+package mage.cards.h;
+
+import mage.MageInt;
+import mage.abilities.keyword.HexproofAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Humongulus extends CardImpl {
+
+ public Humongulus(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}");
+
+ this.subtype.add(SubType.HOMUNCULUS);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(5);
+
+ // Hexproof
+ this.addAbility(HexproofAbility.getInstance());
+ }
+
+ private Humongulus(final Humongulus card) {
+ super(card);
+ }
+
+ @Override
+ public Humongulus copy() {
+ return new Humongulus(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/h/HundredTalonStrike.java b/Mage.Sets/src/mage/cards/h/HundredTalonStrike.java
index 9b0d2ccff81..f208a572986 100644
--- a/Mage.Sets/src/mage/cards/h/HundredTalonStrike.java
+++ b/Mage.Sets/src/mage/cards/h/HundredTalonStrike.java
@@ -30,7 +30,7 @@ public final class HundredTalonStrike extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped white creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new ColorPredicate(ObjectColor.WHITE));
}
diff --git a/Mage.Sets/src/mage/cards/h/HuntDown.java b/Mage.Sets/src/mage/cards/h/HuntDown.java
index f03e5c2107b..419db8da28b 100644
--- a/Mage.Sets/src/mage/cards/h/HuntDown.java
+++ b/Mage.Sets/src/mage/cards/h/HuntDown.java
@@ -68,9 +68,9 @@ class HuntDownEffect extends RequirementEffect {
Permanent blocker = game.getPermanent(source.getTargets().get(0).getFirstTarget());
if (blocker != null
&& blocker.canBlock(source.getTargets().get(1).getFirstTarget(), game)) {
- Permanent attacker = (Permanent) game.getPermanent(source.getTargets().get(1).getFirstTarget());
+ Permanent attacker = game.getPermanent(source.getTargets().get(1).getFirstTarget());
if (attacker != null) {
- BlockedAttackerWatcher blockedAttackerWatcher = (BlockedAttackerWatcher) game.getState().getWatchers().get(BlockedAttackerWatcher.class.getSimpleName());
+ BlockedAttackerWatcher blockedAttackerWatcher = game.getState().getWatcher(BlockedAttackerWatcher.class);
if (blockedAttackerWatcher != null
&& blockedAttackerWatcher.creatureHasBlockedAttacker(attacker, blocker, game)) {
// has already blocked this turn, so no need to do again
diff --git a/Mage.Sets/src/mage/cards/h/HuntToExtinction.java b/Mage.Sets/src/mage/cards/h/HuntToExtinction.java
index 33ba56f4003..772bd5dce90 100644
--- a/Mage.Sets/src/mage/cards/h/HuntToExtinction.java
+++ b/Mage.Sets/src/mage/cards/h/HuntToExtinction.java
@@ -34,10 +34,10 @@ public final class HuntToExtinction extends CardImpl {
this.getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent(0, 1));
// Hunt to Extinction deals X damage to each creature.
- this.getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), new FilterCreaturePermanent()));
+ this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.instance, new FilterCreaturePermanent()));
// Hunt to Exctinction deals an additional X damage to each creature with a bounty counter on it.
- Effect effect = new DamageAllEffect(new ManacostVariableValue(), new FilterCreaturePermanent(filter));
+ Effect effect = new DamageAllEffect(ManacostVariableValue.instance, new FilterCreaturePermanent(filter));
effect.setText("Hunt to Exctinction deals an additional X damage to each creature with a bounty counter on it");
this.getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/h/HunterOfEyeblights.java b/Mage.Sets/src/mage/cards/h/HunterOfEyeblights.java
index 48a36abe116..4b1b6ccae27 100644
--- a/Mage.Sets/src/mage/cards/h/HunterOfEyeblights.java
+++ b/Mage.Sets/src/mage/cards/h/HunterOfEyeblights.java
@@ -33,7 +33,7 @@ public final class HunterOfEyeblights extends CardImpl {
static {
filter1.add(new ControllerPredicate(TargetController.NOT_YOU));
- filter2.add(new CounterAnyPredicate());
+ filter2.add(CounterAnyPredicate.instance);
}
diff --git a/Mage.Sets/src/mage/cards/h/Hurricane.java b/Mage.Sets/src/mage/cards/h/Hurricane.java
index cc1418ce236..b6630989b26 100644
--- a/Mage.Sets/src/mage/cards/h/Hurricane.java
+++ b/Mage.Sets/src/mage/cards/h/Hurricane.java
@@ -28,7 +28,7 @@ public final class Hurricane extends CardImpl {
// Hurricane deals X damage to each creature with flying and each player.
- this.getSpellAbility().addEffect(new DamageEverythingEffect(new ManacostVariableValue(), filter));
+ this.getSpellAbility().addEffect(new DamageEverythingEffect(ManacostVariableValue.instance, filter));
}
public Hurricane(final Hurricane card) {
diff --git a/Mage.Sets/src/mage/cards/h/HydroidKrasis.java b/Mage.Sets/src/mage/cards/h/HydroidKrasis.java
new file mode 100644
index 00000000000..85012dac512
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/h/HydroidKrasis.java
@@ -0,0 +1,93 @@
+package mage.cards.h;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.SpellAbility;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CastSourceTriggeredAbility;
+import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.players.Player;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class HydroidKrasis extends CardImpl {
+
+ public HydroidKrasis(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{U}");
+
+ this.subtype.add(SubType.JELLYFISH);
+ this.subtype.add(SubType.HYDRA);
+ this.subtype.add(SubType.BEAST);
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(0);
+
+ // When you cast this spell, you gain half X life and draw half X cards. Round down each time.
+ this.addAbility(new CastSourceTriggeredAbility(new HydroidKrasisEffect(), false));
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Hydroid Krasis enters the battlefield with X +1/+1 counters on it.
+ this.addAbility(new EntersBattlefieldAbility(
+ new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance())
+ ));
+ }
+
+ private HydroidKrasis(final HydroidKrasis card) {
+ super(card);
+ }
+
+ @Override
+ public HydroidKrasis copy() {
+ return new HydroidKrasis(this);
+ }
+}
+
+class HydroidKrasisEffect extends OneShotEffect {
+
+ HydroidKrasisEffect() {
+ super(Outcome.Benefit);
+ staticText = "you gain half X life and draw half X cards. Round down each time.";
+ }
+
+ private HydroidKrasisEffect(final HydroidKrasisEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public HydroidKrasisEffect copy() {
+ return new HydroidKrasisEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ Object obj = getValue(CastSourceTriggeredAbility.SOURCE_CAST_SPELL_ABILITY);
+ if (!(obj instanceof SpellAbility)) {
+ return false;
+ }
+ int halfCost = Math.floorDiv(((SpellAbility) obj).getManaCostsToPay().getX(), 2);
+ player.drawCards(halfCost, game);
+ player.gainLife(halfCost, game, source);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/i/IbHalfheartGoblinTactician.java b/Mage.Sets/src/mage/cards/i/IbHalfheartGoblinTactician.java
index 9f710caeca9..eaf0a24a51c 100644
--- a/Mage.Sets/src/mage/cards/i/IbHalfheartGoblinTactician.java
+++ b/Mage.Sets/src/mage/cards/i/IbHalfheartGoblinTactician.java
@@ -37,7 +37,7 @@ public final class IbHalfheartGoblinTactician extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.MOUNTAIN));
filterGoblin.add(new SubtypePredicate(SubType.GOBLIN));
- filterGoblin.add(new AnotherPredicate());
+ filterGoblin.add(AnotherPredicate.instance);
filterGoblin.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/i/IcatianStore.java b/Mage.Sets/src/mage/cards/i/IcatianStore.java
index 6e9aa335462..91a3dfecb24 100644
--- a/Mage.Sets/src/mage/cards/i/IcatianStore.java
+++ b/Mage.Sets/src/mage/cards/i/IcatianStore.java
@@ -44,7 +44,7 @@ public final class IcatianStore extends CardImpl {
// {tap}, Remove any number of storage counters from Icatian Store: Add {W} for each storage counter removed this way.
Ability ability = new DynamicManaAbility(
Mana.WhiteMana(1),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new TapSourceCost(),
"Add {W} for each storage counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE));
diff --git a/Mage.Sets/src/mage/cards/i/IcefeatherAven.java b/Mage.Sets/src/mage/cards/i/IcefeatherAven.java
index 215d29b039e..faec12790b0 100644
--- a/Mage.Sets/src/mage/cards/i/IcefeatherAven.java
+++ b/Mage.Sets/src/mage/cards/i/IcefeatherAven.java
@@ -26,7 +26,7 @@ public final class IcefeatherAven extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public IcefeatherAven(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/IcyBlast.java b/Mage.Sets/src/mage/cards/i/IcyBlast.java
index cd37dd0a74b..2df2b53a355 100644
--- a/Mage.Sets/src/mage/cards/i/IcyBlast.java
+++ b/Mage.Sets/src/mage/cards/i/IcyBlast.java
@@ -1,9 +1,7 @@
package mage.cards.i;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.condition.LockedInCondition;
import mage.abilities.condition.common.FerociousCondition;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
@@ -13,12 +11,13 @@ import mage.abilities.effects.common.TapTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.filter.StaticFilters;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author emerald000
*/
public final class IcyBlast extends CardImpl {
@@ -28,7 +27,6 @@ public final class IcyBlast extends CardImpl {
// Tap X target creatures.
this.getSpellAbility().addEffect(new TapTargetEffect("X target creatures"));
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_PERMANENT_CREATURE, false));
// Ferocious — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps.
Effect effect = new ConditionalContinuousRuleModifyingEffect(
@@ -36,24 +34,25 @@ public final class IcyBlast extends CardImpl {
new LockedInCondition(FerociousCondition.instance));
effect.setText("
Ferocious — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps");
this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().setTargetAdjuster(IcyBlastAdjuster.instance);
}
public IcyBlast(final IcyBlast card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int numberToTap = ability.getManaCostsToPay().getX();
- numberToTap = Math.min(game.getBattlefield().count(StaticFilters.FILTER_PERMANENT_CREATURE, ability.getSourceId(), ability.getControllerId(), game), numberToTap);
- ability.addTarget(new TargetCreaturePermanent(numberToTap));
- }
- }
-
@Override
public IcyBlast copy() {
return new IcyBlast(this);
}
}
+
+enum IcyBlastAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX()));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/i/IdentityThief.java b/Mage.Sets/src/mage/cards/i/IdentityThief.java
index 9047dc09554..cfa04ef2f5f 100644
--- a/Mage.Sets/src/mage/cards/i/IdentityThief.java
+++ b/Mage.Sets/src/mage/cards/i/IdentityThief.java
@@ -37,7 +37,7 @@ public final class IdentityThief extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("target nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public IdentityThief(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/IgnitionTeam.java b/Mage.Sets/src/mage/cards/i/IgnitionTeam.java
index bc10230d9d6..2272e352a4d 100644
--- a/Mage.Sets/src/mage/cards/i/IgnitionTeam.java
+++ b/Mage.Sets/src/mage/cards/i/IgnitionTeam.java
@@ -73,7 +73,7 @@ class TappedLandsCount implements DynamicValue {
public int calculate(Game game, Ability sourceAbility, Effect effect) {
if (sourceAbility != null) {
FilterLandPermanent filter = new FilterLandPermanent("tapped lands on the battlefield");
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
return game.getBattlefield().count(filter, sourceAbility.getSourceId(), sourceAbility.getControllerId(), game);
}
return 0;
diff --git a/Mage.Sets/src/mage/cards/i/IllGottenInheritance.java b/Mage.Sets/src/mage/cards/i/IllGottenInheritance.java
new file mode 100644
index 00000000000..1c01c6a3c74
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/i/IllGottenInheritance.java
@@ -0,0 +1,54 @@
+package mage.cards.i;
+
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.TargetController;
+import mage.target.common.TargetOpponent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class IllGottenInheritance extends CardImpl {
+
+ public IllGottenInheritance(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
+
+ // At the beginning of your upkeep, Ill-Gotten Inheritance deals 1 damage to each opponent and you gain 1 life.
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(
+ new DamagePlayersEffect(1, TargetController.OPPONENT),
+ TargetController.YOU, false
+ );
+ ability.addEffect(new GainLifeEffect(1).concatBy("and"));
+ this.addAbility(ability);
+
+ // {5}{B}, Sacrifice Ill-Gotten Inheritance: It deals 4 damage to target opponent and you gain 4 life.
+ ability = new SimpleActivatedAbility(
+ new DamageTargetEffect(4, "it"),
+ new ManaCostsImpl("{5}{B}")
+ );
+ ability.addEffect(new GainLifeEffect(4).concatBy("and"));
+ ability.addCost(new SacrificeSourceCost());
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+ }
+
+ private IllGottenInheritance(final IllGottenInheritance card) {
+ super(card);
+ }
+
+ @Override
+ public IllGottenInheritance copy() {
+ return new IllGottenInheritance(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/i/IllnessInTheRanks.java b/Mage.Sets/src/mage/cards/i/IllnessInTheRanks.java
index b33417778bc..9ac0a172bdc 100644
--- a/Mage.Sets/src/mage/cards/i/IllnessInTheRanks.java
+++ b/Mage.Sets/src/mage/cards/i/IllnessInTheRanks.java
@@ -20,7 +20,7 @@ public final class IllnessInTheRanks extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creature tokens");
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
}
public IllnessInTheRanks(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/Illuminate.java b/Mage.Sets/src/mage/cards/i/Illuminate.java
index 642379fd37b..558226bcf18 100644
--- a/Mage.Sets/src/mage/cards/i/Illuminate.java
+++ b/Mage.Sets/src/mage/cards/i/Illuminate.java
@@ -28,14 +28,14 @@ public final class Illuminate extends CardImpl {
kickerAbility.addKickerCost("{3}{U}");
this.addAbility(kickerAbility);
// Illuminate deals X damage to target creature. If Illuminate was kicked with its {2}{R} kicker, it deals X damage to that creature's controller. If Illuminate was kicked with its {3}{U} kicker, you draw X cards.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
- new DamageTargetControllerEffect(new ManacostVariableValue()),
+ new DamageTargetControllerEffect(ManacostVariableValue.instance),
new KickedCostCondition("{2}{R}"),
"if this spell was kicked with its {2}{R} kicker, it deals X damage to that creature's controller."));
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
- new DrawCardSourceControllerEffect(new ManacostVariableValue()),
+ new DrawCardSourceControllerEffect(ManacostVariableValue.instance),
new KickedCostCondition("{3}{U}"),
" if this spell was kicked with its {3}{U} kicker, you draw X cards."));
diff --git a/Mage.Sets/src/mage/cards/i/IllusionaryPresence.java b/Mage.Sets/src/mage/cards/i/IllusionaryPresence.java
new file mode 100644
index 00000000000..b8adf4654f1
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/i/IllusionaryPresence.java
@@ -0,0 +1,111 @@
+package mage.cards.i;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.constants.SubType;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ChooseBasicLandTypeEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.CumulativeUpkeepAbility;
+import mage.abilities.keyword.ForestwalkAbility;
+import mage.abilities.keyword.IslandwalkAbility;
+import mage.abilities.keyword.MountainwalkAbility;
+import mage.abilities.keyword.PlainswalkAbility;
+import mage.abilities.keyword.SwampwalkAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.game.Game;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class IllusionaryPresence extends CardImpl {
+
+ public IllusionaryPresence(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}");
+
+ this.subtype.add(SubType.ILLUSION);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Cumulative upkeep {U}
+ this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{U}")));
+
+ // At the beginning of your upkeep, choose a land type. Illusionary Presence gains landwalk of the chosen type until end of turn.
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new ChooseBasicLandTypeEffect(Outcome.Neutral), TargetController.YOU, false);
+ ability.addEffect(new IllusionaryPresenceEffect());
+ this.addAbility(ability);
+
+ }
+
+ private IllusionaryPresence(final IllusionaryPresence card) {
+ super(card);
+ }
+
+ @Override
+ public IllusionaryPresence copy() {
+ return new IllusionaryPresence(this);
+ }
+}
+
+class IllusionaryPresenceEffect extends OneShotEffect {
+
+ Ability gainedAbility;
+
+ public IllusionaryPresenceEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "{this} gains landwalk of the chosen type until end of turn";
+ }
+
+ public IllusionaryPresenceEffect(final IllusionaryPresenceEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public IllusionaryPresenceEffect copy() {
+ return new IllusionaryPresenceEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ MageObject mageObject = game.getObject(source.getSourceId());
+ if (mageObject != null) {
+ SubType landTypeChoice = SubType.byDescription((String) game.getState().getValue(mageObject.getId().toString() + "BasicLandType"));
+ if (landTypeChoice != null) {
+ switch (landTypeChoice) {
+ case PLAINS:
+ gainedAbility = new PlainswalkAbility();
+ break;
+ case FOREST:
+ gainedAbility = new ForestwalkAbility();
+ break;
+ case SWAMP:
+ gainedAbility = new SwampwalkAbility();
+ break;
+ case ISLAND:
+ gainedAbility = new IslandwalkAbility();
+ break;
+ case MOUNTAIN:
+ gainedAbility = new MountainwalkAbility();
+ break;
+ }
+ if (gainedAbility != null) {
+ GainAbilitySourceEffect effect = new GainAbilitySourceEffect(gainedAbility, Duration.EndOfTurn);
+ game.addEffect(effect, source);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/i/IllusionaryTerrain.java b/Mage.Sets/src/mage/cards/i/IllusionaryTerrain.java
new file mode 100644
index 00000000000..d61f2916e11
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/i/IllusionaryTerrain.java
@@ -0,0 +1,202 @@
+package mage.cards.i;
+
+import java.util.List;
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.AsEntersBattlefieldAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.CumulativeUpkeepAbility;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.RedManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.choices.ChoiceBasicLandType;
+import mage.choices.ChoiceImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import static mage.constants.Layer.AbilityAddingRemovingEffects_6;
+import static mage.constants.Layer.TypeChangingEffects_4;
+import mage.constants.Outcome;
+import mage.constants.SubLayer;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.util.CardUtil;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class IllusionaryTerrain extends CardImpl {
+
+ public IllusionaryTerrain(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}{U}");
+
+ // Cumulative upkeep {2}
+ this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{2}")));
+
+ // As Illusionary Terrain enters the battlefield, choose two basic land types.
+ this.addAbility(new AsEntersBattlefieldAbility(new ChooseTwoBasicLandTypesEffect(Outcome.Neutral)));
+
+ // Basic lands of the first chosen type are the second chosen type.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new IllusionaryTerrainEffect()));
+
+ }
+
+ private IllusionaryTerrain(final IllusionaryTerrain card) {
+ super(card);
+ }
+
+ @Override
+ public IllusionaryTerrain copy() {
+ return new IllusionaryTerrain(this);
+ }
+}
+
+class IllusionaryTerrainEffect extends ContinuousEffectImpl {
+
+ public IllusionaryTerrainEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Neutral);
+ staticText = "Basic lands of the first chosen type are the second chosen type";
+ }
+
+ public IllusionaryTerrainEffect(final IllusionaryTerrainEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public IllusionaryTerrainEffect copy() {
+ return new IllusionaryTerrainEffect(this);
+ }
+
+ @Override
+ public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
+ Player controller = game.getPlayer(source.getControllerId());
+ SubType firstChoice = SubType.byDescription((String) game.getState().getValue(source.getSourceId().toString() + "firstChoice"));
+ SubType secondChoice = SubType.byDescription((String) game.getState().getValue(source.getSourceId().toString() + "secondChoice"));
+ List lands = game.getBattlefield().getAllActivePermanents(CardType.LAND);
+ if (controller != null
+ && firstChoice != null
+ && secondChoice != null) {
+ for (Permanent land : lands) {
+ if (land.isBasic()) {
+ switch (layer) {
+ case TypeChangingEffects_4:
+ if (land.getSubtype(game).contains(firstChoice)) {
+ land.getSubtype(game).clear();
+ land.getSubtype(game).add(secondChoice);
+ game.getState().setValue("illusionaryTerrain"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game),
+ "true");
+ }
+ break;
+ case AbilityAddingRemovingEffects_6:
+ if (game.getState().getValue("illusionaryTerrain"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game)) != null
+ && game.getState().getValue("illusionaryTerrain"
+ + source.getId()
+ + land.getId()
+ + land.getZoneChangeCounter(game)).equals("true")) {
+ land.removeAllAbilities(source.getSourceId(), game);
+ if (land.getSubtype(game).contains(SubType.FOREST)) {
+ land.addAbility(new GreenManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.PLAINS)) {
+ land.addAbility(new WhiteManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.MOUNTAIN)) {
+ land.addAbility(new RedManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.ISLAND)) {
+ land.addAbility(new BlueManaAbility(), source.getSourceId(), game);
+ }
+ if (land.getSubtype(game).contains(SubType.SWAMP)) {
+ land.addAbility(new BlackManaAbility(), source.getSourceId(), game);
+ }
+ break;
+ }
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
+
+ @Override
+ public boolean hasLayer(Layer layer) {
+ return layer == Layer.TypeChangingEffects_4
+ || layer == Layer.AbilityAddingRemovingEffects_6;
+
+ }
+}
+
+class ChooseTwoBasicLandTypesEffect extends OneShotEffect {
+
+ String choiceOne;
+ String choiceTwo;
+
+ public ChooseTwoBasicLandTypesEffect(Outcome outcome) {
+ super(outcome);
+ this.staticText = "choose two basic land types";
+ }
+
+ public ChooseTwoBasicLandTypesEffect(final ChooseTwoBasicLandTypesEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ChooseTwoBasicLandTypesEffect copy() {
+ return new ChooseTwoBasicLandTypesEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject mageObject = game.getPermanentEntering(source.getSourceId());
+ if (mageObject == null) {
+ mageObject = game.getObject(source.getSourceId());
+ }
+ if (controller != null
+ && mageObject != null) {
+ ChoiceImpl choices = new ChoiceBasicLandType();
+ if (controller.choose(Outcome.Neutral, choices, game)) {
+ game.informPlayers(mageObject.getName() + ": First chosen basic land type is " + choices.getChoice());
+ game.getState().setValue(mageObject.getId().toString() + "firstChoice", choices.getChoice());
+ choiceOne = SubType.byDescription((String) game.getState().getValue(source.getSourceId().toString() + "firstChoice")).getDescription();
+ }
+ if (controller.choose(Outcome.Neutral, choices, game)) {
+ game.informPlayers(mageObject.getName() + ": Second chosen basic land type is " + choices.getChoice());
+ game.getState().setValue(mageObject.getId().toString() + "secondChoice", choices.getChoice());
+ choiceTwo = SubType.byDescription((String) game.getState().getValue(source.getSourceId().toString() + "secondChoice")).getDescription();
+ if (mageObject instanceof Permanent
+ && choiceOne != null
+ && choiceTwo != null) {
+ ((Permanent) mageObject).addInfo("Chosen Types", CardUtil.addToolTipMarkTags("First chosen basic land type: " + choiceOne
+ + "\n Second chosen basic land type: " + choiceTwo), game);
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/i/ImmolationShaman.java b/Mage.Sets/src/mage/cards/i/ImmolationShaman.java
new file mode 100644
index 00000000000..7a9f275cf11
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/i/ImmolationShaman.java
@@ -0,0 +1,111 @@
+package mage.cards.i;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.LimitedTimesPerTurnActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.MenaceAbility;
+import mage.abilities.mana.ActivatedManaAbilityImpl;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.stack.StackAbility;
+import mage.target.targetpointer.FixedTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ImmolationShaman extends CardImpl {
+
+ public ImmolationShaman(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
+
+ this.subtype.add(SubType.VIASHINO);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(3);
+
+ // Whenever an opponent activates an ability of an artifact, creature, or land that isn't a mana ability, Immolation Shaman deals 1 damage to that player.
+ this.addAbility(new ImmolationShamanTriggeredAbility());
+
+ // {3}{R}{R}: Immolation Shaman gets +3/+3 and gains menace until end of turn.
+ Ability ability = new LimitedTimesPerTurnActivatedAbility(
+ Zone.BATTLEFIELD,
+ new BoostSourceEffect(
+ 3, 3, Duration.EndOfTurn
+ ).setText("{this} gets +3/+3"),
+ new ManaCostsImpl("{3}{R}{R}")
+ );
+ ability.addEffect(new GainAbilitySourceEffect(
+ new MenaceAbility(), Duration.EndOfTurn
+ ).setText("and gains menace until end of turn"));
+ this.addAbility(ability);
+ }
+
+ private ImmolationShaman(final ImmolationShaman card) {
+ super(card);
+ }
+
+ @Override
+ public ImmolationShaman copy() {
+ return new ImmolationShaman(this);
+ }
+}
+
+class ImmolationShamanTriggeredAbility extends TriggeredAbilityImpl {
+
+ ImmolationShamanTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new DamageTargetEffect(new StaticValue(1), true, "that player", true));
+ }
+
+ private ImmolationShamanTriggeredAbility(final ImmolationShamanTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public ImmolationShamanTriggeredAbility copy() {
+ return new ImmolationShamanTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ACTIVATED_ABILITY;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (!event.getPlayerId().equals(getControllerId())) {
+ Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
+ if (source != null && (source.isArtifact() || source.isCreature() || source.isLand())) {
+ StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
+ if (!(stackAbility.getStackAbility() instanceof ActivatedManaAbilityImpl)) {
+ for (Effect effect : getEffects()) {
+ effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever an opponent activates an ability of an artifact, creature, or land on the battlefield, " +
+ "if it isn't a mana ability, {this} deals 1 damage to that player.";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/i/ImpactResonance.java b/Mage.Sets/src/mage/cards/i/ImpactResonance.java
index 3f445d26136..e917a081d29 100644
--- a/Mage.Sets/src/mage/cards/i/ImpactResonance.java
+++ b/Mage.Sets/src/mage/cards/i/ImpactResonance.java
@@ -62,7 +62,7 @@ enum GreatestAmountOfDamageDealtValue implements DynamicValue, MageSingleton {
}
public int calculate(Game game, UUID controllerId) {
- GreatestAmountOfDamageWatcher watcher = (GreatestAmountOfDamageWatcher) game.getState().getWatchers().get(GreatestAmountOfDamageWatcher.class.getSimpleName());
+ GreatestAmountOfDamageWatcher watcher = game.getState().getWatcher(GreatestAmountOfDamageWatcher.class);
if (watcher != null) {
return watcher.getGreatestAmountOfDamage();
}
@@ -90,7 +90,7 @@ class GreatestAmountOfDamageWatcher extends Watcher {
private int damageAmount;
public GreatestAmountOfDamageWatcher() {
- super(GreatestAmountOfDamageWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(GreatestAmountOfDamageWatcher.class, WatcherScope.GAME);
}
public GreatestAmountOfDamageWatcher(final GreatestAmountOfDamageWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/i/ImpassionedOrator.java b/Mage.Sets/src/mage/cards/i/ImpassionedOrator.java
new file mode 100644
index 00000000000..ef1a2f0991e
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/i/ImpassionedOrator.java
@@ -0,0 +1,48 @@
+package mage.cards.i;
+
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ImpassionedOrator extends CardImpl {
+
+ private static final FilterPermanent filter
+ = new FilterControlledCreaturePermanent("another creature you control");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
+
+ public ImpassionedOrator(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.CLERIC);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever another creature enters the battlefield under your control, you gain 1 life.
+ this.addAbility(new EntersBattlefieldAllTriggeredAbility(new GainLifeEffect(1), filter));
+ }
+
+ private ImpassionedOrator(final ImpassionedOrator card) {
+ super(card);
+ }
+
+ @Override
+ public ImpassionedOrator copy() {
+ return new ImpassionedOrator(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/i/Impatience.java b/Mage.Sets/src/mage/cards/i/Impatience.java
index 7e40923e117..6b15719662d 100644
--- a/Mage.Sets/src/mage/cards/i/Impatience.java
+++ b/Mage.Sets/src/mage/cards/i/Impatience.java
@@ -46,8 +46,8 @@ class ImpatienceCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
- return watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(game.getActivePlayerId()) == 0;
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
+ return watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(game.getActivePlayerId()) == 0;
}
public String toString() {
diff --git a/Mage.Sets/src/mage/cards/i/ImpelledGiant.java b/Mage.Sets/src/mage/cards/i/ImpelledGiant.java
index 0cbe3db9560..0baf4fff2c7 100644
--- a/Mage.Sets/src/mage/cards/i/ImpelledGiant.java
+++ b/Mage.Sets/src/mage/cards/i/ImpelledGiant.java
@@ -39,9 +39,9 @@ public final class ImpelledGiant extends CardImpl {
static final private FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped red creature you control other than Impelled Giant");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new ColorPredicate(ObjectColor.RED));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ImpelledGiant(UUID ownerId, CardSetInfo setInfo) {
@@ -87,7 +87,7 @@ class ImpelledGiantCost extends CostImpl {
@Override
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) {
if (target.choose(Outcome.Tap, controllerId, sourceId, game)) {
- for (UUID targetId: (List)target.getTargets()) {
+ for (UUID targetId: target.getTargets()) {
Permanent permanent = game.getPermanent(targetId);
if (permanent == null)
return false;
diff --git a/Mage.Sets/src/mage/cards/i/ImperialAerosaur.java b/Mage.Sets/src/mage/cards/i/ImperialAerosaur.java
index 448afcc630d..1353a50288b 100644
--- a/Mage.Sets/src/mage/cards/i/ImperialAerosaur.java
+++ b/Mage.Sets/src/mage/cards/i/ImperialAerosaur.java
@@ -29,7 +29,7 @@ public final class ImperialAerosaur extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ImperialAerosaur(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/ImperialMask.java b/Mage.Sets/src/mage/cards/i/ImperialMask.java
index 11b2f5b0a1e..0052e614027 100644
--- a/Mage.Sets/src/mage/cards/i/ImperialMask.java
+++ b/Mage.Sets/src/mage/cards/i/ImperialMask.java
@@ -26,7 +26,7 @@ public final class ImperialMask extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent();
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public ImperialMask(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/ImpetuousProtege.java b/Mage.Sets/src/mage/cards/i/ImpetuousProtege.java
index a87a5545b94..eb774710b57 100644
--- a/Mage.Sets/src/mage/cards/i/ImpetuousProtege.java
+++ b/Mage.Sets/src/mage/cards/i/ImpetuousProtege.java
@@ -57,7 +57,7 @@ class ImpetuousProtegeEffect extends OneShotEffect {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
diff --git a/Mage.Sets/src/mage/cards/i/Imprison.java b/Mage.Sets/src/mage/cards/i/Imprison.java
index 6d094bdb9d6..7f1b8c062b8 100644
--- a/Mage.Sets/src/mage/cards/i/Imprison.java
+++ b/Mage.Sets/src/mage/cards/i/Imprison.java
@@ -145,7 +145,7 @@ class ImprisonUnblockEffect extends OneShotEffect {
effect.apply(game, source);
// Make blocked creatures unblocked
- BlockedByOnlyOneCreatureThisCombatWatcher watcher = (BlockedByOnlyOneCreatureThisCombatWatcher) game.getState().getWatchers().get(BlockedByOnlyOneCreatureThisCombatWatcher.class.getSimpleName());
+ BlockedByOnlyOneCreatureThisCombatWatcher watcher = game.getState().getWatcher(BlockedByOnlyOneCreatureThisCombatWatcher.class);
if (watcher != null) {
Set combatGroups = watcher.getBlockedOnlyByCreature(permanent.getId());
if (combatGroups != null) {
diff --git a/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java b/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java
index 9f243cf8453..1e2ec98a84c 100644
--- a/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java
+++ b/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java
@@ -6,8 +6,6 @@ import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.AttacksAllTriggeredAbility;
import mage.abilities.effects.PreventionEffectImpl;
-import mage.abilities.effects.common.PreventDamageBySourceEffect;
-import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -16,9 +14,7 @@ import mage.constants.SetTargetPointer;
import mage.game.Game;
import mage.game.events.DamageEvent;
import mage.game.events.GameEvent;
-import mage.game.permanent.Permanent;
import mage.filter.StaticFilters;
-import mage.filter.predicate.permanent.ControllerPredicate;
import mage.players.Player;
import mage.util.CardUtil;
@@ -61,7 +57,7 @@ class ImpulsiveManeuversEffect extends PreventionEffectImpl {
@Override
public void init(Ability source, Game game) {
- this.wonFlip = game.getPlayer(source.getControllerId()).flipCoin(game);
+ this.wonFlip = game.getPlayer(source.getControllerId()).flipCoin(source, game, true);
super.init(source, game);
}
diff --git a/Mage.Sets/src/mage/cards/i/InallaArchmageRitualist.java b/Mage.Sets/src/mage/cards/i/InallaArchmageRitualist.java
index 418cb142f60..be50ef6f7a3 100644
--- a/Mage.Sets/src/mage/cards/i/InallaArchmageRitualist.java
+++ b/Mage.Sets/src/mage/cards/i/InallaArchmageRitualist.java
@@ -49,10 +49,10 @@ public final class InallaArchmageRitualist extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.WIZARD));
- filter.add(Predicates.not(new TokenPredicate()));
- filter.add(new AnotherPredicate());
+ filter.add(Predicates.not(TokenPredicate.instance));
+ filter.add(AnotherPredicate.instance);
filter2.add(new SubtypePredicate(SubType.WIZARD));
- filter2.add(Predicates.not(new TappedPredicate()));
+ filter2.add(Predicates.not(TappedPredicate.instance));
}
public InallaArchmageRitualist(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/Incinerate.java b/Mage.Sets/src/mage/cards/i/Incinerate.java
index 0fa3368ffb0..4a0a926243b 100644
--- a/Mage.Sets/src/mage/cards/i/Incinerate.java
+++ b/Mage.Sets/src/mage/cards/i/Incinerate.java
@@ -70,7 +70,7 @@ class IncinerateEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- DamagedByWatcher watcher = (DamagedByWatcher) game.getState().getWatchers().get(DamagedByWatcher.class.getSimpleName(), source.getSourceId());
+ DamagedByWatcher watcher = game.getState().getWatcher(DamagedByWatcher.class, source.getSourceId());
if (watcher != null) {
return watcher.wasDamaged(event.getTargetId(), game);
}
diff --git a/Mage.Sets/src/mage/cards/i/IncreasingAmbition.java b/Mage.Sets/src/mage/cards/i/IncreasingAmbition.java
index fc62cc74c37..f342eba3e9d 100644
--- a/Mage.Sets/src/mage/cards/i/IncreasingAmbition.java
+++ b/Mage.Sets/src/mage/cards/i/IncreasingAmbition.java
@@ -77,7 +77,7 @@ class IncreasingAmbitionEffect extends SearchEffect {
}
if (player.searchLibrary(target, game)) {
if (!target.getTargets().isEmpty()) {
- for (UUID cardId: (List)target.getTargets()) {
+ for (UUID cardId: target.getTargets()) {
Card card = player.getLibrary().remove(cardId, game);
if (card != null) {
card.moveToZone(Zone.HAND, source.getSourceId(), game, false);
diff --git a/Mage.Sets/src/mage/cards/i/IncubationDruid.java b/Mage.Sets/src/mage/cards/i/IncubationDruid.java
new file mode 100644
index 00000000000..ea6cc5017ac
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/i/IncubationDruid.java
@@ -0,0 +1,218 @@
+package mage.cards.i;
+
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.Abilities;
+import mage.abilities.Ability;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.ManaEffect;
+import mage.abilities.keyword.AdaptAbility;
+import mage.abilities.mana.ActivatedManaAbilityImpl;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.choices.Choice;
+import mage.choices.ChoiceColor;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class IncubationDruid extends CardImpl {
+
+ public IncubationDruid(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
+
+ this.subtype.add(SubType.ELF);
+ this.subtype.add(SubType.DRUID);
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(2);
+
+ // {T}: Add one mana of any type that a land you control could produce. If Incubation Druid has a +1/+1 counter on it, add three mana of that type instead.
+ this.addAbility(new SimpleManaAbility(
+ Zone.BATTLEFIELD, new AnyColorLandsProduceManaEffect(), new TapSourceCost()
+ ));
+
+ // {3}{G}{G}: Adapt 3.
+ this.addAbility(new AdaptAbility(3, "{3}{G}{G}"));
+ }
+
+ private IncubationDruid(final IncubationDruid card) {
+ super(card);
+ }
+
+ @Override
+ public IncubationDruid copy() {
+ return new IncubationDruid(this);
+ }
+}
+
+class AnyColorLandsProduceManaEffect extends ManaEffect {
+
+ private boolean inManaTypeCalculation = false;
+
+ AnyColorLandsProduceManaEffect() {
+ super();
+ staticText = "Add one mana of any type that a land you control could produce. " +
+ "If {this} has a +1/+1 counter on it, add three mana of that type instead.";
+ }
+
+ private AnyColorLandsProduceManaEffect(final AnyColorLandsProduceManaEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ checkToFirePossibleEvents(getMana(game, source), game, source);
+ controller.getManaPool().addMana(getMana(game, source), game, source);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public Mana produceMana(boolean netMana, Game game, Ability source) {
+ int manaAmount = getManaAmount(game, source);
+ Mana mana = new Mana();
+ Mana types = getManaTypes(game, source);
+ Choice choice = new ChoiceColor(true);
+ choice.getChoices().clear();
+ choice.setMessage("Pick a mana color");
+ if (types.getBlack() > 0) {
+ choice.getChoices().add("Black");
+ }
+ if (types.getRed() > 0) {
+ choice.getChoices().add("Red");
+ }
+ if (types.getBlue() > 0) {
+ choice.getChoices().add("Blue");
+ }
+ if (types.getGreen() > 0) {
+ choice.getChoices().add("Green");
+ }
+ if (types.getWhite() > 0) {
+ choice.getChoices().add("White");
+ }
+ if (types.getColorless() > 0) {
+ choice.getChoices().add("Colorless");
+ }
+ if (types.getAny() > 0) {
+ choice.getChoices().add("Black");
+ choice.getChoices().add("Red");
+ choice.getChoices().add("Blue");
+ choice.getChoices().add("Green");
+ choice.getChoices().add("White");
+ choice.getChoices().add("Colorless");
+ }
+ if (!choice.getChoices().isEmpty()) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (choice.getChoices().size() == 1) {
+ choice.setChoice(choice.getChoices().iterator().next());
+ } else if (player == null || !player.choose(outcome, choice, game)) {
+ return null;
+ }
+ if (choice.getChoice() != null) {
+ switch (choice.getChoice()) {
+ case "Black":
+ mana.setBlack(manaAmount);
+ break;
+ case "Blue":
+ mana.setBlue(manaAmount);
+ break;
+ case "Red":
+ mana.setRed(manaAmount);
+ break;
+ case "Green":
+ mana.setGreen(manaAmount);
+ break;
+ case "White":
+ mana.setWhite(manaAmount);
+ break;
+ case "Colorless":
+ mana.setColorless(manaAmount);
+ break;
+ }
+ }
+ }
+ return mana;
+ }
+
+ @Override
+ public List getNetMana(Game game, Ability source) {
+ int manaAmount = getManaAmount(game, source);
+ List netManas = new ArrayList();
+ Mana types = getManaTypes(game, source);
+ if (types.getRed() > 0) {
+ netManas.add(new Mana(manaAmount, 0, 0, 0, 0, 0, 0, 0));
+ }
+ if (types.getGreen() > 0) {
+ netManas.add(new Mana(0, manaAmount, 0, 0, 0, 0, 0, 0));
+ }
+ if (types.getBlue() > 0) {
+ netManas.add(new Mana(0, 0, manaAmount, 0, 0, 0, 0, 0));
+ }
+ if (types.getWhite() > 0) {
+ netManas.add(new Mana(0, 0, 0, manaAmount, 0, 0, 0, 0));
+ }
+ if (types.getBlack() > 0) {
+ netManas.add(new Mana(0, 0, 0, 0, manaAmount, 0, 0, 0));
+ }
+ if (types.getColorless() > 0) {
+ netManas.add(new Mana(0, 0, 0, 0, 0, 0, 0, manaAmount));
+ }
+ if (types.getAny() > 0) {
+ netManas.add(new Mana(0, 0, 0, 0, 0, 0, manaAmount, 0));
+ }
+ return netManas;
+ }
+
+ @Override
+ public AnyColorLandsProduceManaEffect copy() {
+ return new AnyColorLandsProduceManaEffect(this);
+ }
+
+ private int getManaAmount(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ if (permanent != null && permanent.getCounters(game).getCount(CounterType.P1P1) > 0) {
+ return 3;
+ }
+ return 1;
+ }
+
+ private Mana getManaTypes(Game game, Ability source) {
+ Mana types = new Mana();
+ if (game == null || game.getPhase() == null) {
+ return types;
+ }
+ if (inManaTypeCalculation) {
+ return types;
+ }
+ inManaTypeCalculation = true;
+ List lands = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_CONTROLLED_PERMANENT_LAND, source.getControllerId(), source.getSourceId(), game);
+ for (Permanent land : lands) {
+ Abilities mana = land.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD);
+ for (ActivatedManaAbilityImpl ability : mana) {
+ if (!ability.equals(source) && ability.definesMana(game)) {
+ for (Mana netMana : ability.getNetMana(game)) {
+ types.add(netMana);
+ }
+ }
+ }
+ }
+ inManaTypeCalculation = false;
+ return types;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/i/IncursionSpecialist.java b/Mage.Sets/src/mage/cards/i/IncursionSpecialist.java
index 756b250d111..77df46b955f 100644
--- a/Mage.Sets/src/mage/cards/i/IncursionSpecialist.java
+++ b/Mage.Sets/src/mage/cards/i/IncursionSpecialist.java
@@ -69,7 +69,7 @@ class IncursionTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getPlayerId().equals(controllerId)) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 2) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java b/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java
index cc65732992b..dd209468576 100644
--- a/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java
+++ b/Mage.Sets/src/mage/cards/i/IndomitableCreativity.java
@@ -2,7 +2,6 @@
package mage.cards.i;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.*;
import mage.constants.CardType;
@@ -16,53 +15,64 @@ import mage.game.permanent.Permanent;
import mage.players.Library;
import mage.players.Player;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class IndomitableCreativity extends CardImpl {
- private static final FilterPermanent filter = new FilterPermanent("artifacts and/or creatures");
-
- static {
- filter.add(Predicates.or(new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE)));
- }
public IndomitableCreativity(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}{R}");
// Destroy X target artifacts and/or creatures. For each permanent destroyed this way, its controller reveals cards from the top of their library until an artifact or creature card is revealed and exiles that card. Those players put the exiled card onto the battlefield, then shuffle their libraries.
- getSpellAbility().addEffect(new IndomitableCreativityEffect());
- this.getSpellAbility().addTarget(new TargetPermanent(filter));
+ this.getSpellAbility().addEffect(new IndomitableCreativityEffect());
+ this.getSpellAbility().setTargetAdjuster(IndomitableCreativityAdjuster.instance);
}
public IndomitableCreativity(final IndomitableCreativity card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetPermanent(xValue, xValue, filter, false));
- }
- }
-
@Override
public IndomitableCreativity copy() {
return new IndomitableCreativity(this);
}
}
+enum IndomitableCreativityAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPermanent filter = new FilterPermanent("artifacts and/or creatures");
+
+ static {
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.ARTIFACT),
+ new CardTypePredicate(CardType.CREATURE)
+ ));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.addTarget(new TargetPermanent(xValue, xValue, filter, false));
+ }
+}
+
class IndomitableCreativityEffect extends OneShotEffect {
public IndomitableCreativityEffect() {
super(Outcome.Benefit);
- this.staticText = "Destroy X target artifacts and/or creatures. For each permanent destroyed this way, its controller reveals cards from the top of their library until an artifact or creature card is revealed and exiles that card. Those players put the exiled card onto the battlefield, then shuffle their libraries";
+ this.staticText = "Destroy X target artifacts and/or creatures. " +
+ "For each permanent destroyed this way, " +
+ "its controller reveals cards from the top of their library" +
+ " until an artifact or creature card is revealed and exiles that card. " +
+ "Those players put the exiled card onto the battlefield, then shuffle their libraries";
}
public IndomitableCreativityEffect(final IndomitableCreativityEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/i/InfernalReckoning.java b/Mage.Sets/src/mage/cards/i/InfernalReckoning.java
index 6c2a2146024..1d1cc6ded2e 100644
--- a/Mage.Sets/src/mage/cards/i/InfernalReckoning.java
+++ b/Mage.Sets/src/mage/cards/i/InfernalReckoning.java
@@ -23,7 +23,7 @@ public final class InfernalReckoning extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("colorless creature");
static {
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
}
public InfernalReckoning(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/InfernalTribute.java b/Mage.Sets/src/mage/cards/i/InfernalTribute.java
index 028994e1913..51a53d5c831 100644
--- a/Mage.Sets/src/mage/cards/i/InfernalTribute.java
+++ b/Mage.Sets/src/mage/cards/i/InfernalTribute.java
@@ -25,7 +25,7 @@ public final class InfernalTribute extends CardImpl {
private final static FilterControlledPermanent filter = new FilterControlledPermanent("a nontoken permanent");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public InfernalTribute(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/InfernoHellion.java b/Mage.Sets/src/mage/cards/i/InfernoHellion.java
index ed2b3254f70..859049b4c3e 100644
--- a/Mage.Sets/src/mage/cards/i/InfernoHellion.java
+++ b/Mage.Sets/src/mage/cards/i/InfernoHellion.java
@@ -66,8 +66,8 @@ enum InfernoHellionCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- AttackedThisTurnWatcher watcherAttacked = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
- BlockedThisTurnWatcher watcherBlocked = (BlockedThisTurnWatcher) game.getState().getWatchers().get(BlockedThisTurnWatcher.class.getSimpleName());
+ AttackedThisTurnWatcher watcherAttacked = game.getState().getWatcher(AttackedThisTurnWatcher.class);
+ BlockedThisTurnWatcher watcherBlocked = game.getState().getWatcher(BlockedThisTurnWatcher.class);
MageObjectReference mor = new MageObjectReference(source.getSourceId(), game);
if (watcherAttacked == null || watcherBlocked == null) {
return false;
diff --git a/Mage.Sets/src/mage/cards/i/InfernoTrap.java b/Mage.Sets/src/mage/cards/i/InfernoTrap.java
index 8ac6aa5364f..f85d962e140 100644
--- a/Mage.Sets/src/mage/cards/i/InfernoTrap.java
+++ b/Mage.Sets/src/mage/cards/i/InfernoTrap.java
@@ -53,7 +53,7 @@ enum InfernoTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- InfernoTrapWatcher watcher = (InfernoTrapWatcher) game.getState().getWatchers().get(InfernoTrapWatcher.class.getSimpleName());
+ InfernoTrapWatcher watcher = game.getState().getWatcher(InfernoTrapWatcher.class);
if (watcher != null) {
Set damagingCreatures = watcher.getDamagingCreatures(source.getControllerId());
return damagingCreatures.size() > 1;
@@ -72,7 +72,7 @@ class InfernoTrapWatcher extends Watcher {
Map> playerDamagedByCreature = new HashMap<>();
public InfernoTrapWatcher() {
- super(InfernoTrapWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(InfernoTrapWatcher.class, WatcherScope.GAME);
}
public InfernoTrapWatcher(final InfernoTrapWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/i/InfiltratorsMagemark.java b/Mage.Sets/src/mage/cards/i/InfiltratorsMagemark.java
index 66291875c5a..319a3cf2420 100644
--- a/Mage.Sets/src/mage/cards/i/InfiltratorsMagemark.java
+++ b/Mage.Sets/src/mage/cards/i/InfiltratorsMagemark.java
@@ -35,7 +35,7 @@ public final class InfiltratorsMagemark extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control that are enchanted");
static {
- filter.add(new EnchantedPredicate());
+ filter.add(EnchantedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/i/InfusedArrows.java b/Mage.Sets/src/mage/cards/i/InfusedArrows.java
index 5975fdc4fa6..904cde89546 100644
--- a/Mage.Sets/src/mage/cards/i/InfusedArrows.java
+++ b/Mage.Sets/src/mage/cards/i/InfusedArrows.java
@@ -32,7 +32,7 @@ public final class InfusedArrows extends CardImpl {
// Sunburst
this.addAbility(new SunburstAbility(this));
// {tap}, Remove X charge counters from Infused Arrows: Target creature gets -X/-X until end of turn.
- DynamicValue value = new SignInversionDynamicValue(new RemovedCountersForCostValue());
+ DynamicValue value = new SignInversionDynamicValue(RemovedCountersForCostValue.instance);
Effect effect = new BoostTargetEffect(value, value, Duration.EndOfTurn);
effect.setText("Target creature gets -X/-X until end of turn");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost());
diff --git a/Mage.Sets/src/mage/cards/i/InkfathomWitch.java b/Mage.Sets/src/mage/cards/i/InkfathomWitch.java
index 384933ba5b8..aaeb94fa175 100644
--- a/Mage.Sets/src/mage/cards/i/InkfathomWitch.java
+++ b/Mage.Sets/src/mage/cards/i/InkfathomWitch.java
@@ -24,7 +24,7 @@ public final class InkfathomWitch extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Each unblocked creature");
static {
- filter.add(new UnblockedPredicate());
+ filter.add(UnblockedPredicate.instance);
}
public InkfathomWitch(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/InnerCalmOuterStrength.java b/Mage.Sets/src/mage/cards/i/InnerCalmOuterStrength.java
index 90e6f848e8a..7dbf40bb737 100644
--- a/Mage.Sets/src/mage/cards/i/InnerCalmOuterStrength.java
+++ b/Mage.Sets/src/mage/cards/i/InnerCalmOuterStrength.java
@@ -25,7 +25,7 @@ public final class InnerCalmOuterStrength extends CardImpl {
this.subtype.add(SubType.ARCANE);
// Target creature gets +X/+X until end of turn, where X is the number of cards in your hand.
- DynamicValue xValue= new CardsInControllerHandCount();
+ DynamicValue xValue= CardsInControllerHandCount.instance;
Effect effect = new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn, true);
effect.setText("Target creature gets +X/+X until end of turn, where X is the number of cards in your hand");
this.getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/i/InnerFire.java b/Mage.Sets/src/mage/cards/i/InnerFire.java
index d7f2671f735..42a4da2dd46 100644
--- a/Mage.Sets/src/mage/cards/i/InnerFire.java
+++ b/Mage.Sets/src/mage/cards/i/InnerFire.java
@@ -20,7 +20,7 @@ public final class InnerFire extends CardImpl {
// Add {R} for each card in your hand.
- this.getSpellAbility().addEffect(new DynamicManaEffect(Mana.RedMana(1), new CardsInControllerHandCount()));
+ this.getSpellAbility().addEffect(new DynamicManaEffect(Mana.RedMana(1), CardsInControllerHandCount.instance));
}
public InnerFire(final InnerFire card) {
diff --git a/Mage.Sets/src/mage/cards/i/InsatiableRakghoul.java b/Mage.Sets/src/mage/cards/i/InsatiableRakghoul.java
index e62ce559f34..f3553aef621 100644
--- a/Mage.Sets/src/mage/cards/i/InsatiableRakghoul.java
+++ b/Mage.Sets/src/mage/cards/i/InsatiableRakghoul.java
@@ -62,7 +62,7 @@ class InsatiableRakghoulEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- NonArtifactCreaturesDiedWatcher watcher = (NonArtifactCreaturesDiedWatcher) game.getState().getWatchers().get(NonArtifactCreaturesDiedWatcher.class.getSimpleName());
+ NonArtifactCreaturesDiedWatcher watcher = game.getState().getWatcher(NonArtifactCreaturesDiedWatcher.class);
if (watcher != null && watcher.conditionMet()) {
Permanent permanent = game.getPermanentEntering(source.getSourceId());
if (permanent != null) {
@@ -83,7 +83,7 @@ class InsatiableRakghoulEffect extends OneShotEffect {
class NonArtifactCreaturesDiedWatcher extends Watcher {
public NonArtifactCreaturesDiedWatcher() {
- super(NonArtifactCreaturesDiedWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(NonArtifactCreaturesDiedWatcher.class, WatcherScope.GAME);
}
public NonArtifactCreaturesDiedWatcher(final NonArtifactCreaturesDiedWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/i/InsidiousDreams.java b/Mage.Sets/src/mage/cards/i/InsidiousDreams.java
index 43047ff9729..b163be9b12d 100644
--- a/Mage.Sets/src/mage/cards/i/InsidiousDreams.java
+++ b/Mage.Sets/src/mage/cards/i/InsidiousDreams.java
@@ -74,13 +74,13 @@ class InsidiousDreamsEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = game.getObject(source.getSourceId());
- int amount = new GetXValue().calculate(game, source, this);
+ int amount = GetXValue.instance.calculate(game, source, this);
if (controller != null && sourceObject != null) {
TargetCardInLibrary target = new TargetCardInLibrary(0, amount, new FilterCard());
if (controller.searchLibrary(target, game)) {
Cards chosen = new CardsImpl();
- for (UUID cardId : (List) target.getTargets()) {
+ for (UUID cardId : target.getTargets()) {
Card card = controller.getLibrary().remove(cardId, game);
chosen.add(card);
}
diff --git a/Mage.Sets/src/mage/cards/i/Insist.java b/Mage.Sets/src/mage/cards/i/Insist.java
index 5c79086b5ef..7531dfdccf7 100644
--- a/Mage.Sets/src/mage/cards/i/Insist.java
+++ b/Mage.Sets/src/mage/cards/i/Insist.java
@@ -65,7 +65,7 @@ class InsistEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public void init(Ability source, Game game) {
super.init(source, game);
- InsistWatcher watcher = (InsistWatcher) game.getState().getWatchers().get(InsistWatcher.class.getSimpleName(), source.getControllerId());
+ InsistWatcher watcher = game.getState().getWatcher(InsistWatcher.class, source.getControllerId());
if (watcher != null) {
watcher.setReady();
}
@@ -93,7 +93,7 @@ class InsistEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
Spell spell = game.getStack().getSpell(event.getTargetId());
- InsistWatcher watcher = (InsistWatcher) game.getState().getWatchers().get(InsistWatcher.class.getSimpleName(), source.getControllerId());
+ InsistWatcher watcher = game.getState().getWatcher(InsistWatcher.class, source.getControllerId());
return spell != null && watcher != null && watcher.isUncounterable(spell.getId());
}
}
@@ -104,7 +104,7 @@ class InsistWatcher extends Watcher {
protected UUID uncounterableSpell;
InsistWatcher() {
- super(InsistWatcher.class.getSimpleName(), WatcherScope.PLAYER);
+ super(InsistWatcher.class, WatcherScope.PLAYER);
}
InsistWatcher(final InsistWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/i/InspiredSphinx.java b/Mage.Sets/src/mage/cards/i/InspiredSphinx.java
index f3e793d77e6..22e2f94442c 100644
--- a/Mage.Sets/src/mage/cards/i/InspiredSphinx.java
+++ b/Mage.Sets/src/mage/cards/i/InspiredSphinx.java
@@ -33,7 +33,7 @@ public final class InspiredSphinx extends CardImpl {
// When Inspired Sphinx enters the battlefield, draw cards equal to the number of opponents you have.
this.addAbility(new EntersBattlefieldTriggeredAbility(
- new DrawCardSourceControllerEffect(new OpponentsCount()).setText("draw cards equal to the number of opponents you have")
+ new DrawCardSourceControllerEffect(OpponentsCount.instance).setText("draw cards equal to the number of opponents you have")
));
// {3}{U}: Create a colorless 1/1 Thopter artifact creature token with flying.
diff --git a/Mage.Sets/src/mage/cards/i/InspiringCommander.java b/Mage.Sets/src/mage/cards/i/InspiringCommander.java
index ad50beeafcd..073076f25e6 100644
--- a/Mage.Sets/src/mage/cards/i/InspiringCommander.java
+++ b/Mage.Sets/src/mage/cards/i/InspiringCommander.java
@@ -27,7 +27,7 @@ public final class InspiringCommander extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature with power 2 or less");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
}
diff --git a/Mage.Sets/src/mage/cards/i/InsultInjury.java b/Mage.Sets/src/mage/cards/i/InsultInjury.java
index 43f13ffdce0..5250fa9ba3d 100644
--- a/Mage.Sets/src/mage/cards/i/InsultInjury.java
+++ b/Mage.Sets/src/mage/cards/i/InsultInjury.java
@@ -38,7 +38,7 @@ public final class InsultInjury extends SplitCard {
// to
// Injury
// Injury deals 2 damage to target creature and 2 damage to target player.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
getRightHalfCard().getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker());
getRightHalfCard().getSpellAbility().addEffect(new InjuryEffect());
diff --git a/Mage.Sets/src/mage/cards/i/IntangibleVirtue.java b/Mage.Sets/src/mage/cards/i/IntangibleVirtue.java
index 7ac02d66583..8bc764d587d 100644
--- a/Mage.Sets/src/mage/cards/i/IntangibleVirtue.java
+++ b/Mage.Sets/src/mage/cards/i/IntangibleVirtue.java
@@ -23,7 +23,7 @@ public final class IntangibleVirtue extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creature tokens");
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
}
public IntangibleVirtue(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/IntrepidProvisioner.java b/Mage.Sets/src/mage/cards/i/IntrepidProvisioner.java
index e7c88c04160..35baafc5e97 100644
--- a/Mage.Sets/src/mage/cards/i/IntrepidProvisioner.java
+++ b/Mage.Sets/src/mage/cards/i/IntrepidProvisioner.java
@@ -25,7 +25,7 @@ public final class IntrepidProvisioner extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(SubType.HUMAN, "another target Human you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public IntrepidProvisioner(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/InvasiveSpecies.java b/Mage.Sets/src/mage/cards/i/InvasiveSpecies.java
index 193d45dbd9c..3a2302b9373 100644
--- a/Mage.Sets/src/mage/cards/i/InvasiveSpecies.java
+++ b/Mage.Sets/src/mage/cards/i/InvasiveSpecies.java
@@ -21,7 +21,7 @@ public final class InvasiveSpecies extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another permanent you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public InvasiveSpecies(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/InvokeTheFiremind.java b/Mage.Sets/src/mage/cards/i/InvokeTheFiremind.java
index 9e74d88bb52..a61d8a4d1f8 100644
--- a/Mage.Sets/src/mage/cards/i/InvokeTheFiremind.java
+++ b/Mage.Sets/src/mage/cards/i/InvokeTheFiremind.java
@@ -21,9 +21,9 @@ public final class InvokeTheFiremind extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{U}{R}");
- this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.instance));
Mode mode = new Mode();
- mode.addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ mode.addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
mode.addTarget(new TargetAnyTarget());
this.getSpellAbility().addMode(mode);
}
diff --git a/Mage.Sets/src/mage/cards/i/IroasGodOfVictory.java b/Mage.Sets/src/mage/cards/i/IroasGodOfVictory.java
index d152a61be41..b964156ea1d 100644
--- a/Mage.Sets/src/mage/cards/i/IroasGodOfVictory.java
+++ b/Mage.Sets/src/mage/cards/i/IroasGodOfVictory.java
@@ -29,7 +29,7 @@ public final class IroasGodOfVictory extends CardImpl {
private static final FilterControlledCreatureInPlay filterAttacking = new FilterControlledCreatureInPlay("attacking creatures you control");
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filterAttacking.getCreatureFilter().add(new AttackingPredicate());
+ filterAttacking.getCreatureFilter().add(AttackingPredicate.instance);
}
public IroasGodOfVictory(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/IsperiaTheInscrutable.java b/Mage.Sets/src/mage/cards/i/IsperiaTheInscrutable.java
index e417bed22c9..25d5ee7a915 100644
--- a/Mage.Sets/src/mage/cards/i/IsperiaTheInscrutable.java
+++ b/Mage.Sets/src/mage/cards/i/IsperiaTheInscrutable.java
@@ -79,7 +79,7 @@ class IsperiaTheInscrutableEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
- Object object = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
+ Object object = game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
if (player != null && object instanceof String) {
player.revealCards(player.getLogName() + " hand", player.getHand(), game, true);
String namedCard = (String) object;
diff --git a/Mage.Sets/src/mage/cards/i/ItThatBetrays.java b/Mage.Sets/src/mage/cards/i/ItThatBetrays.java
index fda419264fa..e559bed72e7 100644
--- a/Mage.Sets/src/mage/cards/i/ItThatBetrays.java
+++ b/Mage.Sets/src/mage/cards/i/ItThatBetrays.java
@@ -23,7 +23,7 @@ public final class ItThatBetrays extends CardImpl {
private static final FilterPermanent FILTER = new FilterPermanent("nontoken permanent");
static {
- FILTER.add(Predicates.not(new TokenPredicate()));
+ FILTER.add(Predicates.not(TokenPredicate.instance));
}
public ItThatBetrays(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/IvoryGuardians.java b/Mage.Sets/src/mage/cards/i/IvoryGuardians.java
index 8bbb182421d..5298e44ca4d 100644
--- a/Mage.Sets/src/mage/cards/i/IvoryGuardians.java
+++ b/Mage.Sets/src/mage/cards/i/IvoryGuardians.java
@@ -33,7 +33,7 @@ public final class IvoryGuardians extends CardImpl {
static {
controlFilter.add(new ColorPredicate(ObjectColor.RED));
- controlFilter.add(Predicates.not(new TokenPredicate()));
+ controlFilter.add(Predicates.not(TokenPredicate.instance));
boostFilter.add(new NamePredicate("Ivory Guardians"));
}
diff --git a/Mage.Sets/src/mage/cards/i/IvyLaneDenizen.java b/Mage.Sets/src/mage/cards/i/IvyLaneDenizen.java
index 56e556a59e9..b914b2dc360 100644
--- a/Mage.Sets/src/mage/cards/i/IvyLaneDenizen.java
+++ b/Mage.Sets/src/mage/cards/i/IvyLaneDenizen.java
@@ -27,7 +27,7 @@ public final class IvyLaneDenizen extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another green creature");
static {
filter.add(new ColorPredicate(ObjectColor.GREEN));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public IvyLaneDenizen(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/IxalansBinding.java b/Mage.Sets/src/mage/cards/i/IxalansBinding.java
index 471a3ada5c4..95be9e826b8 100644
--- a/Mage.Sets/src/mage/cards/i/IxalansBinding.java
+++ b/Mage.Sets/src/mage/cards/i/IxalansBinding.java
@@ -1,7 +1,5 @@
-
package mage.cards.i;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -12,11 +10,7 @@ import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.TargetController;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.ExileZone;
@@ -26,8 +20,9 @@ import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.util.CardUtil;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class IxalansBinding extends CardImpl {
@@ -80,10 +75,10 @@ class IxalansBindingReplacementEffect extends ContinuousRuleModifyingEffectImpl
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
- Card card = game.getCard(event.getSourceId());
- if(event.getPlayerId().equals(source.getControllerId())){
+ if (event.getPlayerId().equals(source.getControllerId())) {
return false;
}
+ Card card = game.getCard(event.getSourceId());
if (sourcePermanent != null && card != null) {
UUID exileZone = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter());
if (exileZone != null) {
diff --git a/Mage.Sets/src/mage/cards/i/IxidorRealitySculptor.java b/Mage.Sets/src/mage/cards/i/IxidorRealitySculptor.java
index 8871c562f0d..615e5646910 100644
--- a/Mage.Sets/src/mage/cards/i/IxidorRealitySculptor.java
+++ b/Mage.Sets/src/mage/cards/i/IxidorRealitySculptor.java
@@ -26,8 +26,8 @@ public final class IxidorRealitySculptor extends CardImpl {
private static final FilterCreaturePermanent filterTarget = new FilterCreaturePermanent("face-down creature");
static {
- filter.add(new FaceDownPredicate());
- filterTarget.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
+ filterTarget.add(FaceDownPredicate.instance);
}
public IxidorRealitySculptor(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/i/Ixidron.java b/Mage.Sets/src/mage/cards/i/Ixidron.java
index 89fbe738556..a84f448357e 100644
--- a/Mage.Sets/src/mage/cards/i/Ixidron.java
+++ b/Mage.Sets/src/mage/cards/i/Ixidron.java
@@ -31,9 +31,9 @@ public final class Ixidron extends CardImpl {
private static final FilterCreaturePermanent filterTurnFaceDown = new FilterCreaturePermanent("other nontoken creatures");
static {
- filter.add(new FaceDownPredicate());
- filterTurnFaceDown.add(new AnotherPredicate());
- filterTurnFaceDown.add(Predicates.not(new TokenPredicate()));
+ filter.add(FaceDownPredicate.instance);
+ filterTurnFaceDown.add(AnotherPredicate.instance);
+ filterTurnFaceDown.add(Predicates.not(TokenPredicate.instance));
}
public Ixidron(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java
index 7aaaf9cf64f..8ef446b6dab 100644
--- a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java
+++ b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java
@@ -198,7 +198,7 @@ class JaceArchitectOfThoughtEffect2 extends OneShotEffect {
boolean pileChoice = player.choosePile(Outcome.Neutral, "Choose a pile to to put into your hand.",
new ArrayList<>(pile1.getCards(game)),
- new ArrayList<>(allCards.getCards(game)), game);
+ new ArrayList<>(pile2.getCards(game)), game);
game.informPlayers(player.getLogName() + " chose pile" + (pileChoice ? "1" : "2"));
player.moveCards(pileChoice ? pile1 : pile2, Zone.HAND, source, game);
player.putCardsOnBottomOfLibrary(pileChoice ? pile2 : pile1, game, source, true);
diff --git a/Mage.Sets/src/mage/cards/j/JaceTheLivingGuildpact.java b/Mage.Sets/src/mage/cards/j/JaceTheLivingGuildpact.java
index 089eb700031..762da47ab12 100644
--- a/Mage.Sets/src/mage/cards/j/JaceTheLivingGuildpact.java
+++ b/Mage.Sets/src/mage/cards/j/JaceTheLivingGuildpact.java
@@ -30,7 +30,7 @@ public final class JaceTheLivingGuildpact extends CardImpl {
private static final FilterPermanent filter = new FilterNonlandPermanent("another target nonland permanent");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public JaceTheLivingGuildpact(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JaddiLifestrider.java b/Mage.Sets/src/mage/cards/j/JaddiLifestrider.java
index 74b680ba40d..ea713bf87d8 100644
--- a/Mage.Sets/src/mage/cards/j/JaddiLifestrider.java
+++ b/Mage.Sets/src/mage/cards/j/JaddiLifestrider.java
@@ -53,7 +53,7 @@ class JaddiLifestriderEffect extends OneShotEffect {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public JaddiLifestriderEffect() {
diff --git a/Mage.Sets/src/mage/cards/j/JadeBearer.java b/Mage.Sets/src/mage/cards/j/JadeBearer.java
index 9401aac3d9d..422df6fc88a 100644
--- a/Mage.Sets/src/mage/cards/j/JadeBearer.java
+++ b/Mage.Sets/src/mage/cards/j/JadeBearer.java
@@ -24,7 +24,7 @@ public final class JadeBearer extends CardImpl {
private static final FilterCreaturePermanent filterYourAnotherMerfolk = new FilterCreaturePermanent();
static {
- filterYourAnotherMerfolk.add(new AnotherPredicate());
+ filterYourAnotherMerfolk.add(AnotherPredicate.instance);
filterYourAnotherMerfolk.add(new SubtypePredicate(SubType.MERFOLK));
filterYourAnotherMerfolk.add(new ControllerPredicate(TargetController.YOU));
filterYourAnotherMerfolk.setMessage("another " + SubType.MERFOLK.toString() + " you control");
diff --git a/Mage.Sets/src/mage/cards/j/JandorsRing.java b/Mage.Sets/src/mage/cards/j/JandorsRing.java
index 6a8425521fc..4ebfcfcc659 100644
--- a/Mage.Sets/src/mage/cards/j/JandorsRing.java
+++ b/Mage.Sets/src/mage/cards/j/JandorsRing.java
@@ -71,7 +71,7 @@ class JandorsRingEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- JandorsRingWatcher watcher = (JandorsRingWatcher) game.getState().getWatchers().get(JandorsRingWatcher.class.getSimpleName());
+ JandorsRingWatcher watcher = game.getState().getWatcher(JandorsRingWatcher.class);
if (watcher != null) {
UUID cardId = watcher.getLastDrewCard(source.getControllerId());
Card card = game.getCard(cardId);
@@ -97,7 +97,7 @@ class JandorsRingWatcher extends Watcher {
Map lastDrawnCards = new HashMap<>();
public JandorsRingWatcher() {
- super(JandorsRingWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(JandorsRingWatcher.class, WatcherScope.GAME);
}
public JandorsRingWatcher(final JandorsRingWatcher watcher) {
@@ -134,7 +134,7 @@ enum WatchedCardInHandCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- JandorsRingWatcher watcher = (JandorsRingWatcher) game.getState().getWatchers().get(JandorsRingWatcher.class.getSimpleName());
+ JandorsRingWatcher watcher = game.getState().getWatcher(JandorsRingWatcher.class);
return watcher != null
&& watcher.lastDrawnCards != null && game.getPlayer(source.getControllerId()).getHand().contains(watcher.getLastDrewCard(source.getControllerId()));
diff --git a/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java b/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java
index f3226b55642..e895731ea58 100644
--- a/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java
+++ b/Mage.Sets/src/mage/cards/j/JaradGolgariLichLord.java
@@ -53,7 +53,7 @@ public final class JaradGolgariLichLord extends CardImpl {
this.addAbility(ability);
// {1}{B}{G}, Sacrifice another creature: Each opponent loses life equal to the sacrificed creature's power.
- ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseLifeOpponentsEffect(new SacrificeCostCreaturesPower()), new ManaCostsImpl("{1}{B}{G}"));
+ ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseLifeOpponentsEffect(SacrificeCostCreaturesPower.instance), new ManaCostsImpl("{1}{B}{G}"));
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, false)));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/j/JaradsOrders.java b/Mage.Sets/src/mage/cards/j/JaradsOrders.java
index 4f3d01ef3fa..e1f9ff9a8b0 100644
--- a/Mage.Sets/src/mage/cards/j/JaradsOrders.java
+++ b/Mage.Sets/src/mage/cards/j/JaradsOrders.java
@@ -68,7 +68,7 @@ class JaradsOrdersEffect extends OneShotEffect {
if (controller.searchLibrary(target, game)) {
if (!target.getTargets().isEmpty()) {
Cards revealed = new CardsImpl();
- for (UUID cardId: (List)target.getTargets()) {
+ for (UUID cardId: target.getTargets()) {
Card card = controller.getLibrary().getCard(cardId, game);
revealed.add(card);
}
diff --git a/Mage.Sets/src/mage/cards/j/JayaBallardTaskMage.java b/Mage.Sets/src/mage/cards/j/JayaBallardTaskMage.java
index c6198ccf282..2939117b8bf 100644
--- a/Mage.Sets/src/mage/cards/j/JayaBallardTaskMage.java
+++ b/Mage.Sets/src/mage/cards/j/JayaBallardTaskMage.java
@@ -103,7 +103,7 @@ class CantRegenerateEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == EventType.REGENERATE) {
- DamagedByWatcher watcher = (DamagedByWatcher) game.getState().getWatchers().get(DamagedByWatcher.class.getSimpleName(), source.getSourceId());
+ DamagedByWatcher watcher = game.getState().getWatcher(DamagedByWatcher.class, source.getSourceId());
if (watcher != null) {
return watcher.wasDamaged(event.getTargetId(), game);
}
diff --git a/Mage.Sets/src/mage/cards/j/JayasImmolatingInferno.java b/Mage.Sets/src/mage/cards/j/JayasImmolatingInferno.java
index b1e6320f946..7f04db05596 100644
--- a/Mage.Sets/src/mage/cards/j/JayasImmolatingInferno.java
+++ b/Mage.Sets/src/mage/cards/j/JayasImmolatingInferno.java
@@ -25,7 +25,7 @@ public final class JayasImmolatingInferno extends CardImpl {
this.addAbility(new LegendarySpellAbility());
// Jaya's Immolating Inferno deals X damage to each of up to three targets.
- Effect effect = new DamageTargetEffect(new ManacostVariableValue());
+ Effect effect = new DamageTargetEffect(ManacostVariableValue.instance);
effect.setText("{this} deals X damage to each of up to three targets");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetAnyTarget(1, 3));
diff --git a/Mage.Sets/src/mage/cards/j/JediInstructor.java b/Mage.Sets/src/mage/cards/j/JediInstructor.java
index 4665dabb37a..bcdfd16169b 100644
--- a/Mage.Sets/src/mage/cards/j/JediInstructor.java
+++ b/Mage.Sets/src/mage/cards/j/JediInstructor.java
@@ -25,7 +25,7 @@ public final class JediInstructor extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public JediInstructor(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JediSentinel.java b/Mage.Sets/src/mage/cards/j/JediSentinel.java
index 6fd1a7eda82..95eeddae9fe 100644
--- a/Mage.Sets/src/mage/cards/j/JediSentinel.java
+++ b/Mage.Sets/src/mage/cards/j/JediSentinel.java
@@ -30,7 +30,7 @@ public final class JediSentinel extends CardImpl {
private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creature you don't control");
static {
- filter1.add(new AnotherPredicate());
+ filter1.add(AnotherPredicate.instance);
filter2.add(new ControllerPredicate(TargetController.NOT_YOU));
}
diff --git a/Mage.Sets/src/mage/cards/j/JeeringInstigator.java b/Mage.Sets/src/mage/cards/j/JeeringInstigator.java
index d0c8ab237b8..1e76e9844c8 100644
--- a/Mage.Sets/src/mage/cards/j/JeeringInstigator.java
+++ b/Mage.Sets/src/mage/cards/j/JeeringInstigator.java
@@ -31,7 +31,7 @@ public final class JeeringInstigator extends CardImpl {
static final private FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public JeeringInstigator(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JelevaNephaliasScourge.java b/Mage.Sets/src/mage/cards/j/JelevaNephaliasScourge.java
index 2af20fd0760..1177abe7f80 100644
--- a/Mage.Sets/src/mage/cards/j/JelevaNephaliasScourge.java
+++ b/Mage.Sets/src/mage/cards/j/JelevaNephaliasScourge.java
@@ -84,7 +84,7 @@ class JelevaNephaliasScourgeEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = source.getSourceObject(game);
- JelevaNephaliasWatcher watcher = (JelevaNephaliasWatcher) game.getState().getWatchers().get(JelevaNephaliasWatcher.class.getSimpleName());
+ JelevaNephaliasWatcher watcher = game.getState().getWatcher(JelevaNephaliasWatcher.class);
if (controller != null && sourceObject != null && watcher != null) {
int xValue = watcher.getManaSpentToCastLastTime(sourceObject.getId(), sourceObject.getZoneChangeCounter(game) - 1);
if (xValue > 0) {
@@ -144,7 +144,7 @@ class JelevaNephaliasWatcher extends Watcher {
private final Map manaSpendToCast = new HashMap<>(); // cast
public JelevaNephaliasWatcher() {
- super(JelevaNephaliasWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(JelevaNephaliasWatcher.class, WatcherScope.GAME);
}
public JelevaNephaliasWatcher(final JelevaNephaliasWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/j/JeskaiBarricade.java b/Mage.Sets/src/mage/cards/j/JeskaiBarricade.java
index fa0dc3dfe63..061d5edb646 100644
--- a/Mage.Sets/src/mage/cards/j/JeskaiBarricade.java
+++ b/Mage.Sets/src/mage/cards/j/JeskaiBarricade.java
@@ -27,7 +27,7 @@ public final class JeskaiBarricade extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/j/JhoiraOfTheGhitu.java b/Mage.Sets/src/mage/cards/j/JhoiraOfTheGhitu.java
index 4211de5922e..bc09e9f0d0a 100644
--- a/Mage.Sets/src/mage/cards/j/JhoiraOfTheGhitu.java
+++ b/Mage.Sets/src/mage/cards/j/JhoiraOfTheGhitu.java
@@ -1,9 +1,5 @@
-
package mage.cards.j;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
@@ -17,25 +13,24 @@ import mage.abilities.keyword.SuspendAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Outcome;
-import mage.constants.SuperType;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.common.FilterNonlandCard;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInHand;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class JhoiraOfTheGhitu extends CardImpl {
public JhoiraOfTheGhitu(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}");
addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
@@ -83,13 +78,17 @@ class JhoiraOfTheGhituSuspendEffect extends OneShotEffect {
return false;
}
List cards = new ArrayList<>();
- for (Cost cost: source.getCosts()) {
+ for (Cost cost : source.getCosts()) {
if (cost instanceof ExileFromHandCost) {
cards = ((ExileFromHandCost) cost).getCards();
}
}
if (cards != null && !cards.isEmpty()) {
+ // always one card to exile
Card card = game.getCard(cards.get(0).getId());
+ if (card == null) {
+ return false;
+ }
boolean hasSuspend = card.getAbilities().containsClass(SuspendAbility.class);
UUID exileId = SuspendAbility.getSuspendExileId(controller.getId(), game);
diff --git a/Mage.Sets/src/mage/cards/j/Jihad.java b/Mage.Sets/src/mage/cards/j/Jihad.java
index 68035106cac..12ac2407346 100644
--- a/Mage.Sets/src/mage/cards/j/Jihad.java
+++ b/Mage.Sets/src/mage/cards/j/Jihad.java
@@ -84,7 +84,7 @@ class JihadTriggeredAbility extends StateTriggeredAbility {
UUID chosenOpponent = (UUID) game.getState().getValue(getSourceId().toString() + ChooseOpponentEffect.VALUE_KEY);
FilterPermanent filter = new FilterPermanent();
filter.add(new ColorPredicate((ObjectColor) game.getState().getValue(getSourceId() + "_color")));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
return game.getBattlefield().countAll(filter, chosenOpponent, game) == 0;
}
@@ -101,7 +101,7 @@ class JihadOpponentCondition implements Condition {
UUID chosenOpponent = (UUID) game.getState().getValue(source.getSourceId().toString() + ChooseOpponentEffect.VALUE_KEY);
FilterPermanent filter = new FilterPermanent();
filter.add(new ColorPredicate((ObjectColor) game.getState().getValue(source.getSourceId() + "_color")));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
return game.getBattlefield().countAll(filter, chosenOpponent, game) > 0;
}
}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/j/Jilt.java b/Mage.Sets/src/mage/cards/j/Jilt.java
index f1ab8a2f697..a66b94bdde7 100644
--- a/Mage.Sets/src/mage/cards/j/Jilt.java
+++ b/Mage.Sets/src/mage/cards/j/Jilt.java
@@ -1,9 +1,7 @@
-
package mage.cards.j;
import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.Effect;
@@ -18,6 +16,7 @@ import mage.filter.predicate.mageobject.AnotherTargetPredicate;
import mage.game.Game;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.SecondTargetPointer;
/**
@@ -43,18 +42,7 @@ public final class Jilt extends CardImpl {
Target target = new TargetCreaturePermanent();
target.setTargetTag(1);
this.getSpellAbility().addTarget(target);
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility && KickedCondition.instance.apply(game, ability)) {
- FilterCreaturePermanent filter = new FilterCreaturePermanent("Another creature: Damaged");
- filter.add(new AnotherTargetPredicate(2));
- Target target = new TargetCreaturePermanent(filter);
- target.setTargetTag(2);
- ability.addTarget(target);
- }
-
+ this.getSpellAbility().setTargetAdjuster(JiltAdjuster.instance);
}
public Jilt(final Jilt card) {
@@ -66,3 +54,20 @@ public final class Jilt extends CardImpl {
return new Jilt(this);
}
}
+
+enum JiltAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if (!KickedCondition.instance.apply(game, ability)) {
+ return;
+ }
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("Another creature: Damaged");
+ filter.add(new AnotherTargetPredicate(2));
+ Target target = new TargetCreaturePermanent(filter);
+ target.setTargetTag(2);
+ ability.addTarget(target);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/j/JinxedRing.java b/Mage.Sets/src/mage/cards/j/JinxedRing.java
index c2f58dd8e81..ead7bf52e4a 100644
--- a/Mage.Sets/src/mage/cards/j/JinxedRing.java
+++ b/Mage.Sets/src/mage/cards/j/JinxedRing.java
@@ -34,7 +34,7 @@ public final class JinxedRing extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("a nontoken permanent");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public JinxedRing(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JiwariTheEarthAflame.java b/Mage.Sets/src/mage/cards/j/JiwariTheEarthAflame.java
index fb3d834a8e4..e72e7debbfe 100644
--- a/Mage.Sets/src/mage/cards/j/JiwariTheEarthAflame.java
+++ b/Mage.Sets/src/mage/cards/j/JiwariTheEarthAflame.java
@@ -44,13 +44,13 @@ public final class JiwariTheEarthAflame extends CardImpl {
this.toughness = new MageInt(3);
// {X}{R}, {tap}: Jiwari, the Earth Aflame deals X damage to target creature without flying.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}{R}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.instance), new ManaCostsImpl("{X}{R}"));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability);
// Channel - {X}{R}{R}{R}, Discard Jiwari: Jiwari deals X damage to each creature without flying.
- this.addAbility(new ChannelAbility("{X}{R}{R}{R}", new DamageAllEffect(new ManacostVariableValue(), filter)));
+ this.addAbility(new ChannelAbility("{X}{R}{R}{R}", new DamageAllEffect(ManacostVariableValue.instance, filter)));
}
public JiwariTheEarthAflame(final JiwariTheEarthAflame card) {
diff --git a/Mage.Sets/src/mage/cards/j/JoragaAuxiliary.java b/Mage.Sets/src/mage/cards/j/JoragaAuxiliary.java
index 9ee16402ee5..7c888ff6bd7 100644
--- a/Mage.Sets/src/mage/cards/j/JoragaAuxiliary.java
+++ b/Mage.Sets/src/mage/cards/j/JoragaAuxiliary.java
@@ -25,7 +25,7 @@ public final class JoragaAuxiliary extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other target creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public JoragaAuxiliary(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JoragaWarcaller.java b/Mage.Sets/src/mage/cards/j/JoragaWarcaller.java
index 6b89b86a4ba..ca2464b6589 100644
--- a/Mage.Sets/src/mage/cards/j/JoragaWarcaller.java
+++ b/Mage.Sets/src/mage/cards/j/JoragaWarcaller.java
@@ -32,7 +32,7 @@ public final class JoragaWarcaller extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
filter.add(new SubtypePredicate(SubType.ELF));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public JoragaWarcaller(UUID ownerId, CardSetInfo setInfo) {
@@ -48,7 +48,7 @@ public final class JoragaWarcaller extends CardImpl {
// Joraga Warcaller enters the battlefield with a +1/+1 counter on it for each time it was kicked.
this.addAbility(new EntersBattlefieldAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), new MultikickerCount(), true),
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), MultikickerCount.instance, true),
"with a +1/+1 counter on it for each time it was kicked"));
diff --git a/Mage.Sets/src/mage/cards/j/JoriEnRuinDiver.java b/Mage.Sets/src/mage/cards/j/JoriEnRuinDiver.java
index 5d817801997..dd11de050fa 100644
--- a/Mage.Sets/src/mage/cards/j/JoriEnRuinDiver.java
+++ b/Mage.Sets/src/mage/cards/j/JoriEnRuinDiver.java
@@ -67,7 +67,7 @@ class JoriEnTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getPlayerId().equals(controllerId)) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 2) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/j/JourneyToNowhere.java b/Mage.Sets/src/mage/cards/j/JourneyToNowhere.java
index d0253e3bde5..c10249f3ece 100644
--- a/Mage.Sets/src/mage/cards/j/JourneyToNowhere.java
+++ b/Mage.Sets/src/mage/cards/j/JourneyToNowhere.java
@@ -27,7 +27,7 @@ public final class JourneyToNowhere extends CardImpl {
// When Journey to Nowhere enters the battlefield, exile target creature.
FilterCreaturePermanent filter = new FilterCreaturePermanent();
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
Ability ability1 = new EntersBattlefieldTriggeredAbility(new ExileTargetForSourceEffect(), false);
Target target = new TargetPermanent(filter);
ability1.addTarget(target);
diff --git a/Mage.Sets/src/mage/cards/j/JovensFerrets.java b/Mage.Sets/src/mage/cards/j/JovensFerrets.java
index a4df82c443c..8454e048112 100644
--- a/Mage.Sets/src/mage/cards/j/JovensFerrets.java
+++ b/Mage.Sets/src/mage/cards/j/JovensFerrets.java
@@ -82,7 +82,7 @@ class JovensFerretsEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (controller != null && sourcePermanent != null) {
- BlockedAttackerWatcher watcher = (BlockedAttackerWatcher) game.getState().getWatchers().get(BlockedAttackerWatcher.class.getSimpleName());
+ BlockedAttackerWatcher watcher = game.getState().getWatcher(BlockedAttackerWatcher.class);
if (watcher != null) {
List toTap = new ArrayList<>();
for (Permanent creature : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), source.getSourceId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/j/JubilantMascot.java b/Mage.Sets/src/mage/cards/j/JubilantMascot.java
index 5e7df4e0496..299f93ea3df 100644
--- a/Mage.Sets/src/mage/cards/j/JubilantMascot.java
+++ b/Mage.Sets/src/mage/cards/j/JubilantMascot.java
@@ -27,7 +27,7 @@ public final class JubilantMascot extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other target creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public JubilantMascot(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JudithTheScourgeDiva.java b/Mage.Sets/src/mage/cards/j/JudithTheScourgeDiva.java
new file mode 100644
index 00000000000..8495a10b955
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/j/JudithTheScourgeDiva.java
@@ -0,0 +1,62 @@
+package mage.cards.j;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesCreatureTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.filter.predicate.permanent.TokenPredicate;
+import mage.target.common.TargetAnyTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class JudithTheScourgeDiva extends CardImpl {
+
+ private static final FilterCreaturePermanent filter
+ = new FilterCreaturePermanent("nontoken creature you control");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ filter.add(Predicates.not(TokenPredicate.instance));
+ }
+
+ public JudithTheScourgeDiva(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{R}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Other creatures you control get +1/+0.
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new BoostControlledEffect(1, 0, Duration.WhileOnBattlefield, true)
+ ));
+
+ // Whenever a nontoken creature you control dies, Judith, the Scourge Diva deals 1 damage to any target.
+ Ability ability = new DiesCreatureTriggeredAbility(new DamageTargetEffect(1), false, filter);
+ ability.addTarget(new TargetAnyTarget());
+ this.addAbility(ability);
+ }
+
+ private JudithTheScourgeDiva(final JudithTheScourgeDiva card) {
+ super(card);
+ }
+
+ @Override
+ public JudithTheScourgeDiva copy() {
+ return new JudithTheScourgeDiva(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/j/JundHackblade.java b/Mage.Sets/src/mage/cards/j/JundHackblade.java
index 21427f6d9f8..c8c36209893 100644
--- a/Mage.Sets/src/mage/cards/j/JundHackblade.java
+++ b/Mage.Sets/src/mage/cards/j/JundHackblade.java
@@ -29,8 +29,8 @@ public final class JundHackblade extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another multicolor permanent");
static {
- filter.add(new MulticoloredPredicate());
- filter.add(new AnotherPredicate());
+ filter.add(MulticoloredPredicate.instance);
+ filter.add(AnotherPredicate.instance);
}
public JundHackblade(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JungleBasin.java b/Mage.Sets/src/mage/cards/j/JungleBasin.java
index c486b5dce38..e2ceca75b64 100644
--- a/Mage.Sets/src/mage/cards/j/JungleBasin.java
+++ b/Mage.Sets/src/mage/cards/j/JungleBasin.java
@@ -30,7 +30,7 @@ public final class JungleBasin extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.FOREST));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public JungleBasin(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JunglePatrol.java b/Mage.Sets/src/mage/cards/j/JunglePatrol.java
index db42b08508f..31e9ecade3f 100644
--- a/Mage.Sets/src/mage/cards/j/JunglePatrol.java
+++ b/Mage.Sets/src/mage/cards/j/JunglePatrol.java
@@ -32,7 +32,7 @@ public final class JunglePatrol extends CardImpl {
static {
filter.add(new NamePredicate("Wood"));
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
}
public JunglePatrol(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JuniperOrderRanger.java b/Mage.Sets/src/mage/cards/j/JuniperOrderRanger.java
index f6efdbf90d3..4c343d6b5fb 100644
--- a/Mage.Sets/src/mage/cards/j/JuniperOrderRanger.java
+++ b/Mage.Sets/src/mage/cards/j/JuniperOrderRanger.java
@@ -25,7 +25,7 @@ public final class JuniperOrderRanger extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public JuniperOrderRanger(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/j/JushiApprentice.java b/Mage.Sets/src/mage/cards/j/JushiApprentice.java
index 88ac5754ba5..c6f19a2652c 100644
--- a/Mage.Sets/src/mage/cards/j/JushiApprentice.java
+++ b/Mage.Sets/src/mage/cards/j/JushiApprentice.java
@@ -71,7 +71,7 @@ class TomoyaTheRevealer extends TokenImpl {
toughness = new MageInt(3);
// {3}{U}{U},{T} : Target player draws X cards, where X is the number of cards in your hand.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardTargetEffect(new CardsInControllerHandCount()), new ManaCostsImpl("{3}{U}{U}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardTargetEffect(CardsInControllerHandCount.instance), new ManaCostsImpl("{3}{U}{U}"));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/j/JusticiarsPortal.java b/Mage.Sets/src/mage/cards/j/JusticiarsPortal.java
new file mode 100644
index 00000000000..7dfc2956ba3
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/j/JusticiarsPortal.java
@@ -0,0 +1,71 @@
+package mage.cards.j;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ExileTargetForSourceEffect;
+import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.targetpointer.FixedTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class JusticiarsPortal extends CardImpl {
+
+ public JusticiarsPortal(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
+
+ // Exile target creature you control, then return that card to the battlefield under its owner's control. It gains first strike until end of turn.
+ this.getSpellAbility().addEffect(new JusticiarsPortalEffect());
+ this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
+ }
+
+ private JusticiarsPortal(final JusticiarsPortal card) {
+ super(card);
+ }
+
+ @Override
+ public JusticiarsPortal copy() {
+ return new JusticiarsPortal(this);
+ }
+}
+
+class JusticiarsPortalEffect extends OneShotEffect {
+
+ JusticiarsPortalEffect() {
+ super(Outcome.Benefit);
+ staticText = "Exile target creature you control, then return that card to the battlefield " +
+ "under its owner's control. It gains first strike until end of turn.";
+ }
+
+ private JusticiarsPortalEffect(final JusticiarsPortalEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public JusticiarsPortalEffect copy() {
+ return new JusticiarsPortalEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ UUID targetId = source.getFirstTarget();
+ new ExileTargetForSourceEffect().apply(game, source);
+ new ReturnToBattlefieldUnderYourControlTargetEffect(true).apply(game, source);
+ ContinuousEffect effect = new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn);
+ effect.setTargetPointer(new FixedTarget(targetId, game));
+ game.addEffect(effect, source);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/j/Juxtapose.java b/Mage.Sets/src/mage/cards/j/Juxtapose.java
index 6c0cddb15ca..a5464c16ed1 100644
--- a/Mage.Sets/src/mage/cards/j/Juxtapose.java
+++ b/Mage.Sets/src/mage/cards/j/Juxtapose.java
@@ -1,13 +1,5 @@
-
package mage.cards.j;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.ContinuousEffectImpl;
@@ -15,12 +7,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Layer;
-import mage.constants.Outcome;
-import mage.constants.SubLayer;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
@@ -31,8 +18,9 @@ import mage.players.Player;
import mage.target.TargetCard;
import mage.target.TargetPlayer;
+import java.util.*;
+
/**
- *
* @author Quercitron
*/
public final class Juxtapose extends CardImpl {
@@ -89,7 +77,6 @@ class JuxtaposeEffect extends ContinuousEffectImpl {
public void init(Ability source, Game game) {
Player you = game.getPlayer(source.getControllerId());
Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source));
- MageObject sourceObject = game.getCard(source.getSourceId());
if (you != null && targetPlayer != null) {
Permanent permanent1 = chooseOnePermanentsWithTheHighestCMC(game, you, filter);
@@ -109,6 +96,7 @@ class JuxtaposeEffect extends ContinuousEffectImpl {
permanent1.changeControllerId(targetPlayer.getId(), game);
permanent2.changeControllerId(you.getId(), game);
+ MageObject sourceObject = game.getCard(source.getSourceId());
game.informPlayers((sourceObject != null ? sourceObject.getLogName() : "") + ": " + you.getLogName() +
" and " + targetPlayer.getLogName() + " exchange control of " + permanent1.getLogName() +
" and " + permanent2.getName());
diff --git a/Mage.Sets/src/mage/cards/j/JwariShapeshifter.java b/Mage.Sets/src/mage/cards/j/JwariShapeshifter.java
index e742dfd1acb..7eb7db49eb0 100644
--- a/Mage.Sets/src/mage/cards/j/JwariShapeshifter.java
+++ b/Mage.Sets/src/mage/cards/j/JwariShapeshifter.java
@@ -25,7 +25,7 @@ public final class JwariShapeshifter extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ALLY));
filter.add(new CardTypePredicate(CardType.CREATURE));
- filter.add(new AnotherPredicate()); // needed because during enters_the_battlefield event the creature is already targetable although it shouldn't
+ filter.add(AnotherPredicate.instance); // needed because during enters_the_battlefield event the creature is already targetable although it shouldn't
}
public JwariShapeshifter(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KaerveksPurge.java b/Mage.Sets/src/mage/cards/k/KaerveksPurge.java
index 591f109a1b3..077111812ae 100644
--- a/Mage.Sets/src/mage/cards/k/KaerveksPurge.java
+++ b/Mage.Sets/src/mage/cards/k/KaerveksPurge.java
@@ -1,9 +1,7 @@
package mage.cards.k;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -17,9 +15,11 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author sinsedrix
*/
public final class KaerveksPurge extends CardImpl {
@@ -28,19 +28,8 @@ public final class KaerveksPurge extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{R}");
// Destroy target creature with converted mana cost X. If that creature dies this way, Kaervek's Purge deals damage equal to the creature's power to the creature's controller.
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with converted mana cost X")));
this.getSpellAbility().addEffect(new KaerveksPurgeEffect());
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost X");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
- ability.addTarget(new TargetCreaturePermanent(filter));
- }
+ this.getSpellAbility().setTargetAdjuster(KaerveksPurgeAdjuster.instance);
}
public KaerveksPurge(final KaerveksPurge card) {
@@ -53,11 +42,27 @@ public final class KaerveksPurge extends CardImpl {
}
}
+enum KaerveksPurgeAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost " + xValue);
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ }
+}
+
class KaerveksPurgeEffect extends OneShotEffect {
public KaerveksPurgeEffect() {
super(Outcome.DestroyPermanent);
- this.staticText = "Destroy target creature with converted mana cost X. If that creature dies this way, {this} deals damage equal to the creature's power to the creature's controller";
+ this.staticText = "Destroy target creature with converted mana cost X. " +
+ "If that creature dies this way, " +
+ "{this} deals damage equal to the creature's power" +
+ " to the creature's controller";
}
public KaerveksPurgeEffect(final KaerveksPurgeEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/k/KaerveksTorch.java b/Mage.Sets/src/mage/cards/k/KaerveksTorch.java
index 9c299f3f2d2..f003c596253 100644
--- a/Mage.Sets/src/mage/cards/k/KaerveksTorch.java
+++ b/Mage.Sets/src/mage/cards/k/KaerveksTorch.java
@@ -34,7 +34,7 @@ public final class KaerveksTorch extends CardImpl {
// As long as Kaervek's Torch is on the stack, spells that target it cost {2} more to cast.
this.addAbility(new SimpleStaticAbility(Zone.STACK, new KaerveksTorchCostIncreaseEffect()));
// Kaervek's Torch deals X damage to any target.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetAnyTarget());
}
diff --git a/Mage.Sets/src/mage/cards/k/KagemaroFirstToSuffer.java b/Mage.Sets/src/mage/cards/k/KagemaroFirstToSuffer.java
index a8249cef2d2..06e5e8d550b 100644
--- a/Mage.Sets/src/mage/cards/k/KagemaroFirstToSuffer.java
+++ b/Mage.Sets/src/mage/cards/k/KagemaroFirstToSuffer.java
@@ -37,7 +37,7 @@ public final class KagemaroFirstToSuffer extends CardImpl {
this.power = new MageInt(0);
this.toughness = new MageInt(0);
- DynamicValue xValue = new CardsInControllerHandCount();
+ DynamicValue xValue = CardsInControllerHandCount.instance;
// Kagemaro, First to Suffer's power and toughness are each equal to the number of cards in your hand.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(xValue, Duration.EndOfGame)));
// {B}, Sacrifice Kagemaro: All creatures get -X/-X until end of turn, where X is the number of cards in your hand.
diff --git a/Mage.Sets/src/mage/cards/k/KagemarosClutch.java b/Mage.Sets/src/mage/cards/k/KagemarosClutch.java
index 1736f8cd3ee..679f3bfc1aa 100644
--- a/Mage.Sets/src/mage/cards/k/KagemarosClutch.java
+++ b/Mage.Sets/src/mage/cards/k/KagemarosClutch.java
@@ -40,7 +40,7 @@ public final class KagemarosClutch extends CardImpl {
this.addAbility(ability);
// Enchanted creature gets -X/-X, where X is the number of cards in your hand.
- DynamicValue xMinusValue = new SignInversionDynamicValue(new CardsInControllerHandCount());
+ DynamicValue xMinusValue = new SignInversionDynamicValue(CardsInControllerHandCount.instance);
Effect effect = new BoostEnchantedEffect(xMinusValue, xMinusValue, Duration.WhileOnBattlefield);
effect.setText("Enchanted creature gets -X/-X, where X is the number of cards in your hand");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
diff --git a/Mage.Sets/src/mage/cards/k/KalitasTraitorOfGhet.java b/Mage.Sets/src/mage/cards/k/KalitasTraitorOfGhet.java
index ff0708de288..a8dc5ad7567 100644
--- a/Mage.Sets/src/mage/cards/k/KalitasTraitorOfGhet.java
+++ b/Mage.Sets/src/mage/cards/k/KalitasTraitorOfGhet.java
@@ -37,7 +37,7 @@ public final class KalitasTraitorOfGhet extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another Vampire or Zombie");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(Predicates.or(new SubtypePredicate(SubType.VAMPIRE),
(new SubtypePredicate(SubType.ZOMBIE))));
}
diff --git a/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java b/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java
index fcc5372b8c3..cdf9e48aaf3 100644
--- a/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java
+++ b/Mage.Sets/src/mage/cards/k/KangeeAerieKeeper.java
@@ -36,7 +36,7 @@ public final class KangeeAerieKeeper extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.BIRD));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public KangeeAerieKeeper(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KaradorGhostChieftain.java b/Mage.Sets/src/mage/cards/k/KaradorGhostChieftain.java
index aba7458be3e..db01b9f2226 100644
--- a/Mage.Sets/src/mage/cards/k/KaradorGhostChieftain.java
+++ b/Mage.Sets/src/mage/cards/k/KaradorGhostChieftain.java
@@ -150,8 +150,8 @@ class KaradorGhostChieftainCastFromGraveyardEffect extends AsThoughEffectImpl {
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (objectId.equals(getTargetPointer().getFirst(game, source))) {
if (affectedControllerId.equals(source.getControllerId())) {
- KaradorGhostChieftainWatcher watcher = (KaradorGhostChieftainWatcher) game.getState().getWatchers().get(KaradorGhostChieftainWatcher.class.getSimpleName(), source.getSourceId());
- return !watcher.isAbilityUsed();
+ KaradorGhostChieftainWatcher watcher = game.getState().getWatcher(KaradorGhostChieftainWatcher.class, source.getSourceId());
+ return watcher != null && !watcher.isAbilityUsed();
}
}
return false;
@@ -163,7 +163,7 @@ class KaradorGhostChieftainWatcher extends Watcher {
boolean abilityUsed = false;
KaradorGhostChieftainWatcher() {
- super(KaradorGhostChieftainWatcher.class.getSimpleName(), WatcherScope.CARD);
+ super(KaradorGhostChieftainWatcher.class, WatcherScope.CARD);
}
KaradorGhostChieftainWatcher(final KaradorGhostChieftainWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/k/KarnLiberated.java b/Mage.Sets/src/mage/cards/k/KarnLiberated.java
index 2cecf73c709..5d969273956 100644
--- a/Mage.Sets/src/mage/cards/k/KarnLiberated.java
+++ b/Mage.Sets/src/mage/cards/k/KarnLiberated.java
@@ -1,9 +1,5 @@
-
package mage.cards.k;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
@@ -11,18 +7,11 @@ import mage.abilities.LoyaltyAbility;
import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileTargetForSourceEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Outcome;
-import mage.constants.SuperType;
-import mage.constants.Zone;
+import mage.cards.*;
+import mage.constants.*;
import mage.game.ExileZone;
import mage.game.Game;
+import mage.game.GameImpl;
import mage.game.command.Commander;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
@@ -34,8 +23,11 @@ import mage.target.TargetPlayer;
import mage.target.common.TargetCardInHand;
import mage.util.CardUtil;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author bunchOfDevs
*/
public final class KarnLiberated extends CardImpl {
@@ -102,6 +94,9 @@ class KarnLiberatedEffect extends OneShotEffect {
}
}
game.getState().clear();
+ // default watchers init, TODO: remove all restart/init code to game
+ ((GameImpl) game).initGameDefaultWatchers();
+
for (Card card : game.getCards()) {
game.getState().addCard(card);
}
@@ -122,6 +117,7 @@ class KarnLiberatedEffect extends OneShotEffect {
}
}
}
+ ((GameImpl) game).initPlayerDefaultWatchers(player.getId());
player.init(game);
}
}
diff --git a/Mage.Sets/src/mage/cards/k/Karoo.java b/Mage.Sets/src/mage/cards/k/Karoo.java
index f9b95d496d7..61cb7560d3b 100644
--- a/Mage.Sets/src/mage/cards/k/Karoo.java
+++ b/Mage.Sets/src/mage/cards/k/Karoo.java
@@ -30,7 +30,7 @@ public final class Karoo extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.PLAINS));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public Karoo(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KarplusanGiant.java b/Mage.Sets/src/mage/cards/k/KarplusanGiant.java
index 8d2b1424c3a..9c1caee8165 100644
--- a/Mage.Sets/src/mage/cards/k/KarplusanGiant.java
+++ b/Mage.Sets/src/mage/cards/k/KarplusanGiant.java
@@ -27,7 +27,7 @@ public final class KarplusanGiant extends CardImpl {
private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("untapped snow land you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SupertypePredicate(SuperType.SNOW));
}
diff --git a/Mage.Sets/src/mage/cards/k/KarplusanMinotaur.java b/Mage.Sets/src/mage/cards/k/KarplusanMinotaur.java
index eda2fdad620..922fd7146f8 100644
--- a/Mage.Sets/src/mage/cards/k/KarplusanMinotaur.java
+++ b/Mage.Sets/src/mage/cards/k/KarplusanMinotaur.java
@@ -1,12 +1,11 @@
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.Cost;
import mage.abilities.costs.CostImpl;
-import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.CumulativeUpkeepAbility;
import mage.cards.CardImpl;
@@ -16,14 +15,17 @@ import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
+import mage.game.events.CoinFlippedEvent;
import mage.game.events.GameEvent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetAnyTarget;
import mage.target.common.TargetOpponent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author L_J
*/
public final class KarplusanMinotaur extends CardImpl {
@@ -39,36 +41,10 @@ public final class KarplusanMinotaur extends CardImpl {
this.addAbility(new CumulativeUpkeepAbility(new KarplusanMinotaurCost()));
// Whenever you win a coin flip, Karplusan Minotaur deals 1 damage to any target.
- Ability abilityWin = new KarplusanMinotaurFlipWinTriggeredAbility();
- abilityWin.addTarget(new TargetAnyTarget());
- this.addAbility(abilityWin);
+ this.addAbility(new KarplusanMinotaurFlipWinTriggeredAbility());
- //TODO: Make ability properly copiable
// Whenever you lose a coin flip, Karplusan Minotaur deals 1 damage to any target of an opponent's choice.
- Ability abilityLose = new KarplusanMinotaurFlipLoseTriggeredAbility();
- abilityLose.addTarget(new TargetAnyTarget());
- this.addAbility(abilityLose);
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof KarplusanMinotaurFlipLoseTriggeredAbility) {
- Player controller = game.getPlayer(ability.getControllerId());
- if (controller != null) {
- UUID opponentId = null;
- if (game.getOpponents(controller.getId()).size() > 1) {
- Target target = new TargetOpponent(true);
- if (controller.chooseTarget(Outcome.Neutral, target, ability, game)) {
- opponentId = target.getFirstTarget();
- }
- } else {
- opponentId = game.getOpponents(controller.getId()).iterator().next();
- }
- if (opponentId != null) {
- ability.getTargets().get(0).setTargetController(opponentId);
- }
- }
- }
+ this.addAbility(new KarplusanMinotaurFlipLoseTriggeredAbility());
}
public KarplusanMinotaur(final KarplusanMinotaur card) {
@@ -85,6 +61,7 @@ class KarplusanMinotaurFlipWinTriggeredAbility extends TriggeredAbilityImpl {
public KarplusanMinotaurFlipWinTriggeredAbility() {
super(Zone.BATTLEFIELD, new DamageTargetEffect(1), false);
+ this.addTarget(new TargetAnyTarget());
}
public KarplusanMinotaurFlipWinTriggeredAbility(final KarplusanMinotaurFlipWinTriggeredAbility ability) {
@@ -103,7 +80,10 @@ class KarplusanMinotaurFlipWinTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- return this.isControlledBy(event.getPlayerId()) && event.getFlag();
+ CoinFlippedEvent flipEvent = (CoinFlippedEvent) event;
+ return flipEvent.getPlayerId().equals(controllerId)
+ && flipEvent.isWinnable()
+ && (flipEvent.getChosen() == flipEvent.getResult());
}
@Override
@@ -116,6 +96,8 @@ class KarplusanMinotaurFlipLoseTriggeredAbility extends TriggeredAbilityImpl {
public KarplusanMinotaurFlipLoseTriggeredAbility() {
super(Zone.BATTLEFIELD, new DamageTargetEffect(1), false);
+ this.addTarget(new TargetAnyTarget());
+ targetAdjuster = KarplusanMinotaurAdjuster.instance;
}
public KarplusanMinotaurFlipLoseTriggeredAbility(final KarplusanMinotaurFlipLoseTriggeredAbility ability) {
@@ -134,7 +116,10 @@ class KarplusanMinotaurFlipLoseTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- return this.isControlledBy(event.getPlayerId()) && !event.getFlag();
+ CoinFlippedEvent flipEvent = (CoinFlippedEvent) event;
+ return flipEvent.getPlayerId().equals(controllerId)
+ && flipEvent.isWinnable()
+ && (flipEvent.getChosen() != flipEvent.getResult());
}
@Override
@@ -153,7 +138,7 @@ class KarplusanMinotaurCost extends CostImpl {
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) {
Player controller = game.getPlayer(controllerId);
if (controller != null) {
- controller.flipCoin(game);
+ controller.flipCoin(ability, game, true);
this.paid = true;
return true;
}
@@ -176,3 +161,27 @@ class KarplusanMinotaurCost extends CostImpl {
return new KarplusanMinotaurCost();
}
}
+
+enum KarplusanMinotaurAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller == null) {
+ return;
+ }
+ UUID opponentId = null;
+ if (game.getOpponents(controller.getId()).size() > 1) {
+ Target target = new TargetOpponent(true);
+ if (controller.chooseTarget(Outcome.Neutral, target, ability, game)) {
+ opponentId = target.getFirstTarget();
+ }
+ } else {
+ opponentId = game.getOpponents(controller.getId()).iterator().next();
+ }
+ if (opponentId != null) {
+ ability.getTargets().get(0).setTargetController(opponentId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/k/KarrthusTyrantOfJund.java b/Mage.Sets/src/mage/cards/k/KarrthusTyrantOfJund.java
index d11a4fd48bf..949e636e44f 100644
--- a/Mage.Sets/src/mage/cards/k/KarrthusTyrantOfJund.java
+++ b/Mage.Sets/src/mage/cards/k/KarrthusTyrantOfJund.java
@@ -33,7 +33,7 @@ public final class KarrthusTyrantOfJund extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Dragon creatures you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.DRAGON));
}
diff --git a/Mage.Sets/src/mage/cards/k/KavuMauler.java b/Mage.Sets/src/mage/cards/k/KavuMauler.java
index ddfc95785e8..5b949f2284c 100644
--- a/Mage.Sets/src/mage/cards/k/KavuMauler.java
+++ b/Mage.Sets/src/mage/cards/k/KavuMauler.java
@@ -26,7 +26,7 @@ public final class KavuMauler extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.KAVU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public KavuMauler(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KavuMonarch.java b/Mage.Sets/src/mage/cards/k/KavuMonarch.java
index 9221978de69..0aebfe4a2cd 100644
--- a/Mage.Sets/src/mage/cards/k/KavuMonarch.java
+++ b/Mage.Sets/src/mage/cards/k/KavuMonarch.java
@@ -31,7 +31,7 @@ public final class KavuMonarch extends CardImpl {
static {
filter1.add(new SubtypePredicate(SubType.KAVU));
filter2.add(new SubtypePredicate(SubType.KAVU));
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
}
public KavuMonarch(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KayaOrzhovUsurper.java b/Mage.Sets/src/mage/cards/k/KayaOrzhovUsurper.java
new file mode 100644
index 00000000000..31b447b6e10
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/k/KayaOrzhovUsurper.java
@@ -0,0 +1,145 @@
+package mage.cards.k;
+
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.cards.*;
+import mage.constants.*;
+import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
+import mage.filter.common.FilterNonlandPermanent;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.TargetPermanent;
+import mage.target.TargetPlayer;
+import mage.target.common.TargetCardInASingleGraveyard;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class KayaOrzhovUsurper extends CardImpl {
+
+ private static final FilterPermanent filter
+ = new FilterNonlandPermanent("nonland permanent with converted mana cost 1 or less");
+
+ static {
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 2));
+ }
+
+ public KayaOrzhovUsurper(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{W}{B}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.KAYA);
+ this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3));
+
+ // +1: Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way.
+ Ability ability = new LoyaltyAbility(new KayaOrzhovUsurperExileEffect(), 1);
+ ability.addTarget(new TargetCardInASingleGraveyard(0, 2, StaticFilters.FILTER_CARD));
+ this.addAbility(ability);
+
+ // -1: Exile target nonland permanent with converted mana cost 1 or less.
+ ability = new LoyaltyAbility(new ExileTargetEffect(), -1);
+ ability.addTarget(new TargetPermanent(filter));
+ this.addAbility(ability);
+
+ // -5: Kaya, Orzhov Usurper deals damage to target player equal to the number of cards that player owns in exile and you gain that much life.
+ ability = new LoyaltyAbility(new KayaOrzhovUsurperDamageEffect(), -5);
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+ }
+
+ private KayaOrzhovUsurper(final KayaOrzhovUsurper card) {
+ super(card);
+ }
+
+ @Override
+ public KayaOrzhovUsurper copy() {
+ return new KayaOrzhovUsurper(this);
+ }
+}
+
+class KayaOrzhovUsurperExileEffect extends OneShotEffect {
+
+ KayaOrzhovUsurperExileEffect() {
+ super(Outcome.Benefit);
+ staticText = "Exile up to two target cards from a single graveyard. " +
+ "You gain 2 life if at least one creature card was exiled this way.";
+ }
+
+ private KayaOrzhovUsurperExileEffect(final KayaOrzhovUsurperExileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KayaOrzhovUsurperExileEffect copy() {
+ return new KayaOrzhovUsurperExileEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ Cards cards = new CardsImpl();
+ for (Target target : source.getTargets()) {
+ for (UUID targetId : target.getTargets()) {
+ Card card = game.getCard(targetId);
+ if (card != null) {
+ cards.add(card);
+ }
+ }
+ }
+ player.moveCards(cards, Zone.EXILED, source, game);
+ for (Card card : cards.getCards(game)) {
+ if (card != null && card.isCreature()) {
+ player.gainLife(2, game, source);
+ break;
+ }
+ }
+ return false;
+ }
+}
+
+class KayaOrzhovUsurperDamageEffect extends OneShotEffect {
+
+ KayaOrzhovUsurperDamageEffect() {
+ super(Outcome.Benefit);
+ staticText = "{this} deals damage to target player equal to the number of cards " +
+ "that player owns in exile and you gain that much life.";
+ }
+
+ private KayaOrzhovUsurperDamageEffect(final KayaOrzhovUsurperDamageEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KayaOrzhovUsurperDamageEffect copy() {
+ return new KayaOrzhovUsurperDamageEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Player player = game.getPlayer(source.getFirstTarget());
+ if (controller == null || player == null) {
+ return false;
+ }
+ int count = 0;
+ for (Card card : game.getExile().getAllCards(game)) {
+ if (card != null && card.getOwnerId().equals(player.getId())) {
+ count += 1;
+ }
+ }
+ player.damage(count, source.getSourceId(), game, false, true);
+ controller.gainLife(count, game, source);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/k/KayasWrath.java b/Mage.Sets/src/mage/cards/k/KayasWrath.java
new file mode 100644
index 00000000000..e1019f9e0aa
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/k/KayasWrath.java
@@ -0,0 +1,69 @@
+package mage.cards.k;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class KayasWrath extends CardImpl {
+
+ public KayasWrath(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{W}{W}{B}{B}");
+
+ // Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way.
+ this.getSpellAbility().addEffect(new KayasWrathEffect());
+ }
+
+ private KayasWrath(final KayasWrath card) {
+ super(card);
+ }
+
+ @Override
+ public KayasWrath copy() {
+ return new KayasWrath(this);
+ }
+}
+
+class KayasWrathEffect extends OneShotEffect {
+
+ KayasWrathEffect() {
+ super(Outcome.Benefit);
+ staticText = "Destroy all creatures. You gain life equal to the number of " +
+ "creatures you controlled that were destroyed this way.";
+ }
+
+ private KayasWrathEffect(final KayasWrathEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KayasWrathEffect copy() {
+ return new KayasWrathEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ int counter = 0;
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(
+ StaticFilters.FILTER_PERMANENT_CREATURE,
+ source.getControllerId(), source.getSourceId(), game
+ )) {
+ boolean isMine = permanent != null && permanent.isControlledBy(source.getControllerId());
+ if (permanent.destroy(source.getSourceId(), game, false) && isMine) {
+ counter++;
+ }
+ }
+ return new GainLifeEffect(counter).apply(game, source);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/k/KederektLeviathan.java b/Mage.Sets/src/mage/cards/k/KederektLeviathan.java
index cf0e32d9b95..b394b26e44a 100644
--- a/Mage.Sets/src/mage/cards/k/KederektLeviathan.java
+++ b/Mage.Sets/src/mage/cards/k/KederektLeviathan.java
@@ -22,7 +22,7 @@ public final class KederektLeviathan extends CardImpl {
private static final FilterNonlandPermanent filter = new FilterNonlandPermanent("all other nonland permanents");
static{
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public KederektLeviathan(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KeeperOfTheLens.java b/Mage.Sets/src/mage/cards/k/KeeperOfTheLens.java
index bffa37ce840..87ec804db36 100644
--- a/Mage.Sets/src/mage/cards/k/KeeperOfTheLens.java
+++ b/Mage.Sets/src/mage/cards/k/KeeperOfTheLens.java
@@ -53,7 +53,7 @@ class KeeperOfTheLensLookFaceDownAbility extends ActivatedAbilityImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("face down creature you don't control");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
filter.add(new ControllerPredicate(TargetController.NOT_YOU));
}
diff --git a/Mage.Sets/src/mage/cards/k/KeeperOfTheMind.java b/Mage.Sets/src/mage/cards/k/KeeperOfTheMind.java
index 087fe044f66..eda3e048b1e 100644
--- a/Mage.Sets/src/mage/cards/k/KeeperOfTheMind.java
+++ b/Mage.Sets/src/mage/cards/k/KeeperOfTheMind.java
@@ -27,7 +27,6 @@
*/
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -35,32 +34,25 @@ import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.filter.FilterOpponent;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
-import mage.target.common.TargetOpponent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public class KeeperOfTheMind extends CardImpl {
- public final UUID originalId;
- private static final FilterOpponent filter = new FilterOpponent();
-
- static {
- filter.add(new KeeperOfTheMindPredicate());
- }
-
-
public KeeperOfTheMind(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{U}");
@@ -74,28 +66,12 @@ public class KeeperOfTheMind extends CardImpl {
effect.setText("Choose target opponent who had at least two more cards in hand than you did as you activated this ability. Draw a card.");
Ability ability = new SimpleActivatedAbility(effect, new ManaCostsImpl("{U}"));
ability.addCost(new TapSourceCost());
- ability.addTarget(new TargetOpponent());
+ ability.setTargetAdjuster(KeeperOfTheMindAdjuster.instance);
this.addAbility(ability);
- originalId = ability.getOriginalId();
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- Player activePlayer = game.getPlayer(game.getActivePlayerId());
- if (activePlayer != null) {
- ability.getTargets().clear();
- TargetPlayer target = new TargetPlayer(1, 1, false, filter);
- target.setTargetController(activePlayer.getId());
- ability.getTargets().add(target);
- }
- }
}
public KeeperOfTheMind(final KeeperOfTheMind card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -104,6 +80,28 @@ public class KeeperOfTheMind extends CardImpl {
}
}
+enum KeeperOfTheMindAdjuster implements TargetAdjuster {
+ instance;
+
+ private static final FilterOpponent filter = new FilterOpponent();
+
+ static {
+ filter.add(new KeeperOfTheMindPredicate());
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player activePlayer = game.getPlayer(game.getActivePlayerId());
+ if (activePlayer == null) {
+ return;
+ }
+ ability.getTargets().clear();
+ TargetPlayer target = new TargetPlayer(1, 1, false, filter);
+ target.setTargetController(activePlayer.getId());
+ ability.addTarget(target);
+ }
+}
+
class KeeperOfTheMindPredicate implements ObjectSourcePlayerPredicate> {
@Override
diff --git a/Mage.Sets/src/mage/cards/k/KeeperOfTheNineGales.java b/Mage.Sets/src/mage/cards/k/KeeperOfTheNineGales.java
index 6fd6128be87..9ced360768d 100644
--- a/Mage.Sets/src/mage/cards/k/KeeperOfTheNineGales.java
+++ b/Mage.Sets/src/mage/cards/k/KeeperOfTheNineGales.java
@@ -30,7 +30,7 @@ public final class KeeperOfTheNineGales extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped Birds you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.BIRD));
}
diff --git a/Mage.Sets/src/mage/cards/k/KeldonBattlewagon.java b/Mage.Sets/src/mage/cards/k/KeldonBattlewagon.java
index 65455f5a3f4..091a1b32927 100644
--- a/Mage.Sets/src/mage/cards/k/KeldonBattlewagon.java
+++ b/Mage.Sets/src/mage/cards/k/KeldonBattlewagon.java
@@ -40,7 +40,7 @@ public final class KeldonBattlewagon extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public KeldonBattlewagon(UUID ownerId, CardSetInfo setInfo) {
@@ -90,7 +90,7 @@ class KeldonBattlewagonCost extends CostImpl {
@Override
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) {
if (target.choose(Outcome.Tap, controllerId, sourceId, game)) {
- for (UUID targetId: (List)target.getTargets()) {
+ for (UUID targetId: target.getTargets()) {
Permanent permanent = game.getPermanent(targetId);
if (permanent == null)
return false;
diff --git a/Mage.Sets/src/mage/cards/k/KeldonBerserker.java b/Mage.Sets/src/mage/cards/k/KeldonBerserker.java
index f2cf9c195ce..62b80407f09 100644
--- a/Mage.Sets/src/mage/cards/k/KeldonBerserker.java
+++ b/Mage.Sets/src/mage/cards/k/KeldonBerserker.java
@@ -26,7 +26,7 @@ public final class KeldonBerserker extends CardImpl {
private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("untapped lands");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public KeldonBerserker(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KeldonTwilight.java b/Mage.Sets/src/mage/cards/k/KeldonTwilight.java
index 2931cd68459..e5a6468735b 100644
--- a/Mage.Sets/src/mage/cards/k/KeldonTwilight.java
+++ b/Mage.Sets/src/mage/cards/k/KeldonTwilight.java
@@ -54,7 +54,7 @@ class KeldonTwilightCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
if (watcher != null) {
return watcher.getAttackedThisTurnCreatures().isEmpty();
}
diff --git a/Mage.Sets/src/mage/cards/k/KeranosGodOfStorms.java b/Mage.Sets/src/mage/cards/k/KeranosGodOfStorms.java
index 3590d941232..fbcec941d28 100644
--- a/Mage.Sets/src/mage/cards/k/KeranosGodOfStorms.java
+++ b/Mage.Sets/src/mage/cards/k/KeranosGodOfStorms.java
@@ -94,7 +94,7 @@ class KeranosGodOfStormsTriggeredAbility extends TriggeredAbilityImpl {
if (event.getPlayerId().equals(this.getControllerId())) {
if (game.isActivePlayer(this.getControllerId())) {
CardsAmountDrawnThisTurnWatcher watcher =
- (CardsAmountDrawnThisTurnWatcher) game.getState().getWatchers().get(CardsAmountDrawnThisTurnWatcher.class.getSimpleName());
+ game.getState().getWatcher(CardsAmountDrawnThisTurnWatcher.class);
if (watcher != null && watcher.getAmountCardsDrawn(event.getPlayerId()) != 1) {
return false;
}
diff --git a/Mage.Sets/src/mage/cards/k/KessDissidentMage.java b/Mage.Sets/src/mage/cards/k/KessDissidentMage.java
index bc3cc94473f..f8c4011548a 100644
--- a/Mage.Sets/src/mage/cards/k/KessDissidentMage.java
+++ b/Mage.Sets/src/mage/cards/k/KessDissidentMage.java
@@ -1,14 +1,15 @@
-
package mage.cards.k;
-import java.util.Optional;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
import java.util.UUID;
import mage.MageInt;
+import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.AsThoughEffectImpl;
-import mage.abilities.effects.ContinuousEffect;
-import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.keyword.FlashbackAbility;
import mage.abilities.keyword.FlyingAbility;
@@ -18,22 +19,16 @@ import mage.cards.CardSetInfo;
import mage.constants.AsThoughEffectType;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.Layer;
import mage.constants.Outcome;
-import mage.constants.SubLayer;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.WatcherScope;
import mage.constants.Zone;
-import mage.filter.FilterCard;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.game.stack.Spell;
import mage.players.Player;
-import mage.target.targetpointer.FixedTarget;
import mage.watchers.Watcher;
/**
@@ -55,7 +50,9 @@ public final class KessDissidentMage extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// During each of your turns, you may cast an instant or sorcery card from your graveyard. If a card cast this way would be put into your graveyard this turn, exile it instead.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new KessDissidentMageContinuousEffect()), new KessDissidentMageWatcher());
+ Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new KessDissidentMageCastFromGraveyardEffect());
+ ability.addEffect(new KessDissidentMageReplacementEffect());
+ this.addAbility(ability, new KessDissidentMageWatcher());
}
public KessDissidentMage(final KessDissidentMage card) {
@@ -68,56 +65,11 @@ public final class KessDissidentMage extends CardImpl {
}
}
-class KessDissidentMageContinuousEffect extends ContinuousEffectImpl {
-
- private static final FilterCard filter = new FilterCard("Instant or sorcery spell");
-
- static {
- filter.add(Predicates.or(
- new CardTypePredicate(CardType.INSTANT),
- new CardTypePredicate(CardType.SORCERY)
- ));
- }
-
- KessDissidentMageContinuousEffect() {
- super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit);
- staticText = "During each of your turns, you may cast an instant or sorcery card from your graveyard. If a card cast this way would be put into your graveyard, exile it instead";
- }
-
- KessDissidentMageContinuousEffect(final KessDissidentMageContinuousEffect effect) {
- super(effect);
- }
-
- @Override
- public KessDissidentMageContinuousEffect copy() {
- return new KessDissidentMageContinuousEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if (player != null) {
- if (!game.isActivePlayer(player.getId())) {
- return false;
- }
- for (Card card : player.getGraveyard().getCards(filter, game)) {
- ContinuousEffect effect = new KessDissidentMageCastFromGraveyardEffect();
- effect.setTargetPointer(new FixedTarget(card.getId()));
- game.addEffect(effect, source);
- effect = new KessDissidentMageReplacementEffect(card.getId());
- game.addEffect(effect, source);
- }
- return true;
- }
- return false;
- }
-}
-
class KessDissidentMageCastFromGraveyardEffect extends AsThoughEffectImpl {
KessDissidentMageCastFromGraveyardEffect() {
- super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
- staticText = "You may cast an instant or sorcery card from your graveyard";
+ super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.Benefit);
+ staticText = "During each of your turns, you may cast an instant or sorcery card from your graveyard";
}
KessDissidentMageCastFromGraveyardEffect(final KessDissidentMageCastFromGraveyardEffect effect) {
@@ -136,14 +88,13 @@ class KessDissidentMageCastFromGraveyardEffect extends AsThoughEffectImpl {
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
- if (objectId.equals(getTargetPointer().getFirst(game, source))) {
- if (affectedControllerId.equals(source.getControllerId())) {
- if (game.isActivePlayer(source.getControllerId())) {
- KessDissidentMageWatcher watcher = (KessDissidentMageWatcher) game.getState().getWatchers().get(KessDissidentMageWatcher.class.getSimpleName(), source.getSourceId());
- if (!(source instanceof FlashbackAbility)) {
- return !watcher.isAbilityUsed();
- }
- }
+ if (!(source instanceof FlashbackAbility) && affectedControllerId.equals(source.getControllerId()) && game.isActivePlayer(source.getControllerId())) {
+ Card card = game.getCard(objectId);
+ if (card != null && (card.isInstant() || card.isSorcery())
+ && game.getState().getZone(objectId).equals(Zone.GRAVEYARD)) {
+ // check if not already a card was cast this turn with this ability
+ KessDissidentMageWatcher watcher = game.getState().getWatcher(KessDissidentMageWatcher.class);
+ return watcher != null && !watcher.isAbilityUsed(new MageObjectReference(source.getSourceId(), game));
}
}
return false;
@@ -152,17 +103,13 @@ class KessDissidentMageCastFromGraveyardEffect extends AsThoughEffectImpl {
class KessDissidentMageReplacementEffect extends ReplacementEffectImpl {
- private final UUID cardId;
-
- KessDissidentMageReplacementEffect(UUID cardId) {
- super(Duration.EndOfTurn, Outcome.Exile);
- this.cardId = cardId;
+ KessDissidentMageReplacementEffect() {
+ super(Duration.EndOfGame, Outcome.Exile);
staticText = "If a card cast this way would be put into your graveyard, exile it instead";
}
KessDissidentMageReplacementEffect(final KessDissidentMageReplacementEffect effect) {
super(effect);
- this.cardId = effect.cardId;
}
@Override
@@ -173,9 +120,9 @@ class KessDissidentMageReplacementEffect extends ReplacementEffectImpl {
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player controller = game.getPlayer(source.getControllerId());
- Card card = game.getCard(this.cardId);
+ Card card = game.getCard(event.getTargetId());
if (controller != null && card != null) {
- controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.STACK, true);
+ controller.moveCards(card, Zone.EXILED, source, game);
return true;
}
return false;
@@ -189,31 +136,39 @@ class KessDissidentMageReplacementEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
- return zEvent.getToZone() == Zone.GRAVEYARD
- && zEvent.getTargetId().equals(this.cardId);
+ if (zEvent.getToZone() == Zone.GRAVEYARD) {
+ KessDissidentMageWatcher watcher = game.getState().getWatcher(KessDissidentMageWatcher.class);
+ if (watcher != null && source.getSourceId().equals(watcher.spellCastWasAllowedBy(new MageObjectReference(event.getTargetId(), game)))) {
+ return true;
+ }
+ }
+ return false;
}
}
class KessDissidentMageWatcher extends Watcher {
- boolean abilityUsed = false;
+ // Which kess object did cast which spell from graveyard
+ private final Set allowingObjects = new HashSet<>();
+ private final Map castSpells = new HashMap<>();
KessDissidentMageWatcher() {
- super(KessDissidentMageWatcher.class.getSimpleName(), WatcherScope.CARD);
+ super(KessDissidentMageWatcher.class, WatcherScope.GAME);
}
KessDissidentMageWatcher(final KessDissidentMageWatcher watcher) {
super(watcher);
- this.abilityUsed = watcher.abilityUsed;
+ this.allowingObjects.addAll(watcher.allowingObjects);
+ this.castSpells.putAll(watcher.castSpells);
}
@Override
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.isInstant() || spell.isSorcery()) {
- Optional source = game.getAbility(event.getSourceId(), event.getSourceId());
- abilityUsed = true;
+ if (null != event.getAdditionalReference() && spell.isInstant() || spell.isSorcery()) {
+ allowingObjects.add(event.getAdditionalReference());
+ castSpells.put(new MageObjectReference(spell.getSourceId(), game), event.getAdditionalReference().getSourceId());
}
}
}
@@ -226,10 +181,15 @@ class KessDissidentMageWatcher extends Watcher {
@Override
public void reset() {
super.reset();
- abilityUsed = false;
+ allowingObjects.clear();
}
- public boolean isAbilityUsed() {
- return abilityUsed;
+ public boolean isAbilityUsed(MageObjectReference mor) {
+ return allowingObjects.contains(mor);
}
+
+ public UUID spellCastWasAllowedBy(MageObjectReference mor) {
+ return castSpells.getOrDefault(mor, null);
+ }
+
}
diff --git a/Mage.Sets/src/mage/cards/k/KessigWolfRun.java b/Mage.Sets/src/mage/cards/k/KessigWolfRun.java
index 87a7e9e7ddb..3dfb9a59d9f 100644
--- a/Mage.Sets/src/mage/cards/k/KessigWolfRun.java
+++ b/Mage.Sets/src/mage/cards/k/KessigWolfRun.java
@@ -33,7 +33,7 @@ public final class KessigWolfRun extends CardImpl {
// {X}{R}{G}, {T}: Target creature gets +X/+0 and gains trample until end of turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{X}{R}{G}"));
ability.addCost(new TapSourceCost());
- ability.addEffect(new BoostTargetEffect(new ManacostVariableValue(), new StaticValue(0), Duration.EndOfTurn));
+ ability.addEffect(new BoostTargetEffect(ManacostVariableValue.instance, new StaticValue(0), Duration.EndOfTurn));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/k/KestiaTheCultivator.java b/Mage.Sets/src/mage/cards/k/KestiaTheCultivator.java
index 18f4dfcdc3b..ab0b2b932a4 100644
--- a/Mage.Sets/src/mage/cards/k/KestiaTheCultivator.java
+++ b/Mage.Sets/src/mage/cards/k/KestiaTheCultivator.java
@@ -33,7 +33,7 @@ public final class KestiaTheCultivator extends CardImpl {
static {
filter.add(Predicates.or(
- new EnchantedPredicate(),
+ EnchantedPredicate.instance,
new CardTypePredicate(CardType.ENCHANTMENT)
));
filter.add(new ControllerPredicate(TargetController.YOU));
diff --git a/Mage.Sets/src/mage/cards/k/KhabalGhoul.java b/Mage.Sets/src/mage/cards/k/KhabalGhoul.java
index 28fc3288234..06a0fe4e253 100644
--- a/Mage.Sets/src/mage/cards/k/KhabalGhoul.java
+++ b/Mage.Sets/src/mage/cards/k/KhabalGhoul.java
@@ -28,7 +28,7 @@ public final class KhabalGhoul extends CardImpl {
// At the beginning of each end step, put a +1/+1 counter on Khabal Ghoul for each creature that died this turn.
this.addAbility(new BeginningOfEndStepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(),
- new CreaturesDiedThisTurnCount(), true), TargetController.ANY, false), new CreaturesDiedWatcher());
+ CreaturesDiedThisTurnCount.instance, true), TargetController.ANY, false), new CreaturesDiedWatcher());
}
public KhabalGhoul(final KhabalGhoul card) {
diff --git a/Mage.Sets/src/mage/cards/k/KheruDreadmaw.java b/Mage.Sets/src/mage/cards/k/KheruDreadmaw.java
index 270eaeacf41..2c5328e31ac 100644
--- a/Mage.Sets/src/mage/cards/k/KheruDreadmaw.java
+++ b/Mage.Sets/src/mage/cards/k/KheruDreadmaw.java
@@ -37,7 +37,7 @@ public final class KheruDreadmaw extends CardImpl {
this.addAbility(DefenderAbility.getInstance());
// {1}{G}, Sacrifice another creature: You gain life equal to the sacrificed creature's toughness.
- Effect effect = new GainLifeEffect(new SacrificeCostCreaturesToughness());
+ Effect effect = new GainLifeEffect(SacrificeCostCreaturesToughness.instance);
effect.setText("You gain life equal to the sacrificed creature's toughness");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl<>("{1}{G}"));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)));
diff --git a/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java b/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java
index 853f920dd6c..075f42fd6ba 100644
--- a/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java
+++ b/Mage.Sets/src/mage/cards/k/KheruSpellsnatcher.java
@@ -78,7 +78,7 @@ class KheruSpellsnatcherEffect extends OneShotEffect {
StackObject stackObject = game.getStack().getStackObject(objectId);
if (stackObject != null
&& game.getStack().counter(targetPointer.getFirst(game, source), source.getSourceId(), game, Zone.EXILED, false, ZoneDetail.NONE)) {
- if (!((Spell) stackObject).isCopy()) {
+ if (!stackObject.isCopy()) {
MageObject card = game.getObject(stackObject.getSourceId());
if (card instanceof Card) {
((Card) card).moveToZone(Zone.EXILED, sourceId, game, true);
diff --git a/Mage.Sets/src/mage/cards/k/KiAdiMundi.java b/Mage.Sets/src/mage/cards/k/KiAdiMundi.java
index 6640a431129..63d42793a71 100644
--- a/Mage.Sets/src/mage/cards/k/KiAdiMundi.java
+++ b/Mage.Sets/src/mage/cards/k/KiAdiMundi.java
@@ -27,7 +27,7 @@ public final class KiAdiMundi extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/k/KillSwitch.java b/Mage.Sets/src/mage/cards/k/KillSwitch.java
index 928d3f91e74..7c3d8248b81 100644
--- a/Mage.Sets/src/mage/cards/k/KillSwitch.java
+++ b/Mage.Sets/src/mage/cards/k/KillSwitch.java
@@ -29,7 +29,7 @@ public final class KillSwitch extends CardImpl {
//static {
- // filter.add(new AnotherPredicate());
+ // filter.add(AnotherPredicate.instance);
// }
public KillSwitch(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KillingGlare.java b/Mage.Sets/src/mage/cards/k/KillingGlare.java
index 5382bf5557c..16704117adb 100644
--- a/Mage.Sets/src/mage/cards/k/KillingGlare.java
+++ b/Mage.Sets/src/mage/cards/k/KillingGlare.java
@@ -1,9 +1,7 @@
package mage.cards.k;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -13,21 +11,21 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class KillingGlare extends CardImpl {
- public KillingGlare (UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{B}");
-
+ public KillingGlare(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{B}");
// Destroy target creature with power X or less.
- this.getSpellAbility().addEffect(new DestroyTargetEffect());
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with power X or less")));
-
+ this.getSpellAbility().addEffect(new DestroyTargetEffect("destroy target creature with power X or less"));
+ this.getSpellAbility().setTargetAdjuster(KillingGlareAdjuster.instance);
}
public KillingGlare(final KillingGlare card) {
@@ -35,19 +33,20 @@ public final class KillingGlare extends CardImpl {
}
@Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- int xValue = ability.getManaCostsToPay().getX();
- ability.getTargets().clear();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power " + xValue + " or less");
- filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1));
- ability.addTarget(new TargetCreaturePermanent(filter));
- }
- }
-
-
- @Override
- public KillingGlare copy() {
+ public KillingGlare copy() {
return new KillingGlare(this);
}
}
+
+enum KillingGlareAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int xValue = ability.getManaCostsToPay().getX();
+ ability.getTargets().clear();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with power " + xValue + " or less");
+ filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, xValue + 1));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/k/KillingWave.java b/Mage.Sets/src/mage/cards/k/KillingWave.java
index 9027d41357a..0f146aac56d 100644
--- a/Mage.Sets/src/mage/cards/k/KillingWave.java
+++ b/Mage.Sets/src/mage/cards/k/KillingWave.java
@@ -61,7 +61,7 @@ class KillingWaveEffect extends OneShotEffect {
return false;
}
- int amount = (new ManacostVariableValue()).calculate(game, source, this);
+ int amount = (ManacostVariableValue.instance).calculate(game, source, this);
if (amount > 0) {
List sacrifices = new LinkedList<>();
Map lifePaidAmounts = new HashMap<>();
diff --git a/Mage.Sets/src/mage/cards/k/KingsAssassin.java b/Mage.Sets/src/mage/cards/k/KingsAssassin.java
index 7651353f168..52dff0cd15c 100644
--- a/Mage.Sets/src/mage/cards/k/KingsAssassin.java
+++ b/Mage.Sets/src/mage/cards/k/KingsAssassin.java
@@ -26,7 +26,7 @@ public final class KingsAssassin extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public KingsAssassin(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KiorasFollower.java b/Mage.Sets/src/mage/cards/k/KiorasFollower.java
index 05417a3b96b..d6a0b2eb138 100644
--- a/Mage.Sets/src/mage/cards/k/KiorasFollower.java
+++ b/Mage.Sets/src/mage/cards/k/KiorasFollower.java
@@ -25,7 +25,7 @@ public final class KiorasFollower extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("another target permanent");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public KiorasFollower(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}{U}");
diff --git a/Mage.Sets/src/mage/cards/k/KiraGreatGlassSpinner.java b/Mage.Sets/src/mage/cards/k/KiraGreatGlassSpinner.java
index 97a195a7a91..246e39bfe4b 100644
--- a/Mage.Sets/src/mage/cards/k/KiraGreatGlassSpinner.java
+++ b/Mage.Sets/src/mage/cards/k/KiraGreatGlassSpinner.java
@@ -82,7 +82,7 @@ class KiraGreatGlassSpinnerAbility extends TriggeredAbilityImpl {
if (event.getTargetId().equals(this.getSourceId())) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.isCreature()) {
- NumberOfTimesPermanentTargetedATurnWatcher watcher = (NumberOfTimesPermanentTargetedATurnWatcher) game.getState().getWatchers().get(NumberOfTimesPermanentTargetedATurnWatcher.class.getSimpleName());
+ NumberOfTimesPermanentTargetedATurnWatcher watcher = game.getState().getWatcher(NumberOfTimesPermanentTargetedATurnWatcher.class);
if (watcher != null && watcher.notMoreThanOnceTargetedThisTurn(permanent, game)) {
for (Effect effect : getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
diff --git a/Mage.Sets/src/mage/cards/k/KitsuneLoreweaver.java b/Mage.Sets/src/mage/cards/k/KitsuneLoreweaver.java
index 8724a8582e7..0b71aea401f 100644
--- a/Mage.Sets/src/mage/cards/k/KitsuneLoreweaver.java
+++ b/Mage.Sets/src/mage/cards/k/KitsuneLoreweaver.java
@@ -30,7 +30,7 @@ public final class KitsuneLoreweaver extends CardImpl {
this.toughness = new MageInt(1);
// {1}{W}: Kitsune Loreweaver gets +0/+X until end of turn, where X is the number of cards in your hand.
- Effect effect = new BoostSourceEffect(new StaticValue(0), new CardsInControllerHandCount(), Duration.EndOfTurn, true);
+ Effect effect = new BoostSourceEffect(new StaticValue(0), CardsInControllerHandCount.instance, Duration.EndOfTurn, true);
effect.setText("{this} gets +0/+X until end of turn, where X is the number of cards in your hand");
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}{W}")));
}
diff --git a/Mage.Sets/src/mage/cards/k/KiyomaroFirstToStand.java b/Mage.Sets/src/mage/cards/k/KiyomaroFirstToStand.java
index f352b996234..0349e3bd190 100644
--- a/Mage.Sets/src/mage/cards/k/KiyomaroFirstToStand.java
+++ b/Mage.Sets/src/mage/cards/k/KiyomaroFirstToStand.java
@@ -43,7 +43,7 @@ public final class KiyomaroFirstToStand extends CardImpl {
this.toughness = new MageInt(0);
// Kiyomaro, First to Stand's power and toughness are each equal to the number of cards in your hand.
- DynamicValue xValue= new CardsInControllerHandCount();
+ DynamicValue xValue= CardsInControllerHandCount.instance;
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(xValue, Duration.EndOfGame)));
// As long as you have four or more cards in hand, Kiyomaro has vigilance.
diff --git a/Mage.Sets/src/mage/cards/k/KjeldoranRoyalGuard.java b/Mage.Sets/src/mage/cards/k/KjeldoranRoyalGuard.java
index fc7d7bbaa5f..36c340c81c9 100644
--- a/Mage.Sets/src/mage/cards/k/KjeldoranRoyalGuard.java
+++ b/Mage.Sets/src/mage/cards/k/KjeldoranRoyalGuard.java
@@ -55,7 +55,7 @@ class KjeldoranRoyalGuardEffect extends ReplacementEffectImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("unblocked creatures");
static {
- filter.add(new UnblockedPredicate());
+ filter.add(UnblockedPredicate.instance);
}
KjeldoranRoyalGuardEffect() {
diff --git a/Mage.Sets/src/mage/cards/k/KnightExemplar.java b/Mage.Sets/src/mage/cards/k/KnightExemplar.java
index 17b9e9f765e..9c069322b69 100644
--- a/Mage.Sets/src/mage/cards/k/KnightExemplar.java
+++ b/Mage.Sets/src/mage/cards/k/KnightExemplar.java
@@ -43,7 +43,7 @@ public final class KnightExemplar extends CardImpl {
// Other Knight creatures you control get +1/+1 and are indestructible.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true)));
FilterCreaturePermanent indestructibleFilter = filter.copy();
- indestructibleFilter.add(new AnotherPredicate());
+ indestructibleFilter.add(AnotherPredicate.instance);
indestructibleFilter.add(new ControllerPredicate(TargetController.YOU));
indestructibleFilter.setMessage("Other Knight creatures you control");
Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, indestructibleFilter, false);
diff --git a/Mage.Sets/src/mage/cards/k/KnightOfNewAlara.java b/Mage.Sets/src/mage/cards/k/KnightOfNewAlara.java
index 85348bfd94f..09567e76204 100644
--- a/Mage.Sets/src/mage/cards/k/KnightOfNewAlara.java
+++ b/Mage.Sets/src/mage/cards/k/KnightOfNewAlara.java
@@ -55,7 +55,7 @@ class KnightOfNewAlaraEffect extends ContinuousEffectImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public KnightOfNewAlaraEffect() {
diff --git a/Mage.Sets/src/mage/cards/k/KnightOfSorrows.java b/Mage.Sets/src/mage/cards/k/KnightOfSorrows.java
new file mode 100644
index 00000000000..7bf0cabd447
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/k/KnightOfSorrows.java
@@ -0,0 +1,42 @@
+package mage.cards.k;
+
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect;
+import mage.abilities.keyword.AfterlifeAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class KnightOfSorrows extends CardImpl {
+
+ public KnightOfSorrows(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.KNIGHT);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Knight of Sorrows can block an additional creature each combat.
+ this.addAbility(new SimpleStaticAbility(new CanBlockAdditionalCreatureEffect()));
+
+ // Afterlife 1
+ this.addAbility(new AfterlifeAbility(1));
+ }
+
+ private KnightOfSorrows(final KnightOfSorrows card) {
+ super(card);
+ }
+
+ @Override
+ public KnightOfSorrows copy() {
+ return new KnightOfSorrows(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/k/KnightOfTheLastBreath.java b/Mage.Sets/src/mage/cards/k/KnightOfTheLastBreath.java
new file mode 100644
index 00000000000..5ac5c3ea80d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/k/KnightOfTheLastBreath.java
@@ -0,0 +1,64 @@
+package mage.cards.k;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.AfterlifeAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.filter.predicate.permanent.TokenPredicate;
+import mage.game.permanent.token.WhiteBlackSpiritToken;
+import mage.target.common.TargetControlledPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class KnightOfTheLastBreath extends CardImpl {
+
+ private static final FilterControlledPermanent filter
+ = new FilterControlledCreaturePermanent("another nontoken creature");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.not(TokenPredicate.instance));
+ }
+
+ public KnightOfTheLastBreath(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}{B}");
+
+ this.subtype.add(SubType.GIANT);
+ this.subtype.add(SubType.KNIGHT);
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // {3}, Sacrifice another nontoken creature: Create a 1/1 white and black spirit creature token with flying.
+ Ability ability = new SimpleActivatedAbility(
+ new CreateTokenEffect(new WhiteBlackSpiritToken()), new GenericManaCost(3)
+ );
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
+ this.addAbility(ability);
+
+ // Afterlife 3
+ this.addAbility(new AfterlifeAbility(3));
+ }
+
+ private KnightOfTheLastBreath(final KnightOfTheLastBreath card) {
+ super(card);
+ }
+
+ @Override
+ public KnightOfTheLastBreath copy() {
+ return new KnightOfTheLastBreath(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/k/KnightsOfTheBlackRose.java b/Mage.Sets/src/mage/cards/k/KnightsOfTheBlackRose.java
index 482ed9506d0..289dd51febd 100644
--- a/Mage.Sets/src/mage/cards/k/KnightsOfTheBlackRose.java
+++ b/Mage.Sets/src/mage/cards/k/KnightsOfTheBlackRose.java
@@ -85,7 +85,7 @@ class BecomesMonarchTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkInterveningIfClause(Game game) {
- MonarchAtTurnStartWatcher watcher = (MonarchAtTurnStartWatcher) game.getState().getWatchers().get(MonarchAtTurnStartWatcher.class.getSimpleName());
+ MonarchAtTurnStartWatcher watcher = game.getState().getWatcher(MonarchAtTurnStartWatcher.class);
return watcher != null && isControlledBy(watcher.getMonarchIdAtTurnStart());
}
@@ -105,7 +105,7 @@ class MonarchAtTurnStartWatcher extends Watcher {
private UUID monarchIdAtTurnStart;
public MonarchAtTurnStartWatcher() {
- super(MonarchAtTurnStartWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(MonarchAtTurnStartWatcher.class, WatcherScope.GAME);
}
public MonarchAtTurnStartWatcher(final MonarchAtTurnStartWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/k/KnollspineDragon.java b/Mage.Sets/src/mage/cards/k/KnollspineDragon.java
index b1a35e8e063..10124eefd8d 100644
--- a/Mage.Sets/src/mage/cards/k/KnollspineDragon.java
+++ b/Mage.Sets/src/mage/cards/k/KnollspineDragon.java
@@ -68,7 +68,7 @@ class KnollspineDragonEffect extends OneShotEffect {
if (controller != null) {
new DiscardHandControllerEffect().apply(game, source);
if (targetOpponent != null) {
- AmountOfDamageAPlayerReceivedThisTurnWatcher watcher = (AmountOfDamageAPlayerReceivedThisTurnWatcher) game.getState().getWatchers().get(AmountOfDamageAPlayerReceivedThisTurnWatcher.class.getSimpleName());
+ AmountOfDamageAPlayerReceivedThisTurnWatcher watcher = game.getState().getWatcher(AmountOfDamageAPlayerReceivedThisTurnWatcher.class);
if (watcher != null) {
int drawAmount = watcher.getAmountOfDamageReceivedThisTurn(targetOpponent.getId());
controller.drawCards(drawAmount, game);
diff --git a/Mage.Sets/src/mage/cards/k/KnollspineInvocation.java b/Mage.Sets/src/mage/cards/k/KnollspineInvocation.java
index 7da7179e698..8b2a45c4c39 100644
--- a/Mage.Sets/src/mage/cards/k/KnollspineInvocation.java
+++ b/Mage.Sets/src/mage/cards/k/KnollspineInvocation.java
@@ -32,7 +32,7 @@ public final class KnollspineInvocation extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{R}{R}");
// {X}, Discard a card with converted mana cost X: Knollspine Invocation deals X damage to any target.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue(), true), new ManaCostsImpl<>("{X}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.instance, true), new ManaCostsImpl<>("{X}"));
ability.addCost(new DiscardTargetCost(new TargetCardInHand(filter)));
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/k/KnotvinePaladin.java b/Mage.Sets/src/mage/cards/k/KnotvinePaladin.java
index 7ec1c739e3e..29736510509 100644
--- a/Mage.Sets/src/mage/cards/k/KnotvinePaladin.java
+++ b/Mage.Sets/src/mage/cards/k/KnotvinePaladin.java
@@ -23,7 +23,7 @@ public final class KnotvinePaladin extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
diff --git a/Mage.Sets/src/mage/cards/k/KorozdaGuildmage.java b/Mage.Sets/src/mage/cards/k/KorozdaGuildmage.java
index 4959961c930..872488a84d0 100644
--- a/Mage.Sets/src/mage/cards/k/KorozdaGuildmage.java
+++ b/Mage.Sets/src/mage/cards/k/KorozdaGuildmage.java
@@ -34,7 +34,7 @@ public final class KorozdaGuildmage extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public KorozdaGuildmage(UUID ownerId, CardSetInfo setInfo) {
@@ -53,7 +53,7 @@ public final class KorozdaGuildmage extends CardImpl {
this.addAbility(ability);
// {2}{B}{G}, Sacrifice a nontoken creature: create X 1/1 green Saproling creature tokens, where X is the sacrificed creature's toughness.
- ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken(),new SacrificeCostCreaturesToughness()),new ManaCostsImpl("{2}{B}{G}"));
+ ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new SaprolingToken(),SacrificeCostCreaturesToughness.instance),new ManaCostsImpl("{2}{B}{G}"));
ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1,filter, true)));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/k/KoskunFalls.java b/Mage.Sets/src/mage/cards/k/KoskunFalls.java
index 70d378577a5..d285532a0f1 100644
--- a/Mage.Sets/src/mage/cards/k/KoskunFalls.java
+++ b/Mage.Sets/src/mage/cards/k/KoskunFalls.java
@@ -29,7 +29,7 @@ public final class KoskunFalls extends CardImpl {
private static final FilterControlledCreaturePermanent filterCreature = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filterCreature.add(Predicates.not(new TappedPredicate()));
+ filterCreature.add(Predicates.not(TappedPredicate.instance));
}
public KoskunFalls(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KozileksSentinel.java b/Mage.Sets/src/mage/cards/k/KozileksSentinel.java
index 4cbaef9e8f5..9399ec74d29 100644
--- a/Mage.Sets/src/mage/cards/k/KozileksSentinel.java
+++ b/Mage.Sets/src/mage/cards/k/KozileksSentinel.java
@@ -23,7 +23,7 @@ public final class KozileksSentinel extends CardImpl {
private static final FilterSpell filterSpell = new FilterSpell("a colorless spell");
static {
- filterSpell.add(new ColorlessPredicate());
+ filterSpell.add(ColorlessPredicate.instance);
}
public KozileksSentinel(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KrarksThumb.java b/Mage.Sets/src/mage/cards/k/KrarksThumb.java
index 3acb3bde5aa..d5698826939 100644
--- a/Mage.Sets/src/mage/cards/k/KrarksThumb.java
+++ b/Mage.Sets/src/mage/cards/k/KrarksThumb.java
@@ -1,7 +1,6 @@
package mage.cards.k;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ReplacementEffectImpl;
@@ -9,25 +8,28 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
+import mage.game.events.FlipCoinEvent;
import mage.game.events.GameEvent;
import mage.players.Player;
+import mage.util.CardUtil;
import mage.util.RandomUtil;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class KrarksThumb extends CardImpl {
public KrarksThumb(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
addSuperType(SuperType.LEGENDARY);
// If you would flip a coin, instead flip two coins and ignore one.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new KrarksThumbEffect()));
}
- public KrarksThumb(final KrarksThumb card) {
+ private KrarksThumb(final KrarksThumb card) {
super(card);
}
@@ -44,26 +46,30 @@ class KrarksThumbEffect extends ReplacementEffectImpl {
staticText = "If you would flip a coin, instead flip two coins and ignore one";
}
- KrarksThumbEffect(final KrarksThumbEffect effect) {
+ private KrarksThumbEffect(final KrarksThumbEffect effect) {
super(effect);
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player player = game.getPlayer(event.getPlayerId());
- if (player != null) {
- // because second flip is ignored it may not be done by the player method
- boolean secondCoinFlip = RandomUtil.nextBoolean();
- if (!game.isSimulation()) {
- game.informPlayers("[Flip a coin] " + player.getLogName() + (secondCoinFlip ? " won (head)." : " lost (tail)."));
- }
- if (player.chooseUse(outcome, "Ignore the first coin flip?", source, game)) {
- event.setFlag(secondCoinFlip);
- game.informPlayers(player.getLogName() + " ignores the first coin flip.");
- } else {
- game.informPlayers(player.getLogName() + " ignores the second coin flip.");
- }
+ if (player == null || !player.getId().equals(source.getControllerId())) {
+ return false;
}
+ FlipCoinEvent flipEvent = (FlipCoinEvent) event;
+ boolean secondFlip = RandomUtil.nextBoolean();
+ game.informPlayers(player.getLogName() + " flipped a " + flipEvent.getResultName()
+ + " and a " + CardUtil.booleanToFlipName(secondFlip)
+ );
+ boolean chosenFlip = player.chooseUse(
+ Outcome.Benefit, "Choose which coin you want",
+ (flipEvent.isWinnable() ? "(You chose " + flipEvent.getChosenName() + ")" : null),
+ flipEvent.getResultName(), CardUtil.booleanToFlipName(secondFlip), source, game
+ );
+ if (!chosenFlip) {
+ flipEvent.setResult(secondFlip);
+ }
+ game.informPlayers(player.getLogName() + " chooses to keep " + flipEvent.getResultName());
return false;
}
diff --git a/Mage.Sets/src/mage/cards/k/KraumLudevicsOpus.java b/Mage.Sets/src/mage/cards/k/KraumLudevicsOpus.java
index bf8957318a5..c02cf364faf 100644
--- a/Mage.Sets/src/mage/cards/k/KraumLudevicsOpus.java
+++ b/Mage.Sets/src/mage/cards/k/KraumLudevicsOpus.java
@@ -80,7 +80,7 @@ class KraumLudevicsOpusTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (game.getOpponents(controllerId).contains(event.getPlayerId())) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 2) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/k/KravTheUnredeemed.java b/Mage.Sets/src/mage/cards/k/KravTheUnredeemed.java
index 8a08d9630de..136033ed407 100644
--- a/Mage.Sets/src/mage/cards/k/KravTheUnredeemed.java
+++ b/Mage.Sets/src/mage/cards/k/KravTheUnredeemed.java
@@ -76,7 +76,7 @@ class KravTheUnredeemedEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- int xValue = new GetXValue().calculate(game, source, this);
+ int xValue = GetXValue.instance.calculate(game, source, this);
new DrawCardTargetEffect(xValue).apply(game, source);
new GainLifeTargetEffect(xValue).apply(game, source);
new AddCountersSourceEffect(CounterType.P1P1.createInstance(xValue)).apply(game, source);
diff --git a/Mage.Sets/src/mage/cards/k/KrovikanPlague.java b/Mage.Sets/src/mage/cards/k/KrovikanPlague.java
index 8bc9f49f3d2..835ac9ee080 100644
--- a/Mage.Sets/src/mage/cards/k/KrovikanPlague.java
+++ b/Mage.Sets/src/mage/cards/k/KrovikanPlague.java
@@ -46,7 +46,7 @@ public final class KrovikanPlague extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("enchanted creature is untapped");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public KrovikanPlague(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KrovikanVampire.java b/Mage.Sets/src/mage/cards/k/KrovikanVampire.java
index c260081ba44..9918b146382 100644
--- a/Mage.Sets/src/mage/cards/k/KrovikanVampire.java
+++ b/Mage.Sets/src/mage/cards/k/KrovikanVampire.java
@@ -112,26 +112,24 @@ enum KrovikanVampireInterveningIfCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- KrovikanVampireCreaturesDiedWatcher watcherDied = (KrovikanVampireCreaturesDiedWatcher) game.getState().getWatchers().get(KrovikanVampireCreaturesDiedWatcher.class.getSimpleName());
- KrovikanVampireCreaturesDamagedWatcher watcherDamaged = (KrovikanVampireCreaturesDamagedWatcher) game.getState().getWatchers().get(KrovikanVampireCreaturesDamagedWatcher.class.getSimpleName());
+ KrovikanVampireCreaturesDiedWatcher watcherDied = game.getState().getWatcher(KrovikanVampireCreaturesDiedWatcher.class);
+ KrovikanVampireCreaturesDamagedWatcher watcherDamaged = game.getState().getWatcher(KrovikanVampireCreaturesDamagedWatcher.class);
if (watcherDied != null) {
Set creaturesThatDiedThisTurn = watcherDied.diedThisTurn;
- if (creaturesThatDiedThisTurn != null) {
- for (UUID mor : creaturesThatDiedThisTurn) {
- if (watcherDamaged != null) {
- for (UUID mor2 : watcherDamaged.getDamagedBySource()) {
- if (mor2 != null
- && mor == mor2) {
- creaturesAffected.add(mor);
- }
+ for (UUID mor : creaturesThatDiedThisTurn) {
+ if (watcherDamaged != null) {
+ for (UUID mor2 : watcherDamaged.getDamagedBySource()) {
+ if (mor2 != null
+ && mor == mor2) {
+ creaturesAffected.add(mor);
}
}
}
- if (creaturesAffected != null
- && creaturesAffected.size() > 0) {
- game.getState().setValue(source.getSourceId() + "creatureToGainControl", creaturesAffected);
- return true;
- }
+ }
+ if (creaturesAffected != null
+ && creaturesAffected.size() > 0) {
+ game.getState().setValue(source.getSourceId() + "creatureToGainControl", creaturesAffected);
+ return true;
}
}
return false;
@@ -148,7 +146,7 @@ class KrovikanVampireCreaturesDamagedWatcher extends Watcher {
public final Set damagedBySource = new HashSet<>();
public KrovikanVampireCreaturesDamagedWatcher() {
- super(KrovikanVampireCreaturesDamagedWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(KrovikanVampireCreaturesDamagedWatcher.class, WatcherScope.GAME);
}
public KrovikanVampireCreaturesDamagedWatcher(final KrovikanVampireCreaturesDamagedWatcher watcher) {
@@ -184,7 +182,7 @@ class KrovikanVampireCreaturesDiedWatcher extends Watcher {
public final Set diedThisTurn = new HashSet<>();
public KrovikanVampireCreaturesDiedWatcher() {
- super(KrovikanVampireCreaturesDiedWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(KrovikanVampireCreaturesDiedWatcher.class, WatcherScope.GAME);
}
public KrovikanVampireCreaturesDiedWatcher(final KrovikanVampireCreaturesDiedWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/k/KryShield.java b/Mage.Sets/src/mage/cards/k/KryShield.java
index 8fc55fc5dc4..eb321f215e2 100644
--- a/Mage.Sets/src/mage/cards/k/KryShield.java
+++ b/Mage.Sets/src/mage/cards/k/KryShield.java
@@ -31,7 +31,7 @@ public final class KryShield extends CardImpl {
Effect effect = new PreventDamageByTargetEffect(Duration.EndOfTurn);
effect.setText("Prevent all damage that would be dealt this turn by target creature you control");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2));
- ability.addEffect(new BoostTargetEffect(new StaticValue(0), new TargetConvertedManaCost(), Duration.EndOfTurn, true)
+ ability.addEffect(new BoostTargetEffect(new StaticValue(0), TargetConvertedManaCost.instance, Duration.EndOfTurn, true)
.setText("That creature gets +0/+X until end of turn, where X is its converted mana cost"));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetControlledCreaturePermanent());
diff --git a/Mage.Sets/src/mage/cards/k/Kudzu.java b/Mage.Sets/src/mage/cards/k/Kudzu.java
index 37e3b35540d..0c8f9cb857a 100644
--- a/Mage.Sets/src/mage/cards/k/Kudzu.java
+++ b/Mage.Sets/src/mage/cards/k/Kudzu.java
@@ -1,7 +1,5 @@
-
package mage.cards.k;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BecomesTappedAttachedTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
@@ -21,8 +19,9 @@ import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.common.TargetLandPermanent;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class Kudzu extends CardImpl {
@@ -73,7 +72,6 @@ class KudzuEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent kudzu = game.getPermanentOrLKIBattlefield(source.getSourceId());
- Card kudzuCard = game.getCard(source.getSourceId());
if (kudzu != null) {
Permanent enchantedLand = game.getPermanentOrLKIBattlefield(kudzu.getAttachedTo());
Player controller = game.getPlayer(source.getControllerId());
@@ -86,8 +84,8 @@ class KudzuEffect extends OneShotEffect {
if (!game.getBattlefield().getAllActivePermanents(CardType.LAND).isEmpty()) { //lands are available on the battlefield
Target target = new TargetLandPermanent();
target.setNotTarget(true); //not a target, it is chosen
- if (kudzuCard != null
- && landsController != null) {
+ Card kudzuCard = game.getCard(source.getSourceId());
+ if (kudzuCard != null && landsController != null) {
if (landsController.choose(Outcome.Detriment, target, source.getId(), game)) {
if (target.getFirstTarget() != null) {
Permanent landChosen = game.getPermanent(target.getFirstTarget());
diff --git a/Mage.Sets/src/mage/cards/k/KukemssaPirates.java b/Mage.Sets/src/mage/cards/k/KukemssaPirates.java
index 5464da339d4..3371ea8a14c 100644
--- a/Mage.Sets/src/mage/cards/k/KukemssaPirates.java
+++ b/Mage.Sets/src/mage/cards/k/KukemssaPirates.java
@@ -1,29 +1,32 @@
package mage.cards.k;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.filter.common.FilterArtifactPermanent;
-import mage.filter.predicate.permanent.ControllerIdPredicate;
-import mage.game.Game;
+import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate;
import mage.target.common.TargetArtifactPermanent;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class KukemssaPirates extends CardImpl {
- private final UUID originalId;
+ private static final FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact defending player controls");
+
+ static {
+ filter.add(DefendingPlayerControlsPredicate.instance);
+ }
public KukemssaPirates(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
@@ -36,26 +39,12 @@ public final class KukemssaPirates extends CardImpl {
// Whenever Kukemssa Pirates attacks and isn't blocked, you may gain control of target artifact defending player controls. If you do, Kukemssa Pirates assigns no combat damage this turn.
Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(new GainControlTargetEffect(Duration.Custom), true);
ability.addEffect(new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn, true));
- ability.addTarget(new TargetArtifactPermanent(new FilterArtifactPermanent("artifact defending player controls")));
- originalId = ability.getOriginalId();
+ ability.addTarget(new TargetArtifactPermanent(filter));
this.addAbility(ability);
}
public KukemssaPirates(final KukemssaPirates card) {
super(card);
- this.originalId = card.originalId;
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- ability.getTargets().clear();
- FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact defending player controls");
- UUID defenderId = game.getCombat().getDefenderId(ability.getSourceId());
- filter.add(new ControllerIdPredicate(defenderId));
- TargetArtifactPermanent target = new TargetArtifactPermanent(filter);
- ability.addTarget(target);
- }
}
@Override
diff --git a/Mage.Sets/src/mage/cards/k/KulrathKnight.java b/Mage.Sets/src/mage/cards/k/KulrathKnight.java
index a4ad1cc07c2..16687c520ce 100644
--- a/Mage.Sets/src/mage/cards/k/KulrathKnight.java
+++ b/Mage.Sets/src/mage/cards/k/KulrathKnight.java
@@ -61,7 +61,7 @@ class KulrathKnightRestrictionEffect extends RestrictionEffect {
static {
filter.add(new ControllerPredicate(TargetController.OPPONENT));
- filter.add(new CounterAnyPredicate());
+ filter.add(CounterAnyPredicate.instance);
}
public KulrathKnightRestrictionEffect() {
diff --git a/Mage.Sets/src/mage/cards/k/KumanosBlessing.java b/Mage.Sets/src/mage/cards/k/KumanosBlessing.java
index c745c6fd9c6..6c0f1f2d18e 100644
--- a/Mage.Sets/src/mage/cards/k/KumanosBlessing.java
+++ b/Mage.Sets/src/mage/cards/k/KumanosBlessing.java
@@ -94,7 +94,7 @@ class KumanosBlessingEffect extends ReplacementEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
ZoneChangeEvent zce = (ZoneChangeEvent) event;
if (zce.isDiesEvent()) {
- DamagedByEnchantedWatcher watcher = (DamagedByEnchantedWatcher) game.getState().getWatchers().get(DamagedByEnchantedWatcher.class.getSimpleName(), source.getSourceId());
+ DamagedByEnchantedWatcher watcher = game.getState().getWatcher(DamagedByEnchantedWatcher.class, source.getSourceId());
if (watcher != null) {
return watcher.wasDamaged(zce.getTarget(), game);
}
@@ -109,7 +109,7 @@ class DamagedByEnchantedWatcher extends Watcher {
private final Set damagedCreatures = new HashSet<>();
public DamagedByEnchantedWatcher() {
- super(DamagedByEnchantedWatcher.class.getSimpleName(), WatcherScope.CARD);
+ super(DamagedByEnchantedWatcher.class, WatcherScope.CARD);
}
public DamagedByEnchantedWatcher(final DamagedByEnchantedWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/k/KumenaTyrantOfOrazca.java b/Mage.Sets/src/mage/cards/k/KumenaTyrantOfOrazca.java
index 1750aaad300..620c839d28e 100644
--- a/Mage.Sets/src/mage/cards/k/KumenaTyrantOfOrazca.java
+++ b/Mage.Sets/src/mage/cards/k/KumenaTyrantOfOrazca.java
@@ -34,12 +34,12 @@ public final class KumenaTyrantOfOrazca extends CardImpl {
private static final FilterControlledPermanent filterAll = new FilterControlledPermanent("Merfolk you control");
static {
- filterAnotherNotTapped.add(new AnotherPredicate());
+ filterAnotherNotTapped.add(AnotherPredicate.instance);
filterAnotherNotTapped.add(new SubtypePredicate(SubType.MERFOLK));
- filterAnotherNotTapped.add(Predicates.not(new TappedPredicate()));
+ filterAnotherNotTapped.add(Predicates.not(TappedPredicate.instance));
filterNotTapped.add(new SubtypePredicate(SubType.MERFOLK));
- filterNotTapped.add(Predicates.not(new TappedPredicate()));
+ filterNotTapped.add(Predicates.not(TappedPredicate.instance));
filterAll.add(new SubtypePredicate(SubType.MERFOLK));
}
diff --git a/Mage.Sets/src/mage/cards/k/KumenasSpeaker.java b/Mage.Sets/src/mage/cards/k/KumenasSpeaker.java
index 90981f90196..58cc2dd7779 100644
--- a/Mage.Sets/src/mage/cards/k/KumenasSpeaker.java
+++ b/Mage.Sets/src/mage/cards/k/KumenasSpeaker.java
@@ -24,7 +24,7 @@ public final class KumenasSpeaker extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("another Merfolk or an Island");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(Predicates.or(
new SubtypePredicate(SubType.ISLAND),
new SubtypePredicate(SubType.MERFOLK)));
diff --git a/Mage.Sets/src/mage/cards/k/KuonOgreAscendant.java b/Mage.Sets/src/mage/cards/k/KuonOgreAscendant.java
index ee72d2a3c9e..cf6d5084365 100644
--- a/Mage.Sets/src/mage/cards/k/KuonOgreAscendant.java
+++ b/Mage.Sets/src/mage/cards/k/KuonOgreAscendant.java
@@ -89,7 +89,7 @@ enum KuonOgreAscendantCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- CreaturesDiedWatcher watcher = (CreaturesDiedWatcher) game.getState().getWatchers().get(CreaturesDiedWatcher.class.getSimpleName());
+ CreaturesDiedWatcher watcher = game.getState().getWatcher(CreaturesDiedWatcher.class);
if (watcher != null) {
return watcher.getAmountOfCreaturesDiedThisTurn() > 2;
}
diff --git a/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java b/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java
index ba654daf775..21e19810cdb 100644
--- a/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java
+++ b/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java
@@ -57,8 +57,11 @@ class CardsDrawnThisTurnDynamicValue implements DynamicValue {
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
- KydeleCardsDrawnThisTurnWatcher watcher = (KydeleCardsDrawnThisTurnWatcher) game.getState().getWatchers().get(KydeleCardsDrawnThisTurnWatcher.class.getSimpleName());
- return watcher.getCardsDrawnThisTurn(sourceAbility.getControllerId());
+ KydeleCardsDrawnThisTurnWatcher watcher = game.getState().getWatcher(KydeleCardsDrawnThisTurnWatcher.class);
+ if(watcher != null) {
+ return watcher.getCardsDrawnThisTurn(sourceAbility.getControllerId());
+ }
+ return 0;
}
@Override
@@ -82,7 +85,7 @@ class KydeleCardsDrawnThisTurnWatcher extends Watcher {
private final Map cardsDrawnThisTurn = new HashMap<>();
public KydeleCardsDrawnThisTurnWatcher() {
- super(KydeleCardsDrawnThisTurnWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(KydeleCardsDrawnThisTurnWatcher.class, WatcherScope.GAME);
}
public KydeleCardsDrawnThisTurnWatcher(final KydeleCardsDrawnThisTurnWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/k/KyloRen.java b/Mage.Sets/src/mage/cards/k/KyloRen.java
index 19326d19259..eab9b02ff1d 100644
--- a/Mage.Sets/src/mage/cards/k/KyloRen.java
+++ b/Mage.Sets/src/mage/cards/k/KyloRen.java
@@ -39,7 +39,7 @@ public final class KyloRen extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
static {
- filter.add(new DefendingPlayerControlsPredicate());
+ filter.add(DefendingPlayerControlsPredicate.instance);
}
public KyloRen(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KyrenNegotiations.java b/Mage.Sets/src/mage/cards/k/KyrenNegotiations.java
index f21e9a828ea..e9af826e1a8 100644
--- a/Mage.Sets/src/mage/cards/k/KyrenNegotiations.java
+++ b/Mage.Sets/src/mage/cards/k/KyrenNegotiations.java
@@ -24,7 +24,7 @@ public final class KyrenNegotiations extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public KyrenNegotiations(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java b/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java
index d420ff39a62..4e36e7bd8d7 100644
--- a/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java
+++ b/Mage.Sets/src/mage/cards/k/KytheonHeroOfAkros.java
@@ -71,7 +71,7 @@ class KytheonHeroOfAkrosCondition implements Condition {
public boolean apply(Game game, Ability source) {
Permanent sourceObject = game.getPermanent(source.getSourceId());
if (sourceObject != null) {
- AttackedOrBlockedThisCombatWatcher watcher = (AttackedOrBlockedThisCombatWatcher) game.getState().getWatchers().get(AttackedOrBlockedThisCombatWatcher.class.getSimpleName());
+ AttackedOrBlockedThisCombatWatcher watcher = game.getState().getWatcher(AttackedOrBlockedThisCombatWatcher.class);
if (watcher != null) {
boolean sourceFound = false;
int number = 0;
diff --git a/Mage.Sets/src/mage/cards/l/LadySun.java b/Mage.Sets/src/mage/cards/l/LadySun.java
index 8d9ca4863d3..255c43bbd81 100644
--- a/Mage.Sets/src/mage/cards/l/LadySun.java
+++ b/Mage.Sets/src/mage/cards/l/LadySun.java
@@ -28,7 +28,7 @@ public final class LadySun extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public LadySun(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LamplighterOfSelhoff.java b/Mage.Sets/src/mage/cards/l/LamplighterOfSelhoff.java
index 20fcc00fcbf..b3930a952c7 100644
--- a/Mage.Sets/src/mage/cards/l/LamplighterOfSelhoff.java
+++ b/Mage.Sets/src/mage/cards/l/LamplighterOfSelhoff.java
@@ -26,7 +26,7 @@ public final class LamplighterOfSelhoff extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.ZOMBIE));
}
diff --git a/Mage.Sets/src/mage/cards/l/Lashknife.java b/Mage.Sets/src/mage/cards/l/Lashknife.java
index c0f5db91dad..a99bf8d1173 100644
--- a/Mage.Sets/src/mage/cards/l/Lashknife.java
+++ b/Mage.Sets/src/mage/cards/l/Lashknife.java
@@ -38,7 +38,7 @@ public final class Lashknife extends CardImpl {
static {
plainsFilter.add(new SubtypePredicate(SubType.PLAINS));
- creatureFilter.add(Predicates.not(new TappedPredicate()));
+ creatureFilter.add(Predicates.not(TappedPredicate.instance));
}
public Lashknife(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LastLaugh.java b/Mage.Sets/src/mage/cards/l/LastLaugh.java
index 1a35b3f9a08..14c712bfa31 100644
--- a/Mage.Sets/src/mage/cards/l/LastLaugh.java
+++ b/Mage.Sets/src/mage/cards/l/LastLaugh.java
@@ -27,7 +27,7 @@ public final class LastLaugh extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("a permanent other than Last Laugh");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public LastLaugh(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LathlissDragonQueen.java b/Mage.Sets/src/mage/cards/l/LathlissDragonQueen.java
index bdb34d6533b..e93fb4b01db 100644
--- a/Mage.Sets/src/mage/cards/l/LathlissDragonQueen.java
+++ b/Mage.Sets/src/mage/cards/l/LathlissDragonQueen.java
@@ -34,8 +34,8 @@ public final class LathlissDragonQueen extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.DRAGON));
- filter.add(Predicates.not(new TokenPredicate()));
- filter.add(new AnotherPredicate());
+ filter.add(Predicates.not(TokenPredicate.instance));
+ filter.add(AnotherPredicate.instance);
filter2.add(new SubtypePredicate(SubType.DRAGON));
}
diff --git a/Mage.Sets/src/mage/cards/l/LatullaKeldonOverseer.java b/Mage.Sets/src/mage/cards/l/LatullaKeldonOverseer.java
index 7c86ccbe4fd..30171595ff4 100644
--- a/Mage.Sets/src/mage/cards/l/LatullaKeldonOverseer.java
+++ b/Mage.Sets/src/mage/cards/l/LatullaKeldonOverseer.java
@@ -35,7 +35,7 @@ public final class LatullaKeldonOverseer extends CardImpl {
this.toughness = new MageInt(3);
// {X}{R}, {tap}, Discard two cards: Latulla, Keldon Overseer deals X damage to any target.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}{R}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.instance), new ManaCostsImpl("{X}{R}"));
ability.addCost(new TapSourceCost());
ability.addCost(new DiscardTargetCost(new TargetCardInHand(2, 2, new FilterCard("two cards"))));
ability.addTarget(new TargetAnyTarget());
diff --git a/Mage.Sets/src/mage/cards/l/Launch.java b/Mage.Sets/src/mage/cards/l/Launch.java
index 9c3c984cd9d..3e0518ed3d2 100644
--- a/Mage.Sets/src/mage/cards/l/Launch.java
+++ b/Mage.Sets/src/mage/cards/l/Launch.java
@@ -1,7 +1,5 @@
-
package mage.cards.l;
-import java.util.UUID;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
@@ -11,22 +9,18 @@ import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author Derpthemeus
*/
public final class Launch extends CardImpl {
public Launch(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
this.subtype.add(SubType.AURA);
// Enchant creature
@@ -34,8 +28,10 @@ public final class Launch extends CardImpl {
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility));
this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
+
// Enchanted creature has flying.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield)));
+
// When Launch is put into a graveyard from the battlefield, return Launch to its owner's hand.
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect()));
diff --git a/Mage.Sets/src/mage/cards/l/LavaballTrap.java b/Mage.Sets/src/mage/cards/l/LavaballTrap.java
index 745a056dc81..df7428ffb67 100644
--- a/Mage.Sets/src/mage/cards/l/LavaballTrap.java
+++ b/Mage.Sets/src/mage/cards/l/LavaballTrap.java
@@ -57,7 +57,7 @@ enum LavaballTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PermanentsEnteredBattlefieldWatcher watcher = (PermanentsEnteredBattlefieldWatcher) game.getState().getWatchers().get(PermanentsEnteredBattlefieldWatcher.class.getSimpleName());
+ PermanentsEnteredBattlefieldWatcher watcher = game.getState().getWatcher(PermanentsEnteredBattlefieldWatcher.class);
if (watcher != null) {
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
List permanents = watcher.getThisTurnEnteringPermanents(opponentId);
diff --git a/Mage.Sets/src/mage/cards/l/LavaclawReaches.java b/Mage.Sets/src/mage/cards/l/LavaclawReaches.java
index e1c3f7b6fd1..9988c05f7d4 100644
--- a/Mage.Sets/src/mage/cards/l/LavaclawReaches.java
+++ b/Mage.Sets/src/mage/cards/l/LavaclawReaches.java
@@ -60,7 +60,7 @@ class LavaclawReachesToken extends TokenImpl {
color.setBlack(true);
power = new MageInt(2);
toughness = new MageInt(2);
- addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(new ManacostVariableValue(), new StaticValue(0), Duration.EndOfTurn), new ManaCostsImpl("{X}")));
+ addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(ManacostVariableValue.instance, new StaticValue(0), Duration.EndOfTurn), new ManaCostsImpl("{X}")));
}
public LavaclawReachesToken(final LavaclawReachesToken token) {
super(token);
diff --git a/Mage.Sets/src/mage/cards/l/Lavalanche.java b/Mage.Sets/src/mage/cards/l/Lavalanche.java
index bbb74ff71da..231134ea215 100644
--- a/Mage.Sets/src/mage/cards/l/Lavalanche.java
+++ b/Mage.Sets/src/mage/cards/l/Lavalanche.java
@@ -29,7 +29,7 @@ public final class Lavalanche extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{R}{G}");
// Lavalanche deals X damage to target player and each creature he or she controls.
- this.getSpellAbility().addEffect(new LavalancheEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new LavalancheEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetPlayerOrPlaneswalker());
}
diff --git a/Mage.Sets/src/mage/cards/l/LaviniaAzoriusRenegade.java b/Mage.Sets/src/mage/cards/l/LaviniaAzoriusRenegade.java
new file mode 100644
index 00000000000..4276ebfd59f
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/l/LaviniaAzoriusRenegade.java
@@ -0,0 +1,159 @@
+
+package mage.cards.l;
+
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CounterTargetEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.FilterCard;
+import mage.filter.StaticFilters;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.game.stack.Spell;
+import mage.target.targetpointer.FixedTarget;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ *
+ * @author NinthWorld
+ */
+public final class LaviniaAzoriusRenegade extends CardImpl {
+
+ public LaviniaAzoriusRenegade(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}{U}");
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SOLDIER);
+ this.addSuperType(SuperType.LEGENDARY);
+
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new LaviniaAzoriusRenegadeReplacementEffect()));
+
+ // Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell.
+ this.addAbility(new LaviniaAzoriusRenegadeTriggeredAbility());
+ }
+
+ public LaviniaAzoriusRenegade(final LaviniaAzoriusRenegade card) {
+ super(card);
+ }
+
+ @Override
+ public LaviniaAzoriusRenegade copy() {
+ return new LaviniaAzoriusRenegade(this);
+ }
+}
+
+class LaviniaAzoriusRenegadeReplacementEffect extends ContinuousRuleModifyingEffectImpl {
+
+ LaviniaAzoriusRenegadeReplacementEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
+ staticText = "Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls.";
+ }
+
+ LaviniaAzoriusRenegadeReplacementEffect(final LaviniaAzoriusRenegadeReplacementEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public String getInfoMessage(Ability source, GameEvent event, Game game) {
+ MageObject mageObject = game.getObject(source.getSourceId());
+ if (mageObject != null) {
+ return "You can't cast noncreature spells with converted mana cost greater than " + getLandCount(source, event, game) + " (" + mageObject.getIdName() + ").";
+ }
+ return null;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.CAST_SPELL;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ if (game.getPlayer(source.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
+ FilterCard filter = new FilterCard();
+ filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE)));
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.MORE_THAN, getLandCount(source, event, game)));
+
+ Card card = game.getCard(event.getSourceId());
+ return card != null && filter.match(card, game);
+ }
+ return false;
+ }
+
+ private int getLandCount(Ability source, GameEvent event, Game game) {
+ int landCount = 0;
+ UUID playerId = event.getPlayerId();
+ if(playerId != null) {
+ List permanents = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_LAND, playerId, source.getSourceId(), game);
+ for (Permanent permanent : permanents) {
+ if (permanent.isControlledBy(playerId)) {
+ landCount++;
+ }
+ }
+ }
+ return landCount;
+ }
+
+ @Override
+ public LaviniaAzoriusRenegadeReplacementEffect copy() {
+ return new LaviniaAzoriusRenegadeReplacementEffect(this);
+ }
+}
+
+
+class LaviniaAzoriusRenegadeTriggeredAbility extends TriggeredAbilityImpl {
+
+ public LaviniaAzoriusRenegadeTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new CounterTargetEffect(), false);
+ }
+
+ public LaviniaAzoriusRenegadeTriggeredAbility(final LaviniaAzoriusRenegadeTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public LaviniaAzoriusRenegadeTriggeredAbility copy() {
+ return new LaviniaAzoriusRenegadeTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.SPELL_CAST;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
+ Spell spell = game.getStack().getSpell(event.getTargetId());
+ if (spell != null && spell.getStackAbility().getManaCostsToPay().getPayment().count() == 0) {
+ for (Effect effect : this.getEffects()) {
+ effect.setTargetPointer(new FixedTarget(event.getTargetId()));
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell";
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/l/LawmagesBinding.java b/Mage.Sets/src/mage/cards/l/LawmagesBinding.java
new file mode 100644
index 00000000000..f5d89ce8146
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/l/LawmagesBinding.java
@@ -0,0 +1,52 @@
+package mage.cards.l;
+
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.combat.CantBlockAttackActivateAttachedEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.keyword.FlashAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class LawmagesBinding extends CardImpl {
+
+ public LawmagesBinding(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{U}");
+
+ this.subtype.add(SubType.AURA);
+
+ // Flash
+ this.addAbility(FlashAbility.getInstance());
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // Enchanted creature can't attack or block, and its activate abilities can't be activated.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockAttackActivateAttachedEffect()));
+ }
+
+ private LawmagesBinding(final LawmagesBinding card) {
+ super(card);
+ }
+
+ @Override
+ public LawmagesBinding copy() {
+ return new LawmagesBinding(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/l/LazavDimirMastermind.java b/Mage.Sets/src/mage/cards/l/LazavDimirMastermind.java
index fcb2eca5f22..71cdf748fef 100644
--- a/Mage.Sets/src/mage/cards/l/LazavDimirMastermind.java
+++ b/Mage.Sets/src/mage/cards/l/LazavDimirMastermind.java
@@ -80,7 +80,7 @@ class LazavDimirMastermindEffect extends OneShotEffect {
&& lazavDimirMastermind != null) {
Card copyFromCard = game.getCard(((FixedTarget) getTargetPointer()).getTarget());
if (copyFromCard != null) {
- newBluePrint = new PermanentCard((Card) copyFromCard, source.getControllerId(), game);
+ newBluePrint = new PermanentCard(copyFromCard, source.getControllerId(), game);
newBluePrint.assignNewId();
ApplyToPermanent applier = new LazavDimirMastermindApplier();
applier.apply(game, newBluePrint, source, lazavDimirMastermind.getId());
diff --git a/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java b/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java
index a8bf016ec6a..5ee5f63379f 100644
--- a/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java
+++ b/Mage.Sets/src/mage/cards/l/LazavTheMultifarious.java
@@ -110,7 +110,7 @@ class LazavTheMultifariousEffect extends OneShotEffect {
&& lazavTheMultifarious != null) {
Card copyFromCard = game.getCard(source.getFirstTarget());
if (copyFromCard != null) {
- newBluePrint = new PermanentCard((Card) copyFromCard, source.getControllerId(), game);
+ newBluePrint = new PermanentCard(copyFromCard, source.getControllerId(), game);
newBluePrint.assignNewId();
ApplyToPermanent applier = new LazavTheMultifariousApplier();
applier.apply(game, newBluePrint, source, lazavTheMultifarious.getId());
diff --git a/Mage.Sets/src/mage/cards/l/Leapfrog.java b/Mage.Sets/src/mage/cards/l/Leapfrog.java
index 8e1006f6975..f71d344ce0c 100644
--- a/Mage.Sets/src/mage/cards/l/Leapfrog.java
+++ b/Mage.Sets/src/mage/cards/l/Leapfrog.java
@@ -62,8 +62,8 @@ enum LeapfrogCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
SpellsCastWatcher watcher
- = (SpellsCastWatcher) game.getState().getWatchers().get(
- SpellsCastWatcher.class.getSimpleName()
+ = game.getState().getWatcher(
+ SpellsCastWatcher.class
);
if (watcher == null) {
return false;
diff --git a/Mage.Sets/src/mage/cards/l/LeaveChance.java b/Mage.Sets/src/mage/cards/l/LeaveChance.java
index 09d06d1ce12..366f9ea9014 100644
--- a/Mage.Sets/src/mage/cards/l/LeaveChance.java
+++ b/Mage.Sets/src/mage/cards/l/LeaveChance.java
@@ -42,7 +42,7 @@ public final class LeaveChance extends SplitCard {
// Chance
// Sorcery
// Aftermath
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Discard any number of cards, then draw that many cards.
getRightHalfCard().getSpellAbility().addEffect(new ChanceEffect());
diff --git a/Mage.Sets/src/mage/cards/l/LedevChampion.java b/Mage.Sets/src/mage/cards/l/LedevChampion.java
index 8c5d59ecaed..babd14a4eb4 100644
--- a/Mage.Sets/src/mage/cards/l/LedevChampion.java
+++ b/Mage.Sets/src/mage/cards/l/LedevChampion.java
@@ -68,7 +68,7 @@ class LedevChampionEffect extends OneShotEffect {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public LedevChampionEffect() {
diff --git a/Mage.Sets/src/mage/cards/l/LegionGuildmage.java b/Mage.Sets/src/mage/cards/l/LegionGuildmage.java
index f0ef4685372..93dbb3cad04 100644
--- a/Mage.Sets/src/mage/cards/l/LegionGuildmage.java
+++ b/Mage.Sets/src/mage/cards/l/LegionGuildmage.java
@@ -27,7 +27,7 @@ public final class LegionGuildmage extends CardImpl {
= new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public LegionGuildmage(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LegionsInitiative.java b/Mage.Sets/src/mage/cards/l/LegionsInitiative.java
index 05038cb183d..8f209d80b3d 100644
--- a/Mage.Sets/src/mage/cards/l/LegionsInitiative.java
+++ b/Mage.Sets/src/mage/cards/l/LegionsInitiative.java
@@ -1,7 +1,5 @@
-
package mage.cards.l;
-import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -17,11 +15,7 @@ import mage.abilities.keyword.HasteAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.TargetController;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.CardTypePredicate;
@@ -32,8 +26,9 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class LegionsInitiative extends CardImpl {
@@ -47,7 +42,7 @@ public final class LegionsInitiative extends CardImpl {
}
public LegionsInitiative(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{R}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}{W}");
// Red creatures you control get +1/+0.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 0, Duration.WhileOnBattlefield, filterRedCreature)));
@@ -136,12 +131,14 @@ class LegionsInitiativeReturnFromExileEffect extends OneShotEffect {
exile = exile.copy();
for (UUID cardId : exile) {
Card card = game.getCard(cardId);
- card.moveToZone(Zone.BATTLEFIELD, source.getSourceId(), game, false);
- Permanent returnedCreature = game.getPermanent(cardId);
- if (returnedCreature != null) {
- ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn);
- effect.setTargetPointer(new FixedTarget(returnedCreature.getId()));
- game.addEffect(effect, source);
+ if (card != null) {
+ card.moveToZone(Zone.BATTLEFIELD, source.getSourceId(), game, false);
+ Permanent returnedCreature = game.getPermanent(cardId);
+ if (returnedCreature != null) {
+ ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn);
+ effect.setTargetPointer(new FixedTarget(returnedCreature.getId()));
+ game.addEffect(effect, source);
+ }
}
}
game.getExile().getExileZone(source.getSourceId()).clear();
diff --git a/Mage.Sets/src/mage/cards/l/LenaSelflessChampion.java b/Mage.Sets/src/mage/cards/l/LenaSelflessChampion.java
index e86a5719636..b3fbdbf3ec1 100644
--- a/Mage.Sets/src/mage/cards/l/LenaSelflessChampion.java
+++ b/Mage.Sets/src/mage/cards/l/LenaSelflessChampion.java
@@ -38,7 +38,7 @@ public final class LenaSelflessChampion extends CardImpl {
= new FilterControlledCreaturePermanent("nontoken creature you control");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public LenaSelflessChampion(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LensOfClarity.java b/Mage.Sets/src/mage/cards/l/LensOfClarity.java
index c958c1d3759..cbf6afb818d 100644
--- a/Mage.Sets/src/mage/cards/l/LensOfClarity.java
+++ b/Mage.Sets/src/mage/cards/l/LensOfClarity.java
@@ -110,7 +110,7 @@ class LensOfClarityLookFaceDownAbility extends ActivatedAbilityImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("face down creature you don't control");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
filter.add(new ControllerPredicate(TargetController.NOT_YOU));
}
diff --git a/Mage.Sets/src/mage/cards/l/LeoninBladetrap.java b/Mage.Sets/src/mage/cards/l/LeoninBladetrap.java
index 007da60f6ae..0bc2e9ff716 100644
--- a/Mage.Sets/src/mage/cards/l/LeoninBladetrap.java
+++ b/Mage.Sets/src/mage/cards/l/LeoninBladetrap.java
@@ -26,7 +26,7 @@ public final class LeoninBladetrap extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creature without flying");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class)));
}
diff --git a/Mage.Sets/src/mage/cards/l/LeovoldEmissaryOfTrest.java b/Mage.Sets/src/mage/cards/l/LeovoldEmissaryOfTrest.java
index 270e0500530..675371692d4 100644
--- a/Mage.Sets/src/mage/cards/l/LeovoldEmissaryOfTrest.java
+++ b/Mage.Sets/src/mage/cards/l/LeovoldEmissaryOfTrest.java
@@ -71,7 +71,7 @@ class LeovoldEmissaryOfTrestEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- CardsAmountDrawnThisTurnWatcher watcher = (CardsAmountDrawnThisTurnWatcher) game.getState().getWatchers().get(CardsAmountDrawnThisTurnWatcher.class.getSimpleName());
+ CardsAmountDrawnThisTurnWatcher watcher = game.getState().getWatcher(CardsAmountDrawnThisTurnWatcher.class);
Player controller = game.getPlayer(source.getControllerId());
return watcher != null && controller != null && watcher.getAmountCardsDrawn(event.getPlayerId()) >= 1
&& game.isOpponent(controller, event.getPlayerId());
diff --git a/Mage.Sets/src/mage/cards/l/LesserWerewolf.java b/Mage.Sets/src/mage/cards/l/LesserWerewolf.java
new file mode 100644
index 00000000000..84d836b950c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/l/LesserWerewolf.java
@@ -0,0 +1,93 @@
+
+package mage.cards.l;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.condition.common.IsStepCondition;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalActivatedAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import mage.counters.BoostCounter;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.permanent.BlockedByIdPredicate;
+import mage.filter.predicate.permanent.BlockingAttackerIdPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author L_J
+ */
+public final class LesserWerewolf extends CardImpl {
+
+ public LesserWerewolf(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.subtype.add(SubType.WEREWOLF);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(4);
+
+ // {B}: If Lesser Werewolf’s power is 1 or more, it gets -1/-0 until end of turn and put a -0/-1 counter on target creature blocking or blocked by Lesser Werewolf. Activate this ability only during the declare blockers step.
+ Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new LesserWerewolfEffect(), new ManaCostsImpl("{B}"), new IsStepCondition(PhaseStep.DECLARE_BLOCKERS, false));
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature blocking or blocked by Lesser Werewolf");
+ filter.add(Predicates.or(new BlockedByIdPredicate(this.getId()),
+ new BlockingAttackerIdPredicate(this.getId())));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+
+ }
+
+ public LesserWerewolf(final LesserWerewolf card) {
+ super(card);
+ }
+
+ @Override
+ public LesserWerewolf copy() {
+ return new LesserWerewolf(this);
+ }
+}
+
+class LesserWerewolfEffect extends OneShotEffect {
+
+ public LesserWerewolfEffect() {
+ super(Outcome.Detriment);
+ this.staticText = "If {this}’s power is 1 or more, it gets -1/-0 until end of turn and put a -0/-1 counter on target creature blocking or blocked by {this}";
+ }
+
+ public LesserWerewolfEffect(final LesserWerewolfEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LesserWerewolfEffect copy() {
+ return new LesserWerewolfEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
+ Permanent targetPermanent = game.getPermanentOrLKIBattlefield(targetPointer.getFirst(game, source));
+ if (controller != null && sourcePermanent != null && targetPermanent != null) {
+ if (sourcePermanent.getPower().getValue() >= 1) {
+ game.addEffect(new BoostSourceEffect(-1, 0, Duration.EndOfTurn), source);
+ new AddCountersTargetEffect(new BoostCounter(0, -1), outcome).apply(game, source);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/l/LethargyTrap.java b/Mage.Sets/src/mage/cards/l/LethargyTrap.java
index d06efc253cd..ecad4964478 100644
--- a/Mage.Sets/src/mage/cards/l/LethargyTrap.java
+++ b/Mage.Sets/src/mage/cards/l/LethargyTrap.java
@@ -26,7 +26,7 @@ public final class LethargyTrap extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creatures");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public LethargyTrap(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/Liability.java b/Mage.Sets/src/mage/cards/l/Liability.java
index 6973291332c..0c1930b7ede 100644
--- a/Mage.Sets/src/mage/cards/l/Liability.java
+++ b/Mage.Sets/src/mage/cards/l/Liability.java
@@ -1,11 +1,8 @@
-
package mage.cards.l;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@@ -18,20 +15,21 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author L_J
*/
public final class Liability extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("a nontoken permanent");
-
+
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
-
+
public Liability(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}{B}");
// Whenever a nontoken permanent is put into a player's graveyard from the battlefield, that player loses 1 life.
this.addAbility(new PutIntoGraveFromBattlefieldAllTriggeredAbility(new LiabilityEffect(), false, filter, true));
diff --git a/Mage.Sets/src/mage/cards/l/Lich.java b/Mage.Sets/src/mage/cards/l/Lich.java
index 523d67acc0a..e77d1031f57 100644
--- a/Mage.Sets/src/mage/cards/l/Lich.java
+++ b/Mage.Sets/src/mage/cards/l/Lich.java
@@ -41,7 +41,7 @@ public final class Lich extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{B}{B}{B}{B}");
// As Lich enters the battlefield, you lose life equal to your life total.
- this.addAbility(new EntersBattlefieldAbility(new LoseLifeSourceControllerEffect(new ControllerLifeCount()), null, "As Lich enters the battlefield, you lose life equal to your life total.", null));
+ this.addAbility(new EntersBattlefieldAbility(new LoseLifeSourceControllerEffect(ControllerLifeCount.instance), null, "As Lich enters the battlefield, you lose life equal to your life total.", null));
// You don't lose the game for having 0 or less life.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontLoseByZeroOrLessLifeEffect(Duration.WhileOnBattlefield)));
@@ -145,7 +145,7 @@ class LichDamageEffect extends OneShotEffect {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("nontoken permanent");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
private int amount = 0;
diff --git a/Mage.Sets/src/mage/cards/l/LiciaSanguineTribune.java b/Mage.Sets/src/mage/cards/l/LiciaSanguineTribune.java
index 05adae41876..599139b73f0 100644
--- a/Mage.Sets/src/mage/cards/l/LiciaSanguineTribune.java
+++ b/Mage.Sets/src/mage/cards/l/LiciaSanguineTribune.java
@@ -112,9 +112,9 @@ class YouGainLifeCount implements DynamicValue {
}
public int calculate(Game game, UUID controllerId) {
- PlayerGainedLifeWatcher watcher = (PlayerGainedLifeWatcher) game.getState().getWatchers().get(PlayerGainedLifeWatcher.class.getSimpleName());
+ PlayerGainedLifeWatcher watcher = game.getState().getWatcher(PlayerGainedLifeWatcher.class);
if (watcher != null) {
- return watcher.getLiveGained(controllerId);
+ return watcher.getLifeGained(controllerId);
}
return 0;
}
diff --git a/Mage.Sets/src/mage/cards/l/LiegeOfThePit.java b/Mage.Sets/src/mage/cards/l/LiegeOfThePit.java
index e3d9eea26ea..7e63ce8903c 100644
--- a/Mage.Sets/src/mage/cards/l/LiegeOfThePit.java
+++ b/Mage.Sets/src/mage/cards/l/LiegeOfThePit.java
@@ -86,7 +86,7 @@ class LiegeOfThePitEffect extends OneShotEffect {
}
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature other than " + sourcePermanent.getName());
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
Target target = new TargetControlledCreaturePermanent(1, 1, filter, true);
if (target.canChoose(source.getSourceId(), player.getId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java b/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java
index 7aabdf3f900..a6ff60b5017 100644
--- a/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java
+++ b/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java
@@ -39,7 +39,7 @@ public final class LifecraftAwakening extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{G}");
// Put X +1/+1 counters on target artifact you control. If it isn't a creature or Vehicle, it becomes a 0/0 Construct artifact creature.
- ManacostVariableValue manaX = new ManacostVariableValue();
+ ManacostVariableValue manaX = ManacostVariableValue.instance;
getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance(), manaX));
getSpellAbility().addTarget(new TargetArtifactPermanent(filter));
getSpellAbility().addEffect(new LifecraftAwakeningEffect());
diff --git a/Mage.Sets/src/mage/cards/l/LightUpTheStage.java b/Mage.Sets/src/mage/cards/l/LightUpTheStage.java
index 2a48c3106cf..21aa8ff2b4a 100644
--- a/Mage.Sets/src/mage/cards/l/LightUpTheStage.java
+++ b/Mage.Sets/src/mage/cards/l/LightUpTheStage.java
@@ -26,11 +26,11 @@ public final class LightUpTheStage extends CardImpl {
public LightUpTheStage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}");
- // Spectacle {R}
- this.addAbility(new SpectacleAbility(this, new ManaCostsImpl("{R}")));
-
// Exile the top two cards of your library. Until the end of your next turn, you may play those cards.
this.getSpellAbility().addEffect(new LightUpTheStageEffect());
+
+ // Spectacle {R}
+ this.addAbility(new SpectacleAbility(this, new ManaCostsImpl("{R}")));
}
public LightUpTheStage(final LightUpTheStage card) {
@@ -45,12 +45,12 @@ public final class LightUpTheStage extends CardImpl {
class LightUpTheStageEffect extends OneShotEffect {
- public LightUpTheStageEffect() {
+ LightUpTheStageEffect() {
super(Outcome.PlayForFree);
this.staticText = "Exile the top two cards of your library. Until the end of your next turn, you may play those cards";
}
- public LightUpTheStageEffect(final LightUpTheStageEffect effect) {
+ private LightUpTheStageEffect(final LightUpTheStageEffect effect) {
super(effect);
}
@@ -62,10 +62,10 @@ class LightUpTheStageEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- Card sourceCard = game.getCard(source.getSourceId());
if (controller != null) {
Set cards = controller.getLibrary().getTopCards(game, 2);
- controller.moveCardsToExile(cards, source, game, true, CardUtil.getCardExileZoneId(game, source), sourceCard.getIdName());
+ Card sourceCard = game.getCard(source.getSourceId());
+ controller.moveCardsToExile(cards, source, game, true, CardUtil.getCardExileZoneId(game, source), sourceCard != null ? sourceCard.getIdName() : "");
for (Card card : cards) {
ContinuousEffect effect = new LightUpTheStageMayPlayEffect();
@@ -83,12 +83,12 @@ class LightUpTheStageMayPlayEffect extends AsThoughEffectImpl {
private int castOnTurn = 0;
- public LightUpTheStageMayPlayEffect() {
+ LightUpTheStageMayPlayEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit);
this.staticText = "Until the end of your next turn, you may play that card.";
}
- public LightUpTheStageMayPlayEffect(final LightUpTheStageMayPlayEffect effect) {
+ private LightUpTheStageMayPlayEffect(final LightUpTheStageMayPlayEffect effect) {
super(effect);
castOnTurn = effect.castOnTurn;
}
@@ -107,9 +107,7 @@ class LightUpTheStageMayPlayEffect extends AsThoughEffectImpl {
@Override
public boolean isInactive(Ability source, Game game) {
if (castOnTurn != game.getTurnNum() && game.getPhase().getStep().getType() == PhaseStep.END_TURN) {
- if (game.isActivePlayer(source.getControllerId())) {
- return true;
- }
+ return game.isActivePlayer(source.getControllerId());
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/l/LightkeeperOfEmeria.java b/Mage.Sets/src/mage/cards/l/LightkeeperOfEmeria.java
index 05cad39bf7e..2b3be08030a 100644
--- a/Mage.Sets/src/mage/cards/l/LightkeeperOfEmeria.java
+++ b/Mage.Sets/src/mage/cards/l/LightkeeperOfEmeria.java
@@ -35,7 +35,7 @@ public final class LightkeeperOfEmeria extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Lightkeeper of Emeria enters the battlefield, you gain 2 life for each time it was kicked.
- Effect effect = new GainLifeEffect(new MultipliedValue(new MultikickerCount(), 2));
+ Effect effect = new GainLifeEffect(new MultipliedValue(MultikickerCount.instance, 2));
effect.setText("you gain 2 life for each time it was kicked");
this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
}
diff --git a/Mage.Sets/src/mage/cards/l/LightningCoils.java b/Mage.Sets/src/mage/cards/l/LightningCoils.java
index 22885e7b29c..9b290065a0f 100644
--- a/Mage.Sets/src/mage/cards/l/LightningCoils.java
+++ b/Mage.Sets/src/mage/cards/l/LightningCoils.java
@@ -32,7 +32,7 @@ public final class LightningCoils extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a nontoken creature you control");
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public LightningCoils(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java
index f6a0956905e..f4db5ab2b78 100644
--- a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java
+++ b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java
@@ -1,4 +1,3 @@
-
package mage.cards.l;
import java.util.UUID;
@@ -21,6 +20,7 @@ import mage.filter.predicate.mageobject.SupertypePredicate;
import mage.game.Game;
import mage.game.command.emblems.LilianaDefiantNecromancerEmblem;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
@@ -28,14 +28,12 @@ import mage.target.common.TargetCardInYourGraveyard;
*/
public final class LilianaDefiantNecromancer extends CardImpl {
- private static final FilterCreatureCard filter = new FilterCreatureCard("nonlegendary creature with converted mana cost X from your graveyard");
+ protected static final FilterCreatureCard filter = new FilterCreatureCard("nonlegendary creature with converted mana cost X from your graveyard");
static {
filter.add(Predicates.not(new SupertypePredicate(SuperType.LEGENDARY)));
}
- UUID ability2Id;
-
public LilianaDefiantNecromancer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
this.addSuperType(SuperType.LEGENDARY);
@@ -49,36 +47,18 @@ public final class LilianaDefiantNecromancer extends CardImpl {
// +2: Each player discards a card.
this.addAbility(new LoyaltyAbility(new DiscardEachPlayerEffect(1, false), 2));
- //TODO: Make ability properly copiable
// -X: Return target nonlegendary creature with converted mana cost X from your graveyard to the battlefield.
Ability ability = new LoyaltyAbility(new ReturnFromGraveyardToBattlefieldTargetEffect());
- ability2Id = ability.getOriginalId();
ability.addTarget(new TargetCardInYourGraveyard(filter));
+ ability.setTargetAdjuster(LilianaDefiantNecromancerAdjuster.instance);
this.addAbility(ability);
//-8: You get an emblem with "Whenever a creature dies, return it to the battlefield under your control at the beginning of the next end step.";
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new LilianaDefiantNecromancerEmblem()), -8));
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(ability2Id)) {
- int cmc = 0;
- for (Cost cost : ability.getCosts()) {
- if (cost instanceof PayVariableLoyaltyCost) {
- cmc = ((PayVariableLoyaltyCost) cost).getAmount();
- }
- }
- FilterCard newFilter = filter.copy();
- newFilter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, cmc));
- ability.getTargets().clear();
- ability.addTarget(new TargetCardInYourGraveyard(newFilter));
- }
- }
-
public LilianaDefiantNecromancer(final LilianaDefiantNecromancer card) {
super(card);
- this.ability2Id = card.ability2Id;
}
@Override
@@ -86,3 +66,21 @@ public final class LilianaDefiantNecromancer extends CardImpl {
return new LilianaDefiantNecromancer(this);
}
}
+
+enum LilianaDefiantNecromancerAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int cmc = 0;
+ for (Cost cost : ability.getCosts()) {
+ if (cost instanceof PayVariableLoyaltyCost) {
+ cmc = ((PayVariableLoyaltyCost) cost).getAmount();
+ }
+ }
+ FilterCard newFilter = LilianaDefiantNecromancer.filter.copy();
+ newFilter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, cmc));
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCardInYourGraveyard(newFilter));
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/l/LilianaHereticalHealer.java b/Mage.Sets/src/mage/cards/l/LilianaHereticalHealer.java
index c0ad532fb88..990e7a7b2e1 100644
--- a/Mage.Sets/src/mage/cards/l/LilianaHereticalHealer.java
+++ b/Mage.Sets/src/mage/cards/l/LilianaHereticalHealer.java
@@ -32,8 +32,8 @@ public final class LilianaHereticalHealer extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public LilianaHereticalHealer(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LingeringPhantom.java b/Mage.Sets/src/mage/cards/l/LingeringPhantom.java
index 380cfca8096..1a16edbbbdd 100644
--- a/Mage.Sets/src/mage/cards/l/LingeringPhantom.java
+++ b/Mage.Sets/src/mage/cards/l/LingeringPhantom.java
@@ -24,7 +24,7 @@ public final class LingeringPhantom extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a historic spell");
static {
- filter.add(new HistoricPredicate());
+ filter.add(HistoricPredicate.instance);
}
public LingeringPhantom(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LiquidFire.java b/Mage.Sets/src/mage/cards/l/LiquidFire.java
index 04b40d14139..32737ce082b 100644
--- a/Mage.Sets/src/mage/cards/l/LiquidFire.java
+++ b/Mage.Sets/src/mage/cards/l/LiquidFire.java
@@ -30,7 +30,7 @@ public final class LiquidFire extends CardImpl {
// As an additional cost to cast Liquid Fire, choose a number between 0 and 5.
this.getSpellAbility().addCost(new LiquidFireCost());
// Liquid Fire deals X damage to target creature and 5 minus X damage to that creature's controller, where X is the chosen number.
- DynamicValue choiceValue = new GetXValue();
+ DynamicValue choiceValue = GetXValue.instance;
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new LiquidFireEffect(choiceValue));
diff --git a/Mage.Sets/src/mage/cards/l/LivingInferno.java b/Mage.Sets/src/mage/cards/l/LivingInferno.java
index 5d8992a61e2..50e31e74718 100644
--- a/Mage.Sets/src/mage/cards/l/LivingInferno.java
+++ b/Mage.Sets/src/mage/cards/l/LivingInferno.java
@@ -1,9 +1,6 @@
package mage.cards.l;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -12,50 +9,38 @@ import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanentAmount;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
/**
- *
* @author LevelX2 & L_J
*/
public final class LivingInferno extends CardImpl {
- private final UUID originalId;
-
public LivingInferno(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{6}{R}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{6}{R}{R}");
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(8);
this.toughness = new MageInt(5);
// {T}: Living Inferno deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to Living Inferno.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LivingInfernoEffect(), new TapSourceCost());
- ability.addTarget(new TargetCreaturePermanentAmount(1));
+ ability.setTargetAdjuster(LivingInfernoAdjuster.instance);
this.addAbility(ability);
- originalId = ability.getOriginalId();
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if(ability.getOriginalId().equals(originalId)) {
- Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId());
- if (sourcePermanent != null) {
- int xValue = sourcePermanent.getPower().getValue();
- ability.getTargets().clear();
- ability.addTarget(new TargetCreaturePermanentAmount(xValue));
- }
- }
}
public LivingInferno(final LivingInferno card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -64,11 +49,26 @@ public final class LivingInferno extends CardImpl {
}
}
+enum LivingInfernoAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(ability.getSourceId());
+ if (sourcePermanent != null) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanentAmount(sourcePermanent.getPower().getValue()));
+ }
+ }
+}
+
class LivingInfernoEffect extends OneShotEffect {
public LivingInfernoEffect() {
super(Outcome.Benefit);
- this.staticText = "{this} deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to {this}";
+ this.staticText = "{this} deals damage equal to its power " +
+ "divided as you choose among any number of target creatures. " +
+ "Each of those creatures deals damage equal to its power to {this}";
}
public LivingInfernoEffect(final LivingInfernoEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/l/LivingLore.java b/Mage.Sets/src/mage/cards/l/LivingLore.java
index 7438a74bc3b..85b5d1144f9 100644
--- a/Mage.Sets/src/mage/cards/l/LivingLore.java
+++ b/Mage.Sets/src/mage/cards/l/LivingLore.java
@@ -14,12 +14,7 @@ import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Layer;
-import mage.constants.Outcome;
-import mage.constants.SubLayer;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.common.FilterInstantOrSorceryCard;
import mage.game.ExileZone;
import mage.game.Game;
@@ -36,7 +31,7 @@ public final class LivingLore extends CardImpl {
public LivingLore(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
- this.subtype.add("Avatar");
+ this.subtype.add(SubType.AVATAR);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
diff --git a/Mage.Sets/src/mage/cards/l/LivingTotem.java b/Mage.Sets/src/mage/cards/l/LivingTotem.java
index 1f1eb84004a..7c63adb3c53 100644
--- a/Mage.Sets/src/mage/cards/l/LivingTotem.java
+++ b/Mage.Sets/src/mage/cards/l/LivingTotem.java
@@ -25,7 +25,7 @@ public final class LivingTotem extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public LivingTotem(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LlanowarBehemoth.java b/Mage.Sets/src/mage/cards/l/LlanowarBehemoth.java
index f0a02284140..2757f292e63 100644
--- a/Mage.Sets/src/mage/cards/l/LlanowarBehemoth.java
+++ b/Mage.Sets/src/mage/cards/l/LlanowarBehemoth.java
@@ -25,7 +25,7 @@ public final class LlanowarBehemoth extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public LlanowarBehemoth(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LoamDryad.java b/Mage.Sets/src/mage/cards/l/LoamDryad.java
index d4e1f9d8ebf..b2940609ab7 100644
--- a/Mage.Sets/src/mage/cards/l/LoamDryad.java
+++ b/Mage.Sets/src/mage/cards/l/LoamDryad.java
@@ -24,7 +24,7 @@ public final class LoamDryad extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public LoamDryad(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LodestoneMyr.java b/Mage.Sets/src/mage/cards/l/LodestoneMyr.java
index 274faad42ec..fcbd7bf7e82 100644
--- a/Mage.Sets/src/mage/cards/l/LodestoneMyr.java
+++ b/Mage.Sets/src/mage/cards/l/LodestoneMyr.java
@@ -26,7 +26,7 @@ public final class LodestoneMyr extends CardImpl {
private static final FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent("untapped artifact you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public LodestoneMyr(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LogicKnot.java b/Mage.Sets/src/mage/cards/l/LogicKnot.java
index 49b6eaff913..daa6d03ee13 100644
--- a/Mage.Sets/src/mage/cards/l/LogicKnot.java
+++ b/Mage.Sets/src/mage/cards/l/LogicKnot.java
@@ -24,7 +24,7 @@ public final class LogicKnot extends CardImpl {
this.addAbility(new DelveAbility());
// Counter target spell unless its controller pays {X}.
- this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetSpell());
}
diff --git a/Mage.Sets/src/mage/cards/l/LordOfThePit.java b/Mage.Sets/src/mage/cards/l/LordOfThePit.java
index 53a3a56b398..e957943c5a8 100644
--- a/Mage.Sets/src/mage/cards/l/LordOfThePit.java
+++ b/Mage.Sets/src/mage/cards/l/LordOfThePit.java
@@ -78,7 +78,7 @@ class LordOfThePitEffect extends OneShotEffect {
}
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature other than " + sourcePermanent.getName());
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
Target target = new TargetControlledCreaturePermanent(1, 1, filter, true);
if (target.canChoose(source.getSourceId(), player.getId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/l/LordWindgrace.java b/Mage.Sets/src/mage/cards/l/LordWindgrace.java
index a4126678c59..517407e8882 100644
--- a/Mage.Sets/src/mage/cards/l/LordWindgrace.java
+++ b/Mage.Sets/src/mage/cards/l/LordWindgrace.java
@@ -10,19 +10,20 @@ import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.cards.Card;
-import mage.constants.SubType;
-import mage.constants.SuperType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.SuperType;
import mage.constants.TargetController;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterLandCard;
import mage.filter.predicate.other.OwnerPredicate;
import mage.game.Game;
import mage.game.permanent.token.CatWarriorToken;
import mage.players.Player;
-import mage.target.common.TargetCardInASingleGraveyard;
+import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetNonlandPermanent;
/**
@@ -49,9 +50,9 @@ public final class LordWindgrace extends CardImpl {
// -3: Return up to two target land cards from your graveyard to the battlefield.
Ability ability = new LoyaltyAbility(
- new ReturnFromGraveyardToBattlefieldTargetEffect(), -3
+ new ReturnFromGraveyardToBattlefieldTargetEffect().setText("return up to two target land cards from your graveyard to the battlefield"), -3
);
- ability.addTarget(new TargetCardInASingleGraveyard(0, 2, filter));
+ ability.addTarget(new TargetCardInYourGraveyard(0, 2, filter));
this.addAbility(ability);
// -11: Destroy up to six target nonland permanents, then create six 2/2 green Cat Warrior creature tokens with forestwalk.
@@ -61,7 +62,7 @@ public final class LordWindgrace extends CardImpl {
.setText(", then create six 2/2 green Cat Warrior "
+ "creature tokens with forestwalk")
);
- ability.addTarget(new TargetNonlandPermanent(0, 6, false));
+ ability.addTarget(new TargetNonlandPermanent(0, 6, StaticFilters.FILTER_PERMANENTS_NON_LAND, false));
this.addAbility(ability);
// Lord Windgrace can be your commander.
diff --git a/Mage.Sets/src/mage/cards/l/LoreseekersStone.java b/Mage.Sets/src/mage/cards/l/LoreseekersStone.java
index 091e5a49c3d..784b468a7dd 100644
--- a/Mage.Sets/src/mage/cards/l/LoreseekersStone.java
+++ b/Mage.Sets/src/mage/cards/l/LoreseekersStone.java
@@ -1,28 +1,22 @@
-
package mage.cards.l;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.CostModificationType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class LoreseekersStone extends CardImpl {
@@ -31,17 +25,11 @@ public final class LoreseekersStone extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{6}");
// {3}, {T}: Draw three cards. This ability costs {1} more to activate for each card in your hand.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(3), new GenericManaCost(3));
- ability.addCost(new TapSourceCost());
- for (Effect effect : ability.getEffects()) {
- effect.setText("Draw three cards. This ability costs {1} more to activate for each card in your hand");
- }
- this.addAbility(ability);
- this.addAbility(new SimpleStaticAbility(Zone.ALL, new LoreseekersStoneCostIncreasingEffect(ability.getOriginalId())));
-
+ this.addAbility(new LoreseekersStoneActivatedAbility());
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new LoreseekersStoneCostIncreasingEffect()));
}
- public LoreseekersStone(final LoreseekersStone card) {
+ private LoreseekersStone(final LoreseekersStone card) {
super(card);
}
@@ -51,18 +39,34 @@ public final class LoreseekersStone extends CardImpl {
}
}
-class LoreseekersStoneCostIncreasingEffect extends CostModificationEffectImpl {
+class LoreseekersStoneActivatedAbility extends SimpleActivatedAbility {
- private final UUID originalId;
-
- LoreseekersStoneCostIncreasingEffect(UUID originalId) {
- super(Duration.EndOfGame, Outcome.Benefit, CostModificationType.INCREASE_COST);
- this.originalId = originalId;
+ public LoreseekersStoneActivatedAbility() {
+ super(Zone.BATTLEFIELD,
+ new DrawCardSourceControllerEffect(3)
+ .setText("Draw three cards. This ability costs {1} more to activate for each card in your hand"),
+ new GenericManaCost(3));
+ this.addCost(new TapSourceCost());
}
- LoreseekersStoneCostIncreasingEffect(final LoreseekersStoneCostIncreasingEffect effect) {
+ private LoreseekersStoneActivatedAbility(final LoreseekersStoneActivatedAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public LoreseekersStoneActivatedAbility copy() {
+ return new LoreseekersStoneActivatedAbility(this);
+ }
+}
+
+class LoreseekersStoneCostIncreasingEffect extends CostModificationEffectImpl {
+
+ LoreseekersStoneCostIncreasingEffect() {
+ super(Duration.EndOfGame, Outcome.Benefit, CostModificationType.INCREASE_COST);
+ }
+
+ private LoreseekersStoneCostIncreasingEffect(final LoreseekersStoneCostIncreasingEffect effect) {
super(effect);
- this.originalId = effect.originalId;
}
@Override
@@ -76,12 +80,11 @@ class LoreseekersStoneCostIncreasingEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
- return abilityToModify.getOriginalId().equals(originalId);
+ return (abilityToModify instanceof LoreseekersStoneActivatedAbility) && abilityToModify.getSourceId().equals(source.getSourceId());
}
@Override
public LoreseekersStoneCostIncreasingEffect copy() {
return new LoreseekersStoneCostIncreasingEffect(this);
}
-
}
diff --git a/Mage.Sets/src/mage/cards/l/LotusVale.java b/Mage.Sets/src/mage/cards/l/LotusVale.java
index 1d13d07a893..052c1c11eb9 100644
--- a/Mage.Sets/src/mage/cards/l/LotusVale.java
+++ b/Mage.Sets/src/mage/cards/l/LotusVale.java
@@ -26,7 +26,7 @@ public final class LotusVale extends CardImpl {
private static final FilterControlledLandPermanent filter = new FilterControlledLandPermanent("two untapped lands");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public LotusVale(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java b/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java
index 9499bda49ec..67b4a4bde5d 100644
--- a/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java
+++ b/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java
@@ -53,7 +53,7 @@ class LudevicNecroAlchemistCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
+ PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class);
PlayerList playerList = game.getState().getPlayerList().copy();
Player currentPlayer;
UUID sourcePlayerId = source.getControllerId();
@@ -65,7 +65,7 @@ class LudevicNecroAlchemistCondition implements Condition {
currentPlayer = playerList.getNext(game);
while (watcher != null && currentPlayer != null) {
- if (!Objects.equals(currentPlayer.getId(), sourcePlayerId) && watcher.getLiveLost(currentPlayer.getId()) > 0) {
+ if (!Objects.equals(currentPlayer.getId(), sourcePlayerId) && watcher.getLifeLost(currentPlayer.getId()) > 0) {
return true;
}
if (Objects.equals(currentPlayer, firstPlayer)) {
diff --git a/Mage.Sets/src/mage/cards/l/LullmageMentor.java b/Mage.Sets/src/mage/cards/l/LullmageMentor.java
index eebcda5ac9b..7262f0752cd 100644
--- a/Mage.Sets/src/mage/cards/l/LullmageMentor.java
+++ b/Mage.Sets/src/mage/cards/l/LullmageMentor.java
@@ -32,7 +32,7 @@ public final class LullmageMentor extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.MERFOLK));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public LullmageMentor(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/l/LumberingBattlement.java b/Mage.Sets/src/mage/cards/l/LumberingBattlement.java
new file mode 100644
index 00000000000..38f3c1022c5
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/l/LumberingBattlement.java
@@ -0,0 +1,164 @@
+package mage.cards.l;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.filter.predicate.permanent.TokenPredicate;
+import mage.game.ExileZone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.TargetPermanent;
+import mage.util.CardUtil;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
+import static mage.constants.Outcome.Benefit;
+
+/**
+ * @author TheElk801
+ */
+public final class LumberingBattlement extends CardImpl {
+
+ public LumberingBattlement(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}");
+
+ this.subtype.add(SubType.BEAST);
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // Vigilance
+ this.addAbility(VigilanceAbility.getInstance());
+
+ // When Lumbering Battlement enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new LumberingBattlementEffect());
+ ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()));
+ this.addAbility(ability);
+
+ // Lumbering Battlement gets +2/+2 for each card exiled with it.
+ this.addAbility(new SimpleStaticAbility(new BoostSourceEffect(
+ LumberingBattlementValue.instance,
+ LumberingBattlementValue.instance,
+ Duration.WhileOnBattlefield
+ ).setText("{this} gets +2/+2 for each card exiled with it.")));
+ }
+
+ private LumberingBattlement(final LumberingBattlement card) {
+ super(card);
+ }
+
+ @Override
+ public LumberingBattlement copy() {
+ return new LumberingBattlement(this);
+ }
+}
+
+class LumberingBattlementEffect extends OneShotEffect {
+
+ private static final FilterPermanent filter
+ = new FilterControlledCreaturePermanent("other nontoken creatures");
+
+ static {
+ filter.add(Predicates.not(TokenPredicate.instance));
+ filter.add(AnotherPredicate.instance);
+ }
+
+ LumberingBattlementEffect() {
+ super(Benefit);
+ staticText = "exile any number of other nontoken creatures you control until it leaves the battlefield";
+ }
+
+ private LumberingBattlementEffect(final LumberingBattlementEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LumberingBattlementEffect copy() {
+ return new LumberingBattlementEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ Permanent sourcePerm = source.getSourcePermanentIfItStillExists(game);
+ if (player == null || sourcePerm == null) {
+ return false;
+ }
+ Target target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true);
+ if (!player.choose(Outcome.Neutral, target, source.getSourceId(), game)) {
+ return false;
+ }
+ Set cards = new HashSet();
+ for (UUID targetId : target.getTargets()) {
+ Permanent permanent = game.getPermanent(targetId);
+ if (permanent != null) {
+ cards.add(permanent);
+ }
+ }
+ return player.moveCardsToExile(
+ cards, source, game, true,
+ CardUtil.getCardExileZoneId(game, source), sourcePerm.getIdName()
+ );
+ }
+}
+
+enum LumberingBattlementValue implements DynamicValue {
+ instance;
+
+ @Override
+ public int calculate(Game game, Ability sourceAbility, Effect effect) {
+ if (sourceAbility == null) {
+ return 0;
+ }
+ ExileZone exileZone = game.getExile().getExileZone(CardUtil.getExileZoneId(
+ game, sourceAbility.getSourceId(),
+ sourceAbility.getSourceObjectZoneChangeCounter()
+ ));
+ if (exileZone == null) {
+ exileZone = game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, sourceAbility));
+ }
+ if (exileZone == null) {
+ return 0;
+ }
+ int counter = 0;
+ for (UUID cardId : exileZone) {
+ Card card = game.getCard(cardId);
+ if (card != null) {
+ counter++;
+ }
+ }
+ return 2 * counter;
+ }
+
+ @Override
+ public DynamicValue copy() {
+ return instance;
+ }
+
+ @Override
+ public String getMessage() {
+ return "";
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/l/LuminarchAscension.java b/Mage.Sets/src/mage/cards/l/LuminarchAscension.java
index b2710993d13..e0382cabbbb 100644
--- a/Mage.Sets/src/mage/cards/l/LuminarchAscension.java
+++ b/Mage.Sets/src/mage/cards/l/LuminarchAscension.java
@@ -29,7 +29,7 @@ import mage.watchers.common.PlayerLostLifeWatcher;
*/
public final class LuminarchAscension extends CardImpl {
- private String rule = "At the beginning of each opponent's end step, if you didn't lose life this turn, you may put a quest counter on {this}. (Damage causes loss of life.)";
+ private static final String rule = "At the beginning of each opponent's end step, if you didn't lose life this turn, you may put a quest counter on {this}. (Damage causes loss of life.)";
public LuminarchAscension(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
@@ -119,9 +119,9 @@ enum YouLostNoLifeThisTurnCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get(PlayerLostLifeWatcher.class.getSimpleName());
+ PlayerLostLifeWatcher watcher = game.getState().getWatcher(PlayerLostLifeWatcher.class);
if (watcher != null) {
- return (watcher.getLiveLost(source.getControllerId()) == 0);
+ return (watcher.getLifeLost(source.getControllerId()) == 0);
}
return false;
}
diff --git a/Mage.Sets/src/mage/cards/l/LuminatePrimordial.java b/Mage.Sets/src/mage/cards/l/LuminatePrimordial.java
index ce678715e65..e35a5c6b043 100644
--- a/Mage.Sets/src/mage/cards/l/LuminatePrimordial.java
+++ b/Mage.Sets/src/mage/cards/l/LuminatePrimordial.java
@@ -1,7 +1,6 @@
package mage.cards.l;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -10,8 +9,8 @@ import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
@@ -19,15 +18,17 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class LuminatePrimordial extends CardImpl {
public LuminatePrimordial(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}{W}");
this.subtype.add(SubType.AVATAR);
this.power = new MageInt(4);
@@ -38,23 +39,9 @@ public final class LuminatePrimordial extends CardImpl {
// When Luminate Primordial enters the battlefield, for each opponent, exile up to one target creature
// that player controls and that player gains life equal to its power.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new LuminatePrimordialEffect(),false));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- ability.getTargets().clear();
- for(UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature from opponent " + opponent.getLogName());
- filter.add(new ControllerIdPredicate(opponentId));
- TargetCreaturePermanent target = new TargetCreaturePermanent(0,1, filter,false);
- ability.addTarget(target);
- }
- }
- }
+ Ability ability = new EntersBattlefieldTriggeredAbility(new LuminatePrimordialEffect(), false);
+ ability.setTargetAdjuster(LuminatePrimordialAdjuster.instance);
+ this.addAbility(ability);
}
public LuminatePrimordial(final LuminatePrimordial card) {
@@ -67,6 +54,24 @@ public final class LuminatePrimordial extends CardImpl {
}
}
+enum LuminatePrimordialAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null) {
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature from opponent " + opponent.getLogName());
+ filter.add(new ControllerIdPredicate(opponentId));
+ TargetCreaturePermanent target = new TargetCreaturePermanent(0, 1, filter, false);
+ ability.addTarget(target);
+ }
+ }
+ }
+}
+
class LuminatePrimordialEffect extends OneShotEffect {
public LuminatePrimordialEffect() {
@@ -85,7 +90,7 @@ class LuminatePrimordialEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- for (Target target: source.getTargets()) {
+ for (Target target : source.getTargets()) {
if (target instanceof TargetCreaturePermanent) {
Permanent targetCreature = game.getPermanent(target.getFirstTarget());
if (targetCreature != null && !targetCreature.isControlledBy(source.getControllerId())) {
diff --git a/Mage.Sets/src/mage/cards/l/LureOfPrey.java b/Mage.Sets/src/mage/cards/l/LureOfPrey.java
index c6b81a46c8e..7189a59a681 100644
--- a/Mage.Sets/src/mage/cards/l/LureOfPrey.java
+++ b/Mage.Sets/src/mage/cards/l/LureOfPrey.java
@@ -69,7 +69,7 @@ class LureOfPreyRestrictionEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getSourceId().equals(source.getSourceId())) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null) {
for (UUID playerId : game.getOpponents(source.getControllerId())) {
if (watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(playerId) != 0) {
diff --git a/Mage.Sets/src/mage/cards/m/MacabreMockery.java b/Mage.Sets/src/mage/cards/m/MacabreMockery.java
new file mode 100644
index 00000000000..5b63264a564
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/m/MacabreMockery.java
@@ -0,0 +1,92 @@
+package mage.cards.m;
+
+import mage.abilities.Ability;
+import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.SacrificeTargetEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCardInOpponentsGraveyard;
+import mage.target.targetpointer.FixedTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class MacabreMockery extends CardImpl {
+
+ public MacabreMockery(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}{R}");
+
+ // Put target creature card from an opponent's graveyard onto the battlefield under your control. It gets +2/+0 and gains haste until end of turn. Sacrifice it at the beginning of the next end step.
+ this.getSpellAbility().addEffect(new MacabreMockeryEffect());
+ this.getSpellAbility().addTarget(new TargetCardInOpponentsGraveyard(StaticFilters.FILTER_CARD_CREATURE));
+ }
+
+ private MacabreMockery(final MacabreMockery card) {
+ super(card);
+ }
+
+ @Override
+ public MacabreMockery copy() {
+ return new MacabreMockery(this);
+ }
+}
+
+class MacabreMockeryEffect extends OneShotEffect {
+
+ MacabreMockeryEffect() {
+ super(Outcome.PutCreatureInPlay);
+ staticText = "Put target creature card from an opponent's graveyard onto the battlefield under your control. " +
+ "It gets +2/+0 and gains haste until end of turn. Sacrifice it at the beginning of the next end step.";
+ }
+
+ private MacabreMockeryEffect(final MacabreMockeryEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public MacabreMockeryEffect copy() {
+ return new MacabreMockeryEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Card card = game.getCard(getTargetPointer().getFirst(game, source));
+ if (card == null) {
+ return false;
+ }
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null || !controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
+ return false;
+ }
+ Permanent permanent = game.getPermanent(card.getId());
+ if (permanent == null) {
+ return false;
+ }
+ ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom);
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ game.addEffect(effect, source);
+ effect = new BoostTargetEffect(2, 0, Duration.EndOfTurn);
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ game.addEffect(effect, source);
+ Effect sacrificeEffect = new SacrificeTargetEffect("exile " + permanent.getLogName());
+ sacrificeEffect.setTargetPointer(new FixedTarget(permanent, game));
+ game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(
+ sacrificeEffect, TargetController.YOU
+ ), source);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/m/MacabreWaltz.java b/Mage.Sets/src/mage/cards/m/MacabreWaltz.java
index a37c9811ae1..c1623e6f2b1 100644
--- a/Mage.Sets/src/mage/cards/m/MacabreWaltz.java
+++ b/Mage.Sets/src/mage/cards/m/MacabreWaltz.java
@@ -2,29 +2,31 @@
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
import mage.target.common.TargetCardInYourGraveyard;
-/**
- *
- * @author LoneFox
+import java.util.UUID;
+/**
+ * @author LoneFox
*/
public final class MacabreWaltz extends CardImpl {
+ private static final FilterCard filter = new FilterCreatureCard("creature cards from your graveyard");
+
public MacabreWaltz(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}");
// Return up to two target creature cards from your graveyard to your hand, then discard a card.
this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect());
- this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 2, new FilterCreatureCard("creature cards from your graveyard")));
- this.getSpellAbility().addEffect(new DiscardControllerEffect(1));
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 2, filter));
+ this.getSpellAbility().addEffect(new DiscardControllerEffect(1).setText(", then discard a card"));
}
public MacabreWaltz(final MacabreWaltz card) {
diff --git a/Mage.Sets/src/mage/cards/m/MadAuntie.java b/Mage.Sets/src/mage/cards/m/MadAuntie.java
index 465facd99c9..8e3f29ce38f 100644
--- a/Mage.Sets/src/mage/cards/m/MadAuntie.java
+++ b/Mage.Sets/src/mage/cards/m/MadAuntie.java
@@ -31,7 +31,7 @@ public final class MadAuntie extends CardImpl {
static {
filter1.add(new SubtypePredicate(SubType.GOBLIN));
- filter1.add(new AnotherPredicate());
+ filter1.add(AnotherPredicate.instance);
}
public MadAuntie(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MadDog.java b/Mage.Sets/src/mage/cards/m/MadDog.java
index f9206d7ec02..17254366cdf 100644
--- a/Mage.Sets/src/mage/cards/m/MadDog.java
+++ b/Mage.Sets/src/mage/cards/m/MadDog.java
@@ -58,18 +58,18 @@ enum MadDogCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
Permanent madDog = game.getPermanent(source.getSourceId());
- PermanentsEnteredBattlefieldWatcher watcher = (PermanentsEnteredBattlefieldWatcher) game.getState().getWatchers().get(PermanentsEnteredBattlefieldWatcher.class.getSimpleName());
- AttackedThisTurnWatcher watcher2 = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ PermanentsEnteredBattlefieldWatcher watcher = game.getState().getWatcher(PermanentsEnteredBattlefieldWatcher.class);
+ AttackedThisTurnWatcher watcher2 = game.getState().getWatcher(AttackedThisTurnWatcher.class);
if (watcher != null
&& watcher2 != null
&& madDog != null) {
// For some reason, compare did not work when checking the lists. Thus the interation.
List permanents = watcher.getThisTurnEnteringPermanents(source.getControllerId());
- if (!permanents.stream().noneMatch((p) -> (p.getId().equals(madDog.getId())))) {
+ if (permanents.stream().anyMatch((p) -> (p.getId().equals(madDog.getId())))) {
return false;
}
Set mor = watcher2.getAttackedThisTurnCreatures();
- if (!mor.stream().noneMatch((m) -> (m.getPermanent(game).equals(madDog)))) {
+ if (mor.stream().anyMatch((m) -> (m.getPermanent(game).equals(madDog)))) {
return false;
}
return true; // Mad Dog did not come into play this turn nor did he attack this turn. Sacrifice the hound.
diff --git a/Mage.Sets/src/mage/cards/m/MaddeningImp.java b/Mage.Sets/src/mage/cards/m/MaddeningImp.java
index 72cda096ce9..e76411ba6a1 100644
--- a/Mage.Sets/src/mage/cards/m/MaddeningImp.java
+++ b/Mage.Sets/src/mage/cards/m/MaddeningImp.java
@@ -160,7 +160,7 @@ class MaddeningImpDelayedDestroyEffect extends OneShotEffect {
continue;
}
// Creatures that attacked are safe.
- AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
if (watcher != null && watcher.getAttackedThisTurnCreatures().contains(mor)) {
continue;
}
diff --git a/Mage.Sets/src/mage/cards/m/MaelstromNexus.java b/Mage.Sets/src/mage/cards/m/MaelstromNexus.java
index c88f8d523ce..e1b2c2bde22 100644
--- a/Mage.Sets/src/mage/cards/m/MaelstromNexus.java
+++ b/Mage.Sets/src/mage/cards/m/MaelstromNexus.java
@@ -69,7 +69,7 @@ class MaelstromNexusGainCascadeFirstSpellEffect extends ContinuousEffectImpl {
// only spells cast, so no copies of spells
if ((stackObject instanceof Spell) && !stackObject.isCopy() && stackObject.isControlledBy(source.getControllerId())) {
Spell spell = (Spell) stackObject;
- FirstSpellCastThisTurnWatcher watcher = (FirstSpellCastThisTurnWatcher) game.getState().getWatchers().get(FirstSpellCastThisTurnWatcher.class.getSimpleName());
+ FirstSpellCastThisTurnWatcher watcher = game.getState().getWatcher(FirstSpellCastThisTurnWatcher.class);
if (watcher != null && spell.getId().equals(watcher.getIdOfFirstCastSpell(source.getControllerId()))) {
game.getState().addOtherAbility(spell.getCard(), cascadeAbility);
}
diff --git a/Mage.Sets/src/mage/cards/m/MageRingNetwork.java b/Mage.Sets/src/mage/cards/m/MageRingNetwork.java
index 3edaf7279c8..21506a8beca 100644
--- a/Mage.Sets/src/mage/cards/m/MageRingNetwork.java
+++ b/Mage.Sets/src/mage/cards/m/MageRingNetwork.java
@@ -39,7 +39,7 @@ public final class MageRingNetwork extends CardImpl {
// {T}, Remove any number of storage counters from Mage-Ring Network: Add {C} for each storage counter removed this way.
ability = new DynamicManaAbility(
Mana.ColorlessMana(1),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new TapSourceCost(),
"Add {C} for each storage counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE));
diff --git a/Mage.Sets/src/mage/cards/m/MagetaTheLion.java b/Mage.Sets/src/mage/cards/m/MagetaTheLion.java
index 1a665bf335c..ac3636dcf5c 100644
--- a/Mage.Sets/src/mage/cards/m/MagetaTheLion.java
+++ b/Mage.Sets/src/mage/cards/m/MagetaTheLion.java
@@ -31,7 +31,7 @@ public final class MagetaTheLion extends CardImpl {
static {
filter.add(new CardTypePredicate(CardType.CREATURE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MagetaTheLion(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MagisterOfWorth.java b/Mage.Sets/src/mage/cards/m/MagisterOfWorth.java
index 289c1294458..4a0067ac5cf 100644
--- a/Mage.Sets/src/mage/cards/m/MagisterOfWorth.java
+++ b/Mage.Sets/src/mage/cards/m/MagisterOfWorth.java
@@ -92,7 +92,7 @@ class MagisterOfWorthVoteEffect extends OneShotEffect {
new MagisterOfWorthReturnFromGraveyardEffect().apply(game, source);
} else {
FilterPermanent filter = new FilterCreaturePermanent("creatures other than {this}");
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
new DestroyAllEffect(filter).apply(game, source);
}
return true;
diff --git a/Mage.Sets/src/mage/cards/m/MagmaBurst.java b/Mage.Sets/src/mage/cards/m/MagmaBurst.java
index 761e9fd419a..5d81a3b4bda 100644
--- a/Mage.Sets/src/mage/cards/m/MagmaBurst.java
+++ b/Mage.Sets/src/mage/cards/m/MagmaBurst.java
@@ -1,7 +1,6 @@
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.costs.common.SacrificeTargetCost;
@@ -13,18 +12,17 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.common.FilterControlledLandPermanent;
import mage.game.Game;
-import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetAnyTarget;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LoneFox
- *
*/
public final class MagmaBurst extends CardImpl {
- private final UUID originalId;
-
public MagmaBurst(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{R}");
@@ -32,21 +30,13 @@ public final class MagmaBurst extends CardImpl {
this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("two lands"), true))));
// Magma Burst deals 3 damage to any target. If Magma Burst was kicked, it deals 3 damage to another any target.
Effect effect = new DamageTargetEffect(3);
- effect.setText("{this} deals 3 damage to any target. if this spell was kicked, it deals 3 damage to another target.");
+ effect.setText("{this} deals 3 damage to any target. If this spell was kicked, it deals 3 damage to another target.");
this.getSpellAbility().addEffect(effect);
- originalId = this.getSpellAbility().getOriginalId();
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- ability.addTarget(new TargetAnyTarget(KickedCondition.instance.apply(game, ability) ? 2 : 1));
- }
+ this.getSpellAbility().setTargetAdjuster(MagmaBurstAdjuster.instance);
}
public MagmaBurst(final MagmaBurst card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -54,3 +44,12 @@ public final class MagmaBurst extends CardImpl {
return new MagmaBurst(this);
}
}
+
+enum MagmaBurstAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.addTarget(new TargetAnyTarget(KickedCondition.instance.apply(game, ability) ? 2 : 1));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/m/Magmaquake.java b/Mage.Sets/src/mage/cards/m/Magmaquake.java
index 98e00ba168f..4522a2d70b7 100644
--- a/Mage.Sets/src/mage/cards/m/Magmaquake.java
+++ b/Mage.Sets/src/mage/cards/m/Magmaquake.java
@@ -34,7 +34,7 @@ public final class Magmaquake extends CardImpl {
// Magmaquake deals X damage to each creature without flying and each planeswalker.
- this.getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filter));
+ this.getSpellAbility().addEffect(new DamageAllEffect(ManacostVariableValue.instance, filter));
}
public Magmaquake(final Magmaquake card) {
diff --git a/Mage.Sets/src/mage/cards/m/MagneticMountain.java b/Mage.Sets/src/mage/cards/m/MagneticMountain.java
index 5cb79401b80..92f9b301943 100644
--- a/Mage.Sets/src/mage/cards/m/MagneticMountain.java
+++ b/Mage.Sets/src/mage/cards/m/MagneticMountain.java
@@ -65,7 +65,7 @@ class MagneticMountainEffect extends OneShotEffect {
static {
filter2.add(new ColorPredicate(ObjectColor.BLUE));
- filter2.add(new TappedPredicate());
+ filter2.add(TappedPredicate.instance);
}
MagneticMountainEffect() {
diff --git a/Mage.Sets/src/mage/cards/m/MagusOfTheMind.java b/Mage.Sets/src/mage/cards/m/MagusOfTheMind.java
index 5ee6f042a78..26a6b6e3e2e 100644
--- a/Mage.Sets/src/mage/cards/m/MagusOfTheMind.java
+++ b/Mage.Sets/src/mage/cards/m/MagusOfTheMind.java
@@ -78,7 +78,10 @@ class MagusOfTheMindEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = source.getSourceObject(game);
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
+ if(watcher == null){
+ return false;
+ }
int stormCount = watcher.getAmountOfSpellsAllPlayersCastOnCurrentTurn() + 1;
if (controller != null && sourceObject != null) {
controller.shuffleLibrary(source, game);
diff --git a/Mage.Sets/src/mage/cards/m/MajesticHeliopterus.java b/Mage.Sets/src/mage/cards/m/MajesticHeliopterus.java
index 3ce444d6cf8..a302dcb0e5e 100644
--- a/Mage.Sets/src/mage/cards/m/MajesticHeliopterus.java
+++ b/Mage.Sets/src/mage/cards/m/MajesticHeliopterus.java
@@ -27,7 +27,7 @@ public final class MajesticHeliopterus extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target Dinosaur you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.DINOSAUR));
}
public MajesticHeliopterus(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MalakirSoothsayer.java b/Mage.Sets/src/mage/cards/m/MalakirSoothsayer.java
index a53374fa6e6..e55d840ec1a 100644
--- a/Mage.Sets/src/mage/cards/m/MalakirSoothsayer.java
+++ b/Mage.Sets/src/mage/cards/m/MalakirSoothsayer.java
@@ -31,7 +31,7 @@ public final class MalakirSoothsayer extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ALLY));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MalakirSoothsayer(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java b/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java
index 610edcb5894..b75bb70a686 100644
--- a/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java
+++ b/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java
@@ -1,9 +1,7 @@
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
@@ -16,38 +14,24 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.game.Game;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LoneFox
*/
public final class MaliciousAdvice extends CardImpl {
- private static final FilterPermanent filter = new FilterPermanent("artifacts, creatures, and/or lands");
-
- static {
- filter.add(Predicates.or(
- new CardTypePredicate(CardType.ARTIFACT),
- new CardTypePredicate(CardType.CREATURE),
- new CardTypePredicate(CardType.LAND)));
- }
-
public MaliciousAdvice(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}{B}");
// Tap X target artifacts, creatures, and/or lands. You lose X life.
Effect effect = new TapTargetEffect();
- effect.setText("X target artifacts, creatures, and/or lands");
+ effect.setText("X target artifacts, creatures, and/or lands.");
this.getSpellAbility().addEffect(effect);
- this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(new ManacostVariableValue()));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- ability.addTarget(new TargetPermanent(ability.getManaCostsToPay().getX(), filter));
- }
+ this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.instance));
+ this.getSpellAbility().setTargetAdjuster(MaliciousAdviceAdjuster.instance);
}
public MaliciousAdvice(final MaliciousAdvice card) {
@@ -59,3 +43,22 @@ public final class MaliciousAdvice extends CardImpl {
return new MaliciousAdvice(this);
}
}
+
+enum MaliciousAdviceAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPermanent filter = new FilterPermanent("artifacts, creatures, and/or lands");
+
+ static {
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.ARTIFACT),
+ new CardTypePredicate(CardType.CREATURE),
+ new CardTypePredicate(CardType.LAND)
+ ));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetPermanent(ability.getManaCostsToPay().getX(), filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/m/Malignus.java b/Mage.Sets/src/mage/cards/m/Malignus.java
index 7db53127549..156ede533cf 100644
--- a/Mage.Sets/src/mage/cards/m/Malignus.java
+++ b/Mage.Sets/src/mage/cards/m/Malignus.java
@@ -74,7 +74,7 @@ class HighestLifeTotalAmongOpponentsCount implements DynamicValue {
@Override
public DynamicValue copy() {
- return new CardsInControllerHandCount();
+ return CardsInControllerHandCount.instance;
}
@Override
diff --git a/Mage.Sets/src/mage/cards/m/ManaCache.java b/Mage.Sets/src/mage/cards/m/ManaCache.java
index 75437573ac8..54cb19a0bac 100644
--- a/Mage.Sets/src/mage/cards/m/ManaCache.java
+++ b/Mage.Sets/src/mage/cards/m/ManaCache.java
@@ -59,7 +59,7 @@ class ManaCacheEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterControlledLandPermanent();
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public ManaCacheEffect() {
diff --git a/Mage.Sets/src/mage/cards/m/ManaClash.java b/Mage.Sets/src/mage/cards/m/ManaClash.java
index 4c8fe0ee5c4..af3dba45bca 100644
--- a/Mage.Sets/src/mage/cards/m/ManaClash.java
+++ b/Mage.Sets/src/mage/cards/m/ManaClash.java
@@ -62,8 +62,8 @@ class ManaClashEffect extends OneShotEffect {
if (!targetOpponent.canRespond() || !controller.canRespond()) {
return false;
}
- boolean controllerFlip = controller.flipCoin(game);
- boolean opponentFlip = targetOpponent.flipCoin(game);
+ boolean controllerFlip = controller.flipCoin(source, game, false);
+ boolean opponentFlip = targetOpponent.flipCoin(source, game, false);
if (controllerFlip && opponentFlip) {
bothHeads = true;
}
diff --git a/Mage.Sets/src/mage/cards/m/ManaCrypt.java b/Mage.Sets/src/mage/cards/m/ManaCrypt.java
index 90535e37a6c..51c09adc938 100644
--- a/Mage.Sets/src/mage/cards/m/ManaCrypt.java
+++ b/Mage.Sets/src/mage/cards/m/ManaCrypt.java
@@ -58,7 +58,7 @@ class ManaCryptEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
- if (!player.flipCoin(game)) {
+ if (!player.flipCoin(source, game, true)) {
player.damage(3, source.getSourceId(), game, false, true);
}
return true;
diff --git a/Mage.Sets/src/mage/cards/m/ManaGeyser.java b/Mage.Sets/src/mage/cards/m/ManaGeyser.java
index 7e752d2ee9d..1069b455208 100644
--- a/Mage.Sets/src/mage/cards/m/ManaGeyser.java
+++ b/Mage.Sets/src/mage/cards/m/ManaGeyser.java
@@ -21,7 +21,7 @@ public final class ManaGeyser extends CardImpl {
private static final FilterLandPermanent filter = new FilterLandPermanent("tapped land your opponents control");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
public ManaGeyser(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/ManaMaze.java b/Mage.Sets/src/mage/cards/m/ManaMaze.java
index 29502df744e..2ff6f483348 100644
--- a/Mage.Sets/src/mage/cards/m/ManaMaze.java
+++ b/Mage.Sets/src/mage/cards/m/ManaMaze.java
@@ -63,7 +63,7 @@ class ManaMazeEffect extends ContinuousRuleModifyingEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
Card card = game.getCard(event.getSourceId());
if (card != null) {
- LastSpellCastWatcher watcher = (LastSpellCastWatcher) game.getState().getWatchers().get(LastSpellCastWatcher.class.getSimpleName());
+ LastSpellCastWatcher watcher = game.getState().getWatcher(LastSpellCastWatcher.class);
if (watcher != null && watcher.lastSpellCast != null) {
return !card.getColor(game).intersection(watcher.lastSpellCast.getColor(game)).isColorless();
}
@@ -87,7 +87,7 @@ class LastSpellCastWatcher extends Watcher {
Spell lastSpellCast = null;
public LastSpellCastWatcher() {
- super(LastSpellCastWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(LastSpellCastWatcher.class, WatcherScope.GAME);
}
public LastSpellCastWatcher(final LastSpellCastWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/m/ManaScrew.java b/Mage.Sets/src/mage/cards/m/ManaScrew.java
index f2228b428bc..24b3514c9ee 100644
--- a/Mage.Sets/src/mage/cards/m/ManaScrew.java
+++ b/Mage.Sets/src/mage/cards/m/ManaScrew.java
@@ -88,7 +88,7 @@ class ManaScrewEffect extends BasicManaEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
- if (player != null && player.flipCoin(game)) {
+ if (player != null && player.flipCoin(source, game, true)) {
player.getManaPool().addMana(getMana(game, source), game, source);
}
return true;
diff --git a/Mage.Sets/src/mage/cards/m/MarathWillOfTheWild.java b/Mage.Sets/src/mage/cards/m/MarathWillOfTheWild.java
index 7d5a219f10c..866ab25de72 100644
--- a/Mage.Sets/src/mage/cards/m/MarathWillOfTheWild.java
+++ b/Mage.Sets/src/mage/cards/m/MarathWillOfTheWild.java
@@ -52,12 +52,12 @@ public final class MarathWillOfTheWild extends CardImpl {
this.toughness = new MageInt(0);
// Marath, Will of the Wild enters the battlefield with a number of +1/+1 counters on it equal to the amount of mana spent to cast it.
- Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), new ManaSpentToCastCount(), true);
+ Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), ManaSpentToCastCount.instance, true);
effect.setText("with a number of +1/+1 counters on it equal to the amount of mana spent to cast it");
this.addAbility(new EntersBattlefieldAbility(effect));
// {X}, Remove X +1/+1 counters from Marath: Choose one - Put X +1/+1 counters on target creature;
- effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(0), new ManacostVariableValue());
+ effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(0), ManacostVariableValue.instance);
effect.setText("Put X +1/+1 counters on target creature");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}"));
ability.addCost(new MarathWillOfTheWildRemoveCountersCost());
@@ -65,7 +65,7 @@ public final class MarathWillOfTheWild extends CardImpl {
// or Marath deals X damage to any target;
Mode mode = new Mode();
- mode.addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ mode.addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
mode.addTarget(new TargetAnyTarget());
ability.addMode(mode);
@@ -132,7 +132,7 @@ class MarathWillOfTheWildCreateTokenEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
- int amount = new ManacostVariableValue().calculate(game, source, this);
+ int amount = ManacostVariableValue.instance.calculate(game, source, this);
Token token = new MarathWillOfTheWildElementalToken();
token.getPower().modifyBaseValue(amount);
token.getToughness().modifyBaseValue(amount);
@@ -165,7 +165,7 @@ class MarathWillOfTheWildRemoveCountersCost extends CostImpl {
@Override
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) {
- int amount = new ManacostVariableValue().calculate(game, ability, null);
+ int amount = ManacostVariableValue.instance.calculate(game, ability, null);
Permanent permanent = game.getPermanent(sourceId);
if (permanent != null && permanent.getCounters(game).getCount(CounterType.P1P1) >= amount) {
permanent.removeCounters(CounterType.P1P1.getName(), amount, game);
diff --git a/Mage.Sets/src/mage/cards/m/MaraudingBoneslasher.java b/Mage.Sets/src/mage/cards/m/MaraudingBoneslasher.java
index dfe8f338075..63ce40b3c2f 100644
--- a/Mage.Sets/src/mage/cards/m/MaraudingBoneslasher.java
+++ b/Mage.Sets/src/mage/cards/m/MaraudingBoneslasher.java
@@ -24,7 +24,7 @@ public final class MaraudingBoneslasher extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ZOMBIE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MaraudingBoneslasher(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MaraxusOfKeld.java b/Mage.Sets/src/mage/cards/m/MaraxusOfKeld.java
index 3619d29b3fd..9d560a6bb06 100644
--- a/Mage.Sets/src/mage/cards/m/MaraxusOfKeld.java
+++ b/Mage.Sets/src/mage/cards/m/MaraxusOfKeld.java
@@ -27,7 +27,7 @@ public final class MaraxusOfKeld extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("untapped artifacts, creatures, and lands you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(Predicates.or(
new CardTypePredicate(CardType.ARTIFACT),
new CardTypePredicate(CardType.CREATURE),
diff --git a/Mage.Sets/src/mage/cards/m/MarchOfSouls.java b/Mage.Sets/src/mage/cards/m/MarchOfSouls.java
index e8b392c6f70..afb8a682f0e 100644
--- a/Mage.Sets/src/mage/cards/m/MarchOfSouls.java
+++ b/Mage.Sets/src/mage/cards/m/MarchOfSouls.java
@@ -13,19 +13,16 @@ import mage.game.permanent.Permanent;
import mage.game.permanent.token.SpiritWhiteToken;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
- *
* @author LoneFox
-
*/
public final class MarchOfSouls extends CardImpl {
public MarchOfSouls(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}");
// Destroy all creatures. They can't be regenerated. For each creature destroyed this way, its controller creates a 1/1 white Spirit creature token with flying.
this.getSpellAbility().addEffect(new MarchOfSoulsEffect());
@@ -59,22 +56,18 @@ class MarchOfSoulsEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- List creatures = game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES,
- source.getControllerId(), source.getSourceId(), game);
Map playersWithCreatures = new HashMap<>();
- for(Permanent p : creatures) {
+ for (Permanent p : game.getBattlefield().getActivePermanents(
+ StaticFilters.FILTER_PERMANENT_CREATURES,
+ source.getControllerId(), source.getSourceId(), game
+ )) {
UUID controllerId = p.getControllerId();
- if(p.destroy(source.getSourceId(), game, true)) {
- if(playersWithCreatures.containsKey(controllerId)) {
- playersWithCreatures.put(controllerId, playersWithCreatures.get(controllerId) + 1);
- }
- else {
- playersWithCreatures.put(controllerId, 1);
- }
+ if (p.destroy(source.getSourceId(), game, true)) {
+ playersWithCreatures.put(controllerId, playersWithCreatures.getOrDefault(controllerId, 0) + 1);
}
}
SpiritWhiteToken token = new SpiritWhiteToken();
- for(UUID playerId : playersWithCreatures.keySet()) {
+ for (UUID playerId : playersWithCreatures.keySet()) {
token.putOntoBattlefield(playersWithCreatures.get(playerId), game, source.getSourceId(), playerId);
}
return true;
diff --git a/Mage.Sets/src/mage/cards/m/MarchOfTheMultitudes.java b/Mage.Sets/src/mage/cards/m/MarchOfTheMultitudes.java
index b15c38640f8..1f6f9fe5a4d 100644
--- a/Mage.Sets/src/mage/cards/m/MarchOfTheMultitudes.java
+++ b/Mage.Sets/src/mage/cards/m/MarchOfTheMultitudes.java
@@ -24,7 +24,7 @@ public final class MarchOfTheMultitudes extends CardImpl {
// Create X 1/1 white Soldier creature tokens with lifelink.
this.getSpellAbility().addEffect(new CreateTokenEffect(
new SoldierLifelinkToken(),
- new ManacostVariableValue()
+ ManacostVariableValue.instance
));
}
diff --git a/Mage.Sets/src/mage/cards/m/MarduAscendancy.java b/Mage.Sets/src/mage/cards/m/MarduAscendancy.java
index f7e370116ce..d821628d156 100644
--- a/Mage.Sets/src/mage/cards/m/MarduAscendancy.java
+++ b/Mage.Sets/src/mage/cards/m/MarduAscendancy.java
@@ -30,7 +30,7 @@ public final class MarduAscendancy extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control");
static {
- attackFilter.add(Predicates.not(new TokenPredicate()));
+ attackFilter.add(Predicates.not(TokenPredicate.instance));
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/m/MarkovCrusader.java b/Mage.Sets/src/mage/cards/m/MarkovCrusader.java
index 9df87e68fc5..328a6f715fa 100644
--- a/Mage.Sets/src/mage/cards/m/MarkovCrusader.java
+++ b/Mage.Sets/src/mage/cards/m/MarkovCrusader.java
@@ -29,7 +29,7 @@ public final class MarkovCrusader extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another Vampire");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.VAMPIRE));
}
diff --git a/Mage.Sets/src/mage/cards/m/Maro.java b/Mage.Sets/src/mage/cards/m/Maro.java
index e611397388c..68bd5c1faf2 100644
--- a/Mage.Sets/src/mage/cards/m/Maro.java
+++ b/Mage.Sets/src/mage/cards/m/Maro.java
@@ -27,7 +27,7 @@ public final class Maro extends CardImpl {
this.toughness = new MageInt(0);
// Maro's power and toughness are each equal to the number of cards in your hand.
- this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new CardsInControllerHandCount(), Duration.EndOfGame)));
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(CardsInControllerHandCount.instance, Duration.EndOfGame)));
}
public Maro(final Maro card) {
diff --git a/Mage.Sets/src/mage/cards/m/MarshalingTheTroops.java b/Mage.Sets/src/mage/cards/m/MarshalingTheTroops.java
index 5f4a56391ff..ac37de8471c 100644
--- a/Mage.Sets/src/mage/cards/m/MarshalingTheTroops.java
+++ b/Mage.Sets/src/mage/cards/m/MarshalingTheTroops.java
@@ -49,7 +49,7 @@ class MarshalingTheTroopsEffect extends OneShotEffect {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MarshalingTheTroopsEffect() {
diff --git a/Mage.Sets/src/mage/cards/m/MarshalsAnthem.java b/Mage.Sets/src/mage/cards/m/MarshalsAnthem.java
index 39c3a3503da..9fc03f6d555 100644
--- a/Mage.Sets/src/mage/cards/m/MarshalsAnthem.java
+++ b/Mage.Sets/src/mage/cards/m/MarshalsAnthem.java
@@ -1,80 +1,55 @@
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.condition.common.KickedCondition;
-import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.MultikickerCount;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
-import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.keyword.MultikickerAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.FilterCard;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.mageobject.CardTypePredicate;
-import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author jeffwadsworth
- *
*/
public final class MarshalsAnthem extends CardImpl {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control");
- private static final FilterCard filterCard = new FilterCard("creature card in your graveyard");
-
- static {
- filter.add(new ControllerPredicate(TargetController.YOU));
- filterCard.add(new CardTypePredicate(CardType.CREATURE));
- }
-
- private final UUID originalId;
+ private static final String rule = "return up to X target creature cards from your graveyard to the battlefield, " +
+ "where X is the number of times {this} was kicked";
public MarshalsAnthem(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{W}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
// Multikicker {1}{W}
this.addAbility(new MultikickerAbility("{1}{W}"));
// Creatures you control get +1/+1.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, false)));
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield)
+ ));
// When Marshal's Anthem enters the battlefield, return up to X target creature cards from your graveyard to the battlefield, where X is the number of times Marshal's Anthem was kicked.
- //TODO this should always trigger, even if it wasn't kicked
- Ability ability = new ConditionalInterveningIfTriggeredAbility(
- new EntersBattlefieldTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), false),
- KickedCondition.instance,
- "When {this} enters the battlefield, return up to X target creature cards from your graveyard to the battlefield, where X is the number of times {this} was kicked.");
- originalId = ability.getOriginalId();
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new ReturnFromGraveyardToBattlefieldTargetEffect().setText(rule), false
+ );
+ ability.setTargetAdjuster(MarshalsAnthemAdjuster.instance);
this.addAbility(ability);
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- ability.getTargets().clear();
- int numbTargets = new MultikickerCount().calculate(game, ability, null);
- if (numbTargets > 0) {
- ability.addTarget(new TargetCardInYourGraveyard(0, numbTargets, filterCard));
- }
- }
}
public MarshalsAnthem(final MarshalsAnthem card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -82,3 +57,17 @@ public final class MarshalsAnthem extends CardImpl {
return new MarshalsAnthem(this);
}
}
+
+enum MarshalsAnthemAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterCard filter = new FilterCreatureCard("creature card in your graveyard");
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int numbTargets = MultikickerCount.instance.calculate(game, ability, null);
+ if (numbTargets > 0) {
+ ability.addTarget(new TargetCardInYourGraveyard(0, numbTargets, filter));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/m/MartonStromgald.java b/Mage.Sets/src/mage/cards/m/MartonStromgald.java
index bc3a6cee4e0..1bfecf2a857 100644
--- a/Mage.Sets/src/mage/cards/m/MartonStromgald.java
+++ b/Mage.Sets/src/mage/cards/m/MartonStromgald.java
@@ -27,8 +27,8 @@ public final class MartonStromgald extends CardImpl {
private static final FilterBlockingCreature blockingFilter = new FilterBlockingCreature("blocking creature other than {this}");
static {
- attackingFilter.add(new AnotherPredicate());
- blockingFilter.add(new AnotherPredicate());
+ attackingFilter.add(AnotherPredicate.instance);
+ blockingFilter.add(AnotherPredicate.instance);
}
public MartonStromgald(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MartyrOfAshes.java b/Mage.Sets/src/mage/cards/m/MartyrOfAshes.java
index 9a99586b08a..c43c8a45e2d 100644
--- a/Mage.Sets/src/mage/cards/m/MartyrOfAshes.java
+++ b/Mage.Sets/src/mage/cards/m/MartyrOfAshes.java
@@ -48,7 +48,7 @@ public final class MartyrOfAshes extends CardImpl {
this.toughness = new MageInt(1);
// {2}, Reveal X red cards from your hand, Sacrifice Martyr of Ashes: Martyr of Ashes deals X damage to each creature without flying.
- Effect effect = new DamageAllEffect(new RevealTargetFromHandCostCount(), filterCreature);
+ Effect effect = new DamageAllEffect(RevealTargetFromHandCostCount.instance, filterCreature);
effect.setText("Martyr of Ashes deals X damage to each creature without flying.");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2));
ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0, Integer.MAX_VALUE, filterHand)));
diff --git a/Mage.Sets/src/mage/cards/m/MartyrOfBones.java b/Mage.Sets/src/mage/cards/m/MartyrOfBones.java
index e280e71f9ed..a90e986f1b8 100644
--- a/Mage.Sets/src/mage/cards/m/MartyrOfBones.java
+++ b/Mage.Sets/src/mage/cards/m/MartyrOfBones.java
@@ -1,7 +1,6 @@
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.Ability;
@@ -25,17 +24,17 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInASingleGraveyard;
import mage.target.common.TargetCardInHand;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author emerald000
*/
public final class MartyrOfBones extends CardImpl {
- private final UUID originalId;
-
public MartyrOfBones(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
@@ -49,27 +48,12 @@ public final class MartyrOfBones extends CardImpl {
ability.addCost(new RevealVariableBlackCardsFromHandCost());
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetCardInASingleGraveyard(0, 1, new FilterCard("cards in a single graveyard")));
- originalId = ability.getOriginalId();
+ ability.setTargetAdjuster(MartyrOfBonesAdjuster.instance);
this.addAbility(ability);
}
public MartyrOfBones(final MartyrOfBones card) {
super(card);
- this.originalId = card.originalId;
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- int amount = 0;
- for (Cost cost : ability.getCosts()) {
- if (cost instanceof RevealVariableBlackCardsFromHandCost) {
- amount = ((VariableCost) cost).getAmount();
- }
- }
- ability.getTargets().clear();
- ability.addTarget(new TargetCardInASingleGraveyard(0, amount, new FilterCard()));
- }
}
@Override
@@ -78,6 +62,22 @@ public final class MartyrOfBones extends CardImpl {
}
}
+enum MartyrOfBonesAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int amount = 0;
+ for (Cost cost : ability.getCosts()) {
+ if (cost instanceof RevealVariableBlackCardsFromHandCost) {
+ amount = ((VariableCost) cost).getAmount();
+ }
+ }
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCardInASingleGraveyard(0, amount, new FilterCard()));
+ }
+}
+
class RevealVariableBlackCardsFromHandCost extends VariableCostImpl {
private static final FilterCard filter = new FilterCard("X black cards from your hand");
diff --git a/Mage.Sets/src/mage/cards/m/MartyrOfFrost.java b/Mage.Sets/src/mage/cards/m/MartyrOfFrost.java
index 44e48efe62c..5ec56acb5ae 100644
--- a/Mage.Sets/src/mage/cards/m/MartyrOfFrost.java
+++ b/Mage.Sets/src/mage/cards/m/MartyrOfFrost.java
@@ -42,7 +42,7 @@ public final class MartyrOfFrost extends CardImpl {
this.toughness = new MageInt(1);
// {2}, Reveal X blue cards from your hand, Sacrifice Martyr of Frost: Counter target spell unless its controller pays {X}.
- Effect effect = new CounterUnlessPaysEffect(new RevealTargetFromHandCostCount());
+ Effect effect = new CounterUnlessPaysEffect(RevealTargetFromHandCostCount.instance);
effect.setText("Counter target spell unless its controller pays {X}.");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2));
ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0, Integer.MAX_VALUE, filter)));
diff --git a/Mage.Sets/src/mage/cards/m/MartyrOfSands.java b/Mage.Sets/src/mage/cards/m/MartyrOfSands.java
index 5076f87b2fb..d6c7baa4635 100644
--- a/Mage.Sets/src/mage/cards/m/MartyrOfSands.java
+++ b/Mage.Sets/src/mage/cards/m/MartyrOfSands.java
@@ -43,7 +43,7 @@ public final class MartyrOfSands extends CardImpl {
this.toughness = new MageInt(1);
// {1}, Reveal X white cards from your hand, Sacrifice Martyr of Sands: You gain three times X life.
- Effect effect = new GainLifeEffect(new MultipliedValue(new RevealTargetFromHandCostCount(), 3));
+ Effect effect = new GainLifeEffect(new MultipliedValue(RevealTargetFromHandCostCount.instance, 3));
effect.setText("You gain three times X life.");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{1}"));
ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0, Integer.MAX_VALUE, filter)));
diff --git a/Mage.Sets/src/mage/cards/m/MartyrOfSpores.java b/Mage.Sets/src/mage/cards/m/MartyrOfSpores.java
index 160441a376f..4bb1335d443 100644
--- a/Mage.Sets/src/mage/cards/m/MartyrOfSpores.java
+++ b/Mage.Sets/src/mage/cards/m/MartyrOfSpores.java
@@ -43,7 +43,7 @@ public final class MartyrOfSpores extends CardImpl {
this.toughness = new MageInt(1);
// {1}, Reveal X green cards from your hand, Sacrifice Martyr of Spores: Target creature gets +X/+X until end of turn.
- Effect effect = new BoostTargetEffect(new RevealTargetFromHandCostCount(), new RevealTargetFromHandCostCount(), Duration.EndOfTurn, true);
+ Effect effect = new BoostTargetEffect(RevealTargetFromHandCostCount.instance, RevealTargetFromHandCostCount.instance, Duration.EndOfTurn, true);
effect.setText("Target creature gets +X/+X until end of turn.");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(1));
ability.addCost(new RevealTargetFromHandCost(new TargetCardInHand(0, Integer.MAX_VALUE, filter)));
diff --git a/Mage.Sets/src/mage/cards/m/Martyrdom.java b/Mage.Sets/src/mage/cards/m/Martyrdom.java
index b684ec48b71..067ad072787 100644
--- a/Mage.Sets/src/mage/cards/m/Martyrdom.java
+++ b/Mage.Sets/src/mage/cards/m/Martyrdom.java
@@ -94,11 +94,6 @@ class MartyrdomActivatedAbility extends ActivatedAbilityImpl {
this.caster = ability.caster;
}
- @Override
- public Effects getEffects(Game game, EffectType effectType) {
- return super.getEffects(game, effectType);
- }
-
@Override
public ActivationStatus canActivate(UUID playerId, Game game) {
if (playerId.equals(caster)) {
diff --git a/Mage.Sets/src/mage/cards/m/MarwynTheNurturer.java b/Mage.Sets/src/mage/cards/m/MarwynTheNurturer.java
index 8a237ea8793..353450b9829 100644
--- a/Mage.Sets/src/mage/cards/m/MarwynTheNurturer.java
+++ b/Mage.Sets/src/mage/cards/m/MarwynTheNurturer.java
@@ -25,7 +25,7 @@ public final class MarwynTheNurturer extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another Elf");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.ELF));
}
diff --git a/Mage.Sets/src/mage/cards/m/MaskOfTheMimic.java b/Mage.Sets/src/mage/cards/m/MaskOfTheMimic.java
index f13d5931d53..776aa88b33b 100644
--- a/Mage.Sets/src/mage/cards/m/MaskOfTheMimic.java
+++ b/Mage.Sets/src/mage/cards/m/MaskOfTheMimic.java
@@ -31,7 +31,7 @@ public final class MaskOfTheMimic extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public MaskOfTheMimic(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MassManipulation.java b/Mage.Sets/src/mage/cards/m/MassManipulation.java
new file mode 100644
index 00000000000..61104d45bb0
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/m/MassManipulation.java
@@ -0,0 +1,50 @@
+package mage.cards.m;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.game.Game;
+import mage.target.common.TargetCreatureOrPlaneswalker;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class MassManipulation extends CardImpl {
+
+ public MassManipulation(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{U}{U}{U}{U}");
+
+ // Gain control of X target creatures and/or planeswalkers.
+ this.getSpellAbility().addEffect(
+ new GainControlTargetEffect(Duration.Custom, true)
+ .setText("Gain control of X target creatures and/or planeswalkers.")
+ );
+ this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
+ this.getSpellAbility().setTargetAdjuster(MassManipulationAdjuster.instance);
+ }
+
+ private MassManipulation(final MassManipulation card) {
+ super(card);
+ }
+
+ @Override
+ public MassManipulation copy() {
+ return new MassManipulation(this);
+ }
+}
+
+enum MassManipulationAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreatureOrPlaneswalker(ability.getManaCostsToPay().getX()));
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/m/MassMutiny.java b/Mage.Sets/src/mage/cards/m/MassMutiny.java
index 10a9549d8be..1ca9b18e39c 100644
--- a/Mage.Sets/src/mage/cards/m/MassMutiny.java
+++ b/Mage.Sets/src/mage/cards/m/MassMutiny.java
@@ -1,9 +1,7 @@
-
package mage.cards.m;
import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
@@ -21,6 +19,7 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.FixedTarget;
/**
@@ -34,22 +33,7 @@ public final class MassMutiny extends CardImpl {
// For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn.
this.getSpellAbility().addEffect(new MassMutinyEffect());
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature from opponent " + opponent.getName());
- filter.add(new ControllerIdPredicate(opponentId));
- TargetCreaturePermanent target = new TargetCreaturePermanent(0, 1, filter, false);
- ability.addTarget(target);
- }
- }
- }
+ this.getSpellAbility().setTargetAdjuster(MassMutinyAdjuster.instance);
}
public MassMutiny(final MassMutiny card) {
@@ -62,6 +46,24 @@ public final class MassMutiny extends CardImpl {
}
}
+enum MassMutinyAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null) {
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature from opponent " + opponent.getName());
+ filter.add(new ControllerIdPredicate(opponentId));
+ TargetCreaturePermanent target = new TargetCreaturePermanent(0, 1, filter, false);
+ ability.addTarget(target);
+ }
+ }
+ }
+}
+
class MassMutinyEffect extends OneShotEffect {
public MassMutinyEffect() {
diff --git a/Mage.Sets/src/mage/cards/m/MasterApothecary.java b/Mage.Sets/src/mage/cards/m/MasterApothecary.java
index c7e02a7431c..bb44e92b0dc 100644
--- a/Mage.Sets/src/mage/cards/m/MasterApothecary.java
+++ b/Mage.Sets/src/mage/cards/m/MasterApothecary.java
@@ -30,7 +30,7 @@ public final class MasterApothecary extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.CLERIC));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MasterApothecary(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MasterOfDiversion.java b/Mage.Sets/src/mage/cards/m/MasterOfDiversion.java
index 00e6affcea9..f54b0f4c509 100644
--- a/Mage.Sets/src/mage/cards/m/MasterOfDiversion.java
+++ b/Mage.Sets/src/mage/cards/m/MasterOfDiversion.java
@@ -22,7 +22,7 @@ public final class MasterOfDiversion extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls");
static {
- filter.add(new DefendingPlayerControlsPredicate());
+ filter.add(DefendingPlayerControlsPredicate.instance);
}
public MasterOfDiversion(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MasterOfTheWildHunt.java b/Mage.Sets/src/mage/cards/m/MasterOfTheWildHunt.java
index a4bb0aa626e..ec5f5d5fc50 100644
--- a/Mage.Sets/src/mage/cards/m/MasterOfTheWildHunt.java
+++ b/Mage.Sets/src/mage/cards/m/MasterOfTheWildHunt.java
@@ -69,7 +69,7 @@ class MasterOfTheWildHuntEffect extends OneShotEffect {
static {
filter.add(new SubtypePredicate(SubType.WOLF));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MasterOfTheWildHuntEffect() {
diff --git a/Mage.Sets/src/mage/cards/m/MasterTheWay.java b/Mage.Sets/src/mage/cards/m/MasterTheWay.java
index 9325793aa83..e3fc9243cf4 100644
--- a/Mage.Sets/src/mage/cards/m/MasterTheWay.java
+++ b/Mage.Sets/src/mage/cards/m/MasterTheWay.java
@@ -23,7 +23,7 @@ public final class MasterTheWay extends CardImpl {
// Draw a card. Master the Way deals damage to any target equal to the number of cards in your hand.
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1));
- Effect effect = new DamageTargetEffect(new CardsInControllerHandCount());
+ Effect effect = new DamageTargetEffect(CardsInControllerHandCount.instance);
effect.setText("{this} deals damage to any target equal to the number of cards in your hand");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetAnyTarget());
diff --git a/Mage.Sets/src/mage/cards/m/MasterWarcraft.java b/Mage.Sets/src/mage/cards/m/MasterWarcraft.java
index a5861363c57..ea80d6b2aae 100644
--- a/Mage.Sets/src/mage/cards/m/MasterWarcraft.java
+++ b/Mage.Sets/src/mage/cards/m/MasterWarcraft.java
@@ -79,7 +79,7 @@ public final class MasterWarcraft extends CardImpl {
@Override
public boolean apply(Game game, Ability source) {
- MasterWarcraftCastWatcher watcher = (MasterWarcraftCastWatcher) game.getState().getWatchers().get(MasterWarcraftCastWatcher.class.getSimpleName());
+ MasterWarcraftCastWatcher watcher = game.getState().getWatcher(MasterWarcraftCastWatcher.class);
if (watcher != null) {
watcher.increment();
return true;
@@ -105,7 +105,7 @@ public final class MasterWarcraft extends CardImpl {
@Override
public boolean apply(Game game, Ability source) {
- ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
+ ChooseBlockersRedundancyWatcher watcher = game.getState().getWatcher(ChooseBlockersRedundancyWatcher.class);
if (watcher != null) {
watcher.increment();
return true;
@@ -153,7 +153,10 @@ class MasterWarcraftChooseAttackersEffect extends ContinuousRuleModifyingEffectI
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- MasterWarcraftCastWatcher watcher = (MasterWarcraftCastWatcher) game.getState().getWatchers().get(MasterWarcraftCastWatcher.class.getSimpleName());
+ MasterWarcraftCastWatcher watcher = game.getState().getWatcher(MasterWarcraftCastWatcher.class);
+ if(watcher == null){
+ return false;
+ }
watcher.decrement();
if (watcher.copyCountApply > 0) {
game.informPlayers(source.getSourceObject(game).getIdName() + " didn't apply");
@@ -226,7 +229,10 @@ class MasterWarcraftChooseBlockersEffect extends ContinuousRuleModifyingEffectIm
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
+ ChooseBlockersRedundancyWatcher watcher = game.getState().getWatcher(ChooseBlockersRedundancyWatcher.class);
+ if(watcher == null){
+ return false;
+ }
watcher.decrement();
if (watcher.copyCountApply > 0) {
game.informPlayers(source.getSourceObject(game).getIdName() + " didn't apply");
diff --git a/Mage.Sets/src/mage/cards/m/MasumaroFirstToLive.java b/Mage.Sets/src/mage/cards/m/MasumaroFirstToLive.java
index e7721a06a81..3e67265849d 100644
--- a/Mage.Sets/src/mage/cards/m/MasumaroFirstToLive.java
+++ b/Mage.Sets/src/mage/cards/m/MasumaroFirstToLive.java
@@ -32,7 +32,7 @@ public final class MasumaroFirstToLive extends CardImpl {
this.toughness = new MageInt(0);
// Masumaro, First to Live's power and toughness are each equal to twice the number of cards in your hand.
- DynamicValue xValue= new MultipliedValue(new CardsInControllerHandCount(), 2);
+ DynamicValue xValue= new MultipliedValue(CardsInControllerHandCount.instance, 2);
Effect effect = new SetPowerToughnessSourceEffect(xValue, Duration.EndOfGame);
effect.setText("{this}'s power and toughness are each equal to twice the number of cards in your hand");
this.addAbility(new SimpleStaticAbility(Zone.ALL, effect));
diff --git a/Mage.Sets/src/mage/cards/m/MausoleumHarpy.java b/Mage.Sets/src/mage/cards/m/MausoleumHarpy.java
index 45ab9cb6320..8c17f8b06a9 100644
--- a/Mage.Sets/src/mage/cards/m/MausoleumHarpy.java
+++ b/Mage.Sets/src/mage/cards/m/MausoleumHarpy.java
@@ -28,7 +28,7 @@ public final class MausoleumHarpy extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/m/MausoleumWanderer.java b/Mage.Sets/src/mage/cards/m/MausoleumWanderer.java
index a77aef89b91..b37f3779c8f 100644
--- a/Mage.Sets/src/mage/cards/m/MausoleumWanderer.java
+++ b/Mage.Sets/src/mage/cards/m/MausoleumWanderer.java
@@ -31,7 +31,7 @@ public final class MausoleumWanderer extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.SPIRIT));
}
diff --git a/Mage.Sets/src/mage/cards/m/MavrenFeinDuskApostle.java b/Mage.Sets/src/mage/cards/m/MavrenFeinDuskApostle.java
index a0b101ebcb4..98fe12b17d7 100644
--- a/Mage.Sets/src/mage/cards/m/MavrenFeinDuskApostle.java
+++ b/Mage.Sets/src/mage/cards/m/MavrenFeinDuskApostle.java
@@ -57,7 +57,7 @@ class MavrenFeinDuskApostleTriggeredAbility extends TriggeredAbilityImpl {
static {
filter.add(new SubtypePredicate(SubType.VAMPIRE));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/m/MazeAbomination.java b/Mage.Sets/src/mage/cards/m/MazeAbomination.java
index 7168099bec2..751d9ee3fa5 100644
--- a/Mage.Sets/src/mage/cards/m/MazeAbomination.java
+++ b/Mage.Sets/src/mage/cards/m/MazeAbomination.java
@@ -26,7 +26,7 @@ public final class MazeAbomination extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Multicolored creatures you control");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public MazeAbomination (UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MazeBehemoth.java b/Mage.Sets/src/mage/cards/m/MazeBehemoth.java
index ddeb6ec6f22..a9b69d81d15 100644
--- a/Mage.Sets/src/mage/cards/m/MazeBehemoth.java
+++ b/Mage.Sets/src/mage/cards/m/MazeBehemoth.java
@@ -26,7 +26,7 @@ public final class MazeBehemoth extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Multicolored creatures you control");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public MazeBehemoth (UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MazeGlider.java b/Mage.Sets/src/mage/cards/m/MazeGlider.java
index 1e58b2d741e..b39b8301ba5 100644
--- a/Mage.Sets/src/mage/cards/m/MazeGlider.java
+++ b/Mage.Sets/src/mage/cards/m/MazeGlider.java
@@ -26,7 +26,7 @@ public final class MazeGlider extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Multicolored creatures you control");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public MazeGlider (UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MazeRusher.java b/Mage.Sets/src/mage/cards/m/MazeRusher.java
index 995e865c6e6..aed3e120bba 100644
--- a/Mage.Sets/src/mage/cards/m/MazeRusher.java
+++ b/Mage.Sets/src/mage/cards/m/MazeRusher.java
@@ -26,7 +26,7 @@ public final class MazeRusher extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Multicolored creatures you control");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public MazeRusher (UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MazeSentinel.java b/Mage.Sets/src/mage/cards/m/MazeSentinel.java
index 11218b098a0..357af8a3988 100644
--- a/Mage.Sets/src/mage/cards/m/MazeSentinel.java
+++ b/Mage.Sets/src/mage/cards/m/MazeSentinel.java
@@ -26,7 +26,7 @@ public final class MazeSentinel extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Multicolored creatures you control");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public MazeSentinel (UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MeishinTheMindCage.java b/Mage.Sets/src/mage/cards/m/MeishinTheMindCage.java
index 2d29f4215a1..a88e657705d 100644
--- a/Mage.Sets/src/mage/cards/m/MeishinTheMindCage.java
+++ b/Mage.Sets/src/mage/cards/m/MeishinTheMindCage.java
@@ -26,7 +26,7 @@ public final class MeishinTheMindCage extends CardImpl {
addSuperType(SuperType.LEGENDARY);
// All creatures get -X/-0, where X is the number of cards in your hand.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(new SignInversionDynamicValue(new CardsInControllerHandCount()), new StaticValue(0), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURE, false, "All creatures get -X/-0, where X is the number of cards in your hand")));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(new SignInversionDynamicValue(CardsInControllerHandCount.instance), new StaticValue(0), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURE, false, "All creatures get -X/-0, where X is the number of cards in your hand")));
}
public MeishinTheMindCage(final MeishinTheMindCage card) {
diff --git a/Mage.Sets/src/mage/cards/m/Melee.java b/Mage.Sets/src/mage/cards/m/Melee.java
index 3031c15e649..4fe220c0276 100644
--- a/Mage.Sets/src/mage/cards/m/Melee.java
+++ b/Mage.Sets/src/mage/cards/m/Melee.java
@@ -1,7 +1,6 @@
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility;
@@ -17,19 +16,21 @@ import mage.abilities.effects.common.RemoveFromCombatTargetEffect;
import mage.abilities.effects.common.UntapTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.TurnPhase;
import mage.game.Game;
import mage.game.combat.CombatGroup;
import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
-import mage.watchers.Watcher;
import mage.watchers.common.ChooseBlockersRedundancyWatcher;
+import java.util.UUID;
+
/**
- *
* @author L_J
*/
public final class Melee extends CardImpl {
@@ -61,27 +62,27 @@ public final class Melee extends CardImpl {
public Melee copy() {
return new Melee(this);
}
-
+
private class ChooseBlockersRedundancyWatcherIncrementEffect extends OneShotEffect {
-
+
ChooseBlockersRedundancyWatcherIncrementEffect() {
super(Outcome.Neutral);
}
-
+
ChooseBlockersRedundancyWatcherIncrementEffect(final ChooseBlockersRedundancyWatcherIncrementEffect effect) {
super(effect);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
- ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
+ ChooseBlockersRedundancyWatcher watcher = game.getState().getWatcher(ChooseBlockersRedundancyWatcher.class);
if (watcher != null) {
watcher.increment();
return true;
}
return false;
}
-
+
@Override
public ChooseBlockersRedundancyWatcherIncrementEffect copy() {
return new ChooseBlockersRedundancyWatcherIncrementEffect(this);
@@ -117,7 +118,10 @@ class MeleeChooseBlockersEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
+ ChooseBlockersRedundancyWatcher watcher = game.getState().getWatcher(ChooseBlockersRedundancyWatcher.class);
+ if (watcher == null) {
+ return false;
+ }
watcher.decrement();
watcher.copyCount--;
if (watcher.copyCountApply > 0) {
diff --git a/Mage.Sets/src/mage/cards/m/MemoryCrystal.java b/Mage.Sets/src/mage/cards/m/MemoryCrystal.java
index 2da9818be48..00d1411e834 100644
--- a/Mage.Sets/src/mage/cards/m/MemoryCrystal.java
+++ b/Mage.Sets/src/mage/cards/m/MemoryCrystal.java
@@ -61,7 +61,7 @@ class MemoryCrystalSpellsCostReductionEffect extends CostModificationEffectImpl
if (card != null) {
for (Ability ability : card.getAbilities()) {
if (ability instanceof BuybackAbility) {
- if (((BuybackAbility) ability).isActivated()) {
+ if (ability.isActivated()) {
int amountToReduce = ((BuybackAbility) ability).reduceCost(2);
CardUtil.reduceCost(abilityToModify, amountToReduce);
}
diff --git a/Mage.Sets/src/mage/cards/m/MentorOfTheMeek.java b/Mage.Sets/src/mage/cards/m/MentorOfTheMeek.java
index 116cd617b66..7e007dec24e 100644
--- a/Mage.Sets/src/mage/cards/m/MentorOfTheMeek.java
+++ b/Mage.Sets/src/mage/cards/m/MentorOfTheMeek.java
@@ -28,7 +28,7 @@ public final class MentorOfTheMeek extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another creature with power 2 or less");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
}
diff --git a/Mage.Sets/src/mage/cards/m/MercadianAtlas.java b/Mage.Sets/src/mage/cards/m/MercadianAtlas.java
index c2d980a6ed3..5fb9e90c5a0 100644
--- a/Mage.Sets/src/mage/cards/m/MercadianAtlas.java
+++ b/Mage.Sets/src/mage/cards/m/MercadianAtlas.java
@@ -49,7 +49,7 @@ enum MercadianAtlasCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PlayLandWatcher watcher = (PlayLandWatcher) game.getState().getWatchers().get(PlayLandWatcher.class.getSimpleName());
+ PlayLandWatcher watcher = game.getState().getWatcher(PlayLandWatcher.class);
if (watcher != null) {
return !watcher.landPlayed(source.getControllerId());
}
diff --git a/Mage.Sets/src/mage/cards/m/MercadianBazaar.java b/Mage.Sets/src/mage/cards/m/MercadianBazaar.java
index dc03c83a538..aadd3bbe450 100644
--- a/Mage.Sets/src/mage/cards/m/MercadianBazaar.java
+++ b/Mage.Sets/src/mage/cards/m/MercadianBazaar.java
@@ -34,7 +34,7 @@ public final class MercadianBazaar extends CardImpl {
// {tap}, Remove any number of storage counters from Mercadian Bazaar: Add {R} for each storage counter removed this way.
Ability ability = new DynamicManaAbility(
Mana.RedMana(1),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new TapSourceCost(),
"Add {R} for each storage counter removed this way",
true, new CountersSourceCount(CounterType.STORAGE));
diff --git a/Mage.Sets/src/mage/cards/m/MercenaryInformer.java b/Mage.Sets/src/mage/cards/m/MercenaryInformer.java
index 44cb9245b47..e50658d5fa6 100644
--- a/Mage.Sets/src/mage/cards/m/MercenaryInformer.java
+++ b/Mage.Sets/src/mage/cards/m/MercenaryInformer.java
@@ -36,7 +36,7 @@ public final class MercenaryInformer extends CardImpl {
static {
filterBlack.add(new ColorPredicate(ObjectColor.BLACK));
- filterMercenary.add(Predicates.not(new TokenPredicate()));
+ filterMercenary.add(Predicates.not(TokenPredicate.instance));
filterMercenary.add(new SubtypePredicate(SubType.MERCENARY));
}
diff --git a/Mage.Sets/src/mage/cards/m/MerchantsDockhand.java b/Mage.Sets/src/mage/cards/m/MerchantsDockhand.java
index 2c59d904fc3..d63af5b129c 100644
--- a/Mage.Sets/src/mage/cards/m/MerchantsDockhand.java
+++ b/Mage.Sets/src/mage/cards/m/MerchantsDockhand.java
@@ -116,7 +116,7 @@ class TapXTargetCost extends VariableCostImpl {
final static FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent("untapped artifacts you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public TapXTargetCost() {
diff --git a/Mage.Sets/src/mage/cards/m/MercurialChemister.java b/Mage.Sets/src/mage/cards/m/MercurialChemister.java
index 9365da620db..b3390f455ec 100644
--- a/Mage.Sets/src/mage/cards/m/MercurialChemister.java
+++ b/Mage.Sets/src/mage/cards/m/MercurialChemister.java
@@ -39,7 +39,7 @@ public final class MercurialChemister extends CardImpl {
this.addAbility(ability);
// {R}, {T}, Discard a card: Mercurial Chemister deals damage to target creature equal to the discarded card's converted mana cost.
- ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new DiscardCostCardConvertedMana()), new ManaCostsImpl("{R}"));
+ ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(DiscardCostCardConvertedMana.instance), new ManaCostsImpl("{R}"));
ability.addTarget(new TargetCreaturePermanent());
ability.addCost(new TapSourceCost());
ability.addCost(new DiscardCardCost());
diff --git a/Mage.Sets/src/mage/cards/m/MercurialGeists.java b/Mage.Sets/src/mage/cards/m/MercurialGeists.java
index 4842ee08274..f0749140073 100644
--- a/Mage.Sets/src/mage/cards/m/MercurialGeists.java
+++ b/Mage.Sets/src/mage/cards/m/MercurialGeists.java
@@ -1,7 +1,5 @@
-
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
@@ -9,18 +7,19 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.filter.StaticFilters;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class MercurialGeists extends CardImpl {
public MercurialGeists(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{R}");
this.subtype.add(SubType.SPIRIT);
this.power = new MageInt(1);
this.toughness = new MageInt(3);
@@ -29,7 +28,7 @@ public final class MercurialGeists extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// Whenever you cast an instant or sorcery spell, Mercurial Geists gets +3/+0 until end of turn.
- this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn), StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY, false));
+ this.addAbility(new SpellCastControllerTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false));
}
public MercurialGeists(final MercurialGeists card) {
diff --git a/Mage.Sets/src/mage/cards/m/MerenOfClanNelToth.java b/Mage.Sets/src/mage/cards/m/MerenOfClanNelToth.java
index 9845b838450..0e1dfd36cbb 100644
--- a/Mage.Sets/src/mage/cards/m/MerenOfClanNelToth.java
+++ b/Mage.Sets/src/mage/cards/m/MerenOfClanNelToth.java
@@ -32,7 +32,7 @@ public final class MerenOfClanNelToth extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/m/MerrowBonegnawer.java b/Mage.Sets/src/mage/cards/m/MerrowBonegnawer.java
index 0b533c9260d..f274496308c 100644
--- a/Mage.Sets/src/mage/cards/m/MerrowBonegnawer.java
+++ b/Mage.Sets/src/mage/cards/m/MerrowBonegnawer.java
@@ -1,7 +1,6 @@
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.Ability;
@@ -20,14 +19,13 @@ import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ColorPredicate;
import mage.target.TargetPlayer;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class MerrowBonegnawer extends CardImpl {
- private UUID exileId = UUID.randomUUID();
-
private static final FilterSpell filter = new FilterSpell("a black spell");
static {
@@ -43,7 +41,7 @@ public final class MerrowBonegnawer extends CardImpl {
this.toughness = new MageInt(1);
// {tap}: Target player exiles a card from their graveyard.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileFromZoneTargetEffect(Zone.GRAVEYARD, exileId, getIdName(), new FilterCard()), new TapSourceCost());
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileFromZoneTargetEffect(Zone.GRAVEYARD, null, getIdName(), new FilterCard()), new TapSourceCost());
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/m/Merseine.java b/Mage.Sets/src/mage/cards/m/Merseine.java
index 836365c8502..cec4a052dce 100644
--- a/Mage.Sets/src/mage/cards/m/Merseine.java
+++ b/Mage.Sets/src/mage/cards/m/Merseine.java
@@ -77,11 +77,6 @@ class MerseineActivatedAbility extends SimpleActivatedAbility {
super(ability);
}
- @Override
- public Effects getEffects(Game game, EffectType effectType) {
- return super.getEffects(game, effectType);
- }
-
@Override
public ActivationStatus canActivate(UUID playerId, Game game) {
Permanent sourcePermanent = game.getBattlefield().getPermanent(this.getSourceId());
diff --git a/Mage.Sets/src/mage/cards/m/MesmerizingBenthid.java b/Mage.Sets/src/mage/cards/m/MesmerizingBenthid.java
new file mode 100644
index 00000000000..330da204905
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/m/MesmerizingBenthid.java
@@ -0,0 +1,56 @@
+package mage.cards.m;
+
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.HexproofAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.game.permanent.token.MesmerizingBenthidToken;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class MesmerizingBenthid extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterControlledCreaturePermanent(SubType.ILLUSION);
+
+ public MesmerizingBenthid(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
+
+ this.subtype.add(SubType.OCTOPUS);
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // When Mesmerizing Benthid enters the battlefield, create two 0/2 blue Illusion creature tokens with "Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step."
+ this.addAbility(new EntersBattlefieldTriggeredAbility(
+ new CreateTokenEffect(new MesmerizingBenthidToken(), 2)
+ ));
+
+ // Mesmerizing Benthid has hexproof as long as you control an Illusion.
+ this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
+ new GainAbilitySourceEffect(HexproofAbility.getInstance()),
+ new PermanentsOnTheBattlefieldCondition(filter),
+ "{this} has hexproof as long as you control an Illusion."
+ )));
+ }
+
+ private MesmerizingBenthid(final MesmerizingBenthid card) {
+ super(card);
+ }
+
+ @Override
+ public MesmerizingBenthid copy() {
+ return new MesmerizingBenthid(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/m/MetalspinnersPuzzleknot.java b/Mage.Sets/src/mage/cards/m/MetalspinnersPuzzleknot.java
index 38acc7c2cc2..377521781dd 100644
--- a/Mage.Sets/src/mage/cards/m/MetalspinnersPuzzleknot.java
+++ b/Mage.Sets/src/mage/cards/m/MetalspinnersPuzzleknot.java
@@ -1,7 +1,5 @@
-
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
@@ -15,22 +13,21 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
+import java.util.UUID;
+
/**
- *
* @author emerald000
*/
public final class MetalspinnersPuzzleknot extends CardImpl {
public MetalspinnersPuzzleknot(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
// When Metalspinner's Puzzleknot enters the battlefield, you draw a card and you lose 1 life.
- Effect drawEffect = new DrawCardSourceControllerEffect(1);
- drawEffect.setText("you draw a card");
+ Effect drawEffect = new DrawCardSourceControllerEffect(1, "you");
Ability ability = new EntersBattlefieldTriggeredAbility(drawEffect);
Effect lifeEffect = new LoseLifeSourceControllerEffect(1);
- lifeEffect.setText("and you lose 1 life");
- ability.addEffect(lifeEffect);
+ ability.addEffect(lifeEffect.concatBy("and"));
this.addAbility(ability);
// {2}{B}, Sacrifice Metalspinner's Puzzleknot: You draw a card and you lose 1 life.
diff --git a/Mage.Sets/src/mage/cards/m/MeteorBlast.java b/Mage.Sets/src/mage/cards/m/MeteorBlast.java
index fb57f84cce0..9331bce50dc 100644
--- a/Mage.Sets/src/mage/cards/m/MeteorBlast.java
+++ b/Mage.Sets/src/mage/cards/m/MeteorBlast.java
@@ -1,4 +1,3 @@
-
package mage.cards.m;
import java.util.UUID;
@@ -13,6 +12,7 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetAnyTarget;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
@@ -21,7 +21,7 @@ import mage.target.common.TargetAnyTarget;
public final class MeteorBlast extends CardImpl {
public MeteorBlast(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{R}{R}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}{R}{R}");
// Meteor Blast deals 4 damage to each of X target creatures and/or players.
this.getSpellAbility().addEffect(new MeteorBlastEffect());
@@ -31,6 +31,15 @@ public final class MeteorBlast extends CardImpl {
super(card);
}
+ @Override
+ public MeteorBlast copy() {
+ return new MeteorBlast(this);
+ }
+}
+
+enum MeteorBlastAdjuster implements TargetAdjuster {
+ instance;
+
@Override
public void adjustTargets(Ability ability, Game game) {
int xValue = ability.getManaCostsToPay().getX();
@@ -39,11 +48,6 @@ public final class MeteorBlast extends CardImpl {
ability.addTarget(target);
}
}
-
- @Override
- public MeteorBlast copy() {
- return new MeteorBlast(this);
- }
}
class MeteorBlastEffect extends OneShotEffect {
diff --git a/Mage.Sets/src/mage/cards/m/MeteorShower.java b/Mage.Sets/src/mage/cards/m/MeteorShower.java
index 9c8031c50df..2fa2390c042 100644
--- a/Mage.Sets/src/mage/cards/m/MeteorShower.java
+++ b/Mage.Sets/src/mage/cards/m/MeteorShower.java
@@ -21,7 +21,7 @@ public final class MeteorShower extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{R}");
// Meteor Shower deals X plus 1 damage divided as you choose among any number of target creatures and/or players.
- DynamicValue xValue = new IntPlusDynamicValue(1, new ManacostVariableValue());
+ DynamicValue xValue = new IntPlusDynamicValue(1, ManacostVariableValue.instance);
this.getSpellAbility().addEffect(new DamageMultiEffect(xValue));
this.getSpellAbility().addTarget(new TargetAnyTargetAmount(xValue));
}
diff --git a/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java b/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java
index 0b77db95408..5288f951286 100644
--- a/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java
+++ b/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java
@@ -90,7 +90,7 @@ class MetzaliTowerOfTriumphEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Watcher watcher = game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ Watcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
if (watcher instanceof AttackedThisTurnWatcher) {
Set attackedThisTurn = ((AttackedThisTurnWatcher) watcher).getAttackedThisTurnCreatures();
List available = new ArrayList<>();
diff --git a/Mage.Sets/src/mage/cards/m/MidnightEntourage.java b/Mage.Sets/src/mage/cards/m/MidnightEntourage.java
index 9c0843b6d7f..4fdd87ec210 100644
--- a/Mage.Sets/src/mage/cards/m/MidnightEntourage.java
+++ b/Mage.Sets/src/mage/cards/m/MidnightEntourage.java
@@ -1,7 +1,5 @@
-
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility;
@@ -17,8 +15,9 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.permanent.ControllerPredicate;
+import java.util.UUID;
+
/**
- *
* @author Styxo
*/
public final class MidnightEntourage extends CardImpl {
@@ -42,10 +41,9 @@ public final class MidnightEntourage extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(1, 1, Duration.WhileOnBattlefield, filter, true)));
// Whenever Midnight Entourage or another Aetherborn you control dies, you draw a card and you lose 1 life.
- Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility(new DrawCardSourceControllerEffect(1), false, filter);
+ Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility(new DrawCardSourceControllerEffect(1, "you"), false, filter);
Effect effect = new LoseLifeSourceControllerEffect(1);
- effect.setText("and you lose 1 life");
- ability.addEffect(effect);
+ ability.addEffect(effect.concatBy("and"));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/m/MidnightGuard.java b/Mage.Sets/src/mage/cards/m/MidnightGuard.java
index b0c76111bcf..3019134b08f 100644
--- a/Mage.Sets/src/mage/cards/m/MidnightGuard.java
+++ b/Mage.Sets/src/mage/cards/m/MidnightGuard.java
@@ -21,7 +21,7 @@ public final class MidnightGuard extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MidnightGuard(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MidnightReaper.java b/Mage.Sets/src/mage/cards/m/MidnightReaper.java
index 5af4535203d..cfe9c74eb99 100644
--- a/Mage.Sets/src/mage/cards/m/MidnightReaper.java
+++ b/Mage.Sets/src/mage/cards/m/MidnightReaper.java
@@ -27,7 +27,7 @@ public final class MidnightReaper extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public MidnightReaper(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MidnightRitual.java b/Mage.Sets/src/mage/cards/m/MidnightRitual.java
index 23205ab2542..08ccd0518a6 100644
--- a/Mage.Sets/src/mage/cards/m/MidnightRitual.java
+++ b/Mage.Sets/src/mage/cards/m/MidnightRitual.java
@@ -1,9 +1,7 @@
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@@ -17,9 +15,11 @@ import mage.game.Game;
import mage.game.permanent.token.ZombieToken;
import mage.players.Player;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author Skyler Sell
*/
public final class MidnightRitual extends CardImpl {
@@ -31,14 +31,7 @@ public final class MidnightRitual extends CardImpl {
// For each creature card exiled this way, create a 2/2 black Zombie creature token.
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
this.getSpellAbility().addEffect(new MidnightRitualEffect());
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- ability.addTarget(new TargetCardInYourGraveyard(ability.getManaCostsToPay().getX(), StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
- }
+ this.getSpellAbility().setTargetAdjuster(MidnightRitualAdjuster.instance);
}
public MidnightRitual(final MidnightRitual card) {
@@ -51,6 +44,16 @@ public final class MidnightRitual extends CardImpl {
}
}
+enum MidnightRitualAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCardInYourGraveyard(ability.getManaCostsToPay().getX(), StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
+ }
+}
+
class MidnightRitualEffect extends OneShotEffect {
public MidnightRitualEffect() {
diff --git a/Mage.Sets/src/mage/cards/m/MightOfOldKrosa.java b/Mage.Sets/src/mage/cards/m/MightOfOldKrosa.java
index fb603636a0f..ac0fe3ed0f5 100644
--- a/Mage.Sets/src/mage/cards/m/MightOfOldKrosa.java
+++ b/Mage.Sets/src/mage/cards/m/MightOfOldKrosa.java
@@ -3,7 +3,7 @@ package mage.cards.m;
import java.util.UUID;
import mage.abilities.condition.LockedInCondition;
-import mage.abilities.condition.common.MyMainPhaseCondition;
+import mage.abilities.condition.common.AddendumCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardImpl;
@@ -25,7 +25,7 @@ public final class MightOfOldKrosa extends CardImpl {
this.getSpellAbility().addEffect(new ConditionalContinuousEffect(
new BoostTargetEffect(4,4, Duration.EndOfTurn),
new BoostTargetEffect(2, 2, Duration.EndOfTurn),
- new LockedInCondition(MyMainPhaseCondition.instance),
+ new LockedInCondition(AddendumCondition.instance),
"Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
diff --git a/Mage.Sets/src/mage/cards/m/Mightstone.java b/Mage.Sets/src/mage/cards/m/Mightstone.java
index f7922170fde..bb36bf9e8de 100644
--- a/Mage.Sets/src/mage/cards/m/Mightstone.java
+++ b/Mage.Sets/src/mage/cards/m/Mightstone.java
@@ -21,7 +21,7 @@ public final class Mightstone extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creatures");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public Mightstone(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MijaeDjinn.java b/Mage.Sets/src/mage/cards/m/MijaeDjinn.java
index 7407d86d66e..6ec0f9b8d1d 100644
--- a/Mage.Sets/src/mage/cards/m/MijaeDjinn.java
+++ b/Mage.Sets/src/mage/cards/m/MijaeDjinn.java
@@ -57,7 +57,7 @@ class MijaeDjinnEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent creature = game.getPermanent(source.getSourceId());
if (controller != null && creature != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
return true;
} else {
creature.removeFromCombat(game);
diff --git a/Mage.Sets/src/mage/cards/m/MikaeusTheLunarch.java b/Mage.Sets/src/mage/cards/m/MikaeusTheLunarch.java
index 5e0a0a04976..7f72fa46f41 100644
--- a/Mage.Sets/src/mage/cards/m/MikaeusTheLunarch.java
+++ b/Mage.Sets/src/mage/cards/m/MikaeusTheLunarch.java
@@ -30,7 +30,7 @@ public final class MikaeusTheLunarch extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MikaeusTheLunarch(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MilitantAngel.java b/Mage.Sets/src/mage/cards/m/MilitantAngel.java
index 790f1e62c17..c1ff666a0dd 100644
--- a/Mage.Sets/src/mage/cards/m/MilitantAngel.java
+++ b/Mage.Sets/src/mage/cards/m/MilitantAngel.java
@@ -33,7 +33,7 @@ public final class MilitantAngel extends CardImpl {
this.addAbility(LifelinkAbility.getInstance());
// When Militant Angel enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn.
- Effect effect = new CreateTokenEffect(new KnightToken(), new AttackedThisTurnOpponentsCount());
+ Effect effect = new CreateTokenEffect(new KnightToken(), AttackedThisTurnOpponentsCount.instance);
effect.setText("create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn");
this.addAbility(new EntersBattlefieldTriggeredAbility(effect));
}
diff --git a/Mage.Sets/src/mage/cards/m/MilitiasPride.java b/Mage.Sets/src/mage/cards/m/MilitiasPride.java
index 1f23407eb24..5d413d911c0 100644
--- a/Mage.Sets/src/mage/cards/m/MilitiasPride.java
+++ b/Mage.Sets/src/mage/cards/m/MilitiasPride.java
@@ -63,8 +63,8 @@ class MilitiasPrideTriggerAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
- filter.add(Predicates.not(new TokenPredicate()));
- Permanent permanent = (Permanent) game.getPermanent(event.getSourceId());
+ filter.add(Predicates.not(TokenPredicate.instance));
+ Permanent permanent = game.getPermanent(event.getSourceId());
return permanent != null && filter.match(permanent, sourceId, controllerId, game);
}
diff --git a/Mage.Sets/src/mage/cards/m/MindShatter.java b/Mage.Sets/src/mage/cards/m/MindShatter.java
index 244b241f933..8e048a27ab7 100644
--- a/Mage.Sets/src/mage/cards/m/MindShatter.java
+++ b/Mage.Sets/src/mage/cards/m/MindShatter.java
@@ -19,7 +19,7 @@ public final class MindShatter extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{B}{B}");
// Target player discards X cards at random.
- this.getSpellAbility().addEffect(new DiscardTargetEffect(new ManacostVariableValue(), true));
+ this.getSpellAbility().addEffect(new DiscardTargetEffect(ManacostVariableValue.instance, true));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/m/MindSpring.java b/Mage.Sets/src/mage/cards/m/MindSpring.java
index f327dde9c9e..58b59946328 100644
--- a/Mage.Sets/src/mage/cards/m/MindSpring.java
+++ b/Mage.Sets/src/mage/cards/m/MindSpring.java
@@ -18,7 +18,7 @@ public final class MindSpring extends CardImpl {
public MindSpring(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{U}");
- this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.instance));
}
public MindSpring(final MindSpring card) {
diff --git a/Mage.Sets/src/mage/cards/m/MindTwist.java b/Mage.Sets/src/mage/cards/m/MindTwist.java
index 1b1b377ffcd..bddc25745ab 100644
--- a/Mage.Sets/src/mage/cards/m/MindTwist.java
+++ b/Mage.Sets/src/mage/cards/m/MindTwist.java
@@ -20,7 +20,7 @@ public final class MindTwist extends CardImpl {
// Target player discards X cards at random.
- this.getSpellAbility().addEffect(new DiscardTargetEffect(new ManacostVariableValue(), true));
+ this.getSpellAbility().addEffect(new DiscardTargetEffect(ManacostVariableValue.instance, true));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/m/MindWarp.java b/Mage.Sets/src/mage/cards/m/MindWarp.java
index c82cf55fb61..3db8935245e 100644
--- a/Mage.Sets/src/mage/cards/m/MindWarp.java
+++ b/Mage.Sets/src/mage/cards/m/MindWarp.java
@@ -28,7 +28,7 @@ public final class MindWarp extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{3}{B}");
// Look at target player's hand and choose X cards from it. That player discards those cards.
- this.getSpellAbility().addEffect(new MindWarpEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new MindWarpEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetPlayer());
}
diff --git a/Mage.Sets/src/mage/cards/m/MindbreakTrap.java b/Mage.Sets/src/mage/cards/m/MindbreakTrap.java
index 253fc6ef504..9fc7ea6c507 100644
--- a/Mage.Sets/src/mage/cards/m/MindbreakTrap.java
+++ b/Mage.Sets/src/mage/cards/m/MindbreakTrap.java
@@ -52,7 +52,7 @@ enum MindbreakTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null) {
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
if (watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(opponentId) > 2) {
diff --git a/Mage.Sets/src/mage/cards/m/MindsDilation.java b/Mage.Sets/src/mage/cards/m/MindsDilation.java
index 941ef597ace..b3a7c6381f2 100644
--- a/Mage.Sets/src/mage/cards/m/MindsDilation.java
+++ b/Mage.Sets/src/mage/cards/m/MindsDilation.java
@@ -65,7 +65,7 @@ class MindsDilationTriggeredAbility extends SpellCastOpponentTriggeredAbility {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (super.checkTrigger(event, game)) {
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName());
+ SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class);
if (watcher != null) {
List spells = watcher.getSpellsCastThisTurn(event.getPlayerId());
if (spells != null && spells.size() == 1) {
diff --git a/Mage.Sets/src/mage/cards/m/MindstormCrown.java b/Mage.Sets/src/mage/cards/m/MindstormCrown.java
index c186f02a157..7748a50006c 100644
--- a/Mage.Sets/src/mage/cards/m/MindstormCrown.java
+++ b/Mage.Sets/src/mage/cards/m/MindstormCrown.java
@@ -63,7 +63,7 @@ class MindstormCrownEffect extends OneShotEffect {
if (player == null) {
return false;
}
- MindstormCrownWatcher watcher = (MindstormCrownWatcher) game.getState().getWatchers().get(MindstormCrownWatcher.class.getSimpleName());
+ MindstormCrownWatcher watcher = game.getState().getWatcher(MindstormCrownWatcher.class);
if (watcher != null && watcher.getCardsInHandCount() == 0) {
player.drawCards(1, game);
} else {
@@ -80,7 +80,7 @@ class MindstormCrownWatcher extends Watcher {
private int cardsInHandCount;
public MindstormCrownWatcher() {
- super(MindstormCrownWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(MindstormCrownWatcher.class, WatcherScope.GAME);
}
public MindstormCrownWatcher(final MindstormCrownWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/m/Mindswipe.java b/Mage.Sets/src/mage/cards/m/Mindswipe.java
index fbfa217fd31..1650b14967c 100644
--- a/Mage.Sets/src/mage/cards/m/Mindswipe.java
+++ b/Mage.Sets/src/mage/cards/m/Mindswipe.java
@@ -29,7 +29,7 @@ public final class Mindswipe extends CardImpl {
// Counter target spell unless its controller pays {X}. Mindswipe deals X damage to that spell's controller.
- Effect effect = new CounterUnlessPaysEffect(new ManacostVariableValue());
+ Effect effect = new CounterUnlessPaysEffect(ManacostVariableValue.instance);
effect.setText("Counter target spell unless its controller pays {X}.");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetSpell());
@@ -74,7 +74,7 @@ class MindswipeEffect extends OneShotEffect {
Spell spell = (Spell) object;
Player spellController = game.getPlayer(spell.getControllerId());
if (spellController != null) {
- int damage = new ManacostVariableValue().calculate(game, source, this);
+ int damage = ManacostVariableValue.instance.calculate(game, source, this);
spellController.damage(damage, source.getSourceId(), game, false, true);
}
return true;
diff --git a/Mage.Sets/src/mage/cards/m/MineMineMine.java b/Mage.Sets/src/mage/cards/m/MineMineMine.java
index b5c54f0dad2..4d227ec47f8 100644
--- a/Mage.Sets/src/mage/cards/m/MineMineMine.java
+++ b/Mage.Sets/src/mage/cards/m/MineMineMine.java
@@ -33,7 +33,7 @@ public final class MineMineMine extends CardImpl {
public MineMineMine(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}{G}");
- // When Mine, Mine, Mine enters the battlefield, each player puts his or her library into his or her hand.
+ // When Mine, Mine, Mine enters the battlefield, each player puts their library into their hand.
this.addAbility(new EntersBattlefieldTriggeredAbility(new MineMineMineDrawEffect()));
// Players have no maximum hand size and don't lose the game for drawing from an empty library.
@@ -45,7 +45,7 @@ public final class MineMineMine extends CardImpl {
// Each player can't cast more than one spell each turn.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantCastMoreThanOneSpellEffect(TargetController.ANY)));
- // When Mine, Mine, Mine leaves the battlefield, each player shuffles his or her hand and graveyard into his or her library.
+ // When Mine, Mine, Mine leaves the battlefield, each player shuffles their hand and graveyard into their library.
this.addAbility(new LeavesBattlefieldTriggeredAbility(new ShuffleHandGraveyardAllEffect(), false));
}
diff --git a/Mage.Sets/src/mage/cards/m/MinionOfLeshrac.java b/Mage.Sets/src/mage/cards/m/MinionOfLeshrac.java
index a8dabd9b207..154468baf30 100644
--- a/Mage.Sets/src/mage/cards/m/MinionOfLeshrac.java
+++ b/Mage.Sets/src/mage/cards/m/MinionOfLeshrac.java
@@ -92,7 +92,7 @@ class MinionLeshracEffect extends OneShotEffect {
&& minionLeshrac != null) {
FilterControlledPermanent filterCreature = new FilterControlledPermanent();
filterCreature.add(new CardTypePredicate(CardType.CREATURE));
- filterCreature.add(new AnotherPredicate());
+ filterCreature.add(AnotherPredicate.instance);
TargetControlledPermanent target = new TargetControlledPermanent(filterCreature);
SacrificeTargetCost cost = new SacrificeTargetCost(target);
if (controller.chooseUse(Outcome.AIDontUseIt, "Do you wish to sacrifice another creature to prevent the 5 damage to you?", source, game)
diff --git a/Mage.Sets/src/mage/cards/m/MinionOfTheWastes.java b/Mage.Sets/src/mage/cards/m/MinionOfTheWastes.java
index 5b5fce962fe..25ff9a740de 100644
--- a/Mage.Sets/src/mage/cards/m/MinionOfTheWastes.java
+++ b/Mage.Sets/src/mage/cards/m/MinionOfTheWastes.java
@@ -1,7 +1,5 @@
-
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
@@ -13,17 +11,13 @@ import mage.abilities.keyword.TrampleAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.SubLayer;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author L_J
*/
public final class MinionOfTheWastes extends CardImpl {
@@ -39,7 +33,7 @@ public final class MinionOfTheWastes extends CardImpl {
// As Minion of the Wastes enters the battlefield, pay any amount of life. The amount you pay can't be more than the total number of white nontoken permanents your opponents control plus the total number of white cards in their graveyards.
this.addAbility(new AsEntersBattlefieldAbility(new MinionOfTheWastesEffect()));
-
+
// Minion of the Wastes's power and toughness are each equal to the life paid as it entered the battlefield.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect("{this}'s power and toughness are each equal to the life paid as it entered the battlefield")));
}
@@ -74,10 +68,10 @@ class MinionOfTheWastesEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- Card sourceCard = game.getCard(source.getSourceId());
int payAmount = controller.getAmount(0, controller.getLife(), "Pay any amount of life", game);
controller.loseLife(payAmount, game, false);
- game.informPlayers(sourceCard.getLogName() + ": " + controller.getLogName() +
+ Card sourceCard = game.getCard(source.getSourceId());
+ game.informPlayers((sourceCard != null ? sourceCard.getLogName() : "") + ": " + controller.getLogName() +
" pays " + payAmount + " life");
game.addEffect(new SetPowerToughnessSourceEffect(payAmount, payAmount, Duration.Custom, SubLayer.SetPT_7b), source);
return true;
diff --git a/Mage.Sets/src/mage/cards/m/MinionReflector.java b/Mage.Sets/src/mage/cards/m/MinionReflector.java
index a4226643089..31da2e28812 100644
--- a/Mage.Sets/src/mage/cards/m/MinionReflector.java
+++ b/Mage.Sets/src/mage/cards/m/MinionReflector.java
@@ -35,7 +35,7 @@ public final class MinionReflector extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public MinionReflector(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MinistrantOfObligation.java b/Mage.Sets/src/mage/cards/m/MinistrantOfObligation.java
new file mode 100644
index 00000000000..48c3fda6035
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/m/MinistrantOfObligation.java
@@ -0,0 +1,37 @@
+package mage.cards.m;
+
+import mage.MageInt;
+import mage.abilities.keyword.AfterlifeAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class MinistrantOfObligation extends CardImpl {
+
+ public MinistrantOfObligation(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.CLERIC);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Afterlife 2
+ this.addAbility(new AfterlifeAbility(2));
+ }
+
+ private MinistrantOfObligation(final MinistrantOfObligation card) {
+ super(card);
+ }
+
+ @Override
+ public MinistrantOfObligation copy() {
+ return new MinistrantOfObligation(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/m/MirrorEntity.java b/Mage.Sets/src/mage/cards/m/MirrorEntity.java
index b5246cc7e3b..9174db87c9e 100644
--- a/Mage.Sets/src/mage/cards/m/MirrorEntity.java
+++ b/Mage.Sets/src/mage/cards/m/MirrorEntity.java
@@ -40,7 +40,7 @@ public final class MirrorEntity extends CardImpl {
// Changeling
this.addAbility(ChangelingAbility.getInstance());
// {X}: Until end of turn, creatures you control have base power and toughness X/X and gain all creature types.
- DynamicValue variableMana = new ManacostVariableValue();
+ DynamicValue variableMana = ManacostVariableValue.instance;
Effect effect = new SetPowerToughnessAllEffect(variableMana, variableMana, Duration.EndOfTurn, filter, true);
effect.setText("Until end of turn, creatures you control have base power and toughness X/X");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new VariableManaCost());
diff --git a/Mage.Sets/src/mage/cards/m/MirrorMarch.java b/Mage.Sets/src/mage/cards/m/MirrorMarch.java
new file mode 100644
index 00000000000..c68bf6b03ad
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/m/MirrorMarch.java
@@ -0,0 +1,95 @@
+package mage.cards.m;
+
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SetTargetPointer;
+import mage.constants.Zone;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.permanent.TokenPredicate;
+import mage.game.Game;
+import mage.players.Player;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class MirrorMarch extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterCreaturePermanent("nontoken creature");
+
+ static {
+ filter.add(Predicates.not(TokenPredicate.instance));
+ }
+
+ public MirrorMarch(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{5}{R}");
+
+ // Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step.
+ this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
+ Zone.BATTLEFIELD, new MirrorMarchEffect(), filter, false, SetTargetPointer.PERMANENT,
+ "Whenever a nontoken creature enters the battlefield under your control, " +
+ "flip a coin until you lose a flip. For each flip you won, " +
+ "create a token that's a copy of that creature. Those tokens gain haste. " +
+ "Exile them at the beginning of the next end step."
+ ));
+ }
+
+ private MirrorMarch(final MirrorMarch card) {
+ super(card);
+ }
+
+ @Override
+ public MirrorMarch copy() {
+ return new MirrorMarch(this);
+ }
+}
+
+class MirrorMarchEffect extends OneShotEffect {
+
+ MirrorMarchEffect() {
+ super(Outcome.Benefit);
+ }
+
+ private MirrorMarchEffect(final MirrorMarchEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public MirrorMarchEffect copy() {
+ return new MirrorMarchEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ int counter = 0;
+ boolean wonFlip = false;
+ do {
+ wonFlip = player.flipCoin(source, game, true);
+ if (wonFlip) {
+ counter++;
+ }
+ } while (wonFlip);
+ if (counter > 0) {
+ CreateTokenCopyTargetEffect effect
+ = new CreateTokenCopyTargetEffect(player.getId(), null, true, counter);
+ effect.setUseLKI(true);
+ effect.setTargetPointer(targetPointer);
+ effect.apply(game, source);
+ effect.exileTokensCreatedAtNextEndStep(game, source);
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/m/MirrorStrike.java b/Mage.Sets/src/mage/cards/m/MirrorStrike.java
index b76e9ff5693..f6f38df4317 100644
--- a/Mage.Sets/src/mage/cards/m/MirrorStrike.java
+++ b/Mage.Sets/src/mage/cards/m/MirrorStrike.java
@@ -29,7 +29,7 @@ public final class MirrorStrike extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("unblocked creature");
static {
- filter.add(new UnblockedPredicate());
+ filter.add(UnblockedPredicate.instance);
}
public MirrorStrike(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/Mirrorworks.java b/Mage.Sets/src/mage/cards/m/Mirrorworks.java
index 80d47816576..c96992b9a42 100644
--- a/Mage.Sets/src/mage/cards/m/Mirrorworks.java
+++ b/Mage.Sets/src/mage/cards/m/Mirrorworks.java
@@ -26,8 +26,8 @@ public final class Mirrorworks extends CardImpl {
private final static FilterArtifactPermanent filter = new FilterArtifactPermanent("another nontoken artifact");
static {
- filter.add(new AnotherPredicate());
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public Mirrorworks(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/Mise.java b/Mage.Sets/src/mage/cards/m/Mise.java
index 23cdc07e72c..06074b560f1 100644
--- a/Mage.Sets/src/mage/cards/m/Mise.java
+++ b/Mage.Sets/src/mage/cards/m/Mise.java
@@ -52,7 +52,7 @@ class MiseEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
- Object object = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
+ Object object = game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY);
if (player != null && object instanceof String) {
Card card = player.getLibrary().getFromTop(game);
String namedCard = (String) object;
diff --git a/Mage.Sets/src/mage/cards/m/MishrasSelfReplicator.java b/Mage.Sets/src/mage/cards/m/MishrasSelfReplicator.java
index 351049efa76..709731b01e4 100644
--- a/Mage.Sets/src/mage/cards/m/MishrasSelfReplicator.java
+++ b/Mage.Sets/src/mage/cards/m/MishrasSelfReplicator.java
@@ -23,7 +23,7 @@ public final class MishrasSelfReplicator extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a historic spell");
static {
- filter.add(new HistoricPredicate());
+ filter.add(HistoricPredicate.instance);
}
public MishrasSelfReplicator(UUID ownerId, CardSetInfo setInfo) {
@@ -37,7 +37,7 @@ public final class MishrasSelfReplicator extends CardImpl {
this.addAbility(new SpellCastControllerTriggeredAbility(new DoIfCostPaid(
new CreateTokenCopySourceEffect()
.setText("create a token that's a copy of {this}. (Artifacts, legendaries, and Sagas are historic.)"),
- new ManaCostsImpl("{1}")), filter, true));
+ new ManaCostsImpl("{1}")), filter, false));
}
diff --git a/Mage.Sets/src/mage/cards/m/Mistcaller.java b/Mage.Sets/src/mage/cards/m/Mistcaller.java
index 88f7d3952ed..e2bef655e5c 100644
--- a/Mage.Sets/src/mage/cards/m/Mistcaller.java
+++ b/Mage.Sets/src/mage/cards/m/Mistcaller.java
@@ -1,6 +1,5 @@
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -8,21 +7,18 @@ import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.players.Player;
import mage.watchers.common.CreatureWasCastWatcher;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class Mistcaller extends CardImpl {
@@ -96,14 +92,14 @@ class ContainmentPriestReplacementEffect extends ReplacementEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
if (((ZoneChangeEvent) event).getToZone() == Zone.BATTLEFIELD) {
Card card = game.getCard(event.getTargetId());
- Object entersTransformed = game.getState().getValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + event.getTargetId());
- if (entersTransformed instanceof Boolean && (Boolean) entersTransformed && card.getSecondCardFace() != null) {
- card = card.getSecondCardFace();
- }
- if (card.isCreature()) { // TODO: Bestow Card cast as Enchantment probably not handled correctly
- CreatureWasCastWatcher watcher = (CreatureWasCastWatcher) game.getState().getWatchers().get(CreatureWasCastWatcher.class.getSimpleName());
- if (watcher != null && !watcher.wasCreatureCastThisTurn(event.getTargetId())) {
- return true;
+ if (card != null) {
+ Object entersTransformed = game.getState().getValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + event.getTargetId());
+ if (entersTransformed instanceof Boolean && (Boolean) entersTransformed && card.getSecondCardFace() != null) {
+ card = card.getSecondCardFace();
+ }
+ if (card != null && card.isCreature()) { // TODO: Bestow Card cast as Enchantment probably not handled correctly
+ CreatureWasCastWatcher watcher = game.getState().getWatcher(CreatureWasCastWatcher.class);
+ return watcher != null && !watcher.wasCreatureCastThisTurn(event.getTargetId());
}
}
}
diff --git a/Mage.Sets/src/mage/cards/m/MobileGarrison.java b/Mage.Sets/src/mage/cards/m/MobileGarrison.java
index 35793906e41..3ebd7811e8f 100644
--- a/Mage.Sets/src/mage/cards/m/MobileGarrison.java
+++ b/Mage.Sets/src/mage/cards/m/MobileGarrison.java
@@ -27,7 +27,7 @@ public final class MobileGarrison extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another target artifact or creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(Predicates.or(
new CardTypePredicate(CardType.ARTIFACT),
new CardTypePredicate(CardType.CREATURE)
diff --git a/Mage.Sets/src/mage/cards/m/MoggAssassin.java b/Mage.Sets/src/mage/cards/m/MoggAssassin.java
index 1051e3a9fd2..8f8f2a93526 100644
--- a/Mage.Sets/src/mage/cards/m/MoggAssassin.java
+++ b/Mage.Sets/src/mage/cards/m/MoggAssassin.java
@@ -2,7 +2,6 @@
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -11,8 +10,8 @@ import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -20,59 +19,36 @@ import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author L_J
*/
public final class MoggAssassin extends CardImpl {
- private final UUID originalId;
-
public MoggAssassin(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.ASSASSIN);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
-
- //TODO: Make ability properly copiable
+
// {T}: You choose target creature an opponent controls, and that opponent chooses target creature. Flip a coin. If you win the flip, destroy the creature you chose. If you lose the flip, destroy the creature your opponent chose.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MoggAssassinEffect(), new TapSourceCost());
+ Ability ability = new SimpleActivatedAbility(
+ Zone.BATTLEFIELD,
+ new MoggAssassinEffect(),
+ new TapSourceCost()
+ );
ability.addTarget(new TargetOpponentsCreaturePermanent());
ability.addTarget(new TargetCreaturePermanent());
+ ability.setTargetAdjuster(MoggAssassinAdjuster.instance);
this.addAbility(ability);
- originalId = ability.getOriginalId();
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- Player controller = game.getPlayer(ability.getControllerId());
- if (controller != null) {
- UUID opponentId = null;
- if (game.getOpponents(controller.getId()).size() > 1) {
- Target target = ability.getTargets().get(0);
- if (controller.chooseTarget(Outcome.DestroyPermanent, target, ability, game)) {
- Permanent permanent = game.getPermanent(target.getFirstTarget());
- opponentId = permanent.getControllerId();
- } else {
- opponentId = game.getOpponents(controller.getId()).iterator().next();
- }
- } else {
- opponentId = game.getOpponents(controller.getId()).iterator().next();
- }
-
- if (opponentId != null) {
- ability.getTargets().get(1).setTargetController(opponentId);
- }
- }
- }
}
public MoggAssassin(final MoggAssassin card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -82,6 +58,34 @@ public final class MoggAssassin extends CardImpl {
}
+enum MoggAssassinAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller == null) {
+ return;
+ }
+ UUID opponentId = null;
+ if (game.getOpponents(controller.getId()).size() > 1) {
+ Target target = ability.getTargets().get(0);
+ if (controller.chooseTarget(Outcome.DestroyPermanent, target, ability, game)) {
+ Permanent permanent = game.getPermanent(target.getFirstTarget());
+ opponentId = permanent.getControllerId();
+ } else {
+ opponentId = game.getOpponents(controller.getId()).iterator().next();
+ }
+ } else {
+ opponentId = game.getOpponents(controller.getId()).iterator().next();
+ }
+
+ if (opponentId != null) {
+ ability.getTargets().get(1).setTargetController(opponentId);
+ }
+ }
+}
+
class MoggAssassinEffect extends OneShotEffect {
public MoggAssassinEffect() {
@@ -100,21 +104,21 @@ class MoggAssassinEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- Permanent chosenPermanent = game.getPermanent(source.getTargets().get(0).getFirstTarget());
- Permanent opponentsPermanent = game.getPermanent(source.getTargets().get(1).getFirstTarget());
- if (controller.flipCoin(game)) {
- if (chosenPermanent != null) {
- chosenPermanent.destroy(source.getSourceId(), game, false);
- return true;
- }
- } else {
- if (opponentsPermanent != null) {
- opponentsPermanent.destroy(source.getSourceId(), game, false);
- return true;
- }
+ if (controller == null) {
+ return false;
+ }
+ Permanent chosenPermanent = game.getPermanent(source.getTargets().get(0).getFirstTarget());
+ Permanent opponentsPermanent = game.getPermanent(source.getTargets().get(1).getFirstTarget());
+ if (controller.flipCoin(source, game, true)) {
+ if (chosenPermanent != null) {
+ chosenPermanent.destroy(source.getSourceId(), game, false);
+ return true;
+ }
+ } else {
+ if (opponentsPermanent != null) {
+ opponentsPermanent.destroy(source.getSourceId(), game, false);
+ return true;
}
}
return false;
diff --git a/Mage.Sets/src/mage/cards/m/MoggBombers.java b/Mage.Sets/src/mage/cards/m/MoggBombers.java
index 65700c1643e..b0635fc2ebd 100644
--- a/Mage.Sets/src/mage/cards/m/MoggBombers.java
+++ b/Mage.Sets/src/mage/cards/m/MoggBombers.java
@@ -26,7 +26,7 @@ public final class MoggBombers extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MoggBombers(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MoggConscripts.java b/Mage.Sets/src/mage/cards/m/MoggConscripts.java
index f70bacbbfd1..9a69e98c7ca 100644
--- a/Mage.Sets/src/mage/cards/m/MoggConscripts.java
+++ b/Mage.Sets/src/mage/cards/m/MoggConscripts.java
@@ -67,7 +67,7 @@ class MoggConscriptsEffect extends RestrictionEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
if (permanent.getId().equals(source.getSourceId())) {
- PlayerCastCreatureWatcher watcher = (PlayerCastCreatureWatcher) game.getState().getWatchers().get(PlayerCastCreatureWatcher.class.getSimpleName());
+ PlayerCastCreatureWatcher watcher = game.getState().getWatcher(PlayerCastCreatureWatcher.class);
if (watcher != null && !watcher.playerDidCastCreatureThisTurn(source.getControllerId())) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/m/MoggJailer.java b/Mage.Sets/src/mage/cards/m/MoggJailer.java
index bce46bb14ab..8b8eb90e0a3 100644
--- a/Mage.Sets/src/mage/cards/m/MoggJailer.java
+++ b/Mage.Sets/src/mage/cards/m/MoggJailer.java
@@ -25,7 +25,7 @@ public final class MoggJailer extends CardImpl {
static final private FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature with power 2 or less");
static {
- filter.add(Predicates.and(new PowerPredicate(ComparisonType.FEWER_THAN, 2), Predicates.not(new TappedPredicate())));
+ filter.add(Predicates.and(new PowerPredicate(ComparisonType.FEWER_THAN, 2), Predicates.not(TappedPredicate.instance)));
}
public MoggJailer(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MoggSquad.java b/Mage.Sets/src/mage/cards/m/MoggSquad.java
index c7b2934783e..d41435d187d 100644
--- a/Mage.Sets/src/mage/cards/m/MoggSquad.java
+++ b/Mage.Sets/src/mage/cards/m/MoggSquad.java
@@ -27,7 +27,7 @@ public final class MoggSquad extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each other creature on the battlefield");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MoggSquad(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MogissMarauder.java b/Mage.Sets/src/mage/cards/m/MogissMarauder.java
index b5271f482d7..d797c3fd005 100644
--- a/Mage.Sets/src/mage/cards/m/MogissMarauder.java
+++ b/Mage.Sets/src/mage/cards/m/MogissMarauder.java
@@ -1,7 +1,6 @@
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -12,20 +11,22 @@ import mage.abilities.keyword.IntimidateAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.ColoredManaSymbol;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class MogissMarauder extends CardImpl {
public MogissMarauder(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.BERSERKER);
@@ -35,24 +36,13 @@ public final class MogissMarauder extends CardImpl {
// When Mogis's Marauder enters the battlefield, up to X target creatures each gain intimidate and haste, where X is your devotion to black.
Ability ability = new EntersBattlefieldTriggeredAbility(
new GainAbilityTargetEffect(IntimidateAbility.getInstance(), Duration.EndOfTurn,
- "up to X target creatures each gain intimidate"), false);
+ "up to X target creatures each gain intimidate"), false);
ability.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn,
"and haste until end of turn, where X is your devotion to black"));
- ability.addTarget(new TargetCreaturePermanent());
+ ability.setTargetAdjuster(MogissMarauderAdjuster.instance);
this.addAbility(ability);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- ability.getTargets().clear();
- int numbTargets = new DevotionCount(ColoredManaSymbol.B).calculate(game, ability, null);
- if (numbTargets > 0) {
- ability.addTarget(new TargetCreaturePermanent(0,numbTargets));
- }
- }
- }
-
public MogissMarauder(final MogissMarauder card) {
super(card);
}
@@ -62,3 +52,16 @@ public final class MogissMarauder extends CardImpl {
return new MogissMarauder(this);
}
}
+
+enum MogissMarauderAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int numbTargets = new DevotionCount(ColoredManaSymbol.B).calculate(game, ability, null);
+ if (numbTargets > 0) {
+ ability.addTarget(new TargetCreaturePermanent(0, numbTargets));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/m/Molder.java b/Mage.Sets/src/mage/cards/m/Molder.java
index 5501bbe9336..cffc75b81a1 100644
--- a/Mage.Sets/src/mage/cards/m/Molder.java
+++ b/Mage.Sets/src/mage/cards/m/Molder.java
@@ -1,9 +1,7 @@
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.GainLifeEffect;
@@ -11,13 +9,16 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
+import mage.filter.FilterPermanent;
import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LoneFox
*/
public final class Molder extends CardImpl {
@@ -26,20 +27,9 @@ public final class Molder extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{G}");
// Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life.
- this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
- this.getSpellAbility().addTarget(new TargetPermanent(new FilterArtifactOrEnchantmentPermanent("artifact or enchantment with converted mana cost X")));
- this.getSpellAbility().addEffect(new GainLifeEffect(new ManacostVariableValue()));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterArtifactOrEnchantmentPermanent filter = new FilterArtifactOrEnchantmentPermanent("artifact or enchantment with converted mana cost X");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
- ability.addTarget(new TargetPermanent(filter));
- }
+ this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target artifact or enchantment with converted mana cost X.", true));
+ this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.instance));
+ this.getSpellAbility().setTargetAdjuster(MolderAdjuster.instance);
}
public Molder(final Molder card) {
@@ -51,3 +41,16 @@ public final class Molder extends CardImpl {
return new Molder(this);
}
}
+
+enum MolderAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterPermanent filter = new FilterArtifactOrEnchantmentPermanent("artifact or enchantment with converted mana cost " + xValue);
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, xValue));
+ ability.addTarget(new TargetPermanent(filter));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/m/MoltenBirth.java b/Mage.Sets/src/mage/cards/m/MoltenBirth.java
index 66898ae84db..6fbee1801cb 100644
--- a/Mage.Sets/src/mage/cards/m/MoltenBirth.java
+++ b/Mage.Sets/src/mage/cards/m/MoltenBirth.java
@@ -1,7 +1,5 @@
-
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
@@ -14,8 +12,9 @@ import mage.game.Game;
import mage.game.permanent.token.MoltenBirthElementalToken;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class MoltenBirth extends CardImpl {
@@ -57,13 +56,15 @@ class MoltenBirthEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- Card molten = game.getCard(source.getSourceId());
if (controller != null) {
MoltenBirthElementalToken token = new MoltenBirthElementalToken();
token.putOntoBattlefield(2, game, source.getSourceId(), source.getControllerId());
- if (controller.flipCoin(game)) {
- molten.moveToZone(Zone.HAND, source.getSourceId(), game, true);
- game.informPlayers(controller.getLogName() + " won the flip. " + molten.getLogName() + " is returned to " + controller.getLogName() + "'s hand.");
+ if (controller.flipCoin(source, game, true)) {
+ Card molten = game.getCard(source.getSourceId());
+ if (molten != null) {
+ molten.moveToZone(Zone.HAND, source.getSourceId(), game, true);
+ game.informPlayers(controller.getLogName() + " won the flip. " + molten.getLogName() + " is returned to " + controller.getLogName() + "'s hand.");
+ }
}
return true;
}
diff --git a/Mage.Sets/src/mage/cards/m/MoltenNursery.java b/Mage.Sets/src/mage/cards/m/MoltenNursery.java
index dcc0dace269..e0280c34cda 100644
--- a/Mage.Sets/src/mage/cards/m/MoltenNursery.java
+++ b/Mage.Sets/src/mage/cards/m/MoltenNursery.java
@@ -22,7 +22,7 @@ public final class MoltenNursery extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a colorless spell");
static {
- filter.add(new ColorlessPredicate());
+ filter.add(ColorlessPredicate.instance);
}
public MoltenNursery(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MoltenPrimordial.java b/Mage.Sets/src/mage/cards/m/MoltenPrimordial.java
index 58eaca78306..c557bcccf9b 100644
--- a/Mage.Sets/src/mage/cards/m/MoltenPrimordial.java
+++ b/Mage.Sets/src/mage/cards/m/MoltenPrimordial.java
@@ -1,7 +1,6 @@
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -13,9 +12,9 @@ import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
@@ -23,16 +22,18 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class MoltenPrimordial extends CardImpl {
public MoltenPrimordial(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{R}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
this.subtype.add(SubType.AVATAR);
this.power = new MageInt(6);
@@ -42,23 +43,9 @@ public final class MoltenPrimordial extends CardImpl {
this.addAbility(HasteAbility.getInstance());
// When Molten Primordial enters the battlefield, for each opponent, take control of up to one target creature that player controls until end of turn. Untap those creatures. They have haste until end of turn.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new MoltenPrimordialEffect(),false));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- ability.getTargets().clear();
- for(UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creature from opponent " + opponent.getLogName());
- filter.add(new ControllerIdPredicate(opponentId));
- TargetCreaturePermanent target = new TargetCreaturePermanent(0,1, filter,false);
- ability.addTarget(target);
- }
- }
- }
+ Ability ability = new EntersBattlefieldTriggeredAbility(new MoltenPrimordialEffect(), false);
+ ability.setTargetAdjuster(MoltenPrimordialAdjuster.instance);
+ this.addAbility(ability);
}
public MoltenPrimordial(final MoltenPrimordial card) {
@@ -71,6 +58,24 @@ public final class MoltenPrimordial extends CardImpl {
}
}
+enum MoltenPrimordialAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null) {
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature from opponent " + opponent.getLogName());
+ filter.add(new ControllerIdPredicate(opponentId));
+ TargetCreaturePermanent target = new TargetCreaturePermanent(0, 1, filter, false);
+ ability.addTarget(target);
+ }
+ }
+ }
+}
+
class MoltenPrimordialEffect extends OneShotEffect {
public MoltenPrimordialEffect() {
@@ -90,7 +95,7 @@ class MoltenPrimordialEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
boolean result = false;
- for (Target target: source.getTargets()) {
+ for (Target target : source.getTargets()) {
if (target instanceof TargetCreaturePermanent) {
Permanent targetCreature = game.getPermanent(target.getFirstTarget());
if (targetCreature != null) {
diff --git a/Mage.Sets/src/mage/cards/m/MoltenPsyche.java b/Mage.Sets/src/mage/cards/m/MoltenPsyche.java
index bd9f8b6e8de..b2d6e26ee9e 100644
--- a/Mage.Sets/src/mage/cards/m/MoltenPsyche.java
+++ b/Mage.Sets/src/mage/cards/m/MoltenPsyche.java
@@ -83,11 +83,11 @@ class MoltenPsycheEffect extends OneShotEffect {
}
}
if (MetalcraftCondition.instance.apply(game, source)) {
- MoltenPsycheWatcher watcher = (MoltenPsycheWatcher) game.getState().getWatchers().get(MoltenPsycheWatcher.class.getSimpleName());
+ MoltenPsycheWatcher watcher = game.getState().getWatcher(MoltenPsycheWatcher.class);
for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
if (game.isOpponent(controller, playerId)) {
Player player = game.getPlayer(playerId);
- if (player != null) {
+ if (player != null && watcher != null) {
player.damage(watcher.getDraws(playerId), source.getSourceId(), game, false, true);
}
}
diff --git a/Mage.Sets/src/mage/cards/m/MoltenSentry.java b/Mage.Sets/src/mage/cards/m/MoltenSentry.java
index c4640f09dce..d39b4c15517 100644
--- a/Mage.Sets/src/mage/cards/m/MoltenSentry.java
+++ b/Mage.Sets/src/mage/cards/m/MoltenSentry.java
@@ -64,7 +64,7 @@ class MoltenSentryEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanentEntering(source.getSourceId());
if (controller != null && permanent != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, false)) {
game.informPlayers("Heads: " + permanent.getLogName() + " enters the battlefield as a 5/2 creature with haste");
permanent.getPower().modifyBaseValue(5);
permanent.getToughness().modifyBaseValue(2);
diff --git a/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java b/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java
index a6e3ef4dea9..5d339c274aa 100644
--- a/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java
+++ b/Mage.Sets/src/mage/cards/m/MoltenSlagheap.java
@@ -36,7 +36,7 @@ public final class MoltenSlagheap extends CardImpl {
this.addAbility(ability);
// {1}, Remove X storage counters from Molten Slagheap: Add X mana in any combination of {B} and/or {R}.
ability = new SimpleManaAbility(Zone.BATTLEFIELD,
- new AddManaInAnyCombinationEffect(new RemovedCountersForCostValue(), ColoredManaSymbol.B, ColoredManaSymbol.R),
+ new AddManaInAnyCombinationEffect(RemovedCountersForCostValue.instance, ColoredManaSymbol.B, ColoredManaSymbol.R),
new GenericManaCost(1));
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.STORAGE.createInstance()));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/m/Monsoon.java b/Mage.Sets/src/mage/cards/m/Monsoon.java
index 4b91ad79f8e..24c52740c5c 100644
--- a/Mage.Sets/src/mage/cards/m/Monsoon.java
+++ b/Mage.Sets/src/mage/cards/m/Monsoon.java
@@ -50,7 +50,7 @@ class MonsoonEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterPermanent();
static {
filter.add(new SubtypePredicate(SubType.ISLAND));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MonsoonEffect() {
diff --git a/Mage.Sets/src/mage/cards/m/MonstrousOnslaught.java b/Mage.Sets/src/mage/cards/m/MonstrousOnslaught.java
index 77087fd6242..28f7226af55 100644
--- a/Mage.Sets/src/mage/cards/m/MonstrousOnslaught.java
+++ b/Mage.Sets/src/mage/cards/m/MonstrousOnslaught.java
@@ -21,7 +21,7 @@ public final class MonstrousOnslaught extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}{G}");
// Monstrous Onslaught deals X damage divided as you choose among any number of target creatures, where X is the greatest power among creatures you control as you cast Monstrous Onslaught.
- DynamicValue xValue = new GreatestPowerAmongControlledCreaturesValue();
+ DynamicValue xValue = GreatestPowerAmongControlledCreaturesValue.instance;
Effect effect = new DamageMultiEffect(xValue);
effect.setText("{this} deals X damage divided as you choose among any number of target creatures, where X is the greatest power among creatures you control as you cast {this}");
this.getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/m/MorkrutNecropod.java b/Mage.Sets/src/mage/cards/m/MorkrutNecropod.java
index 7bffaa9327f..08a609f0edb 100644
--- a/Mage.Sets/src/mage/cards/m/MorkrutNecropod.java
+++ b/Mage.Sets/src/mage/cards/m/MorkrutNecropod.java
@@ -27,7 +27,7 @@ public final class MorkrutNecropod extends CardImpl {
filter.add(Predicates.or(
new CardTypePredicate(CardType.CREATURE),
new CardTypePredicate(CardType.LAND)));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MorkrutNecropod(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/Mortuary.java b/Mage.Sets/src/mage/cards/m/Mortuary.java
index f1aa17f0801..22797d4d4fa 100644
--- a/Mage.Sets/src/mage/cards/m/Mortuary.java
+++ b/Mage.Sets/src/mage/cards/m/Mortuary.java
@@ -1,7 +1,5 @@
-
package mage.cards.m;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility;
import mage.abilities.effects.common.PutOnLibraryTargetEffect;
@@ -10,8 +8,9 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
+import java.util.UUID;
+
/**
- *
* @author HCrescent
*/
public final class Mortuary extends CardImpl {
@@ -19,9 +18,9 @@ public final class Mortuary extends CardImpl {
public Mortuary(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
-
- Ability ability = new PutIntoGraveFromBattlefieldAllTriggeredAbility(new PutOnLibraryTargetEffect(true, "put that card on top of your library."), false, StaticFilters.FILTER_PERMANENT_CREATURE, true, true);
+
// Whenever a creature is put into your graveyard from the battlefield, put that card on top of your library.
+ Ability ability = new PutIntoGraveFromBattlefieldAllTriggeredAbility(new PutOnLibraryTargetEffect(true, "put that card on top of your library."), false, StaticFilters.FILTER_PERMANENT_CREATURE, true, true);
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/m/MossbridgeTroll.java b/Mage.Sets/src/mage/cards/m/MossbridgeTroll.java
index e0c45e08017..2218db67e66 100644
--- a/Mage.Sets/src/mage/cards/m/MossbridgeTroll.java
+++ b/Mage.Sets/src/mage/cards/m/MossbridgeTroll.java
@@ -36,7 +36,7 @@ public final class MossbridgeTroll extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creatures you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MossbridgeTroll(UUID ownerId, CardSetInfo setInfo) {
@@ -109,8 +109,8 @@ class MossbridgeTrollCost extends CostImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("any number of untapped creatures other than {this} with total power 10 or greater");
static {
- filter.add(new AnotherPredicate());
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MossbridgeTrollCost() {
diff --git a/Mage.Sets/src/mage/cards/m/MothdustChangeling.java b/Mage.Sets/src/mage/cards/m/MothdustChangeling.java
index 9f645fe8eb7..6f276339b1e 100644
--- a/Mage.Sets/src/mage/cards/m/MothdustChangeling.java
+++ b/Mage.Sets/src/mage/cards/m/MothdustChangeling.java
@@ -27,7 +27,7 @@ public final class MothdustChangeling extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MothdustChangeling(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MouthFeed.java b/Mage.Sets/src/mage/cards/m/MouthFeed.java
index 17fabe507f6..c154c520907 100644
--- a/Mage.Sets/src/mage/cards/m/MouthFeed.java
+++ b/Mage.Sets/src/mage/cards/m/MouthFeed.java
@@ -38,7 +38,7 @@ public final class MouthFeed extends SplitCard {
// to
// Feed
// Draw a card for each creature you control with power 3 or greater
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
Effect draw = new DrawCardSourceControllerEffect(new PermanentsOnBattlefieldCount(filterCreaturesYouControlPower3orGreater));
getRightHalfCard().getSpellAbility().addEffect(draw);
diff --git a/Mage.Sets/src/mage/cards/m/MudbrawlerCohort.java b/Mage.Sets/src/mage/cards/m/MudbrawlerCohort.java
index a8ff123ee6e..1d0ddf8e5c5 100644
--- a/Mage.Sets/src/mage/cards/m/MudbrawlerCohort.java
+++ b/Mage.Sets/src/mage/cards/m/MudbrawlerCohort.java
@@ -34,7 +34,7 @@ public final class MudbrawlerCohort extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.RED));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MudbrawlerCohort(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/Mudslide.java b/Mage.Sets/src/mage/cards/m/Mudslide.java
index c63e74715d2..84d3855ead9 100644
--- a/Mage.Sets/src/mage/cards/m/Mudslide.java
+++ b/Mage.Sets/src/mage/cards/m/Mudslide.java
@@ -65,7 +65,7 @@ class MudslideEffect extends OneShotEffect {
static {
filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class)));
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
MudslideEffect() {
diff --git a/Mage.Sets/src/mage/cards/m/MuldrothaTheGravetide.java b/Mage.Sets/src/mage/cards/m/MuldrothaTheGravetide.java
index f80bf2ab4d4..dcb9f0f3b22 100644
--- a/Mage.Sets/src/mage/cards/m/MuldrothaTheGravetide.java
+++ b/Mage.Sets/src/mage/cards/m/MuldrothaTheGravetide.java
@@ -88,7 +88,7 @@ class MuldrothaTheGravetideCastFromGraveyardEffect extends AsThoughEffectImpl {
&& source.isControlledBy(game.getOwnerId(objectId)) // only from your graveyard
&& affectedControllerId.equals(game.getActivePlayerId()) // only during your turns (e.g. prevent flash creatures)
&& Zone.GRAVEYARD.equals(game.getState().getZone(objectId))) {
- MuldrothaTheGravetideWatcher watcher = (MuldrothaTheGravetideWatcher) game.getState().getWatchers().get(MuldrothaTheGravetideWatcher.class.getSimpleName());
+ MuldrothaTheGravetideWatcher watcher = game.getState().getWatcher(MuldrothaTheGravetideWatcher.class);
MageObject mageObject = game.getObject(objectId);
if (mageObject != null && watcher != null) {
for (CardType cardType : mageObject.getCardType()) {
@@ -121,7 +121,7 @@ class MuldrothaTheGravetideWatcher extends Watcher {
private Zone fromZone;
public MuldrothaTheGravetideWatcher() {
- super(MuldrothaTheGravetideWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(MuldrothaTheGravetideWatcher.class, WatcherScope.GAME);
}
public MuldrothaTheGravetideWatcher(final MuldrothaTheGravetideWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java b/Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java
index 63949d9ba94..d2e45d955e9 100644
--- a/Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java
+++ b/Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java
@@ -33,7 +33,7 @@ public final class MultaniMaroSorcerer extends CardImpl {
this.addAbility(ShroudAbility.getInstance());
// Multani, Maro-Sorcerer's power and toughness are each equal to the total number of cards in all players' hands.
- this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new CardsInAllHandsCount(), Duration.EndOfGame)));
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(CardsInAllHandsCount.instance, Duration.EndOfGame)));
}
public MultaniMaroSorcerer(final MultaniMaroSorcerer card) {
diff --git a/Mage.Sets/src/mage/cards/m/MultanisPresence.java b/Mage.Sets/src/mage/cards/m/MultanisPresence.java
index 2ad766fea5f..01e1214ae82 100644
--- a/Mage.Sets/src/mage/cards/m/MultanisPresence.java
+++ b/Mage.Sets/src/mage/cards/m/MultanisPresence.java
@@ -62,8 +62,8 @@ class MultanisPresenceTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- MultanisPresenceWatcher watcher = (MultanisPresenceWatcher) game.getState().getWatchers().get(MultanisPresenceWatcher.class.getSimpleName());
- return (watcher.getSpellsCastThisTurn(controllerId).contains(event.getTargetId()));
+ MultanisPresenceWatcher watcher = game.getState().getWatcher(MultanisPresenceWatcher.class);
+ return watcher != null && watcher.getSpellsCastThisTurn(controllerId).contains(event.getTargetId());
}
@Override
diff --git a/Mage.Sets/src/mage/cards/m/MummyParamount.java b/Mage.Sets/src/mage/cards/m/MummyParamount.java
index e48d48455c2..4555272f37d 100644
--- a/Mage.Sets/src/mage/cards/m/MummyParamount.java
+++ b/Mage.Sets/src/mage/cards/m/MummyParamount.java
@@ -23,7 +23,7 @@ public final class MummyParamount extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Zombie");
static {
filter.add(new SubtypePredicate(SubType.ZOMBIE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MummyParamount(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MundasVanguard.java b/Mage.Sets/src/mage/cards/m/MundasVanguard.java
index b2c05c34b7a..52708a49288 100644
--- a/Mage.Sets/src/mage/cards/m/MundasVanguard.java
+++ b/Mage.Sets/src/mage/cards/m/MundasVanguard.java
@@ -32,7 +32,7 @@ public final class MundasVanguard extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ALLY));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public MundasVanguard(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MurderousCompulsion.java b/Mage.Sets/src/mage/cards/m/MurderousCompulsion.java
index 169a2b55eef..5056353cdca 100644
--- a/Mage.Sets/src/mage/cards/m/MurderousCompulsion.java
+++ b/Mage.Sets/src/mage/cards/m/MurderousCompulsion.java
@@ -21,7 +21,7 @@ public final class MurderousCompulsion extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public MurderousCompulsion(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MurmuringMystic.java b/Mage.Sets/src/mage/cards/m/MurmuringMystic.java
index e68836883f6..68ef0c9f873 100644
--- a/Mage.Sets/src/mage/cards/m/MurmuringMystic.java
+++ b/Mage.Sets/src/mage/cards/m/MurmuringMystic.java
@@ -1,18 +1,18 @@
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
-import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.game.permanent.token.BirdIllusionToken;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class MurmuringMystic extends CardImpl {
@@ -28,7 +28,7 @@ public final class MurmuringMystic extends CardImpl {
// Whenever you cast an instant or sorcery spell, create a 1/1 blue Bird Illusion creature token with flying.
this.addAbility(new SpellCastControllerTriggeredAbility(
new CreateTokenEffect(new BirdIllusionToken()),
- StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY, false
+ StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false
));
}
diff --git a/Mage.Sets/src/mage/cards/m/Musician.java b/Mage.Sets/src/mage/cards/m/Musician.java
new file mode 100644
index 00000000000..4b99c7b0042
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/m/Musician.java
@@ -0,0 +1,134 @@
+package mage.cards.m;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.CostImpl;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.constants.SubType;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.CountersSourceCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DestroySourceEffect;
+import mage.abilities.effects.common.DoUnlessControllerPaysEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.abilities.keyword.CumulativeUpkeepAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class Musician extends CardImpl {
+
+ public Musician(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.WIZARD);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(3);
+
+ // Cumulative upkeep {1}
+ this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{1}")));
+
+ // {tap}: Put a music counter on target creature. If it doesn't have "At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it," it gains that ability.
+ Effect effect = new DoUnlessControllerPaysEffect(
+ new DestroySourceEffect(),
+ new DynamicValueGenericManaCost(
+ new CountersSourceCount(
+ CounterType.MUSIC)));
+ effect.setText("destroy this creature unless you pay {1} for each music counter on it");
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(
+ Zone.BATTLEFIELD,
+ effect,
+ TargetController.YOU,
+ false,
+ false,
+ "At the beginning of your upkeep, ");
+ Effect effect2 = new AddCountersTargetEffect(CounterType.MUSIC.createInstance());
+ effect2.setText("Put a music counter on target creature");
+ Effect effect3 = new GainAbilityTargetEffect(
+ ability,
+ Duration.WhileOnBattlefield);
+ effect3.setText("If it doesn't have \"At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it,\" it gains that ability");
+ Ability ability2 = new SimpleActivatedAbility(
+ Zone.BATTLEFIELD,
+ effect2,
+ new TapSourceCost());
+ ability2.addTarget(new TargetCreaturePermanent());
+ ability2.addEffect(effect3);
+ this.addAbility(ability2);
+
+ }
+
+ private Musician(final Musician card) {
+ super(card);
+ }
+
+ @Override
+ public Musician copy() {
+ return new Musician(this);
+ }
+}
+
+class DynamicValueGenericManaCost extends CostImpl {
+
+ DynamicValue amount;
+
+ public DynamicValueGenericManaCost(DynamicValue amount) {
+ this.amount = amount;
+ setText();
+ }
+
+ public DynamicValueGenericManaCost(DynamicValueGenericManaCost cost) {
+ super(cost);
+ this.amount = cost.amount;
+ }
+
+ @Override
+ public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) {
+ Player controller = game.getPlayer(controllerId);
+ if (controller == null) {
+ return false;
+ }
+ int convertedCost = amount.calculate(game, ability, null);
+ Cost cost = new GenericManaCost(convertedCost);
+ return cost.canPay(ability, sourceId, controllerId, game);
+ }
+
+ @Override
+ public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) {
+ Player controller = game.getPlayer(controllerId);
+ int convertedCost = amount.calculate(game, ability, null);
+ Cost cost = new GenericManaCost(convertedCost);
+ if (controller != null) {
+ paid = cost.pay(ability, game, sourceId, controllerId, noMana);
+ }
+ return paid;
+ }
+
+ @Override
+ public DynamicValueGenericManaCost copy() {
+ return new DynamicValueGenericManaCost(this);
+ }
+
+ private void setText() {
+ text = ("{1} for each music counter on {this}");
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/m/MycosynthFiend.java b/Mage.Sets/src/mage/cards/m/MycosynthFiend.java
index ddeaa5a4785..99d1ecdfb52 100644
--- a/Mage.Sets/src/mage/cards/m/MycosynthFiend.java
+++ b/Mage.Sets/src/mage/cards/m/MycosynthFiend.java
@@ -27,7 +27,7 @@ public final class MycosynthFiend extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
- DynamicValue value = new OpponentsPoisonCountersCount();
+ DynamicValue value = OpponentsPoisonCountersCount.instance;
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(value, value, Duration.WhileOnBattlefield)));
}
diff --git a/Mage.Sets/src/mage/cards/m/MyojinOfCleansingFire.java b/Mage.Sets/src/mage/cards/m/MyojinOfCleansingFire.java
index 923b7ab694b..6bad3165ae0 100644
--- a/Mage.Sets/src/mage/cards/m/MyojinOfCleansingFire.java
+++ b/Mage.Sets/src/mage/cards/m/MyojinOfCleansingFire.java
@@ -34,7 +34,7 @@ public final class MyojinOfCleansingFire extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public MyojinOfCleansingFire(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java b/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java
index 0302a4c60a6..b43eed17cc8 100644
--- a/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java
+++ b/Mage.Sets/src/mage/cards/m/MyrBattlesphere.java
@@ -105,7 +105,7 @@ class MyrBattlesphereEffect extends OneShotEffect {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped Myr you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new SubtypePredicate(SubType.MYR));
}
diff --git a/Mage.Sets/src/mage/cards/m/MythUnbound.java b/Mage.Sets/src/mage/cards/m/MythUnbound.java
index 28924a6075f..86e13abb32e 100644
--- a/Mage.Sets/src/mage/cards/m/MythUnbound.java
+++ b/Mage.Sets/src/mage/cards/m/MythUnbound.java
@@ -32,7 +32,7 @@ public final class MythUnbound extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent();
static {
- filter.add(new CommanderPredicate());
+ filter.add(CommanderPredicate.instance);
filter.add(new OwnerPredicate(TargetController.YOU));
}
@@ -78,9 +78,9 @@ class MythUnboundCostReductionEffect extends CostModificationEffectImpl {
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
- Ability spellAbility = (SpellAbility) abilityToModify;
+ Ability spellAbility = abilityToModify;
if (spellAbility != null) {
- Integer amount = (Integer) game.getState().getValue(abilityToModify.getControllerId() + "_castCount");
+ Integer amount = (Integer) game.getState().getValue(abilityToModify.getSourceId() + "_castCount");
if (amount != null && amount > 0) {
CardUtil.reduceCost(spellAbility, amount);
return true;
@@ -99,7 +99,7 @@ class MythUnboundCostReductionEffect extends CostModificationEffectImpl {
if (abilityToModify.isControlledBy(source.getControllerId())) {
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
if (spell != null) {
- return player.getCommandersIds().contains(spell.getId());
+ return player.getCommandersIds().contains(spell.getSourceId());
}
}
}
diff --git a/Mage.Sets/src/mage/cards/n/N1Starfighter.java b/Mage.Sets/src/mage/cards/n/N1Starfighter.java
index 85284b54fc9..bd50c4d84f7 100644
--- a/Mage.Sets/src/mage/cards/n/N1Starfighter.java
+++ b/Mage.Sets/src/mage/cards/n/N1Starfighter.java
@@ -28,7 +28,7 @@ public final class N1Starfighter extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public N1Starfighter(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NahiriTheHarbinger.java b/Mage.Sets/src/mage/cards/n/NahiriTheHarbinger.java
index c0dd70f67eb..1ba32622d66 100644
--- a/Mage.Sets/src/mage/cards/n/NahiriTheHarbinger.java
+++ b/Mage.Sets/src/mage/cards/n/NahiriTheHarbinger.java
@@ -49,9 +49,9 @@ public final class NahiriTheHarbinger extends CardImpl {
static {
filter.add(Predicates.or(new CardTypePredicate(CardType.ENCHANTMENT),
(Predicates.and(new CardTypePredicate(CardType.ARTIFACT),
- new TappedPredicate())),
+ TappedPredicate.instance)),
(Predicates.and(new CardTypePredicate(CardType.CREATURE),
- new TappedPredicate()))));
+ TappedPredicate.instance))));
}
public NahiriTheHarbinger(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NahirisWrath.java b/Mage.Sets/src/mage/cards/n/NahirisWrath.java
index e23c093552a..3777758cfe7 100644
--- a/Mage.Sets/src/mage/cards/n/NahirisWrath.java
+++ b/Mage.Sets/src/mage/cards/n/NahirisWrath.java
@@ -1,7 +1,6 @@
package mage.cards.n;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.costs.Cost;
import mage.abilities.costs.VariableCost;
@@ -19,38 +18,26 @@ import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInHand;
import mage.target.common.TargetCreatureOrPlaneswalker;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class NahirisWrath extends CardImpl {
public NahirisWrath(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}");
// As an additional cost to cast Nahiri's Wrath, discard X cards.
this.getSpellAbility().addCost(new NahirisWrathAdditionalCost());
// Nahiri's Wrath deals damage equal to the total converted mana cost of the discarded cards to each of up to X target creatures and/or planeswalkers.
- Effect effect = new DamageTargetEffect(new DiscardCostCardConvertedMana());
+ Effect effect = new DamageTargetEffect(DiscardCostCardConvertedMana.instance);
effect.setText("{this} deals damage equal to the total converted mana cost of the discarded cards to each of up to X target creatures and/or planeswalkers");
this.getSpellAbility().addEffect(effect);
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- ability.getTargets().clear();
- int numTargets = 0;
- for (VariableCost cost : ability.getCosts().getVariableCosts()) {
- if (cost instanceof NahirisWrathAdditionalCost) {
- numTargets = ((NahirisWrathAdditionalCost) cost).getAmount();
- break;
- }
- }
- if (numTargets > 0) {
- ability.addTarget(new TargetCreatureOrPlaneswalker(0, numTargets, new FilterCreatureOrPlaneswalkerPermanent(), false));
- }
+ this.getSpellAbility().setTargetAdjuster(NahirisWrathAdjuster.instance);
}
public NahirisWrath(final NahirisWrath card) {
@@ -63,6 +50,25 @@ public final class NahirisWrath extends CardImpl {
}
}
+enum NahirisWrathAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ int numTargets = 0;
+ for (VariableCost cost : ability.getCosts().getVariableCosts()) {
+ if (cost instanceof NahirisWrathAdditionalCost) {
+ numTargets = cost.getAmount();
+ break;
+ }
+ }
+ if (numTargets > 0) {
+ ability.addTarget(new TargetCreatureOrPlaneswalker(0, numTargets, new FilterCreatureOrPlaneswalkerPermanent(), false));
+ }
+ }
+}
+
class NahirisWrathAdditionalCost extends VariableCostImpl {
NahirisWrathAdditionalCost() {
diff --git a/Mage.Sets/src/mage/cards/n/NamelessRace.java b/Mage.Sets/src/mage/cards/n/NamelessRace.java
index e561b069369..73afab8657f 100644
--- a/Mage.Sets/src/mage/cards/n/NamelessRace.java
+++ b/Mage.Sets/src/mage/cards/n/NamelessRace.java
@@ -1,7 +1,5 @@
-
package mage.cards.n;
-import java.util.UUID;
import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.Ability;
@@ -16,12 +14,7 @@ import mage.abilities.keyword.TrampleAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.SubLayer;
-import mage.constants.TargetController;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
@@ -32,8 +25,9 @@ import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author L_J
*/
public final class NamelessRace extends CardImpl {
@@ -48,7 +42,7 @@ public final class NamelessRace extends CardImpl {
// As Nameless Race enters the battlefield, pay any amount of life. The amount you pay can't be more than the total number of white nontoken permanents your opponents control plus the total number of white cards in their graveyards.
this.addAbility(new AsEntersBattlefieldAbility(new NamelessRaceEffect()));
-
+
// Nameless Race's power and toughness are each equal to the life paid as it entered the battlefield.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new InfoEffect("{this}'s power and toughness are each equal to the life paid as it entered the battlefield")));
}
@@ -64,13 +58,13 @@ public final class NamelessRace extends CardImpl {
}
class NamelessRaceEffect extends OneShotEffect {
-
+
private static final FilterPermanent filter = new FilterPermanent("white nontoken permanents your opponents control");
private static final FilterCard filter2 = new FilterCard("white cards in their graveyards");
-
+
static {
filter.add(new ColorPredicate(ObjectColor.WHITE));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
filter.add(new ControllerPredicate(TargetController.OPPONENT));
filter2.add(new ColorPredicate(ObjectColor.WHITE));
filter2.add(new OwnerPredicate(TargetController.OPPONENT));
@@ -94,13 +88,13 @@ class NamelessRaceEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- Card sourceCard = game.getCard(source.getSourceId());
int permanentsInPlay = new PermanentsOnBattlefieldCount(filter).calculate(game, source, null);
int cardsInGraveyards = new CardsInAllGraveyardsCount(filter2).calculate(game, source, null);
int maxAmount = Math.min(permanentsInPlay + cardsInGraveyards, controller.getLife());
int payAmount = controller.getAmount(0, maxAmount, "Pay up to " + maxAmount + " life", game);
controller.loseLife(payAmount, game, false);
- game.informPlayers(sourceCard.getLogName() + ": " + controller.getLogName() +
+ Card sourceCard = game.getCard(source.getSourceId());
+ game.informPlayers((sourceCard != null ? sourceCard.getLogName() : "") + ": " + controller.getLogName() +
" pays " + payAmount + " life");
game.addEffect(new SetPowerToughnessSourceEffect(payAmount, payAmount, Duration.Custom, SubLayer.SetPT_7b), source);
return true;
diff --git a/Mage.Sets/src/mage/cards/n/NantukoShaman.java b/Mage.Sets/src/mage/cards/n/NantukoShaman.java
index b17eaccb4bd..ad62796b096 100644
--- a/Mage.Sets/src/mage/cards/n/NantukoShaman.java
+++ b/Mage.Sets/src/mage/cards/n/NantukoShaman.java
@@ -26,7 +26,7 @@ public final class NantukoShaman extends CardImpl {
private static final FilterLandPermanent filter = new FilterLandPermanent();
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public NantukoShaman(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NaturesChosen.java b/Mage.Sets/src/mage/cards/n/NaturesChosen.java
index 9cb96ea8a30..6fb1055bef0 100644
--- a/Mage.Sets/src/mage/cards/n/NaturesChosen.java
+++ b/Mage.Sets/src/mage/cards/n/NaturesChosen.java
@@ -49,7 +49,7 @@ public final class NaturesChosen extends CardImpl {
static {
filterWhiteUntappedCreature.add(new ColorPredicate(ObjectColor.WHITE));
- filterWhiteUntappedCreature.add(Predicates.not(new TappedPredicate()));
+ filterWhiteUntappedCreature.add(Predicates.not(TappedPredicate.instance));
}
public NaturesChosen(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NayaHushblade.java b/Mage.Sets/src/mage/cards/n/NayaHushblade.java
index 45c7ecb36e7..343d71f445d 100644
--- a/Mage.Sets/src/mage/cards/n/NayaHushblade.java
+++ b/Mage.Sets/src/mage/cards/n/NayaHushblade.java
@@ -29,8 +29,8 @@ public final class NayaHushblade extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another multicolor permanent");
static {
- filter.add(new MulticoloredPredicate());
- filter.add(new AnotherPredicate());
+ filter.add(MulticoloredPredicate.instance);
+ filter.add(AnotherPredicate.instance);
}
public NayaHushblade(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NazahnReveredBladesmith.java b/Mage.Sets/src/mage/cards/n/NazahnReveredBladesmith.java
index 2c3bf2f8f77..bd4511146b4 100644
--- a/Mage.Sets/src/mage/cards/n/NazahnReveredBladesmith.java
+++ b/Mage.Sets/src/mage/cards/n/NazahnReveredBladesmith.java
@@ -26,11 +26,11 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import java.util.UUID;
/**
- *
* @author spjspj
*/
public final class NazahnReveredBladesmith extends CardImpl {
@@ -38,7 +38,7 @@ public final class NazahnReveredBladesmith extends CardImpl {
private static final FilterControlledCreaturePermanent equippedFilter = new FilterControlledCreaturePermanent("equipped creature you control");
static {
- equippedFilter.add(new EquippedPredicate());
+ equippedFilter.add(EquippedPredicate.instance);
equippedFilter.add(new ControllerPredicate(TargetController.YOU));
}
@@ -65,25 +65,10 @@ public final class NazahnReveredBladesmith extends CardImpl {
// Whenever an equipped creature you control attacks, you may tap target creature defending player controls.
Ability ability = new AttacksCreatureYouControlTriggeredAbility(new NazahnTapEffect(), true, equippedFilter, true);
ability.addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature defending player controls")));
+ ability.setTargetAdjuster(NazahnReveredBladesmithAdjuster.instance);
this.addAbility(ability);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof AttacksCreatureYouControlTriggeredAbility) {
- FilterCreaturePermanent filterDefender = new FilterCreaturePermanent("creature defending player controls");
- for (Effect effect : ability.getEffects()) {
- if (effect instanceof NazahnTapEffect) {
- filterDefender.add(new ControllerIdPredicate(game.getCombat().getDefendingPlayerId(effect.getTargetPointer().getFirst(game, ability), game)));
- break;
- }
- }
- ability.getTargets().clear();
- TargetCreaturePermanent target = new TargetCreaturePermanent(filterDefender);
- ability.addTarget(target);
- }
- }
-
public NazahnReveredBladesmith(final NazahnReveredBladesmith card) {
super(card);
}
@@ -94,6 +79,24 @@ public final class NazahnReveredBladesmith extends CardImpl {
}
}
+enum NazahnReveredBladesmithAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ FilterCreaturePermanent filterDefender = new FilterCreaturePermanent("creature defending player controls");
+ for (Effect effect : ability.getEffects()) {
+ if (effect instanceof NazahnTapEffect) {
+ filterDefender.add(new ControllerIdPredicate(game.getCombat().getDefendingPlayerId(effect.getTargetPointer().getFirst(game, ability), game)));
+ break;
+ }
+ }
+ ability.getTargets().clear();
+ TargetCreaturePermanent target = new TargetCreaturePermanent(filterDefender);
+ ability.addTarget(target);
+ }
+}
+
class NazahnTapEffect extends TapTargetEffect {
NazahnTapEffect() {
diff --git a/Mage.Sets/src/mage/cards/n/NebulonBFrigate.java b/Mage.Sets/src/mage/cards/n/NebulonBFrigate.java
index 2d318c7129f..ba7c2cf73d8 100644
--- a/Mage.Sets/src/mage/cards/n/NebulonBFrigate.java
+++ b/Mage.Sets/src/mage/cards/n/NebulonBFrigate.java
@@ -25,7 +25,7 @@ public final class NebulonBFrigate extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public NebulonBFrigate(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/Necrologia.java b/Mage.Sets/src/mage/cards/n/Necrologia.java
index 1d35c3bebab..d1c3dc8a265 100644
--- a/Mage.Sets/src/mage/cards/n/Necrologia.java
+++ b/Mage.Sets/src/mage/cards/n/Necrologia.java
@@ -29,7 +29,7 @@ public final class Necrologia extends CardImpl {
this.getSpellAbility().addCost(new PayVariableLifeCost(true));
// Draw X cards.
- this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(new GetXValue()));
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(GetXValue.instance));
}
public Necrologia(final Necrologia card) {
diff --git a/Mage.Sets/src/mage/cards/n/NecromancersMagemark.java b/Mage.Sets/src/mage/cards/n/NecromancersMagemark.java
index 168c633cb71..c80c8ff70a7 100644
--- a/Mage.Sets/src/mage/cards/n/NecromancersMagemark.java
+++ b/Mage.Sets/src/mage/cards/n/NecromancersMagemark.java
@@ -36,7 +36,7 @@ public final class NecromancersMagemark extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures you control that are enchanted");
static {
- filter.add(new EnchantedPredicate());
+ filter.add(EnchantedPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/n/NecropolisFiend.java b/Mage.Sets/src/mage/cards/n/NecropolisFiend.java
index a4219545b3a..e1b5a829d9b 100644
--- a/Mage.Sets/src/mage/cards/n/NecropolisFiend.java
+++ b/Mage.Sets/src/mage/cards/n/NecropolisFiend.java
@@ -1,11 +1,11 @@
package mage.cards.n;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.Cost;
+import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.VariableCost;
import mage.abilities.costs.common.ExileFromGraveCost;
import mage.abilities.costs.common.TapSourceCost;
@@ -21,8 +21,8 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.game.Game;
@@ -30,15 +30,17 @@ import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class NecropolisFiend extends CardImpl {
public NecropolisFiend(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{7}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{7}{B}{B}");
this.subtype.add(SubType.DEMON);
this.power = new MageInt(4);
@@ -46,54 +48,29 @@ public final class NecropolisFiend extends CardImpl {
// Delve
this.addAbility(new DelveAbility());
+
// Flying
this.addAbility(FlyingAbility.getInstance());
- //TODO: Make ability properly copiable
+
// {X}, {T}, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn.
- DynamicValue xValue = new SignInversionDynamicValue(new ManacostVariableValue());
- Effect effect = new BoostTargetEffect(xValue,xValue,Duration.EndOfTurn);
+ DynamicValue xValue = new SignInversionDynamicValue(ManacostVariableValue.instance);
+ Effect effect = new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn);
effect.setText("Target creature gets -X/-X until end of turn");
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{X}"));
+ Ability ability = new SimpleActivatedAbility(
+ Zone.BATTLEFIELD, effect,
+ new ManaCostsImpl("{X}")
+ );
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent());
- ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(1,1,new FilterCard("cards from your graveyard")), "Exile X cards from your graveyard"));
+ ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(
+ 1, 1, new FilterCard("cards from your graveyard")
+ ), "Exile X cards from your graveyard"));
+ ability.setTargetAdjuster(NecropolisFiendTargetAdjuster.instance);
+ ability.setCostAdjuster(NecropolisFiendCostAdjuster.instance);
this.addAbility(ability);
}
- @Override
- public void adjustCosts(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
- Player controller = game.getPlayer(ability.getControllerId());
- if (controller != null) {
- for (VariableCost variableCost: ability.getManaCostsToPay().getVariableCosts()) {
- if (variableCost instanceof VariableManaCost) {
- ((VariableManaCost)variableCost).setMaxX(controller.getGraveyard().size());
- }
- }
- }
- }
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SimpleActivatedAbility) {
- int xValue = ability.getManaCostsToPay().getX();
- for(Cost cost: ability.getCosts()) {
- if (cost instanceof ExileFromGraveCost) {
- ExileFromGraveCost exileCost = (ExileFromGraveCost) cost;
- for(Target target: exileCost.getTargets()) {
- if (target instanceof TargetCardInYourGraveyard) {
- target.setMaxNumberOfTargets(xValue);
- target.setMinNumberOfTargets(xValue);
- }
- }
-
- }
- }
- }
- }
-
public NecropolisFiend(final NecropolisFiend card) {
super(card);
}
@@ -103,3 +80,41 @@ public final class NecropolisFiend extends CardImpl {
return new NecropolisFiend(this);
}
}
+
+enum NecropolisFiendCostAdjuster implements CostAdjuster {
+ instance;
+
+ @Override
+ public void adjustCosts(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller == null) {
+ return;
+ }
+ for (VariableCost variableCost : ability.getManaCostsToPay().getVariableCosts()) {
+ if (variableCost instanceof VariableManaCost) {
+ ((VariableManaCost) variableCost).setMaxX(controller.getGraveyard().size());
+ }
+ }
+ }
+}
+
+enum NecropolisFiendTargetAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int xValue = ability.getManaCostsToPay().getX();
+ for (Cost cost : ability.getCosts()) {
+ if (!(cost instanceof ExileFromGraveCost)) {
+ continue;
+ }
+ ExileFromGraveCost exileCost = (ExileFromGraveCost) cost;
+ for (Target target : exileCost.getTargets()) {
+ if (target instanceof TargetCardInYourGraveyard) {
+ target.setMaxNumberOfTargets(xValue);
+ target.setMinNumberOfTargets(xValue);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/n/NecroticPlague.java b/Mage.Sets/src/mage/cards/n/NecroticPlague.java
index 00d17e62134..5bc9c3137a6 100644
--- a/Mage.Sets/src/mage/cards/n/NecroticPlague.java
+++ b/Mage.Sets/src/mage/cards/n/NecroticPlague.java
@@ -1,7 +1,6 @@
package mage.cards.n;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DiesAttachedTriggeredAbility;
@@ -15,35 +14,24 @@ import mage.abilities.keyword.EnchantAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.TargetController;
-import mage.constants.Zone;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetOpponentsCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author BetaSteward_at_googlemail.com
*/
public final class NecroticPlague extends CardImpl {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
-
- static {
- filter.add(new ControllerPredicate(TargetController.OPPONENT));
- }
-
public NecroticPlague(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}");
this.subtype.add(SubType.AURA);
@@ -53,33 +41,18 @@ public final class NecroticPlague extends CardImpl {
this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
Ability ability = new EnchantAbility(auraTarget.getTargetName());
this.addAbility(ability);
+
// Enchanted creature has "At the beginning of your upkeep, sacrifice this creature."
// When enchanted creature dies, its controller chooses target creature one of their opponents controls. Return Necrotic Plague from its owner's graveyard to the battlefield attached to that creature.
- Ability gainedAbility = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect(), TargetController.YOU, false);
- Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield);
+ ability = new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect(), TargetController.YOU, false);
+ Effect effect = new GainAbilityAttachedEffect(ability, AttachmentType.AURA, Duration.WhileOnBattlefield);
effect.setText("Enchanted creature has \"At the beginning of your upkeep, sacrifice this creature.\"");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
- this.addAbility(new DiesAttachedTriggeredAbility(new NecroticPlagueEffect(), "enchanted creature", false));
- }
+ ability = new DiesAttachedTriggeredAbility(new NecroticPlagueEffect(), "enchanted creature", false);
+ ability.setTargetAdjuster(NecroticPlagueAdjuster.instance);
+ this.addAbility(ability);
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof DiesAttachedTriggeredAbility) {
- Permanent attachedTo = null;
- for (Effect effect : ability.getEffects()) {
- attachedTo = (Permanent) effect.getValue("attachedTo");
- }
- if (attachedTo != null) {
- Player creatureController = game.getPlayer(attachedTo.getControllerId());
- if (creatureController != null) {
- ability.setControllerId(creatureController.getId());
- ability.getTargets().clear();
- TargetPermanent target = new TargetPermanent(filter);
- ability.getTargets().add(target);
- }
- }
- }
}
public NecroticPlague(final NecroticPlague card) {
@@ -93,11 +66,35 @@ public final class NecroticPlague extends CardImpl {
}
+enum NecroticPlagueAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Permanent attachedTo = null;
+ for (Effect effect : ability.getEffects()) {
+ attachedTo = (Permanent) effect.getValue("attachedTo");
+ }
+ if (attachedTo == null) {
+ return;
+ }
+ Player creatureController = game.getPlayer(attachedTo.getControllerId());
+ if (creatureController == null) {
+ return;
+ }
+ ability.setControllerId(creatureController.getId());
+ ability.getTargets().clear();
+ TargetPermanent target = new TargetOpponentsCreaturePermanent();
+ ability.getTargets().add(target);
+ }
+}
+
class NecroticPlagueEffect extends OneShotEffect {
public NecroticPlagueEffect() {
super(Outcome.PutCardInPlay);
- staticText = "its controller chooses target creature one of their opponents controls. Return {this} from its owner's graveyard to the battlefield attached to that creature";
+ staticText = "its controller chooses target creature one of their opponents controls. " +
+ "Return {this} from its owner's graveyard to the battlefield attached to that creature";
}
public NecroticPlagueEffect(final NecroticPlagueEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/n/NeedleDrop.java b/Mage.Sets/src/mage/cards/n/NeedleDrop.java
index 2b299e4f35a..63a5b8535d6 100644
--- a/Mage.Sets/src/mage/cards/n/NeedleDrop.java
+++ b/Mage.Sets/src/mage/cards/n/NeedleDrop.java
@@ -58,7 +58,7 @@ class DamagedThisTurnPredicate implements Predicate {
@Override
public boolean apply(MageItem input, Game game) {
- DamageDoneWatcher watcher = (DamageDoneWatcher) game.getState().getWatchers().get(DamageDoneWatcher.class.getSimpleName());
+ DamageDoneWatcher watcher = game.getState().getWatcher(DamageDoneWatcher.class);
if (watcher != null) {
if (input instanceof MageObject) {
return watcher.isDamaged(input.getId(), ((MageObject) input).getZoneChangeCounter(game), game);
diff --git a/Mage.Sets/src/mage/cards/n/NeedlebiteTrap.java b/Mage.Sets/src/mage/cards/n/NeedlebiteTrap.java
index bfa69afdc8c..5a07ec5668b 100644
--- a/Mage.Sets/src/mage/cards/n/NeedlebiteTrap.java
+++ b/Mage.Sets/src/mage/cards/n/NeedlebiteTrap.java
@@ -51,10 +51,10 @@ enum NeedlebiteTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PlayerGainedLifeWatcher watcher = (PlayerGainedLifeWatcher) game.getState().getWatchers().get(PlayerGainedLifeWatcher.class.getSimpleName());
+ PlayerGainedLifeWatcher watcher = game.getState().getWatcher(PlayerGainedLifeWatcher.class);
if (watcher != null) {
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
- if (watcher.getLiveGained(opponentId) > 0) {
+ if (watcher.getLifeGained(opponentId) > 0) {
return true;
}
}
diff --git a/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java b/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java
index ef22b710b6f..0cab56e3fe8 100644
--- a/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java
+++ b/Mage.Sets/src/mage/cards/n/NemesisOfMortals.java
@@ -1,7 +1,6 @@
package mage.cards.n;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
@@ -11,19 +10,16 @@ import mage.abilities.effects.common.cost.SourceCostReductionForEachCardInGravey
import mage.abilities.keyword.MonstrosityAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.CostModificationType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class NemesisOfMortals extends CardImpl {
@@ -41,6 +37,7 @@ public final class NemesisOfMortals extends CardImpl {
this.addAbility(ability);
// {7}{G}{G}: Monstrosity 5. This ability costs {1} less to activate for each creature card in your graveyard.
+ // TODO: Make ability properly copiable
ability = new MonstrosityAbility("{7}{G}{G}", 5);
for (Effect effect : ability.getEffects()) {
effect.setText("Monstrosity 5. This ability costs {1} less to activate for each creature card in your graveyard");
@@ -49,7 +46,7 @@ public final class NemesisOfMortals extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.ALL, new NemesisOfMortalsCostReducingEffect(ability.getOriginalId())));
}
- public NemesisOfMortals(final NemesisOfMortals card) {
+ private NemesisOfMortals(final NemesisOfMortals card) {
super(card);
}
@@ -68,7 +65,7 @@ class NemesisOfMortalsCostReducingEffect extends CostModificationEffectImpl {
this.originalId = originalId;
}
- NemesisOfMortalsCostReducingEffect(final NemesisOfMortalsCostReducingEffect effect) {
+ private NemesisOfMortalsCostReducingEffect(final NemesisOfMortalsCostReducingEffect effect) {
super(effect);
this.originalId = effect.originalId;
}
@@ -77,7 +74,7 @@ class NemesisOfMortalsCostReducingEffect extends CostModificationEffectImpl {
public boolean apply(Game game, Ability source, Ability abilityToModify) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- CardUtil.reduceCost(abilityToModify, controller.getGraveyard().getCards(new FilterCreatureCard(), game).size());
+ CardUtil.reduceCost(abilityToModify, controller.getGraveyard().count(StaticFilters.FILTER_CARD_CREATURE, game));
}
return true;
}
diff --git a/Mage.Sets/src/mage/cards/n/NemesisTrap.java b/Mage.Sets/src/mage/cards/n/NemesisTrap.java
index 003fa1cb475..39512496787 100644
--- a/Mage.Sets/src/mage/cards/n/NemesisTrap.java
+++ b/Mage.Sets/src/mage/cards/n/NemesisTrap.java
@@ -36,7 +36,7 @@ public final class NemesisTrap extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.WHITE));
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public NemesisTrap(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NephaliaSmuggler.java b/Mage.Sets/src/mage/cards/n/NephaliaSmuggler.java
index 5a69454d633..04135db5baf 100644
--- a/Mage.Sets/src/mage/cards/n/NephaliaSmuggler.java
+++ b/Mage.Sets/src/mage/cards/n/NephaliaSmuggler.java
@@ -25,7 +25,7 @@ public final class NephaliaSmuggler extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another target creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public NephaliaSmuggler(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NessianWildsRavager.java b/Mage.Sets/src/mage/cards/n/NessianWildsRavager.java
index 3cb5b250f23..1d5e7026cb2 100644
--- a/Mage.Sets/src/mage/cards/n/NessianWildsRavager.java
+++ b/Mage.Sets/src/mage/cards/n/NessianWildsRavager.java
@@ -25,7 +25,7 @@ public final class NessianWildsRavager extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public NessianWildsRavager(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NettleDrone.java b/Mage.Sets/src/mage/cards/n/NettleDrone.java
index da8ddeef7c8..e565226ee20 100644
--- a/Mage.Sets/src/mage/cards/n/NettleDrone.java
+++ b/Mage.Sets/src/mage/cards/n/NettleDrone.java
@@ -27,7 +27,7 @@ public final class NettleDrone extends CardImpl {
private static final FilterSpell filterSpell = new FilterSpell("a colorless spell");
static {
- filterSpell.add(new ColorlessPredicate());
+ filterSpell.add(ColorlessPredicate.instance);
}
public NettleDrone(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NeutralizingBlast.java b/Mage.Sets/src/mage/cards/n/NeutralizingBlast.java
index 39a9864fc7e..f4eeb349855 100644
--- a/Mage.Sets/src/mage/cards/n/NeutralizingBlast.java
+++ b/Mage.Sets/src/mage/cards/n/NeutralizingBlast.java
@@ -18,7 +18,7 @@ public final class NeutralizingBlast extends CardImpl {
private static final FilterSpell filter = new FilterSpell("multicolored spell");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public NeutralizingBlast(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NeverReturn.java b/Mage.Sets/src/mage/cards/n/NeverReturn.java
index 8318ab0b607..60500ee835f 100644
--- a/Mage.Sets/src/mage/cards/n/NeverReturn.java
+++ b/Mage.Sets/src/mage/cards/n/NeverReturn.java
@@ -31,7 +31,7 @@ public final class NeverReturn extends SplitCard {
// Return
// Exile target card from a graveyard. Create a 2/2 black Zombie creature token.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect());
getRightHalfCard().getSpellAbility().addTarget(new TargetCardInGraveyard());
getRightHalfCard().getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken()));
diff --git a/Mage.Sets/src/mage/cards/n/NewBlood.java b/Mage.Sets/src/mage/cards/n/NewBlood.java
index b4b1ee8437a..4361a19ef0d 100644
--- a/Mage.Sets/src/mage/cards/n/NewBlood.java
+++ b/Mage.Sets/src/mage/cards/n/NewBlood.java
@@ -39,7 +39,7 @@ public final class NewBlood extends CardImpl {
TextPartSubType textPartVampire = (TextPartSubType) addTextPart(new TextPartSubType(SubType.VAMPIRE));
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped Vampire you control");
filter.add(new TextPartSubtypePredicate(textPartVampire));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
// As an additional cost to cast New Blood, tap an untapped Vampire you control.
this.getSpellAbility().addCost(new TapTargetCost(
new TargetControlledCreaturePermanent(1, 1, filter, true)));
diff --git a/Mage.Sets/src/mage/cards/n/NiblisOfFrost.java b/Mage.Sets/src/mage/cards/n/NiblisOfFrost.java
index aafd4aeadf1..a0d0d6b82d8 100644
--- a/Mage.Sets/src/mage/cards/n/NiblisOfFrost.java
+++ b/Mage.Sets/src/mage/cards/n/NiblisOfFrost.java
@@ -1,7 +1,5 @@
-
package mage.cards.n;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
@@ -19,8 +17,9 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class NiblisOfFrost extends CardImpl {
@@ -31,7 +30,7 @@ public final class NiblisOfFrost extends CardImpl {
}
public NiblisOfFrost(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{U}");
this.subtype.add(SubType.SPIRIT);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
@@ -43,7 +42,7 @@ public final class NiblisOfFrost extends CardImpl {
this.addAbility(new ProwessAbility());
// Whenever you cast an instant or sorcery spell, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step.
- Ability ability = new SpellCastControllerTriggeredAbility(new TapTargetEffect(), StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY, false);
+ Ability ability = new SpellCastControllerTriggeredAbility(new TapTargetEffect(), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false);
ability.addTarget(new TargetCreaturePermanent(filterCreature));
ability.addEffect(new DontUntapInControllersNextUntapStepTargetEffect("That creature"));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/n/Nightcreep.java b/Mage.Sets/src/mage/cards/n/Nightcreep.java
index 13e51cd7b0a..45cde1263cb 100644
--- a/Mage.Sets/src/mage/cards/n/Nightcreep.java
+++ b/Mage.Sets/src/mage/cards/n/Nightcreep.java
@@ -59,11 +59,6 @@ class NightcreepLandEffect extends BecomesBasicLandTargetEffect {
this.setTargetPointer(new FixedTargets(targets, game));
}
- @Override
- public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- return super.apply(layer, sublayer, source, game);
- }
-
@Override
public NightcreepLandEffect copy() {
return new NightcreepLandEffect(this);
@@ -88,11 +83,6 @@ class NightcreepCreatureEffect extends BecomesColorTargetEffect {
this.setTargetPointer(new FixedTargets(targets, game));
}
- @Override
- public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- return super.apply(layer, sublayer, source, game);
- }
-
@Override
public NightcreepCreatureEffect copy() {
return new NightcreepCreatureEffect(this);
diff --git a/Mage.Sets/src/mage/cards/n/NightmarishEnd.java b/Mage.Sets/src/mage/cards/n/NightmarishEnd.java
index ccf1c13d351..c597bc8f7a2 100644
--- a/Mage.Sets/src/mage/cards/n/NightmarishEnd.java
+++ b/Mage.Sets/src/mage/cards/n/NightmarishEnd.java
@@ -24,7 +24,7 @@ public final class NightmarishEnd extends CardImpl {
// Target creature gets -X/-X until end of turn, where X is the number of cards in your hand.
- DynamicValue xValue = new SignInversionDynamicValue(new CardsInControllerHandCount());
+ DynamicValue xValue = new SignInversionDynamicValue(CardsInControllerHandCount.instance);
Effect effect = new BoostTargetEffect(xValue, xValue, Duration.EndOfTurn, true);
effect.setText("Target creature gets -X/-X until end of turn, where X is the number of cards in your hand");
this.getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/n/Nightsnare.java b/Mage.Sets/src/mage/cards/n/Nightsnare.java
index 7a4517db4ae..c189b8eedc1 100644
--- a/Mage.Sets/src/mage/cards/n/Nightsnare.java
+++ b/Mage.Sets/src/mage/cards/n/Nightsnare.java
@@ -1,14 +1,8 @@
-
package mage.cards.n;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
+import mage.cards.*;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
@@ -18,14 +12,15 @@ import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetOpponent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class Nightsnare extends CardImpl {
public Nightsnare(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}");
// Target opponent reveals their hand. You may choose a nonland card from it. If you do, that player discards that card. If you don't, that player discards two cards.
this.getSpellAbility().addTarget(new TargetOpponent());
@@ -57,11 +52,11 @@ class NightsnareDiscardEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
- Card sourceCard = game.getCard(source.getSourceId());
if (player != null && controller != null) {
if (!player.getHand().isEmpty()) {
Cards revealedCards = new CardsImpl();
revealedCards.addAll(player.getHand());
+ Card sourceCard = game.getCard(source.getSourceId());
player.revealCards(sourceCard != null ? sourceCard.getIdName() : "Discard", revealedCards, game);
// You may choose a nonland card from it.
if (controller.chooseUse(outcome, "Choose a a card to discard? (Otherwise " + player.getLogName() + " has to discard 2 cards).", source, game)) {
diff --git a/Mage.Sets/src/mage/cards/n/NikyaOfTheOldWays.java b/Mage.Sets/src/mage/cards/n/NikyaOfTheOldWays.java
new file mode 100644
index 00000000000..cdb990392d6
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/n/NikyaOfTheOldWays.java
@@ -0,0 +1,88 @@
+package mage.cards.n;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.common.TapForManaAllTriggeredManaAbility;
+import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
+import mage.abilities.effects.mana.AddManaOfAnyTypeProducedEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class NikyaOfTheOldWays extends CardImpl {
+
+ public NikyaOfTheOldWays(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{G}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.CENTAUR);
+ this.subtype.add(SubType.DRUID);
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // You can't cast noncreature spells.
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD, new NikyaOfTheOldWaysCantCastEffect()
+ ));
+
+ // Whenever you tap a land for mana, add one mana of any type that land produced.
+ AddManaOfAnyTypeProducedEffect effect = new AddManaOfAnyTypeProducedEffect();
+ effect.setText("add one mana of any type that land produced");
+ this.addAbility(new TapForManaAllTriggeredManaAbility(
+ effect,
+ new FilterControlledLandPermanent("you tap a land"),
+ SetTargetPointer.PERMANENT)
+ );
+ }
+
+ private NikyaOfTheOldWays(final NikyaOfTheOldWays card) {
+ super(card);
+ }
+
+ @Override
+ public NikyaOfTheOldWays copy() {
+ return new NikyaOfTheOldWays(this);
+ }
+}
+
+class NikyaOfTheOldWaysCantCastEffect extends ContinuousRuleModifyingEffectImpl {
+
+ NikyaOfTheOldWaysCantCastEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
+ staticText = "You can't cast noncreature spells";
+ }
+
+ private NikyaOfTheOldWaysCantCastEffect(final NikyaOfTheOldWaysCantCastEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public NikyaOfTheOldWaysCantCastEffect copy() {
+ return new NikyaOfTheOldWaysCantCastEffect(this);
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.CAST_SPELL;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ if (event.getPlayerId().equals(source.getControllerId())) {
+ Card card = game.getCard(event.getSourceId());
+ return card != null && !card.isCreature();
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/n/NinthBridgePatrol.java b/Mage.Sets/src/mage/cards/n/NinthBridgePatrol.java
index ebbcfc3ca77..1ba7fd421b9 100644
--- a/Mage.Sets/src/mage/cards/n/NinthBridgePatrol.java
+++ b/Mage.Sets/src/mage/cards/n/NinthBridgePatrol.java
@@ -26,7 +26,7 @@ public final class NinthBridgePatrol extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public NinthBridgePatrol(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NoContest.java b/Mage.Sets/src/mage/cards/n/NoContest.java
index 1298ece8083..5a2f1421277 100644
--- a/Mage.Sets/src/mage/cards/n/NoContest.java
+++ b/Mage.Sets/src/mage/cards/n/NoContest.java
@@ -1,8 +1,5 @@
-
package mage.cards.n;
-import java.util.Set;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.common.FightTargetsEffect;
import mage.cards.Card;
@@ -19,6 +16,9 @@ import mage.game.stack.Spell;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.Set;
+import java.util.UUID;
+
/**
* @author Styxo
*/
@@ -56,8 +56,11 @@ class TargetCreatureWithLessPowerPermanent extends TargetPermanent {
@Override
public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
- int maxPower = Integer.MIN_VALUE; // get the most poerful controlled creature that can be targeted
+ int maxPower = Integer.MIN_VALUE; // get the most powerful controlled creature that can be targeted
Card sourceCard = game.getCard(sourceId);
+ if (sourceCard == null) {
+ return false;
+ }
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURES, sourceControllerId, game)) {
if (permanent.getPower().getValue() > maxPower && permanent.canBeTargetedBy(sourceCard, sourceControllerId, game)) {
maxPower = permanent.getPower().getValue();
diff --git a/Mage.Sets/src/mage/cards/n/NoRestForTheWicked.java b/Mage.Sets/src/mage/cards/n/NoRestForTheWicked.java
index 063f4958cbd..b07ceb984fc 100644
--- a/Mage.Sets/src/mage/cards/n/NoRestForTheWicked.java
+++ b/Mage.Sets/src/mage/cards/n/NoRestForTheWicked.java
@@ -58,7 +58,7 @@ class NoRestForTheWickedEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- NoRestForTheWickedWatcher watcher = (NoRestForTheWickedWatcher) game.getState().getWatchers().get(NoRestForTheWickedWatcher.class.getSimpleName());
+ NoRestForTheWickedWatcher watcher = game.getState().getWatcher(NoRestForTheWickedWatcher.class);
Player controller = game.getPlayer(source.getControllerId());
if (watcher != null && controller != null) {
Cards cardsToHand = new CardsImpl();
@@ -90,7 +90,7 @@ class NoRestForTheWickedWatcher extends Watcher {
List cards;
public NoRestForTheWickedWatcher() {
- super(NoRestForTheWickedWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(NoRestForTheWickedWatcher.class, WatcherScope.GAME);
this.cards = new ArrayList<>();
}
diff --git a/Mage.Sets/src/mage/cards/n/NobleStand.java b/Mage.Sets/src/mage/cards/n/NobleStand.java
index ed5d96b2024..5d490b14578 100644
--- a/Mage.Sets/src/mage/cards/n/NobleStand.java
+++ b/Mage.Sets/src/mage/cards/n/NobleStand.java
@@ -56,8 +56,8 @@ class NobleStandAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
- filter.add(Predicates.not(new TokenPredicate()));
- Permanent permanent = (Permanent) game.getPermanent(event.getSourceId());
+ filter.add(Predicates.not(TokenPredicate.instance));
+ Permanent permanent = game.getPermanent(event.getSourceId());
return permanent != null && filter.match(permanent, sourceId, controllerId, game);
}
diff --git a/Mage.Sets/src/mage/cards/n/NogginWhack.java b/Mage.Sets/src/mage/cards/n/NogginWhack.java
index 3d5311a9510..5aa88225c42 100644
--- a/Mage.Sets/src/mage/cards/n/NogginWhack.java
+++ b/Mage.Sets/src/mage/cards/n/NogginWhack.java
@@ -96,7 +96,7 @@ class NogginWhackEffect extends OneShotEffect {
if (!revealedCards.isEmpty()) {
targetPlayer.revealCards("Noggin Whack", revealedCards, game);
controller.chooseTarget(Outcome.Exile, revealedCards, targetInHand, source, game);
- for (UUID cardId : (List) targetInHand.getTargets()) {
+ for (UUID cardId : targetInHand.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
controller.discard(card, source, game);
diff --git a/Mage.Sets/src/mage/cards/n/NostalgicDreams.java b/Mage.Sets/src/mage/cards/n/NostalgicDreams.java
index b0de519a184..a9d8eec1aef 100644
--- a/Mage.Sets/src/mage/cards/n/NostalgicDreams.java
+++ b/Mage.Sets/src/mage/cards/n/NostalgicDreams.java
@@ -1,9 +1,7 @@
package mage.cards.n;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.costs.common.DiscardXTargetCost;
import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.Effect;
@@ -15,11 +13,12 @@ import mage.constants.CardType;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.game.Game;
-import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class NostalgicDreams extends CardImpl {
@@ -33,27 +32,31 @@ public final class NostalgicDreams extends CardImpl {
Effect effect = new ReturnFromGraveyardToHandTargetEffect();
effect.setText("Return X target cards from your graveyard to your hand");
this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().setTargetAdjuster(NostalgicDreamsAdjuster.instance);
+
// Exile Nostalgic Dreams.
this.getSpellAbility().addEffect(ExileSpellEffect.getInstance());
-
}
public NostalgicDreams(final NostalgicDreams card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- int xValue = new GetXValue().calculate(game, ability, null);
- Target target = new TargetCardInYourGraveyard(xValue, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD);
- ability.addTarget(target);
- }
-
- }
-
@Override
public NostalgicDreams copy() {
return new NostalgicDreams(this);
}
}
+
+enum NostalgicDreamsAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCardInYourGraveyard(
+ GetXValue.instance.calculate(game, ability, null),
+ StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD
+ ));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/n/NosyGoblin.java b/Mage.Sets/src/mage/cards/n/NosyGoblin.java
index d0bf2f67eb9..369af08b43e 100644
--- a/Mage.Sets/src/mage/cards/n/NosyGoblin.java
+++ b/Mage.Sets/src/mage/cards/n/NosyGoblin.java
@@ -26,7 +26,7 @@ public final class NosyGoblin extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("face down creature");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
}
public NosyGoblin(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NotionThief.java b/Mage.Sets/src/mage/cards/n/NotionThief.java
index 9ff6a3977a7..75626aeb1ac 100644
--- a/Mage.Sets/src/mage/cards/n/NotionThief.java
+++ b/Mage.Sets/src/mage/cards/n/NotionThief.java
@@ -90,7 +90,7 @@ class NotionThiefReplacementEffect extends ReplacementEffectImpl {
public boolean applies(GameEvent event, Ability source, Game game) {
if (game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) {
if (game.isActivePlayer(event.getPlayerId()) && game.getStep().getType() == PhaseStep.DRAW) {
- CardsDrawnDuringDrawStepWatcher watcher = (CardsDrawnDuringDrawStepWatcher) game.getState().getWatchers().get(CardsDrawnDuringDrawStepWatcher.class.getSimpleName());
+ CardsDrawnDuringDrawStepWatcher watcher = game.getState().getWatcher(CardsDrawnDuringDrawStepWatcher.class);
if (watcher != null && watcher.getAmountCardsDrawn(event.getPlayerId()) > 0) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/n/NotoriousThrong.java b/Mage.Sets/src/mage/cards/n/NotoriousThrong.java
index 8663f38d83c..cb553b3b774 100644
--- a/Mage.Sets/src/mage/cards/n/NotoriousThrong.java
+++ b/Mage.Sets/src/mage/cards/n/NotoriousThrong.java
@@ -70,7 +70,7 @@ class NotoriousThrongEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- AmountOfDamageAPlayerReceivedThisTurnWatcher watcher = (AmountOfDamageAPlayerReceivedThisTurnWatcher) game.getState().getWatchers().get(AmountOfDamageAPlayerReceivedThisTurnWatcher.class.getSimpleName());
+ AmountOfDamageAPlayerReceivedThisTurnWatcher watcher = game.getState().getWatcher(AmountOfDamageAPlayerReceivedThisTurnWatcher.class);
if(controller != null && watcher != null) {
int numTokens = 0;
for(UUID opponentId: game.getOpponents(controller.getId())) {
diff --git a/Mage.Sets/src/mage/cards/n/NourishingShoal.java b/Mage.Sets/src/mage/cards/n/NourishingShoal.java
index f6459c10858..aa39d1d90fa 100644
--- a/Mage.Sets/src/mage/cards/n/NourishingShoal.java
+++ b/Mage.Sets/src/mage/cards/n/NourishingShoal.java
@@ -36,7 +36,7 @@ public final class NourishingShoal extends CardImpl {
this.addAbility(new AlternativeCostSourceAbility(new ExileFromHandCost(new TargetCardInHand(filter), true)));
// You gain X life.
- this.getSpellAbility().addEffect(new GainLifeEffect(new ExileFromHandCostCardConvertedMana()));
+ this.getSpellAbility().addEffect(new GainLifeEffect(ExileFromHandCostCardConvertedMana.instance));
}
diff --git a/Mage.Sets/src/mage/cards/n/NovablastWurm.java b/Mage.Sets/src/mage/cards/n/NovablastWurm.java
index b61d7f32c3d..e8c8fc9e02e 100644
--- a/Mage.Sets/src/mage/cards/n/NovablastWurm.java
+++ b/Mage.Sets/src/mage/cards/n/NovablastWurm.java
@@ -22,7 +22,7 @@ public final class NovablastWurm extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("other creatures");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new CardTypePredicate(CardType.CREATURE));
}
diff --git a/Mage.Sets/src/mage/cards/n/NoxiousGearhulk.java b/Mage.Sets/src/mage/cards/n/NoxiousGearhulk.java
index 9314df3c4a0..c41310dc4dd 100644
--- a/Mage.Sets/src/mage/cards/n/NoxiousGearhulk.java
+++ b/Mage.Sets/src/mage/cards/n/NoxiousGearhulk.java
@@ -28,7 +28,7 @@ public final class NoxiousGearhulk extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public NoxiousGearhulk(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NoxiousGhoul.java b/Mage.Sets/src/mage/cards/n/NoxiousGhoul.java
index 6f7d1807571..a7892984442 100644
--- a/Mage.Sets/src/mage/cards/n/NoxiousGhoul.java
+++ b/Mage.Sets/src/mage/cards/n/NoxiousGhoul.java
@@ -1,7 +1,6 @@
package mage.cards.n;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostAllEffect;
@@ -10,42 +9,45 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
-import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.ObjectSourcePlayer;
+import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicates;
-import mage.filter.predicate.mageobject.CardIdPredicate;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public final class NoxiousGhoul extends CardImpl {
- final FilterPermanent filter = new FilterPermanent("Noxious Ghoul or another Zombie");
- final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("non-Zombie");
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
+ private static final FilterPermanent filter2 = new FilterPermanent();
+
+ static {
+ filter.add(new CardTypePredicate(CardType.CREATURE));
+ filter.add(Predicates.not(new SubtypePredicate(SubType.ZOMBIE)));
+ filter2.add(NoxiousGhoulPredicate.instance);
+ }
public NoxiousGhoul(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.subtype.add(SubType.ZOMBIE);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
- filter.add(Predicates.or(
- new CardIdPredicate(this.getId()),
- new SubtypePredicate(SubType.ZOMBIE)));
-
- filter2.add(new CardTypePredicate(CardType.CREATURE));
- filter2.add(Predicates.not(
- new SubtypePredicate(SubType.ZOMBIE)));
-
- final String rule = "Whenever {this} or another Zombie enters the battlefield, all non-Zombie creatures get -1/-1 until end of turn.";
-
// Whenever Noxious Ghoul or another Zombie enters the battlefield, all non-Zombie creatures get -1/-1 until end of turn.
- this.addAbility(new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new BoostAllEffect(-1, -1, Duration.EndOfTurn, filter2, false), filter, false, rule));
+ this.addAbility(new EntersBattlefieldAllTriggeredAbility(
+ new BoostAllEffect(-1, -1, Duration.EndOfTurn, filter, false),
+ filter2, "Whenever {this} or another Zombie enters the battlefield, " +
+ "all non-Zombie creatures get -1/-1 until end of turn."
+ ));
}
public NoxiousGhoul(final NoxiousGhoul card) {
@@ -57,3 +59,13 @@ public final class NoxiousGhoul extends CardImpl {
return new NoxiousGhoul(this);
}
}
+
+enum NoxiousGhoulPredicate implements ObjectSourcePlayerPredicate> {
+ instance;
+
+ @Override
+ public boolean apply(ObjectSourcePlayer input, Game game) {
+ return input.getObject().hasSubtype(SubType.ZOMBIE, game)
+ || input.getObject().getId().equals(input.getSourceId());
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/n/NoxiousGroodion.java b/Mage.Sets/src/mage/cards/n/NoxiousGroodion.java
new file mode 100644
index 00000000000..f9af47f5b8d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/n/NoxiousGroodion.java
@@ -0,0 +1,36 @@
+package mage.cards.n;
+
+import mage.MageInt;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class NoxiousGroodion extends CardImpl {
+
+ public NoxiousGroodion(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
+
+ this.subtype.add(SubType.BEAST);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Deathtouch
+ this.addAbility(DeathtouchAbility.getInstance());
+ }
+
+ private NoxiousGroodion(final NoxiousGroodion card) {
+ super(card);
+ }
+
+ @Override
+ public NoxiousGroodion copy() {
+ return new NoxiousGroodion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/n/NullmageShepherd.java b/Mage.Sets/src/mage/cards/n/NullmageShepherd.java
index 0373a0c16e4..38ed9f9b56d 100644
--- a/Mage.Sets/src/mage/cards/n/NullmageShepherd.java
+++ b/Mage.Sets/src/mage/cards/n/NullmageShepherd.java
@@ -28,7 +28,7 @@ public final class NullmageShepherd extends CardImpl {
private static final FilterControlledCreaturePermanent filterCost = new FilterControlledCreaturePermanent("untapped creatures you control");
static {
- filterCost.add(Predicates.not(new TappedPredicate()));
+ filterCost.add(Predicates.not(TappedPredicate.instance));
}
public NullmageShepherd(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/n/NullstoneGargoyle.java b/Mage.Sets/src/mage/cards/n/NullstoneGargoyle.java
index 35cbeedc1d2..54997e89b69 100644
--- a/Mage.Sets/src/mage/cards/n/NullstoneGargoyle.java
+++ b/Mage.Sets/src/mage/cards/n/NullstoneGargoyle.java
@@ -74,7 +74,7 @@ class NullstoneGargoyleTriggeredAbility extends TriggeredAbilityImpl {
if (spell.isCreature()) {
return false;
}
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName());
+ SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class);
if (watcher != null && watcher.getNumberOfNonCreatureSpells() == 1) {
for (Effect effect : getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
diff --git a/Mage.Sets/src/mage/cards/n/NuteGunray.java b/Mage.Sets/src/mage/cards/n/NuteGunray.java
index aad1a83e17a..bffe968bd27 100644
--- a/Mage.Sets/src/mage/cards/n/NuteGunray.java
+++ b/Mage.Sets/src/mage/cards/n/NuteGunray.java
@@ -34,7 +34,7 @@ public final class NuteGunray extends CardImpl {
private static final FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent("non-token artifact");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public NuteGunray(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OKagachiVengefulKami.java b/Mage.Sets/src/mage/cards/o/OKagachiVengefulKami.java
index b494987c9ea..6333d5a3f35 100644
--- a/Mage.Sets/src/mage/cards/o/OKagachiVengefulKami.java
+++ b/Mage.Sets/src/mage/cards/o/OKagachiVengefulKami.java
@@ -99,7 +99,7 @@ class OKagachiVengefulKamiTriggeredAbility extends TriggeredAbilityImpl {
UUID you = this.getControllerId();
Permanent p = game.getPermanent(event.getSourceId());
if (damageEvent.isCombatDamage() && p != null && p.getId().equals(this.getSourceId())) {
- PlayersAttackedLastTurnWatcher watcher = (PlayersAttackedLastTurnWatcher) game.getState().getWatchers().get(PlayersAttackedLastTurnWatcher.class.getSimpleName());
+ PlayersAttackedLastTurnWatcher watcher = game.getState().getWatcher(PlayersAttackedLastTurnWatcher.class);
if (watcher != null && watcher.attackedLastTurn(damagedPlayerId, you)) {
FilterNonlandPermanent filter = new FilterNonlandPermanent("nonland permanent defending player controls");
filter.add(new ControllerIdPredicate(damagedPlayerId));
diff --git a/Mage.Sets/src/mage/cards/o/OakStreetInnkeeper.java b/Mage.Sets/src/mage/cards/o/OakStreetInnkeeper.java
index bd5dbb0a8b9..a25c0b16166 100644
--- a/Mage.Sets/src/mage/cards/o/OakStreetInnkeeper.java
+++ b/Mage.Sets/src/mage/cards/o/OakStreetInnkeeper.java
@@ -26,7 +26,7 @@ public final class OakStreetInnkeeper extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("tapped creatures you control");
static {
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
}
public OakStreetInnkeeper(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OathOfChandra.java b/Mage.Sets/src/mage/cards/o/OathOfChandra.java
index 4610ca8f5c8..a2a574a5e3d 100644
--- a/Mage.Sets/src/mage/cards/o/OathOfChandra.java
+++ b/Mage.Sets/src/mage/cards/o/OathOfChandra.java
@@ -69,7 +69,7 @@ enum OathOfChandraCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- OathOfChandraWatcher watcher = (OathOfChandraWatcher) game.getState().getWatchers().get(OathOfChandraWatcher.class.getSimpleName());
+ OathOfChandraWatcher watcher = game.getState().getWatcher(OathOfChandraWatcher.class);
return watcher != null && watcher.enteredPlaneswalkerForPlayer(source.getControllerId());
}
@@ -85,7 +85,7 @@ class OathOfChandraWatcher extends Watcher {
private final Set players = new HashSet<>();
public OathOfChandraWatcher() {
- super(OathOfChandraWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(OathOfChandraWatcher.class, WatcherScope.GAME);
}
public OathOfChandraWatcher(final OathOfChandraWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/o/OathOfDruids.java b/Mage.Sets/src/mage/cards/o/OathOfDruids.java
index c8bb0d56eb7..652548ad6f1 100644
--- a/Mage.Sets/src/mage/cards/o/OathOfDruids.java
+++ b/Mage.Sets/src/mage/cards/o/OathOfDruids.java
@@ -1,15 +1,10 @@
package mage.cards.o;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
+import mage.cards.*;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.TargetController;
@@ -21,20 +16,15 @@ import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author Plopman
*/
public final class OathOfDruids extends CardImpl {
- private final UUID originalId;
- private static final FilterPlayer filter = new FilterPlayer();
-
- static {
- filter.add(new OathOfDruidsPredicate());
- }
-
public OathOfDruids(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
@@ -42,27 +32,12 @@ public final class OathOfDruids extends CardImpl {
// The first player may reveal cards from the top of their library until he or she reveals a creature card.
// If he or she does, that player puts that card onto the battlefield and all other cards revealed this way into their graveyard.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new OathOfDruidsEffect(), TargetController.ANY, false);
- ability.addTarget(new TargetPlayer(1, 1, false, filter));
- originalId = ability.getOriginalId();
+ ability.setTargetAdjuster(OathOfDruidsAdjuster.instance);
this.addAbility(ability);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- Player activePlayer = game.getPlayer(game.getActivePlayerId());
- if (activePlayer != null) {
- ability.getTargets().clear();
- TargetPlayer target = new TargetPlayer(1, 1, false, filter);
- target.setTargetController(activePlayer.getId());
- ability.getTargets().add(target);
- }
- }
- }
-
public OathOfDruids(final OathOfDruids card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -71,6 +46,26 @@ public final class OathOfDruids extends CardImpl {
}
}
+enum OathOfDruidsAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPlayer filter = new FilterPlayer();
+
+ static {
+ filter.add(new OathOfDruidsPredicate());
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player activePlayer = game.getPlayer(game.getActivePlayerId());
+ if (activePlayer != null) {
+ ability.getTargets().clear();
+ TargetPlayer target = new TargetPlayer(1, 1, false, filter);
+ target.setTargetController(activePlayer.getId());
+ ability.getTargets().add(target);
+ }
+ }
+}
+
class OathOfDruidsPredicate implements ObjectSourcePlayerPredicate> {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
diff --git a/Mage.Sets/src/mage/cards/o/OathOfGhouls.java b/Mage.Sets/src/mage/cards/o/OathOfGhouls.java
index 310ab0a52a9..73b5eb4677b 100644
--- a/Mage.Sets/src/mage/cards/o/OathOfGhouls.java
+++ b/Mage.Sets/src/mage/cards/o/OathOfGhouls.java
@@ -1,7 +1,6 @@
package mage.cards.o;
-import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -15,57 +14,36 @@ import mage.constants.TargetController;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.FilterPlayer;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
-import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.other.OwnerIdPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.TargetPlayer;
import mage.target.common.TargetCardInGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class OathOfGhouls extends CardImpl {
- private final UUID originalId;
- private static final FilterPlayer filter = new FilterPlayer();
-
- static {
- filter.add(new OathOfGhoulsPredicate());
- }
-
public OathOfGhouls(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
// At the beginning of each player's upkeep, that player chooses target player whose graveyard has fewer creature cards in it than their graveyard does and is their opponent. The first player may return a creature card from their graveyard to their hand.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new OathOfGhoulsEffect(), TargetController.ANY, false);
- ability.addTarget(new TargetPlayer(1, 1, false, filter));
+ ability.setTargetAdjuster(OathOfGhoulsAdjuster.instance);
this.addAbility(ability);
- originalId = ability.getOriginalId();
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- Player activePlayer = game.getPlayer(game.getActivePlayerId());
- if (activePlayer != null) {
- ability.getTargets().clear();
- TargetPlayer target = new TargetPlayer(1, 1, false, filter);
- target.setTargetController(activePlayer.getId());
- ability.getTargets().add(target);
- }
- }
}
public OathOfGhouls(final OathOfGhouls card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -74,14 +52,28 @@ public final class OathOfGhouls extends CardImpl {
}
}
-class OathOfGhoulsPredicate implements ObjectSourcePlayerPredicate> {
-
- private static final FilterCard filter = new FilterCard("creature cards");
+enum OathOfGhoulsAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPlayer filter = new FilterPlayer();
static {
- filter.add(new CardTypePredicate(CardType.CREATURE));
+ filter.add(new OathOfGhoulsPredicate());
}
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player activePlayer = game.getPlayer(game.getActivePlayerId());
+ if (activePlayer != null) {
+ ability.getTargets().clear();
+ TargetPlayer target = new TargetPlayer(1, 1, false, filter);
+ target.setTargetController(activePlayer.getId());
+ ability.getTargets().add(target);
+ }
+ }
+}
+
+class OathOfGhoulsPredicate implements ObjectSourcePlayerPredicate> {
+
@Override
public boolean apply(ObjectSourcePlayer input, Game game) {
Player targetPlayer = input.getObject();
@@ -91,8 +83,8 @@ class OathOfGhoulsPredicate implements ObjectSourcePlayerPredicate> {
- private static final FilterLandPermanent FILTER = new FilterLandPermanent();
-
@Override
public boolean apply(ObjectSourcePlayer input, Game game) {
- // input.getPlayerId() -- source controller id
- // input.getObject() -- checking player
-
Player targetPlayer = input.getObject();
//Get active input.playerId because adjust target is used after canTarget function
- Player activePlayer = game.getPlayer(game.getActivePlayerId());
-
- if (targetPlayer == null || activePlayer == null) {
+ UUID activePlayerId = game.getActivePlayerId();
+ if (targetPlayer == null || activePlayerId == null) {
return false;
}
-
- // must be opponent
- if (!activePlayer.hasOpponent(targetPlayer.getId(), game)) {
+ if (!targetPlayer.hasOpponent(activePlayerId, game)) {
return false;
}
+ int countTargetPlayer = game.getBattlefield().countAll(StaticFilters.FILTER_LAND, targetPlayer.getId(), game);
+ int countActivePlayer = game.getBattlefield().countAll(StaticFilters.FILTER_LAND, activePlayerId, game);
- // must have more lands than active player
- int countTargetPlayer = game.getBattlefield().countAll(FILTER, targetPlayer.getId(), game);
- int countActivePlayer = game.getBattlefield().countAll(FILTER, activePlayer.getId(), game);
return countTargetPlayer > countActivePlayer;
}
diff --git a/Mage.Sets/src/mage/cards/o/OathOfLiliana.java b/Mage.Sets/src/mage/cards/o/OathOfLiliana.java
index 5e45a1e6bef..b8f46913640 100644
--- a/Mage.Sets/src/mage/cards/o/OathOfLiliana.java
+++ b/Mage.Sets/src/mage/cards/o/OathOfLiliana.java
@@ -57,7 +57,7 @@ enum OathOfLilianaCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- OathOfLilianaWatcher watcher = (OathOfLilianaWatcher) game.getState().getWatchers().get(OathOfLilianaWatcher.class.getSimpleName());
+ OathOfLilianaWatcher watcher = game.getState().getWatcher(OathOfLilianaWatcher.class);
return watcher != null && watcher.enteredPlaneswalkerForPlayer(source.getControllerId());
}
@@ -73,7 +73,7 @@ class OathOfLilianaWatcher extends Watcher {
private final Set players = new HashSet<>();
public OathOfLilianaWatcher() {
- super(OathOfLilianaWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(OathOfLilianaWatcher.class, WatcherScope.GAME);
}
public OathOfLilianaWatcher(final OathOfLilianaWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/o/OathOfLimDul.java b/Mage.Sets/src/mage/cards/o/OathOfLimDul.java
new file mode 100644
index 00000000000..2d3aa09c5a7
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/o/OathOfLimDul.java
@@ -0,0 +1,139 @@
+package mage.cards.o;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.common.DiscardTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCardInHand;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class OathOfLimDul extends CardImpl {
+
+ public OathOfLimDul(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
+
+ // Whenever you lose life, for each 1 life you lost, sacrifice a permanent other than Oath of Lim-Dul unless you discard a card.
+ this.addAbility(new OathOfLimDulTriggeredAbility());
+
+ // {B}{B}: Draw a card.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{B}{B}")));
+
+ }
+
+ private OathOfLimDul(final OathOfLimDul card) {
+ super(card);
+ }
+
+ @Override
+ public OathOfLimDul copy() {
+ return new OathOfLimDul(this);
+ }
+}
+
+class OathOfLimDulTriggeredAbility extends TriggeredAbilityImpl {
+
+ public OathOfLimDulTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new OathOfLimDulEffect());
+ }
+
+ public OathOfLimDulTriggeredAbility(final OathOfLimDulTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public OathOfLimDulTriggeredAbility copy() {
+ return new OathOfLimDulTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.LOST_LIFE;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getPlayerId().equals(controllerId)) {
+ game.getState().setValue(sourceId.toString() + "oathOfLimDul", event.getAmount());
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you lose life, for each 1 life you lost, sacrifice a permanent other than {this} unless you discard a card.";
+ }
+}
+
+class OathOfLimDulEffect extends OneShotEffect {
+
+ private final static FilterControlledPermanent filter = new FilterControlledPermanent("controlled permanent other than Oath of Lim-Dul");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
+
+ public OathOfLimDulEffect() {
+ super(Outcome.Neutral);
+ }
+
+ public OathOfLimDulEffect(final OathOfLimDulEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ int amount = (int) game.getState().getValue(source.getSourceId().toString() + "oathOfLimDul");
+ if (amount > 0
+ && controller != null) {
+ for (int i = 0; i < amount; i++) {
+ TargetControlledPermanent target = new TargetControlledPermanent(filter);
+ target.setNotTarget(true);
+ if (target.canChoose(controller.getId(), game)
+ && controller.choose(Outcome.Sacrifice, target, source.getSourceId(), game)) {
+ Cost cost = new DiscardTargetCost(new TargetCardInHand());
+ if (cost.canPay(source, source.getSourceId(), controller.getId(), game)
+ && controller.chooseUse(Outcome.Benefit,
+ "Do you wish to discard a card rather than sacrifice the target permanent?", source, game)) {
+ cost.pay(source, game, source.getSourceId(), controller.getId(), true);
+ } else {
+ Permanent targetPermanent = game.getPermanent(target.getFirstTarget());
+ if (targetPermanent != null) {
+ targetPermanent.sacrifice(source.getSourceId(), game);
+ }
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public OathOfLimDulEffect copy() {
+ return new OathOfLimDulEffect(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/o/OathOfMages.java b/Mage.Sets/src/mage/cards/o/OathOfMages.java
index 4f43c746653..9621fcb8a77 100644
--- a/Mage.Sets/src/mage/cards/o/OathOfMages.java
+++ b/Mage.Sets/src/mage/cards/o/OathOfMages.java
@@ -1,7 +1,6 @@
package mage.cards.o;
-import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -17,46 +16,26 @@ import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class OathOfMages extends CardImpl {
- private final UUID originalId;
- private static final FilterPlayer filter = new FilterPlayer();
-
- static {
- filter.add(new OathOfMagesPredicate());
- }
-
public OathOfMages(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
// At the beginning of each player's upkeep, that player chooses target player who has more life than he or she does and is their opponent. The first player may have Oath of Mages deal 1 damage to the second player.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new OathOfMagesEffect(), TargetController.ANY, false);
- ability.addTarget(new TargetPlayer(1, 1, false, filter));
+ ability.setTargetAdjuster(OathOfMagesAdjuster.instance);
this.addAbility(ability);
- originalId = ability.getOriginalId();
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- Player activePlayer = game.getPlayer(game.getActivePlayerId());
- if (activePlayer != null) {
- ability.getTargets().clear();
- TargetPlayer target = new TargetPlayer(1, 1, false, filter);
- target.setTargetController(activePlayer.getId());
- ability.getTargets().add(target);
- }
- }
}
public OathOfMages(final OathOfMages card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -65,6 +44,26 @@ public final class OathOfMages extends CardImpl {
}
}
+enum OathOfMagesAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPlayer filter = new FilterPlayer();
+
+ static {
+ filter.add(new OathOfMagesPredicate());
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player activePlayer = game.getPlayer(game.getActivePlayerId());
+ if (activePlayer != null) {
+ ability.getTargets().clear();
+ TargetPlayer target = new TargetPlayer(1, 1, false, filter);
+ target.setTargetController(activePlayer.getId());
+ ability.getTargets().add(target);
+ }
+ }
+}
+
class OathOfMagesPredicate implements ObjectSourcePlayerPredicate> {
@Override
diff --git a/Mage.Sets/src/mage/cards/o/OathOfScholars.java b/Mage.Sets/src/mage/cards/o/OathOfScholars.java
index 9a61ce6de8f..75d206ce16d 100644
--- a/Mage.Sets/src/mage/cards/o/OathOfScholars.java
+++ b/Mage.Sets/src/mage/cards/o/OathOfScholars.java
@@ -1,7 +1,6 @@
package mage.cards.o;
-import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -17,47 +16,26 @@ import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public final class OathOfScholars extends CardImpl {
- private final UUID originalId;
- private static final FilterPlayer filter = new FilterPlayer();
-
- static {
- filter.add(new OathOfScholarsPredicate());
- }
-
public OathOfScholars(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}");
// At the beginning of each player's upkeep, that player chooses target player who has more cards in hand than he or she does and is their opponent. The first player may discard their hand and draw three cards.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new OathOfScholarsEffect(), TargetController.ANY, false);
- ability.addTarget(new TargetPlayer(1, 1, false, filter));
+ ability.setTargetAdjuster(OathOfScholarsAdjuster.instance);
this.addAbility(ability);
- originalId = ability.getOriginalId();
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- Player activePlayer = game.getPlayer(game.getActivePlayerId());
- if (activePlayer != null) {
- ability.getTargets().clear();
- TargetPlayer target = new TargetPlayer(1, 1, false, filter);
- target.setTargetController(activePlayer.getId());
- ability.getTargets().add(target);
- }
- }
}
public OathOfScholars(final OathOfScholars card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -66,6 +44,26 @@ public final class OathOfScholars extends CardImpl {
}
}
+enum OathOfScholarsAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPlayer filter = new FilterPlayer();
+
+ static {
+ filter.add(new OathOfScholarsPredicate());
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player activePlayer = game.getPlayer(game.getActivePlayerId());
+ if (activePlayer != null) {
+ ability.getTargets().clear();
+ TargetPlayer target = new TargetPlayer(1, 1, false, filter);
+ target.setTargetController(activePlayer.getId());
+ ability.getTargets().add(target);
+ }
+ }
+}
+
class OathOfScholarsPredicate implements ObjectSourcePlayerPredicate> {
@Override
diff --git a/Mage.Sets/src/mage/cards/o/OathOfTeferi.java b/Mage.Sets/src/mage/cards/o/OathOfTeferi.java
index 047d9447689..db292a88a07 100644
--- a/Mage.Sets/src/mage/cards/o/OathOfTeferi.java
+++ b/Mage.Sets/src/mage/cards/o/OathOfTeferi.java
@@ -36,7 +36,7 @@ public final class OathOfTeferi extends CardImpl {
private final static FilterControlledPermanent filter = new FilterControlledPermanent("another target permanent you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public OathOfTeferi(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OathkeeperTakenosDaisho.java b/Mage.Sets/src/mage/cards/o/OathkeeperTakenosDaisho.java
index c73958f38d0..d5718d8eaba 100644
--- a/Mage.Sets/src/mage/cards/o/OathkeeperTakenosDaisho.java
+++ b/Mage.Sets/src/mage/cards/o/OathkeeperTakenosDaisho.java
@@ -1,7 +1,5 @@
-
package mage.cards.o;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.DiesAttachedTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
@@ -22,33 +20,38 @@ import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class OathkeeperTakenosDaisho extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("it's a Samurai card");
+
static {
filter.add(new SubtypePredicate(SubType.SAMURAI));
}
public OathkeeperTakenosDaisho(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +3/+1.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(3,1, Duration.WhileOnBattlefield)));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(3, 1, Duration.WhileOnBattlefield)));
+
// Whenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card.
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
- new DiesAttachedTriggeredAbility(new ReturnToBattlefieldUnderYourControlAttachedEffect(),"equipped creature", false),
+ new DiesAttachedTriggeredAbility(new ReturnToBattlefieldUnderYourControlAttachedEffect(), "equipped creature", false),
new OathkeeperEquippedMatchesFilterCondition(filter),
""));
+
// When Oathkeeper, Takeno's Daisho is put into a graveyard from the battlefield, exile equipped creature.
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ExileEquippedEffect()));
+
// Equip {2}
- this.addAbility(new EquipAbility( Outcome.BoostCreature, new ManaCostsImpl("{2}")));
+ this.addAbility(new EquipAbility(Outcome.BoostCreature, new ManaCostsImpl("{2}")));
}
public OathkeeperTakenosDaisho(final OathkeeperTakenosDaisho card) {
@@ -114,14 +117,12 @@ class OathkeeperEquippedMatchesFilterCondition implements Condition {
}
}
if (attachedTo == null) {
- for (Effect effect :source.getEffects()) {
+ for (Effect effect : source.getEffects()) {
attachedTo = (Permanent) effect.getValue("attachedTo");
}
}
if (attachedTo != null) {
- if (filter.match(attachedTo, attachedTo.getId(),attachedTo.getControllerId(), game)) {
- return true;
- }
+ return filter.match(attachedTo, attachedTo.getId(), attachedTo.getControllerId(), game);
}
}
diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java b/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java
index 5bea48f7f8a..3a1003695b4 100644
--- a/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java
+++ b/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java
@@ -1,7 +1,5 @@
-
package mage.cards.o;
-import java.util.UUID;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
import mage.abilities.effects.Effect;
@@ -18,8 +16,9 @@ import mage.game.command.emblems.ObNixilisReignitedEmblem;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetOpponent;
+import java.util.UUID;
+
/**
- *
* @author fireshoes
*/
public final class ObNixilisReignited extends CardImpl {
@@ -32,12 +31,10 @@ public final class ObNixilisReignited extends CardImpl {
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5));
// +1: You draw a card and you lose 1 life.
- Effect effect = new DrawCardSourceControllerEffect(1);
- effect.setText("You draw a card");
+ Effect effect = new DrawCardSourceControllerEffect(1, "you");
LoyaltyAbility ability1 = new LoyaltyAbility(effect, 1);
effect = new LoseLifeSourceControllerEffect(1);
- effect.setText("and you lose 1 life");
- ability1.addEffect(effect);
+ ability1.addEffect(effect.concatBy("and"));
this.addAbility(ability1);
// -3: Destroy target creature.
@@ -47,7 +44,6 @@ public final class ObNixilisReignited extends CardImpl {
// -8: Target opponent gets an emblem with "Whenever a player draws a card, you lose 2 life."
effect = new GetEmblemTargetPlayerEffect(new ObNixilisReignitedEmblem());
- effect.setText("Target opponent gets an emblem with \"Whenever a player draws a card, you lose 2 life.\"");
LoyaltyAbility ability3 = new LoyaltyAbility(effect, -8);
ability3.addTarget(new TargetOpponent());
this.addAbility(ability3);
diff --git a/Mage.Sets/src/mage/cards/o/OblivionRing.java b/Mage.Sets/src/mage/cards/o/OblivionRing.java
index 8b5f3372239..8c4700b069f 100644
--- a/Mage.Sets/src/mage/cards/o/OblivionRing.java
+++ b/Mage.Sets/src/mage/cards/o/OblivionRing.java
@@ -27,7 +27,7 @@ public final class OblivionRing extends CardImpl {
private static final FilterNonlandPermanent anotherNonlandPermanent = new FilterNonlandPermanent("another target nonland permanent");
static {
- anotherNonlandPermanent.add(new AnotherPredicate());
+ anotherNonlandPermanent.add(AnotherPredicate.instance);
}
public OblivionRing(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OblivionSower.java b/Mage.Sets/src/mage/cards/o/OblivionSower.java
index 8742de4f54a..f3c8a5272d6 100644
--- a/Mage.Sets/src/mage/cards/o/OblivionSower.java
+++ b/Mage.Sets/src/mage/cards/o/OblivionSower.java
@@ -81,7 +81,7 @@ class OblivionSowerEffect extends OneShotEffect {
if (controller != null && targetPlayer != null) {
FilterLandCard filter = new FilterLandCard();
filter.add(new OwnerIdPredicate(targetPlayer.getId()));
- filter.add(Predicates.not(new FaceDownPredicate()));
+ filter.add(Predicates.not(FaceDownPredicate.instance));
Cards exiledCards = new CardsImpl();
exiledCards.addAll(game.getExile().getAllCards(game));
Cards exiledLands = new CardsImpl();
diff --git a/Mage.Sets/src/mage/cards/o/OboroEnvoy.java b/Mage.Sets/src/mage/cards/o/OboroEnvoy.java
index c4990fe881e..fa6d5891b0c 100644
--- a/Mage.Sets/src/mage/cards/o/OboroEnvoy.java
+++ b/Mage.Sets/src/mage/cards/o/OboroEnvoy.java
@@ -39,7 +39,7 @@ public final class OboroEnvoy extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// {2}, Return a land you control to its owner's hand: Target creature gets -X/-0 until end of turn, where X is the number of cards in your hand.
- Effect effect = new BoostTargetEffect(new SignInversionDynamicValue(new CardsInControllerHandCount()), new StaticValue(-0), Duration.EndOfTurn, true);
+ Effect effect = new BoostTargetEffect(new SignInversionDynamicValue(CardsInControllerHandCount.instance), new StaticValue(-0), Duration.EndOfTurn, true);
effect.setText("Target creature gets -X/-0 until end of turn, where X is the number of cards in your hand");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2));
ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land"))));
diff --git a/Mage.Sets/src/mage/cards/o/ObscuringAether.java b/Mage.Sets/src/mage/cards/o/ObscuringAether.java
index 0f4aa3723c7..1b4e559253f 100644
--- a/Mage.Sets/src/mage/cards/o/ObscuringAether.java
+++ b/Mage.Sets/src/mage/cards/o/ObscuringAether.java
@@ -25,7 +25,7 @@ public final class ObscuringAether extends CardImpl {
private static final FilterCreatureCard filter = new FilterCreatureCard("Face-down creature spells");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
}
public ObscuringAether(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OddsEnds.java b/Mage.Sets/src/mage/cards/o/OddsEnds.java
index e83b5f5258e..efdd05d6e13 100644
--- a/Mage.Sets/src/mage/cards/o/OddsEnds.java
+++ b/Mage.Sets/src/mage/cards/o/OddsEnds.java
@@ -65,7 +65,7 @@ class OddsEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, false)) {
game.informPlayers("Odds: Spell countered");
return game.getStack().counter(getTargetPointer().getFirst(game, source), source.getSourceId(), game);
diff --git a/Mage.Sets/src/mage/cards/o/OdricMasterTactician.java b/Mage.Sets/src/mage/cards/o/OdricMasterTactician.java
index 70498e24c58..51541f2daa0 100644
--- a/Mage.Sets/src/mage/cards/o/OdricMasterTactician.java
+++ b/Mage.Sets/src/mage/cards/o/OdricMasterTactician.java
@@ -87,7 +87,7 @@ class OdricMasterTacticianTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean apply(Game game, Ability source) {
- ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
+ ChooseBlockersRedundancyWatcher watcher = game.getState().getWatcher(ChooseBlockersRedundancyWatcher.class);
if (watcher != null) {
watcher.increment();
return true;
@@ -130,7 +130,10 @@ class OdricMasterTacticianChooseBlockersEffect extends ContinuousRuleModifyingEf
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- ChooseBlockersRedundancyWatcher watcher = (ChooseBlockersRedundancyWatcher) game.getState().getWatchers().get(ChooseBlockersRedundancyWatcher.class.getSimpleName());
+ ChooseBlockersRedundancyWatcher watcher = game.getState().getWatcher(ChooseBlockersRedundancyWatcher.class);
+ if(watcher == null){
+ return false;
+ }
watcher.decrement();
watcher.copyCount--;
if (watcher.copyCountApply > 0) {
diff --git a/Mage.Sets/src/mage/cards/o/Offalsnout.java b/Mage.Sets/src/mage/cards/o/Offalsnout.java
index 042e3ec854d..3bc244c8c93 100644
--- a/Mage.Sets/src/mage/cards/o/Offalsnout.java
+++ b/Mage.Sets/src/mage/cards/o/Offalsnout.java
@@ -1,10 +1,9 @@
package mage.cards.o;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.LeavesBattlefieldTriggeredAbility;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.keyword.EvokeAbility;
import mage.abilities.keyword.FlashAbility;
@@ -15,14 +14,15 @@ import mage.constants.SubType;
import mage.target.Target;
import mage.target.common.TargetCardInGraveyard;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class Offalsnout extends CardImpl {
public Offalsnout(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(2);
@@ -31,7 +31,7 @@ public final class Offalsnout extends CardImpl {
// Flash
this.addAbility(FlashAbility.getInstance());
// When Offalsnout leaves the battlefield, exile target card from a graveyard.
- Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect(),false);
+ Ability ability = new LeavesBattlefieldTriggeredAbility(new ExileTargetEffect(), false);
Target target = new TargetCardInGraveyard();
ability.addTarget(target);
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/o/OgreBattledriver.java b/Mage.Sets/src/mage/cards/o/OgreBattledriver.java
index 59f1085d22f..4986765662d 100644
--- a/Mage.Sets/src/mage/cards/o/OgreBattledriver.java
+++ b/Mage.Sets/src/mage/cards/o/OgreBattledriver.java
@@ -30,7 +30,7 @@ public final class OgreBattledriver extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
private static final String rule = "Whenever another creature enters the battlefield under your control, that creature gets +2/+0 and gains haste until end of turn.";
diff --git a/Mage.Sets/src/mage/cards/o/OgreSlumlord.java b/Mage.Sets/src/mage/cards/o/OgreSlumlord.java
index 475c981d675..9c63fbc4835 100644
--- a/Mage.Sets/src/mage/cards/o/OgreSlumlord.java
+++ b/Mage.Sets/src/mage/cards/o/OgreSlumlord.java
@@ -31,8 +31,8 @@ public final class OgreSlumlord extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another nontoken creature");
private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("Rats you control");
static {
- filter.add(Predicates.not(new TokenPredicate()));
- filter.add(new AnotherPredicate());
+ filter.add(Predicates.not(TokenPredicate.instance));
+ filter.add(AnotherPredicate.instance);
filter2.add(new SubtypePredicate(SubType.RAT));
}
diff --git a/Mage.Sets/src/mage/cards/o/OkaunEyeOfChaos.java b/Mage.Sets/src/mage/cards/o/OkaunEyeOfChaos.java
index f22d1ea5c57..884c23d1254 100644
--- a/Mage.Sets/src/mage/cards/o/OkaunEyeOfChaos.java
+++ b/Mage.Sets/src/mage/cards/o/OkaunEyeOfChaos.java
@@ -1,7 +1,6 @@
package mage.cards.o;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.WinsCoinFlipTriggeredAbility;
@@ -13,18 +12,18 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.PartnerWithAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.constants.TargetController;
+import mage.constants.*;
+
+import java.util.UUID;
/**
- *
* @author TheElk801
*/
public final class OkaunEyeOfChaos extends CardImpl {
+ private static final DynamicValue sourcePower = new SourcePermanentPowerCount();
+ private static final DynamicValue sourceToughness = new SourcePermanentToughnessValue();
+
public OkaunEyeOfChaos(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}");
@@ -41,8 +40,6 @@ public final class OkaunEyeOfChaos extends CardImpl {
this.addAbility(new BeginningOfCombatTriggeredAbility(new FlipUntilLoseEffect(), TargetController.YOU, false));
// Whenever a player wins a coin flip, double Okaun's power and toughness until end of turn.
- DynamicValue sourcePower = new SourcePermanentPowerCount();
- DynamicValue sourceToughness = new SourcePermanentToughnessValue();
this.addAbility(new WinsCoinFlipTriggeredAbility(
new BoostSourceEffect(
sourcePower,
diff --git a/Mage.Sets/src/mage/cards/o/OldFogey.java b/Mage.Sets/src/mage/cards/o/OldFogey.java
index 4dd4ed481a2..dabcf1537f4 100644
--- a/Mage.Sets/src/mage/cards/o/OldFogey.java
+++ b/Mage.Sets/src/mage/cards/o/OldFogey.java
@@ -1,4 +1,3 @@
-
package mage.cards.o;
import java.util.UUID;
@@ -39,7 +38,7 @@ public final class OldFogey extends CardImpl {
}
public OldFogey(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{G}");
this.subtype.add(SubType.DINOSAUR);
this.power = new MageInt(7);
this.toughness = new MageInt(7);
@@ -51,7 +50,7 @@ public final class OldFogey extends CardImpl {
// Echo {G}{G}
this.addAbility(new EchoAbility("{G}{G}"));
// Fading 3
- this.addAbility(new FadingAbility(3, this));
+ this.addAbility(new FadingAbility(3, this, true));
// Bands with other Dinosaurs
this.addAbility(new BandsWithOtherAbility(SubType.DINOSAUR));
// Protection from Homarids
@@ -61,7 +60,7 @@ public final class OldFogey extends CardImpl {
// Flanking
this.addAbility(new FlankingAbility());
// Rampage 2
- this.addAbility(new RampageAbility(2));
+ this.addAbility(new RampageAbility(2, true));
}
public OldFogey(final OldFogey card) {
diff --git a/Mage.Sets/src/mage/cards/o/OliviaVoldaren.java b/Mage.Sets/src/mage/cards/o/OliviaVoldaren.java
index 6e5a6763ed6..c221c91dc24 100644
--- a/Mage.Sets/src/mage/cards/o/OliviaVoldaren.java
+++ b/Mage.Sets/src/mage/cards/o/OliviaVoldaren.java
@@ -36,7 +36,7 @@ public final class OliviaVoldaren extends CardImpl {
private static final FilterCreaturePermanent vampireFilter = new FilterCreaturePermanent("Vampire");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
vampireFilter.add(new SubtypePredicate(SubType.VAMPIRE));
}
diff --git a/Mage.Sets/src/mage/cards/o/OnceMoreWithFeeling.java b/Mage.Sets/src/mage/cards/o/OnceMoreWithFeeling.java
index a5e986680f4..797552378e2 100644
--- a/Mage.Sets/src/mage/cards/o/OnceMoreWithFeeling.java
+++ b/Mage.Sets/src/mage/cards/o/OnceMoreWithFeeling.java
@@ -28,7 +28,7 @@ public final class OnceMoreWithFeeling extends CardImpl {
public OnceMoreWithFeeling(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{W}{W}{W}{W}");
- // Exile all permanents and all cards from all graveyards. Each player shuffles his or her hand into his or her library, then draws seven cards. Each player's life total becomes 10. Exile Once More with Feeling.
+ // Exile all permanents and all cards from all graveyards. Each player shuffles their hand into their library, then draws seven cards. Each player's life total becomes 10. Exile Once More with Feeling.
this.getSpellAbility().addEffect(new OnceMoreWithFeelingEffect());
Effect effect = new DrawCardAllEffect(7);
effect.setText(", then draws seven cards");
diff --git a/Mage.Sets/src/mage/cards/o/OnduWarCleric.java b/Mage.Sets/src/mage/cards/o/OnduWarCleric.java
index 4a70adcb89b..8ca40e0e6ce 100644
--- a/Mage.Sets/src/mage/cards/o/OnduWarCleric.java
+++ b/Mage.Sets/src/mage/cards/o/OnduWarCleric.java
@@ -30,7 +30,7 @@ public final class OnduWarCleric extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ALLY));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public OnduWarCleric(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OnwardVictory.java b/Mage.Sets/src/mage/cards/o/OnwardVictory.java
index b70f7bd4aeb..e5d5aa698d1 100644
--- a/Mage.Sets/src/mage/cards/o/OnwardVictory.java
+++ b/Mage.Sets/src/mage/cards/o/OnwardVictory.java
@@ -25,12 +25,12 @@ public final class OnwardVictory extends SplitCard {
// Onward
// Target creature gets +X/+0 until end of turn where X is its power.
getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
- getLeftHalfCard().getSpellAbility().addEffect(new BoostTargetEffect(new TargetPermanentPowerCount(), new StaticValue(0), Duration.EndOfTurn, true));
+ getLeftHalfCard().getSpellAbility().addEffect(new BoostTargetEffect(TargetPermanentPowerCount.instance, new StaticValue(0), Duration.EndOfTurn, true));
// to
// Victory
// Target creature gains double strike until end of turn.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
Effect effect = new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn);
getRightHalfCard().getSpellAbility().addEffect(effect);
getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
diff --git a/Mage.Sets/src/mage/cards/o/OpalPalace.java b/Mage.Sets/src/mage/cards/o/OpalPalace.java
index 345496aa2d6..bfc47e573fb 100644
--- a/Mage.Sets/src/mage/cards/o/OpalPalace.java
+++ b/Mage.Sets/src/mage/cards/o/OpalPalace.java
@@ -67,7 +67,7 @@ class OpalPalaceWatcher extends Watcher {
private final String originalId;
public OpalPalaceWatcher(String originalId) {
- super(OpalPalaceWatcher.class.getSimpleName(), WatcherScope.CARD);
+ super(OpalPalaceWatcher.class, WatcherScope.CARD);
this.originalId = originalId;
}
@@ -130,7 +130,7 @@ class OpalPalaceEntersBattlefieldEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- OpalPalaceWatcher watcher = (OpalPalaceWatcher) game.getState().getWatchers().get(OpalPalaceWatcher.class.getSimpleName(), source.getSourceId());
+ OpalPalaceWatcher watcher = game.getState().getWatcher(OpalPalaceWatcher.class, source.getSourceId());
return watcher != null
&& watcher.commanderId.contains(event.getTargetId());
}
diff --git a/Mage.Sets/src/mage/cards/o/OpalTitan.java b/Mage.Sets/src/mage/cards/o/OpalTitan.java
index 1f215472b72..d75f1cd1e67 100644
--- a/Mage.Sets/src/mage/cards/o/OpalTitan.java
+++ b/Mage.Sets/src/mage/cards/o/OpalTitan.java
@@ -107,7 +107,7 @@ class OpalTitanBecomesCreatureEffect extends ContinuousEffectImpl implements Sou
break;
case AbilityAddingRemovingEffects_6:
if (sublayer == SubLayer.NA) {
- if (((ObjectColor) game.getState().getValue("opalTitanColor" + source.getSourceId())) != null) {
+ if (game.getState().getValue("opalTitanColor" + source.getSourceId()) != null) {
for (ObjectColor color : ((ObjectColor) game.getState().getValue("opalTitanColor" + source.getSourceId())).getColors()) {
if (!permanent.getAbilities().contains(ProtectionAbility.from(color))) {
permanent.addAbility(ProtectionAbility.from(color));
diff --git a/Mage.Sets/src/mage/cards/o/Opalescence.java b/Mage.Sets/src/mage/cards/o/Opalescence.java
index 8037d645d00..40319bcfcdb 100644
--- a/Mage.Sets/src/mage/cards/o/Opalescence.java
+++ b/Mage.Sets/src/mage/cards/o/Opalescence.java
@@ -52,7 +52,7 @@ class OpalescenceEffect extends ContinuousEffectImpl {
static {
filter.add(Predicates.not(new SubtypePredicate(SubType.AURA)));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
checkDependencyTypes = EnumSet.of(DependencyType.AuraAddingRemoving, DependencyType.EnchantmentAddingRemoving);
}
diff --git a/Mage.Sets/src/mage/cards/o/OpenIntoWonder.java b/Mage.Sets/src/mage/cards/o/OpenIntoWonder.java
index 41ef18e9eb5..e92b99a2b50 100644
--- a/Mage.Sets/src/mage/cards/o/OpenIntoWonder.java
+++ b/Mage.Sets/src/mage/cards/o/OpenIntoWonder.java
@@ -1,9 +1,7 @@
package mage.cards.o;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
@@ -13,12 +11,13 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.filter.StaticFilters;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class OpenIntoWonder extends CardImpl {
@@ -30,28 +29,28 @@ public final class OpenIntoWonder extends CardImpl {
Effect effect = new CantBeBlockedTargetEffect(Duration.EndOfTurn);
effect.setText("X target creatures can't be blocked this turn");
this.getSpellAbility().addEffect(effect);
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1, StaticFilters.FILTER_PERMANENT_CREATURE, false));
Ability abilityToGain = new DealsCombatDamageToAPlayerTriggeredAbility(new DrawCardSourceControllerEffect(1), false);
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(abilityToGain, Duration.EndOfTurn,
"Until end of turn, those creatures gain \"Whenever this creature deals combat damage to a player, draw a card.\""));
+ this.getSpellAbility().setTargetAdjuster(OpenIntoWonderAdjuster.instance);
}
public OpenIntoWonder(final OpenIntoWonder card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int numberOfTargets = ability.getManaCostsToPay().getX();
- numberOfTargets = Math.min(game.getBattlefield().count(StaticFilters.FILTER_PERMANENT_CREATURE, ability.getSourceId(), ability.getControllerId(), game), numberOfTargets);
- ability.addTarget(new TargetCreaturePermanent(numberOfTargets));
- }
- }
-
@Override
public OpenIntoWonder copy() {
return new OpenIntoWonder(this);
}
}
+
+enum OpenIntoWonderAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanent(ability.getManaCostsToPay().getX()));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/o/OpenSeason.java b/Mage.Sets/src/mage/cards/o/OpenSeason.java
index 74377fe7226..c871340981a 100644
--- a/Mage.Sets/src/mage/cards/o/OpenSeason.java
+++ b/Mage.Sets/src/mage/cards/o/OpenSeason.java
@@ -1,7 +1,6 @@
package mage.cards.o;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -22,10 +21,11 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
-import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author Styxo
*/
public final class OpenSeason extends CardImpl {
@@ -37,7 +37,7 @@ public final class OpenSeason extends CardImpl {
Effect effect = new AddCountersTargetEffect(CounterType.BOUNTY.createInstance());
effect.setText("for each opponent, put a bounty counter on target creature that player controls");
Ability ability = new EntersBattlefieldTriggeredAbility(effect);
- ability.addTarget(new TargetCreaturePermanent());
+ ability.setTargetAdjuster(OpenSeasonAdjuster.instance);
this.addAbility(ability);
// Creatures your opponent control with bounty counters on them can't activate abilities
@@ -48,19 +48,6 @@ public final class OpenSeason extends CardImpl {
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- ability.getTargets().clear();
- for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
- Player opponent = game.getPlayer(opponentId);
- if (opponent != null) {
- ability.addTarget(new TargetPermanent(new FilterCreaturePermanent("creature from opponent " + opponent.getLogName())));
- }
- }
- }
- }
-
public OpenSeason(final OpenSeason card) {
super(card);
}
@@ -71,6 +58,21 @@ public final class OpenSeason extends CardImpl {
}
}
+enum OpenSeasonAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ Player opponent = game.getPlayer(opponentId);
+ if (opponent != null) {
+ ability.addTarget(new TargetPermanent(new FilterCreaturePermanent("creature from opponent " + opponent.getLogName())));
+ }
+ }
+ }
+}
+
class OpenSeasonRestrictionEffect extends RestrictionEffect {
public OpenSeasonRestrictionEffect() {
diff --git a/Mage.Sets/src/mage/cards/o/OpenTheGates.java b/Mage.Sets/src/mage/cards/o/OpenTheGates.java
new file mode 100644
index 00000000000..673655a8213
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/o/OpenTheGates.java
@@ -0,0 +1,49 @@
+package mage.cards.o;
+
+import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.filter.FilterCard;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.common.TargetCardInLibrary;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class OpenTheGates extends CardImpl {
+
+ private static final FilterCard filter = new FilterCard("basic land card or a Gate card");
+
+ static {
+ filter.add(Predicates.or(
+ Predicates.and(
+ new SupertypePredicate(SuperType.BASIC),
+ new CardTypePredicate(CardType.LAND)
+ ), new SubtypePredicate(SubType.GATE)
+ ));
+ }
+
+ public OpenTheGates(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{G}");
+
+ // Search your library for a basic land card or a Gate card, reveal it, put it into your hand, then shuffled your library.
+ this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true));
+ }
+
+ private OpenTheGates(final OpenTheGates card) {
+ super(card);
+ }
+
+ @Override
+ public OpenTheGates copy() {
+ return new OpenTheGates(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/o/OpenTheGraves.java b/Mage.Sets/src/mage/cards/o/OpenTheGraves.java
index b76f2b1047a..aeb45f4a0eb 100644
--- a/Mage.Sets/src/mage/cards/o/OpenTheGraves.java
+++ b/Mage.Sets/src/mage/cards/o/OpenTheGraves.java
@@ -23,7 +23,7 @@ public final class OpenTheGraves extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public OpenTheGraves(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/Opposition.java b/Mage.Sets/src/mage/cards/o/Opposition.java
index 9f140a7c0cd..30112bc8ee0 100644
--- a/Mage.Sets/src/mage/cards/o/Opposition.java
+++ b/Mage.Sets/src/mage/cards/o/Opposition.java
@@ -36,7 +36,7 @@ public final class Opposition extends CardImpl {
private static final FilterControlledCreaturePermanent untappedcreatureyoucontrol = new FilterControlledCreaturePermanent("untapped creature you control");
static {
- untappedcreatureyoucontrol.add(Predicates.not(new TappedPredicate()));
+ untappedcreatureyoucontrol.add(Predicates.not(TappedPredicate.instance));
}
public Opposition(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OracleEnVec.java b/Mage.Sets/src/mage/cards/o/OracleEnVec.java
index 118fd61524d..46450454ba6 100644
--- a/Mage.Sets/src/mage/cards/o/OracleEnVec.java
+++ b/Mage.Sets/src/mage/cards/o/OracleEnVec.java
@@ -243,7 +243,7 @@ class OracleEnVecDestroyEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- AttackedThisTurnWatcher watcher = (AttackedThisTurnWatcher) game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName());
+ AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class);
if (watcher != null) {
for (UUID targetId : chosenCreatures) {
Permanent permanent = game.getPermanent(targetId);
diff --git a/Mage.Sets/src/mage/cards/o/OracleOfNectars.java b/Mage.Sets/src/mage/cards/o/OracleOfNectars.java
index 0c8bd66cd1b..94f72f3ee72 100644
--- a/Mage.Sets/src/mage/cards/o/OracleOfNectars.java
+++ b/Mage.Sets/src/mage/cards/o/OracleOfNectars.java
@@ -30,7 +30,7 @@ public final class OracleOfNectars extends CardImpl {
this.toughness = new MageInt(2);
// {X}, {tap}: You gain X life.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(ManacostVariableValue.instance), new ManaCostsImpl("{X}"));
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/o/OratorOfOjutai.java b/Mage.Sets/src/mage/cards/o/OratorOfOjutai.java
index 2d698b0f094..ddddb169719 100644
--- a/Mage.Sets/src/mage/cards/o/OratorOfOjutai.java
+++ b/Mage.Sets/src/mage/cards/o/OratorOfOjutai.java
@@ -95,7 +95,7 @@ class OratorOfOjutaiTriggeredAbility extends TriggeredAbilityImpl {
public boolean checkTrigger(GameEvent event, Game game) {
//Intervening if must be checked
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(getSourceId());
- DragonOnTheBattlefieldWhileSpellWasCastWatcher watcher = (DragonOnTheBattlefieldWhileSpellWasCastWatcher) game.getState().getWatchers().get(DragonOnTheBattlefieldWhileSpellWasCastWatcher.class.getSimpleName());
+ DragonOnTheBattlefieldWhileSpellWasCastWatcher watcher = game.getState().getWatcher(DragonOnTheBattlefieldWhileSpellWasCastWatcher.class);
return event.getTargetId().equals(getSourceId())
&& watcher != null
&& watcher.castWithConditionTrue(sourcePermanent.getSpellAbility().getId());
@@ -135,7 +135,7 @@ class OratorOfOjutaiEffect extends OneShotEffect {
if (controller != null) {
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (sourcePermanent != null) {
- DragonOnTheBattlefieldWhileSpellWasCastWatcher watcher = (DragonOnTheBattlefieldWhileSpellWasCastWatcher) game.getState().getWatchers().get(DragonOnTheBattlefieldWhileSpellWasCastWatcher.class.getSimpleName());
+ DragonOnTheBattlefieldWhileSpellWasCastWatcher watcher = game.getState().getWatcher(DragonOnTheBattlefieldWhileSpellWasCastWatcher.class);
if (watcher != null && watcher.castWithConditionTrue(sourcePermanent.getSpellAbility().getId())) {
controller.drawCards(1, game);
return true;
diff --git a/Mage.Sets/src/mage/cards/o/OrcGeneral.java b/Mage.Sets/src/mage/cards/o/OrcGeneral.java
index b2d290e3e53..792b222f8a5 100644
--- a/Mage.Sets/src/mage/cards/o/OrcGeneral.java
+++ b/Mage.Sets/src/mage/cards/o/OrcGeneral.java
@@ -33,7 +33,7 @@ public final class OrcGeneral extends CardImpl {
static {
filterOrcOrGoblin.add(Predicates.or(new SubtypePredicate(SubType.ORC),
new SubtypePredicate(SubType.GOBLIN)));
- filterOrcOrGoblin.add(new AnotherPredicate());
+ filterOrcOrGoblin.add(AnotherPredicate.instance);
filterOrc.add(new SubtypePredicate(SubType.ORC));
}
diff --git a/Mage.Sets/src/mage/cards/o/OrcSureshot.java b/Mage.Sets/src/mage/cards/o/OrcSureshot.java
index 80c5d978b37..f499838e56c 100644
--- a/Mage.Sets/src/mage/cards/o/OrcSureshot.java
+++ b/Mage.Sets/src/mage/cards/o/OrcSureshot.java
@@ -29,7 +29,7 @@ public final class OrcSureshot extends CardImpl {
private static final FilterCreaturePermanent filterOpponentCreature = new FilterCreaturePermanent("creature an opponent controls");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filterOpponentCreature.add(new ControllerPredicate(TargetController.OPPONENT));
}
diff --git a/Mage.Sets/src/mage/cards/o/OrchardWarden.java b/Mage.Sets/src/mage/cards/o/OrchardWarden.java
index da5336125e2..cd77dd9b47b 100644
--- a/Mage.Sets/src/mage/cards/o/OrchardWarden.java
+++ b/Mage.Sets/src/mage/cards/o/OrchardWarden.java
@@ -26,7 +26,7 @@ public final class OrchardWarden extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.TREEFOLK));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public OrchardWarden(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OrcishCaptain.java b/Mage.Sets/src/mage/cards/o/OrcishCaptain.java
index 998fe8e7e8d..adb37723559 100644
--- a/Mage.Sets/src/mage/cards/o/OrcishCaptain.java
+++ b/Mage.Sets/src/mage/cards/o/OrcishCaptain.java
@@ -69,7 +69,7 @@ class OrcishCaptainEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (controller != null && permanent != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
game.informPlayers("Orcish Captain: Won flip. Target Orc creature gets +2/+0 until end of turn.");
game.addEffect(new BoostTargetEffect(2, 0, Duration.EndOfTurn), source);
return true;
diff --git a/Mage.Sets/src/mage/cards/o/OrcishSquatters.java b/Mage.Sets/src/mage/cards/o/OrcishSquatters.java
index 33489a79f7c..fd20a8044bc 100644
--- a/Mage.Sets/src/mage/cards/o/OrcishSquatters.java
+++ b/Mage.Sets/src/mage/cards/o/OrcishSquatters.java
@@ -27,7 +27,7 @@ public final class OrcishSquatters extends CardImpl {
private static final FilterLandPermanent filter = new FilterLandPermanent("land defending player controls");
static {
- filter.add(new DefendingPlayerControlsPredicate());
+ filter.add(DefendingPlayerControlsPredicate.instance);
}
public OrcishSquatters(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/Orgg.java b/Mage.Sets/src/mage/cards/o/Orgg.java
index 60d0bc29d06..2112818ed02 100644
--- a/Mage.Sets/src/mage/cards/o/Orgg.java
+++ b/Mage.Sets/src/mage/cards/o/Orgg.java
@@ -29,7 +29,7 @@ public final class Orgg extends CardImpl {
static final private FilterCreaturePermanent filter2 = new FilterCreaturePermanent("creatures with power 3 or greater");
static {
- filter.add(Predicates.and(new PowerPredicate(ComparisonType.MORE_THAN, 2), Predicates.not(new TappedPredicate())));
+ filter.add(Predicates.and(new PowerPredicate(ComparisonType.MORE_THAN, 2), Predicates.not(TappedPredicate.instance)));
filter2.add(new PowerPredicate(ComparisonType.MORE_THAN, 2));
}
public Orgg(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OrimsCure.java b/Mage.Sets/src/mage/cards/o/OrimsCure.java
index d80a0cbe503..d7b56148962 100644
--- a/Mage.Sets/src/mage/cards/o/OrimsCure.java
+++ b/Mage.Sets/src/mage/cards/o/OrimsCure.java
@@ -31,7 +31,7 @@ public final class OrimsCure extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.PLAINS));
- filterCreature.add(Predicates.not(new TappedPredicate()));
+ filterCreature.add(Predicates.not(TappedPredicate.instance));
}
public OrimsCure(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/OrimsThunder.java b/Mage.Sets/src/mage/cards/o/OrimsThunder.java
index ca705f089db..b1f8a47c077 100644
--- a/Mage.Sets/src/mage/cards/o/OrimsThunder.java
+++ b/Mage.Sets/src/mage/cards/o/OrimsThunder.java
@@ -3,7 +3,6 @@ package mage.cards.o;
import mage.MageObject;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.OneShotEffect;
@@ -18,17 +17,17 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import java.util.UUID;
/**
- *
* @author jeffwadsworth
*/
public final class OrimsThunder extends CardImpl {
public OrimsThunder(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}");
// Kicker {R}
this.addAbility(new KickerAbility("{R}"));
@@ -39,16 +38,9 @@ public final class OrimsThunder extends CardImpl {
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
new OrimsThunderEffect2(),
KickedCondition.instance,
- "If Orim's Thunder was kicked, it deals damage equal to that permanent's converted mana cost to target creature"));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- if (KickedCondition.instance.apply(game, ability)) {
- ability.addTarget(new TargetCreaturePermanent());
- }
- }
+ "If Orim's Thunder was kicked, it deals damage equal to that permanent's converted mana cost to target creature")
+ );
+ this.getSpellAbility().setTargetAdjuster(OrimsThunderAdjuster.instance);
}
public OrimsThunder(final OrimsThunder card) {
@@ -61,6 +53,18 @@ public final class OrimsThunder extends CardImpl {
}
}
+enum OrimsThunderAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.addTarget(new TargetCreaturePermanent());
+ }
+ }
+
+}
+
class OrimsThunderEffect2 extends OneShotEffect {
OrimsThunderEffect2() {
diff --git a/Mage.Sets/src/mage/cards/o/OrzhovEnforcer.java b/Mage.Sets/src/mage/cards/o/OrzhovEnforcer.java
new file mode 100644
index 00000000000..e944b3e15f5
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/o/OrzhovEnforcer.java
@@ -0,0 +1,41 @@
+package mage.cards.o;
+
+import mage.MageInt;
+import mage.abilities.keyword.AfterlifeAbility;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class OrzhovEnforcer extends CardImpl {
+
+ public OrzhovEnforcer(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.ROGUE);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // Deathtouch
+ this.addAbility(DeathtouchAbility.getInstance());
+
+ // Afterlife 1
+ this.addAbility(new AfterlifeAbility(1));
+ }
+
+ private OrzhovEnforcer(final OrzhovEnforcer card) {
+ super(card);
+ }
+
+ @Override
+ public OrzhovEnforcer copy() {
+ return new OrzhovEnforcer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/o/OrzhovLocket.java b/Mage.Sets/src/mage/cards/o/OrzhovLocket.java
new file mode 100644
index 00000000000..a660da2dd03
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/o/OrzhovLocket.java
@@ -0,0 +1,46 @@
+package mage.cards.o;
+
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Zone;
+
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class OrzhovLocket extends CardImpl {
+
+ public OrzhovLocket(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
+
+ // {T}: Add {W} or {B}.
+ this.addAbility(new WhiteManaAbility());
+ this.addAbility(new BlackManaAbility());
+
+ // {W/B}{W/B}{W/B}{W/B}, {T}, Sacrifice Orzhov Locket: Draw two cards.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new ManaCostsImpl<>("{W/B}{W/B}{W/B}{W/B}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public OrzhovLocket(final OrzhovLocket card) {
+ super(card);
+ }
+
+ @Override
+ public OrzhovLocket copy() {
+ return new OrzhovLocket(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/o/OrzhovRacketeers.java b/Mage.Sets/src/mage/cards/o/OrzhovRacketeers.java
new file mode 100644
index 00000000000..5c96b03a862
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/o/OrzhovRacketeers.java
@@ -0,0 +1,45 @@
+package mage.cards.o;
+
+import mage.MageInt;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.abilities.keyword.AfterlifeAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class OrzhovRacketeers extends CardImpl {
+
+ public OrzhovRacketeers(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.ROGUE);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Whenever Orzhov Racketeers deals combat damage to a player, that player discards a card.
+ this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
+ new DiscardTargetEffect(1), false, true
+ ));
+
+ // Afterlife 2
+ this.addAbility(new AfterlifeAbility(2));
+
+ }
+
+ private OrzhovRacketeers(final OrzhovRacketeers card) {
+ super(card);
+ }
+
+ @Override
+ public OrzhovRacketeers copy() {
+ return new OrzhovRacketeers(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/o/Outmaneuver.java b/Mage.Sets/src/mage/cards/o/Outmaneuver.java
index 3a604f97782..7e005e5bb7e 100644
--- a/Mage.Sets/src/mage/cards/o/Outmaneuver.java
+++ b/Mage.Sets/src/mage/cards/o/Outmaneuver.java
@@ -26,7 +26,7 @@ public final class Outmaneuver extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
- filter.add(new BlockedPredicate());
+ filter.add(BlockedPredicate.instance);
}
public Outmaneuver(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/Outwit.java b/Mage.Sets/src/mage/cards/o/Outwit.java
index 8ab33f01c90..5eeafbf2554 100644
--- a/Mage.Sets/src/mage/cards/o/Outwit.java
+++ b/Mage.Sets/src/mage/cards/o/Outwit.java
@@ -101,7 +101,7 @@ public final class Outwit extends CardImpl {
public boolean canChoose(UUID sourceControllerId, Game game) {
int count = 0;
for (StackObject stackObject : game.getStack()) {
- if (stackObject instanceof Spell && filter.match((Spell) stackObject, game)) {
+ if (stackObject instanceof Spell && filter.match(stackObject, game)) {
if (targetsPlayer(stackObject.getId(), game)) {
count++;
if (count >= this.minNumberOfTargets) {
@@ -117,7 +117,7 @@ public final class Outwit extends CardImpl {
public Set possibleTargets(UUID sourceControllerId, Game game) {
Set possibleTargets = new HashSet<>();
for (StackObject stackObject : game.getStack()) {
- if (stackObject instanceof Spell && filter.match((Spell) stackObject, game)) {
+ if (stackObject instanceof Spell && filter.match(stackObject, game)) {
if (targetsPlayer(stackObject.getId(), game)) {
possibleTargets.add(stackObject.getId());
}
diff --git a/Mage.Sets/src/mage/cards/o/OverbeingOfMyth.java b/Mage.Sets/src/mage/cards/o/OverbeingOfMyth.java
index c2b78462c69..6484e923032 100644
--- a/Mage.Sets/src/mage/cards/o/OverbeingOfMyth.java
+++ b/Mage.Sets/src/mage/cards/o/OverbeingOfMyth.java
@@ -33,7 +33,7 @@ public final class OverbeingOfMyth extends CardImpl {
this.toughness = new MageInt(0);
// Overbeing of Myth's power and toughness are each equal to the number of cards in your hand.
- DynamicValue number = new CardsInControllerHandCount();
+ DynamicValue number = CardsInControllerHandCount.instance;
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(number, Duration.EndOfGame)));
// At the beginning of your draw step, draw an additional card.
diff --git a/Mage.Sets/src/mage/cards/o/Overburden.java b/Mage.Sets/src/mage/cards/o/Overburden.java
index c41fad613f8..fb145c23318 100644
--- a/Mage.Sets/src/mage/cards/o/Overburden.java
+++ b/Mage.Sets/src/mage/cards/o/Overburden.java
@@ -25,7 +25,7 @@ public final class Overburden extends CardImpl {
private static final FilterControlledLandPermanent RETURN_FILTER = new FilterControlledLandPermanent("a land");
static {
- ENTERS_BATTLEFIELD_FILTER.add(Predicates.not(new TokenPredicate()));
+ ENTERS_BATTLEFIELD_FILTER.add(Predicates.not(TokenPredicate.instance));
}
public Overburden(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/o/Overmaster.java b/Mage.Sets/src/mage/cards/o/Overmaster.java
index b5c7fdb07b7..fdad1f76eda 100644
--- a/Mage.Sets/src/mage/cards/o/Overmaster.java
+++ b/Mage.Sets/src/mage/cards/o/Overmaster.java
@@ -67,7 +67,7 @@ class OvermasterEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public void init(Ability source, Game game) {
super.init(source, game);
- OvermasterWatcher watcher = (OvermasterWatcher) game.getState().getWatchers().get(OvermasterWatcher.class.getSimpleName(), source.getControllerId());
+ OvermasterWatcher watcher = game.getState().getWatcher(OvermasterWatcher.class, source.getControllerId());
if (watcher != null) {
watcher.setReady();
}
@@ -95,7 +95,7 @@ class OvermasterEffect extends ContinuousRuleModifyingEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
Spell spell = game.getStack().getSpell(event.getTargetId());
- OvermasterWatcher watcher = (OvermasterWatcher) game.getState().getWatchers().get(OvermasterWatcher.class.getSimpleName(), source.getControllerId());
+ OvermasterWatcher watcher = game.getState().getWatcher(OvermasterWatcher.class, source.getControllerId());
return spell != null && watcher != null && watcher.isUncounterable(spell.getId());
}
}
@@ -106,7 +106,7 @@ class OvermasterWatcher extends Watcher {
protected UUID uncounterableSpell;
OvermasterWatcher() {
- super(OvermasterWatcher.class.getSimpleName(), WatcherScope.PLAYER);
+ super(OvermasterWatcher.class, WatcherScope.PLAYER);
}
OvermasterWatcher(final OvermasterWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/o/Overrule.java b/Mage.Sets/src/mage/cards/o/Overrule.java
index 19b922b8467..5f92d8fd352 100644
--- a/Mage.Sets/src/mage/cards/o/Overrule.java
+++ b/Mage.Sets/src/mage/cards/o/Overrule.java
@@ -20,11 +20,11 @@ public final class Overrule extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{W}{U}");
// Counter target spell unless its controller pays {X}.
- this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetSpell());
// You gain X life.
- this.getSpellAbility().addEffect(new GainLifeEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new GainLifeEffect(ManacostVariableValue.instance));
}
public Overrule(final Overrule card) {
diff --git a/Mage.Sets/src/mage/cards/o/OverseerOfTheDamned.java b/Mage.Sets/src/mage/cards/o/OverseerOfTheDamned.java
index 9877dac2df8..a828ea6ca83 100644
--- a/Mage.Sets/src/mage/cards/o/OverseerOfTheDamned.java
+++ b/Mage.Sets/src/mage/cards/o/OverseerOfTheDamned.java
@@ -33,7 +33,7 @@ public final class OverseerOfTheDamned extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.OPPONENT));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public OverseerOfTheDamned(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PainKami.java b/Mage.Sets/src/mage/cards/p/PainKami.java
index f682910a9b7..68c11d11539 100644
--- a/Mage.Sets/src/mage/cards/p/PainKami.java
+++ b/Mage.Sets/src/mage/cards/p/PainKami.java
@@ -28,7 +28,7 @@ public final class PainKami extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}{R}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(ManacostVariableValue.instance), new ManaCostsImpl("{X}{R}"));
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/p/Painbringer.java b/Mage.Sets/src/mage/cards/p/Painbringer.java
index 02af94d9bc2..bc415a2ba1a 100644
--- a/Mage.Sets/src/mage/cards/p/Painbringer.java
+++ b/Mage.Sets/src/mage/cards/p/Painbringer.java
@@ -35,7 +35,7 @@ public final class Painbringer extends CardImpl {
this.toughness = new MageInt(1);
// {tap}, Exile any number of cards from your graveyard: Target creature gets -X/-X until end of turn, where X is the number of cards exiled this way.
- DynamicValue X = new SignInversionDynamicValue(new GetXValue());
+ DynamicValue X = new SignInversionDynamicValue(GetXValue.instance);
Effect effect = new BoostTargetEffect(X, X, Duration.EndOfTurn);
effect.setText("Target creature gets -X/-X until end of turn, where X is the number of cards exiled this way");
Ability ability = new SimpleActivatedAbility(effect, new TapSourceCost());
diff --git a/Mage.Sets/src/mage/cards/p/Paleoloth.java b/Mage.Sets/src/mage/cards/p/Paleoloth.java
index 2a702d824ec..a7650a5bbeb 100644
--- a/Mage.Sets/src/mage/cards/p/Paleoloth.java
+++ b/Mage.Sets/src/mage/cards/p/Paleoloth.java
@@ -28,7 +28,7 @@ public final class Paleoloth extends CardImpl {
static {
filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 4));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
private static final String rule = "Whenever another creature with power 5 or greater enters the battlefield under your control, you may return target creature card from your graveyard to your hand.";
diff --git a/Mage.Sets/src/mage/cards/p/PalladiaMorsTheRuiner.java b/Mage.Sets/src/mage/cards/p/PalladiaMorsTheRuiner.java
index 0ce811c3ee0..6289cd9a4cb 100644
--- a/Mage.Sets/src/mage/cards/p/PalladiaMorsTheRuiner.java
+++ b/Mage.Sets/src/mage/cards/p/PalladiaMorsTheRuiner.java
@@ -78,7 +78,7 @@ enum PalladiaMorsTheRuinerCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getBattlefield().getPermanent(source.getSourceId());
- PalladiaMorsTheRuinerWatcher watcher = (PalladiaMorsTheRuinerWatcher) game.getState().getWatchers().get(PalladiaMorsTheRuinerWatcher.class.getSimpleName());
+ PalladiaMorsTheRuinerWatcher watcher = game.getState().getWatcher(PalladiaMorsTheRuinerWatcher.class);
return permanent != null && !watcher.getDamagers().contains(new MageObjectReference(permanent, game));
}
@@ -94,7 +94,7 @@ class PalladiaMorsTheRuinerWatcher extends Watcher {
private final Set damagers = new HashSet();
public PalladiaMorsTheRuinerWatcher() {
- super(PalladiaMorsTheRuinerWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(PalladiaMorsTheRuinerWatcher.class, WatcherScope.GAME);
}
public PalladiaMorsTheRuinerWatcher(final PalladiaMorsTheRuinerWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/p/Pallimud.java b/Mage.Sets/src/mage/cards/p/Pallimud.java
index 780b62129b7..92603a715fb 100644
--- a/Mage.Sets/src/mage/cards/p/Pallimud.java
+++ b/Mage.Sets/src/mage/cards/p/Pallimud.java
@@ -61,7 +61,7 @@ class AnathemancerCount implements DynamicValue {
Player chosenPlayer = game.getPlayer(playerId);
if (chosenPlayer != null) {
FilterLandPermanent filter = new FilterLandPermanent("tapped lands the chosen player controls");
- filter.add(new TappedPredicate());
+ filter.add(TappedPredicate.instance);
filter.add(new ControllerIdPredicate(playerId));
return game.getBattlefield().count(filter, sourceAbility.getSourceId(), sourceAbility.getControllerId(), game);
}
diff --git a/Mage.Sets/src/mage/cards/p/Panacea.java b/Mage.Sets/src/mage/cards/p/Panacea.java
index 70de0178e61..099c2d61c00 100644
--- a/Mage.Sets/src/mage/cards/p/Panacea.java
+++ b/Mage.Sets/src/mage/cards/p/Panacea.java
@@ -25,7 +25,7 @@ public final class Panacea extends CardImpl {
// {X}{X}, {tap}: Prevent the next X damage that would be dealt to any target this turn.
Ability ability = new SimpleActivatedAbility(
- new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, new ManacostVariableValue()),
+ new PreventDamageToTargetEffect(Duration.EndOfTurn, false, true, ManacostVariableValue.instance),
new ManaCostsImpl("{X}{X}")
);
ability.addCost(new TapSourceCost());
diff --git a/Mage.Sets/src/mage/cards/p/Pandemonium.java b/Mage.Sets/src/mage/cards/p/Pandemonium.java
index 82d3bfefe32..581cb03e134 100644
--- a/Mage.Sets/src/mage/cards/p/Pandemonium.java
+++ b/Mage.Sets/src/mage/cards/p/Pandemonium.java
@@ -1,7 +1,6 @@
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
@@ -16,39 +15,31 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetAnyTarget;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author LevelX2
*/
public final class Pandemonium extends CardImpl {
- private final UUID originalId;
-
public Pandemonium(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}");
// Whenever a creature enters the battlefield, that creature's controller may have it deal damage equal to its power to any target of their choice.
- Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new PandemoniumEffect(), StaticFilters.FILTER_PERMANENT_CREATURE, false, SetTargetPointer.PERMANENT, "");
+ Ability ability = new EntersBattlefieldAllTriggeredAbility(
+ Zone.BATTLEFIELD, new PandemoniumEffect(),
+ StaticFilters.FILTER_PERMANENT_CREATURE,
+ false, SetTargetPointer.PERMANENT, ""
+ );
ability.addTarget(new TargetAnyTarget());
- originalId = ability.getOriginalId();
+ ability.setTargetAdjuster(PandemoniumAdjuster.instance);
this.addAbility(ability);
}
public Pandemonium(final Pandemonium card) {
super(card);
- this.originalId = card.originalId;
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- UUID creatureId = ability.getEffects().get(0).getTargetPointer().getFirst(game, ability);
- Permanent creature = game.getPermanent(creatureId);
- if (creature != null) {
- ability.getTargets().get(0).setTargetController(creature.getControllerId());
- }
- }
}
@Override
@@ -57,6 +48,19 @@ public final class Pandemonium extends CardImpl {
}
}
+enum PandemoniumAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ UUID creatureId = ability.getEffects().get(0).getTargetPointer().getFirst(game, ability);
+ Permanent creature = game.getPermanent(creatureId);
+ if (creature != null) {
+ ability.getTargets().get(0).setTargetController(creature.getControllerId());
+ }
+ }
+}
+
class PandemoniumEffect extends OneShotEffect {
public PandemoniumEffect() {
diff --git a/Mage.Sets/src/mage/cards/p/PanicSpellbomb.java b/Mage.Sets/src/mage/cards/p/PanicSpellbomb.java
index 1b44b323f97..f6fbf675d4a 100644
--- a/Mage.Sets/src/mage/cards/p/PanicSpellbomb.java
+++ b/Mage.Sets/src/mage/cards/p/PanicSpellbomb.java
@@ -1,7 +1,5 @@
-
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
@@ -18,14 +16,15 @@ import mage.constants.Duration;
import mage.constants.Zone;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author North
*/
public final class PanicSpellbomb extends CardImpl {
public PanicSpellbomb(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}");
// Tap, Sacrifice Panic Spellbomb: Target creature can't block this turn.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBlockTargetEffect(Duration.EndOfTurn), new TapSourceCost());
@@ -34,7 +33,7 @@ public final class PanicSpellbomb extends CardImpl {
this.addAbility(ability);
// When Panic Spellbomb is put into a graveyard from the battlefield, you may pay Red. If you do, draw a card.
- this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{R}")), false));
+ this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{R}")), false, false));
}
public PanicSpellbomb(final PanicSpellbomb card) {
diff --git a/Mage.Sets/src/mage/cards/p/ParadoxHaze.java b/Mage.Sets/src/mage/cards/p/ParadoxHaze.java
index eb98a98e32b..6262d3d2589 100644
--- a/Mage.Sets/src/mage/cards/p/ParadoxHaze.java
+++ b/Mage.Sets/src/mage/cards/p/ParadoxHaze.java
@@ -80,7 +80,7 @@ class ParadoxHazeTriggeredAbility extends TriggeredAbilityImpl {
if (permanent != null) {
Player player = game.getPlayer(permanent.getAttachedTo());
if (player != null && game.isActivePlayer(player.getId())) {
- FirstTimeStepWatcher watcher = (FirstTimeStepWatcher) game.getState().getWatchers().get(EventType.UPKEEP_STEP_POST.toString() + FirstTimeStepWatcher.class.getSimpleName());
+ FirstTimeStepWatcher watcher = game.getState().getWatcher(FirstTimeStepWatcher.class, EventType.UPKEEP_STEP_POST.toString());
if (watcher != null && !watcher.conditionMet()) {
this.getEffects().get(0).setTargetPointer(new FixedTarget(player.getId()));
return true;
diff --git a/Mage.Sets/src/mage/cards/p/ParadoxicalOutcome.java b/Mage.Sets/src/mage/cards/p/ParadoxicalOutcome.java
index daa98056f01..5580ac75a1d 100644
--- a/Mage.Sets/src/mage/cards/p/ParadoxicalOutcome.java
+++ b/Mage.Sets/src/mage/cards/p/ParadoxicalOutcome.java
@@ -34,7 +34,7 @@ public final class ParadoxicalOutcome extends CardImpl {
static {
filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public ParadoxicalOutcome(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/ParagonOfEternalWilds.java b/Mage.Sets/src/mage/cards/p/ParagonOfEternalWilds.java
index 572ffc20ec4..c470aa6daec 100644
--- a/Mage.Sets/src/mage/cards/p/ParagonOfEternalWilds.java
+++ b/Mage.Sets/src/mage/cards/p/ParagonOfEternalWilds.java
@@ -39,7 +39,7 @@ public final class ParagonOfEternalWilds extends CardImpl {
filterGreen.add(new ColorPredicate(ObjectColor.GREEN));
filterGreen.add(new ControllerPredicate(TargetController.YOU));
filterGreen2.add(new ColorPredicate(ObjectColor.GREEN));
- filterGreen2.add(new AnotherPredicate());
+ filterGreen2.add(AnotherPredicate.instance);
}
public ParagonOfEternalWilds(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/ParagonOfFierceDefiance.java b/Mage.Sets/src/mage/cards/p/ParagonOfFierceDefiance.java
index c1fb7a9296a..d88970bc0b5 100644
--- a/Mage.Sets/src/mage/cards/p/ParagonOfFierceDefiance.java
+++ b/Mage.Sets/src/mage/cards/p/ParagonOfFierceDefiance.java
@@ -35,7 +35,7 @@ public final class ParagonOfFierceDefiance extends CardImpl {
static {
filterCreatures.add(new ColorPredicate(ObjectColor.RED));
- filterCreature.add(new AnotherPredicate());
+ filterCreature.add(AnotherPredicate.instance);
filterCreature.add(new ColorPredicate(ObjectColor.RED));
}
diff --git a/Mage.Sets/src/mage/cards/p/ParagonOfGatheringMists.java b/Mage.Sets/src/mage/cards/p/ParagonOfGatheringMists.java
index 17c8b02393c..c25d4921ded 100644
--- a/Mage.Sets/src/mage/cards/p/ParagonOfGatheringMists.java
+++ b/Mage.Sets/src/mage/cards/p/ParagonOfGatheringMists.java
@@ -39,7 +39,7 @@ public final class ParagonOfGatheringMists extends CardImpl {
filterBlue.add(new ColorPredicate(ObjectColor.BLUE));
filterBlue.add(new ControllerPredicate(TargetController.YOU));
filterBlue2.add(new ColorPredicate(ObjectColor.BLUE));
- filterBlue2.add(new AnotherPredicate());
+ filterBlue2.add(AnotherPredicate.instance);
}
public ParagonOfGatheringMists(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/ParagonOfNewDawns.java b/Mage.Sets/src/mage/cards/p/ParagonOfNewDawns.java
index 7ae03275b0f..a186d548cb0 100644
--- a/Mage.Sets/src/mage/cards/p/ParagonOfNewDawns.java
+++ b/Mage.Sets/src/mage/cards/p/ParagonOfNewDawns.java
@@ -37,7 +37,7 @@ public final class ParagonOfNewDawns extends CardImpl {
static {
filter.add(new ColorPredicate(ObjectColor.WHITE));
filter.add(new ControllerPredicate(TargetController.YOU));
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
filter2.add(new ColorPredicate(ObjectColor.WHITE));
filter2.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/p/ParagonOfOpenGraves.java b/Mage.Sets/src/mage/cards/p/ParagonOfOpenGraves.java
index d8a89099933..a23b31ee287 100644
--- a/Mage.Sets/src/mage/cards/p/ParagonOfOpenGraves.java
+++ b/Mage.Sets/src/mage/cards/p/ParagonOfOpenGraves.java
@@ -35,7 +35,7 @@ public final class ParagonOfOpenGraves extends CardImpl {
static {
filterCreatures.add(new ColorPredicate(ObjectColor.BLACK));
- filterCreature.add(new AnotherPredicate());
+ filterCreature.add(AnotherPredicate.instance);
filterCreature.add(new ColorPredicate(ObjectColor.BLACK));
}
diff --git a/Mage.Sets/src/mage/cards/p/ParallelEvolution.java b/Mage.Sets/src/mage/cards/p/ParallelEvolution.java
index 9fbccfd9754..84af3037c4e 100644
--- a/Mage.Sets/src/mage/cards/p/ParallelEvolution.java
+++ b/Mage.Sets/src/mage/cards/p/ParallelEvolution.java
@@ -51,7 +51,7 @@ class ParallelEvolutionEffect extends OneShotEffect {
static {
filter.add(new CardTypePredicate(CardType.CREATURE));
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
}
public ParallelEvolutionEffect() {
diff --git a/Mage.Sets/src/mage/cards/p/Paroxysm.java b/Mage.Sets/src/mage/cards/p/Paroxysm.java
index 753951b5c18..d24b2e9b276 100644
--- a/Mage.Sets/src/mage/cards/p/Paroxysm.java
+++ b/Mage.Sets/src/mage/cards/p/Paroxysm.java
@@ -1,111 +1,111 @@
-package mage.cards.p;
-
-import java.util.UUID;
-import mage.constants.SubType;
-import mage.target.common.TargetCreaturePermanent;
-import mage.abilities.Ability;
-import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
-import mage.abilities.effects.ContinuousEffect;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.AttachEffect;
-import mage.abilities.effects.common.continuous.BoostTargetEffect;
-import mage.constants.Outcome;
-import mage.target.TargetPermanent;
-import mage.abilities.keyword.EnchantAbility;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.TargetController;
-import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
-import mage.target.targetpointer.FixedTarget;
-
-/**
- *
- * @author jeffwadsworth
- */
-public final class Paroxysm extends CardImpl {
-
- public Paroxysm(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
-
- this.subtype.add(SubType.AURA);
-
- // Enchant creature
- TargetPermanent auraTarget = new TargetCreaturePermanent();
- this.getSpellAbility().addTarget(auraTarget);
- this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- Ability ability = new EnchantAbility(auraTarget.getTargetName());
- this.addAbility(ability);
-
- // At the beginning of the upkeep of enchanted creature's controller, that player reveals the top card of his or her library.
- // If that card is a land card, destroy that creature. Otherwise, it gets +3/+3 until end of turn.
- this.addAbility(new BeginningOfUpkeepTriggeredAbility(
- Zone.BATTLEFIELD,
- new ParoxysmEffect(),
- TargetController.CONTROLLER_ATTACHED_TO,
- false, false, "At the beginning of the upkeep of enchanted creature's controller, "));
- }
-
- public Paroxysm(final Paroxysm card) {
- super(card);
- }
-
- @Override
- public Paroxysm copy() {
- return new Paroxysm(this);
- }
-}
-
-class ParoxysmEffect extends OneShotEffect {
-
- ParoxysmEffect() {
- super(Outcome.BoostCreature);
- this.staticText = "that player reveals the top card of his or her library. \n"
- + "If that card is a land card, destroy that creature. \n"
- + "Otherwise, it gets +3/+3 until end of turn.";
- }
-
- ParoxysmEffect(final ParoxysmEffect effect) {
- super(effect);
- }
-
- @Override
- public ParoxysmEffect copy() {
- return new ParoxysmEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent aura = game.getPermanent(source.getSourceId());
- if (aura != null) {
- Permanent creatureAttachedTo = game.getPermanent(aura.getAttachedTo());
- if (creatureAttachedTo != null) {
- Player controllerOfCreature = game.getPlayer(creatureAttachedTo.getControllerId());
- if (controllerOfCreature != null) {
- Card revealCardFromTop = controllerOfCreature.getLibrary().getFromTop(game);
- if (revealCardFromTop != null) {
- Cards cards = new CardsImpl();
- cards.add(revealCardFromTop);
- controllerOfCreature.revealCards(source, cards, game);
- if (revealCardFromTop.isLand()) {
- creatureAttachedTo.destroy(source.getSourceId(), game, false);
- } else {
- ContinuousEffect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn);
- effect.setTargetPointer(new FixedTarget(creatureAttachedTo.getId()));
- game.addEffect(effect, source);
- }
- return true;
- }
- }
- }
- }
- return false;
- }
-}
+package mage.cards.p;
+
+import java.util.UUID;
+import mage.constants.SubType;
+import mage.target.common.TargetCreaturePermanent;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.constants.Outcome;
+import mage.target.TargetPermanent;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class Paroxysm extends CardImpl {
+
+ public Paroxysm(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
+
+ this.subtype.add(SubType.AURA);
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // At the beginning of the upkeep of enchanted creature's controller, that player reveals the top card of their library.
+ // If that card is a land card, destroy that creature. Otherwise, it gets +3/+3 until end of turn.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ Zone.BATTLEFIELD,
+ new ParoxysmEffect(),
+ TargetController.CONTROLLER_ATTACHED_TO,
+ false, false, "At the beginning of the upkeep of enchanted creature's controller, "));
+ }
+
+ public Paroxysm(final Paroxysm card) {
+ super(card);
+ }
+
+ @Override
+ public Paroxysm copy() {
+ return new Paroxysm(this);
+ }
+}
+
+class ParoxysmEffect extends OneShotEffect {
+
+ ParoxysmEffect() {
+ super(Outcome.BoostCreature);
+ this.staticText = "that player reveals the top card of their library. \n"
+ + "If that card is a land card, destroy that creature. \n"
+ + "Otherwise, it gets +3/+3 until end of turn.";
+ }
+
+ ParoxysmEffect(final ParoxysmEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ParoxysmEffect copy() {
+ return new ParoxysmEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent aura = game.getPermanent(source.getSourceId());
+ if (aura != null) {
+ Permanent creatureAttachedTo = game.getPermanent(aura.getAttachedTo());
+ if (creatureAttachedTo != null) {
+ Player controllerOfCreature = game.getPlayer(creatureAttachedTo.getControllerId());
+ if (controllerOfCreature != null) {
+ Card revealCardFromTop = controllerOfCreature.getLibrary().getFromTop(game);
+ if (revealCardFromTop != null) {
+ Cards cards = new CardsImpl();
+ cards.add(revealCardFromTop);
+ controllerOfCreature.revealCards(source, cards, game);
+ if (revealCardFromTop.isLand()) {
+ creatureAttachedTo.destroy(source.getSourceId(), game, false);
+ } else {
+ ContinuousEffect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn);
+ effect.setTargetPointer(new FixedTarget(creatureAttachedTo.getId()));
+ game.addEffect(effect, source);
+ }
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PartWater.java b/Mage.Sets/src/mage/cards/p/PartWater.java
index 0e7c6c11b1e..47afdfb31e1 100644
--- a/Mage.Sets/src/mage/cards/p/PartWater.java
+++ b/Mage.Sets/src/mage/cards/p/PartWater.java
@@ -1,9 +1,7 @@
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.IslandwalkAbility;
@@ -11,34 +9,26 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class PartWater extends CardImpl {
public PartWater(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{X}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{X}{U}");
// X target creatures gain islandwalk until end of turn.
Effect effect = new GainAbilityTargetEffect(new IslandwalkAbility(false), Duration.EndOfTurn);
effect.setText("X target creatures gain islandwalk until end of turn");
this.getSpellAbility().getEffects().add(effect);
- this.getSpellAbility().getTargets().add(new TargetCreaturePermanent(1,1));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain islandwalk until end of turn");
- ability.getTargets().add(new TargetCreaturePermanent(0, xValue, filter, false));
- }
+ this.getSpellAbility().getTargets().add(new TargetCreaturePermanent());
+ this.getSpellAbility().setTargetAdjuster(PartWaterAdjuster.instance);
}
public PartWater(final PartWater card) {
@@ -50,3 +40,13 @@ public final class PartWater extends CardImpl {
return new PartWater(this);
}
}
+
+enum PartWaterAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.getTargets().add(new TargetCreaturePermanent(ability.getManaCostsToPay().getX()));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/p/PastInFlames.java b/Mage.Sets/src/mage/cards/p/PastInFlames.java
index 77ac3bb1d26..627aa8791b6 100644
--- a/Mage.Sets/src/mage/cards/p/PastInFlames.java
+++ b/Mage.Sets/src/mage/cards/p/PastInFlames.java
@@ -1,7 +1,5 @@
-
package mage.cards.p;
-import java.util.UUID;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
@@ -10,23 +8,19 @@ import mage.abilities.keyword.FlashbackAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Layer;
-import mage.constants.Outcome;
-import mage.constants.SubLayer;
-import mage.constants.TimingRule;
+import mage.constants.*;
import mage.game.Game;
import mage.players.Player;
+import java.util.UUID;
+
/**
- *
* @author BetaSteward
*/
public final class PastInFlames extends CardImpl {
public PastInFlames(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{R}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}");
// Each instant and sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost.
@@ -72,7 +66,7 @@ class PastInFlamesEffect extends ContinuousEffectImpl {
player.getGraveyard().stream().map((cardId) -> game.getCard(cardId)).filter((card) -> (card.isInstant() || card.isSorcery())).forEachOrdered((card) -> {
affectedObjectList.add(new MageObjectReference(card, game));
});
- }
+ }
}
}
@@ -82,17 +76,18 @@ class PastInFlamesEffect extends ContinuousEffectImpl {
if (player != null) {
player.getGraveyard().stream().filter((cardId) -> (affectedObjectList.contains(new MageObjectReference(cardId, game)))).forEachOrdered((cardId) -> {
Card card = game.getCard(cardId);
- FlashbackAbility ability = null;
- if (card.isInstant()) {
- ability = new FlashbackAbility(card.getManaCost(), TimingRule.INSTANT);
- }
- else if (card.isSorcery()) {
- ability = new FlashbackAbility(card.getManaCost(), TimingRule.SORCERY);
- }
- if (ability != null) {
- ability.setSourceId(cardId);
- ability.setControllerId(card.getOwnerId());
- game.getState().addOtherAbility(card, ability);
+ if (card != null) {
+ FlashbackAbility ability = null;
+ if (card.isInstant()) {
+ ability = new FlashbackAbility(card.getManaCost(), TimingRule.INSTANT);
+ } else if (card.isSorcery()) {
+ ability = new FlashbackAbility(card.getManaCost(), TimingRule.SORCERY);
+ }
+ if (ability != null) {
+ ability.setSourceId(cardId);
+ ability.setControllerId(card.getOwnerId());
+ game.getState().addOtherAbility(card, ability);
+ }
}
});
return true;
diff --git a/Mage.Sets/src/mage/cards/p/PatriciansScorn.java b/Mage.Sets/src/mage/cards/p/PatriciansScorn.java
index 0aed2b41deb..12cecad6c17 100644
--- a/Mage.Sets/src/mage/cards/p/PatriciansScorn.java
+++ b/Mage.Sets/src/mage/cards/p/PatriciansScorn.java
@@ -52,7 +52,7 @@ class CastWhiteSpellThisTurnCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PatriciansScornWatcher watcher = (PatriciansScornWatcher) game.getState().getWatchers().get(PatriciansScornWatcher.class.getSimpleName(), source.getSourceId());
+ PatriciansScornWatcher watcher = game.getState().getWatcher(PatriciansScornWatcher.class, source.getSourceId());
if (watcher != null) {
return watcher.conditionMet();
}
@@ -73,7 +73,7 @@ class PatriciansScornWatcher extends Watcher {
}
public PatriciansScornWatcher() {
- super(PatriciansScornWatcher.class.getSimpleName(), WatcherScope.CARD);
+ super(PatriciansScornWatcher.class, WatcherScope.CARD);
}
public PatriciansScornWatcher(final PatriciansScornWatcher watcher) {
@@ -98,8 +98,4 @@ class PatriciansScornWatcher extends Watcher {
}
}
- @Override
- public void reset() {
- super.reset();
- }
}
diff --git a/Mage.Sets/src/mage/cards/p/PatronWizard.java b/Mage.Sets/src/mage/cards/p/PatronWizard.java
index 04b436b596f..2e447eb0941 100644
--- a/Mage.Sets/src/mage/cards/p/PatronWizard.java
+++ b/Mage.Sets/src/mage/cards/p/PatronWizard.java
@@ -30,7 +30,7 @@ public final class PatronWizard extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.WIZARD));
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
public PatronWizard(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PeacewalkerColossus.java b/Mage.Sets/src/mage/cards/p/PeacewalkerColossus.java
index 7ce316dfdd6..6792fca6dad 100644
--- a/Mage.Sets/src/mage/cards/p/PeacewalkerColossus.java
+++ b/Mage.Sets/src/mage/cards/p/PeacewalkerColossus.java
@@ -29,7 +29,7 @@ public final class PeacewalkerColossus extends CardImpl {
private static final FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent("another target vehicle");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.VEHICLE));
}
diff --git a/Mage.Sets/src/mage/cards/p/PeemaAetherSeer.java b/Mage.Sets/src/mage/cards/p/PeemaAetherSeer.java
index 4d87ffe9848..84b1f2598e8 100644
--- a/Mage.Sets/src/mage/cards/p/PeemaAetherSeer.java
+++ b/Mage.Sets/src/mage/cards/p/PeemaAetherSeer.java
@@ -34,7 +34,7 @@ public final class PeemaAetherSeer extends CardImpl {
this.toughness = new MageInt(2);
// When Peema Aether-Seer enters the battlefield, you get an amount of {E} equal to the greatest power among creatures you control.
- Effect effect = new GetEnergyCountersControllerEffect(new GreatestPowerAmongControlledCreaturesValue());
+ Effect effect = new GetEnergyCountersControllerEffect(GreatestPowerAmongControlledCreaturesValue.instance);
effect.setText("you get an amount of {E} equal to the greatest power among creatures you control");
this.addAbility(new EntersBattlefieldTriggeredAbility(effect));
diff --git a/Mage.Sets/src/mage/cards/p/PegasusCourser.java b/Mage.Sets/src/mage/cards/p/PegasusCourser.java
index 0388865a9c0..6dbfdc659f7 100644
--- a/Mage.Sets/src/mage/cards/p/PegasusCourser.java
+++ b/Mage.Sets/src/mage/cards/p/PegasusCourser.java
@@ -25,7 +25,7 @@ public final class PegasusCourser extends CardImpl {
static final FilterAttackingCreature filter = new FilterAttackingCreature("another target attacking creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public PegasusCourser(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PermafrostTrap.java b/Mage.Sets/src/mage/cards/p/PermafrostTrap.java
index 0d6462c7fd1..f336a14f5eb 100644
--- a/Mage.Sets/src/mage/cards/p/PermafrostTrap.java
+++ b/Mage.Sets/src/mage/cards/p/PermafrostTrap.java
@@ -54,7 +54,7 @@ enum PermafrostTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- PermanentsEnteredBattlefieldWatcher watcher = (PermanentsEnteredBattlefieldWatcher) game.getState().getWatchers().get(PermanentsEnteredBattlefieldWatcher.class.getSimpleName());
+ PermanentsEnteredBattlefieldWatcher watcher = game.getState().getWatcher(PermanentsEnteredBattlefieldWatcher.class);
if (watcher != null) {
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
List permanents = watcher.getThisTurnEnteringPermanents(opponentId);
diff --git a/Mage.Sets/src/mage/cards/p/PersistentPetitioners.java b/Mage.Sets/src/mage/cards/p/PersistentPetitioners.java
new file mode 100644
index 00000000000..d3548d6bee9
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PersistentPetitioners.java
@@ -0,0 +1,75 @@
+package mage.cards.p;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.common.TapTargetCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.InfoEffect;
+import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.TappedPredicate;
+import mage.target.TargetPlayer;
+import mage.target.common.TargetControlledPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class PersistentPetitioners extends CardImpl {
+
+ private static final FilterControlledPermanent filter
+ = new FilterControlledPermanent("untapped Advisors you control");
+
+ static {
+ filter.add(Predicates.not(TappedPredicate.instance));
+ filter.add(new SubtypePredicate(SubType.ADVISOR));
+ }
+
+ public PersistentPetitioners(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.ADVISOR);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(3);
+
+ // {1}, {T}: Target player puts the top card of their library into their graveyard.
+ Ability ability = new SimpleActivatedAbility(
+ new PutLibraryIntoGraveTargetEffect(1), new GenericManaCost(1)
+ );
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+
+ // Tap four untapped Advisors you control: Target player puts the top twelve cards of their library into their graveyard.
+ ability = new SimpleActivatedAbility(
+ new PutLibraryIntoGraveTargetEffect(12),
+ new TapTargetCost(new TargetControlledPermanent(
+ 4, 4, filter, true
+ ))
+ );
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+
+ // A deck can have any number of cards named Persistent Petitioners.
+ this.getSpellAbility().addEffect(new InfoEffect("A deck can have any number of cards named Persistent Petitioners."));
+ }
+
+ private PersistentPetitioners(final PersistentPetitioners card) {
+ super(card);
+ }
+
+ @Override
+ public PersistentPetitioners copy() {
+ return new PersistentPetitioners(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PestilentSpirit.java b/Mage.Sets/src/mage/cards/p/PestilentSpirit.java
new file mode 100644
index 00000000000..56f1611be3b
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PestilentSpirit.java
@@ -0,0 +1,63 @@
+package mage.cards.p;
+
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.GainAbilitySpellsEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.abilities.keyword.MenaceAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.filter.FilterObject;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class PestilentSpirit extends CardImpl {
+
+ private static final FilterObject filter = new FilterObject("instant and sorcery spells you control");
+
+ static {
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.INSTANT),
+ new CardTypePredicate(CardType.SORCERY)
+ ));
+ }
+
+ public PestilentSpirit(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
+
+ this.subtype.add(SubType.SPIRIT);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Menace
+ this.addAbility(new MenaceAbility());
+
+ // Deathtouch
+ this.addAbility(DeathtouchAbility.getInstance());
+
+ // Instant and sorcery spells you control have deathtouch.
+ this.addAbility(new SimpleStaticAbility(
+ Zone.BATTLEFIELD,
+ new GainAbilitySpellsEffect(
+ DeathtouchAbility.getInstance(), filter
+ ).setText("Instant and sorcery spells you control have deathtouch")
+ ));
+ }
+
+ private PestilentSpirit(final PestilentSpirit card) {
+ super(card);
+ }
+
+ @Override
+ public PestilentSpirit copy() {
+ return new PestilentSpirit(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java b/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java
index 85812a645e7..167b6d2ba11 100644
--- a/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java
+++ b/Mage.Sets/src/mage/cards/p/PetalmaneBaku.java
@@ -37,7 +37,7 @@ public final class PetalmaneBaku extends CardImpl {
// {1}, Remove X ki counters from Petalmane Baku: Add X mana of any one color.
Ability ability = new DynamicManaAbility(
new Mana(0, 0, 0, 0, 0, 0, 1, 0),
- new RemovedCountersForCostValue(),
+ RemovedCountersForCostValue.instance,
new ManaCostsImpl<>("{1}"),
"Add X mana of any one color",
true, new CountersSourceCount(CounterType.KI));
diff --git a/Mage.Sets/src/mage/cards/p/PetrifiedWoodKin.java b/Mage.Sets/src/mage/cards/p/PetrifiedWoodKin.java
index cd47ad163c9..7894efcd3f1 100644
--- a/Mage.Sets/src/mage/cards/p/PetrifiedWoodKin.java
+++ b/Mage.Sets/src/mage/cards/p/PetrifiedWoodKin.java
@@ -82,7 +82,7 @@ class PetrifiedWoodKinEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
- DamageDoneWatcher watcher = (DamageDoneWatcher) game.getState().getWatchers().get(DamageDoneWatcher.class.getSimpleName());
+ DamageDoneWatcher watcher = game.getState().getWatcher(DamageDoneWatcher.class);
Permanent permanent = game.getPermanentEntering(source.getSourceId());
if (player == null || watcher == null || permanent == null) {
return false;
diff --git a/Mage.Sets/src/mage/cards/p/PhantasmalImage.java b/Mage.Sets/src/mage/cards/p/PhantasmalImage.java
index 003ff68f888..9c0b2db68f8 100644
--- a/Mage.Sets/src/mage/cards/p/PhantasmalImage.java
+++ b/Mage.Sets/src/mage/cards/p/PhantasmalImage.java
@@ -21,14 +21,13 @@ import mage.util.functions.ApplyToPermanent;
import java.util.UUID;
/**
- *
* @author North
*/
public final class PhantasmalImage extends CardImpl {
private static final String effectText = "a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it has \"When this creature becomes the target of a spell or ability, sacrifice it.\"";
- ApplyToPermanent phantasmalImageApplier = new ApplyToPermanent() {
+ private static final ApplyToPermanent phantasmalImageApplier = new ApplyToPermanent() {
@Override
public boolean apply(Game game, Permanent permanent, Ability source, UUID copyToObjectId) {
if (!permanent.hasSubtype(SubType.ILLUSION, game)) {
diff --git a/Mage.Sets/src/mage/cards/p/PhantasmalMount.java b/Mage.Sets/src/mage/cards/p/PhantasmalMount.java
new file mode 100644
index 00000000000..549941c397c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PhantasmalMount.java
@@ -0,0 +1,156 @@
+package mage.cards.p;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.DelayedTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.SacrificeTargetEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.constants.SubType;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.ToughnessPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public final class PhantasmalMount extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("with toughness 2 or less");
+
+ static {
+ filter.add(new ToughnessPredicate(ComparisonType.FEWER_THAN, 3));
+ }
+
+ public PhantasmalMount(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
+
+ this.subtype.add(SubType.ILLUSION);
+ this.subtype.add(SubType.HORSE);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // {tap}: Target creature you control with toughness 2 or less gets +1/+1 and gains flying until end of turn. When Phantasmal Mount leaves the battlefield this turn, sacrifice that creature. When the creature leaves the battlefield this turn, sacrifice Phantasmal Mount.
+ Ability activatedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PhantasmalMountEffect(), new TapSourceCost());
+ activatedAbility.addTarget(new TargetControlledCreaturePermanent(filter));
+ this.addAbility(activatedAbility);
+
+ }
+
+ private PhantasmalMount(final PhantasmalMount card) {
+ super(card);
+ }
+
+ @Override
+ public PhantasmalMount copy() {
+ return new PhantasmalMount(this);
+ }
+}
+
+class PhantasmalMountEffect extends OneShotEffect {
+
+ PhantasmalMountEffect() {
+ super(Outcome.Neutral);
+ staticText = "Target creature you control with toughness 2 or less gets +1/+1 "
+ + "and gains flying until end of turn. When {this} leaves the battlefield this turn, "
+ + "sacrifice that creature. When the creature leaves the battlefield this turn, sacrifice {this}";
+ }
+
+ PhantasmalMountEffect(PhantasmalMountEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent targetCreature = game.getPermanent(source.getFirstTarget());
+ if (targetCreature != null) {
+ ContinuousEffect effect = new BoostTargetEffect(1, 1, Duration.EndOfTurn);
+ effect.setTargetPointer(new FixedTarget(source.getFirstTarget()));
+ game.addEffect(effect, source);
+ Effect sacrificeCreatureEffect = new SacrificeTargetEffect();
+ Effect sacrificePhantasmalMountEffect = new SacrificeTargetEffect();
+ ContinuousEffect gainAbility = new GainAbilityTargetEffect(FlyingAbility.getInstance(), Duration.EndOfTurn);
+ gainAbility.setTargetPointer(new FixedTarget(source.getFirstTarget()));
+ game.addEffect(gainAbility, source);
+ sacrificeCreatureEffect.setTargetPointer(new FixedTarget(source.getFirstTarget()));
+ sacrificePhantasmalMountEffect.setTargetPointer(new FixedTarget(source.getSourceId()));
+ DelayedTriggeredAbility dTA = new PhantasmalMountDelayedTriggeredAbility(
+ sacrificeCreatureEffect,
+ source.getSourceId());
+ DelayedTriggeredAbility dTA2 = new PhantasmalMountDelayedTriggeredAbility(
+ sacrificePhantasmalMountEffect,
+ source.getFirstTarget());
+ game.addDelayedTriggeredAbility(dTA, source);
+ game.addDelayedTriggeredAbility(dTA2, source);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public PhantasmalMountEffect copy() {
+ return new PhantasmalMountEffect(this);
+ }
+}
+
+class PhantasmalMountDelayedTriggeredAbility extends DelayedTriggeredAbility {
+
+ UUID creatureId;
+
+ PhantasmalMountDelayedTriggeredAbility(Effect effect, UUID creatureId) {
+ super(effect, Duration.EndOfTurn, true);
+ this.creatureId = creatureId;
+ }
+
+ PhantasmalMountDelayedTriggeredAbility(PhantasmalMountDelayedTriggeredAbility ability) {
+ super(ability);
+ this.creatureId = ability.creatureId;
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.ZONE_CHANGE;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getType() == EventType.ZONE_CHANGE
+ && event.getTargetId().equals(creatureId)) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public PhantasmalMountDelayedTriggeredAbility copy() {
+ return new PhantasmalMountDelayedTriggeredAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "this left the battlefield";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PhantasmalTerrain.java b/Mage.Sets/src/mage/cards/p/PhantasmalTerrain.java
index f5bb97875ca..cb425f1d88e 100644
--- a/Mage.Sets/src/mage/cards/p/PhantasmalTerrain.java
+++ b/Mage.Sets/src/mage/cards/p/PhantasmalTerrain.java
@@ -125,7 +125,8 @@ class PhantasmalTerrainContinuousEffect extends ContinuousEffectImpl {
@Override
public boolean hasLayer(Layer layer) {
- return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.TypeChangingEffects_4;
+ return layer == Layer.AbilityAddingRemovingEffects_6
+ || layer == Layer.TypeChangingEffects_4;
}
}
diff --git a/Mage.Sets/src/mage/cards/p/PhantomGeneral.java b/Mage.Sets/src/mage/cards/p/PhantomGeneral.java
index a5e802e5d40..4f2ac31139f 100644
--- a/Mage.Sets/src/mage/cards/p/PhantomGeneral.java
+++ b/Mage.Sets/src/mage/cards/p/PhantomGeneral.java
@@ -24,7 +24,7 @@ public final class PhantomGeneral extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creature tokens you control");
static {
- filter.add(new TokenPredicate());
+ filter.add(TokenPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianDreadnought.java b/Mage.Sets/src/mage/cards/p/PhyrexianDreadnought.java
index afb9c707089..41900f0ee1f 100644
--- a/Mage.Sets/src/mage/cards/p/PhyrexianDreadnought.java
+++ b/Mage.Sets/src/mage/cards/p/PhyrexianDreadnought.java
@@ -56,7 +56,7 @@ class PhyrexianDreadnoughtSacrificeCost extends CostImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("any number of creatures with total power 12 or greater");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public PhyrexianDreadnoughtSacrificeCost() {
diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianIngester.java b/Mage.Sets/src/mage/cards/p/PhyrexianIngester.java
index 0904b81ba8a..0b035db1bd1 100644
--- a/Mage.Sets/src/mage/cards/p/PhyrexianIngester.java
+++ b/Mage.Sets/src/mage/cards/p/PhyrexianIngester.java
@@ -36,7 +36,7 @@ public final class PhyrexianIngester extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creature");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public PhyrexianIngester(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianProcessor.java b/Mage.Sets/src/mage/cards/p/PhyrexianProcessor.java
index dc33388f9a5..20b78322d07 100644
--- a/Mage.Sets/src/mage/cards/p/PhyrexianProcessor.java
+++ b/Mage.Sets/src/mage/cards/p/PhyrexianProcessor.java
@@ -1,7 +1,5 @@
-
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
@@ -19,14 +17,15 @@ import mage.game.permanent.token.MinionToken;
import mage.players.Player;
import mage.util.CardUtil;
+import java.util.UUID;
+
/**
- *
* @author FenrisulfrX
*/
public final class PhyrexianProcessor extends CardImpl {
public PhyrexianProcessor(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// As {this} enters the battlefield, pay any amount of life.
this.addAbility(new EntersBattlefieldTriggeredAbility(new PhyrexianProcessorEffect()));
@@ -65,11 +64,11 @@ class PhyrexianProcessorEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- if(controller != null) {
- Card sourceCard = game.getCard(source.getSourceId());
+ if (controller != null) {
int payAmount = controller.getAmount(0, controller.getLife(), staticText, game);
controller.loseLife(payAmount, game, false);
- game.informPlayers(sourceCard.getName() + ": " + controller.getLogName() +
+ Card sourceCard = game.getCard(source.getSourceId());
+ game.informPlayers((sourceCard != null ? sourceCard.getName() : "") + ": " + controller.getLogName() +
" pays " + payAmount + " life.");
String key = CardUtil.getCardZoneString("lifePaid", source.getSourceId(), game);
game.getState().setValue(key, payAmount);
@@ -80,7 +79,7 @@ class PhyrexianProcessorEffect extends OneShotEffect {
}
class PhyrexianProcessorCreateTokenEffect extends OneShotEffect {
-
+
public PhyrexianProcessorCreateTokenEffect() {
super(Outcome.PutCreatureInPlay);
staticText = "Create an X/X black Minion creature token";
@@ -89,7 +88,7 @@ class PhyrexianProcessorCreateTokenEffect extends OneShotEffect {
public PhyrexianProcessorCreateTokenEffect(PhyrexianProcessorCreateTokenEffect ability) {
super(ability);
}
-
+
@Override
public PhyrexianProcessorCreateTokenEffect copy() {
return new PhyrexianProcessorCreateTokenEffect(this);
@@ -99,7 +98,7 @@ class PhyrexianProcessorCreateTokenEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
String key = CardUtil.getCardZoneString("lifePaid", source.getSourceId(), game);
Object object = game.getState().getValue(key);
- if(object instanceof Integer) {
+ if (object instanceof Integer) {
int lifePaid = (int) object;
MinionToken token = new MinionToken();
token.getPower().modifyBaseValue(lifePaid);
diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianPurge.java b/Mage.Sets/src/mage/cards/p/PhyrexianPurge.java
index da92e7b58a4..526c986b5bd 100644
--- a/Mage.Sets/src/mage/cards/p/PhyrexianPurge.java
+++ b/Mage.Sets/src/mage/cards/p/PhyrexianPurge.java
@@ -1,9 +1,8 @@
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
+import mage.abilities.costs.CostAdjuster;
import mage.abilities.costs.common.PayLifeCost;
import mage.abilities.effects.common.DestroyMultiTargetEffect;
import mage.abilities.effects.common.InfoEffect;
@@ -13,9 +12,11 @@ import mage.constants.CardType;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author escplan9 - Derek Monturo
*/
public final class PhyrexianPurge extends CardImpl {
@@ -28,26 +29,8 @@ public final class PhyrexianPurge extends CardImpl {
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, Integer.MAX_VALUE));
this.getSpellAbility().addEffect(new DestroyMultiTargetEffect());
this.getSpellAbility().addEffect(new InfoEffect("
{this} costs 3 life more to cast for each target"));
- }
-
- @Override
- public void adjustCosts(Ability ability, Game game) {
- int numTargets = ability.getTargets().get(0).getTargets().size();
- if (numTargets > 0) {
- ability.getCosts().add(new PayLifeCost(numTargets * 3));
- }
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- Player you = game.getPlayer(ownerId);
- if(you != null) {
- int maxTargets = you.getLife() / 3;
- ability.addTarget(new TargetCreaturePermanent(0, maxTargets));
- }
- }
+ this.getSpellAbility().setTargetAdjuster(PhyrexianPurgeTargetAdjuster.instance);
+ this.getSpellAbility().setCostAdjuster(PhyrexianPurgeCostAdjuster.instance);
}
public PhyrexianPurge(final PhyrexianPurge card) {
@@ -59,3 +42,27 @@ public final class PhyrexianPurge extends CardImpl {
return new PhyrexianPurge(this);
}
}
+
+enum PhyrexianPurgeCostAdjuster implements CostAdjuster {
+ instance;
+
+ @Override
+ public void adjustCosts(Ability ability, Game game) {
+ int numTargets = ability.getTargets().get(0).getTargets().size();
+ if (numTargets > 0) {
+ ability.getCosts().add(new PayLifeCost(numTargets * 3));
+ }
+ }
+}
+
+enum PhyrexianPurgeTargetAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ Player you = game.getPlayer(ability.getControllerId());
+ int maxTargets = you.getLife() / 3;
+ ability.addTarget(new TargetCreaturePermanent(0, maxTargets));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianSwarmlord.java b/Mage.Sets/src/mage/cards/p/PhyrexianSwarmlord.java
index 4f2f1f4e2dc..3dd4288d02e 100644
--- a/Mage.Sets/src/mage/cards/p/PhyrexianSwarmlord.java
+++ b/Mage.Sets/src/mage/cards/p/PhyrexianSwarmlord.java
@@ -30,7 +30,7 @@ public final class PhyrexianSwarmlord extends CardImpl {
this.addAbility(InfectAbility.getInstance());
this.addAbility(new OnEventTriggeredAbility(EventType.UPKEEP_STEP_PRE, "beginning of your upkeep",
- new CreateTokenEffect(new InsectInfectToken(), new OpponentsPoisonCountersCount())));
+ new CreateTokenEffect(new InsectInfectToken(), OpponentsPoisonCountersCount.instance)));
}
public PhyrexianSwarmlord(final PhyrexianSwarmlord card) {
diff --git a/Mage.Sets/src/mage/cards/p/PiannaNomadCaptain.java b/Mage.Sets/src/mage/cards/p/PiannaNomadCaptain.java
index 15e7870f00d..72a9ca81f1d 100644
--- a/Mage.Sets/src/mage/cards/p/PiannaNomadCaptain.java
+++ b/Mage.Sets/src/mage/cards/p/PiannaNomadCaptain.java
@@ -23,7 +23,7 @@ public final class PiannaNomadCaptain extends CardImpl {
static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creatures");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public PiannaNomadCaptain(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PiasRevolution.java b/Mage.Sets/src/mage/cards/p/PiasRevolution.java
index bba23c5fc61..edaea70c981 100644
--- a/Mage.Sets/src/mage/cards/p/PiasRevolution.java
+++ b/Mage.Sets/src/mage/cards/p/PiasRevolution.java
@@ -93,7 +93,7 @@ class PiasRevolutionTriggeredAbility extends TriggeredAbilityImpl {
private static final FilterArtifactPermanent filter = new FilterArtifactPermanent();
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
filter.add(new OwnerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/p/PiousEvangel.java b/Mage.Sets/src/mage/cards/p/PiousEvangel.java
index 3cf2046a8a3..917a03a500e 100644
--- a/Mage.Sets/src/mage/cards/p/PiousEvangel.java
+++ b/Mage.Sets/src/mage/cards/p/PiousEvangel.java
@@ -33,7 +33,7 @@ public final class PiousEvangel extends CardImpl {
private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("another permanent");
static {
- filter2.add(new AnotherPredicate());
+ filter2.add(AnotherPredicate.instance);
}
public PiousEvangel(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PistonFistCyclops.java b/Mage.Sets/src/mage/cards/p/PistonFistCyclops.java
index e362ad9416c..e17e51ab881 100644
--- a/Mage.Sets/src/mage/cards/p/PistonFistCyclops.java
+++ b/Mage.Sets/src/mage/cards/p/PistonFistCyclops.java
@@ -64,8 +64,8 @@ enum PistonFistCyclopsCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
SpellsCastWatcher watcher
- = (SpellsCastWatcher) game.getState().getWatchers().get(
- SpellsCastWatcher.class.getSimpleName()
+ = game.getState().getWatcher(
+ SpellsCastWatcher.class
);
if (watcher == null) {
return false;
diff --git a/Mage.Sets/src/mage/cards/p/PitilessPlunderer.java b/Mage.Sets/src/mage/cards/p/PitilessPlunderer.java
index fa3228ce6a4..b4667a3b49b 100644
--- a/Mage.Sets/src/mage/cards/p/PitilessPlunderer.java
+++ b/Mage.Sets/src/mage/cards/p/PitilessPlunderer.java
@@ -24,7 +24,7 @@ public final class PitilessPlunderer extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/p/PitilessPontiff.java b/Mage.Sets/src/mage/cards/p/PitilessPontiff.java
new file mode 100644
index 00000000000..4b342f2c18e
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PitilessPontiff.java
@@ -0,0 +1,55 @@
+package mage.cards.p;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.filter.StaticFilters;
+import mage.target.common.TargetControlledPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class PitilessPontiff extends CardImpl {
+
+ public PitilessPontiff(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{B}");
+
+ this.subtype.add(SubType.VAMPIRE);
+ this.subtype.add(SubType.CLERIC);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {1}, Sacrifice another creature: Pitiless Pontiff gains deathtouch and indestructible until end of turn.
+ Ability ability = new SimpleActivatedAbility(new GainAbilitySourceEffect(
+ DeathtouchAbility.getInstance(), Duration.EndOfTurn
+ ).setText("{this} gains deathtouch"), new GenericManaCost(1));
+ ability.addEffect(new GainAbilitySourceEffect(
+ IndestructibleAbility.getInstance(), Duration.EndOfTurn
+ ).setText("and indestructible until end of turn"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(
+ StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
+ )));
+ this.addAbility(ability);
+ }
+
+ private PitilessPontiff(final PitilessPontiff card) {
+ super(card);
+ }
+
+ @Override
+ public PitilessPontiff copy() {
+ return new PitilessPontiff(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PlagueBelcher.java b/Mage.Sets/src/mage/cards/p/PlagueBelcher.java
index e042dcf7eb6..65ef7f718d6 100644
--- a/Mage.Sets/src/mage/cards/p/PlagueBelcher.java
+++ b/Mage.Sets/src/mage/cards/p/PlagueBelcher.java
@@ -32,7 +32,7 @@ public final class PlagueBelcher extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
filter.add(new SubtypePredicate(SubType.ZOMBIE));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public PlagueBelcher(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PlagueOfVermin.java b/Mage.Sets/src/mage/cards/p/PlagueOfVermin.java
index 05652917b59..0a5dd16f1ee 100644
--- a/Mage.Sets/src/mage/cards/p/PlagueOfVermin.java
+++ b/Mage.Sets/src/mage/cards/p/PlagueOfVermin.java
@@ -1,9 +1,5 @@
-
package mage.cards.p;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
@@ -16,14 +12,17 @@ import mage.game.permanent.token.RatToken;
import mage.players.Player;
import mage.players.PlayerList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
*/
public final class PlagueOfVermin extends CardImpl {
public PlagueOfVermin(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{6}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{6}{B}");
// Starting with you, each player may pay any amount of life. Repeat this process until no one pays life. Each player creates a 1/1 black Rat creature token for each 1 life he or she paid this way.
@@ -60,7 +59,6 @@ class PlagueOfVerminEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- Card sourceCard = game.getCard(source.getSourceId());
Map payLife = new HashMap<>();
int currentLifePaid;
int totalPaidLife;
@@ -90,15 +88,16 @@ class PlagueOfVerminEffect extends OneShotEffect {
payLife.put(currentPlayer.getId(), currentLifePaid + totalPaidLife);
}
}
- game.informPlayers(sourceCard.getName() + ": " + currentPlayer.getLogName() + " pays " + payLife.get(currentPlayer.getId()) + " life");
+ Card sourceCard = game.getCard(source.getSourceId());
+ game.informPlayers((sourceCard != null ? sourceCard.getName() : "") + ": " + currentPlayer.getLogName() + " pays " + payLife.get(currentPlayer.getId()) + " life");
firstInactivePlayer = null;
}
}
-
+
// get next player
playerList.getNext();
currentPlayer = game.getPlayer(playerList.get());
-
+
// if all player since this player didn't put permanent in play finish the process
if (currentPlayer.getId().equals(firstInactivePlayer)) {
break;
diff --git a/Mage.Sets/src/mage/cards/p/PlagueWight.java b/Mage.Sets/src/mage/cards/p/PlagueWight.java
new file mode 100644
index 00000000000..433b85b01d5
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PlagueWight.java
@@ -0,0 +1,75 @@
+package mage.cards.p;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.BecomesBlockedTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.BlockedByIdPredicate;
+import mage.filter.predicate.permanent.BlockingAttackerIdPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class PlagueWight extends CardImpl {
+
+ public PlagueWight(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
+
+ this.subtype.add(SubType.ZOMBIE);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Whenever Plague Wight becomes blocked, each creature blocking it gets -1/-1 until end of turn.
+ this.addAbility(new BecomesBlockedTriggeredAbility(new PlagueWightEffect(), false));
+ }
+
+ private PlagueWight(final PlagueWight card) {
+ super(card);
+ }
+
+ @Override
+ public PlagueWight copy() {
+ return new PlagueWight(this);
+ }
+}
+
+class PlagueWightEffect extends OneShotEffect {
+
+ PlagueWightEffect() {
+ super(Outcome.Benefit);
+ staticText = "each creature blocking it gets -1/-1 until end of turn.";
+ }
+
+ private PlagueWightEffect(final PlagueWightEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PlagueWightEffect copy() {
+ return new PlagueWightEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ if (permanent == null) {
+ return false;
+ }
+ FilterCreaturePermanent filter = new FilterCreaturePermanent();
+ filter.add(new BlockingAttackerIdPredicate(source.getSourceId()));
+ game.addEffect(new BoostAllEffect(-1, -1, Duration.EndOfTurn, filter, false), source);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/p/Plaguecrafter.java b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java
index 39eaf6eb382..19830b5503a 100644
--- a/Mage.Sets/src/mage/cards/p/Plaguecrafter.java
+++ b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java
@@ -1,8 +1,5 @@
package mage.cards.p;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -23,8 +20,11 @@ import mage.players.Player;
import mage.target.common.TargetControlledPermanent;
import mage.target.targetpointer.FixedTarget;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
/**
- *
* @author themogwi
*/
public final class Plaguecrafter extends CardImpl {
@@ -43,7 +43,7 @@ public final class Plaguecrafter extends CardImpl {
this.addAbility(new EntersBattlefieldTriggeredAbility(new PlaguecrafterEffect()));
}
- public Plaguecrafter(final Plaguecrafter card) {
+ private Plaguecrafter(final Plaguecrafter card) {
super(card);
}
@@ -55,13 +55,13 @@ public final class Plaguecrafter extends CardImpl {
class PlaguecrafterEffect extends OneShotEffect {
- public PlaguecrafterEffect() {
+ PlaguecrafterEffect() {
super(Outcome.Benefit);
this.staticText = "each player sacrifices a creature or planeswalker. "
+ "Each player who can't discards a card.";
}
- public PlaguecrafterEffect(final PlaguecrafterEffect effect) {
+ private PlaguecrafterEffect(final PlaguecrafterEffect effect) {
super(effect);
}
@@ -82,20 +82,22 @@ class PlaguecrafterEffect extends OneShotEffect {
for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
- if (player != null) {
- FilterControlledPermanent filter = new FilterControlledPermanent();
- filter.add(Predicates.or(
- new CardTypePredicate(CardType.CREATURE),
- new CardTypePredicate(CardType.PLANESWALKER)));
- TargetControlledPermanent target = new TargetControlledPermanent(1, 1, filter, true);
- if (target.canChoose(player.getId(), game)) {
- while (!target.isChosen() && player.canRespond()) {
- player.choose(Outcome.Sacrifice, target, source.getSourceId(), game);
- }
- perms.addAll(target.getTargets());
- } else {
- cantSac.add(playerId);
+ if (player == null) {
+ continue;
+ }
+ FilterControlledPermanent filter = new FilterControlledPermanent("creature or planeswalker");
+ filter.add(Predicates.or(
+ new CardTypePredicate(CardType.CREATURE),
+ new CardTypePredicate(CardType.PLANESWALKER)
+ ));
+ TargetControlledPermanent target = new TargetControlledPermanent(1, 1, filter, true);
+ if (target.canChoose(player.getId(), game)) {
+ while (!target.isChosen() && player.canRespond()) {
+ player.choose(Outcome.Sacrifice, target, source.getSourceId(), game);
}
+ perms.addAll(target.getTargets());
+ } else {
+ cantSac.add(playerId);
}
}
diff --git a/Mage.Sets/src/mage/cards/p/PlanarChaos.java b/Mage.Sets/src/mage/cards/p/PlanarChaos.java
index 4f4dc4c6a7a..863a0d0d4a0 100644
--- a/Mage.Sets/src/mage/cards/p/PlanarChaos.java
+++ b/Mage.Sets/src/mage/cards/p/PlanarChaos.java
@@ -61,7 +61,7 @@ class PlanarChaosUpkeepEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
- if (!player.flipCoin(game)) {
+ if (!player.flipCoin(source, game, true)) {
Permanent perm = game.getPermanent(source.getSourceId());
if (perm != null) {
perm.sacrifice(source.getSourceId(), game);
@@ -104,7 +104,7 @@ class PlanarChaosCastAllEffect extends OneShotEffect {
if (sourceObject != null && spell != null) {
Player caster = game.getPlayer(spell.getControllerId());
if (caster != null) {
- if (!caster.flipCoin(game)) {
+ if (!caster.flipCoin(source, game, true)) {
game.informPlayers(sourceObject.getLogName() + ": " + spell.getLogName() + " countered");
game.getStack().counter(getTargetPointer().getFirst(game, source), source.getSourceId(), game);
}
diff --git a/Mage.Sets/src/mage/cards/p/PlaneswalkersMischief.java b/Mage.Sets/src/mage/cards/p/PlaneswalkersMischief.java
index 875e2f697ec..01493437e3c 100644
--- a/Mage.Sets/src/mage/cards/p/PlaneswalkersMischief.java
+++ b/Mage.Sets/src/mage/cards/p/PlaneswalkersMischief.java
@@ -155,7 +155,7 @@ class PlaneswalkersMischiefCondition implements Condition {
if (!game.getExile().getExileZone(exileId).contains(cardId)) {
return false;
}
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName(), source.getSourceId());
+ SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class, source.getSourceId());
if (watcher != null) {
List spells = watcher.getSpellsCastThisTurn(source.getControllerId());
if (spells != null) {
diff --git a/Mage.Sets/src/mage/cards/p/PlazaOfHarmony.java b/Mage.Sets/src/mage/cards/p/PlazaOfHarmony.java
new file mode 100644
index 00000000000..d88d7c09816
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PlazaOfHarmony.java
@@ -0,0 +1,62 @@
+package mage.cards.p;
+
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.mana.AnyColorLandsProduceManaAbility;
+import mage.abilities.mana.ColorlessManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.ComparisonType;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class PlazaOfHarmony extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterControlledPermanent();
+ private static final FilterPermanent filter2 = new FilterPermanent(SubType.GATE, "Gate");
+
+ static {
+ filter.add(new SubtypePredicate(SubType.GATE));
+ }
+
+ private static final Condition condition
+ = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 1);
+
+ public PlazaOfHarmony(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
+
+ // When Plaza of Harmony enters the battlefield, if you control two or more Gates, you gain 3 life.
+ this.addAbility(new ConditionalInterveningIfTriggeredAbility(
+ new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3)),
+ condition, "When {this} enters the battlefield, " +
+ "if you control two or more Gates, you gain 3 life."
+ ));
+
+ // {T}: Add {C}.
+ this.addAbility(new ColorlessManaAbility());
+
+ // {T}: Add one mana of any type a Gate you control could produce.
+ this.addAbility(new AnyColorLandsProduceManaAbility(TargetController.YOU, false, filter2));
+ }
+
+ private PlazaOfHarmony(final PlazaOfHarmony card) {
+ super(card);
+ }
+
+ @Override
+ public PlazaOfHarmony copy() {
+ return new PlazaOfHarmony(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PoeDameron.java b/Mage.Sets/src/mage/cards/p/PoeDameron.java
index f0e7d9c6a8a..a85a74dd105 100644
--- a/Mage.Sets/src/mage/cards/p/PoeDameron.java
+++ b/Mage.Sets/src/mage/cards/p/PoeDameron.java
@@ -25,7 +25,7 @@ public final class PoeDameron extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
filterStarship.add(new ControllerPredicate(TargetController.YOU));
filterStarship.add(new SubtypePredicate(SubType.STARSHIP));
}
diff --git a/Mage.Sets/src/mage/cards/p/PoisonbellyOgre.java b/Mage.Sets/src/mage/cards/p/PoisonbellyOgre.java
index 866517b846a..23b359686f8 100644
--- a/Mage.Sets/src/mage/cards/p/PoisonbellyOgre.java
+++ b/Mage.Sets/src/mage/cards/p/PoisonbellyOgre.java
@@ -22,7 +22,7 @@ public final class PoisonbellyOgre extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
private final static String RULE = "Whenever another creature enters the battlefield, its controller loses 1 life.";
diff --git a/Mage.Sets/src/mage/cards/p/PollenRemedy.java b/Mage.Sets/src/mage/cards/p/PollenRemedy.java
index 65d52569733..b13dadd098c 100644
--- a/Mage.Sets/src/mage/cards/p/PollenRemedy.java
+++ b/Mage.Sets/src/mage/cards/p/PollenRemedy.java
@@ -1,4 +1,3 @@
-
package mage.cards.p;
import java.util.UUID;
@@ -17,39 +16,30 @@ import mage.filter.common.FilterControlledLandPermanent;
import mage.game.Game;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetAnyTargetAmount;
+import mage.target.targetadjustment.TargetAdjuster;
/**
*
* @author LoneFox
-
+ *
*/
public final class PollenRemedy extends CardImpl {
- private final UUID originalId;
-
public PollenRemedy(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}");
// Kicker-Sacrifice a land.
this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(1, 1, new FilterControlledLandPermanent("a land"), true))));
// Prevent the next 3 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose. If Pollen Remedy was kicked, prevent the next 6 damage this way instead.
Effect effect = new ConditionalReplacementEffect(new PreventDamageToTargetMultiAmountEffect(Duration.EndOfTurn, 6),
- KickedCondition.instance, new PreventDamageToTargetMultiAmountEffect(Duration.EndOfTurn, 3));
+ KickedCondition.instance, new PreventDamageToTargetMultiAmountEffect(Duration.EndOfTurn, 3));
effect.setText("Prevent the next 3 damage that would be dealt this turn to any number of targets, divided as you choose. if this spell was kicked, prevent the next 6 damage this way instead.");
this.getSpellAbility().addEffect(effect);
- originalId = this.getSpellAbility().getOriginalId();
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if(ability.getOriginalId().equals(originalId)) {
- ability.addTarget(new TargetAnyTargetAmount(KickedCondition.instance.apply(game, ability) ? 6 : 3));
- }
+ this.getSpellAbility().setTargetAdjuster(PollenRemedyAdjuster.instance);
}
public PollenRemedy(final PollenRemedy card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -57,3 +47,12 @@ public final class PollenRemedy extends CardImpl {
return new PollenRemedy(this);
}
}
+
+enum PollenRemedyAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.addTarget(new TargetAnyTargetAmount(KickedCondition.instance.apply(game, ability) ? 6 : 3));
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PolukranosWorldEater.java b/Mage.Sets/src/mage/cards/p/PolukranosWorldEater.java
index 6f6b1ca6b6b..0fa30f941f0 100644
--- a/Mage.Sets/src/mage/cards/p/PolukranosWorldEater.java
+++ b/Mage.Sets/src/mage/cards/p/PolukranosWorldEater.java
@@ -1,9 +1,6 @@
package mage.cards.p;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility;
@@ -12,47 +9,44 @@ import mage.abilities.keyword.MonstrosityAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.constants.SuperType;
-import mage.constants.TargetController;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetCreaturePermanentAmount;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
/**
- *
* * The value of X in Polukranos's last ability is equal to the value chosen
- * for X when its activated ability was activated.
- *
+ * for X when its activated ability was activated.
+ *
* * The number of targets chosen for the triggered ability must be at least one
- * (if X wasn't 0) and at most X. You choose the division of damage as you put
- * the ability on the stack, not as it resolves. Each target must be assigned
- * at least 1 damage. In multiplayer games, you may choose creatures controlled
- * by different opponents.
- *
+ * (if X wasn't 0) and at most X. You choose the division of damage as you put
+ * the ability on the stack, not as it resolves. Each target must be assigned
+ * at least 1 damage. In multiplayer games, you may choose creatures controlled
+ * by different opponents.
+ *
* * If some, but not all, of the ability's targets become illegal, you can't change
- * the division of damage. Damage that would've been dealt to illegal targets
- * simply isn't dealt.
- *
+ * the division of damage. Damage that would've been dealt to illegal targets
+ * simply isn't dealt.
+ *
* * As Polukranos's triggered ability resolves, Polukranos deals damage first, then
- * the target creatures do. Although no creature will die until after the ability
- * finishes resolving, the order could matter if Polukranos has wither or infect.
+ * the target creatures do. Although no creature will die until after the ability
+ * finishes resolving, the order could matter if Polukranos has wither or infect.
*
* @author LevelX2
*/
public final class PolukranosWorldEater extends CardImpl {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
- static {
- filter.add(new ControllerPredicate(TargetController.OPPONENT));
- }
-
public PolukranosWorldEater(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.HYDRA);
@@ -61,20 +55,11 @@ public final class PolukranosWorldEater extends CardImpl {
// {X}{X}{G}: Monstrosity X.
this.addAbility(new MonstrosityAbility("{X}{X}{G}", Integer.MAX_VALUE));
+
// When Polukranos, World Eater becomes monstrous, it deals X damage divided as you choose among any number of target creatures your opponents control. Each of those creatures deals damage equal to its power to Polukranos.
Ability ability = new BecomesMonstrousSourceTriggeredAbility(new PolukranosWorldEaterEffect());
- ability.addTarget(new TargetCreaturePermanentAmount(1, filter));
+ ability.setTargetAdjuster(PolukranosWorldEaterAdjuster.instance);
this.addAbility(ability);
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof BecomesMonstrousSourceTriggeredAbility) {
- int xValue = ((BecomesMonstrousSourceTriggeredAbility) ability).getMonstrosityValue();
- ability.getTargets().clear();
- ability.addTarget(new TargetCreaturePermanentAmount(xValue, filter));
- }
}
public PolukranosWorldEater(final PolukranosWorldEater card) {
@@ -87,6 +72,17 @@ public final class PolukranosWorldEater extends CardImpl {
}
}
+enum PolukranosWorldEaterAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int xValue = ((BecomesMonstrousSourceTriggeredAbility) ability).getMonstrosityValue();
+ ability.getTargets().clear();
+ ability.addTarget(new TargetCreaturePermanentAmount(xValue, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE));
+ }
+}
+
class PolukranosWorldEaterEffect extends OneShotEffect {
public PolukranosWorldEaterEffect() {
@@ -108,7 +104,7 @@ class PolukranosWorldEaterEffect extends OneShotEffect {
if (!source.getTargets().isEmpty()) {
Target multiTarget = source.getTargets().get(0);
Set permanents = new HashSet<>();
- for (UUID target: multiTarget.getTargets()) {
+ for (UUID target : multiTarget.getTargets()) {
Permanent permanent = game.getPermanent(target);
if (permanent != null) {
permanents.add(permanent);
@@ -118,7 +114,7 @@ class PolukranosWorldEaterEffect extends OneShotEffect {
// Each of those creatures deals damage equal to its power to Polukranos
Permanent sourceCreature = game.getPermanent(source.getSourceId());
if (sourceCreature != null) {
- for (Permanent permanent :permanents) {
+ for (Permanent permanent : permanents) {
sourceCreature.damage(permanent.getPower().getValue(), permanent.getId(), game, false, true);
}
}
diff --git a/Mage.Sets/src/mage/cards/p/PontiffOfBlight.java b/Mage.Sets/src/mage/cards/p/PontiffOfBlight.java
index 19a3aa1248a..d7f18675a4a 100644
--- a/Mage.Sets/src/mage/cards/p/PontiffOfBlight.java
+++ b/Mage.Sets/src/mage/cards/p/PontiffOfBlight.java
@@ -28,7 +28,7 @@ public final class PontiffOfBlight extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Other creatures you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new ControllerPredicate(TargetController.YOU));
}
diff --git a/Mage.Sets/src/mage/cards/p/PostmortemLunge.java b/Mage.Sets/src/mage/cards/p/PostmortemLunge.java
index 65a32494f10..75f35c769a0 100644
--- a/Mage.Sets/src/mage/cards/p/PostmortemLunge.java
+++ b/Mage.Sets/src/mage/cards/p/PostmortemLunge.java
@@ -1,7 +1,5 @@
-
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.effects.ContinuousEffect;
@@ -21,8 +19,11 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCardInYourGraveyard;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
* @author North
*/
@@ -34,6 +35,7 @@ public final class PostmortemLunge extends CardImpl {
// Return target creature card with converted mana cost X from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step.
this.getSpellAbility().addEffect(new PostmortemLungeEffect());
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
+ this.getSpellAbility().setTargetAdjuster(PostmortemLungeAdjuster.instance);
}
public PostmortemLunge(final PostmortemLunge card) {
@@ -44,16 +46,18 @@ public final class PostmortemLunge extends CardImpl {
public PostmortemLunge copy() {
return new PostmortemLunge(this);
}
+}
+
+enum PostmortemLungeAdjuster implements TargetAdjuster {
+ instance;
@Override
public void adjustTargets(Ability ability, Game game) {
- if (ability.getAbilityType() == AbilityType.SPELL) { // otherwise the target is also added to the delayed triggered ability
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCard filter = new FilterCreatureCard("creature card with converted mana cost " + xValue + " or less from your graveyard");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1));
- ability.getTargets().add(new TargetCardInYourGraveyard(filter));
- }
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterCard filter = new FilterCreatureCard("creature card with converted mana cost " + xValue + " or less from your graveyard");
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1));
+ ability.getTargets().add(new TargetCardInYourGraveyard(filter));
}
}
@@ -76,13 +80,11 @@ class PostmortemLungeEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Card card = game.getCard(source.getFirstTarget());
-
if (card != null) {
Player cardOwner = game.getPlayer(card.getOwnerId());
if (cardOwner == null) {
return false;
}
-
if (cardOwner.moveCards(card, Zone.BATTLEFIELD, source, game)) {
Permanent permanent = game.getPermanent(card.getId());
if (permanent != null) {
@@ -96,7 +98,6 @@ class PostmortemLungeEffect extends OneShotEffect {
}
return true;
}
-
return false;
}
}
diff --git a/Mage.Sets/src/mage/cards/p/PowerSurge.java b/Mage.Sets/src/mage/cards/p/PowerSurge.java
index 186e7039ba6..7b788da9efd 100644
--- a/Mage.Sets/src/mage/cards/p/PowerSurge.java
+++ b/Mage.Sets/src/mage/cards/p/PowerSurge.java
@@ -64,10 +64,12 @@ class PowerSurgeDamageEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
if (player != null) {
- PowerSurgeWatcher watcher = (PowerSurgeWatcher) game.getState().getWatchers().get(PowerSurgeWatcher.class.getSimpleName());
- int damage = watcher.getUntappedLandCount();
- player.damage(damage, source.getSourceId(), game, false, true);
- return true;
+ PowerSurgeWatcher watcher = game.getState().getWatcher(PowerSurgeWatcher.class);
+ if(watcher != null) {
+ int damage = watcher.getUntappedLandCount();
+ player.damage(damage, source.getSourceId(), game, false, true);
+ return true;
+ }
}
return false;
}
@@ -83,13 +85,13 @@ class PowerSurgeWatcher extends Watcher {
private static final FilterPermanent filter = new FilterControlledLandPermanent();
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
private int untappedLandCount;
public PowerSurgeWatcher() {
- super(PowerSurgeWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(PowerSurgeWatcher.class, WatcherScope.GAME);
}
public PowerSurgeWatcher(final PowerSurgeWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/p/PrecognitivePerception.java b/Mage.Sets/src/mage/cards/p/PrecognitivePerception.java
new file mode 100644
index 00000000000..32f2d035519
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PrecognitivePerception.java
@@ -0,0 +1,68 @@
+package mage.cards.p;
+
+import mage.abilities.Ability;
+import mage.abilities.condition.common.AddendumCondition;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.players.Player;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class PrecognitivePerception extends CardImpl {
+
+ public PrecognitivePerception(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}{U}");
+
+ // Draw three cards.
+ // Addendum — If you cast this spell during your main phase, instead scry 3, then draw three cards.
+ this.getSpellAbility().addEffect(new PrecognitivePerceptionEffect());
+ }
+
+ private PrecognitivePerception(final PrecognitivePerception card) {
+ super(card);
+ }
+
+ @Override
+ public PrecognitivePerception copy() {
+ return new PrecognitivePerception(this);
+ }
+}
+
+class PrecognitivePerceptionEffect extends OneShotEffect {
+
+ PrecognitivePerceptionEffect() {
+ super(Outcome.Benefit);
+ staticText = "Draw three cards.
Addendum — " +
+ "If you cast this spell during your main phase, " +
+ "instead scry 3, then draw three cards.";
+ }
+
+ private PrecognitivePerceptionEffect(final PrecognitivePerceptionEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PrecognitivePerceptionEffect copy() {
+ return new PrecognitivePerceptionEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
+ return false;
+ }
+ if (AddendumCondition.instance.apply(game, source)) {
+ controller.scry(3, source, game);
+ }
+ controller.drawCards(3, game);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/p/PredatoryAdvantage.java b/Mage.Sets/src/mage/cards/p/PredatoryAdvantage.java
index 01c526c4085..57906d28fd0 100644
--- a/Mage.Sets/src/mage/cards/p/PredatoryAdvantage.java
+++ b/Mage.Sets/src/mage/cards/p/PredatoryAdvantage.java
@@ -48,7 +48,7 @@ class DidNotCastCreatureCondition implements Condition {
public boolean apply(Game game, Ability source) {
Permanent p = game.getPermanent(source.getSourceId());
if (p != null) {
- Watcher watcher = game.getState().getWatchers().get(CastCreatureWatcher.class.getSimpleName(), source.getSourceId());
+ Watcher watcher = game.getState().getWatcher(CastCreatureWatcher.class, source.getSourceId());
if (watcher != null && !watcher.conditionMet()) {
return true;
}
@@ -65,7 +65,7 @@ class DidNotCastCreatureCondition implements Condition {
class CastCreatureWatcher extends Watcher {
public CastCreatureWatcher() {
- super(CastCreatureWatcher.class.getSimpleName(), WatcherScope.CARD);
+ super(CastCreatureWatcher.class, WatcherScope.CARD);
}
public CastCreatureWatcher(final CastCreatureWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/p/PrematureBurial.java b/Mage.Sets/src/mage/cards/p/PrematureBurial.java
index 3f8ac248ae3..b3ebd0759a8 100644
--- a/Mage.Sets/src/mage/cards/p/PrematureBurial.java
+++ b/Mage.Sets/src/mage/cards/p/PrematureBurial.java
@@ -66,7 +66,7 @@ class ETBSinceYourLastTurnTarget extends TargetCreaturePermanent {
@Override
public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) {
System.out.println("canTarget called");
- ETBSinceYourLastTurnWatcher watcher = (ETBSinceYourLastTurnWatcher) game.getState().getWatchers().get(ETBSinceYourLastTurnWatcher.class.getSimpleName());
+ ETBSinceYourLastTurnWatcher watcher = game.getState().getWatcher(ETBSinceYourLastTurnWatcher.class);
if (watcher != null){
if (watcher.enteredSinceLastTurn(controllerId, new MageObjectReference(id, game))){
System.out.println(game.getPermanent(id).getIdName()+" entered since the last turn.");
@@ -79,11 +79,11 @@ class ETBSinceYourLastTurnTarget extends TargetCreaturePermanent {
@Override
public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
MageObject targetSource = game.getObject(sourceId);
- ETBSinceYourLastTurnWatcher watcher = (ETBSinceYourLastTurnWatcher) game.getState().getWatchers().get(ETBSinceYourLastTurnWatcher.class.getSimpleName());
+ ETBSinceYourLastTurnWatcher watcher = game.getState().getWatcher(ETBSinceYourLastTurnWatcher.class);
if(targetSource != null) {
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) {
- if (watcher.enteredSinceLastTurn(sourceControllerId, new MageObjectReference(permanent.getId(), game))) {
+ if (watcher != null && watcher.enteredSinceLastTurn(sourceControllerId, new MageObjectReference(permanent.getId(), game))) {
return true;
}
}
@@ -103,7 +103,7 @@ class ETBSinceYourLastTurnWatcher extends Watcher {
private final Map> playerToETBMap;
public ETBSinceYourLastTurnWatcher() {
- super(ETBSinceYourLastTurnWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(ETBSinceYourLastTurnWatcher.class, WatcherScope.GAME);
this.playerToETBMap = new HashMap<>();
}
diff --git a/Mage.Sets/src/mage/cards/p/PrepareFight.java b/Mage.Sets/src/mage/cards/p/PrepareFight.java
index daa30221acc..366411f7ab5 100644
--- a/Mage.Sets/src/mage/cards/p/PrepareFight.java
+++ b/Mage.Sets/src/mage/cards/p/PrepareFight.java
@@ -49,7 +49,7 @@ public final class PrepareFight extends SplitCard {
// to
// Fight
// Target creature you control fights target creature you don't control.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new FightTargetsEffect());
getRightHalfCard().getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
Target target = new TargetCreaturePermanent(filter);
diff --git a/Mage.Sets/src/mage/cards/p/PrescientChimera.java b/Mage.Sets/src/mage/cards/p/PrescientChimera.java
index 124a222a486..ad0c59673ff 100644
--- a/Mage.Sets/src/mage/cards/p/PrescientChimera.java
+++ b/Mage.Sets/src/mage/cards/p/PrescientChimera.java
@@ -1,7 +1,5 @@
-
package mage.cards.p;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.keyword.ScryEffect;
@@ -12,14 +10,15 @@ import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class PrescientChimera extends CardImpl {
public PrescientChimera(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
this.subtype.add(SubType.CHIMERA);
this.power = new MageInt(3);
@@ -28,7 +27,7 @@ public final class PrescientChimera extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever you cast an instant or sorcery spell, scry 1.
- this.addAbility(new SpellCastControllerTriggeredAbility(new ScryEffect(1), StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY, false));
+ this.addAbility(new SpellCastControllerTriggeredAbility(new ScryEffect(1), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false));
}
public PrescientChimera(final PrescientChimera card) {
diff --git a/Mage.Sets/src/mage/cards/p/PresenceOfTheWise.java b/Mage.Sets/src/mage/cards/p/PresenceOfTheWise.java
index 0129a82eb5f..7c7037e939f 100644
--- a/Mage.Sets/src/mage/cards/p/PresenceOfTheWise.java
+++ b/Mage.Sets/src/mage/cards/p/PresenceOfTheWise.java
@@ -20,7 +20,7 @@ public final class PresenceOfTheWise extends CardImpl {
// You gain 2 life for each card in your hand.
this.getSpellAbility().addEffect(new GainLifeEffect(
- new MultipliedValue(new CardsInControllerHandCount(), 2),"You gain 2 life for each card in your hand"));
+ new MultipliedValue(CardsInControllerHandCount.instance, 2),"You gain 2 life for each card in your hand"));
}
public PresenceOfTheWise(final PresenceOfTheWise card) {
diff --git a/Mage.Sets/src/mage/cards/p/PriceOfFame.java b/Mage.Sets/src/mage/cards/p/PriceOfFame.java
index 79f7737b9e6..194d35fe996 100644
--- a/Mage.Sets/src/mage/cards/p/PriceOfFame.java
+++ b/Mage.Sets/src/mage/cards/p/PriceOfFame.java
@@ -1,36 +1,44 @@
package mage.cards.p;
-import java.util.Iterator;
-import java.util.UUID;
-import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.SourceTargetsPermanentCondition;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
import mage.abilities.effects.keyword.SurveilEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SuperType;
import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.game.stack.StackObject;
-import mage.target.Target;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
- *
* @author TheElk801
*/
public final class PriceOfFame extends CardImpl {
+ private static final FilterPermanent filter
+ = new FilterControlledCreaturePermanent("a legendary creature");
+
+ static {
+ filter.add(new SupertypePredicate(SuperType.LEGENDARY));
+ }
+
+ private static final Condition condition = new SourceTargetsPermanentCondition(filter);
+
public PriceOfFame(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{B}");
// This spell costs {2} less to cast if it targets a legendary creature.
- this.addAbility(new SimpleStaticAbility(Zone.STACK,
- new SpellCostReductionSourceEffect(2, PriceOfFameCondition.instance))
- .setRuleAtTheTop(true));
+ this.addAbility(new SimpleStaticAbility(
+ Zone.STACK, new SpellCostReductionSourceEffect(2, condition)
+ ).setRuleAtTheTop(true));
// Destroy target creature.
this.getSpellAbility().addEffect(new DestroyTargetEffect());
@@ -49,28 +57,3 @@ public final class PriceOfFame extends CardImpl {
return new PriceOfFame(this);
}
}
-
-enum PriceOfFameCondition implements Condition {
- instance;
-
- @Override
- public boolean apply(Game game, Ability source) {
- StackObject sourceSpell = game.getStack().getStackObject(source.getSourceId());
- if (sourceSpell != null) {
- Iterator targets = sourceSpell.getStackAbility().getTargets().iterator();
- while (targets.hasNext()) {
- Permanent permanent = game.getPermanentOrLKIBattlefield(targets.next().getFirstTarget());
- if (permanent != null && permanent.isCreature() && permanent.isLegendary()) {
- return true;
- }
- }
- }
- return false;
- }
-
- @Override
- public String toString() {
- return "it targets a legendary creature";
- }
-
-}
diff --git a/Mage.Sets/src/mage/cards/p/PrideOfTheClouds.java b/Mage.Sets/src/mage/cards/p/PrideOfTheClouds.java
index ab9ce5f0c48..9ac6fc59b9f 100644
--- a/Mage.Sets/src/mage/cards/p/PrideOfTheClouds.java
+++ b/Mage.Sets/src/mage/cards/p/PrideOfTheClouds.java
@@ -31,7 +31,7 @@ public final class PrideOfTheClouds extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creature with flying on the battlefield");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new AbilityPredicate(FlyingAbility.class));
}
diff --git a/Mage.Sets/src/mage/cards/p/PrideSovereign.java b/Mage.Sets/src/mage/cards/p/PrideSovereign.java
index 42f476571a0..929c2d2b731 100644
--- a/Mage.Sets/src/mage/cards/p/PrideSovereign.java
+++ b/Mage.Sets/src/mage/cards/p/PrideSovereign.java
@@ -38,7 +38,7 @@ public final class PrideSovereign extends CardImpl {
// Pride Sovereign gets +1/+1 for each other Cat you control.
FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(SubType.CAT, "other Cat you control");
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
DynamicValue otherCats = new PermanentsOnBattlefieldCount(filter);
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceEffect(otherCats, otherCats, Duration.WhileOnBattlefield)));
// {W}, {t}, Exert Pride Sovereign: Create two 1/1 white Cat creature tokens with lifelink.
diff --git a/Mage.Sets/src/mage/cards/p/PriestOfForgottenGods.java b/Mage.Sets/src/mage/cards/p/PriestOfForgottenGods.java
new file mode 100644
index 00000000000..801350a032c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PriestOfForgottenGods.java
@@ -0,0 +1,71 @@
+package mage.cards.p;
+
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.effects.common.SacrificeEffect;
+import mage.abilities.effects.mana.BasicManaEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.TargetPlayer;
+import mage.target.common.TargetControlledPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class PriestOfForgottenGods extends CardImpl {
+
+ private static final FilterControlledPermanent filter
+ = new FilterControlledCreaturePermanent("other creatures");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
+
+ public PriestOfForgottenGods(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.CLERIC);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // {T}, Sacrifice two other creatures: Any number of target players each lose 2 life and sacrifice a creature. You add {B}{B} and draw a card.
+ Ability ability = new SimpleActivatedAbility(
+ new LoseLifeTargetEffect(2)
+ .setText("Any number of target players each lose 2 life"),
+ new TapSourceCost()
+ );
+ ability.addEffect(
+ new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "")
+ .setText("and sacrifice a creature")
+ );
+ ability.addEffect(new BasicManaEffect(Mana.BlackMana(2)).setText("You add {B}{B}"));
+ ability.addEffect(new DrawCardSourceControllerEffect(1).setText("and draw a card"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, filter, true)));
+ ability.addTarget(new TargetPlayer(0, Integer.MAX_VALUE, false));
+ this.addAbility(ability);
+ }
+
+ private PriestOfForgottenGods(final PriestOfForgottenGods card) {
+ super(card);
+ }
+
+ @Override
+ public PriestOfForgottenGods copy() {
+ return new PriestOfForgottenGods(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PrimalForcemage.java b/Mage.Sets/src/mage/cards/p/PrimalForcemage.java
index 2a17cceae86..c1e50b811e9 100644
--- a/Mage.Sets/src/mage/cards/p/PrimalForcemage.java
+++ b/Mage.Sets/src/mage/cards/p/PrimalForcemage.java
@@ -27,7 +27,7 @@ public final class PrimalForcemage extends CardImpl {
static {
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
private static final String rule = "Whenever another creature enters the battlefield under your control, that creature gets +3/+3 until end of turn.";
diff --git a/Mage.Sets/src/mage/cards/p/PrimalWhisperer.java b/Mage.Sets/src/mage/cards/p/PrimalWhisperer.java
index 3ea6fbad59f..61901b4b918 100644
--- a/Mage.Sets/src/mage/cards/p/PrimalWhisperer.java
+++ b/Mage.Sets/src/mage/cards/p/PrimalWhisperer.java
@@ -26,7 +26,7 @@ public final class PrimalWhisperer extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("face-down creature");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
}
public PrimalWhisperer(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PrimeSpeakerVannifar.java b/Mage.Sets/src/mage/cards/p/PrimeSpeakerVannifar.java
new file mode 100644
index 00000000000..3554ba25ade
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PrimeSpeakerVannifar.java
@@ -0,0 +1,107 @@
+package mage.cards.p;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.FilterCard;
+import mage.filter.StaticFilters;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCardInLibrary;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801 and Loki
+ */
+public final class PrimeSpeakerVannifar extends CardImpl {
+
+ public PrimeSpeakerVannifar(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{U}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.ELF);
+ this.subtype.add(SubType.OOZE);
+ this.subtype.add(SubType.WIZARD);
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(4);
+
+ // {T}, Sacrifice another creature: Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery.
+ Ability ability = new ActivateAsSorceryActivatedAbility(
+ Zone.BATTLEFIELD, new PrimeSpeakerVannifarEffect(), new TapSourceCost()
+ );
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(
+ StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
+ )));
+ this.addAbility(ability);
+ }
+
+ private PrimeSpeakerVannifar(final PrimeSpeakerVannifar card) {
+ super(card);
+ }
+
+ @Override
+ public PrimeSpeakerVannifar copy() {
+ return new PrimeSpeakerVannifar(this);
+ }
+}
+
+class PrimeSpeakerVannifarEffect extends OneShotEffect {
+
+ PrimeSpeakerVannifarEffect() {
+ super(Outcome.Benefit);
+ staticText = "Search your library for a creature card with converted mana cost equal to 1 " +
+ "plus the sacrificed creature's converted mana cost, put that card " +
+ "onto the battlefield, then shuffle your library";
+ }
+
+ private PrimeSpeakerVannifarEffect(final PrimeSpeakerVannifarEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent sacrificedPermanent = null;
+ for (Cost cost : source.getCosts()) {
+ if (cost instanceof SacrificeTargetCost) {
+ SacrificeTargetCost sacrificeCost = (SacrificeTargetCost) cost;
+ if (!sacrificeCost.getPermanents().isEmpty()) {
+ sacrificedPermanent = sacrificeCost.getPermanents().get(0);
+ }
+ break;
+ }
+ }
+ Player controller = game.getPlayer(source.getControllerId());
+ if (sacrificedPermanent == null || controller == null) {
+ return false;
+ }
+ int newConvertedCost = sacrificedPermanent.getConvertedManaCost() + 1;
+ FilterCard filter = new FilterCard("creature card with converted mana cost " + newConvertedCost);
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, newConvertedCost));
+ filter.add(new CardTypePredicate(CardType.CREATURE));
+ TargetCardInLibrary target = new TargetCardInLibrary(filter);
+ if (controller.searchLibrary(target, game)) {
+ Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
+ controller.moveCards(card, Zone.BATTLEFIELD, source, game);
+ }
+ controller.shuffleLibrary(source, game);
+ return true;
+ }
+
+ @Override
+ public PrimeSpeakerVannifarEffect copy() {
+ return new PrimeSpeakerVannifarEffect(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PrimevalProtector.java b/Mage.Sets/src/mage/cards/p/PrimevalProtector.java
index c68fabb66ad..7a09b0723b9 100644
--- a/Mage.Sets/src/mage/cards/p/PrimevalProtector.java
+++ b/Mage.Sets/src/mage/cards/p/PrimevalProtector.java
@@ -36,7 +36,7 @@ public final class PrimevalProtector extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("other creature you control");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public PrimevalProtector(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PrimordialMist.java b/Mage.Sets/src/mage/cards/p/PrimordialMist.java
index 364db608db3..891466a29b3 100644
--- a/Mage.Sets/src/mage/cards/p/PrimordialMist.java
+++ b/Mage.Sets/src/mage/cards/p/PrimordialMist.java
@@ -35,7 +35,7 @@ public final class PrimordialMist extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("face down permanent");
static {
- filter.add(new FaceDownPredicate());
+ filter.add(FaceDownPredicate.instance);
}
public PrimordialMist(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PrincessLeia.java b/Mage.Sets/src/mage/cards/p/PrincessLeia.java
index 3a47d9e3ea4..9bcae9ff497 100644
--- a/Mage.Sets/src/mage/cards/p/PrincessLeia.java
+++ b/Mage.Sets/src/mage/cards/p/PrincessLeia.java
@@ -30,7 +30,7 @@ public final class PrincessLeia extends CardImpl {
static {
SubtypePredicate rebel = new SubtypePredicate(SubType.REBEL);
- filter1.add(new AnotherPredicate());
+ filter1.add(AnotherPredicate.instance);
filter1.add(rebel);
filter2.add(rebel);
}
diff --git a/Mage.Sets/src/mage/cards/p/PrismaticStrands.java b/Mage.Sets/src/mage/cards/p/PrismaticStrands.java
index e5fb668061d..06a50fb4d29 100644
--- a/Mage.Sets/src/mage/cards/p/PrismaticStrands.java
+++ b/Mage.Sets/src/mage/cards/p/PrismaticStrands.java
@@ -34,7 +34,7 @@ public final class PrismaticStrands extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("untapped white creature you control");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new ColorPredicate(ObjectColor.WHITE));
}
diff --git a/Mage.Sets/src/mage/cards/p/PrizedAmalgam.java b/Mage.Sets/src/mage/cards/p/PrizedAmalgam.java
index 77d939f26f8..e8c4babc360 100644
--- a/Mage.Sets/src/mage/cards/p/PrizedAmalgam.java
+++ b/Mage.Sets/src/mage/cards/p/PrizedAmalgam.java
@@ -89,7 +89,7 @@ class PrizedAmalgamTriggerdAbility extends EntersBattlefieldAllTriggeredAbility
if (entersEvent.getFromZone() == Zone.GRAVEYARD) {
result = true;
} else if (entersEvent.getFromZone() == Zone.STACK && entersEvent.getTarget().isControlledBy(getControllerId())) {
- CastFromGraveyardWatcher watcher = (CastFromGraveyardWatcher) game.getState().getWatchers().get(CastFromGraveyardWatcher.class.getSimpleName());
+ CastFromGraveyardWatcher watcher = game.getState().getWatcher(CastFromGraveyardWatcher.class);
if (watcher != null) {
int zcc = game.getState().getZoneChangeCounter(event.getSourceId());
result = watcher.spellWasCastFromGraveyard(event.getSourceId(), zcc - 1);
diff --git a/Mage.Sets/src/mage/cards/p/Probe.java b/Mage.Sets/src/mage/cards/p/Probe.java
index e8e4e7a6890..6c98d48e93e 100644
--- a/Mage.Sets/src/mage/cards/p/Probe.java
+++ b/Mage.Sets/src/mage/cards/p/Probe.java
@@ -1,9 +1,7 @@
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.condition.common.KickedCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
@@ -14,9 +12,11 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.game.Game;
import mage.target.TargetPlayer;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author fireshoes
*/
public final class Probe extends CardImpl {
@@ -33,16 +33,7 @@ public final class Probe extends CardImpl {
new DiscardTargetEffect(2),
KickedCondition.instance,
"
if this spell was kicked, target player discards two cards"));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- if (KickedCondition.instance.apply(game, ability)) {
- ability.addTarget(new TargetPlayer());
- }
- }
+ this.getSpellAbility().setTargetAdjuster(ProbeAdjuster.instance);
}
public Probe(final Probe card) {
@@ -54,3 +45,15 @@ public final class Probe extends CardImpl {
return new Probe(this);
}
}
+
+enum ProbeAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.addTarget(new TargetPlayer());
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/p/ProfaneCommand.java b/Mage.Sets/src/mage/cards/p/ProfaneCommand.java
index 6f32b271f72..9e9b5172f90 100644
--- a/Mage.Sets/src/mage/cards/p/ProfaneCommand.java
+++ b/Mage.Sets/src/mage/cards/p/ProfaneCommand.java
@@ -1,7 +1,6 @@
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.dynamicvalue.DynamicValue;
@@ -26,6 +25,9 @@ import mage.game.Game;
import mage.target.TargetPlayer;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
* @author LevelX2
@@ -36,7 +38,7 @@ public final class ProfaneCommand extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{B}");
- DynamicValue xValue = new ManacostVariableValue();
+ DynamicValue xValue = ManacostVariableValue.instance;
// Choose two -
this.getSpellAbility().getModes().setMinModes(2);
this.getSpellAbility().getModes().setMaxModes(2);
@@ -64,27 +66,8 @@ public final class ProfaneCommand extends CardImpl {
mode.addEffect(effect);
mode.addTarget(new TargetCreaturePermanent(0, 1));
this.getSpellAbility().addMode(mode);
- }
- @Override
- public void adjustTargets(Ability ability, Game game) {
- // adjust targets is called for every selected mode
- Mode mode = ability.getModes().getMode();
- for (Effect effect : mode.getEffects()) {
- if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) {
- mode.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCard filter = new FilterCreatureCard("creature card with converted mana cost " + xValue + " or less from your graveyard");
- filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1));
- mode.addTarget(new TargetCardInYourGraveyard(filter));
- }
- if (effect instanceof GainAbilityTargetEffect) {
- mode.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain fear until end of turn");
- mode.addTarget(new TargetCreaturePermanent(0, xValue, filter, false));
- }
- }
+ this.getSpellAbility().setTargetAdjuster(ProfaneCommandAdjuster.instance);
}
public ProfaneCommand(final ProfaneCommand card) {
@@ -96,3 +79,27 @@ public final class ProfaneCommand extends CardImpl {
return new ProfaneCommand(this);
}
}
+
+enum ProfaneCommandAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ // adjust targets is called for every selected mode
+ Mode mode = ability.getModes().getMode();
+ int xValue = ability.getManaCostsToPay().getX();
+ for (Effect effect : mode.getEffects()) {
+ if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) {
+ mode.getTargets().clear();
+ FilterCard filter = new FilterCreatureCard("creature card with converted mana cost " + xValue + " or less from your graveyard");
+ filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1));
+ mode.addTarget(new TargetCardInYourGraveyard(filter));
+ }
+ if (effect instanceof GainAbilityTargetEffect) {
+ mode.getTargets().clear();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures gain fear until end of turn");
+ mode.addTarget(new TargetCreaturePermanent(0, xValue, filter, false));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/p/ProgenitorMimic.java b/Mage.Sets/src/mage/cards/p/ProgenitorMimic.java
index 156ae583dc9..2de51e27b9d 100644
--- a/Mage.Sets/src/mage/cards/p/ProgenitorMimic.java
+++ b/Mage.Sets/src/mage/cards/p/ProgenitorMimic.java
@@ -29,7 +29,7 @@ public final class ProgenitorMimic extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("no Token");
static {
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public ProgenitorMimic(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/Prosperity.java b/Mage.Sets/src/mage/cards/p/Prosperity.java
index edb928d7bc5..17d84d0b325 100644
--- a/Mage.Sets/src/mage/cards/p/Prosperity.java
+++ b/Mage.Sets/src/mage/cards/p/Prosperity.java
@@ -19,7 +19,7 @@ public final class Prosperity extends CardImpl {
// Each player draws X cards.
- this.getSpellAbility().addEffect(new DrawCardAllEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DrawCardAllEffect(ManacostVariableValue.instance));
}
public Prosperity(final Prosperity card) {
diff --git a/Mage.Sets/src/mage/cards/p/ProsshSkyraiderOfKher.java b/Mage.Sets/src/mage/cards/p/ProsshSkyraiderOfKher.java
index 3b3e48838b3..bc9badb09fe 100644
--- a/Mage.Sets/src/mage/cards/p/ProsshSkyraiderOfKher.java
+++ b/Mage.Sets/src/mage/cards/p/ProsshSkyraiderOfKher.java
@@ -38,7 +38,7 @@ public final class ProsshSkyraiderOfKher extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// When you cast Prossh, Skyraider of Kher, create X 0/1 red Kobold creature tokens named Kobolds of Kher Keep, where X is the amount of mana spent to cast Prossh.
- this.addAbility(new CastSourceTriggeredAbility(new CreateTokenEffect(new ProsshKoboldToken(), new ManaSpentToCastCount()), false));
+ this.addAbility(new CastSourceTriggeredAbility(new CreateTokenEffect(new ProsshKoboldToken(), ManaSpentToCastCount.instance), false));
// Sacrifice another creature: Prossh gets +1/+0 until end of turn.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, 0, Duration.EndOfTurn),
new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE, true))));
diff --git a/Mage.Sets/src/mage/cards/p/ProwessOfTheFair.java b/Mage.Sets/src/mage/cards/p/ProwessOfTheFair.java
index f642c2b466e..990e3e7b7ec 100644
--- a/Mage.Sets/src/mage/cards/p/ProwessOfTheFair.java
+++ b/Mage.Sets/src/mage/cards/p/ProwessOfTheFair.java
@@ -25,8 +25,8 @@ public final class ProwessOfTheFair extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.ELF));
- filter.add(new AnotherPredicate());
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.not(TokenPredicate.instance));
}
public ProwessOfTheFair(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/ProwlingCaracal.java b/Mage.Sets/src/mage/cards/p/ProwlingCaracal.java
new file mode 100644
index 00000000000..06efcb4f4b6
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/ProwlingCaracal.java
@@ -0,0 +1,32 @@
+package mage.cards.p;
+
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class ProwlingCaracal extends CardImpl {
+
+ public ProwlingCaracal(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
+
+ this.subtype.add(SubType.CAT);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+ }
+
+ private ProwlingCaracal(final ProwlingCaracal card) {
+ super(card);
+ }
+
+ @Override
+ public ProwlingCaracal copy() {
+ return new ProwlingCaracal(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PryingEyes.java b/Mage.Sets/src/mage/cards/p/PryingEyes.java
new file mode 100644
index 00000000000..0718b39ff29
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PryingEyes.java
@@ -0,0 +1,33 @@
+package mage.cards.p;
+
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.discard.DiscardControllerEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class PryingEyes extends CardImpl {
+
+ public PryingEyes(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{U}{U}");
+
+
+ // Draw four cards, then discard two cards.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(4));
+ this.getSpellAbility().addEffect(new DiscardControllerEffect(2).concatBy(", then"));
+ }
+
+ private PryingEyes(final PryingEyes card) {
+ super(card);
+ }
+
+ @Override
+ public PryingEyes copy() {
+ return new PryingEyes(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PsychicAllergy.java b/Mage.Sets/src/mage/cards/p/PsychicAllergy.java
index c7c5c4cfeb2..17af2bbb36b 100644
--- a/Mage.Sets/src/mage/cards/p/PsychicAllergy.java
+++ b/Mage.Sets/src/mage/cards/p/PsychicAllergy.java
@@ -84,7 +84,7 @@ class PsychicAllergyEffect extends OneShotEffect {
if (player != null) {
FilterPermanent filter = new FilterPermanent();
filter.add(new ColorPredicate((ObjectColor) game.getState().getValue(source.getSourceId() + "_color")));
- filter.add(Predicates.not(new TokenPredicate()));
+ filter.add(Predicates.not(TokenPredicate.instance));
int damage = game.getBattlefield().countAll(filter, player.getId(), game);
player.damage(damage, source.getSourceId(), game, false, true);
return true;
diff --git a/Mage.Sets/src/mage/cards/p/PsychicBattle.java b/Mage.Sets/src/mage/cards/p/PsychicBattle.java
index f4f3eb91b9a..6c77281e1a5 100644
--- a/Mage.Sets/src/mage/cards/p/PsychicBattle.java
+++ b/Mage.Sets/src/mage/cards/p/PsychicBattle.java
@@ -31,7 +31,7 @@ public final class PsychicBattle extends CardImpl {
public PsychicBattle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}{U}");
- // Whenever a player chooses one or more targets, each player reveals the top card of his or her library. The player who reveals the card with the highest converted mana cost may change the target or targets. If two or more cards are tied for highest cost, the target or targets remain unchanged. Changing targets this way doesn't trigger abilities of permanents named Psychic Battle.
+ // Whenever a player chooses one or more targets, each player reveals the top card of their library. The player who reveals the card with the highest converted mana cost may change the target or targets. If two or more cards are tied for highest cost, the target or targets remain unchanged. Changing targets this way doesn't trigger abilities of permanents named Psychic Battle.
this.addAbility(new PsychicBattleTriggeredAbility());
}
diff --git a/Mage.Sets/src/mage/cards/p/PsychicDrain.java b/Mage.Sets/src/mage/cards/p/PsychicDrain.java
index 6deb03654bf..8008a2e7fb3 100644
--- a/Mage.Sets/src/mage/cards/p/PsychicDrain.java
+++ b/Mage.Sets/src/mage/cards/p/PsychicDrain.java
@@ -21,9 +21,9 @@ public final class PsychicDrain extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{U}{B}");
// Target player puts the top X cards of their library into their graveyard and you gain X life.
- this.getSpellAbility().addEffect(new PutLibraryIntoGraveTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new PutLibraryIntoGraveTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetPlayer());
- Effect effect = new GainLifeEffect(new ManacostVariableValue());
+ Effect effect = new GainLifeEffect(ManacostVariableValue.instance);
effect.setText("and you gain X life");
this.getSpellAbility().addEffect(effect);
}
diff --git a/Mage.Sets/src/mage/cards/p/PsychicSurgery.java b/Mage.Sets/src/mage/cards/p/PsychicSurgery.java
index a3c04aa3268..b50c23af476 100644
--- a/Mage.Sets/src/mage/cards/p/PsychicSurgery.java
+++ b/Mage.Sets/src/mage/cards/p/PsychicSurgery.java
@@ -29,7 +29,7 @@ public final class PsychicSurgery extends CardImpl {
public PsychicSurgery(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
- // Whenever an opponent shuffles his or her library, you may look at the top two cards of that library.
+ // Whenever an opponent shuffles their library, you may look at the top two cards of that library.
// You may exile one of those cards. Then put the rest on top of that library in any order.
this.addAbility(new PsychicSurgeryTriggeredAbility());
}
diff --git a/Mage.Sets/src/mage/cards/p/PsychicTheft.java b/Mage.Sets/src/mage/cards/p/PsychicTheft.java
index b017003c210..1d2d9482687 100644
--- a/Mage.Sets/src/mage/cards/p/PsychicTheft.java
+++ b/Mage.Sets/src/mage/cards/p/PsychicTheft.java
@@ -162,7 +162,7 @@ class PsychicTheftCondition implements Condition {
if (!game.getExile().getExileZone(exileId).contains(cardId)) {
return false;
}
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName(), source.getSourceId());
+ SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class, source.getSourceId());
if (watcher != null) {
List spells = watcher.getSpellsCastThisTurn(source.getControllerId());
if (spells != null) {
diff --git a/Mage.Sets/src/mage/cards/p/PsychosisCrawler.java b/Mage.Sets/src/mage/cards/p/PsychosisCrawler.java
index 9df5371fa95..74128f25f30 100644
--- a/Mage.Sets/src/mage/cards/p/PsychosisCrawler.java
+++ b/Mage.Sets/src/mage/cards/p/PsychosisCrawler.java
@@ -28,7 +28,7 @@ public final class PsychosisCrawler extends CardImpl {
this.power = new MageInt(0);
this.toughness = new MageInt(0);
- this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new CardsInControllerHandCount(), Duration.EndOfGame)));
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(CardsInControllerHandCount.instance, Duration.EndOfGame)));
this.addAbility(new DrawCardControllerTriggeredAbility(new LoseLifeOpponentsEffect(1), false));
}
diff --git a/Mage.Sets/src/mage/cards/p/PsychoticFury.java b/Mage.Sets/src/mage/cards/p/PsychoticFury.java
index 89a2e8bb195..c8ebd40196f 100644
--- a/Mage.Sets/src/mage/cards/p/PsychoticFury.java
+++ b/Mage.Sets/src/mage/cards/p/PsychoticFury.java
@@ -22,7 +22,7 @@ public final class PsychoticFury extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("multicolored creature");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public PsychoticFury(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/Pteramander.java b/Mage.Sets/src/mage/cards/p/Pteramander.java
new file mode 100644
index 00000000000..0c5777a0d4d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/Pteramander.java
@@ -0,0 +1,87 @@
+package mage.cards.p;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.cost.CostModificationEffectImpl;
+import mage.abilities.effects.keyword.AdaptEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.players.Player;
+import mage.util.CardUtil;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Pteramander extends CardImpl {
+
+ public Pteramander(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}");
+
+ this.subtype.add(SubType.SALAMANDER);
+ this.subtype.add(SubType.DRAKE);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // {7}{U}: Adapt 4. This ability costs {1} less to activate for each instant and sorcery card in your graveyard.
+ // TODO: Make ability properly copiable
+ Ability ability = new SimpleActivatedAbility(new AdaptEffect(4).setText("Adapt 4. This ability costs {1} less to activate for each instant and sorcery card in your graveyard."), new ManaCostsImpl("{7}{U}"));
+ this.addAbility(ability);
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new PteramanderCostIncreasingEffect(ability.getOriginalId())));
+ }
+
+ private Pteramander(final Pteramander card) {
+ super(card);
+ }
+
+ @Override
+ public Pteramander copy() {
+ return new Pteramander(this);
+ }
+}
+
+class PteramanderCostIncreasingEffect extends CostModificationEffectImpl {
+
+ private final UUID originalId;
+
+ PteramanderCostIncreasingEffect(UUID originalId) {
+ super(Duration.EndOfGame, Outcome.Benefit, CostModificationType.REDUCE_COST);
+ this.originalId = originalId;
+ }
+
+ private PteramanderCostIncreasingEffect(final PteramanderCostIncreasingEffect effect) {
+ super(effect);
+ this.originalId = effect.originalId;
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source, Ability abilityToModify) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ CardUtil.reduceCost(abilityToModify, controller.getGraveyard().count(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game));
+ }
+ return true;
+ }
+
+ @Override
+ public boolean applies(Ability abilityToModify, Ability source, Game game) {
+ return abilityToModify.getOriginalId().equals(originalId);
+ }
+
+ @Override
+ public PteramanderCostIncreasingEffect copy() {
+ return new PteramanderCostIncreasingEffect(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/p/PucasMischief.java b/Mage.Sets/src/mage/cards/p/PucasMischief.java
index cb5f3d419e3..dcf0628b1b4 100644
--- a/Mage.Sets/src/mage/cards/p/PucasMischief.java
+++ b/Mage.Sets/src/mage/cards/p/PucasMischief.java
@@ -64,11 +64,6 @@ class TargetControlledPermanentWithCMCGreaterOrLessThanOpponentPermanent extends
super(target);
}
- @Override
- public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) {
- return super.canTarget(controllerId, id, source, game);
- }
-
@Override
public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
Set possibleTargets = new HashSet<>();
diff --git a/Mage.Sets/src/mage/cards/p/PullFromEternity.java b/Mage.Sets/src/mage/cards/p/PullFromEternity.java
index 46fe77e642c..5a7aecf42da 100644
--- a/Mage.Sets/src/mage/cards/p/PullFromEternity.java
+++ b/Mage.Sets/src/mage/cards/p/PullFromEternity.java
@@ -26,7 +26,7 @@ public final class PullFromEternity extends CardImpl {
private static final FilterCard filter = new FilterCard("face-up exiled card");
static {
- filter.add(Predicates.not(new FaceDownPredicate()));
+ filter.add(Predicates.not(FaceDownPredicate.instance));
}
public PullFromEternity(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java b/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java
index 2a2760fdebb..bc190746707 100644
--- a/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java
+++ b/Mage.Sets/src/mage/cards/p/PullFromTomorrow.java
@@ -20,7 +20,7 @@ public final class PullFromTomorrow extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{X}{U}{U}");
// Draw X cards, then discard a card.
- getSpellAbility().addEffect(new DrawCardSourceControllerEffect(new ManacostVariableValue()));
+ getSpellAbility().addEffect(new DrawCardSourceControllerEffect(ManacostVariableValue.instance));
Effect effect = new DiscardControllerEffect(1);
effect.setText(", then discard a card");
getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/p/PuppetMaster.java b/Mage.Sets/src/mage/cards/p/PuppetMaster.java
new file mode 100644
index 00000000000..7b4a6f874bc
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PuppetMaster.java
@@ -0,0 +1,95 @@
+
+package mage.cards.p;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesAttachedTriggeredAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author L_J
+ */
+public final class PuppetMaster extends CardImpl {
+
+ public PuppetMaster(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}{U}{U}");
+ this.subtype.add(SubType.AURA);
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // When enchanted creature dies, return that card to its owner's hand. If that card is returned to its owner’s hand this way, you may pay {U}{U}{U}. If you do, return Puppet Master to its owner’s hand.
+ this.addAbility(new DiesAttachedTriggeredAbility(new PuppetMasterEffect(), "enchanted creature"));
+ }
+
+ public PuppetMaster(final PuppetMaster card) {
+ super(card);
+ }
+
+ @Override
+ public PuppetMaster copy() {
+ return new PuppetMaster(this);
+ }
+}
+
+class PuppetMasterEffect extends OneShotEffect {
+
+ public PuppetMasterEffect() {
+ super(Outcome.ReturnToHand);
+ staticText = "return that card to its owner's hand. If that card is returned to its owner’s hand this way, you may pay {U}{U}{U}. If you do, return {this} to its owner’s hand";
+ }
+
+ public PuppetMasterEffect(final PuppetMasterEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PuppetMasterEffect copy() {
+ return new PuppetMasterEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Object object = getValue("attachedTo");
+ if (object instanceof Permanent) {
+ Card card = game.getCard(((Permanent)object).getId());
+ if (card != null) {
+ if (card.moveToZone(Zone.HAND, source.getSourceId(), game, false)) {
+ Cost cost = new ManaCostsImpl("{U}{U}{U}");
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
+ if (controller != null && sourcePermanent != null) {
+ if (controller.chooseUse(Outcome.Neutral, "Pay " + cost.getText() + " to return " + sourcePermanent.getLogName() + " to its owner's hand?", source, game)
+ && cost.pay(source, game, source.getSourceId(), controller.getId(), false, null)) {
+ sourcePermanent.moveToZone(Zone.HAND, source.getSourceId(), game, false);
+ }
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/p/PuppeteerClique.java b/Mage.Sets/src/mage/cards/p/PuppeteerClique.java
index 774fa5d6a56..6e874521b63 100644
--- a/Mage.Sets/src/mage/cards/p/PuppeteerClique.java
+++ b/Mage.Sets/src/mage/cards/p/PuppeteerClique.java
@@ -1,7 +1,6 @@
package mage.cards.p;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
@@ -17,12 +16,7 @@ import mage.abilities.keyword.PersistAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.TargetController;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -31,15 +25,15 @@ import mage.target.Target;
import mage.target.common.TargetCardInOpponentsGraveyard;
import mage.target.targetpointer.FixedTarget;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
- *
*/
public final class PuppeteerClique extends CardImpl {
public PuppeteerClique(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
this.subtype.add(SubType.FAERIE);
this.subtype.add(SubType.WIZARD);
@@ -59,7 +53,7 @@ public final class PuppeteerClique extends CardImpl {
this.addAbility(new PersistAbility());
}
- public PuppeteerClique(final PuppeteerClique card) {
+ private PuppeteerClique(final PuppeteerClique card) {
super(card);
}
@@ -71,12 +65,12 @@ public final class PuppeteerClique extends CardImpl {
class PuppeteerCliqueEffect extends OneShotEffect {
- public PuppeteerCliqueEffect() {
+ PuppeteerCliqueEffect() {
super(Outcome.PutCreatureInPlay);
staticText = "put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. At the beginning of your next end step, exile it";
}
- public PuppeteerCliqueEffect(final PuppeteerCliqueEffect effect) {
+ private PuppeteerCliqueEffect(final PuppeteerCliqueEffect effect) {
super(effect);
}
@@ -87,26 +81,25 @@ class PuppeteerCliqueEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- boolean result = false;
Card card = game.getCard(getTargetPointer().getFirst(game, source));
- if (card != null) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
- Permanent permanent = game.getPermanent(card.getId());
- if (permanent != null) {
- ContinuousEffect hasteEffect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom);
- hasteEffect.setTargetPointer(new FixedTarget(permanent, game));
- game.addEffect(hasteEffect, source);
- ExileTargetEffect exileEffect = new ExileTargetEffect("exile " + permanent.getLogName());
- exileEffect.setTargetPointer(new FixedTarget(permanent, game));
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect, TargetController.YOU);
- game.addDelayedTriggeredAbility(delayedAbility, source);
- result = true;
- }
- }
- }
+ if (card == null) {
+ return false;
}
- return result;
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null || !controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
+ return false;
+ }
+ Permanent permanent = game.getPermanent(card.getId());
+ if (permanent == null) {
+ return false;
+ }
+ ContinuousEffect hasteEffect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom);
+ hasteEffect.setTargetPointer(new FixedTarget(permanent, game));
+ game.addEffect(hasteEffect, source);
+ ExileTargetEffect exileEffect = new ExileTargetEffect("exile " + permanent.getLogName());
+ exileEffect.setTargetPointer(new FixedTarget(permanent, game));
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect, TargetController.YOU);
+ game.addDelayedTriggeredAbility(delayedAbility, source);
+ return true;
}
}
diff --git a/Mage.Sets/src/mage/cards/p/PuppetsVerdict.java b/Mage.Sets/src/mage/cards/p/PuppetsVerdict.java
index ab3f3183fbb..080d25a75cf 100644
--- a/Mage.Sets/src/mage/cards/p/PuppetsVerdict.java
+++ b/Mage.Sets/src/mage/cards/p/PuppetsVerdict.java
@@ -54,7 +54,7 @@ class PuppetsVerdictEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, true)) {
FilterCreaturePermanent filterPower2OrLess = new FilterCreaturePermanent("all creatures power 2 or less");
filterPower2OrLess.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
diff --git a/Mage.Sets/src/mage/cards/p/PureSimple.java b/Mage.Sets/src/mage/cards/p/PureSimple.java
index b73bf79b0ce..e14378e1c52 100644
--- a/Mage.Sets/src/mage/cards/p/PureSimple.java
+++ b/Mage.Sets/src/mage/cards/p/PureSimple.java
@@ -27,7 +27,7 @@ public final class PureSimple extends SplitCard {
static {
filterDestroy.add(Predicates.or(new SubtypePredicate(SubType.AURA), new SubtypePredicate(SubType.EQUIPMENT)));
- filterMulticolor.add(new MulticoloredPredicate());
+ filterMulticolor.add(MulticoloredPredicate.instance);
}
public PureSimple(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PurphorosGodOfTheForge.java b/Mage.Sets/src/mage/cards/p/PurphorosGodOfTheForge.java
index ad1bc787fa0..31c7ecc8676 100644
--- a/Mage.Sets/src/mage/cards/p/PurphorosGodOfTheForge.java
+++ b/Mage.Sets/src/mage/cards/p/PurphorosGodOfTheForge.java
@@ -27,7 +27,7 @@ public final class PurphorosGodOfTheForge extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public PurphorosGodOfTheForge(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/p/PutAway.java b/Mage.Sets/src/mage/cards/p/PutAway.java
index b67ccad8ac7..0f4c6da129f 100644
--- a/Mage.Sets/src/mage/cards/p/PutAway.java
+++ b/Mage.Sets/src/mage/cards/p/PutAway.java
@@ -1,7 +1,5 @@
-
package mage.cards.p;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
@@ -17,15 +15,15 @@ import mage.players.Player;
import mage.target.TargetSpell;
import mage.target.common.TargetCardInYourGraveyard;
+import java.util.UUID;
+
/**
- *
* @author jeffwadsworth
- *
*/
public final class PutAway extends CardImpl {
public PutAway(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{U}");
// Counter target spell. You may shuffle up to one target card from your graveyard into your library.
@@ -46,7 +44,7 @@ public final class PutAway extends CardImpl {
}
class PutAwayEffect extends OneShotEffect {
-
+
boolean countered = false;
public PutAwayEffect() {
@@ -66,15 +64,14 @@ class PutAwayEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Spell spell = game.getStack().getSpell(source.getFirstTarget());
- Card card = game.getCard(source.getTargets().get(1).getFirstTarget());
- Player you = game.getPlayer(source.getControllerId());
- if (spell != null
- && game.getStack().counter(spell.getId(), source.getSourceId(), game)) {
+ if (spell != null && game.getStack().counter(spell.getId(), source.getSourceId(), game)) {
countered = true;
}
- if (you != null) {
- if (card != null
- && you.chooseUse(Outcome.Benefit, "Do you wish to shuffle up to one target card from your graveyard into your library?", source, game)
+
+ Card card = game.getCard(source.getTargets().get(1).getFirstTarget());
+ Player you = game.getPlayer(source.getControllerId());
+ if (you != null && card != null) {
+ if (you.chooseUse(Outcome.Benefit, "Do you wish to shuffle up to one target card from your graveyard into your library?", source, game)
&& game.getState().getZone(card.getId()).match(Zone.GRAVEYARD)) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
you.shuffleLibrary(source, game);
diff --git a/Mage.Sets/src/mage/cards/p/PyromancersAssault.java b/Mage.Sets/src/mage/cards/p/PyromancersAssault.java
index 8bc1f2d92f0..f51ade62545 100644
--- a/Mage.Sets/src/mage/cards/p/PyromancersAssault.java
+++ b/Mage.Sets/src/mage/cards/p/PyromancersAssault.java
@@ -63,7 +63,7 @@ class PyromancersAssaultTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getPlayerId().equals(controllerId)) {
- CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get(CastSpellLastTurnWatcher.class.getSimpleName());
+ CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class);
if (watcher != null && watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(event.getPlayerId()) == 2) {
return true;
}
diff --git a/Mage.Sets/src/mage/cards/p/Pyromancy.java b/Mage.Sets/src/mage/cards/p/Pyromancy.java
index b1d4d0a3cfb..4cc770be5a9 100644
--- a/Mage.Sets/src/mage/cards/p/Pyromancy.java
+++ b/Mage.Sets/src/mage/cards/p/Pyromancy.java
@@ -25,7 +25,7 @@ public final class Pyromancy extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{R}{R}");
// {3}, Discard a card at random: Pyromancy deals damage to any target equal to the converted mana cost of the discarded card.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new DiscardCostCardConvertedMana()), new ManaCostsImpl("{3}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(DiscardCostCardConvertedMana.instance), new ManaCostsImpl("{3}"));
ability.addTarget(new TargetAnyTarget());
ability.addCost(new DiscardCardCost(true));
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/cards/q/QuagVampires.java b/Mage.Sets/src/mage/cards/q/QuagVampires.java
index 4cd03cf178e..ebea1544997 100644
--- a/Mage.Sets/src/mage/cards/q/QuagVampires.java
+++ b/Mage.Sets/src/mage/cards/q/QuagVampires.java
@@ -36,7 +36,7 @@ public final class QuagVampires extends CardImpl {
// Quag Vampires enters the battlefield with a +1/+1 counter on it for each time it was kicked.
this.addAbility(new EntersBattlefieldAbility(
- new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), new MultikickerCount(), true),
+ new AddCountersSourceEffect(CounterType.P1P1.createInstance(0), MultikickerCount.instance, true),
"with a +1/+1 counter on it for each time it was kicked"));
}
diff --git a/Mage.Sets/src/mage/cards/q/QuarantineField.java b/Mage.Sets/src/mage/cards/q/QuarantineField.java
index ee87bc53b4e..591e3c8d549 100644
--- a/Mage.Sets/src/mage/cards/q/QuarantineField.java
+++ b/Mage.Sets/src/mage/cards/q/QuarantineField.java
@@ -1,7 +1,6 @@
package mage.cards.q;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -21,10 +20,12 @@ import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
import mage.util.CardUtil;
+import java.util.UUID;
+
/**
- *
* @author LevelX2
*/
public final class QuarantineField extends CardImpl {
@@ -35,42 +36,43 @@ public final class QuarantineField extends CardImpl {
// Quarantine Field enters the battlefield with X isolation counters on it.
this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.ISOLATION.createInstance())));
- // When Quarantine Field enters the battlefield, for each isolation counter on it, exile up to one target nonland permanent an opponenet controls until Quarantine Field leaves the battlefield.
+ // When Quarantine Field enters the battlefield, for each isolation counter on it, exile up to one target nonland permanent an opponent controls until Quarantine Field leaves the battlefield.
Ability ability = new EntersBattlefieldTriggeredAbility(new QuarantineFieldEffect(), false);
ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()));
+ ability.setTargetAdjuster(QuarantineFieldAdjuster.instance);
this.addAbility(ability);
-
}
public QuarantineField(final QuarantineField card) {
super(card);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof EntersBattlefieldTriggeredAbility) {
- Permanent sourceObject = game.getPermanent(ability.getSourceId());
- if (sourceObject != null) {
- int isolationCounters = sourceObject.getCounters(game).getCount(CounterType.ISOLATION);
- FilterNonlandPermanent filter = new FilterNonlandPermanent("up to " + isolationCounters + " nonland permanents controlled by any opponents");
- filter.add(new ControllerPredicate(TargetController.OPPONENT));
- ability.addTarget(new TargetPermanent(0, isolationCounters, filter, false));
- }
-
- }
- }
-
@Override
public QuarantineField copy() {
return new QuarantineField(this);
}
}
+enum QuarantineFieldAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Permanent sourceObject = game.getPermanent(ability.getSourceId());
+ if (sourceObject != null) {
+ int isolationCounters = sourceObject.getCounters(game).getCount(CounterType.ISOLATION);
+ FilterNonlandPermanent filter = new FilterNonlandPermanent("up to " + isolationCounters + " nonland permanents controlled by an opponent");
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ ability.addTarget(new TargetPermanent(0, isolationCounters, filter, false));
+ }
+ }
+}
+
class QuarantineFieldEffect extends OneShotEffect {
public QuarantineFieldEffect() {
super(Outcome.Exile);
- this.staticText = "for each isolation counter on it, exile up to one target nonland permanent an opponenet controls until {this} leaves the battlefield";
+ this.staticText = "for each isolation counter on it, exile up to one target nonland permanent an opponent controls until {this} leaves the battlefield";
}
public QuarantineFieldEffect(final QuarantineFieldEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/q/Quench.java b/Mage.Sets/src/mage/cards/q/Quench.java
new file mode 100644
index 00000000000..e1ca7a659fd
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/q/Quench.java
@@ -0,0 +1,33 @@
+package mage.cards.q;
+
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.CounterUnlessPaysEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.target.TargetSpell;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Quench extends CardImpl {
+
+ public Quench(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
+
+ // Counter target spell unless its controller pays {2}.
+ this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new GenericManaCost(2)));
+ this.getSpellAbility().addTarget(new TargetSpell());
+ }
+
+ private Quench(final Quench card) {
+ super(card);
+ }
+
+ @Override
+ public Quench copy() {
+ return new Quench(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/q/Quicken.java b/Mage.Sets/src/mage/cards/q/Quicken.java
index e34973989e3..5025cb4e9da 100644
--- a/Mage.Sets/src/mage/cards/q/Quicken.java
+++ b/Mage.Sets/src/mage/cards/q/Quicken.java
@@ -64,7 +64,7 @@ class QuickenAsThoughEffect extends AsThoughEffectImpl {
@Override
public void init(Ability source, Game game) {
- quickenWatcher = (QuickenWatcher) game.getState().getWatchers().get(QuickenWatcher.class.getSimpleName());
+ quickenWatcher = game.getState().getWatcher(QuickenWatcher.class);
Card card = game.getCard(source.getSourceId());
if (quickenWatcher != null && card != null) {
zoneChangeCounter = card.getZoneChangeCounter(game);
@@ -100,7 +100,7 @@ class QuickenWatcher extends Watcher {
public List activeQuickenSpells = new ArrayList<>();
public QuickenWatcher() {
- super(QuickenWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(QuickenWatcher.class, WatcherScope.GAME);
}
public QuickenWatcher(final QuickenWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/q/Quickling.java b/Mage.Sets/src/mage/cards/q/Quickling.java
index abc6ffa7e7b..4f409074ec3 100644
--- a/Mage.Sets/src/mage/cards/q/Quickling.java
+++ b/Mage.Sets/src/mage/cards/q/Quickling.java
@@ -60,7 +60,7 @@ class QuicklingEffect extends OneShotEffect {
private static final String effectText = "sacrifice it unless you return another creature you control to its owner's hand";
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
QuicklingEffect() {
diff --git a/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java b/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java
index 418f839664b..5782524f16e 100644
--- a/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java
+++ b/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java
@@ -1,6 +1,6 @@
-
package mage.cards.q;
+import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
@@ -12,19 +12,24 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.DependencyType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.common.FilterLandPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
-import mage.target.targetpointer.FixedTarget;
-
-import java.util.UUID;
-import mage.filter.predicate.permanent.ControllerPredicate;
import mage.target.common.TargetLandPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+import mage.target.targetpointer.FixedTarget;
/**
*
@@ -32,42 +37,22 @@ import mage.target.common.TargetLandPermanent;
*/
public final class QuicksilverFountain extends CardImpl {
- public final UUID originalId;
-
public QuicksilverFountain(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// At the beginning of each player's upkeep, that player puts a flood counter on target non-Island land he or she controls of their choice. That land is an Island for as long as it has a flood counter on it.
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new QuicksilverFountainEffect(), TargetController.ANY, false, true);
ability.addTarget(new TargetLandPermanent());
- originalId = ability.getOriginalId();
+ ability.setTargetAdjuster(QuicksilverFountainAdjuster.instance);
this.addAbility(ability);
// At the beginning of each end step, if all lands on the battlefield are Islands, remove all flood counters from them.
Condition condition = new AllLandsAreSubtypeCondition(SubType.ISLAND);
this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new QuicksilverFountainEffect2(), TargetController.ANY, condition, false));
-
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- Player activePlayer = game.getPlayer(game.getActivePlayerId());
- if (activePlayer != null) {
- ability.getTargets().clear();
- FilterLandPermanent filter = new FilterLandPermanent();
- filter.add(Predicates.not(new SubtypePredicate(SubType.ISLAND)));
- filter.add(new ControllerPredicate(TargetController.ACTIVE));
- TargetLandPermanent target = new TargetLandPermanent(1, 1, filter, false);
- target.setTargetController(activePlayer.getId());
- ability.getTargets().add(target);
- }
- }
}
public QuicksilverFountain(final QuicksilverFountain card) {
super(card);
- this.originalId = card.originalId;
}
@Override
@@ -76,11 +61,29 @@ public final class QuicksilverFountain extends CardImpl {
}
}
+enum QuicksilverFountainAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player activePlayer = game.getPlayer(game.getActivePlayerId());
+ if (activePlayer != null) {
+ ability.getTargets().clear();
+ FilterLandPermanent filter = new FilterLandPermanent();
+ filter.add(Predicates.not(new SubtypePredicate(SubType.ISLAND)));
+ filter.add(new ControllerPredicate(TargetController.ACTIVE));
+ TargetLandPermanent target = new TargetLandPermanent(1, 1, filter, false);
+ target.setTargetController(activePlayer.getId());
+ ability.getTargets().add(target);
+ }
+ }
+}
+
class QuicksilverFountainEffect extends OneShotEffect {
public QuicksilverFountainEffect() {
super(Outcome.Neutral);
- staticText = "that player puts a flood counter on target non-Island land he or she controls of their choice. That land is an Island for as long as it has a flood counter on it";
+ staticText = "that player puts a flood counter on target non-Island land they control of their choice. That land is an Island for as long as it has a flood counter on it";
}
public QuicksilverFountainEffect(final QuicksilverFountainEffect effect) {
diff --git a/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java b/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java
index e98d72f8038..5aa3ab80996 100644
--- a/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java
+++ b/Mage.Sets/src/mage/cards/q/QuillmaneBaku.java
@@ -1,4 +1,3 @@
-
package mage.cards.q;
import java.util.UUID;
@@ -27,16 +26,15 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetadjustment.TargetAdjuster;
/**
* @author LevelX2
*/
public final class QuillmaneBaku extends CardImpl {
- private final UUID originalId;
-
public QuillmaneBaku(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}");
this.subtype.add(SubType.SPIRIT);
this.power = new MageInt(3);
@@ -45,70 +43,70 @@ public final class QuillmaneBaku extends CardImpl {
// Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku.
this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.SPIRIT_OR_ARCANE_CARD, true));
- //TODO: Make ability properly copiable
// {1}, Tap, Remove X ki counters from Quillmane Baku: Return target creature with converted mana cost X or less to its owner's hand.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new QuillmaneBakuReturnEffect(), new GenericManaCost(1));
ability.addCost(new TapSourceCost());
ability.addCost(new RemoveVariableCountersSourceCost(CounterType.KI.createInstance(1)));
ability.addTarget(new TargetCreaturePermanent());
- originalId = ability.getOriginalId();
+ ability.setTargetAdjuster(QuillmaneBakuAdjuster.instance);
this.addAbility(ability);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability.getOriginalId().equals(originalId)) {
- int maxConvManaCost = 0;
- for (Cost cost : ability.getCosts()) {
- if (cost instanceof RemoveVariableCountersSourceCost) {
- maxConvManaCost = ((RemoveVariableCountersSourceCost) cost).getAmount();
- }
- }
- ability.getTargets().clear();
- FilterCreaturePermanent newFilter = new FilterCreaturePermanent("creature with converted mana cost " + maxConvManaCost + " or less");
- newFilter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, maxConvManaCost + 1));
- TargetCreaturePermanent target = new TargetCreaturePermanent(newFilter);
- ability.getTargets().add(target);
- }
- }
-
public QuillmaneBaku(final QuillmaneBaku card) {
super(card);
- this.originalId = card.originalId;
}
@Override
public QuillmaneBaku copy() {
return new QuillmaneBaku(this);
}
+}
- static class QuillmaneBakuReturnEffect extends OneShotEffect {
+enum QuillmaneBakuAdjuster implements TargetAdjuster {
+ instance;
- public QuillmaneBakuReturnEffect() {
- super(Outcome.ReturnToHand);
- this.staticText = "Return target creature with converted mana cost X or less to its owner's hand";
- }
-
- public QuillmaneBakuReturnEffect(final QuillmaneBakuReturnEffect effect) {
- super(effect);
- }
-
- @Override
- public QuillmaneBakuReturnEffect copy() {
- return new QuillmaneBakuReturnEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller == null) {
- return false;
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ int maxConvManaCost = 0;
+ for (Cost cost : ability.getCosts()) {
+ if (cost instanceof RemoveVariableCountersSourceCost) {
+ maxConvManaCost = ((RemoveVariableCountersSourceCost) cost).getAmount();
}
- Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source));
- if (permanent != null) {
- controller.moveCards(permanent, Zone.HAND, source, game);
- }
- return true;
}
+ ability.getTargets().clear();
+ FilterCreaturePermanent newFilter = new FilterCreaturePermanent("creature with converted mana cost " + maxConvManaCost + " or less");
+ newFilter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, maxConvManaCost + 1));
+ TargetCreaturePermanent target = new TargetCreaturePermanent(newFilter);
+ ability.getTargets().add(target);
+ }
+}
+
+class QuillmaneBakuReturnEffect extends OneShotEffect {
+
+ public QuillmaneBakuReturnEffect() {
+ super(Outcome.ReturnToHand);
+ this.staticText = "Return target creature with converted mana cost X or less to its owner's hand";
+ }
+
+ public QuillmaneBakuReturnEffect(final QuillmaneBakuReturnEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public QuillmaneBakuReturnEffect copy() {
+ return new QuillmaneBakuReturnEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
+ return false;
+ }
+ Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source));
+ if (permanent != null) {
+ controller.moveCards(permanent, Zone.HAND, source, game);
+ }
+ return true;
}
}
diff --git a/Mage.Sets/src/mage/cards/r/RadiantArchangel.java b/Mage.Sets/src/mage/cards/r/RadiantArchangel.java
index e75d2d19a8a..263c3f97797 100644
--- a/Mage.Sets/src/mage/cards/r/RadiantArchangel.java
+++ b/Mage.Sets/src/mage/cards/r/RadiantArchangel.java
@@ -29,7 +29,7 @@ public final class RadiantArchangel extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("other creature with flying on the battlefield");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new AbilityPredicate(FlyingAbility.class));
}
diff --git a/Mage.Sets/src/mage/cards/r/RadiantPurge.java b/Mage.Sets/src/mage/cards/r/RadiantPurge.java
index 538c50c9ecc..f4a393fd22c 100644
--- a/Mage.Sets/src/mage/cards/r/RadiantPurge.java
+++ b/Mage.Sets/src/mage/cards/r/RadiantPurge.java
@@ -21,8 +21,8 @@ public final class RadiantPurge extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("multicolored creature or multicolored enchantment");
static {
filter.add(Predicates.or(
- Predicates.and(new CardTypePredicate(CardType.CREATURE), new MulticoloredPredicate()),
- Predicates.and(new CardTypePredicate(CardType.ENCHANTMENT), new MulticoloredPredicate())));
+ Predicates.and(new CardTypePredicate(CardType.CREATURE), MulticoloredPredicate.instance),
+ Predicates.and(new CardTypePredicate(CardType.ENCHANTMENT), MulticoloredPredicate.instance)));
}
public RadiantPurge(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RaffCapashenShipsMage.java b/Mage.Sets/src/mage/cards/r/RaffCapashenShipsMage.java
index 599a30b642c..1a399e4d416 100644
--- a/Mage.Sets/src/mage/cards/r/RaffCapashenShipsMage.java
+++ b/Mage.Sets/src/mage/cards/r/RaffCapashenShipsMage.java
@@ -26,7 +26,7 @@ public final class RaffCapashenShipsMage extends CardImpl {
private static final FilterCard filter = new FilterCard("historic spells");
static {
- filter.add(new HistoricPredicate());
+ filter.add(HistoricPredicate.instance);
}
public RaffCapashenShipsMage(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RageForger.java b/Mage.Sets/src/mage/cards/r/RageForger.java
index b840f2e7fe4..fb10108d1d3 100644
--- a/Mage.Sets/src/mage/cards/r/RageForger.java
+++ b/Mage.Sets/src/mage/cards/r/RageForger.java
@@ -38,7 +38,7 @@ public final class RageForger extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.SHAMAN));
filter.add(new ControllerPredicate(TargetController.YOU));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filterAttack.add(new CounterPredicate(CounterType.P1P1));
}
diff --git a/Mage.Sets/src/mage/cards/r/Ragefire.java b/Mage.Sets/src/mage/cards/r/Ragefire.java
new file mode 100644
index 00000000000..4dbe92e7040
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/Ragefire.java
@@ -0,0 +1,32 @@
+package mage.cards.r;
+
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Ragefire extends CardImpl {
+
+ public Ragefire(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}");
+
+ // Ragefire deals 3 damage to target creature.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(3));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ private Ragefire(final Ragefire card) {
+ super(card);
+ }
+
+ @Override
+ public Ragefire copy() {
+ return new Ragefire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RagingSwordtooth.java b/Mage.Sets/src/mage/cards/r/RagingSwordtooth.java
index 4b5253d56a0..5856a612a88 100644
--- a/Mage.Sets/src/mage/cards/r/RagingSwordtooth.java
+++ b/Mage.Sets/src/mage/cards/r/RagingSwordtooth.java
@@ -22,7 +22,7 @@ public final class RagingSwordtooth extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("other creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public RagingSwordtooth(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RagsRiches.java b/Mage.Sets/src/mage/cards/r/RagsRiches.java
index 29033770e5f..d8004b70a7c 100644
--- a/Mage.Sets/src/mage/cards/r/RagsRiches.java
+++ b/Mage.Sets/src/mage/cards/r/RagsRiches.java
@@ -32,7 +32,7 @@ public final class RagsRiches extends SplitCard {
// to
// Riches
// Each opponent chooses a creature he or she controls. You gain control of each of those creatures.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new RichesEffect());
}
diff --git a/Mage.Sets/src/mage/cards/r/RaidingParty.java b/Mage.Sets/src/mage/cards/r/RaidingParty.java
index 4ea934955a3..9449c53670c 100644
--- a/Mage.Sets/src/mage/cards/r/RaidingParty.java
+++ b/Mage.Sets/src/mage/cards/r/RaidingParty.java
@@ -73,7 +73,7 @@ class RaidingPartyEffect extends OneShotEffect {
private static final FilterPermanent filter2 = new FilterPermanent("Plains");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new ColorPredicate(ObjectColor.WHITE));
filter2.add(new SubtypePredicate(SubType.PLAINS));
}
diff --git a/Mage.Sets/src/mage/cards/r/RakdosAugermage.java b/Mage.Sets/src/mage/cards/r/RakdosAugermage.java
index 422d4c32918..3fa747f9f58 100644
--- a/Mage.Sets/src/mage/cards/r/RakdosAugermage.java
+++ b/Mage.Sets/src/mage/cards/r/RakdosAugermage.java
@@ -5,8 +5,6 @@ import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.RevealHandSourceControllerEffect;
-import mage.abilities.effects.common.RevealHandTargetEffect;
import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.*;
@@ -23,14 +21,13 @@ import mage.target.common.TargetOpponent;
import java.util.UUID;
/**
- *
* @author noahg
*/
public final class RakdosAugermage extends CardImpl {
public RakdosAugermage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{B}{R}");
-
+
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(3);
@@ -71,16 +68,16 @@ class RakdosAugermageEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
- Card sourceCard = game.getCard(source.getSourceId());
if (player != null && controller != null) {
Cards revealedCards = new CardsImpl();
revealedCards.addAll(controller.getHand());
- player.revealCards((sourceCard != null ? sourceCard.getIdName() + " (" + sourceCard.getZoneChangeCounter(game) + ") (" : "Discard (")+controller.getName()+")", revealedCards, game);
+ Card sourceCard = game.getCard(source.getSourceId());
+ player.revealCards((sourceCard != null ? sourceCard.getIdName() + " (" + sourceCard.getZoneChangeCounter(game) + ") (" : "Discard (") + controller.getName() + ")", revealedCards, game);
TargetCard target = new TargetCard(Zone.HAND, new FilterCard());
if (player.choose(Outcome.Benefit, revealedCards, target, game)) {
Card card = revealedCards.get(target.getFirstTarget(), game);
if (card != null) {
- return player.discard(card, source, game);
+ return player.discard(card, source, game);
}
}
}
diff --git a/Mage.Sets/src/mage/cards/r/RakdosLocket.java b/Mage.Sets/src/mage/cards/r/RakdosLocket.java
new file mode 100644
index 00000000000..1af6807bde1
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RakdosLocket.java
@@ -0,0 +1,46 @@
+package mage.cards.r;
+
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Zone;
+
+import java.util.UUID;
+
+/**
+ * @author JayDi85
+ */
+public final class RakdosLocket extends CardImpl {
+
+ public RakdosLocket(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
+
+ // {T}: Add {B} or {R}.
+ this.addAbility(new BlackManaAbility());
+ this.addAbility(new RedManaAbility());
+
+ // {B/R}{B/R}{B/R}{B/R}, {T}, Sacrifice Rakdos Locket: Draw two cards.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new ManaCostsImpl<>("{B/R}{B/R}{B/R}{B/R}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public RakdosLocket(final RakdosLocket card) {
+ super(card);
+ }
+
+ @Override
+ public RakdosLocket copy() {
+ return new RakdosLocket(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java b/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java
index 31d5b44e3d4..7ada8448d2b 100644
--- a/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java
+++ b/Mage.Sets/src/mage/cards/r/RakdosLordOfRiots.java
@@ -105,7 +105,7 @@ class RakdosLordOfRiotsCostReductionEffect extends CostModificationEffectImpl {
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
- Ability spellAbility = (SpellAbility) abilityToModify;
+ Ability spellAbility = abilityToModify;
if (spellAbility != null) {
OpponentsLostLifeCount dynamicValue = new OpponentsLostLifeCount();
int amount = dynamicValue.calculate(game, source, this);
diff --git a/Mage.Sets/src/mage/cards/r/RakdosRoustabout.java b/Mage.Sets/src/mage/cards/r/RakdosRoustabout.java
new file mode 100644
index 00000000000..301aed4e1dd
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RakdosRoustabout.java
@@ -0,0 +1,79 @@
+package mage.cards.r;
+
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.target.targetpointer.FixedTarget;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class RakdosRoustabout extends CardImpl {
+
+ public RakdosRoustabout(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{R}");
+
+ this.subtype.add(SubType.OGRE);
+ this.subtype.add(SubType.WARRIOR);
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Whenever Rakdos Roustabout becomes blocked, it deals 1 damage to the player or planeswalker its attacking.
+ this.addAbility(new RakdosRoustaboutAbility());
+ }
+
+ private RakdosRoustabout(final RakdosRoustabout card) {
+ super(card);
+ }
+
+ @Override
+ public RakdosRoustabout copy() {
+ return new RakdosRoustabout(this);
+ }
+}
+
+class RakdosRoustaboutAbility extends TriggeredAbilityImpl {
+
+ RakdosRoustaboutAbility() {
+ super(Zone.BATTLEFIELD, new DamageTargetEffect(1));
+ }
+
+ private RakdosRoustaboutAbility(final RakdosRoustaboutAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public RakdosRoustaboutAbility copy() {
+ return new RakdosRoustaboutAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.CREATURE_BLOCKED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (sourceId.equals(event.getTargetId())) {
+ this.getEffects().get(0).setTargetPointer(
+ new FixedTarget(game.getCombat().getDefenderId(event.getTargetId()), game)
+ );
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever {this} becomes blocked, it deals 1 damage to the player or planeswalker it’s attacking";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RakdosTheShowstopper.java b/Mage.Sets/src/mage/cards/r/RakdosTheShowstopper.java
new file mode 100644
index 00000000000..be9118e141c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RakdosTheShowstopper.java
@@ -0,0 +1,89 @@
+package mage.cards.r;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class RakdosTheShowstopper extends CardImpl {
+
+ public RakdosTheShowstopper(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{R}");
+
+ this.addSuperType(SuperType.LEGENDARY);
+ this.subtype.add(SubType.DEMON);
+ this.power = new MageInt(6);
+ this.toughness = new MageInt(6);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // When Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new RakdosTheShowstopperEffect(), false));
+ }
+
+ private RakdosTheShowstopper(final RakdosTheShowstopper card) {
+ super(card);
+ }
+
+ @Override
+ public RakdosTheShowstopper copy() {
+ return new RakdosTheShowstopper(this);
+ }
+}
+
+class RakdosTheShowstopperEffect extends OneShotEffect {
+
+ RakdosTheShowstopperEffect() {
+ super(Outcome.Benefit);
+ staticText = "flip a coin for each creature that isn't a Demon, Devil, or Imp." +
+ " Destroy each creature whose coin comes up tails.";
+ }
+
+ private RakdosTheShowstopperEffect(final RakdosTheShowstopperEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public RakdosTheShowstopperEffect copy() {
+ return new RakdosTheShowstopperEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(source.getControllerId(), game)) {
+ if (permanent != null
+ && permanent.isCreature()
+ && !permanent.hasSubtype(SubType.DEMON, game)
+ && !permanent.hasSubtype(SubType.DEVIL, game)
+ && !permanent.hasSubtype(SubType.IMP, game)
+ && !player.flipCoin(source, game, false)) {
+ permanent.destroy(source.getSourceId(), game, false);
+ }
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/RakdosTrumpeter.java b/Mage.Sets/src/mage/cards/r/RakdosTrumpeter.java
new file mode 100644
index 00000000000..a72d29d3255
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RakdosTrumpeter.java
@@ -0,0 +1,46 @@
+package mage.cards.r;
+
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.MenaceAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class RakdosTrumpeter extends CardImpl {
+
+ public RakdosTrumpeter(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
+
+ this.subtype.add(SubType.HUMAN);
+ this.subtype.add(SubType.SHAMAN);
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(3);
+
+ // Menace
+ this.addAbility(new MenaceAbility());
+
+ // {3}{R}: Rakdos Trumpeter gets +2/+0 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(
+ new BoostSourceEffect(2, 0, Duration.EndOfTurn), new ManaCostsImpl("{3}{R}")
+ ));
+ }
+
+ private RakdosTrumpeter(final RakdosTrumpeter card) {
+ super(card);
+ }
+
+ @Override
+ public RakdosTrumpeter copy() {
+ return new RakdosTrumpeter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RakdossReturn.java b/Mage.Sets/src/mage/cards/r/RakdossReturn.java
index 5d9276caf36..a24d77837ed 100644
--- a/Mage.Sets/src/mage/cards/r/RakdossReturn.java
+++ b/Mage.Sets/src/mage/cards/r/RakdossReturn.java
@@ -28,7 +28,7 @@ public final class RakdossReturn extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}{R}");
// Rakdos's Return deals X damage to target opponent or planeswalker. That player or that planeswalker’s controller discards X cards.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addEffect(new RakdossReturnEffect());
this.getSpellAbility().addTarget(new TargetOpponentOrPlaneswalker());
}
@@ -65,7 +65,7 @@ class RakdossReturnEffect extends OneShotEffect {
if (player == null) {
return false;
}
- Effect effect = new DiscardTargetEffect(new ManacostVariableValue());
+ Effect effect = new DiscardTargetEffect(ManacostVariableValue.instance);
effect.setTargetPointer(new FixedTarget(player.getId(), game));
return effect.apply(game, source);
}
diff --git a/Mage.Sets/src/mage/cards/r/RakkaMar.java b/Mage.Sets/src/mage/cards/r/RakkaMar.java
index 4e6f41225a8..30db7aafabc 100644
--- a/Mage.Sets/src/mage/cards/r/RakkaMar.java
+++ b/Mage.Sets/src/mage/cards/r/RakkaMar.java
@@ -1,7 +1,6 @@
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -17,14 +16,13 @@ import mage.constants.SuperType;
import mage.constants.Zone;
import mage.game.permanent.token.RakkaMarElementalToken;
+import java.util.UUID;
+
/**
- *
* @author Loki
*/
public final class RakkaMar extends CardImpl {
- private RakkaMarElementalToken token = new RakkaMarElementalToken();
-
public RakkaMar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}");
addSuperType(SuperType.LEGENDARY);
@@ -34,7 +32,12 @@ public final class RakkaMar extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.addAbility(HasteAbility.getInstance());
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(token), new ManaCostsImpl("{R}"));
+
+ Ability ability = new SimpleActivatedAbility(
+ Zone.BATTLEFIELD,
+ new CreateTokenEffect(new RakkaMarElementalToken()),
+ new ManaCostsImpl("{R}")
+ );
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/cards/r/RalZarek.java b/Mage.Sets/src/mage/cards/r/RalZarek.java
index 2dfe8cf9b6d..23073717b20 100644
--- a/Mage.Sets/src/mage/cards/r/RalZarek.java
+++ b/Mage.Sets/src/mage/cards/r/RalZarek.java
@@ -99,7 +99,7 @@ class RalZarekExtraTurnsEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
for (int i = 0; i < 5; i++) {
- if (controller.flipCoin(game)) {
+ if (controller.flipCoin(source, game, false)) {
game.getState().getTurnMods().add(new TurnMod(source.getControllerId(), false));
}
}
diff --git a/Mage.Sets/src/mage/cards/r/RallyToBattle.java b/Mage.Sets/src/mage/cards/r/RallyToBattle.java
new file mode 100644
index 00000000000..6fce2ef6735
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RallyToBattle.java
@@ -0,0 +1,39 @@
+package mage.cards.r;
+
+import mage.abilities.effects.common.UntapAllControllerEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.filter.StaticFilters;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class RallyToBattle extends CardImpl {
+
+ public RallyToBattle(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{W}");
+
+
+ // Creatures you control get +1/+3 until end of turn. Untap them.
+ this.getSpellAbility().addEffect(
+ new BoostControlledEffect(1, 3, Duration.EndOfTurn)
+ );
+ this.getSpellAbility().addEffect(new UntapAllControllerEffect(
+ StaticFilters.FILTER_PERMANENT_CREATURE
+ ).setText("Untap them"));
+ }
+
+ private RallyToBattle(final RallyToBattle card) {
+ super(card);
+ }
+
+ @Override
+ public RallyToBattle copy() {
+ return new RallyToBattle(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RalsStaticaster.java b/Mage.Sets/src/mage/cards/r/RalsStaticaster.java
index d5b83f25404..87de152208a 100644
--- a/Mage.Sets/src/mage/cards/r/RalsStaticaster.java
+++ b/Mage.Sets/src/mage/cards/r/RalsStaticaster.java
@@ -48,7 +48,7 @@ public final class RalsStaticaster extends CardImpl {
// Whenever Ral's Staticaster attacks, if you control a Ral planeswalker, Ral's Staticaster gets +1/+0 for each card in your hand until end of turn.
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
new AttacksTriggeredAbility(new BoostSourceEffect(
- new CardsInControllerHandCount(), new StaticValue(0),
+ CardsInControllerHandCount.instance, new StaticValue(0),
Duration.EndOfTurn, true), false),
new PermanentsOnTheBattlefieldCondition(filter),
"Whenever {this} attacks, if you control a Ral planeswalker, "
diff --git a/Mage.Sets/src/mage/cards/r/RamosianRally.java b/Mage.Sets/src/mage/cards/r/RamosianRally.java
index ccd2a9213da..6f9b2d78da2 100644
--- a/Mage.Sets/src/mage/cards/r/RamosianRally.java
+++ b/Mage.Sets/src/mage/cards/r/RamosianRally.java
@@ -29,7 +29,7 @@ public final class RamosianRally extends CardImpl {
static {
plainsFilter.add(new SubtypePredicate(SubType.PLAINS));
- creatureFilter.add(Predicates.not(new TappedPredicate()));
+ creatureFilter.add(Predicates.not(TappedPredicate.instance));
}
public RamosianRally(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RampageOfTheClans.java b/Mage.Sets/src/mage/cards/r/RampageOfTheClans.java
new file mode 100644
index 00000000000..887a1786e20
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RampageOfTheClans.java
@@ -0,0 +1,77 @@
+package mage.cards.r;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.filter.StaticFilters;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.CentaurToken;
+import mage.game.permanent.token.Token;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class RampageOfTheClans extends CardImpl {
+
+ public RampageOfTheClans(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{G}");
+
+ // Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token.
+ this.getSpellAbility().addEffect(new RampageOfTheClansEffect());
+ }
+
+ private RampageOfTheClans(final RampageOfTheClans card) {
+ super(card);
+ }
+
+ @Override
+ public RampageOfTheClans copy() {
+ return new RampageOfTheClans(this);
+ }
+}
+
+class RampageOfTheClansEffect extends OneShotEffect {
+
+ RampageOfTheClansEffect() {
+ super(Outcome.Benefit);
+ staticText = "Destroy all artifacts and enchantments. " +
+ "For each permanent destroyed this way, " +
+ "its controller creates a 3/3 green Centaur creature token.";
+ }
+
+ private RampageOfTheClansEffect(final RampageOfTheClansEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public RampageOfTheClansEffect copy() {
+ return new RampageOfTheClansEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Map playersWithPermanents = new HashMap<>();
+ for (Permanent p : game.getBattlefield().getActivePermanents(
+ StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT,
+ source.getControllerId(), source.getSourceId(), game
+ )) {
+ UUID controllerId = p.getControllerId();
+ if (p.destroy(source.getSourceId(), game, false)) {
+ playersWithPermanents.put(controllerId, playersWithPermanents.getOrDefault(controllerId, 0) + 1);
+ }
+ }
+ Token token = new CentaurToken();
+ for (UUID playerId : playersWithPermanents.keySet()) {
+ token.putOntoBattlefield(playersWithPermanents.get(playerId), game, source.getSourceId(), playerId);
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RampagingFerocidon.java b/Mage.Sets/src/mage/cards/r/RampagingFerocidon.java
index f0403fa0109..939e7eea412 100644
--- a/Mage.Sets/src/mage/cards/r/RampagingFerocidon.java
+++ b/Mage.Sets/src/mage/cards/r/RampagingFerocidon.java
@@ -34,7 +34,7 @@ public final class RampagingFerocidon extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("another creature");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public RampagingFerocidon(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RampagingRendhorn.java b/Mage.Sets/src/mage/cards/r/RampagingRendhorn.java
new file mode 100644
index 00000000000..eac81672fd0
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RampagingRendhorn.java
@@ -0,0 +1,36 @@
+package mage.cards.r;
+
+import mage.MageInt;
+import mage.abilities.keyword.RiotAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class RampagingRendhorn extends CardImpl {
+
+ public RampagingRendhorn(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}");
+
+ this.subtype.add(SubType.BEAST);
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Riot
+ this.addAbility(new RiotAbility());
+ }
+
+ private RampagingRendhorn(final RampagingRendhorn card) {
+ super(card);
+ }
+
+ @Override
+ public RampagingRendhorn copy() {
+ return new RampagingRendhorn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/Ramroller.java b/Mage.Sets/src/mage/cards/r/Ramroller.java
index f2574f04848..297bd6a6150 100644
--- a/Mage.Sets/src/mage/cards/r/Ramroller.java
+++ b/Mage.Sets/src/mage/cards/r/Ramroller.java
@@ -27,7 +27,7 @@ public final class Ramroller extends CardImpl {
private static final FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent();
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public Ramroller(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RamsesOverdark.java b/Mage.Sets/src/mage/cards/r/RamsesOverdark.java
index 2ed9c824f45..43475b29cb7 100644
--- a/Mage.Sets/src/mage/cards/r/RamsesOverdark.java
+++ b/Mage.Sets/src/mage/cards/r/RamsesOverdark.java
@@ -26,7 +26,7 @@ public final class RamsesOverdark extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("enchanted creature");
static {
- filter.add(new EnchantedPredicate());
+ filter.add(EnchantedPredicate.instance);
}
public RamsesOverdark(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RapidFire.java b/Mage.Sets/src/mage/cards/r/RapidFire.java
new file mode 100644
index 00000000000..a57b9181edb
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RapidFire.java
@@ -0,0 +1,82 @@
+
+package mage.cards.r;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility;
+import mage.abilities.condition.common.BeforeBlockersAreDeclaredCondition;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author L_J
+ */
+public final class RapidFire extends CardImpl {
+
+ public RapidFire(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{W}");
+
+ // Cast this spell only before blockers are declared.
+ this.addAbility(new CastOnlyDuringPhaseStepSourceAbility(null, null, BeforeBlockersAreDeclaredCondition.instance, "Cast this spell only before blockers are declared"));
+
+ // Target creature gains first strike until end of turn. If it doesn’t have rampage, that creature gains rampage 2 until end of turn.
+ this.getSpellAbility().addEffect(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn));
+ this.getSpellAbility().addEffect(new RapidFireEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+
+ }
+
+ public RapidFire(final RapidFire card) {
+ super(card);
+ }
+
+ @Override
+ public RapidFire copy() {
+ return new RapidFire(this);
+ }
+
+}
+
+class RapidFireEffect extends OneShotEffect {
+
+ public RapidFireEffect() {
+ super(Outcome.AddAbility);
+ this.staticText = "If it doesn’t have rampage, that creature gains rampage 2 until end of turn";
+ }
+
+ public RapidFireEffect(final RapidFireEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public RapidFireEffect copy() {
+ return new RapidFireEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (controller != null && permanent != null) {
+ if (!permanent.getAbilities().containsClass(RampageAbility.class)) {
+ ContinuousEffect effect = new GainAbilityTargetEffect(new RampageAbility(2), Duration.EndOfTurn);
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ game.addEffect(effect, source);
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RashidaScalebane.java b/Mage.Sets/src/mage/cards/r/RashidaScalebane.java
index 8e2de6b48a1..af3c5daf3d0 100644
--- a/Mage.Sets/src/mage/cards/r/RashidaScalebane.java
+++ b/Mage.Sets/src/mage/cards/r/RashidaScalebane.java
@@ -32,7 +32,7 @@ public final class RashidaScalebane extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking or blocking Dragon");
static {
- filter.add(Predicates.or(new AttackingPredicate(), new BlockingPredicate()));
+ filter.add(Predicates.or(AttackingPredicate.instance, BlockingPredicate.instance));
filter.add(new SubtypePredicate(SubType.DRAGON));
}
@@ -46,7 +46,7 @@ public final class RashidaScalebane extends CardImpl {
// {tap}: Destroy target attacking or blocking Dragon. It can't be regenerated. You gain life equal to its power.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(true), new TapSourceCost());
- Effect effect = new GainLifeEffect(new TargetPermanentPowerCount());
+ Effect effect = new GainLifeEffect(TargetPermanentPowerCount.instance);
effect.setText("You gain life equal to its power");
ability.addEffect(effect);
ability.addTarget(new TargetCreaturePermanent(filter));
diff --git a/Mage.Sets/src/mage/cards/r/RashmiEternitiesCrafter.java b/Mage.Sets/src/mage/cards/r/RashmiEternitiesCrafter.java
index d55cf3b4579..6a09ed49408 100644
--- a/Mage.Sets/src/mage/cards/r/RashmiEternitiesCrafter.java
+++ b/Mage.Sets/src/mage/cards/r/RashmiEternitiesCrafter.java
@@ -70,7 +70,7 @@ class RashmiEternitiesCrafterTriggeredAbility extends SpellCastControllerTrigger
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (super.checkTrigger(event, game)) {
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName());
+ SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class);
if (watcher != null) {
List spells = watcher.getSpellsCastThisTurn(event.getPlayerId());
if (spells != null && spells.size() == 1) {
diff --git a/Mage.Sets/src/mage/cards/r/RasputinDreamweaver.java b/Mage.Sets/src/mage/cards/r/RasputinDreamweaver.java
index 36a1b7cc433..bfc57f62a75 100644
--- a/Mage.Sets/src/mage/cards/r/RasputinDreamweaver.java
+++ b/Mage.Sets/src/mage/cards/r/RasputinDreamweaver.java
@@ -80,7 +80,7 @@ enum RasputinDreamweaverStartedUntappedCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- RasputinDreamweaverStartedUntappedWatcher watcher = (RasputinDreamweaverStartedUntappedWatcher) game.getState().getWatchers().get(RasputinDreamweaverStartedUntappedWatcher.class.getSimpleName());
+ RasputinDreamweaverStartedUntappedWatcher watcher = game.getState().getWatcher(RasputinDreamweaverStartedUntappedWatcher.class);
if (watcher != null) {
return watcher.startedUntapped(source.getSourceId());
}
@@ -98,13 +98,13 @@ class RasputinDreamweaverStartedUntappedWatcher extends Watcher {
private static final FilterPermanent filter = new FilterPermanent("Untapped permanents");
static {
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
}
private final Set startedUntapped = new HashSet<>(0);
RasputinDreamweaverStartedUntappedWatcher() {
- super(RasputinDreamweaverStartedUntappedWatcher.class.getSimpleName(), WatcherScope.GAME);
+ super(RasputinDreamweaverStartedUntappedWatcher.class, WatcherScope.GAME);
}
RasputinDreamweaverStartedUntappedWatcher(final RasputinDreamweaverStartedUntappedWatcher watcher) {
diff --git a/Mage.Sets/src/mage/cards/r/RatColony.java b/Mage.Sets/src/mage/cards/r/RatColony.java
index fefee4c8146..86b6a1d5c24 100644
--- a/Mage.Sets/src/mage/cards/r/RatColony.java
+++ b/Mage.Sets/src/mage/cards/r/RatColony.java
@@ -28,7 +28,7 @@ public final class RatColony extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.RAT));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public RatColony(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RathiAssassin.java b/Mage.Sets/src/mage/cards/r/RathiAssassin.java
index cb3f0770596..07655c77784 100644
--- a/Mage.Sets/src/mage/cards/r/RathiAssassin.java
+++ b/Mage.Sets/src/mage/cards/r/RathiAssassin.java
@@ -39,7 +39,7 @@ public final class RathiAssassin extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.MERCENARY));
filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, 4));
- destroyFilter.add(new TappedPredicate());
+ destroyFilter.add(TappedPredicate.instance);
destroyFilter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK)));
}
diff --git a/Mage.Sets/src/mage/cards/r/RavagerWurm.java b/Mage.Sets/src/mage/cards/r/RavagerWurm.java
new file mode 100644
index 00000000000..f8af6558fc4
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RavagerWurm.java
@@ -0,0 +1,92 @@
+package mage.cards.r;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.common.FightTargetSourceEffect;
+import mage.abilities.keyword.RiotAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.AbilityType;
+import mage.constants.CardType;
+import mage.constants.SubType;
+import mage.constants.TargetController;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class RavagerWurm extends CardImpl {
+
+ private static final FilterPermanent filter
+ = new FilterCreaturePermanent("creature you don't control");
+ private static final FilterPermanent filter2
+ = new FilterPermanent("land with an activated ability that isn't a mana ability");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.NOT_YOU));
+ filter2.add(RavagerWurmPredicate.instance);
+ }
+
+ public RavagerWurm(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{G}{G}");
+
+ this.subtype.add(SubType.WURM);
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // Riot
+ this.addAbility(new RiotAbility());
+
+ // When Ravager Wurm enters the battlefield, choose up to one —
+ // • Ravager Wurm fights target creature you don't control.
+ Ability ability = new EntersBattlefieldTriggeredAbility(
+ new FightTargetSourceEffect().setText("{this} fights target creature you don't control"), false
+ );
+ ability.addTarget(new TargetPermanent(filter));
+ ability.getModes().setMinModes(0);
+ ability.getModes().setMaxModes(1);
+
+ // • Destroy target land with an activated ability that isn't a mana ability.
+ Mode mode = new Mode(new DestroyTargetEffect());
+ mode.addTarget(new TargetPermanent(filter2));
+ ability.addMode(mode);
+ this.addAbility(ability);
+ }
+
+ private RavagerWurm(final RavagerWurm card) {
+ super(card);
+ }
+
+ @Override
+ public RavagerWurm copy() {
+ return new RavagerWurm(this);
+ }
+}
+
+enum RavagerWurmPredicate implements Predicate {
+ instance;
+
+ @Override
+ public boolean apply(Permanent input, Game game) {
+ if (input == null || !input.isLand()) {
+ return false;
+ }
+ for (Ability ability : input.getAbilities()) {
+ if (ability.getAbilityType() == AbilityType.ACTIVATED) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/RavagingBlaze.java b/Mage.Sets/src/mage/cards/r/RavagingBlaze.java
index 6a85da01800..4b8f4e7f45d 100644
--- a/Mage.Sets/src/mage/cards/r/RavagingBlaze.java
+++ b/Mage.Sets/src/mage/cards/r/RavagingBlaze.java
@@ -22,10 +22,10 @@ public final class RavagingBlaze extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{R}{R}");
// Ravaging Blaze deals X damage to target creature.
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
// Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Ravaging Blaze also deals X damage to that creature's controller.
- this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DamageTargetControllerEffect(new ManacostVariableValue()),
+ this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DamageTargetControllerEffect(ManacostVariableValue.instance),
SpellMasteryCondition.instance, "
Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Ravaging Blaze also deals X damage to that creature's controller."));
}
diff --git a/Mage.Sets/src/mage/cards/r/RavenousTrap.java b/Mage.Sets/src/mage/cards/r/RavenousTrap.java
index c1f31a0fdaf..6ae2a950f7d 100644
--- a/Mage.Sets/src/mage/cards/r/RavenousTrap.java
+++ b/Mage.Sets/src/mage/cards/r/RavenousTrap.java
@@ -50,7 +50,7 @@ enum RavenousTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- CardsPutIntoGraveyardWatcher watcher = (CardsPutIntoGraveyardWatcher) game.getState().getWatchers().get(CardsPutIntoGraveyardWatcher.class.getSimpleName());
+ CardsPutIntoGraveyardWatcher watcher = game.getState().getWatcher(CardsPutIntoGraveyardWatcher.class);
if (watcher != null) {
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
if (watcher.getAmountCardsPutToGraveyard(opponentId) > 2) {
diff --git a/Mage.Sets/src/mage/cards/r/RazorfinAbolisher.java b/Mage.Sets/src/mage/cards/r/RazorfinAbolisher.java
index d4384fe277b..e1bc066563b 100644
--- a/Mage.Sets/src/mage/cards/r/RazorfinAbolisher.java
+++ b/Mage.Sets/src/mage/cards/r/RazorfinAbolisher.java
@@ -27,7 +27,7 @@ public final class RazorfinAbolisher extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with a counter on it");
static {
- filter.add(new CounterAnyPredicate());
+ filter.add(CounterAnyPredicate.instance);
}
public RazorfinAbolisher(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/ReachOfShadows.java b/Mage.Sets/src/mage/cards/r/ReachOfShadows.java
index 60c5d7b24a8..0f697be957e 100644
--- a/Mage.Sets/src/mage/cards/r/ReachOfShadows.java
+++ b/Mage.Sets/src/mage/cards/r/ReachOfShadows.java
@@ -20,7 +20,7 @@ public final class ReachOfShadows extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature that's one or more colors");
static {
- filter.add(Predicates.not(new ColorlessPredicate()));
+ filter.add(Predicates.not(ColorlessPredicate.instance));
}
public ReachOfShadows(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RealmSeekers.java b/Mage.Sets/src/mage/cards/r/RealmSeekers.java
index 283fff9287d..5ac43f2142f 100644
--- a/Mage.Sets/src/mage/cards/r/RealmSeekers.java
+++ b/Mage.Sets/src/mage/cards/r/RealmSeekers.java
@@ -37,7 +37,7 @@ public final class RealmSeekers extends CardImpl {
this.addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect(
CounterType.P1P1.createInstance(),
- new CardsInAllHandsCount(),
+ CardsInAllHandsCount.instance,
false),
"with X +1/+1 counters on it, where X is the total number of cards in all players' hands"));
diff --git a/Mage.Sets/src/mage/cards/r/Reanimate.java b/Mage.Sets/src/mage/cards/r/Reanimate.java
index 3a70eaa36e0..d91e2ad3e44 100644
--- a/Mage.Sets/src/mage/cards/r/Reanimate.java
+++ b/Mage.Sets/src/mage/cards/r/Reanimate.java
@@ -25,7 +25,7 @@ public final class Reanimate extends CardImpl {
// Put target creature card from a graveyard onto the battlefield under your control. You lose life equal to its converted mana cost.
getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard")));
getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
- Effect effect = new LoseLifeSourceControllerEffect(new TargetConvertedManaCost());
+ Effect effect = new LoseLifeSourceControllerEffect(TargetConvertedManaCost.instance);
effect.setText("You lose life equal to its converted mana cost");
getSpellAbility().addEffect(effect);
}
diff --git a/Mage.Sets/src/mage/cards/r/Reap.java b/Mage.Sets/src/mage/cards/r/Reap.java
index 36d4d1baf6a..f3db1b97ecd 100644
--- a/Mage.Sets/src/mage/cards/r/Reap.java
+++ b/Mage.Sets/src/mage/cards/r/Reap.java
@@ -1,63 +1,40 @@
package mage.cards.r;
-import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.game.Game;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetOpponent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author L_J
*/
public final class Reap extends CardImpl {
-
- private static final FilterPermanent filter = new FilterPermanent("black permanents");
-
- static {
- filter.add(new ColorPredicate(ObjectColor.BLACK));
- }
public Reap(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
// Return up to X target cards from your graveyard to your hand, where X is the number of black permanents target opponent controls as you cast Reap.
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect().setText("Return up to X target cards from your graveyard to your hand, where X is the number of black permanents target opponent controls as you cast Reap."));
this.getSpellAbility().addTarget(new TargetOpponent());
- this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 0, new FilterCard("cards from your graveyard")));
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 0));
+ this.getSpellAbility().setTargetAdjuster(ReapAdjuster.instance);
}
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- Player controller = game.getPlayer(ability.getControllerId());
- if (controller != null) {
- ability.getTargets().clear();
- UUID opponentId = null;
- Target target = new TargetOpponent();
- if (controller.chooseTarget(Outcome.ReturnToHand, target, ability, game)) {
- opponentId = target.getFirstTarget();
- }
- int numbTargets = game.getBattlefield().getAllActivePermanents(filter, opponentId, game).size();
- ability.addTarget(new TargetCardInYourGraveyard(0, numbTargets, new FilterCard("card" + (numbTargets == 1 ? "" : "s") + " from your graveyard")));
- }
- }
- }
-
-
public Reap(final Reap card) {
super(card);
}
@@ -67,3 +44,27 @@ public final class Reap extends CardImpl {
return new Reap(this);
}
}
+
+enum ReapAdjuster implements TargetAdjuster {
+ instance;
+ private static final FilterPermanent filter = new FilterPermanent("black permanents");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.BLACK));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ Player controller = game.getPlayer(ability.getControllerId());
+ if (controller != null) {
+ ability.getTargets().clear();
+ UUID opponentId = null;
+ Target target = new TargetOpponent();
+ if (controller.chooseTarget(Outcome.ReturnToHand, target, ability, game)) {
+ opponentId = target.getFirstTarget();
+ }
+ int numbTargets = game.getBattlefield().getAllActivePermanents(filter, opponentId, game).size();
+ ability.addTarget(new TargetCardInYourGraveyard(0, numbTargets, new FilterCard("card" + (numbTargets == 1 ? "" : "s") + " from your graveyard")));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/ReaperFromTheAbyss.java b/Mage.Sets/src/mage/cards/r/ReaperFromTheAbyss.java
index c9a9bf3f10d..519ff15bcc1 100644
--- a/Mage.Sets/src/mage/cards/r/ReaperFromTheAbyss.java
+++ b/Mage.Sets/src/mage/cards/r/ReaperFromTheAbyss.java
@@ -81,8 +81,8 @@ class ReaperFromTheAbyssAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- Watcher watcher = game.getState().getWatchers().get(MorbidWatcher.class.getSimpleName());
- return watcher.conditionMet();
+ Watcher watcher = game.getState().getWatcher(MorbidWatcher.class);
+ return watcher != null && watcher.conditionMet();
}
@Override
diff --git a/Mage.Sets/src/mage/cards/r/ReaperKing.java b/Mage.Sets/src/mage/cards/r/ReaperKing.java
index ee8a6ef8b86..e3d65bef519 100644
--- a/Mage.Sets/src/mage/cards/r/ReaperKing.java
+++ b/Mage.Sets/src/mage/cards/r/ReaperKing.java
@@ -27,7 +27,7 @@ public final class ReaperKing extends CardImpl {
static {
filter.add(new SubtypePredicate(SubType.SCARECROW));
- filterTrigger.add(new AnotherPredicate());
+ filterTrigger.add(AnotherPredicate.instance);
filterTrigger.add(new SubtypePredicate(SubType.SCARECROW));
}
diff --git a/Mage.Sets/src/mage/cards/r/ReasonBelieve.java b/Mage.Sets/src/mage/cards/r/ReasonBelieve.java
index 0758c54389d..a0d04ccc9e3 100644
--- a/Mage.Sets/src/mage/cards/r/ReasonBelieve.java
+++ b/Mage.Sets/src/mage/cards/r/ReasonBelieve.java
@@ -32,7 +32,7 @@ public final class ReasonBelieve extends SplitCard {
// Believe
// Aftermath
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Look at the top card of your library. You may put it onto the battlefield if it's a creature card. If you don't, put it into your hand.
getRightHalfCard().getSpellAbility().addEffect(new BelieveEffect());
diff --git a/Mage.Sets/src/mage/cards/r/ReaverDrone.java b/Mage.Sets/src/mage/cards/r/ReaverDrone.java
index 0a373538548..441d903afff 100644
--- a/Mage.Sets/src/mage/cards/r/ReaverDrone.java
+++ b/Mage.Sets/src/mage/cards/r/ReaverDrone.java
@@ -28,8 +28,8 @@ public final class ReaverDrone extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another colorless creature");
static {
- filter.add(new AnotherPredicate());
- filter.add(new ColorlessPredicate());
+ filter.add(AnotherPredicate.instance);
+ filter.add(ColorlessPredicate.instance);
}
public ReaverDrone(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RebelInformer.java b/Mage.Sets/src/mage/cards/r/RebelInformer.java
index d5328fc4a3e..1bfcbcae639 100644
--- a/Mage.Sets/src/mage/cards/r/RebelInformer.java
+++ b/Mage.Sets/src/mage/cards/r/RebelInformer.java
@@ -36,7 +36,7 @@ public final class RebelInformer extends CardImpl {
static {
filterWhite.add(new ColorPredicate(ObjectColor.WHITE));
- filterRebel.add(Predicates.not(new TokenPredicate()));
+ filterRebel.add(Predicates.not(TokenPredicate.instance));
filterRebel.add(new SubtypePredicate(SubType.REBEL));
}
diff --git a/Mage.Sets/src/mage/cards/r/RebornHope.java b/Mage.Sets/src/mage/cards/r/RebornHope.java
index 0006834a88d..47f878e8858 100644
--- a/Mage.Sets/src/mage/cards/r/RebornHope.java
+++ b/Mage.Sets/src/mage/cards/r/RebornHope.java
@@ -19,7 +19,7 @@ public final class RebornHope extends CardImpl {
private static final FilterCard filter = new FilterCard("multicolored card from your graveyard");
static {
- filter.add(new MulticoloredPredicate());
+ filter.add(MulticoloredPredicate.instance);
}
public RebornHope(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/Reciprocate.java b/Mage.Sets/src/mage/cards/r/Reciprocate.java
index 90bcb754d0c..4b20b3759c8 100644
--- a/Mage.Sets/src/mage/cards/r/Reciprocate.java
+++ b/Mage.Sets/src/mage/cards/r/Reciprocate.java
@@ -53,7 +53,7 @@ class ReciprocateTarget extends TargetPermanent {
@Override
public boolean canTarget(UUID id, Ability source, Game game) {
- PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get(PlayerDamagedBySourceWatcher.class.getSimpleName(), source.getControllerId());
+ PlayerDamagedBySourceWatcher watcher = game.getState().getWatcher(PlayerDamagedBySourceWatcher.class, source.getControllerId());
if (watcher != null && watcher.hasSourceDoneDamage(id, game)) {
return super.canTarget(id, source, game);
}
@@ -64,7 +64,7 @@ class ReciprocateTarget extends TargetPermanent {
public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
Set availablePossibleTargets = super.possibleTargets(sourceId, sourceControllerId, game);
Set possibleTargets = new HashSet<>();
- PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get(PlayerDamagedBySourceWatcher.class.getSimpleName(), sourceControllerId);
+ PlayerDamagedBySourceWatcher watcher = game.getState().getWatcher(PlayerDamagedBySourceWatcher.class, sourceControllerId);
for (UUID targetId : availablePossibleTargets) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null && watcher != null && watcher.hasSourceDoneDamage(targetId, game)) {
@@ -83,7 +83,7 @@ class ReciprocateTarget extends TargetPermanent {
int count = 0;
MageObject targetSource = game.getObject(sourceId);
if(targetSource != null) {
- PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get(PlayerDamagedBySourceWatcher.class.getSimpleName(), sourceControllerId);
+ PlayerDamagedBySourceWatcher watcher = game.getState().getWatcher(PlayerDamagedBySourceWatcher.class, sourceControllerId);
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game)) {
if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)
&& watcher != null && watcher.hasSourceDoneDamage(permanent.getId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/r/RecklessBushwhacker.java b/Mage.Sets/src/mage/cards/r/RecklessBushwhacker.java
index 0e83f3b7fcd..d19cf75607c 100644
--- a/Mage.Sets/src/mage/cards/r/RecklessBushwhacker.java
+++ b/Mage.Sets/src/mage/cards/r/RecklessBushwhacker.java
@@ -27,7 +27,7 @@ public final class RecklessBushwhacker extends CardImpl {
private final static FilterControlledCreaturePermanent FILTER = new FilterControlledCreaturePermanent("other creatures you control");
static {
- FILTER.add(new AnotherPredicate());
+ FILTER.add(AnotherPredicate.instance);
}
public RecklessBushwhacker(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RecklessCohort.java b/Mage.Sets/src/mage/cards/r/RecklessCohort.java
index ec4d153313c..4962f5b3ce8 100644
--- a/Mage.Sets/src/mage/cards/r/RecklessCohort.java
+++ b/Mage.Sets/src/mage/cards/r/RecklessCohort.java
@@ -24,7 +24,7 @@ public final class RecklessCohort extends CardImpl {
private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another Ally");
static {
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
filter.add(new SubtypePredicate(SubType.ALLY));
}
diff --git a/Mage.Sets/src/mage/cards/r/ReclusiveWight.java b/Mage.Sets/src/mage/cards/r/ReclusiveWight.java
index 01995437b14..936f3a340a9 100644
--- a/Mage.Sets/src/mage/cards/r/ReclusiveWight.java
+++ b/Mage.Sets/src/mage/cards/r/ReclusiveWight.java
@@ -27,7 +27,7 @@ public final class ReclusiveWight extends CardImpl {
static {
filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
- filter.add(new AnotherPredicate());
+ filter.add(AnotherPredicate.instance);
}
public ReclusiveWight(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/Reconnaissance.java b/Mage.Sets/src/mage/cards/r/Reconnaissance.java
index fbd93e6ceb6..84fe89dcc41 100644
--- a/Mage.Sets/src/mage/cards/r/Reconnaissance.java
+++ b/Mage.Sets/src/mage/cards/r/Reconnaissance.java
@@ -27,7 +27,7 @@ public final class Reconnaissance extends CardImpl {
private static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("attacking creature controlled by you");
static {
- filter.add(new AttackingPredicate());
+ filter.add(AttackingPredicate.instance);
}
public Reconnaissance(UUID ownerId, CardSetInfo setInfo) {
diff --git a/Mage.Sets/src/mage/cards/r/RedManaBattery.java b/Mage.Sets/src/mage/cards/r/RedManaBattery.java
index 461a4664e3e..1281c0d257b 100644
--- a/Mage.Sets/src/mage/cards/r/RedManaBattery.java
+++ b/Mage.Sets/src/mage/cards/r/RedManaBattery.java
@@ -36,7 +36,7 @@ public final class RedManaBattery extends CardImpl {
// {tap}, Remove any number of charge counters from Red Mana Battery: Add {R}, then add an additional {R} for each charge counter removed this way.
ability = new DynamicManaAbility(
Mana.RedMana(1),
- new IntPlusDynamicValue(1, new RemovedCountersForCostValue()),
+ new IntPlusDynamicValue(1, RemovedCountersForCostValue.instance),
new TapSourceCost(),
"Add {R}, then add {R} for each charge counter removed this way",
true, new CountersSourceCount(CounterType.CHARGE));
diff --git a/Mage.Sets/src/mage/cards/r/RedSunsZenith.java b/Mage.Sets/src/mage/cards/r/RedSunsZenith.java
index a95deffc582..9d39917e0ce 100644
--- a/Mage.Sets/src/mage/cards/r/RedSunsZenith.java
+++ b/Mage.Sets/src/mage/cards/r/RedSunsZenith.java
@@ -26,7 +26,7 @@ public final class RedSunsZenith extends CardImpl {
// If a creature dealt damage this way would die this turn, exile it instead.
// Shuffle Red Sun's Zenith into its owner's library.
this.getSpellAbility().addTarget(new TargetAnyTarget());
- this.getSpellAbility().addEffect(new DamageTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new DamageTargetEffect(ManacostVariableValue.instance));
this.getSpellAbility().addEffect(new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn));
this.getSpellAbility().addEffect(ShuffleSpellEffect.getInstance());
this.getSpellAbility().addWatcher(new DamagedByWatcher());
diff --git a/Mage.Sets/src/mage/cards/r/ReduceRubble.java b/Mage.Sets/src/mage/cards/r/ReduceRubble.java
index 792cfdb894d..7c3cb39665d 100644
--- a/Mage.Sets/src/mage/cards/r/ReduceRubble.java
+++ b/Mage.Sets/src/mage/cards/r/ReduceRubble.java
@@ -32,7 +32,7 @@ public final class ReduceRubble extends SplitCard {
// Rubble
// Up to three target lands don't untap during their controller's next untap step.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
Effect effect = new DontUntapInControllersNextUntapStepTargetEffect();
effect.setText("Up to three target lands don't untap during their controller's next untap step");
getRightHalfCard().getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/r/RefractionTrap.java b/Mage.Sets/src/mage/cards/r/RefractionTrap.java
index 84d3bc36722..bea2ff1c967 100644
--- a/Mage.Sets/src/mage/cards/r/RefractionTrap.java
+++ b/Mage.Sets/src/mage/cards/r/RefractionTrap.java
@@ -59,7 +59,7 @@ enum RefractionTrapCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName());
+ SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class);
if (watcher != null) {
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
List spells = watcher.getSpellsCastThisTurn(opponentId);
diff --git a/Mage.Sets/src/mage/cards/r/RefuseCooperate.java b/Mage.Sets/src/mage/cards/r/RefuseCooperate.java
index 2ee051d9635..431cf7745cf 100644
--- a/Mage.Sets/src/mage/cards/r/RefuseCooperate.java
+++ b/Mage.Sets/src/mage/cards/r/RefuseCooperate.java
@@ -34,7 +34,7 @@ public final class RefuseCooperate extends SplitCard {
// Cooperate
// Aftermath
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true));
// Copy target instant or sorcery spell. You may choose new targets for the copy.
getRightHalfCard().getSpellAbility().addEffect(new CopyTargetSpellEffect());
getRightHalfCard().getSpellAbility().addTarget(new TargetSpell(new FilterInstantOrSorcerySpell()));
diff --git a/Mage.Sets/src/mage/cards/r/Regenesis.java b/Mage.Sets/src/mage/cards/r/Regenesis.java
new file mode 100644
index 00000000000..9743d9c073c
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/Regenesis.java
@@ -0,0 +1,36 @@
+package mage.cards.r;
+
+import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterPermanentCard;
+import mage.target.common.TargetCardInYourGraveyard;
+
+import java.util.UUID;
+
+/**
+ * @author TheElk801
+ */
+public final class Regenesis extends CardImpl {
+
+ private static final FilterCard filter = new FilterPermanentCard("permanent cards from your graveyard");
+
+ public Regenesis(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{G}{G}");
+
+ // Return up to two target permanent cards from your graveyard to your hand.
+ this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 2, filter));
+ }
+
+ private Regenesis(final Regenesis card) {
+ super(card);
+ }
+
+ @Override
+ public Regenesis copy() {
+ return new Regenesis(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RegnaTheRedeemer.java b/Mage.Sets/src/mage/cards/r/RegnaTheRedeemer.java
index adcf7f0b302..4ed64236516 100644
--- a/Mage.Sets/src/mage/cards/r/RegnaTheRedeemer.java
+++ b/Mage.Sets/src/mage/cards/r/RegnaTheRedeemer.java
@@ -75,12 +75,12 @@ class RegnaTheRedeemerCondition extends IntCompareCondition {
@Override
protected int getInputValue(Game game, Ability source) {
int gainedLife = 0;
- PlayerGainedLifeWatcher watcher = (PlayerGainedLifeWatcher) game.getState().getWatchers().get(PlayerGainedLifeWatcher.class.getSimpleName());
+ PlayerGainedLifeWatcher watcher = game.getState().getWatcher(PlayerGainedLifeWatcher.class);
if (watcher != null) {
for (UUID playerId : game.getPlayerList()) {
Player player = game.getPlayer(playerId);
if (player != null && !player.hasOpponent(source.getControllerId(), game)) {
- gainedLife = watcher.getLiveGained(playerId);
+ gainedLife = watcher.getLifeGained(playerId);
if (gainedLife > 0) {
break;
}
diff --git a/Mage.Sets/src/mage/cards/r/RegnasSanction.java b/Mage.Sets/src/mage/cards/r/RegnasSanction.java
index 3ea9507512b..776fdaa6c8a 100644
--- a/Mage.Sets/src/mage/cards/r/RegnasSanction.java
+++ b/Mage.Sets/src/mage/cards/r/RegnasSanction.java
@@ -70,7 +70,7 @@ class RegnasSanctionEffect extends OneShotEffect {
FilterCreaturePermanent filterToTap = new FilterCreaturePermanent();
for (Player player : choice.getFoes()) {
FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creature you control");
- filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(TappedPredicate.instance));
filter.add(new ControllerIdPredicate(player.getId()));
TargetPermanent target = new TargetPermanent(1, 1, filter, true);
if (player.choose(Outcome.Benefit, target, source.getSourceId(), game)) {
diff --git a/Mage.Sets/src/mage/cards/r/Reincarnation.java b/Mage.Sets/src/mage/cards/r/Reincarnation.java
index ecd453ac2b4..a44d5b3b98e 100644
--- a/Mage.Sets/src/mage/cards/r/Reincarnation.java
+++ b/Mage.Sets/src/mage/cards/r/Reincarnation.java
@@ -143,6 +143,7 @@ class ReincarnationDelayedEffect extends OneShotEffect {
FilterCreatureCard filter = new FilterCreatureCard("a creature card from " + player.getName() + "'s graveyard");
filter.add(new OwnerIdPredicate(player.getId()));
Target targetCreature = new TargetCardInGraveyard(filter);
+ targetCreature.setNotTarget(true);
if (targetCreature.canChoose(source.getSourceId(), controller.getId(), game)
&& controller.chooseTarget(outcome, targetCreature, source, game)) {
Card card = game.getCard(targetCreature.getFirstTarget());
diff --git a/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java b/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java
index d0bc76ed940..eee1db14278 100644
--- a/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java
+++ b/Mage.Sets/src/mage/cards/r/ReleaseTheGremlins.java
@@ -1,9 +1,7 @@
package mage.cards.r;
-import java.util.UUID;
import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
import mage.abilities.dynamicvalue.common.ManacostVariableValue;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
@@ -13,9 +11,11 @@ import mage.constants.CardType;
import mage.game.Game;
import mage.game.permanent.token.GremlinToken;
import mage.target.common.TargetArtifactPermanent;
+import mage.target.targetadjustment.TargetAdjuster;
+
+import java.util.UUID;
/**
- *
* @author Styxo
*/
public final class ReleaseTheGremlins extends CardImpl {
@@ -28,17 +28,9 @@ public final class ReleaseTheGremlins extends CardImpl {
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
// Create X 2/2 red Gremlin creature tokens.
- this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), new ManacostVariableValue()));
+ this.getSpellAbility().addEffect(new CreateTokenEffect(new GremlinToken(), ManacostVariableValue.instance));
- }
-
- @Override
- public void adjustTargets(Ability ability, Game game) {
- if (ability instanceof SpellAbility) {
- ability.getTargets().clear();
- int xValue = ability.getManaCostsToPay().getX();
- ability.addTarget(new TargetArtifactPermanent(xValue, xValue));
- }
+ this.getSpellAbility().setTargetAdjuster(ReleaseTheGremlinsAdjuster.instance);
}
public ReleaseTheGremlins(final ReleaseTheGremlins card) {
@@ -50,3 +42,13 @@ public final class ReleaseTheGremlins extends CardImpl {
return new ReleaseTheGremlins(this);
}
}
+
+enum ReleaseTheGremlinsAdjuster implements TargetAdjuster {
+ instance;
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ability.getTargets().clear();
+ ability.addTarget(new TargetArtifactPermanent(ability.getManaCostsToPay().getX()));
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/r/RelentlessRats.java b/Mage.Sets/src/mage/cards/r/RelentlessRats.java
index 8042cfcee19..02cb98cdd44 100644
--- a/Mage.Sets/src/mage/cards/r/RelentlessRats.java
+++ b/Mage.Sets/src/mage/cards/r/RelentlessRats.java
@@ -71,7 +71,7 @@ public final class RelentlessRats extends CardImpl {
public boolean apply(Game game, Ability source) {
int count = game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game) - 1;
if (count > 0) {
- Permanent target = (Permanent) game.getPermanent(source.getSourceId());
+ Permanent target = game.getPermanent(source.getSourceId());
if (target != null) {
target.addPower(count);
target.addToughness(count);
diff --git a/Mage.Sets/src/mage/cards/r/RelicRunner.java b/Mage.Sets/src/mage/cards/r/RelicRunner.java
index 23e3aee8ec5..034c428df0b 100644
--- a/Mage.Sets/src/mage/cards/r/RelicRunner.java
+++ b/Mage.Sets/src/mage/cards/r/RelicRunner.java
@@ -58,7 +58,7 @@ class CastHistoricSpellThisTurnCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName());
+ SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class);
if (watcher != null) {
List