Initiative abilities - added card hint with initiative info to all related cards (closes #11424);

tests: added verify test for miss initiative card hint;
gui: fixed wrong max amount of card hint windows;
This commit is contained in:
Oleg Agafonov 2023-11-19 23:00:42 +04:00
parent 77eb3b35b8
commit 6e99a3653a
29 changed files with 92 additions and 22 deletions

View file

@ -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;

View file

@ -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) {

View file

@ -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) {

View file

@ -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}"));

View file

@ -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())

View file

@ -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);
}

View file

@ -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("<br>"));
this.getSpellAbility().addHint(InitiativeHint.instance);
}
private ExploreTheUnderdark(final ExploreTheUnderdark card) {

View file

@ -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) {

View file

@ -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("<br>"));
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));

View file

@ -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) {

View file

@ -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

View file

@ -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.

View file

@ -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) {

View file

@ -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());

View file

@ -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()));

View file

@ -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(

View file

@ -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());

View file

@ -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(

View file

@ -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(

View file

@ -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(

View file

@ -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())

View file

@ -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(

View file

@ -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(

View file

@ -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) {

View file

@ -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(

View file

@ -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(

View file

@ -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(

View file

@ -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<Class, String> 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);

View file

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