mirror of
https://github.com/magefree/mage.git
synced 2025-12-21 11:02:00 -08:00
[J22] Implement Preston, the Vanisher (#9860)
This commit is contained in:
parent
eaa001aa14
commit
242490373e
9 changed files with 214 additions and 27 deletions
|
|
@ -109,7 +109,7 @@ public class EntersBattlefieldAllTriggeredAbility extends TriggeredAbilityImpl {
|
|||
return super.getRule();
|
||||
}
|
||||
|
||||
private String generateTriggerPhrase() {
|
||||
protected String generateTriggerPhrase() {
|
||||
StringBuilder sb = new StringBuilder("Whenever ");
|
||||
if (thisOrAnother) {
|
||||
sb.append("{this} or another ");
|
||||
|
|
|
|||
|
|
@ -0,0 +1,103 @@
|
|||
package mage.abilities.common;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.constants.SetTargetPointer;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.watchers.common.PermanentWasCastWatcher;
|
||||
|
||||
/**
|
||||
* An extension of triggered abilities that trigger when permanents enter the
|
||||
* battlefield, but this time they either must be cast or must not be cast.
|
||||
*
|
||||
* @author alexander-novo
|
||||
*/
|
||||
public class EntersBattlefieldCastTriggeredAbility extends EntersBattlefieldAllTriggeredAbility {
|
||||
private final boolean mustCast;
|
||||
|
||||
/**
|
||||
* zone = BATTLEFIELD optional = false
|
||||
*
|
||||
* @param effect
|
||||
* @param filter
|
||||
*/
|
||||
public EntersBattlefieldCastTriggeredAbility(Effect effect, FilterPermanent filter, boolean mustCast) {
|
||||
this(Zone.BATTLEFIELD, effect, filter, mustCast, false);
|
||||
}
|
||||
|
||||
public EntersBattlefieldCastTriggeredAbility(Effect effect, FilterPermanent filter, boolean mustCast, String rule) {
|
||||
this(Zone.BATTLEFIELD, effect, filter, mustCast, false, rule);
|
||||
}
|
||||
|
||||
public EntersBattlefieldCastTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, boolean mustCast,
|
||||
boolean optional) {
|
||||
this(zone, effect, filter, mustCast, optional, SetTargetPointer.NONE, null, false);
|
||||
}
|
||||
|
||||
public EntersBattlefieldCastTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, boolean mustCast,
|
||||
boolean optional,
|
||||
String rule) {
|
||||
this(zone, effect, filter, mustCast, optional, rule, false);
|
||||
}
|
||||
|
||||
public EntersBattlefieldCastTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, boolean mustCast,
|
||||
boolean optional,
|
||||
String rule, boolean controlledText) {
|
||||
this(zone, effect, filter, mustCast, optional, SetTargetPointer.NONE, rule, controlledText);
|
||||
}
|
||||
|
||||
public EntersBattlefieldCastTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, boolean mustCast,
|
||||
boolean optional,
|
||||
SetTargetPointer setTargetPointer, String rule) {
|
||||
this(zone, effect, filter, mustCast, optional, setTargetPointer, rule, false);
|
||||
}
|
||||
|
||||
public EntersBattlefieldCastTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, boolean mustCast,
|
||||
boolean optional,
|
||||
SetTargetPointer setTargetPointer, String rule, boolean controlledText) {
|
||||
this(zone, effect, filter, mustCast, optional, setTargetPointer, rule, controlledText, false);
|
||||
}
|
||||
|
||||
protected EntersBattlefieldCastTriggeredAbility(Zone zone, Effect effect, FilterPermanent filter, boolean mustCast,
|
||||
boolean optional,
|
||||
SetTargetPointer setTargetPointer, String rule, boolean controlledText, boolean thisOrAnother) {
|
||||
super(zone, effect, filter, optional, setTargetPointer, rule, controlledText, thisOrAnother);
|
||||
|
||||
this.mustCast = mustCast;
|
||||
this.addWatcher(new PermanentWasCastWatcher());
|
||||
|
||||
StringBuilder triggerPhrase = new StringBuilder(this.generateTriggerPhrase());
|
||||
if (mustCast) {
|
||||
triggerPhrase.append("if it was cast, ");
|
||||
} else {
|
||||
triggerPhrase.append("if it wasn't cast, ");
|
||||
}
|
||||
this.setTriggerPhrase(triggerPhrase.toString());
|
||||
}
|
||||
|
||||
public EntersBattlefieldCastTriggeredAbility(final EntersBattlefieldCastTriggeredAbility ability) {
|
||||
super(ability);
|
||||
|
||||
this.mustCast = ability.mustCast;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (!super.checkTrigger(event, game))
|
||||
return false;
|
||||
|
||||
PermanentWasCastWatcher watcher = game.getState().getWatcher(PermanentWasCastWatcher.class);
|
||||
UUID targetId = event.getTargetId();
|
||||
|
||||
return watcher.wasPermanentCastThisTurn(targetId) == this.mustCast;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntersBattlefieldCastTriggeredAbility copy() {
|
||||
return new EntersBattlefieldCastTriggeredAbility(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -17,11 +17,11 @@ import mage.watchers.Watcher;
|
|||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class CreatureWasCastWatcher extends Watcher {
|
||||
public class PermanentWasCastWatcher extends Watcher {
|
||||
|
||||
private final Set<UUID> creaturesCasted = new HashSet<>();
|
||||
private final Set<UUID> permanentsCasted = new HashSet<>();
|
||||
|
||||
public CreatureWasCastWatcher() {
|
||||
public PermanentWasCastWatcher() {
|
||||
super(WatcherScope.GAME);
|
||||
}
|
||||
|
||||
|
|
@ -31,27 +31,27 @@ public class CreatureWasCastWatcher extends Watcher {
|
|||
Spell spell = (Spell) game.getObject(event.getTargetId());
|
||||
if (spell != null) {
|
||||
Card card = game.getCard(spell.getSourceId());
|
||||
if (card != null && card.isCreature(game)) {
|
||||
creaturesCasted.add(card.getId());
|
||||
if (card != null && card.isPermanent(game)) {
|
||||
permanentsCasted.add(card.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (event.getType() == GameEvent.EventType.ZONE_CHANGE
|
||||
&& ((ZoneChangeEvent) event).getFromZone() == Zone.BATTLEFIELD) {
|
||||
Card card = game.getCard(event.getTargetId());
|
||||
if (card != null && card.isCreature(game)) {
|
||||
creaturesCasted.remove(card.getId());
|
||||
if (card != null && card.isPermanent(game)) {
|
||||
permanentsCasted.remove(card.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean wasCreatureCastThisTurn(UUID creatureSourceId) {
|
||||
return creaturesCasted.contains(creatureSourceId);
|
||||
public boolean wasPermanentCastThisTurn(UUID permanentSourceId) {
|
||||
return permanentsCasted.contains(permanentSourceId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
super.reset();
|
||||
creaturesCasted.clear();
|
||||
permanentsCasted.clear();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue