From ca2584f598c37aab3f61755a60e29121eb6db8e7 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sat, 19 Oct 2013 00:49:33 +0000 Subject: [PATCH] - C13: Added Sudden Demise, Tempt with Vengeance, Terra Ravager, Toxic Deluge, Widespread Panic and Witch Hunt --- res/cardsfolder/p/psychogenic_probe.txt | 2 +- .../java/forge/card/ability/ai/ChangeZoneAi.java | 4 ++-- .../java/forge/card/ability/ai/ControlGainAi.java | 7 ++++++- src/main/java/forge/card/ability/ai/TokenAi.java | 9 +++++++++ .../card/ability/effects/ChangeZoneAllEffect.java | 2 +- .../forge/card/ability/effects/ChangeZoneEffect.java | 8 ++++---- .../forge/card/ability/effects/CounterEffect.java | 2 +- .../forge/card/ability/effects/DigUntilEffect.java | 2 +- .../ability/effects/RearrangeTopOfLibraryEffect.java | 7 ++++--- .../card/ability/effects/RestartGameEffect.java | 2 +- .../forge/card/ability/effects/ShuffleEffect.java | 2 +- .../java/forge/card/ability/effects/TokenEffect.java | 8 ++++++++ .../java/forge/card/cardfactory/CardFactoryUtil.java | 2 +- .../java/forge/card/trigger/TriggerShuffled.java | 12 +++++++++++- src/main/java/forge/game/GameAction.java | 4 ++-- src/main/java/forge/game/GameNew.java | 2 +- src/main/java/forge/game/player/Player.java | 3 ++- 17 files changed, 56 insertions(+), 22 deletions(-) diff --git a/res/cardsfolder/p/psychogenic_probe.txt b/res/cardsfolder/p/psychogenic_probe.txt index 0ae5e1ccbe0..7cce2bcb66f 100644 --- a/res/cardsfolder/p/psychogenic_probe.txt +++ b/res/cardsfolder/p/psychogenic_probe.txt @@ -1,7 +1,7 @@ Name:Psychogenic Probe ManaCost:2 Types:Artifact -T:Mode$ Shuffled | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a spell or ability causes a player to shuffle his or her library, CARDNAME deals 2 damage to him or her. +T:Mode$ Shuffled | ValidPlayer$ Player | ShuffleFromEffect$ True | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a spell or ability causes a player to shuffle his or her library, CARDNAME deals 2 damage to him or her. SVar:TrigDamage:AB$ DealDamage | Cost$ 0 | Defined$ TriggeredPlayer | NumDmg$ 2 SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/psychogenic_probe.jpg diff --git a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java index c9f92673494..50661fdb2da 100644 --- a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java +++ b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java @@ -1306,7 +1306,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } if (origin.contains(ZoneType.Library) && !defined && !"False".equals(sa.getParam("Shuffle")) && shuffleMandatory) { - player.shuffle(); + player.shuffle(sa); } for (final Card c : fetched) { @@ -1407,7 +1407,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } if ("True".equals(sa.getParam("Shuffle"))) { - player.shuffle(); + player.shuffle(sa); } if (((!ZoneType.Battlefield.equals(destination) && !"Card".equals(type) && !defined) diff --git a/src/main/java/forge/card/ability/ai/ControlGainAi.java b/src/main/java/forge/card/ability/ai/ControlGainAi.java index 58d305b7926..f4cc0ceb61e 100644 --- a/src/main/java/forge/card/ability/ai/ControlGainAi.java +++ b/src/main/java/forge/card/ability/ai/ControlGainAi.java @@ -35,6 +35,7 @@ import forge.game.combat.CombatUtil; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.util.Aggregates; //AB:GainControl|ValidTgts$Creature|TgtPrompt$Select target legendary creature|LoseControl$Untap,LoseControl|SpellDescription$Gain control of target xxxxxxx @@ -89,7 +90,11 @@ public class ControlGainAi extends SpellAbilityAi { if (!opp.canBeTargetedBy(sa)) { return false; } - sa.getTargets().add(opp); + if (tgt.isRandomTarget()) { + sa.getTargets().add(Aggregates.random(tgt.getAllCandidates(sa, false))); + } else { + sa.getTargets().add(opp); + } } } diff --git a/src/main/java/forge/card/ability/ai/TokenAi.java b/src/main/java/forge/card/ability/ai/TokenAi.java index 35f0a467a4b..bf9f08067a5 100644 --- a/src/main/java/forge/card/ability/ai/TokenAi.java +++ b/src/main/java/forge/card/ability/ai/TokenAi.java @@ -15,6 +15,7 @@ import forge.game.ai.ComputerUtilMana; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; import forge.game.zone.ZoneType; import forge.util.MyRandom; @@ -223,5 +224,13 @@ public class TokenAi extends SpellAbilityAi { return true; } + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#confirmAction(forge.game.player.Player, forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String) + */ + @Override + public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { + // TODO: AILogic + return true; + } } diff --git a/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java b/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java index 9bd3f0f87b9..4d67f78bd7c 100644 --- a/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java +++ b/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java @@ -136,7 +136,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { if (sa.hasParam("Shuffle")) { for (Player p : game.getPlayers()) { if (Iterables.any(cards, CardPredicates.isOwner(p))) { - p.shuffle(); + p.shuffle(sa); } } } diff --git a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java index 07a4ff71d4d..9bf92c3660d 100644 --- a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java +++ b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java @@ -438,7 +438,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // for things like Gaea's Blessing if (sa.hasParam("Shuffle") && "True".equals(sa.getParam("Shuffle"))) { - tgtC.getOwner().shuffle(); + tgtC.getOwner().shuffle(sa); } } else { if (destination.equals(ZoneType.Battlefield)) { @@ -779,7 +779,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // do not shuffle the library once we have placed a fetched // card on top. if (origin.contains(ZoneType.Library) && (i < 1) && !"False".equals(sa.getParam("Shuffle"))) { - player.shuffle(); + player.shuffle(sa); } movedCard = game.getAction().moveToLibrary(c, libraryPos); } else if (destination.equals(ZoneType.Battlefield)) { @@ -929,7 +929,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if ((origin.contains(ZoneType.Library) && !destination.equals(ZoneType.Library) && !defined && shuffleMandatory) || (sa.hasParam("Shuffle") && "True".equals(sa.getParam("Shuffle")))) { - player.shuffle(); + player.shuffle(sa); } } @@ -969,7 +969,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } else if (srcSA.getParam("Destination").equals("Library")) { game.getAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); if (srcSA.hasParam("Shuffle")) { - tgtSA.getSourceCard().getOwner().shuffle(); + tgtSA.getSourceCard().getOwner().shuffle(srcSA); } } else { throw new IllegalArgumentException("AbilityFactory_ChangeZone: Invalid Destination argument for card " diff --git a/src/main/java/forge/card/ability/effects/CounterEffect.java b/src/main/java/forge/card/ability/effects/CounterEffect.java index 1818d8c9450..24641d7f697 100644 --- a/src/main/java/forge/card/ability/effects/CounterEffect.java +++ b/src/main/java/forge/card/ability/effects/CounterEffect.java @@ -189,7 +189,7 @@ public class CounterEffect extends SpellAbilityEffect { game.getAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); } else if (destination.equals("ShuffleIntoLibrary")) { game.getAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); - tgtSA.getSourceCard().getController().shuffle(); + tgtSA.getSourceCard().getController().shuffle(srcSA); } else { throw new IllegalArgumentException("AbilityFactory_CounterMagic: Invalid Destination argument for card " + srcSA.getSourceCard().getName()); diff --git a/src/main/java/forge/card/ability/effects/DigUntilEffect.java b/src/main/java/forge/card/ability/effects/DigUntilEffect.java index 419d348c135..5bd57a7dfdb 100644 --- a/src/main/java/forge/card/ability/effects/DigUntilEffect.java +++ b/src/main/java/forge/card/ability/effects/DigUntilEffect.java @@ -216,7 +216,7 @@ public class DigUntilEffect extends SpellAbilityEffect { } if (shuffle) { - p.shuffle(); + p.shuffle(sa); } } // end foreach player } diff --git a/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java b/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java index 33d6f13d58f..e823610c699 100644 --- a/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java +++ b/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java @@ -82,7 +82,7 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect { for (final Player p : getTargetPlayers(sa)) { if ((tgt == null) || p.canBeTargetedBy(sa)) { - rearrangeTopOfLibrary(host, p, numCards, shuffle); + rearrangeTopOfLibrary(host, p, numCards, shuffle, sa); } } } @@ -101,7 +101,8 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect { * @param mayshuffle * a boolean. */ - private void rearrangeTopOfLibrary(final Card src, final Player player, final int numCards, final boolean mayshuffle) { + private void rearrangeTopOfLibrary(final Card src, final Player player, final int numCards, + final boolean mayshuffle, final SpellAbility sa) { final PlayerZone lib = player.getZone(ZoneType.Library); int maxCards = lib.size(); // If library is smaller than N, only show that many cards @@ -122,7 +123,7 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect { } if (mayshuffle) { if (GuiDialog.confirm(src, "Do you want to shuffle the library?")) { - player.shuffle(); + player.shuffle(sa); } } } diff --git a/src/main/java/forge/card/ability/effects/RestartGameEffect.java b/src/main/java/forge/card/ability/effects/RestartGameEffect.java index 9d0a1a290e4..cefdc381818 100644 --- a/src/main/java/forge/card/ability/effects/RestartGameEffect.java +++ b/src/main/java/forge/card/ability/effects/RestartGameEffect.java @@ -83,7 +83,7 @@ public class RestartGameEffect extends SpellAbilityEffect { action.moveToLibrary(c, 0); } - player.shuffle(); + player.shuffle(null); } trigHandler.clearSuppression(TriggerType.ChangesZone); diff --git a/src/main/java/forge/card/ability/effects/ShuffleEffect.java b/src/main/java/forge/card/ability/effects/ShuffleEffect.java index 08672350706..095cd33530d 100644 --- a/src/main/java/forge/card/ability/effects/ShuffleEffect.java +++ b/src/main/java/forge/card/ability/effects/ShuffleEffect.java @@ -22,7 +22,7 @@ public class ShuffleEffect extends SpellAbilityEffect { if ((tgt == null) || p.canBeTargetedBy(sa)) { boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, "Have " + p + " shuffle?"); if (mustShuffle) - p.shuffle(); + p.shuffle(sa); } } } diff --git a/src/main/java/forge/card/ability/effects/TokenEffect.java b/src/main/java/forge/card/ability/effects/TokenEffect.java index ff2e24762c6..a77200fa4ea 100644 --- a/src/main/java/forge/card/ability/effects/TokenEffect.java +++ b/src/main/java/forge/card/ability/effects/TokenEffect.java @@ -55,6 +55,7 @@ public class TokenEffect extends SpellAbilityEffect { private String tokenName; private String[] tokenKeywords; private String[] tokenHiddenKeywords; + private boolean optional; private void readParameters(final SpellAbility mapParams) { String image; @@ -114,6 +115,7 @@ public class TokenEffect extends SpellAbilityEffect { } else { this.tokenOwner = "You"; } + this.optional = mapParams.hasParam("Optional"); } @Override @@ -205,6 +207,9 @@ public class TokenEffect extends SpellAbilityEffect { final boolean remember = sa.hasParam("RememberTokens"); final boolean imprint = sa.hasParam("ImprintTokens"); for (final Player controller : AbilityUtils.getDefinedPlayers(host, this.tokenOwner, sa)) { + if (optional && !controller.getController().confirmAction(sa, null, "Do you want to make tokens?")) { + continue; + } for (int i = 0; i < finalAmount; i++) { final List tokens = CardFactory.makeToken(substitutedName, imageName, controller, cost, substitutedTypes, finalPower, finalToughness, this.tokenKeywords); @@ -314,6 +319,9 @@ public class TokenEffect extends SpellAbilityEffect { } } } + if (sa.hasParam("RememberController")) { + host.addRemembered(controller); + } } } } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index f8411f67705..654e14ee64e 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -365,7 +365,7 @@ public class CardFactoryUtil { sourceCard.getGame().getAction().moveToHand(c1); } - sourceCard.getController().shuffle(); + sourceCard.getController().shuffle(this); } } final SpellAbility transmute = new AbilityTransmute(sourceCard, abCost, null); diff --git a/src/main/java/forge/card/trigger/TriggerShuffled.java b/src/main/java/forge/card/trigger/TriggerShuffled.java index 3e3003f741e..97750335ade 100644 --- a/src/main/java/forge/card/trigger/TriggerShuffled.java +++ b/src/main/java/forge/card/trigger/TriggerShuffled.java @@ -55,7 +55,17 @@ public class TriggerShuffled extends Trigger { return false; } } - + if (this.mapParams.containsKey("ShuffleFromEffect")) { + if (null == runParams2.get("Source")) { + return false; + } + } + if (this.mapParams.containsKey("ShuffleBySelfControlled")) { + SpellAbility source = (SpellAbility) runParams2.get("Source"); + if (!source.getActivatingPlayer().equals(runParams2.get("Player"))) { + return false; + } + } return true; } diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 4d214b78bc8..c718a3375d3 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -1552,7 +1552,7 @@ public class GameAction { for (final Card c : toMulligan) { moveToLibrary(c); } - p.shuffle(); + p.shuffle(null); p.drawCards(handSize[i] - mulliganDelta); } else { List toExile = Lists.newArrayList(toMulligan); @@ -1580,7 +1580,7 @@ public class GameAction { for(Card c : cc) { moveToLibrary(c); } - p.shuffle(); + p.shuffle(null); } } diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index 8a50fa17f0d..e408c4910ea 100644 --- a/src/main/java/forge/game/GameNew.java +++ b/src/main/java/forge/game/GameNew.java @@ -292,7 +292,7 @@ public class GameNew { final Iterable c1 = GameNew.smoothComputerManaCurve(player.getCardsIn(ZoneType.Library)); player.getZone(ZoneType.Library).setCards(c1); } else { - player.shuffle(); + player.shuffle(null); } if(isFirstGame && player.getLobbyPlayer().getType() == PlayerType.COMPUTER) { diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 6f3be01d3d6..e5622cc91fc 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -1763,7 +1763,7 @@ public class Player extends GameEntity implements Comparable { * shuffle. *

*/ - public final void shuffle() { + public final void shuffle(final SpellAbility sa) { final List list = Lists.newArrayList(this.getCardsIn(ZoneType.Library)); if (list.size() <= 1) { @@ -1796,6 +1796,7 @@ public class Player extends GameEntity implements Comparable { // Run triggers final HashMap runParams = new HashMap(); runParams.put("Player", this); + runParams.put("Source", sa); game.getTriggerHandler().runTrigger(TriggerType.Shuffled, runParams, false); // Play the shuffle sound