[J22] Implement Preston, the Vanisher (#9860)

This commit is contained in:
Alexander Novotny 2023-02-28 06:39:02 -08:00 committed by GitHub
parent eaa001aa14
commit 242490373e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 214 additions and 27 deletions

View file

@ -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 ");

View file

@ -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);
}
}

View file

@ -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();
}
}