From d4408931a92941627f3ed8645c6fbf2fae7dbe24 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 26 Mar 2016 23:23:17 +0100 Subject: [PATCH] [SOI] Added the missing 11 red cards. --- .../src/mage/sets/guildpact/Gelectrode.java | 20 +-- .../mage/sets/khansoftarkir/DragonGrip.java | 5 +- .../mage/sets/mirrodin/PredatorsStrike.java | 14 +- .../oathofthegatewatch/PressIntoService.java | 2 + .../FlameheartWerewolf.java | 78 +++++++++++ .../sets/shadowsoverinnistrad/Geistblast.java | 6 +- .../shadowsoverinnistrad/InnerStruggle.java | 96 +++++++++++++ .../shadowsoverinnistrad/InsolentNeonate.java | 72 ++++++++++ .../KessigForgemaster.java | 81 +++++++++++ .../MalevolentWhispers.java | 76 ++++++++++ .../sets/shadowsoverinnistrad/PyreHound.java | 70 ++++++++++ .../shadowsoverinnistrad/ReduceToAshes.java | 69 +++++++++ .../RushOfAdrenaline.java | 69 +++++++++ .../shadowsoverinnistrad/SenselessRage.java | 79 +++++++++++ .../shadowsoverinnistrad/SpitefulMotives.java | 87 ++++++++++++ .../StensiaMasquerade.java | 131 ++++++++++++++++++ .../shadowsoverinnistrad/UlrichsKindred.java | 87 ++++++++++++ .../shadowsoverinnistrad/UncagedFury.java | 69 +++++++++ .../sets/shardsofalara/LightningTalons.java | 25 ++-- Utils/init.txt - Shortcut.lnk | Bin 7271 -> 0 bytes 20 files changed, 1097 insertions(+), 39 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/FlameheartWerewolf.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/InnerStruggle.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/InsolentNeonate.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/KessigForgemaster.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/MalevolentWhispers.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/PyreHound.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/ReduceToAshes.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/RushOfAdrenaline.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/SenselessRage.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/SpitefulMotives.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/StensiaMasquerade.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/UlrichsKindred.java create mode 100644 Mage.Sets/src/mage/sets/shadowsoverinnistrad/UncagedFury.java delete mode 100644 Utils/init.txt - Shortcut.lnk diff --git a/Mage.Sets/src/mage/sets/guildpact/Gelectrode.java b/Mage.Sets/src/mage/sets/guildpact/Gelectrode.java index 1c9843a3b55..c40cc5a60b1 100644 --- a/Mage.Sets/src/mage/sets/guildpact/Gelectrode.java +++ b/Mage.Sets/src/mage/sets/guildpact/Gelectrode.java @@ -28,9 +28,6 @@ package mage.sets.guildpact; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -39,10 +36,10 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.UntapSourceEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.common.FilterInstantOrSorcerySpell; import mage.target.common.TargetCreatureOrPlayer; /** @@ -51,26 +48,17 @@ import mage.target.common.TargetCreatureOrPlayer; */ public class Gelectrode extends CardImpl { - private static final FilterSpell filter = new FilterSpell("an instant or sorcery spell"); - - static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public Gelectrode(UUID ownerId) { super(ownerId, 113, "Gelectrode", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}{R}"); this.expansionSetCode = "GPT"; this.subtype.add("Weird"); - this.power = new MageInt(0); this.toughness = new MageInt(1); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); - this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), filter, true)); + this.addAbility(new SpellCastControllerTriggeredAbility(new UntapSourceEffect(), new FilterInstantOrSorcerySpell("an instant or sorcery spell"), true)); } public Gelectrode(final Gelectrode card) { diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/DragonGrip.java b/Mage.Sets/src/mage/sets/khansoftarkir/DragonGrip.java index e3d6b782778..36a81000830 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/DragonGrip.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/DragonGrip.java @@ -61,12 +61,11 @@ public class DragonGrip extends CardImpl { this.expansionSetCode = "KTK"; this.subtype.add("Aura"); - // Ferocious - If you control a creature with power 4 or greater, you may cast Dragon Grip as though it had flash. AsThoughEffect effect = new CastAsThoughItHadFlashSourceEffect(Duration.EndOfGame); effect.setText("Ferocious — If you control a creature with power 4 or greater, you may cast Dragon Grip as though it had flash"); this.addAbility(new SimpleStaticAbility(Zone.ALL, new ConditionalAsThoughEffect(effect, - FerociousCondition.getInstance()))); + FerociousCondition.getInstance()))); // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); @@ -78,7 +77,7 @@ public class DragonGrip extends CardImpl { // Enchanted creature gets +2/+0 and has first strike. Effect effect2 = new BoostEnchantedEffect(2, 0, Duration.WhileOnBattlefield); effect2.setText("Enchanted creature gets +2/+0"); - ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 0, Duration.WhileOnBattlefield)); + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect2); effect2 = new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA); effect2.setText("and has first strike"); ability.addEffect(effect2); diff --git a/Mage.Sets/src/mage/sets/mirrodin/PredatorsStrike.java b/Mage.Sets/src/mage/sets/mirrodin/PredatorsStrike.java index edc6f1aef44..18da339a90d 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/PredatorsStrike.java +++ b/Mage.Sets/src/mage/sets/mirrodin/PredatorsStrike.java @@ -28,14 +28,14 @@ package mage.sets.mirrodin; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Rarity; import mage.target.common.TargetCreaturePermanent; /** @@ -48,8 +48,12 @@ public class PredatorsStrike extends CardImpl { super(ownerId, 128, "Predator's Strike", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{G}"); this.expansionSetCode = "MRD"; - this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn)); + Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn); + effect.setText("Target creature gets +3/+3"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains trample until end of turn"); + this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } diff --git a/Mage.Sets/src/mage/sets/oathofthegatewatch/PressIntoService.java b/Mage.Sets/src/mage/sets/oathofthegatewatch/PressIntoService.java index 3d33c135327..de28299bb95 100644 --- a/Mage.Sets/src/mage/sets/oathofthegatewatch/PressIntoService.java +++ b/Mage.Sets/src/mage/sets/oathofthegatewatch/PressIntoService.java @@ -60,10 +60,12 @@ public class PressIntoService extends CardImpl { effect.setTargetPointer(new SecondTargetPointer()); // First target is used by Support this.getSpellAbility().addEffect(effect); effect = new UntapTargetEffect(); + effect.setText("Untap that creature"); effect.setTargetPointer(new SecondTargetPointer()); // First target is used by Support this.getSpellAbility().addEffect(effect); effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); effect.setTargetPointer(new SecondTargetPointer()); // First target is used by Suppor + effect.setText("It gains haste until end of turn"); this.getSpellAbility().addEffect(effect); } diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FlameheartWerewolf.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FlameheartWerewolf.java new file mode 100644 index 00000000000..46184da9a70 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/FlameheartWerewolf.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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.BlocksOrBecomesBlockedByCreatureTriggeredAbility; +import mage.abilities.condition.common.TwoOrMoreSpellsWereCastLastTurnCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author LevelX2 + */ +public class FlameheartWerewolf extends CardImpl { + + public FlameheartWerewolf(UUID ownerId) { + super(ownerId, 169, "Flameheart Werewolf", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, ""); + this.expansionSetCode = "SOI"; + this.subtype.add("Werewolf"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // this card is the second face of double-faced card + this.nightCard = true; + this.canTransform = true; + + // Whenever Flameheart Werewolf blocks or becomes blocked by a creature, Flameheart Werewolf deals 2 damage to that creature. + this.addAbility(new BlocksOrBecomesBlockedByCreatureTriggeredAbility(new DamageTargetEffect(2, true, "that creature"), false)); + + // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Flameheart Werewolf. + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(false), TargetController.ANY, false); + this.addAbility(new ConditionalTriggeredAbility(ability, TwoOrMoreSpellsWereCastLastTurnCondition.getInstance(), TransformAbility.TWO_OR_MORE_SPELLS_TRANSFORM_RULE)); + } + + public FlameheartWerewolf(final FlameheartWerewolf card) { + super(card); + } + + @Override + public FlameheartWerewolf copy() { + return new FlameheartWerewolf(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/Geistblast.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/Geistblast.java index f4d8f7503e9..1e79796e44e 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/Geistblast.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/Geistblast.java @@ -30,7 +30,7 @@ package mage.sets.shadowsoverinnistrad; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.ExileSourceCost; +import mage.abilities.costs.common.ExileSourceFromGraveCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CopyTargetSpellEffect; import mage.abilities.effects.common.DamageTargetEffect; @@ -72,9 +72,7 @@ public class Geistblast extends CardImpl { // {2}{U}, Exile Geist from your graveyard: Copy target instant or sorcery you control. You may choose new targets for the copy. Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{2}{U}")); ability.addTarget(new TargetSpell(filter)); - ExileSourceCost cost = new ExileSourceCost(); - cost.setText("Exile {this} from your graveyard"); - ability.addCost(cost); + ability.addCost(new ExileSourceFromGraveCost()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InnerStruggle.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InnerStruggle.java new file mode 100644 index 00000000000..442355365c3 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InnerStruggle.java @@ -0,0 +1,96 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +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.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class InnerStruggle extends CardImpl { + + public InnerStruggle(UUID ownerId) { + super(ownerId, 167, "Inner Struggle", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{R}"); + this.expansionSetCode = "SOI"; + + // Target creature deals damage to itself equal to its power. + this.getSpellAbility().addEffect(new InnerStruggleEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + } + + public InnerStruggle(final InnerStruggle card) { + super(card); + } + + @Override + public InnerStruggle copy() { + return new InnerStruggle(this); + } +} + +class InnerStruggleEffect extends OneShotEffect { + + public InnerStruggleEffect() { + super(Outcome.Damage); + this.staticText = "Target creature deals damage to itself equal to its power"; + } + + public InnerStruggleEffect(final InnerStruggleEffect effect) { + super(effect); + } + + @Override + public InnerStruggleEffect copy() { + return new InnerStruggleEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (targetCreature != null) { + targetCreature.damage(targetCreature.getPower().getValue(), source.getSourceId(), game, false, true); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InsolentNeonate.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InsolentNeonate.java new file mode 100644 index 00000000000..e07b7eb746d --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/InsolentNeonate.java @@ -0,0 +1,72 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class InsolentNeonate extends CardImpl { + + public InsolentNeonate(UUID ownerId) { + super(ownerId, 168, "Insolent Neonate", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Vampire"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Menace + this.addAbility(new MenaceAbility()); + // Discard a card, Sacrifice Insolent Neonate: Draw a card. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new DiscardCardCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + public InsolentNeonate(final InsolentNeonate card) { + super(card); + } + + @Override + public InsolentNeonate copy() { + return new InsolentNeonate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/KessigForgemaster.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/KessigForgemaster.java new file mode 100644 index 00000000000..9709e0f485e --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/KessigForgemaster.java @@ -0,0 +1,81 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.BlocksOrBecomesBlockedByCreatureTriggeredAbility; +import mage.abilities.condition.common.NoSpellsWereCastLastTurnCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author LevelX2 + */ +public class KessigForgemaster extends CardImpl { + + public KessigForgemaster(UUID ownerId) { + super(ownerId, 169, "Kessig Forgemaster", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Human"); + this.subtype.add("Shaman"); + this.subtype.add("Werewolf"); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + this.canTransform = true; + this.secondSideCard = new FlameheartWerewolf(ownerId); + + // Whenever Kessig Forgemaster blocks or becomes blocked by a creature, Kessig Forgemaster deals 1 damage to that creature. + this.addAbility(new BlocksOrBecomesBlockedByCreatureTriggeredAbility(new DamageTargetEffect(1, true, "that creature"), false)); + + // At the beginning of each upkeep, if no spells were cast last turn, transform Kessig Forgemaster. + this.addAbility(new TransformAbility()); + TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(true), TargetController.ANY, false); + this.addAbility(new ConditionalTriggeredAbility(ability, NoSpellsWereCastLastTurnCondition.getInstance(), TransformAbility.NO_SPELLS_TRANSFORM_RULE)); + + } + + public KessigForgemaster(final KessigForgemaster card) { + super(card); + } + + @Override + public KessigForgemaster copy() { + return new KessigForgemaster(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/MalevolentWhispers.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/MalevolentWhispers.java new file mode 100644 index 00000000000..e4541ab6466 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/MalevolentWhispers.java @@ -0,0 +1,76 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.abilities.keyword.MadnessAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class MalevolentWhispers extends CardImpl { + + public MalevolentWhispers(UUID ownerId) { + super(ownerId, 173, "Malevolent Whispers", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{R}"); + this.expansionSetCode = "SOI"; + + // Gain control of target creature until end of turn. Untap that creature. It gets +2/+0 and gains haste until end of turn. + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + Effect effect = new GainControlTargetEffect(Duration.EndOfTurn); + this.getSpellAbility().addEffect(effect); + effect = new UntapTargetEffect(); + effect.setText("Untap that creature"); + this.getSpellAbility().addEffect(effect); + effect = new BoostTargetEffect(2, 0, Duration.EndOfTurn); + effect.setText("It gets +2/+0 and gains haste until end of turn"); + this.getSpellAbility().addEffect(effect); + + // Madness {3}{R} + this.addAbility(new MadnessAbility(this, new ManaCostsImpl("{3}{R}"))); + } + + public MalevolentWhispers(final MalevolentWhispers card) { + super(card); + } + + @Override + public MalevolentWhispers copy() { + return new MalevolentWhispers(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/PyreHound.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/PyreHound.java new file mode 100644 index 00000000000..c167c170bbe --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/PyreHound.java @@ -0,0 +1,70 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.counters.CounterType; +import mage.filter.common.FilterInstantOrSorcerySpell; + +/** + * + * @author LevelX2 + */ +public class PyreHound extends CardImpl { + + public PyreHound(UUID ownerId) { + super(ownerId, 174, "Pyre Hound", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Elemental"); + this.subtype.add("Hound"); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + // Whenever you cast an instant or sorcery spell, put a +1/+1 counter on Pyre Hound. + this.addAbility(new SpellCastControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + new FilterInstantOrSorcerySpell("an instant or sorcery spell"), true)); + } + + public PyreHound(final PyreHound card) { + super(card); + } + + @Override + public PyreHound copy() { + return new PyreHound(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ReduceToAshes.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ReduceToAshes.java new file mode 100644 index 00000000000..ee7684254fa --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ReduceToAshes.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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.replacement.DealtDamageToCreatureBySourceDies; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; +import mage.watchers.common.DamagedByWatcher; + +/** + * + * @author LevelX2 + */ +public class ReduceToAshes extends CardImpl { + + public ReduceToAshes(UUID ownerId) { + super(ownerId, 176, "Reduce to Ashes", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{4}{R}"); + this.expansionSetCode = "SOI"; + + // Reduce to Ashes deals 5 damage to target creature. If that creature would die this turn, exile it instead. + this.getSpellAbility().addEffect(new DamageTargetEffect(5)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + // If that creature would die this turn, exile it instead. + Effect effect = new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn); + effect.setText("If that creature would die this turn, exile it instead"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addWatcher(new DamagedByWatcher()); + } + + public ReduceToAshes(final ReduceToAshes card) { + super(card); + } + + @Override + public ReduceToAshes copy() { + return new ReduceToAshes(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/RushOfAdrenaline.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/RushOfAdrenaline.java new file mode 100644 index 00000000000..9e6531fa985 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/RushOfAdrenaline.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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class RushOfAdrenaline extends CardImpl { + + public RushOfAdrenaline(UUID ownerId) { + super(ownerId, 177, "Rush of Adrenaline", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{R}"); + this.expansionSetCode = "SOI"; + + // Target creature gets +2/+1 and gains trample until end of turn. + Effect effect = new BoostTargetEffect(2, 1, Duration.EndOfTurn); + effect.setText("Target creature gets +2/+1"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains trample until end of turn"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public RushOfAdrenaline(final RushOfAdrenaline card) { + super(card); + } + + @Override + public RushOfAdrenaline copy() { + return new RushOfAdrenaline(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SenselessRage.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SenselessRage.java new file mode 100644 index 00000000000..a54b071d3c5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SenselessRage.java @@ -0,0 +1,79 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.MadnessAbility; +import mage.cards.CardImpl; +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 SenselessRage extends CardImpl { + + public SenselessRage(UUID ownerId) { + super(ownerId, 180, "Senseless Rage", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Aura"); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature gets +2/+2. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield))); + + // Madness {1}{R} + this.addAbility(new MadnessAbility(this, new ManaCostsImpl("{1}{R}"))); + } + + public SenselessRage(final SenselessRage card) { + super(card); + } + + @Override + public SenselessRage copy() { + return new SenselessRage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SpitefulMotives.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SpitefulMotives.java new file mode 100644 index 00000000000..88a038016d7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/SpitefulMotives.java @@ -0,0 +1,87 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlashAbility; +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 SpitefulMotives extends CardImpl { + + public SpitefulMotives(UUID ownerId) { + super(ownerId, 183, "Spiteful Motives", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Aura"); + + // Flash + this.addAbility(FlashAbility.getInstance()); + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + // Enchanted creature gets +3/+0 and has first strike. + Effect effect = new BoostEnchantedEffect(3, 0, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature gets +3/+0"); + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has first strike"); + ability.addEffect(effect); + this.addAbility(ability); + } + + public SpitefulMotives(final SpitefulMotives card) { + super(card); + } + + @Override + public SpitefulMotives copy() { + return new SpitefulMotives(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/StensiaMasquerade.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/StensiaMasquerade.java new file mode 100644 index 00000000000..cd1a61688b7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/StensiaMasquerade.java @@ -0,0 +1,131 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.MadnessAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.game.Game; +import mage.game.events.DamagedPlayerEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LevelX2 + */ +public class StensiaMasquerade extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(new AttackingPredicate()); + } + + public StensiaMasquerade(UUID ownerId) { + super(ownerId, 184, "Stensia Masquerade", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); + this.expansionSetCode = "SOI"; + + // Attacking creatures you control have first strike. + Effect effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter); + effect.setText("Attacking creatures you control have first strike"); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + + // Whenever a Vampire you control deals combat damage to a player, put a +1/+1 counter on it. + this.addAbility(new StensiaMasqueradeTriggeredAbility()); + + // Madness {2}{R} + this.addAbility(new MadnessAbility(this, new ManaCostsImpl("{2}{R}"))); + } + + public StensiaMasquerade(final StensiaMasquerade card) { + super(card); + } + + @Override + public StensiaMasquerade copy() { + return new StensiaMasquerade(this); + } +} + +class StensiaMasqueradeTriggeredAbility extends TriggeredAbilityImpl { + + public StensiaMasqueradeTriggeredAbility() { + super(Zone.BATTLEFIELD, null, false); + } + + public StensiaMasqueradeTriggeredAbility(final StensiaMasqueradeTriggeredAbility ability) { + super(ability); + } + + @Override + public StensiaMasqueradeTriggeredAbility copy() { + return new StensiaMasqueradeTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; + Permanent permanent = game.getPermanent(event.getSourceId()); + if (damageEvent.isCombatDamage() && permanent != null + && permanent.hasSubtype("Vampire") && permanent.getControllerId().equals(controllerId)) { + this.getEffects().clear(); + AddCountersTargetEffect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance()); + effect.setTargetPointer(new FixedTarget(permanent.getId())); + this.addEffect(effect); + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever a Vampire you control deals combat damage to a player, put a +1/+1 counter on it."; + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UlrichsKindred.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UlrichsKindred.java new file mode 100644 index 00000000000..f21f3cde990 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UlrichsKindred.java @@ -0,0 +1,87 @@ +/* + * 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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class UlrichsKindred extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking Wolf or Werewolf"); + + static { + filter.add(Predicates.or(new SubtypePredicate("Wolf"), new SubtypePredicate("Werewolf"))); + filter.add(new AttackingPredicate()); + } + + public UlrichsKindred(UUID ownerId) { + super(ownerId, 187, "Ulrich's Kindred", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "SOI"; + this.subtype.add("Wolf"); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + // {3}{G}: Target attacking Wolf or Werewolf gains indestructible until end of turn. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, + new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn), + new ManaCostsImpl<>("{3}{G}")); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + } + + public UlrichsKindred(final UlrichsKindred card) { + super(card); + } + + @Override + public UlrichsKindred copy() { + return new UlrichsKindred(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UncagedFury.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UncagedFury.java new file mode 100644 index 00000000000..70d049b3c71 --- /dev/null +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/UncagedFury.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.shadowsoverinnistrad; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class UncagedFury extends CardImpl { + + public UncagedFury(UUID ownerId) { + super(ownerId, 188, "Uncaged Fury", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{R}"); + this.expansionSetCode = "SOI"; + + // Target creature gets +1/+1 and gains double strike until end of turn. + Effect effect = new BoostTargetEffect(1, 1, Duration.EndOfTurn); + effect.setText("Target creature gets +1/+1"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains double strike until end of turn."); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public UncagedFury(final UncagedFury card) { + super(card); + } + + @Override + public UncagedFury copy() { + return new UncagedFury(this); + } +} diff --git a/Mage.Sets/src/mage/sets/shardsofalara/LightningTalons.java b/Mage.Sets/src/mage/sets/shardsofalara/LightningTalons.java index 726d24ee10d..5286bc95a2c 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/LightningTalons.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/LightningTalons.java @@ -25,17 +25,12 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.sets.shardsofalara; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; @@ -43,7 +38,11 @@ import mage.abilities.keyword.EnchantAbility; import mage.abilities.keyword.FirstStrikeAbility; 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; @@ -53,23 +52,27 @@ import mage.target.common.TargetCreaturePermanent; */ public class LightningTalons extends CardImpl { - public LightningTalons (UUID ownerId) { + public LightningTalons(UUID ownerId) { super(ownerId, 107, "Lightning Talons", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); this.expansionSetCode = "ALA"; this.subtype.add("Aura"); - TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 0, Duration.WhileOnBattlefield))); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA))); + Effect effect2 = new BoostEnchantedEffect(3, 0, Duration.WhileOnBattlefield); + effect2.setText("Enchanted creature gets +3/+0"); + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(3, 0, Duration.WhileOnBattlefield)); + effect2 = new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.AURA); + effect2.setText("and has first strike"); + ability.addEffect(effect2); + this.addAbility(ability); } - public LightningTalons (final LightningTalons card) { + public LightningTalons(final LightningTalons card) { super(card); } diff --git a/Utils/init.txt - Shortcut.lnk b/Utils/init.txt - Shortcut.lnk deleted file mode 100644 index 046e95a2a91012c520f325e3f059bfb487e0bcd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7271 zcmeHM32c-_6n?#+ibyM!qrtKq4FYyUEtep$ExX%N=pkDaWyO+ZTNc|b?v_K5f&~dE z28a+)$`KSRl!_HRQcyu7goJ7X0b+~^1Qa~DOgs_r`(}6lw%e^;h!sR;^X7Q}oByAg z_ue;eX2*y~NK7blk=-g6^BRd19qNxiP`Kr_nA#9ux%uP0(L?U74O!rklMrv|E4p=x zk*+E6X>nmIW`CMdmH3@`$C#H67vpiPoZWf3he(vnscJj>VA;#*tCGwI7KiGe73rh8 zpZf@fPE`YB{E|*dc9wG=m85RJcyj;H(HpA|{d}m#{CjEZ>e6Q>I85&z{c(Qe6OjjW zax6^b?Xc%M$3!g*Q!mX8@KO&8uU?8;q9xnX??U|h=Tc*%HeCqKU9#?ntpmWnol;#v z(V$GROR=ONpCnFkOSZVANT#A~1K&+i=?w~JB@)yLWEO`MKtv~b5H66(sJpKlD0Lu-juI(D34Iw;W5XVGjVL!R{%qXJ z%TM+@OMyCl)xLV@($XH=%#}L|o=*#N>=Vp_0~A?gI#V4bnWmf+Q*sGdnV4}nw6n;x ztD4WK*M-o7$UV&JrRJBB>&De*sTQ(3%I3R?#6zx)uTu;vMy$TetDqv(p5{ZO1Q6G3 zSr^BsjwP{Co4Z6xUwzGHu9+IN$|#BCTVTWK;cQfUte@*v7JfoVGf#^|= zlp$i3aWDny*o}Ig_xo;{0`1!s&xo2$rb{8(PGvaOASTDDsX=vx@@OcnK@CmHW2Kz7 zlBCdd5a*!MStG}cI(hxY1bzZ0Wx{W;43d8M-4A{e zB#bgg^pc?_nvYzE9!_m}>lS$T=?PyH^f;7W{drC93%$~gaxlt@sirGekZFk)L;p6E zuO3l0|JU>-11D5oOgenY-@o4r8vqZB2&aF46@-7!#CrqzH|3~W z+*5lm#b1RVKi%s5P+6Q};3ua*VL|!v?-16p2mSb4lsB#)r^8g3x|s)Wh?2rd`B>e7 z8d998CZBpgKP(iv0#1s1Q=LMTQ7a_TFoCM86KE;lH+Yre@B0K2&G(bgXgS}vHk#(m ziUU4W-ttwEWG(EH@#g7od$~^LTqbBJSm(s+BeN%b2nICTgztfMEmxqCAFjiDB$rvh z1f9>vgFv7`T+l${4m2{nprIFw0>c?9zh(ewd$QX*y{-a44z4#?Dth0S$9b?@PyjLx zf;#pffEdyEKLE%?FBJ7OS0E70NKQ4CB-^_&0#c+T`RtIIVp6CJba+5WrT2w~Y|_ zS^?PhAOLJOR2>Mwx`D3&7-L8q!cnIRRP)igX5i|Wl(?(MRRCASC#}}ylz*cvp%Z*9 zDB#)zBiC_|1g;fm+yXAond{ntE87c;YfayM5GA%EXPyIgFr*$N@(CgFGX;rCVN`)P zH8h_N;L^f0AmkCZp-4+bYLj6OG$MZhT#FHC0BAtTvrX6r1Iq^IWp3gP^uY*VvfqK7pSdmv>neO$GvzEa zZX8p#;-bR|D#ooqvCIPb(rQ!!ZA9EF)q#&Q>H^9^mBN0xH|3X~?EgGc8Mxk~rbyud{na&I`7Qo)s9Ql!7RwP)cQ92F%&RRo0KX zFBlE#j?*U`)O}qd-p=X#?G^POf3AJ8Pjtcr4$GG+P@$`H+${N`2SIiaCrG|!+oGQk z-AS^|?vjy1tmE8vm)q)zOF2h{*C<6o#cDN=8f&toWtl7q*&{uolIL*Q-BXI}ZmY4# zHoeg9EOuKn?ZqkfNltgRt7xj-1_rO9tQpAk7Q1VP-DUMeK32_`Zil8DgPQ3Eg4|TB z28?GzC6*!(zy^hc8Vd7I4uWZODBKP*Vqi8jvx0vQQE$OPGdt}8aj;{?A3L$={m0UG z>gGOX+`skfP2jhp0LL*36x`O9fh*_6`vq^_oBO+WI*#?gt?fH(pFe_N`+ zkD~x5@L$=RIo@0l{BFZ|Hjp&;NtkA1+jzWPQR=GLly$35RK(Ss-*^0#M;=-+?_~6A Rr+#afJUaiI=AQE%e*v{AN5TLA