diff --git a/Mage.Sets/src/mage/cards/a/AltarOfShadows.java b/Mage.Sets/src/mage/cards/a/AltarOfShadows.java index c379d98987f..8b559045ee2 100644 --- a/Mage.Sets/src/mage/cards/a/AltarOfShadows.java +++ b/Mage.Sets/src/mage/cards/a/AltarOfShadows.java @@ -4,7 +4,7 @@ package mage.cards.a; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; @@ -33,7 +33,7 @@ public final class AltarOfShadows extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{7}"); // At the beginning of your precombat main phase, add {B} for each charge counter on Altar of Shadows. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility(new AltarOfShadowsEffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfFirstMainTriggeredAbility(new AltarOfShadowsEffect(), TargetController.YOU, false)); // {7}, {tap}: Destroy target creature. Then put a charge counter on Altar of Shadows. Ability destroyAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new GenericManaCost(7)); diff --git a/Mage.Sets/src/mage/cards/b/BlackMarket.java b/Mage.Sets/src/mage/cards/b/BlackMarket.java index 84cc8acc12d..aec95a87891 100644 --- a/Mage.Sets/src/mage/cards/b/BlackMarket.java +++ b/Mage.Sets/src/mage/cards/b/BlackMarket.java @@ -4,7 +4,7 @@ package mage.cards.b; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; @@ -30,7 +30,7 @@ public final class BlackMarket extends CardImpl { // Whenever a creature dies, put a charge counter on Black Market. this.addAbility(new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.CHARGE.createInstance()), false)); // At the beginning of your precombat main phase, add {B} for each charge counter on Black Market. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility(new BlackMarketEffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfFirstMainTriggeredAbility(new BlackMarketEffect(), TargetController.YOU, false)); } diff --git a/Mage.Sets/src/mage/cards/b/BlackMarketConnections.java b/Mage.Sets/src/mage/cards/b/BlackMarketConnections.java index 4e9eb289494..1e9e1d0f405 100644 --- a/Mage.Sets/src/mage/cards/b/BlackMarketConnections.java +++ b/Mage.Sets/src/mage/cards/b/BlackMarketConnections.java @@ -2,7 +2,7 @@ package mage.cards.b; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; @@ -25,7 +25,7 @@ public final class BlackMarketConnections extends CardImpl { // At the beginning of your precombat main phase, choose one or more — // • Sell Contraband — Create a Treasure token. You lose 1 life. - Ability ability = new BeginningOfPreCombatMainTriggeredAbility( + Ability ability = new BeginningOfFirstMainTriggeredAbility( new CreateTokenEffect(new TreasureToken()), TargetController.YOU, false ); ability.addEffect(new LoseLifeSourceControllerEffect(1)); diff --git a/Mage.Sets/src/mage/cards/b/BlinkmothUrn.java b/Mage.Sets/src/mage/cards/b/BlinkmothUrn.java index 167922f8419..b97c710c473 100644 --- a/Mage.Sets/src/mage/cards/b/BlinkmothUrn.java +++ b/Mage.Sets/src/mage/cards/b/BlinkmothUrn.java @@ -3,7 +3,7 @@ package mage.cards.b; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.condition.common.SourceTappedCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -29,8 +29,8 @@ public final class BlinkmothUrn extends CardImpl { // At the beginning of each player's precombat main phase, if Blinkmoth Urn is untapped, that player adds {C} for each artifact they control. this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfPreCombatMainTriggeredAbility(new BlinkmothUrnEffect(), TargetController.ANY, false), SourceTappedCondition.UNTAPPED, - "At the beginning of each player's precombat main phase, if {this} is untapped, that player adds {C} for each artifact they control." + new BeginningOfFirstMainTriggeredAbility(new BlinkmothUrnEffect(), TargetController.ANY, false), SourceTappedCondition.UNTAPPED, + "At the beginning of each player's first main phase, if {this} is untapped, that player adds {C} for each artifact they control." )); } diff --git a/Mage.Sets/src/mage/cards/b/BountyOfTheLuxa.java b/Mage.Sets/src/mage/cards/b/BountyOfTheLuxa.java index cad12b0c265..9725d2ff69b 100644 --- a/Mage.Sets/src/mage/cards/b/BountyOfTheLuxa.java +++ b/Mage.Sets/src/mage/cards/b/BountyOfTheLuxa.java @@ -3,7 +3,7 @@ package mage.cards.b; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -29,7 +29,7 @@ public final class BountyOfTheLuxa extends CardImpl { // At the beginning of your precombat main phase, remove all flood counters from Bounty of the Luxa. // If no counters were removed this way, put a flood counter on Bounty of the Luxa and draw a card. // Otherwise, add {C}{G}{U}. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility(new BountyOfTheLuxaEffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfFirstMainTriggeredAbility(new BountyOfTheLuxaEffect(), TargetController.YOU, false)); } private BountyOfTheLuxa(final BountyOfTheLuxa card) { diff --git a/Mage.Sets/src/mage/cards/b/BrazenCannonade.java b/Mage.Sets/src/mage/cards/b/BrazenCannonade.java index b07cf0ecde9..017724984cb 100644 --- a/Mage.Sets/src/mage/cards/b/BrazenCannonade.java +++ b/Mage.Sets/src/mage/cards/b/BrazenCannonade.java @@ -47,7 +47,7 @@ public final class BrazenCannonade extends CardImpl { new ExileTopXMayPlayUntilEffect( 1, Duration.UntilEndCombatOfYourNextTurn ), TargetController.YOU, false - ), RaidCondition.instance, "At the beginning of your postcombat main phase, " + + ), RaidCondition.instance, "At the beginning of each of your postcombat main phases, " + "if you attacked with a creature this turn, exile the top card of your library. " + "Until end of combat on your next turn, you may play that card." ); diff --git a/Mage.Sets/src/mage/cards/c/CabalTherapist.java b/Mage.Sets/src/mage/cards/c/CabalTherapist.java index c0d567885ec..2e607033f64 100644 --- a/Mage.Sets/src/mage/cards/c/CabalTherapist.java +++ b/Mage.Sets/src/mage/cards/c/CabalTherapist.java @@ -3,7 +3,7 @@ package mage.cards.c; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.effects.OneShotEffect; @@ -22,7 +22,6 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; -import mage.target.common.TargetControlledPermanent; import mage.util.CardUtil; import java.util.UUID; @@ -50,7 +49,7 @@ public final class CabalTherapist extends CardImpl { ); ability.addEffect(new CabalTherapistDiscardEffect()); ability.addTarget(new TargetPlayer()); - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new DoWhenCostPaid(ability, new SacrificeTargetCost(StaticFilters.FILTER_PERMANENT_CREATURE ), "Sacrifice a creature?"), TargetController.YOU, false )); diff --git a/Mage.Sets/src/mage/cards/c/ChancellorOfTheTangle.java b/Mage.Sets/src/mage/cards/c/ChancellorOfTheTangle.java index 05d4b270338..026c853e6ee 100644 --- a/Mage.Sets/src/mage/cards/c/ChancellorOfTheTangle.java +++ b/Mage.Sets/src/mage/cards/c/ChancellorOfTheTangle.java @@ -23,7 +23,7 @@ import mage.game.events.GameEvent.EventType; */ public final class ChancellorOfTheTangle extends CardImpl { - private static String abilityText = "at the beginning of your first main phase, add {G}"; + private static String abilityText = "at the beginning of your first main phase of the game, add {G}"; public ChancellorOfTheTangle(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}{G}"); diff --git a/Mage.Sets/src/mage/cards/c/CoalitionRelic.java b/Mage.Sets/src/mage/cards/c/CoalitionRelic.java index 685af10368e..e0eb3d3b8c7 100644 --- a/Mage.Sets/src/mage/cards/c/CoalitionRelic.java +++ b/Mage.Sets/src/mage/cards/c/CoalitionRelic.java @@ -3,7 +3,7 @@ package mage.cards.c; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.OneShotEffect; @@ -36,7 +36,7 @@ public final class CoalitionRelic extends CardImpl { // {tap}: Put a charge counter on Coalition Relic. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.CHARGE.createInstance(), true), new TapSourceCost())); // At the beginning of your precombat main phase, remove all charge counters from Coalition Relic. Add one mana of any color for each charge counter removed this way. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility(new CoalitionRelicEffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfFirstMainTriggeredAbility(new CoalitionRelicEffect(), TargetController.YOU, false)); } private CoalitionRelic(final CoalitionRelic card) { diff --git a/Mage.Sets/src/mage/cards/c/CrackInTime.java b/Mage.Sets/src/mage/cards/c/CrackInTime.java index 17d4c821e96..9e6536a1835 100644 --- a/Mage.Sets/src/mage/cards/c/CrackInTime.java +++ b/Mage.Sets/src/mage/cards/c/CrackInTime.java @@ -1,7 +1,7 @@ package mage.cards.c; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; import mage.abilities.keyword.VanishingAbility; @@ -29,9 +29,9 @@ public final class CrackInTime extends CardImpl { // When Crack in Time enters the battlefield and at the beginning of your precombat main phase, exile target creature an opponent controls until Crack in Time leaves the battlefield. Ability ability = new OrTriggeredAbility(Zone.BATTLEFIELD, new ExileUntilSourceLeavesEffect(), false, - "When {this} enters and at the beginning of your precombat main phase, ", + "When {this} enters and at the beginning of your first main phase, ", new EntersBattlefieldTriggeredAbility(null), - new BeginningOfPreCombatMainTriggeredAbility(null, TargetController.YOU, false) + new BeginningOfFirstMainTriggeredAbility(null, TargetController.YOU, false) ); ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/e/EladamrisVineyard.java b/Mage.Sets/src/mage/cards/e/EladamrisVineyard.java index 7b55b011584..6e874f01631 100644 --- a/Mage.Sets/src/mage/cards/e/EladamrisVineyard.java +++ b/Mage.Sets/src/mage/cards/e/EladamrisVineyard.java @@ -3,7 +3,7 @@ package mage.cards.e; import java.util.UUID; import mage.Mana; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -22,7 +22,7 @@ public final class EladamrisVineyard extends CardImpl { // At the beginning of each player's precombat main phase, add {G}{G} to that player's mana pool. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( Zone.BATTLEFIELD, new AddManaToManaPoolTargetControllerEffect(Mana.GreenMana(2), "that player's"), TargetController.ANY, false, true)); } diff --git a/Mage.Sets/src/mage/cards/e/Electrozoa.java b/Mage.Sets/src/mage/cards/e/Electrozoa.java index 8493eeb5511..e0ada9418eb 100644 --- a/Mage.Sets/src/mage/cards/e/Electrozoa.java +++ b/Mage.Sets/src/mage/cards/e/Electrozoa.java @@ -1,7 +1,7 @@ package mage.cards.e; import mage.MageInt; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.common.PayEnergyCost; import mage.abilities.effects.common.TapSourceUnlessPaysEffect; @@ -38,7 +38,7 @@ public final class Electrozoa extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(2))); // At the beginning of your precombat main phase, tap Electrozoa unless you pay {E}. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new TapSourceUnlessPaysEffect(new PayEnergyCost(1)), TargetController.YOU, false )); } diff --git a/Mage.Sets/src/mage/cards/e/ElementalResonance.java b/Mage.Sets/src/mage/cards/e/ElementalResonance.java index 51017e0df7f..ac76c39f4ff 100644 --- a/Mage.Sets/src/mage/cards/e/ElementalResonance.java +++ b/Mage.Sets/src/mage/cards/e/ElementalResonance.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.UUID; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.keyword.EnchantAbility; @@ -43,7 +43,7 @@ public final class ElementalResonance extends CardImpl { this.addAbility(ability); // At the beginning of your precombat main phase, add mana equal to enchanted permanent's mana cost. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility(new ElementalResonanceEffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfFirstMainTriggeredAbility(new ElementalResonanceEffect(), TargetController.YOU, false)); } private ElementalResonance(final ElementalResonance card) { diff --git a/Mage.Sets/src/mage/cards/f/FireglassMentor.java b/Mage.Sets/src/mage/cards/f/FireglassMentor.java index a0b9cd7e65f..b7f78dba8f9 100644 --- a/Mage.Sets/src/mage/cards/f/FireglassMentor.java +++ b/Mage.Sets/src/mage/cards/f/FireglassMentor.java @@ -2,7 +2,7 @@ package mage.cards.f; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPostCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfSecondMainTriggeredAbility; import mage.abilities.condition.common.OpponentsLostLifeCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.OneShotEffect; @@ -32,7 +32,7 @@ public final class FireglassMentor extends CardImpl { // At the beginning of your second main phase, if an opponent lost life this turn, exile the top two cards of your library. Choose one of them. Until end of turn, you may play that card. //TODO: Currently using postcombat main phase, change it (and most others) to second main phase - this.addAbility(new BeginningOfPostCombatMainTriggeredAbility( + this.addAbility(new BeginningOfSecondMainTriggeredAbility( new ConditionalOneShotEffect(new FireglassMentorEffect(), OpponentsLostLifeCondition.instance), TargetController.YOU, false)); } diff --git a/Mage.Sets/src/mage/cards/f/ForsakenThresher.java b/Mage.Sets/src/mage/cards/f/ForsakenThresher.java index 702ccc45023..61090d46ef3 100644 --- a/Mage.Sets/src/mage/cards/f/ForsakenThresher.java +++ b/Mage.Sets/src/mage/cards/f/ForsakenThresher.java @@ -1,7 +1,7 @@ package mage.cards.f; import mage.MageInt; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -24,7 +24,7 @@ public class ForsakenThresher extends CardImpl { this.nightCard = true; // At the beginning of your precombat main phase, add one mana of any color. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility(new AddManaOfAnyColorEffect(), TargetController.YOU, false)); + this.addAbility(new BeginningOfFirstMainTriggeredAbility(new AddManaOfAnyColorEffect(), TargetController.YOU, false)); } private ForsakenThresher(final ForsakenThresher card) { diff --git a/Mage.Sets/src/mage/cards/f/FourKnocks.java b/Mage.Sets/src/mage/cards/f/FourKnocks.java index 4aebcb4f8d0..5c2d887c1ee 100644 --- a/Mage.Sets/src/mage/cards/f/FourKnocks.java +++ b/Mage.Sets/src/mage/cards/f/FourKnocks.java @@ -1,6 +1,6 @@ package mage.cards.f; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.keyword.VanishingAbility; import mage.cards.CardImpl; @@ -22,7 +22,7 @@ public final class FourKnocks extends CardImpl { this.addAbility(new VanishingAbility(4)); // At the beginning of your precombat main phase, draw a card. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new DrawCardSourceControllerEffect(1), TargetController.YOU, false )); } diff --git a/Mage.Sets/src/mage/cards/h/HulkingRaptor.java b/Mage.Sets/src/mage/cards/h/HulkingRaptor.java index cbfa77c1f9a..a8a8535984d 100644 --- a/Mage.Sets/src/mage/cards/h/HulkingRaptor.java +++ b/Mage.Sets/src/mage/cards/h/HulkingRaptor.java @@ -2,7 +2,7 @@ package mage.cards.h; import mage.MageInt; import mage.Mana; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.keyword.WardAbility; @@ -30,7 +30,7 @@ public final class HulkingRaptor extends CardImpl { this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false)); // At the beginning of your precombat main phase, add {G}{G}. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new BasicManaEffect(Mana.GreenMana(2)), TargetController.YOU, false )); } diff --git a/Mage.Sets/src/mage/cards/k/KlothysGodOfDestiny.java b/Mage.Sets/src/mage/cards/k/KlothysGodOfDestiny.java index 6de5270844d..a2c145866dd 100644 --- a/Mage.Sets/src/mage/cards/k/KlothysGodOfDestiny.java +++ b/Mage.Sets/src/mage/cards/k/KlothysGodOfDestiny.java @@ -3,7 +3,7 @@ package mage.cards.k; import mage.MageInt; import mage.Mana; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.DevotionCount; import mage.abilities.effects.OneShotEffect; @@ -41,7 +41,7 @@ public final class KlothysGodOfDestiny extends CardImpl { .addHint(DevotionCount.RG.getHint())); // At the beginning of your precombat main phase, exile target card from a graveyard. If it was a land card, add {R} or {G}. Otherwise, you gain 2 life and Klothys deals 2 damage to each opponent. - Ability ability = new BeginningOfPreCombatMainTriggeredAbility( + Ability ability = new BeginningOfFirstMainTriggeredAbility( new KlothysGodOfDestinyEffect(), TargetController.YOU, false ); ability.addTarget(new TargetCardInGraveyard()); diff --git a/Mage.Sets/src/mage/cards/m/MagusOfTheVineyard.java b/Mage.Sets/src/mage/cards/m/MagusOfTheVineyard.java index d200a389a54..59cf834c141 100644 --- a/Mage.Sets/src/mage/cards/m/MagusOfTheVineyard.java +++ b/Mage.Sets/src/mage/cards/m/MagusOfTheVineyard.java @@ -4,7 +4,7 @@ package mage.cards.m; import java.util.UUID; import mage.MageInt; import mage.Mana; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.effects.mana.AddManaToManaPoolTargetControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +28,7 @@ public final class MagusOfTheVineyard extends CardImpl { this.toughness = new MageInt(1); // At the beginning of each player's precombat main phase, add {G}{G} to that player's mana pool. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( Zone.BATTLEFIELD, new AddManaToManaPoolTargetControllerEffect(Mana.GreenMana(2), "that player's"), TargetController.ANY, false, true)); } diff --git a/Mage.Sets/src/mage/cards/m/MuerraTrashTactician.java b/Mage.Sets/src/mage/cards/m/MuerraTrashTactician.java index 0d9170ec735..fbb1cc9baf4 100644 --- a/Mage.Sets/src/mage/cards/m/MuerraTrashTactician.java +++ b/Mage.Sets/src/mage/cards/m/MuerraTrashTactician.java @@ -1,7 +1,7 @@ package mage.cards.m; import mage.MageInt; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.ExpendTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; @@ -38,7 +38,7 @@ public final class MuerraTrashTactician extends CardImpl { this.toughness = new MageInt(4); // At the beginning of your first main phase, add {R} or {G} for each Raccoon you control. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new AddManaInAnyCombinationEffect(xValue, xValue, ColoredManaSymbol.R, ColoredManaSymbol.G) .setText("add {R} or {G} for each Raccoon you control"), TargetController.YOU, false diff --git a/Mage.Sets/src/mage/cards/o/OldOneEye.java b/Mage.Sets/src/mage/cards/o/OldOneEye.java index 73eda6a5d2c..dc9c44c2db3 100644 --- a/Mage.Sets/src/mage/cards/o/OldOneEye.java +++ b/Mage.Sets/src/mage/cards/o/OldOneEye.java @@ -1,7 +1,7 @@ package mage.cards.o; import mage.MageInt; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.DiscardTargetCost; @@ -45,7 +45,7 @@ public final class OldOneEye extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new Tyranid55Token()))); // Fast Healing -- At the beginning of your precombat main phase, you may discard two cards. If you do, return Old One Eye from your graveyard to your hand. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( Zone.GRAVEYARD, new DoIfCostPaid( new ReturnSourceFromGraveyardToHandEffect(), diff --git a/Mage.Sets/src/mage/cards/o/OmnathLocusOfAll.java b/Mage.Sets/src/mage/cards/o/OmnathLocusOfAll.java index 0e23153b28b..f89e84e077d 100644 --- a/Mage.Sets/src/mage/cards/o/OmnathLocusOfAll.java +++ b/Mage.Sets/src/mage/cards/o/OmnathLocusOfAll.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.Mana; import mage.ObjectColor; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCost; import mage.abilities.effects.ContinuousEffectImpl; @@ -36,7 +36,7 @@ public class OmnathLocusOfAll extends CardImpl { // At the beginning of your precombat main phase, look at the top card of your library. You may reveal that card // if it has three or more colored mana symbols in its mana cost. If you do, add three mana in any combination of // colors and put it into your hand. If you don’t reveal it, put it into your hand. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new OmnathLocusOfAllCardEffect(), TargetController.YOU, false )); } diff --git a/Mage.Sets/src/mage/cards/p/PartyThrasher.java b/Mage.Sets/src/mage/cards/p/PartyThrasher.java index b9fb6fbd44c..5d7c5f077b6 100644 --- a/Mage.Sets/src/mage/cards/p/PartyThrasher.java +++ b/Mage.Sets/src/mage/cards/p/PartyThrasher.java @@ -2,7 +2,7 @@ package mage.cards.p; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.DiscardCardCost; import mage.abilities.effects.OneShotEffect; @@ -53,7 +53,7 @@ public final class PartyThrasher extends CardImpl { )); // At the beginning of your precombat main phase, you may discard a card. If you do, exile the top two cards of your library, then choose one of them. You may play that card this turn. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new DoIfCostPaid( new PartyThrasherEffect(), new DiscardCardCost() diff --git a/Mage.Sets/src/mage/cards/p/PlasmCapture.java b/Mage.Sets/src/mage/cards/p/PlasmCapture.java index fa7469c4ce8..bf5a6d6e8d7 100644 --- a/Mage.Sets/src/mage/cards/p/PlasmCapture.java +++ b/Mage.Sets/src/mage/cards/p/PlasmCapture.java @@ -44,7 +44,7 @@ class PlasmCaptureCounterEffect extends OneShotEffect { PlasmCaptureCounterEffect() { super(Outcome.Benefit); - this.staticText = "Counter target spell. At the beginning of your next precombat main phase, add X mana in any combination of colors, where X is that spell's mana value"; + this.staticText = "Counter target spell. At the beginning of your next first main phase, add X mana in any combination of colors, where X is that spell's mana value"; } private PlasmCaptureCounterEffect(final PlasmCaptureCounterEffect effect) { diff --git a/Mage.Sets/src/mage/cards/r/RipplesOfUndeath.java b/Mage.Sets/src/mage/cards/r/RipplesOfUndeath.java index e59522fc3df..4ac55d22899 100644 --- a/Mage.Sets/src/mage/cards/r/RipplesOfUndeath.java +++ b/Mage.Sets/src/mage/cards/r/RipplesOfUndeath.java @@ -1,7 +1,7 @@ package mage.cards.r; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.costs.Costs; import mage.abilities.costs.CostsImpl; import mage.abilities.costs.common.PayLifeCost; @@ -32,7 +32,7 @@ public final class RipplesOfUndeath extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}"); // At the beginning of your precombat main phase, mill three cards. Then you may pay {1} and 3 life. If you do, put a card from among those cards into your hand. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new RipplesOfUndeathEffect(), TargetController.YOU, false )); } @@ -123,4 +123,4 @@ class RipplesOfUndeathReturnEffect extends OneShotEffect { controller.moveCards(returned, Zone.HAND, source, game); return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/s/SanctumOfCalmWaters.java b/Mage.Sets/src/mage/cards/s/SanctumOfCalmWaters.java index 1cc3ff7d464..eccd8190ae5 100644 --- a/Mage.Sets/src/mage/cards/s/SanctumOfCalmWaters.java +++ b/Mage.Sets/src/mage/cards/s/SanctumOfCalmWaters.java @@ -1,7 +1,7 @@ package mage.cards.s; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.discard.DiscardControllerEffect; @@ -37,7 +37,7 @@ public final class SanctumOfCalmWaters extends CardImpl { this.subtype.add(SubType.SHRINE); // At the beginning of your precombat main phase, you may draw X cards, where X is the number of Shrines you control. If you do, discard a card. - Ability ability = new BeginningOfPreCombatMainTriggeredAbility(new DrawCardSourceControllerEffect(xValue) + Ability ability = new BeginningOfFirstMainTriggeredAbility(new DrawCardSourceControllerEffect(xValue) .setText("you may draw X cards, where X is the number of Shrines you control"), TargetController.YOU, true) .addHint(new ValueHint("Shrines you control", xValue)); diff --git a/Mage.Sets/src/mage/cards/s/SanctumOfFruitfulHarvest.java b/Mage.Sets/src/mage/cards/s/SanctumOfFruitfulHarvest.java index cfde67e9659..a8731d7fffd 100644 --- a/Mage.Sets/src/mage/cards/s/SanctumOfFruitfulHarvest.java +++ b/Mage.Sets/src/mage/cards/s/SanctumOfFruitfulHarvest.java @@ -1,7 +1,7 @@ package mage.cards.s; import mage.Mana; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.mana.DynamicManaEffect; import mage.abilities.hint.ValueHint; @@ -36,7 +36,7 @@ public final class SanctumOfFruitfulHarvest extends CardImpl { this.subtype.add(SubType.SHRINE); // At the beginning of your precombat main phase, add X mana of any one color, where X is the number of Shrines you control. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new DynamicManaEffect( Mana.AnyMana(1), xValue, diff --git a/Mage.Sets/src/mage/cards/s/SanctumOfStoneFangs.java b/Mage.Sets/src/mage/cards/s/SanctumOfStoneFangs.java index fa01f30919b..ba285436409 100644 --- a/Mage.Sets/src/mage/cards/s/SanctumOfStoneFangs.java +++ b/Mage.Sets/src/mage/cards/s/SanctumOfStoneFangs.java @@ -1,7 +1,7 @@ package mage.cards.s; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect; @@ -37,7 +37,7 @@ public final class SanctumOfStoneFangs extends CardImpl { this.subtype.add(SubType.SHRINE); // At the beginning of your precombat main phase, each opponent loses X life and you gain X life, where X is the number of Shrines you control. - Ability ability = new BeginningOfPreCombatMainTriggeredAbility( + Ability ability = new BeginningOfFirstMainTriggeredAbility( new LoseLifeOpponentsEffect(xValue).setText("each opponent loses X life"), TargetController.YOU, false) .addHint(new ValueHint("Shrines you control", xValue)); diff --git a/Mage.Sets/src/mage/cards/s/StaticPrison.java b/Mage.Sets/src/mage/cards/s/StaticPrison.java index 96284bd5da1..a5675164dce 100644 --- a/Mage.Sets/src/mage/cards/s/StaticPrison.java +++ b/Mage.Sets/src/mage/cards/s/StaticPrison.java @@ -1,7 +1,7 @@ package mage.cards.s; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.common.PayEnergyCost; import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; @@ -31,7 +31,7 @@ public final class StaticPrison extends CardImpl { this.addAbility(ability); // At the beginning of your precombat main phase, sacrifice Static Prison unless you pay {E}. - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new SacrificeSourceUnlessPaysEffect(new PayEnergyCost(1)), TargetController.YOU, false )); } diff --git a/Mage.Sets/src/mage/cards/t/ThousandMoonsSmithy.java b/Mage.Sets/src/mage/cards/t/ThousandMoonsSmithy.java index 112ba0a0071..78e74da48d1 100644 --- a/Mage.Sets/src/mage/cards/t/ThousandMoonsSmithy.java +++ b/Mage.Sets/src/mage/cards/t/ThousandMoonsSmithy.java @@ -1,6 +1,6 @@ package mage.cards.t; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.effects.common.CreateTokenEffect; @@ -47,7 +47,7 @@ public final class ThousandMoonsSmithy extends CardImpl { // At the beginning of your precombat main phase, you may tap five untapped artifacts and/or creatures you control. If you do, transform Thousand Moons Smithy. this.addAbility(new TransformAbility()); - this.addAbility(new BeginningOfPreCombatMainTriggeredAbility( + this.addAbility(new BeginningOfFirstMainTriggeredAbility( new DoIfCostPaid( new TransformSourceEffect(), new TapTargetCost(new TargetControlledPermanent(5, filter)) diff --git a/Mage.Sets/src/mage/cards/v/VentifactBottle.java b/Mage.Sets/src/mage/cards/v/VentifactBottle.java index 75a07de6752..90521bfa0dc 100644 --- a/Mage.Sets/src/mage/cards/v/VentifactBottle.java +++ b/Mage.Sets/src/mage/cards/v/VentifactBottle.java @@ -5,7 +5,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.TriggeredAbility; import mage.abilities.common.ActivateAsSorceryActivatedAbility; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; @@ -41,10 +41,10 @@ public final class VentifactBottle extends CardImpl { ability.addCost(new TapSourceCost()); this.addAbility(ability); // At the beginning of your precombat main phase, if Ventifact Bottle has a charge counter on it, tap it and remove all charge counters from it. Add {C} for each charge counter removed this way. - TriggeredAbility ability2 = new BeginningOfPreCombatMainTriggeredAbility(new VentifactBottleEffect(), TargetController.YOU, false); + TriggeredAbility ability2 = new BeginningOfFirstMainTriggeredAbility(new VentifactBottleEffect(), TargetController.YOU, false); this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability2, new SourceHasCounterCondition(CounterType.CHARGE, 1, Integer.MAX_VALUE), - "At the beginning of your precombat main phase, " + "At the beginning of your first main phase, " + "if {this} has a charge counter on it, tap it and remove all charge counters from it. " + "Add {C} for each charge counter removed this way.")); } diff --git a/Mage.Sets/src/mage/cards/w/WorldAtWar.java b/Mage.Sets/src/mage/cards/w/WorldAtWar.java index e87984fff42..232d520d917 100644 --- a/Mage.Sets/src/mage/cards/w/WorldAtWar.java +++ b/Mage.Sets/src/mage/cards/w/WorldAtWar.java @@ -49,7 +49,7 @@ class WorldAtWarEffect extends OneShotEffect { WorldAtWarEffect() { super(Outcome.Benefit); - staticText = "After the first postcombat main phase this turn, there's an additional combat phase followed by an additional main phase. At the beginning of that combat, untap all creatures that attacked this turn"; + staticText = "After the second main phase this turn, there's an additional combat phase followed by an additional main phase. At the beginning of that combat, untap all creatures that attacked this turn"; } private WorldAtWarEffect(final WorldAtWarEffect effect) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SurvivalTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SurvivalTest.java new file mode 100644 index 00000000000..25b05dd767c --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SurvivalTest.java @@ -0,0 +1,84 @@ +package org.mage.test.cards.abilities.keywords; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author TheElk801 + */ +public class SurvivalTest extends CardTestPlayerBase { + + private static final String survivor = "Cautious Survivor"; + + @Test + public void testRegularNoAttack() { + addCard(Zone.BATTLEFIELD, playerA, survivor); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 20 + 0); + assertLife(playerB, 20 - 0); + assertTapped(survivor, false); + } + + @Test + public void testRegularAttack() { + addCard(Zone.BATTLEFIELD, playerA, survivor); + + attack(1, playerA, survivor); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 20 + 2); + assertLife(playerB, 20 - 4); + assertTapped(survivor, true); + } + + private static final String assault = "Relentless Assault"; + + @Test + public void testExtraMainPhase() { + addCard(Zone.HAND, playerA, assault); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); + addCard(Zone.BATTLEFIELD, playerA, survivor); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, assault); + attack(1, playerA, survivor); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 20 + 2); + assertLife(playerB, 20 - 4); + assertTapped(survivor, true); + } + + private static final String courage = "Ornamental Courage"; + + @Test + public void testUntap() { + addCard(Zone.HAND, playerA, courage); + addCard(Zone.BATTLEFIELD, playerA, "Forest"); + addCard(Zone.BATTLEFIELD, playerA, survivor); + + attack(1, playerA, survivor); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, courage, survivor); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 20 + 0); + assertLife(playerB, 20 - 4); + assertTapped(survivor, false); + assertPowerToughness(playerA, survivor, 4 + 1, 4 + 3); + } +} diff --git a/Mage/src/main/java/mage/abilities/abilityword/SurvivalAbility.java b/Mage/src/main/java/mage/abilities/abilityword/SurvivalAbility.java index 74b504a54eb..038e6bc7b07 100644 --- a/Mage/src/main/java/mage/abilities/abilityword/SurvivalAbility.java +++ b/Mage/src/main/java/mage/abilities/abilityword/SurvivalAbility.java @@ -1,28 +1,26 @@ package mage.abilities.abilityword; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BeginningOfSecondMainTriggeredAbility; import mage.abilities.effects.Effect; import mage.constants.AbilityWord; +import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import java.util.Optional; /** - * TODO: This should only trigger on the second main phase, this is part of a larger refactor that has to be done - * * @author TheElk801 */ -public class SurvivalAbility extends TriggeredAbilityImpl { +public class SurvivalAbility extends BeginningOfSecondMainTriggeredAbility { public SurvivalAbility(Effect effect) { this(effect, false); } public SurvivalAbility(Effect effect, boolean optional) { - super(Zone.BATTLEFIELD, effect, optional); + super(Zone.BATTLEFIELD, effect, TargetController.YOU, optional, false); setTriggerPhrase("At the beginning of your second main phase, if {this} is tapped, "); setAbilityWord(AbilityWord.SURVIVAL); } @@ -36,20 +34,10 @@ public class SurvivalAbility extends TriggeredAbilityImpl { return new SurvivalAbility(this); } - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.POSTCOMBAT_MAIN_PHASE_PRE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return game.isActivePlayer(getControllerId()); - } - @Override public boolean checkInterveningIfClause(Game game) { return Optional - .ofNullable(getSourcePermanentIfItStillExists(game)) + .ofNullable(getSourcePermanentOrLKI(game)) .map(Permanent::isTapped) .orElse(false); } diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfPreCombatMainTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfFirstMainTriggeredAbility.java similarity index 74% rename from Mage/src/main/java/mage/abilities/common/BeginningOfPreCombatMainTriggeredAbility.java rename to Mage/src/main/java/mage/abilities/common/BeginningOfFirstMainTriggeredAbility.java index 94bdcffc3fb..773a9afe92e 100644 --- a/Mage/src/main/java/mage/abilities/common/BeginningOfPreCombatMainTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BeginningOfFirstMainTriggeredAbility.java @@ -12,31 +12,31 @@ import mage.target.targetpointer.FixedTarget; * @author LevelX2 */ -public class BeginningOfPreCombatMainTriggeredAbility extends TriggeredAbilityImpl { +public class BeginningOfFirstMainTriggeredAbility extends TriggeredAbilityImpl { private TargetController targetController; private boolean setTargetPointer; - public BeginningOfPreCombatMainTriggeredAbility(Effect effect, TargetController targetController, boolean isOptional) { + public BeginningOfFirstMainTriggeredAbility(Effect effect, TargetController targetController, boolean isOptional) { this(Zone.BATTLEFIELD, effect, targetController, isOptional, false); } - public BeginningOfPreCombatMainTriggeredAbility(Zone zone, Effect effect, TargetController targetController, boolean isOptional, boolean setTargetPointer) { + public BeginningOfFirstMainTriggeredAbility(Zone zone, Effect effect, TargetController targetController, boolean isOptional, boolean setTargetPointer) { super(zone, effect, isOptional); this.targetController = targetController; this.setTargetPointer = setTargetPointer; setTriggerPhrase(generateTriggerPhrase()); } - protected BeginningOfPreCombatMainTriggeredAbility(final BeginningOfPreCombatMainTriggeredAbility ability) { + protected BeginningOfFirstMainTriggeredAbility(final BeginningOfFirstMainTriggeredAbility ability) { super(ability); this.targetController = ability.targetController; this.setTargetPointer = ability.setTargetPointer; } @Override - public BeginningOfPreCombatMainTriggeredAbility copy() { - return new BeginningOfPreCombatMainTriggeredAbility(this); + public BeginningOfFirstMainTriggeredAbility copy() { + return new BeginningOfFirstMainTriggeredAbility(this); } @Override @@ -81,11 +81,11 @@ public class BeginningOfPreCombatMainTriggeredAbility extends TriggeredAbilityIm private String generateTriggerPhrase() { switch (targetController) { case YOU: - return "At the beginning of your precombat main phase, " + generateZoneString(); + return "At the beginning of your first main phase, " + generateZoneString(); case OPPONENT: - return "At the beginning of each opponent's precombat main phase, " + generateZoneString(); + return "At the beginning of each opponent's first main phase, " + generateZoneString(); case ANY: - return "At the beginning of each player's precombat main phase, " + generateZoneString(); + return "At the beginning of each player's first main phase, " + generateZoneString(); } return ""; } diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfPostCombatMainTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfPostCombatMainTriggeredAbility.java index db6062e187d..229e868e969 100644 --- a/Mage/src/main/java/mage/abilities/common/BeginningOfPostCombatMainTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BeginningOfPostCombatMainTriggeredAbility.java @@ -48,25 +48,25 @@ public class BeginningOfPostCombatMainTriggeredAbility extends TriggeredAbilityI public boolean checkTrigger(GameEvent event, Game game) { switch (targetController) { case YOU: - boolean yours = event.getPlayerId().equals(this.controllerId); - if (yours && setTargetPointer) { - if (getTargets().isEmpty()) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getPlayerId())); - } + if (!isControlledBy(event.getPlayerId())) { + return false; + } + if (setTargetPointer && getTargets().isEmpty()) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getPlayerId())); } } - return yours; + return true; case OPPONENT: - if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) { - if (setTargetPointer) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getPlayerId())); - } - } - return true; + if (!game.getOpponents(this.controllerId).contains(event.getPlayerId())) { + return false; } - break; + if (setTargetPointer) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getPlayerId())); + } + } + return true; case ANY: if (setTargetPointer) { for (Effect effect : this.getEffects()) { @@ -77,7 +77,7 @@ public class BeginningOfPostCombatMainTriggeredAbility extends TriggeredAbilityI case ENCHANTED: Permanent permanent = getSourcePermanentIfItStillExists(game); if (permanent == null || !game.isActivePlayer(permanent.getAttachedTo())) { - break; + return false; } if (getTargets().isEmpty()) { this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId())); @@ -90,13 +90,13 @@ public class BeginningOfPostCombatMainTriggeredAbility extends TriggeredAbilityI private String generateTriggerPhrase() { switch (targetController) { case YOU: - return "At the beginning of your postcombat main phase, " + generateZoneString(); + return "At the beginning of each of your postcombat main phases, " + generateZoneString(); case OPPONENT: - return "At the beginning of each opponent's postcombat main phase, " + generateZoneString(); + return "At the beginning of each of your opponent's postcombat main phases, " + generateZoneString(); case ANY: - return "At the beginning of each player's postcombat main phase, " + generateZoneString(); + return "At the beginning of each postcombat main phase, " + generateZoneString(); case ENCHANTED: - return "At the beginning of enchanted player's postcombat main phase, " + generateZoneString(); + return "At the beginning of each of enchanted player's postcombat main phases, " + generateZoneString(); } return ""; } diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfSecondMainTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfSecondMainTriggeredAbility.java new file mode 100644 index 00000000000..9db49f58cbf --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/BeginningOfSecondMainTriggeredAbility.java @@ -0,0 +1,153 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.TargetController; +import mage.constants.WatcherScope; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; +import mage.watchers.Watcher; + +/** + * @author TheElk801 + */ +public class BeginningOfSecondMainTriggeredAbility extends TriggeredAbilityImpl { + + private TargetController targetController; + private boolean setTargetPointer; + + public BeginningOfSecondMainTriggeredAbility(Effect effect, TargetController targetController, boolean isOptional) { + this(Zone.BATTLEFIELD, effect, targetController, isOptional, false); + } + + public BeginningOfSecondMainTriggeredAbility(Zone zone, Effect effect, TargetController targetController, boolean isOptional, boolean setTargetPointer) { + super(zone, effect, isOptional); + this.targetController = targetController; + this.setTargetPointer = setTargetPointer; + setTriggerPhrase(generateTriggerPhrase()); + this.addWatcher(new MainPhaseWatcher()); + } + + protected BeginningOfSecondMainTriggeredAbility(final BeginningOfSecondMainTriggeredAbility ability) { + super(ability); + this.targetController = ability.targetController; + this.setTargetPointer = ability.setTargetPointer; + } + + @Override + public BeginningOfSecondMainTriggeredAbility copy() { + return new BeginningOfSecondMainTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + switch (event.getType()) { + case PRECOMBAT_MAIN_PHASE_PRE: + case POSTCOMBAT_MAIN_PHASE_PRE: + return true; + } + return false; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (!MainPhaseWatcher.checkCount(game)) { + return false; + } + switch (targetController) { + case YOU: + if (!isControlledBy(event.getPlayerId())) { + return false; + } + if (setTargetPointer && getTargets().isEmpty()) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getPlayerId())); + } + } + return true; + case OPPONENT: + if (!game.getOpponents(this.controllerId).contains(event.getPlayerId())) { + return false; + } + if (setTargetPointer) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getPlayerId())); + } + } + return true; + case ANY: + if (setTargetPointer) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getPlayerId())); + } + } + return true; + case ENCHANTED: + Permanent permanent = getSourcePermanentIfItStillExists(game); + if (permanent == null || !game.isActivePlayer(permanent.getAttachedTo())) { + return false; + } + if (getTargets().isEmpty()) { + this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId())); + } + return true; + } + return false; + } + + private String generateTriggerPhrase() { + switch (targetController) { + case YOU: + return "At the beginning of your second main phase, " + generateZoneString(); + case OPPONENT: + return "At the beginning of each opponent's second main phase, " + generateZoneString(); + case ANY: + return "At the beginning of each player's second main phase, " + generateZoneString(); + case ENCHANTED: + return "At the beginning of enchanted player's second main phase, " + generateZoneString(); + } + return ""; + } + + private String generateZoneString() { + switch (getZone()) { + case GRAVEYARD: + return "if {this} is in your graveyard, "; + } + return ""; + } +} + +class MainPhaseWatcher extends Watcher { + + private int mainPhaseCount = 0; + + MainPhaseWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + switch (event.getType()) { + case PRECOMBAT_MAIN_PHASE_PRE: + case POSTCOMBAT_MAIN_PHASE_PRE: + mainPhaseCount++; + } + } + + @Override + public void reset() { + super.reset(); + this.mainPhaseCount = 0; + } + + static boolean checkCount(Game game) { + return game + .getState() + .getWatcher(MainPhaseWatcher.class) + .mainPhaseCount == 2; + } +} diff --git a/Mage/src/main/java/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java index 6cb1fed1c0e..1ea34e5ecd9 100644 --- a/Mage/src/main/java/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java @@ -17,7 +17,7 @@ public class AtTheBeginOfMainPhaseDelayedTriggeredAbility extends DelayedTrigger public enum PhaseSelection { - NEXT_PRECOMBAT_MAIN("next precombat main phase"), + NEXT_PRECOMBAT_MAIN("next first main phase"), NEXT_POSTCOMBAT_MAIN("next postcombat main phase"), NEXT_MAIN("next main phase"), NEXT_MAIN_THIS_TURN("next main phase this turn", Duration.EndOfTurn); diff --git a/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java b/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java index 8202226d44c..ba754e0e97e 100644 --- a/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/RadiationEmblem.java @@ -1,7 +1,7 @@ package mage.game.command.emblems; import mage.abilities.Ability; -import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.BeginningOfFirstMainTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -31,7 +31,7 @@ public class RadiationEmblem extends Emblem { this.frameStyle = FrameStyle.M15_NORMAL; this.getAbilities().add(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfPreCombatMainTriggeredAbility(Zone.ALL, new RadiationEffect(), TargetController.YOU, false, false), + new BeginningOfFirstMainTriggeredAbility(Zone.ALL, new RadiationEffect(), TargetController.YOU, false, false), RadiationCondition.instance, "At the beginning of your precombat main phase, if you have any rad counters, " + "mill that many cards. For each nonland card milled this way, you lose 1 life and a rad counter." @@ -112,4 +112,4 @@ class RadiationEffect extends OneShotEffect { } return true; } -} \ No newline at end of file +}