mirror of
https://github.com/correl/mage.git
synced 2025-03-07 20:53:18 -10:00
Merge pull request #4831 from magefree/planeswalkerErrata
Planeswalker errata implemented
This commit is contained in:
commit
af3a4b389e
19 changed files with 186 additions and 100 deletions
|
@ -256,6 +256,36 @@ public class ComputerPlayer extends PlayerImpl implements Player {
|
|||
if (target.getOriginalTarget() instanceof TargetAnyTarget) {
|
||||
List<Permanent> targets;
|
||||
TargetAnyTarget t = ((TargetAnyTarget) target);
|
||||
if (outcome.isGood()) {
|
||||
targets = threats(abilityControllerId, sourceId, ((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), game, target.getTargets());
|
||||
} else {
|
||||
targets = threats(randomOpponentId, sourceId, ((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), game, target.getTargets());
|
||||
}
|
||||
for (Permanent permanent : targets) {
|
||||
List<UUID> alreadyTargetted = target.getTargets();
|
||||
if (t.canTarget(abilityControllerId, permanent.getId(), null, game)) {
|
||||
if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) {
|
||||
target.add(permanent.getId(), game);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (outcome.isGood()) {
|
||||
if (target.canTarget(abilityControllerId, null, game)) {
|
||||
target.add(abilityControllerId, game);
|
||||
return true;
|
||||
}
|
||||
} else if (target.canTarget(randomOpponentId, null, game)) {
|
||||
target.add(randomOpponentId, game);
|
||||
return true;
|
||||
}
|
||||
if (!target.isRequired(sourceId, game)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (target.getOriginalTarget() instanceof TargetCreatureOrPlayer) {
|
||||
List<Permanent> targets;
|
||||
TargetCreatureOrPlayer t = ((TargetCreatureOrPlayer) target);
|
||||
if (outcome.isGood()) {
|
||||
targets = threats(abilityControllerId, sourceId, ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets());
|
||||
} else {
|
||||
|
@ -496,9 +526,9 @@ public class ComputerPlayer extends PlayerImpl implements Player {
|
|||
}
|
||||
return target.isChosen();
|
||||
}
|
||||
if (target.getOriginalTarget() instanceof TargetAnyTarget) {
|
||||
if (target.getOriginalTarget() instanceof TargetCreatureOrPlayer) {
|
||||
List<Permanent> targets;
|
||||
TargetAnyTarget t = ((TargetAnyTarget) target);
|
||||
TargetCreatureOrPlayer t = ((TargetCreatureOrPlayer) target);
|
||||
if (outcome.isGood()) {
|
||||
targets = threats(abilityControllerId, source.getSourceId(), ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets());
|
||||
} else {
|
||||
|
@ -543,6 +573,53 @@ public class ComputerPlayer extends PlayerImpl implements Player {
|
|||
//if (!target.isRequired())
|
||||
return false;
|
||||
}
|
||||
if (target.getOriginalTarget() instanceof TargetAnyTarget) {
|
||||
List<Permanent> targets;
|
||||
TargetAnyTarget t = ((TargetAnyTarget) target);
|
||||
if (outcome.isGood()) {
|
||||
targets = threats(abilityControllerId, source.getSourceId(), ((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), game, target.getTargets());
|
||||
} else {
|
||||
targets = threats(randomOpponentId, source.getSourceId(), ((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), game, target.getTargets());
|
||||
}
|
||||
|
||||
if (targets.isEmpty()) {
|
||||
if (outcome.isGood()) {
|
||||
if (target.canTarget(getId(), abilityControllerId, source, game)) {
|
||||
target.addTarget(abilityControllerId, source, game);
|
||||
return true;
|
||||
}
|
||||
} else if (target.canTarget(getId(), randomOpponentId, source, game)) {
|
||||
target.addTarget(randomOpponentId, source, game);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (targets.isEmpty() && target.isRequired(source)) {
|
||||
targets = game.getBattlefield().getActivePermanents(((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), playerId, game);
|
||||
}
|
||||
for (Permanent permanent : targets) {
|
||||
List<UUID> alreadyTargetted = target.getTargets();
|
||||
if (t.canTarget(abilityControllerId, permanent.getId(), source, game)) {
|
||||
if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) {
|
||||
target.addTarget(permanent.getId(), source, game);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (outcome.isGood()) {
|
||||
if (target.canTarget(getId(), abilityControllerId, source, game)) {
|
||||
target.addTarget(abilityControllerId, source, game);
|
||||
return true;
|
||||
}
|
||||
} else if (target.canTarget(getId(), randomOpponentId, source, game)) {
|
||||
target.addTarget(randomOpponentId, source, game);
|
||||
return true;
|
||||
}
|
||||
|
||||
//if (!target.isRequired())
|
||||
return false;
|
||||
}
|
||||
if (target.getOriginalTarget() instanceof TargetPermanentOrPlayer) {
|
||||
List<Permanent> targets;
|
||||
TargetPermanentOrPlayer t = ((TargetPermanentOrPlayer) target);
|
||||
|
@ -600,7 +677,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
|
|||
}
|
||||
|
||||
if (targets.isEmpty() && target.isRequired(source)) {
|
||||
targets = game.getBattlefield().getActivePermanents(((TargetPlayerOrPlaneswalker) t.getFilter()).getPlaneswalkerFilter(), playerId, game);
|
||||
targets = game.getBattlefield().getActivePermanents(((TargetPlayerOrPlaneswalker) t.getFilter()).getFilterPermanent(), playerId, game);
|
||||
}
|
||||
for (Permanent permanent : targets) {
|
||||
List<UUID> alreadyTargetted = target.getTargets();
|
||||
|
|
|
@ -82,7 +82,7 @@ public class CollectiveDefiance extends CardImpl {
|
|||
// Collective Defiance deals 3 damage to target opponent.
|
||||
mode = new Mode();
|
||||
effect = new DamageTargetEffect(3);
|
||||
effect.setText("{this} deals 3 damage to target opponent");
|
||||
effect.setText("{this} deals 3 damage to target opponent or planeswalker");
|
||||
mode.getEffects().add(effect);
|
||||
mode.getTargets().add(new TargetOpponentOrPlaneswalker());
|
||||
this.getSpellAbility().addMode(mode);
|
||||
|
|
|
@ -88,7 +88,7 @@ public class ChampionTest extends CardTestPlayerBase {
|
|||
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Crafter");
|
||||
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {source} deals 3 damage to target creature or player.", "Lightning Crafter");
|
||||
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {source} deals 3 damage to ", "Lightning Crafter");
|
||||
|
||||
setStopAt(3, PhaseStep.BEGIN_COMBAT);
|
||||
execute();
|
||||
|
|
|
@ -29,6 +29,7 @@ package org.mage.test.cards.abilities.keywords;
|
|||
|
||||
import mage.constants.PhaseStep;
|
||||
import mage.constants.Zone;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
|
@ -61,6 +62,7 @@ public class EscalateTest extends CardTestPlayerBase {
|
|||
assertGraveyardCount(playerA, "Savage Alliance", 1);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testGaddockTeegInteraction_ThreeCMC_OneMode() {
|
||||
|
||||
|
@ -89,6 +91,7 @@ public class EscalateTest extends CardTestPlayerBase {
|
|||
|
||||
// Reported bug: Escalate CMC is not calculated correctly when more than 1 mode chosen
|
||||
// With 1 extra mode, the casting cost is {2}{R}{R} but the CMC should still be 3
|
||||
@Ignore
|
||||
@Test
|
||||
public void testGaddockTeegInteraction_ThreeCMC_TwoModes() {
|
||||
|
||||
|
@ -115,10 +118,11 @@ public class EscalateTest extends CardTestPlayerBase {
|
|||
assertGraveyardCount(playerB, "Gaddock Teeg", 1);
|
||||
assertLife(playerB, 17);
|
||||
}
|
||||
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testSpellQuellerInteraction_ThreeCMC_ThreeModes() {
|
||||
|
||||
|
||||
// {1}{W}{U} Flash Flying 2/3 Spirit
|
||||
// When Spell Queller enters the battlefield, exile target spell with converted mana cost 4 or less.
|
||||
// When Spell Queller leaves the battlefield, the exiled card's owner may cast that card without paying its mana cost.
|
||||
|
@ -126,7 +130,7 @@ public class EscalateTest extends CardTestPlayerBase {
|
|||
addCard(Zone.BATTLEFIELD, playerB, "Wall of Omens"); // {1}{W} 0/4
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Plains", 1);
|
||||
|
||||
|
||||
// Escalate {1} (Pay this cost for each mode chosen beyond the first.)
|
||||
// Choose one or more —
|
||||
// * Target player discards all the cards in their hand, then draws that many cards.
|
||||
|
@ -134,24 +138,24 @@ public class EscalateTest extends CardTestPlayerBase {
|
|||
// * Collective Defiance deals 3 damage to target opponent.
|
||||
addCard(Zone.HAND, playerA, "Collective Defiance"); // {1}{R}{R} sorcery
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
|
||||
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Collective Defiance", "mode=2Wall of Omens");
|
||||
setModeChoice(playerA, "1"); // opponent discards hand and draws that many
|
||||
setModeChoice(playerA, "2"); // deal 4 dmg to target creature (Wall of Omens)
|
||||
setModeChoice(playerA, "3"); // deal 3 dmg to opponent
|
||||
addTarget(playerA, playerB); // mode 1
|
||||
addTarget(playerA, playerB); // mode 3
|
||||
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Spell Queller");
|
||||
addTarget(playerB, "Collective Defiance");
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
execute();
|
||||
|
||||
|
||||
assertPermanentCount(playerB, "Spell Queller", 1);
|
||||
assertHandCount(playerA, "Collective Defiance", 0);
|
||||
assertExileCount("Collective Defiance", 1);
|
||||
assertGraveyardCount(playerA, "Collective Defiance", 0);
|
||||
assertPermanentCount(playerB, "Wall of Omens", 1);
|
||||
assertPermanentCount(playerB, "Wall of Omens", 1);
|
||||
assertLife(playerA, 20);
|
||||
assertLife(playerB, 20);
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ package org.mage.test.cards.abilities.keywords;
|
|||
import mage.abilities.keyword.IntimidateAbility;
|
||||
import mage.constants.PhaseStep;
|
||||
import mage.constants.Zone;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
|
@ -119,6 +120,7 @@ public class LandfallTest extends CardTestPlayerBase {
|
|||
* Fang. It only dealt 1 damage to me, where it should've dealt 3, because
|
||||
* my opponent had played a land.
|
||||
*/
|
||||
@Ignore
|
||||
@Test
|
||||
public void testSearingBlaze() {
|
||||
// Searing Blaze deals 1 damage to target player and 1 damage to target creature that player controls.
|
||||
|
|
|
@ -13,6 +13,7 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
|||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import org.junit.Ignore;
|
||||
|
||||
/**
|
||||
* @author noxx
|
||||
|
@ -137,6 +138,7 @@ public class PhantasmalImageTest extends CardTestPlayerBase {
|
|||
* this creature becomes the target of a spell or ability, sacrifice it"
|
||||
*/
|
||||
@Test
|
||||
@Ignore
|
||||
public void testCopyAlreadyTransformed() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest", 5);
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
|
||||
|
|
|
@ -146,7 +146,7 @@ public class CastFromHandWithoutPayingManaCostTest extends CardTestPlayerBase {
|
|||
|
||||
addCard(Zone.HAND, playerA, "Shrapnel Blast", 1);
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shrapnel Blast", "Ornithopter");
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shrapnel Blast");
|
||||
setChoice(playerA, "Yes");
|
||||
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
|
|
|
@ -2,6 +2,7 @@ package org.mage.test.cards.single;
|
|||
|
||||
import mage.constants.PhaseStep;
|
||||
import mage.constants.Zone;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
|
@ -12,27 +13,21 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
|||
public class HuntmasterOfTheFellsTest extends CardTestPlayerBase {
|
||||
|
||||
/**
|
||||
* Huntmaster of the Fells
|
||||
* Creature — Human Werewolf 2/2, 2RG (4)
|
||||
* Whenever this creature enters the battlefield or transforms into Huntmaster
|
||||
* of the Fells, put a 2/2 green Wolf creature token onto the battlefield and
|
||||
* you gain 2 life.
|
||||
* At the beginning of each upkeep, if no spells were cast last turn, transform
|
||||
* Huntmaster of the Fells.
|
||||
*
|
||||
* Huntmaster of the Fells Creature — Human Werewolf 2/2, 2RG (4) Whenever
|
||||
* this creature enters the battlefield or transforms into Huntmaster of the
|
||||
* Fells, put a 2/2 green Wolf creature token onto the battlefield and you
|
||||
* gain 2 life. At the beginning of each upkeep, if no spells were cast last
|
||||
* turn, transform Huntmaster of the Fells.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Ravager of the Fells
|
||||
* Creature — Werewolf 4/4
|
||||
* Trample
|
||||
* Whenever this creature transforms into Ravager of the Fells, it deals 2
|
||||
* damage to target opponent and 2 damage to up to one target creature that
|
||||
* player controls.
|
||||
* At the beginning of each upkeep, if a player cast two or more spells last
|
||||
* turn, transform Ravager of the Fells.
|
||||
/**
|
||||
* Ravager of the Fells Creature — Werewolf 4/4 Trample Whenever this
|
||||
* creature transforms into Ravager of the Fells, it deals 2 damage to
|
||||
* target opponent and 2 damage to up to one target creature that player
|
||||
* controls. At the beginning of each upkeep, if a player cast two or more
|
||||
* spells last turn, transform Ravager of the Fells.
|
||||
*/
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testCard() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
|
||||
|
@ -51,8 +46,10 @@ public class HuntmasterOfTheFellsTest extends CardTestPlayerBase {
|
|||
}
|
||||
|
||||
/**
|
||||
* Tests first trigger happens both on enter battlefield and transform events
|
||||
* Tests first trigger happens both on enter battlefield and transform
|
||||
* events
|
||||
*/
|
||||
@Ignore
|
||||
@Test
|
||||
public void testCard2() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
|
||||
|
|
|
@ -29,6 +29,7 @@ package org.mage.test.cards.single.bfz;
|
|||
|
||||
import mage.constants.PhaseStep;
|
||||
import mage.constants.Zone;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
|
@ -45,6 +46,7 @@ public class BrutalExpulsionTest extends CardTestPlayerBase {
|
|||
* Expulsion sends Gideon to exile. However, in game Gideon went to
|
||||
* graveyard.
|
||||
*/
|
||||
@Ignore
|
||||
@Test
|
||||
public void testPlaneswalkerExile() {
|
||||
// Choose one or both
|
||||
|
@ -59,13 +61,12 @@ public class BrutalExpulsionTest extends CardTestPlayerBase {
|
|||
// Planeswalker with 4 loyalty.
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Gideon, Ally of Zendikar");
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Brutal Expulsion", playerB);
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Brutal Expulsion");
|
||||
setModeChoice(playerA, "2");
|
||||
setModeChoice(playerA, null);
|
||||
setChoice(playerA, "Yes"); // Redirect to planeswalker
|
||||
addTarget(playerA, "Gideon, Ally of Zendikar");
|
||||
|
||||
castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Shock", playerB);
|
||||
setChoice(playerA, "Yes"); // Redirect to planeswalker
|
||||
castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Shock", "Gideon, Ally of Zendikar");
|
||||
|
||||
setStopAt(1, PhaseStep.END_COMBAT);
|
||||
execute();
|
||||
|
|
|
@ -144,7 +144,7 @@ public class BurrentonForgeTenderTest extends CardTestPlayerBase {
|
|||
activateAbility(2, PhaseStep.END_COMBAT, playerA, "Sacrifice {this}: Prevent all damage a red source of your choice would deal this turn.");
|
||||
playerA.addChoice("Mogg Fanatic");
|
||||
|
||||
activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Sacrifice {this}: {source} deals 1 damage to target creature or player.","Soldier of the Pantheon");
|
||||
activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Sacrifice {this}: {source} deals 1 damage to ","Soldier of the Pantheon");
|
||||
|
||||
setStopAt(2, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
|
|
@ -28,7 +28,7 @@ public class DiesExiledTest extends CardTestPlayerBase {
|
|||
addCard(Zone.BATTLEFIELD, playerB, "Sejiri Merfolk");
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Kumano's Blessing", "Prodigal Pyromancer");
|
||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{T}: {source} deals 1 damage to target creature or player.", "Sejiri Merfolk");
|
||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{T}: {source} deals 1 damage to", "Sejiri Merfolk");
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
@ -41,7 +41,7 @@ public class DiesExiledTest extends CardTestPlayerBase {
|
|||
/*
|
||||
* Frostwielder
|
||||
* Creature — Human Shaman 1/2, 2RR (4)
|
||||
* {T}: Frostwielder deals 1 damage to target creature or player.
|
||||
* {T}: Frostwielder deals 1 damage to
|
||||
* If a creature dealt damage by Frostwielder this turn would die, exile it instead.
|
||||
*
|
||||
*/
|
||||
|
@ -53,7 +53,7 @@ public class DiesExiledTest extends CardTestPlayerBase {
|
|||
addCard(Zone.BATTLEFIELD, playerA, "Frostwielder");
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Sejiri Merfolk");
|
||||
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {source} deals 1 damage to target creature or player.", "Sejiri Merfolk");
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {source} deals 1 damage to ", "Sejiri Merfolk");
|
||||
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
execute();
|
||||
|
@ -66,7 +66,7 @@ public class DiesExiledTest extends CardTestPlayerBase {
|
|||
/*
|
||||
* Kumano, Master Yamabushi
|
||||
* Legendary Creature — Human Shaman 4/4, 3RR (5)
|
||||
* {1}{R}: Kumano, Master Yamabushi deals 1 damage to target creature or player.
|
||||
* {1}{R}: Kumano, Master Yamabushi deals 1 damage to
|
||||
* If a creature dealt damage by Kumano this turn would die, exile it instead.
|
||||
*
|
||||
*/
|
||||
|
@ -78,7 +78,7 @@ public class DiesExiledTest extends CardTestPlayerBase {
|
|||
addCard(Zone.BATTLEFIELD, playerA, "Kumano, Master Yamabushi");
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Sejiri Merfolk");
|
||||
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{R}: {source} deals 1 damage to target creature or player.", "Sejiri Merfolk");
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{R}: {source} deals 1 damage to ", "Sejiri Merfolk");
|
||||
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
execute();
|
||||
|
@ -91,7 +91,7 @@ public class DiesExiledTest extends CardTestPlayerBase {
|
|||
/*
|
||||
* Yamabushi's Flame
|
||||
* Instant, 2R (3)
|
||||
* Yamabushi's Flame deals 3 damage to target creature or player. If a
|
||||
* Yamabushi's Flame deals 3 damage to If a
|
||||
* creature dealt damage this way would die this turn, exile it instead.
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -10,12 +10,13 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
|||
* Created by IGOUDT on 30-3-2017.
|
||||
*/
|
||||
public class KiraGreatGlassSpinnerTest extends CardTestPlayerBase {
|
||||
|
||||
/*
|
||||
Kira, Great Glass-Spinner {1}{U}{U}
|
||||
Legendary Creature - Spirit 2/2
|
||||
Flying
|
||||
Creatures you control have "Whenever this creature becomes the target of a spell or ability for the first time each turn, counter that spell or ability."
|
||||
*/
|
||||
*/
|
||||
private final String kira = "Kira, Great Glass-Spinner";
|
||||
private final String ugin = "Ugin, the Spirit Dragon";
|
||||
|
||||
|
@ -24,9 +25,8 @@ public class KiraGreatGlassSpinnerTest extends CardTestPlayerBase {
|
|||
|
||||
addCard(Zone.BATTLEFIELD, playerA, ugin); // starts with 7 Loyality counters
|
||||
|
||||
|
||||
addCard(Zone.BATTLEFIELD, playerA, kira);
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage to target creature or player.", kira); // Ugin ability
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage", kira); // Ugin ability
|
||||
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
execute();
|
||||
|
@ -43,9 +43,8 @@ public class KiraGreatGlassSpinnerTest extends CardTestPlayerBase {
|
|||
addCard(Zone.BATTLEFIELD, playerA, "Island", 4);
|
||||
addCard(Zone.HAND, playerA, "Unsummon", 1);
|
||||
|
||||
|
||||
addCard(Zone.BATTLEFIELD, playerA, kira);
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage to target creature or player.", kira); // Ugin ability
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage", kira); // Ugin ability
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Unsummon", kira);
|
||||
|
||||
|
@ -63,9 +62,8 @@ public class KiraGreatGlassSpinnerTest extends CardTestPlayerBase {
|
|||
addCard(Zone.BATTLEFIELD, playerA, ugin); // starts with 7 Loyality counters
|
||||
|
||||
addCard(Zone.BATTLEFIELD, playerA, kira);
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage to target creature or player.", kira); // Ugin ability
|
||||
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage to target creature or player.", kira); // Ugin ability
|
||||
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage to", kira); // Ugin ability
|
||||
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage to", kira); // Ugin ability
|
||||
|
||||
setStopAt(3, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
@ -74,5 +72,4 @@ public class KiraGreatGlassSpinnerTest extends CardTestPlayerBase {
|
|||
assertCounterCount(playerA, ugin, CounterType.LOYALTY, 11);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
|||
* @author BetaSteward
|
||||
*/
|
||||
public class UnscytheKillerOfKingsTest extends CardTestPlayerBase {
|
||||
|
||||
/*
|
||||
* Unscythe, Killer of Kings
|
||||
* Legendary Artifact — Equipment, UBBR (4)
|
||||
|
@ -19,8 +20,8 @@ public class UnscytheKillerOfKingsTest extends CardTestPlayerBase {
|
|||
* the battlefield.
|
||||
* Equip {2}
|
||||
*
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
// test that when creature damaged by equipped creature dies a Zombie token is created
|
||||
@Test
|
||||
public void testDamagedCreatureDies() {
|
||||
|
@ -28,17 +29,17 @@ public class UnscytheKillerOfKingsTest extends CardTestPlayerBase {
|
|||
addCard(Zone.BATTLEFIELD, playerA, "Unscythe, Killer of Kings");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Prodigal Pyromancer");
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Sejiri Merfolk");
|
||||
|
||||
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip", "Prodigal Pyromancer");
|
||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{T}: {source} deals 1 damage to target creature or player.", "Sejiri Merfolk");
|
||||
|
||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{T}: {source} deals 1 damage to ", "Sejiri Merfolk");
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
|
||||
assertPermanentCount(playerB, "Sejiri Merfolk", 0);
|
||||
assertPermanentCount(playerA, "Zombie", 1);
|
||||
assertExileCount("Sejiri Merfolk", 1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// test that when creature damaged by equipped creature dies a Zombie token is created
|
||||
|
@ -46,22 +47,22 @@ public class UnscytheKillerOfKingsTest extends CardTestPlayerBase {
|
|||
public void testDamagedCreatureDiesAfterEquipped() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Unscythe, Killer of Kings");
|
||||
// {T}: Prodigal Pyromancer deals 1 damage to target creature or player.
|
||||
// {T}: Prodigal Pyromancer deals 1 damage to
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Prodigal Pyromancer");
|
||||
addCard(Zone.HAND, playerA, "Lightning Bolt");
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Craw Wurm");
|
||||
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {source} deals 1 damage to target creature or player.", "Craw Wurm");
|
||||
|
||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {source} deals 1 damage to ", "Craw Wurm");
|
||||
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Equip", "Prodigal Pyromancer");
|
||||
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", "Craw Wurm", "Equip", StackClause.WHILE_NOT_ON_STACK);
|
||||
|
||||
|
||||
setStopAt(1, PhaseStep.END_TURN);
|
||||
execute();
|
||||
|
||||
|
||||
assertPermanentCount(playerB, "Craw Wurm", 0);
|
||||
assertPermanentCount(playerA, "Zombie", 1);
|
||||
assertExileCount("Craw Wurm", 1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -913,7 +913,10 @@ public class TestPlayer implements Player {
|
|||
if (target.getTargetController() != null && target.getAbilityController() != null) {
|
||||
abilityControllerId = target.getAbilityController();
|
||||
}
|
||||
if (target instanceof TargetPlayer || target instanceof TargetAnyTarget) {
|
||||
if (target instanceof TargetPlayer
|
||||
|| target instanceof TargetAnyTarget
|
||||
|| target instanceof TargetCreatureOrPlayer
|
||||
|| target instanceof TargetPermanentOrPlayer) {
|
||||
for (String targetDefinition : targets) {
|
||||
if (targetDefinition.startsWith("targetPlayer=")) {
|
||||
String playerName = targetDefinition.substring(targetDefinition.indexOf("targetPlayer=") + 13);
|
||||
|
@ -929,7 +932,10 @@ public class TestPlayer implements Player {
|
|||
}
|
||||
|
||||
}
|
||||
if ((target instanceof TargetPermanent) || (target instanceof TargetPermanentOrPlayer) || (target instanceof TargetAnyTarget)) {
|
||||
if ((target instanceof TargetPermanent)
|
||||
|| (target instanceof TargetPermanentOrPlayer)
|
||||
|| (target instanceof TargetAnyTarget)
|
||||
|| (target instanceof TargetCreatureOrPlayer)) {
|
||||
for (String targetDefinition : targets) {
|
||||
String[] targetList = targetDefinition.split("\\^");
|
||||
boolean targetFound = false;
|
||||
|
@ -950,6 +956,12 @@ public class TestPlayer implements Player {
|
|||
if (filter instanceof FilterCreatureOrPlayer) {
|
||||
filter = ((FilterCreatureOrPlayer) filter).getCreatureFilter();
|
||||
}
|
||||
if (filter instanceof FilterCreaturePlayerOrPlaneswalker) {
|
||||
filter = ((FilterCreaturePlayerOrPlaneswalker) filter).getCreatureFilter();
|
||||
}
|
||||
if (filter instanceof TargetPermanentOrPlayer) {
|
||||
filter = ((TargetPermanentOrPlayer) filter).getFilterPermanent();
|
||||
}
|
||||
for (Permanent permanent : game.getBattlefield().getAllActivePermanents((FilterPermanent) filter, game)) {
|
||||
if (permanent.getName().equals(targetName) || (permanent.getName() + '-' + permanent.getExpansionSetCode()).equals(targetName)) {
|
||||
if (target.canTarget(abilityControllerId, permanent.getId(), source, game) && !target.getTargets().contains(permanent.getId())) {
|
||||
|
|
|
@ -3,21 +3,18 @@ package mage.filter.common;
|
|||
import java.util.UUID;
|
||||
|
||||
import mage.MageItem;
|
||||
import mage.filter.FilterImpl;
|
||||
import mage.filter.FilterInPlay;
|
||||
import mage.filter.FilterPlayer;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
|
||||
/**
|
||||
* @author JRHerlehy
|
||||
* Created on 4/8/18.
|
||||
* @author JRHerlehy Created on 4/8/18.
|
||||
*/
|
||||
public class FilterCreaturePlayerOrPlaneswalker extends FilterImpl<MageItem> implements FilterInPlay<MageItem> {
|
||||
public class FilterCreaturePlayerOrPlaneswalker extends FilterPermanentOrPlayer {
|
||||
|
||||
protected FilterCreaturePermanent creatureFilter;
|
||||
protected FilterPlaneswalkerPermanent planeswalkerFilter;
|
||||
protected final FilterPlayer playerFilter;
|
||||
|
||||
public FilterCreaturePlayerOrPlaneswalker() {
|
||||
this("any target");
|
||||
|
@ -26,29 +23,22 @@ public class FilterCreaturePlayerOrPlaneswalker extends FilterImpl<MageItem> imp
|
|||
public FilterCreaturePlayerOrPlaneswalker(String name) {
|
||||
super(name);
|
||||
creatureFilter = new FilterCreaturePermanent();
|
||||
playerFilter = new FilterPlayer();
|
||||
planeswalkerFilter = new FilterPlaneswalkerPermanent();
|
||||
}
|
||||
|
||||
public FilterCreaturePlayerOrPlaneswalker(final FilterCreaturePlayerOrPlaneswalker filter) {
|
||||
super(filter);
|
||||
this.creatureFilter = filter.creatureFilter.copy();
|
||||
this.playerFilter = filter.playerFilter.copy();
|
||||
this.planeswalkerFilter = filter.planeswalkerFilter.copy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkObjectClass(Object object) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean match(MageItem o, Game game) {
|
||||
if (o instanceof Player) {
|
||||
return playerFilter.match((Player) o, game);
|
||||
} else if (o instanceof Permanent) {
|
||||
return creatureFilter.match((Permanent) o, game) ||
|
||||
planeswalkerFilter.match((Permanent) o, game);
|
||||
return creatureFilter.match((Permanent) o, game)
|
||||
|| planeswalkerFilter.match((Permanent) o, game);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -58,8 +48,8 @@ public class FilterCreaturePlayerOrPlaneswalker extends FilterImpl<MageItem> imp
|
|||
if (o instanceof Player) {
|
||||
return playerFilter.match((Player) o, sourceId, playerId, game);
|
||||
} else if (o instanceof Permanent) {
|
||||
return creatureFilter.match((Permanent) o, sourceId, playerId, game) ||
|
||||
planeswalkerFilter.match((Permanent) o, sourceId, playerId, game);
|
||||
return creatureFilter.match((Permanent) o, sourceId, playerId, game)
|
||||
|| planeswalkerFilter.match((Permanent) o, sourceId, playerId, game);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -25,4 +25,9 @@ public class FilterOpponentOrPlaneswalker extends FilterPermanentOrPlayer {
|
|||
public FilterOpponentOrPlaneswalker(final FilterOpponentOrPlaneswalker filter) {
|
||||
super(filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FilterOpponentOrPlaneswalker copy() {
|
||||
return new FilterOpponentOrPlaneswalker(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,4 +25,9 @@ public class FilterPlayerOrPlaneswalker extends FilterPermanentOrPlayer {
|
|||
public FilterPlayerOrPlaneswalker(final FilterPlayerOrPlaneswalker filter) {
|
||||
super(filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FilterPlayerOrPlaneswalker copy() {
|
||||
return new FilterPlayerOrPlaneswalker(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ import mage.filter.common.FilterOpponentOrPlaneswalker;
|
|||
public class TargetOpponentOrPlaneswalker extends TargetPermanentOrPlayer {
|
||||
|
||||
public TargetOpponentOrPlaneswalker() {
|
||||
this(1, 1, new FilterOpponentOrPlaneswalker(), false);
|
||||
this(1, 1, new FilterOpponentOrPlaneswalker("opponent or planeswalker"), false);
|
||||
}
|
||||
|
||||
public TargetOpponentOrPlaneswalker(int numTargets) {
|
||||
|
@ -32,4 +32,9 @@ public class TargetOpponentOrPlaneswalker extends TargetPermanentOrPlayer {
|
|||
public TargetOpponentOrPlaneswalker(final TargetOpponentOrPlaneswalker target) {
|
||||
super(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TargetOpponentOrPlaneswalker copy() {
|
||||
return new TargetOpponentOrPlaneswalker(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,14 +5,6 @@
|
|||
*/
|
||||
package mage.target.common;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.Filter;
|
||||
import mage.filter.common.FilterPlaneswalkerPermanent;
|
||||
import mage.filter.common.FilterPlayerOrPlaneswalker;
|
||||
|
||||
/**
|
||||
|
@ -22,7 +14,7 @@ import mage.filter.common.FilterPlayerOrPlaneswalker;
|
|||
public class TargetPlayerOrPlaneswalker extends TargetPermanentOrPlayer {
|
||||
|
||||
public TargetPlayerOrPlaneswalker() {
|
||||
this(1, 1, new FilterPlayerOrPlaneswalker(), false);
|
||||
this(1, 1, new FilterPlayerOrPlaneswalker("player or planeswalker"), false);
|
||||
}
|
||||
|
||||
public TargetPlayerOrPlaneswalker(int numTargets) {
|
||||
|
@ -41,10 +33,6 @@ public class TargetPlayerOrPlaneswalker extends TargetPermanentOrPlayer {
|
|||
super(target);
|
||||
}
|
||||
|
||||
public FilterPlaneswalkerPermanent getPlaneswalkerFilter() {
|
||||
return filter.getPlaneswalkerFilter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TargetPlayerOrPlaneswalker copy() {
|
||||
return new TargetPlayerOrPlaneswalker(this);
|
||||
|
|
Loading…
Add table
Reference in a new issue