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.common.SimpleStaticAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.CardsInOpponentGraveCondition;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
|
||||
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.addAbility(new SimpleStaticAbility(
|
||||
Zone.ALL, new SpellCostReductionSourceEffect(3, IntoTheStoryCondition.instance)
|
||||
).setRuleAtTheTop(true).addHint(new ConditionHint(IntoTheStoryCondition.instance, "Opponent has seven or more cards in their graveyard")));
|
||||
Zone.ALL, new SpellCostReductionSourceEffect(3, CardsInOpponentGraveCondition.SEVEN)
|
||||
).setRuleAtTheTop(true).addHint(CardsInOpponentGraveCondition.SEVEN.getHint()));
|
||||
|
||||
// Draw four cards.
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(4));
|
||||
|
@ -42,23 +43,3 @@ public final class IntoTheStory extends CardImpl {
|
|||
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;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.condition.common.CardsInOpponentGraveCondition;
|
||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||
import mage.abilities.hint.ConditionHint;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
|
@ -16,13 +17,12 @@ import mage.constants.Duration;
|
|||
import mage.constants.Zone;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Loki
|
||||
*/
|
||||
public final class JacesPhantasm extends CardImpl {
|
||||
|
||||
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.power = new MageInt(1);
|
||||
|
@ -31,7 +31,11 @@ public final class JacesPhantasm extends CardImpl {
|
|||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
// 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) {
|
||||
|
|
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.SimpleStaticAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.CardsInOpponentGraveCondition;
|
||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||
import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveEachPlayerEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||
import mage.abilities.hint.ConditionHint;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.abilities.keyword.FlashAbility;
|
||||
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.
|
||||
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||
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"
|
||||
));
|
||||
ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(
|
||||
DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield
|
||||
), ThievesGuildEnforcerCondition.instance, "and has deathtouch"));
|
||||
this.addAbility(ability);
|
||||
), CardsInOpponentGraveCondition.EIGHT, "and has deathtouch"));
|
||||
this.addAbility(ability.addHint(CardsInOpponentGraveCondition.EIGHT.getHint()));
|
||||
}
|
||||
|
||||
private ThievesGuildEnforcer(final ThievesGuildEnforcer card) {
|
||||
|
@ -71,19 +73,3 @@ public final class ThievesGuildEnforcer extends CardImpl {
|
|||
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("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("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("Murasa Rootgrazer", 229, Rarity.UNCOMMON, mage.cards.m.MurasaRootgrazer.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.condition.Condition;
|
||||
import mage.abilities.hint.ConditionHint;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.game.Game;
|
||||
import mage.game.Graveyard;
|
||||
import mage.players.Player;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Condition for -
|
||||
* Any opponent has X or more cards in their graveyard
|
||||
* @author Loki
|
||||
* Any opponent has X or more cards in their graveyard
|
||||
*
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class CardsInOpponentGraveCondition implements Condition {
|
||||
private final int value;
|
||||
public enum CardsInOpponentGraveCondition implements Condition {
|
||||
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.hint = new ConditionHint(this, "O" + this.makeStem());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player != null) {
|
||||
for (UUID playerId : game.getOpponents(source.getControllerId())) {
|
||||
Player opponent = game.getPlayer(playerId);
|
||||
if (opponent != null && opponent.getGraveyard().size() >= value)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return game
|
||||
.getOpponents(source.getControllerId())
|
||||
.stream()
|
||||
.map(game::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.map(Player::getGraveyard)
|
||||
.mapToInt(Graveyard::size)
|
||||
.anyMatch(i -> i >= this.value);
|
||||
}
|
||||
|
||||
@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