Refactor SourceHasCounterCondition to be an IntCompareCondition (#13724)

* refactor SourceHasCounterCondition to be an IntCompareCondition

* add comment for arguments
This commit is contained in:
Evan Kranzler 2025-06-07 21:03:21 -04:00 committed by GitHub
parent c7f2263ddb
commit 0e179ccc1f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
61 changed files with 697 additions and 706 deletions

View file

@ -11,6 +11,7 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
@ -21,7 +22,7 @@ import java.util.UUID;
*/ */
public final class AdaptiveTrainingPost extends CardImpl { public final class AdaptiveTrainingPost extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE, 0, 2); private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE, ComparisonType.FEWER_THAN, 3);
public AdaptiveTrainingPost(UUID ownerId, CardSetInfo setInfo) { public AdaptiveTrainingPost(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{U}");

View file

@ -2,7 +2,6 @@ package mage.cards.a;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
@ -13,9 +12,11 @@ import mage.abilities.effects.common.LoseGameSourceControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -33,7 +34,7 @@ import java.util.UUID;
*/ */
public final class ArchfiendOfTheDross extends CardImpl { public final class ArchfiendOfTheDross extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.OIL, 0, 0); private static final Condition condition = new SourceHasCounterCondition(CounterType.OIL, ComparisonType.EQUAL_TO, 0);
public ArchfiendOfTheDross(UUID ownerId, CardSetInfo setInfo) { public ArchfiendOfTheDross(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");

View file

@ -29,8 +29,7 @@ import java.util.UUID;
*/ */
public final class ArixmethesSlumberingIsle extends CardImpl { public final class ArixmethesSlumberingIsle extends CardImpl {
private static final Condition condition private static final Condition condition = new SourceHasCounterCondition(CounterType.SLUMBER);
= new SourceHasCounterCondition(CounterType.SLUMBER, 1, Integer.MAX_VALUE);
public ArixmethesSlumberingIsle(UUID ownerId, CardSetInfo setInfo) { public ArixmethesSlumberingIsle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{U}");

View file

@ -13,6 +13,7 @@ import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetCardInLibrary;
@ -24,8 +25,8 @@ import java.util.UUID;
*/ */
public final class AyarasOathsworn extends CardImpl { public final class AyarasOathsworn extends CardImpl {
private static final Condition condition1 = new SourceHasCounterCondition(CounterType.P1P1, 0, 3); private static final Condition condition1 = new SourceHasCounterCondition(CounterType.P1P1, ComparisonType.FEWER_THAN, 4);
private static final Condition condition2 = new SourceHasCounterCondition(CounterType.P1P1, 4, 4); private static final Condition condition2 = new SourceHasCounterCondition(CounterType.P1P1, ComparisonType.EQUAL_TO, 4);
public AyarasOathsworn(UUID ownerId, CardSetInfo setInfo) { public AyarasOathsworn(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");

View file

@ -1,28 +1,33 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.condition.Condition;
import mage.abilities.effects.OneShotEffect; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.WinGameSourceControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player; import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class AzorsElocutors extends CardImpl { public final class AzorsElocutors extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.FILIBUSTER, 5);
public AzorsElocutors(UUID ownerId, CardSetInfo setInfo) { public AzorsElocutors(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W/U}{W/U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W/U}{W/U}");
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
@ -32,7 +37,13 @@ public final class AzorsElocutors extends CardImpl {
this.toughness = new MageInt(5); this.toughness = new MageInt(5);
// At the beginning of your upkeep, put a filibuster counter on Azor's Elocutors. Then if Azor's Elocutors has five or more filibuster counters on it, you win the game. // At the beginning of your upkeep, put a filibuster counter on Azor's Elocutors. Then if Azor's Elocutors has five or more filibuster counters on it, you win the game.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AzorsElocutorsEffect())); Ability ability = new BeginningOfUpkeepTriggeredAbility(
new AddCountersSourceEffect(CounterType.FILIBUSTER.createInstance())
);
ability.addEffect(new ConditionalOneShotEffect(
new WinGameSourceControllerEffect(), condition,
"Then if {this} has five or more filibuster counters on it, you win the game"
));
// Whenever a source deals damage to you, remove a filibuster counter from Azor's Elocutors. // Whenever a source deals damage to you, remove a filibuster counter from Azor's Elocutors.
this.addAbility(new AzorsElocutorsTriggeredAbility()); this.addAbility(new AzorsElocutorsTriggeredAbility());
@ -71,39 +82,6 @@ class AzorsElocutorsTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
return event.getTargetId().equals(this.controllerId); return isControlledBy(event.getTargetId());
}
}
class AzorsElocutorsEffect extends OneShotEffect {
AzorsElocutorsEffect() {
super(Outcome.Benefit);
staticText = "put a filibuster counter on Azor's Elocutors. Then if Azor's Elocutors has five or more filibuster counters on it, you win the game";
}
private AzorsElocutorsEffect(final AzorsElocutorsEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
permanent.addCounters(CounterType.FILIBUSTER.createInstance(), source.getControllerId(), source, game);
if (permanent.getCounters(game).getCount(CounterType.FILIBUSTER) > 4) {
Player player = game.getPlayer(permanent.getControllerId());
if (player != null) {
player.won(game);
}
}
return true;
}
return false;
}
@Override
public AzorsElocutorsEffect copy() {
return new AzorsElocutorsEffect(this);
} }
} }

View file

@ -1,16 +1,14 @@
package mage.cards.b; package mage.cards.b;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.OpponentLostLifeCondition; import mage.abilities.condition.common.OpponentLostLifeCondition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -18,14 +16,17 @@ import mage.constants.ComparisonType;
import mage.constants.SetTargetPointer; import mage.constants.SetTargetPointer;
import mage.constants.TargetController; import mage.constants.TargetController;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterCard; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class BloodchiefAscension extends CardImpl { public final class BloodchiefAscension extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 3);
public BloodchiefAscension(UUID ownerId, CardSetInfo setInfo) { public BloodchiefAscension(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}");
@ -36,14 +37,12 @@ public final class BloodchiefAscension extends CardImpl {
)); ));
// Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life. // Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life.
Ability ability = new ConditionalInterveningIfTriggeredAbility( Ability ability = new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new PutCardIntoGraveFromAnywhereAllTriggeredAbility( new LoseLifeTargetEffect(2), true, StaticFilters.FILTER_CARD_A,
new LoseLifeTargetEffect(2), true, new FilterCard("a card"), TargetController.OPPONENT, SetTargetPointer.PLAYER), TargetController.OPPONENT, SetTargetPointer.PLAYER
new SourceHasCounterCondition(CounterType.QUEST, 3, Integer.MAX_VALUE), ).withInterveningIf(condition);
"Whenever a card is put into an opponent's graveyard from anywhere, if {this} has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life"); ability.addEffect(new GainLifeEffect(2).concatBy("If you do,"));
ability.addEffect(new GainLifeEffect(2));
this.addAbility(ability); this.addAbility(ability);
} }
private BloodchiefAscension(final BloodchiefAscension card) { private BloodchiefAscension(final BloodchiefAscension card) {

View file

@ -1,8 +1,8 @@
package mage.cards.b; package mage.cards.b;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.DescendedThisTurnCondition; import mage.abilities.condition.common.DescendedThisTurnCondition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.decorator.ConditionalOneShotEffect;
@ -12,6 +12,7 @@ import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TransformAbility; import mage.abilities.keyword.TransformAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -30,6 +31,8 @@ import java.util.UUID;
*/ */
public final class BrasssTunnelGrinder extends CardImpl { public final class BrasssTunnelGrinder extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.BORE, 3);
public BrasssTunnelGrinder(UUID ownerId, CardSetInfo setInfo) { public BrasssTunnelGrinder(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{R}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{R}");
this.secondSideCardClazz = mage.cards.t.TecutlanTheSearingRift.class; this.secondSideCardClazz = mage.cards.t.TecutlanTheSearingRift.class;
@ -45,14 +48,10 @@ public final class BrasssTunnelGrinder extends CardImpl {
TargetController.YOU, new AddCountersSourceEffect(CounterType.BORE.createInstance()), TargetController.YOU, new AddCountersSourceEffect(CounterType.BORE.createInstance()),
false, DescendedThisTurnCondition.instance false, DescendedThisTurnCondition.instance
); );
ability.addEffect(new ConditionalOneShotEffect(
ConditionalOneShotEffect secondCheck = new ConditionalOneShotEffect( new RemoveAllCountersSourceEffect(CounterType.BORE), condition,
new RemoveAllCountersSourceEffect(CounterType.BORE),
new SourceHasCounterCondition(CounterType.BORE, 3, Integer.MAX_VALUE),
"Then if there are three or more bore counters on it, remove those counters and transform it" "Then if there are three or more bore counters on it, remove those counters and transform it"
); ).addEffect(new TransformSourceEffect()));
secondCheck.addEffect(new TransformSourceEffect());
ability.addEffect(secondCheck);
ability.addHint(DescendedThisTurnCount.getHint()); ability.addHint(DescendedThisTurnCount.getHint());
this.addAbility(ability, new DescendedWatcher()); this.addAbility(ability, new DescendedWatcher());
} }

View file

@ -3,35 +3,35 @@ package mage.cards.b;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.FlipSourceEffect; import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class BudokaPupil extends CardImpl { public final class BudokaPupil extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public BudokaPupil(UUID ownerId, CardSetInfo setInfo) { public BudokaPupil(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{G}");
this.subtype.add(SubType.HUMAN, SubType.MONK); this.subtype.add(SubType.HUMAN, SubType.MONK);
this.power = new MageInt(2); this.power = new MageInt(2);
@ -43,10 +43,9 @@ public final class BudokaPupil extends CardImpl {
this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true)); this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true));
// At the beginning of the end step, if there are two or more ki counters on Budoka Pupil, you may flip it. // At the beginning of the end step, if there are two or more ki counters on Budoka Pupil, you may flip it.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new IchigaWhoTopplesOaks()), true), TargetController.NEXT, new FlipSourceEffect(new IchigaWhoTopplesOaks()).setText("flip it"), true, condition
new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), ));
"At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it."));
} }
private BudokaPupil(final BudokaPupil card) { private BudokaPupil(final BudokaPupil card) {
@ -80,6 +79,7 @@ class IchigaWhoTopplesOaks extends TokenImpl {
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
} }
private IchigaWhoTopplesOaks(final IchigaWhoTopplesOaks token) { private IchigaWhoTopplesOaks(final IchigaWhoTopplesOaks token) {
super(token); super(token);
} }

View file

@ -1,37 +1,37 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CounterUnlessPaysEffect; import mage.abilities.effects.common.CounterUnlessPaysEffect;
import mage.abilities.effects.common.FlipSourceEffect; import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.SuperType; import mage.constants.SuperType;
import mage.constants.Zone; import mage.constants.TargetController;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.TokenImpl;
import mage.target.TargetSpell; import mage.target.TargetSpell;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class CallowJushi extends CardImpl { public final class CallowJushi extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public CallowJushi(UUID ownerId, CardSetInfo setInfo) { public CallowJushi(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}");
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
@ -46,10 +46,9 @@ public final class CallowJushi extends CardImpl {
this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true)); this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true));
// At the beginning of the end step, if there are two or more ki counters on Callow Jushi, you may flip it. // At the beginning of the end step, if there are two or more ki counters on Callow Jushi, you may flip it.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new JarakuTheInterloper()), true), TargetController.NEXT, new FlipSourceEffect(new JarakuTheInterloper()).setText("flip it"), true, condition
new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), ));
"At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it."));
} }
private CallowJushi(final CallowJushi card) { private CallowJushi(final CallowJushi card) {
@ -80,6 +79,7 @@ class JarakuTheInterloper extends TokenImpl {
ability.addTarget(new TargetSpell()); ability.addTarget(new TargetSpell());
this.addAbility(ability); this.addAbility(ability);
} }
private JarakuTheInterloper(final JarakuTheInterloper token) { private JarakuTheInterloper(final JarakuTheInterloper token) {
super(token); super(token);
} }

View file

@ -37,7 +37,7 @@ public final class CharitableLevy extends CardImpl {
filter.add(Predicates.not(CardType.CREATURE.getPredicate())); filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
} }
private static final Condition condition = new SourceHasCounterCondition(CounterType.COLLECTION, 3, Integer.MAX_VALUE); private static final Condition condition = new SourceHasCounterCondition(CounterType.COLLECTION, 3);
private static final FilterCard filterPlains = new FilterBySubtypeCard(SubType.PLAINS); private static final FilterCard filterPlains = new FilterBySubtypeCard(SubType.PLAINS);

View file

@ -46,12 +46,12 @@ public final class Cocoon extends CardImpl {
// When Cocoon enters the battlefield, tap enchanted creature and put three pupa counters on Cocoon. // When Cocoon enters the battlefield, tap enchanted creature and put three pupa counters on Cocoon.
Ability ability = new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect()); Ability ability = new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect());
ability.addEffect(new AddCountersSourceEffect(CounterType.PUPA.createInstance(3))); ability.addEffect(new AddCountersSourceEffect(CounterType.PUPA.createInstance(3)).concatBy("and"));
this.addAbility(ability); this.addAbility(ability);
// Enchanted creature doesnt untap during your untap step if Cocoon has a pupa counter on it. // Enchanted creature doesnt untap during your untap step if Cocoon has a pupa counter on it.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepEnchantedEffect(), this.addAbility(new SimpleStaticAbility(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"))); new SourceHasCounterCondition(CounterType.PUPA)).setText("Enchanted creature doesn't untap during your untap step if {this} has a pupa counter on it")));
// At the beginning of your upkeep, remove a pupa counter from Cocoon. If you cant, sacrifice it, put a +1/+1 counter on enchanted creature, and that creature gains flying. // At the beginning of your upkeep, remove a pupa counter from Cocoon. If you cant, sacrifice it, put a +1/+1 counter on enchanted creature, and that creature gains flying.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CocoonEffect())); this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CocoonEffect()));

