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;
+ }
+}