diff --git a/res/cardsfolder/p/panopticon.txt b/res/cardsfolder/p/panopticon.txt index d57f16ff28b..ae4fe00c1c1 100644 --- a/res/cardsfolder/p/panopticon.txt +++ b/res/cardsfolder/p/panopticon.txt @@ -2,7 +2,7 @@ Name:Panopticon ManaCost:no cost Types:Plane Mirrodin T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ PanopticonDraw | TriggerDescription$ When you planeswalk to CARDNAME, draw a card. -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | Execute$ PanopticonDraw | TriggerDescription$ At the beginning of your draw step, draw an additional card. +T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | Execute$ PanopticonDraw | TriggerZones$ Command | TriggerDescription$ At the beginning of your draw step, draw an additional card. T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ PanopticonDraw | TriggerDescription$ Whenever you roll Chaos, draw a card. SVar:PanopticonDraw:AB$ Draw | Cost$ 0 | Defined$ You | NumCards$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/panopticon.jpg diff --git a/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java b/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java index 1bd06c23260..e1f8283e417 100644 --- a/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java +++ b/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java @@ -1,5 +1,9 @@ package forge.card.ability.effects; +import java.util.List; + +import forge.Card; +import forge.card.ability.AbilityUtils; import forge.card.ability.SpellAbilityEffect; import forge.card.spellability.SpellAbility; import forge.game.GameState; @@ -24,7 +28,15 @@ public class PlaneswalkEffect extends SpellAbilityEffect { { p.leaveCurrentPlane(); } - sa.getActivatingPlayer().planeswalk(); + if(sa.hasParam("Defined")) { + List destinations = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa); + sa.getActivatingPlayer().planeswalkTo(destinations); + } + else + { + sa.getActivatingPlayer().planeswalk(); + } + } } diff --git a/src/main/java/forge/card/trigger/TriggerPlaneswalkedFrom.java b/src/main/java/forge/card/trigger/TriggerPlaneswalkedFrom.java index d0f2b079d15..c654b4f86d6 100644 --- a/src/main/java/forge/card/trigger/TriggerPlaneswalkedFrom.java +++ b/src/main/java/forge/card/trigger/TriggerPlaneswalkedFrom.java @@ -1,5 +1,6 @@ package forge.card.trigger; +import java.util.ArrayList; import java.util.Map; import forge.Card; @@ -33,11 +34,14 @@ public class TriggerPlaneswalkedFrom extends Trigger { @Override public boolean performTest(Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - final Card moved = (Card) runParams2.get("Card"); - if (!moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { - return false; + for(Card moved : (ArrayList)runParams2.get("Card")) + { + if (moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard())) { + return true; + } } + return false; } return true; diff --git a/src/main/java/forge/card/trigger/TriggerPlaneswalkedTo.java b/src/main/java/forge/card/trigger/TriggerPlaneswalkedTo.java index c75e4da80c9..83cd56ab5d6 100644 --- a/src/main/java/forge/card/trigger/TriggerPlaneswalkedTo.java +++ b/src/main/java/forge/card/trigger/TriggerPlaneswalkedTo.java @@ -1,5 +1,6 @@ package forge.card.trigger; +import java.util.ArrayList; import java.util.Map; import forge.Card; @@ -33,11 +34,14 @@ public class TriggerPlaneswalkedTo extends Trigger { @Override public boolean performTest(Map runParams2) { if (this.mapParams.containsKey("ValidCard")) { - final Card moved = (Card) runParams2.get("Card"); - if (!moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { - return false; + for(Card moved : (ArrayList)runParams2.get("Card")) + { + if (moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), + this.getHostCard())) { + return true; + } } + return false; } return true; diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 1a5cfeaf298..d6584abdcad 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -61,8 +61,7 @@ public class GameState { private final List allPlayers; private final List ingamePlayers = new ArrayList(); - private final List communalPlanarDeck = new ArrayList(); - private Card activePlane = null; + private List activePlanes = null; public final Cleanup cleanup; public final EndOfTurn endOfTurn; @@ -561,15 +560,15 @@ public class GameState { /** * @return the activePlane */ - public Card getActivePlane() { - return activePlane; + public List getActivePlanes() { + return activePlanes; } /** * @param activePlane0 the activePlane to set */ - public void setActivePlane(Card activePlane0) { - this.activePlane = activePlane0; + public void setActivePlanes(List activePlane0) { + this.activePlanes = activePlane0; } public void archenemy904_10() { diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index ac3b6a79c6b..0ab37e4eabb 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -552,11 +552,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { SDisplayUtil.showTab(nextField); if (game.getType() == GameType.Planechase) { - Card p = game.getActivePlane(); - if (p != null) { - p.setController(next, 0); - game.getAction().controllerChangeZoneCorrection(p); - } + for(Card p :game.getActivePlanes()) + { + if (p != null) { + p.setController(next, 0); + game.getAction().controllerChangeZoneCorrection(p); + } + } } return next; diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 42f6980ded8..f59f81befd2 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -159,7 +159,7 @@ public class Player extends GameEntity implements Comparable { /** The zones. */ private final Map zones = new EnumMap(ZoneType.class); - private Card currentPlane = null; + private List currentPlanes = new ArrayList(); private PlayerStatistics stats = new PlayerStatistics(); protected PlayerController controller; @@ -2948,38 +2948,51 @@ public class Player extends GameEntity implements Comparable { * Then runs triggers. */ public void planeswalk() + { + planeswalkTo(Arrays.asList(getZone(ZoneType.PlanarDeck).get(0))); + } + + /** + * Puts the planes in the argument and puts them face up in the command zone. + * Then runs triggers. + * + * @param destinations The planes to planeswalk to. + */ + public void planeswalkTo(final List destinations) { - - currentPlane = getZone(ZoneType.PlanarDeck).get(0); + currentPlanes = destinations; - getZone(ZoneType.PlanarDeck).remove(currentPlane); - getZone(ZoneType.Command).add(currentPlane); + for(Card c : currentPlanes) { + getZone(ZoneType.PlanarDeck).remove(c); + getZone(ZoneType.Command).add(c); + } - game.setActivePlane(currentPlane); + game.setActivePlanes(currentPlanes); //Run PlaneswalkedTo triggers here. HashMap runParams = new HashMap(); - runParams.put("Card", currentPlane); + runParams.put("Card", currentPlanes); game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedTo, runParams,false); } /** * - * Puts my currently active plane, if any, at the bottom of my planar deck. + * Puts my currently active planes, if any, at the bottom of my planar deck. */ public void leaveCurrentPlane() { - if(currentPlane != null) + if(!currentPlanes.isEmpty()) { //Run PlaneswalkedFrom triggers here. HashMap runParams = new HashMap(); - runParams.put("Card", currentPlane); + runParams.put("Card", currentPlanes); game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedFrom, runParams,false); - Zone com = game.getZoneOf(currentPlane); - com.remove(currentPlane); - currentPlane.clearControllers(); - getZone(ZoneType.PlanarDeck).add(currentPlane); - currentPlane = null; + for(Card c : currentPlanes) { + getZone(ZoneType.Command).remove(c); + c.clearControllers(); + getZone(ZoneType.PlanarDeck).add(c); + } + currentPlanes.clear(); } } @@ -3000,13 +3013,13 @@ public class Player extends GameEntity implements Comparable { } else { - currentPlane = firstPlane; + currentPlanes.add(firstPlane); getZone(ZoneType.Command).add(firstPlane); break; } } - game.setActivePlane(currentPlane); + game.setActivePlanes(currentPlanes); } /**