diff --git a/Mage.Sets/src/mage/cards/g/GuildThief.java b/Mage.Sets/src/mage/cards/g/GuildThief.java new file mode 100644 index 00000000000..a4e7a7aca02 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GuildThief.java @@ -0,0 +1,50 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.counters.CounterType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class GuildThief extends CardImpl { + + public GuildThief(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.ORC); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever Guild Thief deals combat damage to a player, put a +1/+1 counter on it. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)), false + )); + + // Cunning Action — {3}{U}: Guild Thief can't be blocked this turn. + this.addAbility(new SimpleActivatedAbility( + new CantBeBlockedSourceEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{3}{U}") + ).setFlavorWord("Cunning Action")); + } + + private GuildThief(final GuildThief card) { + super(card); + } + + @Override + public GuildThief copy() { + return new GuildThief(this); + } +} diff --git a/Mage.Sets/src/mage/sets/AdventuresInTheForgottenRealms.java b/Mage.Sets/src/mage/sets/AdventuresInTheForgottenRealms.java index 54f91df601e..37871e891bc 100644 --- a/Mage.Sets/src/mage/sets/AdventuresInTheForgottenRealms.java +++ b/Mage.Sets/src/mage/sets/AdventuresInTheForgottenRealms.java @@ -36,6 +36,7 @@ public final class AdventuresInTheForgottenRealms extends ExpansionSet { cards.add(new SetCardInfo("Flumph", 15, Rarity.RARE, mage.cards.f.Flumph.class)); cards.add(new SetCardInfo("Forest", 278, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gloom Stalker", 16, Rarity.COMMON, mage.cards.g.GloomStalker.class)); + cards.add(new SetCardInfo("Guild Thief", 61, Rarity.UNCOMMON, mage.cards.g.GuildThief.class)); cards.add(new SetCardInfo("Hive of the Eye Tyrant", 258, Rarity.RARE, mage.cards.h.HiveOfTheEyeTyrant.class)); cards.add(new SetCardInfo("Island", 266, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lolth, Spider Queen", 112, Rarity.MYTHIC, mage.cards.l.LolthSpiderQueen.class)); diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index 967164cfbce..127744885c5 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -1,9 +1,11 @@ package mage.abilities; +import mage.MageIdentifier; import mage.MageObject; import mage.abilities.costs.Cost; import mage.abilities.costs.CostAdjuster; import mage.abilities.costs.Costs; +import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.effects.Effect; @@ -25,8 +27,6 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import mage.MageIdentifier; -import mage.abilities.costs.common.TapSourceCost; /** * Practically everything in the game is started from an Ability. This interface @@ -87,7 +87,7 @@ public interface Ability extends Controllable, Serializable { /** * Gets the id of the object which put this ability in motion. - * + *

* WARNING, MageSingleton abilities contains dirty data here, so you can't use sourceId with it * * @return The {@link java.util.UUID} of the object this ability is @@ -363,10 +363,11 @@ public interface Ability extends Controllable, Serializable { * @return */ boolean hasSourceObjectAbility(Game game, MageObject source, GameEvent event); - + /** * Returns true if the ability has a tap itself in their costs - * @return + * + * @return */ default boolean hasTapCost() { for (Cost cost : this.getCosts()) { @@ -465,6 +466,8 @@ public interface Ability extends Controllable, Serializable { */ Ability setAbilityWord(AbilityWord abilityWord); + Ability setFlavorWord(String flavorWord); + /** * Creates the message about the ability casting/triggering/activating to * post in the game log before the ability resolves. @@ -550,8 +553,8 @@ public interface Ability extends Controllable, Serializable { * @return */ boolean isSameInstance(Ability ability); - - MageIdentifier getIdentifier(); + + MageIdentifier getIdentifier(); AbilityImpl setIdentifier(MageIdentifier mageIdentifier); } diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index 9c273bae43e..b79218bf333 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -60,6 +60,7 @@ public abstract class AbilityImpl implements Ability { protected Zone zone; protected String name; protected AbilityWord abilityWord; + protected String flavorWord; protected boolean usesStack = true; protected boolean ruleAtTheTop = false; protected boolean ruleVisible = true; @@ -117,6 +118,7 @@ public abstract class AbilityImpl implements Ability { this.ruleAdditionalCostsVisible = ability.ruleAdditionalCostsVisible; this.worksFaceDown = ability.worksFaceDown; this.abilityWord = ability.abilityWord; + this.flavorWord = ability.flavorWord; this.sourceObjectZoneChangeCounter = ability.sourceObjectZoneChangeCounter; this.canFizzle = ability.canFizzle; this.targetAdjuster = ability.targetAdjuster; @@ -800,8 +802,16 @@ public abstract class AbilityImpl implements Ability { } else { rule = ruleStart; } + String prefix; if (abilityWord != null) { - rule = "" + abilityWord + " — " + Character.toUpperCase(rule.charAt(0)) + rule.substring(1); + prefix = abilityWord.formatWord(); + } else if (flavorWord != null) { + prefix = "" + flavorWord + " — "; + } else { + prefix = null; + } + if (prefix != null) { + rule = prefix + CardUtil.getTextWithFirstCharUpperCase(rule); } if (appendToRule != null) { rule = rule.concat(appendToRule); @@ -1062,6 +1072,11 @@ public abstract class AbilityImpl implements Ability { return this; } + public Ability setFlavorWord(String flavorWord) { + this.flavorWord = flavorWord; + return this; + } + @Override public String getGameLogMessage(Game game) { if (game.isSimulation()) {