From d8236a8d3a4834e23276d5a13bac80ce1a8b4790 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 11 Mar 2014 00:14:56 +0100 Subject: [PATCH] * Fixed that ThoughtAs effects could be used by any player instead of only the controller of the effect. (Fixes e.g. that Misthollow Griffin could be cast by any player from exile). --- .../mage/sets/avacynrestored/Ghostform.java | 4 +- .../avacynrestored/MisthollowGriffin.java | 22 +++--- .../mage/sets/bornofthegods/Tromokratis.java | 4 +- .../mage/sets/darkascension/HavengulLich.java | 13 ++-- .../src/mage/sets/theros/DaxosOfMeletis.java | 7 +- Mage/src/mage/abilities/SpellAbility.java | 2 +- .../abilities/costs/common/TapSourceCost.java | 2 +- .../abilities/effects/ContinuousEffects.java | 78 ++++++++++--------- .../combat/UnblockableTargetEffect.java | 3 +- .../abilities/keyword/SuspendAbility.java | 2 +- .../common/FilterCreatureForCombatBlock.java | 7 +- .../mage/game/permanent/PermanentImpl.java | 8 +- Mage/src/mage/players/ManaPool.java | 2 +- Mage/src/mage/players/PlayerImpl.java | 16 ++-- 14 files changed, 87 insertions(+), 83 deletions(-) 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); }