Add new EventType CREATURE_BLOCKS, which fires once per blocker (rather than once per blocker per attacker). Updated some abilities and cards to use it (still incomplete). Fixes #4285

This commit is contained in:
Alex W. Jackson 2022-09-08 21:41:15 -04:00
parent 1c688a0345
commit d5e56f523d
16 changed files with 50 additions and 39 deletions

View file

@ -10,6 +10,8 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import java.util.UUID;
public class AttacksOrBlocksAttachedTriggeredAbility extends TriggeredAbilityImpl {
private final AttachmentType attachmentType;
@ -33,12 +35,16 @@ public class AttacksOrBlocksAttachedTriggeredAbility extends TriggeredAbilityImp
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED
|| event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
|| event.getType() == GameEvent.EventType.CREATURE_BLOCKS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent enchantment = getSourcePermanentOrLKI(game);
return enchantment != null && event.getSourceId().equals(enchantment.getAttachedTo());
if (enchantment == null) {
return false;
}
UUID idToCheck = (event.getType() == GameEvent.EventType.ATTACKER_DECLARED) ? event.getSourceId() : event.getTargetId();
return idToCheck.equals(enchantment.getAttachedTo());
}
}

View file

@ -29,11 +29,11 @@ public class AttacksOrBlocksTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED || event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED || event.getType() == GameEvent.EventType.CREATURE_BLOCKS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return event.getSourceId().equals(this.getSourceId());
return getSourceId().equals((event.getType() == GameEvent.EventType.ATTACKER_DECLARED) ? event.getSourceId() : event.getTargetId());
}
}

View file

@ -25,7 +25,6 @@ public class BecomesTargetTriggeredAbility extends TriggeredAbilityImpl {
public BecomesTargetTriggeredAbility(Effect effect, FilterStackObject filter) {
this(effect, filter, SetTargetPointer.NONE);
setTriggerPhrase("When {this} becomes the target of " + filter.getMessage() + ", ");
}
public BecomesTargetTriggeredAbility(Effect effect, FilterStackObject filter, SetTargetPointer setTargetPointer) {
@ -34,13 +33,14 @@ public class BecomesTargetTriggeredAbility extends TriggeredAbilityImpl {
public BecomesTargetTriggeredAbility(Effect effect, FilterStackObject filter, SetTargetPointer setTargetPointer, boolean optional) {
super(Zone.BATTLEFIELD, effect, optional);
this.filter = filter.copy();
this.filter = filter;
this.setTargetPointer = setTargetPointer;
setTriggerPhrase("When {this} becomes the target of " + filter.getMessage() + ", ");
}
public BecomesTargetTriggeredAbility(final BecomesTargetTriggeredAbility ability) {
super(ability);
this.filter = ability.filter.copy();
this.filter = ability.filter;
this.setTargetPointer = ability.setTargetPointer;
}

View file

@ -23,12 +23,12 @@ public class BlocksCreatureTriggeredAbility extends TriggeredAbilityImpl {
public BlocksCreatureTriggeredAbility(Effect effect, boolean optional) {
this(effect, StaticFilters.FILTER_PERMANENT_CREATURE, optional);
setTriggerPhrase("Whenever {this} blocks " + CardUtil.addArticle(filter.getMessage()) + ", ");
}
public BlocksCreatureTriggeredAbility(Effect effect, FilterCreaturePermanent filter, boolean optional) {
super(Zone.BATTLEFIELD, effect, optional);
this.filter = filter;
setTriggerPhrase("Whenever {this} blocks " + CardUtil.addArticle(filter.getMessage()) + ", ");
}
public BlocksCreatureTriggeredAbility(final BlocksCreatureTriggeredAbility ability) {

View file

@ -5,7 +5,6 @@ import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
/**
*
@ -28,13 +27,12 @@ public class BlocksSourceTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DECLARED_BLOCKERS;
return event.getType() == GameEvent.EventType.CREATURE_BLOCKS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanent(getSourceId());
return permanent != null && permanent.getBlocking() > 0;
return event.getTargetId().equals(getSourceId());
}
@Override

View file

@ -704,6 +704,9 @@ public class Combat implements Serializable, Copyable<Combat> {
for (CombatGroup group : groups) {
group.acceptBlockers(game);
}
for (UUID blockerId : getBlockers()) {
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.CREATURE_BLOCKS, blockerId, null));
}
}
public void resumeSelectBlockers(Game game) {

View file

@ -298,6 +298,7 @@ public class GameEvent implements Serializable {
*/
BLOCKER_DECLARED,
CREATURE_BLOCKED,
CREATURE_BLOCKS,
BATCH_BLOCK_NONCOMBAT,
UNBLOCKED_ATTACKER,
SEARCH_LIBRARY, LIBRARY_SEARCHED,