View file

@ -1,37 +1,33 @@
package mage.cards.c; package mage.cards.c;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.FlipSourceEffect; import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class CunningBandit extends CardImpl { public final class CunningBandit extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public CunningBandit(UUID ownerId, CardSetInfo setInfo) { public CunningBandit(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.HUMAN);
@ -46,10 +42,9 @@ public final class CunningBandit extends CardImpl {
this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true)); this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true));
// At the beginning of the end step, if there are two or more ki counters on Cunning Bandit, you may flip it. // At the beginning of the end step, if there are two or more ki counters on Cunning Bandit, you may flip it.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new AzamukiTreacheryIncarnate()), true), TargetController.NEXT, new FlipSourceEffect(new AzamukiTreacheryIncarnate()).setText("flip it"), true, condition
new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), ));
"At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it."));
} }
private CunningBandit(final CunningBandit card) { private CunningBandit(final CunningBandit card) {
@ -80,6 +75,7 @@ class AzamukiTreacheryIncarnate extends TokenImpl {
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
} }
private AzamukiTreacheryIncarnate(final AzamukiTreacheryIncarnate token) { private AzamukiTreacheryIncarnate(final AzamukiTreacheryIncarnate token) {
super(token); super(token);
} }

View file

@ -1,14 +1,13 @@
package mage.cards.d; package mage.cards.d;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.CycleTriggeredAbility; import mage.abilities.common.CycleTriggeredAbility;
import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.common.SpellCastOpponentTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.effects.common.CounterTargetEffect;
import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
@ -19,33 +18,36 @@ import mage.constants.CardType;
import mage.constants.SetTargetPointer; import mage.constants.SetTargetPointer;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterSpell;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.target.TargetSpell; import mage.target.TargetSpell;
import java.util.UUID;
/** /**
*
* @author LoneFox * @author LoneFox
*/ */
public final class DecreeOfSilence extends CardImpl { public final class DecreeOfSilence extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION, 3);
public DecreeOfSilence(UUID ownerId, CardSetInfo setInfo) { public DecreeOfSilence(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{6}{U}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{6}{U}{U}");
// Whenever an opponent casts a spell, counter that spell and put a depletion counter on Decree of Silence. If there are three or more depletion counters on Decree of Silence, sacrifice it. // Whenever an opponent casts a spell, counter that spell and put a depletion counter on Decree of Silence. If there are three or more depletion counters on Decree of Silence, sacrifice it.
Effect effect = new CounterTargetEffect(); Ability ability = new SpellCastOpponentTriggeredAbility(
effect.setText("counter that spell"); Zone.BATTLEFIELD, new CounterTargetEffect().setText("counter that spell"),
Ability ability = new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD, effect, StaticFilters.FILTER_SPELL_A, StaticFilters.FILTER_SPELL_A, false, SetTargetPointer.SPELL
false, SetTargetPointer.SPELL); );
effect = new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()); ability.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()).concatBy("and"));
effect.setText("and put a depletion counter on {this}."); ability.addEffect(new ConditionalOneShotEffect(
ability.addEffect(effect); new SacrificeSourceEffect(), condition, "If there are " +
ability.addEffect(new ConditionalOneShotEffect(new SacrificeSourceEffect(), "three or more depletion counters on {this}, sacrifice it"
new SourceHasCounterCondition(CounterType.DEPLETION, 3, Integer.MAX_VALUE), ));
" If there are three or more depletion counters on {this}, sacrifice it"));
this.addAbility(ability); this.addAbility(ability);
// Cycling {4}{U}{U} // Cycling {4}{U}{U}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{4}{U}{U}"))); this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{4}{U}{U}")));
// When you cycle Decree of Silence, you may counter target spell. // When you cycle Decree of Silence, you may counter target spell.
ability = new CycleTriggeredAbility(new CounterTargetEffect(), true); ability = new CycleTriggeredAbility(new CounterTargetEffect(), true);
ability.addTarget(new TargetSpell()); ability.addTarget(new TargetSpell());

View file

@ -5,19 +5,19 @@ import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.RestrictionEffect; import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.combat.CantAttackTargetEffect; import mage.abilities.effects.common.combat.CantAttackTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.Duration;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.turn.Step;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID; import java.util.UUID;
@ -27,7 +27,7 @@ import java.util.UUID;
*/ */
public final class EdificeOfAuthority extends CardImpl { public final class EdificeOfAuthority extends CardImpl {
private static final String rule = "{1}, {T}: Until your next turn, target creature can't attack or block and its activated abilities can't be activated. Activate only if there are three or more brick counters on {this}."; private static final Condition condition = new SourceHasCounterCondition(CounterType.BRICK, 3);
public EdificeOfAuthority(UUID ownerId, CardSetInfo setInfo) { public EdificeOfAuthority(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
@ -40,12 +40,10 @@ public final class EdificeOfAuthority extends CardImpl {
this.addAbility(ability); this.addAbility(ability);
// {1}, {T}: Until your next turn, target creature can't attack or block and its activated abilities can't be activated. Activate this ability only if there are three or more brick counter on Edifice of Authority. // {1}, {T}: Until your next turn, target creature can't attack or block and its activated abilities can't be activated. Activate this ability only if there are three or more brick counter on Edifice of Authority.
Condition condition = new SourceHasCounterCondition(CounterType.BRICK, 3, Integer.MAX_VALUE); Ability ability2 = new ConditionalActivatedAbility(new EdificeOfAuthorityEffect(), new GenericManaCost(1), condition);
Ability ability2 = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new EdificeOfAuthorityEffect(), new ManaCostsImpl<>("{1}"), condition, rule);
ability2.addCost(new TapSourceCost()); ability2.addCost(new TapSourceCost());
ability2.addTarget(new TargetCreaturePermanent()); ability2.addTarget(new TargetCreaturePermanent());
this.addAbility(ability2); this.addAbility(ability2);
} }
private EdificeOfAuthority(final EdificeOfAuthority card) { private EdificeOfAuthority(final EdificeOfAuthority card) {
@ -58,45 +56,17 @@ public final class EdificeOfAuthority extends CardImpl {
} }
} }
class EdificeOfAuthorityEffect extends OneShotEffect { class EdificeOfAuthorityEffect extends RestrictionEffect {
EdificeOfAuthorityEffect() { EdificeOfAuthorityEffect() {
super(Outcome.LoseAbility); super(Duration.UntilYourNextTurn);
} staticText = "until your next turn, target creature can't attack or block and its activated abilities can't be activated";
public EdificeOfAuthorityEffect(String ruleText) {
super(Outcome.LoseAbility);
staticText = ruleText;
} }
private EdificeOfAuthorityEffect(final EdificeOfAuthorityEffect effect) { private EdificeOfAuthorityEffect(final EdificeOfAuthorityEffect effect) {
super(effect); super(effect);
} }
@Override
public EdificeOfAuthorityEffect copy() {
return new EdificeOfAuthorityEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
EdificeOfAuthorityRestrictionEffect effect = new EdificeOfAuthorityRestrictionEffect();
game.addEffect(effect, source);
return true;
}
}
class EdificeOfAuthorityRestrictionEffect extends RestrictionEffect {
EdificeOfAuthorityRestrictionEffect() {
super(Duration.Custom);
staticText = "";
}
private EdificeOfAuthorityRestrictionEffect(final EdificeOfAuthorityRestrictionEffect effect) {
super(effect);
}
@Override @Override
public void init(Ability source, Game game) { public void init(Ability source, Game game) {
super.init(source, game); super.init(source, game);
@ -108,24 +78,6 @@ class EdificeOfAuthorityRestrictionEffect extends RestrictionEffect {
} }
} }
@Override
public boolean isInactive(Ability source, Game game) {
if (game.getPhase().getStep().getType() == PhaseStep.UNTAP
&& game.getStep().getStepPart() == Step.StepPart.PRE) {
if (game.isActivePlayer(source.getControllerId())
|| game.getPlayer(source.getControllerId()).hasReachedNextTurnAfterLeaving()) {
for (UUID targetId : this.getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null) {
permanent.addInfo("Can't attack or block and its activated abilities can't be activated." + getId(), "", game);
}
}
return true;
}
}
return false;
}
@Override @Override
public boolean applies(Permanent permanent, Ability source, Game game) { public boolean applies(Permanent permanent, Ability source, Game game) {
return this.getTargetPointer().getTargets(game, source).contains(permanent.getId()); return this.getTargetPointer().getTargets(game, source).contains(permanent.getId());
@ -147,8 +99,8 @@ class EdificeOfAuthorityRestrictionEffect extends RestrictionEffect {
} }
@Override @Override
public EdificeOfAuthorityRestrictionEffect copy() { public EdificeOfAuthorityEffect copy() {
return new EdificeOfAuthorityRestrictionEffect(this); return new EdificeOfAuthorityEffect(this);
} }
} }

View file

