mirror of
https://github.com/magefree/mage.git
synced 2026-01-09 20:32:06 -08:00
* Banshee's Balde, Five-Alarm Fire, Descendant of Kiyomaro - Fixed that the combat damage triggered ability triggered multiple times if damage was dealt to multiple creatures instead of correctly only once per dealing creature and combat damage step.
This commit is contained in:
parent
8388225f90
commit
db68d881da
5 changed files with 56 additions and 34 deletions
|
|
@ -110,9 +110,9 @@ class UmezawasJitteAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event instanceof DamagedEvent) {
|
||||
Permanent p = game.getPermanent(event.getSourceId());
|
||||
if (!usedInPhase && ((DamagedEvent) event).isCombatDamage() && p != null && p.getAttachments().contains(this.getSourceId())) {
|
||||
if (event instanceof DamagedEvent && !usedInPhase && ((DamagedEvent) event).isCombatDamage()) {
|
||||
Permanent permanent = game.getPermanent(event.getSourceId());
|
||||
if (permanent != null && permanent.getAttachments().contains(this.getSourceId())) {
|
||||
usedInPhase = true;
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,10 +27,8 @@
|
|||
*/
|
||||
package mage.sets.gatecrash;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.UUID;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.Zone;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
|
|
@ -38,11 +36,15 @@ import mage.abilities.costs.common.RemoveCountersSourceCost;
|
|||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Rarity;
|
||||
import mage.constants.Zone;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.GameEvent.EventType;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.target.common.TargetCreatureOrPlayer;
|
||||
|
||||
|
|
@ -79,6 +81,10 @@ public class FiveAlarmFire extends CardImpl {
|
|||
|
||||
class FiveAlarmFireTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
// Because a creature that is blocked by multiple creatures it deals damage to, only causes to add one counter to ,
|
||||
// it's neccessary to remember which creature already triggered
|
||||
HashSet<UUID> triggeringCreatures = new HashSet<>();
|
||||
|
||||
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
|
||||
|
||||
public FiveAlarmFireTriggeredAbility() {
|
||||
|
|
@ -87,6 +93,7 @@ class FiveAlarmFireTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
public FiveAlarmFireTriggeredAbility(final FiveAlarmFireTriggeredAbility ability) {
|
||||
super(ability);
|
||||
triggeringCreatures.addAll(ability.triggeringCreatures);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -96,13 +103,24 @@ class FiveAlarmFireTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event.getType() == GameEvent.EventType.DAMAGED_CREATURE || event.getType() == GameEvent.EventType.DAMAGED_PLANESWALKER || event.getType() == GameEvent.EventType.DAMAGED_PLAYER) {
|
||||
if (event.getType() == GameEvent.EventType.DAMAGED_CREATURE
|
||||
|| event.getType() == GameEvent.EventType.DAMAGED_PLANESWALKER
|
||||
|| event.getType() == GameEvent.EventType.DAMAGED_PLAYER) {
|
||||
if (((DamagedEvent) event).isCombatDamage() && triggeringCreatures.contains(event.getSourceId())) {
|
||||
Permanent permanent = game.getPermanent(event.getSourceId());
|
||||
if(permanent != null && filter.match(permanent, sourceId, controllerId, game) && ((DamagedEvent) event).isCombatDamage()){
|
||||
if (permanent != null && filter.match(permanent, sourceId, controllerId, game)) {
|
||||
triggeringCreatures.add(event.getSourceId());
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
// reset the remembered creatures for every combat damage step
|
||||
if (event.getType().equals(EventType.COMBAT_DAMAGE_STEP_PRE)) {
|
||||
triggeringCreatures.clear();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -78,12 +78,16 @@ public class BansheesBlade extends CardImpl {
|
|||
|
||||
class BansheesBladeAbility extends TriggeredAbilityImpl {
|
||||
|
||||
private boolean usedInPhase;
|
||||
|
||||
public BansheesBladeAbility() {
|
||||
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.CHARGE.createInstance(1)));
|
||||
this.usedInPhase = false;
|
||||
}
|
||||
|
||||
public BansheesBladeAbility(final BansheesBladeAbility ability) {
|
||||
super(ability);
|
||||
this.usedInPhase = ability.usedInPhase;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -93,12 +97,16 @@ class BansheesBladeAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event instanceof DamagedEvent) {
|
||||
Permanent p = game.getPermanent(event.getSourceId());
|
||||
if (((DamagedEvent) event).isCombatDamage() && p != null && p.getAttachments().contains(this.getSourceId())) {
|
||||
if (event instanceof DamagedEvent && ((DamagedEvent) event).isCombatDamage() && !usedInPhase) {
|
||||
Permanent permanent = game.getPermanent(event.getSourceId());
|
||||
if (permanent != null && permanent.getAttachments().contains(this.getSourceId())) {
|
||||
usedInPhase = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (event.getType().equals(GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE)) {
|
||||
usedInPhase = false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ public class DescendantOfKiyomaro extends CardImpl {
|
|||
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinousEffect(
|
||||
new BoostSourceEffect(1,2, Duration.WhileOnBattlefield),
|
||||
new MoreCardsInHandThanOpponentsCondition(),
|
||||
"As long as you have more cards in hand than each opponent, Descendant of Kiyomaro gets +1/+2"));
|
||||
"As long as you have more cards in hand than each opponent, {this} gets +1/+2"));
|
||||
ability.addEffect(new ConditionalContinousEffect(
|
||||
new GainAbilitySourceEffect(new DealsCombatDamageTriggeredAbility(new GainLifeEffect(3), false)),
|
||||
new MoreCardsInHandThanOpponentsCondition(),
|
||||
|
|
|
|||
|
|
@ -34,28 +34,26 @@ import mage.constants.Zone;
|
|||
import mage.game.Game;
|
||||
import mage.game.events.DamagedEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
/**
|
||||
* This triggers only once for each phase the source creature deals damage.
|
||||
* So a creature blocked by two creatures and dealing damage to both blockers in the same
|
||||
* combat damage step triggers only once.
|
||||
*
|
||||
* @author LevelX
|
||||
*/
|
||||
public class DealsCombatDamageTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
private boolean setTargetPointer;
|
||||
private boolean usedInPhase;
|
||||
|
||||
public DealsCombatDamageTriggeredAbility(Effect effect, boolean optional) {
|
||||
this(effect, optional, false);
|
||||
}
|
||||
|
||||
public DealsCombatDamageTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) {
|
||||
super(Zone.BATTLEFIELD, effect, optional);
|
||||
this.setTargetPointer = setTargetPointer;
|
||||
this.usedInPhase = false;
|
||||
}
|
||||
|
||||
public DealsCombatDamageTriggeredAbility(final DealsCombatDamageTriggeredAbility ability) {
|
||||
super(ability);
|
||||
this.setTargetPointer = ability.setTargetPointer;
|
||||
this.usedInPhase = ability.usedInPhase;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -65,20 +63,18 @@ public class DealsCombatDamageTriggeredAbility extends TriggeredAbilityImpl {
|
|||
|
||||
@Override
|
||||
public boolean checkTrigger(GameEvent event, Game game) {
|
||||
if (event.getType() == GameEvent.EventType.DAMAGED_CREATURE || event.getType() == GameEvent.EventType.DAMAGED_PLANESWALKER || event.getType() == GameEvent.EventType.DAMAGED_PLAYER) {
|
||||
if (event.getSourceId().equals(this.sourceId)
|
||||
&& ((DamagedEvent) event).isCombatDamage()) {
|
||||
if (setTargetPointer) {
|
||||
for (Effect effect : this.getEffects()) {
|
||||
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
|
||||
effect.setValue("damage", event.getAmount());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (event instanceof DamagedEvent
|
||||
&& !usedInPhase
|
||||
&& event.getSourceId().equals(this.sourceId)
|
||||
&& ((DamagedEvent) event).isCombatDamage()) {
|
||||
usedInPhase = true;
|
||||
return true;
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (event.getType().equals(GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE)) {
|
||||
usedInPhase = false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue