Search in sources :

Example 1 with ActivationStatus

use of mage.abilities.ActivatedAbility.ActivationStatus in project mage by magefree.

the class PlayerImpl method activateAbility.

@Override
public boolean activateAbility(ActivatedAbility ability, Game game) {
    if (ability == null) {
        return false;
    }
    boolean result;
    if (ability instanceof PassAbility) {
        pass(game);
        return true;
    }
    Card card = game.getCard(ability.getSourceId());
    if (ability instanceof PlayLandAsCommanderAbility) {
        // LAND as commander: play land with cost, but without stack
        ActivationStatus activationStatus = ability.canActivate(this.playerId, game);
        if (!activationStatus.canActivate() || !this.canPlayLand()) {
            return false;
        }
        if (card == null) {
            return false;
        }
        // as copy, tries to applie cost effects and pays
        Ability activatingAbility = ability.copy();
        if (activatingAbility.activate(game, false)) {
            result = playLand(card, game, false);
        } else {
            result = false;
        }
    } else if (ability instanceof PlayLandAbility) {
        // LAND as normal card: without cost and stack
        result = playLand(card, game, false);
    } else {
        // ABILITY
        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 SPECIAL_MANA_PAYMENT:
                result = specialManaPayment((SpecialAction) ability.copy(), game);
                break;
            case MANA:
                result = playManaAbility((ActivatedManaAbilityImpl) ability.copy(), game);
                break;
            case SPELL:
                result = cast((SpellAbility) ability, game, false, activationStatus.getApprovingObject());
                break;
            default:
                result = playAbility(ability.copy(), game);
                break;
        }
    }
    // if player has taken an action then reset all player passed flags
    justActivatedType = null;
    if (result) {
        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());
            }
        }
        game.getPlayers().resetPassed();
    }
    return result;
}
Also used : AlternateManaPaymentAbility(mage.abilities.costs.mana.AlternateManaPaymentAbility) StackAbility(mage.game.stack.StackAbility) WhileSearchingPlayFromLibraryAbility(mage.abilities.common.WhileSearchingPlayFromLibraryAbility) AtTheEndOfTurnStepPostDelayedTriggeredAbility(mage.abilities.common.delayed.AtTheEndOfTurnStepPostDelayedTriggeredAbility) PassAbility(mage.abilities.common.PassAbility) PlayLandAsCommanderAbility(mage.abilities.common.PlayLandAsCommanderAbility) PassAbility(mage.abilities.common.PassAbility) PlayLandAsCommanderAbility(mage.abilities.common.PlayLandAsCommanderAbility) ActivationStatus(mage.abilities.ActivatedAbility.ActivationStatus) FilterCard(mage.filter.FilterCard) TargetCard(mage.target.TargetCard) PermanentCard(mage.game.permanent.PermanentCard)

Example 2 with ActivationStatus

use of mage.abilities.ActivatedAbility.ActivationStatus in project mage by magefree.

the class PlayerImpl method playLand.

