* Flashback - Fixed that costs reduction and increasement works correctly for flashbacked spells.

This commit is contained in:
LevelX2 2014-06-27 15:59:18 +02:00
parent d84076ba40
commit 2406faec63
66 changed files with 230 additions and 198 deletions

View file

@ -32,7 +32,7 @@ import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;

View file

@ -3,7 +3,7 @@ package mage.abilities.effects.common;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;

View file

@ -31,7 +31,6 @@ import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.CastCommanderAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;

View file

@ -26,14 +26,19 @@
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.abilities.effects;
package mage.abilities.effects.common.cost;
import mage.constants.Duration;
import mage.constants.EffectType;
import mage.constants.Outcome;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.CostModificationEffect;
import mage.cards.Card;
import mage.constants.CostModificationType;
import mage.game.Game;
import mage.game.stack.Spell;
/**
* Simple implementation of a {@link CostModificationEffect} offering simplified
@ -67,10 +72,10 @@ public abstract class CostModificationEffectImpl extends ContinuousEffectImpl im
*/
@Override
public final boolean apply ( Game game, Ability source ) { return false; }
@Override
public CostModificationType getModificationType(){
return this.modificationType;
}
}

View file

@ -33,7 +33,6 @@ import mage.abilities.SpellAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;

View file

@ -29,14 +29,13 @@ package mage.abilities.effects.common.cost;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.abilities.keyword.FlashbackAbility;
import mage.cards.Card;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.util.CardUtil;
/**
@ -73,9 +72,15 @@ public class SpellsCostIncreasementAllEffect extends CostModificationEffectImpl
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if ((abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility)) {
Card sourceCard = game.getCard(abilityToModify.getSourceId());
return sourceCard != null && this.filter.match(sourceCard, game);
if (abilityToModify instanceof SpellAbility) {
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
if (spell != null) {
return this.filter.match(spell, game);
} else {
// used at least for flashback ability because Flashback ability doesn't use stack
Card sourceCard = game.getCard(abilityToModify.getSourceId());
return sourceCard != null && this.filter.match(sourceCard, game);
}
}
return false;
}

View file

@ -31,11 +31,11 @@ import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.cards.Card;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.FilterSpell;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.util.CardUtil;
@ -44,13 +44,13 @@ import mage.util.CardUtil;
*
* @author Quercitron
*/
public class SpellsCostIncreaseEffect extends CostModificationEffectImpl {
public class SpellsCostIncreasementControllerEffect extends CostModificationEffectImpl {
private final FilterSpell filter;
private final FilterCard filter;
private final int amount;
private ManaCosts<ManaCost> manaCostsToIncrease = null;
public SpellsCostIncreaseEffect(FilterSpell filter, ManaCosts<ManaCost> manaCostsToReduce) {
public SpellsCostIncreasementControllerEffect(FilterCard filter, ManaCosts<ManaCost> manaCostsToReduce) {
super(Duration.WhileOnBattlefield, Outcome.Detriment, CostModificationType.INCREASE_COST);
this.filter = filter;
this.amount = 0;
@ -65,7 +65,7 @@ public class SpellsCostIncreaseEffect extends CostModificationEffectImpl {
this.staticText = sb.toString();
}
public SpellsCostIncreaseEffect(FilterSpell filter, int amount) {
public SpellsCostIncreasementControllerEffect(FilterCard filter, int amount) {
super(Duration.WhileOnBattlefield, Outcome.Detriment, CostModificationType.INCREASE_COST);
this.filter = filter;
this.amount = amount;
@ -75,7 +75,7 @@ public class SpellsCostIncreaseEffect extends CostModificationEffectImpl {
this.staticText = sb.toString();
}
protected SpellsCostIncreaseEffect(SpellsCostIncreaseEffect effect) {
protected SpellsCostIncreasementControllerEffect(SpellsCostIncreasementControllerEffect effect) {
super(effect);
this.filter = effect.filter;
this.amount = effect.amount;
@ -94,16 +94,23 @@ public class SpellsCostIncreaseEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if ((abilityToModify instanceof SpellAbility)
&& abilityToModify.getControllerId().equals(source.getControllerId())) {
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
return spell != null && this.filter.match(spell, game);
if (abilityToModify instanceof SpellAbility) {
if (abilityToModify.getControllerId().equals(source.getControllerId())) {
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
if (spell != null) {
return this.filter.match(spell, game);
} else {
// used at least for flashback ability because Flashback ability doesn't use stack
Card sourceCard = game.getCard(abilityToModify.getSourceId());
return sourceCard != null && this.filter.match(sourceCard, game);
}
}
}
return false;
}
@Override
public SpellsCostIncreaseEffect copy() {
return new SpellsCostIncreaseEffect(this);
public SpellsCostIncreasementControllerEffect copy() {
return new SpellsCostIncreasementControllerEffect(this);
}
}

View file

@ -29,7 +29,6 @@ package mage.abilities.effects.common.cost;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.abilities.keyword.FlashbackAbility;
import mage.cards.Card;
import mage.constants.CostModificationType;
@ -37,6 +36,7 @@ import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.util.CardUtil;
/**
@ -73,9 +73,15 @@ public class SpellsCostReductionAllEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if ((abilityToModify instanceof SpellAbility || abilityToModify instanceof FlashbackAbility)) {
Card sourceCard = game.getCard(abilityToModify.getSourceId());
return sourceCard != null && this.filter.match(sourceCard, game);
if (abilityToModify instanceof SpellAbility) {
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
if (spell != null) {
return this.filter.match(spell, game);
} else {
// used at least for flashback ability because Flashback ability doesn't use stack
Card sourceCard = game.getCard(abilityToModify.getSourceId());
return sourceCard != null && this.filter.match(sourceCard, game);
}
}
return false;
}

View file

@ -31,11 +31,11 @@ import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.cards.Card;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.filter.FilterSpell;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.util.CardUtil;
@ -44,14 +44,14 @@ import mage.util.CardUtil;
*
* @author North
*/
public class SpellsCostReductionEffect extends CostModificationEffectImpl {
public class SpellsCostReductionControllerEffect extends CostModificationEffectImpl {
private final FilterSpell filter;
private final FilterCard filter;
private final int amount;
private ManaCosts<ManaCost> manaCostsToReduce = null;
public SpellsCostReductionEffect(FilterSpell filter, ManaCosts<ManaCost> manaCostsToReduce) {
public SpellsCostReductionControllerEffect(FilterCard filter, ManaCosts<ManaCost> manaCostsToReduce) {
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
this.filter = filter;
this.amount = 0;
@ -67,7 +67,7 @@ public class SpellsCostReductionEffect extends CostModificationEffectImpl {
}
public SpellsCostReductionEffect(FilterSpell filter, int amount) {
public SpellsCostReductionControllerEffect(FilterCard filter, int amount) {
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
this.filter = filter;
this.amount = amount;
@ -77,7 +77,7 @@ public class SpellsCostReductionEffect extends CostModificationEffectImpl {
this.staticText = sb.toString();
}
protected SpellsCostReductionEffect(SpellsCostReductionEffect effect) {
protected SpellsCostReductionControllerEffect(SpellsCostReductionControllerEffect effect) {
super(effect);
this.filter = effect.filter;
this.amount = effect.amount;
@ -96,16 +96,23 @@ public class SpellsCostReductionEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if ((abilityToModify instanceof SpellAbility)
&& abilityToModify.getControllerId().equals(source.getControllerId())) {
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
return spell != null && this.filter.match(spell, game);
if (abilityToModify instanceof SpellAbility) {
if (abilityToModify.getControllerId().equals(source.getControllerId())) {
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
if (spell != null) {
return this.filter.match(spell, game);
} else {
// used at least for flashback ability because Flashback ability doesn't use stack
Card sourceCard = game.getCard(abilityToModify.getSourceId());
return sourceCard != null && this.filter.match(sourceCard, game);
}
}
}
return false;
}
@Override
public SpellsCostReductionEffect copy() {
return new SpellsCostReductionEffect(this);
public SpellsCostReductionControllerEffect copy() {
return new SpellsCostReductionControllerEffect(this);
}
}

View file

@ -175,7 +175,7 @@ class FlashbackEffect extends OneShotEffect {
int amount = source.getManaCostsToPay().getX();
if (amount == 0) {
// add variable cost like Discard X cards to get the X value to the spell
// because there is currently no way to set the x value in anotehr way, it#s set for the
// because there is currently no way to set the x value in anotehr way, it's set for the
// x mana value to be known by the spell
for (Cost cost:source.getCosts()) {
if (cost instanceof VariableCost && cost.isPaid()) {

View file

@ -40,7 +40,7 @@ import mage.abilities.StaticAbility;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.CostModificationEffectImpl;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.Card;
import mage.constants.CostModificationType;
import mage.filter.common.FilterControlledCreaturePermanent;