updated how Withering Wisps and limited use activated abilities are implemented

This commit is contained in:
Evan Kranzler 2017-10-14 08:42:13 -04:00
parent 0c8032aa52
commit 79d4c07d20
2 changed files with 21 additions and 49 deletions

View file

@ -31,7 +31,6 @@ import java.util.UUID;
import mage.abilities.ActivatedAbilityImpl;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.OnEventTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.common.CreatureCountCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalTriggeredAbility;
@ -50,7 +49,6 @@ import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.mageobject.SupertypePredicate;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.util.CardUtil;
/**
*
@ -61,7 +59,7 @@ public class WitheringWisps extends CardImpl {
private static final String ruleText = "At the beginning of the end step, if no creatures are on the battlefield, sacrifice {this}.";
public WitheringWisps(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{B}{B}");
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}{B}");
// At the beginning of the end step, if no creatures are on the battlefield, sacrifice Withering Wisps.
TriggeredAbility triggered = new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of the end step", true, new SacrificeSourceEffect());
@ -83,25 +81,16 @@ public class WitheringWisps extends CardImpl {
class WitheringWispsActivatedAbility extends ActivatedAbilityImpl {
static class ActivationInfo {
private static final FilterPermanent filter = new FilterPermanent("snow Swamps you control");
public int turnNum;
public int activationCounter;
public ActivationInfo(int turnNum, int activationCounter) {
this.turnNum = turnNum;
this.activationCounter = activationCounter;
}
}
private static final FilterPermanent filter = new FilterPermanent("snow lands you control");
{
static {
filter.add(new SupertypePredicate(SuperType.SNOW));
filter.add(new SubtypePredicate(SubType.SWAMP));
filter.add(new ControllerPredicate(TargetController.YOU));
}
private int maxActivationsPerTurn(Game game) {
@Override
public int getMaxActivationsPerTurn(Game game) {
return game.getBattlefield().getAllActivePermanents(filter, game).size();
}
@ -114,32 +103,9 @@ class WitheringWispsActivatedAbility extends ActivatedAbilityImpl {
super(ability);
}
protected boolean hasMoreActivationsThisTurn(Game game) {
if (this.maxActivationsPerTurn(game) > 0) {
ActivationInfo activationInfo = getActivationInfo(game);
return activationInfo == null || activationInfo.turnNum != game.getTurnNum() || activationInfo.activationCounter < this.maxActivationsPerTurn(game);
}
return false;
}
private ActivationInfo getActivationInfo(Game game) {
Integer turnNum = (Integer) game.getState().getValue(CardUtil.getCardZoneString("activationsTurn" + originalId, sourceId, game));
Integer activationCount = (Integer) game.getState().getValue(CardUtil.getCardZoneString("activationsCount" + originalId, sourceId, game));
if (turnNum == null || activationCount == null) {
return null;
}
return new ActivationInfo(turnNum, activationCount);
}
@Override
public boolean resolve(Game game) {
return super.resolve(game);
}
@Override
public String getRule() {
StringBuilder sb = new StringBuilder(super.getRule()).append(" Activate this ability no more times each turn than the number of snow Swamps you control.");
return sb.toString();
return super.getRule() + " Activate this ability no more times each turn than the number of snow Swamps you control.";
}
@Override

View file

@ -54,7 +54,7 @@ import mage.util.CardUtil;
*/
public abstract class ActivatedAbilityImpl extends AbilityImpl implements ActivatedAbility {
static class ActivationInfo {
protected static class ActivationInfo {
public int turnNum;
public int activationCounter;
@ -276,11 +276,13 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa
}
protected boolean hasMoreActivationsThisTurn(Game game) {
if (maxActivationsPerTurn == Integer.MAX_VALUE) {
if (getMaxActivationsPerTurn(game) == Integer.MAX_VALUE) {
return true;
}
ActivationInfo activationInfo = getActivationInfo(game);
return activationInfo == null || activationInfo.turnNum != game.getTurnNum() || activationInfo.activationCounter < maxActivationsPerTurn;
return activationInfo == null
|| activationInfo.turnNum != game.getTurnNum()
|| activationInfo.activationCounter < getMaxActivationsPerTurn(game);
}
@Override
@ -307,7 +309,11 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa
this.maxActivationsPerTurn = maxActivationsPerTurn;
}
private ActivationInfo getActivationInfo(Game game) {
public int getMaxActivationsPerTurn(Game game) {
return maxActivationsPerTurn;
}
protected ActivationInfo getActivationInfo(Game game) {
Integer turnNum = (Integer) game.getState().getValue(CardUtil.getCardZoneString("activationsTurn" + originalId, sourceId, game));
Integer activationCount = (Integer) game.getState().getValue(CardUtil.getCardZoneString("activationsCount" + originalId, sourceId, game));
if (turnNum == null || activationCount == null) {
@ -316,7 +322,7 @@ public abstract class ActivatedAbilityImpl extends AbilityImpl implements Activa
return new ActivationInfo(turnNum, activationCount);
}
private void setActivationInfo(ActivationInfo activationInfo, Game game) {
protected void setActivationInfo(ActivationInfo activationInfo, Game game) {
game.getState().setValue(CardUtil.getCardZoneString("activationsTurn" + originalId, sourceId, game), activationInfo.turnNum);
game.getState().setValue(CardUtil.getCardZoneString("activationsCount" + originalId, sourceId, game), activationInfo.activationCounter);
}