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.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
@ -21,7 +22,7 @@ import java.util.UUID;
*/
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) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{U}");

View file

@ -2,7 +2,6 @@ package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
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.RemoveCounterSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.counters.CounterType;
@ -33,7 +34,7 @@ import java.util.UUID;
*/
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) {
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 {
private static final Condition condition
= new SourceHasCounterCondition(CounterType.SLUMBER, 1, Integer.MAX_VALUE);
private static final Condition condition = new SourceHasCounterCondition(CounterType.SLUMBER);
public ArixmethesSlumberingIsle(UUID ownerId, CardSetInfo setInfo) {
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.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.target.common.TargetCardInLibrary;
@ -24,8 +25,8 @@ import java.util.UUID;
*/
public final class AyarasOathsworn extends CardImpl {
private static final Condition condition1 = new SourceHasCounterCondition(CounterType.P1P1, 0, 3);
private static final Condition condition2 = new SourceHasCounterCondition(CounterType.P1P1, 4, 4);
private static final Condition condition1 = new SourceHasCounterCondition(CounterType.P1P1, ComparisonType.FEWER_THAN, 4);
private static final Condition condition2 = new SourceHasCounterCondition(CounterType.P1P1, ComparisonType.EQUAL_TO, 4);
public AyarasOathsworn(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");

View file

@ -1,28 +1,33 @@
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.condition.Condition;
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.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
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.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class AzorsElocutors extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.FILIBUSTER, 5);
public AzorsElocutors(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W/U}{W/U}");
this.subtype.add(SubType.HUMAN);
@ -32,7 +37,13 @@ public final class AzorsElocutors extends CardImpl {
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.
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.
this.addAbility(new AzorsElocutorsTriggeredAbility());
@ -71,39 +82,6 @@ class AzorsElocutorsTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return event.getTargetId().equals(this.controllerId);
}
}
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);
return isControlledBy(event.getTargetId());
}
}

View file

@ -1,16 +1,14 @@
package mage.cards.b;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.OpponentLostLifeCondition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -18,14 +16,17 @@ import mage.constants.ComparisonType;
import mage.constants.SetTargetPointer;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class BloodchiefAscension extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 3);
public BloodchiefAscension(UUID ownerId, CardSetInfo setInfo) {
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.
Ability ability = new ConditionalInterveningIfTriggeredAbility(
new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new LoseLifeTargetEffect(2), true, new FilterCard("a card"), TargetController.OPPONENT, SetTargetPointer.PLAYER),
new SourceHasCounterCondition(CounterType.QUEST, 3, Integer.MAX_VALUE),
"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));
Ability ability = new PutCardIntoGraveFromAnywhereAllTriggeredAbility(
new LoseLifeTargetEffect(2), true, StaticFilters.FILTER_CARD_A,
TargetController.OPPONENT, SetTargetPointer.PLAYER
).withInterveningIf(condition);
ability.addEffect(new GainLifeEffect(2).concatBy("If you do,"));
this.addAbility(ability);
}
private BloodchiefAscension(final BloodchiefAscension card) {

View file

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

View file

@ -3,35 +3,35 @@ package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class BudokaPupil extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
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.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));
// 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(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new IchigaWhoTopplesOaks()), true),
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."));
this.addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.NEXT, new FlipSourceEffect(new IchigaWhoTopplesOaks()).setText("flip it"), true, condition
));
}
private BudokaPupil(final BudokaPupil card) {
@ -80,6 +79,7 @@ class IchigaWhoTopplesOaks extends TokenImpl {
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
private IchigaWhoTopplesOaks(final IchigaWhoTopplesOaks token) {
super(token);
}

View file

@ -1,37 +1,37 @@
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.CounterUnlessPaysEffect;
import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl;
import mage.target.TargetSpell;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class CallowJushi extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public CallowJushi(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}");
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));
// 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(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new JarakuTheInterloper()), true),
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."));
this.addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.NEXT, new FlipSourceEffect(new JarakuTheInterloper()).setText("flip it"), true, condition
));
}
private CallowJushi(final CallowJushi card) {
@ -80,6 +79,7 @@ class JarakuTheInterloper extends TokenImpl {
ability.addTarget(new TargetSpell());
this.addAbility(ability);
}
private JarakuTheInterloper(final JarakuTheInterloper token) {
super(token);
}

View file

@ -37,7 +37,7 @@ public final class CharitableLevy extends CardImpl {
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);

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.
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);
// Enchanted creature doesnt untap during your untap step if Cocoon has a pupa counter on it.
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.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CocoonEffect()));

