From 1544a860445585870200db930118db5aaa1cb52c Mon Sep 17 00:00:00 2001 From: Hellfish Date: Mon, 13 May 2013 21:36:26 +0000 Subject: [PATCH] *Tweaked DigUntil to allow digging through Planar & Scheme decks. *Many tweaks to planechase handling. *Made MagicStack.peekAbility synchronized. *Fixed(?) ConcurrentModificationException. in VStack. *Added phenomenon: Spatial Merging. --- .gitattributes | 1 + res/cardsfolder/s/spatial_merging.txt | 8 +++++++ .../card/ability/effects/DigUntilEffect.java | 5 +++-- .../ability/effects/PlaneswalkEffect.java | 2 -- src/main/java/forge/game/GameAction.java | 2 ++ src/main/java/forge/game/player/Player.java | 21 ++++++++++++++----- src/main/java/forge/game/zone/MagicStack.java | 4 +++- src/main/java/forge/gui/GuiDisplayUtil.java | 6 ++++++ .../java/forge/gui/match/views/VStack.java | 3 ++- 9 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 res/cardsfolder/s/spatial_merging.txt diff --git a/.gitattributes b/.gitattributes index 8abadf8d9cd..97839350e36 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10212,6 +10212,7 @@ res/cardsfolder/s/sparksmith.txt svneol=native#text/plain res/cardsfolder/s/sparkspitter.txt svneol=native#text/plain res/cardsfolder/s/sparring_collar.txt -text res/cardsfolder/s/sparring_golem.txt svneol=native#text/plain +res/cardsfolder/s/spatial_merging.txt -text res/cardsfolder/s/spawn_of_rix_maadi.txt -text res/cardsfolder/s/spawning_breath.txt svneol=native#text/plain res/cardsfolder/s/spawning_pit.txt svneol=native#text/plain diff --git a/res/cardsfolder/s/spatial_merging.txt b/res/cardsfolder/s/spatial_merging.txt new file mode 100644 index 00000000000..f052b723eeb --- /dev/null +++ b/res/cardsfolder/s/spatial_merging.txt @@ -0,0 +1,8 @@ +Name:Spatial Merging +ManaCost:no cost +Types:Phenomenon +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal two plane cards. Simultaneously planeswalk to both of them. Put all other cards revealed this way on the bottom of your planar deck in any order. +SVar:TrigDig:DB$ DigUntil | Amount$ 2 | Valid$ Plane | DigZone$ PlanarDeck | RememberFound$ True | FoundDestination$ PlanarDeck | RevealedDestination$ PlanarDeck | RevealedLibraryPosition$ -1 | SubAbility$ DBPWTo +SVar:DBPWTo:DB$ Planeswalk | Defined$ Remembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SetInfo:PC2 Common \ No newline at end of file diff --git a/src/main/java/forge/card/ability/effects/DigUntilEffect.java b/src/main/java/forge/card/ability/effects/DigUntilEffect.java index fae2b14a05c..b0836a92257 100644 --- a/src/main/java/forge/card/ability/effects/DigUntilEffect.java +++ b/src/main/java/forge/card/ability/effects/DigUntilEffect.java @@ -97,13 +97,14 @@ public class DigUntilEffect extends SpellAbilityEffect { final int foundLibPos = AbilityUtils.calculateAmount(host, sa.getParam("FoundLibraryPosition"), sa); final ZoneType revealedDest = ZoneType.smartValueOf(sa.getParam("RevealedDestination")); final int revealedLibPos = AbilityUtils.calculateAmount(host, sa.getParam("RevealedLibraryPosition"), sa); - + final ZoneType digSite = sa.hasParam("DigZone") ? ZoneType.smartValueOf(sa.getParam("DigZone")) : ZoneType.Library; + for (final Player p : getTargetPlayers(sa)) { if ((tgt == null) || p.canBeTargetedBy(sa)) { final List found = new ArrayList(); final List revealed = new ArrayList(); - final PlayerZone library = p.getZone(ZoneType.Library); + final PlayerZone library = p.getZone(digSite); final int maxToDig = maxRevealed != null ? maxRevealed : library.size(); diff --git a/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java b/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java index e1f8283e417..f8be7507c95 100644 --- a/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java +++ b/src/main/java/forge/card/ability/effects/PlaneswalkEffect.java @@ -22,8 +22,6 @@ public class PlaneswalkEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { GameState game = sa.getActivatingPlayer().getGame(); - System.out.println("AF Planeswalking!"); - for(Player p : game.getPlayers()) { p.leaveCurrentPlane(); diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index d498adbc4dc..245f2d73c7c 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -736,6 +736,8 @@ public class GameAction { case Exile: return this.exile(c); case Ante: return this.moveTo(c.getOwner().getZone(ZoneType.Ante), c); case Command: return this.moveTo(c.getOwner().getZone(ZoneType.Command), c); + case PlanarDeck: return this.moveTo(c.getOwner().getZone(ZoneType.PlanarDeck), c); + case SchemeDeck: return this.moveTo(c.getOwner().getZone(ZoneType.SchemeDeck), c); default: return this.moveToStack(c); } } diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 2fba2637423..9d078583d95 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -2954,7 +2954,7 @@ public class Player extends GameEntity implements Comparable { * Then runs triggers. */ public void planeswalk() - { + { planeswalkTo(Arrays.asList(getZone(ZoneType.PlanarDeck).get(0))); } @@ -2966,12 +2966,18 @@ public class Player extends GameEntity implements Comparable { */ public void planeswalkTo(final List destinations) { - currentPlanes = destinations; + System.out.println(this.getName() + ": planeswalk to " + destinations.toString()); + currentPlanes.addAll(destinations); for(Card c : currentPlanes) { getZone(ZoneType.PlanarDeck).remove(c); getZone(ZoneType.Command).add(c); - } + } + + //DBG + //System.out.println("CurrentPlanes: " + currentPlanes); + //System.out.println("ActivePlanes: " + game.getActivePlanes()); + //System.out.println("CommandPlanes: " + getZone(ZoneType.Command).getCards()); game.setActivePlanes(currentPlanes); //Run PlaneswalkedTo triggers here. @@ -2985,7 +2991,7 @@ public class Player extends GameEntity implements Comparable { * Puts my currently active planes, if any, at the bottom of my planar deck. */ public void leaveCurrentPlane() - { + { if(!currentPlanes.isEmpty()) { //Run PlaneswalkedFrom triggers here. @@ -2994,12 +3000,17 @@ public class Player extends GameEntity implements Comparable { game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedFrom, runParams,false); for(Card c : currentPlanes) { - getZone(ZoneType.Command).remove(c); + game.getZoneOf(c).remove(c); c.clearControllers(); getZone(ZoneType.PlanarDeck).add(c); } currentPlanes.clear(); } + + //DBG + //System.out.println("CurrentPlanes: " + currentPlanes); + //System.out.println("ActivePlanes: " + game.getActivePlanes()); + //System.out.println("CommandPlanes: " + getZone(ZoneType.Command).getCards()); } /** diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 53a958201dc..0caebdf95e5 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -869,7 +869,9 @@ public class MagicStack extends MyObservable implements Iterable { stackTARs.clear(); boolean isFirst = true; - for (final SpellAbilityStackInstance spell : stack) { + for (int i = 0;i