[DFT] rework max speed ability

This commit is contained in:
theelk801 2025-01-31 11:49:25 -05:00
parent 4944c434c1
commit 293ddd7016
13 changed files with 111 additions and 96 deletions

View file

@ -2,13 +2,12 @@ package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.common.DrawCardControllerTriggeredAbility;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.MillCardsEachPlayerEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -34,9 +33,9 @@ public final class AetherSyphon extends CardImpl {
this.addAbility(ability);
// Max speed -- Whenever you draw a card, each opponent mills two cards.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(new DrawCardControllerTriggeredAbility(
this.addAbility(new MaxSpeedAbility(new DrawCardControllerTriggeredAbility(
new MillCardsEachPlayerEffect(2, TargetController.OPPONENT), false
))));
)));
}
private AetherSyphon(final AetherSyphon card) {

View file

@ -1,11 +1,10 @@
package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.mana.ColorlessManaAbility;
@ -31,9 +30,11 @@ public final class AmonkhetRaceway extends CardImpl {
this.addAbility(new ColorlessManaAbility());
// Max speed -- {T}: Target creature gains haste until end of turn.
Ability ability = new SimpleActivatedAbility(new GainAbilityTargetEffect(HasteAbility.getInstance()), new TapSourceCost());
Ability ability = new SimpleActivatedAbility(
new GainAbilityTargetEffect(HasteAbility.getInstance()), new TapSourceCost()
);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(ability)));
this.addAbility(new MaxSpeedAbility(ability));
}
private AmonkhetRaceway(final AmonkhetRaceway card) {

View file

@ -1,13 +1,12 @@
package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
@ -31,10 +30,12 @@ public final class AvishkarRaceway extends CardImpl {
this.addAbility(new ColorlessManaAbility());
// Max speed -- {3}, {T}, Discard a card: Draw a card.
Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(3));
Ability ability = new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(1), new GenericManaCost(3)
);
ability.addCost(new TapSourceCost());
ability.addCost(new DiscardCardCost());
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(ability)));
this.addAbility(new MaxSpeedAbility(ability));
}
private AvishkarRaceway(final AvishkarRaceway card) {

View file

@ -1,12 +1,11 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.keyword.StartYourEnginesAbility;
@ -43,7 +42,7 @@ public final class BurnoutBashtronaut extends CardImpl {
));
// Max speed -- This creature has double strike.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance()))));
this.addAbility(new MaxSpeedAbility(new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance())));
}
private BurnoutBashtronaut(final BurnoutBashtronaut card) {

View file

@ -4,11 +4,10 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -43,7 +42,7 @@ public final class EmbalmedAscendant extends CardImpl {
StaticFilters.FILTER_CONTROLLED_A_CREATURE
);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(ability)));
this.addAbility(new MaxSpeedAbility(ability));
}
private EmbalmedAscendant(final EmbalmedAscendant card) {

View file

@ -2,9 +2,8 @@ package mage.cards.e;
import mage.MageInt;
import mage.Mana;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
@ -32,8 +31,8 @@ public final class EndriderCatalyzer extends CardImpl {
this.addAbility(new StartYourEnginesAbility());
// Max speed -- {T}: Add {R}{R}.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(
new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(2), new TapSourceCost())
this.addAbility(new MaxSpeedAbility(new SimpleManaAbility(
Zone.BATTLEFIELD, Mana.GreenMana(2), new TapSourceCost()
)));
}

View file

@ -1,9 +1,8 @@
package mage.cards.m;
import mage.Mana;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.mana.ColorlessManaAbility;
import mage.abilities.mana.SimpleManaAbility;
@ -29,9 +28,9 @@ public final class MuragandaRaceway extends CardImpl {
this.addAbility(new ColorlessManaAbility());
// Max speed -- {T}: Add {C}{C}.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(
this.addAbility(new MaxSpeedAbility(
new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(2), new TapSourceCost())
)));
));
}
private MuragandaRaceway(final MuragandaRaceway card) {

View file

@ -2,10 +2,9 @@ package mage.cards.n;
import mage.MageInt;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -35,7 +34,7 @@ public final class NestingBot extends CardImpl {
this.addAbility(new DiesSourceTriggeredAbility(new CreateTokenEffect(new ServoToken())));
// Max speed -- This creature gets +1/+0.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield))));
this.addAbility(new MaxSpeedAbility(new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield)));
}
private NestingBot(final NestingBot card) {

View file

@ -1,9 +1,8 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
@ -32,9 +31,9 @@ public final class RisenNecroregent extends CardImpl {
this.addAbility(new StartYourEnginesAbility());
// Max speed -- At the beginning of your end step, create a 2/2 black Zombie creature token.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(
this.addAbility(new MaxSpeedAbility(
new BeginningOfEndStepTriggeredAbility(new CreateTokenEffect(new ZombieToken()))
)));
));
}
private RisenNecroregent(final RisenNecroregent card) {

View file

@ -1,12 +1,11 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl;
@ -34,7 +33,7 @@ public final class StartingColumn extends CardImpl {
new DrawDiscardControllerEffect(2, 1), new TapSourceCost()
);
ability.addCost(new SacrificeSourceCost());
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(ability)));
this.addAbility(new MaxSpeedAbility(ability));
}
private StartingColumn(final StartingColumn card) {

View file

@ -1,9 +1,8 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.MaxSpeedAbility;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.LifelinkAbility;
@ -38,8 +37,8 @@ public final class StreakingOilgorger extends CardImpl {
this.addAbility(new StartYourEnginesAbility());
// Max speed -- This creature has lifelink.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(
new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield)
this.addAbility(new MaxSpeedAbility(new GainAbilitySourceEffect(
LifelinkAbility.getInstance(), Duration.WhileOnBattlefield
)));
}

View file

@ -0,0 +1,78 @@
package mage.abilities.common;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.StaticAbility;
import mage.abilities.dynamicvalue.common.ControllerSpeedCount;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.Effect;
import mage.cards.Card;
import mage.constants.*;
import mage.game.Game;
import mage.game.permanent.Permanent;
/**
* @author TheElk801
*/
public class MaxSpeedAbility extends StaticAbility {
public MaxSpeedAbility(Effect effect) {
this(new SimpleStaticAbility(effect));
}
public MaxSpeedAbility(Ability ability) {
super(Zone.ALL, new MaxSpeedAbilityEffect(ability));
}
private MaxSpeedAbility(final MaxSpeedAbility ability) {
super(ability);
}
@Override
public MaxSpeedAbility copy() {
return new MaxSpeedAbility(this);
}
}
class MaxSpeedAbilityEffect extends ContinuousEffectImpl {
private final Ability ability;
MaxSpeedAbilityEffect(Ability ability) {
super(Duration.Custom, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
this.ability = ability;
}
private MaxSpeedAbilityEffect(final MaxSpeedAbilityEffect effect) {
super(effect);
this.ability = effect.ability;
}
@Override
public MaxSpeedAbilityEffect copy() {
return new MaxSpeedAbilityEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
if (ControllerSpeedCount.instance.calculate(game, source, null) < 4) {
return false;
}
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
permanent.addAbility(ability, source.getSourceId(), game);
return true;
}
Card card = game.getCard(source.getSourceId());
if (card == null) {
return false;
}
game.getState().addOtherAbility(card, ability);
return true;
}
@Override
public String getText(Mode mode) {
return "Max speed &mdash; " + ability.getRule();
}
}

View file

@ -1,56 +0,0 @@
package mage.abilities.effects.common.continuous;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.ControllerSpeedCount;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.Effect;
import mage.constants.Duration;
import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.SubLayer;
import mage.game.Game;
import mage.game.permanent.Permanent;
/**
* @author TheElk801
*/
public class MaxSpeedGainAbilityEffect extends ContinuousEffectImpl {
private final Ability ability;
public MaxSpeedGainAbilityEffect(Effect effect) {
this(new SimpleStaticAbility(effect));
}
public MaxSpeedGainAbilityEffect(Ability ability) {
super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
this.ability = ability;
}
private MaxSpeedGainAbilityEffect(final MaxSpeedGainAbilityEffect effect) {
super(effect);
this.ability = effect.ability;
}
@Override
public MaxSpeedGainAbilityEffect copy() {
return new MaxSpeedGainAbilityEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
if (permanent == null || ControllerSpeedCount.instance.calculate(game, source, null) < 4) {
return false;
}
permanent.addAbility(ability, source.getSourceId(), game);
return true;
}
@Override
public String getText(Mode mode) {
return "Max speed &mdash; " + ability.getRule();
}
}