View file

@ -1,37 +1,33 @@
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public final class CunningBandit extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public CunningBandit(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
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));
// 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(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new AzamukiTreacheryIncarnate()), true),
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."));
this.addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.NEXT, new FlipSourceEffect(new AzamukiTreacheryIncarnate()).setText("flip it"), true, condition
));
}
private CunningBandit(final CunningBandit card) {
@ -80,6 +75,7 @@ class AzamukiTreacheryIncarnate extends TokenImpl {
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
private AzamukiTreacheryIncarnate(final AzamukiTreacheryIncarnate token) {
super(token);
}

View file

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

View file

@ -5,19 +5,19 @@ import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.combat.CantAttackTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.turn.Step;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -27,7 +27,7 @@ import java.util.UUID;
*/
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) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
@ -40,12 +40,10 @@ public final class EdificeOfAuthority extends CardImpl {
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.
Condition condition = new SourceHasCounterCondition(CounterType.BRICK, 3, Integer.MAX_VALUE);
Ability ability2 = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new EdificeOfAuthorityEffect(), new ManaCostsImpl<>("{1}"), condition, rule);
Ability ability2 = new ConditionalActivatedAbility(new EdificeOfAuthorityEffect(), new GenericManaCost(1), condition);
ability2.addCost(new TapSourceCost());
ability2.addTarget(new TargetCreaturePermanent());
this.addAbility(ability2);
}
private EdificeOfAuthority(final EdificeOfAuthority card) {
@ -58,45 +56,17 @@ public final class EdificeOfAuthority extends CardImpl {
}
}
class EdificeOfAuthorityEffect extends OneShotEffect {
class EdificeOfAuthorityEffect extends RestrictionEffect {
EdificeOfAuthorityEffect() {
super(Outcome.LoseAbility);
}
public EdificeOfAuthorityEffect(String ruleText) {
super(Outcome.LoseAbility);
staticText = ruleText;
super(Duration.UntilYourNextTurn);
staticText = "until your next turn, target creature can't attack or block and its activated abilities can't be activated";
}
private EdificeOfAuthorityEffect(final EdificeOfAuthorityEffect 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
public void init(Ability source, Game 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
public boolean applies(Permanent permanent, Ability source, Game game) {
return this.getTargetPointer().getTargets(game, source).contains(permanent.getId());
@ -147,8 +99,8 @@ class EdificeOfAuthorityRestrictionEffect extends RestrictionEffect {
}
@Override
public EdificeOfAuthorityRestrictionEffect copy() {
return new EdificeOfAuthorityRestrictionEffect(this);
public EdificeOfAuthorityEffect copy() {
return new EdificeOfAuthorityEffect(this);
}
}

View file

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

View file

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

View file

@ -1,36 +1,34 @@
package mage.cards.f;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.PreventDamageToTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class FaithfulSquire extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public FaithfulSquire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
this.subtype.add(SubType.HUMAN);
@ -42,14 +40,15 @@ public final class FaithfulSquire extends CardImpl {
this.flipCardName = "Kaiso, Memory of Loyalty";
// 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
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new KaisoMemoryOfLoyaltyToken()), true),
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."));
this.addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.NEXT, new FlipSourceEffect(new KaisoMemoryOfLoyaltyToken()).setText("flip it"), true, condition
));
}
private FaithfulSquire(final FaithfulSquire card) {

View file

@ -1,9 +1,9 @@
package mage.cards.g;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalOneShotEffect;
@ -13,16 +13,20 @@ import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
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) {
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.
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.
Ability ability = new AnyColorManaAbility();
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);
}

View file

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

View file

@ -1,11 +1,9 @@
package mage.cards.h;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +15,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author Plopman
*/
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) {
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.
Ability etbAbility = new EntersBattlefieldAbility(
@ -35,10 +37,14 @@ public final class HickoryWoodlot extends CardImpl {
);
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
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.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(2), new TapSourceCost());
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);
}

View file

@ -1,37 +1,34 @@
package mage.cards.h;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.FlipSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.FearAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.events.GameEvent;
import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class HiredMuscle extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.KI, 2);
public HiredMuscle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
@ -44,13 +41,15 @@ public final class HiredMuscle extends CardImpl {
this.flipCardName = "Scarmaker";
// 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.
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new FlipSourceEffect(new Scarmaker()), true),
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."));
this.addAbility(new BeginningOfEndStepTriggeredAbility(
TargetController.NEXT, new FlipSourceEffect(new Scarmaker()).setText("flip it"), true, condition
));
}
private HiredMuscle(final HiredMuscle card) {
@ -81,6 +80,7 @@ class Scarmaker extends TokenImpl {
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
private Scarmaker(final Scarmaker token) {
super(token);
}

View file

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

View file

@ -14,8 +14,8 @@ import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.AsThoughEffect;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
@ -38,13 +38,16 @@ import java.util.UUID;
*/
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) {
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.
ConditionalActivatedAbility ability = new ConditionalActivatedAbility(
Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), new ManaCostsImpl<>("{X}"), new SourceHasCounterCondition(CounterType.CHARGE, 0, 0));
ability.addEffect(new IceCauldronExileEffect());
Ability ability = new ConditionalActivatedAbility(
Zone.BATTLEFIELD, new IceCauldronExileEffect(), new ManaCostsImpl<>("{X}"), condition
);
ability.addEffect(new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true));
ability.addEffect(new IceCauldronNoteManaEffect());
ability.addCost(new TapSourceCost());
this.addAbility(ability);

View file

@ -1,15 +1,16 @@
package mage.cards.i;
import mage.MageInt;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.condition.CompoundCondition;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.HaventCastSpellFromHandThisTurnCondition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.counters.CounterType;
@ -24,7 +25,7 @@ public final class InventiveWingsmith extends CardImpl {
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",
HaventCastSpellFromHandThisTurnCondition.instance,
new SourceHasCounterCondition(CounterType.FLYING, 0, 0)
new SourceHasCounterCondition(CounterType.FLYING, ComparisonType.EQUAL_TO, 0)
);
public InventiveWingsmith(UUID ownerId, CardSetInfo setInfo) {

View file

@ -2,18 +2,20 @@ package mage.cards.j;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
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.effects.OneShotEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.mana.ManaEffect;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.counters.CounterType;
@ -29,14 +31,16 @@ import java.util.UUID;
*/
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) {
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.
ConditionalActivatedAbility ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new JeweledAmuletAddCounterEffect(), new ManaCostsImpl<>("{1}"), new SourceHasCounterCondition(CounterType.CHARGE, 0, 0), rule);
ability.addEffect(new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true));
ConditionalActivatedAbility ability = new ConditionalActivatedAbility(
new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), new GenericManaCost(1), condition
);
ability.addEffect(new JeweledAmuletAddCounterEffect());
ability.addCost(new TapSourceCost());
this.addAbility(ability);
@ -44,7 +48,6 @@ public final class JeweledAmulet extends CardImpl {
Ability ability2 = new SimpleManaAbility(Zone.BATTLEFIELD, new JeweledAmuletAddManaEffect(), new TapSourceCost());
ability2.addCost(new RemoveCountersSourceCost(CounterType.CHARGE.createInstance()));
this.addAbility(ability2);
}
private JeweledAmulet(final JeweledAmulet card) {
@ -63,7 +66,7 @@ class JeweledAmuletAddCounterEffect extends OneShotEffect {
public JeweledAmuletAddCounterEffect() {
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) {

View file

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

View file

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

View file

@ -1,43 +1,39 @@
package mage.cards.l;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
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.effects.common.GainLifeEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
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) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
// {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.addEffect(new AddCountersSourceEffect(CounterType.BRICK.createInstance()));
this.addAbility(ability);
// {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(Zone.BATTLEFIELD, new GainLifeEffect(2), new TapSourceCost(), condition, rule));
this.addAbility(new ConditionalActivatedAbility(new GainLifeEffect(2), new TapSourceCost(), condition));
}
private LuxaRiverShrine(final LuxaRiverShrine card) {

View file

@ -1,32 +1,29 @@
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.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.effects.common.ReturnToHandSourceEffect;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.mana.LimitedTimesPerTurnActivatedManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author LevelX2
*/
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) {
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())));
// 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(),
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.
TriggeredAbility triggeredAbility = new BeginningOfUpkeepTriggeredAbility(new ReturnToHandSourceEffect(true));
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."));
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new ReturnToHandSourceEffect(true).setText("return it to its owner's hand")
).withInterveningIf(condition));
}
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.
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.
SimpleActivatedAbility ability = new MerseineActivatedAbility();
@ -95,7 +95,7 @@ class MerseineActivatedAbility extends SimpleActivatedAbility {
@Override
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.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.counters.CounterType;
import mage.game.Game;
import mage.players.Player;
@ -25,25 +28,21 @@ import java.util.UUID;
*/
public final class OraclesVault extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.BRICK, 3);
public OraclesVault(UUID ownerId, CardSetInfo setInfo) {
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)
.withTextOptions("that card", false), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
// Put a brick counter on Oracle's Vault.
Effect effect2 = new AddCountersSourceEffect(CounterType.BRICK.createInstance());
ability.addEffect(effect2);
ability.addEffect(new AddCountersSourceEffect(CounterType.BRICK.createInstance()));
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.
// Activate this ability only if there are three or more brick counters on Oracle's Vault.
this.addAbility(new ConditionalActivatedAbility(Zone.BATTLEFIELD,
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}."));
this.addAbility(new ConditionalActivatedAbility(new OraclesVaultFreeEffect(), new TapSourceCost(), condition));
}
private OraclesVault(final OraclesVault card) {
@ -60,6 +59,7 @@ class OraclesVaultFreeEffect extends OneShotEffect {
OraclesVaultFreeEffect() {
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) {

View file

@ -1,11 +1,10 @@
package mage.cards.p;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +16,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author Plopman
*/
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) {
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.
Ability etbAbility = new EntersBattlefieldAbility(
@ -35,11 +38,15 @@ public final class PeatBog extends CardImpl {
);
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
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.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(2), new TapSourceCost());
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"));
this.addAbility(ability);
ability.addEffect(new ConditionalOneShotEffect(
new SacrificeSourceEffect(), condition,
"If there are no depletion counters on {this}, sacrifice it"
));
this.addAbility(ability);
}
private PeatBog(final PeatBog card) {

View file

@ -111,7 +111,7 @@ class PeltCollectorTriggeredAbility extends TriggeredAbilityImpl {
@Override
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, "
+ "put a +1/+1 counter on {this}.";
}

View file

@ -1,7 +1,6 @@
package mage.cards.p;
import mage.MageInt;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
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.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
@ -24,8 +24,7 @@ import java.util.UUID;
*/
public final class PrimordialHydra extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.P1P1, 10, Integer.MAX_VALUE);
private static final String staticText = "{this} has trample as long as it has ten or more +1/+1 counters on it";
private static final Condition condition = new SourceHasCounterCondition(CounterType.P1P1, 10);
public PrimordialHydra(UUID ownerId, CardSetInfo setInfo) {
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())));
// At the beginning of your upkeep, double the number of +1/+1 counters on Primordial Hydra.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new DoubleCountersSourceEffect(CounterType.P1P1)
));
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DoubleCountersSourceEffect(CounterType.P1P1)));
// Primordial Hydra has trample as long as it has ten or more +1/+1 counters on it.
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;
import java.util.UUID;
import mage.abilities.common.BecomesTappedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
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.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
public final class QuestForRenewal extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 4);
public QuestForRenewal(UUID ownerId, CardSetInfo setInfo) {
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.
this.addAbility(new BecomesTappedTriggeredAbility(new AddCountersSourceEffect(CounterType.QUEST.createInstance()),
true, StaticFilters.FILTER_CONTROLLED_A_CREATURE));
this.addAbility(new BecomesTappedTriggeredAbility(
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.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new UntapAllDuringEachOtherPlayersUntapStepEffect(StaticFilters.FILTER_CONTROLLED_CREATURES),
new SourceHasCounterCondition(CounterType.QUEST, 4, Integer.MAX_VALUE),
"As long as there are four or more quest counters on {this}, untap all creatures you control during each other player's untap step.")));
condition, "As long as there are four or more quest counters on {this}, " +
"untap all creatures you control during each other player's untap step."
)));
}
private QuestForRenewal(final QuestForRenewal card) {

View file

@ -1,39 +1,44 @@
package mage.cards.q;
import java.util.UUID;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
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.cards.CardImpl;
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.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
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");
private static final FilterPermanent goblinFilter = new FilterControlledPermanent(SubType.GOBLIN, "a Goblin you control");
private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 5);
public QuestForTheGoblinLord(UUID ownerId, CardSetInfo setInfo) {
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.
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.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostAllEffect(2, 0, Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, false),
new SourceHasCounterCondition(CounterType.QUEST, 5, Integer.MAX_VALUE), rule)));
new BoostControlledEffect(2, 0, Duration.WhileOnBattlefield), condition,
"as long as {this} has five or more quest counters on it, creatures you control get +2/+0"
)));
}
private QuestForTheGoblinLord(final QuestForTheGoblinLord card) {

View file

@ -28,7 +28,7 @@ import java.util.UUID;
public final class QuestForUlasTemple extends CardImpl {
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 {
filter.add(Predicates.or(

View file

@ -17,6 +17,7 @@ import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.game.permanent.token.PilotCrewToken;
@ -29,7 +30,7 @@ import java.util.UUID;
*/
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) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
@ -50,7 +51,7 @@ public final class ReckonerBankbuster extends CardImpl {
ability.addEffect(new ConditionalOneShotEffect(
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 " +
"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 RemoveCountersSourceCost(CounterType.CHARGE.createInstance()));

View file

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

View file

@ -1,11 +1,9 @@
package mage.cards.r;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +15,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author Plopman
*/
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) {
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.
Ability etbAbility = new EntersBattlefieldAbility(
@ -35,11 +37,15 @@ public final class RemoteFarm extends CardImpl {
);
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
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.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.WhiteMana(2), new TapSourceCost());
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"));
this.addAbility(ability);
ability.addEffect(new ConditionalOneShotEffect(
new SacrificeSourceEffect(), condition,
"If there are no depletion counters on {this}, sacrifice it"
));
this.addAbility(ability);
}
private RemoteFarm(final RemoteFarm card) {

View file

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

View file

@ -1,12 +1,10 @@
package mage.cards.r;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
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.RemoveCounterSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.ComparisonType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.constants.SubType;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author LoneFox
*/
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) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{R}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.BIRD);
this.power = new MageInt(0);
this.toughness = new MageInt(1);
// 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.
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.
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(3, 2, Duration.WhileOnBattlefield),
new SourceHasCounterCondition(CounterType.SHELL, 0, 0),
"As long as {this} has no shell counters on it, it gets +3/+2"));
ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(FlyingAbility.getInstance()),
new SourceHasCounterCondition(CounterType.SHELL, 0, 0), "and has flying"));
new BoostSourceEffect(3, 2, Duration.WhileOnBattlefield),
condition, "as long as {this} has no shell counters on it, it gets +3/+2"
));
ability.addEffect(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(FlyingAbility.getInstance()),
condition, "and has flying"
));
this.addAbility(ability);
}

