mirror of
https://github.com/magefree/mage.git
synced 2025-12-27 14:02:05 -08:00
* Whip of Erebos - Fixed a bug that if target creature already left battlefield, the card was still moved to general exile zone (causing problems with Obzedat, Ghost council).
This commit is contained in:
parent
d74921aa66
commit
9ca014b10e
4 changed files with 57 additions and 33 deletions
|
|
@ -34,8 +34,10 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -43,13 +45,19 @@ import mage.game.permanent.Permanent;
|
|||
*/
|
||||
public class ExileTargetEffect extends OneShotEffect<ExileTargetEffect> {
|
||||
|
||||
private Zone onlyFromZone;
|
||||
private String exileZone = null;
|
||||
private UUID exileId = null;
|
||||
|
||||
public ExileTargetEffect(UUID exileId, String exileZone) {
|
||||
this();
|
||||
public ExileTargetEffect(UUID exileId, String exileZone, Zone onlyFromZone) {
|
||||
super(Outcome.Exile);
|
||||
this.exileZone = exileZone;
|
||||
this.exileId = exileId;
|
||||
this.onlyFromZone = onlyFromZone;
|
||||
}
|
||||
|
||||
public ExileTargetEffect(UUID exileId, String exileZone) {
|
||||
this(exileId, exileZone, null);
|
||||
}
|
||||
|
||||
public ExileTargetEffect(String effectText) {
|
||||
|
|
@ -58,13 +66,14 @@ public class ExileTargetEffect extends OneShotEffect<ExileTargetEffect> {
|
|||
}
|
||||
|
||||
public ExileTargetEffect() {
|
||||
super(Outcome.Exile);
|
||||
this(null, null);
|
||||
}
|
||||
|
||||
public ExileTargetEffect(final ExileTargetEffect effect) {
|
||||
super(effect);
|
||||
this.exileZone = effect.exileZone;
|
||||
this.exileId = effect.exileId;
|
||||
this.onlyFromZone = effect.onlyFromZone;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -75,12 +84,21 @@ public class ExileTargetEffect extends OneShotEffect<ExileTargetEffect> {
|
|||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
|
||||
if (permanent != null) {
|
||||
return permanent.moveToExile(exileId, exileZone, source.getSourceId(), game);
|
||||
} else {
|
||||
Card card = game.getCard(targetPointer.getFirst(game, source));
|
||||
if (card != null) {
|
||||
return card.moveToExile(exileId, exileZone, source.getSourceId(), game);
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller != null) {
|
||||
if (permanent != null) {
|
||||
Zone currentZone = game.getState().getZone(permanent.getId());
|
||||
if (!currentZone.equals(Zone.EXILED) && (onlyFromZone == null || onlyFromZone.equals(Zone.BATTLEFIELD))) {
|
||||
return controller.moveCardToExileWithInfo(permanent, exileId, exileZone, source.getSourceId(), game, onlyFromZone);
|
||||
}
|
||||
} else {
|
||||
Card card = game.getCard(targetPointer.getFirst(game, source));
|
||||
if (card != null) {
|
||||
Zone currentZone = game.getState().getZone(card.getId());
|
||||
if (!currentZone.equals(Zone.EXILED) && (onlyFromZone == null || onlyFromZone.equals(currentZone))) {
|
||||
return controller.moveCardToExileWithInfo(card, exileId, exileZone, source.getSourceId(), game, onlyFromZone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -2108,6 +2108,7 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
|||
.append(" puts ").append(card.getName()).append(" ")
|
||||
.append(fromZone != null ? new StringBuilder("from ").append(fromZone.toString().toLowerCase(Locale.ENGLISH)).append(" "):"")
|
||||
.append("into his or her hand").toString());
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
@ -2120,6 +2121,7 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
|||
.append(" puts ").append(card.getName()).append(" ")
|
||||
.append(fromZone != null ? new StringBuilder("from ").append(fromZone.toString().toLowerCase(Locale.ENGLISH)).append(" "):"")
|
||||
.append("into his or her graveyard").toString());
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
@ -2143,13 +2145,14 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId, boolean tapped) {
|
||||
public boolean putOntoBattlefieldWithInfo(Card card, Game game, Zone fromZone, UUID sourceId, boolean tapped) {
|
||||
boolean result = false;
|
||||
if (card.putOntoBattlefield(game, fromZone, sourceId, this.getId(), tapped)) {
|
||||
game.informPlayers(new StringBuilder(this.getName())
|
||||
.append(" puts ").append(card.getName())
|
||||
.append(" from ").append(fromZone.toString().toLowerCase(Locale.ENGLISH)).append(" ")
|
||||
.append("onto the Battlefield").toString());
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue