foul-magics/Mage/src/main/java/mage/abilities/keyword/EvolveAbility.java

149 lines
6.2 KiB
Java

package mage.abilities.keyword;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.OneShotEffect;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
/**
* FAQ 2013/01/11
*
* 702.98. Evolve
*
* 702.98a Evolve is a triggered ability. "Evolve" means "Whenever a creature
* enters the battlefield under your control, if that creature's power is
* greater than this creature's power and/or that creature's toughness is
* greater than this creature's toughness, put a +1/+1 counter on this
* creature."
*
* 702.98b If a creature has multiple instances of evolve, each triggers
* separately
*
* Rulings
*
* When comparing the stats of the two creatures, you always compare power to
* power and toughness to toughness. Whenever a creature enters the battlefield
* under your control, check its power and toughness against the power and
* toughness of the creature with evolve. If neither stat of the new creature is
* greater, evolve won't trigger at all. For example, if you control a 2/3
* creature with evolve and a 2/2 creature enters the battlefield under your
* control, you won't have the opportunity to cast a spell like Giant Growth to
* make the 2/2 creature large enough to cause evolve to trigger. If evolve
* triggers, the stat comparison will happen again when the ability tries to
* resolve. If neither stat of the new creature is greater, the ability will do
* nothing. If the creature that entered the battlefield leaves the battlefield
* before evolve tries to resolve, use its last known power and toughness to
* compare the stats. If a creature enters the battlefield with +1/+1 counters
* on it, consider those counters when determining if evolve will trigger. For
* example, a 1/1 creature that enters the battlefield with two +1/+1 counters
* on it will cause the evolve ability of a 2/2 creature to trigger. If multiple
* creatures enter the battlefield at the same time, evolve may trigger multiple
* times, although the stat comparison will take place each time one of those
* abilities tries to resolve. For example, if you control a 2/2 creature with
* evolve and two 3/3 creatures enter the battlefield, evolve will trigger
* twice. The first ability will resolve and put a +1/+1 counter on the creature
* with evolve. When the second ability tries to resolve, neither the power nor
* the toughness of the new creature is greater than that of the creature with
* evolve, so that ability does nothing. When comparing the stats as the evolve
* ability resolves, it's possible that the stat that's greater changes from
* power to toughness or vice versa. If this happens, the ability will still
* resolve and you'll put a +1/+1 counter on the creature with evolve. For
* example, if you control a 2/2 creature with evolve and a 1/3 creature enters
* the battlefield under your control, it toughness is greater so evolve will
* trigger. In response, the 1/3 creature gets +2/-2. When the evolve trigger
* tries to resolve, its power is greater. You'll put a +1/+1 counter on the
* creature with evolve.
*
* @author LevelX2
*/
public class EvolveAbility extends TriggeredAbilityImpl {
public EvolveAbility() {
super(Zone.BATTLEFIELD, new EvolveEffect());
}
public EvolveAbility(EvolveAbility ability) {
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (!event.getTargetId().equals(this.getSourceId())) {
Permanent triggeringCreature = game.getPermanent(event.getTargetId());
if (triggeringCreature != null
&& triggeringCreature.isCreature()
&& triggeringCreature.isControlledBy(this.controllerId)) {
Permanent sourceCreature = game.getPermanent(sourceId);
if (sourceCreature != null && isPowerOrThoughnessGreater(sourceCreature, triggeringCreature)) {
this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId()));
return true;
}
}
}
return false;
}
@Override
public boolean checkInterveningIfClause(Game game) {
return true;
}
public static boolean isPowerOrThoughnessGreater(Permanent sourceCreature, Permanent newCreature) {
if (newCreature.getPower().getValue() > sourceCreature.getPower().getValue()) {
return true;
}
return newCreature.getToughness().getValue() > sourceCreature.getToughness().getValue();
}
@Override
public String getRule() {
return "Evolve <i>(Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than this creature, put a +1/+1 counter on this creature.)</i>";
}
@Override
public EvolveAbility copy() {
return new EvolveAbility(this);
}
}
class EvolveEffect extends OneShotEffect {
public EvolveEffect() {
super(Outcome.BoostCreature);
}
public EvolveEffect(final EvolveEffect effect) {
super(effect);
}
@Override
public EvolveEffect copy() {
return new EvolveEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent triggeringCreature = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
if (triggeringCreature != null) {
Permanent sourceCreature = game.getPermanent(source.getSourceId());
if (sourceCreature != null && EvolveAbility.isPowerOrThoughnessGreater(sourceCreature, triggeringCreature)) {
sourceCreature.addCounters(CounterType.P1P1.createInstance(), source, game);
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.EVOLVED_CREATURE, sourceCreature.getId(), source.getSourceId(), source.getControllerId()));
}
return true;
}
return false;
}
}