diff --git a/.gitattributes b/.gitattributes index c23a55c4824..90352af016d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2847,6 +2847,7 @@ res/cardsfolder/f/fatal_frenzy.txt svneol=native#text/plain res/cardsfolder/f/fatal_mutation.txt svneol=native#text/plain res/cardsfolder/f/fatestitcher.txt svneol=native#text/plain res/cardsfolder/f/fathom_seer.txt svneol=native#text/plain +res/cardsfolder/f/fatigue.txt -text res/cardsfolder/f/fault_line.txt svneol=native#text/plain res/cardsfolder/f/fault_riders.txt svneol=native#text/plain res/cardsfolder/f/faultgrinder.txt svneol=native#text/plain diff --git a/res/cardsfolder/f/fatigue.txt b/res/cardsfolder/f/fatigue.txt new file mode 100644 index 00000000000..fec3569bf0f --- /dev/null +++ b/res/cardsfolder/f/fatigue.txt @@ -0,0 +1,11 @@ +Name:Fatigue +ManaCost:1 U +Types:Instant +Text:no text +A:SP$ Pump | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | KW$ Skip your next draw step. | Permanent$ True | SpellDescription$ Target player skips his or her next draw step. +SVar:RemAIDeck:True +SVar:Rarity:Common +SVar:Picture:http://www.wizards.com/global/images/magic/general/fatigue.jpg +SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/32.jpg +Oracle:Target player skips his or her next draw step. +End \ No newline at end of file diff --git a/src/main/java/forge/PhaseUtil.java b/src/main/java/forge/PhaseUtil.java index b09dc628ad6..c2e04960084 100644 --- a/src/main/java/forge/PhaseUtil.java +++ b/src/main/java/forge/PhaseUtil.java @@ -178,6 +178,11 @@ public class PhaseUtil { return true; } + if (player.hasKeyword("Skip your next draw step.")) { + player.removeKeyword("Skip your next draw step."); + return true; + } + if (player.hasKeyword("Skip your draw step.")) { return true; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java index c82ee61e6d5..2ebc923df2c 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java @@ -32,6 +32,7 @@ import forge.Command; import forge.ComputerUtil; import forge.Constant; import forge.Constant.Zone; +import forge.GameEntity; import forge.Player; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.Cost; @@ -837,16 +838,18 @@ public class AbilityFactoryPump { // happening final StringBuilder sb = new StringBuilder(); final String name = af.getHostCard().getName(); + ArrayList tgts = new ArrayList(); - ArrayList tgtCards; final Target tgt = sa.getTarget(); if (tgt != null) { - tgtCards = tgt.getTargetCards(); + tgts.addAll(tgt.getTargetCards()); + tgts.addAll(tgt.getTargetPlayers()); } else { - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), this.params.get("Defined"), sa); + tgts.addAll(AbilityFactory.getDefinedCards(this.hostCard, this.params.get("Defined"), sa)); + tgts.addAll(AbilityFactory.getDefinedPlayers(this.hostCard, this.params.get("Defined"), sa)); } - if (tgtCards.size() > 0) { + if (tgts.size() > 0) { if (sa instanceof AbilitySub) { sb.append(" "); @@ -854,14 +857,14 @@ public class AbilityFactoryPump { sb.append(name).append(" - "); } - for (final Card c : tgtCards) { + for (final GameEntity c : tgts) { sb.append(c.getName()).append(" "); } if (af.getMapParams().containsKey("Radiance")) { sb.append(" and each other ").append(af.getMapParams().get("ValidTgts")) .append(" that shares a color with "); - if (tgtCards.size() > 1) { + if (tgts.size() > 1) { sb.append("them "); } else { sb.append("it "); @@ -916,10 +919,13 @@ public class AbilityFactoryPump { ArrayList tgtCards; final ArrayList untargetedCards = new ArrayList(); final Target tgt = sa.getTarget(); + ArrayList tgtPlayers = new ArrayList(); if (tgt != null) { tgtCards = tgt.getTargetCards(); + tgtPlayers = tgt.getTargetPlayers(); } else { tgtCards = AbilityFactory.getDefinedCards(this.hostCard, this.params.get("Defined"), sa); + tgtPlayers = AbilityFactory.getDefinedPlayers(this.hostCard, this.params.get("Defined"), sa); } if (this.params.containsKey("Radiance")) { @@ -958,6 +964,14 @@ public class AbilityFactoryPump { this.applyPump(sa, tgtC); } + + for (Player p : tgtPlayers) { + if (!p.canBeTargetedBy(sa)) { + continue; + } + + this.applyPump(sa, p); + } } // pumpResolve() private void applyPump(final SpellAbility sa, final Card applyTo) { @@ -1002,6 +1016,41 @@ public class AbilityFactoryPump { } } + private void applyPump(final SpellAbility sa, final Player p) { + + for (int i = 0; i < this.keywords.size(); i++) { + if (!this.keywords.get(i).equals("none")) { + p.addKeyword(this.keywords.get(i)); + } + } + + if (!this.params.containsKey("Permanent")) { + // If not Permanent, remove Pumped at EOT + final Command untilEOT = new Command() { + private static final long serialVersionUID = -32453460L; + + @Override + public void execute() { + + if (AbilityFactoryPump.this.keywords.size() > 0) { + for (int i = 0; i < AbilityFactoryPump.this.keywords.size(); i++) { + if (!AbilityFactoryPump.this.keywords.get(i).equals("none")) { + p.removeKeyword(AbilityFactoryPump.this.keywords.get(i)); + } + } + } + } + }; + if (this.params.containsKey("UntilEndOfCombat")) { + AllZone.getEndOfCombat().addUntil(untilEOT); + } else if (this.params.containsKey("UntilYourNextUpkeep")) { + AllZone.getUpkeep().addUntil(sa.getActivatingPlayer(), untilEOT); + } else { + AllZone.getEndOfTurn().addUntil(untilEOT); + } + } + } + // /////////////////////////////////// // // PumpAll