From 0cc1b152c4b146a0509938d5c808b7979542a5aa Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 1 Mar 2022 19:02:45 -0500 Subject: [PATCH] [ONS] Implemented Graxiplon --- Mage.Sets/src/mage/cards/g/Graxiplon.java | 58 +++++++++++++++++++ Mage.Sets/src/mage/sets/Onslaught.java | 1 + .../GreatestSharedCreatureTypeCount.java | 7 ++- 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/g/Graxiplon.java diff --git a/Mage.Sets/src/mage/cards/g/Graxiplon.java b/Mage.Sets/src/mage/cards/g/Graxiplon.java new file mode 100644 index 00000000000..73d68c392a8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/Graxiplon.java @@ -0,0 +1,58 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalRestrictionEffect; +import mage.abilities.dynamicvalue.common.GreatestSharedCreatureTypeCount; +import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.Game; +import mage.players.Player; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Graxiplon extends CardImpl { + + public Graxiplon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{U}"); + + this.subtype.add(SubType.BEAST); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Graxiplon can’t be blocked unless defending player controls three or more creatures that share a creature type. + this.addAbility(new SimpleStaticAbility(new ConditionalRestrictionEffect( + new CantBeBlockedSourceEffect(), GraxiplonCondition.instance, "{this} can’t be blocked " + + "unless defending player controls three or more creatures that share a creature type" + ))); + } + + private Graxiplon(final Graxiplon card) { + super(card); + } + + @Override + public Graxiplon copy() { + return new Graxiplon(this); + } +} + +enum GraxiplonCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(game.getCombat().getDefendingPlayerId(source.getSourceId(), game)); + return player == null || GreatestSharedCreatureTypeCount.getValue( + player.getId(), source.getSourceId(), game + ) < 3; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index 381eeb145fc..01391ae58c3 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -169,6 +169,7 @@ public final class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Gratuitous Violence", 212, Rarity.RARE, mage.cards.g.GratuitousViolence.class)); cards.add(new SetCardInfo("Gravel Slinger", 33, Rarity.COMMON, mage.cards.g.GravelSlinger.class)); cards.add(new SetCardInfo("Gravespawn Sovereign", 152, Rarity.RARE, mage.cards.g.GravespawnSovereign.class)); + cards.add(new SetCardInfo("Graxiplon", 86, Rarity.UNCOMMON, mage.cards.g.Graxiplon.class)); cards.add(new SetCardInfo("Grinning Demon", 153, Rarity.RARE, mage.cards.g.GrinningDemon.class)); cards.add(new SetCardInfo("Gustcloak Harrier", 34, Rarity.COMMON, mage.cards.g.GustcloakHarrier.class)); cards.add(new SetCardInfo("Gustcloak Runner", 35, Rarity.COMMON, mage.cards.g.GustcloakRunner.class)); diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GreatestSharedCreatureTypeCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GreatestSharedCreatureTypeCount.java index 493df46a475..3e03869ae29 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/GreatestSharedCreatureTypeCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/GreatestSharedCreatureTypeCount.java @@ -26,9 +26,12 @@ public enum GreatestSharedCreatureTypeCount implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { + return getValue(sourceAbility.getControllerId(), sourceAbility.getSourceId(), game); + } + + public static int getValue(UUID playerId, UUID sourceId, Game game) { List permanentList = game.getBattlefield().getActivePermanents( - StaticFilters.FILTER_CONTROLLED_CREATURE, - sourceAbility.getControllerId(), sourceAbility.getSourceId(), game + StaticFilters.FILTER_CONTROLLED_CREATURE, playerId, sourceId, game ); permanentList.removeIf(Objects::isNull); int changelings = permanentList