public List<Card> getAllCards(Game game) { List<Card> cards = new ArrayList<>(); for (ExileZone exile : exileZones.values()) { cards.addAll(exile.getCards(game)); } return cards; }
@Override public boolean apply(Game game, Ability source) { ExileZone zone = game.getExile().getExileZone(source.getSourceId()); if (zone == null || zone.isEmpty()) { return false; } Card reboundCard = zone.get(source.getSourceId(), game); Player player = game.getPlayer(source.getControllerId()); if (player != null && reboundCard != null) { SpellAbility ability = reboundCard.getSpellAbility(); player.cast(ability, game, true, new MageObjectReference(source.getSourceObject(game), game)); zone.remove(reboundCard.getId()); return true; } return false; }
public Card getCard(UUID cardId, Game game) { for (ExileZone exile : exileZones.values()) { if (exile.contains(cardId)) { return game.getCard(cardId); } } return null; }
@Override public boolean apply(Game game, Ability source) { String cardName = (String) this.getValue("cardName"); ExileZone searchTheCityExileZone = game.getExile().getExileZone(source.getSourceId()); if (cardName != null && searchTheCityExileZone != null) { for (Card card : searchTheCityExileZone.getCards(game)) { if (CardUtil.haveSameNames(card.getName(), cardName)) { if (card.moveToZone(Zone.HAND, source.getSourceId(), game, true)) { game.informPlayers("Search the City: put " + card.getName() + " into owner's hand"); } searchTheCityExileZone.remove(card); if (searchTheCityExileZone.isEmpty()) { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { permanent.sacrifice(source.getSourceId(), game); // extra turn game.getState().getTurnMods().add(new TurnMod(source.getControllerId(), false)); } } return true; } } } return false; }
@Override public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { if (affectedControllerId.equals(source.getControllerId()) && game.getState().getZone(objectId) == Zone.EXILED) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); if (controller != null && sourceObject != null) { Card card = game.getCard(objectId); if (card != null && card.isFaceDown(game)) { Set<UUID> exileZones = (Set<UUID>) game.getState().getValue(GrimoireThief.VALUE_PREFIX + source.getSourceId().toString()); if (exileZones != null) { for (ExileZone exileZone : game.getExile().getExileZones()) { if (exileZone.contains(objectId)) { if (!exileZones.contains(exileZone.getId())) { return false; } } } return true; } } } } return false; } }
@Override public boolean apply(Game game, Ability source) { ExileZone zone = game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, source)); if (zone == null || zone.isEmpty()) { return true; Card card = zone.getCards(game).iterator().next(); Player controller = game.getPlayer(source.getControllerId()); if (card != null && controller != null) {
for (ExileZone zone : game.getExile().getExileZones()) { exileId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); if (zone.getId().equals(exileId)) { for (Card card : zone.getCards(game)) { if (!card.hasSubtype(SubType.AURA, game) && card.isPermanent()) {
/** * Swap cards between specified card from library and any hand card. * * @param game * @param card Card to put to player's hand */ private static void swapWithAnyCard(Game game, Player player, Card card, Zone zone) { // Put the card in Exile to start. Otherwise the game doesn't know where to remove the card from. game.getExile().getPermanentExile().add(card); game.setZone(card.getId(), Zone.EXILED); switch (zone) { case BATTLEFIELD: card.putOntoBattlefield(game, Zone.EXILED, null, player.getId()); break; case LIBRARY: card.setZone(Zone.LIBRARY, game); game.getExile().getPermanentExile().remove(card); player.getLibrary().putOnTop(card, game); break; case STACK: card.cast(game, Zone.EXILED, card.getSpellAbility(), player.getId()); default: card.moveToZone(zone, null, game, false); } logger.info("Added card to player's " + zone.toString() + ": " + card.getName() + ", player = " + player.getName()); }
@Override public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { if (allExileZones) { int numberTargets = 0; for(ExileZone exileZone : game.getExile().getExileZones()) { numberTargets += exileZone.count(filter, sourceId, sourceControllerId, game); if (numberTargets >= this.minNumberOfTargets) { return true; } } } else { ExileZone exileZone = game.getExile().getExileZone(zoneId); if (exileZone != null) { if (exileZone.count(filter, sourceId, sourceControllerId, game) >= this.minNumberOfTargets) { return true; } } } return false; }
@Override public boolean apply(Game game, Ability source) { ExileZone exile = game.getExile().getExileZone(source.getSourceId()); if (exile != null) { exile = exile.copy(); for (UUID cardId : exile) { Card card = game.getCard(cardId); if (card != null) { card.moveToZone(Zone.BATTLEFIELD, source.getSourceId(), game, false); Permanent returnedCreature = game.getPermanent(cardId); if (returnedCreature != null) { ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); effect.setTargetPointer(new FixedTarget(returnedCreature.getId())); game.addEffect(effect, source); } } } game.getExile().getExileZone(source.getSourceId()).clear(); return true; } return false; }
public void add(Card card) { exileZones.get(PERMANENT).add(card); }
game.getExile().getPermanentExile().remove(card); card.moveToZone(Zone.HAND, source.getSourceId(), game, false); } else {
@Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { ExileZone exileZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source.getSourceId(), 0)); if (exileZone != null) { Effect effect = new ReturnFromExileEffect(exileZone.getId(), Zone.HAND); AtTheBeginOfNextEndStepDelayedTriggeredAbility ability = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); ability.addEffect(new DrawCardSourceControllerEffect(1)); game.addDelayedTriggeredAbility(ability, source); return true; } } return false; } }
public void clear() { for (ExileZone exile : exileZones.values()) { exile.clear(); } } }
public Exile(final Exile exile) { for (Entry<UUID, ExileZone> entry : exile.exileZones.entrySet()) { exileZones.put(entry.getKey(), entry.getValue().copy()); } }