diff --git a/res/cardsfolder/l/land_equilibrium.txt b/res/cardsfolder/l/land_equilibrium.txt
index 38a7a7c4073..be2bc1c410b 100644
--- a/res/cardsfolder/l/land_equilibrium.txt
+++ b/res/cardsfolder/l/land_equilibrium.txt
@@ -2,6 +2,7 @@ Name:Land Equilibrium
ManaCost:2 U U
Types:Enchantment
Text:If an opponent who controls at least as many lands as you do would put a land onto the battlefield, that player instead puts that land onto the battlefield then sacrifices a land.
+SVar:SacLand:DB$ Sacrifice | SacValid$ Land | Defined$ Opponent | SpellDescription$ Opponent sacrifices a land
SVar:Picture:http://www.wizards.com/global/images/magic/general/land_equilibrium.jpg
Oracle:If an opponent who controls at least as many lands as you do would put a land onto the battlefield, that player instead puts that land onto the battlefield then sacrifices a land.
SetInfo:LEG Rare
\ No newline at end of file
diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java
index fdbec57c938..e9cdcd46446 100644
--- a/src/main/java/forge/game/ai/AiController.java
+++ b/src/main/java/forge/game/ai/AiController.java
@@ -48,6 +48,7 @@ import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Expressions;
+import forge.util.MyRandom;
/**
*
@@ -706,5 +707,18 @@ public class AiController {
}
return true;
}
+
+ /**
+ * AI decides if he wants to use dredge ability and which one if many available
+ * @param dredgers - contains at least single element
+ * @return
+ */
+ public Card chooseCardToDredge(List dredgers) {
+ // use dredge if there are more than one of them in your graveyard
+ if (dredgers.size() > 1 || MyRandom.getRandom().nextBoolean()) {
+ return Aggregates.random(dredgers);
+ }
+ return null;
+ }
}
diff --git a/src/main/java/forge/game/player/AIPlayer.java b/src/main/java/forge/game/player/AIPlayer.java
index 4853430e809..e0df75f88f4 100644
--- a/src/main/java/forge/game/player/AIPlayer.java
+++ b/src/main/java/forge/game/player/AIPlayer.java
@@ -18,8 +18,6 @@
package forge.game.player;
import java.util.List;
-import java.util.Random;
-
import forge.Card;
import forge.CardLists;
@@ -27,10 +25,8 @@ import forge.CardPredicates;
import forge.card.spellability.SpellAbility;
import forge.game.GameState;
import forge.game.ai.AiController;
-import forge.game.ai.ComputerUtilCard;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
-import forge.util.MyRandom;
/**
*
@@ -63,43 +59,6 @@ public class AIPlayer extends Player {
- // //////////////////////////////
- // /
- // / replaces Singletons.getModel().getGameAction().draw* methods
- // /
- // //////////////////////////////
-
- /**
- *
- * dredge.
- *
- *
- * @return a boolean.
- */
- @Override
- public final boolean dredge() {
- final List dredgers = this.getDredge();
- final Random random = MyRandom.getRandom();
-
- // use dredge if there are more than one of them in your graveyard
- if ((dredgers.size() > 1) || ((dredgers.size() == 1) && random.nextBoolean())) {
- CardLists.shuffle(dredgers);
- final Card c = dredgers.get(0);
- // rule 702.49a
- if (this.getDredgeNumber(c) <= this.getCardsIn(ZoneType.Library).size()) {
- // dredge library, put card in hand
- game.getAction().moveToHand(c);
- // put dredge number in graveyard
- for (int i = 0; i < this.getDredgeNumber(c); i++) {
- final Card c2 = this.getCardsIn(ZoneType.Library).get(0);
- game.getAction().moveToGraveyard(c2);
- }
- return true;
- }
- }
- return false;
- }
-
// //////////////////////////////
// /
// / replaces Singletons.getModel().getGameAction().discard* methods
@@ -133,16 +92,6 @@ public class AIPlayer extends Player {
// /////////////////////////
- /** {@inheritDoc} */
- @Override
- public final void sacrificePermanent(final String prompt, final List choices) {
- if (choices.size() > 0) {
- // TODO - this could probably use better AI
- final Card c = ComputerUtilCard.getWorstPermanentAI(choices, false, false, false, false);
- game.getAction().sacrificeDestroy(c);
- }
- }
-
/* (non-Javadoc)
* @see forge.game.player.Player#getType()
*/
diff --git a/src/main/java/forge/game/player/HumanPlayer.java b/src/main/java/forge/game/player/HumanPlayer.java
index a752e6ceebb..951df64fefd 100644
--- a/src/main/java/forge/game/player/HumanPlayer.java
+++ b/src/main/java/forge/game/player/HumanPlayer.java
@@ -17,17 +17,10 @@
*/
package forge.game.player;
-import java.util.List;
-
-import forge.Card;
-
import forge.Singletons;
import forge.card.spellability.SpellAbility;
-import forge.control.input.Input;
import forge.game.GameState;
import forge.game.zone.ZoneType;
-import forge.gui.GuiChoose;
-import forge.gui.GuiDialog;
/**
*
@@ -40,52 +33,11 @@ import forge.gui.GuiDialog;
public class HumanPlayer extends Player {
private PlayerControllerHuman controller;
- /**
- *
- * Constructor for HumanPlayer.
- *
- *
- * @param myName
- * a {@link java.lang.String} object.
- */
public HumanPlayer(final LobbyPlayer player, GameState game) {
super(player, game);
-
controller = new PlayerControllerHuman(game, this);
}
- /**
- *
- * dredge.
- *
- *
- * @return a boolean.
- */
- @Override
- public final boolean dredge() {
- boolean dredged = false;
- final boolean wantDredge = GuiDialog.confirm(null, "Do you want to dredge?");
- if (wantDredge) {
- final Card c = GuiChoose.one("Select card to dredge", this.getDredge());
- // rule 702.49a
- if (this.getDredgeNumber(c) <= getZone(ZoneType.Library).size()) {
-
- // might have to make this more sophisticated
- // dredge library, put card in hand
- game.getAction().moveToHand(c);
-
- for (int i = 0; i < this.getDredgeNumber(c); i++) {
- final Card c2 = getZone(ZoneType.Library).get(0);
- game.getAction().moveToGraveyard(c2);
- }
- dredged = true;
- } else {
- dredged = false;
- }
- }
- return dredged;
- }
-
/** {@inheritDoc} */
@Override
public final void discard(final int num, final SpellAbility sa) {
@@ -100,26 +52,12 @@ public class HumanPlayer extends Player {
}
}
- /** {@inheritDoc} */
- @Override
- public final void sacrificePermanent(final String prompt, final List choices) {
- final Input in = PlayerUtil.inputSacrificePermanent(choices, prompt);
- Singletons.getModel().getMatch().getInput().setInput(in);
- }
-
- /* (non-Javadoc)
- * @see forge.game.player.Player#getType()
- */
@Override
public PlayerType getType() {
return PlayerType.HUMAN;
}
-
- /* (non-Javadoc)
- * @see forge.game.player.Player#getController()
- */
- @Override
public PlayerController getController() {
return controller;
}
+
} // end HumanPlayer class
diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java
index 9ee074e8d5d..db24f27d9ef 100644
--- a/src/main/java/forge/game/player/Player.java
+++ b/src/main/java/forge/game/player/Player.java
@@ -1234,16 +1234,6 @@ public abstract class Player extends GameEntity implements Comparable {
return this.drawCards(1);
}
-
- /**
- *
- * dredge.
- *
- *
- * @return a boolean.
- */
- public abstract boolean dredge();
-
/**
*
* TODO Write javadoc for this method.
@@ -1288,8 +1278,17 @@ public abstract class Player extends GameEntity implements Comparable {
for (int i = 0; i < n; i++) {
// TODO: multiple replacements need to be selected by the controller
- if (!this.getDredge().isEmpty()) {
- if (this.dredge()) {
+ List dredgers = this.getDredge();
+ if (!dredgers.isEmpty()) {
+ Card toDredge = getController().chooseCardToDredge(dredgers);
+ int dredgeNumber = toDredge == null ? Integer.MAX_VALUE : getDredgeNumber(toDredge);
+ if ( dredgeNumber <= getZone(ZoneType.Library).size()) {
+ game.getAction().moveToHand(toDredge);
+
+ for (int iD = 0; iD < dredgeNumber; iD++) {
+ final Card c2 = getZone(ZoneType.Library).get(0);
+ game.getAction().moveToGraveyard(c2);
+ }
continue;
}
}
@@ -2141,19 +2140,6 @@ public abstract class Player extends GameEntity implements Comparable {
this.attackersDeclaredThisTurn = 0;
}
- // //////////////////////////////
- /**
- *
- * sacrificePermanent.
- *
- *
- * @param prompt
- * a {@link java.lang.String} object.
- * @param choices
- * a {@link forge.CardList} object.
- */
- public abstract void sacrificePermanent(String prompt, List choices);
-
// Game win/loss
/**
diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java
index 9b42de5ff33..083cebe6e3b 100644
--- a/src/main/java/forge/game/player/PlayerController.java
+++ b/src/main/java/forge/game/player/PlayerController.java
@@ -111,4 +111,5 @@ public abstract class PlayerController {
/** p = target player, validCards - possible discards, min cards to discard */
public abstract List chooseCardsToDiscardFrom(Player p, SpellAbility sa, List validCards, int min);
+ public abstract Card chooseCardToDredge(List dredgers);
}
diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java
index 95757f81f43..44a99c9d880 100644
--- a/src/main/java/forge/game/player/PlayerControllerAi.java
+++ b/src/main/java/forge/game/player/PlayerControllerAi.java
@@ -255,9 +255,6 @@ public class PlayerControllerAi extends PlayerController {
return true; // AI does not know what will happen next (another clash or that would become his topdeck)
}
- /* (non-Javadoc)
- * @see forge.game.player.PlayerController#chooseCardsToDiscardFrom(forge.game.player.Player, java.util.List, int)
- */
@Override
public List chooseCardsToDiscardFrom(Player p, SpellAbility sa, List validCards, int min) {
boolean isTargetFriendly = !p.isOpponentOf(getPlayer());
@@ -267,4 +264,9 @@ public class PlayerControllerAi extends PlayerController {
: ComputerUtil.getCardsToDiscardFromOpponent(player, p, sa, validCards, min);
}
+ @Override
+ public Card chooseCardToDredge(List dredgers) {
+ return brains.chooseCardToDredge(dredgers);
+ }
+
}
diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java
index c3d29124351..be2b14e5737 100644
--- a/src/main/java/forge/game/player/PlayerControllerHuman.java
+++ b/src/main/java/forge/game/player/PlayerControllerHuman.java
@@ -326,4 +326,15 @@ public class PlayerControllerHuman extends PlayerController {
public List chooseCardsToDiscardFrom(Player p, SpellAbility sa, List valid, int minDiscard) {
return GuiChoose.order("Choose cards to Discard", "Discarded", minDiscard == 0 ? -1 : minDiscard, valid, null, null);
}
+
+ /* (non-Javadoc)
+ * @see forge.game.player.PlayerController#chooseCardToDredge(java.util.List)
+ */
+ @Override
+ public Card chooseCardToDredge(List dredgers) {
+ if (GuiDialog.confirm(null, "Do you want to dredge?", false)) {
+ return GuiChoose.oneOrNone("Select card to dredge", dredgers);
+ }
+ return null;
+ }
}
diff --git a/src/main/java/forge/game/player/PlayerType.java b/src/main/java/forge/game/player/PlayerType.java
index cd5498463aa..c91db8ec738 100644
--- a/src/main/java/forge/game/player/PlayerType.java
+++ b/src/main/java/forge/game/player/PlayerType.java
@@ -23,10 +23,7 @@ package forge.game.player;
* @author jendave
*/
public enum PlayerType {
-
- /** The HUMAN. */
HUMAN,
-
- /** The COMPUTER. */
- COMPUTER
+ COMPUTER,
+ REMOTE
}
diff --git a/src/main/java/forge/game/player/PlayerUtil.java b/src/main/java/forge/game/player/PlayerUtil.java
index 39d852e5785..c4919af1248 100644
--- a/src/main/java/forge/game/player/PlayerUtil.java
+++ b/src/main/java/forge/game/player/PlayerUtil.java
@@ -154,22 +154,6 @@ public final class PlayerUtil {
return target;
} // input_discard()
- /**
- *
- * input_sacrificePermanent.
- *
- *
- * @param choices
- * a {@link forge.CardList} object.
- * @param message
- * a {@link java.lang.String} object.
- * @return a {@link forge.control.input.Input} object.
- * @since 1.0.15
- */
- public static Input inputSacrificePermanent(final List choices, final String message) {
- return PlayerUtil.inputSacrificePermanentsFromList(1, choices, message);
- } // input_sacrifice()
-
/**
*
* input_sacrificePermanents.
diff --git a/src/main/java/forge/game/zone/PlayerZoneBattlefield.java b/src/main/java/forge/game/zone/PlayerZoneBattlefield.java
index b863a8bd342..dda09757746 100644
--- a/src/main/java/forge/game/zone/PlayerZoneBattlefield.java
+++ b/src/main/java/forge/game/zone/PlayerZoneBattlefield.java
@@ -30,6 +30,7 @@ import forge.CardPredicates;
import forge.CardPredicates.Presets;
import forge.Command;
import forge.Singletons;
+import forge.card.ability.AbilityFactory;
import forge.card.mana.ManaCost;
import forge.card.spellability.Ability;
import forge.card.spellability.SpellAbility;
@@ -143,30 +144,17 @@ public class PlayerZoneBattlefield extends PlayerZone {
}
- final List les = c.getOwner().getOpponent().getCardsIn(ZoneType.Battlefield, "Land Equilibrium");
- final Card lesLand = c;
- if (les.size() > 0) {
- final Card source = les.get(0);
- final SpellAbility ability = new Ability(source, ManaCost.NO_COST) {
- @Override
- public void resolve() {
- final List lands = lesLand.getOwner().getLandsInPlay();
- lesLand.getOwner().sacrificePermanent(source.getName() + " - Select a land to sacrifice",
- lands);
+
+ for( Player opp : c.getOwner().getOpponents())
+ for( Card le : opp.getCardsIn(ZoneType.Battlefield, "Land Equilibrium") ) {
+ final List pLands = c.getOwner().getLandsInPlay();
+ final List oLands = opp.getLandsInPlay();
+
+ if (oLands.size() <= (pLands.size() - 1)) {
+ SpellAbility abSac = AbilityFactory.getAbility(le.getSVar("SacLand"), le);
+ Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(abSac);
}
- };
- final StringBuilder sb = new StringBuilder();
- sb.append(source).append(" - ");
- sb.append(tisLand.getController()).append(" sacrifices a land.");
- ability.setStackDescription(sb.toString());
- final List pLands = lesLand.getOwner().getLandsInPlay();
- final List oLands = lesLand.getOwner().getOpponent().getLandsInPlay();
- // (pLands - 1) because this land is in play, and the
- // ability is before it is in play
- if (oLands.size() <= (pLands.size() - 1)) {
- Singletons.getModel().getGame().getStack().addSimultaneousStackEntry(ability);
}
- }
} // isLand()
}