mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
fixes on new cards
This commit is contained in:
parent
98f910a892
commit
425858e413
11 changed files with 93 additions and 65 deletions
|
|
@ -51,7 +51,7 @@ public final class AmpedRaptor extends CardImpl {
|
|||
ability.addEffect(new ConditionalOneShotEffect(
|
||||
new AmpedRaptorEffect(),
|
||||
CastFromHandSourcePermanentCondition.instance
|
||||
));
|
||||
).concatBy("Then"));
|
||||
this.addAbility(ability, new CastFromHandWatcher());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,10 +44,11 @@ public final class AshlingFlameDancer extends CardImpl {
|
|||
Outcome.Damage, 2,
|
||||
new DamagePlayersEffect(2, TargetController.OPPONENT),
|
||||
new DamageAllEffect(2, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)
|
||||
.setText("and each creature they control")
|
||||
));
|
||||
ability.addEffect(new IfAbilityHasResolvedXTimesEffect(
|
||||
3, new BasicManaEffect(Mana.RedMana(4))
|
||||
));
|
||||
).setText("If it's the third time, add {R}{R}{R}{R}"));
|
||||
this.addAbility(ability, new AbilityResolvedWatcher());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ package mage.cards.i;
|
|||
import mage.abilities.Ability;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CounterTargetEffect;
|
||||
import mage.abilities.effects.common.FlipCoinEffect;
|
||||
import mage.abilities.effects.common.InfoEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
|
|
@ -24,7 +26,12 @@ public final class InvertPolarity extends CardImpl {
|
|||
|
||||
// Choose target spell, then flip a coin. If you win the flip, gain control of that spell and you may choose new targets for it. If you lose the flip, counter that spell.
|
||||
this.getSpellAbility().addTarget(new TargetSpell());
|
||||
this.getSpellAbility().addEffect(new InvertPolarityTargetEffect());
|
||||
this.getSpellAbility().addEffect(new InfoEffect("Choose target spell"));
|
||||
this.getSpellAbility().addEffect(new FlipCoinEffect(
|
||||
new InvertPolarityGainControlTargetEffect(),
|
||||
new CounterTargetEffect().setText("counter that spell"),
|
||||
Outcome.Detriment
|
||||
).concatBy(", then"));
|
||||
}
|
||||
|
||||
private InvertPolarity(final InvertPolarity card) {
|
||||
|
|
@ -37,46 +44,11 @@ public final class InvertPolarity extends CardImpl {
|
|||
}
|
||||
}
|
||||
|
||||
class InvertPolarityTargetEffect extends OneShotEffect {
|
||||
|
||||
InvertPolarityTargetEffect() {
|
||||
super(Outcome.Detriment);
|
||||
staticText = "choose target spell, then flip a coin. If you win the flip, gain control of that spell "
|
||||
+ "and you may choose new targets for it. If you lose the flip, counter that spell";
|
||||
}
|
||||
|
||||
private InvertPolarityTargetEffect(final InvertPolarityTargetEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InvertPolarityTargetEffect copy() {
|
||||
return new InvertPolarityTargetEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
if (player.flipCoin(source, game, true)) {
|
||||
new InvertPolarityGainControlTargetEffect()
|
||||
.setTargetPointer(getTargetPointer().copy())
|
||||
.apply(game, source);
|
||||
} else {
|
||||
new CounterTargetEffect()
|
||||
.setTargetPointer(getTargetPointer().copy())
|
||||
.apply(game, source);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class InvertPolarityGainControlTargetEffect extends OneShotEffect {
|
||||
|
||||
InvertPolarityGainControlTargetEffect() {
|
||||
super(Outcome.GainControl);
|
||||
staticText = "gain control of that spell and you may choose new targets for it";
|
||||
}
|
||||
|
||||
private InvertPolarityGainControlTargetEffect(final InvertPolarityGainControlTargetEffect effect) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
package mage.cards.l;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.costs.Cost;
|
||||
import mage.abilities.costs.common.PayEnergyCost;
|
||||
|
|
@ -23,14 +21,15 @@ import mage.filter.predicate.mageobject.PowerPredicate;
|
|||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author grimreap124
|
||||
*/
|
||||
public final class LocalizedDestruction extends CardImpl {
|
||||
|
||||
public LocalizedDestruction(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[] { CardType.SORCERY }, "{3}{W}{W}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{W}{W}");
|
||||
|
||||
// You get {E}, then you may pay one or more {E}. If you do, each creature you control with power equal to the amount of paid this way gains indestructible until end of turn.
|
||||
|
||||
|
|
@ -58,7 +57,7 @@ class LocalizedDestructionEffect extends OneShotEffect {
|
|||
|
||||
LocalizedDestructionEffect() {
|
||||
super(Outcome.AddAbility);
|
||||
this.staticText = ", then you may pay one or more {E}. If you do, each creature you control with power equal to the amount of paid this way gains indestructible until end of turn";
|
||||
this.staticText = ", then you may pay one or more {E}. If you do, each creature you control with power equal to the amount of {E} paid this way gains indestructible until end of turn";
|
||||
}
|
||||
|
||||
private LocalizedDestructionEffect(final LocalizedDestructionEffect effect) {
|
||||
|
|
@ -89,10 +88,10 @@ class LocalizedDestructionEffect extends OneShotEffect {
|
|||
}
|
||||
|
||||
int numberToPay = controller.getAmount(1, totalEnergy,
|
||||
"Pay one or more {E}", game);
|
||||
|
||||
"Pay one or more {E}", game);
|
||||
|
||||
Cost cost = new PayEnergyCost(numberToPay);
|
||||
|
||||
|
||||
if (cost.pay(source, game, source, source.getControllerId(), true)) {
|
||||
FilterPermanent filter = new FilterPermanent();
|
||||
filter.add(new PowerPredicate(ComparisonType.EQUAL_TO, numberToPay));
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@ import mage.constants.*;
|
|||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.ZoneChangeEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.PermanentToken;
|
||||
import mage.players.Player;
|
||||
|
||||
import java.util.UUID;
|
||||
|
|
@ -130,6 +132,13 @@ class NecrodominanceReplacementEffect extends ReplacementEffectImpl {
|
|||
return false;
|
||||
}
|
||||
Card card = game.getCard(event.getTargetId());
|
||||
return card != null && card.isOwnedBy(source.getControllerId());
|
||||
if (card != null && card.isOwnedBy(source.getControllerId())) {
|
||||
return true;
|
||||
}
|
||||
Permanent token = game.getPermanent(event.getTargetId());
|
||||
if (token != null && token instanceof PermanentToken && token.isOwnedBy(source.getControllerId())) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ public final class PearlEarImperialAdvisor extends CardImpl {
|
|||
);
|
||||
|
||||
private static final FilterPermanent filterModified = new FilterControlledPermanent();
|
||||
private static final FilterSpell filterAura = new FilterSpell("Aura spell that targets a modified permanent you control");
|
||||
private static final FilterSpell filterAura = new FilterSpell("an Aura spell that targets a modified permanent you control");
|
||||
|
||||
static {
|
||||
filterModified.add(ModifiedPredicate.instance);
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
package mage.cards.t;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.constants.SubType;
|
||||
import mage.game.permanent.token.TarmogoyfToken;
|
||||
import mage.target.common.TargetLandPermanent;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
|
|
@ -13,22 +9,23 @@ import mage.abilities.effects.Effect;
|
|||
import mage.abilities.effects.common.AttachEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
|
||||
import mage.constants.Outcome;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.abilities.keyword.EnchantAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.AttachmentType;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.*;
|
||||
import mage.game.permanent.token.TarmogoyfToken;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetLandPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author grimreap124
|
||||
*/
|
||||
public final class TarmogoyfNest extends CardImpl {
|
||||
|
||||
public TarmogoyfNest(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[] { CardType.TRIBAL, CardType.ENCHANTMENT }, "{2}{G}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.TRIBAL, CardType.ENCHANTMENT}, "{2}{G}");
|
||||
|
||||
this.subtype.add(SubType.LHURGOYF);
|
||||
this.subtype.add(SubType.AURA);
|
||||
|
|
@ -43,7 +40,7 @@ public final class TarmogoyfNest extends CardImpl {
|
|||
Ability gainedAbility = new SimpleActivatedAbility(new CreateTokenEffect(new TarmogoyfToken()),
|
||||
new TapSourceCost());
|
||||
gainedAbility.addCost(new ManaCostsImpl<>("{1}{G}"));
|
||||
Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA);
|
||||
Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield, null, "land");
|
||||
this.addAbility(new SimpleStaticAbility(effect));
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ class WheelOfPotentialEffect extends OneShotEffect {
|
|||
player.drawCards(numberPaid, source, game);
|
||||
}
|
||||
if (numberPaid >= 7) {
|
||||
game.getState().applyEffects(game);
|
||||
game.getState().processAction(game);
|
||||
cardsExiled.removeIf(cardId -> {
|
||||
Card card = game.getCard(cardId);
|
||||
return card == null || !card.getOwnerId().equals(controller.getId());
|
||||
|
|
|
|||
|
|
@ -0,0 +1,51 @@
|
|||
package org.mage.test.cards.single.mh3;
|
||||
|
||||
import mage.constants.PhaseStep;
|
||||
import mage.constants.Zone;
|
||||
import org.junit.Test;
|
||||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public class NecrodominanceTest extends CardTestPlayerBase {
|
||||
|
||||
/**
|
||||
* {@link mage.cards.n.Necrodominance Necrodominance} {B}{B}{B}
|
||||
* Legendary Enchantment
|
||||
* Skip your draw step.
|
||||
* At the beginning of your end step, you may pay any amount of life. If you do, draw that many cards.
|
||||
* Your maximum hand size is five.
|
||||
* If a card or token would be put into your graveyard from anywhere, exile it instead.
|
||||
*/
|
||||
private static final String necro = "Necrodominance";
|
||||
|
||||
@Test
|
||||
public void test_ReplacementEffect() {
|
||||
setStrictChooseMode(true);
|
||||
|
||||
addCard(Zone.BATTLEFIELD, playerA, necro);
|
||||
// Whenever a creature you control dies, each opponent loses 1 life.
|
||||
// Whenever a creature an opponent controls dies, you gain 1 life.
|
||||
addCard(Zone.BATTLEFIELD, playerA, "The Meathook Massacre");
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Grizzly Bears", 1);
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Grizzly Bears", 2);
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 8);
|
||||
addCard(Zone.HAND, playerA, "Gisa's Bidding"); // Create 2 2/2 black zombie creature tokens
|
||||
addCard(Zone.HAND, playerA, "Damnation");
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gisa's Bidding", true);
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Damnation");
|
||||
// A single trigger from playerB's Bears
|
||||
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
execute();
|
||||
|
||||
assertLife(playerA, 20 + 1);
|
||||
assertLife(playerB, 20);
|
||||
assertPermanentCount(playerA, 10); // 8 lands, 2 enchantments
|
||||
assertGraveyardCount(playerA, 0);
|
||||
assertGraveyardCount(playerB, 1);
|
||||
assertExileCount(playerA, 4);
|
||||
}
|
||||
}
|
||||
|
|
@ -160,8 +160,7 @@ public class VerifyCardDataTest {
|
|||
// rarity
|
||||
// skipListAddName(SKIP_LIST_RARITY, set, cardName);
|
||||
skipListAddName(SKIP_LIST_RARITY, "CMR", "The Prismatic Piper"); // Collation is not yet set up for CMR https://www.lethe.xyz/mtg/collation/cmr.html
|
||||
skipListAddName(SKIP_LIST_RARITY, "SPG", "Thought-Knot Seer"); // temporary
|
||||
|
||||
|
||||
// missing abilities
|
||||
// skipListAddName(SKIP_LIST_MISSING_ABILITIES, set, cardName);
|
||||
|
||||
|
|
|
|||
|
|
@ -23,10 +23,10 @@ public class IfAbilityHasResolvedXTimesEffect extends OneShotEffect {
|
|||
this(effect.getOutcome(), resolutionNumber, effect);
|
||||
}
|
||||
|
||||
public IfAbilityHasResolvedXTimesEffect(Outcome outcome, int resolutionNumber, Effect... effect) {
|
||||
public IfAbilityHasResolvedXTimesEffect(Outcome outcome, int resolutionNumber, Effect... effects) {
|
||||
super(outcome);
|
||||
this.resolutionNumber = resolutionNumber;
|
||||
this.effects = new Effects(effect);
|
||||
this.effects = new Effects(effects);
|
||||
}
|
||||
|
||||
private IfAbilityHasResolvedXTimesEffect(final IfAbilityHasResolvedXTimesEffect effect) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue