forked from External/mage
Refactor batch events (#11995)
* create new abstract class for batch event framework * adjust CardUtil.getEventTargets to support new framework * update TappedBatchEvent to new framework * update UntappedBatchEvent to new framework * slight cleanup * update LifeLostBatchEvent to new framework * update ZoneChangeBatchEvent to new framework * complete refactor by moving damage events to new framework * remove old code no longer used * clean up some nonsense code in star wars card * fix watcher checking id before event type * fix wrong id usage * fix missed wrong id usage
This commit is contained in:
parent
8869d282b2
commit
cb28fb5a56
39 changed files with 308 additions and 635 deletions
|
|
@ -40,7 +40,7 @@ public class BecomesTappedOneOrMoreTriggeredAbility extends TriggeredAbilityImpl
|
|||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
TappedBatchEvent batchEvent = (TappedBatchEvent) event;
|
||||
return batchEvent
|
||||
.getTargets()
|
||||
.getTargetIds()
|
||||
.stream()
|
||||
.map(game::getPermanent)
|
||||
.anyMatch(p -> filter.match(p, getControllerId(), this, game));
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import mage.abilities.TriggeredAbilityImpl;
|
|||
import mage.abilities.effects.Effect;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedBatchEvent;
|
||||
import mage.game.events.DamagedBatchAllEvent;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
|
|
@ -14,21 +14,17 @@ import mage.game.permanent.Permanent;
|
|||
*/
|
||||
public class DealsCombatDamageEquippedTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
private boolean usedThisStep;
|
||||
|
||||
public DealsCombatDamageEquippedTriggeredAbility(Effect effect) {
|
||||
this(effect, false);
|
||||
}
|
||||
|
||||
public DealsCombatDamageEquippedTriggeredAbility(Effect effect, boolean optional) {
|
||||
super(Zone.BATTLEFIELD, effect, optional);
|
||||
this.usedThisStep = false;
|
||||
setTriggerPhrase("Whenever equipped creature deals combat damage, ");
|
||||
}
|
||||
|
||||
protected DealsCombatDamageEquippedTriggeredAbility(final DealsCombatDamageEquippedTriggeredAbility ability) {
|
||||
super(ability);
|
||||
this.usedThisStep = ability.usedThisStep;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -38,23 +34,16 @@ public class DealsCombatDamageEquippedTriggeredAbility extends TriggeredAbilityI
|
|||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event instanceof DamagedBatchEvent || event.getType() == GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE;
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ALL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event.getType() == GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE) {
|
||||
usedThisStep = false; // clear before damage
|
||||
return false;
|
||||
}
|
||||
if (usedThisStep || !(event instanceof DamagedBatchEvent)) {
|
||||
return false; // trigger only on DamagedEvent and if not yet triggered this step
|
||||
}
|
||||
Permanent sourcePermanent = getSourcePermanentOrLKI(game);
|
||||
if (sourcePermanent == null || sourcePermanent.getAttachedTo() == null) {
|
||||
return false;
|
||||
}
|
||||
int amount = ((DamagedBatchEvent) event)
|
||||
int amount = ((DamagedBatchAllEvent) event)
|
||||
.getEvents()
|
||||
.stream()
|
||||
.filter(DamagedEvent::isCombatDamage)
|
||||
|
|
@ -64,11 +53,7 @@ public class DealsCombatDamageEquippedTriggeredAbility extends TriggeredAbilityI
|
|||
if (amount < 1) {
|
||||
return false;
|
||||
}
|
||||
usedThisStep = true;
|
||||
this.getEffects().setValue("damage", amount);
|
||||
// TODO: this value saved will not be correct if both permanent and player damaged by a single creature
|
||||
// Need to rework engine logic to fire a single DamagedBatchEvent including both permanents and players
|
||||
// Only Sword of Hours is currently affected.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import mage.abilities.TriggeredAbilityImpl;
|
|||
import mage.abilities.effects.Effect;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedBatchEvent;
|
||||
import mage.game.events.DamagedBatchAllEvent;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
|
||||
|
|
@ -17,18 +17,14 @@ import mage.game.events.GameEvent;
|
|||
*/
|
||||
public class DealsCombatDamageTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
private boolean usedThisStep;
|
||||
|
||||
public DealsCombatDamageTriggeredAbility(Effect effect, boolean optional) {
|
||||
super(Zone.BATTLEFIELD, effect, optional);
|
||||
this.usedThisStep = false;
|
||||
setTriggerPhrase(getWhen() + "{this} deals combat damage, ");
|
||||
this.replaceRuleText = true;
|
||||
}
|
||||
|
||||
protected DealsCombatDamageTriggeredAbility(final DealsCombatDamageTriggeredAbility ability) {
|
||||
super(ability);
|
||||
this.usedThisStep = ability.usedThisStep;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -38,33 +34,22 @@ public class DealsCombatDamageTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkEventType(GameEvent event, Game game) {
|
||||
return event instanceof DamagedBatchEvent || event.getType() == GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE;
|
||||
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ALL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event.getType() == GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE) {
|
||||
usedThisStep = false; // clear before damage
|
||||
return false;
|
||||
}
|
||||
if (usedThisStep || !(event instanceof DamagedBatchEvent)) {
|
||||
return false; // trigger only on DamagedEvent and if not yet triggered this step
|
||||
}
|
||||
int amount = ((DamagedBatchEvent) event)
|
||||
int amount = ((DamagedBatchAllEvent) event)
|
||||
.getEvents()
|
||||
.stream()
|
||||
.filter(DamagedEvent::isCombatDamage)
|
||||
.filter(e -> e.getAttackerId().equals(this.sourceId))
|
||||
.filter(e -> e.getAttackerId().equals(getSourceId()))
|
||||
.mapToInt(GameEvent::getAmount)
|
||||
.sum();
|
||||
if (amount < 1) {
|
||||
return false;
|
||||
}
|
||||
usedThisStep = true;
|
||||
this.getEffects().setValue("damage", amount);
|
||||
// TODO: this value saved will not be correct if both permanent and player damaged by a single creature
|
||||
// Need to rework engine logic to fire a single DamagedBatchEvent including both permanents and players
|
||||
// Only Aisha of Sparks and Smoke is currently affected.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import mage.constants.SetTargetPointer;
|
|||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedBatchEvent;
|
||||
import mage.game.events.DamagedBatchForOnePlayerEvent;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
|
|
@ -60,7 +60,7 @@ public class OneOrMoreDealDamageTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
DamagedBatchEvent dEvent = (DamagedBatchEvent) event;
|
||||
DamagedBatchForOnePlayerEvent dEvent = (DamagedBatchForOnePlayerEvent) event;
|
||||
if (onlyCombat && !dEvent.isCombatDamage()) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -86,7 +86,7 @@ public class OneOrMoreDealDamageTriggeredAbility extends TriggeredAbilityImpl {
|
|||
this.getAllEffects().setValue("damage", events.stream().mapToInt(DamagedEvent::getAmount).sum());
|
||||
switch (setTargetPointer) {
|
||||
case PLAYER:
|
||||
this.getAllEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
|
||||
this.getAllEffects().setTargetPointer(new FixedTarget(event.getTargetId()));
|
||||
break;
|
||||
case NONE:
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue