public Unmelded(ZoneChangeInfo info, Game game) { super(info.event); MeldCard meld = game.getMeldCard(info.event.getTargetId()); if (meld != null) { if (meld.hasTopHalf(game)) { ZoneChangeEvent topEvent = new ZoneChangeEvent(meld.getTopHalfCard().getId(), event.getSourceId(), event.getPlayerId(), event.getFromZone(), event.getToZone(), event.getAppliedEffects()); ZoneChangeInfo topInfo = info.copy(); topInfo.event = topEvent; subInfo.add(topInfo); } if (meld.hasBottomHalf(game)) { ZoneChangeEvent bottomEvent = new ZoneChangeEvent(meld.getBottomHalfCard().getId(), event.getSourceId(), event.getPlayerId(), event.getFromZone(), event.getToZone(), event.getAppliedEffects()); ZoneChangeInfo bottomInfo = info.copy(); bottomInfo.event = bottomEvent; subInfo.add(bottomInfo); } } } }
@Override public boolean removeFromZone(Game game, Zone fromZone, UUID sourceId) { if (isCopy()) { return super.removeFromZone(game, fromZone, sourceId); } if (isMelded() && fromZone == Zone.BATTLEFIELD) { Permanent permanent = game.getPermanent(objectId); return permanent != null && permanent.removeFromZone(game, fromZone, sourceId); } boolean topRemoved = hasTopHalf(game) && topHalfCard.removeFromZone(game, fromZone, sourceId); if (!topRemoved) { // The top half isn't being moved with the pair anymore. halves.remove(topHalfCard); } boolean bottomRemoved = hasBottomHalf(game) && bottomHalfCard.removeFromZone(game, fromZone, sourceId); if (!bottomRemoved) { // The bottom half isn't being moved with the pair anymore. halves.remove(bottomHalfCard); } return topRemoved || bottomRemoved; }
@Override public boolean addCounters(Counter counter, Ability source, Game game, List<UUID> appliedEffects) { if (this.isMelded()) { return super.addCounters(counter, source, game, appliedEffects); } else { // can this really happen? boolean returnState = true; if (hasTopHalf(game)) { returnState |= topHalfCard.addCounters(counter, source, game, appliedEffects); } if (hasBottomHalf(game)) { returnState |= bottomHalfCard.addCounters(counter, source, game, appliedEffects); } return returnState; } }
public static List<ZoneChangeInfo> moveCards(List<ZoneChangeInfo> zoneChangeInfos, Game game) { // Handle Unmelded Meld Cards for (ListIterator<ZoneChangeInfo> itr = zoneChangeInfos.listIterator(); itr.hasNext();) { ZoneChangeInfo info = itr.next(); MeldCard card = game.getMeldCard(info.event.getTargetId()); // Copies should be handled as normal cards. if (card != null && !card.isMelded() && !card.isCopy()) { ZoneChangeInfo.Unmelded unmelded = new ZoneChangeInfo.Unmelded(info, game); if (unmelded.subInfo.isEmpty()) { itr.remove(); } else { itr.set(unmelded); } } } zoneChangeInfos.removeIf(zoneChangeInfo -> !maybeRemoveFromSourceZone(zoneChangeInfo, game)); for (ZoneChangeInfo zoneChangeInfo : zoneChangeInfos) { placeInDestinationZone(zoneChangeInfo, game); if (game.getPhase() != null) { // moving cards to zones before game started does not need events game.addSimultaneousEvent(zoneChangeInfo.event); } } return zoneChangeInfos; }
if (exiled instanceof PermanentMeld) { MeldCard meldCard = (MeldCard) ((PermanentCard) exiled).getCard(); Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); if (topCard.getZoneChangeCounter(game) == meldCard.getTopLastZoneChangeCounter()) { cardsToReturn.add(topCard); if (bottomCard.getZoneChangeCounter(game) == meldCard.getBottomLastZoneChangeCounter()) { cardsToReturn.add(bottomCard);
if (!maybeRemoveFromSourceZone(subInfo, game)) { itr.remove(); } else if (Objects.equals(subInfo.event.getTargetId(), meld.getTopHalfCard().getId())) { meld.setTopLastZoneChangeCounter(meld.getTopHalfCard().getZoneChangeCounter(game)); } else if (Objects.equals(subInfo.event.getTargetId(), meld.getBottomHalfCard().getId())) { meld.setBottomLastZoneChangeCounter(meld.getBottomHalfCard().getZoneChangeCounter(game)); meld.updateZoneChangeCounter(game, unmelded.subInfo.get(unmelded.subInfo.size() - 1).event); return true;
Card meldWithCard = game.getExile().getCard(meldWithId, game); if (sourceCard != null && !sourceCard.isCopy() && meldWithCard != null && !meldWithCard.isCopy()) { meldCard.setOwnerId(controller.getId()); meldCard.setTopHalfCard(meldWithCard, game); meldCard.setBottomHalfCard(sourceCard, game); meldCard.setMelded(true); game.addMeldCard(meldCard.getId(), meldCard); game.getState().addCard(meldCard); meldCard.setZone(Zone.EXILED, game); controller.moveCards(meldCard, Zone.BATTLEFIELD, source, game);
@Override public boolean apply(Game game, Ability source) { Card card = game.getCard(objectToReturn.getSourceId()); if (card != null && objectToReturn.refersTo(card, game)) { Player owner = game.getPlayer(card.getOwnerId()); if (owner != null) { if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; game.addEffect(new LongRoadHomeEntersBattlefieldEffect(new MageObjectReference(meldCard.getTopHalfCard(), game)), source); game.addEffect(new LongRoadHomeEntersBattlefieldEffect(new MageObjectReference(meldCard.getBottomHalfCard(), game)), source); } else { game.addEffect(new LongRoadHomeEntersBattlefieldEffect(objectToReturn), source); } owner.moveCards(card, Zone.BATTLEFIELD, source, game, false, false, true, null); } } return true; } }
@Override public int getConvertedManaCost() { if (this.isCopy()) { return 0; } else { return (this.topHalfCard != null ? this.topHalfCard.getConvertedManaCost() : 0) + (this.bottomHalfCard != null ? this.bottomHalfCard.getConvertedManaCost() : 0); } }
if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); if (topCard.getZoneChangeCounter(game) == meldCard.getTopLastZoneChangeCounter() && exileZone.contains(topCard.getId())) { cardsToBattlefield.add(topCard); if (bottomCard.getZoneChangeCounter(game) == meldCard.getBottomLastZoneChangeCounter() && exileZone.contains(bottomCard.getId())) { cardsToBattlefield.add(bottomCard);
@Override public void updateZoneChangeCounter(Game game, ZoneChangeEvent event) { if (isCopy() || !isMelded()) { super.updateZoneChangeCounter(game, event); return; } game.getState().updateZoneChangeCounter(objectId); if (topLastZoneChangeCounter == topHalfCard.getZoneChangeCounter(game) && halves.contains(topHalfCard.getId())) { topHalfCard.updateZoneChangeCounter(game, event); topLastZoneChangeCounter = topHalfCard.getZoneChangeCounter(game); } if (bottomLastZoneChangeCounter == bottomHalfCard.getZoneChangeCounter(game) && halves.contains(bottomHalfCard.getId())) { bottomHalfCard.updateZoneChangeCounter(game, event); bottomLastZoneChangeCounter = bottomHalfCard.getZoneChangeCounter(game); } }
if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); if (topCard.getZoneChangeCounter(game) == meldCard.getTopLastZoneChangeCounter() && exileZone.contains(topCard.getId())) { cardsToBattlefield.add(topCard); if (bottomCard.getZoneChangeCounter(game) == meldCard.getBottomLastZoneChangeCounter() && exileZone.contains(bottomCard.getId())) { cardsToBattlefield.add(bottomCard);
if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); if (topCard.getZoneChangeCounter(game) == meldCard.getTopLastZoneChangeCounter() && exileZone.contains(topCard.getId())) { cardsToBattlefield.add(topCard); if (bottomCard.getZoneChangeCounter(game) == meldCard.getBottomLastZoneChangeCounter() && exileZone.contains(bottomCard.getId())) { cardsToBattlefield.add(bottomCard);
if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); if (topCard.getZoneChangeCounter(game) == meldCard.getTopLastZoneChangeCounter() && exileZone.contains(topCard.getId())) { cardsToBattlefield.add(topCard); if (bottomCard.getZoneChangeCounter(game) == meldCard.getBottomLastZoneChangeCounter() && exileZone.contains(bottomCard.getId())) { cardsToBattlefield.add(bottomCard);