From 40f192eafcb65265816038b4646347dad430550e Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 20 May 2017 23:22:31 +0200 Subject: [PATCH 1/6] * Squelch - Fixed that it was causing a ClassCastException (fixes #3396). --- .../java/mage/player/ai/ComputerPlayer.java | 18 ++++++- Mage.Sets/src/mage/cards/t/TolariaWest.java | 6 +-- .../CounterActivatedAbilityTest.java | 50 +++++++++++++++++++ .../target/common/TargetActivatedAbility.java | 4 +- 4 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/CounterActivatedAbilityTest.java diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 4fe28205543..0a17119b234 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -727,7 +727,23 @@ public class ComputerPlayer extends PlayerImpl implements Player { } return target.isChosen(); } - + if (target.getOriginalTarget() instanceof TargetActivatedAbility) { + List stackObjects = new ArrayList<>(); + for (UUID uuid : ((TargetActivatedAbility) target).possibleTargets(source.getSourceId(), source.getControllerId(), game)) { + StackObject stackObject = game.getStack().getStackObject(uuid); + if (stackObject != null) { + stackObjects.add(stackObject); + } + } + while (!target.isChosen() && !stackObjects.isEmpty()) { + StackObject pick = stackObjects.get(0); + if (pick != null) { + target.addTarget(pick.getId(), source, game); + stackObjects.remove(0); + } + } + return target.isChosen(); + } throw new IllegalStateException("Target wasn't handled. class:" + target.getClass().toString()); } diff --git a/Mage.Sets/src/mage/cards/t/TolariaWest.java b/Mage.Sets/src/mage/cards/t/TolariaWest.java index 064b8c243a2..330ac1db36a 100644 --- a/Mage.Sets/src/mage/cards/t/TolariaWest.java +++ b/Mage.Sets/src/mage/cards/t/TolariaWest.java @@ -28,12 +28,12 @@ package mage.cards.t; import java.util.UUID; -import mage.constants.CardType; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.keyword.TransmuteAbility; import mage.abilities.mana.BlueManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; /** * @@ -42,11 +42,11 @@ import mage.cards.CardSetInfo; public class TolariaWest extends CardImpl { public TolariaWest(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // Tolaria West enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); - // {tap}: Add {U} to your mana pool. + // {T}: Add {U} to your mana pool. this.addAbility(new BlueManaAbility()); // Transmute {1}{U}{U} this.addAbility(new TransmuteAbility("{1}{U}{U}")); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/CounterActivatedAbilityTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/CounterActivatedAbilityTest.java new file mode 100644 index 00000000000..f3e4f57864c --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counterspell/CounterActivatedAbilityTest.java @@ -0,0 +1,50 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.mage.test.cards.abilities.oneshot.counterspell; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class CounterActivatedAbilityTest extends CardTestPlayerBase { + + /** + * The Card 'Sqelch' is bugged. In a game versus a human I tried to counter + * a Toloria West activation as well as a Elspeth Sun's Champion activation + * to make the game roll back to the begining of the turn and to show a pop + * pup with an error message which I cannot post here due to forum + * limitations. + * + */ + @Test + public void testSquelch() { + // +1: Create three 1/1 white Soldier creature tokens. + // -3: Destroy all creatures with power 4 or greater. + // -7: You get an emblem with "Creatures you control get +2/+2 and have flying." + addCard(Zone.BATTLEFIELD, playerA, "Elspeth, Sun's Champion", 1); + + // Counter target activated ability + addCard(Zone.HAND, playerB, "Squelch", 1); // Instant {1}{U} + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+1"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Squelch"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerB, "Squelch", 1); + assertPermanentCount(playerA, "Soldier", 0); + + } + +} diff --git a/Mage/src/main/java/mage/target/common/TargetActivatedAbility.java b/Mage/src/main/java/mage/target/common/TargetActivatedAbility.java index 10f2a786f97..00e65d3b11b 100644 --- a/Mage/src/main/java/mage/target/common/TargetActivatedAbility.java +++ b/Mage/src/main/java/mage/target/common/TargetActivatedAbility.java @@ -73,7 +73,7 @@ public class TargetActivatedAbility extends TargetObject { } StackObject stackObject = game.getStack().getStackObject(id); return stackObject != null && stackObject.getStackAbility() != null && stackObject.getStackAbility().getAbilityType() == AbilityType.ACTIVATED - && filter.match(((ActivatedAbility) stackObject), game); + && filter.match(((ActivatedAbility) stackObject.getStackAbility()), game); } @Override @@ -104,7 +104,7 @@ public class TargetActivatedAbility extends TargetObject { for (StackObject stackObject : game.getStack()) { if (stackObject.getStackAbility().getAbilityType() == AbilityType.ACTIVATED && game.getState().getPlayersInRange(sourceControllerId, game).contains(stackObject.getStackAbility().getControllerId()) - && filter.match(((ActivatedAbility) stackObject), game)) { + && filter.match(((StackAbility) stackObject), game)) { possibleTargets.add(stackObject.getStackAbility().getId()); } } From ca9f596e4a0ba472a1019183b4457be78c7b7201 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 21 May 2017 00:14:06 +0200 Subject: [PATCH 2/6] * Compelling Deterrance - Fixed that static effects of the card that goes to hand did not end before the discard happens (fixes #3368); --- Mage.Sets/src/mage/cards/c/CompellingDeterrence.java | 6 +++--- .../ruleModifying/CastOnlyDuringPhaseStepSourceEffect.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CompellingDeterrence.java b/Mage.Sets/src/mage/cards/c/CompellingDeterrence.java index 92f39b93d9f..6cca9ce1eda 100644 --- a/Mage.Sets/src/mage/cards/c/CompellingDeterrence.java +++ b/Mage.Sets/src/mage/cards/c/CompellingDeterrence.java @@ -27,6 +27,7 @@ */ package mage.cards.c; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -41,8 +42,6 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetNonlandPermanent; -import java.util.UUID; - /** * * @author fireshoes @@ -50,7 +49,7 @@ import java.util.UUID; public class CompellingDeterrence extends CardImpl { public CompellingDeterrence(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); // Return target nonland permanent to its owner's hand. Then that player discards a card if you control a Zombie. this.getSpellAbility().addEffect(new CompellingDeterrenceEffect()); @@ -90,6 +89,7 @@ class CompellingDeterrenceEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null && player != null) { player.moveCards(target, Zone.HAND, source, game); + game.applyEffects(); FilterPermanent FILTER = new FilterPermanent(); FILTER.add(new SubtypePredicate("Zombie")); if (game.getState().getBattlefield().countAll(FILTER, controller.getId(), game) > 0) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CastOnlyDuringPhaseStepSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CastOnlyDuringPhaseStepSourceEffect.java index 77f222048bf..6b8f615222c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CastOnlyDuringPhaseStepSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CastOnlyDuringPhaseStepSourceEffect.java @@ -54,7 +54,7 @@ public class CastOnlyDuringPhaseStepSourceEffect extends ContinuousRuleModifying return true; } } - return false; // casr not prevented by this effect + return false; // cast not prevented by this effect } @Override From c26968a0968b6c5617ea3aeb31f970f1365a2244 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 21 May 2017 00:49:59 +0200 Subject: [PATCH 3/6] * Bruna, Light of Alabaster - Fixed that the check what aura could be selected was not correct (e.g. Daybreak Coronet condition) fixes #3335. --- .../mage/cards/b/BrunaLightOfAlabaster.java | 101 +++++++++++------- 1 file changed, 63 insertions(+), 38 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BrunaLightOfAlabaster.java b/Mage.Sets/src/mage/cards/b/BrunaLightOfAlabaster.java index 9d5f7f5a447..25bb6474e81 100644 --- a/Mage.Sets/src/mage/cards/b/BrunaLightOfAlabaster.java +++ b/Mage.Sets/src/mage/cards/b/BrunaLightOfAlabaster.java @@ -27,6 +27,9 @@ */ package mage.cards.b; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksOrBlocksTriggeredAbility; @@ -42,6 +45,8 @@ import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardIdPredicate; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.other.AuraCardCanAttachToPermanentId; @@ -53,14 +58,13 @@ import mage.target.Target; import mage.target.TargetCard; import mage.target.TargetPermanent; -import java.util.UUID; /** * @author noxx */ public class BrunaLightOfAlabaster extends CardImpl { public BrunaLightOfAlabaster(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}{U}"); addSuperType(SuperType.LEGENDARY); this.subtype.add("Angel"); @@ -103,8 +107,8 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { UUID bruna = source.getSourceId(); - Player player = game.getPlayer(source.getControllerId()); - + Player controller = game.getPlayer(source.getControllerId()); + FilterPermanent filterAura = new FilterPermanent("Aura"); FilterCard filterAuraCard = new FilterCard("Aura card"); @@ -114,65 +118,86 @@ class BrunaLightOfAlabasterEffect extends OneShotEffect { filterAuraCard.add(new CardTypePredicate(CardType.ENCHANTMENT)); filterAuraCard.add(new SubtypePredicate("Aura")); filterAuraCard.add(new AuraCardCanAttachToPermanentId(bruna)); - - if (player == null) { + + if (controller == null) { return false; } - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent == null) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent == null) { return false; } - - int countBattlefield = game.getBattlefield().getAllActivePermanents(filterAura, game).size() - permanent.getAttachments().size(); - while (player.canRespond() + List fromBattlefield = new ArrayList<>(); + List fromHandGraveyard = new ArrayList<>(); + + int countBattlefield = game.getBattlefield().getAllActivePermanents(filterAura, game).size() - sourcePermanent.getAttachments().size(); + while (controller.canRespond() && countBattlefield > 0 - && player.chooseUse(Outcome.Benefit, "Attach an Aura from the battlefield?", source, game)) { + && controller.chooseUse(Outcome.Benefit, "Attach an Aura from the battlefield?", source, game)) { Target targetAura = new TargetPermanent(filterAura); - if (player.choose(Outcome.Benefit, targetAura, source.getSourceId(), game)) { + if (controller.choose(Outcome.Benefit, targetAura, source.getSourceId(), game)) { Permanent aura = game.getPermanent(targetAura.getFirstTarget()); if (aura != null) { - Permanent attachedTo = game.getPermanent(aura.getAttachedTo()); - if (attachedTo != null) { - attachedTo.removeAttachment(aura.getId(), game); + Target target = aura.getSpellAbility().getTargets().get(0); + if (target != null && target.canTarget(source.getSourceId(), source, game)) { + fromBattlefield.add(aura); + filterAura.add(Predicates.not(new CardIdPredicate(aura.getId()))); } - permanent.addAttachment(aura.getId(), game); } } - countBattlefield = game.getBattlefield().getAllActivePermanents(filterAura, game).size() - permanent.getAttachments().size(); + countBattlefield = game.getBattlefield().getAllActivePermanents(filterAura, game).size() - sourcePermanent.getAttachments().size(); } - int countHand = player.getHand().count(filterAuraCard, game); - while (player.canRespond() - && countHand > 0 - && player.chooseUse(Outcome.Benefit, "Attach an Aura from your hand?", source, game)) { + int countHand = controller.getHand().count(filterAuraCard, game); + while (controller.canRespond() + && countHand > 0 + && controller.chooseUse(Outcome.Benefit, "Attach an Aura from your hand?", source, game)) { TargetCard targetAura = new TargetCard(Zone.HAND, filterAuraCard); - if (player.choose(Outcome.Benefit, player.getHand(), targetAura, game)) { + if (controller.choose(Outcome.Benefit, controller.getHand(), targetAura, game)) { Card aura = game.getCard(targetAura.getFirstTarget()); if (aura != null) { - game.getState().setValue("attachTo:" + aura.getId(), permanent); - aura.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId()); - permanent.addAttachment(aura.getId(), game); + Target target = aura.getSpellAbility().getTargets().get(0); + if (target != null && target.canTarget(source.getSourceId(), source, game)) { + fromHandGraveyard.add(aura); + filterAuraCard.add(Predicates.not(new CardIdPredicate(aura.getId()))); + } } } - countHand = player.getHand().count(filterAuraCard, game); + countHand = controller.getHand().count(filterAuraCard, game); } - int countGraveyard = player.getGraveyard().count(filterAuraCard, game); - while (player.canRespond() - && countGraveyard > 0 - && player.chooseUse(Outcome.Benefit, "Attach an Aura from your graveyard?", source, game)) { + int countGraveyard = controller.getGraveyard().count(filterAuraCard, game); + while (controller.canRespond() + && countGraveyard > 0 + && controller.chooseUse(Outcome.Benefit, "Attach an Aura from your graveyard?", source, game)) { TargetCard targetAura = new TargetCard(Zone.GRAVEYARD, filterAuraCard); - if (player.choose(Outcome.Benefit, player.getGraveyard(), targetAura, game)) { + if (controller.choose(Outcome.Benefit, controller.getGraveyard(), targetAura, game)) { Card aura = game.getCard(targetAura.getFirstTarget()); if (aura != null) { - game.getState().setValue("attachTo:" + aura.getId(), permanent); - aura.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), player.getId()); - permanent.addAttachment(aura.getId(), game); + Target target = aura.getSpellAbility().getTargets().get(0); + if (target != null && target.canTarget(source.getSourceId(), source, game)) { + fromHandGraveyard.add(aura); + filterAuraCard.add(Predicates.not(new CardIdPredicate(aura.getId()))); + } } } - countGraveyard = player.getGraveyard().count(filterAuraCard, game); + countGraveyard = controller.getGraveyard().count(filterAuraCard, game); + } + // Move permanents + for (Permanent aura : fromBattlefield) { + Permanent attachedTo = game.getPermanent(aura.getAttachedTo()); + if (attachedTo != null) { + attachedTo.removeAttachment(aura.getId(), game); + } + sourcePermanent.addAttachment(aura.getId(), game); + } + // Move cards + for (Card aura : fromHandGraveyard) { + if (aura != null) { + game.getState().setValue("attachTo:" + aura.getId(), sourcePermanent); + controller.moveCards(aura, Zone.BATTLEFIELD, source, game); + sourcePermanent.addAttachment(aura.getId(), game); + } } - return true; } -} \ No newline at end of file +} From ff22e286762550fd1f7b94d7c3539bc93d5c6d73 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 21 May 2017 01:01:02 +0200 Subject: [PATCH 4/6] * Spirit Mirror - Fixed that the first ability only checked for Reflection tokens (related to #3391). --- Mage.Sets/src/mage/cards/s/SpiritMirror.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/s/SpiritMirror.java b/Mage.Sets/src/mage/cards/s/SpiritMirror.java index 017f0565a8d..23604fd27a5 100644 --- a/Mage.Sets/src/mage/cards/s/SpiritMirror.java +++ b/Mage.Sets/src/mage/cards/s/SpiritMirror.java @@ -43,7 +43,6 @@ import mage.constants.ComparisonType; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.FilterPermanent; -import mage.filter.predicate.mageobject.NamePredicate; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.TokenPredicate; import mage.game.permanent.token.ReflectionToken; @@ -54,9 +53,12 @@ import mage.target.TargetPermanent; */ public class SpiritMirror extends CardImpl { + private static final FilterPermanent filterToken = new FilterPermanent("Reflection", "Reflection token"); private static final FilterPermanent filter = new FilterPermanent("Reflection"); static { + filterToken.add(new SubtypePredicate("Reflection")); + filterToken.add(new TokenPredicate()); filter.add(new SubtypePredicate("Reflection")); } @@ -66,7 +68,7 @@ public class SpiritMirror extends CardImpl { // At the beginning of your upkeep, if there are no Reflection tokens on the battlefield, create a 2/2 white Reflection creature token. this.addAbility(new ConditionalTriggeredAbility( new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new ReflectionToken()), TargetController.YOU, false), - new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.EQUAL_TO, 0, false), + new PermanentsOnTheBattlefieldCondition(filterToken, ComparisonType.EQUAL_TO, 0, false), "At the beginning of your upkeep, if there are no Reflection tokens on the battlefield, create a 2/2 white Reflection creature token")); // {0}: Destroy target Reflection. From 0b7a50e48f1338a5b70824a6f394e0fa96cdeeb8 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 21 May 2017 01:01:50 +0200 Subject: [PATCH 5/6] * Xmage 1.4.23V6 --- Mage.Common/src/main/java/mage/utils/MageVersion.java | 2 +- Mage/src/main/java/mage/cards/repository/CardRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Common/src/main/java/mage/utils/MageVersion.java b/Mage.Common/src/main/java/mage/utils/MageVersion.java index 92fa80b9014..ff7f03709b0 100644 --- a/Mage.Common/src/main/java/mage/utils/MageVersion.java +++ b/Mage.Common/src/main/java/mage/utils/MageVersion.java @@ -41,7 +41,7 @@ public class MageVersion implements Serializable, Comparable { public final static int MAGE_VERSION_MAJOR = 1; public final static int MAGE_VERSION_MINOR = 4; public final static int MAGE_VERSION_PATCH = 23; - public final static String MAGE_VERSION_MINOR_PATCH = "V5"; + public final static String MAGE_VERSION_MINOR_PATCH = "V6"; public final static String MAGE_VERSION_INFO = ""; private final int major; diff --git a/Mage/src/main/java/mage/cards/repository/CardRepository.java b/Mage/src/main/java/mage/cards/repository/CardRepository.java index 1cbee1b1da2..ea9f0b42800 100644 --- a/Mage/src/main/java/mage/cards/repository/CardRepository.java +++ b/Mage/src/main/java/mage/cards/repository/CardRepository.java @@ -58,7 +58,7 @@ public enum CardRepository { // raise this if db structure was changed private static final long CARD_DB_VERSION = 51; // raise this if new cards were added to the server - private static final long CARD_CONTENT_VERSION = 80; + private static final long CARD_CONTENT_VERSION = 81; private final TreeSet landTypes = new TreeSet<>(); private Dao cardDao; private Set classNames; From b467ff2080ab77dce3b0404d36732223b9e9855a Mon Sep 17 00:00:00 2001 From: spjspj Date: Sun, 21 May 2017 12:42:50 +1000 Subject: [PATCH 6/6] Add emblems into the int.txt file 'emblem:Human:ElspethSunsChampionEmblem:1' for example --- .../src/main/java/mage/server/util/SystemUtil.java | 13 +++++++++++++ .../command/emblems/ElspethSunsChampionEmblem.java | 1 + 2 files changed, 14 insertions(+) diff --git a/Mage.Server/src/main/java/mage/server/util/SystemUtil.java b/Mage.Server/src/main/java/mage/server/util/SystemUtil.java index 8bfd1a2abc9..b07227c694f 100644 --- a/Mage.Server/src/main/java/mage/server/util/SystemUtil.java +++ b/Mage.Server/src/main/java/mage/server/util/SystemUtil.java @@ -87,6 +87,8 @@ public final class SystemUtil { gameZone = Zone.LIBRARY; } else if ("token".equalsIgnoreCase(zone)) { gameZone = Zone.BATTLEFIELD; + } else if ("emblem".equalsIgnoreCase(zone)) { + gameZone = Zone.COMMAND; } else { continue; // go parse next line } @@ -103,6 +105,17 @@ public final class SystemUtil { Object token = cons.newInstance(); if (token != null && token instanceof mage.game.permanent.token.Token) { ((mage.game.permanent.token.Token) token).putOntoBattlefield(amount, game, null, player.getId(), false, false); + continue; + } + } else if ("emblem".equalsIgnoreCase(zone)) { + // eg: emblem:Human:ElspethSunsChampionEmblem:1 + Class c = Class.forName("mage.game.command.emblems." + cardName); + Constructor cons = c.getConstructor(); + Object emblem = cons.newInstance(); + if (emblem != null && emblem instanceof mage.game.command.Emblem) { + ((mage.game.command.Emblem) emblem).setControllerId(player.getId()); + game.addEmblem((mage.game.command.Emblem) emblem, null, player.getId()); + continue; } } logger.warn("Couldn't find a card: " + cardName); diff --git a/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java index 20ad19457ae..140fb38791b 100644 --- a/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java @@ -48,6 +48,7 @@ public class ElspethSunsChampionEmblem extends Emblem { public ElspethSunsChampionEmblem() { this.setName("Emblem Elspeth"); + this.setExpansionSetCodeForImage("THS"); Ability ability = new SimpleStaticAbility(Zone.COMMAND, new BoostControlledEffect(2, 2, Duration.EndOfGame, filter, false)); ability.addEffect(new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.EndOfGame, filter)); this.getAbilities().add(ability);