diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 6f98aa7b2e8..f59bb88b56a 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -133,6 +133,10 @@ public class CardFactory { final Card original = targetSA.getHostCard(); final Card c = copyCard(original, true); + // clear remember/imprint for copied spells + c.clearRemembered(); + c.clearImprintedCards(); + if (sourceSA.hasParam("NonLegendary")) { c.removeType(CardType.Supertype.Legendary); } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 1a359265886..625daa80001 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2481,16 +2481,14 @@ public class CardFactoryUtil { } else if (keyword.equals("Demonstrate")) { final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | TriggerDescription$ Demonstrate (" + inst.getReminderText() + ")"; final String youCopyStr = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True | Optional$ True | RememberCopies$ True"; - final String chooseOppStr = "DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ConditionCheckSVar$ DemonstrateSVar | ConditionSVarCompare$ GE1"; - final String oppCopyStr = "DB$ CopySpellAbility | Controller$ ChosenPlayer | Defined$ TriggeredSpellAbility | MayChooseTarget$ True | ConditionCheckSVar$ DemonstrateSVar | ConditionSVarCompare$ GE1"; - final String cleanupStr = "DB$ Cleanup | ClearRemembered$ True"; + final String chooseOppStr = "DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ConditionDefined$ Remembered | ConditionPresent$ Spell"; + final String oppCopyStr = "DB$ CopySpellAbility | Controller$ ChosenPlayer | Defined$ TriggeredSpellAbility | MayChooseTarget$ True | ConditionDefined$ Remembered | ConditionPresent$ Spell"; + final String cleanupStr = "DB$ Cleanup | ClearRemembered$ True | ClearChosenPlayer$ True"; final Trigger trigger = TriggerHandler.parseTrigger(trigScript, card, intrinsic); final SpellAbility youCopy = AbilityFactory.getAbility(youCopyStr, card); final AbilitySub chooseOpp = (AbilitySub) AbilityFactory.getAbility(chooseOppStr, card); - chooseOpp.setSVar("DemonstrateSVar", "Count$RememberedSize"); final AbilitySub oppCopy = (AbilitySub) AbilityFactory.getAbility(oppCopyStr, card); - oppCopy.setSVar("DemonstrateSVar", "Count$RememberedSize"); final AbilitySub cleanup = (AbilitySub) AbilityFactory.getAbility(cleanupStr, card); oppCopy.setSubAbility(cleanup); chooseOpp.setSubAbility(oppCopy); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index 8b3a2dce074..c52a7dca849 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -30,17 +30,17 @@ import com.google.common.collect.Iterables; import forge.card.ColorSet; import forge.game.Game; import forge.game.GameObject; +import forge.game.GameObjectPredicates; import forge.game.GameType; import forge.game.ability.AbilityUtils; import forge.game.card.Card; -import forge.game.card.CardCollectionView; -import forge.game.card.CardLists; import forge.game.card.CardUtil; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.Expressions; +import forge.util.collect.FCollection; /** *

@@ -354,21 +354,19 @@ public class SpellAbilityCondition extends SpellAbilityVariables { } } - if (this.getIsPresent() != null) { - CardCollectionView list; - if (this.getPresentDefined() != null) { - list = AbilityUtils.getDefinedCards(host, this.getPresentDefined(), sa); + if (getIsPresent() != null) { + FCollection list; + if (getPresentDefined() != null) { + list = AbilityUtils.getDefinedObjects(host, getPresentDefined(), sa); } else { - list = game.getCardsIn(ZoneType.Battlefield); + list = new FCollection(game.getCardsIn(getPresentZone())); } - list = CardLists.getValidCards(list, this.getIsPresent().split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); + final int left = Iterables.size(Iterables.filter(list, GameObjectPredicates.restriction(getIsPresent().split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa))); final String rightString = this.getPresentCompare().substring(2); int right = AbilityUtils.calculateAmount(host, rightString, sa); - final int left = list.size(); - if (!Expressions.compare(left, this.getPresentCompare(), right)) { return false; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 4dbc7d44a8d..d6c25a23ff9 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -20,14 +20,16 @@ package forge.game.spellability; import java.util.List; import java.util.Map; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import forge.game.Game; +import forge.game.GameObject; +import forge.game.GameObjectPredicates; import forge.game.GameType; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPlayOption; @@ -39,6 +41,7 @@ import forge.game.staticability.StaticAbilityCastWithFlash; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.Expressions; +import forge.util.collect.FCollection; /** *

@@ -426,19 +429,17 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { } } if (this.getIsPresent() != null) { - CardCollectionView list; - if (this.getPresentDefined() != null) { - list = AbilityUtils.getDefinedCards(sa.getHostCard(), this.getPresentDefined(), sa); + FCollection list; + if (getPresentDefined() != null) { + list = AbilityUtils.getDefinedObjects(sa.getHostCard(), getPresentDefined(), sa); } else { - list = game.getCardsIn(this.getPresentZone()); + list = new FCollection(game.getCardsIn(getPresentZone())); } - list = CardLists.getValidCards(list, this.getIsPresent().split(","), activator, c, sa); + final int left = Iterables.size(Iterables.filter(list, GameObjectPredicates.restriction(getIsPresent().split(","), activator, c, sa))); - int right = 1; final String rightString = this.getPresentCompare().substring(2); - right = AbilityUtils.calculateAmount(c, rightString, sa); - final int left = list.size(); + int right = AbilityUtils.calculateAmount(c, rightString, sa); if (!Expressions.compare(left, this.getPresentCompare(), right)) { return false; diff --git a/forge-gui/res/cardsfolder/upcoming/excavation_technique.txt b/forge-gui/res/cardsfolder/upcoming/excavation_technique.txt index d42fdd2db2d..8e9e5507aae 100644 --- a/forge-gui/res/cardsfolder/upcoming/excavation_technique.txt +++ b/forge-gui/res/cardsfolder/upcoming/excavation_technique.txt @@ -2,7 +2,7 @@ Name:Excavation Technique ManaCost:3 W Types:Sorcery K:Demonstrate -A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SubAbility$ DBToken | SpellDescription$ Destroy target nonland permanent. Its controller creates two Treasure tokens. -SVar:DBToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_treasure_sac | TokenOwner$ TargetedController +A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SubAbility$ DBToken | SpellDescription$ Destroy target nonland permanent. +SVar:DBToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_treasure_sac | TokenOwner$ TargetedController | StackDescription$ SpellDescription | SpellDescription$ Its controller creates two Treasure tokens. DeckHas:Ability$Token Oracle:Demonstrate (When you cast this spell, you may copy it. If you do, choose an opponent to also copy it. Players may choose new targets for their copies.)\nDestroy target nonland permanent. Its controller creates two Treasure tokens.