From baf5125a64aa12213265239011fa4f6bc4f4f724 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 15 Sep 2013 11:39:43 +0200 Subject: [PATCH] [THS] Added 16 blue and white cards (blue and white are completly implemented). --- .../src/mage/sets/theros/AqueousForm.java | 83 ++++++ .../mage/sets/theros/BreachingHippocamp.java | 73 +++++ .../mage/sets/theros/CoastlineChimera.java | 71 +++++ .../src/mage/sets/theros/CracklingTriton.java | 74 +++++ .../src/mage/sets/theros/FateForetold.java | 77 +++++ .../src/mage/sets/theros/HorizonScholar.java | 68 +++++ .../mage/sets/theros/MeletisCharlatan.java | 120 ++++++++ .../mage/sets/theros/PrescientChimera.java | 78 ++++++ .../mage/sets/theros/ScholarOfAthreos.java | 99 +++++++ .../src/mage/sets/theros/SeaGodsRevenge.java | 64 +++++ .../sets/theros/SetessanBattlePriest.java | 66 +++++ .../src/mage/sets/theros/SetessanGriffin.java | 71 +++++ .../src/mage/sets/theros/StymiedHopes.java | 66 +++++ .../src/mage/sets/theros/ThassasBounty.java | 64 +++++ .../src/mage/sets/theros/TritonTactics.java | 265 ++++++++++++++++++ Mage.Sets/src/mage/sets/theros/Vaporkin.java | 69 +++++ 16 files changed, 1408 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/theros/AqueousForm.java create mode 100644 Mage.Sets/src/mage/sets/theros/BreachingHippocamp.java create mode 100644 Mage.Sets/src/mage/sets/theros/CoastlineChimera.java create mode 100644 Mage.Sets/src/mage/sets/theros/CracklingTriton.java create mode 100644 Mage.Sets/src/mage/sets/theros/FateForetold.java create mode 100644 Mage.Sets/src/mage/sets/theros/HorizonScholar.java create mode 100644 Mage.Sets/src/mage/sets/theros/MeletisCharlatan.java create mode 100644 Mage.Sets/src/mage/sets/theros/PrescientChimera.java create mode 100644 Mage.Sets/src/mage/sets/theros/ScholarOfAthreos.java create mode 100644 Mage.Sets/src/mage/sets/theros/SeaGodsRevenge.java create mode 100644 Mage.Sets/src/mage/sets/theros/SetessanBattlePriest.java create mode 100644 Mage.Sets/src/mage/sets/theros/SetessanGriffin.java create mode 100644 Mage.Sets/src/mage/sets/theros/StymiedHopes.java create mode 100644 Mage.Sets/src/mage/sets/theros/ThassasBounty.java create mode 100644 Mage.Sets/src/mage/sets/theros/TritonTactics.java create mode 100644 Mage.Sets/src/mage/sets/theros/Vaporkin.java diff --git a/Mage.Sets/src/mage/sets/theros/AqueousForm.java b/Mage.Sets/src/mage/sets/theros/AqueousForm.java new file mode 100644 index 00000000000..46ac48306d2 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/AqueousForm.java @@ -0,0 +1,83 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.AttacksAttachedTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ScryEffect; +import mage.abilities.effects.common.continious.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.UnblockableAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class AqueousForm extends CardImpl { + + public AqueousForm(UUID ownerId) { + super(ownerId, 39, "Aqueous Form", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Aura"); + + this.color.setBlue(true); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature can't be blocked. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(new UnblockableAbility(), AttachmentType.AURA, Duration.WhileOnBattlefield))); + + // Whenever enchanted creature attacks, scry 1. + this.addAbility(new AttacksAttachedTriggeredAbility(new ScryEffect(1), AttachmentType.AURA,false)); + } + + public AqueousForm(final AqueousForm card) { + super(card); + } + + @Override + public AqueousForm copy() { + return new AqueousForm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/BreachingHippocamp.java b/Mage.Sets/src/mage/sets/theros/BreachingHippocamp.java new file mode 100644 index 00000000000..04bbcabc584 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/BreachingHippocamp.java @@ -0,0 +1,73 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class BreachingHippocamp extends CardImpl { + + public BreachingHippocamp(UUID ownerId) { + super(ownerId, 43, "Breaching Hippocamp", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Horse"); + this.subtype.add("Fish"); + + this.color.setBlue(true); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + // When Breaching Hippocamp enters the battlefield, untap another target creature you control. + Ability ability = new EntersBattlefieldTriggeredAbility(new UntapTargetEffect(), false); + ability.addTarget(new TargetControlledCreaturePermanent(true)); + this.addAbility(ability); + } + + public BreachingHippocamp(final BreachingHippocamp card) { + super(card); + } + + @Override + public BreachingHippocamp copy() { + return new BreachingHippocamp(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/CoastlineChimera.java b/Mage.Sets/src/mage/sets/theros/CoastlineChimera.java new file mode 100644 index 00000000000..d1cbc106309 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/CoastlineChimera.java @@ -0,0 +1,71 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continious.CanBlockAdditionalCreatureEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class CoastlineChimera extends CardImpl { + + public CoastlineChimera(UUID ownerId) { + super(ownerId, 44, "Coastline Chimera", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Chimera"); + + this.color.setBlue(true); + this.power = new MageInt(1); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // {1}{W}: Coastline Chimera can block an additional creature this turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect(Duration.EndOfTurn, 1), new ManaCostsImpl("{1}{W}"))); + } + + public CoastlineChimera(final CoastlineChimera card) { + super(card); + } + + @Override + public CoastlineChimera copy() { + return new CoastlineChimera(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/CracklingTriton.java b/Mage.Sets/src/mage/sets/theros/CracklingTriton.java new file mode 100644 index 00000000000..2e28728a885 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/CracklingTriton.java @@ -0,0 +1,74 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author LevelX2 + */ +public class CracklingTriton extends CardImpl { + + public CracklingTriton(UUID ownerId) { + super(ownerId, 45, "Crackling Triton", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Merfolk"); + this.subtype.add("Wizard"); + + this.color.setBlue(true); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // {2}{R}, Sacrifice Crackling Triton: Crackling Triton deals 2 damage to target creature or player. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl("{2}{R}")); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer(true)); + this.addAbility(ability); + } + + public CracklingTriton(final CracklingTriton card) { + super(card); + } + + @Override + public CracklingTriton copy() { + return new CracklingTriton(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/FateForetold.java b/Mage.Sets/src/mage/sets/theros/FateForetold.java new file mode 100644 index 00000000000..7cd339c7d66 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/FateForetold.java @@ -0,0 +1,77 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.DiesAttachedTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardControllerEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class FateForetold extends CardImpl { + + public FateForetold(UUID ownerId) { + super(ownerId, 48, "Fate Foretold", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Aura"); + + this.color.setBlue(true); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // When Fate Foretold enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardControllerEffect(1),false)); + // When enchanted creature dies, its controller draws a card. + this.addAbility(new DiesAttachedTriggeredAbility(new DrawCardControllerEffect(1),"enchanted creature", false)); + } + + public FateForetold(final FateForetold card) { + super(card); + } + + @Override + public FateForetold copy() { + return new FateForetold(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/HorizonScholar.java b/Mage.Sets/src/mage/sets/theros/HorizonScholar.java new file mode 100644 index 00000000000..603d158f4d5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/HorizonScholar.java @@ -0,0 +1,68 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ScryEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class HorizonScholar extends CardImpl { + + public HorizonScholar(UUID ownerId) { + super(ownerId, 51, "Horizon Scholar", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Sphinx"); + + this.color.setBlue(true); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // When Horizon Scholar enters the battlefield, scry 2. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ScryEffect(2), false)); + } + + public HorizonScholar(final HorizonScholar card) { + super(card); + } + + @Override + public HorizonScholar copy() { + return new HorizonScholar(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/MeletisCharlatan.java b/Mage.Sets/src/mage/sets/theros/MeletisCharlatan.java new file mode 100644 index 00000000000..08d3acfe247 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/MeletisCharlatan.java @@ -0,0 +1,120 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.TargetSpell; + +/** + * + * @author LevelX2 + */ +public class MeletisCharlatan extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.INSTANT), + new CardTypePredicate(CardType.SORCERY))); + } + + public MeletisCharlatan(UUID ownerId) { + super(ownerId, 54, "Meletis Charlatan", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Human"); + this.subtype.add("Wizard"); + + this.color.setBlue(true); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // {2}{U}, {T}: The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. + this.getSpellAbility().addEffect(new MeletisCharlatanCopyTargetSpellEffect()); + this.getSpellAbility().addTarget(new TargetSpell(filter)); + } + + public MeletisCharlatan(final MeletisCharlatan card) { + super(card); + } + + @Override + public MeletisCharlatan copy() { + return new MeletisCharlatan(this); + } +} + +class MeletisCharlatanCopyTargetSpellEffect extends OneShotEffect { + + public MeletisCharlatanCopyTargetSpellEffect() { + super(Outcome.Copy); + staticText = "The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy"; + } + + public MeletisCharlatanCopyTargetSpellEffect(final MeletisCharlatanCopyTargetSpellEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); + if (spell != null) { + Spell copy = spell.copySpell(); + copy.setControllerId(spell.getControllerId()); + copy.setCopiedSpell(true); + game.getStack().push(copy); + copy.chooseNewTargets(game, spell.getControllerId()); + Player player = game.getPlayer(spell.getControllerId()); + String activateMessage = copy.getActivatedMessage(game); + if (activateMessage.startsWith(" casts ")) { + activateMessage = activateMessage.substring(6); + } + game.informPlayers(player.getName() + " copies " + activateMessage);; + return true; + } + return false; + } + + @Override + public MeletisCharlatanCopyTargetSpellEffect copy() { + return new MeletisCharlatanCopyTargetSpellEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/theros/PrescientChimera.java b/Mage.Sets/src/mage/sets/theros/PrescientChimera.java new file mode 100644 index 00000000000..9746ac8ce09 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/PrescientChimera.java @@ -0,0 +1,78 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.ScryEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterSpell; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; + +/** + * + * @author LevelX2 + */ +public class PrescientChimera extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("instant or sorcery spell"); + static { + filter.add(Predicates.or( + new CardTypePredicate(CardType.INSTANT), + new CardTypePredicate(CardType.SORCERY))); + } + + public PrescientChimera(UUID ownerId) { + super(ownerId, 59, "Prescient Chimera", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Chimera"); + + this.color.setBlue(true); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Whenever you cast an instant or sorcery spell, scry 1. + this.addAbility(new SpellCastControllerTriggeredAbility(new ScryEffect(1), filter, false)); + } + + public PrescientChimera(final PrescientChimera card) { + super(card); + } + + @Override + public PrescientChimera copy() { + return new PrescientChimera(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/ScholarOfAthreos.java b/Mage.Sets/src/mage/sets/theros/ScholarOfAthreos.java new file mode 100644 index 00000000000..c21269c1038 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/ScholarOfAthreos.java @@ -0,0 +1,99 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; + +/** + * + * @author LevelX2 + */ +public class ScholarOfAthreos extends CardImpl { + + public ScholarOfAthreos(UUID ownerId) { + super(ownerId, 28, "Scholar of Athreos", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "THS"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + + this.color.setWhite(true); + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // {2}{B}: Each opponent loses 1 life. You gain life equal to the life lost this way. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScholarOfAthreosEffect(), new ManaCostsImpl("{2}{B}"))); + } + + public ScholarOfAthreos(final ScholarOfAthreos card) { + super(card); + } + + @Override + public ScholarOfAthreos copy() { + return new ScholarOfAthreos(this); + } +} + +class ScholarOfAthreosEffect extends OneShotEffect { + + public ScholarOfAthreosEffect() { + super(Outcome.Damage); + staticText = "Each opponent loses 1 life. You gain life equal to the life lost this way"; + } + + public ScholarOfAthreosEffect(final ScholarOfAthreosEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + int damage = 0; + for (UUID opponentId: game.getOpponents(source.getControllerId())) { + damage += game.getPlayer(opponentId).damage(1, source.getSourceId(), game, false, true); + } + game.getPlayer(source.getControllerId()).gainLife(damage, game); + return true; + } + + @Override + public ScholarOfAthreosEffect copy() { + return new ScholarOfAthreosEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/theros/SeaGodsRevenge.java b/Mage.Sets/src/mage/sets/theros/SeaGodsRevenge.java new file mode 100644 index 00000000000..163c59a7e42 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/SeaGodsRevenge.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.theros; + +import java.util.UUID; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.common.ScryEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class SeaGodsRevenge extends CardImpl { + + public SeaGodsRevenge(UUID ownerId) { + super(ownerId, 61, "Sea God's Revenge", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{5}{U}"); + this.expansionSetCode = "THS"; + + this.color.setBlue(true); + + // Return up to three target creatures to their owners' hands. Scry 1. + this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0,3)); + this.getSpellAbility().addEffect(new ScryEffect(1)); + } + + public SeaGodsRevenge(final SeaGodsRevenge card) { + super(card); + } + + @Override + public SeaGodsRevenge copy() { + return new SeaGodsRevenge(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/SetessanBattlePriest.java b/Mage.Sets/src/mage/sets/theros/SetessanBattlePriest.java new file mode 100644 index 00000000000..a2d3624286a --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/SetessanBattlePriest.java @@ -0,0 +1,66 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.keyword.HeroicAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class SetessanBattlePriest extends CardImpl { + + public SetessanBattlePriest(UUID ownerId) { + super(ownerId, 29, "Setessan Battle Priest", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "THS"; + this.subtype.add("Human"); + this.subtype.add("Cleric"); + + this.color.setWhite(true); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Heroic - Whenever you cast a spell that targets Setessan Battle Priest, you gain 2 life. + this.addAbility(new HeroicAbility(new GainLifeEffect(2), false)); + } + + public SetessanBattlePriest(final SetessanBattlePriest card) { + super(card); + } + + @Override + public SetessanBattlePriest copy() { + return new SetessanBattlePriest(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/SetessanGriffin.java b/Mage.Sets/src/mage/sets/theros/SetessanGriffin.java new file mode 100644 index 00000000000..835d49d388b --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/SetessanGriffin.java @@ -0,0 +1,71 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.ActivateOncePerTurnActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continious.BoostSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class SetessanGriffin extends CardImpl { + + public SetessanGriffin(UUID ownerId) { + super(ownerId, 30, "Setessan Griffin", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{W}"); + this.expansionSetCode = "THS"; + this.subtype.add("Griffin"); + + this.color.setWhite(true); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // {2}{G}{G}: Setessan Griffin gets +2/+2 until end of turn. Activate this ability only once each turn. + this.addAbility(new ActivateOncePerTurnActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(2,2, Duration.EndOfTurn), new ManaCostsImpl("{2}{G}{G}"))); + } + + public SetessanGriffin(final SetessanGriffin card) { + super(card); + } + + @Override + public SetessanGriffin copy() { + return new SetessanGriffin(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/StymiedHopes.java b/Mage.Sets/src/mage/sets/theros/StymiedHopes.java new file mode 100644 index 00000000000..436c79e0c97 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/StymiedHopes.java @@ -0,0 +1,66 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.CounterUnlessPaysEffect; +import mage.abilities.effects.common.ScryEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetSpell; + +/** + * + * @author LevelX2 + */ +public class StymiedHopes extends CardImpl { + + public StymiedHopes(UUID ownerId) { + super(ownerId, 64, "Stymied Hopes", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); + this.expansionSetCode = "THS"; + + this.color.setBlue(true); + + // Counter target spell unless its controller pays {1}. Scry 1. + this.getSpellAbility().addEffect(new CounterUnlessPaysEffect(new GenericManaCost(1))); + this.getSpellAbility().addTarget(new TargetSpell()); + this.getSpellAbility().addEffect(new ScryEffect(1)); + + } + + public StymiedHopes(final StymiedHopes card) { + super(card); + } + + @Override + public StymiedHopes copy() { + return new StymiedHopes(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/ThassasBounty.java b/Mage.Sets/src/mage/sets/theros/ThassasBounty.java new file mode 100644 index 00000000000..3b1badc4388 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/ThassasBounty.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.theros; + +import java.util.UUID; +import mage.abilities.effects.common.DrawCardControllerEffect; +import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.TargetPlayer; + +/** + * + * @author LevelX2 + */ +public class ThassasBounty extends CardImpl { + + public ThassasBounty(UUID ownerId) { + super(ownerId, 67, "Thassa's Bounty", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{5}{U}"); + this.expansionSetCode = "THS"; + + this.color.setBlue(true); + + // Draw three cards. Target player puts the top three cards of his or her library into his or her graveyard. + this.getSpellAbility().addEffect(new DrawCardControllerEffect(3)); + this.getSpellAbility().addEffect(new PutLibraryIntoGraveTargetEffect(3)); + this.getSpellAbility().addTarget(new TargetPlayer(true)); + } + + public ThassasBounty(final ThassasBounty card) { + super(card); + } + + @Override + public ThassasBounty copy() { + return new ThassasBounty(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/TritonTactics.java b/Mage.Sets/src/mage/sets/theros/TritonTactics.java new file mode 100644 index 00000000000..cea56c9a2f7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/TritonTactics.java @@ -0,0 +1,265 @@ +/* + * 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.theros; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.DrawCardControllerEffect; +import mage.abilities.effects.common.SkipNextUntapTargetEffect; +import mage.abilities.effects.common.continious.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.WatcherScope; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; +import mage.watchers.WatcherImpl; + +/** + * + * @author LevelX2 + */ +public class TritonTactics extends CardImpl { + + public TritonTactics(UUID ownerId) { + super(ownerId, 71, "Triton Tactics", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{U}"); + this.expansionSetCode = "THS"; + + this.color.setBlue(true); + + // Up to two target creatures each get +0/+3 until end of turn. Untap those creatures. + // At this turn's next end of combat, tap each creature that was blocked by one of those + // creatures this turn and it doesn't untap during its controller's next untap step. + this.getSpellAbility().addEffect(new BoostTargetEffect(0,3, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); + this.getSpellAbility().addEffect(new TritonTacticsUntapTargetEffect()); + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new TritonTacticsTriggeredAbility())); + + this.addWatcher(new BlockedCreaturesWatcher()); + + + } + + public TritonTactics(final TritonTactics card) { + super(card); + } + + @Override + public TritonTactics copy() { + return new TritonTactics(this); + } +} + +class TritonTacticsUntapTargetEffect extends OneShotEffect { + + public TritonTacticsUntapTargetEffect() { + super(Outcome.Untap); + staticText = "Untap those creatures"; + } + + public TritonTacticsUntapTargetEffect(final TritonTacticsUntapTargetEffect effect) { + super(effect); + } + + @Override + public TritonTacticsUntapTargetEffect copy() { + return new TritonTacticsUntapTargetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Set targets = new HashSet(); + for (UUID target: targetPointer.getTargets(game, source)) { + Permanent permanent = game.getPermanent(target); + if (permanent != null) { + permanent.untap(game); + targets.add(CardUtil.getCardZoneString("", permanent.getId(), game)); + } + } + if (!targets.isEmpty()) { + // save the targets for the watcher + Map> targetMap; + Object object = game.getState().getValue("targets" + source.getSourceId()); + if (object != null && object instanceof Map) { + targetMap = (Map>) object; + } else { + targetMap = new HashMap>(); + } + targetMap.put(new Integer(game.getCard(source.getSourceId()).getZoneChangeCounter()), targets); + if (object == null) { + game.getState().setValue("targets" + source.getSourceId().toString(), targetMap); + } + } + return true; + } + +} + +class TritonTacticsTriggeredAbility extends DelayedTriggeredAbility { + + public TritonTacticsTriggeredAbility() { + super(new TritonTacticsEndOfCombatEffect(), Duration.EndOfCombat, true); + } + + public TritonTacticsTriggeredAbility(TritonTacticsTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.END_COMBAT_STEP_PRE) { + return true; + } + return false; + } + + @Override + public TritonTacticsTriggeredAbility copy() { + return new TritonTacticsTriggeredAbility(this); + } + + @Override + public String getRule() { + return "At this turn's next end of combat, " + modes.getText(); + } +} + +class TritonTacticsEndOfCombatEffect extends OneShotEffect { + + public TritonTacticsEndOfCombatEffect() { + super(Outcome.Benefit); + this.staticText = "tap each creature that was blocked by one of those creatures this turn and it doesn't untap during its controller's next untap step"; + } + + public TritonTacticsEndOfCombatEffect(final TritonTacticsEndOfCombatEffect effect) { + super(effect); + } + + @Override + public TritonTacticsEndOfCombatEffect copy() { + return new TritonTacticsEndOfCombatEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Map> attackerMap = null; + Object object = game.getState().getValue("blockedAttackers" + source.getSourceId()); + if (object != null && object instanceof Map) { + attackerMap = (Map>) object; + for (Set attackerSet :attackerMap.values()) { + for (Permanent creature : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), game)) { + if (attackerSet.contains(CardUtil.getCardZoneString(null, creature.getId(), game))) { + // tap creature and add the not untap effect + creature.tap(game); + ContinuousEffect effect = new SkipNextUntapTargetEffect(); + effect.setTargetPointer(new FixedTarget(creature.getId())); + game.addEffect(effect, source); + game.informPlayers(new StringBuilder("Triton Tactics: ").append(creature.getName()).append(" doesn't untap during its controller's next untap step").toString()); + } + } + } + } + if (attackerMap != null) { + attackerMap.clear(); + } + + return true; + } +} + +class BlockedCreaturesWatcher extends WatcherImpl { + + public BlockedCreaturesWatcher() { + super("BlockedCreatures", WatcherScope.CARD); + } + + public BlockedCreaturesWatcher(final BlockedCreaturesWatcher watcher) { + super(watcher); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.BLOCKER_DECLARED) { + Map> targetMap; + Object object = game.getState().getValue("targets" + this.getSourceId().toString()); + if (object != null && object instanceof Map) { + Permanent blocker = game.getPermanent(event.getSourceId()); + if (blocker != null) { + targetMap = (Map>) object; + for (Map.Entry> entry : targetMap.entrySet()) { + if (entry.getValue().contains(CardUtil.getCardZoneString("", blocker.getId(), game))) { + // save the attacking craeture that was blocked + saveAttackingCreature(event.getTargetId(), entry.getKey(), game); + } + } + } + } + + } + } + + private void saveAttackingCreature(UUID attackerId, Integer zoneChangeCounter, Game game) { + Set attackers; + Map> attackerMap; + Object object = game.getState().getValue("blockedAttackers" + getSourceId()); + if (object != null && object instanceof Map) { + attackerMap = (Map>) object; + } else { + attackerMap = new HashMap>(); + } + attackers = attackerMap.get(zoneChangeCounter); + if (attackers == null) { + attackers = new HashSet(); + attackerMap.put(zoneChangeCounter, attackers); + } + attackers.add(CardUtil.getCardZoneString(null, attackerId, game)); + if (object == null || !(object instanceof Map)) { + game.getState().setValue("blockedAttackers" + getSourceId().toString(), attackerMap); + } + } + + @Override + public BlockedCreaturesWatcher copy() { + return new BlockedCreaturesWatcher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/theros/Vaporkin.java b/Mage.Sets/src/mage/sets/theros/Vaporkin.java new file mode 100644 index 00000000000..3a645314126 --- /dev/null +++ b/Mage.Sets/src/mage/sets/theros/Vaporkin.java @@ -0,0 +1,69 @@ +/* + * 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.theros; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continious.CanBlockOnlyFlyingEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class Vaporkin extends CardImpl { + + public Vaporkin(UUID ownerId) { + super(ownerId, 72, "Vaporkin", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}"); + this.expansionSetCode = "THS"; + this.subtype.add("Elemental"); + + this.color.setBlue(true); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Vaporkin can block only creatures with flying. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockOnlyFlyingEffect())); + } + + public Vaporkin(final Vaporkin card) { + super(card); + } + + @Override + public Vaporkin copy() { + return new Vaporkin(this); + } +}