mirror of
https://github.com/correl/mage.git
synced 2024-12-26 03:00:11 +00:00
[ZNR] Implemented Mind Carver
This commit is contained in:
parent
da65fa2cc1
commit
b54c9449ef
6 changed files with 113 additions and 59 deletions
|
@ -3,6 +3,7 @@ package mage.cards.i;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.condition.common.CardsInOpponentGraveCondition;
|
||||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
|
import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
|
||||||
import mage.abilities.hint.ConditionHint;
|
import mage.abilities.hint.ConditionHint;
|
||||||
|
@ -26,8 +27,8 @@ public final class IntoTheStory extends CardImpl {
|
||||||
|
|
||||||
// This spell costs {3} less to cast if an opponent has seven or more cards in their graveyard.
|
// This spell costs {3} less to cast if an opponent has seven or more cards in their graveyard.
|
||||||
this.addAbility(new SimpleStaticAbility(
|
this.addAbility(new SimpleStaticAbility(
|
||||||
Zone.ALL, new SpellCostReductionSourceEffect(3, IntoTheStoryCondition.instance)
|
Zone.ALL, new SpellCostReductionSourceEffect(3, CardsInOpponentGraveCondition.SEVEN)
|
||||||
).setRuleAtTheTop(true).addHint(new ConditionHint(IntoTheStoryCondition.instance, "Opponent has seven or more cards in their graveyard")));
|
).setRuleAtTheTop(true).addHint(CardsInOpponentGraveCondition.SEVEN.getHint()));
|
||||||
|
|
||||||
// Draw four cards.
|
// Draw four cards.
|
||||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(4));
|
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(4));
|
||||||
|
@ -42,23 +43,3 @@ public final class IntoTheStory extends CardImpl {
|
||||||
return new IntoTheStory(this);
|
return new IntoTheStory(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum IntoTheStoryCondition implements Condition {
|
|
||||||
instance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
return game
|
|
||||||
.getOpponents(source.getControllerId())
|
|
||||||
.stream()
|
|
||||||
.map(game::getPlayer)
|
|
||||||
.map(Player::getGraveyard)
|
|
||||||
.mapToInt(Graveyard::size)
|
|
||||||
.anyMatch(i -> i >= 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "an opponent has seven or more cards in their graveyard";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
|
|
||||||
package mage.cards.j;
|
package mage.cards.j;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import mage.MageInt;
|
import mage.MageInt;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.common.CardsInOpponentGraveCondition;
|
import mage.abilities.condition.common.CardsInOpponentGraveCondition;
|
||||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
|
import mage.abilities.hint.ConditionHint;
|
||||||
import mage.abilities.keyword.FlyingAbility;
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
|
@ -16,13 +17,12 @@ import mage.constants.Duration;
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Loki
|
* @author Loki
|
||||||
*/
|
*/
|
||||||
public final class JacesPhantasm extends CardImpl {
|
public final class JacesPhantasm extends CardImpl {
|
||||||
|
|
||||||
public JacesPhantasm(UUID ownerId, CardSetInfo setInfo) {
|
public JacesPhantasm(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U}");
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}");
|
||||||
this.subtype.add(SubType.ILLUSION);
|
this.subtype.add(SubType.ILLUSION);
|
||||||
|
|
||||||
this.power = new MageInt(1);
|
this.power = new MageInt(1);
|
||||||
|
@ -31,7 +31,11 @@ public final class JacesPhantasm extends CardImpl {
|
||||||
// Flying
|
// Flying
|
||||||
this.addAbility(FlyingAbility.getInstance());
|
this.addAbility(FlyingAbility.getInstance());
|
||||||
// Jace's Phantasm gets +4/+4 as long as an opponent has ten or more cards in their graveyard.
|
// Jace's Phantasm gets +4/+4 as long as an opponent has ten or more cards in their graveyard.
|
||||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(4, 4, Duration.WhileOnBattlefield), new CardsInOpponentGraveCondition(10), "{this} gets +4/+4 as long as an opponent has ten or more cards in their graveyard")));
|
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
|
new BoostSourceEffect(4, 4, Duration.WhileOnBattlefield),
|
||||||
|
CardsInOpponentGraveCondition.TEN, "{this} gets +4/+4 as long as " +
|
||||||
|
"an opponent has ten or more cards in their graveyard"
|
||||||
|
)).addHint(CardsInOpponentGraveCondition.TEN.getHint()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public JacesPhantasm(final JacesPhantasm card) {
|
public JacesPhantasm(final JacesPhantasm card) {
|
||||||
|
|
58
Mage.Sets/src/mage/cards/m/MindCarver.java
Normal file
58
Mage.Sets/src/mage/cards/m/MindCarver.java
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
package mage.cards.m;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.condition.common.CardsInOpponentGraveCondition;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
||||||
|
import mage.abilities.keyword.EquipAbility;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class MindCarver extends CardImpl {
|
||||||
|
|
||||||
|
public MindCarver(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{B}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.EQUIPMENT);
|
||||||
|
|
||||||
|
// When Mind Carver enters the battlefield, attach it to target creature you control.
|
||||||
|
Ability ability = new EntersBattlefieldTriggeredAbility(new AttachEffect(
|
||||||
|
Outcome.BoostCreature, "attach it to target creature you control"
|
||||||
|
), false);
|
||||||
|
ability.addTarget(new TargetControlledCreaturePermanent());
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
// Equipped Creature gets +1/+0. It gets +3/+1 instead as long as an opponent has eight or more cards in their graveyard.
|
||||||
|
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
|
new BoostEquippedEffect(3, 1),
|
||||||
|
new BoostEquippedEffect(1, 0),
|
||||||
|
CardsInOpponentGraveCondition.EIGHT, "Equipped creature gets +1/+0. " +
|
||||||
|
"It gets +3/+1 instead as long as an opponent has eight or more cards in their graveyard."
|
||||||
|
)));
|
||||||
|
|
||||||
|
// Equip {2}{B}
|
||||||
|
this.addAbility(new EquipAbility(Outcome.BoostCreature, new ManaCostsImpl<>("{2}{B}")));
|
||||||
|
}
|
||||||
|
|
||||||
|
private MindCarver(final MindCarver card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MindCarver copy() {
|
||||||
|
return new MindCarver(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,10 +5,12 @@ import mage.abilities.Ability;
|
||||||
import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility;
|
import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.condition.common.CardsInOpponentGraveCondition;
|
||||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveEachPlayerEffect;
|
import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveEachPlayerEffect;
|
||||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||||
|
import mage.abilities.hint.ConditionHint;
|
||||||
import mage.abilities.keyword.DeathtouchAbility;
|
import mage.abilities.keyword.DeathtouchAbility;
|
||||||
import mage.abilities.keyword.FlashAbility;
|
import mage.abilities.keyword.FlashAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
|
@ -53,13 +55,13 @@ public final class ThievesGuildEnforcer extends CardImpl {
|
||||||
// As long as an opponent has eight or more cards in their graveyard, Thieves' Guild Enforcer gets +2/+1 and has deathtouch.
|
// As long as an opponent has eight or more cards in their graveyard, Thieves' Guild Enforcer gets +2/+1 and has deathtouch.
|
||||||
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
|
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
new BoostSourceEffect(2, 1, Duration.WhileOnBattlefield),
|
new BoostSourceEffect(2, 1, Duration.WhileOnBattlefield),
|
||||||
ThievesGuildEnforcerCondition.instance, "as long as an opponent " +
|
CardsInOpponentGraveCondition.EIGHT, "as long as an opponent " +
|
||||||
"has eight or more cards in their graveyard, {this} gets +2/+1"
|
"has eight or more cards in their graveyard, {this} gets +2/+1"
|
||||||
));
|
));
|
||||||
ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(
|
ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(
|
||||||
DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield
|
DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield
|
||||||
), ThievesGuildEnforcerCondition.instance, "and has deathtouch"));
|
), CardsInOpponentGraveCondition.EIGHT, "and has deathtouch"));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability.addHint(CardsInOpponentGraveCondition.EIGHT.getHint()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ThievesGuildEnforcer(final ThievesGuildEnforcer card) {
|
private ThievesGuildEnforcer(final ThievesGuildEnforcer card) {
|
||||||
|
@ -71,19 +73,3 @@ public final class ThievesGuildEnforcer extends CardImpl {
|
||||||
return new ThievesGuildEnforcer(this);
|
return new ThievesGuildEnforcer(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ThievesGuildEnforcerCondition implements Condition {
|
|
||||||
instance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
return game
|
|
||||||
.getOpponents(source.getControllerId())
|
|
||||||
.stream()
|
|
||||||
.map(game::getPlayer)
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.map(Player::getGraveyard)
|
|
||||||
.mapToInt(Graveyard::size)
|
|
||||||
.anyMatch(i -> i >= 8);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -112,6 +112,7 @@ public final class ZendikarRising extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Linvala, Shield of Sea Gate", 226, Rarity.RARE, mage.cards.l.LinvalaShieldOfSeaGate.class));
|
cards.add(new SetCardInfo("Linvala, Shield of Sea Gate", 226, Rarity.RARE, mage.cards.l.LinvalaShieldOfSeaGate.class));
|
||||||
cards.add(new SetCardInfo("Lotus Cobra", 193, Rarity.RARE, mage.cards.l.LotusCobra.class));
|
cards.add(new SetCardInfo("Lotus Cobra", 193, Rarity.RARE, mage.cards.l.LotusCobra.class));
|
||||||
cards.add(new SetCardInfo("Might of Murasa", 194, Rarity.COMMON, mage.cards.m.MightOfMurasa.class));
|
cards.add(new SetCardInfo("Might of Murasa", 194, Rarity.COMMON, mage.cards.m.MightOfMurasa.class));
|
||||||
|
cards.add(new SetCardInfo("Mind Carver", 113, Rarity.UNCOMMON, mage.cards.m.MindCarver.class));
|
||||||
cards.add(new SetCardInfo("Mountain", 275, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS));
|
cards.add(new SetCardInfo("Mountain", 275, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Murasa Rootgrazer", 229, Rarity.UNCOMMON, mage.cards.m.MurasaRootgrazer.class));
|
cards.add(new SetCardInfo("Murasa Rootgrazer", 229, Rarity.UNCOMMON, mage.cards.m.MurasaRootgrazer.class));
|
||||||
cards.add(new SetCardInfo("Murkwater Pathway", 260, Rarity.RARE, mage.cards.m.MurkwaterPathway.class));
|
cards.add(new SetCardInfo("Murkwater Pathway", 260, Rarity.RARE, mage.cards.m.MurkwaterPathway.class));
|
||||||
|
|
|
@ -2,33 +2,57 @@ package mage.abilities.condition.common;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.condition.Condition;
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.hint.ConditionHint;
|
||||||
|
import mage.abilities.hint.Hint;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
|
import mage.game.Graveyard;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Condition for -
|
* Condition for -
|
||||||
* Any opponent has X or more cards in their graveyard
|
* Any opponent has X or more cards in their graveyard
|
||||||
* @author Loki
|
*
|
||||||
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public class CardsInOpponentGraveCondition implements Condition {
|
public enum CardsInOpponentGraveCondition implements Condition {
|
||||||
private final int value;
|
SEVEN(7),
|
||||||
|
EIGHT(8),
|
||||||
|
TEN(10);
|
||||||
|
|
||||||
public CardsInOpponentGraveCondition(int value) {
|
private final int value;
|
||||||
|
private final Hint hint;
|
||||||
|
|
||||||
|
CardsInOpponentGraveCondition(int value) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
|
this.hint = new ConditionHint(this, "O" + this.makeStem());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Player player = game.getPlayer(source.getControllerId());
|
return game
|
||||||
if (player != null) {
|
.getOpponents(source.getControllerId())
|
||||||
for (UUID playerId : game.getOpponents(source.getControllerId())) {
|
.stream()
|
||||||
Player opponent = game.getPlayer(playerId);
|
.map(game::getPlayer)
|
||||||
if (opponent != null && opponent.getGraveyard().size() >= value)
|
.filter(Objects::nonNull)
|
||||||
return true;
|
.map(Player::getGraveyard)
|
||||||
}
|
.mapToInt(Graveyard::size)
|
||||||
}
|
.anyMatch(i -> i >= this.value);
|
||||||
return false;
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "an o" + this.makeStem();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String makeStem() {
|
||||||
|
return "pponent has " + CardUtil.numberToText(value) + " or more cards in their graveyard";
|
||||||
|
}
|
||||||
|
|
||||||
|
public Hint getHint() {
|
||||||
|
return hint;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue