new common BecomesTargetSourceFirstTimeTriggeredAbility

This commit is contained in:
xenohedron 2023-09-21 01:20:12 -04:00
parent 6abe9ff821
commit 4ab36880fe
7 changed files with 108 additions and 287 deletions

View file

@ -0,0 +1,41 @@
package mage.abilities.common;
import mage.abilities.effects.Effect;
import mage.constants.SetTargetPointer;
import mage.filter.FilterStackObject;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.watchers.common.NumberOfTimesPermanentTargetedATurnWatcher;
/**
* @author xenohedron
*/
public class BecomesTargetSourceFirstTimeTriggeredAbility extends BecomesTargetSourceTriggeredAbility {
public BecomesTargetSourceFirstTimeTriggeredAbility(Effect effect, FilterStackObject filter,
SetTargetPointer setTargetPointer, boolean optional) {
super(effect, filter, setTargetPointer, optional);
this.addWatcher(new NumberOfTimesPermanentTargetedATurnWatcher());
setTriggerPhrase("Whenever {this} becomes the target of " + filter.getMessage() + " for the first time each turn, ");
}
protected BecomesTargetSourceFirstTimeTriggeredAbility(final BecomesTargetSourceFirstTimeTriggeredAbility ability) {
super(ability);
}
@Override
public BecomesTargetSourceFirstTimeTriggeredAbility copy() {
return new BecomesTargetSourceFirstTimeTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanent(event.getTargetId());
NumberOfTimesPermanentTargetedATurnWatcher watcher = game.getState().getWatcher(NumberOfTimesPermanentTargetedATurnWatcher.class);
if (permanent == null || watcher == null || watcher.numTimesTargetedThisTurn(permanent, game) > 1) {
return false;
}
return super.checkTrigger(event, game);
}
}

View file

@ -1,16 +1,17 @@
package mage.watchers.common;
import java.util.HashMap;
import java.util.Map;
import mage.MageObjectReference;
import mage.constants.WatcherScope;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.stack.StackObject;
import mage.util.CardUtil;
import mage.watchers.Watcher;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author LevelX2
@ -25,24 +26,23 @@ public class NumberOfTimesPermanentTargetedATurnWatcher extends Watcher {
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.TARGETED) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null) {
MageObjectReference mor = new MageObjectReference(permanent, game);
int amount = 0;
if (permanentsTargeted.containsKey(mor)) {
amount = permanentsTargeted.get(mor);
}
permanentsTargeted.put(mor, ++amount);
}
if (event.getType() != GameEvent.EventType.TARGETED) {
return;
}
StackObject targetingObject = CardUtil.getTargetingStackObject(event, game);
if (targetingObject == null || !CardUtil.checkTargetMap(null, targetingObject, event, game)) {
return;
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null) {
MageObjectReference mor = new MageObjectReference(permanent, game);
int nTimes = permanentsTargeted.computeIfAbsent(mor, k -> 0);
permanentsTargeted.put(mor, nTimes + 1);
}
}
public boolean notMoreThanOnceTargetedThisTurn(Permanent creature, Game game) {
if (permanentsTargeted.containsKey(new MageObjectReference(creature, game))) {
return permanentsTargeted.get(new MageObjectReference(creature, game)) < 2;
}
return true;
public int numTimesTargetedThisTurn(Permanent permanent, Game game) {
return permanentsTargeted.computeIfAbsent(new MageObjectReference(permanent, game), k -> 0);
}
@Override