diff --git a/.gitattributes b/.gitattributes index 052b491ee4e..17c350bde31 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7384,6 +7384,7 @@ res/cardsfolder/o/oonas_blackguard.txt svneol=native#text/plain res/cardsfolder/o/oonas_gatewarden.txt svneol=native#text/plain res/cardsfolder/o/oonas_grace.txt svneol=native#text/plain res/cardsfolder/o/oonas_prowler.txt -text +res/cardsfolder/o/ooze_flux.txt -text res/cardsfolder/o/ooze_garden.txt svneol=native#text/plain res/cardsfolder/o/opal_acrolith.txt svneol=native#text/plain res/cardsfolder/o/opal_archangel.txt svneol=native#text/plain diff --git a/CHANGES.txt b/CHANGES.txt index 25fb17c2bf9..87d5496ce5b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -57,6 +57,11 @@ Taniwha Natural Balance Balancing Act Odds // Ends +Mana Clash +Goblin Assassin +Chain Lightning +Chain of Vapor +Vision Charm New Phenomenons: diff --git a/res/cardsfolder/o/ooze_flux.txt b/res/cardsfolder/o/ooze_flux.txt new file mode 100644 index 00000000000..c0e81cc8043 --- /dev/null +++ b/res/cardsfolder/o/ooze_flux.txt @@ -0,0 +1,9 @@ +Name:Ooze Flux +ManaCost:3 G +Types:Enchantment +A:AB$ Token | Announce$ X | Cost$ XCantBe0 1 G SubCounter | TokenAmount$ 1 | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenImage$ G X X Ooze | TokenColors$ Green | TokenPower$ X | TokenToughness$ X | SpellDescription$ Put a green Saproling creature token onto the battlefield. It has "This creature's power and toughness are each equal to the number of fade counters on CARDNAME." +SVar:X:Count$xPaid +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/ooze_flux.jpg +Oracle:{1}{G}, Remove one or more +1/+1 counters from among creatures you control: Put an X/X green Ooze creature token onto the battlefield, where X is the number of +1/+1 counters removed this way. +SetInfo:GTC Rare \ No newline at end of file diff --git a/res/cardsfolder/s/sabertooth_cobra.txt b/res/cardsfolder/s/sabertooth_cobra.txt index 0093742c39b..2f100f0f64c 100644 --- a/res/cardsfolder/s/sabertooth_cobra.txt +++ b/res/cardsfolder/s/sabertooth_cobra.txt @@ -2,7 +2,7 @@ Name:Sabertooth Cobra ManaCost:2 G Types:Creature Snake PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ PoisonTarget | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, he or she gets a poison counter. That player gets another poison counter at the beginning of his or her next upkeep unless he or she pays 2 before that turn. (A player with ten or more poison counters loses the game.) +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ PoisonTarget | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, he or she gets a poison counter. That player gets another poison counter at the beginning of his or her next upkeep unless he or she pays 2 before that turn. (A player with ten or more poison counters loses the game.) SVar:PoisonTarget:AB$ Poison | Cost$ 0 | Num$ 1 | Defined$ TriggeredTarget | SubAbility$ CobraEffect SVar:CobraEffect:DB$ Effect | Name$ Sabertooth Cobra Effect | EffectOwner$ TriggeredTarget | Duration$ Permanent | Triggers$ PoisonTrig | RememberObjects$ TriggeredTarget | Abilities$ PayUp | SVars$ Bleed,ExileEffect SVar:PoisonTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.IsRemembered | TriggerZones$ Command | Execute$ Bleed | TriggerDescription$ You get another poison counter at the beginning of your next upkeep unless you pay 2 before that turn. diff --git a/res/quest/quest-opponent-icons.txt b/res/quest/quest-opponent-icons.txt index bb8cd3f1e88..5de717037f7 100644 --- a/res/quest/quest-opponent-icons.txt +++ b/res/quest/quest-opponent-icons.txt @@ -124,6 +124,7 @@ http://www.cardforge.org/fpics/questAvatars/Magneto.jpg http://www.cardforge.org/fpics/questAvatars/Magnum.jpg http://www.cardforge.org/fpics/questAvatars/Marge%20Simpson.jpg http://www.cardforge.org/fpics/questAvatars/Milhouse_van_Houten.jpg +http://www.cardforge.org/fpics/questAvatars/Minerva%20McGonagall.jpg http://www.cardforge.org/fpics/questAvatars/Mines%20of%20Kazum%20Durl.jpg http://www.cardforge.org/fpics/questAvatars/Mister%20Fantastic.jpg http://www.cardforge.org/fpics/questAvatars/Morpheus.jpg diff --git a/src/main/java/forge/card/cost/CostPayment.java b/src/main/java/forge/card/cost/CostPayment.java index c601b8cafe6..3de175c6130 100644 --- a/src/main/java/forge/card/cost/CostPayment.java +++ b/src/main/java/forge/card/cost/CostPayment.java @@ -194,6 +194,14 @@ public class CostPayment { this.payCost(); } + /** + * Cancel cost (including CostPart for refunding). + */ + public final void cancelCost(final CostPart part) { + this.setPaidManaPart(part); + this.cancelCost(); + } + /** * Cancel cost. */ diff --git a/src/main/java/forge/card/cost/CostRemoveCounter.java b/src/main/java/forge/card/cost/CostRemoveCounter.java index 66a619eef68..b3ec40afee9 100644 --- a/src/main/java/forge/card/cost/CostRemoveCounter.java +++ b/src/main/java/forge/card/cost/CostRemoveCounter.java @@ -106,7 +106,9 @@ public class CostRemoveCounter extends CostPartWithList { @Override public boolean isReusable() { return true; } - + @Override + public boolean isUndoable() { return true; } + /* * (non-Javadoc) * @@ -145,8 +147,9 @@ public class CostRemoveCounter extends CostPartWithList { */ @Override public final void refund(final Card source) { + int refund = this.getList().size() == 1 ? this.lastPaidAmount : 1; for (final Card c : this.getList()) { - c.addCounter(this.counter, this.lastPaidAmount, false); + c.addCounter(this.counter, refund, false); } } @@ -224,6 +227,16 @@ public class CostRemoveCounter extends CostPartWithList { int maxCounters = 0; if (!this.isTargetingThis()) { + if (c == null) { + final String sVar = ability.getSVar(amount); + // Generalize this + if (sVar.equals("XChoice")) { + c = CostUtil.chooseXValue(source, ability, maxCounters); + } else { + c = AbilityUtils.calculateAmount(source, amount, ability); + } + } + if (this.getZone().equals(ZoneType.Battlefield)) { final Input inp = CostRemoveCounter.removeCounterType(ability, this.getType(), payment, this, c); Singletons.getModel().getMatch().getInput().setInputInterrupt(inp); @@ -341,14 +354,13 @@ public class CostRemoveCounter extends CostPartWithList { final StringBuilder msg = new StringBuilder("Remove "); final int nLeft = nNeeded - this.nRemove; msg.append(nLeft).append(" "); - msg.append(costRemoveCounter.getCounter()).append(" from "); - + msg.append(costRemoveCounter.getCounter().getName()).append(" counters from "); msg.append(costRemoveCounter.getDescriptiveType()); - if (nLeft > 1) { - msg.append("s"); - } this.typeList = CardLists.getValidCards(sa.getActivatingPlayer().getCardsIn(costRemoveCounter.getZone()), type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard()); + + // TODO Tabulate typelist vs nNeeded to see if there are enough counters to remove + CMatchUI.SINGLETON_INSTANCE.showMessage(msg.toString()); ButtonUtil.enableOnlyCancel(); } @@ -377,14 +389,14 @@ public class CostRemoveCounter extends CostPartWithList { public void done() { this.stop(); - costRemoveCounter.addListToHash(sa, "CounterPut"); + costRemoveCounter.addListToHash(sa, "CounterRemove"); payment.paidCost(costRemoveCounter); } public void cancel() { this.stop(); - costRemoveCounter.addListToHash(sa, "CounterPut"); - payment.cancelCost(); + costRemoveCounter.addListToHash(sa, "CounterRemove"); + payment.cancelCost(costRemoveCounter); } }; @@ -464,13 +476,13 @@ public class CostRemoveCounter extends CostPartWithList { public void done() { this.stop(); - costRemoveCounter.addListToHash(sa, "CounterPut"); + costRemoveCounter.addListToHash(sa, "CounterRemove"); payment.paidCost(costRemoveCounter); } public void cancel() { this.stop(); - costRemoveCounter.addListToHash(sa, "CounterPut"); + costRemoveCounter.addListToHash(sa, "CounterRemove"); payment.cancelCost(); } }; diff --git a/src/main/java/forge/card/spellability/SpellAbilityRequirements.java b/src/main/java/forge/card/spellability/SpellAbilityRequirements.java index 118116ab4cc..e39cf4c6371 100644 --- a/src/main/java/forge/card/spellability/SpellAbilityRequirements.java +++ b/src/main/java/forge/card/spellability/SpellAbilityRequirements.java @@ -202,16 +202,7 @@ public class SpellAbilityRequirements { *

*/ public final void finishPaying() { - if (this.isFree || this.payment.isAllPaid()) { - if (this.skipStack) { - AbilityUtils.resolve(this.ability, false); - } else { - this.addAbilityToStack(); - } - - this.select.resetTargets(); - Singletons.getModel().getGame().getAction().checkStateEffects(); - } else if (this.payment.isCanceled()) { + if (this.payment.isCanceled()) { final Card c = this.ability.getSourceCard(); // split cards transform back to full form if mana cost is not paid @@ -234,6 +225,16 @@ public class SpellAbilityRequirements { this.payment.cancelPayment(); Singletons.getModel().getGame().getStack().clearFrozen(); } + else if (this.isFree || this.payment.isAllPaid()) { + if (this.skipStack) { + AbilityUtils.resolve(this.ability, false); + } else { + this.addAbilityToStack(); + } + + this.select.resetTargets(); + Singletons.getModel().getGame().getAction().checkStateEffects(); + } } /**