From 7efd24464c93c88e3004c4951fb2deb5d3fe1314 Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Wed, 8 Dec 2010 04:27:28 +0000 Subject: [PATCH] fixed issue 44 and made triggered abilities extendable --- .../src/mage/sets/alarareborn/FinestHour.java | 1 - .../src/mage/sets/conflux/BloodhallOoze.java | 2 - .../src/mage/sets/conflux/FontOfMythos.java | 1 - .../src/mage/sets/conflux/QuenchableFire.java | 1 - .../sets/conflux/SigilOfTheEmptyThrone.java | 1 - .../src/mage/sets/magic2010/HowlingMine.java | 1 - .../src/mage/sets/magic2010/IceCage.java | 1 - .../src/mage/sets/magic2010/ProteanHydra.java | 2 - .../src/mage/sets/magic2010/SoulWarden.java | 1 - .../src/mage/sets/magic2010/WallOfFrost.java | 1 - .../mage/sets/magic2011/AjanisPridemate.java | 1 - .../mage/sets/magic2011/ChandrasSpitfire.java | 1 - .../src/mage/sets/magic2011/FrostTitan.java | 3 -- .../sets/magic2011/GarruksPackleader.java | 1 - .../src/mage/sets/magic2011/GraveTitan.java | 2 - .../src/mage/sets/magic2011/InfernoTitan.java | 2 - .../src/mage/sets/magic2011/JacesErasure.java | 1 - .../sets/magic2011/LeylineOfVitality.java | 1 - .../mage/sets/magic2011/LilianasCaress.java | 1 - .../mage/sets/magic2011/MystifyingMaze.java | 1 - .../src/mage/sets/magic2011/PhantomBeast.java | 1 - .../mage/sets/magic2011/PhylacteryLich.java | 1 - .../src/mage/sets/magic2011/PrimalCocoon.java | 2 - .../src/mage/sets/magic2011/SunTitan.java | 2 - .../mage/sets/magic2011/WildEvocation.java | 1 - .../mage/sets/riseoftheeldrazi/Vengevine.java | 1 - .../sets/shardsofalara/RafiqOfTheMany.java | 1 - .../src/mage/sets/tenth/AngelsFeather.java | 1 - Mage.Sets/src/mage/sets/tenth/DemonsHorn.java | 1 - .../src/mage/sets/tenth/DragonsClaw.java | 1 - Mage.Sets/src/mage/sets/tenth/KrakensEye.java | 1 - Mage.Sets/src/mage/sets/tenth/WurmsTooth.java | 1 - .../mage/sets/zendikar/AdventuringGear.java | 43 +++++++++++++++- .../sets/zendikar/BeastmasterAscension.java | 1 - .../src/mage/sets/zendikar/ScuteMob.java | 1 - .../abilities/DelayedTriggeredAbilities.java | 4 +- .../common/AttacksTriggeredAbility.java | 1 - .../common/BlocksTriggeredAbility.java | 1 - ...CombatDamageToAPlayerTriggeredAbility.java | 1 - .../abilities/common/LandfallAbility.java | 1 - .../common/OnEventTriggeredAbility.java | 1 - .../common/SimpleTriggeredAbility.java | 1 - .../common/ZoneChangeTriggeredAbility.java | 1 - .../abilities/effects/ContinuousEffect.java | 1 + .../effects/ContinuousEffectImpl.java | 5 ++ .../abilities/effects/ContinuousEffects.java | 12 +++-- .../mage/abilities/effects/EffectImpl.java | 2 +- .../abilities/keyword/CascadeAbility.java | 1 - .../abilities/keyword/ExaltedAbility.java | 1 - .../abilities/keyword/UnearthAbility.java | 1 - Mage/src/mage/cards/CardImpl.java | 4 +- Mage/src/mage/game/permanent/Battlefield.java | 49 ++++++++++++++----- .../mage/game/permanent/PermanentCard.java | 19 ++++--- .../mage/game/permanent/PermanentImpl.java | 4 +- 54 files changed, 115 insertions(+), 80 deletions(-) diff --git a/Mage.Sets/src/mage/sets/alarareborn/FinestHour.java b/Mage.Sets/src/mage/sets/alarareborn/FinestHour.java index 35223623c90..760da9bf572 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/FinestHour.java +++ b/Mage.Sets/src/mage/sets/alarareborn/FinestHour.java @@ -101,7 +101,6 @@ class FinestHourAbility extends TriggeredAbilityImpl { if (game.getCombat().attacksAlone()) { this.addTarget(new TargetCreaturePermanent()); this.targets.get(0).add(game.getCombat().getAttackers().get(0), game); - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/conflux/BloodhallOoze.java b/Mage.Sets/src/mage/sets/conflux/BloodhallOoze.java index cfda52c0af8..ae73bbb24d1 100644 --- a/Mage.Sets/src/mage/sets/conflux/BloodhallOoze.java +++ b/Mage.Sets/src/mage/sets/conflux/BloodhallOoze.java @@ -100,7 +100,6 @@ class BloodhallOozeTriggeredAbility1 extends TriggeredAbilityImpl { if (event.getType() == EventType.DRAW_STEP_PRE) { this.addTarget(new TargetPlayer()); this.targets.get(0).add(event.getPlayerId(),game); - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java b/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java index a9020a4179e..a53123d1c4b 100644 --- a/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java +++ b/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java @@ -141,7 +141,6 @@ class QuenchableFireDelayedTriggeredAbility extends DelayedTriggeredAbility { if (event.getType() == EventType.DRAW_STEP_PRE) { this.addTarget(new TargetPlayer()); this.targets.get(0).add(event.getPlayerId(), game); - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2010/IceCage.java b/Mage.Sets/src/mage/sets/magic2010/IceCage.java index 03ae60bb091..5cb77f5aa2d 100644 --- a/Mage.Sets/src/mage/sets/magic2010/IceCage.java +++ b/Mage.Sets/src/mage/sets/magic2010/IceCage.java @@ -151,7 +151,6 @@ class IceCageAbility extends TriggeredAbilityImpl { Permanent enchantment = game.getPermanent(sourceId); if (enchantment != null && enchantment.getAttachedTo() != null) { if (event.getTargetId().equals(enchantment.getAttachedTo())) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java b/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java index 24fdd3831ca..f0a6917bb3b 100644 --- a/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java +++ b/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java @@ -189,7 +189,6 @@ public class ProteanHydra extends CardImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.COUNTER_REMOVED && event.getData().equals("+1/+1") && event.getTargetId().equals(this.getSourceId())) { - trigger(game, this.controllerId); return true; } return false; @@ -220,7 +219,6 @@ public class ProteanHydra extends CardImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.END_TURN_STEP_PRE && event.getPlayerId().equals(this.controllerId)) { - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2010/SoulWarden.java b/Mage.Sets/src/mage/sets/magic2010/SoulWarden.java index d5737b17cd7..d3781728a8f 100644 --- a/Mage.Sets/src/mage/sets/magic2010/SoulWarden.java +++ b/Mage.Sets/src/mage/sets/magic2010/SoulWarden.java @@ -95,7 +95,6 @@ class SoulWardenAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).getToZone() == Zone.BATTLEFIELD) { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent.getCardType().contains(CardType.CREATURE) && !permanent.getId().equals(this.getSourceId())) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2010/WallOfFrost.java b/Mage.Sets/src/mage/sets/magic2010/WallOfFrost.java index c20125024d5..e92a282350a 100644 --- a/Mage.Sets/src/mage/sets/magic2010/WallOfFrost.java +++ b/Mage.Sets/src/mage/sets/magic2010/WallOfFrost.java @@ -97,7 +97,6 @@ class WallOfFrostAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.BLOCKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { this.addTarget(new TargetCreaturePermanent()); this.getTargets().get(0).add(event.getTargetId(), game); - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2011/AjanisPridemate.java b/Mage.Sets/src/mage/sets/magic2011/AjanisPridemate.java index a70f3cfa4ff..3e3250ef54f 100644 --- a/Mage.Sets/src/mage/sets/magic2011/AjanisPridemate.java +++ b/Mage.Sets/src/mage/sets/magic2011/AjanisPridemate.java @@ -92,7 +92,6 @@ class AjanisPridemateAbility extends TriggeredAbilityImpl { TargetStackObject target = new TargetStackObject(); target.add(event.getSourceId(), game); this.addTarget(target); - trigger(game, this.controllerId); return true; } return false; @@ -135,13 +134,11 @@ class FrostTitanAbility2 extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { - trigger(game, this.controllerId); return true; } if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { ZoneChangeEvent zEvent = (ZoneChangeEvent)event; if (zEvent.getToZone() == Zone.BATTLEFIELD) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2011/GarruksPackleader.java b/Mage.Sets/src/mage/sets/magic2011/GarruksPackleader.java index afd136ff4da..54ad20b6cc3 100644 --- a/Mage.Sets/src/mage/sets/magic2011/GarruksPackleader.java +++ b/Mage.Sets/src/mage/sets/magic2011/GarruksPackleader.java @@ -97,7 +97,6 @@ class GarruksPackleaderAbility extends TriggeredAbilityImpl 2) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java b/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java index 7c12a9ff87b..0ad91241c85 100644 --- a/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/GraveTitan.java @@ -95,13 +95,11 @@ class GraveTitanAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { - trigger(game, this.controllerId); return true; } if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { ZoneChangeEvent zEvent = (ZoneChangeEvent)event; if (zEvent.getToZone() == Zone.BATTLEFIELD) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2011/InfernoTitan.java b/Mage.Sets/src/mage/sets/magic2011/InfernoTitan.java index 87318387f78..5517736bd19 100644 --- a/Mage.Sets/src/mage/sets/magic2011/InfernoTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/InfernoTitan.java @@ -99,13 +99,11 @@ class InfernoTitanAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { - trigger(game, this.controllerId); return true; } if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { ZoneChangeEvent zEvent = (ZoneChangeEvent)event; if (zEvent.getToZone() == Zone.BATTLEFIELD) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2011/JacesErasure.java b/Mage.Sets/src/mage/sets/magic2011/JacesErasure.java index a1d6bdf522a..f5357de3ba8 100644 --- a/Mage.Sets/src/mage/sets/magic2011/JacesErasure.java +++ b/Mage.Sets/src/mage/sets/magic2011/JacesErasure.java @@ -89,7 +89,6 @@ class JacesErasureAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.DREW_CARD && event.getPlayerId().equals(controllerId)) { - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2011/LeylineOfVitality.java b/Mage.Sets/src/mage/sets/magic2011/LeylineOfVitality.java index 25771ef25af..711de045c97 100644 --- a/Mage.Sets/src/mage/sets/magic2011/LeylineOfVitality.java +++ b/Mage.Sets/src/mage/sets/magic2011/LeylineOfVitality.java @@ -97,7 +97,6 @@ class LeylineOfVitalityAbility extends TriggeredAbilityImpl if (event.getType() == EventType.DISCARDED_CARD && game.getOpponents(controllerId).contains(event.getPlayerId())) { this.addTarget(new TargetPlayer()); this.targets.get(0).add(event.getPlayerId(), game); - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java b/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java index 9b4c14bfb4a..c0f7dae75ed 100644 --- a/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java +++ b/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java @@ -142,7 +142,6 @@ class MystifyingMazeDelayedTriggeredAbility extends DelayedTriggeredAbility { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.TARGETED && event.getTargetId().equals(sourceId)) { - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java b/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java index 6ec0e9b5905..2d84c477cac 100644 --- a/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java +++ b/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java @@ -104,7 +104,6 @@ public class PhylacteryLich extends CardImpl { if (perm.getCounters().getCount("phylactery") > 0) return false; } - trigger(game, controllerId); return true; } diff --git a/Mage.Sets/src/mage/sets/magic2011/PrimalCocoon.java b/Mage.Sets/src/mage/sets/magic2011/PrimalCocoon.java index 2f162a894a0..1c89d0ab88d 100644 --- a/Mage.Sets/src/mage/sets/magic2011/PrimalCocoon.java +++ b/Mage.Sets/src/mage/sets/magic2011/PrimalCocoon.java @@ -102,7 +102,6 @@ class PrimalCocoonAbility1 extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.UPKEEP_STEP_PRE && event.getPlayerId().equals(this.controllerId)) { - trigger(game, this.controllerId); return true; } return false; @@ -134,7 +133,6 @@ class PrimalCocoonAbility2 extends TriggeredAbilityImpl { if (event.getType() == EventType.ATTACKER_DECLARED || event.getType() == EventType.BLOCKER_DECLARED) { Permanent enchantment = game.getPermanent(sourceId); if (enchantment != null && enchantment.getAttachedTo() != null && event.getSourceId() != null && event.getSourceId().equals(enchantment.getAttachedTo())) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2011/SunTitan.java b/Mage.Sets/src/mage/sets/magic2011/SunTitan.java index a6fd6df0ec1..88742261b0e 100644 --- a/Mage.Sets/src/mage/sets/magic2011/SunTitan.java +++ b/Mage.Sets/src/mage/sets/magic2011/SunTitan.java @@ -117,13 +117,11 @@ class SunTitanAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { - trigger(game, this.controllerId); return true; } if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId()) ) { ZoneChangeEvent zEvent = (ZoneChangeEvent)event; if (zEvent.getToZone() == Zone.BATTLEFIELD) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2011/WildEvocation.java b/Mage.Sets/src/mage/sets/magic2011/WildEvocation.java index 5fa2bd8493e..54528b82643 100644 --- a/Mage.Sets/src/mage/sets/magic2011/WildEvocation.java +++ b/Mage.Sets/src/mage/sets/magic2011/WildEvocation.java @@ -95,7 +95,6 @@ class WildEvocationAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.DRAW_STEP_PRE) { this.addTarget(new TargetPlayer()); this.targets.get(0).add(event.getPlayerId(), game); - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/Vengevine.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/Vengevine.java index bebb3464723..4b7f04b5249 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/Vengevine.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/Vengevine.java @@ -99,7 +99,6 @@ class VengevineAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.SPELL_CAST && event.getPlayerId().equals(controllerId)) { Watcher watcher = game.getState().getWatchers().get(controllerId, "CreatureCast"); if (watcher != null && watcher.conditionMet()) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/shardsofalara/RafiqOfTheMany.java b/Mage.Sets/src/mage/sets/shardsofalara/RafiqOfTheMany.java index 77127caa931..815f6c3e319 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/RafiqOfTheMany.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/RafiqOfTheMany.java @@ -102,7 +102,6 @@ class RafiqOfTheManyAbility extends TriggeredAbilityImpl if (game.getCombat().attacksAlone()) { this.addTarget(new TargetCreaturePermanent()); this.targets.get(0).add(game.getCombat().getAttackers().get(0), game); - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/tenth/AngelsFeather.java b/Mage.Sets/src/mage/sets/tenth/AngelsFeather.java index 8c2c35e295a..d20bed2b9a7 100644 --- a/Mage.Sets/src/mage/sets/tenth/AngelsFeather.java +++ b/Mage.Sets/src/mage/sets/tenth/AngelsFeather.java @@ -88,7 +88,6 @@ class AngelsFeatherAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.SPELL_CAST) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null && spell.getColor().isWhite()) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/tenth/DemonsHorn.java b/Mage.Sets/src/mage/sets/tenth/DemonsHorn.java index 7a6990f21b4..23ebcc5de1c 100644 --- a/Mage.Sets/src/mage/sets/tenth/DemonsHorn.java +++ b/Mage.Sets/src/mage/sets/tenth/DemonsHorn.java @@ -88,7 +88,6 @@ class DemonsHornAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.SPELL_CAST) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null && spell.getColor().isBlack()) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/tenth/DragonsClaw.java b/Mage.Sets/src/mage/sets/tenth/DragonsClaw.java index d32466fb71e..8d3660359d1 100644 --- a/Mage.Sets/src/mage/sets/tenth/DragonsClaw.java +++ b/Mage.Sets/src/mage/sets/tenth/DragonsClaw.java @@ -88,7 +88,6 @@ class DragonsClawAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.SPELL_CAST) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null && spell.getColor().isRed()) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/tenth/KrakensEye.java b/Mage.Sets/src/mage/sets/tenth/KrakensEye.java index 6e6ec2619ab..6d55e08465b 100644 --- a/Mage.Sets/src/mage/sets/tenth/KrakensEye.java +++ b/Mage.Sets/src/mage/sets/tenth/KrakensEye.java @@ -88,7 +88,6 @@ class KrakensEyeAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.SPELL_CAST) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null && spell.getColor().isBlue()) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/tenth/WurmsTooth.java b/Mage.Sets/src/mage/sets/tenth/WurmsTooth.java index ec709220c4c..ea8e135aa39 100644 --- a/Mage.Sets/src/mage/sets/tenth/WurmsTooth.java +++ b/Mage.Sets/src/mage/sets/tenth/WurmsTooth.java @@ -88,7 +88,6 @@ class WurmsToothAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.SPELL_CAST) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null && spell.getColor().isGreen()) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage.Sets/src/mage/sets/zendikar/AdventuringGear.java b/Mage.Sets/src/mage/sets/zendikar/AdventuringGear.java index 636d930a44f..3cb1b33e974 100644 --- a/Mage.Sets/src/mage/sets/zendikar/AdventuringGear.java +++ b/Mage.Sets/src/mage/sets/zendikar/AdventuringGear.java @@ -33,11 +33,17 @@ import mage.Constants.CardType; import mage.Constants.Duration; import mage.Constants.Outcome; import mage.Constants.Rarity; +import mage.Constants.Zone; import mage.abilities.common.LandfallAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.BoostEquippedEffect; +import mage.abilities.effects.common.BoostTargetEffect; import mage.abilities.keyword.EquipAbility; import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; /** * @@ -50,7 +56,7 @@ public class AdventuringGear extends CardImpl { this.expansionSetCode = "ZEN"; this.subtype.add("Equipment"); this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(1))); - this.addAbility(new LandfallAbility(new BoostEquippedEffect(2, 2, Duration.EndOfTurn), false)); + this.addAbility(new AdventuringGearAbility()); } public AdventuringGear(final AdventuringGear card) { @@ -68,3 +74,38 @@ public class AdventuringGear extends CardImpl { } } + +class AdventuringGearAbility extends LandfallAbility { + + public AdventuringGearAbility() { + super(null, false); + this.addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); + this.addTarget(new TargetCreaturePermanent()); + } + + public AdventuringGearAbility(final AdventuringGearAbility ability) { + super(ability); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (super.checkTrigger(event, game)) { + Permanent equipment = game.getPermanent(this.sourceId); + if (equipment != null && equipment.getAttachedTo() != null) { + Permanent creature = game.getPermanent(equipment.getAttachedTo()); + if (creature != null) { + this.getTargets().get(0).clearChosen(); + this.getTargets().get(0).add(creature.getId(), game); + return true; + } + } + } + return false; + } + + @Override + public AdventuringGearAbility copy() { + return new AdventuringGearAbility(this); + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/zendikar/BeastmasterAscension.java b/Mage.Sets/src/mage/sets/zendikar/BeastmasterAscension.java index a4da8b9ef5f..b5170cb2998 100644 --- a/Mage.Sets/src/mage/sets/zendikar/BeastmasterAscension.java +++ b/Mage.Sets/src/mage/sets/zendikar/BeastmasterAscension.java @@ -95,7 +95,6 @@ class BeastmasterAscensionAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.UPKEEP_STEP_PRE && event.getPlayerId().equals(this.controllerId)) { - trigger(game, this.controllerId); return true; } return false; diff --git a/Mage/src/mage/abilities/DelayedTriggeredAbilities.java b/Mage/src/mage/abilities/DelayedTriggeredAbilities.java index 1366bbe5fc4..62fc4bb4e55 100644 --- a/Mage/src/mage/abilities/DelayedTriggeredAbilities.java +++ b/Mage/src/mage/abilities/DelayedTriggeredAbilities.java @@ -48,8 +48,10 @@ import mage.game.events.GameEvent; Iterator it = this.iterator(); while (it.hasNext()) { DelayedTriggeredAbility ability = it.next(); - if (ability.checkTrigger(event, game)) + if (ability.checkTrigger(event, game)) { + ability.trigger(game, ability.controllerId); it.remove(); + } } } diff --git a/Mage/src/mage/abilities/common/AttacksTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksTriggeredAbility.java index 6aa295801cf..c597b2fe4da 100644 --- a/Mage/src/mage/abilities/common/AttacksTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttacksTriggeredAbility.java @@ -52,7 +52,6 @@ public class AttacksTriggeredAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.ZONE_CHANGE && ((ZoneChangeEvent)event).getToZone() == Zone.BATTLEFIELD) { Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && permanent.getCardType().contains(CardType.LAND) && permanent.getControllerId().equals(this.controllerId)) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java b/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java index 2428855d1f3..4ac4fa38557 100644 --- a/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java @@ -75,7 +75,6 @@ public class OnEventTriggeredAbility extends TriggeredAbilityImpl> if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId())) { ZoneChangeEvent zEvent = (ZoneChangeEvent)event; if ((fromZone == null || zEvent.getFromZone() == fromZone) && (toZone == null || zEvent.getToZone() == toZone)) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage/src/mage/abilities/effects/ContinuousEffect.java b/Mage/src/mage/abilities/effects/ContinuousEffect.java index 48f8d99d794..29be96c7be0 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffect.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffect.java @@ -45,6 +45,7 @@ public interface ContinuousEffect> extends Effect< public Duration getDuration(); public Date getTimestamp(); public void setTimestamp(); + public void newId(); public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game); public boolean hasLayer(Layer layer); public void init(Ability source, Game game); diff --git a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java index bc34e8189f8..a6d4f75a4a9 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java @@ -104,6 +104,11 @@ public abstract class ContinuousEffectImpl> ex this.timestamp = new Date(); } + @Override + public void newId() { + this.id = UUID.randomUUID(); + } + @Override public boolean hasLayer(Layer layer) { return this.layer == layer; diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index bd87ad54c78..5c7bdd7ab53 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -384,26 +384,30 @@ public class ContinuousEffects implements Serializable { case REPLACEMENT: ReplacementEffect newReplacementEffect = (ReplacementEffect)effect.copy(); newReplacementEffect.setTimestamp(); + newReplacementEffect.newId(); replacementEffects.add(newReplacementEffect); - abilityMap.put(newReplacementEffect.getId(), source); + abilityMap.put(newReplacementEffect.getId(), source.copy()); break; case PREVENTION: PreventionEffect newPreventionEffect = (PreventionEffect)effect.copy(); newPreventionEffect.setTimestamp(); + newPreventionEffect.newId(); preventionEffects.add(newPreventionEffect); - abilityMap.put(newPreventionEffect.getId(), source); + abilityMap.put(newPreventionEffect.getId(), source.copy()); break; case ASTHOUGH: AsThoughEffect newAsThoughEffect = (AsThoughEffect)effect.copy(); newAsThoughEffect.setTimestamp(); + newAsThoughEffect.newId(); asThoughEffects.add(newAsThoughEffect); - abilityMap.put(newAsThoughEffect.getId(), source); + abilityMap.put(newAsThoughEffect.getId(), source.copy()); break; default: ContinuousEffect newEffect = (ContinuousEffect)effect.copy(); newEffect.setTimestamp(); + newEffect.newId(); layeredEffects.add(newEffect); - abilityMap.put(newEffect.getId(), source); + abilityMap.put(newEffect.getId(), source.copy()); break; } } diff --git a/Mage/src/mage/abilities/effects/EffectImpl.java b/Mage/src/mage/abilities/effects/EffectImpl.java index abf1cda64bc..7d8f71ba276 100644 --- a/Mage/src/mage/abilities/effects/EffectImpl.java +++ b/Mage/src/mage/abilities/effects/EffectImpl.java @@ -39,7 +39,7 @@ import mage.abilities.Ability; */ public abstract class EffectImpl> implements Effect { - protected final UUID id; + protected UUID id; protected final Outcome outcome; protected EffectType effectType; diff --git a/Mage/src/mage/abilities/keyword/CascadeAbility.java b/Mage/src/mage/abilities/keyword/CascadeAbility.java index 04175ef581e..d066681a2d5 100644 --- a/Mage/src/mage/abilities/keyword/CascadeAbility.java +++ b/Mage/src/mage/abilities/keyword/CascadeAbility.java @@ -63,7 +63,6 @@ public class CascadeAbility extends TriggeredAbilityImpl { if (event.getType() == EventType.SPELL_CAST) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (spell != null && spell.getSourceId().equals(this.getSourceId())) { - trigger(game, this.controllerId); return true; } } diff --git a/Mage/src/mage/abilities/keyword/ExaltedAbility.java b/Mage/src/mage/abilities/keyword/ExaltedAbility.java index 31451b54ff3..8c500af1433 100644 --- a/Mage/src/mage/abilities/keyword/ExaltedAbility.java +++ b/Mage/src/mage/abilities/keyword/ExaltedAbility.java @@ -63,7 +63,6 @@ public class ExaltedAbility extends TriggeredAbilityImpl { TargetCreaturePermanent target = new TargetCreaturePermanent(); this.addTarget(target); this.getTargets().get(0).add(game.getCombat().getAttackers().get(0),game); - trigger(game, controllerId); return true; } } diff --git a/Mage/src/mage/abilities/keyword/UnearthAbility.java b/Mage/src/mage/abilities/keyword/UnearthAbility.java index 523ba85d231..f836bcfc875 100644 --- a/Mage/src/mage/abilities/keyword/UnearthAbility.java +++ b/Mage/src/mage/abilities/keyword/UnearthAbility.java @@ -101,7 +101,6 @@ class UnearthDelayedTriggeredAbility extends DelayedTriggeredAbility> extends MageObjectImpl @Override public void checkTriggers(Zone zone, GameEvent event, Game game) { for (TriggeredAbility ability: abilities.getTriggeredAbilities(zone)) { - ability.checkTrigger(event, game); + if (ability.checkTrigger(event, game)) { + ability.trigger(game, ownerId); + } } } diff --git a/Mage/src/mage/game/permanent/Battlefield.java b/Mage/src/mage/game/permanent/Battlefield.java index 712cc50bdae..ad7e681147c 100644 --- a/Mage/src/mage/game/permanent/Battlefield.java +++ b/Mage/src/mage/game/permanent/Battlefield.java @@ -73,6 +73,13 @@ public class Battlefield implements Serializable { field.clear(); } + /** + * Returns a count of all {@link Permanent} that match the filter. + * This method ignores the range of influence. + * + * @param filter + * @return count + */ public int countAll(FilterPermanent filter) { int count = 0; for (Permanent permanent: field.values()) { @@ -83,6 +90,14 @@ public class Battlefield implements Serializable { return count; } + /** + * Returns a count of all {@link Permanent} that match the filter and are controlled by controllerId. + * This method ignores the range of influence. + * + * @param filter + * @param controllerId + * @return count + */ public int countAll(FilterPermanent filter, UUID controllerId) { int count = 0; for (Permanent permanent: field.values()) { @@ -93,7 +108,15 @@ public class Battlefield implements Serializable { return count; } - + /** + * Returns a count of all {@link Permanent} that are within the range of influence of the specified player id + * and that match the supplied filter. + * + * @param filter + * @param sourcePlayerId + * @param game + * @return count + */ public int count(FilterPermanent filter, UUID sourcePlayerId, Game game) { int count = 0; if (game.getRangeOfInfluence() == RangeOfInfluence.ALL) { @@ -171,11 +194,11 @@ public class Battlefield implements Serializable { } /** - * Returns all Permanents on the battlefield that are controlled by the specified + * Returns all {@link Permanent} on the battlefield that are controlled by the specified * player id. The method ignores the range of influence. * * @param controllerId - * @return a list of Permanent + * @return a list of {@link Permanent} * @see Permanent */ public List getAllActivePermanents(UUID controllerId) { @@ -188,11 +211,11 @@ public class Battlefield implements Serializable { } /** - * Returns all Permanents on the battlefield that match the specified CardType. + * Returns all {@link Permanent} on the battlefield that match the specified {@link CardType}. * This method ignores the range of influence. * * @param type - * @return a list of Permanent + * @return a list of {@link Permanent} * @see Permanent */ public List getAllActivePermanents(CardType type) { @@ -205,11 +228,11 @@ public class Battlefield implements Serializable { } /** - * Returns all Permanents on the battlefield that match the supplied filter. + * Returns all {@link Permanent} on the battlefield that match the supplied filter. * This method ignores the range of influence. * * @param filter - * @return a list of Permanent + * @return a list of {@link Permanent} * @see Permanent */ public List getAllActivePermanents(FilterPermanent filter) { @@ -222,12 +245,12 @@ public class Battlefield implements Serializable { } /** - * Returns all Permanents that match the filter and are controlled by controllerId. + * Returns all {@link Permanent} that match the filter and are controlled by controllerId. * This method ignores the range of influence. * * @param filter * @param controllerId - * @return a list of Permanent + * @return a list of {@link Permanent} * @see Permanent */ public List getAllActivePermanents(FilterPermanent filter, UUID controllerId) { @@ -240,13 +263,13 @@ public class Battlefield implements Serializable { } /** - * Returns all Permanents that are within the range of influence of the specified player id + * Returns all {@link Permanent} that are within the range of influence of the specified player id * and that match the supplied filter. * * @param filter * @param sourcePlayerId * @param game - * @return a list of Permanent + * @return a list of {@link Permanent} * @see Permanent */ public List getActivePermanents(FilterPermanent filter, UUID sourcePlayerId, Game game) { @@ -268,11 +291,11 @@ public class Battlefield implements Serializable { } /** - * Returns all Permanents that are within the range of influence of the specified player id. + * Returns all {@link Permanent} that are within the range of influence of the specified player id. * * @param sourcePlayerId * @param game - * @return a list of Permanent + * @return a list of {@link Permanent} * @see Permanent */ public List getActivePermanents(UUID sourcePlayerId, Game game) { diff --git a/Mage/src/mage/game/permanent/PermanentCard.java b/Mage/src/mage/game/permanent/PermanentCard.java index 167f79e4e7a..16c9b4fbfa4 100644 --- a/Mage/src/mage/game/permanent/PermanentCard.java +++ b/Mage/src/mage/game/permanent/PermanentCard.java @@ -121,18 +121,25 @@ public class PermanentCard extends PermanentImpl { // card abilities will get triggered later when the card hits the new zone Card card = game.getCard(objectId).copy(); for (TriggeredAbility ability: abilities.getTriggeredAbilities(event.getFromZone())) { - if (!card.getAbilities().containsKey(ability.getId())) - ability.checkTrigger(event, game); - else if (ability instanceof ZoneChangeTriggeredAbility && event.getFromZone() == Zone.BATTLEFIELD) { + if (!card.getAbilities().containsKey(ability.getId())) { + if (ability.checkTrigger(event, game)) { + ability.trigger(game, controllerId); + } + } else if (ability instanceof ZoneChangeTriggeredAbility && event.getFromZone() == Zone.BATTLEFIELD) { ZoneChangeTriggeredAbility zcAbility = (ZoneChangeTriggeredAbility)ability; if (zcAbility.getToZone() == null) { - ability.checkTrigger(event, game); + if (ability.checkTrigger(event, game)) { + ability.trigger(game, controllerId); + } } } } for (TriggeredAbility ability: abilities.getTriggeredAbilities(event.getToZone())) { - if (!card.getAbilities().containsKey(ability.getId())) - ability.checkTrigger(event, game); + if (!card.getAbilities().containsKey(ability.getId())) { + if (ability.checkTrigger(event, game)) { + ability.trigger(game, controllerId); + } + } } } diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index f85a3cf7b3a..e23455db40c 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -180,7 +180,9 @@ public abstract class PermanentImpl> extends CardImpl if (event.getType() == EventType.BEGINNING_PHASE_PRE && game.getActivePlayerId().equals(controllerId)) this.controlledFromStartOfTurn = true; for (TriggeredAbility ability: abilities.getTriggeredAbilities(Zone.BATTLEFIELD)) { - ability.checkTrigger(event, game); + if (ability.checkTrigger(event, game)) { + ability.trigger(game, controllerId); + } } }