From 2b14baabb59dee45741324a8567d7dfb288b5cd2 Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 10 Mar 2014 13:32:03 +0000 Subject: [PATCH] - Added Evangelize --- .gitattributes | 1 + .../main/java/forge/ai/ComputerUtilCost.java | 4 +++- .../java/forge/ai/PlayerControllerAi.java | 1 + .../java/forge/ai/ability/ControlGainAi.java | 21 ++++++++++++++++++- .../forge/ai/ability/CopyPermanentAi.java | 1 + .../main/java/forge/ai/ability/DestroyAi.java | 1 + .../ability/effects/ChooseNumberEffect.java | 2 -- .../forge/game/spellability/SpellAbility.java | 21 +++++++++++++++++++ forge-gui/res/cardsfolder/e/evangelize.txt | 7 +++++++ .../gui/player/HumanPlaySpellAbility.java | 2 +- .../util/PlayerControllerForTests.java | 1 + 11 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/cardsfolder/e/evangelize.txt diff --git a/.gitattributes b/.gitattributes index 96601e1e65b..6040bda284b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4249,6 +4249,7 @@ forge-gui/res/cardsfolder/e/eureka.txt -text forge-gui/res/cardsfolder/e/evacuation.txt svneol=native#text/plain forge-gui/res/cardsfolder/e/evanescent_intellect.txt -text forge-gui/res/cardsfolder/e/evangel_of_heliod.txt -text +forge-gui/res/cardsfolder/e/evangelize.txt -text forge-gui/res/cardsfolder/e/evaporate.txt svneol=native#text/plain forge-gui/res/cardsfolder/e/evasive_action.txt svneol=native#text/plain forge-gui/res/cardsfolder/e/even_the_odds.txt svneol=native#text/plain diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 994fefb9501..ce3741fc69f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -312,7 +312,9 @@ public class ComputerUtilCost { * @return a boolean. */ public static boolean canPayCost(final SpellAbility sa, final Player player) { - sa.setActivatingPlayer(player); // complaints on NPE had came before this line was added. + if (sa.getActivatingPlayer() == null) { + sa.setActivatingPlayer(player); // complaints on NPE had came before this line was added. + } // Check for stuff like Nether Void int extraManaNeeded = 0; diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 07560f91806..fe09953265c 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -631,6 +631,7 @@ public class PlayerControllerAi extends PlayerController { private void prepareSingleSa(final Card host, final SpellAbility sa, boolean isMandatory){ if (sa.hasParam("TargetingPlayer")) { Player targetingPlayer = AbilityUtils.getDefinedPlayers(host, sa.getParam("TargetingPlayer"), sa).get(0); + sa.setTargetingPlayer(targetingPlayer); targetingPlayer.getController().chooseTargetsFor(sa); } else { brains.doTrigger(sa, isMandatory); diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index 38cc884bd5c..44e762941d5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -18,6 +18,8 @@ package forge.ai.ability; import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.Game; @@ -32,7 +34,9 @@ import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -85,6 +89,11 @@ public class ControlGainAi extends SpellAbilityAi { return true; } else { sa.resetTargets(); + if (sa.hasParam("TargetingPlayer")) { + Player targetingPlayer = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("TargetingPlayer"), sa).get(0); + sa.setTargetingPlayer(targetingPlayer); + return targetingPlayer.getController().chooseTargetsFor(sa); + } if (tgt.canOnlyTgtOpponent()) { if (!opp.canBeTargetedBy(sa)) { return false; @@ -189,7 +198,7 @@ public class ControlGainAi extends SpellAbilityAi { return true; } } else { - if(!this.canPlayAI(ai, sa) && mandatory) { + if(sa.hasParam("TargetingPlayer") || (!this.canPlayAI(ai, sa) && mandatory)) { List list = CardLists.getTargetableCards(ai.getCardsIn(ZoneType.Battlefield), sa); if (list.isEmpty()) { return false; @@ -225,4 +234,14 @@ public class ControlGainAi extends SpellAbilityAi { return true; } // pumpDrawbackAI() + + @Override + protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Collection options) { + final List cards = new ArrayList(); + for (Player p : options) { + cards.addAll(p.getCreaturesInPlay()); + } + Card chosen = ComputerUtilCard.getBestCreatureAI(cards); + return chosen != null ? chosen.getController() : Iterables.getFirst(options, null); + } } diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index 15a4fa6ef28..d5fc0e02546 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -53,6 +53,7 @@ public class CopyPermanentAi extends SpellAbilityAi { sa.resetTargets(); if (sa.hasParam("TargetingPlayer")) { Player targetingPlayer = AbilityUtils.getDefinedPlayers(source, sa.getParam("TargetingPlayer"), sa).get(0); + sa.setTargetingPlayer(targetingPlayer); return targetingPlayer.getController().chooseTargetsFor(sa); } List list = aiPlayer.getGame().getCardsIn(ZoneType.Battlefield); diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index 2b4e0722261..466d7d09b25 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -70,6 +70,7 @@ public class DestroyAi extends SpellAbilityAi { sa.resetTargets(); if (sa.hasParam("TargetingPlayer")) { Player targetingPlayer = AbilityUtils.getDefinedPlayers(source, sa.getParam("TargetingPlayer"), sa).get(0); + sa.setTargetingPlayer(targetingPlayer); return targetingPlayer.getController().chooseTargetsFor(sa); } list = CardLists.getTargetableCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java index 2b793f2763b..ac4bb0a7512 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java @@ -6,8 +6,6 @@ import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; -import org.apache.commons.lang3.StringUtils; - import java.util.List; import java.util.Random; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 20514d6d054..ca9f5cad388 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -65,6 +65,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private String stackDescription = ""; private ManaCost multiKickerManaCost = null; private Player activatingPlayer = null; + private Player targetingPlayer = null; private boolean basicLandAbility; // granted by basic land type @@ -263,6 +264,20 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } } + /** + * @return the targetingPlayer + */ + public Player getTargetingPlayer() { + return targetingPlayer; + } + + /** + * @param targetingPlayer the targetingPlayer to set + */ + public void setTargetingPlayer(Player targetingPlayer) { + this.targetingPlayer = targetingPlayer; + } + /** *

* isSpell. @@ -1031,6 +1046,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } } } + if (hasParam("TargetingPlayerControls") && entity instanceof Card) { + final Card c = (Card) entity; + if (!c.getController().equals(targetingPlayer)) { + return false; + } + } String[] validTgt = tr.getValidTgts(); if (entity instanceof GameEntity && !((GameEntity) entity).isValid(validTgt, this.getActivatingPlayer(), this.getHostCard())) diff --git a/forge-gui/res/cardsfolder/e/evangelize.txt b/forge-gui/res/cardsfolder/e/evangelize.txt new file mode 100644 index 00000000000..c6af5305484 --- /dev/null +++ b/forge-gui/res/cardsfolder/e/evangelize.txt @@ -0,0 +1,7 @@ +Name:Evangelize +ManaCost:4 W +Types:Sorcery +K:Buyback 2 W W +A:SP$ GainControl | Cost$ 4 W | ValidTgts$ Creature | TargetingPlayer$ Player.Opponent | TargetingPlayerControls$ True | SpellDescription$ Gain control of target creature of an opponent's choice he or she controls. +SVar:Picture:http://www.wizards.com/global/images/magic/general/evangelize.jpg +Oracle:Buyback {2}{W}{W} (You may pay an additional {2}{W}{W} as you cast this spell. If you do, put this card into your hand as it resolves.)\nGain control of target creature of an opponent's choice he or she controls. diff --git a/forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java index c8d19f84d50..c9bb110f98c 100644 --- a/forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/gui/player/HumanPlaySpellAbility.java @@ -149,7 +149,7 @@ public class HumanPlaySpellAbility { } else { targetingPlayer = ability.getActivatingPlayer(); } - + currentAbility.setTargetingPlayer(targetingPlayer); if (!targetingPlayer.getController().chooseTargetsFor(currentAbility)) return false; } diff --git a/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index b5e86edfd8e..72f5c22ca4a 100644 --- a/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -491,6 +491,7 @@ public class PlayerControllerForTests extends PlayerController { private void prepareSingleSa(final Card host, final SpellAbility sa, boolean isMandatory){ if (sa.hasParam("TargetingPlayer")) { Player targetingPlayer = AbilityUtils.getDefinedPlayers(host, sa.getParam("TargetingPlayer"), sa).get(0); + sa.setTargetingPlayer(targetingPlayer); targetingPlayer.getController().chooseTargetsFor(sa); } else { // this code is no longer possible!