-
Notifications
You must be signed in to change notification settings - Fork 787
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #11431 from Susucre/lci-mana-tracking
[LCI] Implement Thousand Moons Smithy // Barracks of the Thousand and Brass's Tunnel-Grinder // Tecutlan, the Searing Rift
- Loading branch information
Showing
10 changed files
with
639 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
package mage.cards.b; | ||
|
||
import mage.abilities.common.CastSpellPaidBySourceTriggeredAbility; | ||
import mage.abilities.effects.common.CreateTokenEffect; | ||
import mage.abilities.mana.WhiteManaAbility; | ||
import mage.cards.CardImpl; | ||
import mage.cards.CardSetInfo; | ||
import mage.constants.CardType; | ||
import mage.constants.SuperType; | ||
import mage.filter.FilterSpell; | ||
import mage.filter.predicate.Predicates; | ||
import mage.game.permanent.token.GnomeSoldierStarStarToken; | ||
|
||
import java.util.UUID; | ||
|
||
/** | ||
* @author Susucr | ||
*/ | ||
public final class BarracksOfTheThousand extends CardImpl { | ||
|
||
private static final FilterSpell filter = new FilterSpell("an artifact or creature spell"); | ||
|
||
static { | ||
filter.add(Predicates.or( | ||
CardType.ARTIFACT.getPredicate(), | ||
CardType.CREATURE.getPredicate() | ||
)); | ||
} | ||
|
||
public BarracksOfTheThousand(UUID ownerId, CardSetInfo setInfo) { | ||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.LAND}, ""); | ||
|
||
this.supertype.add(SuperType.LEGENDARY); | ||
|
||
// (Transforms from Thousand Moons Smithy.) | ||
this.nightCard = true; | ||
|
||
// {T}: Add {W}. | ||
this.addAbility(new WhiteManaAbility()); | ||
|
||
// Whenever you cast an artifact or creature spell using mana produced by Barracks of the Thousand, create a white Gnome Soldier artifact creature token with "This creature's power and toughness are each equal to the number of artifacts and/or creatures you control." | ||
this.addAbility(new CastSpellPaidBySourceTriggeredAbility( | ||
new CreateTokenEffect(new GnomeSoldierStarStarToken()), | ||
filter, false | ||
)); | ||
} | ||
|
||
private BarracksOfTheThousand(final BarracksOfTheThousand card) { | ||
super(card); | ||
} | ||
|
||
@Override | ||
public BarracksOfTheThousand copy() { | ||
return new BarracksOfTheThousand(this); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
package mage.cards.b; | ||
|
||
import mage.abilities.Ability; | ||
import mage.abilities.common.BeginningOfEndStepTriggeredAbility; | ||
import mage.abilities.common.EntersBattlefieldTriggeredAbility; | ||
import mage.abilities.condition.common.DescendedThisTurnCondition; | ||
import mage.abilities.condition.common.SourceHasCounterCondition; | ||
import mage.abilities.decorator.ConditionalOneShotEffect; | ||
import mage.abilities.dynamicvalue.common.DescendedThisTurnCount; | ||
import mage.abilities.effects.OneShotEffect; | ||
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.cards.CardImpl; | ||
import mage.cards.CardSetInfo; | ||
import mage.constants.CardType; | ||
import mage.constants.Outcome; | ||
import mage.constants.SuperType; | ||
import mage.constants.TargetController; | ||
import mage.counters.CounterType; | ||
import mage.game.Game; | ||
import mage.players.Player; | ||
import mage.watchers.common.DescendedWatcher; | ||
|
||
import java.util.UUID; | ||
|
||
/** | ||
* @author Susucr | ||
*/ | ||
public final class BrasssTunnelGrinder extends CardImpl { | ||
|
||
public BrasssTunnelGrinder(UUID ownerId, CardSetInfo setInfo) { | ||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{R}"); | ||
this.secondSideCardClazz = mage.cards.t.TecutlanTheSearingRift.class; | ||
|
||
this.supertype.add(SuperType.LEGENDARY); | ||
|
||
// When Brass's Tunnel-Grinder enters the battlefield, discard any number of cards, then draw that many cards plus one. | ||
this.addAbility(new EntersBattlefieldTriggeredAbility(new BrasssTunnelGrinderEffect())); | ||
|
||
// At the beginning of your end step, if you descended this turn, put a bore counter on Brass's Tunnel-Grinder. Then if there are three or more bore counters on it, remove those counters and transform it. | ||
this.addAbility(new TransformAbility()); | ||
Ability ability = new BeginningOfEndStepTriggeredAbility( | ||
new AddCountersSourceEffect(CounterType.BORE.createInstance()), | ||
TargetController.YOU, DescendedThisTurnCondition.instance, false | ||
); | ||
|
||
ConditionalOneShotEffect secondCheck = new ConditionalOneShotEffect( | ||
new RemoveAllCountersSourceEffect(CounterType.BORE), | ||
new SourceHasCounterCondition(CounterType.BORE, 3, Integer.MAX_VALUE), | ||
"Then if there are three or more bore counters on it, remove those counters and transform it" | ||
); | ||
secondCheck.addEffect(new TransformSourceEffect()); | ||
ability.addEffect(secondCheck); | ||
ability.addHint(DescendedThisTurnCount.getHint()); | ||
this.addAbility(ability, new DescendedWatcher()); | ||
} | ||
|
||
private BrasssTunnelGrinder(final BrasssTunnelGrinder card) { | ||
super(card); | ||
} | ||
|
||
@Override | ||
public BrasssTunnelGrinder copy() { | ||
return new BrasssTunnelGrinder(this); | ||
} | ||
} | ||
|
||
class BrasssTunnelGrinderEffect extends OneShotEffect { | ||
|
||
BrasssTunnelGrinderEffect() { | ||
super(Outcome.DrawCard); | ||
staticText = "discard any number of cards, then draw that many cards plus one"; | ||
} | ||
|
||
private BrasssTunnelGrinderEffect(final BrasssTunnelGrinderEffect effect) { | ||
super(effect); | ||
} | ||
|
||
@Override | ||
public BrasssTunnelGrinderEffect copy() { | ||
return new BrasssTunnelGrinderEffect(this); | ||
} | ||
|
||
@Override | ||
public boolean apply(Game game, Ability source) { | ||
Player player = game.getPlayer(source.getControllerId()); | ||
if (player == null) { | ||
return false; | ||
} | ||
|
||
int dicarded = player.discard(0, Integer.MAX_VALUE, false, source, game).size(); | ||
player.drawCards(1 + dicarded, source, game); | ||
return true; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
package mage.cards.t; | ||
|
||
import mage.abilities.Ability; | ||
import mage.abilities.common.CastSpellPaidBySourceTriggeredAbility; | ||
import mage.abilities.effects.OneShotEffect; | ||
import mage.abilities.effects.keyword.DiscoverEffect; | ||
import mage.abilities.mana.RedManaAbility; | ||
import mage.cards.CardImpl; | ||
import mage.cards.CardSetInfo; | ||
import mage.constants.CardType; | ||
import mage.constants.Outcome; | ||
import mage.constants.SubType; | ||
import mage.constants.SuperType; | ||
import mage.filter.FilterSpell; | ||
import mage.filter.predicate.mageobject.PermanentPredicate; | ||
import mage.game.Game; | ||
import mage.game.stack.Spell; | ||
import mage.players.Player; | ||
|
||
import java.util.UUID; | ||
|
||
/** | ||
* @author Susucr | ||
*/ | ||
public final class TecutlanTheSearingRift extends CardImpl { | ||
|
||
private static final FilterSpell filter = new FilterSpell("a permanent spell"); | ||
|
||
static { | ||
filter.add(PermanentPredicate.instance); | ||
} | ||
|
||
public TecutlanTheSearingRift(UUID ownerId, CardSetInfo setInfo) { | ||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); | ||
|
||
this.supertype.add(SuperType.LEGENDARY); | ||
this.subtype.add(SubType.CAVE); | ||
|
||
// (Transforms from Brass's Tunnel-Grinder.) | ||
this.nightCard = true; | ||
|
||
// {T}: Add {R}. | ||
this.addAbility(new RedManaAbility()); | ||
|
||
// Whenever you cast a permanent spell using mana produced by Tecutlan, the Searing Rift, discover X, where X is that spell's mana value. | ||
this.addAbility(new CastSpellPaidBySourceTriggeredAbility( | ||
new TecutlanTheSearingRiftEffect(), | ||
filter, true | ||
)); | ||
} | ||
|
||
private TecutlanTheSearingRift(final TecutlanTheSearingRift card) { | ||
super(card); | ||
} | ||
|
||
@Override | ||
public TecutlanTheSearingRift copy() { | ||
return new TecutlanTheSearingRift(this); | ||
} | ||
} | ||
|
||
class TecutlanTheSearingRiftEffect extends OneShotEffect { | ||
|
||
TecutlanTheSearingRiftEffect() { | ||
super(Outcome.Benefit); | ||
staticText = "discover X, where X is that spell's mana value"; | ||
} | ||
|
||
private TecutlanTheSearingRiftEffect(final TecutlanTheSearingRiftEffect effect) { | ||
super(effect); | ||
} | ||
|
||
@Override | ||
public TecutlanTheSearingRiftEffect copy() { | ||
return new TecutlanTheSearingRiftEffect(this); | ||
} | ||
|
||
@Override | ||
public boolean apply(Game game, Ability source) { | ||
Player controller = game.getPlayer(source.getControllerId()); | ||
if (controller == null) { | ||
return false; | ||
} | ||
|
||
Spell spell = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source)); | ||
int mv = spell == null ? 0 : Math.max(0, spell.getManaValue()); | ||
|
||
DiscoverEffect.doDiscover(controller, mv, game, source); | ||
return true; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package mage.cards.t; | ||
|
||
import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; | ||
import mage.abilities.common.EntersBattlefieldTriggeredAbility; | ||
import mage.abilities.costs.common.TapTargetCost; | ||
import mage.abilities.effects.common.CreateTokenEffect; | ||
import mage.abilities.effects.common.DoIfCostPaid; | ||
import mage.abilities.effects.common.TransformSourceEffect; | ||
import mage.abilities.keyword.TransformAbility; | ||
import mage.cards.CardImpl; | ||
import mage.cards.CardSetInfo; | ||
import mage.constants.CardType; | ||
import mage.constants.SuperType; | ||
import mage.constants.TargetController; | ||
import mage.filter.common.FilterControlledPermanent; | ||
import mage.filter.predicate.Predicates; | ||
import mage.filter.predicate.permanent.TappedPredicate; | ||
import mage.game.permanent.token.GnomeSoldierStarStarToken; | ||
import mage.target.common.TargetControlledPermanent; | ||
|
||
import java.util.UUID; | ||
|
||
/** | ||
* @author Susucr | ||
*/ | ||
public final class ThousandMoonsSmithy extends CardImpl { | ||
|
||
public static final FilterControlledPermanent filter = | ||
new FilterControlledPermanent("untapped artifacts and/or creatures you control"); | ||
|
||
static { | ||
filter.add(TappedPredicate.UNTAPPED); | ||
filter.add(Predicates.or( | ||
CardType.CREATURE.getPredicate(), | ||
CardType.ARTIFACT.getPredicate() | ||
)); | ||
} | ||
|
||
public ThousandMoonsSmithy(UUID ownerId, CardSetInfo setInfo) { | ||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{W}{W}"); | ||
this.secondSideCardClazz = mage.cards.b.BarracksOfTheThousand.class; | ||
|
||
this.supertype.add(SuperType.LEGENDARY); | ||
|
||
// When Thousand Moons Smithy enters the battlefield, create a white Gnome Soldier artifact creature token with "This creature's power and toughness are each equal to the number of artifacts and/or creatures you control." | ||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GnomeSoldierStarStarToken()))); | ||
|
||
// At the beginning of your precombat main phase, you may tap five untapped artifacts and/or creatures you control. If you do, transform Thousand Moons Smithy. | ||
this.addAbility(new TransformAbility()); | ||
this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( | ||
new DoIfCostPaid( | ||
new TransformSourceEffect(), | ||
new TapTargetCost(new TargetControlledPermanent(5, filter)) | ||
), | ||
TargetController.YOU, | ||
false | ||
)); | ||
} | ||
|
||
private ThousandMoonsSmithy(final ThousandMoonsSmithy card) { | ||
super(card); | ||
} | ||
|
||
@Override | ||
public ThousandMoonsSmithy copy() { | ||
return new ThousandMoonsSmithy(this); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.