* Added early event type check for replacement effects to speed up game execution (not all effects already implement the new check).

This commit is contained in:
LevelX2 2014-12-26 17:28:13 +01:00
parent ba57478149
commit 9039eef0f9
40 changed files with 283 additions and 144 deletions

View file

@ -76,7 +76,7 @@ class VexingDevilEffect extends OneShotEffect {
public VexingDevilEffect() {
super(Outcome.Neutral);
staticText = "any opponent may have it deal 4 damage to him or her. If a player does, sacrifice Vexing Devil";
staticText = "any opponent may have it deal 4 damage to him or her. If a player does, sacrifice {this}";
}
VexingDevilEffect(final VexingDevilEffect effect) {
@ -85,28 +85,19 @@ class VexingDevilEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId());
if (player != null && permanent != null) {
StringBuilder sb = new StringBuilder();
sb.append("Make ").append(permanent.getName()).append(" deal 4 damage to you?");
Set<UUID> opponents = game.getOpponents(source.getControllerId());
for (UUID opponentUuid : opponents) {
if (controller != null && permanent != null) {
for (UUID opponentUuid : game.getOpponents(source.getControllerId())) {
Player opponent = game.getPlayer(opponentUuid);
if (opponent != null && opponent.chooseUse(Outcome.LoseLife, sb.toString(), game)) {
if (opponent != null && opponent.chooseUse(Outcome.LoseLife, "Make " + permanent.getName() + " deal 4 damage to you?", game)) {
game.informPlayers(opponent.getName() + " has chosen to receive 4 damage from " + permanent.getName());
int dealt = opponent.damage(4, permanent.getId(), game, false, true);
if (dealt == 4) {
game.informPlayers(opponent.getName() + " was dealt 4 damage so " + permanent.getName() + " will be sacrificed.");
permanent.sacrifice(source.getSourceId(), game);
return true;
} else {
game.informPlayers("4 damage wasn't dealt so " + permanent.getName() + " won't be sacrificed.");
}
opponent.damage(4, permanent.getId(), game, false, true);
permanent.sacrifice(source.getSourceId(), game);
return true;
}
}
game.informPlayers("4 damage wasn't dealt so " + permanent.getName() + " won't be sacrificed.");
return true;
}
return false;

View file

@ -142,13 +142,15 @@ class StrangleholdSkipExtraTurnsEffect extends ReplacementEffectImpl {
return true;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType().equals(GameEvent.EventType.EXTRA_TURN);
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (EventType.EXTRA_TURN.equals(event.getType())) {
Player controller = game.getPlayer(source.getControllerId());
return controller != null && controller.hasOpponent(event.getPlayerId(), game);
}
return false;
Player controller = game.getPlayer(source.getControllerId());
return controller != null && controller.hasOpponent(event.getPlayerId(), game);
}
}

View file

@ -37,8 +37,6 @@ import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
@ -88,13 +86,14 @@ class PrimalVigorTokenEffect extends ReplacementEffectImpl {
return new PrimalVigorTokenEffect(this);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.CREATE_TOKEN;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
switch (event.getType()) {
case CREATE_TOKEN:
return true;
}
return false;
return true;
}
@Override
@ -112,8 +111,6 @@ class PrimalVigorTokenEffect extends ReplacementEffectImpl {
class PrimalVigorCounterEffect extends ReplacementEffectImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
PrimalVigorCounterEffect() {
super(Duration.WhileOnBattlefield, Outcome.BoostCreature, false);
staticText = "If one or more +1/+1 counters would be placed on a creature, twice that many +1/+1 counters are placed on that creature instead";
@ -129,14 +126,17 @@ class PrimalVigorCounterEffect extends ReplacementEffectImpl {
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ADD_COUNTERS;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == GameEvent.EventType.ADD_COUNTERS) {
Permanent target = game.getPermanent(event.getTargetId());
if (target != null && filter.match(target, game)
&& event.getData() != null && event.getData().equals("+1/+1")) {
return true;
}
Permanent target = game.getPermanent(event.getTargetId());
if (target != null && target.getCardType().contains(CardType.CREATURE)
&& event.getData() != null && event.getData().equals("+1/+1")) {
return true;
}
return false;
}

View file

@ -64,7 +64,7 @@ public class RiseFall extends SplitCard {
// Rise
// Return target creature card from a graveyard and target creature on the battlefield to their owners' hands.
getLeftHalfCard().getSpellAbility().addEffect(new RiseEffect());
getLeftHalfCard().getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard()));
getLeftHalfCard().getSpellAbility().addTarget(new TargetCardInGraveyard(new FilterCreatureCard("creature card from a graveyard")));
getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
getLeftHalfCard().getColor().setBlue(true);
getLeftHalfCard().getColor().setBlack(true);
@ -151,7 +151,7 @@ class FallEffect extends OneShotEffect {
if (targetPlayer.getHand().size() > 1) {
do {
card = targetPlayer.getHand().getRandom(game);
} while (!cards.contains(card.getId()));
} while (cards.contains(card.getId()));
cards.add(card);
}
targetPlayer.revealCards(sourceObject.getLogName(), cards, game);

View file

@ -55,8 +55,6 @@ public class GilderBairn extends CardImpl {
this.expansionSetCode = "EVE";
this.subtype.add("Ouphe");
this.color.setBlue(true);
this.color.setGreen(true);
this.power = new MageInt(1);
this.toughness = new MageInt(3);

View file

@ -112,13 +112,16 @@ class EntersBattlefieldEffect extends ReplacementEffectImpl {
baseEffects.add(effect);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType().equals(GameEvent.EventType.ENTERS_THE_BATTLEFIELD);
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getControllerId().equals(source.getControllerId()) && permanent.getCardType().contains(CardType.CREATURE)) {
return true;
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getControllerId().equals(source.getControllerId()) && permanent.getCardType().contains(CardType.CREATURE)) {
return true;
}
return false;
}

View file

@ -139,9 +139,14 @@ class AnafenzaTheForemostEffect extends ReplacementEffectImpl {
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType().equals(GameEvent.EventType.ZONE_CHANGE);
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).getToZone() == Zone.GRAVEYARD) {
if (((ZoneChangeEvent)event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && card.getCardType().contains(CardType.CREATURE) &&
game.getOpponents(source.getControllerId()).contains(card.getOwnerId())) {

View file

@ -87,14 +87,16 @@ class DoublingSeasonTokenEffect extends ReplacementEffectImpl {
return new DoublingSeasonTokenEffect(this);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType().equals(GameEvent.EventType.CREATE_TOKEN);
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
switch (event.getType()) {
case CREATE_TOKEN:
StackObject spell = game.getStack().getStackObject(event.getSourceId());
if (spell != null && spell.getControllerId().equals(source.getControllerId())) {
return true;
}
StackObject spell = game.getStack().getStackObject(event.getSourceId());
if (spell != null && spell.getControllerId().equals(source.getControllerId())) {
return true;
}
return false;
}

View file

@ -96,9 +96,14 @@ class LoxodonSmiterEffect extends ReplacementEffectImpl {
return new LoxodonSmiterEffect(this);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && event.getTargetId().equals(source.getSourceId())) {
if (event.getTargetId().equals(source.getSourceId())) {
ZoneChangeEvent zcEvent = (ZoneChangeEvent) event;
if (zcEvent.getFromZone() == Zone.HAND && zcEvent.getToZone() == Zone.GRAVEYARD) {
StackObject spell = game.getStack().getStackObject(event.getSourceId());

View file

@ -103,11 +103,22 @@ class PalisadeGiantReplacementEffect extends ReplacementEffectImpl {
super(effect);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
switch(event.getType()) {
case DAMAGED_CREATURE:
case DAMAGED_PLAYER:
case DAMAGE_PLANESWALKER:
return true;
default:
return false;
}
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == GameEvent.EventType.DAMAGE_PLAYER && event.getPlayerId().equals(source.getControllerId()))
{
return true;
}
if (event.getType() == GameEvent.EventType.DAMAGE_CREATURE || event.getType() == GameEvent.EventType.DAMAGE_PLANESWALKER)

View file

@ -112,9 +112,14 @@ class WiltLeafLiegeEffect extends ReplacementEffectImpl {
return new WiltLeafLiegeEffect(this);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType().equals(GameEvent.EventType.ZONE_CHANGE);
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && event.getTargetId().equals(source.getSourceId())) {
if (event.getTargetId().equals(source.getSourceId())) {
ZoneChangeEvent zcEvent = (ZoneChangeEvent) event;
if (zcEvent.getFromZone() == Zone.HAND && zcEvent.getToZone() == Zone.GRAVEYARD) {
StackObject spell = game.getStack().getStackObject(event.getSourceId());

View file

@ -119,9 +119,14 @@ class MoxDiamondReplacementEffect extends ReplacementEffectImpl {
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && source.getSourceId().equals(event.getTargetId())) {
if (source.getSourceId().equals(event.getTargetId())) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if(zEvent.getToZone().equals(Zone.BATTLEFIELD)){
return true;