mirror of
https://github.com/correl/mage.git
synced 2024-11-15 03:00:16 +00:00
[BRO] Implemented Urza, Lord Protector / Urza, Planeswalker
This commit is contained in:
parent
5fa9a850b1
commit
9706274141
7 changed files with 241 additions and 3 deletions
76
Mage.Sets/src/mage/cards/u/UrzaLordProtector.java
Normal file
76
Mage.Sets/src/mage/cards/u/UrzaLordProtector.java
Normal file
|
@ -0,0 +1,76 @@
|
|||
package mage.cards.u;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.MeldCondition;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.effects.common.MeldEffect;
|
||||
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicates;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class UrzaLordProtector extends CardImpl {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("artifact, instant, and sorcery spells");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
CardType.ARTIFACT.getPredicate(),
|
||||
CardType.INSTANT.getPredicate(),
|
||||
CardType.SORCERY.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
private static final Condition condition = new MeldCondition("The Mightstone and Weakstone");
|
||||
|
||||
public UrzaLordProtector(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{U}");
|
||||
|
||||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.ARTIFICER);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// Artifact, instant, and sorcery spells you cast cost {1} less to cast.
|
||||
this.addAbility(new SimpleStaticAbility(new SpellsCostReductionControllerEffect(filter, 1)));
|
||||
|
||||
// {7}: If you both own and control Urza, Lord Protector and an artifact named The Mightstone and Weakstone, exile them, then meld them into Urza, Planeswalker. Activate only as a sorcery.
|
||||
this.addAbility(new SimpleActivatedAbility(new ConditionalOneShotEffect(
|
||||
new MeldEffect(
|
||||
"The Mightstone and Weakstone",
|
||||
new UrzaPlaneswalker(
|
||||
ownerId,
|
||||
new CardSetInfo(
|
||||
"Urza, Planeswalker", setInfo.getExpansionSetCode(),
|
||||
"238b", Rarity.MYTHIC
|
||||
)
|
||||
)
|
||||
), condition, "If you both own and control {this} and an artifact named " +
|
||||
"The Mightstone and Weakstone, exile them, then meld them into Urza, Planeswalker"
|
||||
), new GenericManaCost(7)));
|
||||
}
|
||||
|
||||
private UrzaLordProtector(final UrzaLordProtector card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UrzaLordProtector copy() {
|
||||
return new UrzaLordProtector(this);
|
||||
}
|
||||
}
|
117
Mage.Sets/src/mage/cards/u/UrzaPlaneswalker.java
Normal file
117
Mage.Sets/src/mage/cards/u/UrzaPlaneswalker.java
Normal file
|
@ -0,0 +1,117 @@
|
|||
package mage.cards.u;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.ContinuousEffectImpl;
|
||||
import mage.abilities.effects.common.*;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect;
|
||||
import mage.abilities.keyword.IndestructibleAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.MeldCard;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.SoldierArtifactToken;
|
||||
import mage.target.common.TargetNonlandPermanent;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class UrzaPlaneswalker extends MeldCard {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("artifact, instant, and sorcery spells");
|
||||
private static final FilterPermanent filter2 = new FilterPermanent("artifacts and planeswalkers");
|
||||
|
||||
static {
|
||||
filter.add(Predicates.or(
|
||||
CardType.ARTIFACT.getPredicate(),
|
||||
CardType.INSTANT.getPredicate(),
|
||||
CardType.SORCERY.getPredicate()
|
||||
));
|
||||
filter2.add(Predicates.or(
|
||||
CardType.ARTIFACT.getPredicate(),
|
||||
CardType.PLANESWALKER.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
public UrzaPlaneswalker(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
|
||||
|
||||
this.addSuperType(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.URZA);
|
||||
|
||||
this.setStartingLoyalty(7);
|
||||
|
||||
this.nightCard = true;
|
||||
|
||||
// You may activate the loyalty abilities of Urza, Planeswalker twice each turn rather than only once.
|
||||
this.addAbility(new SimpleStaticAbility(new UrzaPlaneswalkerEffect()));
|
||||
|
||||
// +2: Artifact, instant, and sorcery spells you cast this turn cost {2} less to cast. You gain 2 life.
|
||||
Ability ability = new LoyaltyAbility(new SpellsCostReductionControllerEffect(filter, 1)
|
||||
.setDuration(Duration.EndOfTurn)
|
||||
.setText("artifact, instant, and sorcery spells you cast this turn cost {2} less to cast"), 2);
|
||||
ability.addEffect(new GainLifeEffect(2));
|
||||
this.addAbility(ability);
|
||||
|
||||
// +1: Draw two cards, then discard a card.
|
||||
this.addAbility(new LoyaltyAbility(new DrawDiscardTargetEffect(2, 1), 1));
|
||||
|
||||
// 0: Create two 1/1 colorless Soldier artifact creature tokens.
|
||||
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new SoldierArtifactToken()), 0));
|
||||
|
||||
// -3: Exile target nonland permanent.
|
||||
ability = new LoyaltyAbility(new ExileTargetEffect(), -3);
|
||||
ability.addTarget(new TargetNonlandPermanent());
|
||||
this.addAbility(ability);
|
||||
|
||||
// -10: Artifacts and planeswalkers you control gain indestructible until end of turn. Destroy all nonland permanents.
|
||||
ability = new LoyaltyAbility(new GainAbilityControlledEffect(
|
||||
IndestructibleAbility.getInstance(), Duration.EndOfTurn, filter2
|
||||
), -10);
|
||||
ability.addEffect(new DestroyAllEffect(StaticFilters.FILTER_PERMANENTS_NON_LAND));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private UrzaPlaneswalker(final UrzaPlaneswalker card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UrzaPlaneswalker copy() {
|
||||
return new UrzaPlaneswalker(this);
|
||||
}
|
||||
}
|
||||
|
||||
class UrzaPlaneswalkerEffect extends ContinuousEffectImpl {
|
||||
|
||||
public UrzaPlaneswalkerEffect() {
|
||||
super(Duration.WhileOnBattlefield, Layer.RulesEffects, SubLayer.NA, Outcome.Benefit);
|
||||
staticText = "once during each of your turns, you may activate an additional loyalty ability of {this}";
|
||||
}
|
||||
|
||||
public UrzaPlaneswalkerEffect(final UrzaPlaneswalkerEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UrzaPlaneswalkerEffect copy() {
|
||||
return new UrzaPlaneswalkerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Optional.ofNullable(source.getSourcePermanentIfItStillExists(game))
|
||||
.ifPresent(Permanent::incrementLoyaltyActivationsAvailable);
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -29,7 +29,9 @@ public final class TheBrothersWar extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Recruitment Officer", 23, Rarity.UNCOMMON, mage.cards.r.RecruitmentOfficer.class));
|
||||
cards.add(new SetCardInfo("Surge Engine", 81, Rarity.MYTHIC, mage.cards.s.SurgeEngine.class));
|
||||
cards.add(new SetCardInfo("Swamp", 282, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS));
|
||||
cards.add(new SetCardInfo("The Mightstone and Weakstone", 238, Rarity.RARE, mage.cards.t.TheMightstoneAndWeakstone.class));
|
||||
cards.add(new SetCardInfo("The Mightstone and Weakstone", "238a", Rarity.RARE, mage.cards.t.TheMightstoneAndWeakstone.class));
|
||||
cards.add(new SetCardInfo("Urza, Lord Protector", 225, Rarity.MYTHIC, mage.cards.u.UrzaLordProtector.class));
|
||||
cards.add(new SetCardInfo("Urza, Planeswalker", "238b", Rarity.MYTHIC, mage.cards.u.UrzaPlaneswalker.class));
|
||||
}
|
||||
|
||||
// @Override
|
||||
|
|
|
@ -478,7 +478,7 @@ public enum SubType {
|
|||
TIBALT("Tibalt", SubTypeSet.PlaneswalkerType),
|
||||
TYVAR("Tyvar", SubTypeSet.PlaneswalkerType),
|
||||
UGIN("Ugin", SubTypeSet.PlaneswalkerType),
|
||||
URZA("Urza", SubTypeSet.PlaneswalkerType, true), // Unstable
|
||||
URZA("Urza", SubTypeSet.PlaneswalkerType),
|
||||
VENSER("Venser", SubTypeSet.PlaneswalkerType),
|
||||
VIVIEN("Vivien", SubTypeSet.PlaneswalkerType),
|
||||
VRASKA("Vraska", SubTypeSet.PlaneswalkerType),
|
||||
|
|
|
@ -214,6 +214,8 @@ public interface Permanent extends Card, Controllable {
|
|||
|
||||
void removeAbilities(List<Ability> abilitiesToRemove, UUID sourceId, Game game);
|
||||
|
||||
void incrementLoyaltyActivationsAvailable();
|
||||
|
||||
void addLoyaltyUsed();
|
||||
|
||||
boolean canLoyaltyBeUsed(Game game);
|
||||
|
|
|
@ -102,6 +102,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
|||
protected List<MarkedDamageInfo> markedDamage;
|
||||
protected int markedLifelink;
|
||||
protected int timesLoyaltyUsed = 0;
|
||||
protected int loyaltyActivationsAvailable = 1;
|
||||
protected int transformCount = 0;
|
||||
protected Map<String, String> info;
|
||||
protected int createOrder;
|
||||
|
@ -169,6 +170,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
|||
this.pairedPermanent = permanent.pairedPermanent;
|
||||
this.bandedCards.addAll(permanent.bandedCards);
|
||||
this.timesLoyaltyUsed = permanent.timesLoyaltyUsed;
|
||||
this.loyaltyActivationsAvailable = permanent.loyaltyActivationsAvailable;
|
||||
this.transformCount = permanent.transformCount;
|
||||
|
||||
this.morphed = permanent.morphed;
|
||||
|
@ -211,6 +213,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
|||
this.maxBlockedBy = 0;
|
||||
this.copy = false;
|
||||
this.goadingPlayers.clear();
|
||||
this.loyaltyActivationsAvailable = 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -462,6 +465,11 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void incrementLoyaltyActivationsAvailable() {
|
||||
this.loyaltyActivationsAvailable++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLoyaltyUsed() {
|
||||
this.timesLoyaltyUsed++;
|
||||
|
@ -471,7 +479,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
|||
public boolean canLoyaltyBeUsed(Game game) {
|
||||
Player controller = game.getPlayer(controllerId);
|
||||
if (controller != null) {
|
||||
return controller.getLoyaltyUsePerTurn() > timesLoyaltyUsed;
|
||||
return Math.max(controller.getLoyaltyUsePerTurn(), loyaltyActivationsAvailable) > timesLoyaltyUsed;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package mage.game.permanent.token;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SoldierArtifactToken extends TokenImpl {
|
||||
|
||||
public SoldierArtifactToken() {
|
||||
super("Soldier Token", "1/1 colorless Soldier artifact creature token");
|
||||
cardType.add(CardType.ARTIFACT);
|
||||
cardType.add(CardType.CREATURE);
|
||||
subtype.add(SubType.SOLDIER);
|
||||
power = new MageInt(1);
|
||||
toughness = new MageInt(1);
|
||||
|
||||
availableImageSetCodes = Arrays.asList("BRO");
|
||||
}
|
||||
|
||||
public SoldierArtifactToken(final SoldierArtifactToken token) {
|
||||
super(token);
|
||||
}
|
||||
|
||||
public SoldierArtifactToken copy() {
|
||||
return new SoldierArtifactToken(this);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue