mirror of
https://github.com/correl/mage.git
synced 2025-01-13 19:11:33 +00:00
[SLD] Implemented Zangief, the Red Cyclone
This commit is contained in:
parent
f4927f5ae0
commit
5f3cb1c9f8
2 changed files with 147 additions and 7 deletions
143
Mage.Sets/src/mage/cards/z/ZangiefTheRedCyclone.java
Normal file
143
Mage.Sets/src/mage/cards/z/ZangiefTheRedCyclone.java
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
package mage.cards.z;
|
||||||
|
|
||||||
|
import mage.MageInt;
|
||||||
|
import mage.MageObjectReference;
|
||||||
|
import mage.abilities.Ability;
|
||||||
|
import mage.abilities.common.DealsDamageToACreatureTriggeredAbility;
|
||||||
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
|
import mage.abilities.condition.common.MyTurnCondition;
|
||||||
|
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||||
|
import mage.abilities.effects.OneShotEffect;
|
||||||
|
import mage.abilities.effects.common.SacrificeEffect;
|
||||||
|
import mage.abilities.effects.common.combat.MustBeBlockedByAtLeastOneSourceEffect;
|
||||||
|
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||||
|
import mage.abilities.keyword.IndestructibleAbility;
|
||||||
|
import mage.cards.CardImpl;
|
||||||
|
import mage.cards.CardSetInfo;
|
||||||
|
import mage.constants.*;
|
||||||
|
import mage.filter.FilterPermanent;
|
||||||
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
|
import mage.filter.common.FilterNonlandPermanent;
|
||||||
|
import mage.filter.predicate.Predicates;
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.game.events.DamagedEvent;
|
||||||
|
import mage.game.events.GameEvent;
|
||||||
|
import mage.game.permanent.Permanent;
|
||||||
|
import mage.target.targetpointer.FixedTarget;
|
||||||
|
import mage.watchers.Watcher;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author TheElk801
|
||||||
|
*/
|
||||||
|
public final class ZangiefTheRedCyclone extends CardImpl {
|
||||||
|
|
||||||
|
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(ZangiefTheRedCycloneWatcher::checkPermanent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZangiefTheRedCyclone(UUID ownerId, CardSetInfo setInfo) {
|
||||||
|
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{R}{G}");
|
||||||
|
|
||||||
|
this.addSuperType(SuperType.LEGENDARY);
|
||||||
|
this.subtype.add(SubType.HUMAN);
|
||||||
|
this.subtype.add(SubType.WARRIOR);
|
||||||
|
this.power = new MageInt(7);
|
||||||
|
this.toughness = new MageInt(4);
|
||||||
|
|
||||||
|
// Zangief, the Red Cyclone must be blocked if able.
|
||||||
|
this.addAbility(new SimpleStaticAbility(new MustBeBlockedByAtLeastOneSourceEffect(Duration.WhileOnBattlefield)));
|
||||||
|
|
||||||
|
// Iron Muscle—As long as it's your turn, Zangief has indestructible.
|
||||||
|
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||||
|
new GainAbilitySourceEffect(IndestructibleAbility.getInstance()),
|
||||||
|
MyTurnCondition.instance, "as long as it's your turn, {this} has indestructible"
|
||||||
|
)).withFlavorWord("Iron Muscle"));
|
||||||
|
|
||||||
|
// Spinning Piledriver—Whenever Zangief deals damage to a creature, if that creature was dealt excess damage this turn, that creature's controller sacrifices a noncreature, nonland permanent.
|
||||||
|
this.addAbility(new DealsDamageToACreatureTriggeredAbility(
|
||||||
|
new ZangiefTheRedCycloneEffect(), false, false, true, filter
|
||||||
|
).withFlavorWord("Spinning Piledriver"), new ZangiefTheRedCycloneWatcher());
|
||||||
|
}
|
||||||
|
|
||||||
|
private ZangiefTheRedCyclone(final ZangiefTheRedCyclone card) {
|
||||||
|
super(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ZangiefTheRedCyclone copy() {
|
||||||
|
return new ZangiefTheRedCyclone(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ZangiefTheRedCycloneEffect extends OneShotEffect {
|
||||||
|
|
||||||
|
private static final FilterPermanent filter = new FilterNonlandPermanent("noncreature, nonland permanent");
|
||||||
|
|
||||||
|
static {
|
||||||
|
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
|
||||||
|
}
|
||||||
|
|
||||||
|
ZangiefTheRedCycloneEffect() {
|
||||||
|
super(Outcome.Benefit);
|
||||||
|
staticText = "if that creature was dealt excess damage this turn, " +
|
||||||
|
"that creature's controller sacrifices a noncreature, nonland permanent";
|
||||||
|
}
|
||||||
|
|
||||||
|
private ZangiefTheRedCycloneEffect(final ZangiefTheRedCycloneEffect effect) {
|
||||||
|
super(effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ZangiefTheRedCycloneEffect copy() {
|
||||||
|
return new ZangiefTheRedCycloneEffect(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(Game game, Ability source) {
|
||||||
|
Permanent permanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
|
||||||
|
if (permanent == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return new SacrificeEffect(filter, 1, "")
|
||||||
|
.setTargetPointer(new FixedTarget(permanent.getControllerId(), game))
|
||||||
|
.apply(game, source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ZangiefTheRedCycloneWatcher extends Watcher {
|
||||||
|
|
||||||
|
private final Set<MageObjectReference> morSet = new HashSet<>();
|
||||||
|
|
||||||
|
ZangiefTheRedCycloneWatcher() {
|
||||||
|
super(WatcherScope.GAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void watch(GameEvent event, Game game) {
|
||||||
|
if (event.getType() == GameEvent.EventType.DAMAGED_PERMANENT
|
||||||
|
&& ((DamagedEvent) event).getExcess() >= 1) {
|
||||||
|
morSet.add(new MageObjectReference(event.getTargetId(), game));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
super.reset();
|
||||||
|
morSet.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean checkPermanent(Permanent input, Game game) {
|
||||||
|
return game
|
||||||
|
.getState()
|
||||||
|
.getWatcher(ZangiefTheRedCycloneWatcher.class)
|
||||||
|
.morSet
|
||||||
|
.stream()
|
||||||
|
.anyMatch(mor -> mor.refersTo(input, game));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,9 @@
|
||||||
|
|
||||||
package mage.abilities.common;
|
package mage.abilities.common;
|
||||||
|
|
||||||
import mage.constants.Zone;
|
|
||||||
import mage.abilities.TriggeredAbilityImpl;
|
import mage.abilities.TriggeredAbilityImpl;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
|
import mage.constants.Zone;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.DamagedEvent;
|
import mage.game.events.DamagedEvent;
|
||||||
|
@ -12,7 +12,6 @@ import mage.game.permanent.Permanent;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
import mage.target.targetpointer.FixedTarget;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author LevelX
|
* @author LevelX
|
||||||
*/
|
*/
|
||||||
public class DealsDamageToACreatureTriggeredAbility extends TriggeredAbilityImpl {
|
public class DealsDamageToACreatureTriggeredAbility extends TriggeredAbilityImpl {
|
||||||
|
@ -43,7 +42,7 @@ public class DealsDamageToACreatureTriggeredAbility extends TriggeredAbilityImpl
|
||||||
public DealsDamageToACreatureTriggeredAbility copy() {
|
public DealsDamageToACreatureTriggeredAbility copy() {
|
||||||
return new DealsDamageToACreatureTriggeredAbility(this);
|
return new DealsDamageToACreatureTriggeredAbility(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkEventType(GameEvent event, Game game) {
|
public boolean checkEventType(GameEvent event, Game game) {
|
||||||
return event.getType() == GameEvent.EventType.DAMAGED_PERMANENT;
|
return event.getType() == GameEvent.EventType.DAMAGED_PERMANENT;
|
||||||
|
@ -60,10 +59,8 @@ public class DealsDamageToACreatureTriggeredAbility extends TriggeredAbilityImpl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (setTargetPointer) {
|
if (setTargetPointer) {
|
||||||
for (Effect effect : this.getEffects()) {
|
this.getEffects().setTargetPointer(new FixedTarget(event.getTargetId(), game));
|
||||||
effect.setTargetPointer(new FixedTarget(event.getTargetId(), game));
|
this.getEffects().setValue("damage", event.getAmount());
|
||||||
effect.setValue("damage", event.getAmount());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue