Implemented Yidaro, Wandering Monster

This commit is contained in:
Evan Kranzler 2020-04-12 18:21:27 -04:00
parent 7e86626f1d
commit 297710c7fa
3 changed files with 154 additions and 9 deletions

View file

@ -0,0 +1,139 @@
package mage.cards.y;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.CycleTriggeredAbility;
import mage.abilities.costs.common.CyclingDiscardCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.CyclingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.stack.StackObject;
import mage.players.Player;
import mage.watchers.Watcher;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class YidaroWanderingMonster extends CardImpl {
public YidaroWanderingMonster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.DINOSAUR);
this.subtype.add(SubType.TURTLE);
this.power = new MageInt(8);
this.toughness = new MageInt(8);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// Cycling {1}{R}
this.addAbility(new CyclingAbility(new ManaCostsImpl("{1}{R}")));
// When you cycle Yidaro, Wandering Monster, shuffle it into your library from your graveyard. If you've cycled a card named Yidaro, Wandering Monster four or more times this game, put it onto the battlefield from your graveyard instead.
this.addAbility(new CycleTriggeredAbility(new YidaroWanderingMonsterEffect()));
}
private YidaroWanderingMonster(final YidaroWanderingMonster card) {
super(card);
}
@Override
public YidaroWanderingMonster copy() {
return new YidaroWanderingMonster(this);
}
}
class YidaroWanderingMonsterEffect extends OneShotEffect {
YidaroWanderingMonsterEffect() {
super(Outcome.Benefit);
staticText = "shuffle it into your library from your graveyard. " +
"If you've cycled a card named Yidaro, Wandering Monster four or more times this game, " +
"put it onto the battlefield from your graveyard instead.";
}
private YidaroWanderingMonsterEffect(final YidaroWanderingMonsterEffect effect) {
super(effect);
}
@Override
public YidaroWanderingMonsterEffect copy() {
return new YidaroWanderingMonsterEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
MageObjectReference cycledCard = source
.getCosts()
.stream()
.filter(CyclingDiscardCost.class::isInstance)
.map(CyclingDiscardCost.class::cast)
.map(CyclingDiscardCost::getCycledCard)
.findFirst()
.orElse(null);
if (cycledCard == null || game.getState().getZone(cycledCard.getSourceId()) != Zone.GRAVEYARD) {
return false;
}
Card card = cycledCard.getCard(game);
if (card == null) {
return false;
}
YidaroWanderingMonsterWatcher watcher = game.getState().getWatcher(YidaroWanderingMonsterWatcher.class);
Zone zone;
if (watcher == null || watcher.getYidaroCount(player.getId()) < 4) {
player.putCardsOnBottomOfLibrary(card, game, source, true);
player.shuffleLibrary(source, game);
} else {
player.moveCards(card, Zone.BATTLEFIELD, source, game);
}
return true;
}
}
class YidaroWanderingMonsterWatcher extends Watcher {
private Map<UUID, Integer> countMap = new HashMap();
YidaroWanderingMonsterWatcher() {
super(WatcherScope.GAME);
}
@Override
public void watch(GameEvent event, Game game) {
StackObject object = game.getStack().getStackObject(event.getSourceId());
if (object == null || !(object.getStackAbility() instanceof CyclingAbility)) {
return;
}
Card card = game.getCard(object.getSourceId());
if (card != null && "Yidaro, Wandering Monster".equals(card.getName())) {
countMap.putIfAbsent(object.getControllerId(), 0);
countMap.compute(object.getControllerId(), (u, i) -> i + 1);
}
}
int getYidaroCount(UUID playerId) {
return countMap.getOrDefault(playerId, 0);
}
}

View file

@ -305,6 +305,7 @@ public final class IkoriaLairOfBehemoths extends ExpansionSet {
cards.add(new SetCardInfo("Wind-Scarred Crag", 258, Rarity.COMMON, mage.cards.w.WindScarredCrag.class)); cards.add(new SetCardInfo("Wind-Scarred Crag", 258, Rarity.COMMON, mage.cards.w.WindScarredCrag.class));
cards.add(new SetCardInfo("Wingfold Pteron", 71, Rarity.COMMON, mage.cards.w.WingfoldPteron.class)); cards.add(new SetCardInfo("Wingfold Pteron", 71, Rarity.COMMON, mage.cards.w.WingfoldPteron.class));
cards.add(new SetCardInfo("Wingspan Mentor", 72, Rarity.UNCOMMON, mage.cards.w.WingspanMentor.class)); cards.add(new SetCardInfo("Wingspan Mentor", 72, Rarity.UNCOMMON, mage.cards.w.WingspanMentor.class));
cards.add(new SetCardInfo("Yidaro, Wandering Monster", 141, Rarity.RARE, mage.cards.y.YidaroWanderingMonster.class));
cards.add(new SetCardInfo("Zagoth Crystal", 242, Rarity.UNCOMMON, mage.cards.z.ZagothCrystal.class)); cards.add(new SetCardInfo("Zagoth Crystal", 242, Rarity.UNCOMMON, mage.cards.z.ZagothCrystal.class));
cards.add(new SetCardInfo("Zagoth Mamba", 106, Rarity.UNCOMMON, mage.cards.z.ZagothMamba.class)); cards.add(new SetCardInfo("Zagoth Mamba", 106, Rarity.UNCOMMON, mage.cards.z.ZagothMamba.class));
cards.add(new SetCardInfo("Zagoth Triome", 259, Rarity.RARE, mage.cards.z.ZagothTriome.class)); cards.add(new SetCardInfo("Zagoth Triome", 259, Rarity.RARE, mage.cards.z.ZagothTriome.class));

View file

@ -1,13 +1,6 @@
/**
*
* @author jeffwadsworth
*/
package mage.abilities.costs.common; package mage.abilities.costs.common;
import java.util.UUID; import mage.MageObjectReference;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
import mage.abilities.costs.CostImpl; import mage.abilities.costs.CostImpl;
@ -16,12 +9,19 @@ import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.players.Player; import mage.players.Player;
import java.util.UUID;
/**
* @author jeffwadsworth
*/
public class CyclingDiscardCost extends CostImpl { public class CyclingDiscardCost extends CostImpl {
private MageObjectReference cycledCard = null;
public CyclingDiscardCost() { public CyclingDiscardCost() {
} }
public CyclingDiscardCost(CyclingDiscardCost cost) { private CyclingDiscardCost(CyclingDiscardCost cost) {
super(cost); super(cost);
} }
@ -39,6 +39,7 @@ public class CyclingDiscardCost extends CostImpl {
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.CYCLE_CARD, card.getId(), card.getId(), card.getOwnerId())); game.fireEvent(GameEvent.getEvent(GameEvent.EventType.CYCLE_CARD, card.getId(), card.getId(), card.getOwnerId()));
paid = player.discard(card, null, game); paid = player.discard(card, null, game);
if (paid) { if (paid) {
cycledCard = new MageObjectReference(card, game);
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.CYCLED_CARD, card.getId(), card.getId(), card.getOwnerId())); game.fireEvent(GameEvent.getEvent(GameEvent.EventType.CYCLED_CARD, card.getId(), card.getId(), card.getOwnerId()));
} }
} }
@ -55,4 +56,8 @@ public class CyclingDiscardCost extends CostImpl {
public CyclingDiscardCost copy() { public CyclingDiscardCost copy() {
return new CyclingDiscardCost(this); return new CyclingDiscardCost(this);
} }
public MageObjectReference getCycledCard() {
return cycledCard;
}
} }