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