forked from External/mage
Merge pull request 'master' (#49) from External/mage:master into master
All checks were successful
/ build_release (push) Successful in 17m0s
All checks were successful
/ build_release (push) Successful in 17m0s
Reviewed-on: #49
This commit is contained in:
commit
0171e2bbff
43 changed files with 2344 additions and 236 deletions
|
|
@ -1,10 +1,10 @@
|
||||||
package org.mage.plugins.card.dl.sources;
|
package org.mage.plugins.card.dl.sources;
|
||||||
|
|
||||||
|
import mage.cards.repository.TokenRepository;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import mage.cards.repository.TokenRepository;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author JayDi85
|
* @author JayDi85
|
||||||
*/
|
*/
|
||||||
|
|
@ -2401,7 +2401,7 @@ public class ScryfallImageSupportTokens {
|
||||||
put("OTP/Human Warrior", "https://api.scryfall.com/cards/totp/3/en?format=image");
|
put("OTP/Human Warrior", "https://api.scryfall.com/cards/totp/3/en?format=image");
|
||||||
put("OTP/Pest", "https://api.scryfall.com/cards/totp/4/en?format=image");
|
put("OTP/Pest", "https://api.scryfall.com/cards/totp/4/en?format=image");
|
||||||
|
|
||||||
// SCD
|
// SCD
|
||||||
put("SCD/Beast", "https://api.scryfall.com/cards/tscd/19/en?format=image");
|
put("SCD/Beast", "https://api.scryfall.com/cards/tscd/19/en?format=image");
|
||||||
put("SCD/Bird", "https://api.scryfall.com/cards/tscd/2/en?format=image");
|
put("SCD/Bird", "https://api.scryfall.com/cards/tscd/2/en?format=image");
|
||||||
put("SCD/Cat", "https://api.scryfall.com/cards/tscd/3/en?format=image");
|
put("SCD/Cat", "https://api.scryfall.com/cards/tscd/3/en?format=image");
|
||||||
|
|
@ -2844,6 +2844,7 @@ public class ScryfallImageSupportTokens {
|
||||||
put("TLA/Clue/3", "https://api.scryfall.com/cards/ttla/16/?format=image");
|
put("TLA/Clue/3", "https://api.scryfall.com/cards/ttla/16/?format=image");
|
||||||
put("TLA/Clue/4", "https://api.scryfall.com/cards/ttla/17/?format=image");
|
put("TLA/Clue/4", "https://api.scryfall.com/cards/ttla/17/?format=image");
|
||||||
put("TLA/Clue/5", "https://api.scryfall.com/cards/ttla/18/?format=image");
|
put("TLA/Clue/5", "https://api.scryfall.com/cards/ttla/18/?format=image");
|
||||||
|
put("TLA/Dragon", "https://api.scryfall.com/cards/ttla/9/?format=image");
|
||||||
put("TLA/Food/1", "https://api.scryfall.com/cards/ttla/19/?format=image");
|
put("TLA/Food/1", "https://api.scryfall.com/cards/ttla/19/?format=image");
|
||||||
put("TLA/Food/2", "https://api.scryfall.com/cards/ttla/20/?format=image");
|
put("TLA/Food/2", "https://api.scryfall.com/cards/ttla/20/?format=image");
|
||||||
put("TLA/Food/3", "https://api.scryfall.com/cards/ttla/21/?format=image");
|
put("TLA/Food/3", "https://api.scryfall.com/cards/ttla/21/?format=image");
|
||||||
|
|
|
||||||
64
Mage.Sets/src/mage/cards/a/AangAndKatara.java
Normal file
64
Mage.Sets/src/mage/cards/a/AangAndKatara.java
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
package mage.cards.a;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.hint.ValueHint;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.filter.predicate.permanent.TappedPredicate;
|
||||||
|
import mage.game.permanent.token.AllyToken;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class AangAndKatara extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterControlledPermanent("tapped artifacts and/or creatures you control");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(TappedPredicate.TAPPED);
|
||||||
|
filter.add(Predicates.or(
|
||||||
|
CardType.ARTIFACT.getPredicate(),
|
||||||
|
CardType.CREATURE.getPredicate()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, null);
|
||||||
|
private static final Hint hint = new ValueHint("Tapped artifacts and creatures you control", xValue);
|
||||||
|
|
||||||
|
public AangAndKatara(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{W}{U}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.AVATAR);
|
||||||
|
this.subtype.add(SubType.ALLY);
|
||||||
|
this.power = new MageInt(5);
|
||||||
|
this.toughness = new MageInt(5);
|
||||||
|
|
||||||
|
// Whenever Aang and Katara enter or attack, create X 1/1 white Ally creature tokens, where X is the number of tapped artifacts and/or creatures you control.
|
||||||
|
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new CreateTokenEffect(new AllyToken(), xValue))
|
||||||
|
.setTriggerPhrase("Whenever {this} enter or attack, ").addHint(hint));
|
||||||
|
}
|
||||||
|
|
||||||
|
private AangAndKatara(final AangAndKatara card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AangAndKatara copy() {
|
||||||
|
return new AangAndKatara(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
68
Mage.Sets/src/mage/cards/a/AppaTheVigilant.java
Normal file
68
Mage.Sets/src/mage/cards/a/AppaTheVigilant.java
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
package mage.cards.a;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
|
import mage.abilities.keyword.VigilanceAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class AppaTheVigilant extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterPermanent(SubType.ALLY, "Ally");
|
||||||
|
|
||||||
|
public AppaTheVigilant(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{W}{W}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.BISON);
|
||||||
|
this.subtype.add(SubType.ALLY);
|
||||||
|
this.power = new MageInt(6);
|
||||||
|
this.toughness = new MageInt(6);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Vigilance
|
||||||
|
this.addAbility(VigilanceAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever Appa or another Ally you control enters, creatures you control get +1/+1 and gain flying and vigilance until end of turn.
|
||||||
|
Ability ability = new EntersBattlefieldThisOrAnotherTriggeredAbility(
|
||||||
|
new BoostControlledEffect(1, 1, Duration.EndOfTurn)
|
||||||
|
.setText("creatures you control get +1/+1"),
|
||||||
|
filter, false, true
|
||||||
|
);
|
||||||
|
ability.addEffect(new GainAbilityControlledEffect(
|
||||||
|
FlyingAbility.getInstance(), Duration.EndOfTurn,
|
||||||
|
StaticFilters.FILTER_PERMANENT_CREATURE
|
||||||
|
).setText("and gain flying"));
|
||||||
|
ability.addEffect(new GainAbilityControlledEffect(
|
||||||
|
VigilanceAbility.getInstance(), Duration.EndOfTurn,
|
||||||
|
StaticFilters.FILTER_PERMANENT_CREATURE
|
||||||
|
).setText("and vigilance until end of turn"));
|
||||||
|
this.addAbility(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
private AppaTheVigilant(final AppaTheVigilant card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AppaTheVigilant copy() {
|
||||||
|
return new AppaTheVigilant(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
50
Mage.Sets/src/mage/cards/a/AvatarKuruk.java
Normal file
50
Mage.Sets/src/mage/cards/a/AvatarKuruk.java
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
package mage.cards.a;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||||
|
import mage.abilities.costs.common.WaterbendCost;
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
|
import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
|
||||||
|
import mage.abilities.keyword.ExhaustAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.permanent.token.SpiritWorldToken;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class AvatarKuruk extends CardImpl {
|
||||||
|
|
||||||
|
public AvatarKuruk(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.AVATAR);
|
||||||
|
this.power = new MageInt(4);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
this.nightCard = true;
|
||||||
|
|
||||||
|
// Whenever you cast a spell, create a 1/1 colorless Spirit creature token with "This token can't block or be blocked by non-Spirit creatures."
|
||||||
|
this.addAbility(new SpellCastControllerTriggeredAbility(
|
||||||
|
new CreateTokenEffect(new SpiritWorldToken()), StaticFilters.FILTER_SPELL_A, false
|
||||||
|
));
|
||||||
|
|
||||||
|
// Exhaust -- Waterbend {20}: Take an extra turn after this one.
|
||||||
|
this.addAbility(new ExhaustAbility(new AddExtraTurnControllerEffect(), new WaterbendCost(20)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private AvatarKuruk(final AvatarKuruk card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AvatarKuruk copy() {
|
||||||
|
return new AvatarKuruk(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
62
Mage.Sets/src/mage/cards/a/AvatarKyoshi.java
Normal file
62
Mage.Sets/src/mage/cards/a/AvatarKyoshi.java
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
package mage.cards.a;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.Mana;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
import mage.abilities.dynamicvalue.common.GreatestAmongPermanentsValue;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
import mage.abilities.keyword.HexproofAbility;
|
||||||
|
import mage.abilities.keyword.TrampleAbility;
|
||||||
|
import mage.abilities.mana.DynamicManaAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class AvatarKyoshi extends CardImpl {
|
||||||
|
|
||||||
|
public AvatarKyoshi(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.AVATAR);
|
||||||
|
this.power = new MageInt(5);
|
||||||
|
this.toughness = new MageInt(4);
|
||||||
|
this.nightCard = true;
|
||||||
|
|
||||||
|
// Lands you control have trample and hexproof.
|
||||||
|
Ability ability = new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||||
|
TrampleAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_LANDS
|
||||||
|
));
|
||||||
|
ability.addEffect(new GainAbilityControlledEffect(
|
||||||
|
HexproofAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_LANDS
|
||||||
|
).setText("and hexproof"));
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
// {T}: Add X mana of any one color, where X is the greatest power among creatures you control.
|
||||||
|
this.addAbility(new DynamicManaAbility(
|
||||||
|
Mana.AnyMana(1), GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES,
|
||||||
|
new TapSourceCost(), "add X mana of any one color, " +
|
||||||
|
"where X is the greatest power among creatures you control", true
|
||||||
|
).addHint(GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES.getHint()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private AvatarKyoshi(final AvatarKyoshi card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AvatarKyoshi copy() {
|
||||||
|
return new AvatarKyoshi(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
48
Mage.Sets/src/mage/cards/a/AvatarRoku.java
Normal file
48
Mage.Sets/src/mage/cards/a/AvatarRoku.java
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
package mage.cards.a;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.costs.mana.GenericManaCost;
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
|
import mage.abilities.keyword.FirebendingAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.game.permanent.token.DragonFirebendingToken;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class AvatarRoku extends CardImpl {
|
||||||
|
|
||||||
|
public AvatarRoku(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.AVATAR);
|
||||||
|
this.power = new MageInt(4);
|
||||||
|
this.toughness = new MageInt(4);
|
||||||
|
this.nightCard = true;
|
||||||
|
|
||||||
|
// Firebending 4
|
||||||
|
this.addAbility(new FirebendingAbility(4));
|
||||||
|
|
||||||
|
// {8}: Create a 4/4 red Dragon creature token with flying and firebending 4.
|
||||||
|
this.addAbility(new SimpleActivatedAbility(
|
||||||
|
new CreateTokenEffect(new DragonFirebendingToken()), new GenericManaCost(8)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private AvatarRoku(final AvatarRoku card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AvatarRoku copy() {
|
||||||
|
return new AvatarRoku(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
88
Mage.Sets/src/mage/cards/b/BumiKingOfThreeTrials.java
Normal file
88
Mage.Sets/src/mage/cards/b/BumiKingOfThreeTrials.java
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
package mage.cards.b;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Mode;
|
||||||
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.condition.common.LessonsInGraveCondition;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||||
|
import mage.abilities.effects.keyword.EarthbendTargetEffect;
|
||||||
|
import mage.abilities.effects.keyword.ScryTargetEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.FilterCard;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.target.TargetPlayer;
|
||||||
|
import mage.target.common.TargetControlledLandPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class BumiKingOfThreeTrials extends CardImpl {
|
||||||
|
|
||||||
|
public BumiKingOfThreeTrials(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.NOBLE);
|
||||||
|
this.subtype.add(SubType.ALLY);
|
||||||
|
this.power = new MageInt(4);
|
||||||
|
this.toughness = new MageInt(4);
|
||||||
|
|
||||||
|
// When Bumi enters, choose up to X, where X is the number of Lesson cards in your graveyard --
|
||||||
|
// * Put three +1/+1 counters on Bumi.
|
||||||
|
// * Target player scries 3.
|
||||||
|
// * Earthbend 3.
|
||||||
|
this.addAbility(new BumiKingOfThreeTrialsTriggeredAbility());
|
||||||
|
}
|
||||||
|
|
||||||
|
private BumiKingOfThreeTrials(final BumiKingOfThreeTrials card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BumiKingOfThreeTrials copy() {
|
||||||
|
return new BumiKingOfThreeTrials(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class BumiKingOfThreeTrialsTriggeredAbility extends EntersBattlefieldTriggeredAbility {
|
||||||
|
|
||||||
|
private static final DynamicValue xValue = new CardsInControllerGraveyardCount(new FilterCard(SubType.LESSON));
|
||||||
|
|
||||||
|
BumiKingOfThreeTrialsTriggeredAbility() {
|
||||||
|
super(new AddCountersSourceEffect(CounterType.P1P1.createInstance()));
|
||||||
|
this.getModes().setChooseText("choose up to X, where X is the number of Lesson cards in your graveyard —");
|
||||||
|
this.getModes().setMinModes(0);
|
||||||
|
this.addMode(new Mode(new ScryTargetEffect(3)).addTarget(new TargetPlayer()));
|
||||||
|
this.addMode(new Mode(new EarthbendTargetEffect(3)).addTarget(new TargetControlledLandPermanent()));
|
||||||
|
this.addHint(LessonsInGraveCondition.getHint());
|
||||||
|
}
|
||||||
|
|
||||||
|
private BumiKingOfThreeTrialsTriggeredAbility(final BumiKingOfThreeTrialsTriggeredAbility ability) {
|
||||||
|
super(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BumiKingOfThreeTrialsTriggeredAbility copy() {
|
||||||
|
return new BumiKingOfThreeTrialsTriggeredAbility(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkTrigger(GameEvent event, Game game) {
|
||||||
|
if (!super.checkTrigger(event, game)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.getModes().setMaxModes(xValue.calculate(game, this, null));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
51
Mage.Sets/src/mage/cards/b/BumisFeastLecture.java
Normal file
51
Mage.Sets/src/mage/cards/b/BumisFeastLecture.java
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
package mage.cards.b;
|
||||||
|
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
|
import mage.abilities.effects.keyword.EarthbendTargetEffect;
|
||||||
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.hint.ValueHint;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
|
import mage.game.permanent.token.FoodToken;
|
||||||
|
import mage.target.common.TargetControlledLandPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class BumisFeastLecture extends CardImpl {
|
||||||
|
|
||||||
|
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(
|
||||||
|
new FilterControlledPermanent(SubType.FOOD, "twice the number of Foods you control"), 2
|
||||||
|
);
|
||||||
|
private static final Hint hint = new ValueHint(
|
||||||
|
"Foods you control", new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.FOOD))
|
||||||
|
);
|
||||||
|
|
||||||
|
public BumisFeastLecture(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{G}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.LESSON);
|
||||||
|
|
||||||
|
// Create a Food token. Then earthbend X, where X is twice the number of Foods you control.
|
||||||
|
this.getSpellAbility().addEffect(new CreateTokenEffect(new FoodToken()));
|
||||||
|
this.getSpellAbility().addEffect(new EarthbendTargetEffect(xValue).concatBy("Then"));
|
||||||
|
this.getSpellAbility().addTarget(new TargetControlledLandPermanent());
|
||||||
|
this.getSpellAbility().addHint(hint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BumisFeastLecture(final BumisFeastLecture card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BumisFeastLecture copy() {
|
||||||
|
return new BumisFeastLecture(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
107
Mage.Sets/src/mage/cards/c/ChongAndLilyNomads.java
Normal file
107
Mage.Sets/src/mage/cards/c/ChongAndLilyNomads.java
Normal file
|
|
@ -0,0 +1,107 @@
|
||||||
|
package mage.cards.c;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.Mode;
|
||||||
|
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.dynamicvalue.common.StaticValue;
|
||||||
|
import mage.abilities.effects.Effect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.hint.ValueHint;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class ChongAndLilyNomads extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.BARD, "Bards you control");
|
||||||
|
|
||||||
|
public ChongAndLilyNomads(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.BARD);
|
||||||
|
this.subtype.add(SubType.ALLY);
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// Whenever one or more Bards you control attack, choose one --
|
||||||
|
// * Put a lore counter on each of any number of target Sagas you control.
|
||||||
|
Ability ability = new AttacksWithCreaturesTriggeredAbility(
|
||||||
|
new AddCountersTargetEffect(CounterType.LORE.createInstance()), 1, filter
|
||||||
|
);
|
||||||
|
ability.addTarget(new TargetPermanent(0, Integer.MAX_VALUE, ChongAndLilyNomadsValue.getFilter()));
|
||||||
|
|
||||||
|
// * Creatures you control get +1/+0 until end of turn for each lore counter among Sagas you control.
|
||||||
|
ability.addMode(new Mode(new BoostControlledEffect(
|
||||||
|
ChongAndLilyNomadsValue.instance, StaticValue.get(0), Duration.WhileOnBattlefield
|
||||||
|
)));
|
||||||
|
this.addAbility(ability.addHint(ChongAndLilyNomadsValue.getHint()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ChongAndLilyNomads(final ChongAndLilyNomads card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChongAndLilyNomads copy() {
|
||||||
|
return new ChongAndLilyNomads(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ChongAndLilyNomadsValue implements DynamicValue {
|
||||||
|
instance;
|
||||||
|
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.SAGA, "Sagas you control");
|
||||||
|
|
||||||
|
public static FilterPermanent getFilter() {
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Hint hint = new ValueHint("Lore counters among Sagas you control", instance);
|
||||||
|
|
||||||
|
public static Hint getHint() {
|
||||||
|
return hint;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||||
|
return game
|
||||||
|
.getBattlefield()
|
||||||
|
.getActivePermanents(filter, sourceAbility.getControllerId(), sourceAbility, game)
|
||||||
|
.stream()
|
||||||
|
.mapToInt(permanent -> permanent.getCounters(game).getCount(CounterType.LORE))
|
||||||
|
.sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChongAndLilyNomadsValue copy() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage() {
|
||||||
|
return "lore counter among Sagas you control";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "1";
|
||||||
|
}
|
||||||
|
}
|
||||||
92
Mage.Sets/src/mage/cards/c/CombustionMan.java
Normal file
92
Mage.Sets/src/mage/cards/c/CombustionMan.java
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
package mage.cards.c;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.MageObject;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class CombustionMan extends CardImpl {
|
||||||
|
|
||||||
|
public CombustionMan(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.ASSASSIN);
|
||||||
|
this.power = new MageInt(4);
|
||||||
|
this.toughness = new MageInt(6);
|
||||||
|
|
||||||
|
// Whenever Combustion Man attacks, destroy target permanent unless its controller has Combustion Man deal damage to them equal to his power.
|
||||||
|
Ability ability = new AttacksTriggeredAbility(new CombustionManEffect());
|
||||||
|
ability.addTarget(new TargetPermanent());
|
||||||
|
this.addAbility(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CombustionMan(final CombustionMan card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CombustionMan copy() {
|
||||||
|
return new CombustionMan(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CombustionManEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
CombustionManEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "destroy target permanent unless its controller has {this} deal damage to them equal to his power";
|
||||||
|
}
|
||||||
|
|
||||||
|
private CombustionManEffect(final CombustionManEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CombustionManEffect copy() {
|
||||||
|
return new CombustionManEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
|
||||||
|
if (permanent == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Player player = game.getPlayer(permanent.getControllerId());
|
||||||
|
if (player == null || !player.chooseUse(
|
||||||
|
Outcome.Damage, "Have " + CardUtil.getSourceIdName(game, source) +
|
||||||
|
" deal damage to you equal to its power?", "If you don't, " +
|
||||||
|
permanent.getIdName() + " will be destroyed",
|
||||||
|
"Take damage", "Destroy permanent", source, game
|
||||||
|
)) {
|
||||||
|
return permanent.destroy(source, game);
|
||||||
|
}
|
||||||
|
return Optional
|
||||||
|
.ofNullable(source.getSourcePermanentOrLKI(game))
|
||||||
|
.map(MageObject::getPower)
|
||||||
|
.map(MageInt::getValue)
|
||||||
|
.filter(x -> x > 0)
|
||||||
|
.filter(x -> player.damage(x, source, game) > 0)
|
||||||
|
.isPresent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,16 +3,12 @@ package mage.cards.d;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.dynamicvalue.common.CardsDrawnThisTurnDynamicValue;
|
import mage.abilities.dynamicvalue.common.CardsDrawnThisTurnDynamicValue;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.common.PutOnTopOrBottomLibraryTargetEffect;
|
||||||
import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
|
import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.constants.Zone;
|
import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.common.TargetNonlandPermanent;
|
import mage.target.common.TargetNonlandPermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -33,7 +29,7 @@ public final class DeemInferior extends CardImpl {
|
||||||
this.addAbility(ability.addHint(CardsDrawnThisTurnDynamicValue.getHint()));
|
this.addAbility(ability.addHint(CardsDrawnThisTurnDynamicValue.getHint()));
|
||||||
|
|
||||||
// The owner of target nonland permanent puts it into their library second from the top or on the bottom.
|
// The owner of target nonland permanent puts it into their library second from the top or on the bottom.
|
||||||
this.getSpellAbility().addEffect(new DeemInferiorEffect());
|
this.getSpellAbility().addEffect(new PutOnTopOrBottomLibraryTargetEffect(2, true));
|
||||||
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
|
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -46,40 +42,3 @@ public final class DeemInferior extends CardImpl {
|
||||||
return new DeemInferior(this);
|
return new DeemInferior(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Same as Temporal Cleansing.
|
|
||||||
class DeemInferiorEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
DeemInferiorEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "the owner of target nonland permanent puts it into their library second from the top or on the bottom";
|
|
||||||
}
|
|
||||||
|
|
||||||
private DeemInferiorEffect(final DeemInferiorEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DeemInferiorEffect copy() {
|
|
||||||
return new DeemInferiorEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
|
|
||||||
if (permanent == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Player player = game.getPlayer(permanent.getOwnerId());
|
|
||||||
if (player == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (player.chooseUse(
|
|
||||||
outcome, "Put " + permanent.getIdName() + " second from the top or on the bottom?",
|
|
||||||
null, "Second from top", "Bottom", source, game
|
|
||||||
)) {
|
|
||||||
return player.putCardOnTopXOfLibrary(permanent, game, source, 2, true);
|
|
||||||
}
|
|
||||||
return player.putCardsOnBottomOfLibrary(permanent, game, source);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
122
Mage.Sets/src/mage/cards/d/DestinedConfrontation.java
Normal file
122
Mage.Sets/src/mage/cards/d/DestinedConfrontation.java
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
package mage.cards.d;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.MageObject;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class DestinedConfrontation extends CardImpl {
|
||||||
|
|
||||||
|
public DestinedConfrontation(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{W}{W}");
|
||||||
|
|
||||||
|
// Each player chooses any number of creatures they control with total power 4 or less, then sacrifices all other creatures they control.
|
||||||
|
this.getSpellAbility().addEffect(new DestinedConfrontationEffect());
|
||||||
|
}
|
||||||
|
|
||||||
|
private DestinedConfrontation(final DestinedConfrontation card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DestinedConfrontation copy() {
|
||||||
|
return new DestinedConfrontation(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DestinedConfrontationEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
DestinedConfrontationEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "each player chooses any number of creatures they control " +
|
||||||
|
"with total power 4 or less, then sacrifices all other creatures they control";
|
||||||
|
}
|
||||||
|
|
||||||
|
private DestinedConfrontationEffect(final DestinedConfrontationEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DestinedConfrontationEffect copy() {
|
||||||
|
return new DestinedConfrontationEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Set<UUID> permanents = new HashSet<>();
|
||||||
|
for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
|
||||||
|
Player player = game.getPlayer(playerId);
|
||||||
|
if (player == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
TargetPermanent target = new DestinedConfrontationTarget();
|
||||||
|
player.choose(outcome, target, source, game);
|
||||||
|
permanents.addAll(target.getTargets());
|
||||||
|
}
|
||||||
|
for (Permanent permanent : game.getBattlefield().getActivePermanents(
|
||||||
|
StaticFilters.FILTER_PERMANENT_CREATURE, source.getSourceId(), source, game
|
||||||
|
)) {
|
||||||
|
if (!permanents.contains(permanent.getId())) {
|
||||||
|
permanent.sacrifice(source, game);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DestinedConfrontationTarget extends TargetPermanent {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter
|
||||||
|
= new FilterControlledCreaturePermanent("creatures you control with total power 4 or less");
|
||||||
|
|
||||||
|
DestinedConfrontationTarget() {
|
||||||
|
super(0, Integer.MAX_VALUE, filter, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DestinedConfrontationTarget(final DestinedConfrontationTarget target) {
|
||||||
|
super(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DestinedConfrontationTarget copy() {
|
||||||
|
return new DestinedConfrontationTarget(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) {
|
||||||
|
if (!super.canTarget(playerId, id, source, game)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Permanent permanent = game.getPermanent(id);
|
||||||
|
if (permanent == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
.getTargets()
|
||||||
|
.stream()
|
||||||
|
.map(game::getPermanent)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.map(MageObject::getPower)
|
||||||
|
.mapToInt(MageInt::getValue)
|
||||||
|
.sum() + permanent.getPower().getValue() <= 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
37
Mage.Sets/src/mage/cards/e/ElementalTeachings.java
Normal file
37
Mage.Sets/src/mage/cards/e/ElementalTeachings.java
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
package mage.cards.e;
|
||||||
|
|
||||||
|
import mage.abilities.effects.common.search.SearchLibraryForFourDifferentCardsEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.PutCards;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class ElementalTeachings extends CardImpl {
|
||||||
|
|
||||||
|
public ElementalTeachings(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{G}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.LESSON);
|
||||||
|
|
||||||
|
// Search your library for up to four land cards with different names and reveal them. An opponent chooses two of those cards. Put the chosen cards into your graveyard and the rest onto the battlefield tapped, then shuffle.
|
||||||
|
this.getSpellAbility().addEffect(new SearchLibraryForFourDifferentCardsEffect(
|
||||||
|
StaticFilters.FILTER_CARD_LANDS, PutCards.BATTLEFIELD_TAPPED, false
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ElementalTeachings(final ElementalTeachings card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementalTeachings copy() {
|
||||||
|
return new ElementalTeachings(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
69
Mage.Sets/src/mage/cards/e/ElephantMandrill.java
Normal file
69
Mage.Sets/src/mage/cards/e/ElephantMandrill.java
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
package mage.cards.e;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
|
import mage.abilities.effects.common.CreateTokenAllEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.hint.ValueHint;
|
||||||
|
import mage.abilities.keyword.ReachAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.TargetController;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterArtifactPermanent;
|
||||||
|
import mage.game.permanent.token.FoodToken;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class ElephantMandrill extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterArtifactPermanent("artifact your opponents control");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(TargetController.OPPONENT.getOwnerPredicate());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter);
|
||||||
|
private static final Hint hint = new ValueHint("Artifacts your opponents control", xValue);
|
||||||
|
|
||||||
|
public ElephantMandrill(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.ELEPHANT);
|
||||||
|
this.subtype.add(SubType.MONKEY);
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(2);
|
||||||
|
|
||||||
|
// Reach
|
||||||
|
this.addAbility(ReachAbility.getInstance());
|
||||||
|
|
||||||
|
// When this creature enters, each player creates a Food token.
|
||||||
|
this.addAbility(new EntersBattlefieldTriggeredAbility(
|
||||||
|
new CreateTokenAllEffect(new FoodToken(), TargetController.EACH_PLAYER)
|
||||||
|
));
|
||||||
|
|
||||||
|
// At the beginning of combat on your turn, this creature gets +1/+1 until end of turn for each artifact your opponents control.
|
||||||
|
this.addAbility(new BeginningOfCombatTriggeredAbility(
|
||||||
|
new BoostSourceEffect(xValue, xValue, Duration.EndOfTurn)
|
||||||
|
).addHint(hint));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ElephantMandrill(final ElephantMandrill card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElephantMandrill copy() {
|
||||||
|
return new ElephantMandrill(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
41
Mage.Sets/src/mage/cards/f/FreedomFighterRecruit.java
Normal file
41
Mage.Sets/src/mage/cards/f/FreedomFighterRecruit.java
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
package mage.cards.f;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||||
|
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class FreedomFighterRecruit extends CardImpl {
|
||||||
|
|
||||||
|
public FreedomFighterRecruit(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.REBEL);
|
||||||
|
this.subtype.add(SubType.ALLY);
|
||||||
|
this.power = new MageInt(0);
|
||||||
|
this.toughness = new MageInt(2);
|
||||||
|
|
||||||
|
// Freedom Fighter Recruit's power is equal to the number of creatures you control.
|
||||||
|
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerSourceEffect(CreaturesYouControlCount.PLURAL)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private FreedomFighterRecruit(final FreedomFighterRecruit card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FreedomFighterRecruit copy() {
|
||||||
|
return new FreedomFighterRecruit(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
45
Mage.Sets/src/mage/cards/g/GiantFly.java
Normal file
45
Mage.Sets/src/mage/cards/g/GiantFly.java
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
package mage.cards.g;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.SacrificePermanentTriggeredAbility;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class GiantFly extends CardImpl {
|
||||||
|
|
||||||
|
public GiantFly(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.INSECT);
|
||||||
|
this.power = new MageInt(2);
|
||||||
|
this.toughness = new MageInt(2);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever you sacrifice another permanent, this creature gets +1/+0 until end of turn.
|
||||||
|
this.addAbility(new SacrificePermanentTriggeredAbility(
|
||||||
|
new BoostSourceEffect(1, 0, Duration.EndOfTurn), StaticFilters.FILTER_ANOTHER_PERMANENT
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private GiantFly(final GiantFly card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GiantFly copy() {
|
||||||
|
return new GiantFly(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,20 +1,11 @@
|
||||||
package mage.cards.g;
|
package mage.cards.g;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.effects.common.search.SearchLibraryForFourDifferentCardsEffect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.Cards;
|
|
||||||
import mage.cards.CardsImpl;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.PutCards;
|
||||||
import mage.constants.Zone;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.TargetCard;
|
|
||||||
import mage.target.common.TargetCardInLibrary;
|
|
||||||
import mage.target.common.TargetCardWithDifferentNameInLibrary;
|
|
||||||
import mage.target.common.TargetOpponent;
|
import mage.target.common.TargetOpponent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -28,7 +19,9 @@ public final class GiftsUngiven extends CardImpl {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}");
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}");
|
||||||
|
|
||||||
// Search your library for up to four cards with different names and reveal them. Target opponent chooses two of those cards. Put the chosen cards into your graveyard and the rest into your hand. Then shuffle your library.
|
// Search your library for up to four cards with different names and reveal them. Target opponent chooses two of those cards. Put the chosen cards into your graveyard and the rest into your hand. Then shuffle your library.
|
||||||
this.getSpellAbility().addEffect(new GiftsUngivenEffect());
|
this.getSpellAbility().addEffect(new SearchLibraryForFourDifferentCardsEffect(
|
||||||
|
StaticFilters.FILTER_CARD_CARDS, PutCards.HAND, true
|
||||||
|
));
|
||||||
this.getSpellAbility().addTarget(new TargetOpponent());
|
this.getSpellAbility().addTarget(new TargetOpponent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -41,57 +34,3 @@ public final class GiftsUngiven extends CardImpl {
|
||||||
return new GiftsUngiven(this);
|
return new GiftsUngiven(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GiftsUngivenEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
private static final FilterCard filter = new FilterCard("cards with different names");
|
|
||||||
private static final FilterCard filter2 = new FilterCard("cards to put in graveyard");
|
|
||||||
|
|
||||||
public GiftsUngivenEffect() {
|
|
||||||
super(Outcome.DrawCard);
|
|
||||||
this.staticText = "Search your library for up to four cards with different names and reveal them. " +
|
|
||||||
"Target opponent chooses two of those cards. Put the chosen cards into your graveyard " +
|
|
||||||
"and the rest into your hand. Then shuffle";
|
|
||||||
}
|
|
||||||
|
|
||||||
private GiftsUngivenEffect(final GiftsUngivenEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public GiftsUngivenEffect copy() {
|
|
||||||
return new GiftsUngivenEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Player player = game.getPlayer(source.getControllerId());
|
|
||||||
Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source));
|
|
||||||
if (player == null || opponent == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
TargetCardInLibrary target = new TargetCardWithDifferentNameInLibrary(0, 4, filter);
|
|
||||||
player.searchLibrary(target, source, game);
|
|
||||||
Cards cards = new CardsImpl(target.getTargets());
|
|
||||||
cards.retainZone(Zone.LIBRARY, game);
|
|
||||||
if (cards.isEmpty()) {
|
|
||||||
player.shuffleLibrary(source, game);
|
|
||||||
}
|
|
||||||
player.revealCards(source, cards, game);
|
|
||||||
|
|
||||||
if (cards.size() > 2) {
|
|
||||||
Cards cardsToKeep = new CardsImpl();
|
|
||||||
cardsToKeep.addAll(cards);
|
|
||||||
TargetCard targetDiscard = new TargetCard(2, Zone.LIBRARY, filter2);
|
|
||||||
if (opponent.choose(Outcome.Discard, cards, targetDiscard, source, game)) {
|
|
||||||
cardsToKeep.removeIf(targetDiscard.getTargets()::contains);
|
|
||||||
cards.removeAll(cardsToKeep);
|
|
||||||
}
|
|
||||||
player.moveCards(cardsToKeep, Zone.HAND, source, game);
|
|
||||||
}
|
|
||||||
|
|
||||||
player.moveCards(cards, Zone.GRAVEYARD, source, game);
|
|
||||||
player.shuffleLibrary(source, game);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
58
Mage.Sets/src/mage/cards/h/HookSwords.java
Normal file
58
Mage.Sets/src/mage/cards/h/HookSwords.java
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
package mage.cards.h;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.condition.common.MyTurnCondition;
|
||||||
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
|
import mage.abilities.effects.common.CreateTokenAttachSourceEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||||
|
import mage.abilities.keyword.EquipAbility;
|
||||||
|
import mage.abilities.keyword.FirstStrikeAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.AttachmentType;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.game.permanent.token.AllyToken;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class HookSwords extends CardImpl {
|
||||||
|
|
||||||
|
public HookSwords(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{R/W}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.EQUIPMENT);
|
||||||
|
|
||||||
|
// When this Equipment enters, create a 1/1 white Ally creature token, then attach this Equipment to it.
|
||||||
|
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenAttachSourceEffect(new AllyToken())));
|
||||||
|
|
||||||
|
// During your turn, equipped creature gets +1/+1 and has first strike.
|
||||||
|
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
|
new BoostEquippedEffect(1, 1), MyTurnCondition.instance,
|
||||||
|
"during your turn, equipped creature gets +1/+1"
|
||||||
|
));
|
||||||
|
ability.addEffect(new ConditionalContinuousEffect(
|
||||||
|
new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.EQUIPMENT),
|
||||||
|
MyTurnCondition.instance, "and has first strike"
|
||||||
|
));
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
// Equip {3}
|
||||||
|
this.addAbility(new EquipAbility(3));
|
||||||
|
}
|
||||||
|
|
||||||
|
private HookSwords(final HookSwords card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HookSwords copy() {
|
||||||
|
return new HookSwords(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
51
Mage.Sets/src/mage/cards/k/KyoshiWarriorExemplars.java
Normal file
51
Mage.Sets/src/mage/cards/k/KyoshiWarriorExemplars.java
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
package mage.cards.k;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.AttacksTriggeredAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||||
|
import mage.abilities.hint.common.LandsYouControlHint;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.ComparisonType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.common.FilterControlledLandPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class KyoshiWarriorExemplars extends CardImpl {
|
||||||
|
|
||||||
|
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
|
||||||
|
new FilterControlledLandPermanent("you control eight or more lands"), ComparisonType.MORE_THAN, 7
|
||||||
|
);
|
||||||
|
|
||||||
|
public KyoshiWarriorExemplars(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.WARRIOR);
|
||||||
|
this.subtype.add(SubType.ALLY);
|
||||||
|
this.power = new MageInt(4);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// Whenever this creature attacks, if you control eight or more lands, creatures you control get +2/+2 until end of turn.
|
||||||
|
this.addAbility(new AttacksTriggeredAbility(
|
||||||
|
new BoostControlledEffect(2, 2, Duration.EndOfTurn)
|
||||||
|
).withInterveningIf(condition).addHint(LandsYouControlHint.instance));
|
||||||
|
}
|
||||||
|
|
||||||
|
private KyoshiWarriorExemplars(final KyoshiWarriorExemplars card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public KyoshiWarriorExemplars copy() {
|
||||||
|
return new KyoshiWarriorExemplars(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
86
Mage.Sets/src/mage/cards/l/LoAndLiRoyalAdvisors.java
Normal file
86
Mage.Sets/src/mage/cards/l/LoAndLiRoyalAdvisors.java
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
package mage.cards.l;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.effects.common.MillCardsTargetEffect;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.target.TargetPlayer;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class LoAndLiRoyalAdvisors extends CardImpl {
|
||||||
|
|
||||||
|
public LoAndLiRoyalAdvisors(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.ADVISOR);
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// Whenever an opponent discards a card or mills one or more cards, put a +1/+1 counter on each Advisor you control.
|
||||||
|
this.addAbility(new LoAndLiRoyalAdvisorsTriggeredAbility());
|
||||||
|
|
||||||
|
// {2}{U/B}: Target player mills four cards.
|
||||||
|
Ability ability = new SimpleActivatedAbility(new MillCardsTargetEffect(4), new ManaCostsImpl<>("{2}{U/B}"));
|
||||||
|
ability.addTarget(new TargetPlayer());
|
||||||
|
this.addAbility(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LoAndLiRoyalAdvisors(final LoAndLiRoyalAdvisors card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LoAndLiRoyalAdvisors copy() {
|
||||||
|
return new LoAndLiRoyalAdvisors(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoAndLiRoyalAdvisorsTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.ADVISOR);
|
||||||
|
|
||||||
|
LoAndLiRoyalAdvisorsTriggeredAbility() {
|
||||||
|
super(Zone.BATTLEFIELD, new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter));
|
||||||
|
setTriggerPhrase("Whenever an opponent discards a card or mills one or more cards, ");
|
||||||
|
}
|
||||||
|
|
||||||
|
private LoAndLiRoyalAdvisorsTriggeredAbility(final LoAndLiRoyalAdvisorsTriggeredAbility ability) {
|
||||||
|
super(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LoAndLiRoyalAdvisorsTriggeredAbility copy() {
|
||||||
|
return new LoAndLiRoyalAdvisorsTriggeredAbility(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkEventType(GameEvent event, Game game) {
|
||||||
|
return event.getType() == GameEvent.EventType.DISCARDED_CARD
|
||||||
|
|| event.getType() == GameEvent.EventType.MILLED_CARDS_BATCH_FOR_ONE_PLAYER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkTrigger(GameEvent event, Game game) {
|
||||||
|
return game.getOpponents(getControllerId()).contains(event.getPlayerId());
|
||||||
|
}
|
||||||
|
}
|
||||||
39
Mage.Sets/src/mage/cards/l/LostDays.java
Normal file
39
Mage.Sets/src/mage/cards/l/LostDays.java
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
package mage.cards.l;
|
||||||
|
|
||||||
|
import mage.abilities.effects.common.CreateTokenEffect;
|
||||||
|
import mage.abilities.effects.common.PutOnTopOrBottomLibraryTargetEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.permanent.token.ClueArtifactToken;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class LostDays extends CardImpl {
|
||||||
|
|
||||||
|
public LostDays(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{U}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.LESSON);
|
||||||
|
|
||||||
|
// The owner of target creature or enchantment puts it into their library second from the top or on the bottom. You create a Clue token.
|
||||||
|
this.getSpellAbility().addEffect(new PutOnTopOrBottomLibraryTargetEffect(2, true));
|
||||||
|
this.getSpellAbility().addEffect(new CreateTokenEffect(new ClueArtifactToken()).concatBy("You"));
|
||||||
|
this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURE_OR_ENCHANTMENT));
|
||||||
|
}
|
||||||
|
|
||||||
|
private LostDays(final LostDays card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LostDays copy() {
|
||||||
|
return new LostDays(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
95
Mage.Sets/src/mage/cards/l/LostInMemories.java
Normal file
95
Mage.Sets/src/mage/cards/l/LostInMemories.java
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
package mage.cards.l;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.TriggeredAbility;
|
||||||
|
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.effects.ContinuousEffectImpl;
|
||||||
|
import mage.abilities.effects.common.AttachEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||||
|
import mage.abilities.keyword.EnchantAbility;
|
||||||
|
import mage.abilities.keyword.FlashAbility;
|
||||||
|
import mage.abilities.keyword.FlashbackAbility;
|
||||||
|
import mage.cards.Card;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.*;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
import mage.target.common.TargetCardInYourGraveyard;
|
||||||
|
import mage.target.common.TargetControlledCreaturePermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class LostInMemories extends CardImpl {
|
||||||
|
|
||||||
|
public LostInMemories(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.AURA);
|
||||||
|
|
||||||
|
// Flash
|
||||||
|
this.addAbility(FlashAbility.getInstance());
|
||||||
|
|
||||||
|
// Enchant creature you control
|
||||||
|
TargetPermanent auraTarget = new TargetControlledCreaturePermanent();
|
||||||
|
this.getSpellAbility().addTarget(auraTarget);
|
||||||
|
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
|
||||||
|
this.addAbility(new EnchantAbility(auraTarget));
|
||||||
|
|
||||||
|
// Enchanted creature gets +1/+1 and has "Whenever this creature deals combat damage to a player, target instant or sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost."
|
||||||
|
TriggeredAbility triggeredAbility = new DealsCombatDamageToAPlayerTriggeredAbility(new LostInMemoriesEffect());
|
||||||
|
triggeredAbility.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY));
|
||||||
|
Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 1));
|
||||||
|
ability.addEffect(new GainAbilityAttachedEffect(triggeredAbility, AttachmentType.AURA)
|
||||||
|
.setText("and has \"Whenever this creature deals combat damage to a player, " +
|
||||||
|
"target instant or sorcery card in your graveyard gains flashback until end of turn. " +
|
||||||
|
"The flashback cost is equal to its mana cost.\""));
|
||||||
|
this.addAbility(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LostInMemories(final LostInMemories card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LostInMemories copy() {
|
||||||
|
return new LostInMemories(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LostInMemoriesEffect extends ContinuousEffectImpl {
|
||||||
|
|
||||||
|
LostInMemoriesEffect() {
|
||||||
|
super(Duration.EndOfTurn, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
|
||||||
|
this.staticText = "target instant or sorcery card in your graveyard gains flashback until end of turn. " +
|
||||||
|
"The flashback cost is equal to its mana cost";
|
||||||
|
}
|
||||||
|
|
||||||
|
private LostInMemoriesEffect(final LostInMemoriesEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LostInMemoriesEffect copy() {
|
||||||
|
return new LostInMemoriesEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Card card = game.getCard(getTargetPointer().getFirst(game, source));
|
||||||
|
if (card == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
FlashbackAbility ability = new FlashbackAbility(card, card.getManaCost());
|
||||||
|
ability.setSourceId(card.getId());
|
||||||
|
ability.setControllerId(card.getOwnerId());
|
||||||
|
game.getState().addOtherAbility(card, ability);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
49
Mage.Sets/src/mage/cards/m/MastersGuidance.java
Normal file
49
Mage.Sets/src/mage/cards/m/MastersGuidance.java
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
package mage.cards.m;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
|
||||||
|
import mage.abilities.condition.common.FerociousCondition;
|
||||||
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||||
|
import mage.abilities.hint.common.FerociousHint;
|
||||||
|
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.counters.CounterType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.target.common.TargetAttackingCreature;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class MastersGuidance extends CardImpl {
|
||||||
|
|
||||||
|
public MastersGuidance(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
|
||||||
|
|
||||||
|
// Whenever you attack with two or more legendary creatures, put a +1/+1 counter on each of up to two target attacking creatures.
|
||||||
|
Ability ability = new AttacksWithCreaturesTriggeredAbility(
|
||||||
|
new AddCountersTargetEffect(CounterType.P1P1.createInstance()),
|
||||||
|
2, StaticFilters.FILTER_CREATURES_LEGENDARY
|
||||||
|
);
|
||||||
|
ability.addTarget(new TargetAttackingCreature(0, 2));
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
// At the beginning of your end step, if you control a creature with power 4 or greater, draw a card.
|
||||||
|
this.addAbility(new BeginningOfEndStepTriggeredAbility(new DrawCardSourceControllerEffect(1))
|
||||||
|
.withInterveningIf(FerociousCondition.instance)
|
||||||
|
.addHint(FerociousHint.instance));
|
||||||
|
}
|
||||||
|
|
||||||
|
private MastersGuidance(final MastersGuidance card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MastersGuidance copy() {
|
||||||
|
return new MastersGuidance(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
44
Mage.Sets/src/mage/cards/m/MonkGyatso.java
Normal file
44
Mage.Sets/src/mage/cards/m/MonkGyatso.java
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
package mage.cards.m;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.BecomesTargetAnyTriggeredAbility;
|
||||||
|
import mage.abilities.effects.keyword.AirbendTargetEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class MonkGyatso extends CardImpl {
|
||||||
|
|
||||||
|
public MonkGyatso(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.MONK);
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// Whenever another creature you control becomes the target of a spell or ability, you may airbend that creature.
|
||||||
|
this.addAbility(new BecomesTargetAnyTriggeredAbility(
|
||||||
|
new AirbendTargetEffect().setText("airbend that creature"),
|
||||||
|
StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL
|
||||||
|
).setOptional(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
private MonkGyatso(final MonkGyatso card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MonkGyatso copy() {
|
||||||
|
return new MonkGyatso(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
115
Mage.Sets/src/mage/cards/n/NightmaresAndDaydreams.java
Normal file
115
Mage.Sets/src/mage/cards/n/NightmaresAndDaydreams.java
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
package mage.cards.n;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.DelayedTriggeredAbility;
|
||||||
|
import mage.abilities.common.SagaAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||||
|
import mage.abilities.dynamicvalue.common.SavedDamageValue;
|
||||||
|
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
||||||
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.MillCardsTargetEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SagaChapter;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.game.stack.Spell;
|
||||||
|
import mage.target.TargetPlayer;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class NightmaresAndDaydreams extends CardImpl {
|
||||||
|
|
||||||
|
public NightmaresAndDaydreams(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.SAGA);
|
||||||
|
|
||||||
|
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.)
|
||||||
|
SagaAbility sagaAbility = new SagaAbility(this, SagaChapter.CHAPTER_IV);
|
||||||
|
|
||||||
|
// I, II, III -- Until your next turn, whenever you cast an instant or sorcery spell, target player mills cards equal to that spell's mana value.
|
||||||
|
sagaAbility.addChapterEffect(
|
||||||
|
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_III,
|
||||||
|
new CreateDelayedTriggeredAbilityEffect(new NightmaresAndDaydreamsTriggeredAbility())
|
||||||
|
);
|
||||||
|
|
||||||
|
// IV -- Draw a card. If a graveyard has twenty or more cards in it, draw three cards instead.
|
||||||
|
sagaAbility.addChapterEffect(
|
||||||
|
this, SagaChapter.CHAPTER_IV,
|
||||||
|
new ConditionalOneShotEffect(
|
||||||
|
new DrawCardSourceControllerEffect(3), new DrawCardSourceControllerEffect(1),
|
||||||
|
NightmaresAndDaydreamsCondition.instance, "draw a card. " +
|
||||||
|
"If a graveyard has twenty or more cards in it, draw three cards instead"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
this.addAbility(sagaAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
private NightmaresAndDaydreams(final NightmaresAndDaydreams card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NightmaresAndDaydreams copy() {
|
||||||
|
return new NightmaresAndDaydreams(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum NightmaresAndDaydreamsCondition implements Condition {
|
||||||
|
instance;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
return game
|
||||||
|
.getState()
|
||||||
|
.getPlayersInRange(source.getControllerId(), game)
|
||||||
|
.stream()
|
||||||
|
.map(game::getPlayer)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.anyMatch(player -> player.getGraveyard().size() >= 20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NightmaresAndDaydreamsTriggeredAbility extends DelayedTriggeredAbility {
|
||||||
|
|
||||||
|
NightmaresAndDaydreamsTriggeredAbility() {
|
||||||
|
super(new MillCardsTargetEffect(SavedDamageValue.MANY)
|
||||||
|
.setText("target player mills cards equal to that spell's mana value"),
|
||||||
|
Duration.UntilYourNextTurn, false, false);
|
||||||
|
this.setTriggerPhrase("Until your next turn, whenever you cast an instant or sorcery spell, ");
|
||||||
|
this.addTarget(new TargetPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
private NightmaresAndDaydreamsTriggeredAbility(final NightmaresAndDaydreamsTriggeredAbility ability) {
|
||||||
|
super(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NightmaresAndDaydreamsTriggeredAbility copy() {
|
||||||
|
return new NightmaresAndDaydreamsTriggeredAbility(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkEventType(GameEvent event, Game game) {
|
||||||
|
return event.getType() == GameEvent.EventType.SPELL_CAST;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkTrigger(GameEvent event, Game game) {
|
||||||
|
Spell spell = game.getSpell(event.getTargetId());
|
||||||
|
if (spell == null || !spell.isControlledBy(getControllerId()) || !spell.isInstantOrSorcery(game)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.getEffects().setValue("damage", spell.getManaValue());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
97
Mage.Sets/src/mage/cards/p/PhoenixFleetAirship.java
Normal file
97
Mage.Sets/src/mage/cards/p/PhoenixFleetAirship.java
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
package mage.cards.p;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.condition.Condition;
|
||||||
|
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||||
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsSacrificedThisTurnCount;
|
||||||
|
import mage.abilities.effects.CreateTokenCopySourceEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.AddCardTypeSourceEffect;
|
||||||
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.hint.ValueHint;
|
||||||
|
import mage.abilities.hint.common.PermanentsSacrificedThisTurnHint;
|
||||||
|
import mage.abilities.keyword.CrewAbility;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
|
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.ComparisonType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
|
import mage.filter.predicate.mageobject.NamePredicate;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.watchers.common.PermanentsSacrificedWatcher;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class PhoenixFleetAirship extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterControlledPermanent();
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(new NamePredicate("Phoenix Fleet Airship"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 7);
|
||||||
|
private static final Hint hint = new ValueHint(
|
||||||
|
"Permanents you control named Phoenix Fleet Airship", new PermanentsOnBattlefieldCount(filter)
|
||||||
|
);
|
||||||
|
|
||||||
|
public PhoenixFleetAirship(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{B}{B}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.VEHICLE);
|
||||||
|
this.power = new MageInt(4);
|
||||||
|
this.toughness = new MageInt(4);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// At the beginning of your end step, if you sacrificed a permanent this turn, create a token that's a copy of this Vehicle.
|
||||||
|
this.addAbility(new BeginningOfEndStepTriggeredAbility(new CreateTokenCopySourceEffect())
|
||||||
|
.withInterveningIf(PhoenixFleetAirshipCondition.instance)
|
||||||
|
.addHint(PermanentsSacrificedThisTurnHint.instance), new PermanentsSacrificedWatcher());
|
||||||
|
|
||||||
|
// As long as you control eight or more permanents named Phoenix Fleet Airship, this Vehicle is an artifact creature.
|
||||||
|
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
|
new AddCardTypeSourceEffect(Duration.WhileOnBattlefield, CardType.ARTIFACT, CardType.CREATURE),
|
||||||
|
condition, "as long as you control eight or more permanents " +
|
||||||
|
"named Phoenix Fleet Airship, this Vehicle is an artifact creature"
|
||||||
|
)).addHint(hint));
|
||||||
|
|
||||||
|
// Crew 1
|
||||||
|
this.addAbility(new CrewAbility(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
private PhoenixFleetAirship(final PhoenixFleetAirship card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PhoenixFleetAirship copy() {
|
||||||
|
return new PhoenixFleetAirship(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum PhoenixFleetAirshipCondition implements Condition {
|
||||||
|
instance;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
return PermanentsSacrificedThisTurnCount.instance.calculate(game, source, null) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "you sacrificed a permanent this turn";
|
||||||
|
}
|
||||||
|
}
|
||||||
54
Mage.Sets/src/mage/cards/p/PriceOfFreedom.java
Normal file
54
Mage.Sets/src/mage/cards/p/PriceOfFreedom.java
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
package mage.cards.p;
|
||||||
|
|
||||||
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.search.SearchLibraryPutInPlayTargetControllerEffect;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.TargetController;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.target.TargetPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class PriceOfFreedom extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterPermanent("artifact or land an opponent controls");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(Predicates.or(
|
||||||
|
CardType.ARTIFACT.getPredicate(),
|
||||||
|
CardType.LAND.getPredicate()
|
||||||
|
));
|
||||||
|
filter.add(TargetController.OPPONENT.getOwnerPredicate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public PriceOfFreedom(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.LESSON);
|
||||||
|
|
||||||
|
// Destroy target artifact or land an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield tapped, then shuffle.
|
||||||
|
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
||||||
|
this.getSpellAbility().addTarget(new TargetPermanent(filter));
|
||||||
|
this.getSpellAbility().addEffect(new SearchLibraryPutInPlayTargetControllerEffect(true));
|
||||||
|
|
||||||
|
// Draw a card.
|
||||||
|
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private PriceOfFreedom(final PriceOfFreedom card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PriceOfFreedom copy() {
|
||||||
|
return new PriceOfFreedom(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
94
Mage.Sets/src/mage/cards/r/RavenEagle.java
Normal file
94
Mage.Sets/src/mage/cards/r/RavenEagle.java
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
package mage.cards.r;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.DrawNthCardTriggeredAbility;
|
||||||
|
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.GainLifeEffect;
|
||||||
|
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
|
import mage.cards.Card;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.permanent.token.ClueArtifactToken;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.common.TargetCardInGraveyard;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class RavenEagle extends CardImpl {
|
||||||
|
|
||||||
|
public RavenEagle(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.BIRD);
|
||||||
|
this.subtype.add(SubType.ASSASSIN);
|
||||||
|
this.power = new MageInt(2);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// Flying
|
||||||
|
this.addAbility(FlyingAbility.getInstance());
|
||||||
|
|
||||||
|
// Whenever this creature enters or attacks, exile up to one target card from a graveyard. If a creature card is exiled this way, create a Clue token.
|
||||||
|
Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new RavenEagleEffect());
|
||||||
|
ability.addTarget(new TargetCardInGraveyard(0, 1));
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
// Whenever you draw your second card each turn, each opponent loses 1 life and you gain 1 life.
|
||||||
|
ability = new DrawNthCardTriggeredAbility(new LoseLifeOpponentsEffect(1));
|
||||||
|
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
|
||||||
|
this.addAbility(ability);
|
||||||
|
}
|
||||||
|
|
||||||
|
private RavenEagle(final RavenEagle card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RavenEagle copy() {
|
||||||
|
return new RavenEagle(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class RavenEagleEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
RavenEagleEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "exile up to one target card from a graveyard. " +
|
||||||
|
"If a creature card is exiled this way, create a Clue token";
|
||||||
|
}
|
||||||
|
|
||||||
|
private RavenEagleEffect(final RavenEagleEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RavenEagleEffect copy() {
|
||||||
|
return new RavenEagleEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player player = game.getPlayer(source.getControllerId());
|
||||||
|
Card card = game.getCard(getTargetPointer().getFirst(game, source));
|
||||||
|
if (player == null || card == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean isCreature = card.isCreature(game);
|
||||||
|
player.moveCards(card, Zone.EXILED, source, game);
|
||||||
|
if (isCreature) {
|
||||||
|
game.processAction();
|
||||||
|
new ClueArtifactToken().putOntoBattlefield(1, game, source);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,22 +1,11 @@
|
||||||
package mage.cards.r;
|
package mage.cards.r;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.effects.common.search.SearchLibraryForFourDifferentCardsEffect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.cards.Cards;
|
|
||||||
import mage.cards.CardsImpl;
|
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.PutCards;
|
||||||
import mage.constants.Zone;
|
import mage.filter.StaticFilters;
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.filter.common.FilterLandCard;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.TargetCard;
|
|
||||||
import mage.target.common.TargetCardInLibrary;
|
|
||||||
import mage.target.common.TargetCardWithDifferentNameInLibrary;
|
|
||||||
import mage.target.common.TargetOpponent;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
@ -29,7 +18,9 @@ public final class RealmsUncharted extends CardImpl {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}");
|
||||||
|
|
||||||
// Search your library for four land cards with different names and reveal them. An opponent chooses two of those cards. Put the chosen cards into your graveyard and the rest into your hand. Then shuffle your library.
|
// Search your library for four land cards with different names and reveal them. An opponent chooses two of those cards. Put the chosen cards into your graveyard and the rest into your hand. Then shuffle your library.
|
||||||
this.getSpellAbility().addEffect(new RealmsUnchartedEffect());
|
this.getSpellAbility().addEffect(new SearchLibraryForFourDifferentCardsEffect(
|
||||||
|
StaticFilters.FILTER_CARD_LANDS, PutCards.HAND, false
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private RealmsUncharted(final RealmsUncharted card) {
|
private RealmsUncharted(final RealmsUncharted card) {
|
||||||
|
|
@ -41,61 +32,3 @@ public final class RealmsUncharted extends CardImpl {
|
||||||
return new RealmsUncharted(this);
|
return new RealmsUncharted(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class RealmsUnchartedEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
private static final FilterCard filter = new FilterLandCard("land cards with different names");
|
|
||||||
private static final FilterCard filter2 = new FilterCard("cards to put in graveyard");
|
|
||||||
|
|
||||||
public RealmsUnchartedEffect() {
|
|
||||||
super(Outcome.DrawCard);
|
|
||||||
this.staticText = "Search your library for up to four land cards with different names and reveal them. " +
|
|
||||||
"An opponent chooses two of those cards. Put the chosen cards into your graveyard " +
|
|
||||||
"and the rest into your hand. Then shuffle";
|
|
||||||
}
|
|
||||||
|
|
||||||
private RealmsUnchartedEffect(final RealmsUnchartedEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public RealmsUnchartedEffect copy() {
|
|
||||||
return new RealmsUnchartedEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Player player = game.getPlayer(source.getControllerId());
|
|
||||||
if (player == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
TargetCardInLibrary targetCards = new TargetCardWithDifferentNameInLibrary(0, 4, filter);
|
|
||||||
player.searchLibrary(targetCards, source, game);
|
|
||||||
Cards cards = new CardsImpl(targetCards.getTargets());
|
|
||||||
cards.retainZone(Zone.LIBRARY, game);
|
|
||||||
if (cards.isEmpty()) {
|
|
||||||
player.shuffleLibrary(source, game);
|
|
||||||
}
|
|
||||||
player.revealCards(source, cards, game);
|
|
||||||
|
|
||||||
if (cards.size() > 2) {
|
|
||||||
TargetOpponent targetOpponent = new TargetOpponent();
|
|
||||||
targetOpponent.withNotTarget(true);
|
|
||||||
player.choose(outcome, targetOpponent, source, game);
|
|
||||||
Player opponent = game.getPlayer(targetOpponent.getFirstTarget());
|
|
||||||
if (opponent != null) {
|
|
||||||
Cards cardsToKeep = new CardsImpl(cards);
|
|
||||||
TargetCard targetDiscard = new TargetCard(2, Zone.LIBRARY, filter2);
|
|
||||||
if (opponent.choose(Outcome.Discard, cards, targetDiscard, source, game)) {
|
|
||||||
cardsToKeep.removeIf(targetDiscard.getTargets()::contains);
|
|
||||||
cards.removeAll(cardsToKeep);
|
|
||||||
}
|
|
||||||
player.moveCards(cardsToKeep, Zone.HAND, source, game);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
player.moveCards(cards, Zone.GRAVEYARD, source, game);
|
|
||||||
player.shuffleLibrary(source, game);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ public final class SlimefootAndSquee extends CardImpl {
|
||||||
ability.addCost(new SacrificeTargetCost(filter));
|
ability.addCost(new SacrificeTargetCost(filter));
|
||||||
ability.addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()
|
ability.addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()
|
||||||
.setText("and up to one other target creature card from your graveyard to the battlefield"));
|
.setText("and up to one other target creature card from your graveyard to the battlefield"));
|
||||||
ability.addTarget(new TargetCardInYourGraveyard(filter2));
|
ability.addTarget(new TargetCardInYourGraveyard(0, 1, filter2));
|
||||||
this.addAbility(ability);
|
this.addAbility(ability);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
92
Mage.Sets/src/mage/cards/s/SparringDummy.java
Normal file
92
Mage.Sets/src/mage/cards/s/SparringDummy.java
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
package mage.cards.s;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.costs.common.TapSourceCost;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.keyword.DefenderAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.cards.Cards;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.filter.FilterCard;
|
||||||
|
import mage.filter.StaticFilters;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.TargetCard;
|
||||||
|
import mage.target.TargetImpl;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class SparringDummy extends CardImpl {
|
||||||
|
|
||||||
|
public SparringDummy(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}{G}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.SCARECROW);
|
||||||
|
this.power = new MageInt(1);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// Defender
|
||||||
|
this.addAbility(DefenderAbility.getInstance());
|
||||||
|
|
||||||
|
// {T}: Mill a card. You may put a land card milled this way into your hand. You gain 2 life if a Lesson card is milled this way.
|
||||||
|
this.addAbility(new SimpleActivatedAbility(new SparringDummyEffect(), new TapSourceCost()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private SparringDummy(final SparringDummy card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SparringDummy copy() {
|
||||||
|
return new SparringDummy(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SparringDummyEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
private static final FilterCard filter = new FilterCard(SubType.LESSON);
|
||||||
|
|
||||||
|
SparringDummyEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "mill a card. You may put a land card milled this way into your hand. " +
|
||||||
|
"You gain 2 life if a Lesson card is milled this way";
|
||||||
|
}
|
||||||
|
|
||||||
|
private SparringDummyEffect(final SparringDummyEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SparringDummyEffect copy() {
|
||||||
|
return new SparringDummyEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player player = game.getPlayer(source.getControllerId());
|
||||||
|
if (player == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Cards cards = player.millCards(1, source, game);
|
||||||
|
TargetCard target = new TargetCard(0, 1, Zone.ALL, StaticFilters.FILTER_CARD_LAND);
|
||||||
|
player.choose(Outcome.DrawCard, cards, target, source, game);
|
||||||
|
Optional.ofNullable(target)
|
||||||
|
.map(TargetImpl::getFirstTarget)
|
||||||
|
.map(game::getCard)
|
||||||
|
.ifPresent(card -> player.moveCards(card, Zone.HAND, source, game));
|
||||||
|
if (cards.count(filter, game) > 0) {
|
||||||
|
player.gainLife(2, game, source);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
63
Mage.Sets/src/mage/cards/s/SukiKyoshiCaptain.java
Normal file
63
Mage.Sets/src/mage/cards/s/SukiKyoshiCaptain.java
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
package mage.cards.s;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.common.SimpleActivatedAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||||
|
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
import mage.abilities.keyword.DoubleStrikeAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
|
import mage.filter.predicate.permanent.AttackingPredicate;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class SukiKyoshiCaptain extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.WARRIOR, "Warriors");
|
||||||
|
private static final FilterPermanent filter2 = new FilterPermanent(SubType.WARRIOR, "attacking Warriors");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(AttackingPredicate.instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SukiKyoshiCaptain(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.WARRIOR);
|
||||||
|
this.subtype.add(SubType.ALLY);
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// Other Warriors you control get +1/+1.
|
||||||
|
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(
|
||||||
|
1, 1, Duration.WhileOnBattlefield, filter, true
|
||||||
|
)));
|
||||||
|
|
||||||
|
// {3}{W}: Attacking Warriors you control gain double strike until end of turn.
|
||||||
|
this.addAbility(new SimpleActivatedAbility(new GainAbilityControlledEffect(
|
||||||
|
DoubleStrikeAbility.getInstance(), Duration.EndOfTurn, filter2
|
||||||
|
), new ManaCostsImpl<>("{3}{W}")));
|
||||||
|
}
|
||||||
|
|
||||||
|
private SukiKyoshiCaptain(final SukiKyoshiCaptain card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SukiKyoshiCaptain copy() {
|
||||||
|
return new SukiKyoshiCaptain(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,15 +1,10 @@
|
||||||
package mage.cards.t;
|
package mage.cards.t;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.effects.common.PutOnTopOrBottomLibraryTargetEffect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
|
||||||
import mage.abilities.keyword.ConvokeAbility;
|
import mage.abilities.keyword.ConvokeAbility;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
|
||||||
import mage.game.Game;
|
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.players.Player;
|
|
||||||
import mage.target.common.TargetNonlandPermanent;
|
import mage.target.common.TargetNonlandPermanent;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
@ -26,7 +21,7 @@ public final class TemporalCleansing extends CardImpl {
|
||||||
this.addAbility(new ConvokeAbility());
|
this.addAbility(new ConvokeAbility());
|
||||||
|
|
||||||
// The owner of target nonland permanent puts it into their library second from the top or on the bottom.
|
// The owner of target nonland permanent puts it into their library second from the top or on the bottom.
|
||||||
this.getSpellAbility().addEffect(new TemporalCleansingEffect());
|
this.getSpellAbility().addEffect(new PutOnTopOrBottomLibraryTargetEffect(2, true));
|
||||||
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
|
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -39,39 +34,3 @@ public final class TemporalCleansing extends CardImpl {
|
||||||
return new TemporalCleansing(this);
|
return new TemporalCleansing(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TemporalCleansingEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
TemporalCleansingEffect() {
|
|
||||||
super(Outcome.Benefit);
|
|
||||||
staticText = "the owner of target nonland permanent puts it into their library second from the top or on the bottom";
|
|
||||||
}
|
|
||||||
|
|
||||||
private TemporalCleansingEffect(final TemporalCleansingEffect effect) {
|
|
||||||
super(effect);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TemporalCleansingEffect copy() {
|
|
||||||
return new TemporalCleansingEffect(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean apply(Game game, Ability source) {
|
|
||||||
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
|
|
||||||
if (permanent == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Player player = game.getPlayer(permanent.getOwnerId());
|
|
||||||
if (player == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (player.chooseUse(
|
|
||||||
outcome, "Put " + permanent.getIdName() + " second from the top or on the bottom?",
|
|
||||||
null, "Second from top", "Bottom", source, game
|
|
||||||
)) {
|
|
||||||
return player.putCardOnTopXOfLibrary(permanent, game, source, 2, true);
|
|
||||||
}
|
|
||||||
return player.putCardsOnBottomOfLibrary(permanent, game, source);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
54
Mage.Sets/src/mage/cards/t/TheLegendOfKuruk.java
Normal file
54
Mage.Sets/src/mage/cards/t/TheLegendOfKuruk.java
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
package mage.cards.t;
|
||||||
|
|
||||||
|
import mage.abilities.common.SagaAbility;
|
||||||
|
import mage.abilities.effects.Effects;
|
||||||
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
|
||||||
|
import mage.abilities.effects.keyword.ScryEffect;
|
||||||
|
import mage.abilities.keyword.TransformAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SagaChapter;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class TheLegendOfKuruk extends CardImpl {
|
||||||
|
|
||||||
|
public TheLegendOfKuruk(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.SAGA);
|
||||||
|
this.secondSideCardClazz = mage.cards.a.AvatarKuruk.class;
|
||||||
|
|
||||||
|
// (As this Saga enters and after your draw step, add a lore counter.)
|
||||||
|
SagaAbility sagaAbility = new SagaAbility(this);
|
||||||
|
|
||||||
|
// I, II -- Scry 2, then draw a card.
|
||||||
|
sagaAbility.addChapterEffect(
|
||||||
|
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
|
||||||
|
new Effects(
|
||||||
|
new ScryEffect(2, false),
|
||||||
|
new DrawCardSourceControllerEffect(1).concatBy(", then")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// III -- Exile this Saga, then return it to the battlefield transformed under your control.
|
||||||
|
this.addAbility(new TransformAbility());
|
||||||
|
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
|
||||||
|
this.addAbility(sagaAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TheLegendOfKuruk(final TheLegendOfKuruk card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TheLegendOfKuruk copy() {
|
||||||
|
return new TheLegendOfKuruk(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
66
Mage.Sets/src/mage/cards/t/TheLegendOfKyoshi.java
Normal file
66
Mage.Sets/src/mage/cards/t/TheLegendOfKyoshi.java
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
package mage.cards.t;
|
||||||
|
|
||||||
|
import mage.abilities.common.SagaAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.CardsInControllerHandCount;
|
||||||
|
import mage.abilities.dynamicvalue.common.GreatestAmongPermanentsValue;
|
||||||
|
import mage.abilities.effects.Effects;
|
||||||
|
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||||
|
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect;
|
||||||
|
import mage.abilities.effects.keyword.EarthbendTargetEffect;
|
||||||
|
import mage.abilities.keyword.TransformAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SagaChapter;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.target.common.TargetControlledLandPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class TheLegendOfKyoshi extends CardImpl {
|
||||||
|
|
||||||
|
public TheLegendOfKyoshi(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}{G}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.SAGA);
|
||||||
|
this.secondSideCardClazz = mage.cards.a.AvatarKyoshi.class;
|
||||||
|
|
||||||
|
// (As this Saga enters and after your draw step, add a lore counter.)
|
||||||
|
SagaAbility sagaAbility = new SagaAbility(this);
|
||||||
|
|
||||||
|
// I -- Draw cards equal to the greatest power among creatures you control.
|
||||||
|
sagaAbility.addChapterEffect(
|
||||||
|
this, SagaChapter.CHAPTER_I,
|
||||||
|
new DrawCardSourceControllerEffect(GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES)
|
||||||
|
);
|
||||||
|
|
||||||
|
// II -- Earthbend X, where X is the number of cards in your hand. That land becomes an Island in addition to its other types.
|
||||||
|
sagaAbility.addChapterEffect(
|
||||||
|
this, SagaChapter.CHAPTER_II,
|
||||||
|
new Effects(
|
||||||
|
new EarthbendTargetEffect(CardsInControllerHandCount.ANY),
|
||||||
|
new AddCardSubTypeTargetEffect(SubType.ISLAND, Duration.Custom)
|
||||||
|
.setText("That land becomes an Island in addition to its other types")
|
||||||
|
), new TargetControlledLandPermanent()
|
||||||
|
);
|
||||||
|
|
||||||
|
// III -- Exile this Saga, then return it to the battlefield transformed under your control.
|
||||||
|
this.addAbility(new TransformAbility());
|
||||||
|
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
|
||||||
|
this.addAbility(sagaAbility.addHint(GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES.getHint()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private TheLegendOfKyoshi(final TheLegendOfKyoshi card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TheLegendOfKyoshi copy() {
|
||||||
|
return new TheLegendOfKyoshi(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
55
Mage.Sets/src/mage/cards/t/TheLegendOfRoku.java
Normal file
55
Mage.Sets/src/mage/cards/t/TheLegendOfRoku.java
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
package mage.cards.t;
|
||||||
|
|
||||||
|
import mage.Mana;
|
||||||
|
import mage.abilities.common.SagaAbility;
|
||||||
|
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
|
||||||
|
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
|
||||||
|
import mage.abilities.effects.mana.BasicManaEffect;
|
||||||
|
import mage.abilities.keyword.TransformAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SagaChapter;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class TheLegendOfRoku extends CardImpl {
|
||||||
|
|
||||||
|
public TheLegendOfRoku(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}");
|
||||||
|
|
||||||
|
this.subtype.add(SubType.SAGA);
|
||||||
|
this.secondSideCardClazz = mage.cards.a.AvatarRoku.class;
|
||||||
|
|
||||||
|
// (As this Saga enters and after your draw step, add a lore counter.)
|
||||||
|
SagaAbility sagaAbility = new SagaAbility(this);
|
||||||
|
|
||||||
|
// I -- Exile the top three cards of your library. Until the end of your next turn, you may play those cards.
|
||||||
|
sagaAbility.addChapterEffect(
|
||||||
|
this, SagaChapter.CHAPTER_I,
|
||||||
|
new ExileTopXMayPlayUntilEffect(3, Duration.UntilEndOfYourNextTurn)
|
||||||
|
);
|
||||||
|
|
||||||
|
// II -- Add one mana of any color.
|
||||||
|
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new BasicManaEffect(Mana.AnyMana(1)));
|
||||||
|
|
||||||
|
// III -- Exile this Saga, then return it to the battlefield transformed under your control.
|
||||||
|
this.addAbility(new TransformAbility());
|
||||||
|
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
|
||||||
|
this.addAbility(sagaAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TheLegendOfRoku(final TheLegendOfRoku card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TheLegendOfRoku copy() {
|
||||||
|
return new TheLegendOfRoku(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
63
Mage.Sets/src/mage/cards/t/TophGreatestEarthbender.java
Normal file
63
Mage.Sets/src/mage/cards/t/TophGreatestEarthbender.java
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
package mage.cards.t;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.dynamicvalue.common.ManaSpentToCastCount;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||||
|
import mage.abilities.effects.keyword.EarthbendTargetEffect;
|
||||||
|
import mage.abilities.keyword.DoubleStrikeAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.Duration;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.SuperType;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.target.common.TargetControlledLandPermanent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class TophGreatestEarthbender extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterPermanent("land creatures");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(CardType.LAND.getPredicate());
|
||||||
|
filter.add(CardType.CREATURE.getPredicate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public TophGreatestEarthbender(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{G}");
|
||||||
|
|
||||||
|
this.supertype.add(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.WARRIOR);
|
||||||
|
this.subtype.add(SubType.ALLY);
|
||||||
|
this.power = new MageInt(3);
|
||||||
|
this.toughness = new MageInt(3);
|
||||||
|
|
||||||
|
// When Toph enters, earthbend X, where X is the amount of mana spent to cast her.
|
||||||
|
Ability ability = new EntersBattlefieldTriggeredAbility(new EarthbendTargetEffect(ManaSpentToCastCount.instance));
|
||||||
|
ability.addTarget(new TargetControlledLandPermanent());
|
||||||
|
this.addAbility(ability);
|
||||||
|
|
||||||
|
// Land creatures you control have double strike.
|
||||||
|
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||||
|
DoubleStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private TophGreatestEarthbender(final TophGreatestEarthbender card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TophGreatestEarthbender copy() {
|
||||||
|
return new TophGreatestEarthbender(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -66,6 +66,12 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Avatar Aang", 308, Rarity.MYTHIC, mage.cards.a.AvatarAang.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Avatar Aang", 308, Rarity.MYTHIC, mage.cards.a.AvatarAang.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Avatar Aang", 363, Rarity.MYTHIC, mage.cards.a.AvatarAang.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Avatar Aang", 363, Rarity.MYTHIC, mage.cards.a.AvatarAang.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Avatar Enthusiasts", 11, Rarity.COMMON, mage.cards.a.AvatarEnthusiasts.class));
|
cards.add(new SetCardInfo("Avatar Enthusiasts", 11, Rarity.COMMON, mage.cards.a.AvatarEnthusiasts.class));
|
||||||
|
cards.add(new SetCardInfo("Avatar Kuruk", 355, Rarity.MYTHIC, mage.cards.a.AvatarKuruk.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Avatar Kuruk", 61, Rarity.MYTHIC, mage.cards.a.AvatarKuruk.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Avatar Kyoshi", 186, Rarity.MYTHIC, mage.cards.a.AvatarKyoshi.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Avatar Kyoshi", 358, Rarity.MYTHIC, mage.cards.a.AvatarKyoshi.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Avatar Roku", 145, Rarity.MYTHIC, mage.cards.a.AvatarRoku.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Avatar Roku", 357, Rarity.MYTHIC, mage.cards.a.AvatarRoku.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Avatar's Wrath", 12, Rarity.RARE, mage.cards.a.AvatarsWrath.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Avatar's Wrath", 12, Rarity.RARE, mage.cards.a.AvatarsWrath.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Avatar's Wrath", 365, Rarity.RARE, mage.cards.a.AvatarsWrath.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Avatar's Wrath", 365, Rarity.RARE, mage.cards.a.AvatarsWrath.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Azula Always Lies", 84, Rarity.COMMON, mage.cards.a.AzulaAlwaysLies.class));
|
cards.add(new SetCardInfo("Azula Always Lies", 84, Rarity.COMMON, mage.cards.a.AzulaAlwaysLies.class));
|
||||||
|
|
@ -88,6 +94,7 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Boiling Rock Rioter", 87, Rarity.RARE, mage.cards.b.BoilingRockRioter.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Boiling Rock Rioter", 87, Rarity.RARE, mage.cards.b.BoilingRockRioter.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Boomerang Basics", 46, Rarity.UNCOMMON, mage.cards.b.BoomerangBasics.class));
|
cards.add(new SetCardInfo("Boomerang Basics", 46, Rarity.UNCOMMON, mage.cards.b.BoomerangBasics.class));
|
||||||
cards.add(new SetCardInfo("Bumi Bash", 125, Rarity.COMMON, mage.cards.b.BumiBash.class));
|
cards.add(new SetCardInfo("Bumi Bash", 125, Rarity.COMMON, mage.cards.b.BumiBash.class));
|
||||||
|
cards.add(new SetCardInfo("Bumi, King of Three Trials", 169, Rarity.UNCOMMON, mage.cards.b.BumiKingOfThreeTrials.class));
|
||||||
cards.add(new SetCardInfo("Bumi, Unleashed", 211, Rarity.MYTHIC, mage.cards.b.BumiUnleashed.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Bumi, Unleashed", 211, Rarity.MYTHIC, mage.cards.b.BumiUnleashed.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Bumi, Unleashed", 348, Rarity.MYTHIC, mage.cards.b.BumiUnleashed.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Bumi, Unleashed", 348, Rarity.MYTHIC, mage.cards.b.BumiUnleashed.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Buzzard-Wasp Colony", 88, Rarity.UNCOMMON, mage.cards.b.BuzzardWaspColony.class));
|
cards.add(new SetCardInfo("Buzzard-Wasp Colony", 88, Rarity.UNCOMMON, mage.cards.b.BuzzardWaspColony.class));
|
||||||
|
|
@ -95,6 +102,7 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Canyon Crawler", 90, Rarity.COMMON, mage.cards.c.CanyonCrawler.class));
|
cards.add(new SetCardInfo("Canyon Crawler", 90, Rarity.COMMON, mage.cards.c.CanyonCrawler.class));
|
||||||
cards.add(new SetCardInfo("Cat-Gator", 91, Rarity.UNCOMMON, mage.cards.c.CatGator.class));
|
cards.add(new SetCardInfo("Cat-Gator", 91, Rarity.UNCOMMON, mage.cards.c.CatGator.class));
|
||||||
cards.add(new SetCardInfo("Cat-Owl", 212, Rarity.COMMON, mage.cards.c.CatOwl.class));
|
cards.add(new SetCardInfo("Cat-Owl", 212, Rarity.COMMON, mage.cards.c.CatOwl.class));
|
||||||
|
cards.add(new SetCardInfo("Combustion Man", 127, Rarity.UNCOMMON, mage.cards.c.CombustionMan.class));
|
||||||
cards.add(new SetCardInfo("Combustion Technique", 128, Rarity.UNCOMMON, mage.cards.c.CombustionTechnique.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Combustion Technique", 128, Rarity.UNCOMMON, mage.cards.c.CombustionTechnique.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Combustion Technique", 301, Rarity.UNCOMMON, mage.cards.c.CombustionTechnique.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Combustion Technique", 301, Rarity.UNCOMMON, mage.cards.c.CombustionTechnique.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Compassionate Healer", 13, Rarity.COMMON, mage.cards.c.CompassionateHealer.class));
|
cards.add(new SetCardInfo("Compassionate Healer", 13, Rarity.COMMON, mage.cards.c.CompassionateHealer.class));
|
||||||
|
|
@ -111,6 +119,7 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Day of Black Sun", 94, Rarity.RARE, mage.cards.d.DayOfBlackSun.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Day of Black Sun", 94, Rarity.RARE, mage.cards.d.DayOfBlackSun.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Deadly Precision", 95, Rarity.COMMON, mage.cards.d.DeadlyPrecision.class));
|
cards.add(new SetCardInfo("Deadly Precision", 95, Rarity.COMMON, mage.cards.d.DeadlyPrecision.class));
|
||||||
cards.add(new SetCardInfo("Deserter's Disciple", 131, Rarity.COMMON, mage.cards.d.DesertersDisciple.class));
|
cards.add(new SetCardInfo("Deserter's Disciple", 131, Rarity.COMMON, mage.cards.d.DesertersDisciple.class));
|
||||||
|
cards.add(new SetCardInfo("Destined Confrontation", 15, Rarity.UNCOMMON, mage.cards.d.DestinedConfrontation.class));
|
||||||
cards.add(new SetCardInfo("Diligent Zookeeper", 171, Rarity.RARE, mage.cards.d.DiligentZookeeper.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Diligent Zookeeper", 171, Rarity.RARE, mage.cards.d.DiligentZookeeper.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Diligent Zookeeper", 327, Rarity.RARE, mage.cards.d.DiligentZookeeper.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Diligent Zookeeper", 327, Rarity.RARE, mage.cards.d.DiligentZookeeper.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Dragonfly Swarm", 215, Rarity.UNCOMMON, mage.cards.d.DragonflySwarm.class));
|
cards.add(new SetCardInfo("Dragonfly Swarm", 215, Rarity.UNCOMMON, mage.cards.d.DragonflySwarm.class));
|
||||||
|
|
@ -128,6 +137,8 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Earthbending Lesson", 176, Rarity.COMMON, mage.cards.e.EarthbendingLesson.class));
|
cards.add(new SetCardInfo("Earthbending Lesson", 176, Rarity.COMMON, mage.cards.e.EarthbendingLesson.class));
|
||||||
cards.add(new SetCardInfo("Earthen Ally", 177, Rarity.RARE, mage.cards.e.EarthenAlly.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Earthen Ally", 177, Rarity.RARE, mage.cards.e.EarthenAlly.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Earthen Ally", 377, Rarity.RARE, mage.cards.e.EarthenAlly.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Earthen Ally", 377, Rarity.RARE, mage.cards.e.EarthenAlly.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Elemental Teachings", 178, Rarity.RARE, mage.cards.e.ElementalTeachings.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Elemental Teachings", 378, Rarity.RARE, mage.cards.e.ElementalTeachings.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Ember Island Production", 48, Rarity.UNCOMMON, mage.cards.e.EmberIslandProduction.class));
|
cards.add(new SetCardInfo("Ember Island Production", 48, Rarity.UNCOMMON, mage.cards.e.EmberIslandProduction.class));
|
||||||
cards.add(new SetCardInfo("Energybending", 2, Rarity.UNCOMMON, mage.cards.e.Energybending.class));
|
cards.add(new SetCardInfo("Energybending", 2, Rarity.UNCOMMON, mage.cards.e.Energybending.class));
|
||||||
cards.add(new SetCardInfo("Enter the Avatar State", 18, Rarity.UNCOMMON, mage.cards.e.EnterTheAvatarState.class));
|
cards.add(new SetCardInfo("Enter the Avatar State", 18, Rarity.UNCOMMON, mage.cards.e.EnterTheAvatarState.class));
|
||||||
|
|
@ -221,6 +232,7 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Lightning Strike", 146, Rarity.COMMON, mage.cards.l.LightningStrike.class));
|
cards.add(new SetCardInfo("Lightning Strike", 146, Rarity.COMMON, mage.cards.l.LightningStrike.class));
|
||||||
cards.add(new SetCardInfo("Lo and Li, Twin Tutors", 108, Rarity.UNCOMMON, mage.cards.l.LoAndLiTwinTutors.class));
|
cards.add(new SetCardInfo("Lo and Li, Twin Tutors", 108, Rarity.UNCOMMON, mage.cards.l.LoAndLiTwinTutors.class));
|
||||||
cards.add(new SetCardInfo("Long Feng, Grand Secretariat", 233, Rarity.UNCOMMON, mage.cards.l.LongFengGrandSecretariat.class));
|
cards.add(new SetCardInfo("Long Feng, Grand Secretariat", 233, Rarity.UNCOMMON, mage.cards.l.LongFengGrandSecretariat.class));
|
||||||
|
cards.add(new SetCardInfo("Lost Days", 62, Rarity.COMMON, mage.cards.l.LostDays.class));
|
||||||
cards.add(new SetCardInfo("Mai, Jaded Edge", 147, Rarity.UNCOMMON, mage.cards.m.MaiJadedEdge.class));
|
cards.add(new SetCardInfo("Mai, Jaded Edge", 147, Rarity.UNCOMMON, mage.cards.m.MaiJadedEdge.class));
|
||||||
cards.add(new SetCardInfo("Mai, Scornful Striker", 109, Rarity.RARE, mage.cards.m.MaiScornfulStriker.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Mai, Scornful Striker", 109, Rarity.RARE, mage.cards.m.MaiScornfulStriker.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Mai, Scornful Striker", 374, Rarity.RARE, mage.cards.m.MaiScornfulStriker.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Mai, Scornful Striker", 374, Rarity.RARE, mage.cards.m.MaiScornfulStriker.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -252,6 +264,8 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Ozai, the Phoenix King", 311, Rarity.MYTHIC, mage.cards.o.OzaiThePhoenixKing.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Ozai, the Phoenix King", 311, Rarity.MYTHIC, mage.cards.o.OzaiThePhoenixKing.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Ozai, the Phoenix King", 335, Rarity.MYTHIC, mage.cards.o.OzaiThePhoenixKing.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Ozai, the Phoenix King", 335, Rarity.MYTHIC, mage.cards.o.OzaiThePhoenixKing.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Path to Redemption", 31, Rarity.COMMON, mage.cards.p.PathToRedemption.class));
|
cards.add(new SetCardInfo("Path to Redemption", 31, Rarity.COMMON, mage.cards.p.PathToRedemption.class));
|
||||||
|
cards.add(new SetCardInfo("Phoenix Fleet Airship", 114, Rarity.MYTHIC, mage.cards.p.PhoenixFleetAirship.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Phoenix Fleet Airship", 323, Rarity.MYTHIC, mage.cards.p.PhoenixFleetAirship.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Pillar Launch", 189, Rarity.COMMON, mage.cards.p.PillarLaunch.class));
|
cards.add(new SetCardInfo("Pillar Launch", 189, Rarity.COMMON, mage.cards.p.PillarLaunch.class));
|
||||||
cards.add(new SetCardInfo("Pirate Peddlers", 115, Rarity.COMMON, mage.cards.p.PiratePeddlers.class));
|
cards.add(new SetCardInfo("Pirate Peddlers", 115, Rarity.COMMON, mage.cards.p.PiratePeddlers.class));
|
||||||
cards.add(new SetCardInfo("Plains", 282, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Plains", 282, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -261,11 +275,14 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Planetarium of Wan Shi Tong", 385, Rarity.MYTHIC, mage.cards.p.PlanetariumOfWanShiTong.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Planetarium of Wan Shi Tong", 385, Rarity.MYTHIC, mage.cards.p.PlanetariumOfWanShiTong.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Platypus-Bear", 236, Rarity.COMMON, mage.cards.p.PlatypusBear.class));
|
cards.add(new SetCardInfo("Platypus-Bear", 236, Rarity.COMMON, mage.cards.p.PlatypusBear.class));
|
||||||
cards.add(new SetCardInfo("Pretending Poxbearers", 237, Rarity.COMMON, mage.cards.p.PretendingPoxbearers.class));
|
cards.add(new SetCardInfo("Pretending Poxbearers", 237, Rarity.COMMON, mage.cards.p.PretendingPoxbearers.class));
|
||||||
|
cards.add(new SetCardInfo("Price of Freedom", 149, Rarity.UNCOMMON, mage.cards.p.PriceOfFreedom.class));
|
||||||
cards.add(new SetCardInfo("Professor Zei, Anthropologist", 238, Rarity.UNCOMMON, mage.cards.p.ProfessorZeiAnthropologist.class));
|
cards.add(new SetCardInfo("Professor Zei, Anthropologist", 238, Rarity.UNCOMMON, mage.cards.p.ProfessorZeiAnthropologist.class));
|
||||||
cards.add(new SetCardInfo("Rabaroo Troop", 32, Rarity.COMMON, mage.cards.r.RabarooTroop.class));
|
cards.add(new SetCardInfo("Rabaroo Troop", 32, Rarity.COMMON, mage.cards.r.RabarooTroop.class));
|
||||||
cards.add(new SetCardInfo("Ran and Shaw", 150, Rarity.RARE, mage.cards.r.RanAndShaw.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Ran and Shaw", 150, Rarity.RARE, mage.cards.r.RanAndShaw.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Ran and Shaw", 325, Rarity.RARE, mage.cards.r.RanAndShaw.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Ran and Shaw", 325, Rarity.RARE, mage.cards.r.RanAndShaw.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Raucous Audience", 190, Rarity.COMMON, mage.cards.r.RaucousAudience.class));
|
cards.add(new SetCardInfo("Raucous Audience", 190, Rarity.COMMON, mage.cards.r.RaucousAudience.class));
|
||||||
|
cards.add(new SetCardInfo("Raven Eagle", 116, Rarity.RARE, mage.cards.r.RavenEagle.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Raven Eagle", 324, Rarity.RARE, mage.cards.r.RavenEagle.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Razor Rings", 33, Rarity.COMMON, mage.cards.r.RazorRings.class));
|
cards.add(new SetCardInfo("Razor Rings", 33, Rarity.COMMON, mage.cards.r.RazorRings.class));
|
||||||
cards.add(new SetCardInfo("Realm of Koh", 276, Rarity.RARE, mage.cards.r.RealmOfKoh.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Realm of Koh", 276, Rarity.RARE, mage.cards.r.RealmOfKoh.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Realm of Koh", 391, Rarity.RARE, mage.cards.r.RealmOfKoh.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Realm of Koh", 391, Rarity.RARE, mage.cards.r.RealmOfKoh.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -299,6 +316,7 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Sozin's Comet", 154, Rarity.MYTHIC, mage.cards.s.SozinsComet.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Sozin's Comet", 154, Rarity.MYTHIC, mage.cards.s.SozinsComet.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Sozin's Comet", 309, Rarity.MYTHIC, mage.cards.s.SozinsComet.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Sozin's Comet", 309, Rarity.MYTHIC, mage.cards.s.SozinsComet.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Sozin's Comet", 332, Rarity.MYTHIC, mage.cards.s.SozinsComet.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Sozin's Comet", 332, Rarity.MYTHIC, mage.cards.s.SozinsComet.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Sparring Dummy", 197, Rarity.UNCOMMON, mage.cards.s.SparringDummy.class));
|
||||||
cards.add(new SetCardInfo("Suki, Courageous Rescuer", 368, Rarity.RARE, mage.cards.s.SukiCourageousRescuer.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Suki, Courageous Rescuer", 368, Rarity.RARE, mage.cards.s.SukiCourageousRescuer.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Suki, Courageous Rescuer", 37, Rarity.RARE, mage.cards.s.SukiCourageousRescuer.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Suki, Courageous Rescuer", 37, Rarity.RARE, mage.cards.s.SukiCourageousRescuer.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Suki, Kyoshi Warrior", 243, Rarity.UNCOMMON, mage.cards.s.SukiKyoshiWarrior.class));
|
cards.add(new SetCardInfo("Suki, Kyoshi Warrior", 243, Rarity.UNCOMMON, mage.cards.s.SukiKyoshiWarrior.class));
|
||||||
|
|
@ -311,6 +329,12 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Teo, Spirited Glider", 74, Rarity.UNCOMMON, mage.cards.t.TeoSpiritedGlider.class));
|
cards.add(new SetCardInfo("Teo, Spirited Glider", 74, Rarity.UNCOMMON, mage.cards.t.TeoSpiritedGlider.class));
|
||||||
cards.add(new SetCardInfo("The Boulder, Ready to Rumble", 168, Rarity.UNCOMMON, mage.cards.t.TheBoulderReadyToRumble.class));
|
cards.add(new SetCardInfo("The Boulder, Ready to Rumble", 168, Rarity.UNCOMMON, mage.cards.t.TheBoulderReadyToRumble.class));
|
||||||
cards.add(new SetCardInfo("The Cave of Two Lovers", 126, Rarity.UNCOMMON, mage.cards.t.TheCaveOfTwoLovers.class));
|
cards.add(new SetCardInfo("The Cave of Two Lovers", 126, Rarity.UNCOMMON, mage.cards.t.TheCaveOfTwoLovers.class));
|
||||||
|
cards.add(new SetCardInfo("The Legend of Kuruk", 355, Rarity.MYTHIC, mage.cards.t.TheLegendOfKuruk.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("The Legend of Kuruk", 61, Rarity.MYTHIC, mage.cards.t.TheLegendOfKuruk.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("The Legend of Kyoshi", 186, Rarity.MYTHIC, mage.cards.t.TheLegendOfKyoshi.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("The Legend of Kyoshi", 358, Rarity.MYTHIC, mage.cards.t.TheLegendOfKyoshi.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("The Legend of Roku", 145, Rarity.MYTHIC, mage.cards.t.TheLegendOfRoku.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("The Legend of Roku", 357, Rarity.MYTHIC, mage.cards.t.TheLegendOfRoku.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("The Lion-Turtle", 232, Rarity.RARE, mage.cards.t.TheLionTurtle.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("The Lion-Turtle", 232, Rarity.RARE, mage.cards.t.TheLionTurtle.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("The Lion-Turtle", 328, Rarity.RARE, mage.cards.t.TheLionTurtle.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("The Lion-Turtle", 328, Rarity.RARE, mage.cards.t.TheLionTurtle.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("The Mechanist, Aerial Artisan", 369, Rarity.RARE, mage.cards.t.TheMechanistAerialArtisan.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("The Mechanist, Aerial Artisan", 369, Rarity.RARE, mage.cards.t.TheMechanistAerialArtisan.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
this.rotationSet = true;
|
this.rotationSet = true;
|
||||||
this.hasBasicLands = true;
|
this.hasBasicLands = true;
|
||||||
|
|
||||||
|
cards.add(new SetCardInfo("Aang and Katara", 69, Rarity.RARE, mage.cards.a.AangAndKatara.class));
|
||||||
cards.add(new SetCardInfo("Aang's Defense", 211, Rarity.COMMON, mage.cards.a.AangsDefense.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Aang's Defense", 211, Rarity.COMMON, mage.cards.a.AangsDefense.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Aang's Defense", 266, Rarity.COMMON, mage.cards.a.AangsDefense.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Aang's Defense", 266, Rarity.COMMON, mage.cards.a.AangsDefense.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Aang, A Lot to Learn", 146, Rarity.UNCOMMON, mage.cards.a.AangALotToLearn.class));
|
cards.add(new SetCardInfo("Aang, A Lot to Learn", 146, Rarity.UNCOMMON, mage.cards.a.AangALotToLearn.class));
|
||||||
|
|
@ -41,6 +42,7 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Allied Teamwork", 213, Rarity.RARE, mage.cards.a.AlliedTeamwork.class));
|
cards.add(new SetCardInfo("Allied Teamwork", 213, Rarity.RARE, mage.cards.a.AlliedTeamwork.class));
|
||||||
cards.add(new SetCardInfo("Appa, Aang's Companion", 214, Rarity.UNCOMMON, mage.cards.a.AppaAangsCompanion.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Appa, Aang's Companion", 214, Rarity.UNCOMMON, mage.cards.a.AppaAangsCompanion.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Appa, Aang's Companion", 268, Rarity.UNCOMMON, mage.cards.a.AppaAangsCompanion.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Appa, Aang's Companion", 268, Rarity.UNCOMMON, mage.cards.a.AppaAangsCompanion.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Appa, the Vigilant", 62, Rarity.RARE, mage.cards.a.AppaTheVigilant.class));
|
||||||
cards.add(new SetCardInfo("Arcane Signet", 315, Rarity.RARE, mage.cards.a.ArcaneSignet.class));
|
cards.add(new SetCardInfo("Arcane Signet", 315, Rarity.RARE, mage.cards.a.ArcaneSignet.class));
|
||||||
cards.add(new SetCardInfo("Avatar Kyoshi, Earthbender", 130, Rarity.MYTHIC, mage.cards.a.AvatarKyoshiEarthbender.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Avatar Kyoshi, Earthbender", 130, Rarity.MYTHIC, mage.cards.a.AvatarKyoshiEarthbender.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Avatar Kyoshi, Earthbender", 201, Rarity.MYTHIC, mage.cards.a.AvatarKyoshiEarthbender.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Avatar Kyoshi, Earthbender", 201, Rarity.MYTHIC, mage.cards.a.AvatarKyoshiEarthbender.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -62,6 +64,7 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Brainstorm", 155, Rarity.COMMON, mage.cards.b.Brainstorm.class));
|
cards.add(new SetCardInfo("Brainstorm", 155, Rarity.COMMON, mage.cards.b.Brainstorm.class));
|
||||||
cards.add(new SetCardInfo("Bribery", 10, Rarity.MYTHIC, mage.cards.b.Bribery.class));
|
cards.add(new SetCardInfo("Bribery", 10, Rarity.MYTHIC, mage.cards.b.Bribery.class));
|
||||||
cards.add(new SetCardInfo("Brought Back", 1, Rarity.MYTHIC, mage.cards.b.BroughtBack.class));
|
cards.add(new SetCardInfo("Brought Back", 1, Rarity.MYTHIC, mage.cards.b.BroughtBack.class));
|
||||||
|
cards.add(new SetCardInfo("Bumi's Feast Lecture", 133, Rarity.UNCOMMON, mage.cards.b.BumisFeastLecture.class));
|
||||||
cards.add(new SetCardInfo("Bumi, Eclectic Earthbender", 248, Rarity.RARE, mage.cards.b.BumiEclecticEarthbender.class));
|
cards.add(new SetCardInfo("Bumi, Eclectic Earthbender", 248, Rarity.RARE, mage.cards.b.BumiEclecticEarthbender.class));
|
||||||
cards.add(new SetCardInfo("Capital Guard", 234, Rarity.COMMON, mage.cards.c.CapitalGuard.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Capital Guard", 234, Rarity.COMMON, mage.cards.c.CapitalGuard.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Capital Guard", 277, Rarity.COMMON, mage.cards.c.CapitalGuard.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Capital Guard", 277, Rarity.COMMON, mage.cards.c.CapitalGuard.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -69,6 +72,8 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Cathartic Reunion", 164, Rarity.COMMON, mage.cards.c.CatharticReunion.class));
|
cards.add(new SetCardInfo("Cathartic Reunion", 164, Rarity.COMMON, mage.cards.c.CatharticReunion.class));
|
||||||
cards.add(new SetCardInfo("Chakra Meditation", 179, Rarity.RARE, mage.cards.c.ChakraMeditation.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Chakra Meditation", 179, Rarity.RARE, mage.cards.c.ChakraMeditation.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Chakra Meditation", 91, Rarity.RARE, mage.cards.c.ChakraMeditation.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Chakra Meditation", 91, Rarity.RARE, mage.cards.c.ChakraMeditation.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Chong and Lily, Nomads", 113, Rarity.RARE, mage.cards.c.ChongAndLilyNomads.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Chong and Lily, Nomads", 192, Rarity.RARE, mage.cards.c.ChongAndLilyNomads.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Cityscape Leveler", 53, Rarity.MYTHIC, mage.cards.c.CityscapeLeveler.class));
|
cards.add(new SetCardInfo("Cityscape Leveler", 53, Rarity.MYTHIC, mage.cards.c.CityscapeLeveler.class));
|
||||||
cards.add(new SetCardInfo("Clone Legion", 12, Rarity.MYTHIC, mage.cards.c.CloneLegion.class));
|
cards.add(new SetCardInfo("Clone Legion", 12, Rarity.MYTHIC, mage.cards.c.CloneLegion.class));
|
||||||
cards.add(new SetCardInfo("Clone", 11, Rarity.MYTHIC, mage.cards.c.Clone.class));
|
cards.add(new SetCardInfo("Clone", 11, Rarity.MYTHIC, mage.cards.c.Clone.class));
|
||||||
|
|
@ -101,6 +106,7 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Eel-Hounds", 250, Rarity.UNCOMMON, mage.cards.e.EelHounds.class));
|
cards.add(new SetCardInfo("Eel-Hounds", 250, Rarity.UNCOMMON, mage.cards.e.EelHounds.class));
|
||||||
cards.add(new SetCardInfo("Eladamri's Call", 48, Rarity.MYTHIC, mage.cards.e.EladamrisCall.class));
|
cards.add(new SetCardInfo("Eladamri's Call", 48, Rarity.MYTHIC, mage.cards.e.EladamrisCall.class));
|
||||||
cards.add(new SetCardInfo("Elemental Bond", 40, Rarity.MYTHIC, mage.cards.e.ElementalBond.class));
|
cards.add(new SetCardInfo("Elemental Bond", 40, Rarity.MYTHIC, mage.cards.e.ElementalBond.class));
|
||||||
|
cards.add(new SetCardInfo("Elephant-Mandrill", 138, Rarity.UNCOMMON, mage.cards.e.ElephantMandrill.class));
|
||||||
cards.add(new SetCardInfo("Elephant-Rat", 228, Rarity.COMMON, mage.cards.e.ElephantRat.class));
|
cards.add(new SetCardInfo("Elephant-Rat", 228, Rarity.COMMON, mage.cards.e.ElephantRat.class));
|
||||||
cards.add(new SetCardInfo("Empty City Ruse", 3, Rarity.MYTHIC, mage.cards.e.EmptyCityRuse.class));
|
cards.add(new SetCardInfo("Empty City Ruse", 3, Rarity.MYTHIC, mage.cards.e.EmptyCityRuse.class));
|
||||||
cards.add(new SetCardInfo("Enlightened Tutor", 305, Rarity.RARE, mage.cards.e.EnlightenedTutor.class));
|
cards.add(new SetCardInfo("Enlightened Tutor", 305, Rarity.RARE, mage.cards.e.EnlightenedTutor.class));
|
||||||
|
|
@ -131,12 +137,15 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Founding of Omashu", 116, Rarity.UNCOMMON, mage.cards.f.FoundingOfOmashu.class));
|
cards.add(new SetCardInfo("Founding of Omashu", 116, Rarity.UNCOMMON, mage.cards.f.FoundingOfOmashu.class));
|
||||||
cards.add(new SetCardInfo("Frantic Confrontation", 117, Rarity.UNCOMMON, mage.cards.f.FranticConfrontation.class));
|
cards.add(new SetCardInfo("Frantic Confrontation", 117, Rarity.UNCOMMON, mage.cards.f.FranticConfrontation.class));
|
||||||
cards.add(new SetCardInfo("Frantic Search", 159, Rarity.COMMON, mage.cards.f.FranticSearch.class));
|
cards.add(new SetCardInfo("Frantic Search", 159, Rarity.COMMON, mage.cards.f.FranticSearch.class));
|
||||||
|
cards.add(new SetCardInfo("Freedom Fighter Recruit", 118, Rarity.COMMON, mage.cards.f.FreedomFighterRecruit.class));
|
||||||
cards.add(new SetCardInfo("Frog-Squirrels", 251, Rarity.COMMON, mage.cards.f.FrogSquirrels.class));
|
cards.add(new SetCardInfo("Frog-Squirrels", 251, Rarity.COMMON, mage.cards.f.FrogSquirrels.class));
|
||||||
cards.add(new SetCardInfo("Gamble", 312, Rarity.RARE, mage.cards.g.Gamble.class));
|
cards.add(new SetCardInfo("Gamble", 312, Rarity.RARE, mage.cards.g.Gamble.class));
|
||||||
|
cards.add(new SetCardInfo("Giant Fly", 107, Rarity.COMMON, mage.cards.g.GiantFly.class));
|
||||||
cards.add(new SetCardInfo("Gilacorn", 231, Rarity.COMMON, mage.cards.g.Gilacorn.class));
|
cards.add(new SetCardInfo("Gilacorn", 231, Rarity.COMMON, mage.cards.g.Gilacorn.class));
|
||||||
cards.add(new SetCardInfo("Heartbeat of Spring", 42, Rarity.MYTHIC, mage.cards.h.HeartbeatOfSpring.class));
|
cards.add(new SetCardInfo("Heartbeat of Spring", 42, Rarity.MYTHIC, mage.cards.h.HeartbeatOfSpring.class));
|
||||||
cards.add(new SetCardInfo("Heroic Intervention", 43, Rarity.MYTHIC, mage.cards.h.HeroicIntervention.class));
|
cards.add(new SetCardInfo("Heroic Intervention", 43, Rarity.MYTHIC, mage.cards.h.HeroicIntervention.class));
|
||||||
cards.add(new SetCardInfo("Hippo-Cows", 252, Rarity.COMMON, mage.cards.h.HippoCows.class));
|
cards.add(new SetCardInfo("Hippo-Cows", 252, Rarity.COMMON, mage.cards.h.HippoCows.class));
|
||||||
|
cards.add(new SetCardInfo("Hook Swords", 147, Rarity.UNCOMMON, mage.cards.h.HookSwords.class));
|
||||||
cards.add(new SetCardInfo("Humble Defector", 30, Rarity.MYTHIC, mage.cards.h.HumbleDefector.class));
|
cards.add(new SetCardInfo("Humble Defector", 30, Rarity.MYTHIC, mage.cards.h.HumbleDefector.class));
|
||||||
cards.add(new SetCardInfo("Imprisoned in the Moon", 14, Rarity.MYTHIC, mage.cards.i.ImprisonedInTheMoon.class));
|
cards.add(new SetCardInfo("Imprisoned in the Moon", 14, Rarity.MYTHIC, mage.cards.i.ImprisonedInTheMoon.class));
|
||||||
cards.add(new SetCardInfo("Inspired Insurgent", 77, Rarity.COMMON, mage.cards.i.InspiredInsurgent.class));
|
cards.add(new SetCardInfo("Inspired Insurgent", 77, Rarity.COMMON, mage.cards.i.InspiredInsurgent.class));
|
||||||
|
|
@ -159,15 +168,22 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Koma, Cosmos Serpent", 51, Rarity.MYTHIC, mage.cards.k.KomaCosmosSerpent.class));
|
cards.add(new SetCardInfo("Koma, Cosmos Serpent", 51, Rarity.MYTHIC, mage.cards.k.KomaCosmosSerpent.class));
|
||||||
cards.add(new SetCardInfo("Komodo Rhino", 241, Rarity.COMMON, mage.cards.k.KomodoRhino.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Komodo Rhino", 241, Rarity.COMMON, mage.cards.k.KomodoRhino.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Komodo Rhino", 283, Rarity.COMMON, mage.cards.k.KomodoRhino.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Komodo Rhino", 283, Rarity.COMMON, mage.cards.k.KomodoRhino.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Kyoshi Warrior Exemplars", 140, Rarity.UNCOMMON, mage.cards.k.KyoshiWarriorExemplars.class));
|
||||||
cards.add(new SetCardInfo("Kyoshi Warrior Guard", 216, Rarity.COMMON, mage.cards.k.KyoshiWarriorGuard.class));
|
cards.add(new SetCardInfo("Kyoshi Warrior Guard", 216, Rarity.COMMON, mage.cards.k.KyoshiWarriorGuard.class));
|
||||||
cards.add(new SetCardInfo("Lightning Bolt", 32, Rarity.MYTHIC, mage.cards.l.LightningBolt.class));
|
cards.add(new SetCardInfo("Lightning Bolt", 32, Rarity.MYTHIC, mage.cards.l.LightningBolt.class));
|
||||||
cards.add(new SetCardInfo("Lion Vulture", 232, Rarity.RARE, mage.cards.l.LionVulture.class));
|
cards.add(new SetCardInfo("Lion Vulture", 232, Rarity.RARE, mage.cards.l.LionVulture.class));
|
||||||
cards.add(new SetCardInfo("Lita, Mechanical Engineer", 4, Rarity.MYTHIC, mage.cards.l.LitaMechanicalEngineer.class));
|
cards.add(new SetCardInfo("Lita, Mechanical Engineer", 4, Rarity.MYTHIC, mage.cards.l.LitaMechanicalEngineer.class));
|
||||||
|
cards.add(new SetCardInfo("Lo and Li, Royal Advisors", 108, Rarity.RARE, mage.cards.l.LoAndLiRoyalAdvisors.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Lo and Li, Royal Advisors", 189, Rarity.RARE, mage.cards.l.LoAndLiRoyalAdvisors.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Longshot, Rebel Bowman", 120, Rarity.UNCOMMON, mage.cards.l.LongshotRebelBowman.class));
|
cards.add(new SetCardInfo("Longshot, Rebel Bowman", 120, Rarity.UNCOMMON, mage.cards.l.LongshotRebelBowman.class));
|
||||||
|
cards.add(new SetCardInfo("Lost in Memories", 121, Rarity.RARE, mage.cards.l.LostInMemories.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Lost in Memories", 195, Rarity.RARE, mage.cards.l.LostInMemories.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Lost in the Spirit World", 224, Rarity.UNCOMMON, mage.cards.l.LostInTheSpiritWorld.class));
|
cards.add(new SetCardInfo("Lost in the Spirit World", 224, Rarity.UNCOMMON, mage.cards.l.LostInTheSpiritWorld.class));
|
||||||
cards.add(new SetCardInfo("Loyal Fire Sage", 242, Rarity.UNCOMMON, mage.cards.l.LoyalFireSage.class));
|
cards.add(new SetCardInfo("Loyal Fire Sage", 242, Rarity.UNCOMMON, mage.cards.l.LoyalFireSage.class));
|
||||||
cards.add(new SetCardInfo("Mai and Zuko", 68, Rarity.RARE, mage.cards.m.MaiAndZuko.class));
|
cards.add(new SetCardInfo("Mai and Zuko", 68, Rarity.RARE, mage.cards.m.MaiAndZuko.class));
|
||||||
cards.add(new SetCardInfo("Many Partings", 169, Rarity.COMMON, mage.cards.m.ManyPartings.class));
|
cards.add(new SetCardInfo("Many Partings", 169, Rarity.COMMON, mage.cards.m.ManyPartings.class));
|
||||||
|
cards.add(new SetCardInfo("Master's Guidance", 141, Rarity.RARE, mage.cards.m.MastersGuidance.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Master's Guidance", 206, Rarity.RARE, mage.cards.m.MastersGuidance.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Match the Odds", 253, Rarity.UNCOMMON, mage.cards.m.MatchTheOdds.class));
|
cards.add(new SetCardInfo("Match the Odds", 253, Rarity.UNCOMMON, mage.cards.m.MatchTheOdds.class));
|
||||||
cards.add(new SetCardInfo("Mechanical Glider", 256, Rarity.COMMON, mage.cards.m.MechanicalGlider.class));
|
cards.add(new SetCardInfo("Mechanical Glider", 256, Rarity.COMMON, mage.cards.m.MechanicalGlider.class));
|
||||||
cards.add(new SetCardInfo("Meteorite", 54, Rarity.MYTHIC, mage.cards.m.Meteorite.class));
|
cards.add(new SetCardInfo("Meteorite", 54, Rarity.MYTHIC, mage.cards.m.Meteorite.class));
|
||||||
|
|
@ -175,6 +191,8 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Moku, Meandering Drummer", 122, Rarity.UNCOMMON, mage.cards.m.MokuMeanderingDrummer.class));
|
cards.add(new SetCardInfo("Moku, Meandering Drummer", 122, Rarity.UNCOMMON, mage.cards.m.MokuMeanderingDrummer.class));
|
||||||
cards.add(new SetCardInfo("Momo, Rambunctious Rascal", 217, Rarity.UNCOMMON, mage.cards.m.MomoRambunctiousRascal.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Momo, Rambunctious Rascal", 217, Rarity.UNCOMMON, mage.cards.m.MomoRambunctiousRascal.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Momo, Rambunctious Rascal", 270, Rarity.UNCOMMON, mage.cards.m.MomoRambunctiousRascal.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Momo, Rambunctious Rascal", 270, Rarity.UNCOMMON, mage.cards.m.MomoRambunctiousRascal.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Monk Gyatso", 173, Rarity.RARE, mage.cards.m.MonkGyatso.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Monk Gyatso", 81, Rarity.RARE, mage.cards.m.MonkGyatso.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Mountain", 289, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Mountain", 289, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Mountain", 290, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Mountain", 290, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Mountain", 291, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Mountain", 291, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -185,6 +203,7 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Mountain", 296, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Mountain", 296, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Mystic Remora", 16, Rarity.MYTHIC, mage.cards.m.MysticRemora.class));
|
cards.add(new SetCardInfo("Mystic Remora", 16, Rarity.MYTHIC, mage.cards.m.MysticRemora.class));
|
||||||
cards.add(new SetCardInfo("Mystical Tutor", 308, Rarity.RARE, mage.cards.m.MysticalTutor.class));
|
cards.add(new SetCardInfo("Mystical Tutor", 308, Rarity.RARE, mage.cards.m.MysticalTutor.class));
|
||||||
|
cards.add(new SetCardInfo("Nightmares and Daydreams", 94, Rarity.RARE, mage.cards.n.NightmaresAndDaydreams.class));
|
||||||
cards.add(new SetCardInfo("Noxious Gearhulk", 25, Rarity.MYTHIC, mage.cards.n.NoxiousGearhulk.class));
|
cards.add(new SetCardInfo("Noxious Gearhulk", 25, Rarity.MYTHIC, mage.cards.n.NoxiousGearhulk.class));
|
||||||
cards.add(new SetCardInfo("Obscuring Haze", 313, Rarity.RARE, mage.cards.o.ObscuringHaze.class));
|
cards.add(new SetCardInfo("Obscuring Haze", 313, Rarity.RARE, mage.cards.o.ObscuringHaze.class));
|
||||||
cards.add(new SetCardInfo("Overwhelming Victory", 123, Rarity.RARE, mage.cards.o.OverwhelmingVictory.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Overwhelming Victory", 123, Rarity.RARE, mage.cards.o.OverwhelmingVictory.class, NON_FULL_USE_VARIOUS));
|
||||||
|
|
@ -228,6 +247,8 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Sol Ring", 316, Rarity.RARE, mage.cards.s.SolRing.class));
|
cards.add(new SetCardInfo("Sol Ring", 316, Rarity.RARE, mage.cards.s.SolRing.class));
|
||||||
cards.add(new SetCardInfo("Solid Ground", 142, Rarity.UNCOMMON, mage.cards.s.SolidGround.class));
|
cards.add(new SetCardInfo("Solid Ground", 142, Rarity.UNCOMMON, mage.cards.s.SolidGround.class));
|
||||||
cards.add(new SetCardInfo("Standstill", 19, Rarity.MYTHIC, mage.cards.s.Standstill.class));
|
cards.add(new SetCardInfo("Standstill", 19, Rarity.MYTHIC, mage.cards.s.Standstill.class));
|
||||||
|
cards.add(new SetCardInfo("Suki, Kyoshi Captain", 175, Rarity.RARE, mage.cards.s.SukiKyoshiCaptain.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Suki, Kyoshi Captain", 85, Rarity.RARE, mage.cards.s.SukiKyoshiCaptain.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Sunbaked Canyon", 58, Rarity.MYTHIC, mage.cards.s.SunbakedCanyon.class));
|
cards.add(new SetCardInfo("Sunbaked Canyon", 58, Rarity.MYTHIC, mage.cards.s.SunbakedCanyon.class));
|
||||||
cards.add(new SetCardInfo("Sundial of the Infinite", 55, Rarity.MYTHIC, mage.cards.s.SundialOfTheInfinite.class));
|
cards.add(new SetCardInfo("Sundial of the Infinite", 55, Rarity.MYTHIC, mage.cards.s.SundialOfTheInfinite.class));
|
||||||
cards.add(new SetCardInfo("Suspicious Bookcase", 170, Rarity.UNCOMMON, mage.cards.s.SuspiciousBookcase.class));
|
cards.add(new SetCardInfo("Suspicious Bookcase", 170, Rarity.UNCOMMON, mage.cards.s.SuspiciousBookcase.class));
|
||||||
|
|
@ -248,6 +269,7 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
|
||||||
cards.add(new SetCardInfo("Thriving Moor", 264, Rarity.COMMON, mage.cards.t.ThrivingMoor.class));
|
cards.add(new SetCardInfo("Thriving Moor", 264, Rarity.COMMON, mage.cards.t.ThrivingMoor.class));
|
||||||
cards.add(new SetCardInfo("Toph, Earthbending Master", 145, Rarity.MYTHIC, mage.cards.t.TophEarthbendingMaster.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Toph, Earthbending Master", 145, Rarity.MYTHIC, mage.cards.t.TophEarthbendingMaster.class, NON_FULL_USE_VARIOUS));
|
||||||
cards.add(new SetCardInfo("Toph, Earthbending Master", 209, Rarity.MYTHIC, mage.cards.t.TophEarthbendingMaster.class, NON_FULL_USE_VARIOUS));
|
cards.add(new SetCardInfo("Toph, Earthbending Master", 209, Rarity.MYTHIC, mage.cards.t.TophEarthbendingMaster.class, NON_FULL_USE_VARIOUS));
|
||||||
|
cards.add(new SetCardInfo("Toph, Greatest Earthbender", 70, Rarity.RARE, mage.cards.t.TophGreatestEarthbender.class));
|
||||||
cards.add(new SetCardInfo("Toucan-Puffin", 88, Rarity.COMMON, mage.cards.t.ToucanPuffin.class));
|
cards.add(new SetCardInfo("Toucan-Puffin", 88, Rarity.COMMON, mage.cards.t.ToucanPuffin.class));
|
||||||
cards.add(new SetCardInfo("Training Grounds", 20, Rarity.MYTHIC, mage.cards.t.TrainingGrounds.class));
|
cards.add(new SetCardInfo("Training Grounds", 20, Rarity.MYTHIC, mage.cards.t.TrainingGrounds.class));
|
||||||
cards.add(new SetCardInfo("Treetop Village", 60, Rarity.MYTHIC, mage.cards.t.TreetopVillage.class));
|
cards.add(new SetCardInfo("Treetop Village", 60, Rarity.MYTHIC, mage.cards.t.TreetopVillage.class));
|
||||||
|
|
|
||||||
|
|
@ -6,21 +6,29 @@ import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
import mage.util.CardUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author TheElk801
|
* @author TheElk801
|
||||||
*/
|
*/
|
||||||
public class PutOnTopOrBottomLibraryTargetEffect extends OneShotEffect {
|
public class PutOnTopOrBottomLibraryTargetEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
private final int position;
|
||||||
private final boolean textOwnerOf;
|
private final boolean textOwnerOf;
|
||||||
|
|
||||||
public PutOnTopOrBottomLibraryTargetEffect(boolean textOwnerOf) {
|
public PutOnTopOrBottomLibraryTargetEffect(boolean textOwnerOf) {
|
||||||
|
this(1, textOwnerOf);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PutOnTopOrBottomLibraryTargetEffect(int position, boolean textOwnerOf) {
|
||||||
super(Outcome.ReturnToHand);
|
super(Outcome.ReturnToHand);
|
||||||
|
this.position = position;
|
||||||
this.textOwnerOf = textOwnerOf;
|
this.textOwnerOf = textOwnerOf;
|
||||||
}
|
}
|
||||||
|
|
||||||
private PutOnTopOrBottomLibraryTargetEffect(final PutOnTopOrBottomLibraryTargetEffect effect) {
|
private PutOnTopOrBottomLibraryTargetEffect(final PutOnTopOrBottomLibraryTargetEffect effect) {
|
||||||
super(effect);
|
super(effect);
|
||||||
|
this.position = effect.position;
|
||||||
this.textOwnerOf = effect.textOwnerOf;
|
this.textOwnerOf = effect.textOwnerOf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -35,10 +43,14 @@ public class PutOnTopOrBottomLibraryTargetEffect extends OneShotEffect {
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
String message = position > 1 ? "into your library " + CardUtil.numberToOrdinalText(position) + " from the top or on the" : "on the top or";
|
||||||
boolean onTop = player.chooseUse(
|
boolean onTop = player.chooseUse(
|
||||||
Outcome.Detriment, "Put the targeted object on the top or bottom of your library?",
|
Outcome.Detriment, "Put the targeted object " + message + " bottom of your library?",
|
||||||
null, "Top", "Bottom", source, game
|
null, "Top", "Bottom", source, game
|
||||||
);
|
);
|
||||||
|
if (onTop && position > 1) {
|
||||||
|
return new PutIntoLibraryNFromTopTargetEffect(position).apply(game, source);
|
||||||
|
}
|
||||||
return new PutOnLibraryTargetEffect(onTop).apply(game, source);
|
return new PutOnLibraryTargetEffect(onTop).apply(game, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,8 +59,23 @@ public class PutOnTopOrBottomLibraryTargetEffect extends OneShotEffect {
|
||||||
if (staticText != null && !staticText.isEmpty()) {
|
if (staticText != null && !staticText.isEmpty()) {
|
||||||
return staticText;
|
return staticText;
|
||||||
}
|
}
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
String targetText = getTargetPointer().describeTargets(mode.getTargets(), "that permanent");
|
String targetText = getTargetPointer().describeTargets(mode.getTargets(), "that permanent");
|
||||||
return (textOwnerOf ? "the owner of " + targetText : targetText + "'s owner") +
|
if (textOwnerOf) {
|
||||||
" puts it on their choice of the top or bottom of their library";
|
sb.append("the owner of ");
|
||||||
|
sb.append(targetText);
|
||||||
|
} else {
|
||||||
|
sb.append(targetText);
|
||||||
|
sb.append("'s owner");
|
||||||
|
}
|
||||||
|
sb.append(" puts it");
|
||||||
|
if (position > 1) {
|
||||||
|
sb.append("into their library ");
|
||||||
|
sb.append(CardUtil.numberToOrdinalText(position));
|
||||||
|
sb.append(" from the top or on the bottom");
|
||||||
|
} else {
|
||||||
|
sb.append("on their choice of the top or bottom of their library");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
package mage.abilities.effects.common.search;
|
||||||
|
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.cards.Cards;
|
||||||
|
import mage.cards.CardsImpl;
|
||||||
|
import mage.constants.Outcome;
|
||||||
|
import mage.constants.PutCards;
|
||||||
|
import mage.constants.Zone;
|
||||||
|
import mage.filter.FilterCard;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.players.Player;
|
||||||
|
import mage.target.TargetCard;
|
||||||
|
import mage.target.TargetPlayer;
|
||||||
|
import mage.target.common.TargetCardInLibrary;
|
||||||
|
import mage.target.common.TargetCardWithDifferentNameInLibrary;
|
||||||
|
import mage.target.common.TargetOpponent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public class SearchLibraryForFourDifferentCardsEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
private final FilterCard filter;
|
||||||
|
private final PutCards putCards;
|
||||||
|
private final boolean useTargetPointer;
|
||||||
|
private static final FilterCard filter2 = new FilterCard("cards to put in graveyard");
|
||||||
|
|
||||||
|
public SearchLibraryForFourDifferentCardsEffect(FilterCard filter, PutCards putCards, boolean useTargetPointer) {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
this.filter = filter;
|
||||||
|
this.putCards = putCards;
|
||||||
|
this.useTargetPointer = useTargetPointer;
|
||||||
|
staticText = "search your library for up to four " + filter +
|
||||||
|
" with different names and reveal them. " + (useTargetPointer ? "Target" : "An") +
|
||||||
|
" opponent chooses two of those cards. Put the chosen cards into your graveyard and the rest " +
|
||||||
|
putCards.getMessage(false, false) + ", then shuffle";
|
||||||
|
}
|
||||||
|
|
||||||
|
private SearchLibraryForFourDifferentCardsEffect(final SearchLibraryForFourDifferentCardsEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
this.filter = effect.filter;
|
||||||
|
this.putCards = effect.putCards;
|
||||||
|
this.useTargetPointer = effect.useTargetPointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SearchLibraryForFourDifferentCardsEffect copy() {
|
||||||
|
return new SearchLibraryForFourDifferentCardsEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Player player = game.getPlayer(source.getControllerId());
|
||||||
|
if (player == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TargetCardInLibrary targetCards = new TargetCardWithDifferentNameInLibrary(0, 4, filter);
|
||||||
|
player.searchLibrary(targetCards, source, game);
|
||||||
|
Cards cards = new CardsImpl(targetCards.getTargets());
|
||||||
|
cards.retainZone(Zone.LIBRARY, game);
|
||||||
|
player.revealCards(source, cards, game);
|
||||||
|
if (cards.isEmpty()) {
|
||||||
|
player.shuffleLibrary(source, game);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cards toGrave = new CardsImpl();
|
||||||
|
if (cards.size() > 2) {
|
||||||
|
Player opponent;
|
||||||
|
if (useTargetPointer) {
|
||||||
|
opponent = game.getPlayer(getTargetPointer().getFirst(game, source));
|
||||||
|
} else {
|
||||||
|
TargetPlayer target = new TargetOpponent(true);
|
||||||
|
player.choose(outcome, target, source, game);
|
||||||
|
opponent = game.getPlayer(target.getFirstTarget());
|
||||||
|
}
|
||||||
|
if (opponent != null) {
|
||||||
|
TargetCard targetDiscard = new TargetCard(2, Zone.LIBRARY, filter2);
|
||||||
|
opponent.choose(Outcome.Discard, cards, targetDiscard, source, game);
|
||||||
|
toGrave.addAll(targetDiscard.getTargets());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
toGrave.addAll(cards);
|
||||||
|
}
|
||||||
|
cards.removeAll(toGrave);
|
||||||
|
player.moveCards(toGrave, Zone.GRAVEYARD, source, game);
|
||||||
|
putCards.moveCards(player, cards, source, game);
|
||||||
|
player.shuffleLibrary(source, game);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
package mage.game.permanent.token;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.abilities.keyword.FirebendingAbility;
|
||||||
|
import mage.abilities.keyword.FlyingAbility;
|
||||||
|
import mage.constants.CardType;
|
||||||
|
import mage.constants.SubType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class DragonFirebendingToken extends TokenImpl {
|
||||||
|
|
||||||
|
public DragonFirebendingToken() {
|
||||||
|
super("Dragon Token", "4/4 red Dragon creature token with flying and firebending 4");
|
||||||
|
cardType.add(CardType.CREATURE);
|
||||||
|
color.setRed(true);
|
||||||
|
subtype.add(SubType.DRAGON);
|
||||||
|
power = new MageInt(4);
|
||||||
|
toughness = new MageInt(4);
|
||||||
|
addAbility(FlyingAbility.getInstance());
|
||||||
|
addAbility(new FirebendingAbility(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
private DragonFirebendingToken(final DragonFirebendingToken token) {
|
||||||
|
super(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DragonFirebendingToken copy() {
|
||||||
|
return new DragonFirebendingToken(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2897,6 +2897,7 @@
|
||||||
|Generate|TOK:TLA|Clue|3||ClueArtifactToken|
|
|Generate|TOK:TLA|Clue|3||ClueArtifactToken|
|
||||||
|Generate|TOK:TLA|Clue|4||ClueArtifactToken|
|
|Generate|TOK:TLA|Clue|4||ClueArtifactToken|
|
||||||
|Generate|TOK:TLA|Clue|5||ClueArtifactToken|
|
|Generate|TOK:TLA|Clue|5||ClueArtifactToken|
|
||||||
|
|Generate|TOK:TLA|Dragon|||DragonFirebendingToken|
|
||||||
|Generate|TOK:TLA|Food|1||FoodToken|
|
|Generate|TOK:TLA|Food|1||FoodToken|
|
||||||
|Generate|TOK:TLA|Food|2||FoodToken|
|
|Generate|TOK:TLA|Food|2||FoodToken|
|
||||||
|Generate|TOK:TLA|Food|3||FoodToken|
|
|Generate|TOK:TLA|Food|3||FoodToken|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue