Skip to content

Commit

Permalink
fix Jace & Tamiyo. add new batch event for Tamiyo.
Browse files Browse the repository at this point in the history
The new batch wanted a new 'same source' flag, so a new
constructor has been added to set a sourceId directly, and
resulted in cleaning up a few of the events setting sourceId
directly in their own constructor.
  • Loading branch information
Susucre committed Apr 28, 2024
1 parent 4fef77c commit b409e99
Show file tree
Hide file tree
Showing 35 changed files with 459 additions and 119 deletions.
62 changes: 23 additions & 39 deletions Mage.Sets/src/mage/cards/j/JaceCunningCastaway.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
package mage.cards.j;

import mage.abilities.Ability;
import mage.abilities.BatchTriggeredAbility;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.LoyaltyAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
Expand All @@ -13,14 +15,15 @@
import mage.constants.*;
import mage.game.Game;
import mage.game.events.DamagedBatchForOnePlayerEvent;
import mage.game.events.DamagedPlayerEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.JaceCunningCastawayIllusionToken;
import mage.target.targetpointer.FixedTarget;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Stream;

/**
* @author TheElk801
Expand All @@ -36,7 +39,7 @@ public JaceCunningCastaway(UUID ownerId, CardSetInfo setInfo) {
this.setStartingLoyalty(3);

// +1: Whenever one or more creatures you control deal combat damage to a player this turn, draw a card, then discard a card.
this.addAbility(new LoyaltyAbility(new JaceCunningCastawayEffect1(), 1));
this.addAbility(new LoyaltyAbility(new CreateDelayedTriggeredAbilityEffect(new JaceCunningCastawayDamageTriggeredAbility()), 1));

// -2: Create a 2/2 blue Illusion creature token with "When this creature becomes the target of a spell, sacrifice it."
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new JaceCunningCastawayIllusionToken()), -2));
Expand All @@ -55,33 +58,7 @@ public JaceCunningCastaway copy() {
}
}

class JaceCunningCastawayEffect1 extends OneShotEffect {

JaceCunningCastawayEffect1() {
super(Outcome.DrawCard);
this.staticText = "Whenever one or more creatures you control deal combat damage to a player this turn, draw a card, then discard a card";
}

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

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

@Override
public boolean apply(Game game, Ability source) {
DelayedTriggeredAbility delayedAbility = new JaceCunningCastawayDamageTriggeredAbility();
game.addDelayedTriggeredAbility(delayedAbility, source);
return true;
}
}

class JaceCunningCastawayDamageTriggeredAbility extends DelayedTriggeredAbility {

private final List<UUID> damagedPlayerIds = new ArrayList<>();
class JaceCunningCastawayDamageTriggeredAbility extends DelayedTriggeredAbility implements BatchTriggeredAbility<DamagedPlayerEvent> {

JaceCunningCastawayDamageTriggeredAbility() {
super(new DrawDiscardControllerEffect(1, 1), Duration.EndOfTurn, false);
Expand All @@ -102,17 +79,24 @@ public boolean checkEventType(GameEvent event, Game game) {
}

@Override
public boolean checkTrigger(GameEvent event, Game game) {

DamagedBatchForOnePlayerEvent dEvent = (DamagedBatchForOnePlayerEvent) event;

int damageFromYours = dEvent.getEvents()
public Stream<DamagedPlayerEvent> filterBatchEvent(GameEvent event, Game game) {
return ((DamagedBatchForOnePlayerEvent) event)
.getEvents()
.stream()
.filter(ev -> ev.getSourceId().equals(controllerId))
.mapToInt(GameEvent::getAmount)
.sum();
.filter(DamagedPlayerEvent::isCombatDamage)
.filter(e -> Optional
.of(e)
.map(DamagedPlayerEvent::getSourceId)
.map(game::getPermanentOrLKIBattlefield)
.filter(p -> p.isCreature(game))
.filter(p -> p.isControlledBy(getControllerId()))
.isPresent())
.filter(e -> e.getAmount() > 0);
}

return dEvent.isCombatDamage() && damageFromYours > 0;
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return filterBatchEvent(event, game).findAny().isPresent();
}

@Override
Expand Down
42 changes: 26 additions & 16 deletions Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.BatchTriggeredAbility;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.LoyaltyAbility;
import mage.abilities.effects.OneShotEffect;
Expand All @@ -12,29 +13,26 @@
import mage.abilities.effects.common.TapTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.command.emblems.TamiyoFieldResearcherEmblem;
import mage.game.events.DamagedBatchBySourceEvent;
import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import mage.constants.SuperType;
import java.util.stream.Stream;

/**
*
* @author LevelX2
*/
public final class TamiyoFieldResearcher extends CardImpl {
Expand Down Expand Up @@ -113,7 +111,10 @@ public boolean apply(Game game, Ability source) {
}
}

class TamiyoFieldResearcherDelayedTriggeredAbility extends DelayedTriggeredAbility {
// batch per source:
// > If Tamiyo’s first ability targets two creatures, and both deal combat damage at the same time, the delayed triggered ability triggers twice.
// > (2016-08-23)
class TamiyoFieldResearcherDelayedTriggeredAbility extends DelayedTriggeredAbility implements BatchTriggeredAbility<DamagedEvent> {

private int startingTurn;
private List<MageObjectReference> creatures;
Expand All @@ -132,18 +133,27 @@ private TamiyoFieldResearcherDelayedTriggeredAbility(final TamiyoFieldResearcher

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

@Override
public Stream<DamagedEvent> filterBatchEvent(GameEvent event, Game game) {
return ((DamagedBatchBySourceEvent) event)
.getEvents()
.stream()
.filter(DamagedEvent::isCombatDamage)
.filter(e -> Optional
.of(e)
.map(DamagedEvent::getSourceId)
.map(id -> new MageObjectReference(id, game))
.filter(mor -> creatures.contains(mor))
.isPresent())
.filter(e -> e.getAmount() > 0);
}

@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (((DamagedEvent) event).isCombatDamage()) {
Permanent damageSource = game.getPermanent(event.getSourceId());
if (damageSource != null) {
return creatures.contains(new MageObjectReference(damageSource, game));
}
}
return false;
return filterBatchEvent(event, game).findAny().isPresent();
}

@Override
Expand Down
6 changes: 3 additions & 3 deletions Mage.Sets/src/mage/cards/v/VesselOfTheAllConsuming.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,15 @@
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.watchers.Watcher;

import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.Map.Entry;
import java.util.UUID;

/**
* @author TheElk801
Expand Down Expand Up @@ -90,7 +89,8 @@ public VesselOfTheAllConsumingTriggeredAbility copy() {

@Override
public boolean checkEventType(GameEvent event, Game game) {
return event instanceof DamagedEvent;
return event.getType() == GameEvent.EventType.DAMAGED_PERMANENT
|| event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
}

@Override
Expand Down

0 comments on commit b409e99

Please sign in to comment.