diff --git a/Mage.Sets/src/mage/sets/avacynrestored/Ghostform.java b/Mage.Sets/src/mage/sets/avacynrestored/Ghostform.java index 48688acefa8..99749d0d87e 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/Ghostform.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/Ghostform.java @@ -28,10 +28,10 @@ package mage.sets.avacynrestored; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; import mage.abilities.effects.common.combat.UnblockableTargetEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; import mage.target.common.TargetCreaturePermanent; /** diff --git a/Mage.Sets/src/mage/sets/avacynrestored/MisthollowGriffin.java b/Mage.Sets/src/mage/sets/avacynrestored/MisthollowGriffin.java index 6a587b00609..fe8f9c80279 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/MisthollowGriffin.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/MisthollowGriffin.java @@ -28,8 +28,6 @@ package mage.sets.avacynrestored; import java.util.UUID; - -import mage.constants.*; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; @@ -37,6 +35,12 @@ import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.game.Game; /** @@ -74,7 +78,7 @@ class MisthollowGriffinPlayEffect extends AsThoughEffectImpl { public HavengulLichPlayedEffect(final HavengulLichPlayedEffect effect) { super(effect); - staticText = "When you cast that card this turn, Havengul Lich gains all activated abilities of that card until end of turn"; + staticText = "When you cast that card this turn, {this} gains all activated abilities of that card until end of turn"; } @Override @@ -172,10 +172,7 @@ class HavengulLichDelayedTriggeredAbility extends DelayedTriggeredAbility { - private UUID cardId; + private final UUID cardId; public HavengulLichEffect(UUID cardId) { super(Duration.EndOfTurn, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); @@ -215,7 +212,7 @@ class HavengulLichEffect extends ContinuousEffectImpl { Card card = game.getCard(cardId); if (permanent != null && card != null) { for (ActivatedAbility ability: card.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { - permanent.addAbility(ability, game); + permanent.addAbility(ability, source.getSourceId(), game); } } return false; diff --git a/Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java b/Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java index c2f10887d16..55adf90a4d4 100644 --- a/Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java +++ b/Mage.Sets/src/mage/sets/theros/DaxosOfMeletis.java @@ -179,7 +179,7 @@ class DaxosOfMeletisCastFromExileEffect extends AsThoughEffectImpl { - private UUID cardId; + private final UUID cardId; public DaxosOfMeletisSpendAnyManaEffect(UUID cardId) { super(AsThoughEffectType.SPEND_ANY_MANA, Duration.EndOfTurn, Outcome.Benefit); @@ -204,9 +204,6 @@ class DaxosOfMeletisSpendAnyManaEffect extends AsThoughEffectImpl { @Override public boolean canActivate(UUID playerId, Game game) { if (this.spellCanBeActivatedRegularlyNow(playerId, game) || - game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST, game)) { + game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST, playerId, game)) { if (spellAbilityType.equals(SpellAbilityType.SPLIT)) { return false; } diff --git a/Mage/src/mage/abilities/costs/common/TapSourceCost.java b/Mage/src/mage/abilities/costs/common/TapSourceCost.java index 4872e4f0570..6d61b6b1e32 100644 --- a/Mage/src/mage/abilities/costs/common/TapSourceCost.java +++ b/Mage/src/mage/abilities/costs/common/TapSourceCost.java @@ -68,7 +68,7 @@ public class TapSourceCost extends CostImpl { Permanent permanent = game.getPermanent(sourceId); if (permanent != null) { return !permanent.isTapped() && - (permanent.canTap() || game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.ACTIVATE_HASTE, game)); + (permanent.canTap() || game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.ACTIVATE_HASTE, controllerId, game)); } return false; } diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index bc72a2d3dca..6e7bf05f9ec 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -79,25 +79,25 @@ public class ContinuousEffects implements Serializable { private Date lastSetTimestamp; //transient Continuous effects - private ContinuousEffectsList layeredEffects = new ContinuousEffectsList(); - private ContinuousEffectsList replacementEffects = new ContinuousEffectsList(); - private ContinuousEffectsList preventionEffects = new ContinuousEffectsList(); - private ContinuousEffectsList requirementEffects = new ContinuousEffectsList(); - private ContinuousEffectsList restrictionEffects = new ContinuousEffectsList(); - private ContinuousEffectsList restrictionUntapNotMoreThanEffects = new ContinuousEffectsList(); - private ContinuousEffectsList costModificationEffects = new ContinuousEffectsList(); - private ContinuousEffectsList spliceCardEffects = new ContinuousEffectsList(); + private ContinuousEffectsList layeredEffects = new ContinuousEffectsList<>(); + private ContinuousEffectsList replacementEffects = new ContinuousEffectsList<>(); + private ContinuousEffectsList preventionEffects = new ContinuousEffectsList<>(); + private ContinuousEffectsList requirementEffects = new ContinuousEffectsList<>(); + private ContinuousEffectsList restrictionEffects = new ContinuousEffectsList<>(); + private ContinuousEffectsList restrictionUntapNotMoreThanEffects = new ContinuousEffectsList<>(); + private ContinuousEffectsList costModificationEffects = new ContinuousEffectsList<>(); + private ContinuousEffectsList spliceCardEffects = new ContinuousEffectsList<>(); - private final Map> asThoughEffectsMap = new EnumMap>(AsThoughEffectType.class); - private final List> allEffectsLists = new ArrayList>(); + private final Map> asThoughEffectsMap = new EnumMap<>(AsThoughEffectType.class); + private final List> allEffectsLists = new ArrayList<>(); private final ApplyCountersEffect applyCounters; private final PlaneswalkerRedirectionEffect planeswalkerRedirectionEffect; private final AuraReplacementEffect auraReplacementEffect; - private final List previous = new ArrayList(); + private final List previous = new ArrayList<>(); // effect.id -> sourceId - which effect was added by which sourceId - private final Map sources = new HashMap(); + private final Map sources = new HashMap<>(); public ContinuousEffects() { applyCounters = new ApplyCountersEffect(); @@ -196,7 +196,7 @@ public class ContinuousEffects implements Serializable { } public List getLayeredEffects(Game game) { - List layerEffects = new ArrayList(); + List layerEffects = new ArrayList<>(); for (ContinuousEffect effect: layeredEffects) { switch (effect.getDuration()) { case WhileOnBattlefield: @@ -248,7 +248,7 @@ public class ContinuousEffects implements Serializable { } private List filterLayeredEffects(List effects, Layer layer) { - List layerEffects = new ArrayList(); + List layerEffects = new ArrayList<>(); for (ContinuousEffect effect: effects) { if (effect.hasLayer(layer)) { layerEffects.add(effect); @@ -258,10 +258,10 @@ public class ContinuousEffects implements Serializable { } public HashMap> getApplicableRequirementEffects(Permanent permanent, Game game) { - HashMap> effects = new HashMap>(); + HashMap> effects = new HashMap<>(); for (RequirementEffect effect: requirementEffects) { HashSet abilities = requirementEffects.getAbility(effect.getId()); - HashSet applicableAbilities = new HashSet(); + HashSet applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) { if (effect.applies(permanent, ability, game)) { @@ -277,10 +277,10 @@ public class ContinuousEffects implements Serializable { } public HashMap> getApplicableRestrictionEffects(Permanent permanent, Game game) { - HashMap> effects = new HashMap>(); + HashMap> effects = new HashMap<>(); for (RestrictionEffect effect: restrictionEffects) { HashSet abilities = restrictionEffects.getAbility(effect.getId()); - HashSet applicableAbilities = new HashSet(); + HashSet applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, ability instanceof MageSingleton ? permanent : null, false)) { if (effect.applies(permanent, ability, game)) { @@ -296,10 +296,10 @@ public class ContinuousEffects implements Serializable { } public HashMap> getApplicableRestrictionUntapNotMoreThanEffects(Player player, Game game) { - HashMap> effects = new HashMap>(); + HashMap> effects = new HashMap<>(); for (RestrictionUntapNotMoreThanEffect effect: restrictionUntapNotMoreThanEffects) { HashSet abilities = restrictionUntapNotMoreThanEffects.getAbility(effect.getId()); - HashSet applicableAbilities = new HashSet(); + HashSet applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) { if (effect.applies(player, ability, game)) { @@ -322,7 +322,7 @@ public class ContinuousEffects implements Serializable { */ private HashMap> getApplicableReplacementEffects(GameEvent event, Game game) { // List replaceEffects = new ArrayList(); - HashMap> replaceEffects = new HashMap>(); + HashMap> replaceEffects = new HashMap<>(); if (planeswalkerRedirectionEffect.applies(event, null, game)) { replaceEffects.put(planeswalkerRedirectionEffect, null); } @@ -337,7 +337,7 @@ public class ContinuousEffects implements Serializable { continue; } HashSet abilities = replacementEffects.getAbility(effect.getId()); - HashSet applicableAbilities = new HashSet(); + HashSet applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) { if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) { @@ -355,7 +355,7 @@ public class ContinuousEffects implements Serializable { } for (PreventionEffect effect: preventionEffects) { HashSet abilities = preventionEffects.getAbility(effect.getId()); - HashSet applicableAbilities = new HashSet(); + HashSet applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) { if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) { @@ -379,7 +379,7 @@ public class ContinuousEffects implements Serializable { * @return */ private List getApplicableCostModificationEffects(Game game) { - List costEffects = new ArrayList(); + List costEffects = new ArrayList<>(); for (CostModificationEffect effect: costModificationEffects) { HashSet abilities = costModificationEffects.getAbility(effect.getId()); @@ -402,7 +402,7 @@ public class ContinuousEffects implements Serializable { * @return */ private List getApplicableSpliceCardEffects(Game game, UUID playerId) { - List spliceEffects = new ArrayList(); + List spliceEffects = new ArrayList<>(); for (SpliceCardEffect effect: spliceCardEffects) { HashSet abilities = spliceCardEffects.getAbility(effect.getId()); @@ -419,13 +419,15 @@ public class ContinuousEffects implements Serializable { return spliceEffects; } - public boolean asThough(UUID objectId, AsThoughEffectType type, Game game) { + public boolean asThough(UUID objectId, AsThoughEffectType type, UUID controllerId, Game game) { List asThoughEffectsList = getApplicableAsThoughEffects(type, game); for (AsThoughEffect effect: asThoughEffectsList) { HashSet abilities = asThoughEffectsMap.get(type).getAbility(effect.getId()); for (Ability ability : abilities) { - if (effect.applies(objectId, ability, game)) { - return true; + if (controllerId.equals(ability.getControllerId())) { + if (effect.applies(objectId, ability, game)) { + return true; + } } } } @@ -440,7 +442,7 @@ public class ContinuousEffects implements Serializable { * @return */ private List getApplicableAsThoughEffects(AsThoughEffectType type, Game game) { - List asThoughEffectsList = new ArrayList(); + List asThoughEffectsList = new ArrayList<>(); if (asThoughEffectsMap.containsKey(type)) { for (AsThoughEffect effect: asThoughEffectsMap.get(type)) { HashSet abilities = asThoughEffectsMap.get(type).getAbility(effect.getId()); @@ -528,7 +530,7 @@ public class ContinuousEffects implements Serializable { } List spliceEffects = getApplicableSpliceCardEffects(game, abilityToModify.getControllerId()); // get the applyable splice abilities - List spliceAbilities = new ArrayList(); + List spliceAbilities = new ArrayList<>(); for (SpliceCardEffect effect : spliceEffects) { HashSet abilities = spliceCardEffects.getAbility(effect.getId()); for (Ability ability : abilities) { @@ -545,7 +547,7 @@ public class ContinuousEffects implements Serializable { Cards cardsToReveal = new CardsImpl(); do { FilterCard filter = new FilterCard("a card to splice"); - ArrayList> idPredicates = new ArrayList>(); + ArrayList> idPredicates = new ArrayList<>(); for (SpliceOntoArcaneAbility ability : spliceAbilities) { idPredicates.add(new CardIdPredicate((ability.getSourceId()))); } @@ -578,7 +580,7 @@ public class ContinuousEffects implements Serializable { public boolean replaceEvent(GameEvent event, Game game) { boolean caught = false; - HashMap> consumed = new HashMap>(); + HashMap> consumed = new HashMap<>(); do { HashMap> rEffects = getApplicableReplacementEffects(event, game); // Remove all consumed effects (ability dependant) @@ -670,7 +672,7 @@ public class ContinuousEffects implements Serializable { } } } else { - HashSet set = new HashSet(); + HashSet set = new HashSet<>(); if (rAbility != null) { // in case of AuraReplacementEffect or PlaneswalkerReplacementEffect there is no Ability set.add(rAbility.getId()); } @@ -728,7 +730,7 @@ public class ContinuousEffects implements Serializable { } } - Map> appliedEffects = new HashMap>(); + Map> appliedEffects = new HashMap<>(); boolean done = false; while (!done) { // loop needed if a added effect adds again an effect (e.g. Level 5- of Joraga Treespeaker) done = true; @@ -740,7 +742,7 @@ public class ContinuousEffects implements Serializable { for (Ability ability : abilities) { if (appliedAbilities == null || !appliedAbilities.contains(ability)) { if (appliedAbilities == null) { - appliedAbilities = new ArrayList(); + appliedAbilities = new ArrayList<>(); appliedEffects.put(effect, appliedAbilities); } appliedAbilities.add(ability); @@ -880,8 +882,8 @@ public class ContinuousEffects implements Serializable { * @return */ public List removeGainedEffectsForSource(UUID sourceId) { - List effects = new ArrayList(); - Set effectsToRemove = new HashSet(); + List effects = new ArrayList<>(); + Set effectsToRemove = new HashSet<>(); for (Map.Entry source : sources.entrySet()) { if (sourceId.equals(source.getValue())) { for (ContinuousEffectsList effectsList : allEffectsLists) { @@ -904,7 +906,7 @@ public class ContinuousEffects implements Serializable { } public List getReplacementEffectsTexts(HashMap> rEffects, Game game) { - List texts = new ArrayList(); + List texts = new ArrayList<>(); for (Map.Entry entry : rEffects.entrySet()) { for (Ability ability :(HashSet) entry.getValue()) { MageObject object = game.getObject(ability.getSourceId()); diff --git a/Mage/src/mage/abilities/effects/common/combat/UnblockableTargetEffect.java b/Mage/src/mage/abilities/effects/common/combat/UnblockableTargetEffect.java index 284167fd757..24237464476 100644 --- a/Mage/src/mage/abilities/effects/common/combat/UnblockableTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/combat/UnblockableTargetEffect.java @@ -34,6 +34,7 @@ import mage.abilities.effects.RestrictionEffect; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.Target; +import mage.util.CardUtil; /** * @@ -76,7 +77,7 @@ public class UnblockableTargetEffect extends RestrictionEffect 1) { diff --git a/Mage/src/mage/abilities/keyword/SuspendAbility.java b/Mage/src/mage/abilities/keyword/SuspendAbility.java index 567b84df65e..f0e86aac83d 100644 --- a/Mage/src/mage/abilities/keyword/SuspendAbility.java +++ b/Mage/src/mage/abilities/keyword/SuspendAbility.java @@ -194,7 +194,7 @@ public class SuspendAbility extends ActivatedAbilityImpl { MageObject object = game.getObject(sourceId); if ((object.getCardType().contains(CardType.INSTANT) || object.getAbilities().containsKey(FlashAbility.getInstance().getId()) || - game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST, game) || + game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST, playerId, game) || game.canPlaySorcery(playerId))) { return true; } diff --git a/Mage/src/mage/filter/common/FilterCreatureForCombatBlock.java b/Mage/src/mage/filter/common/FilterCreatureForCombatBlock.java index db405b4bbee..d8ad11777f9 100644 --- a/Mage/src/mage/filter/common/FilterCreatureForCombatBlock.java +++ b/Mage/src/mage/filter/common/FilterCreatureForCombatBlock.java @@ -29,7 +29,10 @@ package mage.filter.common; import mage.constants.AsThoughEffectType; +import mage.filter.predicate.ObjectPlayer; +import mage.filter.predicate.ObjectPlayerPredicate; import mage.filter.predicate.Predicate; +import mage.game.Controllable; import mage.game.Game; import mage.game.permanent.Permanent; @@ -61,8 +64,8 @@ public class FilterCreatureForCombatBlock extends FilterCreatureForCombatBase { class BlockTappedPredicate implements Predicate { @Override - public boolean apply(Permanent input, Game game) { - return !input.isTapped() || game.getState().getContinuousEffects().asThough(input.getId(), AsThoughEffectType.BLOCK_TAPPED, game); + public boolean apply(Permanent input, Game game) { + return !input.isTapped() || game.getState().getContinuousEffects().asThough(input.getId(), AsThoughEffectType.BLOCK_TAPPED, input.getControllerId(), game); } @Override diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index 4fa6cd5291b..1b60e635171 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -765,7 +765,7 @@ public abstract class PermanentImpl> extends CardImpl } if (abilities.containsKey(HexproofAbility.getInstance().getId())) { if (game.getPlayer(this.getControllerId()).hasOpponent(sourceControllerId, game) && - !game.getContinuousEffects().asThough(this.getId(), AsThoughEffectType.HEXPROOF, game)) { + !game.getContinuousEffects().asThough(this.getId(), AsThoughEffectType.HEXPROOF, sourceControllerId, game)) { return false; } } @@ -885,12 +885,12 @@ public abstract class PermanentImpl> extends CardImpl } } return !abilities.containsKey(DefenderAbility.getInstance().getId()) - || game.getContinuousEffects().asThough(this.objectId, AsThoughEffectType.ATTACK, game); + || game.getContinuousEffects().asThough(this.objectId, AsThoughEffectType.ATTACK, this.getControllerId(), game); } @Override public boolean canBlock(UUID attackerId, Game game) { - if (tapped && !game.getState().getContinuousEffects().asThough(this.getId(), AsThoughEffectType.BLOCK_TAPPED, game)) { + if (tapped && !game.getState().getContinuousEffects().asThough(this.getId(), AsThoughEffectType.BLOCK_TAPPED, this.getControllerId(), game)) { return false; } Permanent attacker = game.getPermanent(attackerId); @@ -923,7 +923,7 @@ public abstract class PermanentImpl> extends CardImpl @Override public boolean canBlockAny(Game game) { - if (tapped && !game.getState().getContinuousEffects().asThough(this.getId(), AsThoughEffectType.BLOCK_TAPPED, game)) { + if (tapped && !game.getState().getContinuousEffects().asThough(this.getId(), AsThoughEffectType.BLOCK_TAPPED, this.getControllerId(), game)) { return false; } diff --git a/Mage/src/mage/players/ManaPool.java b/Mage/src/mage/players/ManaPool.java index bb847f1dba2..05368201092 100644 --- a/Mage/src/mage/players/ManaPool.java +++ b/Mage/src/mage/players/ManaPool.java @@ -104,7 +104,7 @@ public class ManaPool implements Serializable { // check if any mana can be spend to cast the mana cost of an ability private boolean spendAnyMana(Ability ability, Game game) { - return game.getContinuousEffects().asThough(ability.getSourceId(), AsThoughEffectType.SPEND_ANY_MANA, game); + return game.getContinuousEffects().asThough(ability.getSourceId(), AsThoughEffectType.SPEND_ANY_MANA, ability.getControllerId(), game); } public int get(ManaType manaType) { diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index a3d1879f0e1..f2a3237c084 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -492,7 +492,7 @@ public abstract class PlayerImpl> implements Player, Ser controllerId = ((StackObject) source).getControllerId(); } if (controllerId != null && this.hasOpponent(controllerId, game) && - !game.getContinuousEffects().asThough(this.getId(), AsThoughEffectType.HEXPROOF, game)) { + !game.getContinuousEffects().asThough(this.getId(), AsThoughEffectType.HEXPROOF, this.getId(), game)) { return false; } } @@ -919,7 +919,7 @@ public abstract class PlayerImpl> implements Player, Ser protected LinkedHashMap getUseableActivatedAbilities(MageObject object, Zone zone, Game game) { - LinkedHashMap useable = new LinkedHashMap(); + LinkedHashMap useable = new LinkedHashMap<>(); if (!(object instanceof Permanent) || ((Permanent)object).canUseActivatedAbilities(game)) { for (ActivatedAbility ability: object.getAbilities().getActivatedAbilities(zone)) { if (ability.canActivate(playerId, game)) { @@ -927,7 +927,7 @@ public abstract class PlayerImpl> implements Player, Ser } } if (zone != Zone.HAND) { - if (zone != Zone.BATTLEFIELD && game.getContinuousEffects().asThough(object.getId(), AsThoughEffectType.CAST, game)) { + if (zone != Zone.BATTLEFIELD && game.getContinuousEffects().asThough(object.getId(), AsThoughEffectType.CAST, this.getId(), game)) { for (Ability ability: object.getAbilities()) { ability.setControllerId(this.getId()); if (ability instanceof ActivatedAbility && ability.getZone().match(Zone.HAND)) { @@ -1765,7 +1765,7 @@ public abstract class PlayerImpl> implements Player, Ser @Override public List getPlayable(Game game, boolean hidden) { - List playable = new ArrayList(); + List playable = new ArrayList<>(); ManaOptions available = getManaAvailable(game); available.addMana(manaPool.getMana()); @@ -1785,7 +1785,7 @@ public abstract class PlayerImpl> implements Player, Ser playable.add(ability); } } - if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.CAST, game)) { + if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.CAST, this.getId(), game)) { for (ActivatedAbility ability: card.getAbilities().getActivatedAbilities(Zone.HAND)) { if (ability instanceof SpellAbility || ability instanceof PlayLandAbility) { playable.add(ability); @@ -1795,7 +1795,7 @@ public abstract class PlayerImpl> implements Player, Ser } for (ExileZone exile: game.getExile().getExileZones()) { for (Card card: exile.getCards(game)) { - if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.CAST, game)) { + if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.CAST, this.getId(), game)) { for (Ability ability: card.getAbilities()) { ability.setControllerId(this.getId()); // controller must be set for case owner != caster if (ability.getZone().match(Zone.HAND) && (ability instanceof SpellAbility || ability instanceof PlayLandAbility)) { @@ -1807,7 +1807,7 @@ public abstract class PlayerImpl> implements Player, Ser } for (Cards cards: game.getState().getRevealed().values()) { for (Card card: cards.getCards(game)) { - if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.CAST, game)) { + if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.CAST, this.getId(), game)) { for (ActivatedAbility ability: card.getAbilities().getActivatedAbilities(Zone.HAND)) { if (ability instanceof SpellAbility || ability instanceof PlayLandAbility) { playable.add(ability); @@ -2054,7 +2054,7 @@ public abstract class PlayerImpl> implements Player, Ser @Override public void revealFaceDownCard(Card card, Game game) { - if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.REVEAL_FACE_DOWN, game)) { + if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.REVEAL_FACE_DOWN, this.getId(), game)) { Cards cards = new CardsImpl(card); this.revealCards(name, cards, game); }