From 43bf34613da1a8f9967aeecbe504c7e4d016f09f Mon Sep 17 00:00:00 2001 From: LoneFox Date: Sat, 12 Sep 2015 19:27:42 +0300 Subject: [PATCH] Combine Final Fortune's effect into AddExtraTurnControllerEffect. Implement cards: Last Chance and Warrior's Oath --- .../sets/masterseditioniv/LastChance.java | 58 +++++++++ .../src/mage/sets/portal/LastChance.java | 52 ++++++++ .../portalthreekingdoms/WarriorsOath.java | 58 +++++++++ .../sets/seventhedition/FinalFortune.java | 114 +----------------- .../src/mage/sets/starter1999/LastChance.java | 52 ++++++++ .../turn/AddExtraTurnControllerEffect.java | 69 ++++++++++- 6 files changed, 288 insertions(+), 115 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/masterseditioniv/LastChance.java create mode 100644 Mage.Sets/src/mage/sets/portal/LastChance.java create mode 100644 Mage.Sets/src/mage/sets/portalthreekingdoms/WarriorsOath.java create mode 100644 Mage.Sets/src/mage/sets/starter1999/LastChance.java diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/LastChance.java b/Mage.Sets/src/mage/sets/masterseditioniv/LastChance.java new file mode 100644 index 0000000000..1dc88330db --- /dev/null +++ b/Mage.Sets/src/mage/sets/masterseditioniv/LastChance.java @@ -0,0 +1,58 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.masterseditioniv; + +import java.util.UUID; +import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class LastChance extends CardImpl { + + public LastChance(UUID ownerId) { + super(ownerId, 125, "Last Chance", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{R}{R}"); + this.expansionSetCode = "ME4"; + + // Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. + this.getSpellAbility().addEffect(new AddExtraTurnControllerEffect(true)); + } + + public LastChance(final LastChance card) { + super(card); + } + + @Override + public LastChance copy() { + return new LastChance(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portal/LastChance.java b/Mage.Sets/src/mage/sets/portal/LastChance.java new file mode 100644 index 0000000000..629b96cd8e --- /dev/null +++ b/Mage.Sets/src/mage/sets/portal/LastChance.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.portal; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class LastChance extends mage.sets.masterseditioniv.LastChance { + + public LastChance(UUID ownerId) { + super(ownerId); + this.cardNumber = 141; + this.expansionSetCode = "POR"; + } + + public LastChance(final LastChance card) { + super(card); + } + + @Override + public LastChance copy() { + return new LastChance(this); + } +} diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/WarriorsOath.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/WarriorsOath.java new file mode 100644 index 0000000000..99f7170b29 --- /dev/null +++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/WarriorsOath.java @@ -0,0 +1,58 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.portalthreekingdoms; + +import java.util.UUID; +import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LoneFox + */ +public class WarriorsOath extends CardImpl { + + public WarriorsOath(UUID ownerId) { + super(ownerId, 124, "Warrior's Oath", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{R}{R}"); + this.expansionSetCode = "PTK"; + + // Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. + this.getSpellAbility().addEffect(new AddExtraTurnControllerEffect(true)); + } + + public WarriorsOath(final WarriorsOath card) { + super(card); + } + + @Override + public WarriorsOath copy() { + return new WarriorsOath(this); + } +} diff --git a/Mage.Sets/src/mage/sets/seventhedition/FinalFortune.java b/Mage.Sets/src/mage/sets/seventhedition/FinalFortune.java index 14f568597d..128b12bccd 100644 --- a/Mage.Sets/src/mage/sets/seventhedition/FinalFortune.java +++ b/Mage.Sets/src/mage/sets/seventhedition/FinalFortune.java @@ -28,19 +28,10 @@ package mage.sets.seventhedition; import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.DelayedTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; import mage.cards.CardImpl; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.Rarity; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.turn.TurnMod; -import mage.players.Player; /** * @@ -52,9 +43,8 @@ public class FinalFortune extends CardImpl { super(ownerId, 182, "Final Fortune", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{R}{R}"); this.expansionSetCode = "7ED"; - // Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. - this.getSpellAbility().addEffect(new FinalFortuneEffect()); + this.getSpellAbility().addEffect(new AddExtraTurnControllerEffect(true)); } public FinalFortune(final FinalFortune card) { @@ -66,103 +56,3 @@ public class FinalFortune extends CardImpl { return new FinalFortune(this); } } - -class FinalFortuneEffect extends OneShotEffect { - - public FinalFortuneEffect() { - super(Outcome.AIDontUseIt); - this.staticText = "Take an extra turn after this one. At the beginning of that turn's end step, you lose the game."; - } - - public FinalFortuneEffect(final FinalFortuneEffect effect) { - super(effect); - } - - @Override - public FinalFortuneEffect copy() { - return new FinalFortuneEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - // Take an extra turn after this one - TurnMod extraTurn = new TurnMod(source.getControllerId(), false); - game.getState().getTurnMods().add(extraTurn); - - FinalFortuneLoseDelayedTriggeredAbility delayedTriggeredAbility = new FinalFortuneLoseDelayedTriggeredAbility(); - delayedTriggeredAbility.setSourceId(source.getSourceId()); - delayedTriggeredAbility.setControllerId(source.getControllerId()); - delayedTriggeredAbility.setConnectedTurnMod(extraTurn.getId()); - game.addDelayedTriggeredAbility(delayedTriggeredAbility); - - return true; - } - -} - -class FinalFortuneLoseDelayedTriggeredAbility extends DelayedTriggeredAbility { - - private UUID connectedTurnMod; - - public FinalFortuneLoseDelayedTriggeredAbility() { - super(new FinalFortuneLoseEffect(), Duration.EndOfGame); - } - - public FinalFortuneLoseDelayedTriggeredAbility(final FinalFortuneLoseDelayedTriggeredAbility ability) { - super(ability); - this.connectedTurnMod = ability.connectedTurnMod; - } - - @Override - public FinalFortuneLoseDelayedTriggeredAbility copy() { - return new FinalFortuneLoseDelayedTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.END_TURN_STEP_PRE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return connectedTurnMod != null && connectedTurnMod.equals(game.getState().getTurnId()); - } - - public void setConnectedTurnMod(UUID connectedTurnMod) { - this.connectedTurnMod = connectedTurnMod; - } - - @Override - public String getRule() { - return "At the beginning of that turn's end step, you lose the game"; - } - -} - -class FinalFortuneLoseEffect extends OneShotEffect { - - public FinalFortuneLoseEffect() { - super(Outcome.Detriment); - this.staticText = "You lose the game"; - } - - public FinalFortuneLoseEffect(final FinalFortuneLoseEffect effect) { - super(effect); - } - - @Override - public FinalFortuneLoseEffect copy() { - return new FinalFortuneLoseEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - player.lost(game); - return true; - } - return false; - } - -} diff --git a/Mage.Sets/src/mage/sets/starter1999/LastChance.java b/Mage.Sets/src/mage/sets/starter1999/LastChance.java new file mode 100644 index 0000000000..57860b5a28 --- /dev/null +++ b/Mage.Sets/src/mage/sets/starter1999/LastChance.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.starter1999; + +import java.util.UUID; + +/** + * + * @author LoneFox + */ +public class LastChance extends mage.sets.masterseditioniv.LastChance { + + public LastChance(UUID ownerId) { + super(ownerId); + this.cardNumber = 110; + this.expansionSetCode = "S99"; + } + + public LastChance(final LastChance card) { + super(card); + } + + @Override + public LastChance copy() { + return new LastChance(this); + } +} diff --git a/Mage/src/mage/abilities/effects/common/turn/AddExtraTurnControllerEffect.java b/Mage/src/mage/abilities/effects/common/turn/AddExtraTurnControllerEffect.java index a1fcdcf0bf..9b08d1d361 100644 --- a/Mage/src/mage/abilities/effects/common/turn/AddExtraTurnControllerEffect.java +++ b/Mage/src/mage/abilities/effects/common/turn/AddExtraTurnControllerEffect.java @@ -27,10 +27,16 @@ */ package mage.abilities.effects.common.turn; +import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.LoseGameSourceControllerEffect; +import mage.constants.Duration; import mage.constants.Outcome; import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; import mage.game.turn.TurnMod; import mage.players.Player; @@ -39,13 +45,24 @@ import mage.players.Player; */ public class AddExtraTurnControllerEffect extends OneShotEffect { + private final boolean loseGameAtEnd; + public AddExtraTurnControllerEffect() { - super(Outcome.ExtraTurn); + this(false); + } + + public AddExtraTurnControllerEffect(boolean loseGameAtEnd) { + super(loseGameAtEnd ? Outcome.AIDontUseIt : Outcome.ExtraTurn); + this.loseGameAtEnd = loseGameAtEnd; staticText = "Take an extra turn after this one"; + if(loseGameAtEnd) { + staticText += ". At the beginning of that turn's end step, you lose the game"; + } } public AddExtraTurnControllerEffect(final AddExtraTurnControllerEffect effect) { super(effect); + this.loseGameAtEnd = effect.loseGameAtEnd; } @Override @@ -57,9 +74,55 @@ public class AddExtraTurnControllerEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - game.getState().getTurnMods().add(new TurnMod(player.getId(), false)); + TurnMod extraTurn = new TurnMod(player.getId(), false); + game.getState().getTurnMods().add(extraTurn); + if(loseGameAtEnd) { + LoseGameDelayedTriggeredAbility delayedTriggeredAbility = new LoseGameDelayedTriggeredAbility(); + delayedTriggeredAbility.setSourceId(source.getSourceId()); + delayedTriggeredAbility.setControllerId(source.getControllerId()); + delayedTriggeredAbility.setConnectedTurnMod(extraTurn.getId()); + game.addDelayedTriggeredAbility(delayedTriggeredAbility); + } } return true; } -} \ No newline at end of file +} + +class LoseGameDelayedTriggeredAbility extends DelayedTriggeredAbility { + + private UUID connectedTurnMod; + + public LoseGameDelayedTriggeredAbility() { + super(new LoseGameSourceControllerEffect(), Duration.EndOfGame); + } + + public LoseGameDelayedTriggeredAbility(final LoseGameDelayedTriggeredAbility ability) { + super(ability); + this.connectedTurnMod = ability.connectedTurnMod; + } + + @Override + public LoseGameDelayedTriggeredAbility copy() { + return new LoseGameDelayedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.END_TURN_STEP_PRE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return connectedTurnMod != null && connectedTurnMod.equals(game.getState().getTurnId()); + } + + public void setConnectedTurnMod(UUID connectedTurnMod) { + this.connectedTurnMod = connectedTurnMod; + } + + @Override + public String getRule() { + return "At the beginning of that turn's end step, you lose the game"; + } +}