mirror of
https://github.com/correl/mage.git
synced 2024-12-24 11:50:45 +00:00
* Fixed a problem that unintended allowed to cast spells with alternate cost to cast conditions (fixes #6739).
This commit is contained in:
parent
5661bb1bfe
commit
d1e31140cc
3 changed files with 55 additions and 6 deletions
|
@ -145,6 +145,52 @@ public class UseAlternateSourceCostsTest extends CardTestPlayerBase {
|
|||
assertAllCommandsUsed();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_Playable_WithOpponentGainingLive() {
|
||||
// If you control a Forest, rather than pay Invigorate's mana cost, you may have an opponent gain 3 life.
|
||||
// Target creature gets +4/+4 until end of turn.
|
||||
addCard(Zone.HAND, playerA, "Invigorate"); // Instant {2}{G}
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
|
||||
|
||||
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Invigorate", "Silvercoat Lion");
|
||||
setChoice(playerA, "Yes"); // use alternative cost
|
||||
addTarget(playerA, playerB); // Opponent to gain live
|
||||
|
||||
setStrictChooseMode(true);
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
execute();
|
||||
assertAllCommandsUsed();
|
||||
|
||||
assertGraveyardCount(playerA, "Invigorate", 1);
|
||||
assertPowerToughness(playerA, "Silvercoat Lion", 6, 6);
|
||||
assertLife(playerB, 23);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_Not_Playable_WithOpponentGainingLive() {
|
||||
// If you control a Forest, rather than pay Invigorate's mana cost, you may have an opponent gain 3 life.
|
||||
// Target creature gets +4/+4 until end of turn.
|
||||
addCard(Zone.GRAVEYARD, playerA, "Invigorate"); // Instant {2}{G}
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Forest");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
|
||||
addCard(Zone.BATTLEFIELD, playerB, "Forest");
|
||||
|
||||
// can't see as playable because in graveyard
|
||||
checkPlayableAbility("can't", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Invigorate", false);
|
||||
|
||||
checkPlayableAbility("can't", 1, PhaseStep.PRECOMBAT_MAIN, playerB, "Cast Invigorate", false);
|
||||
|
||||
setStrictChooseMode(true);
|
||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||
execute();
|
||||
assertAllCommandsUsed();
|
||||
|
||||
assertGraveyardCount(playerA, "Invigorate", 1);
|
||||
assertPowerToughness(playerA, "Silvercoat Lion", 2, 2);
|
||||
assertLife(playerB, 20);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore // TODO: make test to check combo of alternative cost and cost reduction effects
|
||||
public void test_Playable_WithCostReduction() {
|
||||
|
|
|
@ -151,11 +151,11 @@ public class AlternativeCostSourceAbility extends StaticAbility implements Alter
|
|||
for (AlternativeCost2 alternateCost : alternativeCostsToCheck) {
|
||||
alternateCost.activate();
|
||||
for (Iterator it = ((Costs) alternateCost).iterator(); it.hasNext(); ) {
|
||||
Cost costDeailed = (Cost) it.next();
|
||||
if (costDeailed instanceof ManaCost) {
|
||||
ability.getManaCostsToPay().add((ManaCost) costDeailed.copy());
|
||||
} else {
|
||||
ability.getCosts().add(costDeailed.copy());
|
||||
Cost costDetailed = (Cost) it.next();
|
||||
if (costDetailed instanceof ManaCost) {
|
||||
ability.getManaCostsToPay().add((ManaCost) costDetailed.copy());
|
||||
} else if (costDetailed != null) {
|
||||
ability.getCosts().add(costDetailed.copy());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -222,7 +222,7 @@ public class AlternativeCostSourceAbility extends StaticAbility implements Alter
|
|||
sb.append("pay ");
|
||||
}
|
||||
String text = alternativeCost.getText(true);
|
||||
sb.append(Character.toLowerCase(text.charAt(0)) + text.substring(1));
|
||||
sb.append(Character.toLowerCase(text.charAt(0))).append(text.substring(1));
|
||||
}
|
||||
++numberCosts;
|
||||
}
|
||||
|
|
|
@ -3207,6 +3207,9 @@ public abstract class PlayerImpl implements Player, Serializable {
|
|||
// check "can play" condition as affected controller (BUT play from not own hand zone must be checked as original controller)
|
||||
// must check all abilities, not activated only
|
||||
for (Ability ability : candidateAbilities) {
|
||||
if (!(ability instanceof ActivatedAbility)) {
|
||||
continue;
|
||||
}
|
||||
boolean isPlaySpell = (ability instanceof SpellAbility);
|
||||
boolean isPlayLand = (ability instanceof PlayLandAbility);
|
||||
|
||||
|
|
Loading…
Reference in a new issue