forked from External/mage
[LTC] Implement Gandalf, Westward Voyager (#10727)
* refactor and cleanup SpellCastControllerTriggeredAbility * [LTC] Implement Gandalf, Westward Voyager * throw on unexpected setTargetPointer
This commit is contained in:
parent
4ac9293821
commit
0e5069ccc2
82 changed files with 567 additions and 361 deletions
|
|
@ -2,6 +2,7 @@ package mage.abilities.common;
|
|||
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterSpell;
|
||||
import mage.filter.StaticFilters;
|
||||
|
|
@ -11,61 +12,62 @@ import mage.game.stack.Spell;
|
|||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
/**
|
||||
* @author North
|
||||
* @author North, Susucr
|
||||
*/
|
||||
public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
protected final FilterSpell filter;
|
||||
protected String rule; // TODO: This sould be final, but is not because of the telescoping contructors
|
||||
protected final String rule;
|
||||
|
||||
// If either the cast spell or the card must be set as TargetPointer of effects.
|
||||
protected final SetTargetPointer setTargetPointer;
|
||||
|
||||
// The source SPELL that triggered the ability will be set as target to effect
|
||||
protected boolean rememberSource;
|
||||
// Use it if you want to remember CARD instead spell
|
||||
protected boolean rememberSourceAsCard;
|
||||
// Trigger only for spells cast from this zone. Default is from any zone.
|
||||
private Zone fromZone = Zone.ALL;
|
||||
private final Zone fromZone;
|
||||
|
||||
public SpellCastControllerTriggeredAbility(Effect effect, boolean optional) {
|
||||
this(Zone.BATTLEFIELD, effect, StaticFilters.FILTER_SPELL_A, optional, false);
|
||||
this(effect, null, optional);
|
||||
}
|
||||
|
||||
public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter, boolean optional) {
|
||||
this(effect, filter, optional, false);
|
||||
this(effect, filter, optional, SetTargetPointer.NONE);
|
||||
}
|
||||
|
||||
public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter, boolean optional, Zone fromZone) {
|
||||
this(effect, filter, optional, false);
|
||||
this.fromZone = fromZone;
|
||||
makeTriggerPhrase();
|
||||
public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter,
|
||||
boolean optional, SetTargetPointer setTargetPointer) {
|
||||
this(Zone.BATTLEFIELD, effect, filter, optional, setTargetPointer);
|
||||
}
|
||||
|
||||
public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter, boolean optional, String rule) {
|
||||
this(effect, filter, optional, false);
|
||||
this.rule = rule;
|
||||
public SpellCastControllerTriggeredAbility(Zone zone, Effect effect, FilterSpell filter,
|
||||
boolean optional, SetTargetPointer setTargetPointer) {
|
||||
this(zone, effect, filter, optional, setTargetPointer, null, null);
|
||||
}
|
||||
|
||||
public SpellCastControllerTriggeredAbility(Effect effect, FilterSpell filter, boolean optional, boolean rememberSource) {
|
||||
this(Zone.BATTLEFIELD, effect, filter, optional, rememberSource);
|
||||
}
|
||||
|
||||
public SpellCastControllerTriggeredAbility(Zone zone, Effect effect, FilterSpell filter, boolean optional, boolean rememberSource) {
|
||||
this(zone, effect, filter, optional, rememberSource, false);
|
||||
}
|
||||
|
||||
public SpellCastControllerTriggeredAbility(Zone zone, Effect effect, FilterSpell filter, boolean optional, boolean rememberSource, boolean rememberSourceAsCard) {
|
||||
public SpellCastControllerTriggeredAbility(Zone zone, Effect effect, FilterSpell filter,
|
||||
boolean optional, SetTargetPointer setTargetPointer,
|
||||
String rule, Zone fromZone) {
|
||||
super(zone, effect, optional);
|
||||
this.filter = filter;
|
||||
this.rememberSource = rememberSource;
|
||||
this.rememberSourceAsCard = rememberSourceAsCard;
|
||||
this.filter = filter == null ? StaticFilters.FILTER_SPELL_A : filter;
|
||||
this.setTargetPointer = setTargetPointer;
|
||||
this.rule = rule;
|
||||
this.fromZone = fromZone == null ? Zone.ALL : fromZone;
|
||||
makeTriggerPhrase();
|
||||
}
|
||||
|
||||
public static SpellCastControllerTriggeredAbility createWithFromZone(Effect effect, FilterSpell filter, boolean optional, Zone fromZone) {
|
||||
return new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, effect, filter, optional, null, null, fromZone);
|
||||
}
|
||||
|
||||
public static SpellCastControllerTriggeredAbility createWithRule(Effect effect, FilterSpell filter, boolean optional, String rule) {
|
||||
return new SpellCastControllerTriggeredAbility(Zone.BATTLEFIELD, effect, filter, optional, null, rule, null);
|
||||
}
|
||||
|
||||
protected SpellCastControllerTriggeredAbility(final SpellCastControllerTriggeredAbility ability) {
|
||||
super(ability);
|
||||
this.filter = ability.filter;
|
||||
this.rule = ability.rule;
|
||||
this.rememberSource = ability.rememberSource;
|
||||
this.rememberSourceAsCard = ability.rememberSourceAsCard;
|
||||
this.setTargetPointer = ability.setTargetPointer;
|
||||
this.fromZone = ability.fromZone;
|
||||
}
|
||||
|
||||
|
|
@ -86,8 +88,17 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl {
|
|||
return false;
|
||||
}
|
||||
this.getEffects().setValue("spellCast", spell);
|
||||
if (rememberSource) {
|
||||
this.getEffects().setTargetPointer(new FixedTarget(rememberSourceAsCard ? spell.getCard().getId() : spell.getId(), game));
|
||||
switch (setTargetPointer) {
|
||||
case NONE:
|
||||
break;
|
||||
case SPELL:
|
||||
getEffects().setTargetPointer(new FixedTarget(spell.getId(), game));
|
||||
break;
|
||||
case CARD:
|
||||
getEffects().setTargetPointer(new FixedTarget(spell.getCard().getId()));
|
||||
break;
|
||||
default:
|
||||
throw new UnsupportedOperationException("Unexpected setTargetPointer " + setTargetPointer);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -103,6 +114,19 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl {
|
|||
}
|
||||
|
||||
private void makeTriggerPhrase() {
|
||||
setTriggerPhrase("Whenever you cast " + filter.getMessage() + (fromZone != Zone.ALL ? " from your " + fromZone.toString().toLowerCase() : "") + ", ");
|
||||
String text = "Whenever you cast " + filter.getMessage();
|
||||
|
||||
switch (fromZone) {
|
||||
case ALL:
|
||||
break;
|
||||
case EXILED:
|
||||
text += " from exile";
|
||||
break;
|
||||
default:
|
||||
text += " from your " + fromZone.toString().toLowerCase();
|
||||
break;
|
||||
}
|
||||
|
||||
setTriggerPhrase(text + ", ");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.common.counter.AddPoisonCounterTargetEffect;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterSpell;
|
||||
import mage.filter.predicate.Predicates;
|
||||
|
|
@ -21,7 +22,10 @@ public final class AjaniSleeperAgentEmblem extends Emblem {
|
|||
// You get an emblem with "Whenever you cast a creature or planeswalker spell, target opponent gets two poison counters."
|
||||
public AjaniSleeperAgentEmblem() {
|
||||
super("Emblem Ajani");
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, new AddPoisonCounterTargetEffect(2), filter, false, false);
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(
|
||||
Zone.COMMAND, new AddPoisonCounterTargetEffect(2),
|
||||
filter, false, SetTargetPointer.NONE
|
||||
);
|
||||
ability.addTarget(new TargetOpponent());
|
||||
this.getAbilities().add(ability);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterSpell;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
|
|
@ -30,7 +31,9 @@ public class ChandraDressedToKillEmblem extends Emblem {
|
|||
// Whenever you cast a red spell, this emblem deals X damage to any target, where X is the amount of mana spent to cast that spell.
|
||||
public ChandraDressedToKillEmblem() {
|
||||
super("Emblem Chandra");
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, new ChandraDressedToKillEmblemEffect(), filter, false, true);
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(
|
||||
Zone.COMMAND, new ChandraDressedToKillEmblemEffect(),
|
||||
filter, false, SetTargetPointer.SPELL);
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
this.getAbilities().add(ability);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.command.Emblem;
|
||||
|
|
@ -19,7 +20,7 @@ public final class ChandraTorchOfDefianceEmblem extends Emblem {
|
|||
super("Emblem Chandra");
|
||||
Effect effect = new DamageTargetEffect(5);
|
||||
effect.setText("this emblem deals 5 damage to any target");
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, StaticFilters.FILTER_SPELL_A, false, false);
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, StaticFilters.FILTER_SPELL_A, false, SetTargetPointer.NONE);
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
getAbilities().add(ability);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
|
|
@ -23,7 +24,11 @@ public final class GarrukCallerOfBeastsEmblem extends Emblem {
|
|||
public GarrukCallerOfBeastsEmblem() {
|
||||
super("Emblem Garruk");
|
||||
Effect effect = new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterCreatureCard("creature card")), false);
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, StaticFilters.FILTER_SPELL_A_CREATURE, true, false);
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(
|
||||
Zone.COMMAND, effect,
|
||||
StaticFilters.FILTER_SPELL_A_CREATURE,
|
||||
true, SetTargetPointer.NONE
|
||||
);
|
||||
this.getAbilities().add(ability);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.MillCardsTargetEffect;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.command.Emblem;
|
||||
|
|
@ -19,7 +20,10 @@ public final class JaceTelepathUnboundEmblem extends Emblem {
|
|||
super("Emblem Jace");
|
||||
Effect effect = new MillCardsTargetEffect(5);
|
||||
effect.setText("target opponent mills five cards");
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, StaticFilters.FILTER_SPELL_A, false, false);
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(
|
||||
Zone.COMMAND, effect, StaticFilters.FILTER_SPELL_A,
|
||||
false, SetTargetPointer.NONE
|
||||
);
|
||||
ability.addTarget(new TargetOpponent());
|
||||
getAbilities().add(ability);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package mage.game.command.emblems;
|
|||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.command.Emblem;
|
||||
|
|
@ -18,7 +19,7 @@ public final class NarsetOfTheAncientWayEmblem extends Emblem {
|
|||
super("Emblem Narset");
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(
|
||||
Zone.COMMAND, new DamageTargetEffect(2, "this emblem"),
|
||||
StaticFilters.FILTER_SPELL_A_NON_CREATURE, false, false
|
||||
StaticFilters.FILTER_SPELL_A_NON_CREATURE, false, SetTargetPointer.NONE
|
||||
);
|
||||
ability.addTarget(new TargetAnyTarget());
|
||||
this.getAbilities().add(ability);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.command.Emblem;
|
||||
|
|
@ -19,7 +20,8 @@ public final class RalIzzetViceroyEmblem extends Emblem {
|
|||
super("Emblem Ral");
|
||||
Ability ability = new SpellCastControllerTriggeredAbility(
|
||||
Zone.COMMAND, new DamageTargetEffect(4, "this emblem"),
|
||||
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false, false
|
||||
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY,
|
||||
false, SetTargetPointer.NONE
|
||||
);
|
||||
ability.addEffect(
|
||||
new DrawCardSourceControllerEffect(2)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
|||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.common.CopyTargetSpellEffect;
|
||||
import mage.abilities.effects.common.DoIfCostPaid;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.command.Emblem;
|
||||
|
|
@ -18,7 +19,7 @@ public final class RowanScholarOfSparksEmblem extends Emblem {
|
|||
super("Emblem Rowan");
|
||||
this.getAbilities().add(new SpellCastControllerTriggeredAbility(
|
||||
Zone.COMMAND, new DoIfCostPaid(new CopyTargetSpellEffect(true), new GenericManaCost(2)),
|
||||
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false, true
|
||||
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false, SetTargetPointer.SPELL
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
|||
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
|
||||
import mage.abilities.keyword.HasteAbility;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterSpell;
|
||||
|
|
@ -30,7 +31,7 @@ public final class TyvarKellEmblem extends Emblem {
|
|||
Zone.COMMAND,
|
||||
new GainAbilityTargetEffect(
|
||||
HasteAbility.getInstance(), Duration.EndOfTurn, null, true
|
||||
).setText("it gains haste until end of turn"), filter, false, true, true
|
||||
).setText("it gains haste until end of turn"), filter, false, SetTargetPointer.CARD
|
||||
);
|
||||
ability.addEffect(new DrawCardSourceControllerEffect(2, "you").concatBy("and"));
|
||||
this.getAbilities().add(ability);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package mage.game.command.emblems;
|
|||
|
||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.common.CopyTargetSpellEffect;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.command.Emblem;
|
||||
|
|
@ -19,7 +20,7 @@ public final class WillKenrithEmblem extends Emblem {
|
|||
new CopyTargetSpellEffect(true).withSpellName("it"),
|
||||
StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY,
|
||||
false,
|
||||
true
|
||||
SetTargetPointer.SPELL
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue