* Some more changes concerning sourceObject handling in ability. Added early event type check for triggered abilities.

This commit is contained in:
LevelX2 2015-02-12 01:56:45 +01:00
parent b9da9cb6cb
commit 7b95da55a7
242 changed files with 1602 additions and 904 deletions

View file

@ -232,7 +232,7 @@ public abstract class AbilityImpl implements Ability {
// TODO: Because all (non targeted) choices have to be done during resolution
// this has to be removed, if all using effects are changed
sourceObject = game.getObject(sourceId);
sourceObject = this.getSourceObject(game);
if (sourceObject != null) {
sourceObject.adjustChoices(this, game);
}

View file

@ -60,6 +60,9 @@ import mage.game.events.GameEvent;
continue;
}
}
if (!ability.checkEventType(event, game)) {
continue;
}
if (ability.checkTrigger(event, game)) {
ability.trigger(game, ability.controllerId);
if (ability.getTriggerOnlyOnce()) {

View file

@ -67,6 +67,9 @@ public class TriggeredAbilities extends ConcurrentHashMap<String, TriggeredAbili
public void checkTriggers(GameEvent event, Game game) {
for (Iterator<TriggeredAbility> it = this.values().iterator(); it.hasNext();) {
TriggeredAbility ability = it.next();
if (!ability.checkEventType(event, game)) {
continue;
}
// for effects like when leaves battlefield or destroyed use ShortLKI to check if permanent was in the correct zone before (e.g. Oblivion Ring or Karmic Justice)
if (ability.isInUseableZone(game, null, event.getType().equals(EventType.ZONE_CHANGE) || event.getType().equals(EventType.DESTROYED_PERMANENT))) {
if (!game.getContinuousEffects().preventedByRuleModification(event, ability, game, false)) {

View file

@ -28,12 +28,10 @@
package mage.abilities;
import mage.MageObject;
import java.util.UUID;
import mage.game.Game;
import mage.game.events.GameEvent;
import java.util.UUID;
/**
*
* @author BetaSteward_at_googlemail.com
@ -41,8 +39,19 @@ import java.util.UUID;
public interface TriggeredAbility extends Ability {
void trigger(Game game, UUID controllerId);
/**
* This check for the relevant event types is called at first to prevent further actions if
* the current event is ignored from this triggered ability
* @param event
* @param game
* @return
*/
boolean checkEventType(GameEvent event, Game game);
boolean checkTrigger(GameEvent event, Game game);
boolean checkInterveningIfClause(Game game);
@Override
TriggeredAbility copy();
}

View file

@ -34,6 +34,7 @@ import mage.abilities.effects.Effect;
import mage.constants.AbilityType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.players.Player;
/**
@ -75,6 +76,12 @@ public abstract class TriggeredAbilityImpl extends AbilityImpl implements Trigge
return true;
}
// TODO: Implement for all TriggeredAbilities so this default method can be removed
@Override
public boolean checkEventType(GameEvent event, Game game) {
return true;
}
@Override
public boolean resolve(Game game) {
MageObject object = game.getObject(sourceId);

View file

@ -62,9 +62,14 @@ public class ConstellationAbility extends TriggeredAbilityImpl {
return new ConstellationAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD && event.getPlayerId().equals(this.getControllerId())) {
if (event.getPlayerId().equals(this.getControllerId())) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getCardType().contains(CardType.ENCHANTMENT)) {
return true;

View file

@ -75,9 +75,14 @@ public class KinshipAbility extends TriggeredAbilityImpl {
return new KinshipAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return event.getType().equals(GameEvent.EventType.UPKEEP_STEP_PRE) && event.getPlayerId().equals(this.controllerId);
return event.getPlayerId().equals(this.controllerId);
}
@Override

View file

@ -50,16 +50,19 @@ public class AllyEntersBattlefieldTriggeredAbility extends TriggeredAbilityImpl
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD) {
UUID targetId = event.getTargetId();
Permanent permanent = game.getPermanent(targetId);
if (permanent.getControllerId().equals(this.controllerId)
&& (targetId.equals(this.getSourceId())
|| (permanent.hasSubtype("Ally") && !targetId.equals(this.getSourceId())))) {
return true;
}
UUID targetId = event.getTargetId();
Permanent permanent = game.getPermanent(targetId);
if (permanent.getControllerId().equals(this.controllerId)
&& (targetId.equals(this.getSourceId())
|| (permanent.hasSubtype("Ally") && !targetId.equals(this.getSourceId())))) {
return true;
}
return false;
}

View file

@ -22,9 +22,14 @@ public class AnotherCreatureEntersBattlefieldTriggeredAbility extends TriggeredA
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD && event.getTargetId() != this.getSourceId()) {
if (event.getTargetId() != this.getSourceId()) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent.getCardType().contains(CardType.CREATURE)) {
return true;

View file

@ -67,19 +67,22 @@ public class AttackedByCreatureTriggeredAbility extends TriggeredAbilityImpl {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED) {
UUID playerId = game.getCombat().getDefendingPlayerId(event.getSourceId(), game);
Permanent attackingCreature = game.getPermanent(event.getSourceId());
if (getControllerId().equals(playerId) && attackingCreature != null) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}
UUID playerId = game.getCombat().getDefendingPlayerId(event.getSourceId(), game);
Permanent attackingCreature = game.getPermanent(event.getSourceId());
if (getControllerId().equals(playerId) && attackingCreature != null) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}
return true;
}
return true;
}
return false;
}

View file

@ -73,42 +73,45 @@ public class AttacksAllTriggeredAbility extends TriggeredAbilityImpl {
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType().equals(GameEvent.EventType.ATTACKER_DECLARED)) {
Permanent permanent = game.getPermanent(event.getSourceId());
if (filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (attacksYouOrYourPlaneswalker) {
boolean check = false;
if (event.getTargetId().equals(getControllerId())) {
check = true;
} else {
Permanent planeswalker = game.getPermanent(event.getTargetId());
if (planeswalker != null && planeswalker.getCardType().contains(CardType.PLANESWALKER) && planeswalker.getControllerId().equals(getControllerId())) {
check = true;
}
}
if (!check) {
return false;
}
}
switch(setTargetPointer) {
case PERMANENT:
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(permanent.getId()));
}
break;
case PLAYER:
UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(permanent.getId(), game);
if (defendingPlayerId != null) {
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(defendingPlayerId));
}
}
break;
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanent(event.getSourceId());
if (filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (attacksYouOrYourPlaneswalker) {
boolean check = false;
if (event.getTargetId().equals(getControllerId())) {
check = true;
} else {
Permanent planeswalker = game.getPermanent(event.getTargetId());
if (planeswalker != null && planeswalker.getCardType().contains(CardType.PLANESWALKER) && planeswalker.getControllerId().equals(getControllerId())) {
check = true;
}
}
if (!check) {
return false;
}
return true;
}
switch(setTargetPointer) {
case PERMANENT:
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(permanent.getId()));
}
break;
case PLAYER:
UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(permanent.getId(), game);
if (defendingPlayerId != null) {
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(defendingPlayerId));
}
}
break;
}
return true;
}
return false;
}

View file

@ -69,11 +69,15 @@ public class AttacksAttachedTriggeredAbility extends TriggeredAbilityImpl {
return new AttacksAttachedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent equipment = game.getPermanent(this.sourceId);
if (equipment != null && equipment.getAttachedTo() != null
&& event.getType() == GameEvent.EventType.ATTACKER_DECLARED
&& event.getSourceId().equals(equipment.getAttachedTo())) {
return true;
}

View file

@ -74,18 +74,21 @@ public class AttacksCreatureYouControlTriggeredAbility extends TriggeredAbilityI
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED) {
Permanent sourcePermanent = game.getPermanent(event.getSourceId());
if (sourcePermanent != null && filter.match(sourcePermanent, sourceId, controllerId, game)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}
Permanent sourcePermanent = game.getPermanent(event.getSourceId());
if (sourcePermanent != null && filter.match(sourcePermanent, sourceId, controllerId, game)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}
return true;
}
return true;
}
return false;
}

View file

@ -23,14 +23,17 @@ public class AttacksOrBlocksEnchantedTriggeredAbility extends TriggeredAbilityIm
public AttacksOrBlocksEnchantedTriggeredAbility copy() {
return new AttacksOrBlocksEnchantedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED || event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent enchantment = game.getPermanent(this.getSourceId());
if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED || event.getType() == GameEvent.EventType.BLOCKER_DECLARED) {
if (enchantment != null && event.getSourceId().equals(enchantment.getAttachedTo())) {
return true;
}
if (enchantment != null && event.getSourceId().equals(enchantment.getAttachedTo())) {
return true;
}
return false;
}

View file

@ -24,14 +24,13 @@ public class AttacksOrBlocksTriggeredAbility extends TriggeredAbilityImpl {
public String getRule() {
return "When {this} attacks or blocks, " + super.getRule();
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACKER_DECLARED || event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED || event.getType() == GameEvent.EventType.BLOCKER_DECLARED) {
if (event.getSourceId().equals(this.getSourceId())) {
return true;
}
}
return false;
return event.getSourceId().equals(this.getSourceId());
}
}

View file

@ -67,10 +67,14 @@ public class AttacksTriggeredAbility extends TriggeredAbilityImpl {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DECLARED_ATTACKERS
&& game.getCombat().getAttackers().contains(this.getSourceId()) ) {
if (game.getCombat().getAttackers().contains(this.getSourceId()) ) {
switch(setTargetPointer) {
case PLAYER:
UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(getSourceId(), game);

View file

@ -48,9 +48,14 @@ public class AuraAttachedTriggeredAbility extends TriggeredAbilityImpl {
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ATTACHED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ATTACHED && event.getTargetId().equals(this.getSourceId())) {
if (event.getTargetId().equals(this.getSourceId())) {
Permanent attachment = game.getPermanent(event.getSourceId());
if (attachment != null && attachment.getSubtype().contains("Aura")) {
return true;

View file

@ -63,18 +63,21 @@ public class BecomesBlockedAllTriggeredAbility extends TriggeredAbilityImpl {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.CREATURE_BLOCKED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.CREATURE_BLOCKED) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (setTargetPointer) {
for(Effect effect :this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (setTargetPointer) {
for(Effect effect :this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
return true;
}
return true;
}
return false;
}

View file

@ -48,9 +48,14 @@ public class BecomesBlockedByCreatureTriggeredAbility extends TriggeredAbilityIm
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.BLOCKER_DECLARED && event.getTargetId().equals(this.getSourceId())) {
if (event.getTargetId().equals(this.getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}

View file

@ -48,12 +48,14 @@ public class BecomesBlockedTriggeredAbility extends TriggeredAbilityImpl {
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.CREATURE_BLOCKED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.CREATURE_BLOCKED && event.getTargetId().equals(this.getSourceId())) {
return true;
}
return false;
return event.getTargetId().equals(this.getSourceId());
}
@Override

View file

@ -56,9 +56,14 @@ public class BecomesMonstrousSourceTriggeredAbility extends TriggeredAbilityImpl
return new BecomesMonstrousSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.BECOMES_MONSTROUS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType().equals(EventType.BECOMES_MONSTROUS) && event.getSourceId().equals(this.getSourceId())) {
if (event.getSourceId().equals(this.getSourceId())) {
this.monstrosityValue = event.getAmount();
return true;
}

View file

@ -31,14 +31,17 @@ public class BecomesTappedCreatureControlledTriggeredAbility extends TriggeredAb
return new BecomesTappedCreatureControlledTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TAPPED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.TAPPED) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getControllerId().equals(this.controllerId)
&& permanent.getCardType().contains(CardType.CREATURE)) {
return true;
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getControllerId().equals(this.controllerId)
&& permanent.getCardType().contains(CardType.CREATURE)) {
return true;
}
return false;
}

View file

@ -57,12 +57,14 @@ public class BecomesTappedTriggeredAbility extends TriggeredAbilityImpl {
return new BecomesTappedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TAPPED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.TAPPED && event.getTargetId().equals(sourceId)) {
return true;
}
return false;
return event.getTargetId().equals(sourceId);
}
@Override

View file

@ -54,13 +54,16 @@ public class BecomesTargetControllerSpellTriggeredAbility extends TriggeredAbili
return new BecomesTargetControllerSpellTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.TARGETED) {
if (event.getTargetId().equals(controllerId)) {
if (game.getObject(event.getSourceId()) instanceof Spell) {
return true;
}
if (event.getTargetId().equals(controllerId)) {
if (game.getObject(event.getSourceId()) instanceof Spell) {
return true;
}
}
return false;

View file

@ -53,12 +53,14 @@ public class BecomesTargetTriggeredAbility extends TriggeredAbilityImpl {
return new BecomesTargetTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.TARGETED && event.getTargetId().equals(sourceId)) {
return true;
}
return false;
return event.getTargetId().equals(sourceId);
}
@Override

View file

@ -34,38 +34,41 @@ public class BeginningOfCombatTriggeredAbility extends TriggeredAbilityImpl {
return new BeginningOfCombatTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.BEGIN_COMBAT_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.BEGIN_COMBAT_STEP_PRE) {
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours && setTargetPointer) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours && setTargetPointer) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
break;
case ANY:
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
}
break;
case ANY:
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
return false;
}

View file

@ -72,62 +72,65 @@ public class BeginningOfDrawTriggeredAbility extends TriggeredAbilityImpl {
return new BeginningOfDrawTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DRAW_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.DRAW_STEP_PRE) {
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
break;
case NOT_YOU:
if (!this.controllerId.equals(event.getPlayerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
break;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
}
break;
case ANY:
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
}
break;
case NOT_YOU:
if (!this.controllerId.equals(event.getPlayerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
break;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
}
break;
case ANY:
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
return false;
}

View file

@ -35,6 +35,7 @@ import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
@ -63,22 +64,46 @@ public class BeginningOfEndStepTriggeredAbility extends TriggeredAbilityImpl {
return new BeginningOfEndStepTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.END_TURN_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.END_TURN_STEP_PRE) {
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
break;
case ANY:
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
@ -86,28 +111,7 @@ public class BeginningOfEndStepTriggeredAbility extends TriggeredAbilityImpl {
}
return true;
}
break;
case ANY:
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
}
}
}
}
return false;
}

View file

@ -43,38 +43,41 @@ public class BeginningOfPreCombatMainTriggeredAbility extends TriggeredAbilityIm
return new BeginningOfPreCombatMainTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.PRECOMBAT_MAIN_PHASE_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.PRECOMBAT_MAIN_PHASE_PRE) {
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours && setTargetPointer) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours && setTargetPointer) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
break;
case ANY:
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
}
break;
case ANY:
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
return false;
}

View file

@ -40,52 +40,55 @@ public class BeginningOfUntapTriggeredAbility extends TriggeredAbilityImpl {
return new BeginningOfUntapTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UNTAP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.UNTAP_STEP_PRE) {
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return yours;
case NOT_YOU:
Player controller = game.getPlayer(this.getControllerId());
if (controller != null && controller.getInRange().contains(event.getPlayerId()) && !event.getPlayerId().equals(this.getControllerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return yours;
case NOT_YOU:
Player controller = game.getPlayer(this.getControllerId());
if (controller != null && controller.getInRange().contains(event.getPlayerId()) && !event.getPlayerId().equals(this.getControllerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
break;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
break;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
break;
case ANY:
controller = game.getPlayer(this.getControllerId());
if (controller != null && controller.getInRange().contains(event.getPlayerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
break;
case ANY:
controller = game.getPlayer(this.getControllerId());
if (controller != null && controller.getInRange().contains(event.getPlayerId())) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
}
return true;
}
}
return false;
}

View file

@ -79,22 +79,46 @@ public class BeginningOfUpkeepTriggeredAbility extends TriggeredAbilityImpl {
return new BeginningOfUpkeepTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE) {
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours && setTargetPointer) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
switch (targetController) {
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours && setTargetPointer) {
if (getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (setTargetPointer && getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
break;
case ANY:
if (setTargetPointer && getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
if (setTargetPointer && getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
@ -102,31 +126,10 @@ public class BeginningOfUpkeepTriggeredAbility extends TriggeredAbilityImpl {
}
return true;
}
break;
case ANY:
if (setTargetPointer && getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
if (setTargetPointer && getTargets().size() == 0) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
}
break;
default:
throw new UnsupportedOperationException("Value for targetController not supported: " + targetController.toString());
}
}
break;
default:
throw new UnsupportedOperationException("Value for targetController not supported: " + targetController.toString());
}
return false;
}

View file

@ -25,12 +25,14 @@ public class BeginningOfYourEndStepTriggeredAbility extends TriggeredAbilityImpl
return new BeginningOfYourEndStepTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.END_TURN_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.END_TURN_STEP_PRE && event.getPlayerId().equals(this.controllerId)) {
return true;
}
return false;
return event.getPlayerId().equals(this.controllerId);
}
@Override

View file

@ -39,7 +39,8 @@ import mage.game.permanent.Permanent;
* @author garnold
*/
public class BlocksAttachedTriggeredAbility extends TriggeredAbilityImpl{
private String attachedDescription;
private final String attachedDescription;
public BlocksAttachedTriggeredAbility(Effect effect, String attachedDescription, boolean optional) {
super(Zone.BATTLEFIELD, effect, optional);
@ -56,13 +57,16 @@ public class BlocksAttachedTriggeredAbility extends TriggeredAbilityImpl{
return new BlocksAttachedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DECLARED_BLOCKERS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.DECLARED_BLOCKERS) {
Permanent attachment = game.getPermanent(this.getSourceId());
if (attachment != null && attachment.getAttachedTo() != null && game.getCombat().getBlockers().contains(attachment.getAttachedTo())) {
return true;
}
Permanent attachment = game.getPermanent(this.getSourceId());
if (attachment != null && attachment.getAttachedTo() != null && game.getCombat().getBlockers().contains(attachment.getAttachedTo())) {
return true;
}
return false;
}

View file

@ -74,23 +74,26 @@ public class BlocksCreatureAttachedTriggeredAbility extends TriggeredAbilityImpl
return new BlocksCreatureAttachedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.BLOCKER_DECLARED) {
Permanent p = game.getPermanent(event.getSourceId());
if (p != null && p.getAttachments().contains(this.getSourceId())) {
if (setFixedTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
Permanent p = game.getPermanent(event.getSourceId());
if (p != null && p.getAttachments().contains(this.getSourceId())) {
if (setFixedTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
if (setFixedTargetPointerToBlocked) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
}
return true;
}
if (setFixedTargetPointerToBlocked) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
}
return true;
}
return false;
}

View file

@ -57,9 +57,14 @@ public class BlocksCreatureTriggeredAbility extends TriggeredAbilityImpl {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.BLOCKER_DECLARED && event.getSourceId().equals(this.getSourceId())) {
if (event.getSourceId().equals(this.getSourceId())) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));

View file

@ -56,21 +56,24 @@ public class BlocksOrBecomesBlockedByCreatureTriggeredAbility extends TriggeredA
this.rule = ability.rule;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.BLOCKER_DECLARED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.BLOCKER_DECLARED) {
if (event.getSourceId().equals(this.getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
return true;
if (event.getSourceId().equals(this.getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
if (event.getTargetId().equals(this.getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}
return true;
return true;
}
if (event.getTargetId().equals(this.getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}
return true;
}
return false;
}

View file

@ -48,6 +48,11 @@ public class BlocksOrBecomesBlockedTriggeredAbility extends TriggeredAbilityImpl
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.BLOCKER_DECLARED || event.getType() == GameEvent.EventType.CREATURE_BLOCKED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.BLOCKER_DECLARED && event.getSourceId().equals(this.getSourceId())) {

View file

@ -40,25 +40,26 @@ import mage.game.events.GameEvent.EventType;
*/
public class BlocksTriggeredAbility extends TriggeredAbilityImpl {
// private boolean fixedTargetPointer;
public BlocksTriggeredAbility(Effect effect, boolean optional) {
this(effect, optional, false);
}
public BlocksTriggeredAbility(Effect effect, boolean optional, boolean fixedTargetPointer) {
super(Zone.BATTLEFIELD, effect, optional);
// this.fixedTargetPointer = fixedTargetPointer;
}
public BlocksTriggeredAbility(final BlocksTriggeredAbility ability) {
super(ability);
// this.fixedTargetPointer = ability.fixedTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.DECLARED_BLOCKERS;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DECLARED_BLOCKERS && game.getCombat().getBlockers().contains(this.getSourceId())) {
if (game.getCombat().getBlockers().contains(this.getSourceId())) {
return true;
}
return false;

View file

@ -111,23 +111,26 @@ public class CreatureEntersBattlefieldTriggeredAbility extends TriggeredAbilityI
this.filter = ability.filter;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (filter.match(permanent, sourceId, controllerId, game)
&& (permanent.getControllerId().equals(this.controllerId) ^ opponentController)) {
if (!this.getTargets().isEmpty()) {
Target target = this.getTargets().get(0);
if (target instanceof TargetPlayer) {
target.add(permanent.getControllerId(), game);
}
if (target instanceof TargetCreaturePermanent) {
target.add(event.getTargetId(), game);
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (filter.match(permanent, sourceId, controllerId, game)
&& (permanent.getControllerId().equals(this.controllerId) ^ opponentController)) {
if (!this.getTargets().isEmpty()) {
Target target = this.getTargets().get(0);
if (target instanceof TargetPlayer) {
target.add(permanent.getControllerId(), game);
}
if (target instanceof TargetCreaturePermanent) {
target.add(event.getTargetId(), game);
}
return true;
}
return true;
}
return false;
}

View file

@ -53,14 +53,16 @@ public class CycleAllTriggeredAbility extends TriggeredAbilityImpl {
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY) {
StackObject item = game.getState().getStack().getFirst();
if (item instanceof StackAbility
&& ((StackAbility)item).getStackAbility() instanceof CyclingAbility) {
return true;
}
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ACTIVATED_ABILITY;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
StackObject item = game.getState().getStack().getFirst();
if (item instanceof StackAbility
&& ((StackAbility)item).getStackAbility() instanceof CyclingAbility) {
return true;
}
return false;
}

View file

@ -59,14 +59,17 @@ public class CycleTriggeredAbility extends ZoneChangeTriggeredAbility {
return true;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ACTIVATED_ABILITY;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ACTIVATED_ABILITY){
if(event.getSourceId().equals(this.getSourceId())) {
StackObject object = game.getStack().getStackObject(event.getSourceId());
if(object != null && object.getStackAbility() instanceof CyclingAbility){
return true;
}
if(event.getSourceId().equals(this.getSourceId())) {
StackObject object = game.getStack().getStackObject(event.getSourceId());
if(object != null && object.getStackAbility() instanceof CyclingAbility){
return true;
}
}
return false;

View file

@ -65,21 +65,23 @@ public class DealsCombatDamageToACreatureTriggeredAbility extends TriggeredAbili
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DAMAGED_CREATURE) {
if (event.getSourceId().equals(this.sourceId)
&& ((DamagedCreatureEvent) event).isCombatDamage()) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
effect.setValue("damage", event.getAmount());
}
}
return true;
}
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_CREATURE;
}
}
return false;
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getSourceId().equals(this.sourceId)
&& ((DamagedCreatureEvent) event).isCombatDamage()) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
effect.setValue("damage", event.getAmount());
}
}
return true;
}
return false;
}
@Override

View file

@ -63,9 +63,14 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility
return new DealsCombatDamageToAPlayerTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DAMAGED_PLAYER && event.getSourceId().equals(this.sourceId)
if (event.getSourceId().equals(this.sourceId)
&& ((DamagedPlayerEvent) event).isCombatDamage()) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {

View file

@ -61,6 +61,11 @@ public class DealsCombatDamageTriggeredAbility extends TriggeredAbilityImpl {
return new DealsCombatDamageTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event instanceof DamagedEvent || event.getType() == GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event instanceof DamagedEvent

View file

@ -58,18 +58,20 @@ public class DealsDamageGainLifeSourceTriggeredAbility extends TriggeredAbilityI
public DealsDamageGainLifeSourceTriggeredAbility copy() {
return new DealsDamageGainLifeSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_CREATURE
|| event.getType() == GameEvent.EventType.DAMAGED_PLAYER
|| event.getType() == GameEvent.EventType.DAMAGED_PLANESWALKER;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType().equals(GameEvent.EventType.DAMAGED_CREATURE)
|| event.getType().equals(GameEvent.EventType.DAMAGED_PLAYER)
|| event.getType().equals(GameEvent.EventType.DAMAGED_PLANESWALKER)) {
if (event.getSourceId().equals(this.getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setValue("damage", event.getAmount());
}
return true;
if (event.getSourceId().equals(this.getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setValue("damage", event.getAmount());
}
return true;
}
return false;
}

View file

@ -67,25 +67,29 @@ public class DealsDamageToACreatureAttachedTriggeredAbility extends TriggeredAbi
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DAMAGED_CREATURE
&& (!combatOnly || ((DamagedCreatureEvent) event).isCombatDamage())) {
Permanent attachment = game.getPermanent(this.getSourceId());
if (attachment != null
&& attachment.getAttachedTo() != null
&& event.getSourceId().equals(attachment.getAttachedTo())
) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
effect.setValue("damage", event.getAmount());
}
}
return true;
}
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_CREATURE;
}
}
return false;
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (!combatOnly || ((DamagedCreatureEvent) event).isCombatDamage()) {
Permanent attachment = game.getPermanent(this.getSourceId());
if (attachment != null
&& attachment.getAttachedTo() != null
&& event.getSourceId().equals(attachment.getAttachedTo())
) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
effect.setValue("damage", event.getAmount());
}
}
return true;
}
}
return false;
}
@Override

View file

@ -68,28 +68,30 @@ public class DealsDamageToACreatureTriggeredAbility extends TriggeredAbilityImpl
public DealsDamageToACreatureTriggeredAbility copy() {
return new DealsDamageToACreatureTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_CREATURE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DAMAGED_CREATURE) {
if (event.getSourceId().equals(this.sourceId)
&& (!combatOnly || ((DamagedCreatureEvent) event).isCombatDamage())) {
if (filter != null) {
Permanent creature = game.getPermanentOrLKIBattlefield(event.getTargetId());
if (creature == null || !filter.match(creature, getSourceId(), getControllerId(), game)) {
return false;
}
if (event.getSourceId().equals(this.sourceId)
&& (!combatOnly || ((DamagedCreatureEvent) event).isCombatDamage())) {
if (filter != null) {
Permanent creature = game.getPermanentOrLKIBattlefield(event.getTargetId());
if (creature == null || !filter.match(creature, getSourceId(), getControllerId(), game)) {
return false;
}
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
effect.setValue("damage", event.getAmount());
}
}
return true;
}
}
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
effect.setValue("damage", event.getAmount());
}
}
return true;
}
return false;
}

View file

@ -69,10 +69,14 @@ public class DealsDamageToAPlayerAllTriggeredAbility extends TriggeredAbilityImp
return new DealsDamageToAPlayerAllTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DAMAGED_PLAYER
&& (!onlyCombat || ((DamagedPlayerEvent) event).isCombatDamage())) {
if (!onlyCombat || ((DamagedPlayerEvent) event).isCombatDamage()) {
Permanent permanent = game.getPermanent(event.getSourceId());
if (permanent != null && filter.match(permanent, sourceId, controllerId, game)) {
if (!setTargetPointer.equals(SetTargetPointer.NONE)) {
@ -86,7 +90,7 @@ public class DealsDamageToAPlayerAllTriggeredAbility extends TriggeredAbilityImp
effect.setTargetPointer(new FixedTarget(permanent.getId()));
break;
}
}
}
return true;

View file

@ -53,26 +53,29 @@ public class DealsDamageToAPlayerAttachedTriggeredAbility extends TriggeredAbili
return new DealsDamageToAPlayerAttachedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event instanceof DamagedPlayerEvent;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event instanceof DamagedPlayerEvent) {
if (targetController.equals(TargetController.OPPONENT)) {
Player controller = game.getPlayer(this.getControllerId());
if (controller == null || !game.isOpponent(controller, event.getPlayerId())) {
return false;
if (targetController.equals(TargetController.OPPONENT)) {
Player controller = game.getPlayer(this.getControllerId());
if (controller == null || !game.isOpponent(controller, event.getPlayerId())) {
return false;
}
}
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
Permanent p = game.getPermanent(event.getSourceId());
if ((!onlyCombat || damageEvent.isCombatDamage())
&& p != null && p.getAttachments().contains(this.getSourceId())) {
if (setFixedTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
Permanent p = game.getPermanent(event.getSourceId());
if ((!onlyCombat || damageEvent.isCombatDamage())
&& p != null && p.getAttachments().contains(this.getSourceId())) {
if (setFixedTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return true;
}
return true;
}
return false;
}

View file

@ -62,9 +62,14 @@ public class DealsDamageToAPlayerTriggeredAbility extends TriggeredAbilityImpl {
return new DealsDamageToAPlayerTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DAMAGED_PLAYER && event.getSourceId().equals(this.sourceId)) {
if (event.getSourceId().equals(this.sourceId)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));

View file

@ -54,15 +54,18 @@ public class DealtDamageToSourceTriggeredAbility extends TriggeredAbilityImpl {
return new DealtDamageToSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_CREATURE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.DAMAGED_CREATURE) {
if (event.getTargetId().equals(getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setValue("damage", event.getAmount());
}
return true;
if (event.getTargetId().equals(getSourceId())) {
for (Effect effect : this.getEffects()) {
effect.setValue("damage", event.getAmount());
}
return true;
}
return false;
}

View file

@ -1,6 +1,5 @@
package mage.abilities.common;
import mage.MageObject;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.constants.CardType;
@ -8,7 +7,6 @@ import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
public class DiesAndDealtDamageThisTurnTriggeredAbility extends TriggeredAbilityImpl {
@ -30,9 +28,14 @@ public class DiesAndDealtDamageThisTurnTriggeredAbility extends TriggeredAbility
return new DiesAndDealtDamageThisTurnTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).isDiesEvent()) {
if (((ZoneChangeEvent)event).isDiesEvent()) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getTarget().getCardType().contains(CardType.CREATURE) &&
zEvent.getTarget().getDealtDamageByThisTurn().contains(this.sourceId)) {

View file

@ -43,9 +43,14 @@ public class DiesAttachedTriggeredAbility extends TriggeredAbilityImpl {
return new DiesAttachedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).isDiesEvent()) {
if (((ZoneChangeEvent)event).isDiesEvent()) {
Permanent p = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
if (p.getAttachments().contains(this.getSourceId())) {
for (Effect effect : getEffects()) {

View file

@ -55,24 +55,23 @@ public class DiesCreatureTriggeredAbility extends TriggeredAbilityImpl {
return new DiesCreatureTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType().equals(GameEvent.EventType.ZONE_CHANGE)) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
// why is this check neccessary?
// if (game.getPermanentOrLKIBattlefield(sourceId) == null) {
// return false;
// }
if (zEvent.getFromZone().equals(Zone.BATTLEFIELD) && zEvent.getToZone().equals(Zone.GRAVEYARD)) {
Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
if (permanent != null && filter.match(permanent, sourceId, controllerId, game)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getFromZone().equals(Zone.BATTLEFIELD) && zEvent.getToZone().equals(Zone.GRAVEYARD)) {
Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
if (permanent != null && filter.match(permanent, sourceId, controllerId, game)) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
return true;
}
return true;
}
}
return false;

View file

@ -62,26 +62,29 @@ public class DiesThisOrAnotherCreatureTriggeredAbility extends TriggeredAbilityI
return new DiesThisOrAnotherCreatureTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (game.getPermanent(sourceId) == null) {
if (game.getLastKnownInformation(sourceId, Zone.BATTLEFIELD) == null) {
return false;
}
if (game.getPermanent(sourceId) == null) {
if (game.getLastKnownInformation(sourceId, Zone.BATTLEFIELD) == null) {
return false;
}
}
if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) {
Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
if (permanent != null) {
if (permanent.getId().equals(this.getSourceId())) {
if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) {
Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
if (permanent != null) {
if (permanent.getId().equals(this.getSourceId())) {
return true;
} else {
if (filter.match(permanent, sourceId, controllerId, game)) {
return true;
} else {
if (filter.match(permanent, sourceId, controllerId, game)) {
return true;
}
}
}
}

View file

@ -30,12 +30,14 @@ public class DiscardsACardOpponentTriggeredAbility extends TriggeredAbilityImpl
return new DiscardsACardOpponentTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DISCARDED_CARD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DISCARDED_CARD && game.getOpponents(controllerId).contains(event.getPlayerId())) {
return true;
}
return false;
return game.getOpponents(controllerId).contains(event.getPlayerId());
}
@Override

View file

@ -47,12 +47,14 @@ public class DrawCardControllerTriggeredAbility extends TriggeredAbilityImpl {
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DREW_CARD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.DREW_CARD && event.getPlayerId().equals(controllerId)) {
return true;
}
return false;
return event.getPlayerId().equals(controllerId);
}
@Override

View file

@ -59,9 +59,14 @@ public class DrawCardOpponentTriggeredAbility extends TriggeredAbilityImpl {
return new DrawCardOpponentTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DREW_CARD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.DREW_CARD && game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
if (setTargetPointer) {
for (Effect effect:this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));

View file

@ -53,9 +53,14 @@ public class EntersAnotherCreatureYourControlTriggeredAbility extends ZoneChange
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD && !event.getTargetId().equals(this.getSourceId())) {
if (!event.getTargetId().equals(this.getSourceId())) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getCardType().contains(CardType.CREATURE) && permanent.getControllerId().equals(this.getControllerId())) {
return true;

View file

@ -96,27 +96,30 @@ public class EntersBattlefieldAllTriggeredAbility extends TriggeredAbilityImpl {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) {
UUID targetId = event.getTargetId();
Permanent permanent = game.getPermanent(targetId);
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (!setTargetPointer.equals(SetTargetPointer.NONE)) {
for (Effect effect : this.getEffects()) {
switch(setTargetPointer) {
case PERMANENT:
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
break;
case PLAYER:
effect.setTargetPointer(new FixedTarget(permanent.getControllerId()));
break;
}
UUID targetId = event.getTargetId();
Permanent permanent = game.getPermanent(targetId);
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (!setTargetPointer.equals(SetTargetPointer.NONE)) {
for (Effect effect : this.getEffects()) {
switch(setTargetPointer) {
case PERMANENT:
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
break;
case PLAYER:
effect.setTargetPointer(new FixedTarget(permanent.getControllerId()));
break;
}
}
return true;
}
return true;
}
return false;
}

View file

@ -56,6 +56,11 @@ public class EntersBattlefieldOrDiesSourceTriggeredAbility extends TriggeredAbil
return new EntersBattlefieldOrDiesSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD || event.getType() == GameEvent.EventType.ZONE_CHANGE ;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD

View file

@ -66,13 +66,14 @@ public class EntersBattlefieldTriggeredAbility extends TriggeredAbilityImpl {
this.noRule = ability.noRule;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD
&& event.getTargetId().equals(getSourceId())) {
return true;
}
return false;
return event.getTargetId().equals(getSourceId());
}
@Override

View file

@ -55,6 +55,11 @@ public class EntersOrLeavesTheBattlefieldSourceTriggeredAbility extends Triggere
return new EntersOrLeavesTheBattlefieldSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD || event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD

View file

@ -62,9 +62,14 @@ public class GainLifeControllerTriggeredAbility extends TriggeredAbilityImpl {
return new GainLifeControllerTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.GAINED_LIFE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.GAINED_LIFE && event.getPlayerId().equals(this.getControllerId())) {
if (event.getPlayerId().equals(this.getControllerId())) {
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));

View file

@ -55,13 +55,16 @@ public class LandfallAbility extends TriggeredAbilityImpl {
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ENTERS_THE_BATTLEFIELD) {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND) && permanent.getControllerId().equals(this.controllerId)) {
return true;
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND) && permanent.getControllerId().equals(this.controllerId)) {
return true;
}
return false;
}

View file

@ -28,10 +28,9 @@
package mage.abilities.common;
import mage.constants.Zone;
import mage.abilities.effects.Effect;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.constants.Zone;
/**
*

View file

@ -28,9 +28,9 @@
package mage.abilities.common;
import mage.constants.Zone;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
@ -41,8 +41,8 @@ import mage.game.events.GameEvent.EventType;
*/
public class OnEventTriggeredAbility extends TriggeredAbilityImpl {
private EventType eventType;
private String eventName;
private final EventType eventType;
private final String eventName;
private boolean allPlayers = false;
public OnEventTriggeredAbility(EventType eventType, String eventName, Effect effect) {
@ -71,12 +71,15 @@ public class OnEventTriggeredAbility extends TriggeredAbilityImpl {
this.allPlayers = ability.allPlayers;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == eventType;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == eventType) {
if (allPlayers || event.getPlayerId().equals(this.controllerId) ) {
return true;
}
if (allPlayers || event.getPlayerId().equals(this.controllerId) ) {
return true;
}
return false;
}

View file

@ -47,9 +47,14 @@ public class OpponentSacrificesNonTokenPermanentTriggeredAbility extends Trigger
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SACRIFICED_PERMANENT;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SACRIFICED_PERMANENT && game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
MageObject object = game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
if (object instanceof Permanent && !(object instanceof PermanentToken) ) {
for (Effect effect : getEffects()) {

View file

@ -46,9 +46,14 @@ public class OpponentSacrificesPermanentTriggeredAbility extends TriggeredAbilit
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SACRIFICED_PERMANENT;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SACRIFICED_PERMANENT && game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
MageObject object = game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
if (object instanceof Permanent) {
for (Effect effect : getEffects()) {

View file

@ -98,9 +98,14 @@ public class PutCardIntoGraveFromAnywhereAllTriggeredAbility extends TriggeredAb
return new PutCardIntoGraveFromAnywhereAllTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
if (((ZoneChangeEvent) event).getToZone() == Zone.GRAVEYARD) {
Card card = game.getCard(event.getTargetId());
if (card != null && filter.match(card, getSourceId(), getControllerId(), game)) {
switch (setTargetPointer) {

View file

@ -56,20 +56,23 @@ public class PutIntoGraveFromBattlefieldAllTriggeredAbility extends TriggeredAbi
this.filter = ability.filter;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ZONE_CHANGE) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getFromZone() == Zone.BATTLEFIELD
&& zEvent.getToZone() == Zone.GRAVEYARD) {
if (filter.match(zEvent.getTarget(), this.getSourceId(), this.getControllerId(), game)) {
if (setTargetPointer) {
for (Effect effect :this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getFromZone() == Zone.BATTLEFIELD
&& zEvent.getToZone() == Zone.GRAVEYARD) {
if (filter.match(zEvent.getTarget(), this.getSourceId(), this.getControllerId(), game)) {
if (setTargetPointer) {
for (Effect effect :this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getSourceId()));
}
return true;
}
return true;
}
}
return false;

View file

@ -30,19 +30,21 @@ public class PutIntoGraveFromBattlefieldSourceTriggeredAbility extends Triggered
return new PutIntoGraveFromBattlefieldSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
Permanent permanent = zEvent.getTarget();
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
Permanent permanent = zEvent.getTarget();
if (permanent != null &&
zEvent.getToZone() == Zone.GRAVEYARD &&
zEvent.getFromZone() == Zone.BATTLEFIELD &&
permanent.getId().equals(this.getSourceId())) {
return true;
}
if (permanent != null &&
zEvent.getToZone() == Zone.GRAVEYARD &&
zEvent.getFromZone() == Zone.BATTLEFIELD &&
permanent.getId().equals(this.getSourceId())) {
return true;
}
return false;
}

View file

@ -54,12 +54,14 @@ public class SacrificeSourceTriggeredAbility extends TriggeredAbilityImpl {
return new SacrificeSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SACRIFICED_PERMANENT;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SACRIFICED_PERMANENT && event.getTargetId().equals(sourceId)) {
return true;
}
return false;
return event.getTargetId().equals(sourceId);
}
@Override

View file

@ -67,12 +67,15 @@ public class SimpleTriggeredAbility extends TriggeredAbilityImpl {
this.prefix = ability.prefix;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == eventType;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == eventType) {
if (!onlyController || event.getPlayerId().equals(this.controllerId)) {
return true;
}
if (!onlyController || event.getPlayerId().equals(this.controllerId)) {
return true;
}
return false;
}

View file

@ -81,16 +81,19 @@ public class SpellCastAllTriggeredAbility extends TriggeredAbilityImpl {
this.rule = ability.rule;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SPELL_CAST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SPELL_CAST) {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell != null && filter.match(spell, getControllerId(), game)) {
if (rememberSource) {
this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getId()));
}
return true;
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell != null && filter.match(spell, getControllerId(), game)) {
if (rememberSource) {
this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getId()));
}
return true;
}
return false;
}

View file

@ -81,9 +81,14 @@ public class SpellCastControllerTriggeredAbility extends TriggeredAbilityImpl {
this.rule = ability.rule;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SPELL_CAST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getPlayerId().equals(this.getControllerId())) {
if (event.getPlayerId().equals(this.getControllerId())) {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell != null && filter.match(spell, game)) {
if (rememberSource) {

View file

@ -79,9 +79,14 @@ public class SpellCastOpponentTriggeredAbility extends TriggeredAbilityImpl {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SPELL_CAST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SPELL_CAST && game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell != null && filter.match(spell, game)) {
if (!setTargetPointer.equals(SetTargetPointer.NONE)) {

View file

@ -60,25 +60,28 @@ public class TapForManaAllTriggeredAbility extends TriggeredAbilityImpl {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TAPPED_FOR_MANA;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.TAPPED_FOR_MANA) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
ManaEvent mEvent = (ManaEvent) event;
for(Effect effect:getEffects()) {
effect.setValue("mana", mEvent.getMana());
}
switch(setTargetPointer) {
case PERMANENT:
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
break;
case PLAYER:
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getControllerId()));
break;
}
return true;
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
ManaEvent mEvent = (ManaEvent) event;
for(Effect effect:getEffects()) {
effect.setValue("mana", mEvent.getMana());
}
switch(setTargetPointer) {
case PERMANENT:
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
break;
case PLAYER:
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getControllerId()));
break;
}
return true;
}
return false;
}

View file

@ -62,25 +62,28 @@ public class TapForManaAllTriggeredManaAbility extends TriggeredManaAbility {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TAPPED_FOR_MANA;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.TAPPED_FOR_MANA) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
ManaEvent mEvent = (ManaEvent) event;
for(Effect effect:getEffects()) {
effect.setValue("mana", mEvent.getMana());
switch(setTargetPointer) {
case PERMANENT:
effect.setTargetPointer(new FixedTarget(permanent.getId()));
break;
case PLAYER:
effect.setTargetPointer(new FixedTarget(permanent.getControllerId()));
break;
}
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
ManaEvent mEvent = (ManaEvent) event;
for(Effect effect:getEffects()) {
effect.setValue("mana", mEvent.getMana());
switch(setTargetPointer) {
case PERMANENT:
effect.setTargetPointer(new FixedTarget(permanent.getId()));
break;
case PLAYER:
effect.setTargetPointer(new FixedTarget(permanent.getControllerId()));
break;
}
return true;
}
return true;
}
return false;
}

View file

@ -54,16 +54,19 @@ public class TapLandForManaAllTriggeredAbility extends TriggeredAbilityImpl {
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TAPPED_FOR_MANA;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.TAPPED_FOR_MANA) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND)) {
if (setTargetPointer) {
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
}
return true;
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND)) {
if (setTargetPointer) {
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
}
return true;
}
return false;
}

View file

@ -55,16 +55,19 @@ public class TapLandForManaAllTriggeredManaAbility extends TriggeredManaAbility
this.setTargetPointer = ability.setTargetPointer;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TAPPED_FOR_MANA;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.TAPPED_FOR_MANA) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND)) {
if (setTargetPointer) {
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
}
return true;
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
if (permanent != null && permanent.getCardType().contains(CardType.LAND)) {
if (setTargetPointer) {
getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
}
return true;
}
return false;
}

View file

@ -72,30 +72,33 @@ public class TurnedFaceUpAllTriggeredAbility extends TriggeredAbilityImpl {
return new TurnedFaceUpAllTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TURNEDFACEUP;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (EventType.TURNEDFACEUP.equals(event.getType())) {
if (!event.getTargetId().equals(getSourceId())) {
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(getSourceId());
if (sourcePermanent != null) {
if (sourcePermanent.isFaceDown()) {
// if face down and it's not itself that is turned face up, it does not trigger
return false;
}
} else {
// Permanent is and was not on the battlefield
if (!event.getTargetId().equals(getSourceId())) {
Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(getSourceId());
if (sourcePermanent != null) {
if (sourcePermanent.isFaceDown()) {
// if face down and it's not itself that is turned face up, it does not trigger
return false;
}
} else {
// Permanent is and was not on the battlefield
return false;
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (setTargetPointer) {
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
}
Permanent permanent = game.getPermanent(event.getTargetId());
if (filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (setTargetPointer) {
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
return true;
}
return true;
}
return false;
}

View file

@ -48,9 +48,14 @@ public class TurnedFaceUpSourceTriggeredAbility extends TriggeredAbilityImpl {
return new TurnedFaceUpSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.TURNEDFACEUP;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (EventType.TURNEDFACEUP.equals(event.getType()) && event.getTargetId().equals(this.getSourceId())) {
if (event.getTargetId().equals(this.getSourceId())) {
if (setTargetPointer) {
for (Effect effect: getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));

View file

@ -50,9 +50,14 @@ public class UnattachedTriggeredAbility extends TriggeredAbilityImpl {
super(ability);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UNATTACHED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.UNATTACHED && event.getSourceId().equals(this.getSourceId()) ) {
if (event.getSourceId().equals(this.getSourceId()) ) {
getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId()));
return true;
}

View file

@ -70,20 +70,23 @@ public class ZoneChangeAllTriggeredAbility extends TriggeredAbilityImpl {
this.filter = ability.filter;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ZONE_CHANGE) {
ZoneChangeEvent zEvent = (ZoneChangeEvent)event;
if ((fromZone == null || zEvent.getFromZone() == fromZone) && (toZone == null || zEvent.getToZone() == toZone)) {
Permanent perm;
if (zEvent.getTarget() != null) {
perm = zEvent.getTarget();
} else {
perm = game.getPermanent(event.getTargetId()); // LevelX2: maybe this part is not neccessary
}
if (perm != null && filter.match(perm, sourceId, controllerId, game)) {
return true;
}
ZoneChangeEvent zEvent = (ZoneChangeEvent)event;
if ((fromZone == null || zEvent.getFromZone() == fromZone) && (toZone == null || zEvent.getToZone() == toZone)) {
Permanent perm;
if (zEvent.getTarget() != null) {
perm = zEvent.getTarget();
} else {
perm = game.getPermanent(event.getTargetId()); // LevelX2: maybe this part is not neccessary
}
if (perm != null && filter.match(perm, sourceId, controllerId, game)) {
return true;
}
}
return false;

View file

@ -73,9 +73,14 @@ public class ZoneChangeTriggeredAbility extends TriggeredAbilityImpl {
this.rule = ability.rule;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId())) {
if (event.getTargetId().equals(this.getSourceId())) {
ZoneChangeEvent zEvent = (ZoneChangeEvent)event;
if ((fromZone == null || zEvent.getFromZone() == fromZone) && (toZone == null || zEvent.getToZone() == toZone)) {
return true;

View file

@ -82,30 +82,33 @@ public class AtTheBeginOMainPhaseDelayedTriggeredAbility extends DelayedTriggere
return new AtTheBeginOMainPhaseDelayedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return checkPhase(event.getType());
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (checkPhase(event.getType())) {
switch (targetController) {
case ANY:
switch (targetController) {
case ANY:
return true;
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
return yours;
case OPPONENT:
if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
return true;
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
return yours;
case OPPONENT:
if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
}
break;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
return true;
}
break;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
return true;
}
}
}
}
}
return false;
}

View file

@ -19,12 +19,14 @@ public class AtTheBeginOfCombatDelayedTriggeredAbility extends DelayedTriggeredA
return new AtTheBeginOfCombatDelayedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.COMBAT_PHASE_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.COMBAT_PHASE_PRE) {
return true;
}
return false;
return true;
}
@Override

View file

@ -37,10 +37,15 @@ public class AtTheBeginOfNextCleanupDelayedTriggeredAbility extends DelayedTrigg
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.CLEANUP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return true;
}
@Override
public String getRule() {
StringBuilder sb = new StringBuilder();

View file

@ -61,30 +61,33 @@ public class AtTheBeginOfNextEndStepDelayedTriggeredAbility extends DelayedTrigg
this.targetController = ability.targetController;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.END_TURN_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.END_TURN_STEP_PRE) {
switch (targetController) {
case ANY:
switch (targetController) {
case ANY:
return true;
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
return yours;
case OPPONENT:
if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
return true;
case YOU:
boolean yours = event.getPlayerId().equals(this.controllerId);
return yours;
case OPPONENT:
if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
}
break;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
return true;
}
break;
case CONTROLLER_ATTACHED_TO:
Permanent attachment = game.getPermanent(sourceId);
if (attachment != null && attachment.getAttachedTo() != null) {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
return true;
}
}
}
}
}
return false;
}

