From 1375d31dde854cf5b951ca1551cc48c46a3799e2 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Mon, 26 May 2025 13:40:44 -0400 Subject: [PATCH] [FIN] Implement Cactuar --- Mage.Sets/src/mage/cards/c/Cactuar.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/cards/c/CrewCaptain.java | 2 +- .../src/mage/cards/d/DrownyardBehemoth.java | 2 +- .../src/mage/cards/f/FungusElemental.java | 3 +- .../src/mage/cards/h/HixusPrisonWarden.java | 2 +- Mage.Sets/src/mage/cards/k/KaitoShizuki.java | 4 +- .../src/mage/cards/k/KeldonStrikeTeam.java | 2 +- Mage.Sets/src/mage/cards/m/Mirrex.java | 2 +- .../src/mage/cards/m/MoonCircuitHacker.java | 2 +- .../src/mage/cards/s/ShardmagesRescue.java | 2 +- .../src/mage/cards/t/ThrastaTempestsRoar.java | 2 +- .../src/mage/cards/z/ZurgoAndOjutai.java | 2 +- Mage.Sets/src/mage/sets/FinalFantasy.java | 1 + .../SourceEnteredThisTurnCondition.java | 14 +++--- 14 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/c/Cactuar.java diff --git a/Mage.Sets/src/mage/cards/c/Cactuar.java b/Mage.Sets/src/mage/cards/c/Cactuar.java new file mode 100644 index 00000000000..963ae7dd237 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/Cactuar.java @@ -0,0 +1,45 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.condition.common.SourceEnteredThisTurnCondition; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Cactuar extends CardImpl { + + public Cactuar(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + + this.subtype.add(SubType.PLANT); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // At the beginning of your end step, if this creature didn't enter the battlefield this turn, return it to its owner's hand. + this.addAbility(new BeginningOfEndStepTriggeredAbility( + new ReturnToHandSourceEffect(true) + .setText("return it to its owner's hand") + ).withInterveningIf(SourceEnteredThisTurnCondition.DIDNT)); + } + + private Cactuar(final Cactuar card) { + super(card); + } + + @Override + public Cactuar copy() { + return new Cactuar(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CrewCaptain.java b/Mage.Sets/src/mage/cards/c/CrewCaptain.java index a97cc967127..36070e043d2 100644 --- a/Mage.Sets/src/mage/cards/c/CrewCaptain.java +++ b/Mage.Sets/src/mage/cards/c/CrewCaptain.java @@ -32,7 +32,7 @@ public final class CrewCaptain extends CardImpl { // Crew Captain has indestructible as long as it entered the battlefield this turn. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( - new GainAbilitySourceEffect(IndestructibleAbility.getInstance()), SourceEnteredThisTurnCondition.instance, + new GainAbilitySourceEffect(IndestructibleAbility.getInstance()), SourceEnteredThisTurnCondition.DID, "{this} has indestructible as long as it entered the battlefield this turn" ))); } diff --git a/Mage.Sets/src/mage/cards/d/DrownyardBehemoth.java b/Mage.Sets/src/mage/cards/d/DrownyardBehemoth.java index d5020c06729..058785117b0 100644 --- a/Mage.Sets/src/mage/cards/d/DrownyardBehemoth.java +++ b/Mage.Sets/src/mage/cards/d/DrownyardBehemoth.java @@ -38,7 +38,7 @@ public final class DrownyardBehemoth extends CardImpl { // Drownyard Behemoth has hexproof as long as it entered the battlefield this turn. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield), - SourceEnteredThisTurnCondition.instance, "{this} has hexproof as long as it entered the battlefield this turn" + SourceEnteredThisTurnCondition.DID, "{this} has hexproof as long as it entered the battlefield this turn" ))); } diff --git a/Mage.Sets/src/mage/cards/f/FungusElemental.java b/Mage.Sets/src/mage/cards/f/FungusElemental.java index 2267ade74cc..19dd31405ec 100644 --- a/Mage.Sets/src/mage/cards/f/FungusElemental.java +++ b/Mage.Sets/src/mage/cards/f/FungusElemental.java @@ -15,7 +15,6 @@ import mage.constants.CardType; import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterControlledPermanent; -import mage.target.common.TargetControlledPermanent; /** * @@ -42,7 +41,7 @@ public final class FungusElemental extends CardImpl { Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P2P2.createInstance()), new ManaCostsImpl<>("{G}"), - SourceEnteredThisTurnCondition.instance + SourceEnteredThisTurnCondition.DID ); ability.addCost(new SacrificeTargetCost(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/h/HixusPrisonWarden.java b/Mage.Sets/src/mage/cards/h/HixusPrisonWarden.java index 9118193e599..4fe5e3243fa 100644 --- a/Mage.Sets/src/mage/cards/h/HixusPrisonWarden.java +++ b/Mage.Sets/src/mage/cards/h/HixusPrisonWarden.java @@ -36,7 +36,7 @@ public final class HixusPrisonWarden extends CardImpl { this.addAbility(new ConditionalInterveningIfTriggeredAbility(new DealsDamageToYouAllTriggeredAbility( StaticFilters.FILTER_PERMANENT_CREATURE, new ExileUntilSourceLeavesEffect(), true ).setTriggerPhrase("Whenever a creature deals combat damage to you, if {this} entered the battlefield this turn, "), - SourceEnteredThisTurnCondition.instance, null + SourceEnteredThisTurnCondition.DID, null )); } diff --git a/Mage.Sets/src/mage/cards/k/KaitoShizuki.java b/Mage.Sets/src/mage/cards/k/KaitoShizuki.java index 83a867d4331..9103e9818e1 100644 --- a/Mage.Sets/src/mage/cards/k/KaitoShizuki.java +++ b/Mage.Sets/src/mage/cards/k/KaitoShizuki.java @@ -31,7 +31,7 @@ import java.util.UUID; public final class KaitoShizuki extends CardImpl { private static final Hint hint = new ConditionHint( - SourceEnteredThisTurnCondition.instance, "This permanent entered the battlefield this turn" + SourceEnteredThisTurnCondition.DID, "This permanent entered the battlefield this turn" ); private static final Condition condition = new InvertCondition(RaidCondition.instance); @@ -45,7 +45,7 @@ public final class KaitoShizuki extends CardImpl { // At the beginning of your end step, if Kaito Shizuki entered the battlefield this turn, he phases out. this.addAbility(new BeginningOfEndStepTriggeredAbility( TargetController.YOU, new PhaseOutSourceEffect().setText("he phases out"), - false, SourceEnteredThisTurnCondition.instance + false, SourceEnteredThisTurnCondition.DID ).addHint(hint)); // +1: Draw a card. Then discard a card unless you attacked this turn. diff --git a/Mage.Sets/src/mage/cards/k/KeldonStrikeTeam.java b/Mage.Sets/src/mage/cards/k/KeldonStrikeTeam.java index 99490a7c82d..d718011d349 100644 --- a/Mage.Sets/src/mage/cards/k/KeldonStrikeTeam.java +++ b/Mage.Sets/src/mage/cards/k/KeldonStrikeTeam.java @@ -49,7 +49,7 @@ public final class KeldonStrikeTeam extends CardImpl { new GainAbilityControlledEffect( HasteAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURE - ), SourceEnteredThisTurnCondition.instance, "as long as {this} " + + ), SourceEnteredThisTurnCondition.DID, "as long as {this} " + "entered the battlefield this turn, creatures you control have haste" ))); } diff --git a/Mage.Sets/src/mage/cards/m/Mirrex.java b/Mage.Sets/src/mage/cards/m/Mirrex.java index e7e737a999e..d9b718fcaec 100644 --- a/Mage.Sets/src/mage/cards/m/Mirrex.java +++ b/Mage.Sets/src/mage/cards/m/Mirrex.java @@ -34,7 +34,7 @@ public final class Mirrex extends CardImpl { // {T}: Add one mana of any color. Activate only if Mirrex entered the battlefield this turn. this.addAbility(new ActivateIfConditionManaAbility( Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), - new TapSourceCost(), SourceEnteredThisTurnCondition.instance + new TapSourceCost(), SourceEnteredThisTurnCondition.DID )); // {3}, {T}: Create a 1/1 colorless Phyrexian Mite artifact creature token with toxic 1 and "This creature can't block." diff --git a/Mage.Sets/src/mage/cards/m/MoonCircuitHacker.java b/Mage.Sets/src/mage/cards/m/MoonCircuitHacker.java index 797138e2087..295048463f3 100644 --- a/Mage.Sets/src/mage/cards/m/MoonCircuitHacker.java +++ b/Mage.Sets/src/mage/cards/m/MoonCircuitHacker.java @@ -22,7 +22,7 @@ import java.util.UUID; */ public final class MoonCircuitHacker extends CardImpl { - private static final Condition condition = new InvertCondition(SourceEnteredThisTurnCondition.instance); + private static final Condition condition = new InvertCondition(SourceEnteredThisTurnCondition.DID); public MoonCircuitHacker(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "{1}{U}"); diff --git a/Mage.Sets/src/mage/cards/s/ShardmagesRescue.java b/Mage.Sets/src/mage/cards/s/ShardmagesRescue.java index 5d413c2ed3c..0d6126f591e 100644 --- a/Mage.Sets/src/mage/cards/s/ShardmagesRescue.java +++ b/Mage.Sets/src/mage/cards/s/ShardmagesRescue.java @@ -42,7 +42,7 @@ public final class ShardmagesRescue extends CardImpl { // As long as Shardmage's Rescue entered this turn, enchanted creature has hexproof. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( new GainAbilityAttachedEffect(HexproofAbility.getInstance(), AttachmentType.AURA), - SourceEnteredThisTurnCondition.instance, + SourceEnteredThisTurnCondition.DID, "as long as {this} entered this turn, enchanted creature has hexproof" ))); diff --git a/Mage.Sets/src/mage/cards/t/ThrastaTempestsRoar.java b/Mage.Sets/src/mage/cards/t/ThrastaTempestsRoar.java index b81047801d1..077aaeeeda1 100644 --- a/Mage.Sets/src/mage/cards/t/ThrastaTempestsRoar.java +++ b/Mage.Sets/src/mage/cards/t/ThrastaTempestsRoar.java @@ -49,7 +49,7 @@ public final class ThrastaTempestsRoar extends CardImpl { // Thrasta has hexproof as long as it entered the battlefield this turn. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield), - SourceEnteredThisTurnCondition.instance, "{this} has hexproof as long as it entered the battlefield this turn" + SourceEnteredThisTurnCondition.DID, "{this} has hexproof as long as it entered the battlefield this turn" ))); } diff --git a/Mage.Sets/src/mage/cards/z/ZurgoAndOjutai.java b/Mage.Sets/src/mage/cards/z/ZurgoAndOjutai.java index 5bd7714092f..0425fd2395e 100644 --- a/Mage.Sets/src/mage/cards/z/ZurgoAndOjutai.java +++ b/Mage.Sets/src/mage/cards/z/ZurgoAndOjutai.java @@ -57,7 +57,7 @@ public final class ZurgoAndOjutai extends CardImpl { // Zurgo and Ojutai has hexproof as long as it entered the battlefield this turn. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield), - SourceEnteredThisTurnCondition.instance, "{this} has hexproof as long as it entered the battlefield this turn" + SourceEnteredThisTurnCondition.DID, "{this} has hexproof as long as it entered the battlefield this turn" ))); // Whenever one or more Dragons you control deal combat damage to a player or battle, look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. You may return one of those Dragons to its owner's hand. diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java index 0c293106cfe..e4eb089a822 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasy.java +++ b/Mage.Sets/src/mage/sets/FinalFantasy.java @@ -76,6 +76,7 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Braska's Final Aeon", 448, Rarity.RARE, mage.cards.b.BraskasFinalAeon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Buster Sword", 255, Rarity.MYTHIC, mage.cards.b.BusterSword.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Buster Sword", 351, Rarity.MYTHIC, mage.cards.b.BusterSword.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cactuar", 177, Rarity.UNCOMMON, mage.cards.c.Cactuar.class)); cards.add(new SetCardInfo("Capital City", 274, Rarity.UNCOMMON, mage.cards.c.CapitalCity.class)); cards.add(new SetCardInfo("Cargo Ship", 47, Rarity.UNCOMMON, mage.cards.c.CargoShip.class)); cards.add(new SetCardInfo("Cecil, Dark Knight", 380, Rarity.RARE, mage.cards.c.CecilDarkKnight.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/abilities/condition/common/SourceEnteredThisTurnCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SourceEnteredThisTurnCondition.java index d2165c92393..2ff18a230b8 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/SourceEnteredThisTurnCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/SourceEnteredThisTurnCondition.java @@ -1,4 +1,3 @@ - package mage.abilities.condition.common; import mage.abilities.Ability; @@ -9,20 +8,23 @@ import mage.game.permanent.Permanent; /** * @author xenohedron */ - public enum SourceEnteredThisTurnCondition implements Condition { + DID(true), + DIDNT(false); + private final boolean flag; - instance; + SourceEnteredThisTurnCondition(boolean flag) { + this.flag = flag; + } @Override public boolean apply(Game game, Ability source) { Permanent permanent = source.getSourcePermanentOrLKI(game); - return permanent != null && permanent.getTurnsOnBattlefield() == 0; + return permanent != null && (permanent.getTurnsOnBattlefield() == 0) == flag; } @Override public String toString() { - return "{this} entered the battlefield this turn"; + return "{this} " + (flag ? "entered" : "didn't enter") + " the battlefield this turn"; } - }