diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index d74c8c8f79d..ffdef851a25 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -1291,7 +1291,7 @@ public final class GamePanel extends javax.swing.JPanel { clearClosedCardHintsWindows(); // too many dialogs can cause bad GUI performance, so limit it - if (cardHintsWindows.size() > CardHintsHelperDialog.GUI_MAX_CARD_HINTS_DIALOGS_PER_GAME) { + if (cardHintsWindows.size() >= CardHintsHelperDialog.GUI_MAX_CARD_HINTS_DIALOGS_PER_GAME) { // show last one instead cardHintsWindows.values().stream().reduce((a, b) -> b).ifPresent(CardHintsHelperDialog::show); return; diff --git a/Mage.Sets/src/mage/cards/a/AarakocraSneak.java b/Mage.Sets/src/mage/cards/a/AarakocraSneak.java index 7b7adfb9124..c85fa14c7b1 100644 --- a/Mage.Sets/src/mage/cards/a/AarakocraSneak.java +++ b/Mage.Sets/src/mage/cards/a/AarakocraSneak.java @@ -3,6 +3,7 @@ package mage.cards.a; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +29,7 @@ public final class AarakocraSneak extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Aarakocra Sneak enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); } private AarakocraSneak(final AarakocraSneak card) { diff --git a/Mage.Sets/src/mage/cards/a/AvengingHunter.java b/Mage.Sets/src/mage/cards/a/AvengingHunter.java index 347c89a3c4e..a83240f1959 100644 --- a/Mage.Sets/src/mage/cards/a/AvengingHunter.java +++ b/Mage.Sets/src/mage/cards/a/AvengingHunter.java @@ -3,6 +3,7 @@ package mage.cards.a; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +29,7 @@ public final class AvengingHunter extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Whenever Avenging Hunter enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); } private AvengingHunter(final AvengingHunter card) { diff --git a/Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java b/Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java index 53730109915..ca1184a9885 100644 --- a/Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java +++ b/Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java @@ -8,6 +8,7 @@ import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.common.combat.GoadTargetEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -31,7 +32,7 @@ public final class BloodboilSorcerer extends CardImpl { this.toughness = new MageInt(3); // Whenever Bloodboil Sorcerer enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Crown of Madness — {1}{R}, Sacrifice an artifact or creature: Goad target creature. Ability ability = new SimpleActivatedAbility(new GoadTargetEffect(), new ManaCostsImpl<>("{1}{R}")); diff --git a/Mage.Sets/src/mage/cards/c/CavesOfChaosAdventurer.java b/Mage.Sets/src/mage/cards/c/CavesOfChaosAdventurer.java index 4e20f11fa38..2c3562cd59d 100644 --- a/Mage.Sets/src/mage/cards/c/CavesOfChaosAdventurer.java +++ b/Mage.Sets/src/mage/cards/c/CavesOfChaosAdventurer.java @@ -8,6 +8,7 @@ import mage.abilities.condition.common.CompletedDungeonCondition; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.TrampleAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -38,7 +39,7 @@ public final class CavesOfChaosAdventurer extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // When Caves of Chaos Adventurer enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Whenever Caves of Chaos Adventurer attacks, exile the top card of your library. If you've completed a dungeon, you may play that card this turn without paying its mana cost. Otherwise, you may play this card this turn. this.addAbility(new AttacksTriggeredAbility(new CavesOfChaosAdventurerEffect()) diff --git a/Mage.Sets/src/mage/cards/d/DungeoneersPack.java b/Mage.Sets/src/mage/cards/d/DungeoneersPack.java index 8733ccbbd74..6e1954ee337 100644 --- a/Mage.Sets/src/mage/cards/d/DungeoneersPack.java +++ b/Mage.Sets/src/mage/cards/d/DungeoneersPack.java @@ -10,6 +10,7 @@ import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -35,6 +36,7 @@ public final class DungeoneersPack extends CardImpl { ability.addEffect(new GainLifeEffect(3).setText(", gain 3 life")); ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy(",")); ability.addEffect(new CreateTokenEffect(new TreasureToken()).concatBy(", and")); + ability.addHint(InitiativeHint.instance); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/e/ExploreTheUnderdark.java b/Mage.Sets/src/mage/cards/e/ExploreTheUnderdark.java index 3c880efbe95..a99efceb2bb 100644 --- a/Mage.Sets/src/mage/cards/e/ExploreTheUnderdark.java +++ b/Mage.Sets/src/mage/cards/e/ExploreTheUnderdark.java @@ -2,6 +2,7 @@ package mage.cards.e; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -39,6 +40,7 @@ public final class ExploreTheUnderdark extends CardImpl { // You take the initiative. this.getSpellAbility().addEffect(new TakeTheInitiativeEffect().concatBy("
")); + this.getSpellAbility().addHint(InitiativeHint.instance); } private ExploreTheUnderdark(final ExploreTheUnderdark card) { diff --git a/Mage.Sets/src/mage/cards/f/FeywildCaretaker.java b/Mage.Sets/src/mage/cards/f/FeywildCaretaker.java index ce34233c7e6..61860fd8027 100644 --- a/Mage.Sets/src/mage/cards/f/FeywildCaretaker.java +++ b/Mage.Sets/src/mage/cards/f/FeywildCaretaker.java @@ -6,6 +6,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.HaveInitiativeCondition; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -35,7 +36,7 @@ public final class FeywildCaretaker extends CardImpl { this.addAbility(new BeginningOfEndStepTriggeredAbility( new CreateTokenEffect(new FaerieDragonToken()), TargetController.YOU, HaveInitiativeCondition.instance, false - )); + ).addHint(InitiativeHint.instance)); } private FeywildCaretaker(final FeywildCaretaker card) { diff --git a/Mage.Sets/src/mage/cards/f/FromTheCatacombs.java b/Mage.Sets/src/mage/cards/f/FromTheCatacombs.java index c4a564b4081..442d40b32b4 100644 --- a/Mage.Sets/src/mage/cards/f/FromTheCatacombs.java +++ b/Mage.Sets/src/mage/cards/f/FromTheCatacombs.java @@ -3,6 +3,7 @@ package mage.cards.f; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldWithCounterTargetEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.common.replacement.LeaveBattlefieldExileTargetReplacementEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.EscapeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -31,6 +32,7 @@ public final class FromTheCatacombs extends CardImpl { // You take the initiative. this.getSpellAbility().addEffect(new TakeTheInitiativeEffect().concatBy("
")); + this.getSpellAbility().addHint(InitiativeHint.instance); // Escape—{3}{B}{B}, Exile four other cards from your graveyard. this.addAbility(new EscapeAbility(this, "{3}{B}{B}", 5)); diff --git a/Mage.Sets/src/mage/cards/g/GoliathPaladin.java b/Mage.Sets/src/mage/cards/g/GoliathPaladin.java index 7fbec81425b..7e1eefe2cf3 100644 --- a/Mage.Sets/src/mage/cards/g/GoliathPaladin.java +++ b/Mage.Sets/src/mage/cards/g/GoliathPaladin.java @@ -3,6 +3,7 @@ package mage.cards.g; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +29,7 @@ public final class GoliathPaladin extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // When Goliath Paladin enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); } private GoliathPaladin(final GoliathPaladin card) { diff --git a/Mage.Sets/src/mage/cards/i/ImoenMysticTrickster.java b/Mage.Sets/src/mage/cards/i/ImoenMysticTrickster.java index 27ea1ecf8c5..00055162c8c 100644 --- a/Mage.Sets/src/mage/cards/i/ImoenMysticTrickster.java +++ b/Mage.Sets/src/mage/cards/i/ImoenMysticTrickster.java @@ -9,6 +9,7 @@ import mage.abilities.condition.common.HaveInitiativeCondition; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.WardAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -44,6 +45,7 @@ public final class ImoenMysticTrickster extends CardImpl { new DrawCardSourceControllerEffect(1), CompletedDungeonCondition.instance, "Draw another card if you've completed a dungeon" )); + ability.addHint(InitiativeHint.instance); this.addAbility(ability.addHint(CompletedDungeonCondition.getHint()), new CompletedDungeonWatcher()); // Choose a Background diff --git a/Mage.Sets/src/mage/cards/l/LootDispute.java b/Mage.Sets/src/mage/cards/l/LootDispute.java index 911c8151dbd..057dd329fd9 100644 --- a/Mage.Sets/src/mage/cards/l/LootDispute.java +++ b/Mage.Sets/src/mage/cards/l/LootDispute.java @@ -6,6 +6,7 @@ import mage.abilities.common.CompletedDungeonTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -28,6 +29,7 @@ public final class LootDispute extends CardImpl { // When Loot Dispute enters the battlefield, you take the initiative and create a Treasure token. Ability ability = new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()); ability.addEffect(new CreateTokenEffect(new TreasureToken()).setText("and create a Treasure token")); + ability.addHint(InitiativeHint.instance); this.addAbility(ability); // Whenever you attack a player who has the initiative, create a Treasure token. diff --git a/Mage.Sets/src/mage/cards/p/PassagewaySeer.java b/Mage.Sets/src/mage/cards/p/PassagewaySeer.java index 22a4259429d..32b5557b278 100644 --- a/Mage.Sets/src/mage/cards/p/PassagewaySeer.java +++ b/Mage.Sets/src/mage/cards/p/PassagewaySeer.java @@ -6,6 +6,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.HaveInitiativeCondition; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -40,7 +41,7 @@ public final class PassagewaySeer extends CardImpl { this.addAbility(new BeginningOfEndStepTriggeredAbility( Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), TargetController.YOU, HaveInitiativeCondition.instance, false - )); + ).addHint(InitiativeHint.instance)); } private PassagewaySeer(final PassagewaySeer card) { diff --git a/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java b/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java index b11179fac0c..1eb28c1e9d6 100644 --- a/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java +++ b/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java @@ -10,6 +10,7 @@ import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessControlledEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -45,7 +46,7 @@ public final class RasaadYnBashir extends CardImpl { new AttacksTriggeredAbility(new RasaadYnBashirEffect()), HaveInitiativeCondition.instance, "Whenever {this} attacks, if you have the initiative, " + "double the toughness of each creature you control until end of turn." - )); + ).addHint(InitiativeHint.instance)); // Choose a Background this.addAbility(ChooseABackgroundAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java b/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java index e9b55115914..61630d1b877 100644 --- a/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java +++ b/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java @@ -10,6 +10,7 @@ import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -39,7 +40,7 @@ public final class RavenloftAdventurer extends CardImpl { this.toughness = new MageInt(4); // When Ravenloft Adventurer enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // If a creature an opponent controls would die, instead exile it and put a hit counter on it. this.addAbility(new SimpleStaticAbility(new RavenloftAdventurerReplacementEffect())); diff --git a/Mage.Sets/src/mage/cards/r/RilsaRaelKingpin.java b/Mage.Sets/src/mage/cards/r/RilsaRaelKingpin.java index d3bf7cac13e..c4c5cb608b0 100644 --- a/Mage.Sets/src/mage/cards/r/RilsaRaelKingpin.java +++ b/Mage.Sets/src/mage/cards/r/RilsaRaelKingpin.java @@ -9,6 +9,7 @@ import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.DeathtouchAbility; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.MenaceAbility; @@ -40,7 +41,7 @@ public final class RilsaRaelKingpin extends CardImpl { this.addAbility(DeathtouchAbility.getInstance()); // When Rilsa Rael, Kingpin enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Whenever you attack, target attacking creature gains deathtouch until end of turn. If you've completed a dungeon, that creature also gets +5/+0 and gains first strike and menace until end of turn. Ability ability = new AttacksWithCreaturesTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/s/SafanaCalimportCutthroat.java b/Mage.Sets/src/mage/cards/s/SafanaCalimportCutthroat.java index 0795e3ddaaf..9aeee31acc8 100644 --- a/Mage.Sets/src/mage/cards/s/SafanaCalimportCutthroat.java +++ b/Mage.Sets/src/mage/cards/s/SafanaCalimportCutthroat.java @@ -7,6 +7,7 @@ import mage.abilities.condition.common.CompletedDungeonCondition; import mage.abilities.condition.common.HaveInitiativeCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.MenaceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -45,7 +46,7 @@ public final class SafanaCalimportCutthroat extends CardImpl { "If you've completed a dungeon, create three of those tokens instead" ), TargetController.YOU, HaveInitiativeCondition.instance, false - ).addHint(CompletedDungeonCondition.getHint()), new CompletedDungeonWatcher()); + ).addHint(CompletedDungeonCondition.getHint()).addHint(InitiativeHint.instance), new CompletedDungeonWatcher()); // Choose a Background this.addAbility(ChooseABackgroundAbility.getInstance()); diff --git a/Mage.Sets/src/mage/cards/s/SarevoksTome.java b/Mage.Sets/src/mage/cards/s/SarevoksTome.java index 9c66370018f..75389d857b2 100644 --- a/Mage.Sets/src/mage/cards/s/SarevoksTome.java +++ b/Mage.Sets/src/mage/cards/s/SarevoksTome.java @@ -12,6 +12,7 @@ import mage.abilities.decorator.ConditionalManaEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.mana.SimpleManaAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -35,7 +36,7 @@ public final class SarevoksTome extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); // When Sarevok's Tome enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // {T}: Add {C}. If you have the initiative, add {C}{C} instead. this.addAbility(new SimpleManaAbility( diff --git a/Mage.Sets/src/mage/cards/s/SeasonedDungeoneer.java b/Mage.Sets/src/mage/cards/s/SeasonedDungeoneer.java index 299a1b74334..6404f8f2214 100644 --- a/Mage.Sets/src/mage/cards/s/SeasonedDungeoneer.java +++ b/Mage.Sets/src/mage/cards/s/SeasonedDungeoneer.java @@ -7,6 +7,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.keyword.ExploreTargetEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.ProtectionAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -49,7 +50,7 @@ public final class SeasonedDungeoneer extends CardImpl { this.toughness = new MageInt(4); // When Seasoned Dungeoneer enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Whenever you attack, target attacking Cleric, Rogue, Warrior, or Wizard gains protection from creatures until end of turn. It explores. Ability ability = new AttacksWithCreaturesTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/s/StirringBard.java b/Mage.Sets/src/mage/cards/s/StirringBard.java index 9c6b8b31ad4..fd26fdf1076 100644 --- a/Mage.Sets/src/mage/cards/s/StirringBard.java +++ b/Mage.Sets/src/mage/cards/s/StirringBard.java @@ -7,6 +7,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.MenaceAbility; @@ -35,7 +36,7 @@ public final class StirringBard extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // When Stirring Bard enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Mantle of Inspiration — {T}: Target creature gains menace and haste until end of turn. Ability ability = new SimpleActivatedAbility( diff --git a/Mage.Sets/src/mage/cards/t/TombOfHorrorsAdventurer.java b/Mage.Sets/src/mage/cards/t/TombOfHorrorsAdventurer.java index 959611a981e..6ace8dec9e9 100644 --- a/Mage.Sets/src/mage/cards/t/TombOfHorrorsAdventurer.java +++ b/Mage.Sets/src/mage/cards/t/TombOfHorrorsAdventurer.java @@ -7,6 +7,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CompletedDungeonCondition; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -32,7 +33,7 @@ public final class TombOfHorrorsAdventurer extends CardImpl { this.toughness = new MageInt(4); // When Tomb of Horrors Adventurer enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Whenever you cast your second spell each turn, copy it. If you've completed a dungeon, copy that spell twice instead. You may choose new targets for the copies. this.addAbility(new CastSecondSpellTriggeredAbility(new TombOfHorrorsAdventurerEffect()) diff --git a/Mage.Sets/src/mage/cards/t/TrailblazersTorch.java b/Mage.Sets/src/mage/cards/t/TrailblazersTorch.java index b8f6632c6c6..a69c959b9a1 100644 --- a/Mage.Sets/src/mage/cards/t/TrailblazersTorch.java +++ b/Mage.Sets/src/mage/cards/t/TrailblazersTorch.java @@ -5,6 +5,7 @@ import mage.abilities.common.BecomesBlockedAttachedTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.EquipAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -27,7 +28,7 @@ public final class TrailblazersTorch extends CardImpl { this.subtype.add(SubType.EQUIPMENT); // When Trailblazer's Torch enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Whenever equipped creature becomes blocked, it deals 2 damage to each creature blocking it. this.addAbility(new BecomesBlockedAttachedTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/u/UndercellarSweep.java b/Mage.Sets/src/mage/cards/u/UndercellarSweep.java index d6b13fe54bf..f5e5331ea17 100644 --- a/Mage.Sets/src/mage/cards/u/UndercellarSweep.java +++ b/Mage.Sets/src/mage/cards/u/UndercellarSweep.java @@ -7,6 +7,7 @@ import mage.abilities.condition.Condition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -24,7 +25,7 @@ public final class UndercellarSweep extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{W}"); // When Undercellar Sweep enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Whenever you attack, if you or a player you're attacking has the initiative, you create two 1/1 white Soldier creature token that are tapped and attacking. this.addAbility(new ConditionalInterveningIfTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/u/UnderdarkExplorer.java b/Mage.Sets/src/mage/cards/u/UnderdarkExplorer.java index 3abc7e67ee8..2558536e7ab 100644 --- a/Mage.Sets/src/mage/cards/u/UnderdarkExplorer.java +++ b/Mage.Sets/src/mage/cards/u/UnderdarkExplorer.java @@ -3,6 +3,7 @@ package mage.cards.u; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.MenaceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -28,7 +29,7 @@ public final class UnderdarkExplorer extends CardImpl { this.addAbility(new MenaceAbility()); // When Underdark Explorer enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); } private UnderdarkExplorer(final UnderdarkExplorer card) { diff --git a/Mage.Sets/src/mage/cards/u/UndermountainAdventurer.java b/Mage.Sets/src/mage/cards/u/UndermountainAdventurer.java index b6a5ff0d065..b4a0e95b69a 100644 --- a/Mage.Sets/src/mage/cards/u/UndermountainAdventurer.java +++ b/Mage.Sets/src/mage/cards/u/UndermountainAdventurer.java @@ -8,6 +8,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.decorator.ConditionalManaEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.keyword.VigilanceAbility; import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; @@ -36,7 +37,7 @@ public final class UndermountainAdventurer extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // When Undermountain Adventurer enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // {T}: Add {G}{G}. If you've completed a dungeon, add six {G} instead. this.addAbility(new SimpleManaAbility( diff --git a/Mage.Sets/src/mage/cards/v/ViciousBattlerager.java b/Mage.Sets/src/mage/cards/v/ViciousBattlerager.java index 8cbd552b5b5..1bda4e8e2fc 100644 --- a/Mage.Sets/src/mage/cards/v/ViciousBattlerager.java +++ b/Mage.Sets/src/mage/cards/v/ViciousBattlerager.java @@ -6,6 +6,7 @@ import mage.abilities.common.BecomesBlockedByCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -30,7 +31,7 @@ public final class ViciousBattlerager extends CardImpl { this.toughness = new MageInt(5); // When Vicious Battlerager enters the battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // Spiked Retribution — Whenever Vicious Battlerager becomes blocked by a creature, that creature's controller loses 5 life. this.addAbility(new BecomesBlockedByCreatureTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/w/WhitePlumeAdventurer.java b/Mage.Sets/src/mage/cards/w/WhitePlumeAdventurer.java index 0466db78d19..270dc4241f0 100644 --- a/Mage.Sets/src/mage/cards/w/WhitePlumeAdventurer.java +++ b/Mage.Sets/src/mage/cards/w/WhitePlumeAdventurer.java @@ -7,6 +7,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CompletedDungeonCondition; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TakeTheInitiativeEffect; +import mage.abilities.hint.common.InitiativeHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -39,7 +40,7 @@ public final class WhitePlumeAdventurer extends CardImpl { this.toughness = new MageInt(3); // When White Plume Adventurer enters battlefield, you take the initiative. - this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect())); + this.addAbility(new EntersBattlefieldTriggeredAbility(new TakeTheInitiativeEffect()).addHint(InitiativeHint.instance)); // At the beginning of each opponent's upkeep, untap a creature you control. If you've completed a dungeon, untap all creatures you control instead. this.addAbility(new BeginningOfUpkeepTriggeredAbility( diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 801d948ec95..4df8934809a 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -16,6 +16,7 @@ import mage.abilities.effects.common.FightTargetsEffect; import mage.abilities.effects.common.counter.ProliferateEffect; import mage.abilities.effects.keyword.ScryEffect; import mage.abilities.hint.common.CitysBlessingHint; +import mage.abilities.hint.common.InitiativeHint; import mage.abilities.hint.common.MonarchHint; import mage.abilities.keyword.*; import mage.cards.*; @@ -2048,6 +2049,7 @@ public class VerifyCardDataTest { Map cardHints = new HashMap<>(); cardHints.put(CitysBlessingHint.class, "city's blessing"); cardHints.put(MonarchHint.class, "the monarch"); + cardHints.put(InitiativeHint.class, "the initiative"); for (Class hintClass : cardHints.keySet()) { String lookupText = cardHints.get(hintClass); boolean needHint = ref.text.contains(lookupText); diff --git a/Mage/src/main/java/mage/abilities/hint/common/InitiativeHint.java b/Mage/src/main/java/mage/abilities/hint/common/InitiativeHint.java new file mode 100644 index 00000000000..0b3020a2996 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/hint/common/InitiativeHint.java @@ -0,0 +1,37 @@ +package mage.abilities.hint.common; + +import mage.abilities.Ability; +import mage.abilities.condition.common.HaveInitiativeCondition; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.game.Game; + +import java.util.Optional; + +/** + * @author JayDi85 + */ +public enum InitiativeHint implements Hint { + + instance; + private static final ConditionHint hint = new ConditionHint(HaveInitiativeCondition.instance, "You have the Initiative"); + + @Override + public String getText(Game game, Ability ability) { + String res = hint.getText(game, ability); + if (game.getInitiativeId() == null) { + // no initiative + return res + " (no Initiative in the game)"; + } else { + // player + return res + Optional.ofNullable(game.getPlayer(game.getInitiativeId())) + .map(p -> " (current owner: " + p.getName() + ")") + .orElse(""); + } + } + + @Override + public Hint copy() { + return instance; + } +}