diff --git a/.gitattributes b/.gitattributes index a2f924e703f..8a3bf249edf 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3950,6 +3950,7 @@ res/cardsfolder/f/fortitude.txt svneol=native#text/plain res/cardsfolder/f/fortress_crab.txt -text res/cardsfolder/f/fortress_cyclops.txt -text res/cardsfolder/f/fortune_thief.txt svneol=native#text/plain +res/cardsfolder/f/fossil_find.txt -text res/cardsfolder/f/foster.txt -text res/cardsfolder/f/foul_familiar.txt svneol=native#text/plain res/cardsfolder/f/foul_imp.txt svneol=native#text/plain @@ -9443,6 +9444,7 @@ res/cardsfolder/s/seal_of_removal.txt svneol=native#text/plain res/cardsfolder/s/seal_of_strength.txt svneol=native#text/plain res/cardsfolder/s/sealed_fate.txt svneol=native#text/plain res/cardsfolder/s/seance.txt -text +res/cardsfolder/s/search_for_survivors.txt -text res/cardsfolder/s/search_for_tomorrow.txt svneol=native#text/plain res/cardsfolder/s/search_the_city.txt -text res/cardsfolder/s/search_warrant.txt -text @@ -14151,6 +14153,7 @@ src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java -text src/main/java/forge/card/ability/effects/RegenerateAllEffect.java -text src/main/java/forge/card/ability/effects/RegenerateEffect.java -text src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java -text +src/main/java/forge/card/ability/effects/ReorderZoneEffect.java -text src/main/java/forge/card/ability/effects/RepeatEachEffect.java -text src/main/java/forge/card/ability/effects/RepeatEffect.java -text src/main/java/forge/card/ability/effects/RestartGameEffect.java -text diff --git a/res/cardsfolder/f/fossil_find.txt b/res/cardsfolder/f/fossil_find.txt new file mode 100644 index 00000000000..5472f7a4b9f --- /dev/null +++ b/res/cardsfolder/f/fossil_find.txt @@ -0,0 +1,8 @@ +Name:Fossil Find +ManaCost:RG +Types:Sorcery +A:SP$ ChooseCard | Cost$ RG | Choices$ Card.YouOwn | ChoiceZone$ Graveyard | AtRandom$ True | Amount$ 1 | SubAbility$ DBReturn | SpellDescription$ Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ ChosenCard | SubAbility$ DBReorder +SVar:DBReorder:DB$ ReorderZone | Zone$ Graveyard | Defined$ You +SVar:Picture:http://www.wizards.com/global/images/magic/general/fossil_find.jpg +Oracle:Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose. diff --git a/res/cardsfolder/s/search_for_survivors.txt b/res/cardsfolder/s/search_for_survivors.txt new file mode 100644 index 00000000000..4a81a675a06 --- /dev/null +++ b/res/cardsfolder/s/search_for_survivors.txt @@ -0,0 +1,12 @@ +Name:Search for Survivors +ManaCost:2 R +Types:Sorcery +A:SP$ ReorderZone | Cost$ 2 R | Zone$ Graveyard | Defined$ You | Random$ True | SubAbility$ DBChoose | SpellDescription$ Reorder your graveyard at random. An opponent chooses a card at random in your graveyard. If it's a creature card, put it onto the battlefield. Otherwise, exile it. +SVar:DBChoose:DB$ ChooseCard | Defined$ Opponent | Choices$ Card.YouOwn | ChoiceZone$ Graveyard | AtRandom$ True | Amount$ 1 | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ConditionDefined$ ChosenCard | ConditionPresent$ Card.Creature | ConditionCompare$ GE1 | Defined$ ChosenCard | SubAbility$ DBExile +SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ConditionDefined$ ChosenCard | ConditionPresent$ Card.Creature | ConditionCompare$ EQ0 | Defined$ ChosenCard +SVar:X:Count$ValidGraveyard Creature.YouCtrl +SVar:NeedsToPlayVar:X GE2 +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/search_for_survivors.jpg +Oracle:Reorder your graveyard at random. An opponent chooses a card at random in your graveyard. If it's a creature card, put it onto the battlefield. Otherwise, exile it. diff --git a/src/main/java/forge/card/ability/ApiType.java b/src/main/java/forge/card/ability/ApiType.java index 452406e8d06..2c6270a216d 100644 --- a/src/main/java/forge/card/ability/ApiType.java +++ b/src/main/java/forge/card/ability/ApiType.java @@ -190,6 +190,7 @@ public enum ApiType { RemoveCounter (CountersRemoveEffect.class, CountersRemoveAi.class), RemoveCounterAll (CountersRemoveAllEffect.class, CannotPlayAi.class), RemoveFromCombat (RemoveFromCombatEffect.class, RemoveFromCombatAi.class), + ReorderZone (ReorderZoneEffect.class, AlwaysPlayAi.class), Repeat (RepeatEffect.class, RepeatAi.class), RepeatEach (RepeatEachEffect.class, RepeatEachAi.class), RestartGame (RestartGameEffect.class, RestartGameAi.class), diff --git a/src/main/java/forge/card/ability/effects/ReorderZoneEffect.java b/src/main/java/forge/card/ability/effects/ReorderZoneEffect.java new file mode 100644 index 00000000000..1987aa77411 --- /dev/null +++ b/src/main/java/forge/card/ability/effects/ReorderZoneEffect.java @@ -0,0 +1,63 @@ +package forge.card.ability.effects; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.Lists; + +import forge.Card; +import forge.card.ability.SpellAbilityEffect; +import forge.card.spellability.SpellAbility; +import forge.card.spellability.Target; +import forge.game.player.Player; +import forge.game.zone.ZoneType; +import forge.util.Lang; +import forge.util.MyRandom; + +public class ReorderZoneEffect extends SpellAbilityEffect { + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility) + */ + + @Override + protected String getStackDescription(SpellAbility sa) { + final ZoneType zone = ZoneType.smartValueOf(sa.getParam("Zone")); + final List tgtPlayers = getTargetPlayers(sa); + boolean shuffle = sa.hasParam("Random"); + + return "Reorder " + Lang.joinHomogenous(tgtPlayers)+ " " + zone.toString() + " " + (shuffle ? "at random." : "as your choose."); + } + + /** + *

+ * reorderZoneResolve. + *

+ * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @param af + * a {@link forge.card.ability.AbilityFactory} object. + */ + + @Override + public void resolve(SpellAbility sa) { + final ZoneType zone = ZoneType.smartValueOf(sa.getParam("Zone")); + boolean shuffle = sa.hasParam("Random"); + final Target tgt = sa.getTarget(); + + + for (final Player p : getTargetPlayers(sa)) { + if ((tgt == null) || p.canBeTargetedBy(sa)) { + List list = Lists.newArrayList(p.getCardsIn(zone)); + if (shuffle) { + final Random ran = MyRandom.getRandom(); + Collections.shuffle(list, ran); + p.getZone(zone).setCards(list); + } else { + p.getController().orderMoveToZoneList(list, zone); + } + } + } + } +} diff --git a/src/main/java/forge/card/cost/CostPutCardToLib.java b/src/main/java/forge/card/cost/CostPutCardToLib.java index ff60385716a..ce50ab1e4b8 100644 --- a/src/main/java/forge/card/cost/CostPutCardToLib.java +++ b/src/main/java/forge/card/cost/CostPutCardToLib.java @@ -65,7 +65,7 @@ public class CostPutCardToLib extends CostPartWithList { } /** - * Instantiates a new cost exile. + * Instantiates a new cost CostPutCardToLib. * * @param amount * the amount @@ -251,7 +251,7 @@ public class CostPutCardToLib extends CostPartWithList { } /** - * TODO: Write javadoc for this method. + * PutFromMiscZone * @param sa * @param nNeeded * @param typeList diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 752ff32c79a..30943ab9ff5 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -367,7 +367,7 @@ public class PlayerControllerHuman extends PlayerController { } else if (destinationZone == ZoneType.Battlefield) { return GuiChoose.order("Choose order of cards to put onto the battlefield", "Put first", 0, cards, null, null); } else if (destinationZone == ZoneType.Graveyard) { - return GuiChoose.order("Choose order of cards to put into the graveyard", "Closest to top", 0, cards, null, null); + return GuiChoose.order("Choose order of cards to put into the graveyard", "Closest to bottom", 0, cards, null, null); } return cards; }