mirror of
https://github.com/magefree/mage.git
synced 2026-01-24 12:19:59 -08:00
* 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:
parent
ba57478149
commit
9039eef0f9
40 changed files with 283 additions and 144 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue