forked from External/mage
Improves: * refactor: split CostAdjuster logic in multiple parts - prepare X, prepare cost, increase cost, reduce cost; * refactor: improved VariableManaCost to support min/max values, playable and AI calculations, test framework; * refactor: improved EarlyTargetCost to support mana costs too (related to #13023); * refactor: migrated some cards with CostAdjuster and X to EarlyTargetCost (Knollspine Invocation, etc - related to #13023); * refactor: added shared code for "As an additional cost to cast this spell, discard X creature cards"; * refactor: added shared code for "X is the converted mana cost of the exiled card"; * tests: added dozens tests with cost adjusters; Bug fixes: * game: fixed that some cards with CostAdjuster ignore min/max limits for X (allow to choose any X, example: Scorched Earth, Open The Way); * game: fixed that some cards ask to announce already defined X values (example: Bargaining Table); * game: fixed that some cards with CostAdjuster do not support combo with other cost modification effects; * game, gui: fixed missing game logs about predefined X values; * game, gui: fixed wrong X icon for predefined X values; Test framework: * test framework: added X min/max check for wrong values; * test framework: added X min/max info in miss X value announce; * test framework: added check to find duplicated effect bugs (see assertNoDuplicatedEffects); Cards: * Open The Way - fixed that it allow to choose any X without limits (close #12810); * Unbound Flourishing - improved combo support for activated abilities with predefined X mana costs like Bargaining Table;
78 lines
2.4 KiB
Java
78 lines
2.4 KiB
Java
package mage.cards.c;
|
|
|
|
import mage.abilities.Ability;
|
|
import mage.abilities.costs.common.DiscardXTargetCost;
|
|
import mage.abilities.dynamicvalue.common.GetXValue;
|
|
import mage.abilities.effects.OneShotEffect;
|
|
import mage.cards.CardImpl;
|
|
import mage.cards.CardSetInfo;
|
|
import mage.constants.CardType;
|
|
import mage.constants.Outcome;
|
|
import mage.filter.StaticFilters;
|
|
import mage.game.Game;
|
|
import mage.players.Player;
|
|
import mage.target.TargetPlayer;
|
|
import mage.target.common.TargetCreatureOrPlaneswalker;
|
|
|
|
import java.util.UUID;
|
|
|
|
/**
|
|
* @author TheElk801
|
|
*/
|
|
public final class ChanneledForce extends CardImpl {
|
|
|
|
public ChanneledForce(UUID ownerId, CardSetInfo setInfo) {
|
|
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{R}");
|
|
|
|
// As an additional cost to cast this spell, discard X cards.
|
|
this.getSpellAbility().addCost(new DiscardXTargetCost(StaticFilters.FILTER_CARD_CARDS, true));
|
|
|
|
// Target player draws X cards. Channeled Force deals X damage to up to one target creature or planeswalker.
|
|
this.getSpellAbility().addEffect(new ChanneledForceEffect());
|
|
this.getSpellAbility().addTarget(new TargetPlayer());
|
|
this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
|
|
}
|
|
|
|
private ChanneledForce(final ChanneledForce card) {
|
|
super(card);
|
|
}
|
|
|
|
@Override
|
|
public ChanneledForce copy() {
|
|
return new ChanneledForce(this);
|
|
}
|
|
}
|
|
|
|
class ChanneledForceEffect extends OneShotEffect {
|
|
|
|
ChanneledForceEffect() {
|
|
super(Outcome.Benefit);
|
|
staticText = "Target player draws X cards. {this} deals X damage to up to one target creature or planeswalker.";
|
|
}
|
|
|
|
private ChanneledForceEffect(final ChanneledForceEffect effect) {
|
|
super(effect);
|
|
}
|
|
|
|
@Override
|
|
public ChanneledForceEffect copy() {
|
|
return new ChanneledForceEffect(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean apply(Game game, Ability source) {
|
|
int xValue = GetXValue.instance.calculate(game, source, this);
|
|
if (xValue == 0) {
|
|
return false;
|
|
}
|
|
Player player = game.getPlayer(source.getTargets().get(0).getFirstTarget());
|
|
if (player != null) {
|
|
player.drawCards(xValue, source, game);
|
|
}
|
|
game.damagePlayerOrPermanent(
|
|
source.getTargets().get(1).getFirstTarget(), xValue,
|
|
source.getSourceId(), source, game, false, true
|
|
);
|
|
return true;
|
|
}
|
|
}
|