@Override
public boolean playLand(Card card, Game game, boolean ignoreTiming) {
    // Check for alternate casting possibilities: e.g. land with Morph
    if (card == null) {
        return false;
    }
    ActivatedAbility playLandAbility = null;
    boolean foundAlternative = false;
    for (Ability ability : card.getAbilities(game)) {
        // if cast for noMana no Alternative costs are allowed
        if ((ability instanceof AlternativeSourceCosts) || (ability instanceof OptionalAdditionalSourceCosts)) {
            foundAlternative = true;
        }
        if (ability instanceof PlayLandAbility) {
            playLandAbility = (ActivatedAbility) ability;
        }
    }
    // try alternative cast (face down)
    if (foundAlternative) {
        SpellAbility spellAbility = new SpellAbility(null, "", game.getState().getZone(card.getId()), SpellAbilityType.FACE_DOWN_CREATURE);
        spellAbility.setControllerId(this.getId());
        spellAbility.setSourceId(card.getId());
        if (cast(spellAbility, game, false, null)) {
            return true;
        }
    }
    if (playLandAbility == null) {
        return false;
    }
    // 20091005 - 114.2a
    ActivationStatus activationStatus = playLandAbility.canActivate(this.playerId, game);
    if (ignoreTiming) {
        if (!canPlayLand()) {
            // ignore timing does not mean that more lands than normal can be played
            return false;
        }
    } else {
        if (!activationStatus.canActivate()) {
            return false;
        }
    }
    // 20091005 - 305.1
    if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.PLAY_LAND, card.getId(), playLandAbility, playerId, activationStatus.getApprovingObject()))) {
        // int bookmark = game.bookmarkState();
        // land events must return original zone (uses for commander watcher)
        Zone cardZoneBefore = game.getState().getZone(card.getId());
        GameEvent landEventBefore = GameEvent.getEvent(GameEvent.EventType.PLAY_LAND, card.getId(), playLandAbility, playerId, activationStatus.getApprovingObject());
        landEventBefore.setZone(cardZoneBefore);
        game.fireEvent(landEventBefore);
        if (moveCards(card, Zone.BATTLEFIELD, playLandAbility, game, false, false, false, null)) {
            landsPlayed++;
            GameEvent landEventAfter = GameEvent.getEvent(GameEvent.EventType.LAND_PLAYED, card.getId(), playLandAbility, playerId, activationStatus.getApprovingObject());
            landEventAfter.setZone(cardZoneBefore);
            game.fireEvent(landEventAfter);
            String playText = getLogName() + " plays " + card.getLogName();
            if (card instanceof ModalDoubleFacesCardHalf) {
                ModalDoubleFacesCard mdfCard = (ModalDoubleFacesCard) card.getMainCard();
                playText = getLogName() + " plays " + GameLog.replaceNameByColoredName(card, card.getName(), mdfCard) + " as MDF side of " + GameLog.getColoredObjectIdName(mdfCard);
            }
            game.fireInformEvent(playText);
            // game.removeBookmark(bookmark);
            // prevent undo after playing a land
            resetStoredBookmark(game);
            return true;
        }
    // putOntoBattlefield returned false if putOntoBattlefield was replaced by replacement effect (e.g. Kjeldoran Outpost).
    // But that would undo the effect completely,
    // what makes no real sense. So it makes no sense to generally do a restoreState here.
    // restoreState(bookmark, card.getName(), game);
    }
    // if the to play the land is replaced (e.g. Kjeldoran Outpost and don't sacrificing a Plains) it's a valid state so returning true here
    return true;
}
Also used : AlternateManaPaymentAbility(mage.abilities.costs.mana.AlternateManaPaymentAbility) StackAbility(mage.game.stack.StackAbility) WhileSearchingPlayFromLibraryAbility(mage.abilities.common.WhileSearchingPlayFromLibraryAbility) AtTheEndOfTurnStepPostDelayedTriggeredAbility(mage.abilities.common.delayed.AtTheEndOfTurnStepPostDelayedTriggeredAbility) PassAbility(mage.abilities.common.PassAbility) PlayLandAsCommanderAbility(mage.abilities.common.PlayLandAsCommanderAbility) ActivationStatus(mage.abilities.ActivatedAbility.ActivationStatus)

Aggregations

ActivationStatus (mage.abilities.ActivatedAbility.ActivationStatus)2 PassAbility (mage.abilities.common.PassAbility)2 PlayLandAsCommanderAbility (mage.abilities.common.PlayLandAsCommanderAbility)2 WhileSearchingPlayFromLibraryAbility (mage.abilities.common.WhileSearchingPlayFromLibraryAbility)2 AtTheEndOfTurnStepPostDelayedTriggeredAbility (mage.abilities.common.delayed.AtTheEndOfTurnStepPostDelayedTriggeredAbility)2 AlternateManaPaymentAbility (mage.abilities.costs.mana.AlternateManaPaymentAbility)2 StackAbility (mage.game.stack.StackAbility)2 FilterCard (mage.filter.FilterCard)1 PermanentCard (mage.game.permanent.PermanentCard)1 TargetCard (mage.target.TargetCard)1