diff --git a/Mage.Sets/src/mage/cards/b/BirgiGodOfStorytelling.java b/Mage.Sets/src/mage/cards/b/BirgiGodOfStorytelling.java new file mode 100644 index 00000000000..c5562ecdd15 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BirgiGodOfStorytelling.java @@ -0,0 +1,91 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileTopXMayPlayUntilEndOfTurnEffect; +import mage.abilities.keyword.BoastAbility; +import mage.cards.CardSetInfo; +import mage.cards.ModalDoubleFacesCard; +import mage.constants.*; +import mage.game.Game; +import mage.players.Player; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BirgiGodOfStorytelling extends ModalDoubleFacesCard { + + public BirgiGodOfStorytelling(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.GOD}, "{2}{R}", + "Harnfel, Horn of Bounty", new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{4}{R}" + ); + + // 1. + // Birgi, God of Storytelling + // Legendary Creature - God + this.getLeftHalfCard().addSuperType(SuperType.LEGENDARY); + this.getLeftHalfCard().setPT(new MageInt(3), new MageInt(3)); + + // Whenever you cast a spell, add {R}. Until end of turn, you don't lose this mana as steps and phases end. + this.getLeftHalfCard().addAbility(new SpellCastControllerTriggeredAbility( + new BirgiGodOfStorytellingManaEffect(), false + )); + + // Creatures you control can boast twice during each of your turns rather than once. + this.getLeftHalfCard().addAbility(BoastAbility.makeBoastTwiceAbility()); + + // 2. + // Harnfel, Horn of Bounty + // Legendary Artifact + this.getRightHalfCard().addSuperType(SuperType.LEGENDARY); + + // Discard a card: Exile the top two cards of your library. You may play those cards this turn. + this.getRightHalfCard().addAbility(new SimpleActivatedAbility( + new ExileTopXMayPlayUntilEndOfTurnEffect(2), new DiscardCardCost() + )); + } + + private BirgiGodOfStorytelling(final BirgiGodOfStorytelling card) { + super(card); + } + + @Override + public BirgiGodOfStorytelling copy() { + return new BirgiGodOfStorytelling(this); + } +} + +class BirgiGodOfStorytellingManaEffect extends OneShotEffect { + + BirgiGodOfStorytellingManaEffect() { + super(Outcome.Benefit); + staticText = "add {R}. Until end of turn, you don't lose this mana as steps and phases end"; + } + + private BirgiGodOfStorytellingManaEffect(final BirgiGodOfStorytellingManaEffect effect) { + super(effect); + } + + @Override + public BirgiGodOfStorytellingManaEffect copy() { + return new BirgiGodOfStorytellingManaEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + player.getManaPool().addMana(new Mana(ManaType.RED, 1), game, source, true); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/Kaldheim.java b/Mage.Sets/src/mage/sets/Kaldheim.java index bfd5acd09c6..8ba62c6ba36 100644 --- a/Mage.Sets/src/mage/sets/Kaldheim.java +++ b/Mage.Sets/src/mage/sets/Kaldheim.java @@ -96,6 +96,7 @@ public final class Kaldheim extends ExpansionSet { cards.add(new SetCardInfo("Behold the Multiverse", 46, Rarity.COMMON, mage.cards.b.BeholdTheMultiverse.class)); cards.add(new SetCardInfo("Beskir Shieldmate", 4, Rarity.COMMON, mage.cards.b.BeskirShieldmate.class)); cards.add(new SetCardInfo("Binding the Old Gods", 206, Rarity.UNCOMMON, mage.cards.b.BindingTheOldGods.class)); + cards.add(new SetCardInfo("Birgi, God of Storytelling", 123, Rarity.RARE, mage.cards.b.BirgiGodOfStorytelling.class)); cards.add(new SetCardInfo("Blightstep Pathway", 252, Rarity.RARE, mage.cards.b.BlightstepPathway.class)); cards.add(new SetCardInfo("Blizzard Brawl", 162, Rarity.UNCOMMON, mage.cards.b.BlizzardBrawl.class)); cards.add(new SetCardInfo("Bloodline Pretender", 235, Rarity.UNCOMMON, mage.cards.b.BloodlinePretender.class)); diff --git a/Mage/src/main/java/mage/abilities/keyword/BoastAbility.java b/Mage/src/main/java/mage/abilities/keyword/BoastAbility.java index c231dedd37d..003a5af3ad1 100644 --- a/Mage/src/main/java/mage/abilities/keyword/BoastAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/BoastAbility.java @@ -1,15 +1,21 @@ package mage.abilities.keyword; import mage.abilities.ActivatedAbilityImpl; +import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.BoastCondition; import mage.abilities.costs.Cost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; +import mage.abilities.effects.common.InfoEffect; import mage.abilities.hint.common.BoastHint; import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.watchers.common.AttackedThisTurnWatcher; +import java.util.Collection; + /** * @author weirddan455 */ @@ -42,8 +48,47 @@ public class BoastAbility extends ActivatedAbilityImpl { return super.hasMoreActivationsThisTurn(game); } + @Override + public int getMaxActivationsPerTurn(Game game) { + if (!game.isActivePlayer(getControllerId())) { + return 1; + } + Permanent permanent = game.getPermanent(getSourceId()); + if (permanent != null && !permanent.isCreature()) { + return 1; + } + return game.getBattlefield() + .getActivePermanents( + StaticFilters.FILTER_CONTROLLED_PERMANENT, + getControllerId(), getSourceId(), game + ).stream() + .map(p -> p.getAbilities(game)) + .flatMap(Collection::stream) + .anyMatch(BoastTwiceAbility.class::isInstance) ? 2 : 1; + } + @Override public String getRule() { return "Boast — " + super.getRule() + " (Activate this ability only if this creature attacked this turn and only once each turn.)"; } + + private static final class BoastTwiceAbility extends SimpleStaticAbility { + + private BoastTwiceAbility() { + super(new InfoEffect("Creatures you control can boast twice during each of your turns rather than once.")); + } + + private BoastTwiceAbility(final BoastTwiceAbility ability) { + super(ability); + } + + @Override + public BoastTwiceAbility copy() { + return new BoastTwiceAbility(this); + } + } + + public static BoastTwiceAbility makeBoastTwiceAbility() { + return new BoastTwiceAbility(); + } } diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 7d91aeff439..efae32b6391 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -40135,7 +40135,7 @@ Arni Brokenbrow|Kaldheim|120|R|{2}{R}|Legendary Creature - Human Berserker|3|3|H Axgard Cavalry|Kaldheim|121|C|{1}{R}|Creature - Dwarf Berserker|2|2|{T}: Target creature gains haste until end of turn.| Basalt Ravager|Kaldheim|122|U|{3}{R}|Creature - Giant Wizard|4|2|When Basalt Ravager enters the battlefield, it deals X damage to any target, where X is the greatest number of creatures you control that have a creature type in common.| Birgi, God of Storytelling|Kaldheim|123|R|{2}{R}|Legendary Creature - God|3|3|Whenever you cast a spell, add {R}. Until end of turn, you don't lose this mana as steps and phases end.$Creatures you control can boast twice during each of your turns rather than once.| -Harnfel, Horn of Abundance|Kaldheim|123|R|{4}{R}|Legendary Artifact|||Discard a card: Exile the top two cards of your library. You may play those cards this turn.| +Harnfel, Horn of Bounty|Kaldheim|123|R|{4}{R}|Legendary Artifact|||Discard a card: Exile the top two cards of your library. You may play those cards this turn.| Breakneck Berserker|Kaldheim|124|C|{2}{R}|Creature - Dwarf Berserker|3|2|Haste| Calamity Bearer|Kaldheim|125|R|{2}{R}{R}|Creature - Giant Berserker|3|4|If a Giant source you control would deal damage to a permanent or player, it deals double that damage to that permanent or player instead.| Cinderheart Giant|Kaldheim|126|C|{5}{R}{R}|Creature - Giant Berserker|7|6|Trample$When Cinderheart Giant dies, it deals 7 damage to a creature an opponent controls chosen at random.|