From 0f4d90b8718b959b658da17b45f4a12b4acb8512 Mon Sep 17 00:00:00 2001 From: Daniel Bomar Date: Fri, 8 Jan 2021 07:04:47 -0600 Subject: [PATCH] [KHM] Implemented Varragoth, Bloodsky Sire (#7341) * [KHM] Implemented Boast mechanic * BoastAbility - Added author tag * [KHM] Implemented Varragoth, Bloodsky Sire * [KHM] Fixup BoastAbility and added BoastHint * [KHM] BoastAbility - Call super instead of copying code --- .../mage/cards/v/VarragothBloodskySire.java | 87 +++++++++++++++++++ Mage.Sets/src/mage/sets/Kaldheim.java | 1 + .../condition/common/BoastCondition.java | 29 +++++++ .../mage/abilities/hint/common/BoastHint.java | 28 ++++++ .../mage/abilities/keyword/BoastAbility.java | 45 ++++++++++ 5 files changed, 190 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VarragothBloodskySire.java create mode 100644 Mage/src/main/java/mage/abilities/condition/common/BoastCondition.java create mode 100644 Mage/src/main/java/mage/abilities/hint/common/BoastHint.java create mode 100644 Mage/src/main/java/mage/abilities/keyword/BoastAbility.java diff --git a/Mage.Sets/src/mage/cards/v/VarragothBloodskySire.java b/Mage.Sets/src/mage/cards/v/VarragothBloodskySire.java new file mode 100644 index 00000000000..8676887683f --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VarragothBloodskySire.java @@ -0,0 +1,87 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.keyword.BoastAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.SearchEffect; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author weirddan455 + */ +public final class VarragothBloodskySire extends CardImpl { + + public VarragothBloodskySire(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.DEMON); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // Boast -- {1}{B}:Target player searches their library for a card, then shuffles their library and puts that card on top of it. + Ability ability = new BoastAbility(new VarragothBloodskySireEffect(), new ManaCostsImpl("{1}{B}")); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + private VarragothBloodskySire(final VarragothBloodskySire card) { + super(card); + } + + @Override + public VarragothBloodskySire copy() { + return new VarragothBloodskySire(this); + } +} + +class VarragothBloodskySireEffect extends SearchEffect { + + public VarragothBloodskySireEffect() { + super(new TargetCardInLibrary(), Outcome.DrawCard); + this.staticText = "Target player searches their library for a card, then shuffles their library and puts that card on top of it"; + } + + private VarragothBloodskySireEffect(final VarragothBloodskySireEffect effect) { + super(effect); + } + + @Override + public VarragothBloodskySireEffect copy() { + return new VarragothBloodskySireEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player != null) { + if (player.searchLibrary(target, source, game)) { + Cards foundCards = new CardsImpl(target.getTargets()); + player.shuffleLibrary(source, game); + player.putCardsOnTopOfLibrary(foundCards, game, source, false); + return true; + } + player.shuffleLibrary(source, game); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Kaldheim.java b/Mage.Sets/src/mage/sets/Kaldheim.java index 8a8411cdff4..d5cae9ccde4 100644 --- a/Mage.Sets/src/mage/sets/Kaldheim.java +++ b/Mage.Sets/src/mage/sets/Kaldheim.java @@ -73,6 +73,7 @@ public final class Kaldheim extends ExpansionSet { cards.add(new SetCardInfo("Thornmantle Striker", 387, Rarity.UNCOMMON, mage.cards.t.ThornmantleStriker.class)); cards.add(new SetCardInfo("Toski, Bearer of Secrets", 197, Rarity.RARE, mage.cards.t.ToskiBearerOfSecrets.class)); cards.add(new SetCardInfo("Valkyrie Harbinger", 374, Rarity.RARE, mage.cards.v.ValkyrieHarbinger.class)); + cards.add(new SetCardInfo("Varragoth, Bloodsky Sire", 115, Rarity.RARE, mage.cards.v.VarragothBloodskySire.class)); cards.add(new SetCardInfo("Volatile Fjord", 273, Rarity.COMMON, mage.cards.v.VolatileFjord.class)); cards.add(new SetCardInfo("Warchanter Skald", 381, Rarity.UNCOMMON, mage.cards.w.WarchanterSkald.class)); cards.add(new SetCardInfo("Woodland Chasm", 274, Rarity.COMMON, mage.cards.w.WoodlandChasm.class)); diff --git a/Mage/src/main/java/mage/abilities/condition/common/BoastCondition.java b/Mage/src/main/java/mage/abilities/condition/common/BoastCondition.java new file mode 100644 index 00000000000..72d1f3446a5 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/common/BoastCondition.java @@ -0,0 +1,29 @@ +package mage.abilities.condition.common; + +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.keyword.BoastAbility; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.watchers.common.AttackedThisTurnWatcher; + +/** + * + * @author weirddan455 + */ +public enum BoastCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = game.getPermanentOrLKIBattlefield(source.getSourceId()); + AttackedThisTurnWatcher watcher = game.getState().getWatcher(AttackedThisTurnWatcher.class); + if (source instanceof BoastAbility && creature != null && watcher != null) { + BoastAbility ability = (BoastAbility) source; + return ability.hasMoreActivationsThisTurn(game) && + watcher.getAttackedThisTurnCreatures().contains(new MageObjectReference(creature, game)); + } + return false; + } +} diff --git a/Mage/src/main/java/mage/abilities/hint/common/BoastHint.java b/Mage/src/main/java/mage/abilities/hint/common/BoastHint.java new file mode 100644 index 00000000000..cee01edb34f --- /dev/null +++ b/Mage/src/main/java/mage/abilities/hint/common/BoastHint.java @@ -0,0 +1,28 @@ +package mage.abilities.hint.common; + +import mage.abilities.Ability; +import mage.abilities.condition.common.BoastCondition; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.game.Game; + +/** + * + * @author weirddan455 + */ +public enum BoastHint implements Hint { + instance; + private static final ConditionHint hint = new ConditionHint(BoastCondition.instance, + "Can activate Boast ability", null, + "Can't activate Boast ability", null, true); + + @Override + public String getText(Game game, Ability ability) { + return hint.getText(game, ability); + } + + @Override + public Hint copy() { + return instance; + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/BoastAbility.java b/Mage/src/main/java/mage/abilities/keyword/BoastAbility.java new file mode 100644 index 00000000000..8b547455e8f --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/BoastAbility.java @@ -0,0 +1,45 @@ +package mage.abilities.keyword; + +import mage.abilities.ActivatedAbilityImpl; +import mage.abilities.condition.common.BoastCondition; +import mage.abilities.costs.mana.ManaCosts; +import mage.abilities.effects.Effect; +import mage.abilities.hint.common.BoastHint; +import mage.constants.Zone; +import mage.game.Game; +import mage.watchers.common.AttackedThisTurnWatcher; + +/** + * + * @author weirddan455 + */ +public class BoastAbility extends ActivatedAbilityImpl { + + public BoastAbility(Effect effect, ManaCosts cost) { + super(Zone.BATTLEFIELD, effect, cost); + this.maxActivationsPerTurn = 1; + this.addWatcher(new AttackedThisTurnWatcher()); + this.condition = BoastCondition.instance; + this.addHint(BoastHint.instance); + } + + public BoastAbility(BoastAbility ability) { + super(ability); + } + + @Override + public BoastAbility copy() { + return new BoastAbility(this); + } + + // Needed to make this public for BoastHint to work correctly (called by BoastCondition) + @Override + public boolean hasMoreActivationsThisTurn(Game game) { + return super.hasMoreActivationsThisTurn(game); + } + + @Override + public String getRule() { + return "Boast — " + super.getRule() + " (Activate this ability only if this creature attacked this turn and only once each turn.)"; + } +}