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() }