From a7a51b411710350d01db79e01d0589eb32a52642 Mon Sep 17 00:00:00 2001 From: Alex Vasile <48962821+Alex-Vasile@users.noreply.github.com> Date: Mon, 4 Jul 2022 10:07:12 -0400 Subject: [PATCH] Refactor: Simplified Xorn and Jolene implementation --- .../mage/cards/j/JoleneThePlunderQueen.java | 93 ++----------------- Mage.Sets/src/mage/cards/x/Xorn.java | 59 +----------- .../ReplaceTreasureWithAdditionalEffect.java | 68 ++++++++++++++ 3 files changed, 79 insertions(+), 141 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/effects/common/ReplaceTreasureWithAdditionalEffect.java diff --git a/Mage.Sets/src/mage/cards/j/JoleneThePlunderQueen.java b/Mage.Sets/src/mage/cards/j/JoleneThePlunderQueen.java index fc80218f93c..9a93cabbc9d 100644 --- a/Mage.Sets/src/mage/cards/j/JoleneThePlunderQueen.java +++ b/Mage.Sets/src/mage/cards/j/JoleneThePlunderQueen.java @@ -6,8 +6,11 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.CreateTokenTargetEffect; +import mage.abilities.effects.common.ReplaceTreasureWithAdditionalEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -49,7 +52,7 @@ public final class JoleneThePlunderQueen extends CardImpl { this.addAbility(new JoleneThePlunderQueenTriggeredAbility()); // If you would create one or more Treasure tokens, instead create those tokens plus an additional Treasure token. - this.addAbility(new SimpleStaticAbility(new JoleneThePlunderQueenReplacementEffect())); + this.addAbility(new SimpleStaticAbility(new ReplaceTreasureWithAdditionalEffect())); // Sacrifice five Treasures: Put five +1/+1 counters on Jolene. this.addAbility(new SimpleActivatedAbility( @@ -72,7 +75,7 @@ public final class JoleneThePlunderQueen extends CardImpl { class JoleneThePlunderQueenTriggeredAbility extends TriggeredAbilityImpl { JoleneThePlunderQueenTriggeredAbility() { - super(Zone.BATTLEFIELD, new JoleneThePlunderQueenCreateTreasureEffect(), false); + super(Zone.BATTLEFIELD, new CreateTokenTargetEffect(new TreasureToken(), StaticValue.get(1)), false); } private JoleneThePlunderQueenTriggeredAbility(final JoleneThePlunderQueenTriggeredAbility ability) { @@ -96,9 +99,9 @@ class JoleneThePlunderQueenTriggeredAbility extends TriggeredAbilityImpl { Set joleneOpponents = game.getOpponents(joleneController); // At most one trigger per combat. - if(!combat.getAttackers() + if(combat.getAttackers() .stream() - .anyMatch(attackerId -> { + .noneMatch(attackerId -> { // The trigger attempts to find at least one (attacker,defender) // for which the defender is one of jolene's controller opponent UUID defenderId = combat.getDefenderId(attackerId); @@ -116,84 +119,4 @@ class JoleneThePlunderQueenTriggeredAbility extends TriggeredAbilityImpl { return "Whenever a player attacks one of your opponents, " + "that attacking player creates a Treasure token."; } -} - -class JoleneThePlunderQueenCreateTreasureEffect extends OneShotEffect { - - JoleneThePlunderQueenCreateTreasureEffect() { - super(Outcome.Benefit); - staticText = "that attacking player creates a Treasure token"; - } - - private JoleneThePlunderQueenCreateTreasureEffect(final JoleneThePlunderQueenCreateTreasureEffect effect) { - super(effect); - } - - @Override - public JoleneThePlunderQueenCreateTreasureEffect copy() { - return new JoleneThePlunderQueenCreateTreasureEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - for (UUID playerId : getTargetPointer().getTargets(game, source)){ - new TreasureToken().putOntoBattlefield(1, game, source, playerId); - } - return true; - } -} - -// Identical to "Xorn"'s Replacement Effect -class JoleneThePlunderQueenReplacementEffect extends ReplacementEffectImpl { - - public JoleneThePlunderQueenReplacementEffect() { - super(Duration.WhileOnBattlefield, Outcome.Benefit); - this.staticText = "If you would create one or more Treasure tokens, instead create those tokens plus an additional Treasure token"; - } - - private JoleneThePlunderQueenReplacementEffect(final JoleneThePlunderQueenReplacementEffect effect) { - super(effect); - } - - @Override - public JoleneThePlunderQueenReplacementEffect copy() { - return new JoleneThePlunderQueenReplacementEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.CREATE_TOKEN; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (event instanceof CreateTokenEvent && source.isControlledBy(event.getPlayerId())) { - for (Token token : ((CreateTokenEvent) event).getTokens().keySet()) { - if (token.hasSubtype(SubType.TREASURE, game)) { - return true; - } - } - } - return false; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - if (event instanceof CreateTokenEvent) { - CreateTokenEvent tokenEvent = (CreateTokenEvent) event; - TreasureToken treasureToken = null; - Map tokens = tokenEvent.getTokens(); - for (Token token : tokens.keySet()) { - if (token instanceof TreasureToken) { - treasureToken = (TreasureToken) token; - break; - } - } - if (treasureToken == null) { - treasureToken = new TreasureToken(); - } - tokens.put(treasureToken, tokens.getOrDefault(treasureToken, 0) + 1); - } - return false; - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/x/Xorn.java b/Mage.Sets/src/mage/cards/x/Xorn.java index 10e3f3e2506..720657bd68b 100644 --- a/Mage.Sets/src/mage/cards/x/Xorn.java +++ b/Mage.Sets/src/mage/cards/x/Xorn.java @@ -6,6 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.ReplaceTreasureWithAdditionalEffect; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; @@ -32,7 +33,7 @@ public final class Xorn extends CardImpl { this.toughness = new MageInt(2); // If you would create one or more Treasure tokens, instead create those tokens plus an additional Treasure token. - this.addAbility(new SimpleStaticAbility(new XornReplacementEffect())); + this.addAbility(new SimpleStaticAbility(new ReplaceTreasureWithAdditionalEffect())); } private Xorn(final Xorn card) { @@ -43,58 +44,4 @@ public final class Xorn extends CardImpl { public Xorn copy() { return new Xorn(this); } -} - -class XornReplacementEffect extends ReplacementEffectImpl { - - public XornReplacementEffect() { - super(Duration.WhileOnBattlefield, Outcome.Benefit); - this.staticText = "If you would create one or more Treasure tokens, instead create those tokens plus an additional Treasure token"; - } - - private XornReplacementEffect(final XornReplacementEffect effect) { - super(effect); - } - - @Override - public XornReplacementEffect copy() { - return new XornReplacementEffect(this); - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.CREATE_TOKEN; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (event instanceof CreateTokenEvent && source.isControlledBy(event.getPlayerId())) { - for (Token token : ((CreateTokenEvent) event).getTokens().keySet()) { - if (token.hasSubtype(SubType.TREASURE, game)) { - return true; - } - } - } - return false; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - if (event instanceof CreateTokenEvent) { - CreateTokenEvent tokenEvent = (CreateTokenEvent) event; - TreasureToken treasureToken = null; - Map tokens = tokenEvent.getTokens(); - for (Token token : tokens.keySet()) { - if (token instanceof TreasureToken) { - treasureToken = (TreasureToken) token; - break; - } - } - if (treasureToken == null) { - treasureToken = new TreasureToken(); - } - tokens.put(treasureToken, tokens.getOrDefault(treasureToken, 0) + 1); - } - return false; - } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReplaceTreasureWithAdditionalEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReplaceTreasureWithAdditionalEffect.java new file mode 100644 index 00000000000..70bb1a468f7 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ReplaceTreasureWithAdditionalEffect.java @@ -0,0 +1,68 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.game.Game; +import mage.game.events.CreateTokenEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.token.Token; +import mage.game.permanent.token.TreasureToken; + +import java.util.Map; + +/** + * + * @author weirddan455 + */ +public class ReplaceTreasureWithAdditionalEffect extends ReplacementEffectImpl { + public ReplaceTreasureWithAdditionalEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + this.staticText = "If you would create one or more Treasure tokens, instead create those tokens plus an additional Treasure token"; + } + + private ReplaceTreasureWithAdditionalEffect(final ReplaceTreasureWithAdditionalEffect effect) { + super(effect); + } + + @Override + public ReplaceTreasureWithAdditionalEffect copy() { + return new ReplaceTreasureWithAdditionalEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.CREATE_TOKEN; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!(event instanceof CreateTokenEvent) || !source.isControlledBy(event.getPlayerId())) { + return false; + } + return ((CreateTokenEvent) event).getTokens().keySet().stream() + .anyMatch(token -> token.hasSubtype(SubType.TREASURE, game)); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + if (event instanceof CreateTokenEvent) { + CreateTokenEvent tokenEvent = (CreateTokenEvent) event; + TreasureToken treasureToken = null; + Map tokens = tokenEvent.getTokens(); + for (Token token : tokens.keySet()) { + if (token instanceof TreasureToken) { + treasureToken = (TreasureToken) token; + break; + } + } + if (treasureToken == null) { + treasureToken = new TreasureToken(); + } + tokens.put(treasureToken, tokens.getOrDefault(treasureToken, 0) + 1); + } + return false; + } +}