diff --git a/Mage.Sets/src/mage/cards/a/AcademyDrake.java b/Mage.Sets/src/mage/cards/a/AcademyDrake.java new file mode 100644 index 00000000000..3a06af16fdf --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AcademyDrake.java @@ -0,0 +1,43 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; + +import java.util.UUID; + +public class AcademyDrake extends CardImpl { + + public AcademyDrake(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + subtype.add(SubType.DRAKE); + power = new MageInt(2); + toughness = new MageInt(2); + + + // Kicker {4} + this.addAbility(new KickerAbility("{4}")); + // Flying + addAbility(FlyingAbility.getInstance()); + // If Academy Drake was kicked, it enters the battlefield with two +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), + KickedCondition.instance, "If {this} was kicked, it enters the battlefield with two +1/+1 counters on it.", "")); + + } + + public AcademyDrake(final AcademyDrake academyDrake) { + super(academyDrake); + } + + public AcademyDrake copy() { + return new AcademyDrake(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KnightOfMalice.java b/Mage.Sets/src/mage/cards/k/KnightOfMalice.java new file mode 100644 index 00000000000..e44e4410527 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KnightOfMalice.java @@ -0,0 +1,62 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.AnyPlayerControlsCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.HexproofFromBlackAbility; +import mage.abilities.keyword.HexproofFromWhiteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.ColorPredicate; + +import java.util.UUID; + +public class KnightOfMalice extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("white permanent"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + + public KnightOfMalice(UUID ownerId, CardSetInfo cardSetInfo) { + super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + subtype.add(SubType.HUMAN); + subtype.add(SubType.KNIGHT); + power = new MageInt(2); + toughness = new MageInt(2); + addAbility(FirstStrikeAbility.getInstance()); + addAbility(HexproofFromWhiteAbility.getInstance()); + + + //Knight of Malice gets +1/+0 as long as any player controls a white permanent. + addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect( + new BoostControlledEffect(1, 0, Duration.WhileOnBattlefield), + new AnyPlayerControlsCondition(filter), + "{this} gets +1/+0 as long as any player controls a white permanent."))); + + + + + + } + + public KnightOfMalice(final KnightOfMalice knightOfGrace){ + super(knightOfGrace); + } + + public KnightOfMalice copy(){ + return new KnightOfMalice(this); + } + + +} diff --git a/Mage.Sets/src/mage/sets/Dominaria.java b/Mage.Sets/src/mage/sets/Dominaria.java index 41ac9ecddee..0634cb39821 100644 --- a/Mage.Sets/src/mage/sets/Dominaria.java +++ b/Mage.Sets/src/mage/sets/Dominaria.java @@ -59,5 +59,7 @@ public class Dominaria extends ExpansionSet { cards.add(new SetCardInfo("Jhoira, Weatherlight Captain", 200, Rarity.MYTHIC, mage.cards.j.JhoiraWeatherlightCaptain.class)); cards.add(new SetCardInfo("Lyra Dawnbringer", 14, Rarity.MYTHIC, mage.cards.l.LyraDawnbringer.class)); cards.add(new SetCardInfo("Serra Disciple", 34, Rarity.COMMON, mage.cards.s.SerraDisciple.class)); + cards.add(new SetCardInfo("Knight of Malice", 52, Rarity.UNCOMMON, mage.cards.k.KnightOfMalice.class)); + cards.add(new SetCardInfo("Academy Drake", 40, Rarity.UNCOMMON, mage.cards.a.AcademyDrake.class)); } } diff --git a/Mage/src/main/java/mage/abilities/Modes.java b/Mage/src/main/java/mage/abilities/Modes.java index c942f58c362..40b2f3b6a19 100644 --- a/Mage/src/main/java/mage/abilities/Modes.java +++ b/Mage/src/main/java/mage/abilities/Modes.java @@ -51,13 +51,13 @@ import mage.target.common.TargetOpponent; public class Modes extends LinkedHashMap { private Mode currentMode; // the current mode of the selected modes - private final ArrayList selectedModes = new ArrayList<>(); + private final List selectedModes = new ArrayList<>(); private int minModes; private int maxModes; private TargetController modeChooser; private boolean eachModeMoreThanOnce; // each mode can be selected multiple times during one choice private boolean eachModeOnlyOnce; // state if each mode can be chosen only once as long as the source object exists - private final LinkedHashMap duplicateModes = new LinkedHashMap<>(); + private final Map duplicateModes = new LinkedHashMap<>(); private OptionalAdditionalModeSourceCosts optionalAdditionalModeSourceCosts = null; // only set if costs have to be paid private Filter maxModesFilter = null; // calculates the max number of available modes @@ -139,7 +139,7 @@ public class Modes extends LinkedHashMap { return null; } - public ArrayList getSelectedModes() { + public List getSelectedModes() { return selectedModes; } @@ -292,7 +292,7 @@ public class Modes extends LinkedHashMap { * @param source * @param game */ - private void setAlreadySelectedModes(ArrayList selectedModes, Ability source, Game game) { + private void setAlreadySelectedModes(List selectedModes, Ability source, Game game) { for (UUID modeId : selectedModes) { String key = getKey(source, game, modeId); game.getState().setValue(key, true); diff --git a/Mage/src/main/java/mage/abilities/keyword/HexproofFromWhiteAbility.java b/Mage/src/main/java/mage/abilities/keyword/HexproofFromWhiteAbility.java new file mode 100644 index 00000000000..c7a0b6db8f1 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/HexproofFromWhiteAbility.java @@ -0,0 +1,44 @@ +package mage.abilities.keyword; + +import mage.abilities.MageSingleton; +import mage.abilities.common.SimpleStaticAbility; +import mage.constants.Zone; + +import java.io.ObjectStreamException; + +/** + * Hexproof from white (This creature or player can't be the target of white spells or abilities + * your opponents control.) + * + * @author igoudt + */ +public class HexproofFromWhiteAbility extends SimpleStaticAbility implements MageSingleton { + + private static final HexproofFromWhiteAbility instance; + + static { + instance = new HexproofFromWhiteAbility(); + } + + private Object readResolve() throws ObjectStreamException { + return instance; + } + + public static HexproofFromWhiteAbility getInstance() { + return instance; + } + + private HexproofFromWhiteAbility() { + super(Zone.BATTLEFIELD, null); + } + + @Override + public HexproofFromWhiteAbility copy() { + return instance; + } + + @Override + public String getRule() { + return "hexproof from white"; + } +} diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 57b89875907..3adb550d55d 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -955,6 +955,14 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { } } + if (abilities.containsKey(HexproofFromWhiteAbility.getInstance().getId()) ) { + if (game.getPlayer(this.getControllerId()).hasOpponent(sourceControllerId, game) + && !game.getContinuousEffects().asThough(this.getId(), AsThoughEffectType.HEXPROOF, sourceControllerId, game) + && source.getColor(game).isWhite()) { + return false; + } + } + if (hasProtectionFrom(source, game)) { return false; }