View file

@ -1,26 +1,27 @@
package mage.cards.r;
import java.util.UUID;
import mage.MageInt;
import mage.Mana;
import mage.ObjectColor;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.mana.SimpleManaAbility;
import mage.constants.SubType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.FilterSpell;
import mage.filter.predicate.mageobject.ColorPredicate;
import java.util.UUID;
/**
*
* @author TheElk801
*/
public final class RunawaySteamKin extends CardImpl {
@ -31,6 +32,8 @@ public final class RunawaySteamKin extends CardImpl {
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) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
@ -39,16 +42,9 @@ public final class RunawaySteamKin extends CardImpl {
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.
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
new SpellCastControllerTriggeredAbility(
new AddCountersSourceEffect(
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}."
));
this.addAbility(new SpellCastControllerTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), filter, false
).withInterveningIf(condition));
// Remove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}.
this.addAbility(new SimpleManaAbility(

View file

@ -1,11 +1,9 @@
package mage.cards.s;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +15,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author Plopman
*/
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) {
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.
Ability etbAbility = new EntersBattlefieldAbility(
@ -35,10 +37,14 @@ public final class SandstoneNeedle extends CardImpl {
);
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
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.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(2), new TapSourceCost());
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);
}

View file

@ -1,11 +1,10 @@
package mage.cards.s;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost;
@ -17,17 +16,21 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author Plopman
*/
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) {
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.
Ability etbAbility = new EntersBattlefieldAbility(
@ -35,10 +38,14 @@ public final class SaprazzanSkerry extends CardImpl {
);
etbAbility.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance(2)));
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.
Ability ability = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlueMana(2), new TapSourceCost());
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);
}

View file

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

View file

