Added Spellweaver Volute.

This commit is contained in:
LevelX2 2018-01-02 23:48:07 +01:00
parent bec07fb530
commit bc490ef91a
14 changed files with 835 additions and 353 deletions

View file

@ -56,6 +56,7 @@ import mage.game.permanent.token.SquirrelToken;
import mage.game.stack.Spell;
import mage.game.stack.StackObject;
import mage.players.Player;
import mage.target.TargetCard;
import mage.util.CardUtil;
import mage.util.GameLog;
import mage.util.ThreadLocalStringBuilder;
@ -103,7 +104,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
protected int maxBlockedBy = 0;
protected boolean removedFromCombat;
protected boolean deathtouched;
protected List<UUID> attachments = new ArrayList<>();
protected Map<String, List<UUID>> connectedCards = new HashMap<>();
protected Set<MageObjectReference> dealtDamageByThisTurn;
protected UUID attachedTo;
@ -147,7 +148,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
this.blocking = permanent.blocking;
this.maxBlocks = permanent.maxBlocks;
this.deathtouched = permanent.deathtouched;
this.attachments.addAll(permanent.attachments);
// this.attachments.addAll(permanent.attachments);
for (Map.Entry<String, List<UUID>> entry : permanent.connectedCards.entrySet()) {
this.connectedCards.put(entry.getKey(), entry.getValue());
}
@ -626,47 +627,46 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
}
return false;
}
//
// @Override
// public List<UUID> getAttachments() {
// return attachments;
// }
@Override
public List<UUID> getAttachments() {
return attachments;
}
@Override
public boolean addAttachment(UUID permanentId, Game game) {
if (!this.attachments.contains(permanentId)) {
if (!game.replaceEvent(new GameEvent(GameEvent.EventType.ATTACH, objectId, permanentId, controllerId))) {
this.attachments.add(permanentId);
Permanent attachment = game.getPermanent(permanentId);
if (attachment == null) {
attachment = game.getPermanentEntering(permanentId);
}
if (attachment != null) {
attachment.attachTo(objectId, game);
game.fireEvent(new GameEvent(GameEvent.EventType.ATTACHED, objectId, permanentId, controllerId));
return true;
}
}
}
return false;
}
@Override
public boolean removeAttachment(UUID permanentId, Game game) {
if (this.attachments.contains(permanentId)) {
if (!game.replaceEvent(new GameEvent(GameEvent.EventType.UNATTACH, objectId, permanentId, controllerId))) {
this.attachments.remove(permanentId);
Permanent attachment = game.getPermanent(permanentId);
if (attachment != null) {
attachment.attachTo(null, game);
}
game.fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, objectId, permanentId, controllerId));
return true;
}
}
return false;
}
// @Override
// public boolean addAttachment(UUID permanentId, Game game) {
// if (!this.attachments.contains(permanentId)) {
// if (!game.replaceEvent(new GameEvent(GameEvent.EventType.ATTACH, objectId, permanentId, controllerId))) {
// this.attachments.add(permanentId);
// Permanent attachment = game.getPermanent(permanentId);
// if (attachment == null) {
// attachment = game.getPermanentEntering(permanentId);
// }
// if (attachment != null) {
// attachment.attachTo(objectId, game);
// game.fireEvent(new GameEvent(GameEvent.EventType.ATTACHED, objectId, permanentId, controllerId));
// return true;
// }
// }
// }
// return false;
// }
//
// @Override
// public boolean removeAttachment(UUID permanentId, Game game) {
// if (this.attachments.contains(permanentId)) {
// if (!game.replaceEvent(new GameEvent(GameEvent.EventType.UNATTACH, objectId, permanentId, controllerId))) {
// this.attachments.remove(permanentId);
// Permanent attachment = game.getPermanent(permanentId);
// if (attachment != null) {
// attachment.attachTo(null, game);
// }
// game.fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, objectId, permanentId, controllerId));
// return true;
// }
// }
// return false;
// }
@Override
public UUID getAttachedTo() {
return attachedTo;
@ -705,15 +705,27 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
}
@Override
public void attachTo(UUID permanentId, Game game) {
if (this.attachedTo != null && !Objects.equals(this.attachedTo, permanentId)) {
Permanent attachment = game.getPermanent(this.attachedTo);
if (attachment != null) {
attachment.removeAttachment(this.objectId, game);
public void unattach(Game game) {
this.attachedTo = null;
this.addInfo("attachedToCard", null, game);
}
@Override
public void attachTo(UUID attachToObjectId, Game game) {
if (this.attachedTo != null && !Objects.equals(this.attachedTo, attachToObjectId)) {
Permanent attachedToUntilNowObject = game.getPermanent(this.attachedTo);
if (attachedToUntilNowObject != null) {
attachedToUntilNowObject.removeAttachment(this.objectId, game);
} else {
Card attachedToUntilNowCard = game.getCard(this.attachedTo);
if (attachedToUntilNowCard != null) {
attachedToUntilNowCard.removeAttachment(this.objectId, game);
}
}
}
this.attachedTo = permanentId;
this.attachedToZoneChangeCounter = game.getState().getZoneChangeCounter(permanentId);
this.attachedTo = attachToObjectId;
this.attachedToZoneChangeCounter = game.getState().getZoneChangeCounter(attachToObjectId);
for (Ability ability : this.getAbilities()) {
for (Iterator<Effect> ite = ability.getEffects(game, EffectType.CONTINUOUS).iterator(); ite.hasNext();) {
ContinuousEffect effect = (ContinuousEffect) ite.next();
@ -726,6 +738,13 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
}
}
}
if (!getSpellAbility().getTargets().isEmpty() && (getSpellAbility().getTargets().get(0) instanceof TargetCard)) {
Card attachedToCard = game.getCard(this.getAttachedTo());
if (attachedToCard != null) {
// Because cards are not on the battlefield, the relation has to be shown in the card tooltip (e.g. the enchanted card in graveyard)
this.addInfo("attachedToCard", CardUtil.addToolTipMarkTags("Enchanted card: " + attachedToCard.getIdName()), game);
}
}
}
@Override