From f689d44f0170e93244e8fec021e3b64bf66e0918 Mon Sep 17 00:00:00 2001 From: Sol Date: Thu, 8 Aug 2013 02:26:47 +0000 Subject: [PATCH] - Convert skip your next turn cards from giving an extra turn to an opponent (since that's wrong) --- .gitattributes | 1 + res/cardsfolder/c/chronatog.txt | 2 +- res/cardsfolder/c/chronatog_avatar.txt | 2 +- res/cardsfolder/c/chronatog_totem.txt | 2 +- res/cardsfolder/c/chronosavant.txt | 2 +- res/cardsfolder/m/magosi_the_waterveil.txt | 2 +- res/cardsfolder/m/meditate.txt | 2 +- res/cardsfolder/u/unstable_hulk.txt | 2 +- res/cardsfolder/w/waterspout_elemental.txt | 2 +- res/cardsfolder/w/wormfang_manta.txt | 2 +- src/main/java/forge/card/ability/ApiType.java | 1 + .../card/ability/effects/SkipTurnEffect.java | 37 +++++++++++++++++++ .../java/forge/game/phase/PhaseHandler.java | 9 +++++ 13 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 src/main/java/forge/card/ability/effects/SkipTurnEffect.java diff --git a/.gitattributes b/.gitattributes index e32e4d5cf44..8136a48879e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14470,6 +14470,7 @@ src/main/java/forge/card/ability/effects/ScryEffect.java -text src/main/java/forge/card/ability/effects/SetInMotionEffect.java -text src/main/java/forge/card/ability/effects/SetStateEffect.java -text src/main/java/forge/card/ability/effects/ShuffleEffect.java -text +src/main/java/forge/card/ability/effects/SkipTurnEffect.java -text src/main/java/forge/card/ability/effects/StoreSVarEffect.java -text src/main/java/forge/card/ability/effects/TapAllEffect.java -text src/main/java/forge/card/ability/effects/TapEffect.java -text diff --git a/res/cardsfolder/c/chronatog.txt b/res/cardsfolder/c/chronatog.txt index 28ae8a3adfb..ab44243a7e6 100644 --- a/res/cardsfolder/c/chronatog.txt +++ b/res/cardsfolder/c/chronatog.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Atog PT:1/2 A:AB$ Pump | Cost$ 0 | NumAtt$ +3 | NumDef$ +3 | ActivationLimit$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ CARDNAME gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn. -SVar:DBSkipTurn:DB$AddTurn | NumTurns$ 1 | Defined$ Opponent +SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/chronatog.jpg Oracle:{0}: Chronatog gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn. \ No newline at end of file diff --git a/res/cardsfolder/c/chronatog_avatar.txt b/res/cardsfolder/c/chronatog_avatar.txt index 330ec826e84..d7ac09b13ab 100644 --- a/res/cardsfolder/c/chronatog_avatar.txt +++ b/res/cardsfolder/c/chronatog_avatar.txt @@ -4,7 +4,7 @@ Types:Vanguard HandLifeModifier:-1/+1 S:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ Unlimited | Description$ You have no maximum hand size. A:AB$ Draw | ActivationZone$ Command | Cost$ 0 | NumCards$ 3 | Defined$ You | ActivationLimit$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ Draw three cards. You skip your next turn. Activate this ability only once each turn. -SVar:DBSkipTurn:DB$ AddTurn | NumTurns$ 1 | Defined$ Opponent +SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You SVar:RemAIDeck:True SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/chronatog_avatar.jpg Oracle:Hand -1, life +1\nYou have no maximum hand size.\n{0}: Draw three cards. You skip your next turn. Activate this ability only once each turn. \ No newline at end of file diff --git a/res/cardsfolder/c/chronatog_totem.txt b/res/cardsfolder/c/chronatog_totem.txt index b75a546f118..7e7cb045500 100644 --- a/res/cardsfolder/c/chronatog_totem.txt +++ b/res/cardsfolder/c/chronatog_totem.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. A:AB$ Animate | Cost$ 1 U | Defined$ Self | Power$ 1 | Toughness$ 2 | Types$ Creature,Artifact,Atog | Colors$ Blue | SpellDescription$ CARDNAME becomes a 1/2 blue Atog artifact creature until end of turn. A:AB$ Pump | Cost$ 0 | Defined$ Self | NumAtt$ +3 | NumDef$ +3 | IsPresent$ Card.Self+Creature | ActivationLimit$ 1 | SubAbility$ SkipTurn | SpellDescription$ CARDNAME gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn and only if CARDNAME is a creature. -SVar:SkipTurn:DB$AddTurn | NumTurns$ 1 | Defined$ Opponent +SVar:SkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You SVar:Picture:http://www.wizards.com/global/images/magic/general/chronatog_totem.jpg Oracle:{T}: Add {U} to your mana pool.\n{1}{U}: Chronatog Totem becomes a 1/2 blue Atog artifact creature until end of turn.\n{0}: Chronatog Totem gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn and only if Chronatog Totem is a creature. \ No newline at end of file diff --git a/res/cardsfolder/c/chronosavant.txt b/res/cardsfolder/c/chronosavant.txt index eedb5c932e5..6cad14def81 100644 --- a/res/cardsfolder/c/chronosavant.txt +++ b/res/cardsfolder/c/chronosavant.txt @@ -3,6 +3,6 @@ ManaCost:5 W Types:Creature Giant PT:5/5 A:AB$ ChangeZone | Cost$ 1 W | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | ActivationZone$ Graveyard | SubAbility$ SkipTurn | SpellDescription$ Return CARDNAME from your graveyard to the battlefield tapped. You skip your next turn. -SVar:SkipTurn:DB$AddTurn | Defined$ Opponent | NumTurns$ 1 +SVar:SkipTurn:DB$ SkipTurn | Defined$ You | NumTurns$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/chronosavant.jpg Oracle:{1}{W}: Return Chronosavant from your graveyard to the battlefield tapped. You skip your next turn. \ No newline at end of file diff --git a/res/cardsfolder/m/magosi_the_waterveil.txt b/res/cardsfolder/m/magosi_the_waterveil.txt index 691225a7940..28ae1eec17d 100644 --- a/res/cardsfolder/m/magosi_the_waterveil.txt +++ b/res/cardsfolder/m/magosi_the_waterveil.txt @@ -5,7 +5,7 @@ K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. A:AB$ PutCounter | Cost$ U T | Defined$ Self | CounterType$ EON | CounterNum$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ Put an eon counter on CARDNAME. Skip your next turn. A:AB$ AddTurn | Cost$ T SubCounter<1/EON> | NumTurns$ 1 | Defined$ You | SubAbility$ DBBounce | SpellDescription$ Take an extra turn after this one. -SVar:DBSkipTurn:DB$AddTurn | NumTurns$ 1 | Defined$ Opponent +SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You SVar:DBBounce:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/magosi_the_waterveil.jpg diff --git a/res/cardsfolder/m/meditate.txt b/res/cardsfolder/m/meditate.txt index cec82f610a5..5843ee7306a 100644 --- a/res/cardsfolder/m/meditate.txt +++ b/res/cardsfolder/m/meditate.txt @@ -2,6 +2,6 @@ Name:Meditate ManaCost:2 U Types:Instant A:SP$ Draw | Cost$ 2 U | NumCards$ 4 | Defined$ You | SpellDescription$ Draw four cards. You skip your next turn. | SubAbility$ DBSkip -SVar:DBSkip:DB$AddTurn | Defined$ Opponent | NumTurns$ 1 +SVar:DBSkip:DB$ SkipTurn | Defined$ You | NumTurns$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/meditate.jpg Oracle:Draw four cards. You skip your next turn. \ No newline at end of file diff --git a/res/cardsfolder/u/unstable_hulk.txt b/res/cardsfolder/u/unstable_hulk.txt index cc9280e4de1..3452400cb43 100644 --- a/res/cardsfolder/u/unstable_hulk.txt +++ b/res/cardsfolder/u/unstable_hulk.txt @@ -5,6 +5,6 @@ PT:2/2 K:Morph:3 R R T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, it gets +6/+6 and gains trample until end of turn. You skip your next turn. SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +6 | NumDef$ +6 | KW$ Trample | SubAbility$ DBSkipTurn -SVar:DBSkipTurn:DB$AddTurn | Defined$ Opponent | NumTurns$ 1 +SVar:DBSkipTurn:DB$ SkipTurn | Defined$ You | NumTurns$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_hulk.jpg Oracle:Morph {3}{R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Unstable Hulk is turned face up, it gets +6/+6 and gains trample until end of turn. You skip your next turn. \ No newline at end of file diff --git a/res/cardsfolder/w/waterspout_elemental.txt b/res/cardsfolder/w/waterspout_elemental.txt index 44484bc23cc..342fc50c5e8 100644 --- a/res/cardsfolder/w/waterspout_elemental.txt +++ b/res/cardsfolder/w/waterspout_elemental.txt @@ -6,7 +6,7 @@ K:Flying K:Kicker U T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return all other creatures to their owners' hands and you skip your next turn. SVar:TrigKicker:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Creature.Other | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSkipTurn -SVar:DBSkipTurn:DB$AddTurn | NumTurns$ 1 | Defined$ Opponent +SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/waterspout_elemental.jpg Oracle:Kicker {U} (You may pay an additional {U} as you cast this spell.)\nFlying\nWhen Waterspout Elemental enters the battlefield, if it was kicked, return all other creatures to their owners' hands and you skip your next turn. \ No newline at end of file diff --git a/res/cardsfolder/w/wormfang_manta.txt b/res/cardsfolder/w/wormfang_manta.txt index 345461b75fc..7daf107ea5d 100644 --- a/res/cardsfolder/w/wormfang_manta.txt +++ b/res/cardsfolder/w/wormfang_manta.txt @@ -6,7 +6,7 @@ K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigSkip | TriggerDescription$ When CARDNAME enters the battlefield, you skip your next turn. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigAdd | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, you take an extra turn after this one. SVar:TrigAdd:AB$AddTurn | Cost$ 0 | NumTurns$ 1 | Defined$ You -SVar:TrigSkip:AB$AddTurn | Cost$ 0 | NumTurns$ 1 | Defined$ Opponent +SVar:TrigSkip:AB$ SkipTurn | Cost$ 0 | NumTurns$ 1 | Defined$ You SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_manta.jpg Oracle:Flying\nWhen Wormfang Manta enters the battlefield, you skip your next turn.\nWhen Wormfang Manta leaves the battlefield, you take an extra turn after this one. \ No newline at end of file diff --git a/src/main/java/forge/card/ability/ApiType.java b/src/main/java/forge/card/ability/ApiType.java index 36d8e10e411..08cf7c8c377 100644 --- a/src/main/java/forge/card/ability/ApiType.java +++ b/src/main/java/forge/card/ability/ApiType.java @@ -112,6 +112,7 @@ public enum ApiType { SetLife (LifeSetEffect.class, LifeSetAi.class), SetState (SetStateEffect.class, SetStateAi.class), Shuffle (ShuffleEffect.class, ShuffleAi.class), + SkipTurn (SkipTurnEffect.class, CannotPlayAi.class), StoreSVar (StoreSVarEffect.class, StoreSVarAi.class), Tap (TapEffect.class, TapAi.class), TapAll (TapAllEffect.class, TapAllAi.class), diff --git a/src/main/java/forge/card/ability/effects/SkipTurnEffect.java b/src/main/java/forge/card/ability/effects/SkipTurnEffect.java new file mode 100644 index 00000000000..b85fbb4c8a5 --- /dev/null +++ b/src/main/java/forge/card/ability/effects/SkipTurnEffect.java @@ -0,0 +1,37 @@ +package forge.card.ability.effects; + +import java.util.List; + +import forge.card.ability.AbilityUtils; +import forge.card.ability.SpellAbilityEffect; +import forge.card.spellability.SpellAbility; +import forge.game.player.Player; + +public class SkipTurnEffect extends SpellAbilityEffect { + + @Override + protected String getStackDescription(SpellAbility sa) { + final StringBuilder sb = new StringBuilder(); + final int numTurns = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumTurns"), sa); + + List tgtPlayers = getTargetPlayers(sa); + for (final Player player : tgtPlayers) { + sb.append(player).append(" "); + } + + sb.append("skips his/her next ").append(numTurns).append(" turn(s)."); + return sb.toString(); + } + + @Override + public void resolve(SpellAbility sa) { + final int numTurns = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumTurns"), sa); + List tgtPlayers = getTargetPlayers(sa); + for (final Player player : tgtPlayers) { + for(int i = 0; i < numTurns; i++) { + player.addKeyword("Skip your next turn."); + } + } + } +} + diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 3693294f693..1df20e275c0 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -751,6 +751,10 @@ public class PhaseHandler implements java.io.Serializable { if (!this.extraTurns.isEmpty()) { ExtraTurn extraTurn = this.extraTurns.pop(); nextTurn = extraTurn.getPlayer(); + if (nextTurn.hasKeyword("Skip your next turn.")) { + nextTurn.removeKeyword("Skip your next turn."); + return getNextActivePlayer(); + } if (nextTurn.skipTurnTimeVault()) { return getNextActivePlayer(); } @@ -765,6 +769,11 @@ public class PhaseHandler implements java.io.Serializable { } return nextTurn; } + if (nextTurn.hasKeyword("Skip your next turn.")) { + nextTurn.removeKeyword("Skip your next turn."); + this.setPlayerTurn(nextTurn); + return getNextActivePlayer(); + } if (nextTurn.skipTurnTimeVault()) { this.setPlayerTurn(nextTurn); return getNextActivePlayer();