mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
Fix for review.
This commit is contained in:
parent
d23b024992
commit
70588cf3e5
3 changed files with 73 additions and 109 deletions
|
|
@ -1,26 +1,27 @@
|
||||||
package mage.cards.d;
|
package mage.cards.d;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.DelayedTriggeredAbility;
|
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
|
import mage.abilities.common.BeginningOfCombatTriggeredAbility;
|
||||||
import mage.abilities.common.SacrificePermanentTriggeredAbility;
|
|
||||||
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
|
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
|
||||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||||
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
|
||||||
|
import mage.abilities.dynamicvalue.DynamicValue;
|
||||||
|
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
||||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||||
import mage.abilities.hint.common.DesertsYouControlHint;
|
import mage.abilities.hint.Hint;
|
||||||
|
import mage.abilities.hint.ValueHint;
|
||||||
import mage.abilities.keyword.HasteAbility;
|
import mage.abilities.keyword.HasteAbility;
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.cards.CardSetInfo;
|
import mage.cards.CardSetInfo;
|
||||||
import mage.constants.*;
|
import mage.constants.*;
|
||||||
import mage.filter.FilterCard;
|
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.common.FilterLandPermanent;
|
import mage.filter.common.FilterControlledPermanent;
|
||||||
|
import mage.filter.common.FilterOwnedCard;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.events.ZoneChangeEvent;
|
import mage.game.events.ZoneChangeEvent;
|
||||||
|
|
@ -44,33 +45,24 @@ public final class DesertWarfare extends CardImpl {
|
||||||
filter.add(SubType.DESERT.getPredicate());
|
filter.add(SubType.DESERT.getPredicate());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final FilterCard filter1 = new FilterCard();
|
|
||||||
|
|
||||||
static {
|
|
||||||
filter1.add(SubType.DESERT.getPredicate());
|
|
||||||
}
|
|
||||||
|
|
||||||
public DesertWarfare(UUID ownerId, CardSetInfo setInfo) {
|
public DesertWarfare(UUID ownerId, CardSetInfo setInfo) {
|
||||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");
|
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}");
|
||||||
|
|
||||||
// Whenever you sacrifice a Desert and whenever a Desert card is put into your
|
// Whenever you sacrifice a Desert and whenever a Desert card is put into your graveyard from your hand or library, put that card onto the battlefield under your control at the beginning of your next end step.
|
||||||
// graveyard from your hand or library, put that card onto the battlefield under your control at the beginning of your next end step.
|
|
||||||
|
|
||||||
//Based on Seraph, Yuma, Proud Protector
|
//Based on Seraph, Yuma, Proud Protector
|
||||||
Effect effect = new CreateDelayedTriggeredAbilityEffect((DelayedTriggeredAbility) new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new DesertWarfareReturnEffect(), TargetController.YOU).setTriggerPhrase("Put that card onto the battlefield under your control at the beginning of your next end step.").setRuleVisible(false));
|
Effect effect = new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new DesertWarfareReturnEffect(), TargetController.YOU));
|
||||||
|
effect.setText("put that card onto the battlefield under your control at the beginning of your next end step");
|
||||||
|
|
||||||
this.addAbility(new SacrificePermanentTriggeredAbility(Zone.BATTLEFIELD, effect, filter, TargetController.YOU, SetTargetPointer.PERMANENT, false).setTriggerPhrase("Whenever you sacrifice a Desert and whenever a Desert card is put into your graveyard from your hand or library, put that card onto the battlefield under your control at the beginning of your next end step.").setRuleVisible(false));
|
this.addAbility(new DesertWarfareTriggeredAbility(Zone.BATTLEFIELD, effect, false, TargetController.YOU, SetTargetPointer.CARD));
|
||||||
|
|
||||||
this.addAbility(new PutCardIntoGraveFromHandLibraryAllTriggeredAbility(Zone.BATTLEFIELD, effect,
|
|
||||||
false, TargetController.YOU, SetTargetPointer.CARD).setTriggerPhrase("Whenever you sacrifice a Desert and whenever a Desert card is put into your graveyard from your hand or library, put that card onto the battlefield under your control at the beginning of your next end step."));
|
|
||||||
|
|
||||||
//At the beginning of combat on your turn, if you control five or more Deserts, create that many 1/1 red, green, and white Sand Warrior creature tokens. They gain haste.
|
//At the beginning of combat on your turn, if you control five or more Deserts, create that many 1/1 red, green, and white Sand Warrior creature tokens. They gain haste.
|
||||||
//Based on Palani's Hatcher
|
//Based on Palani's Hatcher
|
||||||
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
this.addAbility(new ConditionalInterveningIfTriggeredAbility(
|
||||||
new BeginningOfCombatTriggeredAbility(new DesertWarfareCreateTokensEffect(), TargetController.YOU, false),
|
new BeginningOfCombatTriggeredAbility(new DesertWarfareCreateTokensEffect(), TargetController.YOU, false),
|
||||||
new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.OR_GREATER, 5, true),
|
new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.OR_GREATER, 5, true),
|
||||||
"At the beginning of combat on your turn, if you control five or more Deserts, create that many 1/1 red, green, and white Sand Warrior creature tokens. They gain haste.").addHint(DesertsYouControlHint.instance));
|
"At the beginning of combat on your turn, if you control five or more Deserts, " +
|
||||||
|
"create that many 1/1 red, green, and white Sand Warrior creature tokens. They gain haste.")
|
||||||
|
.addHint(DesertsYouControlCount.getHint()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private DesertWarfare(final DesertWarfare card) {
|
private DesertWarfare(final DesertWarfare card) {
|
||||||
|
|
@ -85,9 +77,9 @@ public final class DesertWarfare extends CardImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Based on PutCardIntoGraveFromAnywhereAllTriggeredAbility
|
//Based on PutCardIntoGraveFromAnywhereAllTriggeredAbility
|
||||||
class PutCardIntoGraveFromHandLibraryAllTriggeredAbility extends TriggeredAbilityImpl {
|
class DesertWarfareTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
|
|
||||||
private static FilterCard filterCard = new FilterCard();
|
private static FilterOwnedCard filterCard = new FilterOwnedCard();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
filterCard.add(SubType.DESERT.getPredicate());
|
filterCard.add(SubType.DESERT.getPredicate());
|
||||||
|
|
@ -95,48 +87,57 @@ class PutCardIntoGraveFromHandLibraryAllTriggeredAbility extends TriggeredAbilit
|
||||||
|
|
||||||
private final SetTargetPointer setTargetPointer;
|
private final SetTargetPointer setTargetPointer;
|
||||||
|
|
||||||
public PutCardIntoGraveFromHandLibraryAllTriggeredAbility(Zone zone, Effect effect, boolean optional, TargetController targetController, SetTargetPointer setTargetPointer) {
|
public DesertWarfareTriggeredAbility(Zone zone, Effect effect, boolean optional, TargetController targetController, SetTargetPointer setTargetPointer) {
|
||||||
super(zone, effect, optional);
|
super(zone, effect, optional);
|
||||||
FilterCard filter = filterCard.copy();
|
FilterOwnedCard filter = filterCard.copy();
|
||||||
this.setTargetPointer = setTargetPointer;
|
this.setTargetPointer = setTargetPointer;
|
||||||
filter.add(targetController.getOwnerPredicate());
|
filter.add(targetController.getOwnerPredicate());
|
||||||
|
setTriggerPhrase("Whenever you sacrifice a Desert and whenever a Desert card is put into your graveyard from your hand or library, ");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected PutCardIntoGraveFromHandLibraryAllTriggeredAbility(final PutCardIntoGraveFromHandLibraryAllTriggeredAbility ability) {
|
protected DesertWarfareTriggeredAbility(final DesertWarfareTriggeredAbility ability) {
|
||||||
super(ability);
|
super(ability);
|
||||||
filterCard = filterCard.copy();
|
filterCard = filterCard.copy();
|
||||||
this.setTargetPointer = ability.setTargetPointer;
|
this.setTargetPointer = ability.setTargetPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PutCardIntoGraveFromHandLibraryAllTriggeredAbility copy() {
|
public DesertWarfareTriggeredAbility copy() {
|
||||||
return new PutCardIntoGraveFromHandLibraryAllTriggeredAbility(this);
|
return new DesertWarfareTriggeredAbility(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkEventType(GameEvent event, Game game) {
|
public boolean checkEventType(GameEvent event, Game game) {
|
||||||
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
|
return event.getType() == GameEvent.EventType.ZONE_CHANGE
|
||||||
|
|| event.getType() == GameEvent.EventType.SACRIFICED_PERMANENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
public boolean checkTrigger(GameEvent event, Game game) {
|
||||||
Card card = game.getCard(event.getTargetId());
|
Card card = game.getCard(event.getTargetId());
|
||||||
if (((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD
|
if (card == null) {
|
||||||
&& zone.match(game.getState().getZone(getSourceId()))
|
return false;
|
||||||
&& ((ZoneChangeEvent) event).getFromZone().match(Zone.LIBRARY)
|
|
||||||
&& card != null
|
|
||||||
&& filterCard.match(card, getControllerId(), this, game)) {
|
|
||||||
this.getEffects().setTargetPointer(new FixedTarget(card, game));
|
|
||||||
return true;
|
|
||||||
} else if (((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD
|
|
||||||
&& zone.match(game.getState().getZone(getSourceId()))
|
|
||||||
&& ((ZoneChangeEvent) event).getFromZone().match(Zone.HAND)
|
|
||||||
&& card != null
|
|
||||||
&& filterCard.match(card, getControllerId(), this, game)) {
|
|
||||||
this.getEffects().setTargetPointer(new FixedTarget(card, game));
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
switch (event.getType()) {
|
||||||
|
case SACRIFICED_PERMANENT:
|
||||||
|
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId());
|
||||||
|
if (permanent == null || !permanent.hasSubtype(SubType.DESERT, game)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ZONE_CHANGE:
|
||||||
|
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
|
||||||
|
if (zEvent.getToZone() != Zone.GRAVEYARD
|
||||||
|
|| (zEvent.getFromZone() != Zone.LIBRARY && zEvent.getFromZone() != Zone.HAND)
|
||||||
|
|| !filterCard.match(card, getControllerId(), this, game)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.getEffects().setTargetPointer(new FixedTarget(event.getTargetId(), game));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -144,6 +145,7 @@ class DesertWarfareReturnEffect extends OneShotEffect {
|
||||||
|
|
||||||
DesertWarfareReturnEffect() {
|
DesertWarfareReturnEffect() {
|
||||||
super(Outcome.Benefit);
|
super(Outcome.Benefit);
|
||||||
|
this.staticText = "put that card onto the battlefield under your control";
|
||||||
}
|
}
|
||||||
|
|
||||||
private DesertWarfareReturnEffect(final DesertWarfareReturnEffect effect) {
|
private DesertWarfareReturnEffect(final DesertWarfareReturnEffect effect) {
|
||||||
|
|
@ -185,16 +187,39 @@ class DesertWarfareCreateTokensEffect extends OneShotEffect {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
Player player = game.getPlayer(source.getControllerId());
|
if (source.getControllerId() == null) {
|
||||||
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
|
|
||||||
if (player == null || permanent == null) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int deserts = game.getBattlefield().countAll(new FilterLandPermanent(SubType.DESERT, "Deserts"), game.getControllerId(source.getSourceId()), game);
|
int deserts = DesertsYouControlCount.instance.calculate(game, source, this);
|
||||||
Token token = new SandWarriorToken();
|
Token token = new SandWarriorToken();
|
||||||
token.putOntoBattlefield(deserts, game, source);
|
token.putOntoBattlefield(deserts, game, source);
|
||||||
game.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom)
|
game.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom)
|
||||||
.setTargetPointer(new FixedTargets(token, game)), source);
|
.setTargetPointer(new FixedTargets(token, game)), source);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum DesertsYouControlCount implements DynamicValue {
|
||||||
|
instance;
|
||||||
|
|
||||||
|
private static final Hint hint = new ValueHint("Deserts you control", instance);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||||
|
return new PermanentsOnBattlefieldCount(new FilterControlledPermanent(SubType.DESERT)).calculate(game, sourceAbility, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DynamicValue copy() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Hint getHint() {
|
||||||
|
return hint;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
package mage.abilities.dynamicvalue.common;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.DynamicValue;
|
|
||||||
import mage.abilities.effects.Effect;
|
|
||||||
import mage.constants.SubType;
|
|
||||||
import mage.filter.common.FilterControlledPermanent;
|
|
||||||
import mage.game.Game;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Sidorovich77
|
|
||||||
*/
|
|
||||||
public enum DesertsYouControlCount implements DynamicValue {
|
|
||||||
|
|
||||||
instance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
|
||||||
return game.getBattlefield().count(new FilterControlledPermanent(SubType.DESERT), sourceAbility.getControllerId(), sourceAbility, game);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DesertsYouControlCount copy() {
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "X";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getMessage() {
|
|
||||||
return "deserts you control";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,26 +1 @@
|
||||||
package mage.abilities.hint.common;
|
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
|
||||||
import mage.abilities.dynamicvalue.common.DesertsYouControlCount;
|
|
||||||
import mage.abilities.hint.Hint;
|
|
||||||
import mage.abilities.hint.ValueHint;
|
|
||||||
import mage.game.Game;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author JayDi85
|
|
||||||
*/
|
|
||||||
public enum DesertsYouControlHint implements Hint {
|
|
||||||
|
|
||||||
instance;
|
|
||||||
private static final Hint hint = new ValueHint("Deserts you control", DesertsYouControlCount.instance);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getText(Game game, Ability ability) {
|
|
||||||
return hint.getText(game, ability);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Hint copy() {
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue