ActivatedAbility copy = ability.copy(); copy.setCheckPlayableMode(); // prevents from endless loops for asking player to use effects by checking this mode if (!copy.canActivate(playerId, game).canActivate()) { return false; Card card = game.getCard(ability.getSourceId()); if (card != null) { for (Ability ability0 : card.getAbilities()) { if (copy instanceof SpellAbility && copy.getManaCosts().isEmpty() && copy.getCosts().isEmpty()) { ManaOptions abilityOptions = copy.getMinimumCostToActivate(playerId, game); if (abilityOptions.isEmpty()) { return true; return true; MageObjectReference permittingObject = game.getContinuousEffects().asThough(ability.getSourceId(), AsThoughEffectType.SPEND_OTHER_MANA, ability, ability.getControllerId(), game); for (Mana mana : abilityOptions) { for (Mana avail : available) { if (objectAbility.getCosts().canPay(ability, ability.getSourceId(), playerId, game)) { return true;
protected boolean playAbility(ActivatedAbility ability, Game game) { if (ability.isUsesStack()) { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATE_ABILITY, ability.getId(), ability.getSourceId(), playerId))) { int bookmark = game.bookmarkState(); ability.newId(); ability.setControllerId(playerId); game.getStack().push(new StackAbility(ability, playerId)); if (ability.activate(game, false)) { game.fireEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATED_ABILITY, ability.getId(), ability.getSourceId(), playerId)); if (!game.isSimulation()) { game.informPlayers(getLogName() + ability.getGameLogMessage(game)); return true; restoreState(bookmark, ability.getRule(), game); if (ability.activate(game, false)) { ability.resolve(game); game.removeBookmark(bookmark); resetStoredBookmark(game); return true; restoreState(bookmark, ability.getRule(), game);
/** * Returns if the ability is used to check which cards are playable on hand. * (Issue #457) * * @param ability - ability to check * @return */ public static boolean isCheckPlayableMode(Ability ability) { if (ability instanceof ActivatedAbility) { return ((ActivatedAbility) ability).isCheckPlayableMode(); } return false; }
private boolean suppressAbilityPicker(ActivatedAbility ability, Game game) { if (getControllingPlayersUserData(game).isShowAbilityPickerForced()) { if (ability instanceof PlayLandAbility) { return true; } if (!ability.getSourceId().equals(getCastSourceIdWithAlternateMana()) && ability.getManaCostsToPay().convertedManaCost() > 0) { return true; } return ability instanceof ActivatedManaAbilityImpl; } return true; }
@Override public boolean activateAbility(ActivatedAbility ability, Game game) { if (!isTestMode()) { // Test player already sends target event as he selects the target for (Target target : ability.getModes().getMode().getTargets()) { for (UUID targetId : target.getTargets()) { game.fireEvent(GameEvent.getEvent(EventType.TARGETED, targetId, ability.getId(), ability.getControllerId())); } } } return super.activateAbility(ability, game); }
Card card = game.getCard(ability.getSourceId()); result = playLand(card, game, false); } else { ActivationStatus activationStatus = ability.canActivate(this.playerId, game); if (!activationStatus.canActivate()) { return false; switch (ability.getAbilityType()) { case SPECIAL_ACTION: result = specialAction((SpecialAction) ability.copy(), game); break; case MANA: result = playManaAbility((ActivatedManaAbilityImpl) ability.copy(), game); break; case SPELL: break; default: result = playAbility(ability.copy(), game); break; if (isHuman() && (ability.getAbilityType() == AbilityType.SPELL || ability.getAbilityType() == AbilityType.ACTIVATED)) { if (ability.isUsesStack()) { // if the ability does not use the stack (e.g. Suspend) auto pass would go to next phase unintended setJustActivatedType(ability.getAbilityType());
public static int evaluatePermanent(Permanent permanent, Game game, boolean ignoreTapped) { int value = 0; if (ignoreTapped) { value = 5; } else { value = permanent.isTapped() ? 4 : 5; } if (permanent.getCardType().contains(CardType.CREATURE)) { value += evaluateCreature(permanent, game) * CREATURE_FACTOR; } value += permanent.getAbilities().getActivatedManaAbilities(Zone.BATTLEFIELD).size(); for (ActivatedAbility ability : permanent.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { if (!(ability instanceof ActivatedManaAbilityImpl) && ability.canActivate(ability.getControllerId(), game).canActivate()) { value += ability.getEffects().size(); } } for (Counter counter : permanent.getCounters(game).values()) { if (!(counter instanceof BoostCounter)) { value += counter.getCount(); } } value += permanent.getAbilities().getStaticAbilities(Zone.BATTLEFIELD).size(); value += permanent.getAbilities().getTriggeredAbilities(Zone.BATTLEFIELD).size(); value += permanent.getManaCost().convertedManaCost(); //TODO: add a difficulty to calculation to ManaCost - sort permanents by difficulty for casting when evaluating game states return value; }
if (ability instanceof ActivatedAbility) { if (ability instanceof ActivatedManaAbilityImpl) { if (((ActivatedAbility) ability).canActivate(playerId, game).canActivate()) { output.put(ability.getId(), (ActivatedAbility) ability); for (ActivatedAbility ability : candidateAbilites.getPlayableAbilities(Zone.HAND)) { if (canUse || ability.getAbilityType() == AbilityType.SPECIAL_ACTION) { if (ability.canActivate(playerId, game).canActivate()) { output.put(ability.getId(), ability); if (ability instanceof ActivatedAbility && ability.getZone().match(Zone.HAND) && ((ActivatedAbility) ability).canActivate(playerId, game).canActivate()) { output.put(ability.getId(), (ActivatedAbility) ability);
ability.setControllerId(this.getId()); // controller must be set for case owner != caster if (ability instanceof ActivatedAbility) { if (((ActivatedAbility) ability).canActivate(playerId, game).canActivate()) { playable.add(ability); if (ability != null && canPlay(ability, availableMana, game.getObject(ability.getSourceId()), game)) { playableActivated.put(ability.toString(), ability); if (ability.isControlledBy(getId()) && canPlay(ability, availableMana, game.getObject(ability.getSourceId()), game)) { playableActivated.put(ability.toString(), ability);
if (!(ability instanceof ActivatedManaAbilityImpl) && ability.canActivate(playerId, game).canActivate()) { if (ability instanceof EquipAbility && permanent.getAttachedTo() != null) { continue; ManaOptions abilityOptions = ability.getManaCosts().getOptions(); if (!ability.getManaCosts().getVariableCosts().isEmpty()) { if (ability.canActivate(playerId, game).canActivate()) { ManaOptions abilityOptions = ability.getManaCosts().getOptions(); if (abilityOptions.isEmpty()) { playableAbilities.add(ability);
if (!playableAbilities.isEmpty()) { for (ActivatedAbility ability : playableAbilities) { if (ability.canActivate(playerId, game).canActivate()) { if (ability.getEffects().hasOutcome(Outcome.PutLandInPlay)) { if (this.activateAbility(ability, game)) { return true; if (ability.getEffects().hasOutcome(Outcome.PutCreatureInPlay)) { if (getOpponentBlockers(opponentId, game).size() <= 1) { if (this.activateAbility(ability, game)) { if (ability.canActivate(playerId, game).canActivate()) { if (!(ability.getEffects().get(0) instanceof BecomesCreatureSourceEffect)) { if (this.activateAbility(ability, game)) { return true;
boolean canUse = !(object instanceof Permanent) || ((Permanent) object).canUseActivatedAbilities(game); for (ActivatedAbility ability : otherAbilities) { if (canUse || ability.getAbilityType() == AbilityType.SPECIAL_ACTION) { Card card = game.getCard(ability.getSourceId()); if (card != null) { if (card.isSplitCard() && ability instanceof FlashbackAbility) { useable.put(ability.getId(), ability);
&& suppressAbilityPicker(abilities.values().iterator().next(), game)) { ActivatedAbility ability = abilities.values().iterator().next(); if (!ability.getTargets().isEmpty() || !(ability.getCosts().size() == 1 && ability.getCosts().get(0) instanceof SacrificeSourceCost) || !(ability.getCosts().size() == 2 && ability.getCosts().get(0) instanceof TapSourceCost && ability.getCosts().get(0) instanceof SacrificeSourceCost)) { activateAbility(ability, game); return;
ActivationStatus activationStatus = playLandAbility.canActivate(this.playerId, game); if (ignoreTiming) { if (!canPlayLand()) {
@Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); Permanent creature = game.getPermanent(source.getTargets().getFirstTarget()); if (permanent != null && creature != null) { for (ActivatedAbility ability : creature.getAbilities().getActivatedAbilities(Zone.BATTLEFIELD)) { Ability newAbility = ability.copy(); newAbility.newOriginalId(); game.addEffect(new GainAbilitySourceEffect(newAbility, Duration.EndOfTurn), source); } return true; } return false; } }
int reduce = 0; if (abilityToModify.getAbilityType() == AbilityType.ACTIVATED && ((ActivatedAbility) abilityToModify).isCheckPlayableMode()) { reduce = reduceMax; } else {
if (upTo) { if (abilityToModify instanceof ActivatedAbility) { if (((ActivatedAbility) abilityToModify).isCheckPlayableMode()) { CardUtil.reduceCost(abilityToModify, this.amount); return true;
if (!(abilityToModify instanceof ActivatedAbility) || !((ActivatedAbility) abilityToModify).isCheckPlayableMode()) { ChoiceImpl choice = new ChoiceImpl(false); Set<String> set = new LinkedHashSet<>();
@Override public boolean apply(Game game, Ability source, Ability abilityToModify) { Player controller = game.getPlayer(abilityToModify.getControllerId()); if (controller != null) { if ((abilityToModify instanceof ActivatedAbility && ((ActivatedAbility) abilityToModify).isCheckPlayableMode()) || controller.chooseUse(Outcome.PlayForFree, "Pay {0} to cycle?", source, game)) { abilityToModify.getCosts().clear(); abilityToModify.getManaCostsToPay().clear(); abilityToModify.getCosts().add(new CyclingDiscardCost()); } return true; } return false; }
effect.setValue("targetAbility", targetAbility); if (effect.applies(event, sourceAbility, game)) { if (targetAbility instanceof ActivatedAbility && ((ActivatedAbility) targetAbility).isCheckPlayableMode()) { checkPlayableMode = true;