From 7b95da55a71d761f360d3766239b3654fca0ab0b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 12 Feb 2015 01:56:45 +0100 Subject: [PATCH] * Some more changes concerning sourceObject handling in ability. Added early event type check for triggered abilities. --- .../mage/sets/alarareborn/SlaveOfBolas.java | 1 + .../sets/avacynrestored/ThatcherRevolt.java | 1 + .../betrayersofkamigawa/GoryosVengeance.java | 1 + .../KaijinOfTheVanishingTouch.java | 1 + .../ShireiShizosCaretaker.java | 1 + .../bornofthegods/FelhideSpiritbinder.java | 1 + .../mage/sets/bornofthegods/SearingBlood.java | 1 + .../HikariTwilightGuardian.java | 1 + .../sets/championsofkamigawa/JunkyoBell.java | 1 + .../KikiJikiMirrorBreaker.java | 1 + .../OtherworldlyJourney.java | 1 + .../SosukeSonOfSeshiro.java | 1 + .../TatsumasaTheDragonsFang.java | 1 + .../championsofkamigawa/ThroughTheBreach.java | 1 + .../mage/sets/coldsnap/AdarkarValkyrie.java | 1 + .../mage/sets/commander/ScatteringStroke.java | 1 + .../mage/sets/commander2013/Flickerform.java | 1 + .../sets/commander2013/Reincarnation.java | 1 + .../commander2013/RoonOfTheHiddenRealm.java | 1 + .../commander2014/DarettiScrapSavant.java | 1 + .../commander2014/FeldonOfTheThirdPath.java | 1 + .../mage/sets/commander2014/WakeTheDead.java | 1 + .../sets/conflux/BrackwaterElemental.java | 1 + .../src/mage/sets/conflux/QuenchableFire.java | 1 + .../mage/sets/darkascension/LoyalCathar.java | 1 + .../src/mage/sets/darkascension/Seance.java | 1 + .../darkascension/SuddenDisappearance.java | 1 + .../src/mage/sets/dragonsmaze/AEtherling.java | 1 + .../sets/dragonsmaze/LegionsInitiative.java | 1 + .../mage/sets/dragonsmaze/PlasmCapture.java | 1 + .../src/mage/sets/eventide/Flickerwisp.java | 1 + .../sets/fatereforged/ArashinWarBeast.java | 5 + .../src/mage/sets/fatereforged/Arcbond.java | 8 +- .../sets/fatereforged/AtarkaWorldRender.java | 19 ++-- .../sets/fatereforged/BrutalHordechief.java | 17 ++-- .../mage/sets/fatereforged/FrontierSiege.java | 10 +- .../sets/fatereforged/MarduWoeReaper.java | 7 +- .../sets/fatereforged/RallyTheAncestors.java | 1 + .../src/mage/sets/gatecrash/Voidwalk.java | 1 + .../sets/guildpact/GhostCouncilOfOrzhova.java | 1 + .../src/mage/sets/guildpact/Ghostway.java | 1 + .../src/mage/sets/iceage/Necropotence.java | 1 + .../src/mage/sets/invasion/SpinalEmbrace.java | 1 + .../mage/sets/jacevsvraska/OhranViper.java | 1 + .../src/mage/sets/journeyintonyx/Skybind.java | 1 + .../mage/sets/journeyintonyx/Twinflame.java | 1 + .../sets/khansoftarkir/AvalancheTusker.java | 7 +- .../src/mage/sets/khansoftarkir/BurnAway.java | 21 ++-- .../mage/sets/khansoftarkir/DeathFrenzy.java | 13 ++- .../khansoftarkir/EfreetWeaponmaster.java | 5 + .../sets/khansoftarkir/HeraldOfAnafenza.java | 7 +- .../sets/khansoftarkir/HowlOfTheHorde.java | 7 +- .../sets/khansoftarkir/KheruLichLord.java | 1 + .../khansoftarkir/MeanderingTowershell.java | 7 +- .../sets/khansoftarkir/PonybackBrigade.java | 5 + .../sets/khansoftarkir/RaidersSpoils.java | 15 +-- .../sets/khansoftarkir/RakshasaVizier.java | 21 ++-- .../mage/sets/khansoftarkir/SecretPlans.java | 13 ++- .../sets/khansoftarkir/SidisiBroodTyrant.java | 44 +++++---- .../src/mage/sets/legends/Abomination.java | 1 + .../src/mage/sets/legends/HazezonTamar.java | 1 + .../src/mage/sets/limitedalpha/Berserk.java | 1 + .../mage/sets/limitedalpha/Cockatrice.java | 1 + .../sets/limitedalpha/ThicketBasilisk.java | 1 + .../src/mage/sets/magic2010/DragonWhelp.java | 1 + .../src/mage/sets/magic2010/StoneGiant.java | 1 + .../mage/sets/magic2011/MystifyingMaze.java | 1 + .../mage/sets/magic2014/BanisherPriest.java | 2 +- .../src/mage/sets/magic2015/Phytotitan.java | 1 + .../src/mage/sets/mirage/RockBasilisk.java | 1 + .../src/mage/sets/mirage/ShallowGrave.java | 1 + .../sets/mirrodinbesieged/GruesomeEncore.java | 1 + .../sets/mirrodinbesieged/VirulentWound.java | 1 + .../mage/sets/newphyrexia/KarnLiberated.java | 1 + .../sets/newphyrexia/PostmortemLunge.java | 1 + .../src/mage/sets/onslaught/AstralSlide.java | 1 + .../mage/sets/planarchaos/FatalFrenzy.java | 1 + .../sets/returntoravnica/GraveBetrayal.java | 3 +- .../riseoftheeldrazi/ArrogantBloodlord.java | 1 + .../sets/riseoftheeldrazi/SplinterTwin.java | 1 + .../saviorsofkamigawa/FeralLightning.java | 1 + .../FootstepsOfTheGoryo.java | 1 + .../saviorsofkamigawa/WineOfBloodAndIron.java | 1 + .../sets/scarsofmirrodin/ArgentSphinx.java | 1 + .../scarsofmirrodin/GlimmerpointStag.java | 1 + .../mage/sets/scarsofmirrodin/MimicVat.java | 1 + .../sets/scarsofmirrodin/OgreGeargrabber.java | 1 + .../scarsofmirrodin/VenserTheSojourner.java | 1 + .../sets/shadowmoor/ElementalMastery.java | 5 +- .../mage/sets/shadowmoor/MistmeadowWitch.java | 1 + .../mage/sets/shadowmoor/PuppeteerClique.java | 1 + .../sets/shardsofalara/GatherSpecimens.java | 5 + .../mage/sets/shardsofalara/Skeletonize.java | 1 + .../src/mage/sets/tempest/CorpseDance.java | 1 + Mage.Sets/src/mage/sets/thedark/Venom.java | 1 + .../mage/sets/theros/GiftOfImmortality.java | 1 + .../sets/theros/RescueFromTheUnderworld.java | 1 + .../src/mage/sets/theros/WhipOfErebos.java | 1 + .../mage/sets/timespiral/NorinTheWary.java | 1 + .../sets/timespiral/SaffiEriksdotter.java | 1 + .../src/mage/sets/urzaslegacy/MemoryJar.java | 1 + .../src/mage/sets/urzassaga/SneakAttack.java | 1 + .../sets/venservskoth/GalepowderMage.java | 1 + .../mage/sets/vintagemasters/ManaDrain.java | 1 + .../vintagemasters/MarchesaTheBlackRose.java | 1 + .../sets/visions/UndiscoveredParadise.java | 1 + .../mage/sets/worldwake/StoneIdolTrap.java | 1 + .../mage/sets/zendikar/ElementalAppeal.java | 1 + .../sets/zendikar/ZektarShrineExpedition.java | 1 + .../abilities/enters/BanisherPriestTest.java | 2 +- .../abilities/enters/GatherSpecimensTest.java | 2 +- .../cards/copy/SharuumTheHegemonTest.java | 78 +++++++++++++++ .../base/impl/CardTestPlayerAPIImpl.java | 1 + Mage/src/mage/abilities/AbilityImpl.java | 2 +- .../abilities/DelayedTriggeredAbilities.java | 3 + .../mage/abilities/TriggeredAbilities.java | 3 + Mage/src/mage/abilities/TriggeredAbility.java | 15 ++- .../mage/abilities/TriggeredAbilityImpl.java | 7 ++ .../abilityword/ConstellationAbility.java | 7 +- .../abilities/abilityword/KinshipAbility.java | 7 +- ...AllyEntersBattlefieldTriggeredAbility.java | 19 ++-- ...tureEntersBattlefieldTriggeredAbility.java | 7 +- .../AttackedByCreatureTriggeredAbility.java | 21 ++-- .../common/AttacksAllTriggeredAbility.java | 69 +++++++------- .../AttacksAttachedTriggeredAbility.java | 6 +- ...cksCreatureYouControlTriggeredAbility.java | 19 ++-- ...acksOrBlocksEnchantedTriggeredAbility.java | 13 ++- .../AttacksOrBlocksTriggeredAbility.java | 11 +-- .../common/AttacksTriggeredAbility.java | 8 +- .../common/AuraAttachedTriggeredAbility.java | 7 +- .../BecomesBlockedAllTriggeredAbility.java | 19 ++-- ...omesBlockedByCreatureTriggeredAbility.java | 7 +- .../BecomesBlockedTriggeredAbility.java | 10 +- ...ecomesMonstrousSourceTriggeredAbility.java | 7 +- ...pedCreatureControlledTriggeredAbility.java | 15 +-- .../common/BecomesTappedTriggeredAbility.java | 10 +- ...TargetControllerSpellTriggeredAbility.java | 13 ++- .../common/BecomesTargetTriggeredAbility.java | 10 +- .../BeginningOfCombatTriggeredAbility.java | 47 ++++----- .../BeginningOfDrawTriggeredAbility.java | 95 ++++++++++--------- .../BeginningOfEndStepTriggeredAbility.java | 72 +++++++------- ...inningOfPreCombatMainTriggeredAbility.java | 47 ++++----- .../BeginningOfUntapTriggeredAbility.java | 75 ++++++++------- .../BeginningOfUpkeepTriggeredAbility.java | 77 +++++++-------- ...eginningOfYourEndStepTriggeredAbility.java | 10 +- .../BlocksAttachedTriggeredAbility.java | 16 ++-- ...locksCreatureAttachedTriggeredAbility.java | 29 +++--- .../BlocksCreatureTriggeredAbility.java | 7 +- ...omesBlockedByCreatureTriggeredAbility.java | 25 ++--- ...locksOrBecomesBlockedTriggeredAbility.java | 5 + .../common/BlocksTriggeredAbility.java | 11 ++- ...tureEntersBattlefieldTriggeredAbility.java | 29 +++--- .../common/CycleAllTriggeredAbility.java | 16 ++-- .../common/CycleTriggeredAbility.java | 15 +-- ...mbatDamageToACreatureTriggeredAbility.java | 30 +++--- ...CombatDamageToAPlayerTriggeredAbility.java | 7 +- .../DealsCombatDamageTriggeredAbility.java | 5 + ...sDamageGainLifeSourceTriggeredAbility.java | 18 ++-- ...geToACreatureAttachedTriggeredAbility.java | 40 ++++---- ...ealsDamageToACreatureTriggeredAbility.java | 36 +++---- ...alsDamageToAPlayerAllTriggeredAbility.java | 10 +- ...mageToAPlayerAttachedTriggeredAbility.java | 35 +++---- .../DealsDamageToAPlayerTriggeredAbility.java | 7 +- .../DealtDamageToSourceTriggeredAbility.java | 15 +-- ...ndDealtDamageThisTurnTriggeredAbility.java | 9 +- .../common/DiesAttachedTriggeredAbility.java | 7 +- .../common/DiesCreatureTriggeredAbility.java | 27 +++--- ...ThisOrAnotherCreatureTriggeredAbility.java | 31 +++--- ...DiscardsACardOpponentTriggeredAbility.java | 10 +- .../DrawCardControllerTriggeredAbility.java | 10 +- .../DrawCardOpponentTriggeredAbility.java | 7 +- ...erCreatureYourControlTriggeredAbility.java | 7 +- .../EntersBattlefieldAllTriggeredAbility.java | 35 +++---- ...ttlefieldOrDiesSourceTriggeredAbility.java | 5 + .../EntersBattlefieldTriggeredAbility.java | 11 ++- ...sTheBattlefieldSourceTriggeredAbility.java | 5 + .../GainLifeControllerTriggeredAbility.java | 7 +- .../abilities/common/LandfallAbility.java | 13 ++- .../LeavesBattlefieldTriggeredAbility.java | 5 +- .../common/OnEventTriggeredAbility.java | 17 ++-- ...icesNonTokenPermanentTriggeredAbility.java | 7 +- ...ntSacrificesPermanentTriggeredAbility.java | 7 +- ...oGraveFromAnywhereAllTriggeredAbility.java | 7 +- ...aveFromBattlefieldAllTriggeredAbility.java | 23 +++-- ...FromBattlefieldSourceTriggeredAbility.java | 22 +++-- .../SacrificeSourceTriggeredAbility.java | 10 +- .../common/SimpleTriggeredAbility.java | 11 ++- .../common/SpellCastAllTriggeredAbility.java | 17 ++-- .../SpellCastControllerTriggeredAbility.java | 7 +- .../SpellCastOpponentTriggeredAbility.java | 7 +- .../common/TapForManaAllTriggeredAbility.java | 35 +++---- .../TapForManaAllTriggeredManaAbility.java | 33 ++++--- .../TapLandForManaAllTriggeredAbility.java | 17 ++-- ...TapLandForManaAllTriggeredManaAbility.java | 17 ++-- .../TurnedFaceUpAllTriggeredAbility.java | 37 ++++---- .../TurnedFaceUpSourceTriggeredAbility.java | 7 +- .../common/UnattachedTriggeredAbility.java | 7 +- .../common/ZoneChangeAllTriggeredAbility.java | 27 +++--- .../common/ZoneChangeTriggeredAbility.java | 7 +- ...eginOMainPhaseDelayedTriggeredAbility.java | 41 ++++---- ...eBeginOfCombatDelayedTriggeredAbility.java | 10 +- ...nOfNextCleanupDelayedTriggeredAbility.java | 7 +- ...nOfNextEndStepDelayedTriggeredAbility.java | 41 ++++---- ...inOfNextUpkeepDelayedTriggeredAbility.java | 6 +- ...YourNextUpkeepDelayedTriggeredAbility.java | 7 +- ...TheEndOfCombatDelayedTriggeredAbility.java | 10 +- ...OfTurnStepPostDelayedTriggeredAbility.java | 10 +- ...LeaveReturnExiledToBattlefieldAbility.java | 35 ++++--- .../delayed/PactDelayedTriggeredAbility.java | 14 ++- .../ConditionalTriggeredAbility.java | 5 + .../common/CastSourceTriggeredAbility.java | 13 ++- .../CreateDelayedTriggeredAbilityEffect.java | 1 + ...DealsDamageToOpponentTriggeredAbility.java | 7 +- ...romGraveyardToBattlefieldTargetEffect.java | 9 +- .../abilities/keyword/AnnihilatorAbility.java | 7 +- .../abilities/keyword/BattalionAbility.java | 12 +-- .../abilities/keyword/CascadeAbility.java | 13 ++- .../abilities/keyword/ConspireAbility.java | 8 +- .../abilities/keyword/DethroneAbility.java | 31 +++--- .../mage/abilities/keyword/EchoAbility.java | 18 ++-- .../mage/abilities/keyword/EvolveAbility.java | 26 ++--- .../abilities/keyword/ExaltedAbility.java | 7 +- .../mage/abilities/keyword/ExtortAbility.java | 10 +- .../abilities/keyword/FlankingAbility.java | 7 +- .../abilities/keyword/FlashbackAbility.java | 7 +- .../mage/abilities/keyword/GraftAbility.java | 27 +++--- .../mage/abilities/keyword/HeroicAbility.java | 7 +- .../abilities/keyword/InspiredAbility.java | 11 ++- .../keyword/LivingWeaponAbility.java | 1 - .../abilities/keyword/MadnessAbility.java | 7 +- .../abilities/keyword/MiracleAbility.java | 7 +- .../abilities/keyword/PersistAbility.java | 5 + .../abilities/keyword/ReboundAbility.java | 7 +- .../abilities/keyword/ReplicateAbility.java | 7 +- .../mage/abilities/keyword/StormAbility.java | 8 +- .../abilities/keyword/SuspendAbility.java | 7 +- .../abilities/keyword/UnearthAbility.java | 10 +- .../keyword/VanishingSacrificeAbility.java | 7 +- Mage/src/mage/cards/CardImpl.java | 4 + Mage/src/mage/game/permanent/token/Token.java | 1 + Mage/src/mage/players/PlayerImpl.java | 2 +- Mage/src/mage/util/CardUtil.java | 5 +- 242 files changed, 1602 insertions(+), 904 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/copy/SharuumTheHegemonTest.java diff --git a/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java b/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java index ad7b777e7d4..11dfa1d7286 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java +++ b/Mage.Sets/src/mage/sets/alarareborn/SlaveOfBolas.java @@ -101,6 +101,7 @@ class SlaveOfBolasEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java b/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java index 7b39f75c0b2..f7159d030f5 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/ThatcherRevolt.java @@ -97,6 +97,7 @@ class ThatcherRevoltEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } return true; diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java index 12e0943c836..547c3fb83b8 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/GoryosVengeance.java @@ -125,6 +125,7 @@ class GoryosVengeanceEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/KaijinOfTheVanishingTouch.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/KaijinOfTheVanishingTouch.java index 9daa6c1fa18..0733b89f4a3 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/KaijinOfTheVanishingTouch.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/KaijinOfTheVanishingTouch.java @@ -94,6 +94,7 @@ class KaijinOfTheVanishingTouchEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new ReturnToHandTargetEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/ShireiShizosCaretaker.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/ShireiShizosCaretaker.java index 44a97375054..2ef86d875ec 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/ShireiShizosCaretaker.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/ShireiShizosCaretaker.java @@ -151,6 +151,7 @@ class ShireiShizosCaretakerEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(card.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/bornofthegods/FelhideSpiritbinder.java b/Mage.Sets/src/mage/sets/bornofthegods/FelhideSpiritbinder.java index be55ceb44cd..69efc811108 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/FelhideSpiritbinder.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/FelhideSpiritbinder.java @@ -115,6 +115,7 @@ class FelhideSpiritbinderEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/bornofthegods/SearingBlood.java b/Mage.Sets/src/mage/sets/bornofthegods/SearingBlood.java index e21c5aef2a0..3efc367388b 100644 --- a/Mage.Sets/src/mage/sets/bornofthegods/SearingBlood.java +++ b/Mage.Sets/src/mage/sets/bornofthegods/SearingBlood.java @@ -94,6 +94,7 @@ class SearingBloodEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new SearingBloodDelayedTriggeredAbility(source.getFirstTarget()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return new DamageTargetEffect(2).apply(game, source); diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/HikariTwilightGuardian.java b/Mage.Sets/src/mage/sets/championsofkamigawa/HikariTwilightGuardian.java index 419aab83708..0a7b55abd5e 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/HikariTwilightGuardian.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/HikariTwilightGuardian.java @@ -103,6 +103,7 @@ class HikariTwilightGuardianEffect extends OneShotEffect { new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java b/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java index 7bded961114..cf0634135bc 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/JunkyoBell.java @@ -103,6 +103,7 @@ private class JunkyoBellSacrificeEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java b/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java index 2423ec0350b..aff7952cd47 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/KikiJikiMirrorBreaker.java @@ -131,6 +131,7 @@ class KikiJikiMirrorBreakerEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/OtherworldlyJourney.java b/Mage.Sets/src/mage/sets/championsofkamigawa/OtherworldlyJourney.java index 1812949d4a2..1170a612573 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/OtherworldlyJourney.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/OtherworldlyJourney.java @@ -99,6 +99,7 @@ class OtherworldlyJourneyEffect extends OneShotEffect { new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD, "return that card to the battlefield under its owner's control with a +1/+1 counter on it")); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); AddCountersTargetEffect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance()); effect.setTargetPointer(new FixedTarget(source.getFirstTarget())); delayedAbility.addEffect(effect); diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java b/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java index 11231f522e4..af94fb618da 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/SosukeSonOfSeshiro.java @@ -141,6 +141,7 @@ class SosukeSonOfSeshiroEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/TatsumasaTheDragonsFang.java b/Mage.Sets/src/mage/sets/championsofkamigawa/TatsumasaTheDragonsFang.java index 5877e5d5d15..8ccf46a7200 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/TatsumasaTheDragonsFang.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/TatsumasaTheDragonsFang.java @@ -111,6 +111,7 @@ class TatsumaTheDragonsFangEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new TatsumaTheDragonsFangTriggeredAbility(fixedTarget); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java b/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java index cd290881d26..923dbd64166 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/ThroughTheBreach.java @@ -119,6 +119,7 @@ class ThroughTheBreachEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/coldsnap/AdarkarValkyrie.java b/Mage.Sets/src/mage/sets/coldsnap/AdarkarValkyrie.java index edacb69093c..086fdaf9e0d 100644 --- a/Mage.Sets/src/mage/sets/coldsnap/AdarkarValkyrie.java +++ b/Mage.Sets/src/mage/sets/coldsnap/AdarkarValkyrie.java @@ -115,6 +115,7 @@ class AdarkarValkyrieEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AdarkarValkyrieDelayedTriggeredAbility(new FixedTarget(this.getTargetPointer().getFirst(game, source))); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return false; } diff --git a/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java b/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java index 43f2c5e8212..8fcc62768e9 100644 --- a/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java +++ b/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java @@ -103,6 +103,7 @@ class ScatteringStrokeEffect extends OneShotEffect { new AtTheBeginOMainPhaseDelayedTriggeredAbility(effect, true, TargetController.YOU, AtTheBeginOMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } return true; diff --git a/Mage.Sets/src/mage/sets/commander2013/Flickerform.java b/Mage.Sets/src/mage/sets/commander2013/Flickerform.java index a4b8defd953..24fbf2b8c11 100644 --- a/Mage.Sets/src/mage/sets/commander2013/Flickerform.java +++ b/Mage.Sets/src/mage/sets/commander2013/Flickerform.java @@ -136,6 +136,7 @@ class FlickerformEffect extends OneShotEffect { new FlickerformReturnEffect(enchantedCreature.getId(), exileZoneId)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } return true; diff --git a/Mage.Sets/src/mage/sets/commander2013/Reincarnation.java b/Mage.Sets/src/mage/sets/commander2013/Reincarnation.java index d7019ff32b9..3be9ee8d14d 100644 --- a/Mage.Sets/src/mage/sets/commander2013/Reincarnation.java +++ b/Mage.Sets/src/mage/sets/commander2013/Reincarnation.java @@ -98,6 +98,7 @@ class ReincarnationEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new ReincarnationDelayedTriggeredAbility(targetPointer.getFirst(game, source)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/commander2013/RoonOfTheHiddenRealm.java b/Mage.Sets/src/mage/sets/commander2013/RoonOfTheHiddenRealm.java index 6b5931f084c..eeb543c56c7 100644 --- a/Mage.Sets/src/mage/sets/commander2013/RoonOfTheHiddenRealm.java +++ b/Mage.Sets/src/mage/sets/commander2013/RoonOfTheHiddenRealm.java @@ -129,6 +129,7 @@ class RoonOfTheHiddenRealmEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(exileId, Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(card.getOwnerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } } diff --git a/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java b/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java index 3cce5fed000..92098406988 100644 --- a/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java +++ b/Mage.Sets/src/mage/sets/commander2014/DarettiScrapSavant.java @@ -249,6 +249,7 @@ class DarettiScrapSavantEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java b/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java index bb2e726042f..7512e466b14 100644 --- a/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java +++ b/Mage.Sets/src/mage/sets/commander2014/FeldonOfTheThirdPath.java @@ -118,6 +118,7 @@ class FeldonOfTheThirdPathEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java b/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java index 5a22ffff0b5..7b427bee99e 100644 --- a/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java +++ b/Mage.Sets/src/mage/sets/commander2014/WakeTheDead.java @@ -165,6 +165,7 @@ class WakeTheDeadReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEff DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } diff --git a/Mage.Sets/src/mage/sets/conflux/BrackwaterElemental.java b/Mage.Sets/src/mage/sets/conflux/BrackwaterElemental.java index 8db4bce6e3c..b27632f5025 100644 --- a/Mage.Sets/src/mage/sets/conflux/BrackwaterElemental.java +++ b/Mage.Sets/src/mage/sets/conflux/BrackwaterElemental.java @@ -101,6 +101,7 @@ class BrackwaterElementalSacrificeEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } return false; diff --git a/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java b/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java index 8c29692be48..fb8c888ef11 100644 --- a/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java +++ b/Mage.Sets/src/mage/sets/conflux/QuenchableFire.java @@ -94,6 +94,7 @@ class QuenchableFireEffect extends OneShotEffect { QuenchableFireDelayedTriggeredAbility delayedAbility = new QuenchableFireDelayedTriggeredAbility(); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getTargets().addAll(source.getTargets()); game.addDelayedTriggeredAbility(delayedAbility); //create special action diff --git a/Mage.Sets/src/mage/sets/darkascension/LoyalCathar.java b/Mage.Sets/src/mage/sets/darkascension/LoyalCathar.java index ebdcd669fb8..c47d7ce736c 100644 --- a/Mage.Sets/src/mage/sets/darkascension/LoyalCathar.java +++ b/Mage.Sets/src/mage/sets/darkascension/LoyalCathar.java @@ -100,6 +100,7 @@ class LoyalCatharEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnLoyalCatharEffect(source.getSourceId())); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/darkascension/Seance.java b/Mage.Sets/src/mage/sets/darkascension/Seance.java index 96f0dfd49fd..fc9387fb38c 100644 --- a/Mage.Sets/src/mage/sets/darkascension/Seance.java +++ b/Mage.Sets/src/mage/sets/darkascension/Seance.java @@ -112,6 +112,7 @@ class SeanceEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } diff --git a/Mage.Sets/src/mage/sets/darkascension/SuddenDisappearance.java b/Mage.Sets/src/mage/sets/darkascension/SuddenDisappearance.java index b8c6e656bb6..15b62eaac19 100644 --- a/Mage.Sets/src/mage/sets/darkascension/SuddenDisappearance.java +++ b/Mage.Sets/src/mage/sets/darkascension/SuddenDisappearance.java @@ -97,6 +97,7 @@ class SuddenDisappearanceEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/AEtherling.java b/Mage.Sets/src/mage/sets/dragonsmaze/AEtherling.java index f22253778bc..caad2e5c1e7 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/AEtherling.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/AEtherling.java @@ -107,6 +107,7 @@ class AEherlingRemovingEffect extends OneShotEffect { new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/LegionsInitiative.java b/Mage.Sets/src/mage/sets/dragonsmaze/LegionsInitiative.java index b8423812467..0717176e4c4 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/LegionsInitiative.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/LegionsInitiative.java @@ -133,6 +133,7 @@ class LegionsInitiativeExileEffect extends OneShotEffect { AtTheBeginOfCombatDelayedTriggeredAbility delayedAbility = new AtTheBeginOfCombatDelayedTriggeredAbility(new LegionsInitiativeReturnFromExileEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java b/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java index 503bba812c1..bbe41eb33cc 100644 --- a/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java +++ b/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java @@ -101,6 +101,7 @@ class PlasmCaptureCounterEffect extends OneShotEffect { new AtTheBeginOMainPhaseDelayedTriggeredAbility(new PlasmCaptureManaEffect(mana), false, TargetController.YOU, PhaseSelection.NEXT_PRECOMBAT_MAIN); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/eventide/Flickerwisp.java b/Mage.Sets/src/mage/sets/eventide/Flickerwisp.java index be2ddca79fa..024ac1d53dd 100644 --- a/Mage.Sets/src/mage/sets/eventide/Flickerwisp.java +++ b/Mage.Sets/src/mage/sets/eventide/Flickerwisp.java @@ -107,6 +107,7 @@ class FlickerwispEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD, false)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/fatereforged/ArashinWarBeast.java b/Mage.Sets/src/mage/sets/fatereforged/ArashinWarBeast.java index d18e765f96b..1f28a900ba2 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/ArashinWarBeast.java +++ b/Mage.Sets/src/mage/sets/fatereforged/ArashinWarBeast.java @@ -97,6 +97,11 @@ class ArashinWarBeastTriggeredAbility extends TriggeredAbilityImpl { return new ArashinWarBeastTriggeredAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_CREATURE || event.getType() == GameEvent.EventType.COMBAT_DAMAGE_STEP_POST ; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.DAMAGED_CREATURE && diff --git a/Mage.Sets/src/mage/sets/fatereforged/Arcbond.java b/Mage.Sets/src/mage/sets/fatereforged/Arcbond.java index 5ab823ccf11..5b12862c707 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/Arcbond.java +++ b/Mage.Sets/src/mage/sets/fatereforged/Arcbond.java @@ -110,10 +110,14 @@ class ArcbondDelayedTriggeredAbility extends DelayedTriggeredAbility { return super.isInactive(game); } + @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 && - event.getTargetId().equals(targetObject.getSourceId()) && + if (event.getTargetId().equals(targetObject.getSourceId()) && targetObject.getPermanentOrLKIBattlefield(game) != null) { for (Effect effect : this.getEffects()) { effect.setValue("damage", event.getAmount()); diff --git a/Mage.Sets/src/mage/sets/fatereforged/AtarkaWorldRender.java b/Mage.Sets/src/mage/sets/fatereforged/AtarkaWorldRender.java index 1ea9308089f..d5ad4df0608 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/AtarkaWorldRender.java +++ b/Mage.Sets/src/mage/sets/fatereforged/AtarkaWorldRender.java @@ -104,17 +104,20 @@ class AtarkaWorldRenderEffect extends TriggeredAbilityImpl { return new AtarkaWorldRenderEffect(this); } + @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() == EventType.ATTACKER_DECLARED) { - Permanent attacker = game.getPermanent(event.getSourceId()); - if (attacker != null - && filter.match(attacker, sourceId, controllerId, game)) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(attacker.getId())); - } - return true; + Permanent attacker = game.getPermanent(event.getSourceId()); + if (attacker != null + && filter.match(attacker, sourceId, controllerId, game)) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(attacker.getId())); } + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/fatereforged/BrutalHordechief.java b/Mage.Sets/src/mage/sets/fatereforged/BrutalHordechief.java index 4d1f6ffbf2c..7a5d0f03a59 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/BrutalHordechief.java +++ b/Mage.Sets/src/mage/sets/fatereforged/BrutalHordechief.java @@ -108,15 +108,18 @@ class BrutalHordechiefTriggeredAbility extends TriggeredAbilityImpl { return new BrutalHordechiefTriggeredAbility(this); } + @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 source = game.getPermanent(event.getSourceId()); - if (source != null && source.getControllerId().equals(controllerId)) { - UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(event.getSourceId(), game); - this.getEffects().get(0).setTargetPointer(new FixedTarget(defendingPlayerId)); - return true; - } + Permanent source = game.getPermanent(event.getSourceId()); + if (source != null && source.getControllerId().equals(controllerId)) { + UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(event.getSourceId(), game); + this.getEffects().get(0).setTargetPointer(new FixedTarget(defendingPlayerId)); + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/fatereforged/FrontierSiege.java b/Mage.Sets/src/mage/sets/fatereforged/FrontierSiege.java index 873b0d55e5e..5851af80102 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/FrontierSiege.java +++ b/Mage.Sets/src/mage/sets/fatereforged/FrontierSiege.java @@ -121,11 +121,15 @@ class FrontierSiegeKhansTriggeredAbility extends TriggeredAbilityImpl { return new FrontierSiegeKhansTriggeredAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.PRECOMBAT_MAIN_PHASE_PRE + || event.getType() == GameEvent.EventType.POSTCOMBAT_MAIN_PHASE_PRE; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - return (event.getType() == GameEvent.EventType.PRECOMBAT_MAIN_PHASE_PRE - || event.getType() == GameEvent.EventType.POSTCOMBAT_MAIN_PHASE_PRE) - && event.getPlayerId().equals(this.controllerId); + return event.getPlayerId().equals(this.controllerId); } @Override diff --git a/Mage.Sets/src/mage/sets/fatereforged/MarduWoeReaper.java b/Mage.Sets/src/mage/sets/fatereforged/MarduWoeReaper.java index 0b4c709aefe..dffa07c1590 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/MarduWoeReaper.java +++ b/Mage.Sets/src/mage/sets/fatereforged/MarduWoeReaper.java @@ -90,9 +90,14 @@ class MarduWoeReaperTriggeredAbility extends TriggeredAbilityImpl { return new MarduWoeReaperTriggeredAbility(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.getId() == this.getSourceId() || permanent.hasSubtype("Warrior"))) { return true; diff --git a/Mage.Sets/src/mage/sets/fatereforged/RallyTheAncestors.java b/Mage.Sets/src/mage/sets/fatereforged/RallyTheAncestors.java index 4d6d0bf6c40..a0135d167a2 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/RallyTheAncestors.java +++ b/Mage.Sets/src/mage/sets/fatereforged/RallyTheAncestors.java @@ -107,6 +107,7 @@ class RallyTheAncestorsEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } } diff --git a/Mage.Sets/src/mage/sets/gatecrash/Voidwalk.java b/Mage.Sets/src/mage/sets/gatecrash/Voidwalk.java index 34252a333f2..ffa817321ad 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/Voidwalk.java +++ b/Mage.Sets/src/mage/sets/gatecrash/Voidwalk.java @@ -98,6 +98,7 @@ class VoidwalkEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(card.getOwnerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/guildpact/GhostCouncilOfOrzhova.java b/Mage.Sets/src/mage/sets/guildpact/GhostCouncilOfOrzhova.java index c65f236ef76..e6953319c89 100644 --- a/Mage.Sets/src/mage/sets/guildpact/GhostCouncilOfOrzhova.java +++ b/Mage.Sets/src/mage/sets/guildpact/GhostCouncilOfOrzhova.java @@ -140,6 +140,7 @@ class GhostCouncilOfOrzhovaRemovingEffect extends OneShotEffect { new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/guildpact/Ghostway.java b/Mage.Sets/src/mage/sets/guildpact/Ghostway.java index f85db2c749d..4e45ee3c595 100644 --- a/Mage.Sets/src/mage/sets/guildpact/Ghostway.java +++ b/Mage.Sets/src/mage/sets/guildpact/Ghostway.java @@ -95,6 +95,7 @@ class GhostwayEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD, true)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } } diff --git a/Mage.Sets/src/mage/sets/iceage/Necropotence.java b/Mage.Sets/src/mage/sets/iceage/Necropotence.java index ecd1b1e3381..4780c1fc638 100644 --- a/Mage.Sets/src/mage/sets/iceage/Necropotence.java +++ b/Mage.Sets/src/mage/sets/iceage/Necropotence.java @@ -144,6 +144,7 @@ class NecropotenceEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(returnToHandeffect, TargetController.YOU); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/invasion/SpinalEmbrace.java b/Mage.Sets/src/mage/sets/invasion/SpinalEmbrace.java index 98767d555cd..5bd55aea1e3 100644 --- a/Mage.Sets/src/mage/sets/invasion/SpinalEmbrace.java +++ b/Mage.Sets/src/mage/sets/invasion/SpinalEmbrace.java @@ -149,6 +149,7 @@ class SpinalEmbraceAddDelayedEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/jacevsvraska/OhranViper.java b/Mage.Sets/src/mage/sets/jacevsvraska/OhranViper.java index 856addd2033..a17401c0841 100644 --- a/Mage.Sets/src/mage/sets/jacevsvraska/OhranViper.java +++ b/Mage.Sets/src/mage/sets/jacevsvraska/OhranViper.java @@ -94,6 +94,7 @@ class OhranViperDestroyEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/Skybind.java b/Mage.Sets/src/mage/sets/journeyintonyx/Skybind.java index 9a085fafeb5..cb260afb96a 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/Skybind.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/Skybind.java @@ -100,6 +100,7 @@ class SkybindEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/Twinflame.java b/Mage.Sets/src/mage/sets/journeyintonyx/Twinflame.java index 5e3ce74b97e..9878bca7aa5 100644 --- a/Mage.Sets/src/mage/sets/journeyintonyx/Twinflame.java +++ b/Mage.Sets/src/mage/sets/journeyintonyx/Twinflame.java @@ -112,6 +112,7 @@ class TwinflameCopyEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/AvalancheTusker.java b/Mage.Sets/src/mage/sets/khansoftarkir/AvalancheTusker.java index c1557b0e88a..26cb95683d3 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/AvalancheTusker.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/AvalancheTusker.java @@ -84,9 +84,14 @@ class AvalancheTuskerAbility extends TriggeredAbilityImpl { super(ability); } + @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 && event.getSourceId().equals(this.getSourceId())) { + if (event.getSourceId().equals(this.getSourceId())) { FilterCreaturePermanent filter = new FilterCreaturePermanent("creature defending player controls"); UUID defenderId = game.getCombat().getDefendingPlayerId(sourceId, game); filter.add(new ControllerIdPredicate(defenderId)); diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/BurnAway.java b/Mage.Sets/src/mage/sets/khansoftarkir/BurnAway.java index 73492cda7a3..2162a8bc805 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/BurnAway.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/BurnAway.java @@ -83,17 +83,20 @@ class BurnAwayDelayedTriggeredAbility extends DelayedTriggeredAbility { super(ability); } + @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; - if (zEvent.isDiesEvent() && zEvent.getTarget() != null && zEvent.getTargetId().equals(getTargets().getFirstTarget())) { - this.getTargets().clear(); // else spell fizzels because target creature died - Target target = new TargetPlayer(); - target.add(zEvent.getTarget().getControllerId(), game); - this.addTarget(target); - return true; - } + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.isDiesEvent() && zEvent.getTarget() != null && zEvent.getTargetId().equals(getTargets().getFirstTarget())) { + this.getTargets().clear(); // else spell fizzels because target creature died + Target target = new TargetPlayer(); + target.add(zEvent.getTarget().getControllerId(), game); + this.addTarget(target); + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/DeathFrenzy.java b/Mage.Sets/src/mage/sets/khansoftarkir/DeathFrenzy.java index a6b70fe98c9..2cbd24b0ded 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/DeathFrenzy.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/DeathFrenzy.java @@ -81,13 +81,16 @@ class DeathFrenzyDelayedTriggeredAbility extends DelayedTriggeredAbility { super(ability); } + @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; - if (zEvent.isDiesEvent() && zEvent.getTarget() != null && filter.match(zEvent.getTarget(), sourceId, controllerId, game)) { - return true; - } + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.isDiesEvent() && zEvent.getTarget() != null && filter.match(zEvent.getTarget(), sourceId, controllerId, game)) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/EfreetWeaponmaster.java b/Mage.Sets/src/mage/sets/khansoftarkir/EfreetWeaponmaster.java index fb14f5a1327..404e26d41c3 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/EfreetWeaponmaster.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/EfreetWeaponmaster.java @@ -108,6 +108,11 @@ class EfreetWeaponmasterAbility extends TriggeredAbilityImpl { return new EfreetWeaponmasterAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TURNEDFACEUP || event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.TURNEDFACEUP && event.getTargetId().equals(this.getSourceId())) { diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java b/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java index 99e61950ebe..b75afd4d4c2 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/HeraldOfAnafenza.java @@ -91,10 +91,15 @@ class HeraldOfAnafenzaTriggeredAbility extends TriggeredAbilityImpl { public HeraldOfAnafenzaTriggeredAbility copy() { return new HeraldOfAnafenzaTriggeredAbility(this); } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ACTIVATED_ABILITY; + } @Override public boolean checkTrigger(GameEvent event, Game game) { - if (EventType.ACTIVATED_ABILITY.equals(event.getType()) && event.getSourceId().equals(getSourceId())) { + if (event.getSourceId().equals(getSourceId())) { StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getTargetId()); if (stackAbility != null && (stackAbility.getStackAbility() instanceof OutlastAbility)) { return true; diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/HowlOfTheHorde.java b/Mage.Sets/src/mage/sets/khansoftarkir/HowlOfTheHorde.java index e469a856a5e..ce82fdf96d6 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/HowlOfTheHorde.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/HowlOfTheHorde.java @@ -91,9 +91,14 @@ class HowlOfTheHordeDelayedTriggeredAbility extends DelayedTriggeredAbility { return new HowlOfTheHordeDelayedTriggeredAbility(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() == 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 && (spell.getCardType().contains(CardType.INSTANT) || spell.getCardType().contains(CardType.SORCERY))) { for (Effect effect : this.getEffects()) { diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/KheruLichLord.java b/Mage.Sets/src/mage/sets/khansoftarkir/KheruLichLord.java index 050d830558c..cea885f67f7 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/KheruLichLord.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/KheruLichLord.java @@ -141,6 +141,7 @@ class KheruLichLordEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); KheruLichLordReplacementEffect replacementEffect = new KheruLichLordReplacementEffect(); diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/MeanderingTowershell.java b/Mage.Sets/src/mage/sets/khansoftarkir/MeanderingTowershell.java index 7390f66cf50..7b131ddf079 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/MeanderingTowershell.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/MeanderingTowershell.java @@ -118,6 +118,7 @@ class MeanderingTowershellEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtBeginningNextDeclareAttackersStepNextTurnDelayedTriggeredAbility(); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } @@ -143,10 +144,14 @@ class AtBeginningNextDeclareAttackersStepNextTurnDelayedTriggeredAbility extends startingTurn = game.getTurnNum(); } + @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 && event.getPlayerId().equals(this.controllerId)) { + if (event.getPlayerId().equals(this.controllerId)) { if (game.getTurnNum() != startingTurn) { return true; } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/PonybackBrigade.java b/Mage.Sets/src/mage/sets/khansoftarkir/PonybackBrigade.java index e5ab12344e6..8fa63732235 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/PonybackBrigade.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/PonybackBrigade.java @@ -95,6 +95,11 @@ class PonybackBrigadeAbility extends TriggeredAbilityImpl { return new PonybackBrigadeAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TURNEDFACEUP || event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.TURNEDFACEUP && event.getTargetId().equals(this.getSourceId())) { diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/RaidersSpoils.java b/Mage.Sets/src/mage/sets/khansoftarkir/RaidersSpoils.java index a6fc62b5ae0..45d908f08d7 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/RaidersSpoils.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/RaidersSpoils.java @@ -88,15 +88,18 @@ class RaidersSpoilsTriggeredAbility extends TriggeredAbilityImpl { public RaidersSpoilsTriggeredAbility copy() { return new RaidersSpoilsTriggeredAbility(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) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; - Permanent permanent = game.getPermanent(event.getSourceId()); - if (damageEvent.isCombatDamage() && permanent != null && permanent.hasSubtype("Warrior") && permanent.getControllerId().equals(controllerId)) { - return true; - } + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; + Permanent permanent = game.getPermanent(event.getSourceId()); + if (damageEvent.isCombatDamage() && permanent != null && permanent.hasSubtype("Warrior") && permanent.getControllerId().equals(controllerId)) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/RakshasaVizier.java b/Mage.Sets/src/mage/sets/khansoftarkir/RakshasaVizier.java index 5681f080c32..db3c7fb435c 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/RakshasaVizier.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/RakshasaVizier.java @@ -87,17 +87,20 @@ class RakshasaVizierTriggeredAbility extends TriggeredAbilityImpl { } @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.ZONE_CHANGE) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getFromZone() == Zone.GRAVEYARD - && zEvent.getToZone() == Zone.EXILED) { - Card card = game.getCard(event.getTargetId()); - if (card != null && card.getOwnerId().equals(getControllerId())) { - return true; - } + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + @Override + public boolean checkTrigger(GameEvent event, Game game) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.getFromZone() == Zone.GRAVEYARD + && zEvent.getToZone() == Zone.EXILED) { + Card card = game.getCard(event.getTargetId()); + if (card != null && card.getOwnerId().equals(getControllerId())) { + return true; } + } return false; } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/SecretPlans.java b/Mage.Sets/src/mage/sets/khansoftarkir/SecretPlans.java index a1423c4728c..33436b0cc18 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/SecretPlans.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/SecretPlans.java @@ -96,13 +96,16 @@ class SecretPlanTriggeredAbility extends TriggeredAbilityImpl{ return new SecretPlanTriggeredAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TURNEDFACEUP; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.TURNEDFACEUP) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent.getControllerId().equals(this.controllerId)) { - return true; - } + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent.getControllerId().equals(this.controllerId)) { + return true; } return false; } diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/SidisiBroodTyrant.java b/Mage.Sets/src/mage/sets/khansoftarkir/SidisiBroodTyrant.java index 68b5a6b9f4a..0e55e8c14cd 100644 --- a/Mage.Sets/src/mage/sets/khansoftarkir/SidisiBroodTyrant.java +++ b/Mage.Sets/src/mage/sets/khansoftarkir/SidisiBroodTyrant.java @@ -95,6 +95,11 @@ class SidisiBroodTyrantAbility extends TriggeredAbilityImpl { return new SidisiBroodTyrantAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ATTACKER_DECLARED || event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { @@ -127,27 +132,30 @@ class SidisiBroodTyrantTriggeredAbility extends ZoneChangeTriggeredAbility { this.lastStackObjectId = ability.lastStackObjectId; } + @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)) { - Card card = game.getCard(event.getTargetId()); - if (card != null && card.getOwnerId().equals(getControllerId()) && card.getCardType().contains(CardType.CREATURE)) { - StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); - if (stackObject == null) { - stackObject = (StackObject) game.getLastKnownInformation(event.getSourceId(), Zone.STACK); - } - if (stackObject != null) { - if (stackObject.getId().equals(lastStackObjectId)) { - return false; // was already handled - } - lastStackObjectId = stackObject.getId(); - return true; - } else { - // special action or replacement effect, so we can't check yet if multiple cards are moved with one effect - return true; + ZoneChangeEvent zEvent = (ZoneChangeEvent)event; + if ((fromZone == null || zEvent.getFromZone() == fromZone) && (toZone == null || zEvent.getToZone() == toZone)) { + Card card = game.getCard(event.getTargetId()); + if (card != null && card.getOwnerId().equals(getControllerId()) && card.getCardType().contains(CardType.CREATURE)) { + StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); + if (stackObject == null) { + stackObject = (StackObject) game.getLastKnownInformation(event.getSourceId(), Zone.STACK); + } + if (stackObject != null) { + if (stackObject.getId().equals(lastStackObjectId)) { + return false; // was already handled } + lastStackObjectId = stackObject.getId(); + return true; + } else { + // special action or replacement effect, so we can't check yet if multiple cards are moved with one effect + return true; } } } diff --git a/Mage.Sets/src/mage/sets/legends/Abomination.java b/Mage.Sets/src/mage/sets/legends/Abomination.java index dad0b75bd04..746db1da820 100644 --- a/Mage.Sets/src/mage/sets/legends/Abomination.java +++ b/Mage.Sets/src/mage/sets/legends/Abomination.java @@ -154,6 +154,7 @@ class AbominationEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()); delayedAbility.setSourceId(permanent.getId()); delayedAbility.setControllerId(event.getControllerId()); + delayedAbility.setSourceObject(event.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/legends/HazezonTamar.java b/Mage.Sets/src/mage/sets/legends/HazezonTamar.java index 6774c0dedfb..a45ff2e38f4 100644 --- a/Mage.Sets/src/mage/sets/legends/HazezonTamar.java +++ b/Mage.Sets/src/mage/sets/legends/HazezonTamar.java @@ -117,6 +117,7 @@ class HazezonTamarEntersEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Berserk.java b/Mage.Sets/src/mage/sets/limitedalpha/Berserk.java index 8ae72097d7b..2d50d593dbd 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/Berserk.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/Berserk.java @@ -175,6 +175,7 @@ class BerserkDestroyEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Cockatrice.java b/Mage.Sets/src/mage/sets/limitedalpha/Cockatrice.java index 9de865e17d2..0d3facd1af0 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/Cockatrice.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/Cockatrice.java @@ -136,6 +136,7 @@ class CockatriceEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/limitedalpha/ThicketBasilisk.java b/Mage.Sets/src/mage/sets/limitedalpha/ThicketBasilisk.java index 8efd8a87435..630133e654e 100644 --- a/Mage.Sets/src/mage/sets/limitedalpha/ThicketBasilisk.java +++ b/Mage.Sets/src/mage/sets/limitedalpha/ThicketBasilisk.java @@ -133,6 +133,7 @@ class ThicketBasiliskEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/magic2010/DragonWhelp.java b/Mage.Sets/src/mage/sets/magic2010/DragonWhelp.java index 441dd0207f5..5d7f41a4a3c 100644 --- a/Mage.Sets/src/mage/sets/magic2010/DragonWhelp.java +++ b/Mage.Sets/src/mage/sets/magic2010/DragonWhelp.java @@ -103,6 +103,7 @@ class DragonWhelpEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new DragonWhelpDelayedEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } amount++; diff --git a/Mage.Sets/src/mage/sets/magic2010/StoneGiant.java b/Mage.Sets/src/mage/sets/magic2010/StoneGiant.java index 212984c2ff9..c52cd5b22e4 100644 --- a/Mage.Sets/src/mage/sets/magic2010/StoneGiant.java +++ b/Mage.Sets/src/mage/sets/magic2010/StoneGiant.java @@ -134,6 +134,7 @@ class StoneGiantEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java b/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java index 7012e05c29b..fb994eb692c 100644 --- a/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java +++ b/Mage.Sets/src/mage/sets/magic2011/MystifyingMaze.java @@ -101,6 +101,7 @@ class MystifyingMazeEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD, true)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/magic2014/BanisherPriest.java b/Mage.Sets/src/mage/sets/magic2014/BanisherPriest.java index e420e96e847..17b5cbcdbb3 100644 --- a/Mage.Sets/src/mage/sets/magic2014/BanisherPriest.java +++ b/Mage.Sets/src/mage/sets/magic2014/BanisherPriest.java @@ -107,7 +107,7 @@ class BanisherPriestExileEffect extends OneShotEffect { // If Banisher Priest leaves the battlefield before its triggered ability resolves, // the target creature won't be exiled. if (permanent != null) { - return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getName()).apply(game, source); + return new ExileTargetEffect(CardUtil.getObjectExileZoneId(game, permanent), permanent.getLogName()).apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/sets/magic2015/Phytotitan.java b/Mage.Sets/src/mage/sets/magic2015/Phytotitan.java index 473a617a376..e8aef60a630 100644 --- a/Mage.Sets/src/mage/sets/magic2015/Phytotitan.java +++ b/Mage.Sets/src/mage/sets/magic2015/Phytotitan.java @@ -94,6 +94,7 @@ class PhytotitanEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/mirage/RockBasilisk.java b/Mage.Sets/src/mage/sets/mirage/RockBasilisk.java index 450fbfc6a64..2da903f01e0 100644 --- a/Mage.Sets/src/mage/sets/mirage/RockBasilisk.java +++ b/Mage.Sets/src/mage/sets/mirage/RockBasilisk.java @@ -135,6 +135,7 @@ class RockBasiliskEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/mirage/ShallowGrave.java b/Mage.Sets/src/mage/sets/mirage/ShallowGrave.java index 9825e56d87d..210613e1a2b 100644 --- a/Mage.Sets/src/mage/sets/mirage/ShallowGrave.java +++ b/Mage.Sets/src/mage/sets/mirage/ShallowGrave.java @@ -113,6 +113,7 @@ class ShallowGraveEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } } diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/GruesomeEncore.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/GruesomeEncore.java index ea5b92c1625..f5c7f64aa7b 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/GruesomeEncore.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/GruesomeEncore.java @@ -106,6 +106,7 @@ class GruesomeEncoreEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/VirulentWound.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/VirulentWound.java index 7a844caf73b..a05353ec267 100644 --- a/Mage.Sets/src/mage/sets/mirrodinbesieged/VirulentWound.java +++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/VirulentWound.java @@ -97,6 +97,7 @@ class VirulentWoundEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new VirulentWoundDelayedTriggeredAbility(source.getFirstTarget()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java b/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java index a583b97aa17..261fd6cf29b 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/KarnLiberated.java @@ -149,6 +149,7 @@ class KarnLiberatedEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new KarnLiberatedDelayedTriggeredAbility(exileId); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); game.start(null); return true; diff --git a/Mage.Sets/src/mage/sets/newphyrexia/PostmortemLunge.java b/Mage.Sets/src/mage/sets/newphyrexia/PostmortemLunge.java index f563f9b5def..682fb58f6ed 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/PostmortemLunge.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/PostmortemLunge.java @@ -118,6 +118,7 @@ class PostmortemLungeEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/onslaught/AstralSlide.java b/Mage.Sets/src/mage/sets/onslaught/AstralSlide.java index 5742c1653e8..35423169e24 100644 --- a/Mage.Sets/src/mage/sets/onslaught/AstralSlide.java +++ b/Mage.Sets/src/mage/sets/onslaught/AstralSlide.java @@ -97,6 +97,7 @@ class AstralSlideEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(exileId, Zone.BATTLEFIELD, false)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/planarchaos/FatalFrenzy.java b/Mage.Sets/src/mage/sets/planarchaos/FatalFrenzy.java index ee7c260f529..dcc62722ab7 100644 --- a/Mage.Sets/src/mage/sets/planarchaos/FatalFrenzy.java +++ b/Mage.Sets/src/mage/sets/planarchaos/FatalFrenzy.java @@ -100,6 +100,7 @@ class FatalFrenzyEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java b/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java index d6995045c53..c7d07e640be 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/GraveBetrayal.java @@ -108,12 +108,13 @@ class GraveBetrayalTriggeredAbility extends TriggeredAbilityImpl { if (card != null) { Effect effect = new GraveBetrayalEffect(); effect.setTargetPointer(new FixedTarget(card.getId())); - Integer zoneChanges = new Integer(card.getZoneChangeCounter()); + Integer zoneChanges = card.getZoneChangeCounter(); effect.setValue("zoneChanges", zoneChanges); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(this.getSourceId()); delayedAbility.setControllerId(this.getControllerId()); + delayedAbility.setSourceObject(this.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/ArrogantBloodlord.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/ArrogantBloodlord.java index 8665a1d055e..8cc722bb30b 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/ArrogantBloodlord.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/ArrogantBloodlord.java @@ -133,6 +133,7 @@ class ArrogantBloodlordEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(source.getSourceId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SplinterTwin.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SplinterTwin.java index 1464819c65c..b015e9bdb29 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SplinterTwin.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SplinterTwin.java @@ -119,6 +119,7 @@ class SplinterTwinEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/FeralLightning.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/FeralLightning.java index d3aaaa72b7d..0ba4d846ea4 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/FeralLightning.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/FeralLightning.java @@ -101,6 +101,7 @@ class FeralLightningEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } return true; diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/FootstepsOfTheGoryo.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/FootstepsOfTheGoryo.java index f2f84097395..6e61ac3ff26 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/FootstepsOfTheGoryo.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/FootstepsOfTheGoryo.java @@ -110,6 +110,7 @@ class FootstepsOfTheGoryoEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/WineOfBloodAndIron.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/WineOfBloodAndIron.java index 0b6cf6023fb..7cbc59611b2 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/WineOfBloodAndIron.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/WineOfBloodAndIron.java @@ -100,6 +100,7 @@ class WineOfBloodAndIronEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/ArgentSphinx.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/ArgentSphinx.java index ea105ab27b7..c92a61e319d 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/ArgentSphinx.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/ArgentSphinx.java @@ -99,6 +99,7 @@ class ArgentSphinxEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/GlimmerpointStag.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/GlimmerpointStag.java index da6fd757f44..a04acf096cf 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/GlimmerpointStag.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/GlimmerpointStag.java @@ -100,6 +100,7 @@ class GlimmerpointStagEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java index bab46167782..6301e764580 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MimicVat.java @@ -208,6 +208,7 @@ class MimicVatCreateTokenEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/OgreGeargrabber.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/OgreGeargrabber.java index 11b504f46d8..db967c133dc 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/OgreGeargrabber.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/OgreGeargrabber.java @@ -111,6 +111,7 @@ class OgreGeargrabberEffect1 extends OneShotEffect { OgreGeargrabberDelayedTriggeredAbility delayedAbility = new OgreGeargrabberDelayedTriggeredAbility(equipmentId); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); Permanent equipment = game.getPermanent(equipmentId); if (equipment != null) { diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/VenserTheSojourner.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/VenserTheSojourner.java index 745f3600972..94374c58fb7 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/VenserTheSojourner.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/VenserTheSojourner.java @@ -136,6 +136,7 @@ class VenserTheSojournerEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/ElementalMastery.java b/Mage.Sets/src/mage/sets/shadowmoor/ElementalMastery.java index 7b78836e736..7928795a43e 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/ElementalMastery.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/ElementalMastery.java @@ -117,8 +117,9 @@ class ElementalMasteryEffect extends OneShotEffect { ExileTargetEffect exileEffect = new ExileTargetEffect("exile the token"); exileEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken())); DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); - delayedAbility.setSourceId(creatureAttached.getId()); - delayedAbility.setControllerId(creatureAttached.getControllerId()); + delayedAbility.setSourceId(source.getId()); + delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } return true; diff --git a/Mage.Sets/src/mage/sets/shadowmoor/MistmeadowWitch.java b/Mage.Sets/src/mage/sets/shadowmoor/MistmeadowWitch.java index 7b270c0393f..cd282e9c85a 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/MistmeadowWitch.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/MistmeadowWitch.java @@ -99,6 +99,7 @@ class MistmeadowWitchEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/shadowmoor/PuppeteerClique.java b/Mage.Sets/src/mage/sets/shadowmoor/PuppeteerClique.java index be7a6ef97e9..fc7e4afc21f 100644 --- a/Mage.Sets/src/mage/sets/shadowmoor/PuppeteerClique.java +++ b/Mage.Sets/src/mage/sets/shadowmoor/PuppeteerClique.java @@ -130,6 +130,7 @@ class PuppeteerCliqueEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect, TargetController.YOU); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); result = true; } diff --git a/Mage.Sets/src/mage/sets/shardsofalara/GatherSpecimens.java b/Mage.Sets/src/mage/sets/shardsofalara/GatherSpecimens.java index 5658b200590..8ceda7ed95a 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/GatherSpecimens.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/GatherSpecimens.java @@ -99,6 +99,11 @@ class GatherSpecimensReplacementEffect extends ReplacementEffectImpl { return false; } + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE || event.getType() == GameEvent.EventType.CREATE_TOKEN; + } + @Override public boolean applies(GameEvent event, Ability source, Game game) { if (event.getType() == GameEvent.EventType.ZONE_CHANGE diff --git a/Mage.Sets/src/mage/sets/shardsofalara/Skeletonize.java b/Mage.Sets/src/mage/sets/shardsofalara/Skeletonize.java index 077acddefb9..792addde23f 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/Skeletonize.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/Skeletonize.java @@ -103,6 +103,7 @@ class SkeletonizeEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new SkeletonizeDelayedTriggeredAbility(); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/tempest/CorpseDance.java b/Mage.Sets/src/mage/sets/tempest/CorpseDance.java index 4dee471bb7c..7f73cf424c4 100644 --- a/Mage.Sets/src/mage/sets/tempest/CorpseDance.java +++ b/Mage.Sets/src/mage/sets/tempest/CorpseDance.java @@ -116,6 +116,7 @@ class CorpseDanceEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } } diff --git a/Mage.Sets/src/mage/sets/thedark/Venom.java b/Mage.Sets/src/mage/sets/thedark/Venom.java index 3ba7367bf85..316dceafcd6 100644 --- a/Mage.Sets/src/mage/sets/thedark/Venom.java +++ b/Mage.Sets/src/mage/sets/thedark/Venom.java @@ -144,6 +144,7 @@ class VenomEffect extends OneShotEffect { AtTheEndOfCombatDelayedTriggeredAbility delayedAbility = new AtTheEndOfCombatDelayedTriggeredAbility(new DestroyTargetEffect()); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(targetCreature.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/theros/GiftOfImmortality.java b/Mage.Sets/src/mage/sets/theros/GiftOfImmortality.java index 87c5ce397d9..7e99744ca43 100644 --- a/Mage.Sets/src/mage/sets/theros/GiftOfImmortality.java +++ b/Mage.Sets/src/mage/sets/theros/GiftOfImmortality.java @@ -113,6 +113,7 @@ class GiftOfImmortalityEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } return true; diff --git a/Mage.Sets/src/mage/sets/theros/RescueFromTheUnderworld.java b/Mage.Sets/src/mage/sets/theros/RescueFromTheUnderworld.java index 106ccb26d56..f53eb0db14d 100644 --- a/Mage.Sets/src/mage/sets/theros/RescueFromTheUnderworld.java +++ b/Mage.Sets/src/mage/sets/theros/RescueFromTheUnderworld.java @@ -146,6 +146,7 @@ class RescueFromTheUnderworldCreateDelayedTriggeredAbilityEffect extends OneShot DelayedTriggeredAbility delayedAbility = (DelayedTriggeredAbility) ability.copy(); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getTargets().addAll(source.getTargets()); for(Effect effect : delayedAbility.getEffects()) { effect.getTargetPointer().init(game, source); diff --git a/Mage.Sets/src/mage/sets/theros/WhipOfErebos.java b/Mage.Sets/src/mage/sets/theros/WhipOfErebos.java index e9146fd50e6..619fec10856 100644 --- a/Mage.Sets/src/mage/sets/theros/WhipOfErebos.java +++ b/Mage.Sets/src/mage/sets/theros/WhipOfErebos.java @@ -128,6 +128,7 @@ class WhipOfErebosEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } return true; diff --git a/Mage.Sets/src/mage/sets/timespiral/NorinTheWary.java b/Mage.Sets/src/mage/sets/timespiral/NorinTheWary.java index e5332cc667d..d1b899ae047 100644 --- a/Mage.Sets/src/mage/sets/timespiral/NorinTheWary.java +++ b/Mage.Sets/src/mage/sets/timespiral/NorinTheWary.java @@ -132,6 +132,7 @@ class NorinTheWaryRemovingEffect extends OneShotEffect { new ReturnFromExileEffect(source.getSourceId(), Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } } diff --git a/Mage.Sets/src/mage/sets/timespiral/SaffiEriksdotter.java b/Mage.Sets/src/mage/sets/timespiral/SaffiEriksdotter.java index f66c8930ec5..00640ca0ebf 100644 --- a/Mage.Sets/src/mage/sets/timespiral/SaffiEriksdotter.java +++ b/Mage.Sets/src/mage/sets/timespiral/SaffiEriksdotter.java @@ -105,6 +105,7 @@ class SaffiEriksdotterEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new SaffiEriksdotterDelayedTriggeredAbility(new FixedTarget(this.getTargetPointer().getFirst(game, source))); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return false; } diff --git a/Mage.Sets/src/mage/sets/urzaslegacy/MemoryJar.java b/Mage.Sets/src/mage/sets/urzaslegacy/MemoryJar.java index 5a71a1d82b2..aad24e856f4 100644 --- a/Mage.Sets/src/mage/sets/urzaslegacy/MemoryJar.java +++ b/Mage.Sets/src/mage/sets/urzaslegacy/MemoryJar.java @@ -129,6 +129,7 @@ class MemoryJarEffect extends OneShotEffect { delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/urzassaga/SneakAttack.java b/Mage.Sets/src/mage/sets/urzassaga/SneakAttack.java index bd6b590b795..3367fd6b2cd 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/SneakAttack.java +++ b/Mage.Sets/src/mage/sets/urzassaga/SneakAttack.java @@ -116,6 +116,7 @@ class SneakAttackEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/venservskoth/GalepowderMage.java b/Mage.Sets/src/mage/sets/venservskoth/GalepowderMage.java index ff751ded720..ef46c296413 100644 --- a/Mage.Sets/src/mage/sets/venservskoth/GalepowderMage.java +++ b/Mage.Sets/src/mage/sets/venservskoth/GalepowderMage.java @@ -120,6 +120,7 @@ class GalepowderMageEffect extends OneShotEffect { AtTheBeginOfNextEndStepDelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnFromExileEffect(exileId, Zone.BATTLEFIELD)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(card.getOwnerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); } } diff --git a/Mage.Sets/src/mage/sets/vintagemasters/ManaDrain.java b/Mage.Sets/src/mage/sets/vintagemasters/ManaDrain.java index cac95952d21..7afd9d22e0c 100644 --- a/Mage.Sets/src/mage/sets/vintagemasters/ManaDrain.java +++ b/Mage.Sets/src/mage/sets/vintagemasters/ManaDrain.java @@ -101,6 +101,7 @@ class ManaDrainCounterEffect extends OneShotEffect { new AtTheBeginOMainPhaseDelayedTriggeredAbility(effect, false, TargetController.YOU, PhaseSelection.NEXT_MAIN); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/vintagemasters/MarchesaTheBlackRose.java b/Mage.Sets/src/mage/sets/vintagemasters/MarchesaTheBlackRose.java index 7d2b36473f9..0c598851491 100644 --- a/Mage.Sets/src/mage/sets/vintagemasters/MarchesaTheBlackRose.java +++ b/Mage.Sets/src/mage/sets/vintagemasters/MarchesaTheBlackRose.java @@ -160,6 +160,7 @@ class MarchesaTheBlackRoseEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(card.getId())); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/visions/UndiscoveredParadise.java b/Mage.Sets/src/mage/sets/visions/UndiscoveredParadise.java index 3a2f61faae9..53d7c9c5f75 100644 --- a/Mage.Sets/src/mage/sets/visions/UndiscoveredParadise.java +++ b/Mage.Sets/src/mage/sets/visions/UndiscoveredParadise.java @@ -87,6 +87,7 @@ class UndiscoveredParadiseEffect extends OneShotEffect { AtBeginningOfUntapDelayedTriggeredAbility delayedAbility = new AtBeginningOfUntapDelayedTriggeredAbility(new ReturnToHandSourceEffect(true)); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; } diff --git a/Mage.Sets/src/mage/sets/worldwake/StoneIdolTrap.java b/Mage.Sets/src/mage/sets/worldwake/StoneIdolTrap.java index 76fd05cace6..95157703623 100644 --- a/Mage.Sets/src/mage/sets/worldwake/StoneIdolTrap.java +++ b/Mage.Sets/src/mage/sets/worldwake/StoneIdolTrap.java @@ -146,6 +146,7 @@ class StoneIdolTrapEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect, TargetController.YOU); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/zendikar/ElementalAppeal.java b/Mage.Sets/src/mage/sets/zendikar/ElementalAppeal.java index 5fd32ee5f73..32da54d4398 100644 --- a/Mage.Sets/src/mage/sets/zendikar/ElementalAppeal.java +++ b/Mage.Sets/src/mage/sets/zendikar/ElementalAppeal.java @@ -109,6 +109,7 @@ class ElementalAppealEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Sets/src/mage/sets/zendikar/ZektarShrineExpedition.java b/Mage.Sets/src/mage/sets/zendikar/ZektarShrineExpedition.java index b053aa500c1..2da29ce3a05 100644 --- a/Mage.Sets/src/mage/sets/zendikar/ZektarShrineExpedition.java +++ b/Mage.Sets/src/mage/sets/zendikar/ZektarShrineExpedition.java @@ -108,6 +108,7 @@ class ZektarShrineExpeditionEffect extends OneShotEffect { DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect); delayedAbility.setSourceId(source.getSourceId()); delayedAbility.setControllerId(source.getControllerId()); + delayedAbility.setSourceObject(source.getSourceObject(game)); game.addDelayedTriggeredAbility(delayedAbility); return true; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/BanisherPriestTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/BanisherPriestTest.java index e364611bc94..6f8421fa7b6 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/BanisherPriestTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/BanisherPriestTest.java @@ -72,7 +72,7 @@ public class BanisherPriestTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2); /** - * Banisher Pries + * Banisher Priest * Creature — Human Cleric 2/2, 1WW * When Banisher Priest enters the battlefield, exile target creature an opponent controls until Banisher Priest leaves the battlefield. */ diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/GatherSpecimensTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/GatherSpecimensTest.java index bc88cda16f8..4c3dcf71a8e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/GatherSpecimensTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/GatherSpecimensTest.java @@ -112,8 +112,8 @@ public class GatherSpecimensTest extends CardTestPlayerBase { execute(); - assertPermanentCount(playerA, "Memnite", 1); assertPermanentCount(playerB, "Memnite", 0); + assertPermanentCount(playerA, "Memnite", 1); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/SharuumTheHegemonTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/SharuumTheHegemonTest.java new file mode 100644 index 00000000000..63f659961c2 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/SharuumTheHegemonTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.copy; + +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ + +public class SharuumTheHegemonTest extends CardTestPlayerBase { + + /** + * + */ + @Test + public void testCloneTriggered() { + // When Sharuum the Hegemon enters the battlefield, you may return target artifact card from your graveyard to the battlefield. + addCard(Zone.BATTLEFIELD, playerA, "Sharuum the Hegemon", 1); + addCard(Zone.HAND, playerA, "Clone", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + + // Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. + addCard(Zone.BATTLEFIELD, playerA, "Blood Artist", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Clone"); + setChoice(playerA, "Yes"); + setChoice(playerA, "Sharuum the Hegemon"); // what creature to clone + + addTarget(playerA, "Sharuum the Hegemon[no copy]"); // which legend to sacrifice + + addTarget(playerA, "Sharuum the Hegemon[no copy]"); // which legend to sacrifice + setChoice(playerA, "No"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 21); + assertLife(playerB, 19); + + + + } + +} \ No newline at end of file diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 28b75a0588f..0477525d587 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -806,6 +806,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement * e.g. "creatureName1^creatureName2" * you can qualify the target additional by setcode * e.g. "creatureName-M15" + * you can add [no copy] to prohibite targets that are copied */ public void addTarget(TestPlayer player, String target) { player.addTarget(target); diff --git a/Mage/src/mage/abilities/AbilityImpl.java b/Mage/src/mage/abilities/AbilityImpl.java index 38755cd2231..b672033250a 100644 --- a/Mage/src/mage/abilities/AbilityImpl.java +++ b/Mage/src/mage/abilities/AbilityImpl.java @@ -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); } diff --git a/Mage/src/mage/abilities/DelayedTriggeredAbilities.java b/Mage/src/mage/abilities/DelayedTriggeredAbilities.java index 54f668a4dd1..0192a4ca7ee 100644 --- a/Mage/src/mage/abilities/DelayedTriggeredAbilities.java +++ b/Mage/src/mage/abilities/DelayedTriggeredAbilities.java @@ -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()) { diff --git a/Mage/src/mage/abilities/TriggeredAbilities.java b/Mage/src/mage/abilities/TriggeredAbilities.java index 8f6fbfe6848..dba1a450f70 100644 --- a/Mage/src/mage/abilities/TriggeredAbilities.java +++ b/Mage/src/mage/abilities/TriggeredAbilities.java @@ -67,6 +67,9 @@ public class TriggeredAbilities extends ConcurrentHashMap 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)) { diff --git a/Mage/src/mage/abilities/TriggeredAbility.java b/Mage/src/mage/abilities/TriggeredAbility.java index 0ad798a101f..b2c5e9cb535 100644 --- a/Mage/src/mage/abilities/TriggeredAbility.java +++ b/Mage/src/mage/abilities/TriggeredAbility.java @@ -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(); } diff --git a/Mage/src/mage/abilities/TriggeredAbilityImpl.java b/Mage/src/mage/abilities/TriggeredAbilityImpl.java index 1b4f2ba9c30..b435148c8de 100644 --- a/Mage/src/mage/abilities/TriggeredAbilityImpl.java +++ b/Mage/src/mage/abilities/TriggeredAbilityImpl.java @@ -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); diff --git a/Mage/src/mage/abilities/abilityword/ConstellationAbility.java b/Mage/src/mage/abilities/abilityword/ConstellationAbility.java index fd656686f4a..dd6ad470117 100644 --- a/Mage/src/mage/abilities/abilityword/ConstellationAbility.java +++ b/Mage/src/mage/abilities/abilityword/ConstellationAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/abilityword/KinshipAbility.java b/Mage/src/mage/abilities/abilityword/KinshipAbility.java index 9f34633caee..cb7e6a978cf 100644 --- a/Mage/src/mage/abilities/abilityword/KinshipAbility.java +++ b/Mage/src/mage/abilities/abilityword/KinshipAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java b/Mage/src/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java index de3ea82fc16..341e1161952 100644 --- a/Mage/src/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/AnotherCreatureEntersBattlefieldTriggeredAbility.java b/Mage/src/mage/abilities/common/AnotherCreatureEntersBattlefieldTriggeredAbility.java index 2318d00cecd..cb67ac5ca14 100644 --- a/Mage/src/mage/abilities/common/AnotherCreatureEntersBattlefieldTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AnotherCreatureEntersBattlefieldTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/AttackedByCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/AttackedByCreatureTriggeredAbility.java index 7b2b5631fd4..478672b0b32 100644 --- a/Mage/src/mage/abilities/common/AttackedByCreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttackedByCreatureTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/AttacksAllTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksAllTriggeredAbility.java index 6fd5d61f82b..74ae8b1e7bf 100644 --- a/Mage/src/mage/abilities/common/AttacksAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttacksAllTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/AttacksAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksAttachedTriggeredAbility.java index 4467e38ab33..4e05f44cac3 100644 --- a/Mage/src/mage/abilities/common/AttacksAttachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttacksAttachedTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/AttacksCreatureYouControlTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksCreatureYouControlTriggeredAbility.java index db96a2024c3..8331b338615 100644 --- a/Mage/src/mage/abilities/common/AttacksCreatureYouControlTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttacksCreatureYouControlTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/AttacksOrBlocksEnchantedTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksOrBlocksEnchantedTriggeredAbility.java index 5f31fa7d670..90fe7dc0d2e 100644 --- a/Mage/src/mage/abilities/common/AttacksOrBlocksEnchantedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttacksOrBlocksEnchantedTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/AttacksOrBlocksTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksOrBlocksTriggeredAbility.java index cb6be2c0aad..7c1bb123487 100644 --- a/Mage/src/mage/abilities/common/AttacksOrBlocksTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttacksOrBlocksTriggeredAbility.java @@ -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()); } } diff --git a/Mage/src/mage/abilities/common/AttacksTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksTriggeredAbility.java index e8cea4c144d..084633a74a4 100644 --- a/Mage/src/mage/abilities/common/AttacksTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AttacksTriggeredAbility.java @@ -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); diff --git a/Mage/src/mage/abilities/common/AuraAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/AuraAttachedTriggeredAbility.java index 0c070a0f22c..cb4dca44ccc 100644 --- a/Mage/src/mage/abilities/common/AuraAttachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/AuraAttachedTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java index 4c20e9162f5..5d858d2e639 100644 --- a/Mage/src/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java index b5e565eba24..b50c2b94973 100644 --- a/Mage/src/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java @@ -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())); } diff --git a/Mage/src/mage/abilities/common/BecomesBlockedTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesBlockedTriggeredAbility.java index b757fc8eab2..195add0b244 100644 --- a/Mage/src/mage/abilities/common/BecomesBlockedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesBlockedTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/BecomesMonstrousSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesMonstrousSourceTriggeredAbility.java index 0a0e6a8e081..42f1dfec1f2 100644 --- a/Mage/src/mage/abilities/common/BecomesMonstrousSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesMonstrousSourceTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BecomesTappedCreatureControlledTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesTappedCreatureControlledTriggeredAbility.java index 1b87d768792..e8086954118 100644 --- a/Mage/src/mage/abilities/common/BecomesTappedCreatureControlledTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesTappedCreatureControlledTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BecomesTappedTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesTappedTriggeredAbility.java index de4e108aac9..666e6b1f893 100644 --- a/Mage/src/mage/abilities/common/BecomesTappedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesTappedTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/BecomesTargetControllerSpellTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesTargetControllerSpellTriggeredAbility.java index 1e6e62be7e5..3919ed65701 100644 --- a/Mage/src/mage/abilities/common/BecomesTargetControllerSpellTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesTargetControllerSpellTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/BecomesTargetTriggeredAbility.java b/Mage/src/mage/abilities/common/BecomesTargetTriggeredAbility.java index 7f0dcb15fb9..12e9e3db26c 100644 --- a/Mage/src/mage/abilities/common/BecomesTargetTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BecomesTargetTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/BeginningOfCombatTriggeredAbility.java b/Mage/src/mage/abilities/common/BeginningOfCombatTriggeredAbility.java index ac8f150edeb..1bab664de37 100644 --- a/Mage/src/mage/abilities/common/BeginningOfCombatTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BeginningOfCombatTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BeginningOfDrawTriggeredAbility.java b/Mage/src/mage/abilities/common/BeginningOfDrawTriggeredAbility.java index 6e1abfafd42..dc24d7a4faa 100644 --- a/Mage/src/mage/abilities/common/BeginningOfDrawTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BeginningOfDrawTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java b/Mage/src/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java index 3e7092a387d..2e87b2b424c 100644 --- a/Mage/src/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BeginningOfEndStepTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BeginningOfPreCombatMainTriggeredAbility.java b/Mage/src/mage/abilities/common/BeginningOfPreCombatMainTriggeredAbility.java index 8de361488e1..a32d5364c87 100644 --- a/Mage/src/mage/abilities/common/BeginningOfPreCombatMainTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BeginningOfPreCombatMainTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BeginningOfUntapTriggeredAbility.java b/Mage/src/mage/abilities/common/BeginningOfUntapTriggeredAbility.java index 12186fb9a1f..233935e988c 100644 --- a/Mage/src/mage/abilities/common/BeginningOfUntapTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BeginningOfUntapTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java b/Mage/src/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java index 8f1da6641fb..8dc0b496655 100644 --- a/Mage/src/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BeginningOfUpkeepTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BeginningOfYourEndStepTriggeredAbility.java b/Mage/src/mage/abilities/common/BeginningOfYourEndStepTriggeredAbility.java index 3bd7a79a6db..e569c67ba84 100644 --- a/Mage/src/mage/abilities/common/BeginningOfYourEndStepTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BeginningOfYourEndStepTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/BlocksAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/BlocksAttachedTriggeredAbility.java index 261d9f69223..6a373e5a048 100644 --- a/Mage/src/mage/abilities/common/BlocksAttachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BlocksAttachedTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BlocksCreatureAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/BlocksCreatureAttachedTriggeredAbility.java index 8099aeeace9..b74aaa0f9b5 100644 --- a/Mage/src/mage/abilities/common/BlocksCreatureAttachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BlocksCreatureAttachedTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BlocksCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/BlocksCreatureTriggeredAbility.java index 829960e0a88..25308ddd19e 100644 --- a/Mage/src/mage/abilities/common/BlocksCreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BlocksCreatureTriggeredAbility.java @@ -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())); diff --git a/Mage/src/mage/abilities/common/BlocksOrBecomesBlockedByCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/BlocksOrBecomesBlockedByCreatureTriggeredAbility.java index 7b6399d83b2..88c172b7a1b 100644 --- a/Mage/src/mage/abilities/common/BlocksOrBecomesBlockedByCreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BlocksOrBecomesBlockedByCreatureTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/BlocksOrBecomesBlockedTriggeredAbility.java b/Mage/src/mage/abilities/common/BlocksOrBecomesBlockedTriggeredAbility.java index c6c588bb1d7..bdc8c060d69 100644 --- a/Mage/src/mage/abilities/common/BlocksOrBecomesBlockedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BlocksOrBecomesBlockedTriggeredAbility.java @@ -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())) { diff --git a/Mage/src/mage/abilities/common/BlocksTriggeredAbility.java b/Mage/src/mage/abilities/common/BlocksTriggeredAbility.java index d25ad0aa003..b5aeee27011 100644 --- a/Mage/src/mage/abilities/common/BlocksTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/BlocksTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/CreatureEntersBattlefieldTriggeredAbility.java b/Mage/src/mage/abilities/common/CreatureEntersBattlefieldTriggeredAbility.java index 42935afefd7..3f9f31d2bfd 100644 --- a/Mage/src/mage/abilities/common/CreatureEntersBattlefieldTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/CreatureEntersBattlefieldTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/CycleAllTriggeredAbility.java b/Mage/src/mage/abilities/common/CycleAllTriggeredAbility.java index e19d6fb38ce..4a2e7b08205 100644 --- a/Mage/src/mage/abilities/common/CycleAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/CycleAllTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/CycleTriggeredAbility.java b/Mage/src/mage/abilities/common/CycleTriggeredAbility.java index 205cb201a0e..61082c3f377 100644 --- a/Mage/src/mage/abilities/common/CycleTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/CycleTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/DealsCombatDamageToACreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsCombatDamageToACreatureTriggeredAbility.java index 103c8713736..3109dfd7d77 100644 --- a/Mage/src/mage/abilities/common/DealsCombatDamageToACreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsCombatDamageToACreatureTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java index 0ebde356e42..ea4290e0416 100644 --- a/Mage/src/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java @@ -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()) { diff --git a/Mage/src/mage/abilities/common/DealsCombatDamageTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsCombatDamageTriggeredAbility.java index 95e3b34985c..3cad6e7da64 100644 --- a/Mage/src/mage/abilities/common/DealsCombatDamageTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsCombatDamageTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/DealsDamageGainLifeSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageGainLifeSourceTriggeredAbility.java index 702570e72f7..5da95952afb 100644 --- a/Mage/src/mage/abilities/common/DealsDamageGainLifeSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageGainLifeSourceTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/DealsDamageToACreatureAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToACreatureAttachedTriggeredAbility.java index 7200f576f67..9405da194e8 100644 --- a/Mage/src/mage/abilities/common/DealsDamageToACreatureAttachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageToACreatureAttachedTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/DealsDamageToACreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToACreatureTriggeredAbility.java index b491abcd47d..102d76e6d34 100644 --- a/Mage/src/mage/abilities/common/DealsDamageToACreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageToACreatureTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java index 849c8d62a8c..e5321dcc784 100644 --- a/Mage/src/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/DealsDamageToAPlayerAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToAPlayerAttachedTriggeredAbility.java index f80d39289b0..df51474f0bd 100644 --- a/Mage/src/mage/abilities/common/DealsDamageToAPlayerAttachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageToAPlayerAttachedTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/DealsDamageToAPlayerTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToAPlayerTriggeredAbility.java index 186b93ecc3e..01df0314d8d 100644 --- a/Mage/src/mage/abilities/common/DealsDamageToAPlayerTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageToAPlayerTriggeredAbility.java @@ -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())); diff --git a/Mage/src/mage/abilities/common/DealtDamageToSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/DealtDamageToSourceTriggeredAbility.java index 2ce35dfac68..6b8a4517e6b 100644 --- a/Mage/src/mage/abilities/common/DealtDamageToSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealtDamageToSourceTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/DiesAndDealtDamageThisTurnTriggeredAbility.java b/Mage/src/mage/abilities/common/DiesAndDealtDamageThisTurnTriggeredAbility.java index 7c4121947f9..0092e5d280e 100644 --- a/Mage/src/mage/abilities/common/DiesAndDealtDamageThisTurnTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DiesAndDealtDamageThisTurnTriggeredAbility.java @@ -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)) { diff --git a/Mage/src/mage/abilities/common/DiesAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/DiesAttachedTriggeredAbility.java index a13a1a559ef..4378242e1df 100644 --- a/Mage/src/mage/abilities/common/DiesAttachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DiesAttachedTriggeredAbility.java @@ -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()) { diff --git a/Mage/src/mage/abilities/common/DiesCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/DiesCreatureTriggeredAbility.java index dded4d18fd5..675142f1e60 100644 --- a/Mage/src/mage/abilities/common/DiesCreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DiesCreatureTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/DiesThisOrAnotherCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/DiesThisOrAnotherCreatureTriggeredAbility.java index cc62c90eb14..95c2db58ecc 100644 --- a/Mage/src/mage/abilities/common/DiesThisOrAnotherCreatureTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DiesThisOrAnotherCreatureTriggeredAbility.java @@ -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; - } } } } diff --git a/Mage/src/mage/abilities/common/DiscardsACardOpponentTriggeredAbility.java b/Mage/src/mage/abilities/common/DiscardsACardOpponentTriggeredAbility.java index 53fee4b7f87..866245a65e4 100644 --- a/Mage/src/mage/abilities/common/DiscardsACardOpponentTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DiscardsACardOpponentTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/DrawCardControllerTriggeredAbility.java b/Mage/src/mage/abilities/common/DrawCardControllerTriggeredAbility.java index d9cb5fdf7fd..0fdc859092f 100644 --- a/Mage/src/mage/abilities/common/DrawCardControllerTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DrawCardControllerTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/DrawCardOpponentTriggeredAbility.java b/Mage/src/mage/abilities/common/DrawCardOpponentTriggeredAbility.java index dd8ab14b3a6..424fc37aea3 100644 --- a/Mage/src/mage/abilities/common/DrawCardOpponentTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DrawCardOpponentTriggeredAbility.java @@ -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())); diff --git a/Mage/src/mage/abilities/common/EntersAnotherCreatureYourControlTriggeredAbility.java b/Mage/src/mage/abilities/common/EntersAnotherCreatureYourControlTriggeredAbility.java index 26dbdfdfdb0..a1ffb51f7c2 100644 --- a/Mage/src/mage/abilities/common/EntersAnotherCreatureYourControlTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/EntersAnotherCreatureYourControlTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/EntersBattlefieldAllTriggeredAbility.java b/Mage/src/mage/abilities/common/EntersBattlefieldAllTriggeredAbility.java index 35fd64ff9a7..ae84e34288f 100644 --- a/Mage/src/mage/abilities/common/EntersBattlefieldAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/EntersBattlefieldAllTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/EntersBattlefieldOrDiesSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/EntersBattlefieldOrDiesSourceTriggeredAbility.java index 1456e97750e..6d59175b209 100644 --- a/Mage/src/mage/abilities/common/EntersBattlefieldOrDiesSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/EntersBattlefieldOrDiesSourceTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/EntersBattlefieldTriggeredAbility.java b/Mage/src/mage/abilities/common/EntersBattlefieldTriggeredAbility.java index 9f63db704ab..f34efeadc23 100644 --- a/Mage/src/mage/abilities/common/EntersBattlefieldTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/EntersBattlefieldTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/EntersOrLeavesTheBattlefieldSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/EntersOrLeavesTheBattlefieldSourceTriggeredAbility.java index 8635bf9bc07..fab8424f9cd 100644 --- a/Mage/src/mage/abilities/common/EntersOrLeavesTheBattlefieldSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/EntersOrLeavesTheBattlefieldSourceTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/GainLifeControllerTriggeredAbility.java b/Mage/src/mage/abilities/common/GainLifeControllerTriggeredAbility.java index 47c59a51dcd..c5d94212cec 100644 --- a/Mage/src/mage/abilities/common/GainLifeControllerTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/GainLifeControllerTriggeredAbility.java @@ -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())); diff --git a/Mage/src/mage/abilities/common/LandfallAbility.java b/Mage/src/mage/abilities/common/LandfallAbility.java index 495f79cedb4..974593e5461 100644 --- a/Mage/src/mage/abilities/common/LandfallAbility.java +++ b/Mage/src/mage/abilities/common/LandfallAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/LeavesBattlefieldTriggeredAbility.java b/Mage/src/mage/abilities/common/LeavesBattlefieldTriggeredAbility.java index 6bc8fdad611..48ba332c550 100644 --- a/Mage/src/mage/abilities/common/LeavesBattlefieldTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/LeavesBattlefieldTriggeredAbility.java @@ -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; + /** * diff --git a/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java b/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java index f4386a244e6..b1130c36a49 100644 --- a/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/OnEventTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/OpponentSacrificesNonTokenPermanentTriggeredAbility.java b/Mage/src/mage/abilities/common/OpponentSacrificesNonTokenPermanentTriggeredAbility.java index d5ff69d667e..71d69724422 100644 --- a/Mage/src/mage/abilities/common/OpponentSacrificesNonTokenPermanentTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/OpponentSacrificesNonTokenPermanentTriggeredAbility.java @@ -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()) { diff --git a/Mage/src/mage/abilities/common/OpponentSacrificesPermanentTriggeredAbility.java b/Mage/src/mage/abilities/common/OpponentSacrificesPermanentTriggeredAbility.java index 4c449efd3b1..373f26cd0b1 100644 --- a/Mage/src/mage/abilities/common/OpponentSacrificesPermanentTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/OpponentSacrificesPermanentTriggeredAbility.java @@ -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()) { diff --git a/Mage/src/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java b/Mage/src/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java index e0be9b75336..77fef28b1d6 100644 --- a/Mage/src/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/PutCardIntoGraveFromAnywhereAllTriggeredAbility.java @@ -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) { diff --git a/Mage/src/mage/abilities/common/PutIntoGraveFromBattlefieldAllTriggeredAbility.java b/Mage/src/mage/abilities/common/PutIntoGraveFromBattlefieldAllTriggeredAbility.java index b1a7833434a..3608077cecd 100644 --- a/Mage/src/mage/abilities/common/PutIntoGraveFromBattlefieldAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/PutIntoGraveFromBattlefieldAllTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/PutIntoGraveFromBattlefieldSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/PutIntoGraveFromBattlefieldSourceTriggeredAbility.java index 5e6533efc4a..8dc9ecc57d3 100644 --- a/Mage/src/mage/abilities/common/PutIntoGraveFromBattlefieldSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/PutIntoGraveFromBattlefieldSourceTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/SacrificeSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/SacrificeSourceTriggeredAbility.java index 02ff55bdc98..f51d7902e08 100644 --- a/Mage/src/mage/abilities/common/SacrificeSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/SacrificeSourceTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/SimpleTriggeredAbility.java b/Mage/src/mage/abilities/common/SimpleTriggeredAbility.java index 45783d638d6..aaf991993f8 100644 --- a/Mage/src/mage/abilities/common/SimpleTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/SimpleTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/SpellCastAllTriggeredAbility.java b/Mage/src/mage/abilities/common/SpellCastAllTriggeredAbility.java index 0140146b372..bb0e485e4da 100644 --- a/Mage/src/mage/abilities/common/SpellCastAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/SpellCastAllTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/SpellCastControllerTriggeredAbility.java b/Mage/src/mage/abilities/common/SpellCastControllerTriggeredAbility.java index 703e703f61d..8dd05c58a48 100644 --- a/Mage/src/mage/abilities/common/SpellCastControllerTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/SpellCastControllerTriggeredAbility.java @@ -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) { diff --git a/Mage/src/mage/abilities/common/SpellCastOpponentTriggeredAbility.java b/Mage/src/mage/abilities/common/SpellCastOpponentTriggeredAbility.java index 1e4b8fdd73a..61dcda10453 100644 --- a/Mage/src/mage/abilities/common/SpellCastOpponentTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/SpellCastOpponentTriggeredAbility.java @@ -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)) { diff --git a/Mage/src/mage/abilities/common/TapForManaAllTriggeredAbility.java b/Mage/src/mage/abilities/common/TapForManaAllTriggeredAbility.java index 57b00709af5..e3fe6b53b60 100644 --- a/Mage/src/mage/abilities/common/TapForManaAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/TapForManaAllTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/TapForManaAllTriggeredManaAbility.java b/Mage/src/mage/abilities/common/TapForManaAllTriggeredManaAbility.java index 28ebe2e2280..3ca51b65bbc 100644 --- a/Mage/src/mage/abilities/common/TapForManaAllTriggeredManaAbility.java +++ b/Mage/src/mage/abilities/common/TapForManaAllTriggeredManaAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/TapLandForManaAllTriggeredAbility.java b/Mage/src/mage/abilities/common/TapLandForManaAllTriggeredAbility.java index 1c0bf162b26..de58312226b 100644 --- a/Mage/src/mage/abilities/common/TapLandForManaAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/TapLandForManaAllTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/TapLandForManaAllTriggeredManaAbility.java b/Mage/src/mage/abilities/common/TapLandForManaAllTriggeredManaAbility.java index 3d2eb314e3a..08a6403a0ec 100644 --- a/Mage/src/mage/abilities/common/TapLandForManaAllTriggeredManaAbility.java +++ b/Mage/src/mage/abilities/common/TapLandForManaAllTriggeredManaAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/TurnedFaceUpAllTriggeredAbility.java b/Mage/src/mage/abilities/common/TurnedFaceUpAllTriggeredAbility.java index a32e0d3ae29..164f09ba60e 100644 --- a/Mage/src/mage/abilities/common/TurnedFaceUpAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/TurnedFaceUpAllTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/TurnedFaceUpSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/TurnedFaceUpSourceTriggeredAbility.java index 25ffceefdb7..ea06af1a744 100644 --- a/Mage/src/mage/abilities/common/TurnedFaceUpSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/TurnedFaceUpSourceTriggeredAbility.java @@ -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())); diff --git a/Mage/src/mage/abilities/common/UnattachedTriggeredAbility.java b/Mage/src/mage/abilities/common/UnattachedTriggeredAbility.java index bc5518bed88..c28fa739b96 100644 --- a/Mage/src/mage/abilities/common/UnattachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/UnattachedTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/ZoneChangeAllTriggeredAbility.java b/Mage/src/mage/abilities/common/ZoneChangeAllTriggeredAbility.java index 66172181925..8d626f48832 100644 --- a/Mage/src/mage/abilities/common/ZoneChangeAllTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/ZoneChangeAllTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/ZoneChangeTriggeredAbility.java b/Mage/src/mage/abilities/common/ZoneChangeTriggeredAbility.java index 9922255cfde..10291cba089 100644 --- a/Mage/src/mage/abilities/common/ZoneChangeTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/ZoneChangeTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/common/delayed/AtTheBeginOMainPhaseDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheBeginOMainPhaseDelayedTriggeredAbility.java index 94990a0d1d6..4017e25c576 100644 --- a/Mage/src/mage/abilities/common/delayed/AtTheBeginOMainPhaseDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/AtTheBeginOMainPhaseDelayedTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfCombatDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfCombatDelayedTriggeredAbility.java index a2334ec1f3a..7811b98086b 100644 --- a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfCombatDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfCombatDelayedTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextCleanupDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextCleanupDelayedTriggeredAbility.java index 886562915ae..70218950ec6 100644 --- a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextCleanupDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextCleanupDelayedTriggeredAbility.java @@ -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(); diff --git a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextEndStepDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextEndStepDelayedTriggeredAbility.java index 9fee24b35a7..08091235689 100644 --- a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextEndStepDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextEndStepDelayedTriggeredAbility.java @@ -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; } diff --git a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextUpkeepDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextUpkeepDelayedTriggeredAbility.java index f42ba6996df..7326a651884 100644 --- a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextUpkeepDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfNextUpkeepDelayedTriggeredAbility.java @@ -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() { diff --git a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility.java index 1d34c3df80f..5ac9e70c058 100644 --- a/Mage/src/mage/abilities/common/delayed/AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility.java @@ -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); } } diff --git a/Mage/src/mage/abilities/common/delayed/AtTheEndOfCombatDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheEndOfCombatDelayedTriggeredAbility.java index a44aa7d73cf..33eef81a188 100644 --- a/Mage/src/mage/abilities/common/delayed/AtTheEndOfCombatDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/AtTheEndOfCombatDelayedTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/delayed/AtTheEndOfTurnStepPostDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheEndOfTurnStepPostDelayedTriggeredAbility.java index a42fcd475d7..d98ca8965a2 100644 --- a/Mage/src/mage/abilities/common/delayed/AtTheEndOfTurnStepPostDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/AtTheEndOfTurnStepPostDelayedTriggeredAbility.java @@ -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 diff --git a/Mage/src/mage/abilities/common/delayed/OnLeaveReturnExiledToBattlefieldAbility.java b/Mage/src/mage/abilities/common/delayed/OnLeaveReturnExiledToBattlefieldAbility.java index 8040de94858..4ac1efce30b 100644 --- a/Mage/src/mage/abilities/common/delayed/OnLeaveReturnExiledToBattlefieldAbility.java +++ b/Mage/src/mage/abilities/common/delayed/OnLeaveReturnExiledToBattlefieldAbility.java @@ -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 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 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; } } diff --git a/Mage/src/mage/abilities/common/delayed/PactDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/PactDelayedTriggeredAbility.java index e2dfba9beb7..e6564c2cc00 100644 --- a/Mage/src/mage/abilities/common/delayed/PactDelayedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/delayed/PactDelayedTriggeredAbility.java @@ -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(); diff --git a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java index b7816fb78ac..28ba0af2cd9 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java +++ b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java @@ -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()); diff --git a/Mage/src/mage/abilities/effects/common/CastSourceTriggeredAbility.java b/Mage/src/mage/abilities/effects/common/CastSourceTriggeredAbility.java index 3a951bb9ef7..874de4dd0d3 100644 --- a/Mage/src/mage/abilities/effects/common/CastSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/effects/common/CastSourceTriggeredAbility.java @@ -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()); diff --git a/Mage/src/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java b/Mage/src/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java index d22210f53d3..c896fb6652a 100644 --- a/Mage/src/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java +++ b/Mage/src/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java @@ -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()) { diff --git a/Mage/src/mage/abilities/effects/common/DealsDamageToOpponentTriggeredAbility.java b/Mage/src/mage/abilities/effects/common/DealsDamageToOpponentTriggeredAbility.java index b168eee9268..aa25f2b6e83 100644 --- a/Mage/src/mage/abilities/effects/common/DealsDamageToOpponentTriggeredAbility.java +++ b/Mage/src/mage/abilities/effects/common/DealsDamageToOpponentTriggeredAbility.java @@ -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; diff --git a/Mage/src/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java b/Mage/src/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java index ac3d0c472de..94c38d3ecae 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java @@ -76,10 +76,11 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect Card card = game.getCard(targetId); if (card != null) { if (player.putOntoBattlefieldWithInfo(card, game, Zone.GRAVEYARD, source.getSourceId(), tapped)) { - Permanent permanent = game.getPermanent(targetId); - if (permanent != null) { - permanent.changeControllerId(source.getControllerId(), game); - } + // why is this neccessary - it contradicts Gather Specimens in play +// Permanent permanent = game.getPermanent(targetId); +// if (permanent != null) { +// permanent.changeControllerId(source.getControllerId(), game); +// } } } } diff --git a/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java b/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java index c986cebb39c..548d64cd76c 100644 --- a/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java +++ b/Mage/src/mage/abilities/keyword/AnnihilatorAbility.java @@ -68,9 +68,14 @@ public class AnnihilatorAbility extends TriggeredAbilityImpl { this.count = ability.count; } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.ATTACKER_DECLARED; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.ATTACKER_DECLARED && event.getSourceId().equals(this.getSourceId())) { + if (event.getSourceId().equals(this.getSourceId())) { UUID defendingPlayerId = game.getCombat().getDefendingPlayerId(sourceId, game); if (defendingPlayerId != null) { // the id has to be set here because the source can be leave battlefield diff --git a/Mage/src/mage/abilities/keyword/BattalionAbility.java b/Mage/src/mage/abilities/keyword/BattalionAbility.java index 093239e5242..9b4d119b904 100644 --- a/Mage/src/mage/abilities/keyword/BattalionAbility.java +++ b/Mage/src/mage/abilities/keyword/BattalionAbility.java @@ -60,14 +60,14 @@ public class BattalionAbility extends TriggeredAbilityImpl { return new BattalionAbility(this); } + @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() == GameEvent.EventType.DECLARED_ATTACKERS) { - if (game.getCombat().getAttackers().size() >= 3 && game.getCombat().getAttackers().contains(this.sourceId)) { - return true; - } - } - return false; + return game.getCombat().getAttackers().size() >= 3 && game.getCombat().getAttackers().contains(this.sourceId); } @Override diff --git a/Mage/src/mage/abilities/keyword/CascadeAbility.java b/Mage/src/mage/abilities/keyword/CascadeAbility.java index 347520824fc..77840b138e9 100644 --- a/Mage/src/mage/abilities/keyword/CascadeAbility.java +++ b/Mage/src/mage/abilities/keyword/CascadeAbility.java @@ -67,13 +67,16 @@ public class CascadeAbility extends TriggeredAbilityImpl { this.withReminder = ability.withReminder; } + @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() == EventType.SPELL_CAST) { - Spell spell = game.getStack().getSpell(event.getTargetId()); - if (spell != null && spell.getSourceId().equals(this.getSourceId())) { - return true; - } + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null && spell.getSourceId().equals(this.getSourceId())) { + return true; } return false; } diff --git a/Mage/src/mage/abilities/keyword/ConspireAbility.java b/Mage/src/mage/abilities/keyword/ConspireAbility.java index 379e1700d4f..82c3bd9cab9 100644 --- a/Mage/src/mage/abilities/keyword/ConspireAbility.java +++ b/Mage/src/mage/abilities/keyword/ConspireAbility.java @@ -181,10 +181,14 @@ class ConspireTriggeredAbility extends TriggeredAbilityImpl { return new ConspireTriggeredAbility(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() == GameEvent.EventType.SPELL_CAST - && event.getSourceId().equals(this.sourceId)) { + if (event.getSourceId().equals(this.sourceId)) { StackObject spell = game.getStack().getStackObject(this.sourceId); if (spell instanceof Spell) { Card card = game.getCard(spell.getSourceId()); diff --git a/Mage/src/mage/abilities/keyword/DethroneAbility.java b/Mage/src/mage/abilities/keyword/DethroneAbility.java index 9d441e2a8eb..340564d4075 100644 --- a/Mage/src/mage/abilities/keyword/DethroneAbility.java +++ b/Mage/src/mage/abilities/keyword/DethroneAbility.java @@ -63,25 +63,28 @@ public class DethroneAbility extends TriggeredAbilityImpl { return new DethroneAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - if (GameEvent.EventType.DECLARED_ATTACKERS.equals(event.getType())) { - UUID defenderId = game.getCombat().getDefenderId(getSourceId()); - if (defenderId != null) { - Player attackedPlayer = game.getPlayer(defenderId); - Player controller = game.getPlayer(getControllerId()); - if (attackedPlayer != null && controller != null) { - int mostLife = Integer.MIN_VALUE; - for (UUID playerId: controller.getInRange()) { - Player player = game.getPlayer(playerId); - if (player != null) { - if (player.getLife() > mostLife) { - mostLife = player.getLife(); - } + UUID defenderId = game.getCombat().getDefenderId(getSourceId()); + if (defenderId != null) { + Player attackedPlayer = game.getPlayer(defenderId); + Player controller = game.getPlayer(getControllerId()); + if (attackedPlayer != null && controller != null) { + int mostLife = Integer.MIN_VALUE; + for (UUID playerId: controller.getInRange()) { + Player player = game.getPlayer(playerId); + if (player != null) { + if (player.getLife() > mostLife) { + mostLife = player.getLife(); } } - return attackedPlayer.getLife() == mostLife; } + return attackedPlayer.getLife() == mostLife; } } return false; diff --git a/Mage/src/mage/abilities/keyword/EchoAbility.java b/Mage/src/mage/abilities/keyword/EchoAbility.java index 0fab89f4901..7aef7242fe4 100644 --- a/Mage/src/mage/abilities/keyword/EchoAbility.java +++ b/Mage/src/mage/abilities/keyword/EchoAbility.java @@ -84,6 +84,11 @@ public class EchoAbility extends TriggeredAbilityImpl { return new EchoAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD || event.getType() == GameEvent.EventType.UPKEEP_STEP_PRE; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { // reset the echo paid state back, if creature enteres the battlefield @@ -99,13 +104,12 @@ public class EchoAbility extends TriggeredAbilityImpl { } // remember the last controller lastController = this.getControllerId(); - } - // if echo not paid yet, controller has to pay - if (event.getType().equals(GameEvent.EventType.UPKEEP_STEP_PRE) && - event.getPlayerId().equals(this.controllerId) && - lastController.equals(this.controllerId) && !this.echoPaid){ - this.echoPaid = true; - return true; + // if echo not paid yet, controller has to pay + if (event.getPlayerId().equals(this.controllerId) && + lastController.equals(this.controllerId) && !this.echoPaid){ + this.echoPaid = true; + return true; + } } return false; } diff --git a/Mage/src/mage/abilities/keyword/EvolveAbility.java b/Mage/src/mage/abilities/keyword/EvolveAbility.java index cc9d2f58ff0..16c1b316e01 100644 --- a/Mage/src/mage/abilities/keyword/EvolveAbility.java +++ b/Mage/src/mage/abilities/keyword/EvolveAbility.java @@ -94,23 +94,25 @@ public class EvolveAbility 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() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { - if (!event.getTargetId().equals(this.getSourceId())) { - Permanent triggeringCreature = game.getPermanent(event.getTargetId()); - if (triggeringCreature != null - && triggeringCreature.getCardType().contains(CardType.CREATURE) - && triggeringCreature.getControllerId().equals(this.controllerId)) { - Permanent sourceCreature = game.getPermanent(sourceId); - if (sourceCreature != null && isPowerOrThoughnessGreater(sourceCreature, triggeringCreature)) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId())); - return true; - } + if (!event.getTargetId().equals(this.getSourceId())) { + Permanent triggeringCreature = game.getPermanent(event.getTargetId()); + if (triggeringCreature != null + && triggeringCreature.getCardType().contains(CardType.CREATURE) + && triggeringCreature.getControllerId().equals(this.controllerId)) { + Permanent sourceCreature = game.getPermanent(sourceId); + if (sourceCreature != null && isPowerOrThoughnessGreater(sourceCreature, triggeringCreature)) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId())); + return true; } } } - return false; } diff --git a/Mage/src/mage/abilities/keyword/ExaltedAbility.java b/Mage/src/mage/abilities/keyword/ExaltedAbility.java index 5ab82db8dc8..3af9fc3a9f7 100644 --- a/Mage/src/mage/abilities/keyword/ExaltedAbility.java +++ b/Mage/src/mage/abilities/keyword/ExaltedAbility.java @@ -56,9 +56,14 @@ public class ExaltedAbility extends TriggeredAbilityImpl { return new ExaltedAbility(this); } + @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.getActivePlayerId().equals(this.controllerId) ) { + if (game.getActivePlayerId().equals(this.controllerId) ) { if (game.getCombat().attacksAlone()) { this.getEffects().get(0).setTargetPointer(new FixedTarget(game.getCombat().getAttackers().get(0))); return true; diff --git a/Mage/src/mage/abilities/keyword/ExtortAbility.java b/Mage/src/mage/abilities/keyword/ExtortAbility.java index 64ba0ae9b72..e39956047ed 100644 --- a/Mage/src/mage/abilities/keyword/ExtortAbility.java +++ b/Mage/src/mage/abilities/keyword/ExtortAbility.java @@ -65,12 +65,14 @@ public class ExtortAbility extends TriggeredAbilityImpl { super(ability); } + @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())) { - return true; - } - return false; + return event.getPlayerId().equals(this.getControllerId()); } @Override diff --git a/Mage/src/mage/abilities/keyword/FlankingAbility.java b/Mage/src/mage/abilities/keyword/FlankingAbility.java index 14bcdc54ae5..1b4c102823c 100644 --- a/Mage/src/mage/abilities/keyword/FlankingAbility.java +++ b/Mage/src/mage/abilities/keyword/FlankingAbility.java @@ -29,9 +29,14 @@ public class FlankingAbility extends TriggeredAbilityImpl { 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())) { Permanent permanent = game.getPermanent(event.getSourceId()); if(permanent != null) { diff --git a/Mage/src/mage/abilities/keyword/FlashbackAbility.java b/Mage/src/mage/abilities/keyword/FlashbackAbility.java index 8ba533ce864..66eb5866f57 100644 --- a/Mage/src/mage/abilities/keyword/FlashbackAbility.java +++ b/Mage/src/mage/abilities/keyword/FlashbackAbility.java @@ -234,9 +234,14 @@ class FlashbackTriggeredAbility extends DelayedTriggeredAbility { return new FlashbackTriggeredAbility(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.sourceId)) { + if (event.getTargetId().equals(this.sourceId)) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getFromZone() == Zone.STACK) { return true; diff --git a/Mage/src/mage/abilities/keyword/GraftAbility.java b/Mage/src/mage/abilities/keyword/GraftAbility.java index 4d08be3e72d..496ed814f32 100644 --- a/Mage/src/mage/abilities/keyword/GraftAbility.java +++ b/Mage/src/mage/abilities/keyword/GraftAbility.java @@ -82,21 +82,24 @@ public class GraftAbility extends TriggeredAbilityImpl { this.cardtype = ability.cardtype; } + @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) { - Permanent sourcePermanent = game.getPermanent(this.getSourceId()); - Permanent permanent = game.getPermanent(event.getTargetId()); - if (sourcePermanent != null - && permanent != null - && !sourcePermanent.getId().equals(permanent.getId()) - && sourcePermanent.getCounters().containsKey(CounterType.P1P1) - && filter.match(permanent, game)) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId())); - } - return true; + Permanent sourcePermanent = game.getPermanent(this.getSourceId()); + Permanent permanent = game.getPermanent(event.getTargetId()); + if (sourcePermanent != null + && permanent != null + && !sourcePermanent.getId().equals(permanent.getId()) + && sourcePermanent.getCounters().containsKey(CounterType.P1P1) + && filter.match(permanent, game)) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getTargetId())); } + return true; } return false; } diff --git a/Mage/src/mage/abilities/keyword/HeroicAbility.java b/Mage/src/mage/abilities/keyword/HeroicAbility.java index a1b0a3ea30c..e7501685363 100644 --- a/Mage/src/mage/abilities/keyword/HeroicAbility.java +++ b/Mage/src/mage/abilities/keyword/HeroicAbility.java @@ -64,9 +64,14 @@ public class HeroicAbility extends TriggeredAbilityImpl { return new HeroicAbility(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() == GameEvent.EventType.SPELL_CAST && event.getPlayerId().equals(this.getControllerId())) { + if (event.getPlayerId().equals(this.getControllerId())) { Spell spell = game.getStack().getSpell(event.getTargetId()); if (checkSpell(spell, game)) { return true; diff --git a/Mage/src/mage/abilities/keyword/InspiredAbility.java b/Mage/src/mage/abilities/keyword/InspiredAbility.java index d9a8fa8f9d7..201965096fc 100644 --- a/Mage/src/mage/abilities/keyword/InspiredAbility.java +++ b/Mage/src/mage/abilities/keyword/InspiredAbility.java @@ -33,6 +33,7 @@ import mage.abilities.effects.Effect; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; /** * Inspired ability word @@ -60,12 +61,14 @@ public class InspiredAbility extends TriggeredAbilityImpl { return new InspiredAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.UNTAPPED; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType().equals(GameEvent.EventType.UNTAPPED) && event.getTargetId().equals(this.getSourceId())) { - return true; - } - return false; + return event.getTargetId().equals(this.getSourceId()); } @Override diff --git a/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java b/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java index 19abe1db5a7..f97bb511293 100644 --- a/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java +++ b/Mage/src/mage/abilities/keyword/LivingWeaponAbility.java @@ -1,7 +1,6 @@ package mage.abilities.keyword; import mage.MageInt; -import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.effects.OneShotEffect; diff --git a/Mage/src/mage/abilities/keyword/MadnessAbility.java b/Mage/src/mage/abilities/keyword/MadnessAbility.java index af3f2f286c2..2ecdb0bf3c1 100644 --- a/Mage/src/mage/abilities/keyword/MadnessAbility.java +++ b/Mage/src/mage/abilities/keyword/MadnessAbility.java @@ -132,9 +132,14 @@ class MadnessTriggeredAbility extends TriggeredAbilityImpl { return new MadnessTriggeredAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.MADNESS_CARD_EXILED; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.MADNESS_CARD_EXILED && event.getTargetId().equals(getSourceId()); + return event.getTargetId().equals(getSourceId()); } @Override diff --git a/Mage/src/mage/abilities/keyword/MiracleAbility.java b/Mage/src/mage/abilities/keyword/MiracleAbility.java index 66bad7c3932..fc29afada4d 100644 --- a/Mage/src/mage/abilities/keyword/MiracleAbility.java +++ b/Mage/src/mage/abilities/keyword/MiracleAbility.java @@ -113,9 +113,14 @@ public class MiracleAbility extends TriggeredAbilityImpl { return new MiracleAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.MIRACLE_CARD_REVEALED; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType().equals(EventType.MIRACLE_CARD_REVEALED) && event.getSourceId().equals(getSourceId())) { + if (event.getSourceId().equals(getSourceId())) { // Refer to the card at the zone it is now (hand) FixedTarget fixedTarget = new FixedTarget(event.getSourceId()); fixedTarget.init(game, this); diff --git a/Mage/src/mage/abilities/keyword/PersistAbility.java b/Mage/src/mage/abilities/keyword/PersistAbility.java index 8cd4af7c304..172808456a6 100644 --- a/Mage/src/mage/abilities/keyword/PersistAbility.java +++ b/Mage/src/mage/abilities/keyword/PersistAbility.java @@ -60,6 +60,11 @@ public class PersistAbility extends DiesTriggeredAbility { return new PersistAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return super.checkEventType(event, game); + } + @Override public boolean checkTrigger(GameEvent event, Game game) { if (super.checkTrigger(event, game)) { diff --git a/Mage/src/mage/abilities/keyword/ReboundAbility.java b/Mage/src/mage/abilities/keyword/ReboundAbility.java index a9f5441cd85..6edb0518186 100644 --- a/Mage/src/mage/abilities/keyword/ReboundAbility.java +++ b/Mage/src/mage/abilities/keyword/ReboundAbility.java @@ -268,9 +268,14 @@ class ReboundEffectCastFromExileDelayedTrigger extends DelayedTriggeredAbility { return new ReboundEffectCastFromExileDelayedTrigger(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() == EventType.UPKEEP_STEP_PRE && MyTurnCondition.getInstance().apply(game, this); + return MyTurnCondition.getInstance().apply(game, this); } @Override public String getRule() { diff --git a/Mage/src/mage/abilities/keyword/ReplicateAbility.java b/Mage/src/mage/abilities/keyword/ReplicateAbility.java index 951ea043f1c..34260cbdf03 100644 --- a/Mage/src/mage/abilities/keyword/ReplicateAbility.java +++ b/Mage/src/mage/abilities/keyword/ReplicateAbility.java @@ -184,9 +184,14 @@ class ReplicateTriggeredAbility extends TriggeredAbilityImpl { return new ReplicateTriggeredAbility(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() == GameEvent.EventType.SPELL_CAST && event.getSourceId().equals(this.sourceId)) { + if (event.getSourceId().equals(this.sourceId)) { StackObject spell = game.getStack().getStackObject(this.sourceId); if (spell instanceof Spell) { Card card = game.getCard(spell.getSourceId()); diff --git a/Mage/src/mage/abilities/keyword/StormAbility.java b/Mage/src/mage/abilities/keyword/StormAbility.java index 6715c3e45b2..05d1d8a8eab 100644 --- a/Mage/src/mage/abilities/keyword/StormAbility.java +++ b/Mage/src/mage/abilities/keyword/StormAbility.java @@ -36,6 +36,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; import mage.game.stack.Spell; import mage.game.stack.StackObject; import mage.watchers.common.CastSpellLastTurnWatcher; @@ -60,9 +61,14 @@ public class StormAbility extends TriggeredAbilityImpl { return new StormAbility(this); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.SPELL_CAST; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getSourceId().equals(this.sourceId)) { + if (event.getSourceId().equals(this.sourceId)) { StackObject spell = game.getStack().getStackObject(this.sourceId); if (spell instanceof Spell) { for (Effect effect : this.getEffects()) { diff --git a/Mage/src/mage/abilities/keyword/SuspendAbility.java b/Mage/src/mage/abilities/keyword/SuspendAbility.java index 4f1e82e9a7b..bf6a2a9dbb0 100644 --- a/Mage/src/mage/abilities/keyword/SuspendAbility.java +++ b/Mage/src/mage/abilities/keyword/SuspendAbility.java @@ -280,9 +280,14 @@ class SuspendPlayCardAbility extends TriggeredAbilityImpl { super(ability); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.COUNTER_REMOVED; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.COUNTER_REMOVED && event.getTargetId().equals(getSourceId())) { + if (event.getTargetId().equals(getSourceId())) { Card card = game.getCard(getSourceId()); if (card != null && game.getState().getZone(card.getId()) == Zone.EXILED && card.getCounters().getCount(CounterType.TIME) == 0) { diff --git a/Mage/src/mage/abilities/keyword/UnearthAbility.java b/Mage/src/mage/abilities/keyword/UnearthAbility.java index fd3c50873c3..fecf98da5d2 100644 --- a/Mage/src/mage/abilities/keyword/UnearthAbility.java +++ b/Mage/src/mage/abilities/keyword/UnearthAbility.java @@ -104,12 +104,14 @@ class UnearthDelayedTriggeredAbility extends DelayedTriggeredAbility { return new UnearthDelayedTriggeredAbility(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() == EventType.END_TURN_STEP_PRE && event.getPlayerId().equals(this.controllerId)) { - return true; - } - return false; + return event.getPlayerId().equals(this.controllerId); } @Override diff --git a/Mage/src/mage/abilities/keyword/VanishingSacrificeAbility.java b/Mage/src/mage/abilities/keyword/VanishingSacrificeAbility.java index 5f9386ced91..b6f2dc6a103 100644 --- a/Mage/src/mage/abilities/keyword/VanishingSacrificeAbility.java +++ b/Mage/src/mage/abilities/keyword/VanishingSacrificeAbility.java @@ -18,9 +18,14 @@ public class VanishingSacrificeAbility extends TriggeredAbilityImpl { super(ability); } + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.COUNTER_REMOVED; + } + @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.COUNTER_REMOVED && event.getData().equals("time") && event.getTargetId().equals(this.getSourceId())) { + if (event.getData().equals("time") && event.getTargetId().equals(this.getSourceId())) { Permanent p = game.getPermanent(this.getSourceId()); if (p != null) { return p.getCounters().getCount(CounterType.TIME) == 0; diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index a157a59e86b..77d50a35007 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -63,6 +63,7 @@ import mage.game.Game; import mage.game.command.Commander; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; import mage.game.stack.Spell; import mage.game.stack.StackObject; @@ -664,12 +665,15 @@ public abstract class CardImpl extends MageObjectImpl implements Card { @Override public int getZoneChangeCounter() { +// logger.info(name + " get= " + zoneChangeCounter + " " + ((this instanceof Permanent) ? " Permanent":"Card")); return zoneChangeCounter; + } @Override public void updateZoneChangeCounter() { zoneChangeCounter++; +// logger.info(name + " set= " + zoneChangeCounter + " " + ((this instanceof Permanent) ? " Permanent":"Card")); } @Override diff --git a/Mage/src/mage/game/permanent/token/Token.java b/Mage/src/mage/game/permanent/token/Token.java index 4f7e0f85c94..11c6694c73a 100644 --- a/Mage/src/mage/game/permanent/token/Token.java +++ b/Mage/src/mage/game/permanent/token/Token.java @@ -134,6 +134,7 @@ public class Token extends MageObjectImpl { return false; } lastAddedTokenIds.clear(); + // TODO: Check this setCode handling because it makes no sens if token put into play with e.g. "Feldon of the third Path" Card source = game.getCard(sourceId); String setCode; if (this.getOriginalExpansionSetCode() != null && !this.getOriginalExpansionSetCode().isEmpty()) { diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 857bf9a8be4..78103f71a5a 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -1114,7 +1114,7 @@ public abstract class PlayerImpl implements Player, Serializable { //20091005 - 603.3c, 603.3d int bookmark = game.bookmarkState(); TriggeredAbility ability = source.copy(); - MageObject sourceObject = game.getObject(ability.getSourceId()); + MageObject sourceObject = ability.getSourceObject(game); if (sourceObject != null) { sourceObject.adjustTargets(ability, game); } diff --git a/Mage/src/mage/util/CardUtil.java b/Mage/src/mage/util/CardUtil.java index 7ceb6e9bacd..39261435927 100644 --- a/Mage/src/mage/util/CardUtil.java +++ b/Mage/src/mage/util/CardUtil.java @@ -52,6 +52,7 @@ import mage.cards.SplitCard; import mage.constants.CardType; import mage.filter.FilterMana; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; import mage.game.stack.Spell; import mage.util.functions.CopyFunction; @@ -490,7 +491,9 @@ public class CardUtil { public static UUID getObjectExileZoneId(Game game, MageObject mageObject) { int zoneChangeCounter = 0; - if (mageObject instanceof Card) { + if (mageObject instanceof Permanent) { + zoneChangeCounter = ((Permanent) mageObject).getZoneChangeCounter(); + } else if (mageObject instanceof Card) { zoneChangeCounter = ((Card) mageObject).getZoneChangeCounter(); } return getExileZoneId(getObjectZoneString(SOURCE_EXILE_ZONE_TEXT,mageObject.getId(), game, zoneChangeCounter, false), game);