diff --git a/Mage.Sets/src/mage/cards/m/ManascapeRefractor.java b/Mage.Sets/src/mage/cards/m/ManascapeRefractor.java index 076f44dda0a..0f7995d9b36 100644 --- a/Mage.Sets/src/mage/cards/m/ManascapeRefractor.java +++ b/Mage.Sets/src/mage/cards/m/ManascapeRefractor.java @@ -73,7 +73,7 @@ class ManascapeRefractorGainAbilitiesEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { Permanent perm = game.getPermanent(source.getSourceId()); if (perm == null) { - return true; + return false; } for (Ability ability : game.getState() .getBattlefield() @@ -85,6 +85,7 @@ class ManascapeRefractorGainAbilitiesEffect extends ContinuousEffectImpl { .filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) .collect(Collectors.toList())) { + // optimization to disallow the adding of duplicate, unnecessary basic mana abilities if (!(ability instanceof BasicManaAbility) || perm.getAbilities(game) .stream() diff --git a/Mage.Sets/src/mage/cards/r/RobaranMercenaries.java b/Mage.Sets/src/mage/cards/r/RobaranMercenaries.java new file mode 100644 index 00000000000..95060b484b9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RobaranMercenaries.java @@ -0,0 +1,100 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.keyword.VigilanceAbility; +import mage.abilities.mana.BasicManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.Collection; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * @author PurpleCrowbar + */ +public final class RobaranMercenaries extends CardImpl { + + public RobaranMercenaries(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.MERCENARY); + + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Robaran Mercenaries has all activated abilties of all legendary creatures you control. + this.addAbility(new SimpleStaticAbility(new RobaranMercenariesEffect())); + } + + private RobaranMercenaries(final RobaranMercenaries card) { + super(card); + } + + @Override + public RobaranMercenaries copy() { + return new RobaranMercenaries(this); + } +} + +class RobaranMercenariesEffect extends ContinuousEffectImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(SuperType.LEGENDARY.getPredicate()); + } + + RobaranMercenariesEffect() { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + staticText = "{this} has all activated abilities of all legendary creatures you control."; + this.addDependencyType(DependencyType.AddingAbility); + } + + private RobaranMercenariesEffect(final RobaranMercenariesEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent perm = game.getPermanent(source.getSourceId()); + if (perm == null) { + return false; + } + for (Ability ability : game.getState() + .getBattlefield() + .getActivePermanents(filter, source.getControllerId(), source, game) + .stream() + .map(permanent -> permanent.getAbilities(game)) + .flatMap(Collection::stream) + .filter(Objects::nonNull) + .filter(ability -> ability.getAbilityType() == AbilityType.ACTIVATED + || ability.getAbilityType() == AbilityType.MANA) + .collect(Collectors.toList())) { + // optimization to disallow the adding of duplicate, unnecessary basic mana abilities + if (!(ability instanceof BasicManaAbility) + || perm.getAbilities(game) + .stream() + .noneMatch(ability.getClass()::isInstance)) { + perm.addAbility(ability, source.getSourceId(), game); + } + } + return true; + } + + @Override + public RobaranMercenariesEffect copy() { + return new RobaranMercenariesEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/DominariaUnitedCommander.java b/Mage.Sets/src/mage/sets/DominariaUnitedCommander.java index 3a1f2e03f2f..65f94ca70f1 100644 --- a/Mage.Sets/src/mage/sets/DominariaUnitedCommander.java +++ b/Mage.Sets/src/mage/sets/DominariaUnitedCommander.java @@ -150,9 +150,11 @@ public final class DominariaUnitedCommander extends ExpansionSet { cards.add(new SetCardInfo("Read the Bones", 117, Rarity.COMMON, mage.cards.r.ReadTheBones.class)); cards.add(new SetCardInfo("Reliquary Tower", 227, Rarity.UNCOMMON, mage.cards.r.ReliquaryTower.class)); cards.add(new SetCardInfo("Rienne, Angel of Rebirth", 166, Rarity.MYTHIC, mage.cards.r.RienneAngelOfRebirth.class)); + cards.add(new SetCardInfo("Robaran Mercenaries", 22, Rarity.RARE, mage.cards.r.RobaranMercenaries.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Robaran Mercenaries", 72, Rarity.RARE, mage.cards.r.RobaranMercenaries.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rocky Tar Pit", 228, Rarity.UNCOMMON, mage.cards.r.RockyTarPit.class)); cards.add(new SetCardInfo("Rohgahh, Kher Keep Overlord", 41, Rarity.RARE, mage.cards.r.RohgahhKherKeepOverlord.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rohgahh, Kher Keep Overlord", 63, Rarity.RARE, mage.cards.r.RohgahhKherKeepOverlord.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Rocky Tar Pit", 228, Rarity.UNCOMMON, mage.cards.r.RockyTarPit.class)); cards.add(new SetCardInfo("Rosnakht, Heir of Rohgahh", 25, Rarity.RARE, mage.cards.r.RosnakhtHeirOfRohgahh.class)); cards.add(new SetCardInfo("Sandsteppe Citadel", 229, Rarity.UNCOMMON, mage.cards.s.SandsteppeCitadel.class)); cards.add(new SetCardInfo("Savage Lands", 230, Rarity.UNCOMMON, mage.cards.s.SavageLands.class));