diff --git a/.gitattributes b/.gitattributes index c57709dd325..0b5ce20dc64 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9338,6 +9338,7 @@ forge-gui/res/cardsfolder/p/pretenders_claim.txt svneol=native#text/plain forge-gui/res/cardsfolder/p/prey_upon.txt -text forge-gui/res/cardsfolder/p/preys_vengeance.txt -text forge-gui/res/cardsfolder/p/preyseizer_dragon.txt -text +forge-gui/res/cardsfolder/p/price_of_glory.txt -text forge-gui/res/cardsfolder/p/price_of_knowledge.txt -text forge-gui/res/cardsfolder/p/price_of_progress.txt svneol=native#text/plain forge-gui/res/cardsfolder/p/prickly_boggart.txt svneol=native#text/plain diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 0ee4ca8b736..ed41d87b253 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -176,6 +176,17 @@ public class AiController { return spellAbilities; } + private boolean checkCurseEffects() { + for (final Card c : game.getCardsIn(ZoneType.Battlefield)) { + for (Trigger t : c.getTriggers()) { + if (t.getMapParams().containsKey("CurseNonActive") + && !player.equals(game.getPhaseHandler().getPlayerTurn())) { + return true; + } + } + } + return false; + } public boolean checkETBEffects(final Card card, final SpellAbility sa, final ApiType api) { boolean rightapi = false; @@ -631,6 +642,9 @@ public class AiController { card.setSVar("PayX", Integer.toString(xPay)); } } + if (checkCurseEffects()) { + return AiPlayDecision.CurseEffects; + } if( sa instanceof SpellPermanent ) { ManaCost mana = sa.getPayCosts().getTotalMana(); if (mana.countX() > 0) { diff --git a/forge-ai/src/main/java/forge/ai/AiPlayDecision.java b/forge-ai/src/main/java/forge/ai/AiPlayDecision.java index e92a85433a1..e13fcba4546 100644 --- a/forge-ai/src/main/java/forge/ai/AiPlayDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiPlayDecision.java @@ -16,5 +16,6 @@ public enum AiPlayDecision { WouldDestroyOtherPlaneswalker, WouldBecomeZeroToughnessCreature, WouldDestroyWorldEnchantment, - BadEtbEffects; + BadEtbEffects, + CurseEffects; } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index e502d6e65fb..d74c90b4f1c 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2327,6 +2327,10 @@ public class Player extends GameEntity implements Comparable { if (this.equals(sourceController) || !this.isOpponentOf(sourceController)) { return false; } + } else if (property.equals("NonActive")) { + if (this.equals(game.getPhaseHandler().getPlayerTurn())) { + return false; + } } else if (property.equals("OpponentToActive")) { final Player active = game.getPhaseHandler().getPlayerTurn(); if (this.equals(active) || !this.isOpponentOf(active)) { diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 6aa2d799933..0405b55e951 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -162,6 +162,12 @@ public abstract class Trigger extends TriggerReplacementBase { } } + if (this.mapParams.containsKey("NotPlayerTurn")) { + if (phaseHandler.isPlayerTurn(this.getHostCard().getController())) { + return false; + } + } + if (this.mapParams.containsKey("OpponentTurn")) { if (!phaseHandler.getPlayerTurn().isOpponentOf(this.getHostCard().getController())) { return false; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 74b597becca..5842af0b621 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -77,6 +77,15 @@ public class TriggerTapsForMana extends Trigger { } } + if (this.mapParams.containsKey("Activator")) { + final SpellAbility sa = (SpellAbility) runParams2.get("AbilityMana"); + if (sa == null) return false; + final Player activator = sa.getActivatingPlayer(); + if (!activator.isValid(this.mapParams.get("Activator").split(","), this.getHostCard().getController(), this.getHostCard())) { + return false; + } + } + if (this.mapParams.containsKey("Produced")) { Object prod = runParams2.get("Produced"); if (prod == null || !(prod instanceof String)) { diff --git a/forge-gui/res/cardsfolder/l/lighthouse_chronologist.txt b/forge-gui/res/cardsfolder/l/lighthouse_chronologist.txt index 7443703049f..ae95bf117f3 100644 --- a/forge-gui/res/cardsfolder/l/lighthouse_chronologist.txt +++ b/forge-gui/res/cardsfolder/l/lighthouse_chronologist.txt @@ -8,7 +8,7 @@ S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | Check S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 5 | AddTrigger$ TriggerExtraTurn | CheckSVar$ Y | SVarCompare$ EQ1 | Description$ LEVEL 7+ 3/5 At the beginning of each end step, if it's not your turn, take an extra turn after this one. SVar:X:Count$Valid Card.Self+counters_GE4_LEVEL+counters_LE6_LEVEL SVar:Y:Count$Valid Card.Self+counters_GE7_LEVEL -SVar:TriggerExtraTurn:Mode$ Phase | Phase$ End of Turn | OpponentTurn$ True | Execute$ TrigExtraTurn | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each end step, if it's not your turn, take an extra turn after this one. +SVar:TriggerExtraTurn:Mode$ Phase | Phase$ End of Turn | NotPlayerTurn$ True | Execute$ TrigExtraTurn | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each end step, if it's not your turn, take an extra turn after this one. SVar:TrigExtraTurn:DB$ AddTurn | NumTurns$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/lighthouse_chronologist.jpg Oracle:Level up {U} ({U}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 4-6\n2/4\nLEVEL 7+\n3/5\nAt the beginning of each end step, if it's not your turn, take an extra turn after this one. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/price_of_glory.txt b/forge-gui/res/cardsfolder/p/price_of_glory.txt new file mode 100644 index 00000000000..dfb48b1f51e --- /dev/null +++ b/forge-gui/res/cardsfolder/p/price_of_glory.txt @@ -0,0 +1,8 @@ +Name:Price of Glory +ManaCost:2 R +Types:Enchantment +T:Mode$ TapsForMana | ValidCard$ Land | Execute$ TrigDestroy | TriggerZones$ Battlefield | Activator$ Player.NonActive | CurseNonActive$ True | TriggerDescription$ Whenever a player taps a land for mana, if it's not that player's turn, destroy that land. +SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredCard +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/price_of_glory.jpg +Oracle:Whenever a player taps a land for mana, if it's not that player's turn, destroy that land.