From 18e78b82945865e6f0b3e5ee849df2e2dbca9cdc Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 6 Jul 2014 16:00:32 +0200 Subject: [PATCH] Some fixes to M15 cards or by M15 used classes. --- .../main/java/mage/server/game/GameWorker.java | 5 ++--- .../sets/avacynrestored/GallowsAtWillowHill.java | 9 ++++----- .../mage/sets/darkascension/LingeringSouls.java | 7 +++---- Mage.Sets/src/mage/sets/eventide/Evershrike.java | 2 +- .../src/mage/sets/innistrad/GeistHonoredMonk.java | 9 ++++----- .../src/mage/sets/innistrad/MausoleumGuard.java | 9 ++++----- .../src/mage/sets/innistrad/MidnightHaunting.java | 6 +++--- .../src/mage/sets/magic2015/AjaniSteadfast.java | 1 + .../src/mage/sets/magic2015/BoonweaverGiant.java | 6 +++--- .../mage/sets/magic2015/ConstrictingSliver.java | 3 +-- .../mage/sets/magic2015/ResoluteArchangel.java | 5 +++++ .../src/mage/sets/magic2015/ReturnToTheRanks.java | 4 ++-- Mage/src/mage/abilities/AbilityImpl.java | 14 +++++++++++++- .../condition/common/NotMyTurnCondition.java | 6 ++++-- .../abilities/effects/common/GetEmblemEffect.java | 9 +++++++-- .../mage/abilities/keyword/ProtectionAbility.java | 13 ++++++++++++- Mage/src/mage/cards/CardImpl.java | 4 ++++ Mage/src/mage/game/GameImpl.java | 15 ++++++++------- Mage/src/mage/game/command/Emblem.java | 1 + Mage/src/mage/game/permanent/Permanent.java | 1 + Mage/src/mage/game/permanent/PermanentImpl.java | 10 ++++++++++ .../game/permanent/token/SpiritWhiteToken.java | 13 ++++++++++++- .../watchers/common/PlayerLostLifeWatcher.java | 3 --- 23 files changed, 105 insertions(+), 50 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/game/GameWorker.java b/Mage.Server/src/main/java/mage/server/game/GameWorker.java index 014eb50a934..1c73af6e051 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameWorker.java +++ b/Mage.Server/src/main/java/mage/server/game/GameWorker.java @@ -28,13 +28,12 @@ package mage.server.game; +import java.util.UUID; +import java.util.concurrent.Callable; import mage.MageException; import mage.game.Game; import org.apache.log4j.Logger; -import java.util.UUID; -import java.util.concurrent.Callable; - /** * * @author BetaSteward_at_googlemail.com diff --git a/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java b/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java index 1b7ace061d2..ade33fa9d4a 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/GallowsAtWillowHill.java @@ -27,8 +27,7 @@ */ package mage.sets.avacynrestored; -import mage.constants.CardType; -import mage.constants.Rarity; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; @@ -36,7 +35,9 @@ import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.Predicates; @@ -50,8 +51,6 @@ import mage.players.Player; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetCreaturePermanent; -import java.util.UUID; - /** * @author noxx */ @@ -112,7 +111,7 @@ class GallowsAtWillowHillEffect extends OneShotEffect { Player controller = game.getPlayer(permanent.getControllerId()); permanent.destroy(source.getId(), game, false); if (controller != null) { - Token spirit = new SpiritWhiteToken(); + Token spirit = new SpiritWhiteToken("AVR", 1); spirit.putOntoBattlefield(1, game, source.getSourceId(), controller.getId()); } affectedTargets++; diff --git a/Mage.Sets/src/mage/sets/darkascension/LingeringSouls.java b/Mage.Sets/src/mage/sets/darkascension/LingeringSouls.java index 530f8cbc3d3..c85fd2791e5 100644 --- a/Mage.Sets/src/mage/sets/darkascension/LingeringSouls.java +++ b/Mage.Sets/src/mage/sets/darkascension/LingeringSouls.java @@ -28,13 +28,12 @@ package mage.sets.darkascension; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.keyword.FlashbackAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.constants.TimingRule; import mage.game.permanent.token.SpiritWhiteToken; @@ -51,7 +50,7 @@ public class LingeringSouls extends CardImpl { this.color.setWhite(true); // Put two 1/1 white Spirit creature tokens with flying onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), 2)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 2)); // Flashback {1}{B} this.addAbility(new FlashbackAbility(new ManaCostsImpl("{1}{B}"), TimingRule.SORCERY)); } diff --git a/Mage.Sets/src/mage/sets/eventide/Evershrike.java b/Mage.Sets/src/mage/sets/eventide/Evershrike.java index 1f03aacab6c..e824e608e8c 100644 --- a/Mage.Sets/src/mage/sets/eventide/Evershrike.java +++ b/Mage.Sets/src/mage/sets/eventide/Evershrike.java @@ -130,7 +130,7 @@ class EvershrikeEffect extends OneShotEffect { Card aura = game.getCard(targetAura.getFirstTarget()); if (aura != null) { game.getState().setValue("attachTo:" + aura.getId(), evershrikePermanent); - aura.putOntoBattlefield(game, Zone.HAND, source.getId(), you.getId()); + aura.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), you.getId()); evershrikePermanent.addAttachment(aura.getId(), game); exiled = false; count = you.getHand().count(filterAuraCard, game); diff --git a/Mage.Sets/src/mage/sets/innistrad/GeistHonoredMonk.java b/Mage.Sets/src/mage/sets/innistrad/GeistHonoredMonk.java index 8ea8cc986a4..126f26d9c41 100644 --- a/Mage.Sets/src/mage/sets/innistrad/GeistHonoredMonk.java +++ b/Mage.Sets/src/mage/sets/innistrad/GeistHonoredMonk.java @@ -27,8 +27,7 @@ */ package mage.sets.innistrad; -import mage.constants.CardType; -import mage.constants.Rarity; +import java.util.UUID; import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; @@ -37,13 +36,13 @@ import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continious.SetPowerToughnessSourceEffect; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; +import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.game.permanent.token.SpiritWhiteToken; -import java.util.UUID; - /** * @author nantuko */ @@ -65,7 +64,7 @@ public class GeistHonoredMonk extends CardImpl { this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent()), Duration.EndOfGame))); // When Geist-Honored Monk enters the battlefield, put two 1/1 white Spirit creature tokens with flying onto the battlefield. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken(), 2))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 2))); } public GeistHonoredMonk(final GeistHonoredMonk card) { diff --git a/Mage.Sets/src/mage/sets/innistrad/MausoleumGuard.java b/Mage.Sets/src/mage/sets/innistrad/MausoleumGuard.java index 498be3dde3b..c947a4b7251 100644 --- a/Mage.Sets/src/mage/sets/innistrad/MausoleumGuard.java +++ b/Mage.Sets/src/mage/sets/innistrad/MausoleumGuard.java @@ -27,16 +27,15 @@ */ package mage.sets.innistrad; -import mage.constants.CardType; -import mage.constants.Rarity; +import java.util.UUID; import mage.MageInt; import mage.abilities.common.DiesTriggeredAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.game.permanent.token.SpiritWhiteToken; -import java.util.UUID; - /** * @author nantuko */ @@ -53,7 +52,7 @@ public class MausoleumGuard extends CardImpl { this.toughness = new MageInt(2); // When Mausoleum Guard dies, put two 1/1 white Spirit creature tokens with flying onto the battlefield. - this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken(), 2))); + this.addAbility(new DiesTriggeredAbility(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 2))); } public MausoleumGuard(final MausoleumGuard card) { diff --git a/Mage.Sets/src/mage/sets/innistrad/MidnightHaunting.java b/Mage.Sets/src/mage/sets/innistrad/MidnightHaunting.java index e1953e9fda0..8f6a80edc62 100644 --- a/Mage.Sets/src/mage/sets/innistrad/MidnightHaunting.java +++ b/Mage.Sets/src/mage/sets/innistrad/MidnightHaunting.java @@ -28,10 +28,10 @@ package mage.sets.innistrad; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.effects.common.CreateTokenEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.game.permanent.token.SpiritWhiteToken; /** @@ -47,7 +47,7 @@ public class MidnightHaunting extends CardImpl { this.color.setWhite(true); // Put two 1/1 white Spirit creature tokens with flying onto the battlefield. - this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken(), 2)); + this.getSpellAbility().addEffect(new CreateTokenEffect(new SpiritWhiteToken("ISD"), 2)); } public MidnightHaunting(final MidnightHaunting card) { diff --git a/Mage.Sets/src/mage/sets/magic2015/AjaniSteadfast.java b/Mage.Sets/src/mage/sets/magic2015/AjaniSteadfast.java index 20aef941471..150892d296d 100644 --- a/Mage.Sets/src/mage/sets/magic2015/AjaniSteadfast.java +++ b/Mage.Sets/src/mage/sets/magic2015/AjaniSteadfast.java @@ -118,6 +118,7 @@ public class AjaniSteadfast extends CardImpl { class AjaniSteadfastEmblem extends Emblem { public AjaniSteadfastEmblem() { + setName("Emblem Ajani Steadfast"); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new AjaniSteadfastPreventEffect())); this.setExpansionSetCodeForImage("M15"); } diff --git a/Mage.Sets/src/mage/sets/magic2015/BoonweaverGiant.java b/Mage.Sets/src/mage/sets/magic2015/BoonweaverGiant.java index 15cc2caf8fa..9f4855108fa 100644 --- a/Mage.Sets/src/mage/sets/magic2015/BoonweaverGiant.java +++ b/Mage.Sets/src/mage/sets/magic2015/BoonweaverGiant.java @@ -118,7 +118,7 @@ class BoonweaverGiantEffect extends OneShotEffect { } } } - if (player.chooseUse(Outcome.Neutral, "Search your Hand for an Aura card?", game)) { + if (card == null && player.chooseUse(Outcome.Neutral, "Search your Hand for an Aura card?", game)) { TargetCardInHand target = new TargetCardInHand(filter); if (player.choose(Outcome.PutCardInPlay, player.getHand(), target, game)) { card = game.getCard(target.getFirstTarget()); @@ -140,9 +140,9 @@ class BoonweaverGiantEffect extends OneShotEffect { if (card != null) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { - game.getState().setValue("attachTo:" + card.getId(), permanent.getId()); + game.getState().setValue("attachTo:" + card.getId(), permanent); } - card.putOntoBattlefield(game, zone, source.getSourceId(), source.getControllerId()); + player.putOntoBattlefieldWithInfo(card, game, zone, source.getSourceId()); if (permanent != null) { return permanent.addAttachment(card.getId(), game); } diff --git a/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java b/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java index 820554d0105..cdaef24371c 100644 --- a/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java +++ b/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java @@ -35,7 +35,6 @@ import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.continious.GainAbilityAllEffect; import mage.cards.Card; @@ -81,7 +80,7 @@ public class ConstrictingSliver extends CardImpl { // Sliver creatures you control have "When this creature enters the battlefield, you may exile target creature an opponent controls // until this creature leaves the battlefield." - Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(1), true); + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect(), true); ability.addTarget(new TargetCreaturePermanent(filterTarget)); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(ability, diff --git a/Mage.Sets/src/mage/sets/magic2015/ResoluteArchangel.java b/Mage.Sets/src/mage/sets/magic2015/ResoluteArchangel.java index 8e11776cdf7..7183976d38d 100644 --- a/Mage.Sets/src/mage/sets/magic2015/ResoluteArchangel.java +++ b/Mage.Sets/src/mage/sets/magic2015/ResoluteArchangel.java @@ -92,6 +92,11 @@ class ResoluteArchangelEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + controller.setLife(game.getLife(), game); + return true; + } return false; } } diff --git a/Mage.Sets/src/mage/sets/magic2015/ReturnToTheRanks.java b/Mage.Sets/src/mage/sets/magic2015/ReturnToTheRanks.java index 934bd14cd27..1786632046e 100644 --- a/Mage.Sets/src/mage/sets/magic2015/ReturnToTheRanks.java +++ b/Mage.Sets/src/mage/sets/magic2015/ReturnToTheRanks.java @@ -74,9 +74,9 @@ public class ReturnToTheRanks extends CardImpl { public void adjustTargets(Ability ability, Game game) { for (Effect effect : ability.getEffects()) { if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) { - int xValue = new GetXValue().calculate(game, ability); + int xValue = ability.getManaCostsToPay().getX(); ability.getTargets().clear(); - ability.addTarget(new TargetCardInYourGraveyard(xValue,xValue, new FilterCreatureCard("creature cards from your graveyard"))); + ability.addTarget(new TargetCardInYourGraveyard(xValue,xValue, filter)); } } } diff --git a/Mage/src/mage/abilities/AbilityImpl.java b/Mage/src/mage/abilities/AbilityImpl.java index b98bebd97a7..e9ddbbb07c6 100644 --- a/Mage/src/mage/abilities/AbilityImpl.java +++ b/Mage/src/mage/abilities/AbilityImpl.java @@ -167,7 +167,19 @@ public abstract class AbilityImpl implements Ability { for (Effect effect: getEffects()) { if (effect instanceof OneShotEffect) { if (!(effect instanceof PostResolveEffect)) { - result &= effect.apply(game, this); + boolean effectResult = effect.apply(game, this); + result &= effectResult; + if (logger.isDebugEnabled()) { + if (!effectResult) { + if (this.getSourceId() != null) { + MageObject mageObject = game.getObject(this.getSourceId()); + if (mageObject != null) { + logger.debug("AbilityImpl.resolve: object: " + mageObject.getName()); + } + } + logger.debug("AbilityImpl.resolve: effect returned false -" + effect.getText(this.getModes().getMode())); + } + } } } else { diff --git a/Mage/src/mage/abilities/condition/common/NotMyTurnCondition.java b/Mage/src/mage/abilities/condition/common/NotMyTurnCondition.java index 71f922aa9f9..c7940eeed00 100644 --- a/Mage/src/mage/abilities/condition/common/NotMyTurnCondition.java +++ b/Mage/src/mage/abilities/condition/common/NotMyTurnCondition.java @@ -33,7 +33,8 @@ import mage.abilities.condition.Condition; import mage.game.Game; public class NotMyTurnCondition implements Condition { - private static NotMyTurnCondition fInstance = new NotMyTurnCondition(); + + private static final NotMyTurnCondition fInstance = new NotMyTurnCondition(); public static Condition getInstance() { return fInstance; @@ -42,8 +43,9 @@ public class NotMyTurnCondition implements Condition { @Override public boolean apply(Game game, Ability source) { UUID activePlayerId = game.getActivePlayerId(); - if (activePlayerId != null) + if (activePlayerId != null) { return !activePlayerId.equals(source.getControllerId()); + } return false; } } diff --git a/Mage/src/mage/abilities/effects/common/GetEmblemEffect.java b/Mage/src/mage/abilities/effects/common/GetEmblemEffect.java index 849b7754ecc..d24a7c149fc 100644 --- a/Mage/src/mage/abilities/effects/common/GetEmblemEffect.java +++ b/Mage/src/mage/abilities/effects/common/GetEmblemEffect.java @@ -28,9 +28,10 @@ package mage.abilities.effects.common; -import mage.constants.Outcome; +import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; import mage.game.Game; import mage.game.command.Emblem; @@ -40,7 +41,7 @@ import mage.game.command.Emblem; */ public class GetEmblemEffect extends OneShotEffect { - private Emblem emblem; + private final Emblem emblem; public GetEmblemEffect(Emblem emblem) { super(Outcome.Benefit); @@ -60,6 +61,10 @@ public class GetEmblemEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { + MageObject sourceObject = game.getObject(source.getSourceId()); + if (sourceObject == null) { + return false; + } game.addEmblem(emblem, source); return true; } diff --git a/Mage/src/mage/abilities/keyword/ProtectionAbility.java b/Mage/src/mage/abilities/keyword/ProtectionAbility.java index 65ced12fa61..1cf4a57b8cc 100644 --- a/Mage/src/mage/abilities/keyword/ProtectionAbility.java +++ b/Mage/src/mage/abilities/keyword/ProtectionAbility.java @@ -48,15 +48,18 @@ import mage.game.stack.Spell; public class ProtectionAbility extends StaticAbility { protected Filter filter; + protected boolean removeAuras; public ProtectionAbility(Filter filter) { super(Zone.BATTLEFIELD, null); this.filter = filter; + this.removeAuras = true; } public ProtectionAbility(final ProtectionAbility ability) { super(ability); this.filter = ability.filter.copy(); + this.removeAuras = ability.removeAuras; } @Override @@ -66,7 +69,7 @@ public class ProtectionAbility extends StaticAbility { @Override public String getRule() { - return "Protection from " + filter.getMessage(); + return "Protection from " + filter.getMessage() + (removeAuras ? "":". This effect doesn't remove auras."); } public boolean canTarget(MageObject source, Game game) { @@ -101,4 +104,12 @@ public class ProtectionAbility extends StaticAbility { public void setFilter(FilterCard filter) { this.filter = filter; } + + public void setRemovesAuras(boolean removeAuras) { + this.removeAuras = removeAuras; + } + + public boolean removesAuras() { + return removeAuras; + } } diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index d987bdf24ef..4e1a4212957 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -507,6 +507,10 @@ public abstract class CardImpl extends MageObjectImpl implements Card { break; case EXILED: game.getExile().removeCard(this, game); + if (isFaceDown()) { + // 110.6b Permanents enter the battlefield untapped, unflipped, face up, and phased in unless a spell or ability says otherwise. + this.setFaceDown(false); + } removed = true; break; case COMMAND: diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 9982374c224..9f28fb04d4a 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -1419,13 +1419,14 @@ public abstract class GameImpl implements Game, Serializable { else { Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); if (auraFilter instanceof FilterControlledCreaturePermanent) { - if (!((FilterControlledCreaturePermanent)auraFilter).match(attachedTo, perm.getId(), perm.getControllerId(), this) || attachedTo.hasProtectionFrom(perm, this)) { + if (!((FilterControlledCreaturePermanent)auraFilter).match(attachedTo, perm.getId(), perm.getControllerId(), this) + || attachedTo.cantBeEnchantedBy(perm, this)) { if (movePermanentToGraveyardWithInfo(perm)) { somethingHappened = true; } } } else { - if (!auraFilter.match(attachedTo, this) || attachedTo.hasProtectionFrom(perm, this)) { + if (!auraFilter.match(attachedTo, this) || attachedTo.cantBeEnchantedBy(perm, this)) { // handle bestow unattachment Card card = this.getCard(perm.getId()); if (card != null && card.getCardType().contains(CardType.CREATURE)) { @@ -1442,15 +1443,15 @@ public abstract class GameImpl implements Game, Serializable { } } else if (target instanceof TargetPlayer) { - Player attachedTo = getPlayer(perm.getAttachedTo()); - if (attachedTo == null) { + Player attachedToPlayer = getPlayer(perm.getAttachedTo()); + if (attachedToPlayer == null) { if (movePermanentToGraveyardWithInfo(perm)) { somethingHappened = true; } } else { Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); - if (!auraFilter.match(attachedTo, this) || attachedTo.hasProtectionFrom(perm, this)) { + if (!auraFilter.match(attachedToPlayer, this) || attachedToPlayer.hasProtectionFrom(perm, this)) { if (movePermanentToGraveyardWithInfo(perm)) { somethingHappened = true; } @@ -1988,9 +1989,9 @@ public abstract class GameImpl implements Game, Serializable { targetName = targetPlayer.getName(); } } else { - targetName = targetObject.getName(); + targetName = targetObject.getLogName(); } - StringBuilder message = new StringBuilder(preventionSource.getName()).append(": Prevented "); + StringBuilder message = new StringBuilder(preventionSource.getLogName()).append(": Prevented "); message.append(Integer.toString(result.getPreventedDamage())).append(" damage from ").append(damageSource.getName()); if (!targetName.isEmpty()) { message.append(" to ").append(targetName); diff --git a/Mage/src/mage/game/command/Emblem.java b/Mage/src/mage/game/command/Emblem.java index aae437fcda3..b9f64a1e83a 100644 --- a/Mage/src/mage/game/command/Emblem.java +++ b/Mage/src/mage/game/command/Emblem.java @@ -63,6 +63,7 @@ public class Emblem implements CommandObject { public Emblem(final Emblem emblem) { this.id = emblem.id; + this.name = emblem.name; this.controllerId = emblem.controllerId; this.sourceId = emblem.sourceId; this.abilites = emblem.abilites.copy(); diff --git a/Mage/src/mage/game/permanent/Permanent.java b/Mage/src/mage/game/permanent/Permanent.java index 9874266c171..75bf94ea68c 100644 --- a/Mage/src/mage/game/permanent/Permanent.java +++ b/Mage/src/mage/game/permanent/Permanent.java @@ -78,6 +78,7 @@ public interface Permanent extends Card, Controllable { boolean canBeTargetedBy(MageObject source, UUID controllerId, Game game); boolean hasProtectionFrom(MageObject source, Game game); + boolean cantBeEnchantedBy(MageObject source, Game game); boolean hasSummoningSickness(); int getDamage(); int damage(int damage, UUID sourceId, Game game, boolean preventable, boolean combat); diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index 0983859e7d6..53b7b6e9a76 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -765,6 +765,16 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { return false; } + @Override + public boolean cantBeEnchantedBy(MageObject source, Game game) { + for (ProtectionAbility ability : abilities.getProtectionAbilities()) { + if (!(source.getSubtype().contains("Aura") && !ability.removesAuras()) && !ability.canTarget(source, game)) { + return true; + } + } + return false; + } + protected boolean canDamage(MageObject source, Game game) { //noxx: having protection doesn't prevents from dealing damage // instead it adds damage prevention diff --git a/Mage/src/mage/game/permanent/token/SpiritWhiteToken.java b/Mage/src/mage/game/permanent/token/SpiritWhiteToken.java index 6c76a85b4f7..ad7532b5d69 100644 --- a/Mage/src/mage/game/permanent/token/SpiritWhiteToken.java +++ b/Mage/src/mage/game/permanent/token/SpiritWhiteToken.java @@ -37,13 +37,24 @@ import mage.constants.CardType; public class SpiritWhiteToken extends Token { public SpiritWhiteToken() { + this("SHM", 0); + } + + public SpiritWhiteToken(String setCode) { + this(setCode, 0); + } + public SpiritWhiteToken(String setCode, int tokenType) { super("Spirit", "1/1 white Spirit creature token with flying"); + setOriginalExpansionSetCode(setCode); + if (tokenType > 0) { + setTokenType(tokenType); + } cardType.add(CardType.CREATURE); subtype.add("Spirit"); color.setWhite(true); power = new MageInt(1); toughness = new MageInt(1); + addAbility(FlyingAbility.getInstance()); - this.setOriginalExpansionSetCode("SHM"); } } diff --git a/Mage/src/mage/watchers/common/PlayerLostLifeWatcher.java b/Mage/src/mage/watchers/common/PlayerLostLifeWatcher.java index 267927d70e7..ae1a8247fe5 100644 --- a/Mage/src/mage/watchers/common/PlayerLostLifeWatcher.java +++ b/Mage/src/mage/watchers/common/PlayerLostLifeWatcher.java @@ -63,9 +63,6 @@ public class PlayerLostLifeWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.UNTAP_STEP_PRE) { - reset(); - } if (event.getType() == GameEvent.EventType.LOST_LIFE) { UUID playerId = event.getPlayerId(); if (playerId != null) {