mirror of
https://github.com/correl/mage.git
synced 2025-03-31 01:07:39 -09:00
fixed Rhythm of the Wild not giving Riot to creatures that weren't cast
This commit is contained in:
parent
481b5f04ea
commit
34e3bb42db
4 changed files with 134 additions and 19 deletions
Mage.Sets/src/mage/cards
Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords
Mage/src/main/java/mage/abilities/keyword
|
@ -1,7 +1,6 @@
|
|||
|
||||
package mage.cards.m;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
|
@ -10,7 +9,10 @@ import mage.abilities.effects.ReplacementEffectImpl;
|
|||
import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.EntersTheBattlefieldEvent;
|
||||
|
@ -19,14 +21,15 @@ import mage.game.events.GameEvent.EventType;
|
|||
import mage.game.permanent.Permanent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class MasterBiomancer extends CardImpl {
|
||||
|
||||
public MasterBiomancer(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}{U}");
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{U}");
|
||||
this.subtype.add(SubType.ELF);
|
||||
this.subtype.add(SubType.WIZARD);
|
||||
|
||||
|
@ -34,10 +37,10 @@ public final class MasterBiomancer extends CardImpl {
|
|||
this.toughness = new MageInt(4);
|
||||
|
||||
// Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to Master Biomancer's power and as a Mutant in addition to its other types.
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MasterBiomancerEntersBattlefieldEffect()));
|
||||
this.addAbility(new SimpleStaticAbility(new MasterBiomancerEntersBattlefieldEffect()));
|
||||
}
|
||||
|
||||
public MasterBiomancer(final MasterBiomancer card) {
|
||||
private MasterBiomancer(final MasterBiomancer card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
|
@ -49,12 +52,12 @@ public final class MasterBiomancer extends CardImpl {
|
|||
|
||||
class MasterBiomancerEntersBattlefieldEffect extends ReplacementEffectImpl {
|
||||
|
||||
public MasterBiomancerEntersBattlefieldEffect() {
|
||||
MasterBiomancerEntersBattlefieldEffect() {
|
||||
super(Duration.WhileOnBattlefield, Outcome.BoostCreature);
|
||||
staticText = "Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to Master Biomancer's power and as a Mutant in addition to its other types";
|
||||
staticText = "Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to {this}'s power and as a Mutant in addition to its other types";
|
||||
}
|
||||
|
||||
public MasterBiomancerEntersBattlefieldEffect(MasterBiomancerEntersBattlefieldEffect effect) {
|
||||
private MasterBiomancerEntersBattlefieldEffect(MasterBiomancerEntersBattlefieldEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,17 +1,21 @@
|
|||
package mage.cards.r;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.ContinuousEffect;
|
||||
import mage.abilities.effects.ReplacementEffectImpl;
|
||||
import mage.abilities.effects.common.CantBeCounteredControlledEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.abilities.keyword.RiotAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.TargetController;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.FilterSpell;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
|
@ -19,6 +23,14 @@ import mage.filter.common.FilterCreatureSpell;
|
|||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.permanent.ControllerPredicate;
|
||||
import mage.filter.predicate.permanent.TokenPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.EntersTheBattlefieldEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
|
@ -44,8 +56,7 @@ public final class RhythmOfTheWild extends CardImpl {
|
|||
)));
|
||||
|
||||
// Nontoken creatures you control have riot.
|
||||
Ability ability = new SimpleStaticAbility(new GainAbilityControlledSpellsEffect(
|
||||
new RiotAbility(), new FilterCreatureSpell()).setText("Nontoken creatures you control have riot. <i>(They enter the battlefield with your choice of a +1/+1 counter or haste.)</i>"));
|
||||
Ability ability = new SimpleStaticAbility(new RhythmOfTheWildEffect());
|
||||
ability.addEffect(new GainAbilityControlledEffect(
|
||||
new RiotAbility(), Duration.WhileOnBattlefield, filter2
|
||||
).setText(""));
|
||||
|
@ -61,3 +72,55 @@ public final class RhythmOfTheWild extends CardImpl {
|
|||
return new RhythmOfTheWild(this);
|
||||
}
|
||||
}
|
||||
|
||||
class RhythmOfTheWildEffect extends ReplacementEffectImpl {
|
||||
|
||||
RhythmOfTheWildEffect() {
|
||||
super(Duration.WhileOnBattlefield, Outcome.BoostCreature);
|
||||
staticText = "Nontoken creatures you control have riot. " +
|
||||
"<i>(They enter the battlefield with your choice of a +1/+1 counter or haste.)</i>";
|
||||
}
|
||||
|
||||
private RhythmOfTheWildEffect(RhythmOfTheWildEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checksEventType(GameEvent event, Game game) {
|
||||
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
|
||||
return creature != null
|
||||
&& creature.isControlledBy(source.getControllerId())
|
||||
&& creature.isCreature();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
||||
Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
if (creature == null || player == null) {
|
||||
return false;
|
||||
}
|
||||
if (player.chooseUse(
|
||||
outcome, "Have " + creature.getLogName() + " enter the battlefield with a +1/+1 counter on it or with haste?",
|
||||
null, "+1/+1 counter", "Haste", source, game
|
||||
)) {
|
||||
game.informPlayers(player.getLogName() + " choose to put a +1/+1 counter on " + creature.getName());
|
||||
creature.addCounters(CounterType.P1P1.createInstance(), source, game, event.getAppliedEffects());
|
||||
} else {
|
||||
ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom);
|
||||
effect.setTargetPointer(new FixedTarget(creature.getId(), creature.getZoneChangeCounter(game) + 1));
|
||||
game.addEffect(effect, source);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RhythmOfTheWildEffect copy() {
|
||||
return new RhythmOfTheWildEffect(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ import org.junit.Test;
|
|||
import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class RiotTest extends CardTestPlayerBase {
|
||||
|
@ -17,7 +16,7 @@ public class RiotTest extends CardTestPlayerBase {
|
|||
* A creature with riot enters the battlefield with a +1/+1 counter on it or
|
||||
* with haste, its controller's choice. This choice is made as the creature
|
||||
* enters the battlefield, so no one can respond to the choice.
|
||||
*
|
||||
* <p>
|
||||
* The creature will have the chosen bonus the moment it enters the
|
||||
* battlefield. If you choose to have the creature gain haste, it keeps
|
||||
* haste even after the turn ends. This could matter if another player gains
|
||||
|
@ -113,4 +112,56 @@ public class RiotTest extends CardTestPlayerBase {
|
|||
assertAbility(playerA, "Silvercoat Lion", HasteAbility.getInstance(), true);
|
||||
assertAbility(playerA, "Silvercoat Lion", new RiotAbility(), true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void RiotRhythmOfTheWildNotCastBoost() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
|
||||
|
||||
// Creature spells you control can't be countered.
|
||||
// Nontoken creatures you control have riot.
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Rhythm of the Wild", 1);
|
||||
|
||||
// Riot (This creature enters the battleifled with your choice of a +1/+1 counter or haste.)
|
||||
addCard(Zone.HAND, playerA, "Exhume", 1); // Each player returns a creature card from their graveyard to the battlefield
|
||||
addCard(Zone.GRAVEYARD, playerA, "Silvercoat Lion", 1); // Creature {1}{W} 2/2
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Exhume");
|
||||
setChoice(playerA, "Yes"); // yes - counter
|
||||
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
|
||||
execute();
|
||||
assertAllCommandsUsed();
|
||||
|
||||
assertPermanentCount(playerA, "Silvercoat Lion", 1);
|
||||
assertPowerToughness(playerA, "Silvercoat Lion", 3, 3);
|
||||
assertAbility(playerA, "Silvercoat Lion", HasteAbility.getInstance(), false);
|
||||
assertAbility(playerA, "Silvercoat Lion", new RiotAbility(), true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void RiotRhythmOfTheWildNotCastHaste() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
|
||||
|
||||
// Creature spells you control can't be countered.
|
||||
// Nontoken creatures you control have riot.
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Rhythm of the Wild", 1);
|
||||
|
||||
// Riot (This creature enters the battleifled with your choice of a +1/+1 counter or haste.)
|
||||
addCard(Zone.HAND, playerA, "Exhume", 1); // Each player returns a creature card from their graveyard to the battlefield
|
||||
addCard(Zone.GRAVEYARD, playerA, "Silvercoat Lion", 1); // Creature {1}{W} 2/2
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Exhume");
|
||||
setChoice(playerA, "No"); // no - haste
|
||||
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
|
||||
execute();
|
||||
assertAllCommandsUsed();
|
||||
|
||||
assertPermanentCount(playerA, "Silvercoat Lion", 1);
|
||||
assertPowerToughness(playerA, "Silvercoat Lion", 2, 2);
|
||||
assertAbility(playerA, "Silvercoat Lion", HasteAbility.getInstance(), true);
|
||||
assertAbility(playerA, "Silvercoat Lion", new RiotAbility(), false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,10 +71,8 @@ class RiotReplacementEffect extends ReplacementEffectImpl {
|
|||
Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (creature != null && controller != null) {
|
||||
if (controller.chooseUse(outcome, "Have " + creature.getLogName() + " enter the battlefield with a +1/+1 counter on it or with haste?",null, "+1/+1 counter", "Haste", source, game)) {
|
||||
if (!game.isSimulation()) {
|
||||
game.informPlayers(controller.getLogName() + " choose to put a +1/+1 counter on " + creature.getName());
|
||||
}
|
||||
if (controller.chooseUse(outcome, "Have " + creature.getLogName() + " enter the battlefield with a +1/+1 counter on it or with haste?", null, "+1/+1 counter", "Haste", source, game)) {
|
||||
game.informPlayers(controller.getLogName() + " choose to put a +1/+1 counter on " + creature.getName());
|
||||
creature.addCounters(CounterType.P1P1.createInstance(), source, game, event.getAppliedEffects());
|
||||
} else {
|
||||
game.addEffect(new GainAbilitySourceEffect(HasteAbility.getInstance(), Duration.Custom), source);
|
||||
|
|
Loading…
Add table
Reference in a new issue