From a754fb672a86a357dcff81ed1287fcb6027c354e Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sat, 10 Jun 2023 12:28:29 -0400 Subject: [PATCH] [LTC] Implement Fealty to the Realm --- Mage.Sets/src/mage/cards/a/AssaultSuit.java | 2 +- .../src/mage/cards/f/FealtyToTheRealm.java | 91 +++++++++++++++++++ Mage.Sets/src/mage/cards/s/SpectralGrasp.java | 2 +- Mage.Sets/src/mage/cards/v/VowOfDuty.java | 2 +- Mage.Sets/src/mage/cards/v/VowOfFlight.java | 2 +- .../src/mage/cards/v/VowOfLightning.java | 2 +- Mage.Sets/src/mage/cards/v/VowOfMalice.java | 2 +- Mage.Sets/src/mage/cards/v/VowOfTorment.java | 2 +- Mage.Sets/src/mage/cards/v/VowOfWildness.java | 2 +- .../sets/TalesOfMiddleEarthCommander.java | 1 + .../CantAttackControllerAttachedEffect.java | 26 +++--- .../continuous/ControlEnchantedEffect.java | 45 ++------- 12 files changed, 124 insertions(+), 55 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/f/FealtyToTheRealm.java diff --git a/Mage.Sets/src/mage/cards/a/AssaultSuit.java b/Mage.Sets/src/mage/cards/a/AssaultSuit.java index 39ebc4da056..6bbc5e83a4c 100644 --- a/Mage.Sets/src/mage/cards/a/AssaultSuit.java +++ b/Mage.Sets/src/mage/cards/a/AssaultSuit.java @@ -40,7 +40,7 @@ public final class AssaultSuit extends CardImpl { Effect effect = new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.EQUIPMENT); effect.setText(", has haste"); ability.addEffect(effect); - effect = new CantAttackControllerAttachedEffect(AttachmentType.EQUIPMENT); + effect = new CantAttackControllerAttachedEffect(AttachmentType.EQUIPMENT, true); effect.setText(", can't attack you or planeswalkers you control"); ability.addEffect(effect); effect = new AssaultSuitCantBeSacrificed(); diff --git a/Mage.Sets/src/mage/cards/f/FealtyToTheRealm.java b/Mage.Sets/src/mage/cards/f/FealtyToTheRealm.java new file mode 100644 index 00000000000..27d953e532e --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FealtyToTheRealm.java @@ -0,0 +1,91 @@ +package mage.cards.f; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.BecomesMonarchSourceEffect; +import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect; +import mage.abilities.effects.common.combat.CantAttackControllerAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FealtyToTheRealm extends CardImpl { + + public FealtyToTheRealm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // When Fealty to the Realm enters the battlefield, you become the monarch. + this.addAbility(new EntersBattlefieldTriggeredAbility(new BecomesMonarchSourceEffect())); + + // The monarch controls enchanted creature. + this.addAbility(new SimpleStaticAbility(new FealtyToTheRealmEffect())); + + // Enchanted creature attacks each combat if able and can't attack you. + Ability ability = new SimpleStaticAbility( + new AttacksIfAbleAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.AURA) + ); + ability.addEffect(new CantAttackControllerAttachedEffect(AttachmentType.AURA, false)); + this.addAbility(ability); + } + + private FealtyToTheRealm(final FealtyToTheRealm card) { + super(card); + } + + @Override + public FealtyToTheRealm copy() { + return new FealtyToTheRealm(this); + } +} + +class FealtyToTheRealmEffect extends ContinuousEffectImpl { + + public FealtyToTheRealmEffect() { + super(Duration.WhileOnBattlefield, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); + staticText = "the monarch controls enchanted creature"; + } + + public FealtyToTheRealmEffect(final FealtyToTheRealmEffect effect) { + super(effect); + } + + @Override + public FealtyToTheRealmEffect copy() { + return new FealtyToTheRealmEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent enchantment = source.getSourcePermanentIfItStillExists(game); + if (enchantment == null || game.getMonarchId() == null) { + return false; + } + Permanent permanent = game.getPermanent(enchantment.getAttachedTo()); + if (permanent == null) { + return false; + } + permanent.changeControllerId(game.getMonarchId(), game, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/s/SpectralGrasp.java b/Mage.Sets/src/mage/cards/s/SpectralGrasp.java index 0b1f487f287..d54c7ed41cc 100644 --- a/Mage.Sets/src/mage/cards/s/SpectralGrasp.java +++ b/Mage.Sets/src/mage/cards/s/SpectralGrasp.java @@ -45,7 +45,7 @@ public final class SpectralGrasp extends CardImpl { this.addAbility(ability); // Enchanted creature can't attack you or a planeswalker you control. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackControllerAttachedEffect(AttachmentType.AURA))); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackControllerAttachedEffect(AttachmentType.AURA, true))); // Enchanted creature can't block creatures you control. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockAttachedEffect(AttachmentType.AURA, Duration.WhileOnBattlefield, filter))); diff --git a/Mage.Sets/src/mage/cards/v/VowOfDuty.java b/Mage.Sets/src/mage/cards/v/VowOfDuty.java index f3edb4a8ce2..c718aae920c 100644 --- a/Mage.Sets/src/mage/cards/v/VowOfDuty.java +++ b/Mage.Sets/src/mage/cards/v/VowOfDuty.java @@ -44,7 +44,7 @@ public final class VowOfDuty extends CardImpl { Effect effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield); effect.setText(", has vigilance"); ability.addEffect(effect); - effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA); + effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA, true); effect.setText(", and can't attack you or planeswalkers you control"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VowOfFlight.java b/Mage.Sets/src/mage/cards/v/VowOfFlight.java index 7a2a4d7bd11..61f510a6ec3 100644 --- a/Mage.Sets/src/mage/cards/v/VowOfFlight.java +++ b/Mage.Sets/src/mage/cards/v/VowOfFlight.java @@ -44,7 +44,7 @@ public final class VowOfFlight extends CardImpl { Effect effect = new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield); effect.setText(", has flying"); ability.addEffect(effect); - effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA); + effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA, true); effect.setText(", and can't attack you or planeswalkers you control"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VowOfLightning.java b/Mage.Sets/src/mage/cards/v/VowOfLightning.java index 56e125397dc..9c1314fa7c4 100644 --- a/Mage.Sets/src/mage/cards/v/VowOfLightning.java +++ b/Mage.Sets/src/mage/cards/v/VowOfLightning.java @@ -44,7 +44,7 @@ public final class VowOfLightning extends CardImpl { Effect effect = new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield); effect.setText(", has first strike"); ability.addEffect(effect); - effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA); + effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA, true); effect.setText(", and can't attack you or planeswalkers you control"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VowOfMalice.java b/Mage.Sets/src/mage/cards/v/VowOfMalice.java index 89d7b90167d..d834b0d6a11 100644 --- a/Mage.Sets/src/mage/cards/v/VowOfMalice.java +++ b/Mage.Sets/src/mage/cards/v/VowOfMalice.java @@ -44,7 +44,7 @@ public final class VowOfMalice extends CardImpl { Effect effect = new GainAbilityAttachedEffect(IntimidateAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield); effect.setText(", has intimidate"); ability.addEffect(effect); - effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA); + effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA, true); effect.setText(", and can't attack you or planeswalkers you control"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VowOfTorment.java b/Mage.Sets/src/mage/cards/v/VowOfTorment.java index 70864be6a1a..78cec2705a0 100644 --- a/Mage.Sets/src/mage/cards/v/VowOfTorment.java +++ b/Mage.Sets/src/mage/cards/v/VowOfTorment.java @@ -38,7 +38,7 @@ public final class VowOfTorment extends CardImpl { ability.addEffect(new GainAbilityAttachedEffect( new MenaceAbility(), AttachmentType.AURA, Duration.WhileOnBattlefield ).setText(", has menace")); - ability.addEffect(new CantAttackControllerAttachedEffect(AttachmentType.AURA) + ability.addEffect(new CantAttackControllerAttachedEffect(AttachmentType.AURA, true) .setText(", and can't attack you or planeswalkers you control. " + "(It can't be blocked except by two or more creatures.)")); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VowOfWildness.java b/Mage.Sets/src/mage/cards/v/VowOfWildness.java index cdec8303c93..f0104a88852 100644 --- a/Mage.Sets/src/mage/cards/v/VowOfWildness.java +++ b/Mage.Sets/src/mage/cards/v/VowOfWildness.java @@ -45,7 +45,7 @@ public final class VowOfWildness extends CardImpl { Effect effect = new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA, Duration.WhileOnBattlefield); effect.setText(", has trample"); ability.addEffect(effect); - effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA); + effect = new CantAttackControllerAttachedEffect(AttachmentType.AURA, true); effect.setText(", and can't attack you or planeswalkers you control"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/sets/TalesOfMiddleEarthCommander.java b/Mage.Sets/src/mage/sets/TalesOfMiddleEarthCommander.java index 13942893e26..7c8b7ba7312 100644 --- a/Mage.Sets/src/mage/sets/TalesOfMiddleEarthCommander.java +++ b/Mage.Sets/src/mage/sets/TalesOfMiddleEarthCommander.java @@ -81,6 +81,7 @@ public final class TalesOfMiddleEarthCommander extends ExpansionSet { cards.add(new SetCardInfo("Faithless Looting", 215, Rarity.COMMON, mage.cards.f.FaithlessLooting.class)); cards.add(new SetCardInfo("Farhaven Elf", 243, Rarity.COMMON, mage.cards.f.FarhavenElf.class)); cards.add(new SetCardInfo("Farseek", 244, Rarity.COMMON, mage.cards.f.Farseek.class)); + cards.add(new SetCardInfo("Fealty to the Realm", 21, Rarity.RARE, mage.cards.f.FealtyToTheRealm.class)); cards.add(new SetCardInfo("Feed the Swarm", 200, Rarity.COMMON, mage.cards.f.FeedTheSwarm.class)); cards.add(new SetCardInfo("Fell the Mighty", 167, Rarity.RARE, mage.cards.f.FellTheMighty.class)); cards.add(new SetCardInfo("Field of Ruin", 308, Rarity.UNCOMMON, mage.cards.f.FieldOfRuin.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java index 518e3752ca7..303b0e4f0e2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/combat/CantAttackControllerAttachedEffect.java @@ -13,16 +13,20 @@ import java.util.UUID; /** * @author LevelX2 */ - public class CantAttackControllerAttachedEffect extends RestrictionEffect { - public CantAttackControllerAttachedEffect(AttachmentType attachmentType) { + private final boolean orPlaneswalker; + + public CantAttackControllerAttachedEffect(AttachmentType attachmentType, boolean orPlaneswalker) { super(Duration.WhileOnBattlefield); - this.staticText = attachmentType.verb() + " creature can't attack you or planeswalkers you control"; + this.orPlaneswalker = orPlaneswalker; + this.staticText = attachmentType.verb() + " creature can't attack you" + + (orPlaneswalker ? " or planeswalkers you control" : ""); } - public CantAttackControllerAttachedEffect(final CantAttackControllerAttachedEffect effect) { + private CantAttackControllerAttachedEffect(final CantAttackControllerAttachedEffect effect) { super(effect); + this.orPlaneswalker = effect.orPlaneswalker; } @Override @@ -32,21 +36,19 @@ public class CantAttackControllerAttachedEffect extends RestrictionEffect { @Override public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game, boolean canUseChooseDialogs) { - if (defenderId == null) { - return true; - } - - if (defenderId.equals(source.getControllerId())) { + if (source.isControlledBy(defenderId)) { return false; } + if (!orPlaneswalker) { + return true; + } Permanent planeswalker = game.getPermanent(defenderId); - return planeswalker == null || !planeswalker.isControlledBy(source.getControllerId()); + return planeswalker == null || !planeswalker.isPlaneswalker(game) + || !planeswalker.isControlledBy(source.getControllerId()); } - @Override public CantAttackControllerAttachedEffect copy() { return new CantAttackControllerAttachedEffect(this); } - } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/ControlEnchantedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/ControlEnchantedEffect.java index d00c2d318e2..ad229ee4c14 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/ControlEnchantedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/ControlEnchantedEffect.java @@ -8,7 +8,6 @@ import mage.constants.Outcome; import mage.constants.SubLayer; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.players.Player; /** * @author nantuko @@ -33,41 +32,17 @@ public class ControlEnchantedEffect extends ContinuousEffectImpl { return new ControlEnchantedEffect(this); } - @Override - public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - Permanent enchantment = game.getPermanent(source.getSourceId()); - Player controllerOfEnchantment = game.getPlayer(source.getControllerId()); - if (enchantment != null - && enchantment.getAttachedTo() != null - && controllerOfEnchantment != null) { - Permanent permanent = game.getPermanent(enchantment.getAttachedTo()); - if (permanent != null) { - switch (layer) { - case ControlChangingEffects_2: - if (sublayer == SubLayer.NA) { - permanent.changeControllerId(enchantment.getControllerId(), game, source); - permanent.getAbilities().forEach((ability) -> { - ability.setControllerId(enchantment.getControllerId()); - }); - } - break; - } - return true; - } else { //remove effect if the aura or attachedTo permanent or controller of the enchantment is null - discard(); - } - } - return false; - } - @Override public boolean apply(Game game, Ability source) { - return false; + Permanent enchantment = source.getSourcePermanentIfItStillExists(game); + if (enchantment == null) { + return false; + } + Permanent permanent = game.getPermanent(enchantment.getAttachedTo()); + if (permanent == null) { + return false; + } + permanent.changeControllerId(source.getControllerId(), game, source); + return true; } - - @Override - public boolean hasLayer(Layer layer) { - return layer == Layer.ControlChangingEffects_2; - } - }