diff --git a/.gitattributes b/.gitattributes index 7fb33383d2f..4bf51dfff66 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9243,6 +9243,7 @@ forge-gui/res/cardsfolder/n/nivix_aerie_of_the_firemind.txt -text forge-gui/res/cardsfolder/n/nivix_cyclops.txt -text forge-gui/res/cardsfolder/n/nivix_guildmage.txt -text forge-gui/res/cardsfolder/n/nivmagus_elemental.txt -text +forge-gui/res/cardsfolder/n/nix.txt -text forge-gui/res/cardsfolder/n/no_dachi.txt svneol=native#text/plain forge-gui/res/cardsfolder/n/no_mercy.txt svneol=native#text/plain forge-gui/res/cardsfolder/n/no_quarter.txt -text diff --git a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java index 5e33c49bc30..bde063c0dd9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java @@ -39,7 +39,8 @@ public class CounterAi extends SpellAbilityAi { if (tgt != null) { final SpellAbility topSA = game.getStack().peekAbility(); - if (!CardFactoryUtil.isCounterableBy(topSA.getHostCard(), sa) || topSA.getActivatingPlayer() == ai) { + if (!CardFactoryUtil.isCounterableBy(topSA.getHostCard(), sa) || topSA.getActivatingPlayer() == ai + || ai.getAllies().contains(topSA.getActivatingPlayer())) { // might as well check for player's friendliness return false; } @@ -48,6 +49,10 @@ public class CounterAi extends SpellAbilityAi { return false; } + if (sa.hasParam("CounterNoManaSpell") && topSA.getTotalManaSpent() == 0) { + return false; + } + sa.resetTargets(); if (sa.canTargetSpellAbility(topSA)) { sa.getTargets().add(topSA); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java index a9c86ef9517..6b04f6b8cc4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java @@ -104,6 +104,10 @@ public class CounterEffect extends SpellAbilityEffect { continue; } + if (sa.hasParam("CounterNoManaSpell") && tgtSA.getTotalManaSpent() != 0) { + continue; + } + if (sa.hasParam("RememberCounteredCMC")) { sa.getHostCard().addRemembered((Integer) tgtSACard.getCMC()); } diff --git a/forge-game/src/main/java/forge/game/phase/Phase.java b/forge-game/src/main/java/forge/game/phase/Phase.java index 37aa4f3340d..47cbd8641fa 100644 --- a/forge-game/src/main/java/forge/game/phase/Phase.java +++ b/forge-game/src/main/java/forge/game/phase/Phase.java @@ -138,7 +138,7 @@ public class Phase implements java.io.Serializable { } } - public final void RegisterUntilEndCommand(final Player p) { + public final void registerUntilEndCommand(final Player p) { if (this.registerMap.containsKey(p)) { this.untilEndMap.put(p, registerMap.get(p)); registerMap.remove(p); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 98736c8cad3..7989323a6a6 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -425,7 +425,7 @@ public class PhaseHandler implements java.io.Serializable { c.getDamageHistory().setNotBeenBlockedSinceLastUpkeepOf(this.getPlayerTurn()); } game.getUpkeep().executeUntilEndOfPhase(this.getPlayerTurn()); - game.getUpkeep().RegisterUntilEndCommand(this.getPlayerTurn()); + game.getUpkeep().registerUntilEndCommand(this.getPlayerTurn()); break; case COMBAT_END: diff --git a/forge-gui/res/cardsfolder/h/halfdane.txt b/forge-gui/res/cardsfolder/h/halfdane.txt index 565c5382fbd..3e0866f1da3 100644 --- a/forge-gui/res/cardsfolder/h/halfdane.txt +++ b/forge-gui/res/cardsfolder/h/halfdane.txt @@ -3,7 +3,7 @@ ManaCost:1 W U B Types:Legendary Creature Shapeshifter PT:3/3 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ At the beginning of your upkeep, CARDNAME's power and toughness become equal to the power and toughness of target creature other than CARDNAME until the end of your next upkeep. -SVar:TrigAnimate:AB$ Pump | Cost$ 0 | ValidTgts$ Creature.Other | TgtPrompt$ Select target another creature | AILogic$ HighestPower | SubAbility$ DBAnimate +SVar:TrigAnimate:AB$ Pump | Cost$ 0 | ValidTgts$ Creature.Other | TgtPrompt$ Select target creature other than this creature | AILogic$ HighestPower | SubAbility$ DBAnimate SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ X | Toughness$ Y | References$ X,Y | UntilTheEndOfYourNextUpkeep$ True SVar:X:Targeted$CardPower SVar:Y:Targeted$CardToughness diff --git a/forge-gui/res/cardsfolder/n/nix.txt b/forge-gui/res/cardsfolder/n/nix.txt new file mode 100644 index 00000000000..bb95c505dd1 --- /dev/null +++ b/forge-gui/res/cardsfolder/n/nix.txt @@ -0,0 +1,7 @@ +Name:Nix +ManaCost:U +Types:Instant +A:SP$ Counter | Cost$ U | TargetType$ Spell | ValidTgts$ Card | CounterNoManaSpell$ True | SpellDescription$ Counter target spell if no mana was spent to cast it. +SVar:RemRandomDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/nix.jpg +Oracle:Counter target spell if no mana was spent to cast it.