* Kestia, the Cultivator - Fixed bestow from the Command Zone doesn't attach her to the creature you target (fixes #6763).

This commit is contained in:
LevelX2 2020-07-03 13:17:04 +02:00
parent 91571df264
commit 299e664191
6 changed files with 48 additions and 9 deletions

View file

@ -3,6 +3,8 @@ package org.mage.test.commander.duel;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.game.permanent.Permanent;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestCommanderDuelBase;
@ -11,6 +13,7 @@ import org.mage.test.serverside.base.CardTestCommanderDuelBase;
* @author LevelX2
*/
public class CastCommanderTest extends CardTestCommanderDuelBase {
@Test
public void testCastCommander() {
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
@ -25,4 +28,39 @@ public class CastCommanderTest extends CardTestCommanderDuelBase {
assertPermanentCount(playerA, "Ob Nixilis of the Black Oath", 1);
}
@Test
public void testCastKestiaCommander() {
// Bestow {3}{G}{W}{U}
// Enchanted creature gets +4/+4.
// Whenever an enchanted creature or enchantment creature you control attacks, draw a card.
addCard(Zone.COMMAND, playerA, "Kestia, the Cultivator", 1); // Creature {1}{G}{W}{U} 4/4
addCard(Zone.BATTLEFIELD, playerA, "Forest", 5);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 5);
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Kestia, the Cultivator using bestow", "Silvercoat Lion");
setStrictChooseMode(true);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertAllCommandsUsed();
assertLife(playerA, 40);
assertLife(playerB, 40);
assertPermanentCount(playerA, "Kestia, the Cultivator", 1);
Permanent kestia = getPermanent("Kestia, the Cultivator", playerA);
Assert.assertNotEquals("Kestia may not be an creature", true, kestia.isCreature());
Assert.assertEquals("Kestia has to be an enchantment", true, kestia.isEnchantment());
assertPowerToughness(playerA, "Silvercoat Lion", 6, 6);
}
}

View file

@ -9,7 +9,7 @@ import mage.constants.Zone;
*/
public class CastCommanderAbility extends SpellAbility {
private String ruleText;
private final String ruleText;
public CastCommanderAbility(Card card, SpellAbility spellTemplate) {
super(spellTemplate);

View file

@ -12,6 +12,7 @@ import mage.cards.Card;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SpellAbilityCastMode;
import mage.constants.SpellAbilityType;
import mage.constants.SubType;
import mage.constants.TimingRule;
@ -92,6 +93,7 @@ public class BestowAbility extends SpellAbility {
public BestowAbility(Card card, String manaString) {
super(new ManaCostsImpl(manaString), card.getName() + " using bestow");
this.spellAbilityType = SpellAbilityType.BASE_ALTERNATE;
this.spellAbilityCastMode = SpellAbilityCastMode.BESTOW;
this.timing = TimingRule.SORCERY;
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.addTarget(auraTarget);

View file

@ -8,7 +8,8 @@ package mage.constants;
public enum SpellAbilityCastMode {
NORMAL("Normal"),
MADNESS("Madness"),
FLASHBACK("Flashback");
FLASHBACK("Flashback"),
BESTOW("Bestow");
private final String text;

View file

@ -2059,8 +2059,6 @@ public abstract class GameImpl implements Game, Serializable {
if (card != null && card.isCreature()) {
UUID wasAttachedTo = perm.getAttachedTo();
perm.attachTo(null, this);
//moved to mage.game.permanent.PermanentImpl::detachAllAttachments
//BestowAbility.becomeCreature(perm, this);
fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId()));
} else if (movePermanentToGraveyardWithInfo(perm)) {
somethingHappened = true;

View file

@ -244,7 +244,7 @@ public class Spell extends StackObjImpl implements Card {
} else if (this.isEnchantment() && this.hasSubtype(SubType.AURA, game)) {
if (ability.getTargets().stillLegal(ability, game)) {
updateOptionalCosts(0);
boolean bestow = ability instanceof BestowAbility;
boolean bestow = SpellAbilityCastMode.BESTOW.equals(ability.getSpellAbilityCastMode());
if (bestow) {
// Must be removed first time, after that will be removed by continous effect
// Otherwise effects like evolve trigger from creature comes into play event
@ -274,7 +274,7 @@ public class Spell extends StackObjImpl implements Card {
return false;
}
// Aura has no legal target and its a bestow enchantment -> Add it to battlefield as creature
if (this.getSpellAbility() instanceof BestowAbility) {
if (SpellAbilityCastMode.BESTOW.equals(this.getSpellAbility().getSpellAbilityCastMode())) {
updateOptionalCosts(0);
if (controller.moveCards(card, Zone.BATTLEFIELD, ability, game, false, faceDown, false, null)) {
Permanent permanent = game.getPermanent(card.getId());
@ -500,7 +500,7 @@ public class Spell extends StackObjImpl implements Card {
cardTypes.add(CardType.CREATURE);
return cardTypes;
}
if (this.getSpellAbility() instanceof BestowAbility) {
if (SpellAbilityCastMode.BESTOW.equals(this.getSpellAbility().getSpellAbilityCastMode())) {
ArrayList<CardType> cardTypes = new ArrayList<>();
cardTypes.addAll(card.getCardType());
cardTypes.remove(CardType.CREATURE);
@ -511,7 +511,7 @@ public class Spell extends StackObjImpl implements Card {
@Override
public SubTypeList getSubtype(Game game) {
if (this.getSpellAbility() instanceof BestowAbility) {
if (SpellAbilityCastMode.BESTOW.equals(this.getSpellAbility().getSpellAbilityCastMode())) {
SubTypeList subtypes = card.getSubtype(game);
if (!subtypes.contains(SubType.AURA)) { // do it only once
subtypes.add(SubType.AURA);
@ -523,7 +523,7 @@ public class Spell extends StackObjImpl implements Card {
@Override
public boolean hasSubtype(SubType subtype, Game game) {
if (this.getSpellAbility() instanceof BestowAbility) { // workaround for Bestow (don't like it)
if (SpellAbilityCastMode.BESTOW.equals(this.getSpellAbility().getSpellAbilityCastMode())) { // workaround for Bestow (don't like it)
SubTypeList subtypes = card.getSubtype(game);
if (!subtypes.contains(SubType.AURA)) { // do it only once
subtypes.add(SubType.AURA);