mirror of
https://github.com/correl/mage.git
synced 2025-03-31 01:07:39 -09:00
Added zoneChangeCounter to fix spell fizzle on flicker bug. All tests passed.
This commit is contained in:
parent
4c3a9e5c50
commit
1d22d59c42
4 changed files with 47 additions and 3 deletions
Mage/src/mage
|
@ -67,6 +67,8 @@ public interface Card extends MageObject {
|
|||
|
||||
public void assignNewId();
|
||||
|
||||
public int getZoneChangeCounter();
|
||||
|
||||
/**
|
||||
* Moves the card to the specified zone
|
||||
* @param zone
|
||||
|
|
|
@ -66,6 +66,7 @@ public abstract class CardImpl<T extends CardImpl<T>> extends MageObjectImpl<T>
|
|||
protected boolean nightCard;
|
||||
protected SpellAbility spellAbility;
|
||||
protected boolean flipCard;
|
||||
protected int zoneChangeCounter = 1;
|
||||
|
||||
public CardImpl(UUID ownerId, int cardNumber, String name, Rarity rarity, CardType[] cardTypes, String costs) {
|
||||
this(ownerId, name);
|
||||
|
@ -277,6 +278,7 @@ public abstract class CardImpl<T extends CardImpl<T>> extends MageObjectImpl<T>
|
|||
return false;
|
||||
}
|
||||
setControllerId(ownerId);
|
||||
updateZoneChangeCounter();
|
||||
game.setZone(objectId, event.getToZone());
|
||||
game.fireEvent(event);
|
||||
return game.getState().getZone(objectId) == toZone;
|
||||
|
@ -342,6 +344,7 @@ public abstract class CardImpl<T extends CardImpl<T>> extends MageObjectImpl<T>
|
|||
} else {
|
||||
game.getExile().createZone(exileId, name).add(this);
|
||||
}
|
||||
updateZoneChangeCounter();
|
||||
game.setZone(objectId, event.getToZone());
|
||||
game.fireEvent(event);
|
||||
return true;
|
||||
|
@ -373,6 +376,7 @@ public abstract class CardImpl<T extends CardImpl<T>> extends MageObjectImpl<T>
|
|||
logger.warn("Couldn't find card in fromZone, card=" + getName() + ", fromZone=" + fromZone);
|
||||
}
|
||||
}
|
||||
updateZoneChangeCounter();
|
||||
PermanentCard permanent = new PermanentCard(this, controllerId);
|
||||
game.getBattlefield().addPermanent(permanent);
|
||||
game.setZone(objectId, Zone.BATTLEFIELD);
|
||||
|
@ -420,7 +424,17 @@ public abstract class CardImpl<T extends CardImpl<T>> extends MageObjectImpl<T>
|
|||
return this.nightCard;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFlipCard() {
|
||||
return flipCard;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZoneChangeCounter() {
|
||||
return zoneChangeCounter;
|
||||
}
|
||||
|
||||
private void updateZoneChangeCounter() {
|
||||
zoneChangeCounter++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -436,7 +436,12 @@ public class Spell<T extends Spell<T>> implements StackObject, Card {
|
|||
throw new UnsupportedOperationException("Unsupported operation");
|
||||
}
|
||||
|
||||
public void setCopiedSpell(boolean isCopied) {
|
||||
@Override
|
||||
public int getZoneChangeCounter() {
|
||||
return card.getZoneChangeCounter();
|
||||
}
|
||||
|
||||
public void setCopiedSpell(boolean isCopied) {
|
||||
this.copiedSpell = isCopied;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ package mage.target;
|
|||
import mage.Constants.Outcome;
|
||||
import mage.Constants.Zone;
|
||||
import mage.abilities.Ability;
|
||||
import mage.cards.Card;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
|
@ -45,7 +46,8 @@ import java.util.*;
|
|||
public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
||||
|
||||
protected Map<UUID, Integer> targets = new LinkedHashMap<UUID, Integer>();
|
||||
|
||||
protected Map<UUID, Integer> zoneChangeCounters = new HashMap<UUID, Integer>();
|
||||
|
||||
protected String targetName;
|
||||
protected Zone zone;
|
||||
protected int maxNumberOfTargets;
|
||||
|
@ -73,6 +75,7 @@ public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
|||
this.required = target.required;
|
||||
this.chosen = target.chosen;
|
||||
this.targets.putAll(target.targets);
|
||||
this.zoneChangeCounters.putAll(target.zoneChangeCounters);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -152,6 +155,7 @@ public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
|||
@Override
|
||||
public void clearChosen() {
|
||||
targets.clear();
|
||||
zoneChangeCounters.clear();
|
||||
chosen = false;
|
||||
}
|
||||
|
||||
|
@ -160,14 +164,17 @@ public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
|||
if (maxNumberOfTargets == 0 || targets.size() < maxNumberOfTargets) {
|
||||
if (!targets.containsKey(id)) {
|
||||
targets.put(id, 0);
|
||||
rememberZoneChangeCounter(id, game);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(UUID id) {
|
||||
if (targets.containsKey(id))
|
||||
if (targets.containsKey(id)) {
|
||||
targets.remove(id);
|
||||
zoneChangeCounters.remove(id);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -183,6 +190,7 @@ public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
|||
if (source != null) {
|
||||
if (!game.replaceEvent(GameEvent.getEvent(EventType.TARGET, id, source.getId(), source.getControllerId()))) {
|
||||
targets.put(id, 0);
|
||||
rememberZoneChangeCounter(id, game);
|
||||
chosen = targets.size() >= minNumberOfTargets;
|
||||
if (!skipEvent)
|
||||
game.fireEvent(GameEvent.getEvent(EventType.TARGETED, id, source.getId(), source.getControllerId()));
|
||||
|
@ -195,6 +203,13 @@ public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
|||
}
|
||||
}
|
||||
|
||||
private void rememberZoneChangeCounter(UUID id, Game game) {
|
||||
Card card = game.getCard(id);
|
||||
if (card != null) {
|
||||
zoneChangeCounters.put(id, card.getZoneChangeCounter());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTarget(UUID id, int amount, Ability source, Game game) {
|
||||
addTarget(id, amount, source, game, false);
|
||||
|
@ -208,6 +223,7 @@ public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
|||
if (source != null) {
|
||||
if (!game.replaceEvent(GameEvent.getEvent(EventType.TARGET, id, source.getId(), source.getControllerId()))) {
|
||||
targets.put(id, amount);
|
||||
rememberZoneChangeCounter(id, game);
|
||||
chosen = targets.size() >= minNumberOfTargets;
|
||||
if (!skipEvent)
|
||||
game.fireEvent(GameEvent.getEvent(EventType.TARGETED, id, source.getId(), source.getControllerId()));
|
||||
|
@ -215,6 +231,7 @@ public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
|||
}
|
||||
else {
|
||||
targets.put(id, amount);
|
||||
rememberZoneChangeCounter(id, game);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -248,6 +265,12 @@ public abstract class TargetImpl<T extends TargetImpl<T>> implements Target {
|
|||
public boolean isLegal(Ability source, Game game) {
|
||||
//20101001 - 608.2b
|
||||
for (UUID targetId: targets.keySet()) {
|
||||
Card card = game.getCard(targetId);
|
||||
if (card != null) {
|
||||
if (zoneChangeCounters.containsKey(targetId) && zoneChangeCounters.get(targetId) != card.getZoneChangeCounter()) {
|
||||
continue; // it's not legal so continue to have a look at other targeted cards
|
||||
}
|
||||
}
|
||||
if (game.replaceEvent(GameEvent.getEvent(EventType.TARGET, targetId, source.getId(), source.getControllerId())))
|
||||
continue;
|
||||
if (canTarget(targetId, source, game))
|
||||
|
|
Loading…
Add table
Reference in a new issue