From bd60011f6006856fa4d0945750bf282e4ed44d54 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 15 Oct 2012 23:14:04 +0200 Subject: [PATCH] [RTR] 4 cards --- .../sets/returntoravnica/AzorsElocutors.java | 108 ++++++++++ .../returntoravnica/CollectiveBlessing.java | 64 ++++++ .../returntoravnica/TabletOfTheGuilds.java | 158 +++++++++++++++ .../sets/returntoravnica/VolatileRig.java | 189 ++++++++++++++++++ 4 files changed, 519 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/returntoravnica/AzorsElocutors.java create mode 100644 Mage.Sets/src/mage/sets/returntoravnica/CollectiveBlessing.java create mode 100644 Mage.Sets/src/mage/sets/returntoravnica/TabletOfTheGuilds.java create mode 100644 Mage.Sets/src/mage/sets/returntoravnica/VolatileRig.java diff --git a/Mage.Sets/src/mage/sets/returntoravnica/AzorsElocutors.java b/Mage.Sets/src/mage/sets/returntoravnica/AzorsElocutors.java new file mode 100644 index 0000000000..32c8ea34a0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/returntoravnica/AzorsElocutors.java @@ -0,0 +1,108 @@ +/* + * 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.returntoravnica; + +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.TargetController; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.cards.CardImpl; +import mage.counters.Counter; +import mage.game.Game; +import mage.game.events.GameEvent; + + +/** + * + * @author LevelX2 + */ +public class AzorsElocutors extends CardImpl { + + public AzorsElocutors(UUID ownerId) { + super(ownerId, 210, "Azor's Elocutors", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{W/U}{W/U}"); + this.expansionSetCode = "RTR"; + this.subtype.add("Human"); + this.subtype.add("Advisor"); + this.color.setWhite(true); + this.color.setBlue(true); + this.power = new MageInt(3); + this.toughness = new MageInt(5); + + // At the beginning of your upkeep, put a filibuster counter on Azor's Elocutors. Then if Azor's Elocutors has five or more filibuster counters on it, you win the game. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(new Counter("filibuster",1)), TargetController.YOU, false)); + + // Whenever a source deals damage to you, remove a filibuster counter from Azor's Elocutors. + this.addAbility(new AzorsElocutorsTriggeredAbility()); + + } + + public AzorsElocutors(final AzorsElocutors card) { + super(card); + } + + @Override + public AzorsElocutors copy() { + return new AzorsElocutors(this); + } +} +class AzorsElocutorsTriggeredAbility extends TriggeredAbilityImpl { + + public AzorsElocutorsTriggeredAbility() { + super(Constants.Zone.BATTLEFIELD, new RemoveCounterSourceEffect(new Counter("filibuster",1)), false); + } + + public AzorsElocutorsTriggeredAbility(final AzorsElocutorsTriggeredAbility ability) { + super(ability); + } + + @Override + public AzorsElocutorsTriggeredAbility copy() { + return new AzorsElocutorsTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER && event.getTargetId().equals(this.controllerId)) { + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever a source deals damage to you, " + super.getRule(); + } + +} diff --git a/Mage.Sets/src/mage/sets/returntoravnica/CollectiveBlessing.java b/Mage.Sets/src/mage/sets/returntoravnica/CollectiveBlessing.java new file mode 100644 index 0000000000..83e67739f1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/returntoravnica/CollectiveBlessing.java @@ -0,0 +1,64 @@ +/* + * 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.returntoravnica; + +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continious.BoostControlledEffect; +import mage.cards.CardImpl; + +/** + * + * @author LevelX2 + */ +public class CollectiveBlessing extends CardImpl { + + public CollectiveBlessing(UUID ownerId) { + super(ownerId, 150, "Collective Blessing", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}{G}{W}"); + this.expansionSetCode = "RTR"; + + this.color.setGreen(true); + this.color.setWhite(true); + + // Creatures you control get +3/+3. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(3,3, Constants.Duration.WhileOnBattlefield))); + } + + public CollectiveBlessing(final CollectiveBlessing card) { + super(card); + } + + @Override + public CollectiveBlessing copy() { + return new CollectiveBlessing(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/returntoravnica/TabletOfTheGuilds.java b/Mage.Sets/src/mage/sets/returntoravnica/TabletOfTheGuilds.java new file mode 100644 index 0000000000..7239884946 --- /dev/null +++ b/Mage.Sets/src/mage/sets/returntoravnica/TabletOfTheGuilds.java @@ -0,0 +1,158 @@ +/* + * 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.returntoravnica; + +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SpellCastTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.choices.ChoiceColor; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class TabletOfTheGuilds extends CardImpl { + + public TabletOfTheGuilds(UUID ownerId) { + super(ownerId, 235, "Tablet of the Guilds", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "RTR"; + + // As Tablet of the Guilds enters the battlefield, choose two colors. + this.addAbility(new AsEntersBattlefieldAbility(new TabletOfTheGuildsEntersBattlefieldEffect())); + + // Whenever you cast a spell, if it's at least one of the chosen colors, you gain 1 life for each of the chosen colors it is. + this.addAbility(new SpellCastTriggeredAbility(new TabletOfTheGuildsGainLifeEffect(), new FilterSpell("a spell"), false, true )); + } + + public TabletOfTheGuilds(final TabletOfTheGuilds card) { + super(card); + } + + @Override + public TabletOfTheGuilds copy() { + return new TabletOfTheGuilds(this); + } +} + +class TabletOfTheGuildsEntersBattlefieldEffect extends OneShotEffect { + + public TabletOfTheGuildsEntersBattlefieldEffect() { + super(Constants.Outcome.BoostCreature); + staticText = "choose two colors"; + } + + public TabletOfTheGuildsEntersBattlefieldEffect(final TabletOfTheGuildsEntersBattlefieldEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (player != null && permanent != null) { + String colors; + ChoiceColor colorChoice = new ChoiceColor(); + colorChoice.setMessage("Choose the first color"); + while (!player.choose(Outcome.GainLife, colorChoice, game)) { + game.debugMessage("player canceled choosing type. retrying."); + } + game.getState().setValue(permanent.getId() + "_color1", colorChoice.getColor().toString()); + colors = colorChoice.getChoice().toLowerCase() + " and "; + + colorChoice.getChoices().remove(colorChoice.getChoice()); + colorChoice.setMessage("Choose the second color"); + while (!player.choose(Outcome.GainLife, colorChoice, game)) { + game.debugMessage("player canceled choosing type. retrying."); + } + game.getState().setValue(permanent.getId() + "_color2", colorChoice.getColor().toString()); + colors = colors + colorChoice.getChoice().toLowerCase(); + game.informPlayers(permanent.getName() + ": " + player.getName() + " has chosen " + colors); + } + return false; + } + + @Override + public TabletOfTheGuildsEntersBattlefieldEffect copy() { + return new TabletOfTheGuildsEntersBattlefieldEffect(this); + } + +} + +class TabletOfTheGuildsGainLifeEffect extends OneShotEffect { + + public TabletOfTheGuildsGainLifeEffect() { + super(Constants.Outcome.Neutral); + staticText = "if it's at least one of the chosen colors, you gain 1 life for each of the chosen colors it is"; + } + + public TabletOfTheGuildsGainLifeEffect(final TabletOfTheGuildsGainLifeEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player you = game.getPlayer(source.getControllerId()); + if (you != null) { + Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); + if (spell != null) { + ObjectColor color1 = new ObjectColor((String) game.getState().getValue(source.getSourceId() + "_color1")); + ObjectColor color2 = new ObjectColor((String) game.getState().getValue(source.getSourceId() + "_color2")); + int amount = 0; + if (spell.getColor().contains(color1)) { + ++amount; + } + if (spell.getColor().contains(color2)) { + ++amount; + } + if (amount > 0) { + you.gainLife(amount, game); + return true; + } + } + } + return false; + } + + @Override + public TabletOfTheGuildsGainLifeEffect copy() { + return new TabletOfTheGuildsGainLifeEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/returntoravnica/VolatileRig.java b/Mage.Sets/src/mage/sets/returntoravnica/VolatileRig.java new file mode 100644 index 0000000000..5ac57bae56 --- /dev/null +++ b/Mage.Sets/src/mage/sets/returntoravnica/VolatileRig.java @@ -0,0 +1,189 @@ +/* + * 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.returntoravnica; + +import java.util.List; +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.AttacksEachTurnStaticAbility; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class VolatileRig extends CardImpl { + + public VolatileRig(UUID ownerId) { + super(ownerId, 236, "Volatile Rig", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + this.expansionSetCode = "RTR"; + this.subtype.add("Construct"); + + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Volatile Rig attacks each turn if able. + this.addAbility(new AttacksEachTurnStaticAbility()); + + // Whenever Volatile Rig is dealt damage, flip a coin. If you lose the flip, sacrifice Volatile Rig. + this.addAbility(new VolatileRigTriggeredAbility()); + + // When Volatile Rig dies, flip a coin. If you lose the flip, it deals 4 damage to each creature and each player. + this.addAbility(new DiesTriggeredAbility(new VolatileRigEffect2())); + + + } + + public VolatileRig(final VolatileRig card) { + super(card); + } + + @Override + public VolatileRig copy() { + return new VolatileRig(this); + } +} + +class VolatileRigTriggeredAbility extends TriggeredAbilityImpl { + + public VolatileRigTriggeredAbility() { + super(Zone.BATTLEFIELD, new VolatileRigEffect()); + } + + public VolatileRigTriggeredAbility(final VolatileRigTriggeredAbility effect) { + super(effect); + } + + @Override + public VolatileRigTriggeredAbility copy() { + return new VolatileRigTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGED_CREATURE && event.getTargetId().equals(this.sourceId)) { + this.getEffects().get(0).setValue("damageAmount", event.getAmount()); + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever {this} is dealt damage, " + super.getRule(); + } +} + + +class VolatileRigEffect extends OneShotEffect { + + VolatileRigEffect() { + super(Outcome.Sacrifice); + staticText = "flip a coin. If you lose the flip, sacrifice {this}"; + } + + VolatileRigEffect(final VolatileRigEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + if (!player.flipCoin(game)) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + return permanent.sacrifice(source.getSourceId(), game); + } + } + } + return false; + } + + @Override + public VolatileRigEffect copy() { + return new VolatileRigEffect(this); + } +} + +class VolatileRigEffect2 extends OneShotEffect { + + VolatileRigEffect2() { + super(Outcome.Sacrifice); + staticText = "flip a coin. If you lose the flip, it deals 4 damage to each creature and each player"; + } + + VolatileRigEffect2(final VolatileRigEffect2 effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + if (!player.flipCoin(game)) { + + List permanents = game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), game); + for (Permanent permanent: permanents) { + permanent.damage(4, source.getId(), game, true, false); + } + for (UUID playerId: player.getInRange()) { + Player damageToPlayer = game.getPlayer(playerId); + if (damageToPlayer != null) { + damageToPlayer.damage(4, source.getId(), game, false, true); + } + } + return true; + + } + } + return false; + } + + @Override + public VolatileRigEffect2 copy() { + return new VolatileRigEffect2(this); + } +} \ No newline at end of file