@ -2,7 +2,6 @@ package mage.cards.e;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
@ -15,9 +14,11 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.keyword.HexproofAbility; import mage.abilities.keyword.HexproofAbility;
import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -28,8 +29,8 @@ import java.util.UUID;
*/ */
public final class EvolvedSpinoderm extends CardImpl { public final class EvolvedSpinoderm extends CardImpl {
private static final Condition condition1 = new SourceHasCounterCondition(CounterType.OIL, 3); private static final Condition condition1 = new SourceHasCounterCondition(CounterType.OIL, ComparisonType.OR_LESS, 2);
private static final Condition condition2 = new SourceHasCounterCondition(CounterType.OIL, 0, 0); private static final Condition condition2 = new SourceHasCounterCondition(CounterType.OIL, ComparisonType.EQUAL_TO, 0);
public EvolvedSpinoderm(UUID ownerId, CardSetInfo setInfo) { public EvolvedSpinoderm(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");

View file

@ -1,21 +1,21 @@
package mage.cards.f; package mage.cards.f;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalAsThoughEffect; import mage.abilities.decorator.ConditionalAsThoughEffect;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderSourceEffect; import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.DefenderAbility;
import mage.abilities.keyword.DisturbAbility; import mage.abilities.keyword.DisturbAbility;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -27,7 +27,7 @@ import java.util.UUID;
*/ */
public final class FaithboundJudge extends CardImpl { public final class FaithboundJudge extends CardImpl {
private static final Condition condition1 = new SourceHasCounterCondition(CounterType.JUDGMENT, 0, 2); private static final Condition condition1 = new SourceHasCounterCondition(CounterType.JUDGMENT, ComparisonType.OR_LESS, 2);
private static final Condition condition2 = new SourceHasCounterCondition(CounterType.JUDGMENT, 3); private static final Condition condition2 = new SourceHasCounterCondition(CounterType.JUDGMENT, 3);
public FaithboundJudge(UUID ownerId, CardSetInfo setInfo) { public FaithboundJudge(UUID ownerId, CardSetInfo setInfo) {
@ -49,18 +49,16 @@ public final class FaithboundJudge extends CardImpl {
this.addAbility(VigilanceAbility.getInstance()); this.addAbility(VigilanceAbility.getInstance());
// At the beginning of your upkeep, if Faithbound Judge has two or fewer judgment counters on it, put a judgment counter on it. // At the beginning of your upkeep, if Faithbound Judge has two or fewer judgment counters on it, put a judgment counter on it.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new BeginningOfUpkeepTriggeredAbility( new AddCountersSourceEffect(CounterType.JUDGMENT.createInstance())
new AddCountersSourceEffect(CounterType.JUDGMENT.createInstance()), false .setText("put a judgment counter on it"), false
), condition1, "At the beginning of your upkeep, if {this} has " + ).withInterveningIf(condition1));
"two or fewer judgment counters on it, put a judgment counter on it."
));
// As long as Faithbound Judge has three or more judgment counters on it, it can attack as though it didn't have defender. // As long as Faithbound Judge has three or more judgment counters on it, it can attack as though it didn't have defender.
this.addAbility(new SimpleStaticAbility(new ConditionalAsThoughEffect( this.addAbility(new SimpleStaticAbility(new ConditionalAsThoughEffect(
new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.WhileOnBattlefield), condition2 new CanAttackAsThoughItDidntHaveDefenderSourceEffect(Duration.WhileOnBattlefield), condition2
).setText("as long as {this} has three or more judgment counters on it," + ).setText("as long as {this} has three or more judgment counters on it, " +
" it can attack as though it didn't have defender"))); "it can attack as though it didn't have defender")));
// Disturb {5}{W}{W} // Disturb {5}{W}{W}
this.addAbility(new DisturbAbility(this, "{5}{W}{W}")); this.addAbility(new DisturbAbility(this, "{5}{W}{W}"));

View file

@ -1,36 +1,34 @@
package mage.cards.f; package mage.cards.f;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.FlipSourceEffect; import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.PreventDamageToTargetEffect; import mage.abilities.effects.common.PreventDamageToTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
* @author LevelX2 * @author LevelX2
*/ */
public final class FaithfulSquire extends CardImpl { public final class FaithfulSquire extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public FaithfulSquire(UUID ownerId, CardSetInfo setInfo) { public FaithfulSquire(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.HUMAN);
@ -42,14 +40,15 @@ public final class FaithfulSquire extends CardImpl {
this.flipCardName = "Kaiso, Memory of Loyalty"; this.flipCardName = "Kaiso, Memory of Loyalty";
// Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Faithful Squire. // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Faithful Squire.
this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true)); this.addAbility(new SpellCastControllerTriggeredAbility(
new AddCountersSourceEffect(CounterType.KI.createInstance()),
StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true
));
// At the beginning of the end step, if there are two or more ki counters on Faithful Squire, you may flip it // At the beginning of the end step, if there are two or more ki counters on Faithful Squire, you may flip it
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new KaisoMemoryOfLoyaltyToken()), true), TargetController.NEXT, new FlipSourceEffect(new KaisoMemoryOfLoyaltyToken()).setText("flip it"), true, condition
new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), ));
"At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it."));
} }
private FaithfulSquire(final FaithfulSquire card) { private FaithfulSquire(final FaithfulSquire card) {

View file

@ -1,9 +1,9 @@
package mage.cards.g; package mage.cards.g;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.decorator.ConditionalOneShotEffect;
@ -13,16 +13,20 @@ import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author jeffwadsworth * @author jeffwadsworth
*/ */
public final class GemstoneMine extends CardImpl { public final class GemstoneMine extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.MINING, ComparisonType.EQUAL_TO, 0);
public GemstoneMine(UUID ownerId, CardSetInfo setInfo) { public GemstoneMine(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Gemstone Mine enters the battlefield with three mining counters on it. // Gemstone Mine enters the battlefield with three mining counters on it.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.MINING.createInstance(3)), this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.MINING.createInstance(3)),
@ -31,7 +35,10 @@ public final class GemstoneMine extends CardImpl {
// {T}, Remove a mining counter from Gemstone Mine: Add one mana of any color. If there are no mining counters on Gemstone Mine, sacrifice it. // {T}, Remove a mining counter from Gemstone Mine: Add one mana of any color. If there are no mining counters on Gemstone Mine, sacrifice it.
Ability ability = new AnyColorManaAbility(); Ability ability = new AnyColorManaAbility();
ability.addCost(new RemoveCountersSourceCost(CounterType.MINING.createInstance(1))); ability.addCost(new RemoveCountersSourceCost(CounterType.MINING.createInstance(1)));
ability.addEffect(new ConditionalOneShotEffect(new SacrificeSourceEffect(), new SourceHasCounterCondition(CounterType.MINING, 0, 0), "If there are no mining counters on {this}, sacrifice it")); ability.addEffect(new ConditionalOneShotEffect(
new SacrificeSourceEffect(), condition,
"If there are no mining counters on {this}, sacrifice it"
));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,29 +1,28 @@
package mage.cards.h; package mage.cards.h;
import java.util.UUID;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.common.WinGameSourceControllerEffect; import mage.abilities.effects.common.WinGameSourceControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.ShroudAbility; import mage.abilities.keyword.ShroudAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author jeffwadsworth * @author jeffwadsworth
*/ */
public final class HelixPinnacle extends CardImpl { public final class HelixPinnacle extends CardImpl {
static final String rule = "at the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game"; private static final Condition condition = new SourceHasCounterCondition(CounterType.TOWER, 100);
public HelixPinnacle(UUID ownerId, CardSetInfo setInfo) { public HelixPinnacle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}");
@ -32,16 +31,12 @@ public final class HelixPinnacle extends CardImpl {
this.addAbility(ShroudAbility.getInstance()); this.addAbility(ShroudAbility.getInstance());
// {X}: Put X tower counters on Helix Pinnacle. // {X}: Put X tower counters on Helix Pinnacle.
this.addAbility(new SimpleActivatedAbility( this.addAbility(new SimpleActivatedAbility(new AddCountersSourceEffect(
new AddCountersSourceEffect(CounterType.TOWER.createInstance(), GetXValue.instance, true), CounterType.TOWER.createInstance(), GetXValue.instance, true
new ManaCostsImpl<>("{X}"))); ), new ManaCostsImpl<>("{X}")));
// At the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game. // At the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect()).withInterveningIf(condition));
new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect()),
new SourceHasCounterCondition(CounterType.TOWER, 100, Integer.MAX_VALUE),
rule));
} }
private HelixPinnacle(final HelixPinnacle card) { private HelixPinnacle(final HelixPinnacle card) {

View file

@ -1,11 +1,9 @@
package mage.cards.h; package mage.cards.h;
import java.util.UUID;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +15,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Plopman * @author Plopman
*/ */
public final class HickoryWoodlot extends CardImpl { public final class HickoryWoodlot extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION, ComparisonType.EQUAL_TO, 0);
public HickoryWoodlot(UUID ownerId, CardSetInfo setInfo) { public HickoryWoodlot(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Hickory Woodlot enters the battlefield tapped with two depletion counters on it. // Hickory Woodlot enters the battlefield tapped with two depletion counters on it.
Ability etbAbility = new EntersBattlefieldAbility( Ability etbAbility = new EntersBattlefieldAbility(
@ -35,10 +37,14 @@ public final class HickoryWoodlot extends CardImpl {
); );
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2))); etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
this.addAbility(etbAbility); this.addAbility(etbAbility);
// {tap}, Remove a depletion counter from Hickory Woodlot: Add {G}{G}. If there are no depletion counters on Hickory Woodlot, sacrifice it. // {tap}, Remove a depletion counter from Hickory Woodlot: Add {G}{G}. If there are no depletion counters on Hickory Woodlot, sacrifice it.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(2), new TapSourceCost()); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(2), new TapSourceCost());
ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1))); ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1)));
ability.addEffect(new ConditionalOneShotEffect(new SacrificeSourceEffect(), new SourceHasCounterCondition(CounterType.DEPLETION, 0,0), "If there are no depletion counters on {this}, sacrifice it")); ability.addEffect(new ConditionalOneShotEffect(
new SacrificeSourceEffect(), condition,
"If there are no depletion counters on {this}, sacrifice it"
));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,37 +1,34 @@
package mage.cards.h; package mage.cards.h;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.FlipSourceEffect; import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.FearAbility; import mage.abilities.keyword.FearAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
* @author LevelX2 * @author LevelX2
*/ */
public final class HiredMuscle extends CardImpl { public final class HiredMuscle extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public HiredMuscle(UUID ownerId, CardSetInfo setInfo) { public HiredMuscle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
@ -44,13 +41,15 @@ public final class HiredMuscle extends CardImpl {
this.flipCardName = "Scarmaker"; this.flipCardName = "Scarmaker";
// Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Hired Muscle. // Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Hired Muscle.
this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.KI.createInstance()), StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true)); this.addAbility(new SpellCastControllerTriggeredAbility(
new AddCountersSourceEffect(CounterType.KI.createInstance()),
StaticFilters.FILTER_SPIRIT_OR_ARCANE_CARD, true
));
// At the beginning of the end step, if there are two or more ki counters on Hired Muscle, you may flip it. // At the beginning of the end step, if there are two or more ki counters on Hired Muscle, you may flip it.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfEndStepTriggeredAbility(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new Scarmaker()), true), TargetController.NEXT, new FlipSourceEffect(new Scarmaker()).setText("flip it"), true, condition
new SourceHasCounterCondition(CounterType.KI, 2, Integer.MAX_VALUE), ));
"At the beginning of the end step, if there are two or more ki counters on {this}, you may flip it."));
} }
private HiredMuscle(final HiredMuscle card) { private HiredMuscle(final HiredMuscle card) {
@ -81,6 +80,7 @@ class Scarmaker extends TokenImpl {
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
} }
private Scarmaker(final Scarmaker token) { private Scarmaker(final Scarmaker token) {
super(token); super(token);
} }

View file

@ -1,57 +1,63 @@
package mage.cards.h; package mage.cards.h;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.StateTriggeredAbility; import mage.abilities.StateTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.common.CountersSourceCount; import mage.abilities.dynamicvalue.common.CountersSourceCount;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.RemoveAllCountersSourceEffect; import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.*;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import java.util.UUID;
/** /**
*
* @author LoneFox * @author LoneFox
*/ */
public final class Homarid extends CardImpl { public final class Homarid extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.TIDE, ComparisonType.EQUAL_TO, 1);
private static final Condition condition2 = new SourceHasCounterCondition(CounterType.TIDE, ComparisonType.EQUAL_TO, 3);
public Homarid(UUID ownerId, CardSetInfo setInfo) { public Homarid(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.subtype.add(SubType.HOMARID); this.subtype.add(SubType.HOMARID);
this.power = new MageInt(2); this.power = new MageInt(2);
this.toughness = new MageInt(2); this.toughness = new MageInt(2);
// Homarid enters the battlefield with a tide counter on it. // Homarid enters the battlefield with a tide counter on it.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIDE.createInstance()), this.addAbility(new EntersBattlefieldAbility(
"with a tide counter on it.")); new AddCountersSourceEffect(CounterType.TIDE.createInstance()), "with a tide counter on it."
// At the beginning of your upkeep, put a tide counter on Homarid.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.TIDE.createInstance())
)); ));
// At the beginning of your upkeep, put a tide counter on Homarid.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new AddCountersSourceEffect(CounterType.TIDE.createInstance())
));
// As long as there is exactly one tide counter on Homarid, it gets -1/-1. // As long as there is exactly one tide counter on Homarid, it gets -1/-1.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(-1, -1, Duration.WhileOnBattlefield), new SourceHasCounterCondition(CounterType.TIDE, 1, 1), new BoostSourceEffect(-1, -1, Duration.WhileOnBattlefield),
"As long as there is exactly one tide counter on {this}, it gets -1/-1."))); condition, "As long as there is exactly one tide counter on {this}, it gets -1/-1.")));
// As long as there are exactly three tide counters on Homarid, it gets +1/+1. // As long as there are exactly three tide counters on Homarid, it gets +1/+1.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), new SourceHasCounterCondition(CounterType.TIDE, 3, 3), new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield),
"As long as there are exactly three tide counters on {this}, it gets +1/+1."))); condition2, "As long as there are exactly three tide counters on {this}, it gets +1/+1."
)));
// Whenever there are four or more tide counters on Homarid, remove all tide counters from it. // Whenever there are four or more tide counters on Homarid, remove all tide counters from it.
this.addAbility(new HomaridTriggeredAbility(new RemoveAllCountersSourceEffect(CounterType.TIDE))); this.addAbility(new HomaridTriggeredAbility());
} }
private Homarid(final Homarid card) { private Homarid(final Homarid card) {
@ -66,8 +72,8 @@ public final class Homarid extends CardImpl {
class HomaridTriggeredAbility extends StateTriggeredAbility { class HomaridTriggeredAbility extends StateTriggeredAbility {
HomaridTriggeredAbility(Effect effect) { HomaridTriggeredAbility() {
super(Zone.BATTLEFIELD, effect); super(Zone.BATTLEFIELD, new RemoveAllCountersSourceEffect(CounterType.TIDE).setText("remove all tide counters from it"));
setTriggerPhrase("Whenever there are four or more tide counters on {this}, "); setTriggerPhrase("Whenever there are four or more tide counters on {this}, ");
} }

View file

@ -14,8 +14,8 @@ import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.AsThoughEffect; import mage.abilities.effects.AsThoughEffect;
import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.SimpleManaAbility;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -38,13 +38,16 @@ import java.util.UUID;
*/ */
public final class IceCauldron extends CardImpl { public final class IceCauldron extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE, ComparisonType.EQUAL_TO, 0);
public IceCauldron(UUID ownerId, CardSetInfo setInfo) { public IceCauldron(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// {X}, {T}: Put a charge counter on Ice Cauldron and exile a nonland card from your hand. You may cast that card for as long as it remains exiled. Note the type and amount of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on Ice Cauldron. // {X}, {T}: Put a charge counter on Ice Cauldron and exile a nonland card from your hand. You may cast that card for as long as it remains exiled. Note the type and amount of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on Ice Cauldron.
ConditionalActivatedAbility ability = new ConditionalActivatedAbility( Ability ability = new ConditionalActivatedAbility(
Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), new ManaCostsImpl<>("{X}"), new SourceHasCounterCondition(CounterType.CHARGE, 0, 0)); Zone.BATTLEFIELD, new IceCauldronExileEffect(), new ManaCostsImpl<>("{X}"), condition
ability.addEffect(new IceCauldronExileEffect()); );
ability.addEffect(new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true));
ability.addEffect(new IceCauldronNoteManaEffect()); ability.addEffect(new IceCauldronNoteManaEffect());
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
this.addAbility(ability); this.addAbility(ability);

View file

@ -1,15 +1,16 @@
package mage.cards.i; package mage.cards.i;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.CompoundCondition; import mage.abilities.condition.CompoundCondition;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.HaventCastSpellFromHandThisTurnCondition; import mage.abilities.condition.common.HaventCastSpellFromHandThisTurnCondition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.TargetController; import mage.constants.TargetController;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -24,7 +25,7 @@ public final class InventiveWingsmith extends CardImpl {
private static final Condition condition = new CompoundCondition( private static final Condition condition = new CompoundCondition(
"if you haven't cast a spell from your hand this turn and {this} doesn't have a flying counter on it", "if you haven't cast a spell from your hand this turn and {this} doesn't have a flying counter on it",
HaventCastSpellFromHandThisTurnCondition.instance, HaventCastSpellFromHandThisTurnCondition.instance,
new SourceHasCounterCondition(CounterType.FLYING, 0, 0) new SourceHasCounterCondition(CounterType.FLYING, ComparisonType.EQUAL_TO, 0)
); );
public InventiveWingsmith(UUID ownerId, CardSetInfo setInfo) { public InventiveWingsmith(UUID ownerId, CardSetInfo setInfo) {

View file

@ -2,18 +2,20 @@ package mage.cards.j;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -29,14 +31,16 @@ import java.util.UUID;
*/ */
public final class JeweledAmulet extends CardImpl { public final class JeweledAmulet extends CardImpl {
private static final String rule = "{1}, {T}: Put a charge counter on {this}. Note the type of mana spent to pay this activation cost. Activate only if there are no charge counters on {this}."; private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE, ComparisonType.EQUAL_TO, 0);
public JeweledAmulet(UUID ownerId, CardSetInfo setInfo) { public JeweledAmulet(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{0}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{0}");
// {1}, {tap}: Put a charge counter on Jeweled Amulet. Note the type of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on Jeweled Amulet. // {1}, {tap}: Put a charge counter on Jeweled Amulet. Note the type of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on Jeweled Amulet.
ConditionalActivatedAbility ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new JeweledAmuletAddCounterEffect(), new ManaCostsImpl<>("{1}"), new SourceHasCounterCondition(CounterType.CHARGE, 0, 0), rule); ConditionalActivatedAbility ability = new ConditionalActivatedAbility(
ability.addEffect(new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true)); new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), new GenericManaCost(1), condition
);
ability.addEffect(new JeweledAmuletAddCounterEffect());
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
this.addAbility(ability); this.addAbility(ability);
@ -44,7 +48,6 @@ public final class JeweledAmulet extends CardImpl {
Ability ability2 = new SimpleManaAbility(Zone.BATTLEFIELD, new JeweledAmuletAddManaEffect(), new TapSourceCost()); Ability ability2 = new SimpleManaAbility(Zone.BATTLEFIELD, new JeweledAmuletAddManaEffect(), new TapSourceCost());
ability2.addCost(new RemoveCountersSourceCost(CounterType.CHARGE.createInstance())); ability2.addCost(new RemoveCountersSourceCost(CounterType.CHARGE.createInstance()));
this.addAbility(ability2); this.addAbility(ability2);
} }
private JeweledAmulet(final JeweledAmulet card) { private JeweledAmulet(final JeweledAmulet card) {
@ -63,7 +66,7 @@ class JeweledAmuletAddCounterEffect extends OneShotEffect {
public JeweledAmuletAddCounterEffect() { public JeweledAmuletAddCounterEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Note the type of mana spent to pay this activation cost. Activate only if there are no charge counters on {this}"; this.staticText = "Note the type of mana spent to pay this activation cost";
} }
private JeweledAmuletAddCounterEffect(final JeweledAmuletAddCounterEffect effect) { private JeweledAmuletAddCounterEffect(final JeweledAmuletAddCounterEffect effect) {

View file

@ -1,50 +1,50 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.BlueManaAbility;
import mage.abilities.mana.WhiteManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Luna Skyrise * @author Luna Skyrise
*/ */
public final class LandCap extends CardImpl { public final class LandCap extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION);
public LandCap(UUID ownerId, CardSetInfo setInfo) { public LandCap(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Land Cap doesn't untap during your untap step if it has a depletion counter on it. // Land Cap doesn't untap during your untap step if it has a depletion counter on it.
Effect effect = new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepSourceEffect(false, true), this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(
new SourceHasCounterCondition(CounterType.DEPLETION, 1, Integer.MAX_VALUE)); new DontUntapInControllersUntapStepSourceEffect(false, true), condition
effect.setText("{this} doesn't untap during your untap step if it has a depletion counter on it"); ).setText("{this} doesn't untap during your untap step if it has a depletion counter on it")));
Ability ability = new SimpleStaticAbility(effect);
this.addAbility(ability);
// At the beginning of your upkeep, remove a depletion counter from Land Cap. // At the beginning of your upkeep, remove a depletion counter from Land Cap.
Ability ability2 = new BeginningOfUpkeepTriggeredAbility(new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())); this.addAbility(new BeginningOfUpkeepTriggeredAbility(
this.addAbility(ability2); new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())
));
// {T}: Add {W} or {U}. Put a depletion counter on Land Cap. // {T}: Add {W} or {U}. Put a depletion counter on Land Cap.
Ability ability3 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.WhiteMana(1), new TapSourceCost()); Ability ability = new WhiteManaAbility();
ability3.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability3); this.addAbility(ability);
Ability ability4 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlueMana(1), new TapSourceCost()); Ability ability2 = new BlueManaAbility();
ability4.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability2.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability4); this.addAbility(ability2);
} }
private LandCap(final LandCap card) { private LandCap(final LandCap card) {

View file

@ -1,50 +1,51 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.BlackManaAbility;
import mage.abilities.mana.RedManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Luna Skyrise * @author Luna Skyrise
*/ */
public final class LavaTubes extends CardImpl { public final class LavaTubes extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION);
public LavaTubes(UUID ownerId, CardSetInfo setInfo) { public LavaTubes(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Lava Tubes doesn't untap during your untap step if it has a depletion counter on it. // Lava Tubes doesn't untap during your untap step if it has a depletion counter on it.
Effect effect = new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepSourceEffect(false, true), this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(
new SourceHasCounterCondition(CounterType.DEPLETION, 1, Integer.MAX_VALUE)); new DontUntapInControllersUntapStepSourceEffect(false, true), condition
effect.setText("{this} doesn't untap during your untap step if it has a depletion counter on it"); ).setText("{this} doesn't untap during your untap step if it has a depletion counter on it")));
Ability ability = new SimpleStaticAbility(effect);
this.addAbility(ability);
// At the beginning of your upkeep, remove a depletion counter from Lava Tubes. // At the beginning of your upkeep, remove a depletion counter from Lava Tubes.
Ability ability2 = new BeginningOfUpkeepTriggeredAbility(new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())); this.addAbility(new BeginningOfUpkeepTriggeredAbility(
this.addAbility(ability2); new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())
));
// {tap}: Add {B} or {R}. Put a depletion counter on Lava Tubes. // {tap}: Add {B} or {R}. Put a depletion counter on Lava Tubes.
Ability ability3 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(1), new TapSourceCost()); Ability ability = new BlackManaAbility();
ability3.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability3); this.addAbility(ability);
Ability ability4 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(1), new TapSourceCost()); Ability ability2 = new RedManaAbility();
ability4.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability2.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability4); this.addAbility(ability2);
} }
private LavaTubes(final LavaTubes card) { private LavaTubes(final LavaTubes card) {

View file

@ -1,43 +1,39 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author jeffwadsworth * @author jeffwadsworth
*/ */
public final class LuxaRiverShrine extends CardImpl { public final class LuxaRiverShrine extends CardImpl {
private static final String rule = "{T}: You gain 2 life. Activate only if there are three or more brick counters on {this}."; private static final Condition condition = new SourceHasCounterCondition(CounterType.BRICK, 3);
public LuxaRiverShrine(UUID ownerId, CardSetInfo setInfo) { public LuxaRiverShrine(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// {1}, {T}: You gain 1 life. Put a brick counter on Luxa River Shrine. // {1}, {T}: You gain 1 life. Put a brick counter on Luxa River Shrine.
Ability ability = new SimpleActivatedAbility(new GainLifeEffect(1), new ManaCostsImpl<>("{1}")); Ability ability = new SimpleActivatedAbility(new GainLifeEffect(1), new GenericManaCost(1));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addEffect(new AddCountersSourceEffect(CounterType.BRICK.createInstance())); ability.addEffect(new AddCountersSourceEffect(CounterType.BRICK.createInstance()));
this.addAbility(ability); this.addAbility(ability);
// {T}: You gain 2 life. Activate this ability only if there are three or more brick counters on Luxa River Shrine. // {T}: You gain 2 life. Activate this ability only if there are three or more brick counters on Luxa River Shrine.
Condition condition = new SourceHasCounterCondition(CounterType.BRICK, 3, Integer.MAX_VALUE); this.addAbility(new ConditionalActivatedAbility(new GainLifeEffect(2), new TapSourceCost(), condition));
this.addAbility(new ConditionalActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(2), new TapSourceCost(), condition, rule));
} }
private LuxaRiverShrine(final LuxaRiverShrine card) { private LuxaRiverShrine(final LuxaRiverShrine card) {

View file

@ -1,32 +1,29 @@
package mage.cards.m; package mage.cards.m;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility; import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class ManaBloom extends CardImpl { public final class ManaBloom extends CardImpl {
static final String rule = "with X charge counters on it"; private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE, ComparisonType.EQUAL_TO, 0);
public ManaBloom(UUID ownerId, CardSetInfo setInfo) { public ManaBloom(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{X}{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{X}{G}");
@ -35,16 +32,15 @@ public final class ManaBloom extends CardImpl {
this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.CHARGE.createInstance()))); this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.CHARGE.createInstance())));
// Remove a charge counter from Mana Bloom: Add one mana of any color. Activate this ability only once each turn. // Remove a charge counter from Mana Bloom: Add one mana of any color. Activate this ability only once each turn.
Ability ability = new LimitedTimesPerTurnActivatedManaAbility( this.addAbility(new LimitedTimesPerTurnActivatedManaAbility(
Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(),
new RemoveCountersSourceCost(CounterType.CHARGE.createInstance()) new RemoveCountersSourceCost(CounterType.CHARGE.createInstance())
); ));
this.addAbility(ability);
// At the beginning of your upkeep, if Mana Bloom has no charge counters on it, return it to its owner's hand. // At the beginning of your upkeep, if Mana Bloom has no charge counters on it, return it to its owner's hand.
TriggeredAbility triggeredAbility = new BeginningOfUpkeepTriggeredAbility(new ReturnToHandSourceEffect(true)); this.addAbility(new BeginningOfUpkeepTriggeredAbility(
this.addAbility(new ConditionalInterveningIfTriggeredAbility(triggeredAbility, new SourceHasCounterCondition(CounterType.CHARGE, 0, 0), "At the beginning of your upkeep, if Mana Bloom has no charge counters on it, return it to its owner's hand.")); new ReturnToHandSourceEffect(true).setText("return it to its owner's hand")
).withInterveningIf(condition));
} }
private ManaBloom(final ManaBloom card) { private ManaBloom(final ManaBloom card) {

View file

@ -48,7 +48,7 @@ public final class Merseine extends CardImpl {
// Enchanted creature doesn't untap during its controller's untap step if Merseine has a net counter on it. // Enchanted creature doesn't untap during its controller's untap step if Merseine has a net counter on it.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepEnchantedEffect(), this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepEnchantedEffect(),
new SourceHasCounterCondition(CounterType.NET)).setText("Enchanted creature doesn't untap during its controller's untap step if Merseine has a net counter on it"))); new SourceHasCounterCondition(CounterType.NET)).setText("Enchanted creature doesn't untap during its controller's untap step if {this} has a net counter on it")));
// Pay enchanted creature's mana cost: Remove a net counter from Merseine. Any player may activate this ability, but only if they control the enchanted creature. // Pay enchanted creature's mana cost: Remove a net counter from Merseine. Any player may activate this ability, but only if they control the enchanted creature.
SimpleActivatedAbility ability = new MerseineActivatedAbility(); SimpleActivatedAbility ability = new MerseineActivatedAbility();
@ -95,7 +95,7 @@ class MerseineActivatedAbility extends SimpleActivatedAbility {
@Override @Override
public String getRule() { public String getRule() {
return "Pay enchanted creature's mana cost: Remove a net counter from Merseine. Any player may activate this ability, but only if they control the enchanted creature."; return "Pay enchanted creature's mana cost: Remove a net counter from {this}. Only the controller of the enchanted creature may activate this ability.";
} }
} }

View file

@ -2,18 +2,21 @@ package mage.cards.o;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect; import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.players.Player; import mage.players.Player;
@ -25,25 +28,21 @@ import java.util.UUID;
*/ */
public final class OraclesVault extends CardImpl { public final class OraclesVault extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.BRICK, 3);
public OraclesVault(UUID ownerId, CardSetInfo setInfo) { public OraclesVault(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// {2}, {T}: Exile the top card of your library. Until end of turn, you may play that card. // {2}, {T}: Exile the top card of your library. Until end of turn, you may play that card. Put a brick counter on Oracle's Vault.
Ability ability = new SimpleActivatedAbility(new ExileTopXMayPlayUntilEffect(1, Duration.EndOfTurn) Ability ability = new SimpleActivatedAbility(new ExileTopXMayPlayUntilEffect(1, Duration.EndOfTurn)
.withTextOptions("that card", false), new GenericManaCost(2)); .withTextOptions("that card", false), new GenericManaCost(2));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addEffect(new AddCountersSourceEffect(CounterType.BRICK.createInstance()));
// Put a brick counter on Oracle's Vault.
Effect effect2 = new AddCountersSourceEffect(CounterType.BRICK.createInstance());
ability.addEffect(effect2);
this.addAbility(ability); this.addAbility(ability);
// {T}: Exile the top card of your library. Until end of turn, you may play that card without paying its mana cost. // {T}: Exile the top card of your library. Until end of turn, you may play that card without paying its mana cost.
// Activate this ability only if there are three or more brick counters on Oracle's Vault. // Activate this ability only if there are three or more brick counters on Oracle's Vault.
this.addAbility(new ConditionalActivatedAbility(Zone.BATTLEFIELD, this.addAbility(new ConditionalActivatedAbility(new OraclesVaultFreeEffect(), new TapSourceCost(), condition));
new OraclesVaultFreeEffect(), new TapSourceCost(), new SourceHasCounterCondition(CounterType.BRICK, 3, Integer.MAX_VALUE),
"{T}: Exile the top card of your library. Until end of turn, you may play that card without paying its mana cost. "
+ "Activate only if there are three or more brick counters on {this}."));
} }
private OraclesVault(final OraclesVault card) { private OraclesVault(final OraclesVault card) {
@ -60,6 +59,7 @@ class OraclesVaultFreeEffect extends OneShotEffect {
OraclesVaultFreeEffect() { OraclesVaultFreeEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "exile the top card of your library. Until end of turn, you may play that card without paying its mana cost";
} }
private OraclesVaultFreeEffect(final OraclesVaultFreeEffect effect) { private OraclesVaultFreeEffect(final OraclesVaultFreeEffect effect) {

View file

@ -1,11 +1,10 @@
package mage.cards.p; package mage.cards.p;
import java.util.UUID;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +16,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Plopman * @author Plopman
*/ */
public final class PeatBog extends CardImpl { public final class PeatBog extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION, ComparisonType.EQUAL_TO, 0);
public PeatBog(UUID ownerId, CardSetInfo setInfo) { public PeatBog(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Peat Bog enters the battlefield tapped with two depletion counters on it. // Peat Bog enters the battlefield tapped with two depletion counters on it.
Ability etbAbility = new EntersBattlefieldAbility( Ability etbAbility = new EntersBattlefieldAbility(
@ -35,10 +38,14 @@ public final class PeatBog extends CardImpl {
); );
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2))); etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
this.addAbility(etbAbility); this.addAbility(etbAbility);
// {T}, Remove a depletion counter from Peat Bog: Add {B}{B}. If there are no depletion counters on Peat Bog, sacrifice it. // {T}, Remove a depletion counter from Peat Bog: Add {B}{B}. If there are no depletion counters on Peat Bog, sacrifice it.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(2), new TapSourceCost()); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(2), new TapSourceCost());
ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1))); ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1)));
ability.addEffect(new ConditionalOneShotEffect(new SacrificeSourceEffect(), new SourceHasCounterCondition(CounterType.DEPLETION, 0,0), "If there are no depletion counters on {this}, sacrifice it")); ability.addEffect(new ConditionalOneShotEffect(
new SacrificeSourceEffect(), condition,
"If there are no depletion counters on {this}, sacrifice it"
));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -111,7 +111,7 @@ class PeltCollectorTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever another creature you control enters the battlefield " return "Whenever another creature you control enters "
+ "or dies, if that creature's power is greater than {this}'s, " + "or dies, if that creature's power is greater than {this}'s, "
+ "put a +1/+1 counter on {this}."; + "put a +1/+1 counter on {this}.";
} }

View file

@ -1,7 +1,6 @@
package mage.cards.p; package mage.cards.p;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
@ -11,6 +10,7 @@ import mage.abilities.effects.common.DoubleCountersSourceEffect;
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
@ -24,8 +24,7 @@ import java.util.UUID;
*/ */
public final class PrimordialHydra extends CardImpl { public final class PrimordialHydra extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.P1P1, 10, Integer.MAX_VALUE); private static final Condition condition = new SourceHasCounterCondition(CounterType.P1P1, 10);
private static final String staticText = "{this} has trample as long as it has ten or more +1/+1 counters on it";
public PrimordialHydra(UUID ownerId, CardSetInfo setInfo) { public PrimordialHydra(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{G}");
@ -39,13 +38,12 @@ public final class PrimordialHydra extends CardImpl {
this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance()))); this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance())));
// At the beginning of your upkeep, double the number of +1/+1 counters on Primordial Hydra. // At the beginning of your upkeep, double the number of +1/+1 counters on Primordial Hydra.
this.addAbility(new BeginningOfUpkeepTriggeredAbility( this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DoubleCountersSourceEffect(CounterType.P1P1)));
new DoubleCountersSourceEffect(CounterType.P1P1)
));
// Primordial Hydra has trample as long as it has ten or more +1/+1 counters on it. // Primordial Hydra has trample as long as it has ten or more +1/+1 counters on it.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(TrampleAbility.getInstance()), condition, staticText new GainAbilitySourceEffect(TrampleAbility.getInstance()), condition,
"{this} has trample as long as it has ten or more +1/+1 counters on it"
))); )));
} }

View file

@ -1,9 +1,8 @@
package mage.cards.q; package mage.cards.q;
import java.util.UUID;
import mage.abilities.common.BecomesTappedTriggeredAbility; import mage.abilities.common.BecomesTappedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.UntapAllDuringEachOtherPlayersUntapStepEffect; import mage.abilities.effects.common.continuous.UntapAllDuringEachOtherPlayersUntapStepEffect;
@ -11,28 +10,33 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author jeffwadsworth * @author jeffwadsworth
*/ */
public final class QuestForRenewal extends CardImpl { public final class QuestForRenewal extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 4);
public QuestForRenewal(UUID ownerId, CardSetInfo setInfo) { public QuestForRenewal(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
// Whenever a creature you control becomes tapped, you may put a quest counter on Quest for Renewal. // Whenever a creature you control becomes tapped, you may put a quest counter on Quest for Renewal.
this.addAbility(new BecomesTappedTriggeredAbility(new AddCountersSourceEffect(CounterType.QUEST.createInstance()), this.addAbility(new BecomesTappedTriggeredAbility(
true, StaticFilters.FILTER_CONTROLLED_A_CREATURE)); new AddCountersSourceEffect(CounterType.QUEST.createInstance()),
true, StaticFilters.FILTER_CONTROLLED_A_CREATURE
));
// As long as there are four or more quest counters on Quest for Renewal, untap all creatures you control during each other player's untap step. // As long as there are four or more quest counters on Quest for Renewal, untap all creatures you control during each other player's untap step.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new UntapAllDuringEachOtherPlayersUntapStepEffect(StaticFilters.FILTER_CONTROLLED_CREATURES), new UntapAllDuringEachOtherPlayersUntapStepEffect(StaticFilters.FILTER_CONTROLLED_CREATURES),
new SourceHasCounterCondition(CounterType.QUEST, 4, Integer.MAX_VALUE), condition, "As long as there are four or more quest counters on {this}, " +
"As long as there are four or more quest counters on {this}, untap all creatures you control during each other player's untap step."))); "untap all creatures you control during each other player's untap step."
)));
} }
private QuestForRenewal(final QuestForRenewal card) { private QuestForRenewal(final QuestForRenewal card) {

View file

@ -1,39 +1,44 @@
package mage.cards.q; package mage.cards.q;
import java.util.UUID; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
/** /**
*
* @author jeffwadsworth * @author jeffwadsworth
*/ */
public final class QuestForTheGoblinLord extends CardImpl { public final class QuestForTheGoblinLord extends CardImpl {
private static final String rule = "As long as {this} has five or more quest counters on it, creatures you control get +2/+0"; private static final FilterPermanent goblinFilter = new FilterControlledPermanent(SubType.GOBLIN, "a Goblin you control");
private static final FilterPermanent goblinFilter = new FilterControlledPermanent(SubType.GOBLIN, "a Goblin"); private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 5);
public QuestForTheGoblinLord(UUID ownerId, CardSetInfo setInfo) { public QuestForTheGoblinLord(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}");
// Whenever a Goblin you control enters, you may put a quest counter on Quest for the Goblin Lord. // Whenever a Goblin you control enters, you may put a quest counter on Quest for the Goblin Lord.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.QUEST.createInstance()), goblinFilter, true)); this.addAbility(new EntersBattlefieldAllTriggeredAbility(
new AddCountersSourceEffect(CounterType.QUEST.createInstance()), goblinFilter, true
));
// As long as Quest for the Goblin Lord has five or more quest counters on it, creatures you control get +2/+0. // As long as Quest for the Goblin Lord has five or more quest counters on it, creatures you control get +2/+0.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostAllEffect(2, 0, Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false), new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield), condition,
new SourceHasCounterCondition(CounterType.QUEST, 5, Integer.MAX_VALUE), rule))); "as long as {this} has five or more quest counters on it, creatures you control get +2/+0"
)));
} }
private QuestForTheGoblinLord(final QuestForTheGoblinLord card) { private QuestForTheGoblinLord(final QuestForTheGoblinLord card) {

View file

@ -28,7 +28,7 @@ import java.util.UUID;
public final class QuestForUlasTemple extends CardImpl { public final class QuestForUlasTemple extends CardImpl {
private static final FilterCard filter private static final FilterCard filter
= new FilterCreatureCard("Kraken, Leviathan, Octopus, or Serpent creature card"); = new FilterCreatureCard("a Kraken, Leviathan, Octopus, or Serpent creature card");
static { static {
filter.add(Predicates.or( filter.add(Predicates.or(

View file

@ -17,6 +17,7 @@ import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.permanent.token.PilotCrewToken; import mage.game.permanent.token.PilotCrewToken;
@ -29,7 +30,7 @@ import java.util.UUID;
*/ */
public final class ReckonerBankbuster extends CardImpl { public final class ReckonerBankbuster extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE, 0, 0); private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE, ComparisonType.EQUAL_TO, 0);
public ReckonerBankbuster(UUID ownerId, CardSetInfo setInfo) { public ReckonerBankbuster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
@ -50,7 +51,7 @@ public final class ReckonerBankbuster extends CardImpl {
ability.addEffect(new ConditionalOneShotEffect( ability.addEffect(new ConditionalOneShotEffect(
new CreateTokenEffect(new TreasureToken()).withAdditionalTokens(new PilotCrewToken()), condition, new CreateTokenEffect(new TreasureToken()).withAdditionalTokens(new PilotCrewToken()), condition,
"Then if there are no charge counters on {this}, create a Treasure token and a 1/1 colorless " + "Then if there are no charge counters on {this}, create a Treasure token and a 1/1 colorless " +
"Pilot creature token with \"This creature crews Vehicles as though its power were 2 greater.\"" "Pilot creature token with \"This token crews Vehicles as though its power were 2 greater.\""
)); ));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
ability.addCost(new RemoveCountersSourceCost(CounterType.CHARGE.createInstance())); ability.addCost(new RemoveCountersSourceCost(CounterType.CHARGE.createInstance()));

View file

@ -3,6 +3,7 @@ package mage.cards.r;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
@ -14,6 +15,7 @@ import mage.abilities.keyword.VanishingAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -49,15 +51,15 @@ public final class RegenerationsRestored extends CardImpl {
class RegenerationsRestoredTriggeredAbility extends TriggeredAbilityImpl { class RegenerationsRestoredTriggeredAbility extends TriggeredAbilityImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.TIME, ComparisonType.EQUAL_TO, 0);
RegenerationsRestoredTriggeredAbility() { RegenerationsRestoredTriggeredAbility() {
super(Zone.BATTLEFIELD, new ScryEffect(1, false)); super(Zone.BATTLEFIELD, new ScryEffect(1, false));
this.addEffect(new GainLifeEffect(1).concatBy("and")); this.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addEffect(new ConditionalOneShotEffect( this.addEffect(new ConditionalOneShotEffect(
new RegenerationsRestoredEffect(), new RegenerationsRestoredEffect(), condition, "Then if {this} has no " +
new SourceHasCounterCondition(CounterType.TIME, 0, 0) "time counters on it, exile it. When you do, take an extra turn after this one"
).concatBy("Then")); ));
this.setTriggerPhrase("Whenever one or more time counters are removed from {this}, "); this.setTriggerPhrase("Whenever one or more time counters are removed from {this}, ");
} }

View file

@ -1,11 +1,9 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +15,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Plopman * @author Plopman
*/ */
public final class RemoteFarm extends CardImpl { public final class RemoteFarm extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION, ComparisonType.EQUAL_TO, 0);
public RemoteFarm(UUID ownerId, CardSetInfo setInfo) { public RemoteFarm(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Remote Farm enters the battlefield tapped with two depletion counters on it. // Remote Farm enters the battlefield tapped with two depletion counters on it.
Ability etbAbility = new EntersBattlefieldAbility( Ability etbAbility = new EntersBattlefieldAbility(
@ -35,10 +37,14 @@ public final class RemoteFarm extends CardImpl {
); );
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2))); etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
this.addAbility(etbAbility); this.addAbility(etbAbility);
// {tap}, Remove a depletion counter from Remote Farm: Add {W}{W}. If there are no depletion counters on Remote Farm, sacrifice it. // {tap}, Remove a depletion counter from Remote Farm: Add {W}{W}. If there are no depletion counters on Remote Farm, sacrifice it.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.WhiteMana(2), new TapSourceCost()); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.WhiteMana(2), new TapSourceCost());
ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1))); ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1)));
ability.addEffect(new ConditionalOneShotEffect(new SacrificeSourceEffect(), new SourceHasCounterCondition(CounterType.DEPLETION, 0,0), "If there are no depletion counters on {this}, sacrifice it")); ability.addEffect(new ConditionalOneShotEffect(
new SacrificeSourceEffect(), condition,
"If there are no depletion counters on {this}, sacrifice it"
));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,50 +1,50 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.BlackManaAbility;
import mage.abilities.mana.BlueManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Luna Skyrise * @author Luna Skyrise
*/ */
public final class RiverDelta extends CardImpl { public final class RiverDelta extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION);
public RiverDelta(UUID ownerId, CardSetInfo setInfo) { public RiverDelta(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// River Delta doesn't untap during your untap step if it has a depletion counter on it. // River Delta doesn't untap during your untap step if it has a depletion counter on it.
Effect effect = new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepSourceEffect(false, true), this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(
new SourceHasCounterCondition(CounterType.DEPLETION, 1, Integer.MAX_VALUE)); new DontUntapInControllersUntapStepSourceEffect(false, true), condition
effect.setText("{this} doesn't untap during your untap step if it has a depletion counter on it"); ).setText("{this} doesn't untap during your untap step if it has a depletion counter on it")));
Ability ability = new SimpleStaticAbility(effect);
this.addAbility(ability);
// At the beginning of your upkeep, remove a depletion counter from River Delta. // At the beginning of your upkeep, remove a depletion counter from River Delta.
Ability ability2 = new BeginningOfUpkeepTriggeredAbility(new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())); this.addAbility(new BeginningOfUpkeepTriggeredAbility(
this.addAbility(ability2); new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())
));
// {tap}: Add {U} or {B}. Put a depletion counter on River Delta. // {tap}: Add {U} or {B}. Put a depletion counter on River Delta.
Ability ability3 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlueMana(1), new TapSourceCost()); Ability ability = new BlueManaAbility();
ability3.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability3); this.addAbility(ability);
Ability ability4 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(1), new TapSourceCost()); Ability ability2 = new BlackManaAbility();
ability4.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability2.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability4); this.addAbility(ability2);
} }
private RiverDelta(final RiverDelta card) { private RiverDelta(final RiverDelta card) {

View file

@ -1,12 +1,10 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect;
@ -14,37 +12,50 @@ import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.ComparisonType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author LoneFox * @author LoneFox
*/ */
public final class RocHatchling extends CardImpl { public final class RocHatchling extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.SHELL, ComparisonType.EQUAL_TO, 0);
public RocHatchling(UUID ownerId, CardSetInfo setInfo) { public RocHatchling(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.BIRD); this.subtype.add(SubType.BIRD);
this.power = new MageInt(0); this.power = new MageInt(0);
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// Roc Hatchling enters the battlefield with four shell counters on it. // Roc Hatchling enters the battlefield with four shell counters on it.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.SHELL.createInstance(4)), "with four shell counters on it")); this.addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.SHELL.createInstance(4)),
"with four shell counters on it"
));
// At the beginning of your upkeep, remove a shell counter from Roc Hatchling. // At the beginning of your upkeep, remove a shell counter from Roc Hatchling.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new RemoveCounterSourceEffect(CounterType.SHELL.createInstance()))); this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new RemoveCounterSourceEffect(CounterType.SHELL.createInstance())
));
// As long as Roc Hatchling has no shell counters on it, it gets +3/+2 and has flying. // As long as Roc Hatchling has no shell counters on it, it gets +3/+2 and has flying.
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect( Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(3, 2, Duration.WhileOnBattlefield), new BoostSourceEffect(3, 2, Duration.WhileOnBattlefield),
new SourceHasCounterCondition(CounterType.SHELL, 0, 0), condition, "as long as {this} has no shell counters on it, it gets +3/+2"
"As long as {this} has no shell counters on it, it gets +3/+2")); ));
ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance()), ability.addEffect(new ConditionalContinuousEffect(
new SourceHasCounterCondition(CounterType.SHELL, 0, 0), "and has flying")); new GainAbilitySourceEffect(FlyingAbility.getInstance()),
condition, "and has flying"
));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,26 +1,27 @@
package mage.cards.r; package mage.cards.r;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.Mana; import mage.Mana;
import mage.ObjectColor; import mage.ObjectColor;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.SimpleManaAbility;
import mage.constants.SubType;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterSpell; import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ColorPredicate; import mage.filter.predicate.mageobject.ColorPredicate;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class RunawaySteamKin extends CardImpl { public final class RunawaySteamKin extends CardImpl {
@ -31,6 +32,8 @@ public final class RunawaySteamKin extends CardImpl {
filter.add(new ColorPredicate(ObjectColor.RED)); filter.add(new ColorPredicate(ObjectColor.RED));
} }
private static final Condition condition = new SourceHasCounterCondition(CounterType.P1P1, ComparisonType.FEWER_THAN, 3);
public RunawaySteamKin(UUID ownerId, CardSetInfo setInfo) { public RunawaySteamKin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
@ -39,16 +42,9 @@ public final class RunawaySteamKin extends CardImpl {
this.toughness = new MageInt(1); this.toughness = new MageInt(1);
// Whenever you cast a red spell, if Runaway Steam-Kin has fewer than three +1/+1 counters on it, put a +1/+1 counter on Runaway Steam-Kin. // Whenever you cast a red spell, if Runaway Steam-Kin has fewer than three +1/+1 counters on it, put a +1/+1 counter on Runaway Steam-Kin.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new SpellCastControllerTriggeredAbility(
new SpellCastControllerTriggeredAbility( new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter, false
new AddCountersSourceEffect( ).withInterveningIf(condition));
CounterType.P1P1.createInstance()
), filter, false
), new SourceHasCounterCondition(CounterType.P1P1, 0, 2),
"Whenever you cast a red spell, "
+ "if {this} has fewer than three +1/+1 counters on it, "
+ "put a +1/+1 counter on {this}."
));
// Remove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}. // Remove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}.
this.addAbility(new SimpleManaAbility( this.addAbility(new SimpleManaAbility(

View file

@ -1,11 +1,9 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +15,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Plopman * @author Plopman
*/ */
public final class SandstoneNeedle extends CardImpl { public final class SandstoneNeedle extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION, ComparisonType.EQUAL_TO, 0);
public SandstoneNeedle(UUID ownerId, CardSetInfo setInfo) { public SandstoneNeedle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Sandstone Needle enters the battlefield tapped with two depletion counters on it. // Sandstone Needle enters the battlefield tapped with two depletion counters on it.
Ability etbAbility = new EntersBattlefieldAbility( Ability etbAbility = new EntersBattlefieldAbility(
@ -35,10 +37,14 @@ public final class SandstoneNeedle extends CardImpl {
); );
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2))); etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
this.addAbility(etbAbility); this.addAbility(etbAbility);
// {tap}, Remove a depletion counter from Sandstone Needle: Add {R}{R}. If there are no depletion counters on Sandstone Needle, sacrifice it. // {tap}, Remove a depletion counter from Sandstone Needle: Add {R}{R}. If there are no depletion counters on Sandstone Needle, sacrifice it.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(2), new TapSourceCost()); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(2), new TapSourceCost());
ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1))); ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1)));
ability.addEffect(new ConditionalOneShotEffect(new SacrificeSourceEffect(), new SourceHasCounterCondition(CounterType.DEPLETION, 0,0), "If there are no depletion counters on {this}, sacrifice it")); ability.addEffect(new ConditionalOneShotEffect(
new SacrificeSourceEffect(), condition,
"If there are no depletion counters on {this}, sacrifice it"
));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,11 +1,10 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +16,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Plopman * @author Plopman
*/ */
public final class SaprazzanSkerry extends CardImpl { public final class SaprazzanSkerry extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION, ComparisonType.EQUAL_TO, 0);
public SaprazzanSkerry(UUID ownerId, CardSetInfo setInfo) { public SaprazzanSkerry(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Saprazzan Skerry enters the battlefield tapped with two depletion counters on it. // Saprazzan Skerry enters the battlefield tapped with two depletion counters on it.
Ability etbAbility = new EntersBattlefieldAbility( Ability etbAbility = new EntersBattlefieldAbility(
@ -35,10 +38,14 @@ public final class SaprazzanSkerry extends CardImpl {
); );
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2))); etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
this.addAbility(etbAbility); this.addAbility(etbAbility);
// {tap}, Remove a depletion counter from Saprazzan Skerry: Add {U}{U}. If there are no depletion counters on Saprazzan Skerry, sacrifice it. // {tap}, Remove a depletion counter from Saprazzan Skerry: Add {U}{U}. If there are no depletion counters on Saprazzan Skerry, sacrifice it.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlueMana(2), new TapSourceCost()); Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlueMana(2), new TapSourceCost());
ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1))); ability.addCost(new RemoveCountersSourceCost(CounterType.DEPLETION.createInstance(1)));
ability.addEffect(new ConditionalOneShotEffect(new SacrificeSourceEffect(), new SourceHasCounterCondition(CounterType.DEPLETION, 0,0), "If there are no depletion counters on {this}, sacrifice it")); ability.addEffect(new ConditionalOneShotEffect(
new SacrificeSourceEffect(), condition,
"If there are no depletion counters on {this}, sacrifice it"
));
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,34 +1,35 @@
package mage.cards.s; package mage.cards.s;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone; import mage.constants.ComparisonType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class SerratedArrows extends CardImpl { public final class SerratedArrows extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.ARROWHEAD, ComparisonType.EQUAL_TO, 0);
public SerratedArrows(UUID ownerId, CardSetInfo setInfo) { public SerratedArrows(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// Serrated Arrows enters the battlefield with three arrowhead counters on it. // Serrated Arrows enters the battlefield with three arrowhead counters on it.
Effect effect = new AddCountersSourceEffect(CounterType.ARROWHEAD.createInstance(3)); Effect effect = new AddCountersSourceEffect(CounterType.ARROWHEAD.createInstance(3));
@ -36,16 +37,12 @@ public final class SerratedArrows extends CardImpl {
this.addAbility(new EntersBattlefieldAbility(effect)); this.addAbility(new EntersBattlefieldAbility(effect));
// At the beginning of your upkeep, if there are no arrowhead counters on Serrated Arrows, sacrifice it. // At the beginning of your upkeep, if there are no arrowhead counters on Serrated Arrows, sacrifice it.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect().setText("sacrifice it")).withInterveningIf(condition));
new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceEffect()),
new SourceHasCounterCondition(CounterType.ARROWHEAD, 0, 0),
"At the beginning of your upkeep, if there are no arrowhead counters on {this}, sacrifice it"
));
// {T}, Remove an arrowhead counter from Serrated Arrows: Put a -1/-1 counter on target creature. // {T}, Remove an arrowhead counter from Serrated Arrows: Put a -1/-1 counter on target creature.
Ability ability = new SimpleActivatedAbility( Ability ability = new SimpleActivatedAbility(
new AddCountersTargetEffect(CounterType.M1M1.createInstance()), new AddCountersTargetEffect(CounterType.M1M1.createInstance()), new TapSourceCost()
new TapSourceCost()); );
ability.addCost(new RemoveCountersSourceCost(CounterType.ARROWHEAD.createInstance())); ability.addCost(new RemoveCountersSourceCost(CounterType.ARROWHEAD.createInstance()));
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);

View file

@ -2,18 +2,18 @@ package mage.cards.s;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.dynamicvalue.common.SavedDamageValue;
import mage.abilities.effects.common.WinGameSourceControllerEffect; import mage.abilities.effects.common.WinGameSourceControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.TargetController;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
@ -21,19 +21,23 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledCreaturePermanent;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/** /**
* @author jmharmon * @author jmharmon
*/ */
public final class SimicAscendancy extends CardImpl { public final class SimicAscendancy extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.GROWTH, 20);
public SimicAscendancy(UUID ownerId, CardSetInfo setInfo) { public SimicAscendancy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}{U}");
// {1}{G}{U}: Put a +1/+1 counter on target creature you control. // {1}{G}{U}: Put a +1/+1 counter on target creature you control.
Ability ability = new SimpleActivatedAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{1}{G}{U}")); Ability ability = new SimpleActivatedAbility(
new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{1}{G}{U}")
);
ability.addTarget(new TargetControlledCreaturePermanent()); ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
@ -41,14 +45,7 @@ public final class SimicAscendancy extends CardImpl {
this.addAbility(new SimicAscendancyTriggeredAbility()); this.addAbility(new SimicAscendancyTriggeredAbility());
// At the beginning of your upkeep, if Simic Ascendancy has twenty or more growth counters on it, you win the game. // At the beginning of your upkeep, if Simic Ascendancy has twenty or more growth counters on it, you win the game.
this.addAbility(new ConditionalInterveningIfTriggeredAbility( this.addAbility(new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect()).withInterveningIf(condition));
new BeginningOfUpkeepTriggeredAbility(
Zone.BATTLEFIELD, TargetController.YOU, new WinGameSourceControllerEffect(),
false
), new SourceHasCounterCondition(CounterType.GROWTH, 20, Integer.MAX_VALUE),
"At the beginning of your upkeep, if {this} has twenty " +
"or more growth counters on it, you win the game"
));
} }
private SimicAscendancy(final SimicAscendancy card) { private SimicAscendancy(final SimicAscendancy card) {
@ -64,7 +61,8 @@ public final class SimicAscendancy extends CardImpl {
class SimicAscendancyTriggeredAbility extends TriggeredAbilityImpl { class SimicAscendancyTriggeredAbility extends TriggeredAbilityImpl {
SimicAscendancyTriggeredAbility() { SimicAscendancyTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.GROWTH.createInstance()), false); super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.GROWTH.createInstance(), SavedDamageValue.MANY), false);
this.setTriggerPhrase("Whenever one or more +1/+1 counters are put on a creature you control, ");
} }
private SimicAscendancyTriggeredAbility(final SimicAscendancyTriggeredAbility ability) { private SimicAscendancyTriggeredAbility(final SimicAscendancyTriggeredAbility ability) {
@ -83,27 +81,21 @@ class SimicAscendancyTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
if (event.getData().equals(CounterType.P1P1.getName()) && event.getAmount() > 0) { if (!event.getData().equals(CounterType.P1P1.getName()) || event.getAmount() < 1) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId());
if (permanent == null) {
permanent = game.getPermanentEntering(event.getTargetId());
}
if (permanent != null
&& !event.getTargetId().equals(this.getSourceId())
&& permanent.isCreature(game)
&& permanent.isControlledBy(this.getControllerId())) {
this.getEffects().clear();
if (event.getAmount() > 0) {
this.addEffect(new AddCountersSourceEffect(CounterType.GROWTH.createInstance(event.getAmount())));
}
return true;
}
}
return false; return false;
} }
Permanent permanent = Optional
@Override .ofNullable(event)
public String getRule() { .map(GameEvent::getTargetId)
return "Whenever one or more +1/+1 counters are put on a creature you control, put that many growth counters on {this}."; .map(game::getPermanentOrLKIBattlefield)
.orElseGet(() -> game.getPermanentEntering(event.getTargetId()));
if (permanent == null
|| event.getTargetId().equals(this.getSourceId())
|| !permanent.isCreature(game)
|| !permanent.isControlledBy(this.getControllerId())) {
return false;
}
this.getEffects().setValue("damage", event.getAmount());
return true;
} }
} }

View file

@ -1,21 +1,23 @@
package mage.cards.s; package mage.cards.s;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.effects.common.SacrificeSourceEffect; import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.continuous.DontLoseByZeroOrLessLifeEffect; import mage.abilities.effects.common.continuous.DontLoseByZeroOrLessLifeEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.events.DamageEvent; import mage.game.events.DamageEvent;
@ -27,13 +29,14 @@ import mage.target.common.TargetOpponent;
import java.util.UUID; import java.util.UUID;
/** /**
*
* @author L_J * @author L_J
*/ */
public final class SoulEcho extends CardImpl { public final class SoulEcho extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.ECHO, ComparisonType.EQUAL_TO, 0);
public SoulEcho(UUID ownerId, CardSetInfo setInfo) { public SoulEcho(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{X}{W}{W}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{X}{W}{W}");
// Soul Echo enters the battlefield with X echo counters on it. // Soul Echo enters the battlefield with X echo counters on it.
this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.ECHO.createInstance()))); this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.ECHO.createInstance())));
@ -43,8 +46,12 @@ public final class SoulEcho extends CardImpl {
// At the beginning of your upkeep, sacrifice Soul Echo if there are no echo counters on it. // At the beginning of your upkeep, sacrifice Soul Echo if there are no echo counters on it.
// Otherwise, target opponent may choose that for each 1 damage that would be dealt to you until your next upkeep, you remove an echo counter from Soul Echo instead. // Otherwise, target opponent may choose that for each 1 damage that would be dealt to you until your next upkeep, you remove an echo counter from Soul Echo instead.
Effect effect = new ConditionalOneShotEffect(new SacrificeSourceEffect(), new SoulEchoOpponentsChoiceEffect(), new SourceHasCounterCondition(CounterType.ECHO, 0, 0), "sacrifice {this} if there are no echo counters on it. Otherwise, target opponent may choose that for each 1 damage that would be dealt to you until your next upkeep, you remove an echo counter from {this} instead"); Ability ability = new BeginningOfUpkeepTriggeredAbility(new ConditionalOneShotEffect(
Ability ability = new BeginningOfUpkeepTriggeredAbility(effect); new SacrificeSourceEffect(), new SoulEchoOpponentsChoiceEffect(),
condition, "sacrifice {this} if there are no echo counters on it. " +
"Otherwise, target opponent may choose that for each 1 damage that would be " +
"dealt to you until your next upkeep, you remove an echo counter from {this} instead"
));
ability.addTarget(new TargetOpponent()); ability.addTarget(new TargetOpponent());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -17,6 +17,7 @@ import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.PutCards; import mage.constants.PutCards;
import mage.constants.TargetController; import mage.constants.TargetController;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -29,7 +30,7 @@ import java.util.UUID;
*/ */
public final class SoulcipherBoard extends CardImpl { public final class SoulcipherBoard extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.OMEN, 0, 0); private static final Condition condition = new SourceHasCounterCondition(CounterType.OMEN, ComparisonType.EQUAL_TO, 0);
public SoulcipherBoard(UUID ownerId, CardSetInfo setInfo) { public SoulcipherBoard(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}");

View file

@ -2,6 +2,7 @@ package mage.cards.t;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
@ -11,6 +12,7 @@ import mage.abilities.mana.BlueManaAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.TimingRule; import mage.constants.TimingRule;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
@ -22,6 +24,8 @@ import java.util.UUID;
*/ */
public final class TempleOfCyclicalTime extends CardImpl { public final class TempleOfCyclicalTime extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.TIME, ComparisonType.EQUAL_TO, 0);
public TempleOfCyclicalTime(UUID ownerId, CardSetInfo setInfo) { public TempleOfCyclicalTime(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
this.nightCard = true; this.nightCard = true;
@ -35,11 +39,8 @@ public final class TempleOfCyclicalTime extends CardImpl {
// {2}{U}, {T}: Transform Temple of Cyclical Time. Activate only if it has no time counters on it and only as a sorcery. // {2}{U}, {T}: Transform Temple of Cyclical Time. Activate only if it has no time counters on it and only as a sorcery.
ability = new ActivateIfConditionActivatedAbility( ability = new ActivateIfConditionActivatedAbility(
Zone.BATTLEFIELD, Zone.BATTLEFIELD, new TransformSourceEffect(),
new TransformSourceEffect(), new ManaCostsImpl<>("{2}{U}"), condition, TimingRule.SORCERY
new ManaCostsImpl<>("{2}{U}"),
new SourceHasCounterCondition(CounterType.TIME, 0, 0),
TimingRule.SORCERY
); );
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
this.addAbility(ability); this.addAbility(ability);

View file

@ -1,15 +1,12 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
@ -18,11 +15,14 @@ import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterSpell; import mage.filter.FilterSpell;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import java.util.UUID;
/** /**
* @author fireshoes * @author fireshoes
*/ */
@ -36,6 +36,8 @@ public final class ThingInTheIce extends CardImpl {
CardType.SORCERY.getPredicate())); CardType.SORCERY.getPredicate()));
} }
private static final Condition condition = new SourceHasCounterCondition(CounterType.ICE, ComparisonType.EQUAL_TO, 0);
public ThingInTheIce(UUID ownerId, CardSetInfo setInfo) { public ThingInTheIce(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
this.subtype.add(SubType.HORROR); this.subtype.add(SubType.HORROR);
@ -48,20 +50,20 @@ public final class ThingInTheIce extends CardImpl {
this.addAbility(DefenderAbility.getInstance()); this.addAbility(DefenderAbility.getInstance());
// Thing in the Ice enters the battlefield with four ice counters on it. // Thing in the Ice enters the battlefield with four ice counters on it.
Effect effect = new AddCountersSourceEffect(CounterType.ICE.createInstance(4)); this.addAbility(new EntersBattlefieldAbility(
effect.setText("with four ice counters on it"); new AddCountersSourceEffect(CounterType.ICE.createInstance(4)).setText("with four ice counters on it")
this.addAbility(new EntersBattlefieldAbility(effect)); ));
// Whenever you cast an instant or sorcery spell, remove an ice counter from Thing in the Ice. Then if it has no ice counters on it, transform it. // Whenever you cast an instant or sorcery spell, remove an ice counter from Thing in the Ice. Then if it has no ice counters on it, transform it.
this.addAbility(new TransformAbility()); this.addAbility(new TransformAbility());
effect = new RemoveCounterSourceEffect(CounterType.ICE.createInstance(1)); Ability ability = new SpellCastControllerTriggeredAbility(
effect.setText("remove an ice counter from {this}"); new RemoveCounterSourceEffect(CounterType.ICE.createInstance(1)), filter, false
Ability ability = new SpellCastControllerTriggeredAbility(effect, filter, false); );
effect = new ConditionalOneShotEffect(new TransformSourceEffect(), new SourceHasCounterCondition(CounterType.ICE, 0, 0), ability.addEffect(new ConditionalOneShotEffect(
"Then if it has no ice counters on it, transform it"); new TransformSourceEffect(), condition,
ability.addEffect(effect); "Then if it has no ice counters on it, transform it"
));
this.addAbility(ability); this.addAbility(ability);
} }
private ThingInTheIce(final ThingInTheIce card) { private ThingInTheIce(final ThingInTheIce card) {

View file

@ -2,7 +2,6 @@ package mage.cards.t;
import mage.ObjectColor; import mage.ObjectColor;
import mage.abilities.StateTriggeredAbility; import mage.abilities.StateTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.CastOnlyIfConditionIsTrueAbility; import mage.abilities.common.CastOnlyIfConditionIsTrueAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
@ -14,9 +13,13 @@ import mage.abilities.dynamicvalue.common.CountersSourceCount;
import mage.abilities.effects.common.RemoveAllCountersSourceEffect; import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.effects.common.continuous.BoostAllEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
@ -42,8 +45,8 @@ public final class TidalInfluence extends CardImpl {
private static final Condition conditionCast = new PermanentsOnTheBattlefieldCondition( private static final Condition conditionCast = new PermanentsOnTheBattlefieldCondition(
filterName, ComparisonType.EQUAL_TO, 0, false); filterName, ComparisonType.EQUAL_TO, 0, false);
private static final Condition condition1 = new SourceHasCounterCondition(CounterType.TIDE, 1, 1); private static final Condition condition1 = new SourceHasCounterCondition(CounterType.TIDE, ComparisonType.EQUAL_TO, 1);
private static final Condition condition3 = new SourceHasCounterCondition(CounterType.TIDE, 3, 3); private static final Condition condition3 = new SourceHasCounterCondition(CounterType.TIDE, ComparisonType.EQUAL_TO, 3);
public TidalInfluence(UUID ownerId, CardSetInfo setInfo) { public TidalInfluence(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}"); super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
@ -62,14 +65,14 @@ public final class TidalInfluence extends CardImpl {
// As long as there is exactly one tide counter on Tidal Influence, all blue creatures get -2/-0. // As long as there is exactly one tide counter on Tidal Influence, all blue creatures get -2/-0.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostAllEffect(-2, -0, Duration.WhileOnBattlefield, filterBlue, false), new BoostAllEffect(-2, -0, Duration.WhileOnBattlefield, filterBlue, false),
condition1, condition1, "As long as there is exactly one tide counter on {this}, all blue creatures get -2/-0."
"As long as there is exactly one tide counter on {this}, all blue creatures get -2/-0."))); )));
// As long as there are exactly three tide counters on Tidal Influence, all blue creatures get +2/+0. // As long as there are exactly three tide counters on Tidal Influence, all blue creatures get +2/+0.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostAllEffect(2, 0, Duration.WhileOnBattlefield, filterBlue, false), new BoostAllEffect(2, 0, Duration.WhileOnBattlefield, filterBlue, false),
condition3, condition3, "As long as there are exactly three tide counters on {this}, all blue creatures get +2/+0."
"As long as there are exactly three tide counter on {this}, all blue creatures get +2/+0."))); )));
// Whenever there are four tide counters on Tidal Influence, remove all tide counters from it. // Whenever there are four tide counters on Tidal Influence, remove all tide counters from it.
this.addAbility(new TidalInfluenceTriggeredAbility()); this.addAbility(new TidalInfluenceTriggeredAbility());
@ -88,8 +91,8 @@ public final class TidalInfluence extends CardImpl {
class TidalInfluenceTriggeredAbility extends StateTriggeredAbility { class TidalInfluenceTriggeredAbility extends StateTriggeredAbility {
public TidalInfluenceTriggeredAbility() { public TidalInfluenceTriggeredAbility() {
super(Zone.BATTLEFIELD, new RemoveAllCountersSourceEffect(CounterType.TIDE)); super(Zone.BATTLEFIELD, new RemoveAllCountersSourceEffect(CounterType.TIDE).setText("remove all tide counters from it"));
setTriggerPhrase("Whenever there are four tide counters on {this}, "); setTriggerPhrase("Whenever there are four or more tide counters on {this}, ");
} }
private TidalInfluenceTriggeredAbility(final TidalInfluenceTriggeredAbility ability) { private TidalInfluenceTriggeredAbility(final TidalInfluenceTriggeredAbility ability) {
@ -103,6 +106,6 @@ class TidalInfluenceTriggeredAbility extends StateTriggeredAbility {
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
return new CountersSourceCount(CounterType.TIDE).calculate(game, this, null) == 4; return new CountersSourceCount(CounterType.TIDE).calculate(game, this, null) >= 4;
} }
} }

View file

@ -1,50 +1,50 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.GreenManaAbility;
import mage.abilities.mana.RedManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Luna Skyrise * @author Luna Skyrise
*/ */
public final class TimberlineRidge extends CardImpl { public final class TimberlineRidge extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION);
public TimberlineRidge(UUID ownerId, CardSetInfo setInfo) { public TimberlineRidge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Timberline Ridge doesn't untap during your untap step if it has a depletion counter on it. // Timberline Ridge doesn't untap during your untap step if it has a depletion counter on it.
Effect effect = new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepSourceEffect(false, true), this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(
new SourceHasCounterCondition(CounterType.DEPLETION, 1, Integer.MAX_VALUE)); new DontUntapInControllersUntapStepSourceEffect(false, true), condition
effect.setText("{this} doesn't untap during your untap step if it has a depletion counter on it"); ).setText("{this} doesn't untap during your untap step if it has a depletion counter on it")));
Ability ability = new SimpleStaticAbility(effect);
this.addAbility(ability);
// At the beginning of your upkeep, remove a depletion counter from Timberline Ridge. // At the beginning of your upkeep, remove a depletion counter from Timberline Ridge.
Ability ability2 = new BeginningOfUpkeepTriggeredAbility(new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())); this.addAbility(new BeginningOfUpkeepTriggeredAbility(
this.addAbility(ability2); new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())
));
// {tap}: Add {R} or {G}. Put a depletion counter on Timberline Ridge. // {tap}: Add {R} or {G}. Put a depletion counter on Timberline Ridge.
Ability ability3 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(1), new TapSourceCost()); Ability ability = new RedManaAbility();
ability3.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability3); this.addAbility(ability);
Ability ability4 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(1), new TapSourceCost()); Ability ability2 = new GreenManaAbility();
ability4.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability2.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability4); this.addAbility(ability2);
} }
private TimberlineRidge(final TimberlineRidge card) { private TimberlineRidge(final TimberlineRidge card) {

View file

@ -1,10 +1,9 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.Mode; import mage.abilities.Mode;
import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
@ -16,39 +15,39 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/** /**
*
* @author fireshoes * @author fireshoes
*/ */
public final class TriassicEgg extends CardImpl { public final class TriassicEgg extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.HATCHLING, 2);
public TriassicEgg(UUID ownerId, CardSetInfo setInfo) { public TriassicEgg(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// {3}, {tap}: Put a hatchling counter on Triassic Egg. // {3}, {tap}: Put a hatchling counter on Triassic Egg.
Ability ability = new SimpleActivatedAbility( Ability ability = new SimpleActivatedAbility(
new AddCountersSourceEffect(CounterType.HATCHLING.createInstance(), true), new AddCountersSourceEffect(CounterType.HATCHLING.createInstance()), new GenericManaCost(3)
new GenericManaCost(3)); );
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
this.addAbility(ability); this.addAbility(ability);
// Sacrifice Triassic Egg: Choose one - You may put a creature card from your hand onto the battlefield; // Sacrifice Triassic Egg: Choose one - You may put a creature card from your hand onto the battlefield;
ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, ability = new ConditionalActivatedAbility(
new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A), new PutCardFromHandOntoBattlefieldEffect(StaticFilters.FILTER_CARD_CREATURE_A),
new SacrificeSourceCost(), new SacrificeSourceCost(), condition
new SourceHasCounterCondition(CounterType.HATCHLING, 2, Integer.MAX_VALUE)); ).hideCondition();
ability.getModes().setChooseText("Choose one. Activate only if there are two or more hatchling counters on {this}.");
// or return target creature card from your graveyard to the battlefield. Activate this ability only if two or more hatchling counters are on Triassic Egg. // or return target creature card from your graveyard to the battlefield. Activate this ability only if two or more hatchling counters are on Triassic Egg.
Mode mode = new Mode(new ReturnFromGraveyardToBattlefieldTargetEffect()); ability.addMode(new Mode(new ReturnFromGraveyardToBattlefieldTargetEffect())
Target target = new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD); .addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)));
mode.addTarget(target);
ability.addMode(mode);
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -1,50 +1,50 @@
package mage.cards.v; package mage.cards.v;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.mana.SimpleManaAbility; import mage.abilities.mana.GreenManaAbility;
import mage.abilities.mana.WhiteManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.UUID;
/** /**
*
* @author Luna Skyrise * @author Luna Skyrise
*/ */
public final class Veldt extends CardImpl { public final class Veldt extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION);
public Veldt(UUID ownerId, CardSetInfo setInfo) { public Veldt(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},""); super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Veldt doesn't untap during your untap step if it has a depletion counter on it. // Veldt doesn't untap during your untap step if it has a depletion counter on it.
Effect effect = new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepSourceEffect(false, true), this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(
new SourceHasCounterCondition(CounterType.DEPLETION, 1, Integer.MAX_VALUE)); new DontUntapInControllersUntapStepSourceEffect(false, true), condition
effect.setText("{this} doesn't untap during your untap step if it has a depletion counter on it"); ).setText("{this} doesn't untap during your untap step if it has a depletion counter on it")));
Ability ability = new SimpleStaticAbility(effect);
this.addAbility(ability);
// At the beginning of your upkeep, remove a depletion counter from Veldt. // At the beginning of your upkeep, remove a depletion counter from Veldt.
Ability ability2 = new BeginningOfUpkeepTriggeredAbility(new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())); this.addAbility(new BeginningOfUpkeepTriggeredAbility(
this.addAbility(ability2); new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())
));
// {tap}: Add {G} or {W}. Put a depletion counter on Veldt. // {tap}: Add {G} or {W}. Put a depletion counter on Veldt.
Ability ability3 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(1), new TapSourceCost()); Ability ability = new GreenManaAbility();
ability3.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability3); this.addAbility(ability);
Ability ability4 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.WhiteMana(1), new TapSourceCost()); Ability ability2 = new WhiteManaAbility();
ability4.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance())); ability2.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability4); this.addAbility(ability2);
} }
private Veldt(final Veldt card) { private Veldt(final Veldt card) {

View file

@ -1,23 +1,20 @@
package mage.cards.v; package mage.cards.v;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.GetXValue; import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
@ -30,22 +27,20 @@ import java.util.UUID;
*/ */
public final class VentifactBottle extends CardImpl { public final class VentifactBottle extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE);
public VentifactBottle(UUID ownerId, CardSetInfo setInfo) { public VentifactBottle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// {X}{1}, {tap}: Put X charge counters on Ventifact Bottle. Activate this ability only any time you could cast a sorcery. // {X}{1}, {tap}: Put X charge counters on Ventifact Bottle. Activate this ability only any time you could cast a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, Ability ability = new ActivateAsSorceryActivatedAbility(new AddCountersSourceEffect(
new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), GetXValue.instance, true), CounterType.CHARGE.createInstance(), GetXValue.instance, true
new ManaCostsImpl<>("{X}{1}")); ), new ManaCostsImpl<>("{X}{1}"));
ability.addCost(new TapSourceCost()); ability.addCost(new TapSourceCost());
this.addAbility(ability); this.addAbility(ability);
// At the beginning of your precombat main phase, if Ventifact Bottle has a charge counter on it, tap it and remove all charge counters from it. Add {C} for each charge counter removed this way. // At the beginning of your precombat main phase, if Ventifact Bottle has a charge counter on it, tap it and remove all charge counters from it. Add {C} for each charge counter removed this way.
TriggeredAbility ability2 = new BeginningOfFirstMainTriggeredAbility(new VentifactBottleEffect()); this.addAbility(new BeginningOfFirstMainTriggeredAbility(new VentifactBottleEffect()).withInterveningIf(condition));
this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability2,
new SourceHasCounterCondition(CounterType.CHARGE, 1, Integer.MAX_VALUE),
"At the beginning of your first main phase, "
+ "if {this} has a charge counter on it, tap it and remove all charge counters from it. "
+ "Add {C} for each charge counter removed this way."));
} }
private VentifactBottle(final VentifactBottle card) { private VentifactBottle(final VentifactBottle card) {
@ -62,6 +57,7 @@ class VentifactBottleEffect extends OneShotEffect {
VentifactBottleEffect() { VentifactBottleEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
staticText = "tap it and remove all charge counters from it. Add {C} for each charge counter removed this way";
} }
private VentifactBottleEffect(final VentifactBottleEffect effect) { private VentifactBottleEffect(final VentifactBottleEffect effect) {
@ -75,16 +71,16 @@ class VentifactBottleEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
Player player = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(source.getControllerId());
if (sourcePermanent != null && player != null) { Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game);
int amountRemoved = sourcePermanent.removeAllCounters(CounterType.CHARGE.getName(), source, game); if (player == null || sourcePermanent == null) {
sourcePermanent.tap(source, game);
Mana mana = new Mana();
mana.setColorless(amountRemoved);
player.getManaPool().addMana(mana, game, source);
return true;
}
return false; return false;
} }
sourcePermanent.tap(source, game);
int amountRemoved = sourcePermanent.removeAllCounters(CounterType.CHARGE.getName(), source, game);
if (amountRemoved > 0) {
player.getManaPool().addMana(Mana.ColorlessMana(amountRemoved), game, source);
}
return true;
}
} }

