mirror of
https://github.com/correl/mage.git
synced 2024-11-25 03:00:11 +00:00
Implementing Daybound/Nightbound mechanic (#8200)
* adding initial day/night support in game state * remove card exclusion for testing * added functional implementation to abilities from main branch * functionally implemented NightCondition * updated DayNightHint * added support for nightbound entering transformed at night * [MID] Implemented Unnatural Moonrise * [MID] Implemented The Celestus * added some docs * changed access for state day/night methods * added transformation to day/night switch * re-added unfinished filter, removed day/night cards * fixed some errors with transforming * added hints to all day/night cards * added transformation prevention plus a test * added Immerwolf test * [MID] Implemented Tovolar, Dire Overlord / Tovolar, The Midnight Scourge * refactored some cards to not use isTransformable * removed transformable parameter * simplified some transform code * fixed null pointer exception * removed unnecessary canTransform method * fixed a small error * reworked implementation of rule 701.28f * small change in transform logic * fixed failiing test * fixed verify failure * small merge change * added support for day/night switching based on spells cast * [MID] Implemented Curse of Leeches / Leeching Lurkers * moved day/night handling to untap step * added tests for cards which set day and trigger from a change * [MID] Implemented Ludevic, Necrogenius / Olag, Ludevic's Hubris * added support for creatures transforming to match day/night when necessary * fixed verify failures * fixed another verify failure * remove temporary verify skip * added transform message * removed unnecessary transform message * [MID] Implemented Angelic Enforcer / Enduring Angel * updated DayNightHint with more information * fixed verify failure * merge fix * fixed Startled Awake / Persistent Nightmare / Moonmist interaction * added another test for Moonmist * merge fix * merge fix * [MID] Implemented Baneblade Scoundrel / Baneclaw Marauder * merge fix * [MID] various text fixes * [MID] a few more text fixes * Merge fix * Improved transform game logs (hints, source), fixed day/night logs, fixed miss game param (due code style); * fixed a test failure * Merge fix Co-authored-by: Oleg Agafonov <jaydi85@gmail.com>
This commit is contained in:
parent
6d4e5672c3
commit
30afb11cd2
305 changed files with 2174 additions and 1064 deletions
|
@ -28,7 +28,6 @@ public final class AberrantResearcher extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.p.PerfectedForm.class;
|
||||
|
||||
// Flying
|
||||
|
@ -71,7 +70,7 @@ class AberrantResearcherEffect extends OneShotEffect {
|
|||
.noneMatch(card -> card.isInstantOrSorcery(game))) {
|
||||
return false;
|
||||
}
|
||||
new TransformSourceEffect(true).apply(game, source);
|
||||
new TransformSourceEffect().apply(game, source);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,6 @@ public final class AccursedWitch extends CardImpl {
|
|||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.i.InfectiousCurse.class;
|
||||
|
||||
// Spells your opponents cast that target Accursed Witch cost {1} less to cast.
|
||||
|
|
|
@ -20,7 +20,6 @@ public final class AfflictedDeserter extends CardImpl {
|
|||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.w.WerewolfRansacker.class;
|
||||
|
||||
this.power = new MageInt(3);
|
||||
|
|
|
@ -36,7 +36,6 @@ public final class AmbitiousFarmhand extends CardImpl {
|
|||
this.subtype.add(SubType.PEASANT);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.s.SeasonedCathar.class;
|
||||
|
||||
// When Ambitious Farmhand enters the battlefield, you may search your library for a basic Plains card, reveal it, put it into your hand, then shuffle.
|
||||
|
@ -47,7 +46,7 @@ public final class AmbitiousFarmhand extends CardImpl {
|
|||
// Coven—{1}{W}{W}: Transform Ambitious Farmhand. Activate only if you control three or more creatures with different powers.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ActivateIfConditionActivatedAbility(
|
||||
Zone.BATTLEFIELD, new TransformSourceEffect(true),
|
||||
Zone.BATTLEFIELD, new TransformSourceEffect(),
|
||||
new ManaCostsImpl<>("{1}{W}{W}"), CovenCondition.instance
|
||||
).setAbilityWord(AbilityWord.COVEN).addHint(CovenHint.instance));
|
||||
}
|
||||
|
|
|
@ -38,7 +38,6 @@ public final class AnakinSkywalker extends CardImpl {
|
|||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.d.DarthVader.class;
|
||||
|
||||
// Whenever another creature dies, put a +1/+1 counter on Anakin Skywalker.
|
||||
|
@ -82,7 +81,7 @@ class AnakinSkywalkerEffect extends ReplacementEffectImpl {
|
|||
Permanent permanent = game.getPermanent(event.getTargetId());
|
||||
if (permanent != null) {
|
||||
permanent.regenerate(source, game);
|
||||
return new TransformSourceEffect(true).apply(game, source);
|
||||
return new TransformSourceEffect().apply(game, source);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
60
Mage.Sets/src/mage/cards/a/AngelicEnforcer.java
Normal file
60
Mage.Sets/src/mage/cards/a/AngelicEnforcer.java
Normal file
|
@ -0,0 +1,60 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.dynamicvalue.common.ControllerLifeCount;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
|
||||
import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.HexproofAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AngelicEnforcer extends CardImpl {
|
||||
|
||||
public AngelicEnforcer(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.subtype.add(SubType.ANGEL);
|
||||
this.power = new MageInt(0);
|
||||
this.toughness = new MageInt(0);
|
||||
this.color.setWhite(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// You have hexproof.
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControllerEffect(HexproofAbility.getInstance())));
|
||||
|
||||
// Angelic Enforcer's power and toughness are each equal to your life total.
|
||||
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerToughnessSourceEffect(
|
||||
ControllerLifeCount.instance, Duration.EndOfGame
|
||||
).setText("{this}'s power and toughness are each equal to your life total")));
|
||||
|
||||
// Whenever Angelic Enforcer attacks, double your life total.
|
||||
this.addAbility(new AttacksTriggeredAbility(new GainLifeEffect(
|
||||
ControllerLifeCount.instance
|
||||
).setText("double your life total")));
|
||||
}
|
||||
|
||||
private AngelicEnforcer(final AngelicEnforcer card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AngelicEnforcer copy() {
|
||||
return new AngelicEnforcer(this);
|
||||
}
|
||||
}
|
|
@ -1,30 +1,23 @@
|
|||
|
||||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.TransformTargetEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
|
||||
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.keyword.*;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class ArchangelAvacyn extends CardImpl {
|
||||
|
@ -37,14 +30,13 @@ public final class ArchangelAvacyn extends CardImpl {
|
|||
}
|
||||
|
||||
public ArchangelAvacyn(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{W}{W}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}");
|
||||
|
||||
addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ANGEL);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = AvacynThePurifier.class;
|
||||
|
||||
// Flash
|
||||
|
@ -57,15 +49,18 @@ public final class ArchangelAvacyn extends CardImpl {
|
|||
this.addAbility(VigilanceAbility.getInstance());
|
||||
|
||||
// When Archangel Avacyn enters the battlefield, creatures you control gain indestructible until end of turn.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(
|
||||
new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn,
|
||||
new FilterControlledCreaturePermanent("creatures you control")), false);
|
||||
this.addAbility(ability);
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new GainAbilityControlledEffect(
|
||||
IndestructibleAbility.getInstance(), Duration.EndOfTurn,
|
||||
StaticFilters.FILTER_PERMANENT_CREATURES
|
||||
), false));
|
||||
|
||||
// When a non-Angel creature you control dies, transform Archangel Avacyn at the beginning of the next upkeep.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(new ArchangelAvacynEffect(), false, filter));
|
||||
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(
|
||||
new CreateDelayedTriggeredAbilityEffect(
|
||||
new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new TransformSourceEffect())
|
||||
).setText("transform {this} at the beginning of the next upkeep"), false, filter
|
||||
).setTriggerPhrase("When a non-Angel creature you control dies, "));
|
||||
}
|
||||
|
||||
private ArchangelAvacyn(final ArchangelAvacyn card) {
|
||||
|
@ -77,36 +72,3 @@ public final class ArchangelAvacyn extends CardImpl {
|
|||
return new ArchangelAvacyn(this);
|
||||
}
|
||||
}
|
||||
|
||||
class ArchangelAvacynEffect extends OneShotEffect {
|
||||
|
||||
private static final String effectText = "transform {this} at the beginning of the next upkeep";
|
||||
|
||||
ArchangelAvacynEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = effectText;
|
||||
}
|
||||
|
||||
ArchangelAvacynEffect(ArchangelAvacynEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
MageObject sourceObject = source.getSourceObjectIfItStillExists(game);
|
||||
if (sourceObject instanceof Permanent) {
|
||||
//create delayed triggered ability
|
||||
Effect effect = new TransformTargetEffect(false);
|
||||
effect.setTargetPointer(new FixedTarget((Permanent) sourceObject, game));
|
||||
AtTheBeginOfNextUpkeepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(effect);
|
||||
game.addDelayedTriggeredAbility(delayedAbility, source);
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArchangelAvacynEffect copy() {
|
||||
return new ArchangelAvacynEffect(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,7 +39,6 @@ public final class ArchdemonOfGreed extends CardImpl {
|
|||
this.color.setBlack(true);
|
||||
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
this.power = new MageInt(9);
|
||||
this.toughness = new MageInt(9);
|
||||
|
|
|
@ -26,7 +26,6 @@ public final class ArchiveHaunt extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
this.color.setBlue(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
|
|
|
@ -29,7 +29,6 @@ public final class ArguelsBloodFast extends CardImpl {
|
|||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
|
||||
|
||||
addSuperType(SuperType.LEGENDARY);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.t.TempleOfAclazotz.class;
|
||||
|
||||
// {1}{B}, Pay 2 life: Draw a card.
|
||||
|
@ -40,7 +39,7 @@ public final class ArguelsBloodFast extends CardImpl {
|
|||
// At the beginning of your upkeep, if you have 5 or less life, you may transform Arguel's Blood Fast.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
||||
new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(true), TargetController.YOU, true),
|
||||
new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(), TargetController.YOU, true),
|
||||
FatefulHourCondition.instance,
|
||||
"At the beginning of your upkeep, if you have 5 or less life, you may transform {this}"
|
||||
));
|
||||
|
|
|
@ -35,7 +35,6 @@ public final class ArlinnEmbracedByTheMoon extends CardImpl {
|
|||
this.color.setGreen(true);
|
||||
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
// +1: Creatures you control get +1/+1 and gain trample until end of turn.
|
||||
Effect effect = new BoostControlledEffect(1, 1, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE);
|
||||
|
@ -50,7 +49,7 @@ public final class ArlinnEmbracedByTheMoon extends CardImpl {
|
|||
this.addAbility(new TransformAbility());
|
||||
ability = new LoyaltyAbility(new DamageTargetEffect(3), -1);
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
ability.addEffect(new TransformSourceEffect(false));
|
||||
ability.addEffect(new TransformSourceEffect());
|
||||
this.addAbility(ability);
|
||||
|
||||
// -6: You get an emblem with "Creatures you control have haste and '{T}: This creature deals damage equal to its power to any target.'"
|
||||
|
|
|
@ -32,7 +32,6 @@ public final class ArlinnKord extends CardImpl {
|
|||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ARLINN);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = ArlinnEmbracedByTheMoon.class;
|
||||
|
||||
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3));
|
||||
|
@ -53,7 +52,7 @@ public final class ArlinnKord extends CardImpl {
|
|||
// 0: Create a 2/2 green Wolf creature token. Transform Arlinn Kord.
|
||||
this.addAbility(new TransformAbility());
|
||||
ability = new LoyaltyAbility(new CreateTokenEffect(new WolfToken()), 0);
|
||||
ability.addEffect(new TransformSourceEffect(true));
|
||||
ability.addEffect(new TransformSourceEffect());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@ public final class ArlinnTheMoonsFury extends CardImpl {
|
|||
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4));
|
||||
this.color.setRed(true);
|
||||
this.color.setGreen(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Nightbound
|
||||
|
|
|
@ -35,7 +35,6 @@ public final class ArlinnThePacksHope extends CardImpl {
|
|||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ARLINN);
|
||||
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4));
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.a.ArlinnTheMoonsFury.class;
|
||||
|
||||
// Daybound
|
||||
|
|
|
@ -26,7 +26,6 @@ public final class AshmouthDragon extends CardImpl {
|
|||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setRed(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
|
|
|
@ -25,7 +25,6 @@ public final class AutumnalGloom extends CardImpl {
|
|||
|
||||
public AutumnalGloom(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = AncientOfTheEquinox.class;
|
||||
|
||||
// {B}: Put the top card of your library into your graveyard.
|
||||
|
@ -33,7 +32,7 @@ public final class AutumnalGloom extends CardImpl {
|
|||
|
||||
// <i>Delirium</i> — At the beginning of your end step, if there are four or more card types among cards in your graveyard, transform Autumnal Gloom.
|
||||
this.addAbility(new TransformAbility());
|
||||
Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), TargetController.YOU, DeliriumCondition.instance, false);
|
||||
Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), TargetController.YOU, DeliriumCondition.instance, false);
|
||||
ability.setAbilityWord(AbilityWord.DELIRIUM);
|
||||
ability.addHint(CardTypesInGraveyardHint.YOU);
|
||||
this.addAbility(ability);
|
||||
|
|
|
@ -27,12 +27,11 @@ public final class AvacynianMissionaries extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.l.LunarchInquisitors.class;
|
||||
|
||||
// At the beginning of your end step, if Avacynian Missionaries is equipped, transform it.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), TargetController.YOU, EquippedSourceCondition.instance, false));
|
||||
this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), TargetController.YOU, EquippedSourceCondition.instance, false));
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@ public final class AwokenDemon extends CardImpl {
|
|||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setBlack(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,6 @@ public final class AzcantaTheSunkenRuin extends CardImpl {
|
|||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
// (Transforms from Search for Azcanta)/
|
||||
// {T} : Add {U}.
|
||||
|
|
|
@ -36,7 +36,6 @@ public final class AzorsGateway extends CardImpl {
|
|||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
|
||||
|
||||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.s.SanctumOfTheSun.class;
|
||||
|
||||
// {1}, {T}: Draw a card, then exile a card from your hand. If cards with five or more different converted mana costs are exiled with Azor's Gateway, you gain 5 life, untap Azor's Gateway, and transform it.
|
||||
|
@ -94,7 +93,7 @@ class AzorsGatewayEffect extends OneShotEffect {
|
|||
if (usedCMC.size() > 4) {
|
||||
controller.gainLife(4, game, source);
|
||||
new UntapSourceEffect().apply(game, source);
|
||||
new TransformSourceEffect(true).apply(game, source);
|
||||
new TransformSourceEffect().apply(game, source);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -23,7 +23,6 @@ public final class BaithookAngler extends CardImpl {
|
|||
this.subtype.add(SubType.PEASANT);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.h.HookHauntDrifter.class;
|
||||
|
||||
// Disturb {1}{U}
|
||||
|
|
|
@ -22,7 +22,6 @@ public final class BaneOfHanweir extends CardImpl {
|
|||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(5);
|
||||
|
|
57
Mage.Sets/src/mage/cards/b/BanebladeScoundrel.java
Normal file
57
Mage.Sets/src/mage/cards/b/BanebladeScoundrel.java
Normal file
|
@ -0,0 +1,57 @@
|
|||
package mage.cards.b;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.BecomesBlockedSourceTriggeredAbility;
|
||||
import mage.abilities.effects.common.continuous.BoostAllEffect;
|
||||
import mage.abilities.keyword.DayboundAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.BlockingOrBlockedBySourcePredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class BanebladeScoundrel extends CardImpl {
|
||||
|
||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
|
||||
|
||||
static {
|
||||
filter.add(BlockingOrBlockedBySourcePredicate.BLOCKING);
|
||||
}
|
||||
|
||||
public BanebladeScoundrel(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.ROGUE);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(3);
|
||||
this.secondSideCardClazz = mage.cards.b.BaneclawMarauder.class;
|
||||
|
||||
// Whenever Baneblade Scoundrel becomes blocked, each creature blocking it gets -1/-1 until end of turn.
|
||||
this.addAbility(new BecomesBlockedSourceTriggeredAbility(new BoostAllEffect(
|
||||
-1, -1, Duration.EndOfTurn, filter, false
|
||||
).setText("each creature blocking it gets -1/-1 until end of turn"), false));
|
||||
|
||||
// Daybound
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DayboundAbility());
|
||||
}
|
||||
|
||||
private BanebladeScoundrel(final BanebladeScoundrel card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BanebladeScoundrel copy() {
|
||||
return new BanebladeScoundrel(this);
|
||||
}
|
||||
}
|
126
Mage.Sets/src/mage/cards/b/BaneclawMarauder.java
Normal file
126
Mage.Sets/src/mage/cards/b/BaneclawMarauder.java
Normal file
|
@ -0,0 +1,126 @@
|
|||
package mage.cards.b;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObjectReference;
|
||||
import mage.abilities.common.BecomesBlockedSourceTriggeredAbility;
|
||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||
import mage.abilities.effects.common.LoseLifeTargetControllerEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostAllEffect;
|
||||
import mage.abilities.keyword.NightboundAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.WatcherScope;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.ObjectSourcePlayer;
|
||||
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
||||
import mage.filter.predicate.permanent.BlockingOrBlockedBySourcePredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.watchers.Watcher;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class BaneclawMarauder extends CardImpl {
|
||||
|
||||
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
|
||||
private static final FilterPermanent filter2 = new FilterCreaturePermanent("a creature blocking {this}");
|
||||
|
||||
static {
|
||||
filter.add(BlockingOrBlockedBySourcePredicate.BLOCKING);
|
||||
filter2.add(BaneclawMarauderPredicate.instance);
|
||||
}
|
||||
|
||||
public BaneclawMarauder(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setBlack(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Whenever Baneclaw Marauder becomes blocked, each creature blocking it gets -1/-1 until end of turn.
|
||||
this.addAbility(new BecomesBlockedSourceTriggeredAbility(new BoostAllEffect(
|
||||
-1, -1, Duration.EndOfTurn, filter, false
|
||||
).setText("each creature blocking it gets -1/-1 until end of turn"), false));
|
||||
|
||||
// Whenever a creature blocking Baneclaw Marauder dies, its controller loses 1 life.
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(
|
||||
new LoseLifeTargetControllerEffect(1)
|
||||
.setText("that creature's controller loses 1 life"),
|
||||
false, filter2, true
|
||||
), new BaneclawMarauderWatcher());
|
||||
|
||||
// Nightbound
|
||||
this.addAbility(new NightboundAbility());
|
||||
}
|
||||
|
||||
private BaneclawMarauder(final BaneclawMarauder card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaneclawMarauder copy() {
|
||||
return new BaneclawMarauder(this);
|
||||
}
|
||||
}
|
||||
|
||||
enum BaneclawMarauderPredicate implements ObjectSourcePlayerPredicate<Permanent> {
|
||||
instance;
|
||||
|
||||
@Override
|
||||
public boolean apply(ObjectSourcePlayer<Permanent> input, Game game) {
|
||||
return BaneclawMarauderWatcher.check(input.getSourceId(), input.getObject(), game);
|
||||
}
|
||||
}
|
||||
|
||||
class BaneclawMarauderWatcher extends Watcher {
|
||||
|
||||
private final Map<MageObjectReference, Set<MageObjectReference>> blockerMap = new HashMap<>();
|
||||
|
||||
BaneclawMarauderWatcher() {
|
||||
super(WatcherScope.GAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void watch(GameEvent event, Game game) {
|
||||
switch (event.getType()) {
|
||||
case BLOCKER_DECLARED:
|
||||
blockerMap
|
||||
.computeIfAbsent(new MageObjectReference(event.getTargetId(), game), x -> new HashSet<>())
|
||||
.add(new MageObjectReference(event.getSourceId(), game));
|
||||
return;
|
||||
case END_COMBAT_STEP_POST:
|
||||
blockerMap.clear();
|
||||
return;
|
||||
case REMOVED_FROM_COMBAT:
|
||||
blockerMap
|
||||
.values()
|
||||
.stream()
|
||||
.forEach(set -> set.removeIf(mor -> mor.refersTo(event.getTargetId(), game)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
super.reset();
|
||||
blockerMap.clear();
|
||||
}
|
||||
|
||||
static boolean check(UUID sourceId, Permanent blocker, Game game) {
|
||||
return game.getState()
|
||||
.getWatcher(BaneclawMarauderWatcher.class)
|
||||
.blockerMap
|
||||
.getOrDefault(new MageObjectReference(sourceId, game), Collections.emptySet())
|
||||
.stream()
|
||||
.anyMatch(mor -> mor.refersTo(blocker, game));
|
||||
}
|
||||
}
|
|
@ -28,7 +28,6 @@ public final class BenevolentGeist extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
this.color.setBlue(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
|
|
|
@ -24,13 +24,12 @@ public final class BereavedSurvivor extends CardImpl {
|
|||
this.subtype.add(SubType.PEASANT);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.d.DauntlessAvenger.class;
|
||||
|
||||
// When another creature you control dies, transform Bereaved Survivor.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(
|
||||
new TransformSourceEffect(true), false,
|
||||
new TransformSourceEffect(), false,
|
||||
StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
|
||||
).setTriggerPhrase("When another creature you control dies, "));
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ public final class BirdAdmirer extends CardImpl {
|
|||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(4);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.w.WingShredder.class;
|
||||
|
||||
// Reach
|
||||
|
|
|
@ -41,7 +41,6 @@ public final class BloodlineKeeper extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.l.LordOfLineage.class;
|
||||
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
@ -50,7 +49,7 @@ public final class BloodlineKeeper extends CardImpl {
|
|||
// {B}: Transform Bloodline Keeper. Activate this ability only if you control five or more Vampires.
|
||||
this.addAbility(new TransformAbility());
|
||||
Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
|
||||
new TransformSourceEffect(true),
|
||||
new TransformSourceEffect(),
|
||||
new ManaCostsImpl("{B}"),
|
||||
new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 4));
|
||||
this.addAbility(ability);
|
||||
|
|
|
@ -33,8 +33,6 @@ public final class BloodswornSquire extends CardImpl {
|
|||
this.subtype.add(SubType.SOLDIER);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.b.BloodswornKnight.class;
|
||||
|
||||
this.addAbility(new TransformAbility());
|
||||
|
@ -47,7 +45,7 @@ public final class BloodswornSquire extends CardImpl {
|
|||
ability.addCost(new DiscardCardCost());
|
||||
ability.addEffect(new TapSourceEffect().setText("tap it"));
|
||||
ability.addEffect(new ConditionalOneShotEffect(
|
||||
new TransformSourceEffect(true, true),
|
||||
new TransformSourceEffect(),
|
||||
new CardsInControllerGraveyardCondition(4, StaticFilters.FILTER_CARD_CREATURES),
|
||||
"Then if there are four or more creature cards in your graveyard, transform {this}"
|
||||
));
|
||||
|
|
|
@ -2,18 +2,11 @@ package mage.cards.b;
|
|||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbility;
|
||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.common.WerewolfBackTriggeredAbility;
|
||||
import mage.abilities.condition.common.TwoOrMoreSpellsWereCastLastTurnCondition;
|
||||
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.TargetController;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -30,7 +23,6 @@ public final class BrandedHowler extends CardImpl {
|
|||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Branded Howler.
|
||||
this.addAbility(new WerewolfBackTriggeredAbility());
|
||||
|
|
|
@ -21,7 +21,6 @@ public final class BreakneckRider extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.n.NeckBreaker.class;
|
||||
|
||||
// At the beginning of each upkeep, if no spells were cast last turn, transform Breakneck Rider.
|
||||
|
|
|
@ -32,7 +32,6 @@ public final class BrutalCathar extends CardImpl {
|
|||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.m.MoonrageBrute.class;
|
||||
|
||||
// When this creature enters the battlefield or transforms into Brutal Cathar, exile target creature an opponent controls until this creature leaves the battlefield.
|
||||
|
|
|
@ -24,7 +24,6 @@ public final class BurlyBreaker extends CardImpl {
|
|||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.power = new MageInt(6);
|
||||
this.toughness = new MageInt(5);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.d.DireStrainDemolisher.class;
|
||||
|
||||
// Ward {1}
|
||||
|
|
|
@ -28,14 +28,12 @@ public final class CatapultFodder extends CardImpl {
|
|||
this.subtype.add(SubType.ZOMBIE);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(5);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.c.CatapultCaptain.class;
|
||||
|
||||
// At the beginning of combat on your turn, if you control three or more creatures that each have toughness greater than their power, transform Catapult Fodder.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
||||
new BeginningOfCombatTriggeredAbility(new TransformSourceEffect(true, true), TargetController.YOU, false),
|
||||
new BeginningOfCombatTriggeredAbility(new TransformSourceEffect(), TargetController.YOU, false),
|
||||
CatapultFodderCondition.instance,
|
||||
"At the beginning of combat on your turn, if you control three or more creatures that each have toughness greater than their power, transform {this}"
|
||||
));
|
||||
|
|
|
@ -25,7 +25,6 @@ public final class ChaliceOfLife extends CardImpl {
|
|||
public ChaliceOfLife(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = ChaliceOfDeath.class;
|
||||
this.addAbility(new TransformAbility());
|
||||
|
||||
|
@ -66,8 +65,7 @@ class ChaliceOfLifeEffect extends OneShotEffect {
|
|||
|
||||
// if you have at least 10 life more than your starting life total, transform Chalice of Life.
|
||||
if (player.getLife() >= game.getStartingLife() + 10) {
|
||||
permanent.transform(game);
|
||||
game.informPlayers(permanent.getName() + " transforms into " + permanent.getSecondCardFace().getName());
|
||||
permanent.transform(source, game);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,7 +45,6 @@ public final class ChandraFireOfKaladesh extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = ChandraRoaringFlame.class;
|
||||
|
||||
// Whenever you cast a red spell, untap Chandra, Fire of Kaladesh.
|
||||
|
|
|
@ -33,7 +33,6 @@ public final class ChandraRoaringFlame extends CardImpl {
|
|||
this.color.setRed(true);
|
||||
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(4));
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@ public final class ChapelShieldgeist extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
this.color.setWhite(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
|
|
|
@ -25,7 +25,6 @@ public final class ChaplainOfAlms extends CardImpl {
|
|||
this.subtype.add(SubType.CLERIC);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.c.ChapelShieldgeist.class;
|
||||
|
||||
// First strike
|
||||
|
|
|
@ -22,13 +22,12 @@ public final class ChillingChronicle extends CardImpl {
|
|||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
|
||||
|
||||
this.color.setBlue(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// {1}, {T}: Tap target nonland permanent. Transform Chilling Chronicle.
|
||||
Ability ability = new SimpleActivatedAbility(new TapTargetEffect(), new GenericManaCost(1));
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addEffect(new TransformSourceEffect(false));
|
||||
ability.addEffect(new TransformSourceEffect());
|
||||
ability.addTarget(new TargetNonlandPermanent());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
@ -37,12 +37,11 @@ public final class ChosenOfMarkov extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.m.MarkovsServant.class;
|
||||
|
||||
// {tap}, Tap an untapped Vampire you control: Transform Chosen of Markov.
|
||||
this.addAbility(new TransformAbility());
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), new TapSourceCost());
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), new TapSourceCost());
|
||||
ability.addCost(new TapTargetCost(new TargetControlledPermanent(filter)));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
package mage.cards.c;
|
||||
|
||||
import java.util.UUID;
|
||||
|
@ -12,7 +11,6 @@ import mage.abilities.keyword.TransformAbility;
|
|||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.h.HomicidalBruteWatcher;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Outcome;
|
||||
|
@ -31,7 +29,6 @@ public final class CivilizedScholar extends CardImpl {
|
|||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.ADVISOR);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.h.HomicidalBrute.class;
|
||||
|
||||
this.power = new MageInt(0);
|
||||
|
@ -39,7 +36,7 @@ public final class CivilizedScholar extends CardImpl {
|
|||
|
||||
// {tap}: Draw a card, then discard a card. If a creature card is discarded this way, untap Civilized Scholar, then transform it.
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CivilizedScholarEffect(), new TapSourceCost()));
|
||||
this.addAbility(new TransformAbility(), new HomicidalBruteWatcher());
|
||||
this.addAbility(new TransformAbility());
|
||||
}
|
||||
|
||||
private CivilizedScholar(final CivilizedScholar card) {
|
||||
|
@ -80,7 +77,7 @@ class CivilizedScholarEffect extends OneShotEffect {
|
|||
Permanent permanent = game.getPermanent(source.getSourceId());
|
||||
if (permanent != null) {
|
||||
permanent.untap(game);
|
||||
permanent.transform(game);
|
||||
permanent.transform(source, game);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -25,12 +25,11 @@ public final class CloisteredYouth extends CardImpl {
|
|||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.u.UnholyFiend.class;
|
||||
|
||||
// At the beginning of your upkeep, you may transform Cloistered Youth.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(true), TargetController.YOU, true));
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(), TargetController.YOU, true));
|
||||
}
|
||||
|
||||
private CloisteredYouth(final CloisteredYouth card) {
|
||||
|
|
|
@ -33,7 +33,6 @@ public final class ConduitOfStorms extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = ConduitOfEmrakul.class;
|
||||
|
||||
// Whenever Conduit of Storms attacks, add {R} at the beginning of your next main phase this turn.
|
||||
|
@ -44,7 +43,7 @@ public final class ConduitOfStorms extends CardImpl {
|
|||
this.addAbility(new AttacksTriggeredAbility(effect, false));
|
||||
// {3}{R}{R}: Transform Conduit of Storms.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), new ManaCostsImpl("{3}{R}{R}")));
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), new ManaCostsImpl("{3}{R}{R}")));
|
||||
}
|
||||
|
||||
private ConduitOfStorms(final ConduitOfStorms card) {
|
||||
|
|
|
@ -27,7 +27,6 @@ public final class ConquerorsGalleon extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(10);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = ConquerorsFoothold.class;
|
||||
|
||||
// When Conqueror's Galleon attacks, exile it at the end of combat, then return it to the battlefield transformed under your control.
|
||||
|
|
|
@ -3,18 +3,12 @@ package mage.cards.c;
|
|||
import java.util.UUID;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbility;
|
||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
||||
import mage.abilities.condition.common.NoSpellsWereCastLastTurnCondition;
|
||||
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.TargetController;
|
||||
|
||||
/**
|
||||
* @author fireshoes
|
||||
|
@ -28,7 +22,6 @@ public final class ConvictedKiller extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.b.BrandedHowler.class;
|
||||
|
||||
// At the beginning of each upkeep, if no spells were cast last turn, transform Convicted Killer.
|
||||
|
|
|
@ -39,7 +39,6 @@ public final class CovertCutpurse extends CardImpl {
|
|||
this.subtype.add(SubType.ROGUE);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.c.CovetousGeist.class;
|
||||
|
||||
// When Covert Cutpurse enters the battlefield, destroy target creature you don't control that was dealt damage this turn.
|
||||
|
|
|
@ -24,7 +24,6 @@ public final class CovetousCastaway extends CardImpl {
|
|||
this.subtype.add(SubType.HUMAN);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(3);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.g.GhostlyCastigator.class;
|
||||
|
||||
// When Covetous Castaway dies, mill three cards.
|
||||
|
|
|
@ -25,7 +25,6 @@ public final class CovetousGeist extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
this.color.setBlack(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
|
|
|
@ -37,7 +37,6 @@ public final class CreepingInn extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(7);
|
||||
this.color.setBlack(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Whenever Creeping Inn attacks, you may exile a creature card from your graveyard.
|
||||
|
@ -46,7 +45,7 @@ public final class CreepingInn extends CardImpl {
|
|||
this.addAbility(new AttacksTriggeredAbility(new CreepingInnEffect()));
|
||||
|
||||
// {4}: Creeping Inn phases out.
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PhaseOutSourceEffect(), new ManaCostsImpl("{4}")));
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PhaseOutSourceEffect(), new ManaCostsImpl<>("{4}")));
|
||||
}
|
||||
|
||||
private CreepingInn(final CreepingInn card) {
|
||||
|
|
|
@ -25,7 +25,6 @@ public final class CryptolithFragment extends CardImpl {
|
|||
public CryptolithFragment(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.a.AuroraOfEmrakul.class;
|
||||
|
||||
// Cryptolith Fragment enters the battlefield tapped.
|
||||
|
@ -39,7 +38,7 @@ public final class CryptolithFragment extends CardImpl {
|
|||
// At the beginning of your upkeep, if each player has 10 or less life, transform Cryptolith Fragment.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
||||
new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(true), TargetController.YOU, false),
|
||||
new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(), TargetController.YOU, false),
|
||||
new XorLessLifeCondition(XorLessLifeCondition.CheckType.EACH_PLAYER, 10),
|
||||
"At the beginning of your upkeep, if each player has 10 or less life, transform Cryptolith Fragment."));
|
||||
}
|
||||
|
|
|
@ -33,7 +33,6 @@ public final class CuriousHomunculus extends CardImpl {
|
|||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.v.VoraciousReader.class;
|
||||
|
||||
// {T}: Add {C}. Spend this mana only to cast an instant or sorcery spell.
|
||||
|
@ -42,7 +41,7 @@ public final class CuriousHomunculus extends CardImpl {
|
|||
// At the beginning of your upkeep, if there are three or more instant and/or sorcery cards in your graveyard, transform Curious Homunculus.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
||||
new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(true), TargetController.YOU, false),
|
||||
new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect(), TargetController.YOU, false),
|
||||
new InstantOrSorceryCardsInControllerGraveyardCondition(3),
|
||||
"At the beginning of your upkeep, if there are three or more instant and/or sorcery cards in your graveyard, transform {this}"));
|
||||
}
|
||||
|
|
111
Mage.Sets/src/mage/cards/c/CurseOfLeeches.java
Normal file
111
Mage.Sets/src/mage/cards/c/CurseOfLeeches.java
Normal file
|
@ -0,0 +1,111 @@
|
|||
package mage.cards.c;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.ReplacementEffectImpl;
|
||||
import mage.abilities.effects.common.AttachEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.LoseLifeTargetEffect;
|
||||
import mage.abilities.keyword.DayboundAbility;
|
||||
import mage.abilities.keyword.EnchantAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPlayer;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class CurseOfLeeches extends CardImpl {
|
||||
|
||||
public CurseOfLeeches(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}");
|
||||
|
||||
this.subtype.add(SubType.AURA);
|
||||
this.subtype.add(SubType.CURSE);
|
||||
this.secondSideCardClazz = mage.cards.l.LeechingLurker.class;
|
||||
|
||||
// Enchant player
|
||||
TargetPlayer auraTarget = new TargetPlayer();
|
||||
this.getSpellAbility().addTarget(auraTarget);
|
||||
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
|
||||
Ability ability = new EnchantAbility(auraTarget.getTargetName());
|
||||
this.addAbility(ability);
|
||||
|
||||
// As this permanent transforms into Curse of Leeches, attach it to a player.
|
||||
this.addAbility(new SimpleStaticAbility(new CurseOfLeechesEffect()));
|
||||
|
||||
// At the beginning of enchanted player's upkeep, they lose 1 life and you gain 1 life.
|
||||
ability = new BeginningOfUpkeepTriggeredAbility(
|
||||
Zone.BATTLEFIELD, new LoseLifeTargetEffect(1).setText("they lose 1 life"),
|
||||
TargetController.ENCHANTED, false, true
|
||||
);
|
||||
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Daybound
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DayboundAbility());
|
||||
}
|
||||
|
||||
private CurseOfLeeches(final CurseOfLeeches card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CurseOfLeeches copy() {
|
||||
return new CurseOfLeeches(this);
|
||||
}
|
||||
}
|
||||
|
||||
class CurseOfLeechesEffect extends ReplacementEffectImpl {
|
||||
|
||||
CurseOfLeechesEffect() {
|
||||
super(Duration.WhileOnBattlefield, Outcome.Benefit);
|
||||
staticText = "as this permanent transforms into {this}, attach it to a player";
|
||||
}
|
||||
|
||||
private CurseOfLeechesEffect(final CurseOfLeechesEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
TargetPlayer target = new TargetPlayer();
|
||||
target.withChooseHint("Player to attach to").setNotTarget(true);
|
||||
controller.choose(Outcome.Detriment, target, source.getSourceId(), game);
|
||||
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
permanent.addAttachment(target.getFirstTarget(), source, game);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checksEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.TRANSFORMING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
return source.getSourceId().equals(event.getTargetId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CurseOfLeechesEffect copy() {
|
||||
return new CurseOfLeechesEffect(this);
|
||||
}
|
||||
}
|
|
@ -12,7 +12,6 @@ import mage.constants.SubType;
|
|||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
|
@ -28,7 +27,6 @@ public final class DaringSleuth extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.b.BearerOfOverwhelmingTruths.class;
|
||||
|
||||
// When you sacrifice a Clue, transform Daring Sleuth.
|
||||
|
@ -49,7 +47,7 @@ public final class DaringSleuth extends CardImpl {
|
|||
class DaringSleuthTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
public DaringSleuthTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new TransformSourceEffect(true));
|
||||
super(Zone.BATTLEFIELD, new TransformSourceEffect());
|
||||
}
|
||||
|
||||
public DaringSleuthTriggeredAbility(final DaringSleuthTriggeredAbility ability) {
|
||||
|
|
|
@ -36,7 +36,6 @@ public final class DauntlessAvenger extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
this.color.setWhite(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Whenever Dauntless Avenger attacks, return target creature card with mana value 2 or less from your graveyard to the battlefield tapped and attacking.
|
||||
|
|
|
@ -37,7 +37,6 @@ public final class DaybreakRanger extends CardImpl {
|
|||
this.subtype.add(SubType.RANGER);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.n.NightfallPredator.class;
|
||||
|
||||
this.power = new MageInt(2);
|
||||
|
|
|
@ -30,7 +30,6 @@ public final class DeathbonnetHulk extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.color.setGreen(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// At the beginning of your upkeep, you may exile a card from a graveyard. If a creature card was exiled this way, put a +1/+1 counter on Deathbonnet Hulk.
|
||||
|
|
|
@ -39,7 +39,6 @@ public final class DeathbonnetSprout extends CardImpl {
|
|||
this.subtype.add(SubType.FUNGUS);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.d.DeathbonnetHulk.class;
|
||||
|
||||
// At the beginning of your upkeep, mill a card. Then if there are three or more creature cards in your graveyard, transform Deathbonnet Sprout.
|
||||
|
@ -48,7 +47,7 @@ public final class DeathbonnetSprout extends CardImpl {
|
|||
new MillCardsControllerEffect(1), TargetController.YOU, false
|
||||
);
|
||||
ability.addEffect(new ConditionalOneShotEffect(
|
||||
new TransformSourceEffect(true), condition,
|
||||
new TransformSourceEffect(), condition,
|
||||
"Then if there are three or more creature cards in your graveyard, transform {this}"
|
||||
));
|
||||
this.addAbility(ability.addHint(hint));
|
||||
|
|
|
@ -33,7 +33,6 @@ public final class DelverOfSecrets extends CardImpl {
|
|||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.i.InsectileAberration.class;
|
||||
|
||||
// At the beginning of your upkeep, look at the top card of your library. You may reveal that card. If an instant or sorcery card is revealed this way, transform Delver of Secrets.
|
||||
|
@ -73,25 +72,25 @@ class DelverOfSecretsEffect extends OneShotEffect {
|
|||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
|
||||
if (player != null && sourcePermanent != null) {
|
||||
if (player.getLibrary().hasCards()) {
|
||||
Card card = player.getLibrary().getFromTop(game);
|
||||
if(card == null){
|
||||
return false;
|
||||
}
|
||||
Cards cards = new CardsImpl();
|
||||
cards.add(card);
|
||||
player.lookAtCards(sourcePermanent.getName(), cards, game);
|
||||
if (player.chooseUse(Outcome.DrawCard, "Reveal the top card of your library?", source, game)) {
|
||||
player.revealCards(sourcePermanent.getName(), cards, game);
|
||||
if (filter.match(card, game)) {
|
||||
return new TransformSourceEffect(true, true).apply(game, source);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
if (player == null || sourcePermanent == null) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
if (player.getLibrary().hasCards()) {
|
||||
Card card = player.getLibrary().getFromTop(game);
|
||||
if(card == null){
|
||||
return false;
|
||||
}
|
||||
Cards cards = new CardsImpl();
|
||||
cards.add(card);
|
||||
player.lookAtCards(sourcePermanent.getName(), cards, game);
|
||||
if (player.chooseUse(Outcome.DrawCard, "Reveal the top card of your library?", source, game)) {
|
||||
player.revealCards(sourcePermanent.getName(), cards, game);
|
||||
if (filter.match(card, game)) {
|
||||
return new TransformSourceEffect().apply(game, source);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ enum DemilichValue implements DynamicValue {
|
|||
SpellsCastWatcher watcher = game.getState().getWatcher(SpellsCastWatcher.class);
|
||||
if (watcher != null) {
|
||||
for (Spell spell : watcher.getSpellsCastThisTurn(sourceAbility.getControllerId())) {
|
||||
if (spell.isInstantOrSorcery()) {
|
||||
if (spell.isInstantOrSorcery(game)) {
|
||||
spells++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@ public final class DennickPiousApprentice extends CardImpl {
|
|||
this.subtype.add(SubType.SOLDIER);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(3);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.d.DennickPiousApparition.class;
|
||||
|
||||
// Lifelink
|
||||
|
|
|
@ -25,7 +25,6 @@ public final class DepartedSoulkeeper extends CardImpl {
|
|||
this.toughness = new MageInt(1);
|
||||
this.color.setWhite(true);
|
||||
this.color.setBlue(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
|
|
|
@ -32,7 +32,6 @@ public final class DevotedGrafkeeper extends CardImpl {
|
|||
this.subtype.add(SubType.PEASANT);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(1);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.d.DepartedSoulkeeper.class;
|
||||
|
||||
// When Devoted Grafkeeper enters the battlefield, mill two cards.
|
||||
|
|
|
@ -22,7 +22,6 @@ public final class DireStrainBrawler extends CardImpl {
|
|||
this.power = new MageInt(6);
|
||||
this.toughness = new MageInt(6);
|
||||
this.color.setGreen(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Vigilance
|
||||
|
|
|
@ -23,7 +23,6 @@ public final class DireStrainDemolisher extends CardImpl {
|
|||
this.power = new MageInt(8);
|
||||
this.toughness = new MageInt(7);
|
||||
this.color.setGreen(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Ward {3}
|
||||
|
|
|
@ -45,7 +45,6 @@ public final class DocentOfPerfection extends CardImpl {
|
|||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.f.FinalIteration.class;
|
||||
|
||||
// Flying
|
||||
|
@ -98,7 +97,7 @@ class DocentOfPerfectionEffect extends OneShotEffect {
|
|||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller != null) {
|
||||
if (game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game) >= 3) {
|
||||
return new TransformSourceEffect(true).apply(game, source);
|
||||
return new TransformSourceEffect().apply(game, source);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -27,7 +27,6 @@ public final class DormantGrove extends CardImpl {
|
|||
public DormantGrove(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.g.GnarledGrovestrider.class;
|
||||
|
||||
// At the beginning of combat on your turn, put a +1/+1 counter on target creature you control.
|
||||
|
@ -39,7 +38,7 @@ public final class DormantGrove extends CardImpl {
|
|||
TargetController.YOU, false
|
||||
);
|
||||
ability.addEffect(new ConditionalOneShotEffect(
|
||||
new TransformSourceEffect(true, true),
|
||||
new TransformSourceEffect(),
|
||||
DormatGroveCondition.instance,
|
||||
"Then if that creature has toughness 6 or greater, transform {this}"
|
||||
));
|
||||
|
|
|
@ -33,7 +33,6 @@ public final class DowsingDagger extends CardImpl {
|
|||
|
||||
this.subtype.add(SubType.EQUIPMENT);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.l.LostVale.class;
|
||||
|
||||
// When Dowsing Dagger enters the battlefield, target opponent creates two 0/2 green Plant creature tokens with defender.
|
||||
|
@ -47,7 +46,7 @@ public final class DowsingDagger extends CardImpl {
|
|||
|
||||
// Whenever equipped creature deals combat damage to a player, you may transform Dowsing Dagger.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new TransformSourceEffect(true), "equipped", true));
|
||||
this.addAbility(new DealsDamageToAPlayerAttachedTriggeredAbility(new TransformSourceEffect(), "equipped", true));
|
||||
|
||||
// Equip 2
|
||||
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2)));
|
||||
|
|
|
@ -3,21 +3,15 @@ package mage.cards.d;
|
|||
import java.util.UUID;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbility;
|
||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
||||
import mage.abilities.condition.common.NoSpellsWereCastLastTurnCondition;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.TargetController;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
|
||||
|
@ -34,7 +28,6 @@ public final class DuskwatchRecruiter extends CardImpl {
|
|||
this.subtype.add(SubType.WARRIOR);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.k.KrallenhordeHowler.class;
|
||||
|
||||
this.power = new MageInt(2);
|
||||
|
|
|
@ -30,7 +30,6 @@ public final class EcstaticAwakener extends CardImpl {
|
|||
this.subtype.add(SubType.WIZARD);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.a.AwokenDemon.class;
|
||||
|
||||
// {2}{B}, Sacrifice another creature: Draw a card, then transform Ecstatic Awakener. Activate only once each turn.
|
||||
|
@ -38,7 +37,7 @@ public final class EcstaticAwakener extends CardImpl {
|
|||
Ability ability = new LimitedTimesPerTurnActivatedAbility(
|
||||
Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl<>("{2}{B}")
|
||||
);
|
||||
ability.addEffect(new TransformSourceEffect(true).concatBy(", then"));
|
||||
ability.addEffect(new TransformSourceEffect().concatBy(", then"));
|
||||
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
package mage.cards.e;
|
||||
|
||||
import java.util.UUID;
|
||||
|
@ -31,7 +30,6 @@ public final class ElbrusTheBindingBlade extends CardImpl {
|
|||
addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.EQUIPMENT);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.w.WithengarUnbound.class;
|
||||
this.addAbility(new TransformAbility());
|
||||
|
||||
|
@ -70,9 +68,7 @@ class ElbrusTheBindingBladeEffect extends OneShotEffect {
|
|||
Permanent attachedTo = game.getPermanent(equipment.getAttachedTo());
|
||||
if (attachedTo != null) {
|
||||
attachedTo.removeAttachment(equipment.getId(), source, game);
|
||||
equipment.transform(game);
|
||||
game.informPlayers(equipment.getName() + " transforms into " + equipment.getSecondCardFace().getName());
|
||||
|
||||
equipment.transform(source, game);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -28,12 +28,11 @@ public final class ElusiveTormentor extends CardImpl {
|
|||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.i.InsidiousMist.class;
|
||||
|
||||
// {1}, Discard a card: Transform Elusive Tormentor.
|
||||
this.addAbility(new TransformAbility());
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), new GenericManaCost(1));
|
||||
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), new GenericManaCost(1));
|
||||
ability.addCost(new DiscardCardCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
@ -34,7 +34,6 @@ public final class EmbodimentOfFlame extends CardImpl {
|
|||
this.toughness = new MageInt(3);
|
||||
this.color.setRed(true);
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
// Whenever a spell you control deals damage, put a flame counter on Embodiment of Flame.
|
||||
this.addAbility(new EmbodimentOfFlameTriggeredAbility());
|
||||
|
|
110
Mage.Sets/src/mage/cards/e/EnduringAngel.java
Normal file
110
Mage.Sets/src/mage/cards/e/EnduringAngel.java
Normal file
|
@ -0,0 +1,110 @@
|
|||
package mage.cards.e;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.ReplacementEffectImpl;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
|
||||
import mage.abilities.keyword.DoubleStrikeAbility;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.HexproofAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class EnduringAngel extends CardImpl {
|
||||
|
||||
public EnduringAngel(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}{W}");
|
||||
|
||||
this.subtype.add(SubType.ANGEL);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.secondSideCardClazz = mage.cards.a.AngelicEnforcer.class;
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Double strike
|
||||
this.addAbility(DoubleStrikeAbility.getInstance());
|
||||
|
||||
// You have hexproof.
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControllerEffect(HexproofAbility.getInstance())));
|
||||
|
||||
// If your life total would be reduced to 0 or less, instead transform Enduring Angel and your life total becomes 3. Then if Enduring Angel didn't transform this way, you lose the game.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new SimpleStaticAbility(new EnduringAngelEffect()));
|
||||
}
|
||||
|
||||
private EnduringAngel(final EnduringAngel card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnduringAngel copy() {
|
||||
return new EnduringAngel(this);
|
||||
}
|
||||
}
|
||||
|
||||
class EnduringAngelEffect extends ReplacementEffectImpl {
|
||||
|
||||
EnduringAngelEffect() {
|
||||
super(Duration.WhileOnBattlefield, Outcome.Benefit);
|
||||
staticText = "if your life total would be reduced to 0 or less, instead transform {this} " +
|
||||
"and your life total becomes 3. Then if {this} didn't transform this way, you lose the game";
|
||||
}
|
||||
|
||||
private EnduringAngelEffect(final EnduringAngelEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
|
||||
if (player == null || permanent == null || player.getLife() - event.getAmount() > 0) {
|
||||
return false;
|
||||
}
|
||||
boolean transformed = permanent.transform(source, game);
|
||||
if (player.getLife() > 3) {
|
||||
event.setAmount(player.getLife() - 3);
|
||||
} else if (player.getLife() < 3) {
|
||||
event.setAmount(0);
|
||||
player.setLife(3, game, source);
|
||||
} else {
|
||||
event.setAmount(0);
|
||||
}
|
||||
if (!transformed) {
|
||||
player.lost(game);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checksEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.LOSE_LIFE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
return source.isControlledBy(event.getPlayerId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnduringAngelEffect copy() {
|
||||
return new EnduringAngelEffect(this);
|
||||
}
|
||||
}
|
|
@ -42,7 +42,6 @@ public final class ExtricatorOfSin extends CardImpl {
|
|||
this.power = new MageInt(0);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = ExtricatorOfFlesh.class;
|
||||
|
||||
// When Extricator of Sin enters the battlefield, you may sacrifice another permanent. If you do, create a 3/2 colorless Eldrazi Horror creature token.
|
||||
|
@ -52,7 +51,7 @@ public final class ExtricatorOfSin extends CardImpl {
|
|||
// <i>Delirium</i> — At the beginning of your upkeep, if there are four or more card types among cards in your graveyard, transform Extricator of Sin.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
||||
new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), TargetController.YOU, false),
|
||||
new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), TargetController.YOU, false),
|
||||
DeliriumCondition.instance,
|
||||
"<i>Delirium</i> — At the beginning of your upkeep, if there are four or more card types among cards in your graveyard, "
|
||||
+ " transform {this}.")
|
||||
|
|
|
@ -29,7 +29,6 @@ public final class FangbladeBrigand extends CardImpl {
|
|||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(4);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.f.FangbladeEviscerator.class;
|
||||
|
||||
// {1}{R}: Fangblade Brigand gets +1/+0 and gains first strike until end of turn.
|
||||
|
|
|
@ -29,7 +29,6 @@ public final class FangbladeEviscerator extends CardImpl {
|
|||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(5);
|
||||
this.color.setRed(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// {1}{R}: Fangblade Eviscerator gets +1/+0 and gains first strike until end of turn.
|
||||
|
|
|
@ -27,7 +27,7 @@ public final class FlameChanneler extends CardImpl {
|
|||
this.subtype.add(SubType.WIZARD);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
this.transformable=true;this.secondSideCardClazz=mage.cards.e.EmbodimentOfFlame.class;
|
||||
this.secondSideCardClazz = mage.cards.e.EmbodimentOfFlame.class;
|
||||
|
||||
// When a spell you control deals damage, transform Flame Channeler.
|
||||
this.addAbility(new TransformAbility());
|
||||
|
@ -47,7 +47,7 @@ public final class FlameChanneler extends CardImpl {
|
|||
class FlameChannelerTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
FlameChannelerTriggeredAbility() {
|
||||
super(Zone.BATTLEFIELD, new TransformSourceEffect(true));
|
||||
super(Zone.BATTLEFIELD, new TransformSourceEffect());
|
||||
}
|
||||
|
||||
private FlameChannelerTriggeredAbility(final FlameChannelerTriggeredAbility ability) {
|
||||
|
|
|
@ -26,7 +26,6 @@ public final class FlameheartWerewolf extends CardImpl {
|
|||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
// Whenever Flameheart Werewolf blocks or becomes blocked by a creature, Flameheart Werewolf deals 2 damage to that creature.
|
||||
this.addAbility(new BlocksOrBecomesBlockedSourceTriggeredAbility(new DamageTargetEffect(2, true, "that creature"),
|
||||
|
|
|
@ -39,7 +39,6 @@ public final class FrenziedTrapbreaker extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.color.setGreen(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// {1}, Sacrifice Frenzied Trapbreaker: Destroy target artifact or enchantment.
|
||||
|
|
|
@ -23,7 +23,6 @@ public final class Galedrifter extends CardImpl {
|
|||
this.subtype.add(SubType.HIPPOGRIFF);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.w.Waildrifter.class;
|
||||
|
||||
// Flying
|
||||
|
|
|
@ -31,7 +31,6 @@ public final class GarrukRelentless extends CardImpl {
|
|||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.GARRUK);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = GarrukTheVeilCursed.class;
|
||||
|
||||
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3));
|
||||
|
@ -63,7 +62,7 @@ public final class GarrukRelentless extends CardImpl {
|
|||
class GarrukRelentlessStateTrigger extends StateTriggeredAbility {
|
||||
|
||||
public GarrukRelentlessStateTrigger() {
|
||||
super(Zone.BATTLEFIELD, new TransformSourceEffect(true));
|
||||
super(Zone.BATTLEFIELD, new TransformSourceEffect());
|
||||
}
|
||||
|
||||
public GarrukRelentlessStateTrigger(final GarrukRelentlessStateTrigger ability) {
|
||||
|
|
|
@ -38,7 +38,6 @@ public final class GarrukTheVeilCursed extends CardImpl {
|
|||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
this.color.setGreen(true);
|
||||
this.color.setBlack(true);
|
||||
|
|
|
@ -2,18 +2,12 @@ package mage.cards.g;
|
|||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.TriggeredAbility;
|
||||
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
||||
import mage.abilities.condition.common.NoSpellsWereCastLastTurnCondition;
|
||||
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.TargetController;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -28,7 +22,6 @@ public final class GatstafArsonists extends CardImpl {
|
|||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = GatstafRavagers.class;
|
||||
|
||||
// At the beginning of each upkeep, if no spells were cast last turn, transform Gatstaf Arsonists.
|
||||
|
|
|
@ -22,7 +22,6 @@ public final class GatstafHowler extends CardImpl {
|
|||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
|
|
|
@ -23,7 +23,6 @@ public final class GatstafRavagers extends CardImpl {
|
|||
|
||||
this.color.setRed(true);
|
||||
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Menace
|
||||
|
|
|
@ -20,7 +20,6 @@ public final class GatstafShepherd extends CardImpl {
|
|||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = GatstafHowler.class;
|
||||
|
||||
this.power = new MageInt(2);
|
||||
|
|
|
@ -24,7 +24,6 @@ public final class GeierReachBandit extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.v.VildinPackAlpha.class;
|
||||
|
||||
// Haste
|
||||
|
|
|
@ -25,7 +25,6 @@ public final class GhastlyHaunting extends CardImpl {
|
|||
|
||||
// this card is the second face of double-faced card
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
// Enchant creature
|
||||
TargetPermanent auraTarget = new TargetCreaturePermanent();
|
||||
|
|
|
@ -27,7 +27,6 @@ public final class GhostlyCastigator extends CardImpl {
|
|||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(4);
|
||||
this.color.setBlue(true);
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Flying
|
||||
|
|
|
@ -42,7 +42,6 @@ public final class GideonBattleForged extends CardImpl {
|
|||
this.color.setWhite(true);
|
||||
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(3));
|
||||
|
||||
|
|
|
@ -47,7 +47,6 @@ public final class GoldenGuardian extends CardImpl {
|
|||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = GoldForgeGarrison.class;
|
||||
|
||||
// Defender
|
||||
|
|
|
@ -35,7 +35,6 @@ public final class GraveyardGlutton extends CardImpl {
|
|||
this.toughness = new MageInt(4);
|
||||
this.color.setBlack(true);
|
||||
this.nightCard = true;
|
||||
this.transformable = true;
|
||||
|
||||
// Ward—Discard a card.
|
||||
this.addAbility(new WardAbility(new DiscardCardCost()));
|
||||
|
|
|
@ -35,7 +35,6 @@ public final class GraveyardTrespasser extends CardImpl {
|
|||
this.subtype.add(SubType.WEREWOLF);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.g.GraveyardGlutton.class;
|
||||
|
||||
// Ward—Discard a card.
|
||||
|
|
|
@ -46,8 +46,7 @@ public final class GrimlockDinobotLeader extends CardImpl{
|
|||
this.subtype.add(SubType.AUTOBOT);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.transformable = true;
|
||||
|
||||
this.secondSideCardClazz = GrimlockFerociousKing.class;
|
||||
|
||||
// Dinosaurs, Vehicles and other Transformers creatures you control get +2/+0.
|
||||
|
@ -56,7 +55,7 @@ public final class GrimlockDinobotLeader extends CardImpl{
|
|||
|
||||
// {2}: Grimlock, Dinobot Leader becomes Grimlock, Ferocious King.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), new ManaCostsImpl("{2}")));
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), new ManaCostsImpl("{2}")));
|
||||
}
|
||||
|
||||
private GrimlockDinobotLeader(final GrimlockDinobotLeader card) {
|
||||
|
|
|
@ -31,15 +31,14 @@ public final class GrimlockFerociousKing extends CardImpl{
|
|||
this.color.setGreen(true);
|
||||
this.color.setWhite(true);
|
||||
|
||||
this.transformable = true;
|
||||
this.nightCard = true;
|
||||
this.nightCard = true;
|
||||
|
||||
// Trample
|
||||
this.addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// {2}: Grimlock, Ferocious King becomes Grimlock, Dinobot Leader.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(false), new ManaCostsImpl("{2}")));
|
||||
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(), new ManaCostsImpl("{2}")));
|
||||
}
|
||||
|
||||
private GrimlockFerociousKing(final GrimlockFerociousKing card) {
|
||||
|
|
|
@ -32,7 +32,6 @@ public final class GrizzledAngler extends CardImpl {
|
|||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = GrislyAnglerfish.class;
|
||||
|
||||
// {T}: Put the top two cards of your library into your graveyard. Then if there is a colorless creature card in your graveyard, transform Grizzled Angler.
|
||||
|
@ -78,7 +77,7 @@ class GrizzledAnglerEffect extends OneShotEffect {
|
|||
if (controller != null) {
|
||||
controller.millCards(2, source, game);
|
||||
if (controller.getGraveyard().count(filter, source.getSourceId(), source.getControllerId(), game) >= 1) {
|
||||
return new TransformSourceEffect(true).apply(game, source);
|
||||
return new TransformSourceEffect().apply(game, source);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -20,7 +20,6 @@ public final class GrizzledOutcasts extends CardImpl {
|
|||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.k.KrallenhordeWantons.class;
|
||||
|
||||
this.power = new MageInt(4);
|
||||
|
|
|
@ -36,7 +36,6 @@ public final class GrowingRitesOfItlimoc extends CardImpl {
|
|||
|
||||
this.addSuperType(SuperType.LEGENDARY);
|
||||
|
||||
this.transformable = true;
|
||||
this.secondSideCardClazz = mage.cards.i.ItlimocCradleOfTheSun.class;
|
||||
|
||||
// When Growing Rites of Itlimoc enters the battlefield, look at the top four cards of your library.
|
||||
|
@ -47,7 +46,7 @@ public final class GrowingRitesOfItlimoc extends CardImpl {
|
|||
// At the beginning of your end step, if you control four or more creatures, transform Growing Rites of Itlimoc.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
||||
new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect(true), TargetController.YOU, false),
|
||||
new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect(), TargetController.YOU, false),
|
||||
new PermanentsOnTheBattlefieldCondition(StaticFilters.FILTER_CONTROLLED_A_CREATURE, ComparisonType.MORE_THAN, 3),
|
||||
"At the beginning of your end step, if you control four or more creatures, transform {this}"));
|
||||
}
|
||||
|
|
|
@ -27,14 +27,13 @@ public final class HadanasClimb extends CardImpl {
|
|||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}{U}");
|
||||
|
||||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.transformable = true;
|
||||
|
||||
this.secondSideCardClazz = mage.cards.w.WingedTempleOfOrazca.class;
|
||||
|
||||
// At the beginning of combat on your turn, put a +1/+1 counter on target creature you control. Then if that creature has three or more +1/+1 counters on it, transform Hadana's Climb.
|
||||
this.addAbility(new TransformAbility());
|
||||
Ability ability = new BeginningOfCombatTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), TargetController.YOU, false);
|
||||
ability.addEffect(new ConditionalOneShotEffect(new TransformSourceEffect(true), new TargetHasCounterCondition(CounterType.P1P1, 3, Integer.MAX_VALUE),
|
||||
ability.addEffect(new ConditionalOneShotEffect(new TransformSourceEffect(), new TargetHasCounterCondition(CounterType.P1P1, 3, Integer.MAX_VALUE),
|
||||
"Then if that creature has three or more +1/+1 counters on it, transform {this}"));
|
||||
ability.addTarget(new TargetControlledCreaturePermanent());
|
||||
this.addAbility(ability);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue