mirror of
https://github.com/correl/mage.git
synced 2024-11-15 19:19:33 +00:00
* Detain effect - Fixed that detained permanents stayed detained until end of game if the controller of the detain effect left/lost the game before detain effect did end (fixes #304).
This commit is contained in:
parent
c14302df8a
commit
d7b7f6c234
5 changed files with 36 additions and 10 deletions
|
@ -114,7 +114,7 @@ class DetainAllRestrictionEffect extends RestrictionEffect<DetainAllRestrictionE
|
|||
public boolean isInactive(Ability source, Game game) {
|
||||
if (game.getPhase().getStep().getType() == PhaseStep.UNTAP && game.getStep().getStepPart() == Step.StepPart.PRE)
|
||||
{
|
||||
if (game.getActivePlayerId().equals(source.getControllerId())) {
|
||||
if (game.getActivePlayerId().equals(source.getControllerId()) || game.getPlayer(source.getControllerId()).hasReachedNextTurnAfterLeaving()) {
|
||||
for(FixedTarget fixedTarget :this.detainedObjects) {
|
||||
Permanent permanent = game.getPermanent(fixedTarget.getFirst(game, source));
|
||||
if (permanent != null) {
|
||||
|
@ -158,4 +158,4 @@ class DetainAllRestrictionEffect extends RestrictionEffect<DetainAllRestrictionE
|
|||
return new DetainAllRestrictionEffect(this);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
package mage.abilities.effects.common;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
|
@ -152,7 +151,7 @@ class DetainRestrictionEffect extends RestrictionEffect<DetainRestrictionEffect>
|
|||
public boolean isInactive(Ability source, Game game) {
|
||||
if (game.getPhase().getStep().getType() == PhaseStep.UNTAP && game.getStep().getStepPart() == Step.StepPart.PRE)
|
||||
{
|
||||
if (game.getActivePlayerId().equals(source.getControllerId())) {
|
||||
if (game.getActivePlayerId().equals(source.getControllerId()) || game.getPlayer(source.getControllerId()).hasReachedNextTurnAfterLeaving()) {
|
||||
for(UUID targetId :this.getTargetPointer().getTargets(game, source)) {
|
||||
Permanent permanent = game.getPermanent(targetId);
|
||||
if (permanent != null) {
|
||||
|
|
|
@ -315,4 +315,7 @@ public interface Player extends MageItem, Copyable<Player> {
|
|||
* @return
|
||||
*/
|
||||
int getPriorityTimeLeft();
|
||||
|
||||
void setReachedNextTurnAfterLeaving(boolean reachedNextTurnAfterLeaving);
|
||||
boolean hasReachedNextTurnAfterLeaving();
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
package mage.players;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
|
@ -110,7 +109,6 @@ import mage.target.common.TargetCardInLibrary;
|
|||
import mage.target.common.TargetDiscard;
|
||||
import mage.watchers.common.BloodthirstWatcher;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.omg.CORBA.DynAnyPackage.Invalid;
|
||||
|
||||
|
||||
public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Serializable {
|
||||
|
@ -170,6 +168,11 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
|||
protected List<UUID> attachments = new ArrayList<UUID>();
|
||||
|
||||
protected boolean topCardRevealed = false;
|
||||
|
||||
// 800.4i When a player leaves the game, any continuous effects with durations that last until that player's next turn
|
||||
// or until a specific point in that turn will last until that turn would have begun.
|
||||
// They neither expire immediately nor last indefinitely.
|
||||
protected boolean reachedNextTurnAfterLeaving = false;
|
||||
|
||||
protected UserData userData;
|
||||
|
||||
|
@ -241,6 +244,7 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
|||
this.passedTurn = player.passedTurn;
|
||||
this.passedAllTurns = player.passedAllTurns;
|
||||
this.priorityTimeLeft = player.getPriorityTimeLeft();
|
||||
this.reachedNextTurnAfterLeaving = player.reachedNextTurnAfterLeaving;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -288,6 +292,7 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
|||
this.turnController = player.getTurnControlledBy();
|
||||
this.passed = player.isPassed();
|
||||
this.priorityTimeLeft = player.getPriorityTimeLeft();
|
||||
this.reachedNextTurnAfterLeaving = player.hasReachedNextTurnAfterLeaving();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -326,7 +331,9 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
|||
this.canLoseLife = true;
|
||||
this.topCardRevealed = false;
|
||||
this.setLife(game.getLife(), game);
|
||||
this.setReachedNextTurnAfterLeaving(false);
|
||||
game.getState().getWatchers().add(new BloodthirstWatcher(playerId));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -2004,4 +2011,14 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
|||
return quit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setReachedNextTurnAfterLeaving(boolean reachedNextTurnAfterLeaving) {
|
||||
this.reachedNextTurnAfterLeaving = reachedNextTurnAfterLeaving;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasReachedNextTurnAfterLeaving() {
|
||||
return reachedNextTurnAfterLeaving;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -49,10 +49,15 @@ public class PlayerList extends CircularList<UUID> {
|
|||
UUID start = this.get();
|
||||
while (true) {
|
||||
player = game.getPlayer(super.getNext());
|
||||
if (!player.hasLeft() && !player.hasLost())
|
||||
if (!player.hasLeft() && !player.hasLost()) {
|
||||
if (!player.hasReachedNextTurnAfterLeaving()) {
|
||||
player.setReachedNextTurnAfterLeaving(true);
|
||||
}
|
||||
break;
|
||||
if (player.getId().equals(start))
|
||||
}
|
||||
if (player.getId().equals(start)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return player;
|
||||
}
|
||||
|
@ -62,10 +67,12 @@ public class PlayerList extends CircularList<UUID> {
|
|||
UUID start = this.get();
|
||||
while (true) {
|
||||
player = game.getPlayer(super.getPrevious());
|
||||
if (!player.hasLeft() && !player.hasLost())
|
||||
if (!player.hasLeft() && !player.hasLost()) {
|
||||
break;
|
||||
if (player.getId().equals(start))
|
||||
}
|
||||
if (player.getId().equals(start)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return player;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue