From 293ddd7016e7592bdb06c8894bb6c4c9ff997062 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 31 Jan 2025 11:49:25 -0500 Subject: [PATCH] [DFT] rework max speed ability --- Mage.Sets/src/mage/cards/a/AetherSyphon.java | 7 +- .../src/mage/cards/a/AmonkhetRaceway.java | 9 ++- .../src/mage/cards/a/AvishkarRaceway.java | 9 ++- .../src/mage/cards/b/BurnoutBashtronaut.java | 5 +- .../src/mage/cards/e/EmbalmedAscendant.java | 5 +- .../src/mage/cards/e/EndriderCatalyzer.java | 7 +- .../src/mage/cards/m/MuragandaRaceway.java | 7 +- Mage.Sets/src/mage/cards/n/NestingBot.java | 5 +- .../src/mage/cards/r/RisenNecroregent.java | 7 +- .../src/mage/cards/s/StartingColumn.java | 5 +- .../src/mage/cards/s/StreakingOilgorger.java | 7 +- .../abilities/common/MaxSpeedAbility.java | 78 +++++++++++++++++++ .../continuous/MaxSpeedGainAbilityEffect.java | 56 ------------- 13 files changed, 111 insertions(+), 96 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/common/MaxSpeedAbility.java delete mode 100644 Mage/src/main/java/mage/abilities/effects/common/continuous/MaxSpeedGainAbilityEffect.java diff --git a/Mage.Sets/src/mage/cards/a/AetherSyphon.java b/Mage.Sets/src/mage/cards/a/AetherSyphon.java index 4d78ddd15bc..356094863d4 100644 --- a/Mage.Sets/src/mage/cards/a/AetherSyphon.java +++ b/Mage.Sets/src/mage/cards/a/AetherSyphon.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/a/AmonkhetRaceway.java b/Mage.Sets/src/mage/cards/a/AmonkhetRaceway.java index b76723038d3..b11ee0ad02f 100644 --- a/Mage.Sets/src/mage/cards/a/AmonkhetRaceway.java +++ b/Mage.Sets/src/mage/cards/a/AmonkhetRaceway.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/a/AvishkarRaceway.java b/Mage.Sets/src/mage/cards/a/AvishkarRaceway.java index 8c2fa8b47a8..e6b2103a930 100644 --- a/Mage.Sets/src/mage/cards/a/AvishkarRaceway.java +++ b/Mage.Sets/src/mage/cards/a/AvishkarRaceway.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/b/BurnoutBashtronaut.java b/Mage.Sets/src/mage/cards/b/BurnoutBashtronaut.java index 651db271673..3ca6df0dbec 100644 --- a/Mage.Sets/src/mage/cards/b/BurnoutBashtronaut.java +++ b/Mage.Sets/src/mage/cards/b/BurnoutBashtronaut.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/e/EmbalmedAscendant.java b/Mage.Sets/src/mage/cards/e/EmbalmedAscendant.java index 78e25217f23..8a7658d4334 100644 --- a/Mage.Sets/src/mage/cards/e/EmbalmedAscendant.java +++ b/Mage.Sets/src/mage/cards/e/EmbalmedAscendant.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/e/EndriderCatalyzer.java b/Mage.Sets/src/mage/cards/e/EndriderCatalyzer.java index 14f09dd782c..d183da2f11b 100644 --- a/Mage.Sets/src/mage/cards/e/EndriderCatalyzer.java +++ b/Mage.Sets/src/mage/cards/e/EndriderCatalyzer.java @@ -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() ))); } diff --git a/Mage.Sets/src/mage/cards/m/MuragandaRaceway.java b/Mage.Sets/src/mage/cards/m/MuragandaRaceway.java index fd67dabe4c8..ce5e9121945 100644 --- a/Mage.Sets/src/mage/cards/m/MuragandaRaceway.java +++ b/Mage.Sets/src/mage/cards/m/MuragandaRaceway.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/n/NestingBot.java b/Mage.Sets/src/mage/cards/n/NestingBot.java index d119807859c..413ea998968 100644 --- a/Mage.Sets/src/mage/cards/n/NestingBot.java +++ b/Mage.Sets/src/mage/cards/n/NestingBot.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/r/RisenNecroregent.java b/Mage.Sets/src/mage/cards/r/RisenNecroregent.java index 4571e36989a..be2cbe2b29b 100644 --- a/Mage.Sets/src/mage/cards/r/RisenNecroregent.java +++ b/Mage.Sets/src/mage/cards/r/RisenNecroregent.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/s/StartingColumn.java b/Mage.Sets/src/mage/cards/s/StartingColumn.java index 2532a341cdb..ed80104b641 100644 --- a/Mage.Sets/src/mage/cards/s/StartingColumn.java +++ b/Mage.Sets/src/mage/cards/s/StartingColumn.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/s/StreakingOilgorger.java b/Mage.Sets/src/mage/cards/s/StreakingOilgorger.java index 0f33239fe77..dded791be02 100644 --- a/Mage.Sets/src/mage/cards/s/StreakingOilgorger.java +++ b/Mage.Sets/src/mage/cards/s/StreakingOilgorger.java @@ -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 ))); } diff --git a/Mage/src/main/java/mage/abilities/common/MaxSpeedAbility.java b/Mage/src/main/java/mage/abilities/common/MaxSpeedAbility.java new file mode 100644 index 00000000000..4a66080a057 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/MaxSpeedAbility.java @@ -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 — " + ability.getRule(); + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/MaxSpeedGainAbilityEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/MaxSpeedGainAbilityEffect.java deleted file mode 100644 index a0136fad8c3..00000000000 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/MaxSpeedGainAbilityEffect.java +++ /dev/null @@ -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 — " + ability.getRule(); - } -}