-
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.
[LCI] Implement Brass's Tunnel Grinder // Tecutlan the Searing Rift
- Loading branch information
Showing
4 changed files
with
192 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,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
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