@ -2,18 +2,18 @@ package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
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.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
@ -21,19 +21,23 @@ import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.Optional;
import java.util.UUID;
/**
* @author jmharmon
*/
public final class SimicAscendancy extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.GROWTH, 20);
public SimicAscendancy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}{U}");
// {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());
this.addAbility(ability);
@ -41,14 +45,7 @@ public final class SimicAscendancy extends CardImpl {
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.
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
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"
));
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new WinGameSourceControllerEffect()).withInterveningIf(condition));
}
private SimicAscendancy(final SimicAscendancy card) {
@ -64,7 +61,8 @@ public final class SimicAscendancy extends CardImpl {
class SimicAscendancyTriggeredAbility extends TriggeredAbilityImpl {
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) {
@ -83,27 +81,21 @@ class SimicAscendancyTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getData().equals(CounterType.P1P1.getName()) && event.getAmount() > 0) {
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;
}
if (!event.getData().equals(CounterType.P1P1.getName()) || event.getAmount() < 1) {
return false;
}
return false;
}
@Override
public String getRule() {
return "Whenever one or more +1/+1 counters are put on a creature you control, put that many growth counters on {this}.";
Permanent permanent = Optional
.ofNullable(event)
.map(GameEvent::getTargetId)
.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;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.abilities.effects.common.continuous.DontLoseByZeroOrLessLifeEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
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.game.Game;
import mage.game.events.DamageEvent;
@ -27,13 +29,14 @@ import mage.target.common.TargetOpponent;
import java.util.UUID;
/**
*
* @author L_J
*/
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) {
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.
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.
// 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(effect);
Ability ability = new BeginningOfUpkeepTriggeredAbility(new ConditionalOneShotEffect(
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());
this.addAbility(ability);
}
@ -64,7 +71,7 @@ class SoulEchoOpponentsChoiceEffect extends OneShotEffect {
SoulEchoOpponentsChoiceEffect() {
super(Outcome.PreventDamage);
staticText = "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";
"until your next upkeep, you remove an echo counter from {this} instead";
}
private SoulEchoOpponentsChoiceEffect(final SoulEchoOpponentsChoiceEffect effect) {

View file

@ -17,6 +17,7 @@ import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.PutCards;
import mage.constants.TargetController;
import mage.counters.CounterType;
@ -29,7 +30,7 @@ import java.util.UUID;
*/
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) {
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.common.ActivateIfConditionActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
@ -11,6 +12,7 @@ import mage.abilities.mana.BlueManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.TimingRule;
import mage.constants.Zone;
import mage.counters.CounterType;
@ -22,6 +24,8 @@ import java.util.UUID;
*/
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) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
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.
ability = new ActivateIfConditionActivatedAbility(
Zone.BATTLEFIELD,
new TransformSourceEffect(),
new ManaCostsImpl<>("{2}{U}"),
new SourceHasCounterCondition(CounterType.TIME, 0, 0),
TimingRule.SORCERY
Zone.BATTLEFIELD, new TransformSourceEffect(),
new ManaCostsImpl<>("{2}{U}"), condition, TimingRule.SORCERY
);
ability.addCost(new TapSourceCost());
this.addAbility(ability);

View file

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

View file

@ -2,7 +2,6 @@ package mage.cards.t;
import mage.ObjectColor;
import mage.abilities.StateTriggeredAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.CastOnlyIfConditionIsTrueAbility;
import mage.abilities.common.EntersBattlefieldAbility;
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.continuous.BoostAllEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
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.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
@ -42,8 +45,8 @@ public final class TidalInfluence extends CardImpl {
private static final Condition conditionCast = new PermanentsOnTheBattlefieldCondition(
filterName, ComparisonType.EQUAL_TO, 0, false);
private static final Condition condition1 = new SourceHasCounterCondition(CounterType.TIDE, 1, 1);
private static final Condition condition3 = new SourceHasCounterCondition(CounterType.TIDE, 3, 3);
private static final Condition condition1 = new SourceHasCounterCondition(CounterType.TIDE, ComparisonType.EQUAL_TO, 1);
private static final Condition condition3 = new SourceHasCounterCondition(CounterType.TIDE, ComparisonType.EQUAL_TO, 3);
public TidalInfluence(UUID ownerId, CardSetInfo setInfo) {
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.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostAllEffect(-2, -0, Duration.WhileOnBattlefield, filterBlue, false),
condition1,
"As long as there is exactly one tide counter on {this}, all blue creatures get -2/-0.")));
condition1, "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.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostAllEffect(2, 0, Duration.WhileOnBattlefield, filterBlue, false),
condition3,
"As long as there are exactly three tide counter on {this}, all blue creatures get +2/+0.")));
condition3, "As long as there are exactly three tide counters on {this}, all blue creatures get +2/+0."
)));
// Whenever there are four tide counters on Tidal Influence, remove all tide counters from it.
this.addAbility(new TidalInfluenceTriggeredAbility());
@ -88,8 +91,8 @@ public final class TidalInfluence extends CardImpl {
class TidalInfluenceTriggeredAbility extends StateTriggeredAbility {
public TidalInfluenceTriggeredAbility() {
super(Zone.BATTLEFIELD, new RemoveAllCountersSourceEffect(CounterType.TIDE));
setTriggerPhrase("Whenever there are four tide counters on {this}, ");
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}, ");
}
private TidalInfluenceTriggeredAbility(final TidalInfluenceTriggeredAbility ability) {
@ -103,6 +106,6 @@ class TidalInfluenceTriggeredAbility extends StateTriggeredAbility {
@Override
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;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
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.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.UUID;
/**
*
* @author Luna Skyrise
*/
public final class TimberlineRidge extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.DEPLETION);
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.
Effect effect = new ConditionalContinuousRuleModifyingEffect(new DontUntapInControllersUntapStepSourceEffect(false, true),
new SourceHasCounterCondition(CounterType.DEPLETION, 1, Integer.MAX_VALUE));
effect.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);
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect(
new DontUntapInControllersUntapStepSourceEffect(false, true), condition
).setText("{this} doesn't untap during your untap step if it has a depletion counter on it")));
// At the beginning of your upkeep, remove a depletion counter from Timberline Ridge.
Ability ability2 = new BeginningOfUpkeepTriggeredAbility(new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability2);
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
new RemoveCounterSourceEffect(CounterType.DEPLETION.createInstance())
));
// {tap}: Add {R} or {G}. Put a depletion counter on Timberline Ridge.
Ability ability3 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.RedMana(1), new TapSourceCost());
ability3.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability3);
Ability ability4 = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(1), new TapSourceCost());
ability4.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability4);
Ability ability = new RedManaAbility();
ability.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability);
Ability ability2 = new GreenManaAbility();
ability2.addEffect(new AddCountersSourceEffect(CounterType.DEPLETION.createInstance()));
this.addAbility(ability2);
}
private TimberlineRidge(final TimberlineRidge card) {

View file

@ -1,10 +1,9 @@
package mage.cards.t;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
@ -16,39 +15,39 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.target.Target;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/**
*
* @author fireshoes
*/
public final class TriassicEgg extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.HATCHLING, 2);
public TriassicEgg(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
// {3}, {tap}: Put a hatchling counter on Triassic Egg.
Ability ability = new SimpleActivatedAbility(
new AddCountersSourceEffect(CounterType.HATCHLING.createInstance(), true),
new GenericManaCost(3));
new AddCountersSourceEffect(CounterType.HATCHLING.createInstance()), new GenericManaCost(3)
);
ability.addCost(new TapSourceCost());
this.addAbility(ability);
// 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 SacrificeSourceCost(),
new SourceHasCounterCondition(CounterType.HATCHLING, 2, Integer.MAX_VALUE));
new SacrificeSourceCost(), condition
).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.
Mode mode = new Mode(new ReturnFromGraveyardToBattlefieldTargetEffect());
Target target = new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD);
mode.addTarget(target);
ability.addMode(mode);
ability.addMode(new Mode(new ReturnFromGraveyardToBattlefieldTargetEffect())
.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)));
this.addAbility(ability);
}

View file

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

View file

@ -1,23 +1,20 @@
package mage.cards.v;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
@ -30,22 +27,20 @@ import java.util.UUID;
*/
public final class VentifactBottle extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.CHARGE);
public VentifactBottle(UUID ownerId, CardSetInfo setInfo) {
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.
Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD,
new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), GetXValue.instance, true),
new ManaCostsImpl<>("{X}{1}"));
Ability ability = new ActivateAsSorceryActivatedAbility(new AddCountersSourceEffect(
CounterType.CHARGE.createInstance(), GetXValue.instance, true
), new ManaCostsImpl<>("{X}{1}"));
ability.addCost(new TapSourceCost());
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.
TriggeredAbility ability2 = new BeginningOfFirstMainTriggeredAbility(new VentifactBottleEffect());
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."));
this.addAbility(new BeginningOfFirstMainTriggeredAbility(new VentifactBottleEffect()).withInterveningIf(condition));
}
private VentifactBottle(final VentifactBottle card) {
@ -62,6 +57,7 @@ class VentifactBottleEffect extends OneShotEffect {
VentifactBottleEffect() {
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) {
@ -75,16 +71,16 @@ class VentifactBottleEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
Player player = game.getPlayer(source.getControllerId());
if (sourcePermanent != null && player != null) {
int amountRemoved = sourcePermanent.removeAllCounters(CounterType.CHARGE.getName(), source, game);
sourcePermanent.tap(source, game);
Mana mana = new Mana();
mana.setColorless(amountRemoved);
player.getManaPool().addMana(mana, game, source);
return true;
Permanent sourcePermanent = source.getSourcePermanentIfItStillExists(game);
if (player == null || sourcePermanent == null) {
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
*/
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) {

View file

@ -1,86 +1,87 @@
package mage.abilities.condition.common;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.cards.Card;
import mage.abilities.condition.IntCompareCondition;
import mage.constants.ComparisonType;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
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 int amount = 1;
private int from = -1;
private int to;
public SourceHasCounterCondition(CounterType type) {
this.counterType = type;
public SourceHasCounterCondition(CounterType counterType) {
this(counterType, 1);
}
public SourceHasCounterCondition(CounterType type, int amount) {
this.counterType = type;
this.amount = amount;
public SourceHasCounterCondition(CounterType counterType, int amount) {
this(counterType, ComparisonType.OR_GREATER, amount);
}
public SourceHasCounterCondition(CounterType type, int from, int to) {
this.counterType = type;
this.from = from;
this.to = to;
public SourceHasCounterCondition(CounterType counterType, ComparisonType type, int value) {
super(type, value);
this.counterType = counterType;
}
@Override
@SuppressWarnings("null")
public boolean apply(Game game, Ability source) {
Card card = null;
protected int getInputValue(Game game, Ability source) {
Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (permanent == null) {
card = game.getCard(source.getSourceId());
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;
}
if (permanent != null) {
return permanent.getCounters(game).getCount(counterType);
}
return Optional.ofNullable(source)
.map(Ability::getSourceId)
.map(game::getCard)
.map(card -> card.getCounters(game).getCount(counterType))
.orElse(0);
}
@Override
public String toString() {
if (from != -1) {
if (from == 0) {
if (to == 0) {
return "{this} has no " + this.counterType.toString() + " counters on it";
switch (type) {
case EQUAL_TO:
StringBuilder sb = new StringBuilder("there ");
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";
}
if (to == Integer.MAX_VALUE) {
return "{this} has " + CardUtil.numberToText(from) + " or more " + this.counterType.toString() + " counters on it";
}
return "{this} has between " + from + " and " + to + " " + this.counterType.toString() + " counters on it";
} else {
return "{this} has " + CardUtil.numberToText(amount) + " or more " + this.counterType.toString() + " counters on it";
sb.append(counterType.getName());
sb.append(" counter");
if (value != 1) {
sb.append('s');
}
sb.append(" on {this}");
return sb.toString();
case OR_GREATER:
if (value == 0) {
throw new IllegalArgumentException("0 or greater should not be used");
}
return "there are " + CardUtil.numberToText(value) + " or more " + counterType.getName() + " counters on {this}";
case OR_LESS:
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;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
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.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.constants.*;
import mage.counters.CounterType;
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, " +
"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.";
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) {
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.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.CompoundCondition;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.constants.ComparisonType;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.counters.CounterType;
import java.util.ArrayList;
@ -46,7 +47,11 @@ public class LevelerCardBuilder {
public List<Ability> build() {
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) {
ContinuousEffect effect = new GainAbilitySourceEffect(ability);
ConditionalContinuousEffect abEffect = new ConditionalContinuousEffect(effect, condition, "");

View file

@ -11,7 +11,7 @@ import mage.constants.SubType;
public final class PilotCrewToken extends TokenImpl {
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);
subtype.add(SubType.PILOT);
power = new MageInt(1);