View file

@ -58,9 +58,13 @@ public class AtTheBeginOfNextUpkeepDelayedTriggeredAbility extends DelayedTrigge
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return true;
}
@Override
public String getRule() {

View file

@ -33,9 +33,14 @@ public class AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility extends DelayedTr
return new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE && event.getPlayerId().equals(this.controllerId);
return event.getPlayerId().equals(this.controllerId);
}
}

View file

@ -19,12 +19,14 @@ public class AtTheEndOfCombatDelayedTriggeredAbility extends DelayedTriggeredAbi
return new AtTheEndOfCombatDelayedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.COMBAT_PHASE_POST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.COMBAT_PHASE_POST) {
return true;
}
return false;
return true;
}
@Override

View file

@ -56,12 +56,14 @@ public class AtTheEndOfTurnStepPostDelayedTriggeredAbility extends DelayedTrigge
return new AtTheEndOfTurnStepPostDelayedTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.END_TURN_STEP_POST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.END_TURN_STEP_POST) {
return true;
}
return false;
return true;
}
@Override

View file

@ -29,6 +29,7 @@ package mage.abilities.common.delayed;
import java.util.LinkedList;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
@ -68,9 +69,14 @@ public class OnLeaveReturnExiledToBattlefieldAbility extends DelayedTriggeredAbi
return new OnLeaveReturnExiledToBattlefieldAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId())) {
if (event.getTargetId().equals(this.getSourceId())) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getFromZone() == Zone.BATTLEFIELD) {
return true;
@ -99,21 +105,24 @@ class ReturnExiledPermanentsEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
// because source already changed zone we have to get previous related exile zone
ExileZone exile = game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, source.getSourceId(), true));
if (exile != null) {
LinkedList<UUID> cards = new LinkedList<>(exile);
for (UUID cardId : cards) {
Card card = game.getCard(cardId);
if (card != null) {
Player owner = game.getPlayer(card.getOwnerId());
if (owner != null && owner.isInGame()) {
owner.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId());
MageObject sourceObject = source.getSourceObject(game);
if (sourceObject != null && controller != null) {
UUID exileZone = CardUtil.getObjectExileZoneId(game, sourceObject);
if (exileZone != null) {
ExileZone exile = game.getExile().getExileZone(exileZone);
if (exile != null) {
LinkedList<UUID> cards = new LinkedList<>(exile);
for (UUID cardId : cards) {
Card card = game.getCard(cardId);
if (card != null) {
Player owner = game.getPlayer(card.getOwnerId());
if (owner != null && owner.isInGame()) {
owner.putOntoBattlefieldWithInfo(card, game, Zone.EXILED, source.getSourceId());
}
}
}
exile.clear();
}
exile.clear();
return true;
}
}

View file

@ -56,13 +56,17 @@ public class PactDelayedTriggeredAbility extends DelayedTriggeredAbility {
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE && game.getActivePlayerId().equals(this.getControllerId())) {
return true;
}
return false;
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return game.getActivePlayerId().equals(this.getControllerId());
}
@Override
public String getRule() {
return "At the beginning of your next upkeep " + modes.getText();

View file

@ -49,6 +49,11 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl {
return new ConditionalTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return ability.checkEventType(event, game);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
ability.setSourceId(this.getSourceId());

View file

@ -60,12 +60,17 @@ public class CastSourceTriggeredAbility extends TriggeredAbilityImpl {
return new CastSourceTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SPELL_CAST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType().equals(GameEvent.EventType.SPELL_CAST) && event.getSourceId().equals(this.getSourceId())) {
MageObject sourceObject = getSourceObject(game);
if (sourceObject != null && (sourceObject instanceof Spell)) {
Spell spell = (Spell)sourceObject;
if (event.getSourceId().equals(this.getSourceId())) {
MageObject spellObject = game.getObject(sourceId);
if (spellObject != null && (spellObject instanceof Spell)) {
Spell spell = (Spell)spellObject;
if (spell.getSpellAbility() != null) {
for (Effect effect : getEffects()) {
effect.setValue(SOURCE_CAST_SPELL_ABILITY, spell.getSpellAbility());

View file

@ -70,6 +70,7 @@ public class CreateDelayedTriggeredAbilityEffect extends OneShotEffect {
DelayedTriggeredAbility delayedAbility = ability.copy();
delayedAbility.setSourceId(source.getSourceId());
delayedAbility.setControllerId(source.getControllerId());
delayedAbility.setSourceObject(source.getSourceObject(game));
if (this.copyTargets) {
delayedAbility.getTargets().addAll(source.getTargets());
for(Effect effect : delayedAbility.getEffects()) {

View file

@ -66,9 +66,14 @@ public class DealsDamageToOpponentTriggeredAbility extends TriggeredAbilityImpl
return new DealsDamageToOpponentTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.DAMAGED_PLAYER;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER && event.getSourceId().equals(this.sourceId)
if (event.getSourceId().equals(this.sourceId)
&& game.getOpponents(this.getControllerId()).contains(event.getTargetId())) {
if (onlyCombat && event instanceof DamagedPlayerEvent) {
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;

Some files were not shown because too many files have changed in this diff Show more