diff --git a/Mage/src/mage/abilities/effects/common/AttachEffect.java b/Mage/src/mage/abilities/effects/common/AttachEffect.java index 471a85f2ba6..4bf78743b31 100644 --- a/Mage/src/mage/abilities/effects/common/AttachEffect.java +++ b/Mage/src/mage/abilities/effects/common/AttachEffect.java @@ -33,6 +33,7 @@ import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.players.Player; /** * @@ -64,6 +65,12 @@ public class AttachEffect extends OneShotEffect { if (permanent != null) { return permanent.addAttachment(source.getSourceId(), game); } + else { + Player player = game.getPlayer(source.getFirstTarget()); + if (player != null) { + return player.addAttachment(source.getSourceId(), game); + } + } return false; } diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 5a3fe4a29ef..73f6bfb4ed1 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -64,6 +64,8 @@ import mage.abilities.common.ChancellorAbility; import mage.abilities.mana.TriggeredManaAbility; import mage.cards.CardsImpl; +import mage.target.Target; +import mage.target.TargetPermanent; import mage.watchers.common.MorbidWatcher; import org.apache.log4j.Logger; @@ -741,19 +743,35 @@ public abstract class GameImpl> implements Game, Serializa somethingHappened = true; } else { - //TODO: handle player auras - Permanent attachedTo = getPermanent(perm.getAttachedTo()); - if (attachedTo == null) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - somethingHappened = true; - } - else { - Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); - if (!auraFilter.match(attachedTo) || attachedTo.hasProtectionFrom(perm)) { - if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) - somethingHappened = true; - } - } + Target target = perm.getSpellAbility().getTargets().get(0); + if (target instanceof TargetPermanent) { + Permanent attachedTo = getPermanent(perm.getAttachedTo()); + if (attachedTo == null) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + else { + Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); + if (!auraFilter.match(attachedTo) || attachedTo.hasProtectionFrom(perm)) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + } + } + else if (target instanceof TargetPlayer) { + Player attachedTo = getPlayer(perm.getAttachedTo()); + if (attachedTo == null) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + else { + Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); + if (!auraFilter.match(attachedTo) || attachedTo.hasProtectionFrom(perm)) { + if (perm.moveToZone(Zone.GRAVEYARD, null, this, false)) + somethingHappened = true; + } + } + } } } //20091005 - 704.5k, 801.12 diff --git a/Mage/src/mage/game/events/GameEvent.java b/Mage/src/mage/game/events/GameEvent.java index e7af84efce2..790a88c19f8 100644 --- a/Mage/src/mage/game/events/GameEvent.java +++ b/Mage/src/mage/game/events/GameEvent.java @@ -97,6 +97,7 @@ public class GameEvent { DECLARE_BLOCKER, BLOCKER_DECLARED, SEARCH_LIBRARY, LIBRARY_SEARCHED, SHUFFLE_LIBRARY, LIBRARY_SHUFFLED, + ENCHANT_PLAYER, ENCHANTED_PLAYER, //permanent events ENTERS_THE_BATTLEFIELD, diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index 2364d145737..a87045d9e1b 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -239,5 +239,7 @@ public interface Player extends MageItem, Copyable { public List getPlayableOptions(Ability ability, Game game); public void addCounters(Counter counter, Game game); - + public List getAttachments(); + public boolean addAttachment(UUID permanentId, Game game); + public boolean removeAttachment(UUID permanentId, Game game); } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 474ad673dfd..ad6529b6bf8 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -108,6 +108,7 @@ public abstract class PlayerImpl> implements Player, Ser protected boolean isGameUnderControl = true; protected UUID turnController; protected Set playersUnderYourControl = new HashSet(); + protected List attachments = new ArrayList(); protected boolean topCardRevealed = false; @@ -424,6 +425,43 @@ public abstract class PlayerImpl> implements Player, Ser } @Override + public List getAttachments() { + return attachments; + } + + @Override + public boolean addAttachment(UUID permanentId, Game game) { + if (!this.attachments.contains(permanentId)) { + Permanent aura = game.getPermanent(permanentId); + if (aura != null) { + if (!game.replaceEvent(new GameEvent(GameEvent.EventType.ENCHANT_PLAYER, playerId, permanentId, aura.getControllerId()))) { + this.attachments.add(permanentId); + aura.attachTo(playerId, game); + game.fireEvent(new GameEvent(GameEvent.EventType.ENCHANTED_PLAYER, playerId, permanentId, aura.getControllerId())); + return true; + } + } + } + return false; + } + + @Override + public boolean removeAttachment(UUID permanentId, Game game) { + if (this.attachments.contains(permanentId)) { + Permanent aura = game.getPermanent(permanentId); + if (aura != null) { + if (!game.replaceEvent(new GameEvent(GameEvent.EventType.UNATTACH, playerId, permanentId, aura.getControllerId()))) { + this.attachments.remove(permanentId); + aura.attachTo(null, game); + } + game.fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, playerId, permanentId, aura.getControllerId())); + return true; + } + } + return false; + } + + @Override public boolean removeFromBattlefield(Permanent permanent, Game game) { permanent.removeFromCombat(game); game.getBattlefield().removePermanent(permanent.getId());