diff --git a/Mage.Sets/src/mage/sets/darkascension/FiendOfTheShadows.java b/Mage.Sets/src/mage/sets/darkascension/FiendOfTheShadows.java index 5ef33b775fa..c366fd41646 100644 --- a/Mage.Sets/src/mage/sets/darkascension/FiendOfTheShadows.java +++ b/Mage.Sets/src/mage/sets/darkascension/FiendOfTheShadows.java @@ -46,6 +46,7 @@ import mage.cards.CardImpl; import mage.filter.Filter; import mage.filter.FilterCard; import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.ExileZone; import mage.game.Game; import mage.target.common.TargetControlledCreaturePermanent; @@ -76,8 +77,8 @@ public class FiendOfTheShadows extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever Fiend of the Shadows deals combat damage to a player, that player exiles a card from his or her hand. You may play that card for as long as it remains exiled. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ExileFromZoneTargetEffect(Constants.Zone.HAND, exileId, "Fiend of the Shadows", new FilterCard()), false)); - this.addAbility(new SimpleStaticAbility(Constants.Zone.ALL, new FiendOfTheShadowsEffect(exileId))); + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ExileFromZoneTargetEffect(Constants.Zone.HAND, exileId, "Fiend of the Shadows", new FilterCard()), false, true)); + this.addAbility(new SimpleStaticAbility(Constants.Zone.ALL, new FiendOfTheShadowsEffect(exileId))); // Sacrifice a Human: Regenerate Fiend of the Shadows. this.addAbility(new SimpleActivatedAbility(Constants.Zone.BATTLEFIELD, new RegenerateSourceEffect(), new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, filter, false)))); @@ -98,7 +99,7 @@ class FiendOfTheShadowsEffect extends AsThoughEffectImpl getApplicableRequirementEffects(Permanent permanent, Game game) { List effects = new ArrayList(); - //get all applicable Requirement effects on the battlefield -// for (Permanent perm: game.getBattlefield().getActivePermanents(permanent.getControllerId(), game)) { -// for (Entry entry: perm.getAbilities().getEffects(game, Zone.BATTLEFIELD, EffectType.REQUIREMENT).entrySet()) { -// if (((RequirementEffect)entry.getKey()).applies(permanent, entry.getValue(), game)) { -// effects.add((RequirementEffect)entry.getKey()); -// abilityMap.put(entry.getKey().getId(), entry.getValue()); -// } -// } -// } for (RequirementEffect effect: requirementEffects) { Ability ability = abilityMap.get(effect.getId()); if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game)) { @@ -267,15 +258,6 @@ public class ContinuousEffects implements Serializable { public List getApplicableRestrictionEffects(Permanent permanent, Game game) { List effects = new ArrayList(); - //get all applicable Restriction effects on the battlefield -// for (Permanent perm: game.getBattlefield().getActivePermanents(permanent.getControllerId(), game)) { -// for (Entry entry: perm.getAbilities().getEffects(game, Zone.BATTLEFIELD, EffectType.RESTRICTION).entrySet()) { -// if (((RestrictionEffect)entry.getKey()).applies(permanent, entry.getValue(), game)) { -// effects.add((RestrictionEffect)entry.getKey()); -// abilityMap.put(entry.getKey().getId(), entry.getValue()); -// } -// } -// } for (RestrictionEffect effect: restrictionEffects) { Ability ability = abilityMap.get(effect.getId()); if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game)) { @@ -296,36 +278,6 @@ public class ContinuousEffects implements Serializable { List replaceEffects = new ArrayList(); if (planeswalkerRedirectionEffect.applies(event, null, game)) replaceEffects.add(planeswalkerRedirectionEffect); - //get all applicable Replacement effects in each players hand and graveyard -// for (Card card: game.getCards()) { -// Zone zone = game.getState().getZone(card.getId()); -// if (zone == Zone.HAND || zone == Zone.GRAVEYARD) { -// for (Entry entry: card.getAbilities().getReplacementEffects(zone).entrySet()) { -// if (entry.getKey().applies(event, entry.getValue(), game)) { -// replaceEffects.add(entry.getKey()); -// abilityMap.put(entry.getKey().getId(), entry.getValue()); -// } -// } -// } -// } - //get all applicable Replacement effects on the battlefield -// for (Permanent permanent: game.getBattlefield().getAllPermanents()) { -// for (Entry entry: permanent.getAbilities().getReplacementEffects(Zone.BATTLEFIELD).entrySet()) { -// if (entry.getKey().applies(event, entry.getValue(), game)) { -// replaceEffects.add(entry.getKey()); -// abilityMap.put(entry.getKey().getId(), entry.getValue()); -// } -// } -// } - //get all applicable Replacement effects on players -// for (Player player: game.getPlayers().values()) { -// for (Entry entry: player.getAbilities().getReplacementEffects(Zone.BATTLEFIELD).entrySet()) { -// if (entry.getKey().applies(event, entry.getValue(), game)) { -// replaceEffects.add(entry.getKey()); -// abilityMap.put(entry.getKey().getId(), entry.getValue()); -// } -// } -// } //get all applicable transient Replacement effects for (ReplacementEffect effect: replacementEffects) { Ability ability = abilityMap.get(effect.getId()); @@ -351,16 +303,6 @@ public class ContinuousEffects implements Serializable { } public boolean asThough(UUID objectId, AsThoughEffectType type, Game game) { - for (Permanent permanent: game.getBattlefield().getAllPermanents()) { - for (Ability ability: permanent.getAbilities().getStaticAbilities(Zone.BATTLEFIELD)) { - for (Effect effect: ability.getEffects(game, EffectType.ASTHOUGH)) { - AsThoughEffect rEffect = (AsThoughEffect) effect; - if (rEffect.applies(objectId, ability, game)) { - return true; - } - } - } - } for (AsThoughEffect entry: asThoughEffects) { AsThoughEffect effect = entry; if (effect.getAsThoughEffectType() == type) { @@ -435,52 +377,31 @@ public class ContinuousEffects implements Serializable { removeInactiveEffects(game); List layerEffects = getLayeredEffects(game); List layer = filterLayeredEffects(layerEffects, Layer.CopyEffects_1); -// for (ContinuousEffect effect: layer) { -// effect.apply(Layer.CopyEffects_1, SubLayer.CharacteristicDefining_7a, abilityMap.get(effect.getId()), game); -// } for (ContinuousEffect effect: layer) { effect.apply(Layer.CopyEffects_1, SubLayer.NA, abilityMap.get(effect.getId()), game); } layer = filterLayeredEffects(layerEffects, Layer.ControlChangingEffects_2); -// for (ContinuousEffect effect: layer) { -// effect.apply(Layer.ControlChangingEffects_2, SubLayer.CharacteristicDefining_7a, abilityMap.get(effect.getId()), game); -// } for (ContinuousEffect effect: layer) { effect.apply(Layer.ControlChangingEffects_2, SubLayer.NA, abilityMap.get(effect.getId()), game); } layer = filterLayeredEffects(layerEffects, Layer.TextChangingEffects_3); -// for (ContinuousEffect effect: layer) { -// effect.apply(Layer.TextChangingEffects_3, SubLayer.CharacteristicDefining_7a, abilityMap.get(effect.getId()), game); -// } for (ContinuousEffect effect: layer) { effect.apply(Layer.TextChangingEffects_3, SubLayer.NA, abilityMap.get(effect.getId()), game); } layer = filterLayeredEffects(layerEffects, Layer.TypeChangingEffects_4); -// for (ContinuousEffect effect: layer) { -// effect.apply(Layer.TypeChangingEffects_4, SubLayer.CharacteristicDefining_7a, abilityMap.get(effect.getId()), game); -// } for (ContinuousEffect effect: layer) { effect.apply(Layer.TypeChangingEffects_4, SubLayer.NA, abilityMap.get(effect.getId()), game); } layer = filterLayeredEffects(layerEffects, Layer.ColorChangingEffects_5); -// for (ContinuousEffect effect: layer) { -// effect.apply(Layer.ColorChangingEffects_5, SubLayer.CharacteristicDefining_7a, abilityMap.get(effect.getId()), game); -// } for (ContinuousEffect effect: layer) { effect.apply(Layer.ColorChangingEffects_5, SubLayer.NA, abilityMap.get(effect.getId()), game); } layer = filterLayeredEffects(layerEffects, Layer.AbilityAddingRemovingEffects_6); -// for (ContinuousEffect effect: layer) { -// effect.apply(Layer.AbilityAddingRemovingEffects_6, SubLayer.CharacteristicDefining_7a, abilityMap.get(effect.getId()), game); -// } for (ContinuousEffect effect: layer) { effect.apply(Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, abilityMap.get(effect.getId()), game); } layerEffects = getLayeredEffects(game); layer = filterLayeredEffects(layerEffects, Layer.PTChangingEffects_7); -// for (ContinuousEffect effect: layer) { -// effect.apply(Layer.PTChangingEffects_7, SubLayer.CharacteristicDefining_7a, abilityMap.get(effect.getId()), game); -// } for (ContinuousEffect effect: layer) { effect.apply(Layer.PTChangingEffects_7, SubLayer.SetPT_7b, abilityMap.get(effect.getId()), game); } diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index 1fbc8374ebb..43bbe74c2a2 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -273,6 +273,7 @@ public abstract class CardImpl> extends MageObjectImpl logger.fatal("invalid zone for card - " + toZone); return false; } + setControllerId(ownerId); game.setZone(objectId, event.getToZone()); game.fireEvent(event); return game.getState().getZone(objectId) == toZone; diff --git a/Mage/src/mage/players/Library.java b/Mage/src/mage/players/Library.java index 0bdf079efbc..a590ed72620 100644 --- a/Mage/src/mage/players/Library.java +++ b/Mage/src/mage/players/Library.java @@ -201,12 +201,6 @@ public class Library implements Serializable { return emptyDraw; } - void setControllerId(UUID playerId, Game game) { - for (UUID cardId: library) { - game.getCard(cardId).setControllerId(playerId); - } - } - public void addAll(Set cards, Game game) { for (Card card: cards) { game.setZone(card.getId(), Zone.LIBRARY); diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index ad47865f0a9..36a0b517c16 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -62,6 +62,7 @@ import mage.counters.Counter; import mage.counters.CounterType; import mage.counters.Counters; import mage.filter.common.FilterCreatureForCombat; +import mage.game.ExileZone; import mage.game.Game; import mage.game.combat.CombatGroup; import mage.game.events.DamagePlayerEvent; @@ -521,6 +522,9 @@ public abstract class PlayerImpl> implements Player, Ser case GRAVEYARD: removeFromGraveyard(card, game); break; + case EXILED: + game.getExile().removeCard(card, game); + break; default: // invalid zone for play land return false; @@ -1239,6 +1243,24 @@ public abstract class PlayerImpl> implements Player, Ser playable.add(ability); } } + for (ExileZone exile: game.getExile().getExileZones()) { + for (Card card: exile.getCards(game)) { + if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.CAST, game)) { + for (ActivatedAbility ability: card.getAbilities().getActivatedAbilities(Zone.HAND)) { + playable.add(ability); + } + } + } + } + for (Cards cards: game.getState().getRevealed().values()) { + for (Card card: cards.getCards(game)) { + if (game.getContinuousEffects().asThough(card.getId(), AsThoughEffectType.CAST, game)) { + for (ActivatedAbility ability: card.getAbilities().getActivatedAbilities(Zone.HAND)) { + playable.add(ability); + } + } + } + } // eliminate duplicate activated abilities Map playableActivated = new HashMap(); for (Permanent permanent: game.getBattlefield().getAllActivePermanents(playerId)) {