Package mage.game.stack

Examples of mage.game.stack.StackObject


    }

    @Override
    public boolean checkTrigger(GameEvent event, Game game) {
        if (event.getType() == EventType.DAMAGED_PLAYER) {
            StackObject stackObject = game.getStack().getStackObject(event.getSourceId());
            if (stackObject != null && stackObject.getControllerId().equals(getControllerId())) {
                MageObject object = game.getObject(stackObject.getSourceId());
                if (object.getCardType().contains(CardType.INSTANT) || object.getCardType().contains(CardType.SORCERY)) {
                    if (game.getOpponents(getControllerId()).contains(event.getTargetId())) {
                        if (!handledStackObjects.contains(stackObject.getId())) {
                            handledStackObjects.add(stackObject.getId());
                            for (Effect effect: this.getEffects()) {
                                effect.setTargetPointer(new FixedTarget(event.getTargetId()));
                                effect.setValue("damage", event.getAmount());
                            }
                            return true;
View Full Code Here


    public boolean checkTrigger(GameEvent event, Game game) {
        if (event.getType().equals(GameEvent.EventType.COUNTER_ADDED)
                && event.getTargetId().equals(getSourceId())) {
            Object object = game.getState().getValue("EvolveAddCounterActive");
            if (object != null && (Boolean) object) {
                StackObject stackObject = game.getStack().getLast();
                if (stackObject.getStackAbility() instanceof EvolveAbility) {
                    object = game.getState().getValue(this.getId() + "_lastUsedEvolveStackObject");
                    if (object != null && ((UUID) object).equals(stackObject.getId())) {
                        // this evolve was already handled before (prevents to trigger multiple times if counter from evolve is e.g. doubled)
                        return false;
                    }
                    game.getState().setValue(this.getId() + "_lastUsedEvolveStackObject", stackObject.getId());
                    return true;
                }
            }
        }
        return false;
View Full Code Here

        super(effect);
    }

    @Override
    public boolean apply(Game game, Ability source) {
        StackObject stackObject = game.getStack().getStackObject(source.getFirstTarget());
        MageObject sourceObject = game.getObject(source.getSourceId());
        if (stackObject != null && sourceObject != null) {
            Targets targets;
            Ability sourceAbility;
            MageObject oldTarget = null;
            if (stackObject instanceof Spell) {
                Spell spell = (Spell)stackObject;
                sourceAbility = spell.getSpellAbility();
                targets = spell.getSpellAbility().getTargets();
            } else if (stackObject instanceof StackAbility) {
                StackAbility stackAbility = (StackAbility)stackObject;
                sourceAbility = stackAbility;
                targets = stackAbility.getTargets();
            } else {
                return false;
            }
            boolean twoTimesTarget = false;
            if (targets.size() == 1 && targets.get(0).getTargets().size() == 1) {
                Target target = targets.get(0);
                if (target.canTarget(stackObject.getControllerId(), source.getSourceId(), sourceAbility, game)) {
                    oldTarget = game.getObject(targets.getFirstTarget());
                    target.clearChosen();
                    target.add(source.getSourceId(), game);
                }               
            }
            else {
                Player player = game.getPlayer(source.getControllerId());
                for (Target target: targets) {
                    for (UUID targetId: target.getTargets()) {
                        MageObject object = game.getObject(targetId);
                        String name;
                        if (object == null) {
                            Player targetPlayer = game.getPlayer(targetId);
                            name = targetPlayer.getName();
                        } else {
                            name = object.getName();
                        }
                        if (!targetId.equals(source.getSourceId()) && target.getTargets().contains(source.getSourceId())) {
                            // you can't change this target to Spellskite because Spellskite is already another targetId of that target.
                            twoTimesTarget = true;
                            continue;
                        }
                        if (name != null && player.chooseUse(Outcome.Neutral, new StringBuilder("Change target from ").append(name).append(" to ").append(sourceObject.getName()).append("?").toString(), game)) {
                            if (target.canTarget(stackObject.getControllerId(), source.getSourceId(), sourceAbility, game)) {
                                oldTarget = game.getObject(targets.getFirstTarget());
                                target.remove(targetId);
                                target.addTarget(source.getSourceId(), source, game);
                                break;
                            }
                        }
                    }
                }
            }
            if (oldTarget != null) {
                game.informPlayers(new StringBuilder(sourceObject.getName()).append(": Changed target of ").append(stackObject.getName()).append(" from ").append(oldTarget.getName()).append(" to ").append(sourceObject.getName()).toString());
            } else {
                if (twoTimesTarget) {
                    game.informPlayers(sourceObject.getLogName() + ": Target not changed to " + sourceObject.getLogName() + " because its not valid to target it twice for " + stackObject.getName());
                } else {
                    game.informPlayers(sourceObject.getLogName() + ": Target not changed to " + sourceObject.getLogName() + " because its no valid target for " + stackObject.getName());
                }
            }
            return true;
        }
        return false;
View Full Code Here

        return new PowerSinkCounterUnlessPaysEffect(this);
    }

    @Override
    public boolean apply(Game game, Ability source) {
        StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source));
        if (spell != null) {
            Player player = game.getPlayer(spell.getControllerId());
            Player controller = game.getPlayer(source.getControllerId());
            MageObject sourceObject = game.getObject(source.getSourceId());
            if (player != null && controller != null && sourceObject != null) {
                int amount = source.getManaCostsToPay().getX();
                if (amount > 0) {
                    GenericManaCost cost = new GenericManaCost(amount);
                    StringBuilder sb = new StringBuilder("Pay ").append(cost.getText()).append("?");
                    if (player.chooseUse(Outcome.Benefit, sb.toString(), game)) {
                        if (cost.pay(source, game, source.getSourceId(), player.getId(), false)) {
                            game.informPlayers(new StringBuilder(sourceObject.getName()).append(": additional cost was paid").toString());
                            return true;
                        }
                    }
                   
                    // Counter target spell unless its controller pays {X}
                    if (game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game)) {
                        game.informPlayers(new StringBuilder(sourceObject.getName()).append(": additional cost wasn't paid - countering ").append(spell.getName()).toString());
                    }
                   
                    // that player taps all lands with mana abilities he or she controls...
                    List<Permanent> lands = game.getBattlefield().getAllActivePermanents(new FilterLandPermanent(), player.getId(), game);
                    for (Permanent land : lands) {
View Full Code Here

        return new SpellSyphonEffect(this);
    }

    @Override
    public boolean apply(Game game, Ability source) {
        StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source));
        if (spell != null) {
            Player player = game.getPlayer(spell.getControllerId());
            Player controller = game.getPlayer(source.getControllerId());
            if (player != null && controller != null) {
                int amount = game.getBattlefield().count(filter, source.getSourceId(), controller.getId(), game);
                if (amount == 0) {
                    game.informPlayers("Spell Syphon: no blue permanents in controller's battlefield.");
                } else {
                    GenericManaCost cost = new GenericManaCost(amount);
                    if (!cost.pay(source, game, spell.getControllerId(), spell.getControllerId(), false)) {
                        game.informPlayers("Spell Syphon: cost wasn't payed - countering target spell.");
                        return game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game);
                    }
                }
            }
View Full Code Here

        return new FrightfulDelusionEffect(this);
    }

    @Override
    public boolean apply(Game game, Ability source) {
        StackObject spell = game.getStack().getStackObject(
                targetPointer.getFirst(game, source));
        Cost cost = new GenericManaCost(1);
        if (spell != null) {
            Player player = game.getPlayer(spell.getControllerId());
            if (player != null) {
                cost.clearPaid();
                game.getPlayer(spell.getControllerId()).discard(
                        1, source, game);
                if (!cost.pay(source, game, spell.getControllerId(),
                        spell.getControllerId(), false)) {
                    return game.getStack().counter(source.getFirstTarget(),
                            source.getSourceId(), game);
                }
            }
        }
View Full Code Here

        }
        return null;
    }

    protected void resolve(SimulationNode2 node, int depth, Game game) {
        StackObject ability = game.getStack().pop();
        if (ability instanceof StackAbility) {
            SearchEffect effect = getSearchEffect((StackAbility) ability);
            if (effect != null && ability.getControllerId().equals(playerId)) {
                Target target = effect.getTarget();
                if (!target.doneChosing()) {
                    for (UUID targetId : target.possibleTargets(ability.getSourceId(), ability.getControllerId(), game)) {
                        Game sim = game.copy();
                        StackAbility newAbility = (StackAbility) ability.copy();
                        SearchEffect newEffect = getSearchEffect(newAbility);
                        newEffect.getTarget().addTarget(targetId, newAbility, sim);
                        sim.getStack().push(newAbility);
                        SimulationNode2 newNode = new SimulationNode2(node, sim, depth, ability.getControllerId());
                        node.children.add(newNode);
                        newNode.getTargets().add(targetId);
                        logger.trace("Sim search -- node#: " + SimulationNode2.getCount() + " for player: " + sim.getPlayer(ability.getControllerId()).getName());
                    }
                    return;
                }
            }
        }
        //logger.info("simulating resolve ");
        ability.resolve(game);
        game.applyEffects();
        game.getPlayers().resetPassed();
        game.getPlayerList().setCurrent(game.getActivePlayerId());
    }
View Full Code Here

        return new CircularLogicCounterUnlessPaysEffect(this);
    }

    @Override
    public boolean apply(Game game, Ability source) {
        StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source));
        if (spell != null) {
            Player player = game.getPlayer(spell.getControllerId());
            Player controller = game.getPlayer(source.getControllerId());
            if (player != null && controller != null) {
                int amount = controller.getGraveyard().size();
                if (amount == 0) {
                    game.informPlayers("Circular Logic: no cards in controller's graveyard.");
                } else {
                    GenericManaCost cost = new GenericManaCost(amount);
                    if (!cost.pay(source, game, spell.getControllerId(), spell.getControllerId(), false)) {
                        game.informPlayers("Circular Logic: cost wasn't payed - countering target spell.");
                        return game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game);
                    }
                }
            }
View Full Code Here

        }
        if (target instanceof TargetSpell) {
            if (game.getStack().size() > 0) {
                Iterator<StackObject> it = game.getStack().iterator();
                while (it.hasNext()) {
                    StackObject o = it.next();
                    if (o instanceof Spell && !source.getId().equals(o.getStackAbility().getId())) {
                        target.addTarget(o.getId(), source, game);
                        return true;
                    }
                }
            }
            return false;
        }       
        if (target instanceof TargetSpellOrPermanent) {
            List<Permanent> targets;
            boolean outcomeTargets = true;
            if (outcome.isGood()) {
                targets = threats(playerId, source == null?null:source.getSourceId(), ((TargetPermanent)target).getFilter(), game, target.getTargets());
            }
            else {
                targets = threats(opponentId, source == null?null:source.getSourceId(), ((TargetPermanent)target).getFilter(), game, target.getTargets());
            }           
            if (targets.isEmpty() && target.isRequired(source)) {
                targets = threats(null, source == null?null:source.getSourceId(), ((TargetPermanent)target).getFilter(), game, target.getTargets());
                Collections.reverse(targets);
                outcomeTargets = false;
                //targets = game.getBattlefield().getActivePermanents(((TargetPermanent)target).getFilter(), playerId, game);
            }
            for (Permanent permanent: targets) {
                if (((TargetPermanent)target).canTarget(playerId, permanent.getId(), source, game)) {
                    target.addTarget(permanent.getId(), source, game);
                    if (!outcomeTargets || target.getMaxNumberOfTargets() <= target.getTargets().size()) {
                        return true;
                    }
                }
            }          
            if (game.getStack().size() > 0) {
                Iterator<StackObject> it = game.getStack().iterator();
                while (it.hasNext()) {
                    StackObject o = it.next();
                    if (o instanceof Spell && !source.getId().equals(o.getStackAbility().getId())) {
                        target.addTarget(o.getId(), source, game);
                        return true;
                    }
                }
            }
            return false;
View Full Code Here

    public boolean applies(GameEvent event, Ability source, Game game) {
      if (event.getType().equals(GameEvent.EventType.DAMAGE_PLAYER)   //Checks for player damage
      && event.getTargetId().equals(source.getControllerId()))    //Checks to see the damage is to Aegis of Honor's controller
        {
            Spell spell = null;
            StackObject stackObject = game.getStack().getStackObject(event.getSourceId());
            if (stackObject == null) {
               stackObject = (StackObject) game.getLastKnownInformation(event.getSourceId(), Zone.STACK);
            }
            if (stackObject instanceof Spell) {
                spell = (Spell) stackObject;
View Full Code Here

TOP

Related Classes of mage.game.stack.StackObject

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.