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);
@Override public ActivationStatus canActivate(UUID playerId, Game game) { ActivationStatus activationStatus = super.canActivate(playerId, game); if (activationStatus.canActivate()) { Card card = game.getCard(getSourceId()); if (card != null) { // Cards with no Mana Costs cant't be flashbacked (e.g. Ancestral Vision) if (card.getManaCost().isEmpty()) { return ActivationStatus.getFalse(); } // Flashback can never cast a split card by Fuse, because Fuse only works from hand if (card.isSplitCard()) { if (((SplitCard) card).getLeftHalfCard().getName().equals(abilityName)) { return ((SplitCard) card).getLeftHalfCard().getSpellAbility().canActivate(playerId, game); } else if (((SplitCard) card).getRightHalfCard().getName().equals(abilityName)) { return ((SplitCard) card).getRightHalfCard().getSpellAbility().canActivate(playerId, game); } } return card.getSpellAbility().canActivate(playerId, game); } } return activationStatus; }
@Override public ActivationStatus canActivate(UUID playerId, Game game) { if (!super.hasMoreActivationsThisTurn(game) || !(condition == null || condition.apply(game, this))) { return ActivationStatus.getFalse(); } Player player = game.getPlayer(playerId); if (player != null && playerId.equals(game.getActivePlayerId()) && game.getStep().getType().isBefore(PhaseStep.END_TURN)) { if (costs.canPay(this, sourceId, playerId, game)) { this.setControllerId(playerId); return ActivationStatus.getTrue(); } } return ActivationStatus.getFalse(); }
if (ability instanceof ActivatedAbility && ability.getAbilityType() == AbilityType.MANA) { ActivatedManaAbilityImpl manaAbility = (ActivatedManaAbilityImpl) ability; if (manaAbility.canActivate(targetPlayer.getId(), game).canActivate()) {
if (!playableAbilities.isEmpty()) { for (ActivatedAbility ability : playableAbilities) { if (ability.canActivate(playerId, game).canActivate()) { if (ability.getEffects().hasOutcome(Outcome.PutLandInPlay)) { if (this.activateAbility(ability, game)) { if (!playableNonInstant.isEmpty()) { for (Card card : playableNonInstant) { if (card.getSpellAbility().canActivate(playerId, game).canActivate()) { if (this.activateAbility(card.getSpellAbility(), game)) { return true; if (ability.canActivate(playerId, game).canActivate()) { if (!(ability.getEffects().get(0) instanceof BecomesCreatureSourceEffect)) { if (this.activateAbility(ability, game)) {
if (mana.enough(avail)) { SpellAbility ability = card.getSpellAbility(); if (ability != null && ability.canActivate(playerId, game).canActivate() && game.getContinuousEffects().preventedByRuleModification(GameEvent.getEvent(GameEvent.EventType.CAST_SPELL, ability.getSourceId(), ability.getSourceId(), playerId), ability, game, true)) { if (card.getCardType().contains(CardType.INSTANT) if (!(ability instanceof ActivatedManaAbilityImpl) && ability.canActivate(playerId, game).canActivate()) { if (ability instanceof EquipAbility && permanent.getAttachedTo() != null) { continue; if (ability.canActivate(playerId, game).canActivate()) { ManaOptions abilityOptions = ability.getManaCosts().getOptions(); if (abilityOptions.isEmpty()) {
if (ability instanceof ActivatedAbility) { if (ability instanceof ActivatedManaAbilityImpl) { if (((ActivatedAbility) ability).canActivate(playerId, game).canActivate()) { output.put(ability.getId(), (ActivatedAbility) ability); 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);
&& (condition == null || condition.apply(game, this)))) { return ActivationStatus.getFalse(); case ACTIVE: if (game.getActivePlayerId() != playerId) { return ActivationStatus.getFalse(); return ActivationStatus.getFalse(); return ActivationStatus.getFalse(); return ActivationStatus.getFalse(); Permanent permanent = game.getPermanent(getSourceId()); if (!permanent.isOwnedBy(playerId)) { return ActivationStatus.getFalse(); return ActivationStatus.getFalse(); return ActivationStatus.getFalse(); && canChooseTarget(game)) { this.activatorId = playerId; return new ActivationStatus(true, permittingObject); return ActivationStatus.getFalse();
ActivatedAbility copy = ability.copy(); if (!copy.canActivate(playerId, game).canActivate()) { return false;
if (!activationStatus.canActivate()) { return false; if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.PLAY_LAND, card.getId(), card.getId(), playerId, activationStatus.getPermittingObject()))) { game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PLAY_LAND, card.getId(), card.getId(), playerId, activationStatus.getPermittingObject())); if (moveCards(card, Zone.BATTLEFIELD, playLandAbility, game, false, false, false, null)) { landsPlayed++; game.fireEvent(GameEvent.getEvent(GameEvent.EventType.LAND_PLAYED, card.getId(), card.getId(), playerId, activationStatus.getPermittingObject())); game.fireInformEvent(getLogName() + " plays " + card.getLogName());
|| this.spellCanBeActivatedRegularlyNow(playerId, game)) { if (spellAbilityType == SpellAbilityType.SPLIT || spellAbilityType == SpellAbilityType.SPLIT_AFTERMATH) { return ActivationStatus.getFalse(); Card card = game.getCard(sourceId); if (!(card != null && card.isOwnedBy(playerId))) { return ActivationStatus.getFalse(); if (game.getContinuousEffects().preventedByRuleModification( GameEvent.getEvent(GameEvent.EventType.CAST_SPELL, this.getId(), this.getSourceId(), playerId), this, game, true)) { return ActivationStatus.getFalse(); Player player = game.getPlayer(playerId); if (player != null && getSourceId().equals(player.getCastSourceIdWithAlternateMana())) { return ActivationStatus.getFalse(); SplitCard splitCard = (SplitCard) game.getCard(getSourceId()); if (splitCard != null) { return new ActivationStatus(splitCard.getLeftHalfCard().getSpellAbility().canChooseTarget(game) && splitCard.getRightHalfCard().getSpellAbility().canChooseTarget(game), null); return ActivationStatus.getFalse(); return new ActivationStatus(canChooseTarget(game), permittingSource); return ActivationStatus.getFalse();
canUse = permanent.canUseActivatedAbilities(game); if (canUse && ability.canActivate(playerId, game).canActivate()) { canAdd = true; if (!ability.getManaCosts().isEmpty()) {
} else { ActivationStatus activationStatus = ability.canActivate(this.playerId, game); if (!activationStatus.canActivate()) { return false; break; case SPELL: result = cast((SpellAbility) ability, game, false, activationStatus.getPermittingObject()); break; default:
flashbackAbility.setSpellAbilityType(SpellAbilityType.SPLIT_LEFT); flashbackAbility.setAbilityName(((SplitCard) card).getLeftHalfCard().getName()); if (flashbackAbility.canActivate(playerId, game).canActivate()) { useable.put(flashbackAbility.getId(), flashbackAbility); flashbackAbility.setSpellAbilityType(SpellAbilityType.SPLIT_RIGHT); flashbackAbility.setAbilityName(((SplitCard) card).getRightHalfCard().getName()); if (flashbackAbility.canActivate(playerId, game).canActivate()) { useable.put(flashbackAbility.getId(), flashbackAbility);
canUse = permanent.canUseActivatedAbilities(game); if (canUse && ability.canActivate(playerId, game).canActivate()) { canAdd = true; break; if (ability.canActivate(playerId, game).canActivate()) { canAdd = true;
target.setTargetName("creature to convoke"); specialAction.addTarget(target); if (specialAction.canActivate(source.getControllerId(), game).canActivate()) { game.getState().getSpecialActions().add(specialAction);
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; }
@Override public void addSpecialAction(Ability source, Game game, ManaCost unpaid) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null && !controller.getGraveyard().isEmpty()) { if (unpaid.getMana().getGeneric() > 0 && source.getAbilityType() == AbilityType.SPELL) { SpecialAction specialAction = new DelveSpecialAction(); specialAction.setControllerId(source.getControllerId()); specialAction.setSourceId(source.getSourceId()); int unpaidAmount = unpaid.getMana().getGeneric(); if (!controller.getManaPool().isAutoPayment() && unpaidAmount > 1) { unpaidAmount = 1; } specialAction.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard( 0, Math.min(controller.getGraveyard().size(), unpaidAmount), new FilterCard(), true))); if (specialAction.canActivate(source.getControllerId(), game).canActivate()) { game.getState().getSpecialActions().add(specialAction); } } } } }
private void playDamage(List<UUID> creatures, Game game) { for (UUID creatureId : creatures) { Permanent creature = game.getPermanent(creatureId); for (Card card : this.playableInstant) { if (card.getSpellAbility().canActivate(playerId, game).canActivate()) { for (Effect effect : card.getSpellAbility().getEffects()) { if (effect instanceof DamageTargetEffect) { if (card.getSpellAbility().getTargets().get(0).canTarget(creatureId, card.getSpellAbility(), game)) { if (((DamageTargetEffect) effect).getAmount() > (creature.getPower().getValue() - creature.getDamage())) { if (this.activateAbility(card.getSpellAbility(), game)) { return; } } } } } } } } }
@Override public void addSpecialAction(Ability source, Game game, ManaCost unpaid) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null && game.getBattlefield().contains(filterUntapped, controller.getId(), 1, game)) { if (source.getAbilityType() == AbilityType.SPELL && unpaid.getMana().getGeneric() > 0) { SpecialAction specialAction = new ImproviseSpecialAction(unpaid); specialAction.setControllerId(source.getControllerId()); specialAction.setSourceId(source.getSourceId()); // create filter for possible artifacts to tap FilterControlledArtifactPermanent filter = new FilterControlledArtifactPermanent(); filter.add(Predicates.not(TappedPredicate.instance)); Target target = new TargetControlledPermanent(1, unpaid.getMana().getGeneric(), filter, true); target.setTargetName("artifact to Improvise"); specialAction.addTarget(target); if (specialAction.canActivate(source.getControllerId(), game).canActivate()) { game.getState().getSpecialActions().add(specialAction); } } } }