View file

@ -23,7 +23,11 @@ public class EntersBattlefieldAllTriggeredAbility extends TriggeredAbilityImpl {
* zone = BATTLEFIELD optional = false * zone = BATTLEFIELD optional = false
*/ */
public EntersBattlefieldAllTriggeredAbility(Effect effect, FilterPermanent filter) { public EntersBattlefieldAllTriggeredAbility(Effect effect, FilterPermanent filter) {
this(Zone.BATTLEFIELD, effect, filter, false); this(effect, filter, false);
}
public EntersBattlefieldAllTriggeredAbility(Effect effect, FilterPermanent filter, boolean optional) {
this(Zone.BATTLEFIELD, effect, filter, optional);
} }
public EntersBattlefieldAllTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, boolean optional) { public EntersBattlefieldAllTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, boolean optional) {

View file

@ -1,86 +1,87 @@
package mage.abilities.condition.common; package mage.abilities.condition.common;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.condition.Condition; import mage.abilities.condition.IntCompareCondition;
import mage.cards.Card; import mage.constants.ComparisonType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.util.CardUtil; import mage.util.CardUtil;
import java.util.Optional;
/** /**
* @author nantuko * Don't use ComparisonType.OR_GREATER with value 0
*
* @author TheElk801
*/ */
public class SourceHasCounterCondition implements Condition { public class SourceHasCounterCondition extends IntCompareCondition {
private final CounterType counterType; private final CounterType counterType;
private int amount = 1;
private int from = -1;
private int to;
public SourceHasCounterCondition(CounterType type) { public SourceHasCounterCondition(CounterType counterType) {
this.counterType = type; this(counterType, 1);
} }
public SourceHasCounterCondition(CounterType type, int amount) { public SourceHasCounterCondition(CounterType counterType, int amount) {
this.counterType = type; this(counterType, ComparisonType.OR_GREATER, amount);
this.amount = amount;
} }
public SourceHasCounterCondition(CounterType type, int from, int to) { public SourceHasCounterCondition(CounterType counterType, ComparisonType type, int value) {
this.counterType = type; super(type, value);
this.from = from; this.counterType = counterType;
this.to = to;
} }
@Override @Override
@SuppressWarnings("null") protected int getInputValue(Game game, Ability source) {
public boolean apply(Game game, Ability source) {
Card card = null;
Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (permanent == null) { if (permanent != null) {
card = game.getCard(source.getSourceId()); return permanent.getCounters(game).getCount(counterType);
if (card == null) {
return false;
}
}
if (from != -1) { //range compare
int count;
if (card != null) {
count = card.getCounters(game).getCount(counterType);
} else {
count = permanent.getCounters(game).getCount(counterType);
}
if (to == Integer.MAX_VALUE) {
return count >= from;
}
return count >= from && count <= to;
} else // single compare (lte)
{
if (card != null) {
return card.getCounters(game).getCount(counterType) >= amount;
} else {
return permanent.getCounters(game).getCount(counterType) >= amount;
}
} }
return Optional.ofNullable(source)
.map(Ability::getSourceId)
.map(game::getCard)
.map(card -> card.getCounters(game).getCount(counterType))
.orElse(0);
} }
@Override @Override
public String toString() { public String toString() {
if (from != -1) { switch (type) {
if (from == 0) { case EQUAL_TO:
if (to == 0) { StringBuilder sb = new StringBuilder("there ");
return "{this} has no " + this.counterType.toString() + " counters on it"; switch (value) {
case 0:
sb.append("are no ");
break;
case 1:
sb.append("is exactly one ");
break;
default:
sb.append("are exactly ");
sb.append(CardUtil.numberToText(value));
sb.append(' ');
} }
return "{this} has " + CardUtil.numberToText(to) + " or fewer " + this.counterType.toString() + " counters on it"; sb.append(counterType.getName());
sb.append(" counter");
if (value != 1) {
sb.append('s');
} }
if (to == Integer.MAX_VALUE) { sb.append(" on {this}");
return "{this} has " + CardUtil.numberToText(from) + " or more " + this.counterType.toString() + " counters on it"; return sb.toString();
case OR_GREATER:
if (value == 0) {
throw new IllegalArgumentException("0 or greater should not be used");
} }
return "{this} has between " + from + " and " + to + " " + this.counterType.toString() + " counters on it"; return "there are " + CardUtil.numberToText(value) + " or more " + counterType.getName() + " counters on {this}";
} else { case OR_LESS:
return "{this} has " + CardUtil.numberToText(amount) + " or more " + this.counterType.toString() + " counters on it"; return "{this} has " + CardUtil.numberToText(value) + " or fewer " + counterType.getName() + " counters on it";
case FEWER_THAN:
return "{this} has fewer than " + CardUtil.numberToText(value) + ' ' + counterType.getName() + " counters on it";
case MORE_THAN:
return "{this} has more than " + CardUtil.numberToText(value) + ' ' + counterType.getName() + " counters on it";
default:
throw new UnsupportedOperationException("There should be a comparison type");
} }
} }
} }

View file

@ -1,7 +1,6 @@
package mage.abilities.keyword; package mage.abilities.keyword;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
@ -13,6 +12,7 @@ import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.common.AddContinuousEffectToGame; import mage.abilities.effects.common.AddContinuousEffectToGame;
import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.constants.*; import mage.constants.*;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
@ -37,7 +37,7 @@ public class ImpendingAbility extends AlternativeSourceCostsImpl {
private static final String IMPENDING_REMINDER = "If you cast this spell for its impending cost, " + private static final String IMPENDING_REMINDER = "If you cast this spell for its impending cost, " +
"it enters with %s time counters and isn't a creature until the last is removed. " + "it enters with %s time counters and isn't a creature until the last is removed. " +
"At the beginning of your end step, remove a time counter from it."; "At the beginning of your end step, remove a time counter from it.";
private static final Condition counterCondition = new SourceHasCounterCondition(CounterType.TIME, 0, 0); private static final Condition counterCondition = new SourceHasCounterCondition(CounterType.TIME, ComparisonType.EQUAL_TO, 0);
public ImpendingAbility(int amount, String manaString) { public ImpendingAbility(int amount, String manaString) {
super(IMPENDING_KEYWORD + ' ' + amount, String.format(IMPENDING_REMINDER, CardUtil.numberToText(amount)), new ManaCostsImpl<>(manaString), IMPENDING_KEYWORD); super(IMPENDING_KEYWORD + ' ' + amount, String.format(IMPENDING_REMINDER, CardUtil.numberToText(amount)), new ManaCostsImpl<>(manaString), IMPENDING_KEYWORD);

View file

@ -4,14 +4,15 @@ import mage.abilities.Abilities;
import mage.abilities.AbilitiesImpl; import mage.abilities.AbilitiesImpl;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.CompoundCondition;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.constants.ComparisonType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import java.util.ArrayList; import java.util.ArrayList;
@ -46,7 +47,11 @@ public class LevelerCardBuilder {
public List<Ability> build() { public List<Ability> build() {
List<Ability> constructed = new ArrayList<>(); List<Ability> constructed = new ArrayList<>();
Condition condition = new SourceHasCounterCondition(CounterType.LEVEL, level1, level2); Condition condition = new CompoundCondition(
"",
new SourceHasCounterCondition(CounterType.LEVEL, ComparisonType.OR_GREATER, level1),
new SourceHasCounterCondition(CounterType.LEVEL, ComparisonType.OR_LESS, level2)
);
for (Ability ability : abilities) { for (Ability ability : abilities) {
ContinuousEffect effect = new GainAbilitySourceEffect(ability); ContinuousEffect effect = new GainAbilitySourceEffect(ability);
ConditionalContinuousEffect abEffect = new ConditionalContinuousEffect(effect, condition, ""); ConditionalContinuousEffect abEffect = new ConditionalContinuousEffect(effect, condition, "");

View file

@ -11,7 +11,7 @@ import mage.constants.SubType;
public final class PilotCrewToken extends TokenImpl { public final class PilotCrewToken extends TokenImpl {
public PilotCrewToken() { public PilotCrewToken() {
super("Pilot Token", "1/1 colorless Pilot creature token with \"This creature crews Vehicles as though its power were 2 greater.\""); super("Pilot Token", "1/1 colorless Pilot creature token with \"This token crews Vehicles as though its power were 2 greater.\"");
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
subtype.add(SubType.PILOT); subtype.add(SubType.PILOT);
power = new MageInt(1); power = new MageInt(1);