From 71b267a3ca1dcd61a24101874a0af81df6972161 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Thu, 4 Apr 2024 21:47:26 +0200 Subject: [PATCH] [BIG] Implement Territory Forge --- .../src/mage/cards/t/TerritoryForge.java | 129 ++++++++++++++++++ Mage.Sets/src/mage/sets/TheBigScore.java | 1 + 2 files changed, 130 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TerritoryForge.java diff --git a/Mage.Sets/src/mage/cards/t/TerritoryForge.java b/Mage.Sets/src/mage/cards/t/TerritoryForge.java new file mode 100644 index 00000000000..ce64f138129 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TerritoryForge.java @@ -0,0 +1,129 @@ +package mage.cards.t; + +import mage.abilities.Ability; +import mage.abilities.ActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.CastFromEverywhereSourceCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.game.ExileZone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class TerritoryForge extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("artifact or land"); + + static { + filter.add(Predicates.or(CardType.ARTIFACT.getPredicate(), CardType.LAND.getPredicate())); + } + + public TerritoryForge(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}{R}"); + + // When Territory Forge enters the battlefield, if you cast it, exile target artifact or land. + Ability ability = new ConditionalInterveningIfTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new TerritoryForgeExileEffect()), + CastFromEverywhereSourceCondition.instance, + "When {this} enters the battlefield, if you cast it, exile target artifact or land." + ); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + + // Territory Forge has all activated abilities of the exiled card. + this.addAbility(new SimpleStaticAbility(new TerritoryForgeStaticEffect())); + } + + private TerritoryForge(final TerritoryForge card) { + super(card); + } + + @Override + public TerritoryForge copy() { + return new TerritoryForge(this); + } +} + +class TerritoryForgeExileEffect extends OneShotEffect { + + TerritoryForgeExileEffect() { + super(Outcome.Exile); + } + + private TerritoryForgeExileEffect(final TerritoryForgeExileEffect effect) { + super(effect); + } + + @Override + public TerritoryForgeExileEffect copy() { + return new TerritoryForgeExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (player == null || permanent == null) { + return false; + } + UUID exileId = CardUtil.getExileZoneId(game, source); + String exileName = CardUtil.getSourceName(game, source); + return player.moveCardsToExile(permanent, source, game, true, exileId, exileName); + } +} + +// Inspired by Dark Impostor +class TerritoryForgeStaticEffect extends ContinuousEffectImpl { + + TerritoryForgeStaticEffect() { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.Benefit); + staticText = "{this} has all activated ability of the exiled card"; + } + + private TerritoryForgeStaticEffect(final TerritoryForgeStaticEffect effect) { + super(effect); + } + + @Override + public TerritoryForgeStaticEffect copy() { + return new TerritoryForgeStaticEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent == null) { + return false; + } + UUID exileId = CardUtil.getExileZoneId(game, source.getSourceId(), permanent.getZoneChangeCounter(game)); + ExileZone exileZone = game.getExile().getExileZone(exileId); + if (exileZone == null || exileZone.isEmpty()) { + return false; + } + for (Card card : exileZone.getCards(game)) { + for (Ability ability : card.getAbilities(game)) { + if (ability.getAbilityType() == AbilityType.ACTIVATED || ability.getAbilityType() == AbilityType.MANA) { + ActivatedAbility copyAbility = (ActivatedAbility) ability.copy(); + permanent.addAbility(copyAbility, source.getSourceId(), game); + } + } + } + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/TheBigScore.java b/Mage.Sets/src/mage/sets/TheBigScore.java index 436222eb457..9b6e6dd60d7 100644 --- a/Mage.Sets/src/mage/sets/TheBigScore.java +++ b/Mage.Sets/src/mage/sets/TheBigScore.java @@ -46,6 +46,7 @@ public final class TheBigScore extends ExpansionSet { cards.add(new SetCardInfo("Simulacrum Synthesizer", 6, Rarity.MYTHIC, mage.cards.s.SimulacrumSynthesizer.class)); cards.add(new SetCardInfo("Sword of Wealth and Power", 26, Rarity.MYTHIC, mage.cards.s.SwordOfWealthAndPower.class)); cards.add(new SetCardInfo("Tarnation Vista", 30, Rarity.MYTHIC, mage.cards.t.TarnationVista.class)); + cards.add(new SetCardInfo("Territory Forge", 15, Rarity.MYTHIC, mage.cards.t.TerritoryForge.class)); cards.add(new SetCardInfo("Torpor Orb", 27, Rarity.MYTHIC, mage.cards.t.TorporOrb.class)); cards.add(new SetCardInfo("Transmutation Font", 28, Rarity.MYTHIC, mage.cards.t.TransmutationFont.class)); cards.add(new SetCardInfo("Vaultborn Tyrant", 20, Rarity.MYTHIC, mage.cards.v.VaultbornTyrant.class));