Search in sources :

Example 6 with ManaPool

use of mage.players.ManaPool in project mage by magefree.

the class UpwellingRuleEffect method apply.

@Override
public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
    Player controller = game.getPlayer(source.getControllerId());
    if (controller != null) {
        for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
            Player player = game.getPlayer(playerId);
            if (player != null) {
                ManaPool pool = player.getManaPool();
                pool.addDoNotEmptyManaType(ManaType.WHITE);
                pool.addDoNotEmptyManaType(ManaType.GREEN);
                pool.addDoNotEmptyManaType(ManaType.BLUE);
                pool.addDoNotEmptyManaType(ManaType.RED);
                pool.addDoNotEmptyManaType(ManaType.BLACK);
                pool.addDoNotEmptyManaType(ManaType.COLORLESS);
            }
        }
        return true;
    }
    return false;
}
Also used : Player(mage.players.Player) ManaPool(mage.players.ManaPool) UUID(java.util.UUID)

Example 7 with ManaPool

use of mage.players.ManaPool in project mage by magefree.

the class WordOfCommandTestFlashEffect method apply.

@Override
public boolean apply(Game game, Ability source) {
    Player sourceController = game.getPlayer(source.getControllerId());
    Player targetPlayer = game.getPlayer(source.getFirstTarget());
    MageObject sourceObject = game.getObject(source.getSourceId());
    Card card = null;
    if (sourceController != null && targetPlayer != null && sourceObject != null) {
        Player controller = null;
        Spell wordOfCommand = game.getSpell(source.getSourceId());
        if (wordOfCommand != null) {
            if (wordOfCommand.getCommandedBy() != null) {
                controller = game.getPlayer(wordOfCommand.getCommandedBy());
            } else {
                controller = game.getPlayer(sourceController.getTurnControlledBy());
            }
        }
        if (controller == null) {
            // reset the controller to avoid NPE
            controller = sourceController;
        }
        // Look at target opponent's hand and choose a card from it
        TargetCard targetCard = new TargetCard(Zone.HAND, new FilterCard());
        if (controller.choose(Outcome.Discard, targetPlayer.getHand(), targetCard, game)) {
            card = game.getCard(targetCard.getFirstTarget());
        }
        // You control that player until Word of Command finishes resolving
        CardUtil.takeControlUnderPlayerStart(game, controller, targetPlayer, true);
        // The player plays that card if able
        if (card != null) {
            // While doing so, the player can activate mana abilities only if they're from lands that player controls
            RestrictionEffect effect = new WordOfCommandCantActivateEffect();
            effect.setTargetPointer(new FixedTarget(targetPlayer.getId()));
            game.addEffect(effect, source);
            // and only if mana they produce is spent to activate other mana abilities of lands they control and/or play that card
            ManaPool manaPool = targetPlayer.getManaPool();
            manaPool.setForcedToPay(true);
            manaPool.storeMana();
            int bookmark = game.bookmarkState();
            boolean canPlay = checkPlayability(card, targetPlayer, game, source);
            while (canPlay && targetPlayer.canRespond() && !targetPlayer.playCard(card, game, false, new ApprovingObject(source, game))) {
                SpellAbility spellAbility = card.getSpellAbility();
                if (spellAbility != null) {
                    spellAbility.getManaCostsToPay().clear();
                    spellAbility.getManaCostsToPay().addAll(spellAbility.getManaCosts());
                    // force rollback if card was deemed playable
                    ((ManaCostsImpl) spellAbility.getManaCostsToPay()).forceManaRollback(game, manaPool);
                    canPlay = checkPlayability(card, targetPlayer, game, source);
                } else {
                    break;
                }
            }
            if (!canPlay) {
                game.informPlayers(targetPlayer.getLogName() + " didn't play " + card.getLogName() + " (card can't be played)");
            }
            // duplicate in case of a new mana pool existing - probably not necessary, but just in case
            manaPool.setForcedToPay(false);
            // a rollback creates a new mana pool for the player, so it's necessary to find it again
            manaPool = targetPlayer.getManaPool();
            manaPool.setForcedToPay(false);
            game.removeBookmark(bookmark);
            targetPlayer.resetStoredBookmark(game);
            for (RestrictionEffect eff : game.getContinuousEffects().getRestrictionEffects()) {
                if (eff instanceof WordOfCommandCantActivateEffect) {
                    eff.discard();
                    break;
                }
            }
            game.getContinuousEffects().removeInactiveEffects(game);
            Spell spell = game.getSpell(card.getId());
            if (spell != null) {
                // If the chosen card is cast as a spell, you control the player while that spell is resolving
                spell.setCommandedBy(controller.getId());
            }
        }
        wordOfCommand = game.getSpell(source.getSourceId());
        if (wordOfCommand != null) {
            // You control the player until Word of Command finishes resolving
            wordOfCommand.setCommandedBy(controller.getId());
        } else {
            CardUtil.takeControlUnderPlayerEnd(game, controller, targetPlayer);
        }
        return true;
    }
    return false;
}
Also used : FixedTarget(mage.target.targetpointer.FixedTarget) Player(mage.players.Player) ApprovingObject(mage.ApprovingObject) MageObject(mage.MageObject) TargetCard(mage.target.TargetCard) SpellAbility(mage.abilities.SpellAbility) ManaPool(mage.players.ManaPool) ManaCostsImpl(mage.abilities.costs.mana.ManaCostsImpl) Spell(mage.game.stack.Spell) TargetCard(mage.target.TargetCard) Card(mage.cards.Card) FilterCard(mage.filter.FilterCard) FilterCard(mage.filter.FilterCard) RestrictionEffect(mage.abilities.effects.RestrictionEffect)

Example 8 with ManaPool

use of mage.players.ManaPool in project mage by magefree.

the class AssistEffect method apply.

@Override
public boolean apply(Game game, Ability source) {
    Player controller = game.getPlayer(source.getControllerId());
    Player targetPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source));
    Spell spell = game.getStack().getSpell(source.getSourceId());
    if (controller != null && spell != null && targetPlayer != null) {
        // AI can't assist other players, maybe for teammates only (but tests must work as normal)
        int amountToPay = 0;
        if (!targetPlayer.isComputer()) {
            amountToPay = targetPlayer.announceXMana(0, unpaid.getMana().getGeneric(), "How much mana to pay as assist for " + controller.getName() + "?", game, source);
        }
        if (amountToPay > 0) {
            Cost cost = ManaUtil.createManaCost(amountToPay, false);
            if (cost.pay(source, game, source, targetPlayer.getId(), false)) {
                ManaPool manaPool = controller.getManaPool();
                manaPool.addMana(Mana.ColorlessMana(amountToPay), game, source);
                // it's unlock mana for one use/click, but it can gives more
                manaPool.unlockManaType(ManaType.COLORLESS);
                game.informPlayers(targetPlayer.getLogName() + " paid {" + amountToPay + "} for " + controller.getLogName());
                game.getState().setValue(source.getSourceId().toString() + game.getState().getZoneChangeCounter(source.getSourceId()) + "_assisted", true);
            }
        // assist must be used before activating mana abilities, so no need to switch step after usage
        // (mana and other special abilities can be used after assist)
        // spell.setCurrentActivatingManaAbilitiesStep(ActivationManaAbilityStep.NORMAL);
        }
        return true;
    }
    return false;
}
Also used : TargetPlayer(mage.target.TargetPlayer) Player(mage.players.Player) FilterPlayer(mage.filter.FilterPlayer) ManaPool(mage.players.ManaPool) Cost(mage.abilities.costs.Cost) ManaCost(mage.abilities.costs.mana.ManaCost) Spell(mage.game.stack.Spell)

Aggregations

ManaPool (mage.players.ManaPool)8 Player (mage.players.Player)8 Spell (mage.game.stack.Spell)5 UUID (java.util.UUID)3 Permanent (mage.game.permanent.Permanent)3 Card (mage.cards.Card)2 FilterCard (mage.filter.FilterCard)2 ApprovingObject (mage.ApprovingObject)1 ConditionalMana (mage.ConditionalMana)1 MageObject (mage.MageObject)1 Mana (mage.Mana)1 SpellAbility (mage.abilities.SpellAbility)1 Cost (mage.abilities.costs.Cost)1 ExileFromGraveCost (mage.abilities.costs.common.ExileFromGraveCost)1 ManaCost (mage.abilities.costs.mana.ManaCost)1 ManaCostsImpl (mage.abilities.costs.mana.ManaCostsImpl)1 RestrictionEffect (mage.abilities.effects.RestrictionEffect)1 Cards (mage.cards.Cards)1 CardsImpl (mage.cards.CardsImpl)1 Choice (mage.choices.Choice)1