@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); } }
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; }
@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 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); } }