mirror of
https://github.com/correl/mage.git
synced 2024-11-28 11:09:54 +00:00
[ORI] Added 6 black cards.
This commit is contained in:
parent
0ee0ba3a95
commit
123d1e4ec6
20 changed files with 1005 additions and 232 deletions
|
@ -1525,7 +1525,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
|
|||
return modes.getMode();
|
||||
}
|
||||
//TODO: improve this;
|
||||
for (Mode mode : modes.values()) {
|
||||
for (Mode mode : modes.getAvailableModes(source, game)) {
|
||||
if (!modes.getSelectedModes().contains(mode.getId()) // select only modes not already selected
|
||||
&& mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { // and where targets are available
|
||||
return mode;
|
||||
|
|
|
@ -409,12 +409,12 @@ public class SimulatedPlayerMCTS extends MCTSPlayer {
|
|||
@Override
|
||||
public Mode chooseMode(Modes modes, Ability source, Game game) {
|
||||
if (this.isHuman()) {
|
||||
Iterator<Mode> it = modes.values().iterator();
|
||||
Iterator<Mode> it = modes.getAvailableModes(source, game).iterator();
|
||||
Mode mode = it.next();
|
||||
if (modes.size() == 1) {
|
||||
return mode;
|
||||
}
|
||||
int modeNum = rnd.nextInt(modes.values().size());
|
||||
int modeNum = rnd.nextInt(modes.getAvailableModes(source, game).size());
|
||||
for (int i = 0; i < modeNum; i++) {
|
||||
mode = it.next();
|
||||
}
|
||||
|
|
|
@ -57,6 +57,7 @@ import mage.cards.Cards;
|
|||
import mage.cards.decks.Deck;
|
||||
import mage.choices.Choice;
|
||||
import mage.choices.ChoiceImpl;
|
||||
import mage.constants.AbilityType;
|
||||
import mage.constants.Constants;
|
||||
import mage.constants.ManaType;
|
||||
import mage.constants.Outcome;
|
||||
|
@ -1139,7 +1140,7 @@ public class HumanPlayer extends PlayerImpl {
|
|||
if (modes.size() > 1) {
|
||||
MageObject obj = game.getObject(source.getSourceId());
|
||||
Map<UUID, String> modeMap = new LinkedHashMap<>();
|
||||
for (Mode mode : modes.values()) {
|
||||
for (Mode mode : modes.getAvailableModes(source, game)) {
|
||||
if (!modes.getSelectedModes().contains(mode.getId()) // show only modes not already selected
|
||||
&& mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { // and where targets are available
|
||||
String modeText = mode.getEffects().getText(mode);
|
||||
|
@ -1150,14 +1151,23 @@ public class HumanPlayer extends PlayerImpl {
|
|||
}
|
||||
}
|
||||
if (modeMap.size() > 0) {
|
||||
game.fireGetModeEvent(playerId, "Choose Mode", modeMap);
|
||||
waitForResponse(game);
|
||||
if (response.getUUID() != null) {
|
||||
for (Mode mode : modes.values()) {
|
||||
if (mode.getId().equals(response.getUUID())) {
|
||||
return mode;
|
||||
boolean done = false;
|
||||
while (!done) {
|
||||
game.fireGetModeEvent(playerId, "Choose Mode", modeMap);
|
||||
waitForResponse(game);
|
||||
if (response.getUUID() != null) {
|
||||
for (Mode mode : modes.getAvailableModes(source, game)) {
|
||||
if (mode.getId().equals(response.getUUID())) {
|
||||
return mode;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!source.getAbilityType().equals(AbilityType.TRIGGERED)) {
|
||||
done = true;
|
||||
}
|
||||
if (!isInGame()) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
|
|
@ -28,11 +28,11 @@
|
|||
package mage.sets.magic2015;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect;
|
||||
import mage.abilities.keyword.ConvokeAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.repository.CardRepository;
|
||||
import mage.choices.Choice;
|
||||
|
@ -54,7 +54,6 @@ public class StainTheMind extends CardImpl {
|
|||
super(ownerId, 117, "Stain the Mind", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{4}{B}");
|
||||
this.expansionSetCode = "M15";
|
||||
|
||||
|
||||
// Convoke
|
||||
this.addAbility(new ConvokeAbility());
|
||||
// Name a nonland card. Search target player's graveyard, hand, and library for any number of card's with that name and exile them. Then that player shuffles his or her library.
|
||||
|
@ -75,7 +74,7 @@ public class StainTheMind extends CardImpl {
|
|||
class StainTheMindEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExileEffect {
|
||||
|
||||
public StainTheMindEffect() {
|
||||
super(true, "target player's","any number of cards with that name");
|
||||
super(true, "target player's", "any number of cards with that name");
|
||||
}
|
||||
|
||||
public StainTheMindEffect(final StainTheMindEffect effect) {
|
||||
|
@ -99,9 +98,9 @@ class StainTheMindEffect extends SearchTargetGraveyardHandLibraryForCardNameAndE
|
|||
}
|
||||
String cardName;
|
||||
cardName = cardChoice.getChoice();
|
||||
Card card = game.getCard(source.getSourceId());
|
||||
if (card != null) {
|
||||
game.informPlayers(card.getName()+"named card: [" + cardName + "]");
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (sourceObject != null) {
|
||||
game.informPlayers(sourceObject.getName() + " named card: [" + cardName + "]");
|
||||
}
|
||||
|
||||
super.applySearchAndExile(game, source, cardName, player.getId());
|
||||
|
|
70
Mage.Sets/src/mage/sets/magicorigins/DarkPetition.java
Normal file
70
Mage.Sets/src/mage/sets/magicorigins/DarkPetition.java
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package mage.sets.magicorigins;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.Mana;
|
||||
import mage.abilities.condition.common.SpellMasteryCondition;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Rarity;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class DarkPetition extends CardImpl {
|
||||
|
||||
public DarkPetition(UUID ownerId) {
|
||||
super(ownerId, 90, "Dark Petition", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{B}{B}");
|
||||
this.expansionSetCode = "ORI";
|
||||
|
||||
// Search your library for a card and put that card into your hand. Then shuffle your library.
|
||||
this.getSpellAbility().addEffect(new SearchLibraryPutInHandEffect(new TargetCardInLibrary()));
|
||||
|
||||
// <i>Spell mastery</i> - If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B} to your mana pool.
|
||||
Effect effect = new ConditionalOneShotEffect(new AddManaToManaPoolSourceControllerEffect(Mana.BlackMana(3)),
|
||||
SpellMasteryCondition.getInstance(), "<br><i>Spell mastery</i> - If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B} to your mana pool");
|
||||
this.getSpellAbility().addEffect(effect);
|
||||
|
||||
}
|
||||
|
||||
public DarkPetition(final DarkPetition card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DarkPetition copy() {
|
||||
return new DarkPetition(this);
|
||||
}
|
||||
}
|
94
Mage.Sets/src/mage/sets/magicorigins/DemonicPact.java
Normal file
94
Mage.Sets/src/mage/sets/magicorigins/DemonicPact.java
Normal file
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package mage.sets.magicorigins;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.LoseGameSourceControllerEffect;
|
||||
import mage.abilities.effects.common.discard.DiscardTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.TargetController;
|
||||
import mage.target.common.TargetCreatureOrPlayer;
|
||||
import mage.target.common.TargetOpponent;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class DemonicPact extends CardImpl {
|
||||
|
||||
public DemonicPact(UUID ownerId) {
|
||||
super(ownerId, 92, "Demonic Pact", Rarity.MYTHIC, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}");
|
||||
this.expansionSetCode = "ORI";
|
||||
|
||||
// At the beginning of your upkeep, choose one that hasn't been chosen
|
||||
// - Demonic Pact deals 4 damage to target creature or player and you gain 4 life;
|
||||
Ability ability = new BeginningOfUpkeepTriggeredAbility(new DamageTargetEffect(4), TargetController.YOU, false);
|
||||
ability.getModes().setEachModeOnlyOnce(true);
|
||||
ability.addTarget(new TargetCreatureOrPlayer());
|
||||
Effect effect = new GainLifeEffect(4);
|
||||
effect.setText("and you gain 4 life");
|
||||
ability.addEffect(effect);
|
||||
|
||||
// - Target opponent discards two cards
|
||||
Mode mode = new Mode();
|
||||
mode.getTargets().add(new TargetOpponent());
|
||||
mode.getEffects().add(new DiscardTargetEffect(2));
|
||||
ability.addMode(mode);
|
||||
|
||||
// - Draw two cards
|
||||
mode = new Mode();
|
||||
mode.getEffects().add(new DrawCardSourceControllerEffect(2));
|
||||
ability.addMode(mode);
|
||||
|
||||
// - You lose the game.
|
||||
mode = new Mode();
|
||||
mode.getEffects().add(new LoseGameSourceControllerEffect());
|
||||
ability.addMode(mode);
|
||||
|
||||
this.addAbility(ability);
|
||||
|
||||
}
|
||||
|
||||
public DemonicPact(final DemonicPact card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DemonicPact copy() {
|
||||
return new DemonicPact(this);
|
||||
}
|
||||
}
|
101
Mage.Sets/src/mage/sets/magicorigins/FuneralBladePredator.java
Normal file
101
Mage.Sets/src/mage/sets/magicorigins/FuneralBladePredator.java
Normal file
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package mage.sets.magicorigins;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Rarity;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class FuneralBladePredator extends CardImpl {
|
||||
|
||||
public FuneralBladePredator(UUID ownerId) {
|
||||
super(ownerId, 101, "Funeral-Blade Predator", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}");
|
||||
this.expansionSetCode = "ORI";
|
||||
this.subtype.add("Human");
|
||||
this.subtype.add("Warrior");
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// Deathtouch
|
||||
this.addAbility(DeathtouchAbility.getInstance());
|
||||
|
||||
// Whenever Funeral-Blade Predator deals combat damage to a player, that player loses life equal to the number of creature cards in your graveyard.
|
||||
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new FuneralBladePredatorEffect(), false, true));
|
||||
}
|
||||
|
||||
public FuneralBladePredator(final FuneralBladePredator card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FuneralBladePredator copy() {
|
||||
return new FuneralBladePredator(this);
|
||||
}
|
||||
}
|
||||
|
||||
class FuneralBladePredatorEffect extends OneShotEffect {
|
||||
|
||||
public FuneralBladePredatorEffect() {
|
||||
super(Outcome.LoseLife);
|
||||
this.staticText = "that player loses life equal to the number of creature cards in your graveyard";
|
||||
}
|
||||
|
||||
public FuneralBladePredatorEffect(final FuneralBladePredatorEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FuneralBladePredatorEffect copy() {
|
||||
return new FuneralBladePredatorEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (targetPlayer != null && controller != null) {
|
||||
targetPlayer.loseLife(controller.getGraveyard().count(new FilterCreatureCard(), game), game);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
135
Mage.Sets/src/mage/sets/magicorigins/GnarlrootTrapper.java
Normal file
135
Mage.Sets/src/mage/sets/magicorigins/GnarlrootTrapper.java
Normal file
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package mage.sets.magicorigins;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.ConditionalMana;
|
||||
import mage.MageInt;
|
||||
import mage.MageObject;
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.PayLifeCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.abilities.mana.ConditionalColoredManaAbility;
|
||||
import mage.abilities.mana.builder.ConditionalManaBuilder;
|
||||
import mage.abilities.mana.conditional.CreatureCastManaCondition;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.mageobject.SubtypePredicate;
|
||||
import mage.filter.predicate.permanent.AttackingPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class GnarlrootTrapper extends CardImpl {
|
||||
|
||||
private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("attacking ELf you control");
|
||||
|
||||
static {
|
||||
filter.add(new AttackingPredicate());
|
||||
filter.add(new SubtypePredicate("Elf"));
|
||||
}
|
||||
|
||||
public GnarlrootTrapper(UUID ownerId) {
|
||||
super(ownerId, 100, "Gnarlroot Trapper", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{B}");
|
||||
this.expansionSetCode = "ORI";
|
||||
this.subtype.add("Elf");
|
||||
this.subtype.add("Druid");
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
// {T}, Pay 1 life: Add {G} to your mana pool. Spend this mana only to cast an Elf creature spell.
|
||||
Ability ability = new ConditionalColoredManaAbility(new TapSourceCost(), Mana.GreenMana(1), new GnarlrootTrapperManaBuilder());
|
||||
ability.addCost(new PayLifeCost(1));
|
||||
this.addAbility(ability);
|
||||
|
||||
// {T}: Target attacking Elf you control gains deathtouch until end of turn.
|
||||
Effect effect = new GainAbilityTargetEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn);
|
||||
effect.setText("Target attacking Elf you control gains deathtouch until end of turn. <i>(Any amount of damage it deals to a creature is enough to destroy it.)</i>");
|
||||
ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost());
|
||||
ability.addTarget(new TargetControlledCreaturePermanent(filter));
|
||||
this.addAbility(ability);
|
||||
|
||||
}
|
||||
|
||||
public GnarlrootTrapper(final GnarlrootTrapper card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GnarlrootTrapper copy() {
|
||||
return new GnarlrootTrapper(this);
|
||||
}
|
||||
}
|
||||
|
||||
class GnarlrootTrapperManaBuilder extends ConditionalManaBuilder {
|
||||
|
||||
@Override
|
||||
public ConditionalMana build(Object... options) {
|
||||
return new GnarlrootTrapperConditionalMana(this.mana);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Spend this mana only to cast an Elf creature spell.";
|
||||
}
|
||||
}
|
||||
|
||||
class GnarlrootTrapperManaCondition extends CreatureCastManaCondition {
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
if (super.apply(game, source)) {
|
||||
MageObject object = game.getObject(source.getSourceId());
|
||||
if (object.hasSubtype("Elf")
|
||||
&& object.getCardType().contains(CardType.CREATURE)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class GnarlrootTrapperConditionalMana extends ConditionalMana {
|
||||
|
||||
public GnarlrootTrapperConditionalMana(Mana mana) {
|
||||
super(mana);
|
||||
addCondition(new GnarlrootTrapperManaCondition());
|
||||
}
|
||||
}
|
86
Mage.Sets/src/mage/sets/magicorigins/InfernalScarring.java
Normal file
86
Mage.Sets/src/mage/sets/magicorigins/InfernalScarring.java
Normal file
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package mage.sets.magicorigins;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DiesTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.AttachEffect;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||
import mage.abilities.keyword.EnchantAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.constants.AttachmentType;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.Zone;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class InfernalScarring extends CardImpl {
|
||||
|
||||
public InfernalScarring(UUID ownerId) {
|
||||
super(ownerId, 102, "Infernal Scarring", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
|
||||
this.expansionSetCode = "ORI";
|
||||
this.subtype.add("Aura");
|
||||
|
||||
// Enchant creature
|
||||
TargetPermanent auraTarget = new TargetCreaturePermanent();
|
||||
this.getSpellAbility().addTarget(auraTarget);
|
||||
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
|
||||
Ability ability = new EnchantAbility(auraTarget.getTargetName());
|
||||
this.addAbility(ability);
|
||||
|
||||
// Enchanted creature gets +2/+0 and has "When this creature dies, draw a card."
|
||||
Effect effect = new BoostEnchantedEffect(2, 0, Duration.WhileOnBattlefield);
|
||||
effect.setText("Enchanted creature gets +2/+0");
|
||||
ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect);
|
||||
effect = new GainAbilityAttachedEffect(new DiesTriggeredAbility(new DrawCardSourceControllerEffect(1)), AttachmentType.AURA, Duration.WhileOnBattlefield);
|
||||
effect.setText("and has \"When this creature dies, draw a card.\"");
|
||||
ability.addEffect(effect);
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
public InfernalScarring(final InfernalScarring card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InfernalScarring copy() {
|
||||
return new InfernalScarring(this);
|
||||
}
|
||||
}
|
122
Mage.Sets/src/mage/sets/magicorigins/InfiniteObliteration.java
Normal file
122
Mage.Sets/src/mage/sets/magicorigins/InfiniteObliteration.java
Normal file
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package mage.sets.magicorigins;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.repository.CardRepository;
|
||||
import mage.choices.Choice;
|
||||
import mage.choices.ChoiceImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Rarity;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetOpponent;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class InfiniteObliteration extends CardImpl {
|
||||
|
||||
public InfiniteObliteration(UUID ownerId) {
|
||||
super(ownerId, 103, "Infinite Obliteration", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{B}{B}");
|
||||
this.expansionSetCode = "ORI";
|
||||
|
||||
// Name a creature card. Search target opponent's graveyard, hand, and library
|
||||
// for any number of cards with that name and exile them. Then that player shuffles his or her library.
|
||||
this.getSpellAbility().addEffect(new InfiniteObliterationEffect());
|
||||
this.getSpellAbility().addTarget(new TargetOpponent());
|
||||
}
|
||||
|
||||
public InfiniteObliteration(final InfiniteObliteration card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InfiniteObliteration copy() {
|
||||
return new InfiniteObliteration(this);
|
||||
}
|
||||
}
|
||||
|
||||
class InfiniteObliterationEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExileEffect {
|
||||
|
||||
public InfiniteObliterationEffect() {
|
||||
super(true, "target opponent's", "any number of cards with that name");
|
||||
}
|
||||
|
||||
public InfiniteObliterationEffect(final InfiniteObliterationEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (player != null && controller != null) {
|
||||
Choice cardChoice = new ChoiceImpl();
|
||||
cardChoice.setChoices(CardRepository.instance.getCreatureNames());
|
||||
cardChoice.clearChoice();
|
||||
cardChoice.setMessage("Name a creature card");
|
||||
|
||||
while (!controller.choose(Outcome.Exile, cardChoice, game)) {
|
||||
if (!controller.isInGame()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
String cardName;
|
||||
cardName = cardChoice.getChoice();
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (sourceObject != null) {
|
||||
game.informPlayers(sourceObject.getName() + " named card: [" + cardName + "]");
|
||||
}
|
||||
|
||||
super.applySearchAndExile(game, source, cardName, player.getId());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InfiniteObliterationEffect copy() {
|
||||
return new InfiniteObliterationEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText(Mode mode) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Name a creature card. ");
|
||||
sb.append(super.getText(mode));
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
|
@ -25,24 +25,23 @@
|
|||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
|
||||
package mage.sets.returntoravnica;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Rarity;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.CantBeCounteredSourceEffect;
|
||||
import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.repository.CardRepository;
|
||||
import mage.choices.Choice;
|
||||
import mage.choices.ChoiceImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
|
@ -54,15 +53,14 @@ import mage.target.common.TargetOpponent;
|
|||
*/
|
||||
public class SlaughterGames extends CardImpl {
|
||||
|
||||
public SlaughterGames (UUID ownerId) {
|
||||
public SlaughterGames(UUID ownerId) {
|
||||
super(ownerId, 197, "Slaughter Games", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{B}{R}");
|
||||
this.expansionSetCode = "RTR";
|
||||
|
||||
|
||||
// Slaughter Games can't be countered by spells or abilities.
|
||||
Effect effect = new CantBeCounteredSourceEffect();
|
||||
Effect effect = new CantBeCounteredSourceEffect();
|
||||
effect.setText("{this} can't be countered by spells or abilities");
|
||||
Ability ability = new SimpleStaticAbility(Zone.STACK,effect);
|
||||
Ability ability = new SimpleStaticAbility(Zone.STACK, effect);
|
||||
ability.setRuleAtTheTop(true);
|
||||
this.addAbility(ability);
|
||||
|
||||
|
@ -72,7 +70,7 @@ public class SlaughterGames extends CardImpl {
|
|||
|
||||
}
|
||||
|
||||
public SlaughterGames (final SlaughterGames card) {
|
||||
public SlaughterGames(final SlaughterGames card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
|
@ -85,7 +83,7 @@ public class SlaughterGames extends CardImpl {
|
|||
class SlaughterGamesEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExileEffect {
|
||||
|
||||
public SlaughterGamesEffect() {
|
||||
super(true, "target opponent's","any number of cards with that name");
|
||||
super(true, "target opponent's", "any number of cards with that name");
|
||||
}
|
||||
|
||||
public SlaughterGamesEffect(final SlaughterGamesEffect effect) {
|
||||
|
@ -109,9 +107,9 @@ class SlaughterGamesEffect extends SearchTargetGraveyardHandLibraryForCardNameAn
|
|||
}
|
||||
String cardName;
|
||||
cardName = cardChoice.getChoice();
|
||||
Card card = game.getCard(source.getSourceId());
|
||||
if (card != null) {
|
||||
game.informPlayers(card.getName()+"named card: [" + cardName + "]");
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (sourceObject != null) {
|
||||
game.informPlayers(sourceObject.getName() + " named card: [" + cardName + "]");
|
||||
}
|
||||
|
||||
super.applySearchAndExile(game, source, cardName, player.getId());
|
||||
|
@ -132,4 +130,4 @@ class SlaughterGamesEffect extends SearchTargetGraveyardHandLibraryForCardNameAn
|
|||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
/*
|
||||
* Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
|
@ -20,7 +20,7 @@
|
|||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
|
@ -28,10 +28,7 @@
|
|||
package mage.sets.scarsofmirrodin;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.Zone;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.cards.Card;
|
||||
|
@ -40,6 +37,10 @@ import mage.cards.CardsImpl;
|
|||
import mage.cards.repository.CardRepository;
|
||||
import mage.choices.Choice;
|
||||
import mage.choices.ChoiceImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPlayer;
|
||||
|
@ -54,7 +55,6 @@ public class Memoricide extends CardImpl {
|
|||
super(ownerId, 69, "Memoricide", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{B}");
|
||||
this.expansionSetCode = "SOM";
|
||||
|
||||
|
||||
// Name a nonland card. Search target player's graveyard, hand, and library for any number of cards with
|
||||
// that name and exile them. Then that player shuffles his or her library
|
||||
this.getSpellAbility().addTarget(new TargetPlayer());
|
||||
|
@ -99,20 +99,23 @@ class MemoricideEffect extends OneShotEffect {
|
|||
}
|
||||
|
||||
String cardName = cardChoice.getChoice();
|
||||
game.informPlayers("Memoricide, named card: [" + cardName + "]");
|
||||
for (Card card: player.getGraveyard().getCards(game)) {
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (sourceObject != null) {
|
||||
game.informPlayers(sourceObject.getName() + " named card: [" + cardName + "]");
|
||||
}
|
||||
for (Card card : player.getGraveyard().getCards(game)) {
|
||||
if (card.getName().equals(cardName)) {
|
||||
card.moveToExile(null, "", source.getSourceId(), game);
|
||||
card.moveToExile(null, "", source.getSourceId(), game);
|
||||
}
|
||||
}
|
||||
for (Card card: player.getHand().getCards(game)) {
|
||||
for (Card card : player.getHand().getCards(game)) {
|
||||
if (card.getName().equals(cardName)) {
|
||||
card.moveToExile(null, "", source.getSourceId(), game);
|
||||
card.moveToExile(null, "", source.getSourceId(), game);
|
||||
}
|
||||
}
|
||||
for (Card card: player.getLibrary().getCards(game)) {
|
||||
for (Card card : player.getLibrary().getCards(game)) {
|
||||
if (card.getName().equals(cardName)) {
|
||||
card.moveToExile(null, "", source.getSourceId(), game);
|
||||
card.moveToExile(null, "", source.getSourceId(), game);
|
||||
}
|
||||
}
|
||||
controller.lookAtCards("Memoricide Hand", player.getHand(), game);
|
||||
|
@ -127,4 +130,4 @@ class MemoricideEffect extends OneShotEffect {
|
|||
return new MemoricideEffect(this);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
/*
|
||||
* Copyright 2012 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
|
@ -20,21 +20,32 @@
|
|||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package org.mage.test.player;
|
||||
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.RangeOfInfluence;
|
||||
import mage.abilities.*;
|
||||
import java.io.Serializable;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.ActivatedAbility;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.Modes;
|
||||
import mage.abilities.TriggeredAbility;
|
||||
import mage.abilities.common.PassAbility;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.Cards;
|
||||
import mage.choices.Choice;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.RangeOfInfluence;
|
||||
import mage.game.Game;
|
||||
import mage.game.combat.CombatGroup;
|
||||
import mage.game.permanent.Permanent;
|
||||
|
@ -45,13 +56,10 @@ import mage.target.Target;
|
|||
import mage.target.TargetAmount;
|
||||
import mage.target.TargetCard;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* plays randomly
|
||||
*
|
||||
*
|
||||
* @author BetaSteward_at_googlemail.com
|
||||
*/
|
||||
public class RandomPlayer extends ComputerPlayer {
|
||||
|
@ -85,12 +93,13 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
return actionCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Override
|
||||
public boolean priority(Game game) {
|
||||
boolean didSomething = false;
|
||||
Ability ability = getAction(game);
|
||||
if (!(ability instanceof PassAbility))
|
||||
if (!(ability instanceof PassAbility)) {
|
||||
didSomething = true;
|
||||
}
|
||||
|
||||
activateAbility((ActivatedAbility) ability, game);
|
||||
|
||||
|
@ -135,7 +144,7 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
// }
|
||||
// }
|
||||
// else {
|
||||
break;
|
||||
break;
|
||||
// }
|
||||
}
|
||||
return ability;
|
||||
|
@ -154,8 +163,7 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
List<Ability> options = getPlayableOptions(source, game);
|
||||
if (options.isEmpty()) {
|
||||
ability = source;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if (options.size() == 1) {
|
||||
ability = options.get(0);
|
||||
} else {
|
||||
|
@ -197,9 +205,9 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
setStoredBookmark(game.bookmarkState()); // makes it possible to UNDO a declared attacker with costs from e.g. Propaganda
|
||||
if (!game.getCombat().declareAttacker(attackersList.get(i).getId(), defenderId, playerId, game)) {
|
||||
game.undo(playerId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
actionCount++;
|
||||
}
|
||||
|
||||
|
@ -211,7 +219,7 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
}
|
||||
|
||||
List<Permanent> blockers = getAvailableBlockers(game);
|
||||
for (Permanent blocker: blockers) {
|
||||
for (Permanent blocker : blockers) {
|
||||
int check = rnd.nextInt(numGroups + 1);
|
||||
if (check < numGroups) {
|
||||
CombatGroup group = game.getCombat().getGroups().get(check);
|
||||
|
@ -248,7 +256,7 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
}
|
||||
|
||||
protected boolean chooseRandomTarget(Target target, Ability source, Game game) {
|
||||
Set<UUID> possibleTargets = target.possibleTargets(source==null?null:source.getSourceId(), playerId, game);
|
||||
Set<UUID> possibleTargets = target.possibleTargets(source == null ? null : source.getSourceId(), playerId, game);
|
||||
if (possibleTargets.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
@ -317,7 +325,7 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
|
||||
@Override
|
||||
public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) {
|
||||
Set<UUID> possibleTargets = target.possibleTargets(source==null?null:source.getSourceId(), playerId, game);
|
||||
Set<UUID> possibleTargets = target.possibleTargets(source == null ? null : source.getSourceId(), playerId, game);
|
||||
if (possibleTargets.isEmpty()) {
|
||||
return !target.isRequired(source);
|
||||
}
|
||||
|
@ -379,12 +387,12 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
|
||||
@Override
|
||||
public Mode chooseMode(Modes modes, Ability source, Game game) {
|
||||
Iterator<Mode> it = modes.values().iterator();
|
||||
Iterator<Mode> it = modes.getAvailableModes(source, game).iterator();
|
||||
Mode mode = it.next();
|
||||
if (modes.size() == 1) {
|
||||
return mode;
|
||||
}
|
||||
int modeNum = rnd.nextInt(modes.values().size());
|
||||
int modeNum = rnd.nextInt(modes.getAvailableModes(source, game).size());
|
||||
for (int i = 0; i < modeNum; i++) {
|
||||
mode = it.next();
|
||||
}
|
||||
|
@ -410,8 +418,7 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
if (targets.size() == 1) {
|
||||
targetId = targets.get(0);
|
||||
amount = remainingDamage;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
targetId = targets.get(rnd.nextInt(targets.size()));
|
||||
amount = rnd.nextInt(damage + 1);
|
||||
}
|
||||
|
@ -419,8 +426,7 @@ public class RandomPlayer extends ComputerPlayer {
|
|||
if (permanent != null) {
|
||||
permanent.damage(amount, sourceId, game, false, true);
|
||||
remainingDamage -= amount;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
Player player = game.getPlayer(targetId);
|
||||
if (player != null) {
|
||||
player.damage(amount, sourceId, game, false, true);
|
||||
|
|
|
@ -510,7 +510,7 @@ public class TestPlayer implements Player {
|
|||
if (!modesSet.isEmpty() && modes.getMaxModes() > modes.getSelectedModes().size()) {
|
||||
int selectedMode = Integer.parseInt(modesSet.get(0));
|
||||
int i = 1;
|
||||
for (Mode mode : modes.values()) {
|
||||
for (Mode mode : modes.getAvailableModes(source, game)) {
|
||||
if (i == selectedMode) {
|
||||
modesSet.remove(0);
|
||||
return mode;
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
/*
|
||||
* Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved.
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
|
||||
|
@ -20,15 +20,18 @@
|
|||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
package mage.abilities;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
@ -39,6 +42,7 @@ import mage.constants.TargetController;
|
|||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetOpponent;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -51,6 +55,7 @@ public class Modes extends LinkedHashMap<UUID, Mode> {
|
|||
private int minModes;
|
||||
private int maxModes;
|
||||
private TargetController modeChooser;
|
||||
private boolean eachModeOnlyOnce; // state if each mode can be chosen only once
|
||||
|
||||
public Modes() {
|
||||
Mode mode = new Mode();
|
||||
|
@ -62,15 +67,16 @@ public class Modes extends LinkedHashMap<UUID, Mode> {
|
|||
this.modeChooser = TargetController.YOU;
|
||||
}
|
||||
|
||||
public Modes(Modes modes) {
|
||||
public Modes(final Modes modes) {
|
||||
this.modeId = modes.modeId;
|
||||
for (Map.Entry<UUID, Mode> entry: modes.entrySet()) {
|
||||
for (Map.Entry<UUID, Mode> entry : modes.entrySet()) {
|
||||
this.put(entry.getKey(), entry.getValue().copy());
|
||||
}
|
||||
this.minModes = modes.minModes;
|
||||
this.maxModes = modes.maxModes;
|
||||
this.selectedModes.addAll(modes.selectedModes);
|
||||
this.modeChooser = modes.modeChooser;
|
||||
this.eachModeOnlyOnce = modes.eachModeOnlyOnce;
|
||||
}
|
||||
|
||||
public Modes copy() {
|
||||
|
@ -100,11 +106,11 @@ public class Modes extends LinkedHashMap<UUID, Mode> {
|
|||
public int getMaxModes() {
|
||||
return this.maxModes;
|
||||
}
|
||||
|
||||
|
||||
public void setModeChooser(TargetController modeChooser) {
|
||||
this.modeChooser = modeChooser;
|
||||
}
|
||||
|
||||
|
||||
public TargetController getModeChooser() {
|
||||
return this.modeChooser;
|
||||
}
|
||||
|
@ -122,7 +128,7 @@ public class Modes extends LinkedHashMap<UUID, Mode> {
|
|||
Set<UUID> copySelectedModes = new LinkedHashSet<>();
|
||||
copySelectedModes.addAll(selectedModes);
|
||||
selectedModes.clear();
|
||||
for (UUID basicModeId: this.keySet()) {
|
||||
for (UUID basicModeId : this.keySet()) {
|
||||
if (copySelectedModes.contains(basicModeId)) {
|
||||
selectedModes.add(basicModeId);
|
||||
}
|
||||
|
@ -142,24 +148,32 @@ public class Modes extends LinkedHashMap<UUID, Mode> {
|
|||
if (card != null) {
|
||||
for (Ability modeModifyingAbility : card.getAbilities()) {
|
||||
if (modeModifyingAbility instanceof OptionalAdditionalModeSourceCosts) {
|
||||
((OptionalAdditionalModeSourceCosts)modeModifyingAbility).addOptionalAdditionalModeCosts(source, game);
|
||||
((OptionalAdditionalModeSourceCosts) modeModifyingAbility).addOptionalAdditionalModeCosts(source, game);
|
||||
}
|
||||
}
|
||||
}
|
||||
// check if all modes can be activated automatically
|
||||
if (this.size() == this.getMinModes()) {
|
||||
for (Mode mode: this.values()) {
|
||||
if (mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) {
|
||||
Set<UUID> onceSelectedModes = null;
|
||||
if (isEachModeOnlyOnce()) {
|
||||
onceSelectedModes = getAlreadySelectedModes(source, game);
|
||||
}
|
||||
for (Mode mode : this.values()) {
|
||||
if ((!isEachModeOnlyOnce() || onceSelectedModes == null || !onceSelectedModes.contains(mode.getId()))
|
||||
&& mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) {
|
||||
this.selectedModes.add(mode.getId());
|
||||
}
|
||||
}
|
||||
if (isEachModeOnlyOnce()) {
|
||||
setAlreadySelectedModes(selectedModes, source, game);
|
||||
}
|
||||
return selectedModes.size() > 0;
|
||||
}
|
||||
|
||||
|
||||
// 700.2d
|
||||
// Some spells and abilities specify that a player other than their controller chooses a mode for it.
|
||||
// In that case, the other player does so when the spell or ability’s controller normally would do so.
|
||||
// If there is more than one other player who could make such a choice, the spell or ability’s controller decides which of those players will make the choice.
|
||||
// If there is more than one other player who could make such a choice, the spell or ability’s controller decides which of those players will make the choice.
|
||||
UUID playerId = null;
|
||||
if (modeChooser == TargetController.OPPONENT) {
|
||||
TargetOpponent targetOpponent = new TargetOpponent();
|
||||
|
@ -173,42 +187,84 @@ public class Modes extends LinkedHashMap<UUID, Mode> {
|
|||
return false;
|
||||
}
|
||||
Player player = game.getPlayer(playerId);
|
||||
|
||||
|
||||
// player chooses modes manually
|
||||
while (this.selectedModes.size() < this.getMaxModes()) {
|
||||
Mode choice = player.chooseMode(this, source, game);
|
||||
if (choice == null) {
|
||||
if (isEachModeOnlyOnce()) {
|
||||
setAlreadySelectedModes(selectedModes, source, game);
|
||||
}
|
||||
return this.selectedModes.size() >= this.getMinModes();
|
||||
}
|
||||
setMode(choice);
|
||||
}
|
||||
if (isEachModeOnlyOnce()) {
|
||||
setAlreadySelectedModes(selectedModes, source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
this.modeId = this.values().iterator().next().getId();
|
||||
this.selectedModes.add(modeId);
|
||||
if (isEachModeOnlyOnce()) {
|
||||
setAlreadySelectedModes(selectedModes, source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void setAlreadySelectedModes(Set<UUID> selectedModes, Ability source, Game game) {
|
||||
String key = getKey(source, game);
|
||||
Set<UUID> onceSelectedModes = (Set<UUID>) game.getState().getValue(key);
|
||||
if (onceSelectedModes == null) {
|
||||
onceSelectedModes = new HashSet<>();
|
||||
}
|
||||
onceSelectedModes.addAll(selectedModes);
|
||||
game.getState().setValue(key, onceSelectedModes);
|
||||
}
|
||||
|
||||
private Set<UUID> getAlreadySelectedModes(Ability source, Game game) {
|
||||
return (Set<UUID>) game.getState().getValue(getKey(source, game));
|
||||
}
|
||||
|
||||
private String getKey(Ability source, Game game) {
|
||||
return CardUtil.getObjectZoneString("selectedModes", source.getSourceId(), game, game.getState().getZoneChangeCounter(source.getSourceId()), false);
|
||||
}
|
||||
|
||||
public List<Mode> getAvailableModes(Ability source, Game game) {
|
||||
List<Mode> availableModes = new ArrayList<>();
|
||||
Set<UUID> nonAvailableModes = getAlreadySelectedModes(source, game);
|
||||
for (Mode mode : this.values()) {
|
||||
if (isEachModeOnlyOnce() && nonAvailableModes != null && nonAvailableModes.contains(mode.getId())) {
|
||||
continue;
|
||||
}
|
||||
availableModes.add(mode);
|
||||
}
|
||||
return availableModes;
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
if (this.size() <= 1) {
|
||||
return this.getMode().getEffects().getText(this.getMode());
|
||||
}
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (this.getMinModes() == 1 && this.getMaxModes() == 3) {
|
||||
sb.append("choose one or more ");
|
||||
}else if (this.getMinModes() == 1 && this.getMaxModes() == 2) {
|
||||
} else if (this.getMinModes() == 1 && this.getMaxModes() == 2) {
|
||||
sb.append("choose one or both ");
|
||||
} else if (this.getMinModes() == 2 && this.getMaxModes() == 2) {
|
||||
sb.append("choose two ");
|
||||
} else {
|
||||
sb.append("choose one ");
|
||||
}
|
||||
sb.append("—<br>");
|
||||
for (Mode mode: this.values()) {
|
||||
if (isEachModeOnlyOnce()) {
|
||||
sb.append("that hasn't been chosen ");
|
||||
}
|
||||
sb.append("—<br>");
|
||||
for (Mode mode : this.values()) {
|
||||
sb.append("&bull ");
|
||||
sb.append(mode.getEffects().getTextStartingUpperCase(mode));
|
||||
sb.append("<br>");
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
@ -219,4 +275,12 @@ public class Modes extends LinkedHashMap<UUID, Mode> {
|
|||
return text;
|
||||
}
|
||||
|
||||
public boolean isEachModeOnlyOnce() {
|
||||
return eachModeOnlyOnce;
|
||||
}
|
||||
|
||||
public void setEachModeOnlyOnce(boolean eachModeOnlyOnce) {
|
||||
this.eachModeOnlyOnce = eachModeOnlyOnce;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* 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 mage.abilities.effects.common;
|
||||
|
||||
import mage.Mana;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.mana.builder.ConditionalManaBuilder;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class AddConditionalManaEffect extends ManaEffect {
|
||||
|
||||
private final Mana mana;
|
||||
private final ConditionalManaBuilder manaBuilder;
|
||||
|
||||
public AddConditionalManaEffect(Mana mana, ConditionalManaBuilder manaBuilder) {
|
||||
super();
|
||||
this.mana = mana;
|
||||
this.manaBuilder = manaBuilder;
|
||||
staticText = "Add " + this.mana.toString() + " to your mana pool. " + manaBuilder.getRule();
|
||||
}
|
||||
|
||||
public AddConditionalManaEffect(final AddConditionalManaEffect effect) {
|
||||
super(effect);
|
||||
this.mana = effect.mana;
|
||||
this.manaBuilder = effect.manaBuilder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AddConditionalManaEffect copy() {
|
||||
return new AddConditionalManaEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player != null) {
|
||||
player.getManaPool().addMana(getMana(game, source), game, source);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mana getMana(Game game, Ability source) {
|
||||
return manaBuilder.setMana(mana, source, game).build();
|
||||
}
|
||||
}
|
|
@ -46,16 +46,17 @@ import mage.util.CardUtil;
|
|||
public class NameACardEffect extends OneShotEffect {
|
||||
|
||||
public static String INFO_KEY = "NAMED_CARD";
|
||||
|
||||
|
||||
public enum TypeOfName {
|
||||
|
||||
ALL,
|
||||
NON_LAND_NAME,
|
||||
NON_LAND_AND_NON_CREATURE_NAME,
|
||||
CREATURE_NAME
|
||||
}
|
||||
|
||||
|
||||
private final TypeOfName typeOfName;
|
||||
|
||||
|
||||
public NameACardEffect(TypeOfName typeOfName) {
|
||||
super(Outcome.Detriment);
|
||||
this.typeOfName = typeOfName;
|
||||
|
@ -73,7 +74,7 @@ public class NameACardEffect extends OneShotEffect {
|
|||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (controller != null && sourceObject != null) {
|
||||
Choice cardChoice = new ChoiceImpl();
|
||||
switch(typeOfName) {
|
||||
switch (typeOfName) {
|
||||
case ALL:
|
||||
cardChoice.setChoices(CardRepository.instance.getNames());
|
||||
cardChoice.setMessage("Name a card");
|
||||
|
@ -81,16 +82,16 @@ public class NameACardEffect extends OneShotEffect {
|
|||
case NON_LAND_AND_NON_CREATURE_NAME:
|
||||
cardChoice.setChoices(CardRepository.instance.getNonLandAndNonCreatureNames());
|
||||
cardChoice.setMessage("Name a non land and non creature card");
|
||||
break;
|
||||
break;
|
||||
case NON_LAND_NAME:
|
||||
cardChoice.setChoices(CardRepository.instance.getNonLandNames());
|
||||
cardChoice.setMessage("Name a non land card");
|
||||
break;
|
||||
break;
|
||||
case CREATURE_NAME:
|
||||
cardChoice.setChoices(CardRepository.instance.getCreatureNames());
|
||||
cardChoice.setMessage("Name a creature card");
|
||||
break;
|
||||
}
|
||||
}
|
||||
cardChoice.clearChoice();
|
||||
while (!controller.choose(Outcome.Detriment, cardChoice, game)) {
|
||||
if (!controller.isInGame()) {
|
||||
|
@ -103,10 +104,10 @@ public class NameACardEffect extends OneShotEffect {
|
|||
}
|
||||
game.getState().setValue(source.getSourceId().toString() + INFO_KEY, cardName);
|
||||
if (sourceObject instanceof Permanent) {
|
||||
((Permanent)sourceObject).addInfo(INFO_KEY, CardUtil.addToolTipMarkTags("Named card: " + cardName), game);
|
||||
((Permanent) sourceObject).addInfo(INFO_KEY, CardUtil.addToolTipMarkTags("Named card: " + cardName), game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -117,17 +118,17 @@ public class NameACardEffect extends OneShotEffect {
|
|||
|
||||
private String setText() {
|
||||
StringBuilder sb = new StringBuilder("name a ");
|
||||
switch(typeOfName) {
|
||||
switch (typeOfName) {
|
||||
case ALL:
|
||||
sb.append("card");
|
||||
break;
|
||||
case NON_LAND_AND_NON_CREATURE_NAME:
|
||||
sb.append("card other than a creature or a land card");
|
||||
break;
|
||||
break;
|
||||
case NON_LAND_NAME:
|
||||
sb.append("nonland card");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
* authors and should not be interpreted as representing official policies, either expressed
|
||||
* or implied, of BetaSteward_at_googlemail.com.
|
||||
*/
|
||||
|
||||
package mage.abilities.effects.common.search;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -49,7 +48,6 @@ import mage.target.common.TargetCardInLibrary;
|
|||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
|
||||
public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect extends OneShotEffect {
|
||||
|
||||
protected String searchWhatText;
|
||||
|
@ -78,12 +76,13 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param game
|
||||
* @param source
|
||||
* @param cardName name of the card to exile
|
||||
* @param targetPlayerId id of the target player to exile card name from his or her zones
|
||||
* @return
|
||||
* @param targetPlayerId id of the target player to exile card name from his
|
||||
* or her zones
|
||||
* @return
|
||||
*/
|
||||
public boolean applySearchAndExile(Game game, Ability source, String cardName, UUID targetPlayerId) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
|
@ -94,10 +93,10 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect
|
|||
filter.add(new NamePredicate(cardName));
|
||||
|
||||
// cards in Graveyard
|
||||
int cardsCount = (cardName.isEmpty() ? 0 :targetPlayer.getGraveyard().count(filter, game));
|
||||
int cardsCount = (cardName.isEmpty() ? 0 : targetPlayer.getGraveyard().count(filter, game));
|
||||
if (cardsCount > 0) {
|
||||
filter.setMessage("card named " + cardName + " in the graveyard of " + targetPlayer.getLogName());
|
||||
TargetCard target = new TargetCard((graveyardExileOptional ? 0 :cardsCount), cardsCount,Zone.GRAVEYARD, filter);
|
||||
TargetCard target = new TargetCard((graveyardExileOptional ? 0 : cardsCount), cardsCount, Zone.GRAVEYARD, filter);
|
||||
if (controller.choose(Outcome.Exile, targetPlayer.getGraveyard(), target, game)) {
|
||||
List<UUID> targets = target.getTargets();
|
||||
for (UUID targetId : targets) {
|
||||
|
@ -111,44 +110,34 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect
|
|||
}
|
||||
|
||||
// cards in Hand
|
||||
cardsCount = (cardName.isEmpty() ? 0 :targetPlayer.getHand().count(filter, game));
|
||||
if (cardsCount > 0) {
|
||||
filter.setMessage("card named " + cardName + " in the hand of " + targetPlayer.getLogName());
|
||||
TargetCard target = new TargetCard(0, cardsCount, Zone.HAND, filter);
|
||||
if (controller.choose(Outcome.Exile, targetPlayer.getHand(), target, game)) {
|
||||
List<UUID> targets = target.getTargets();
|
||||
for (UUID targetId : targets) {
|
||||
Card targetCard = targetPlayer.getHand().get(targetId, game);
|
||||
if (targetCard != null) {
|
||||
targetPlayer.getHand().remove(targetCard);
|
||||
controller.moveCardToExileWithInfo(targetCard, null, null, source.getSourceId(), game, Zone.HAND, true);
|
||||
}
|
||||
cardsCount = (cardName.isEmpty() ? 0 : targetPlayer.getHand().count(filter, game));
|
||||
filter.setMessage("card named " + cardName + " in the hand of " + targetPlayer.getLogName());
|
||||
TargetCard target = new TargetCard(0, cardsCount, Zone.HAND, filter);
|
||||
if (controller.choose(Outcome.Exile, targetPlayer.getHand(), target, game)) {
|
||||
List<UUID> targets = target.getTargets();
|
||||
for (UUID targetId : targets) {
|
||||
Card targetCard = targetPlayer.getHand().get(targetId, game);
|
||||
if (targetCard != null) {
|
||||
targetPlayer.getHand().remove(targetCard);
|
||||
controller.moveCardToExileWithInfo(targetCard, null, null, source.getSourceId(), game, Zone.HAND, true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (targetPlayer.getHand().size() > 0) {
|
||||
controller.lookAtCards(targetPlayer.getLogName() + " hand", targetPlayer.getHand(), game);
|
||||
}
|
||||
}
|
||||
|
||||
// cards in Library
|
||||
Cards cardsInLibrary = new CardsImpl(Zone.LIBRARY);
|
||||
cardsInLibrary.addAll(targetPlayer.getLibrary().getCards(game));
|
||||
cardsCount = (cardName.isEmpty() ? 0 : cardsInLibrary.count(filter, game));
|
||||
if (cardsCount > 0) {
|
||||
filter.setMessage("card named " + cardName + " in the library of " + targetPlayer.getLogName());
|
||||
TargetCardInLibrary target = new TargetCardInLibrary(0, cardsCount, filter);
|
||||
if (controller.choose(Outcome.Exile, cardsInLibrary, target, game)) {
|
||||
List<UUID> targets = target.getTargets();
|
||||
for (UUID targetId : targets) {
|
||||
Card targetCard = targetPlayer.getLibrary().remove(targetId, game);
|
||||
if (targetCard != null) {
|
||||
controller.moveCardToExileWithInfo(targetCard, null, null, source.getSourceId(), game, Zone.LIBRARY, true);
|
||||
}
|
||||
filter.setMessage("card named " + cardName + " in the library of " + targetPlayer.getLogName());
|
||||
TargetCardInLibrary targetLib = new TargetCardInLibrary(0, cardsCount, filter);
|
||||
if (controller.choose(Outcome.Exile, cardsInLibrary, targetLib, game)) {
|
||||
List<UUID> targets = targetLib.getTargets();
|
||||
for (UUID targetId : targets) {
|
||||
Card targetCard = targetPlayer.getLibrary().remove(targetId, game);
|
||||
if (targetCard != null) {
|
||||
controller.moveCardToExileWithInfo(targetCard, null, null, source.getSourceId(), game, Zone.LIBRARY, true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
controller.lookAtCards(targetPlayer.getName() + " library", cardsInLibrary, game);
|
||||
}
|
||||
|
||||
targetPlayer.shuffleLibrary(game);
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* 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 mage.abilities.mana;
|
||||
|
||||
import mage.Mana;
|
||||
import mage.abilities.costs.Cost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.effects.common.AddConditionalManaEffect;
|
||||
import mage.abilities.mana.builder.ConditionalManaBuilder;
|
||||
import mage.constants.Zone;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class ConditionalColoredManaAbility extends ManaAbility {
|
||||
|
||||
public ConditionalColoredManaAbility(Mana mana, ConditionalManaBuilder manaBuilder) {
|
||||
this(new TapSourceCost(), mana, manaBuilder);
|
||||
}
|
||||
|
||||
public ConditionalColoredManaAbility(Cost cost, Mana mana, ConditionalManaBuilder manaBuilder) {
|
||||
super(Zone.BATTLEFIELD, new AddConditionalManaEffect(mana, manaBuilder), cost);
|
||||
this.netMana.add(mana);
|
||||
}
|
||||
|
||||
public ConditionalColoredManaAbility(final ConditionalColoredManaAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConditionalColoredManaAbility copy() {
|
||||
return new ConditionalColoredManaAbility(this);
|
||||
}
|
||||
}
|
|
@ -26060,11 +26060,11 @@ Sign in Blood|Modern Masters 2015 Edition|97|C|{B}{B}|Sorcery|||Target player dr
|
|||
Spread the Sickness|Modern Masters 2015 Edition|98|U|{4}{B}|Sorcery|||Destroy target creature, then proliferate. <i>(You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)</i>|
|
||||
Surgical Extraction|Modern Masters 2015 Edition|99|R|{BP}|Instant|||<i>({BP} can be paid with either {B} or 2 life.)</i>$Choose target card in a graveyard other than a basic land card. Search its owner's graveyard, hand, and library for any number of cards with the same name as that card and exile them. Then that player shuffles his or her library.|
|
||||
Akroan Jailer|Magic Origins|1|C|{W}|Creature - Human Soldier|1|1|{2}{W}, {T}: Tap target creature.|
|
||||
Archangel of Tithes|Magic Origins|4|M|{1}{W}{W}{W}|Creature - Angel|3|5|Flying$As long as Archangel of Tithes is untapped, creatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures.$As long as Archangel of Tithes is attacking, creatures can't block unless their controller pays {1} for each of those creatures.|
|
||||
Archangel of Tithes|Magic Origins|4|M|{1}{W}{W}{W}|Creature - Angel|3|5|Flying$As long as Archangel of TIthes is untapped, creatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures.$As long as Archangel of Tithes is attacking, creatures can't block unless their controller pays {1} for each of those creatures.|
|
||||
Blessed Spirits|Magic Origins|7|U|{2}{W}|Creature - Spirit|2|2|Flying$Whenever you cast an enchantment spell, put a +1/+1 counter on Blessed Spirits.|
|
||||
Charging Griffin|Magic Origins|9|C|{3}{W}|Creature - Griffin|2|2|Flying$Whenever Charging Griffin attacks, it gets +1/+1 until end of turn.|
|
||||
Cleric of the Forward Order|Magic Origins|10|C|{1}{W}|Creature - Human Cleric|2|2|When Cleric of the Forward Order enters the battlefield, you gain 2 life for each creature you control named Cleric of the Forward Order.|
|
||||
Enshrouding Mist|Magic Origins|13|C|{W}|Instant|||Target creature gets +1/+1 until end of turn. Prevent all damage that would dealt to it this turn. If it's renowned, untap it.|
|
||||
Enshrouding Mist|Magic Origins|13|C|{W}|Instant|||Target creature gets +1/+1 until end of turn. Prevent all damage that would be dealt to it this turn. If it's renowned, untap it.|
|
||||
Grasp of the Hieromancer|Magic Origins|15|C|{1}{W}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +1/+1 and has "Whenever this creature attacks, tap target creature defending player controls."|
|
||||
Hallowed Moonlight|Magic Origins|16|R|{1}{W}|Instant|||Until end of turn, if a creature would enter the battlefield and it wasn't cast, exile it instead.$Draw a card.|
|
||||
Heavy Infantry|Magic Origins|18|C|{4}{W}|Creature - Human Soldier|3|4|When Heavy Infantry enters the battlefield, tap target creature an opponent controls.|
|
||||
|
@ -26073,48 +26073,56 @@ Knight of the Pilgrim's Road|Magic Origins|20|C|{2}{W}|Creature - Human Knight|3
|
|||
Knight of the White Orchid|Magic Origins|21|R|{W}{W}|Creature - Human Knight|2|2|First strike$When Knight of the White Orchid enters the battlefield, if an opponent controls more lands than you, you may search your library for a Plains card, put it onto the battlefield, then shuffle your library.|
|
||||
Gideon, Battle-Forged|Magic Origins|23|M||Planeswalker - Gideon|3|+2: Up to one target creature an opponent controls attacks Gideon, Battle-Forged during its controller's next turn if able.$+1: Until your next turn, target creature gains indestructible. Untap that creature.$0: Until end of turn, Gideon, Battle-Forged becomes a 4/4 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn.|
|
||||
Kytheon, Hero of Akros|Magic Origins|23|M|{W}|Legendary Creature - Human Soldier|2|1|At end of combat, if Kytheon, Hero of Akros and at least two other creatures attacked this combat, exile Kytheon, then return him to the battlefield transformed under his owner's control.${2}{W}: Kytheon gains indestructible until end of turn.|
|
||||
Kytheon's Irregulars|Magic Origins|24|R|{2}{W}{W}|Creature - Human Solder|4|3|Renown 1 <i>(When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)</i)${W}{W}: Tap target creature.|
|
||||
Kytheon's Irregulars|Magic Origins|24|R|{2}{W}{W}|Creature - Human Soldier|4|3|Renown 1 <i>(When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)</i>${W}{W}: Tap target creature.|
|
||||
Mighty Leap|Magic Origins|26|C|{1}{W}|Instant|||Target creature gets +2/+2 and gains flying until end of turn.|
|
||||
Patron of the Valiant|Magic Origins|28|U|{3}{W}{W}|Creature - Angel|4|4|Flying$When Patron of the Valiant enters the battlefield, put a +1/+1 counter on each creature you control with a +1/+1 counter on it.|
|
||||
Relic Seeker|Magic Origins|29|R|{1}{W}|Creature - Human|2|2|Renown 1 <i>(When this creature deals combat damage to a player, put a +1/+1 counter on it and it becomes renowned.)</i>$When Relic Seeker becomes renowned, you may search your library for an Equipment card, reveal it, put it in your hand, then shuffle your library.|
|
||||
Relic Seeker|Magic Origins|29|R|{1}{W}|Creature - Human Soldier|2|2|Renown 1 <i>(When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)</i>$When Relic Seeker becomes renowned, you may search your library for an Equipment card, reveal it, put it into your hand, then shuffle your library.|
|
||||
Sentinel of the Eternal Watch|Magic Origins|30|U|{5}{W}|Creature - Giant Soldier|4|6|Vigilance <i>(Attacking doesn't cause this creature to tap.)</i>$At the beginning of combat on each opponent's turn, tap target creature that player controls.|
|
||||
Starfield of Nyx|Magic Origins|33|M|{4}{W}|Enchantment|||At the beginning of your upkeep, you may return target enchantment card from your graveyard to the battlefield.$As long as you control five or more enchantments, each other non-Aura enchantment you control is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost.|
|
||||
Topan Freeblade|Magic Origins|36|C|{1}{W}|Creature - Human Soldier|2|2|Vigilance <i>(Attacking doesn't cause this creature to tap.)$Renown 1 <i>(When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)</i>|
|
||||
Topan Freeblade|Magic Origins|36|C|{1}{W}|Creature - Human Soldier|2|2|Vigilance$Renown 1 <i>(When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)</i>|
|
||||
Valor in Akros|Magic Origins|39|U|{3}{W}|Enchantment|||Whenever a creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn.|
|
||||
Vryn Wingmare|Magic Origins|40|R|{2}{W}|Creature - Pegasus|2|1|Flying$Noncreature spells cost {1} more to cast.|
|
||||
Yoked Ox|Magic Origins|42|C|{W}|Creature - Ox|0|4||
|
||||
Alhammarrat, High Arbiter|43|R|{5}{U}{U}|Legendary Creature - Sphinx|5|5|Flying$As Alhammarret, High Arbiter enters the battlefield, each opponent reveals his or her hand. You choose the name of a nonland card revealed this way.$Your opponents can't cast spells with the chosen name <i>(as long as this creature is on the battlefield)</i>.|
|
||||
Clash of Wills|49|U|{X}{U}|Instant|||Counter target spell unless its controller pays {X}.|
|
||||
Aegis Angel|Magic Origins|273|R|{4}{W}{W}|Creature - Angel|5|5|Flying$When Aegis Angel enters the battlefield, another target permanent gains indestructible for as long as you control Aegis Angel.|
|
||||
Divine Verdict|Magic Origins|274|C|{3}{W}|Instant|||Destroy target attacking or blocking creature.|
|
||||
Eagle of the Watch|Magic Origins|275|C|{2}{W}|Creature - Bird|2|1|Flying, vigilance|
|
||||
Serra Angel|Magic Origins|276|U|{3}{W}{W}|Creature - Angel|4|4|Flying$Vigilance|
|
||||
Alhammarret, High Arbiter|Magic Origins|43|R|{5}{U}{U}|Legendary Creature - Sphinx|5|5|Flying$As Alhammarret, High Arbiter enters the battlefield, each opponent reveals his or her hand. You choose the name of a nonland card revealed this way.$Your opponent can't cast spells with the chosen name <i>(as long as this creature is on the battlefield)</i>.|
|
||||
Clash of Wills|Magic Origins|49|U|{X}{U}|Instant|||Counter target spell unless its controller pays {X}.|
|
||||
Claustrophobia|Magic Origins|50|C|{1}{U}{U}|Enchantment - Aura|||$Enchant creature$When Claustrophobia enters the battlefield, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.|
|
||||
Day's Undoing|Magic Origins|51|M|{2}{U}|Sorcery|||Each player shuffles his or her hand and graveyard into his or her library, then draws seven cards. If it's your turn, end the turn. <i>(Exile all spells and abilities on the stack, including this card. Discard down to your maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.)</i>|
|
||||
Day's Undoing|Magic Origins|51|M|{2}{U}|Sorcery|||Each player shuffles his or her hand and graveyard into his or her library, then draws 7 cards. If it's your turn, end the turn. <i>(Exile all spells and abilities on the stack, including this card. Discard down to your maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.)</i>|
|
||||
Disperse|Magic Origins|54|C|{1}{U}|Instant|||Return target nonland permanent to its owner's hand.|
|
||||
Displacement Wave|Magic Origins|55|R|{X}{U}{U}|Sorcery|||Return all nonland permanents with converted mana cost X or less to their owners' hands.|
|
||||
Faerie Miscreant|Magic Origins|57|C|{U}|Creature - Faerie Rogue|1|1|Flying <i>(This creature can't be blocked except by creatures with flying or reach.)</i>$When Faerie Miscreant enters the battlefield, if you control another creature named Faerie Miscreant, draw a card.|
|
||||
Harbinger of the Tides|58|R|{U}{U}|Creature - Merfolk Wizard|2|2|You may cast Harbinger of the Tides as though it had flash if you pay {2} more to cast it. <i>(You may cast it any time you could cast an instant.)</i>$When Harbinger of the Tides enters the battlefield, you may return target tapped creature an opponent controls to its owner's hand.|
|
||||
Harbinger of the Tides|Magic Origins|58|R|{U}{U}|Creature - Merfolk Wizard|2|2|You may cast Harbinger of the Tides as though it had flash if you pay {2} more to cast it.$When Harbinger of the Tides enters the battlefield, you may return target tapped creature an opponent controls to its owner's hand.|
|
||||
Hydrolash|Magic Origins|59|U|{2}{U}|Instant|||Attacking creatures get -2/-0 until end of turn.$Draw a card.|
|
||||
Jace, Telepath Unbound|Magic Origins|60|M||Planeswalker - Jace|5|+1: Up to one target creature gets -2/-0 until your next turn.$-3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead.$-9: You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard". $+1: Up to one target creature gets -2/-0 until your next turn.$-3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead.$-9: You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard". |
|
||||
Jace, Vryn's Prodigy|Magic Origins|60|M|{1}{U}|Legendary Creature - Human Wizard|0|2|{T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn's Prodigy, then return him to the battefield transformed under his owner's control. ${T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn''s Prodigy, then return him to the battefield transformed under his owner's control. |
|
||||
Jace's Sanctum|Magic Origins|61|R|{3}{U}|Enchantment|||Instant and sorcery spells you cast cost {1} less.$Whenever you cast an instant or sorcery spell, scry 1. <i>(Look at the top card of your library. You may put that card on the bottom of your library.)</i>|
|
||||
Jace, Telepath Unbound|Magic Origins|60|M||Planeswalker - Jace|5|+1: Up to one target creature gets -2/-0 until your next turn.$-3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead.$-9: You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard". |
|
||||
Jace, Vryn's Prodigy|Magic Origins|60|M|{1}{U}|Legendary Creature - Human Wizard|0|2|{T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn''s Prodigy, then return him to the battefield transformed under his owner's control. |
|
||||
Jace's Sanctum|Magic Origins|61|R|{3}{U}|Enchantment|||Instant and sorcery spells you cast coast {1} less to cast.$Whenever you cast an instant or a sorcery spell, scry 1.|
|
||||
Jhessian Thief|Magic Origins|62|U|{2}{U}|Creature - Human Rogue|1|3|Prowess <i>(Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)</i>$Whenever Jhessian Thief deals combat damage to a player, draw a card.|
|
||||
Maritime Guard|Magic Origins|63|C|{1}{U}|Creature - Merfolk Soldier|1|3||
|
||||
Mizzium Meddler|Magic Origins|64|R|{2}{U}|Creature - Vedalken Wizard|1|4|Flash$When Mizzium Meddler enters the battlefield, change a target of target spell or ability to Mizzium Meddler.|
|
||||
Ringwarden Owl|Magic Origins|68|C|{3}{U}{U}|Creature - Bird|3|3|Flying <i>(This creature can't be blocked except by creatures with flying or reach.)</i>$Prowess <i>(Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)</i>|
|
||||
Mizzium Meddler|Magic Origins|64|R|{2}{U}|Creature - Vedalken Wizard|1|4|Flash$When Mizzium Meddler enters the battlefield, you may change a target of target spell or ability to Mizzium Meddler.|
|
||||
Ringwarden Owl|Magic Origins|068|C|{3}{U}{U}|Creature - Bird|3|3|Flying <i>(This creature can't be blocked except by creatures with flying or reach.)</i>$Prowess <i>(Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)</i>|
|
||||
Scrapskin Drake|Magic Origins|69|C|{2}{U}|Creature - Zombie Drake|2|3|Flying$Scrapskin Drake can block only creatures with flying.|
|
||||
Send to Sleep|Magic Origins|71|C|{1}{U}|Instant|||Tap up to two target creatures.$<i>Spell mastery </i> - If there are two or more instant and/or sorcery cards in your graveyard, those creatures don't untap during their controllers' next untap steps.|
|
||||
Send to Sleep|Magic Origins|71|C|{1}{U}|Instant|||Tap up to two target creatures.$<i>Spell mastery</i> — If there are two or more instant and/or sorcery cards in your graveyard, those creatures don't untap during their controllers' next untap steps.|
|
||||
Separatist Voidmage|Magic Origins|72|C|{3}{U}|Creature - Human Wizard|2|2|When Separatist Voidmage enters the battlefield, you may return target creature to its owner's hand.|
|
||||
Soulblade Djinn|Magic Origins|75|R|{3}{U}{U}|Creature - Djinn|4|3|Flying$Whenever you cast a noncreature spell, creatures you control gets +1/+1 until end of turn.|
|
||||
Soulblade Djinn|Magic Origins|75|R|{3}{U}{U}|Creature - Djinn|4|3|Flying$Whenever you cast a noncreature spell, creatures you control get +1/+1 until end of turn.|
|
||||
Sphinx's Tutelage|Magic Origins|76|U|{2}{U}|Enchantment|||Whenever you draw a card, target opponent puts the top two cards of his or her library into his or her graveyard. If they're both nonland cards that share a color, repeat this process.${5}{U}: Draw a card, then discard a card.|
|
||||
Thopter Spy Network|Magic Origins|79|R|{2}{U}{U}|Enchantment|||At the beginning of your upkeep, if you control an artifact, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield.$Whenever one or more artifact creatures you control deal combat damage to a player, draw a card.|
|
||||
Thopter Spy Network|Magic Origins|79|R|{2}{U}{U}|Enchantment|||At the beginning of your upkeep, if you control an artifact, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield.$Whenever one or more artifact creatures you control deals combat damage to a player, draw a card.|
|
||||
Tower Geist|Magic Origins|80|U|{3}{U}|Creature - Spirit|2|2|Flying$When Tower Geist enters the battlefield, look at the top two cards of your library. Put one of them into your hand and the other into your graveyard.|
|
||||
Into the Void|Magic Origins|277|U|{3}{U}|Sorcery|||Return up to two target creatures to their owners' hands.|
|
||||
Mahamoti Djinn|Magic Origins|278|R|{4}{U}{U}|Creature - Djinn|5|6|Flying|
|
||||
Weave Fate|Magic Origins|279|C|{3}{U}|Instant|||Draw two cards.|
|
||||
Catacomb Slug|Magic Origins|86|C|{4}{B}|Creature - Slug|2|6||
|
||||
Cruel Revival|Magic Origins|88|C|{4}{B}|Instant|||Destroy target non-Zombie creature. It can't be regenerated. Return up to one target Zombie card from your graveyard to your hand.|
|
||||
Dark Petition|Magic Origins|90|R|{3}{B}{B}|Sorcery|||Search your library for a card and put that card into your hand. Then shuffle your library.$<i>Spell mastery</i> - If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B} to your mana pool.|
|
||||
Cruel Revival|Magic Origins|88|U|{4}{B}|Instant|||Destroy target non-Zombie creature. It can't be regenerated. Return up to one target Zombie card from your graveyard to your hand.|
|
||||
Dark Petition|Magic Origins|90|R|{3}{B}{B}|Sorcery|||Search your library for a card and put that card into your hand. Then shuffle your library.$<i>Spell mastery</i> — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B} to your mana pool.|
|
||||
Deadbridge Shaman|Magic Origins|91|C|{2}{B}|Creature - Elf Shaman|3|1|When Deadbridge Shaman dies, target opponent discards a card.|
|
||||
Demonic Pact|Magic Origins|92|M|{2}{B}{B}|Enchantment|||At the beginning of your upkeep, choose one that hasn't been choen - Demonic Pact deals 4 damage to target creature or player and you gain 4 life; or Target opponent discards two cards; or Draw two cards; or You lose the game.|
|
||||
Demonic Pact|Magic Origins|92|M|{2}{B}{B}|Enchantment|||At the beginning of your upkeep, choose one that hasn't been chosen —$• Demonic Pact deals 4 damage to target creature or player and you gain 4 life.$• Target opponent discards two cards.$• Draw two cards.$• You lose the game.|
|
||||
Eyeblight Assassin|Magic Origins|95|C|{2}{B}|Creature - Elf Assassin|2|2|When Eyeblight Assassin enters the battlefield, target creature an opponent controls gets -1/-1 until end of turn.|
|
||||
Gnarlroot Trapper|Magic Origins|100|U|{B}|Creature - Elf Druid|1|1|{t}, Pay 1 life: Add {G} to your mana pool. Spend this mana only to cast an Elf creature spell.${t}: Target attacking Elf you control gains deathtouch until end of turn. <i>(Any amount of damage it deals to a creature is enough to destroy it.)</i>|
|
||||
Graveblade Predator|Magic Origins|101|R|{2}{B}|Creature - Human Warrior|1|4|Deathtouch <i>(Any amount of damage this deals to a creature is enough to destroy it.)</i>$Whenever Graveblade Predator deals combat damage to a player, that player loses life equal to the number of creature cards in your graveyard.|
|
||||
Funeral-Blade Predator|Magic Origins|101|R|{2}{B}|Creature - Human Warrior|1|4|Deathtouch$Whenever Funeral-Blade Predator deals combat damage to a player, that player loses life equal to the number of creature cards in your graveyard.|
|
||||
Infernal Scarring|Magic Origins|102|C|{1}{B}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +2/+0 and has "When this creature dies, draw a card."|
|
||||
Infinite Obliteration|Magic Origins|103|R|{1}{B}{B}|Sorcery|||Name a creature card. Search target opponent's graveyard, hand, and library for any number of cards with that name and exile them. Then that player shuffles his or her library.|
|
||||
Kothophed, Soul Hoarder|Magic Origins|104|R|{4}{B}{B}|Legendary Creature - Demon|6|6|Flying$Whenever a permanent owned by another player is put into the graveyard from the battlefield, you draw one card and lose 1 life.|
|
||||
Languish|Magic Origins|105|R|{2}{B}{B}|Sorcery|||All creatures get -4/-4 until end of turn.|
|
||||
Liliana, Defiant Necromancer|Magic Origins|106|M||Planeswalker - Liliana|3|+2: Each player discards a card.$-X: Return target nonlegendary creature with converted mana cost X from your graveyard to the battlefield.$-8: You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step."|
|
||||
|
@ -26125,25 +26133,29 @@ Reave Soul|Magic Origins|115|C|{1}{B}|Sorcery|||Destroy target creature with pow
|
|||
Shambling Ghoul|Magic Origins|119|C|{1}{B}|Creature - Zombie|2|3|Shambling Ghoul enters the battlefield tapped.|
|
||||
Tainted Remedy|Magic Origins|120|R|{2}{B}|Enchantment|||If an opponent would gain life, that player loses that much life instead.|
|
||||
Undead Servant|Magic Origins|124|C|{3}{B}|Creature - Zombie|3|2|When Undead Servant enters the battlefield, put a 2/2 black Zombie creature token onto the battlefield for each card named Undead Servant in your graveyard.|
|
||||
Unholy Hunger|Magic Origins|125|C|{3}{B}{B}|Instant|||Destroy target creature.$<i>Spell mastery</i> - If there are two or more instant and/or sorcery cards in your graveyard, you gain 2 life.|
|
||||
Unholy Hunger|Magic Origins|125|C|{3}{B}{B}|Instant|||Destroy target creature.$<i>Spell mastery</i> — If there are two or more instant and/or sorcery cards in your graveyard, you gain 2 life.|
|
||||
Weight of the Underworld|Magic Origins|126|C|{3}{B}|Enchantment - Aura|||Enchant creature$Enchanted creature gets -3/-2.|
|
||||
Act of Treason|Magic Origins|129|C|{2}{R}{2}{R}|Sorcery|||Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.|
|
||||
Flesh to Dust|Magic Origins|280|C|{3}{B}{B}|Instant|||Destroy target creature. It can't be regenerated.|
|
||||
Mind Rot|Magic Origins|281|C|{2}{B}|Sorcery|||Target player discards two cards.|
|
||||
Nightmare|Magic Origins|282|R|{5}{B}|Creature - Nightmare Horse|0|0|Flying$Nightmare's power and toughness are each equal to the number of Swamps you control.|
|
||||
Sengir Vampire|Magic Origins|283|U|{3}{B}{B}|Creature - Vampire|4|4|Flying$Whenever a creature dealt damage by Sengir Vampire this turn dies, put a +1/+1 counter on Sengir Vampire.|
|
||||
Act of Treason|Magic Origins|129|C|{2}{R}|Sorcery|||Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.|
|
||||
Avaricious Dragon|Magic Origins|131|M|{2}{R}{R}|Creature - Dragon|4|4|Flying$At the beginning of your draw step, draw an additional card.$At the beginning of your end step, discard your hand.|
|
||||
Bellows Lizard|Magic Origins|132|C|{R}|Creature - Lizard|1|1|{1}{R}: Bellows Lizard gets +1/+0 until end of turn.${1}{R}: Bellows Lizard gets +1/+0 until end of turn.|
|
||||
Bellows Lizard|Magic Origins|132|C|{R}|Creature - Lizard|1|1|{1}{R}: Bellows Lizard gets +1/+0 until end of turn.|
|
||||
Boggart Brute|Magic Origins|133|C|{2}{R}|Creature - Goblin Warrior|3|2|Menace <i>(This creature can't be blocked except by two or more creatures.)</i>|
|
||||
Chandra, Fire of Kaladesh|Magic Origins|135|M|{1}{R}{R}|Legendary Creature - Human Shaman|2|2|Whenever you cast a red spell, untap Chandra, Fire of Kaladesh.${T}: Chandra, Fire of Kaladesh deals 1 damage to target player. If Chandra has dealt 3 or more damage this turn, exile her, then return her to the battlefield transformed under her owner's control.|
|
||||
Chandra, Roaring Flame|Magic Origins|135|M||Planeswalker - Chandra|4|+1: Chandra, Roaring Flame deals 2 damage to target player.$-2: Chandra, Roaring Flame deals 2 damage to target creature.$-7: Chandra, Roaring Flame deals 6 damage to each opponent. Each player dealt damage this way gets an emblem with "At the beginning of your upkeep, this emblem deals 3 damage to you."|
|
||||
Chandra, Roaring Flame|Magic Origins|135|M||Planeswalker - Chandra|4|+1: Chandra, Roaring Flame deals 2 damage to target player.$-2: Chandra, Roaring Flame deals 2 damage to target creature.$-7: Chandra, Roaring Flame deals 6 damage to each opponent. Each player dealt damage this way gets an emblem with "At the beginning of your upkeep, this emblem deals 3 damage to you."|
|
||||
Chandra's Fury|Magic Origins|136|C|{4}{R}|Instant|||Chandra's Fury deals 4 damage to target player and 1 damage to each creature that player controls.|
|
||||
Chandra's Ignition|Magic Origins|137|R|{3}{R}{R}|Sorcery|||Target creature you control deals damage equal to its power to each other creature and each opponent.|
|
||||
Cobblebrute|Magic Origins|138|C|{3}{R}{3}{R}|Creature - Elemental|5|2||
|
||||
Embermaw Hellion|Magic Origins|141|R|{3}{R}{R}|Creature - Hellion|4|5|Trample$If another red source you control would deal damage to a permanent or a player, it deals that much damage plus 1 to that permanent or that player instead.|
|
||||
Cobblebrute|Magic Origins|138|C|{3}{R}|Creature - Elemental|5|2||
|
||||
Embermaw Hellion|Magic Origins|141|R|{3}{R}{R}{3}{R}{R}|Creature - Hellion|4|54|5|Trample$Whenever another red source you control would deal damage to a permament or player, it deals that much damage plus 1 instead.$Trample$Whenever another red source you control would deal damage to a permament or player, it deals that much damage plus 1 instead.|
|
||||
Enthralling Victor|Magic Origins|142|U|{3}{R}|Creature - Human Warrior|3|2|When Enthralling Victor enters the battlefield, gain control of target creature an opponent controls with power 2 or less until end of turn. Untap that creature. It gains haste until end of turn.|
|
||||
Exquisite Firecraft|Magic Origins|143|R|{1}{R}{R}|Sorcery|||Exquisite Firecraft deals 4 damage to target creature or player.$<i>Spell mastery</i> - If there are two or more instant and/or sorcery cards in your graveyard, Exquisite Firecraft can't be countered by spells or abilities.|
|
||||
Fiery Conclusion|Magic Origins|144|C|{1}{R}|Instant|||As an additional cost to cast Fiery Conclusion, sacrifice a creature.$Fiery Conclusion deals 5 damage to target creature.|
|
||||
Fiery Impulse|Magic Origins|145|C|{R}|Instant|||Fiery Imulse deals 2 damage to target creature.$<i>Spell mastery</i> - If there are two or more instant and/or sorcery cards in your graveyard, Fiery Impulse deals 3 damage to that creature instead.|
|
||||
Exquisite Firecraft|Magic Origins|143|R|{1}{R}{R}|Sorcery|||Exquisite Firecraft deals 4 damage to target creature or player. $<i>Spell mastery</i> — If there are two or more instant and/or sorcery cards in your graveyard, Exquisite Firecraft can't be countered by spells or abilities.|
|
||||
Fiery Conclusion|Magic Origins|144|U|{1}{R}|Instant|||As an additional cost to cast Fiery Conclusion, sacrifice a creature.$Fiery Conclusion deals 5 damage to target creature.|
|
||||
Fiery Impulse|Magic Origins|145|C|{R}|Instant|||Fiery Impulse deals 2 damage to target creature.$<i>Spell mastery</i> — If there are two or more instant and/or sorcery cards in your graveyard, Fiery Impulse deals 3 damage to that creature instead.|
|
||||
Flameshadow Conjuring|Magic Origins|147|R|{3}{R}|Enchantment|||Whenever a nontoken creature enters the battlefield under your control, you may pay {R}. If you do, put a token onto the battlefield that's a copy of that creature. That token gains haste. Exile it at the beginning of the next end step.|
|
||||
Goblin Glory Chaser|Magic Origins|150|U|{R}|Creature - Goblin Warrior|1|1|Renown 1 <i>(When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)</i>$As long as Goblin Glory Chaser is renowned, it has menace. <i>(It can't be blocked except by two or more creatures.)</i>|
|
||||
Goblin Piledriver|Magic Origins|151|R|{1}{R}|Creature - Goblin Warrior|Protection from blue <i>(This creature can't be blocked, target, dealt damage, or enchanted by anything blue.)</i>$Whenever Goblin Piledriver attacks, it gets +2/+0 until end of turn for each other attacking Goblin.|
|
||||
Goblin Glory Chaser|Magic Origins|150|U|{R}|Creature - Goblin Warrior|1|1|Renown 1 <i>(When this creature deals combat damage to an opponent, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)</i>$As long as Goblin Glory Chaser is renowned, it has menace. <i>(It can't be blocked except by two or more creatures.)</i>|
|
||||
Goblin Piledriver|Magic Origins|151|R|{1}{R}|Creature - Goblin Warror|1|2|Protection from blue <i>(This creature can't be blocked, targeted, dealt damage, or enchanted by anything blue.)</i>$Whenever Goblin Piledriver attacks, it gets +2/+0 until end of turn for each other attacking goblin.|
|
||||
Infectious Bloodlust|Magic Origins|152|C|{1}{R}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +2/+1, has haste, and attacks each turn if able.$When enchanted creature dies, you may search your library for a card named Infectious Bloodlust, reveal it, put it into your hand, then shuffle your library.|
|
||||
Lightning Javelin|Magic Origins|153|C|{3}{R}|Sorcery|||Lightning Javelin deals 3 damage to target creature or player. Scry 1.|
|
||||
Molten Vortex|Magic Origins|156|R|{R}|Enchantment|||{R}, Discard a land card: Molten Vortex deals 2 damage to target creature or player.|
|
||||
|
@ -26153,6 +26165,8 @@ Seismic Elemental|Magic Origins|161|U|{3}{R}{R}|Creature - Elemental|4|4|When Se
|
|||
Subterranean Scout|Magic Origins|164|C|{1}{R}|Creature - Goblin Scout|2|1|When Subterranean Scout enters the battlefield, target creature with power 2 or less can't be blocked this turn.|
|
||||
Titan's Strength|Magic Origins|166|C|{R}|Instant|||Target creature gets +3/+1 until end of turn. Scry 1.|
|
||||
Volcanic Rambler|Magic Origins|167|C|{5}{R}|Creature - Elemental|6|4|{2}{R}: Volcanic Rambler deals 1 damage to target player.|
|
||||
Fiery Hellhound|Magic Origins|284|C|{1}{R}{R}|Creature - Elemental Hound|2|2|{R}: Fiery Hellhound gets +1/+0 until end of turn.|
|
||||
Shivan Dragon|Magic Origins|285|R|{4}{R}{R}|Creature - Dragon|5|5|Flying${R}: Shivan Dragon gets +1/+0 until end of turn.|
|
||||
Conclave Naturalists|Magic Origins|171|U|{4}{G}|Creature - Dryad|4|4|When Conclave Naturalists enters the battlefield, you may destroy target artifact or enchantment.|
|
||||
Dwynen, Gilt-Leaf Daen|Magic Origins|172|R|{2}{G}{G}|Legendary Creature - Elf Warrior|3|4|Reach$Other Elf creatures you control get +1/+1.$Whenever Dwynen, Gilt-Leaf Daen attacks, you gain 1 life for each attacking Elf you control.|
|
||||
Dwynen's Elite|Magic Origins|173|U|{1}{G}|Creature - Elf Warrior|2|2|When Dwynen's Elite enters the battlefield, if you control another Elf, put a 1/1 green Elf Warrior creature token onto the battlefield.|
|
||||
|
@ -26160,75 +26174,63 @@ Elemental Bond|Magic Origins|174|U|{2}{G}|Enchantment|||Whenever a creature with
|
|||
Elvish Visionary|Magic Origins|175|C|{1}{G}|Creature - Elf Shaman|1|1|When Elvish Visionary enters the battlefield, draw a card.|
|
||||
The Great Aurora|Magic Origins|179|M|{6}{G}{G}{G}|Sorcery|||Each player shuffles all cards from his or her hand and all permanents he or she owns into his or her library, then draws that many cards. Each player may put any number of land cards from his or her hand onto the battlefield. Exile The Great Aurora.|
|
||||
Hitchclaw Recluse|Magic Origins|181|C|{2}{G}|Creature - Spider|1|4|Reach|
|
||||
Honored Hierarch|Magic Origins|182|R|{G}|Creature - Human Druid|1|1|Renown 1 <i>(When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)<i>$As long as Honored Hierarch is renowned, it has vigilance and "{t}: Add one mana of any color to your mana pool."|
|
||||
Honored Hierarch|Magic Origins|182|R|{G}|Creature - Human Druid|1|1|Renown 1 <i>(When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)</i>$As long as Honored Hierarch is renowned, it has vigilance and "{t}: Add one mana of any color to your mana pool."|
|
||||
Joraga Invocation|Magic Origins|183|U|{4}{G}{G}|Sorcery|||Each creature you control gets +3/+3 until end of turn and must be blocked this turn if able.|
|
||||
Leaf Gilder|Magic Origins|184|C|{1}{G}|Creature - Elf Druid|2|1|{T}: Add {G} to your mana pool.|
|
||||
Managorger Hydra|Magic Origins|186|R|{2}{G}|Creature - Hydra|1|1|Trample <i>(This creature can deal excess combat damage to defending player or planeswalker while attacking.)</i>$Whenever a player casts a spell, put a +1/+1 counter on Managorger Hydra.|
|
||||
Managorger Hydra|Magic Origins|186|R|{2}{G}|Creature - Hydra|1|1|Trample$Whenever a player casts a spell, put a +1/+1 counter on Managorger Hydra.|
|
||||
Mantle of Webs|Magic Origins|187|C|{1}{G}|Enchantment - Aura|||Enchant Creature$Enchanted creature gets +1/+3 and has reach.|
|
||||
Nissa, Sage Animist|Magic Origins|189|M||Planeswalker - Nissa|3|+1: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand.$-2: Put a legendary 4/4 green Elemental creature token named Ashaya, the Awoken World onto the battlefield.$-7: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands.$|
|
||||
Nissa, Sage Animist|Magic Origins|189|M||Planeswalker - Nissa|3|+1: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand.$-2: Put a legendary 4/4 green Elemental creature token named Ashaya, the Awoken World onto the battlefield.$-7: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands.|
|
||||
Nissa, Vastwood Seer|Magic Origins|189|M|{2}{G}|Legendary Creature - Elf Scout|2|2|When Nissa, Vastwood Seer enters the battlefield, you may search your library for a basic Forest card, reveal it, put it into your hand, then shuffle your library.$Whenever a land enters the battlefield under your control, if you control seven or more lands, exile Nissa, then return her to the battlefield transformed under her owner's control.|
|
||||
Nissa's Pilgrimage|Magic Origins|190|C|{2}{G}|Sorcery|||Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library.$<i>Spell mastery</i> - If there are two or more instant and/or sorcery cards in your graveyard, search your library for up to three baic Forest cards instead of two.|
|
||||
Nissa's Pilgrimage|Magic Origins|190|C|{2}{G}|Sorcery|||Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library.$<i>Spell Mastery</i> — If there are two or more instant and/or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two.|
|
||||
Rhox Maulers|Magic Origins|196|C|{4}{G}|Creature - Rhino Soldier|4|4|Trample <i>(This creature can deal excess combat damage to defending player or planeswalker while attacking.)</i>$Renown 2 <i>(When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.)</i>|
|
||||
Sylvan Messenger|Magic Origins|199|U|{3}{G}|Creature - Elf|2|2|Trample <i>(This creature can deal excess combat damage to defending player or planeswalker while attacking.)$When Sylvan Messenger enters the battlefield, reveal the top four cards of your library. Put all Elf cards revealed this way into your hand and the rest on the bottom of your library in any order.|
|
||||
Sylvan Messenger|Magic Origins|199|U|{3}{G}|Creature - Elf|2|2|Trample$When Sylvan Messenger enters the battlefield, reveal the top four cards of your library. Put all Elf cards revealed this way into your hand and the rest on the bottom of your library in any order.|
|
||||
Timberpack Wolf|Magic Origins|200|C|{1}{G}|Creature - Wolf|2|2|Timberpack Wolf gets +1/+1 for each other creature you control named Timberpack Wolf.|
|
||||
Titanic Growth|Magic Origins|201|C|{1}{G}|Instant|||Target creature gets +4/+4 until end of turn.|
|
||||
Valeron Wardens|Magic Origins|203|U|{2}{G}|Creature - Human Monk|1|3|Renown 2 <i>(When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.)</i>$Whenever a creature you control becomes renowned, draw a card.|
|
||||
Vastwood Gorger|Magic Origins|204|C|{5}{G}|Creature - Wurm|5|6||
|
||||
Woodland Bellower|Magic Origins|207|M|{4}{G}{G}|Creature - Beast|6|5|When Woodland Bellower enters the battlefield, you may search your library for a nonlegendary green creature card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library.|
|
||||
Yeva's Forcemage|Magic Origins|208|C|{2}{G}|Creature - Elf Shaman|2|2|When Yeva's Forcemage enters the battlefield, target creature gets +2/+2 until end of turn.|
|
||||
Plummet|Magic Origins|286|C|{1}{G}|Instant|||Destroy target creature with flying.|
|
||||
Prized Unicorn|Magic Origins|287|U|{3}{G}|Creature - Unicorn|2|2|All creatures able to block Prized Unicorn do so.|
|
||||
Terra Stomper|Magic Origins|288|R|{3}{G}{G}{G}|Creature - Beast|8|8|Terra Stomper can't be countered.$Trample|
|
||||
Blazing Hellhound|Magic Origins|210|U|{2}{B}{R}|Creature - Elemental Hound|4|3|{1}, Sacrifice another creature: Blazing Hellhound deals 1 damage to target creature or player.|
|
||||
Bounding Krasis|Magic Origins|212|U|{1}{G}{U}|Creature - Fish Lizard|3|3|Flash <i>(You may cast this spell any time you could cast an instant.)</i>$When Bounding Krasis enters the battlefield, you may tap or untap target creature.|
|
||||
Citadel Castellan|Magic Origins|213|U|{1}{G}{W}|Creature - Human Knight|2|3|Vigilance <i>(Attacking doesn't cause this creature to tap.)</i>$Renown 2 <i>(When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.)</i>|
|
||||
Bounding Krasis|Magic Origins|212|U|{1}{U}{B}|Creature - Fish Lizard|3|3|Flash <i>(You may cast this spell any time you could cast an instant.)</i>$When Bounding Krasis enters the battlefield, you may tap or untap target creature.|
|
||||
Citadel Castellan|Magic Origins|213|U|{1}{G}{W}|Creature - Human Knight|2|3|Vigilance$Renown 2 <i>(When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.)</i>|
|
||||
Shaman of the Pack|Magic Origins|217|U|{1}{B}{G}|Creature - Elf Shaman|3|2|When Shaman of the Pack enters the battlefield, target opponent loses life equal to the number of Elves you control.|
|
||||
Zendikar Incarnate|Magic Origins|219|U|{2}{R}{G}|Creature - Elemental|0|4|Zendikar Incarnate's power is equal to the amount of lands you control.|
|
||||
Alhammarret's Archive|Magic Origins|221|M|{5}|Legendary Artifact|||If you would gain life, you gain twice that much life instead.$If you draw a card except the first one you draw in each of your draw steps, draw two cards instead.|
|
||||
Gold-Forged Sentinel|Magic Origins|226|U|{6}|Artifact Creature - Chimera|4|4|Flying$Flying|
|
||||
Helm of the Gods|Magic Origins|230|R|{1}|Artifact - Equipment|||Equipped creature gets +1/+1 for each enchantment you control.$Equip {1} <i>({1}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.)</i>|
|
||||
Jayemdae Tome|Magic Origins|231|U|{4}|Artifact|||{4}, {T}: Draw a card.${4}, {T}: Draw a card.|
|
||||
Alhammarret's Archive|Magic Origins|221|M|{5}|Legendary Artifact|||If you would gain life, you gain twice that much life instead. $If you would draw a card except the first one you draw in each of your draw steps, draw two cards instead.|
|
||||
Gold-Forged Sentinel|Magic Origins|226|U|{6}|Artifact Creature - Chimera|4|4|Flying|
|
||||
Helm of the Gods|Magic Origins|230|R|{1}|Artifact - Equipment|||Equipped creature gets +1/+1 for each enchantment you control.$Equip {1}|
|
||||
Jayemdae Tome|Magic Origins|231|U|{4}|Artifact|||{4}, {T}: Draw a card.|
|
||||
Meteorite|Magic Origins|233|U|{5}|Artifact|||When Meteorite enters the battlefield, it deals 2 damage to target creature or player.${T}: Add one mana of any color to your mana pool.|
|
||||
Pyromancer's Goggles|Magic Origins|236|M|{5}|Legendary Artifact|||{t}: Add {R} to you mana pool. When that mana is spent to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy.|
|
||||
Pyromancer's Goggles|Magic Origins|236|M|{5}|Artifact|||{T}: Add {R} to your mana pool. When that mana is used to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy.|
|
||||
Runed Servitor|Magic Origins|238|U|{2}|Artifact Creature - Construct|2|2|When Runed Servitor dies, each player draws a card.|
|
||||
Veteran's Sidearm|Magic Origins|242|C|{2}|Artifact - Equipment|||Equipped creature gets +1/+1.$Equip {1}|
|
||||
Battlefield Forge|Magic Origins|244|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {R} or {W} to your mana pool. Battlefield Forge deals 1 damage to you.|
|
||||
Caves of Koilos|Magic Origins|245|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {W} or {B} to your mana pool. Caves of Koilos deals 1 damage to you.|
|
||||
Llanowar Wastes|Magic Origins|248|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {B} or {G} to your mana pool. Llanowar Wastes deals 1 damage to you.|
|
||||
Shivan Reef|Magic Origins|251|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {U} or {R} to your mana pool. Shivan Reef deals 1 damage to you.|
|
||||
Yavimaya Coast|Magic Origins|252|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {G} or {U} to your mana pool. Yavimaya Coast deals 1 damage to you.|
|
||||
Plains|Magic Origins|253|L||Basic Land - Plains|||W|
|
||||
Plains|Magic Origins|254|L||Basic Land - Plains|||W|
|
||||
Plains|Magic Origins|255|L||Basic Land - Plains|||W|
|
||||
Plains|Magic Origins|256|L||Basic Land - Plains|||W|
|
||||
Island|Magic Origins|257|L||Basic Land - Island|||U|
|
||||
Island|Magic Origins|258|L||Basic Land - Island|||U|
|
||||
Island|Magic Origins|259|L||Basic Land - Island|||U|
|
||||
Island|Magic Origins|260|L||Basic Land - Island|||U|
|
||||
Swamp|Magic Origins|261|L||Basic Land - Swamp|||B|
|
||||
Swamp|Magic Origins|262|L||Basic Land - Swamp|||B|
|
||||
Swamp|Magic Origins|263|L||Basic Land - Swamp|||B|
|
||||
Swamp|Magic Origins|264|L||Basic Land - Swamp|||B|
|
||||
Mountain|Magic Origins|265|L||Basic Land - Mountain|||R|
|
||||
Mountain|Magic Origins|266|L||Basic Land - Mountain|||R|
|
||||
Mountain|Magic Origins|267|L||Basic Land - Mountain|||R|
|
||||
Mountain|Magic Origins|268|L||Basic Land - Mountain|||R|
|
||||
Forest|Magic Origins|269|L||Basic Land - Forest|||G|
|
||||
Forest|Magic Origins|270|L||Basic Land - Forest|||G|
|
||||
Forest|Magic Origins|271|L||Basic Land - Forest|||G|
|
||||
Forest|Magic Origins|272|L||Basic Land - Forest|||G|
|
||||
Aegis Angel|Magic Origins|273|R|{4}{W}{W}|Creature - Angel|5|5|Flying$When Aegis Angel enters the battlefield, another target permanent gains indestructible for as long as you control Aegis Angel.|
|
||||
Divine Verdict|Magic Origins|274|C|{3}{W}|Instant|||Destroy target attacking or blocking creature.|
|
||||
Eagle of the Watch|Magic Origins|275|C|{2}{W}|Creature - Bird|2|1|Flying, vigilance|
|
||||
Serra Angel|Magic Origins|276|U|{3}{W}{W}|Creature - Angel|4|4|Flying$Vigilance|
|
||||
Into the Void|Magic Origins|277|U|{3}{U}|Sorcery|||Return up to two target creatures to their owners' hands.|
|
||||
Mahamoti Djinn|Magic Origins|278|R|{4}{U}{U}|Creature - Djinn|5|6|Flying|
|
||||
Weave Fate|Magic Origins|279|C|{3}{U}|Instant|||Draw two cards.|
|
||||
Flesh to Dust|Magic Origins|280|C|{3}{B}{B}|Instant|||Destroy target creature. It can't be regenerated.|
|
||||
Mind Rot|Magic Origins|281|C|{2}{B}|Sorcery|||Target player discards two cards.|
|
||||
Nightmare|Magic Origins|282|R|{5}{B}|Creature - Nightmare Horse|0|0|Flying$Nightmare's power and toughness are each equal to the number of Swamps you control.|
|
||||
Sengir Vampire|Magic Origins|283|U|{3}{B}{B}|Creature - Vampire|4|4|Flying$Whenever a creature dealt damage by Sengir Vampire this turn dies, put a +1/+1 counter on Sengir Vampire.|
|
||||
Fiery Hellhound|Magic Origins|284|C|{1}{R}{R}|Creature - Elemental Hound|2|2|{R}: Fiery Hellhound gets +1/+0 until end of turn.|
|
||||
Shivan Dragon|Magic Origins|285|R|{4}{R}{R}|Creature - Dragon|5|5|Flying${R}: Shivan Dragon gets +1/+0 until end of turn.|
|
||||
Plummet|Magic Origins|286|C|{1}{G}{1}{G}|Instant|||Destroy target creature with flying.|
|
||||
Prized Unicorn|Magic Origins|287|U|{3}{G}|Creature - Unicorn|2|22|2|All creatures able to block Prized Unicorn do so.|
|
||||
Terra Stomper|Magic Origins|288|R|{3}{G}{G}{G}|Creature - Beast|8|8|Terra Stomper can't be countered.$Trample|
|
||||
Battlefield Forge|Magic Origins|244|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {R} or {W} to your mana pool. Battlefield Forge deals 1 damage to you.|
|
||||
Caves of Koilos|Magic Origins|245|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {W} or {B} to your mana pool. Caves of Koilos deals 1 damage to you.|
|
||||
Llanowar Wastes|Magic Origins|248|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {B} or {G} to your mana pool. Llanowar Wastes deals 1 damage to you.|
|
||||
Shivan Reef|Magic Origins|251|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {U} or {R} to your mana pool. Shivan Reef deals 1 damage to you.|
|
||||
Yavimaya Coast|Magic Origins|252|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {G} or {U} to your mana pool. Yavimaya Coast deals 1 damage to you.|
|
||||
Plains|Magic Origins|253|L||Basic Land - Plains|||<i>({t}: Add {W} to your mana pool.)</i>|
|
||||
Plains|Magic Origins|254|L||Basic Land - Plains|||<i>({t}: Add {W} to your mana pool.)</i>|
|
||||
Plains|Magic Origins|255|L||Basic Land - Plains|||<i>({t}: Add {W} to your mana pool.)</i>|
|
||||
Plains|Magic Origins|256|L||Basic Land - Plains|||<i>({t}: Add {W} to your mana pool.)</i>|
|
||||
Island|Magic Origins|257|L||Basic Land - Island|||<i>({t}: Add {U} to your mana pool.)</i>|
|
||||
Island|Magic Origins|258|L||Basic Land - Island|||<i>({t}: Add {U} to your mana pool.)</i>|
|
||||
Island|Magic Origins|259|L||Basic Land - Island|||<i>({t}: Add {U} to your mana pool.)</i>|
|
||||
Island|Magic Origins|260|L||Basic Land - Island|||<i>({t}: Add {U} to your mana pool.)</i>|
|
||||
Swamp|Magic Origins|261|L||Basic Land - Swamp|||<i>({t}: Add {B} to your mana pool.)</i>|
|
||||
Swamp|Magic Origins|262|L||Basic Land - Swamp|||<i>({t}: Add {B} to your mana pool.)</i>|
|
||||
Swamp|Magic Origins|263|L||Basic Land - Swamp|||<i>({t}: Add {B} to your mana pool.)</i>|
|
||||
Swamp|Magic Origins|264|L||Basic Land - Swamp|||<i>({t}: Add {B} to your mana pool.)</i>|
|
||||
Mountain|Magic Origins|265|L||Basic Land - Mountain|||<i>({t}: Add {R} to your mana pool.)</i>|
|
||||
Mountain|Magic Origins|266|L||Basic Land - Mountain|||<i>({t}: Add {R} to your mana pool.)</i>|
|
||||
Mountain|Magic Origins|267|L||Basic Land - Mountain|||<i>({t}: Add {R} to your mana pool.)</i>|
|
||||
Mountain|Magic Origins|268|L||Basic Land - Mountain|||<i>({t}: Add {R} to your mana pool.)</i>|
|
||||
Forest|Magic Origins|269|L||Basic Land - Forest|||<i>({t}: Add {G} to your mana pool.)</i>|
|
||||
Forest|Magic Origins|270|L||Basic Land - Forest|||<i>({t}: Add {G} to your mana pool.)</i>|
|
||||
Forest|Magic Origins|271|L||Basic Land - Forest|||<i>({t}: Add {G} to your mana pool.)</i>|
|
||||
Forest|Magic Origins|272|L||Basic Land - Forest|||<i>({t}: Add {G} to your mana pool.)</i>|
|
||||
Ambush Commander|Duel Decks: Anthology, Elves vs. Goblins|1|R|{3}{G}{G}|Creature - Elf|2|2|Forests you control are 1/1 green Elf creatures that are still lands.${1}{G}, Sacrifice an Elf: Target creature gets +3/+3 until end of turn.|
|
||||
Lys Alana Huntmaster|Duel Decks: Anthology, Elves vs. Goblins|10|C|{2}{G}{G}|Creature - Elf Warrior|3|3|Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield.|
|
||||
Stonewood Invoker|Duel Decks: Anthology, Elves vs. Goblins|11|C|{1}{G}|Creature - Elf Mutant|2|2|{7}{G}: Stonewood Invoker gets +5/+5 until end of turn.|
|
||||
|
|
Loading…
Reference in a new issue