diff --git a/.gitattributes b/.gitattributes index 1a505dbdeb8..faf06a51086 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7555,6 +7555,7 @@ forge-gui/res/cardsfolder/m/manaweft_sliver.txt -text forge-gui/res/cardsfolder/m/mangara_of_corondor.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/mangaras_blessing.txt -text forge-gui/res/cardsfolder/m/mangaras_equity.txt -text +forge-gui/res/cardsfolder/m/mangaras_tome.txt -text forge-gui/res/cardsfolder/m/maniacal_rage.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/manic_vandal.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/manipulate_fate.txt svneol=native#text/plain diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 23cfd12bb92..8944e615bd0 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -102,8 +102,10 @@ public class GameAction { * @return a {@link forge.game.card.Card} object. */ public Card changeZone(final Zone zoneFrom, Zone zoneTo, final Card c, Integer position) { - if (c.isCopiedSpell()) { - if ((zoneFrom != null)) { + if (c.isCopiedSpell() || (c.isImmutable() && zoneTo.is(ZoneType.Exile))) { + // Remove Effect from command immediately, this is essential when some replacement + // effects happen during the resolving of a spellability ("the next time ..." effect) + if (zoneFrom != null) { zoneFrom.remove(c); } return c; diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index b55eccdff3c..c350134d40b 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -173,6 +173,11 @@ public class AbilityUtils { cards.add(game.getCardState((Card) o)); } } + } else if (defined.equals("FirstRemembered")) { + Object o = Iterables.getFirst(hostCard.getRemembered(), null); + if (o != null && o instanceof Card) { + cards.add(game.getCardState((Card) o)); + } } else if (defined.equals("Clones")) { for (final Card clone : hostCard.getClones()) { cards.add(game.getCardState(clone)); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index bfb7bc4bed2..a8f1bfc63eb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -757,7 +757,11 @@ public class ChangeZoneEffect extends SpellAbilityEffect { totcmc -= c.getCMC(); } } - + + if (sa.hasParam("ShuffleChangedPile")) { + CardLists.shuffle(chosenCards); + } + List movedCards = new ArrayList(); long ts = game.getNextTimestamp(); for(Card c : chosenCards) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java index 3a2a83d0510..f50842af2c2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java @@ -71,8 +71,8 @@ public class DebuffEffect extends SpellAbilityEffect { } tgtC.removeIntrinsicKeyword(kw); tgtC.removeAllExtrinsicKeyword(kw); - tgtC.addChangedCardKeywords(new ArrayList(), kws, false, timestamp); } + tgtC.addChangedCardKeywords(new ArrayList(), kws, false, timestamp); } if (!sa.hasParam("Permanent")) { game.getEndOfTurn().addUntil(new GameCommand() { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index f91be0e2411..1d48d5f5ca0 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1864,13 +1864,14 @@ public class Card extends GameEntity implements Comparable { if (o instanceof Card) { final Card c = (Card) o; if (c.isFaceDown()) { - sb.append("Face Down "); + sb.append("Face Down"); + // face-down cards don't show unique number to avoid cheating } else { sb.append(c.getName()); + sb.append(" ("); + sb.append(c.getUniqueNumber()); + sb.append(")"); } - sb.append("("); - sb.append(c.getUniqueNumber()); - sb.append(")"); } else if (o != null) { sb.append(o.toString()); } diff --git a/forge-gui/res/cardsfolder/m/mangaras_tome.txt b/forge-gui/res/cardsfolder/m/mangaras_tome.txt new file mode 100644 index 00000000000..78046e3cd6e --- /dev/null +++ b/forge-gui/res/cardsfolder/m/mangaras_tome.txt @@ -0,0 +1,18 @@ +Name:Mangara's Tome +ManaCost:5 +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, search your library for five cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library. +SVar:TrigSearch:AB$ ChangeZone | Cost$ 0 | ChangeNum$ 5 | ChangeType$ Card | Origin$ Library | Destination$ Exile | ShuffleChangedPile$ True | ExileFaceDown$ True | RememberChanged$ True +T:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | Static$ True | Execute$ TrigForget +SVar:TrigForget:DB$ Pump | ForgetObjects$ TriggeredCard +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReset | Static$ True +SVar:TrigReset:DB$ Cleanup | ClearRemembered$ True +A:AB$ Effect | Cost$ 2 | RememberObjects$ FirstRemembered | Triggers$ TrigLeavePlay | ReplacementEffects$ DrawReplace | SVars$ ExileEffect,RepMangarasTome | ImprintCards$ Self | SpellDescription$ The next time you would draw a card this turn, instead put the top card of the exiled pile into its owner's hand. +SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ RepMangarasTome | Description$ The next time you would draw a card this turn, instead put the top card of the exiled pile into its owner's hand. +SVar:TrigLeavePlay:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ ExileEffect | Static$ True +SVar:RepMangarasTome:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand | SubAbility$ ExileEffect +SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:RemAIDeck:True +SVar:RemRandomDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/mangaras_tome.jpg +Oracle:When Mangara's Tome enters the battlefield, search your library for five cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library.\n{2}: The next time you would draw a card this turn, instead put the top card of the exiled pile into its owner's hand.