Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor batch events #11995

Merged
merged 13 commits into from
Mar 29, 2024
2 changes: 1 addition & 1 deletion Mage.Sets/src/mage/cards/a/AlelaCunningConqueror.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public boolean checkTrigger(GameEvent event, Game game) {
if (!super.checkTrigger(event, game)) {
return false;
}
Player opponent = game.getPlayer(event.getPlayerId());
Player opponent = game.getPlayer(event.getTargetId());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's hard to find such replacements from playerId to targetId due multi-classes inheritance. If you manually checked and replaced all related usages then all fine. If you fix it by failed tests then it's bad.

Fast usages search showing a missing fix like:
DAMAGED_BATCH_FOR_ONE_PLAYER -> OneOrMoreDealDamageTriggeredAbility -> DealCombatDamageControlledTriggeredAbility -> FelineSovereignTriggeredAbility:

shot_240326_080958

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good find, I thought I got them all manually but apparently missed that one. multi inheritance certainly complicates that, fortunately since this batch event was recently introduced and not used that many places, it wasn't too bad

if (opponent == null) {
return false;
}
Expand Down
126 changes: 13 additions & 113 deletions Mage.Sets/src/mage/cards/b/BenSolo.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,24 @@

import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.common.DealtDamageToSourceTriggeredAbility;
import mage.abilities.dynamicvalue.common.SavedDamageValue;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.DamagedEvent;
import mage.game.events.DamagedBatchForPermanentsEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.target.common.TargetPlayerOrPlaneswalker;

import java.util.Set;
import java.util.UUID;

/**
* @author Merlingilb
*/
public class BenSolo extends CardImpl {

public BenSolo(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R/W}{W}");
this.supertype.add(SuperType.LEGENDARY);
Expand All @@ -31,11 +28,14 @@ public BenSolo(UUID ownerId, CardSetInfo setInfo) {
this.power = new MageInt(4);
this.toughness = new MageInt(4);

//Vigilance
// Vigilance
this.addAbility(VigilanceAbility.getInstance());

//Whenever Ben Solo is dealt damage, it deals that much damage to target player or planeswalker.
this.addAbility(new BenSoloTriggeredAbility());
// Whenever Ben Solo is dealt damage, it deals that much damage to target player or planeswalker.
Ability ability = new DealtDamageToSourceTriggeredAbility(
new DamageTargetEffect(SavedDamageValue.MUCH, "it"), false);
ability.addTarget(new TargetPlayerOrPlaneswalker());
this.addAbility(ability);
}

private BenSolo(final BenSolo card) {
Expand All @@ -47,103 +47,3 @@ public BenSolo copy() {
return new BenSolo(this);
}
}

class BenSoloTriggeredAbility extends TriggeredAbilityImpl {

UUID benSoloID;

BenSoloTriggeredAbility() {
super(Zone.BATTLEFIELD, new BenSoloEffect(), false);
this.addTarget(new TargetPlayerOrPlaneswalker());
benSoloID = this.getSourceId();
}

private BenSoloTriggeredAbility(final BenSoloTriggeredAbility ability) {
super(ability);
benSoloID = ability.benSoloID;
}

@Override
public BenSoloTriggeredAbility copy() {
return new BenSoloTriggeredAbility(this);
}

@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_PERMANENTS;
}

@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (benSoloID == null) {
benSoloID = this.getSourceId();
if (benSoloID == null) {
return false;
}
}

int damage = 0;
DamagedBatchForPermanentsEvent dEvent = (DamagedBatchForPermanentsEvent) event;
Set<DamagedEvent> set = dEvent.getEvents();
for (DamagedEvent damagedEvent : set) {
UUID targetID = damagedEvent.getTargetId();
if (targetID == null) {
continue;
}

if (targetID == benSoloID) {
damage += damagedEvent.getAmount();
}
}

if (damage > 0) {
this.getEffects().setValue("damage", damage);
this.getEffects().setValue("benSoloID", benSoloID);
return true;
}
return false;
}

@Override
public String getRule() {
return "Whenever Ben Solo is dealt damage, it deals that much damage to target player or planeswalker.";
}
}

class BenSoloEffect extends OneShotEffect {

BenSoloEffect() {
super(Outcome.Benefit);
}

private BenSoloEffect(final BenSoloEffect effect) {
super(effect);
}

@Override
public BenSoloEffect copy() {
return new BenSoloEffect(this);
}

@Override
public boolean apply(Game game, Ability source) {
Integer damage = (Integer)getValue("damage");
UUID benSoloID = (UUID)getValue("benSoloID");

if (benSoloID == null || damage == null || damage < 1) {
return false;
}

Permanent permanent = game.getPermanent(source.getFirstTarget());
if (permanent != null) {
permanent.damage(damage, benSoloID, source, game);
return true;
}
Player player = game.getPlayer(source.getFirstTarget());
if (player != null) {
player.damage(damage, benSoloID, source, game);
return true;
}
return false;
}
}
4 changes: 1 addition & 3 deletions Mage.Sets/src/mage/cards/b/BloodSpatterAnalysis.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,7 @@ public boolean checkEventType(GameEvent event, Game game) {

@Override
public boolean checkTrigger(GameEvent event, Game game) {
ZoneChangeBatchEvent zBatchEvent = (ZoneChangeBatchEvent) event;

for (ZoneChangeEvent zEvent : zBatchEvent.getEvents()) {
for (ZoneChangeEvent zEvent : ((ZoneChangeBatchEvent) event).getEvents()) {
if (zEvent.isDiesEvent()) {
Permanent permanent = game.getPermanentOrLKIBattlefield(zEvent.getTargetId());
if (permanent != null && permanent.isCreature(game)) {
Expand Down
9 changes: 4 additions & 5 deletions Mage.Sets/src/mage/cards/b/BreechesBrazenPlunderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import mage.cards.*;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.DamagedEvent;
import mage.game.events.DamagedBatchForPlayersEvent;
import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
Expand Down Expand Up @@ -72,9 +72,8 @@ public boolean checkEventType(GameEvent event, Game game) {

@Override
public boolean checkTrigger(GameEvent event, Game game) {
DamagedBatchForPlayersEvent dEvent = (DamagedBatchForPlayersEvent) event;
Set<UUID> opponents = new HashSet<>();
for (DamagedEvent damagedEvent : dEvent.getEvents()) {
for (DamagedEvent damagedEvent : ((DamagedBatchForPlayersEvent) event).getEvents()) {
Permanent permanent = game.getPermanent(damagedEvent.getSourceId());
if (permanent == null
|| !permanent.isControlledBy(getControllerId())
Expand All @@ -84,7 +83,7 @@ public boolean checkTrigger(GameEvent event, Game game) {
}
opponents.add(damagedEvent.getTargetId());
}
if (opponents.size() < 1) {
if (opponents.isEmpty()) {
return false;
}
this.getEffects().clear();
Expand Down Expand Up @@ -148,4 +147,4 @@ public boolean apply(Game game, Ability source) {
}
return true;
}
}
}
4 changes: 2 additions & 2 deletions Mage.Sets/src/mage/cards/c/ContestedGameBall.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.DamagedBatchEvent;
import mage.game.events.DamagedBatchForOnePlayerEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.TreasureToken;
Expand Down Expand Up @@ -84,7 +84,7 @@ public boolean checkEventType(GameEvent event, Game game) {

@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (((DamagedBatchEvent) event).isCombatDamage() && event.getPlayerId().equals(this.getControllerId())) {
if (((DamagedBatchForOnePlayerEvent) event).isCombatDamage() && event.getTargetId().equals(this.getControllerId())) {
this.getAllEffects().setTargetPointer(new FixedTarget(game.getActivePlayerId()));
// attacking player is active player
return true;
Expand Down
7 changes: 3 additions & 4 deletions Mage.Sets/src/mage/cards/c/CourtOfLocthwain.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public CourtOfLocthwainFirstEffect copy() {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source));
if (controller == null || opponent == null || source == null) {
if (controller == null || opponent == null) {
return false;
}
Card card = opponent.getLibrary().getFromTop(game);
Expand Down Expand Up @@ -220,12 +220,11 @@ public CourtOfLocthwainWatcher() {

@Override
public void watch(GameEvent event, Game game) {
UUID playerId = event.getPlayerId();
if (event.getType() == GameEvent.EventType.SPELL_CAST
&& event.hasApprovingIdentifier(MageIdentifier.CourtOfLocthwainWatcher)
&& playerId != null) {
&& event.getPlayerId() != null) {
decrementCastAvailable(
playerId,
event.getPlayerId(),
event.getAdditionalReference().getApprovingMageObjectReference()
);
}
Expand Down
5 changes: 2 additions & 3 deletions Mage.Sets/src/mage/cards/h/HowlpackAvenger.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.DamagedBatchEvent;
import mage.game.events.DamagedBatchForPermanentsEvent;
import mage.game.events.GameEvent;
import mage.target.common.TargetAnyTarget;

Expand Down Expand Up @@ -81,8 +81,7 @@ public boolean checkEventType(GameEvent event, Game game) {

@Override
public boolean checkTrigger(GameEvent event, Game game) {
DamagedBatchEvent dEvent = (DamagedBatchEvent) event;
int damage = dEvent
int damage = ((DamagedBatchForPermanentsEvent) event)
.getEvents()
.stream()
.filter(damagedEvent -> isControlledBy(game.getControllerId(damagedEvent.getTargetId())))
Expand Down
3 changes: 0 additions & 3 deletions Mage.Sets/src/mage/cards/k/KayaSpiritsJustice.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,6 @@ public boolean checkEventType(GameEvent event, Game game) {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
ZoneChangeBatchEvent zEvent = (ZoneChangeBatchEvent) event;
if (zEvent == null) {
return false;
}

Set<Card> battlefieldCards = zEvent.getEvents()
.stream()
Expand Down
5 changes: 2 additions & 3 deletions Mage.Sets/src/mage/cards/m/MagmaticGalleon.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.DamagedBatchEvent;
import mage.game.events.DamagedBatchForPermanentsEvent;
import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
Expand Down Expand Up @@ -80,8 +80,7 @@ public boolean checkEventType(GameEvent event, Game game) {

@Override
public boolean checkTrigger(GameEvent event, Game game) {
DamagedBatchEvent dEvent = (DamagedBatchEvent) event;
int damage = dEvent
int damage = ((DamagedBatchForPermanentsEvent) event)
.getEvents()
.stream()
.filter(damagedEvent -> {
Expand Down
8 changes: 4 additions & 4 deletions Mage.Sets/src/mage/cards/o/ObNixilisCaptiveKingpin.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,15 +82,15 @@ public boolean checkTrigger(GameEvent event, Game game) {
boolean opponentLostLife = false;
boolean allis1 = true;

for (UUID targetPlayer : CardUtil.getEventTargets(lifeLostBatchEvent)){
for (UUID targetPlayer : CardUtil.getEventTargets(lifeLostBatchEvent)) {
// skip controller
if (targetPlayer.equals(getControllerId())){
if (targetPlayer.equals(getControllerId())) {
continue;
}
opponentLostLife = true;

int lifelost = lifeLostBatchEvent.getLifeLostByPlayer(targetPlayer);
if (lifelost != 1){
int lifeLost = lifeLostBatchEvent.getLifeLostByPlayer(targetPlayer);
if (lifeLost != 1) {
allis1 = false;
break;
}
Expand Down
7 changes: 3 additions & 4 deletions Mage.Sets/src/mage/cards/o/OliviasAttendants.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.DamagedBatchEvent;
import mage.game.events.DamagedBatchAllEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.token.BloodToken;
import mage.target.common.TargetAnyTarget;
Expand Down Expand Up @@ -72,13 +72,12 @@ public OliviasAttendantsTriggeredAbility copy() {

@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_PLAYERS
|| event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_PERMANENTS;
return event.getType() == GameEvent.EventType.DAMAGED_BATCH_FOR_ALL;
}

@Override
public boolean checkTrigger(GameEvent event, Game game) {
int amount = ((DamagedBatchEvent) event)
int amount = ((DamagedBatchAllEvent) event)
.getEvents()
.stream()
.filter(e -> e.getAttackerId().equals(this.getSourceId()))
Expand Down
20 changes: 6 additions & 14 deletions Mage.Sets/src/mage/cards/r/RisonaAsariCommander.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.DamagedBatchEvent;
import mage.game.events.DamagedBatchForPlayersEvent;
import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
Expand Down Expand Up @@ -85,19 +85,11 @@ public boolean checkEventType(GameEvent event, Game game) {

@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (controllerId == null) {
return false;
}
if (!(event instanceof DamagedBatchEvent)) {
return false;
}
DamagedBatchEvent batchEvent = (DamagedBatchEvent) event;
for (DamagedEvent damageEvent : batchEvent.getEvents()) {
if (damageEvent.isCombatDamage() && controllerId.equals(damageEvent.getTargetId())) {
return true;
}
}
return false;
return ((DamagedBatchForPlayersEvent) event)
.getEvents()
.stream()
.filter(DamagedEvent::isCombatDamage)
.anyMatch(e -> e.getTargetId().equals(getControllerId()));
}
}

Expand Down
Loading
Loading