From b12b0e29b885d8a1ce1b1c06d707e882d909ec77 Mon Sep 17 00:00:00 2001 From: igoudt Date: Mon, 25 Sep 2017 21:20:24 +0200 Subject: [PATCH 01/15] change subtype.contains() to hasSubtype() --- .../src/mage/cards/a/AdaptiveAutomaton.java | 2 +- .../src/mage/cards/a/AdmiralBeckettBrass.java | 19 +++------ Mage.Sets/src/mage/cards/a/AjanisChosen.java | 5 ++- Mage.Sets/src/mage/cards/a/AnZerrinRuins.java | 12 ++---- .../src/mage/cards/a/ArcaneAdaptation.java | 29 ++++++------- .../src/mage/cards/a/ArmamentMaster.java | 7 ++-- .../src/mage/cards/a/AshesOfTheFallen.java | 2 +- .../src/mage/cards/a/AuramancersGuise.java | 7 ++-- Mage.Sets/src/mage/cards/b/BartelRuneaxe.java | 2 +- Mage.Sets/src/mage/cards/b/BlastfireBolt.java | 2 +- .../src/mage/cards/b/BriarbridgePatrol.java | 7 ++-- .../src/mage/cards/c/CopyEnchantment.java | 2 +- .../src/mage/cards/c/CrypticGateway.java | 4 +- .../src/mage/cards/c/CurseOfMisfortunes.java | 5 ++- Mage.Sets/src/mage/cards/c/CurseOfThirst.java | 2 +- Mage.Sets/src/mage/cards/d/DaringSleuth.java | 5 ++- .../src/mage/cards/d/DauntingDefender.java | 5 ++- .../src/mage/cards/d/DaybreakCoronet.java | 2 +- .../src/mage/cards/e/EmeriaShepherd.java | 7 ++-- .../src/mage/cards/e/EverflameEidolon.java | 11 ++--- .../src/mage/cards/f/FleetingMemories.java | 2 +- Mage.Sets/src/mage/cards/g/GoblinBrawler.java | 2 +- .../src/mage/cards/g/GoblinCharbelcher.java | 9 ++-- .../src/mage/cards/g/GolemSkinGauntlets.java | 2 +- Mage.Sets/src/mage/cards/g/GrafMole.java | 2 +- Mage.Sets/src/mage/cards/g/GuardianBeast.java | 2 +- .../src/mage/cards/g/GuulDrazOverseer.java | 5 ++- .../mage/cards/h/HavenOfTheSpiritDragon.java | 5 ++- Mage.Sets/src/mage/cards/j/Jokulmorder.java | 5 ++- Mage.Sets/src/mage/cards/k/KarnLiberated.java | 4 +- Mage.Sets/src/mage/cards/k/KorDuelist.java | 2 +- .../src/mage/cards/l/LifecraftAwakening.java | 13 +++--- Mage.Sets/src/mage/cards/l/Lightsaber.java | 11 ++--- .../src/mage/cards/l/LilianasDefeat.java | 5 ++- .../src/mage/cards/l/LostInTheWoods.java | 17 +++----- .../src/mage/cards/m/MarkOfEviction.java | 2 +- .../src/mage/cards/m/MurderousSpoils.java | 2 +- .../src/mage/cards/m/MyriadLandscape.java | 4 +- .../mage/cards/n/NecromancersMagemark.java | 2 +- Mage.Sets/src/mage/cards/n/Necromancy.java | 2 +- Mage.Sets/src/mage/cards/n/NewBlood.java | 18 ++++---- .../src/mage/cards/n/NyleasPresence.java | 2 +- Mage.Sets/src/mage/cards/o/OrzhovCharm.java | 2 +- .../src/mage/cards/p/PathOfAncestry.java | 7 ++-- .../src/mage/cards/p/PrecipiceOfMortis.java | 13 +++--- Mage.Sets/src/mage/cards/p/PrismaticOmen.java | 2 +- Mage.Sets/src/mage/cards/r/Realmwright.java | 2 +- .../src/mage/cards/r/RiptideShapeshifter.java | 2 +- .../src/mage/cards/s/SealockMonster.java | 5 ++- .../src/mage/cards/s/SilenceTheBelievers.java | 2 +- Mage.Sets/src/mage/cards/s/SirensRuse.java | 5 ++- Mage.Sets/src/mage/cards/s/SoulExchange.java | 42 +++++++++---------- .../src/mage/cards/s/StartYourEngines.java | 12 ++---- .../src/mage/cards/s/StormtideLeviathan.java | 2 +- Mage.Sets/src/mage/cards/s/StreetSweeper.java | 2 +- Mage.Sets/src/mage/cards/t/TetsuoUmezawa.java | 7 ++-- Mage.Sets/src/mage/cards/t/TheUrDragon.java | 19 ++++----- .../src/mage/cards/t/TirelessTracker.java | 2 +- Mage.Sets/src/mage/cards/t/TrainingDrone.java | 2 +- .../src/mage/cards/t/TreefolkMystic.java | 2 +- Mage.Sets/src/mage/cards/t/TurnToSlag.java | 2 +- .../src/mage/cards/u/UlvenwaldMysteries.java | 2 +- .../mage/cards/v/VolrathsShapeshifter.java | 5 ++- Mage.Sets/src/mage/cards/w/WitchbaneOrb.java | 2 +- Mage.Sets/src/mage/cards/x/Xenograft.java | 2 +- Mage/src/main/java/mage/MageObject.java | 11 ++--- .../common/AuraAttachedTriggeredAbility.java | 2 +- .../EquippedMultipleSourceCondition.java | 4 +- .../common/EquippedSourceCondition.java | 2 +- .../common/AuraAttachedCount.java | 2 +- .../dynamicvalue/common/DomainValue.java | 14 +++---- .../common/EquipmentAttachedCount.java | 7 ++-- .../common/CreateTokenCopyTargetEffect.java | 11 ++--- .../continuous/AddCardSubtypeAllEffect.java | 2 +- .../AddCardSubtypeAttachedEffect.java | 2 +- .../continuous/BecomesAuraSourceEffect.java | 2 +- .../BecomesBasicLandEnchantedEffect.java | 10 ++--- .../BecomesBasicLandTargetEffect.java | 2 +- .../BecomesCreatureAttachedEffect.java | 2 +- ...chedWithActivatedAbilityOrSpellEffect.java | 2 +- .../BecomesCreatureIfVehicleEffect.java | 2 +- .../BecomesCreatureTargetEffect.java | 2 +- .../BecomesCreatureTypeTargetEffect.java | 2 +- .../continuous/BecomesSubtypeAllEffect.java | 2 +- .../abilities/keyword/AuraSwapAbility.java | 2 +- .../mage/abilities/keyword/BestowAbility.java | 2 +- .../mage/abilities/keyword/EmbalmAbility.java | 2 +- .../abilities/keyword/EternalizeAbility.java | 2 +- .../keyword/SpliceOntoArcaneAbility.java | 11 ++--- .../permanent/EquippedPredicate.java | 2 +- .../mage/game/permanent/PermanentImpl.java | 2 +- Mage/src/main/java/mage/game/stack/Spell.java | 11 ++--- Mage/src/main/java/mage/util/SubTypeList.java | 5 ++- .../util/functions/AddSubtypeApplier.java | 7 ++-- 94 files changed, 250 insertions(+), 277 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AdaptiveAutomaton.java b/Mage.Sets/src/mage/cards/a/AdaptiveAutomaton.java index b9d4da3de95..9212ae9e51d 100644 --- a/Mage.Sets/src/mage/cards/a/AdaptiveAutomaton.java +++ b/Mage.Sets/src/mage/cards/a/AdaptiveAutomaton.java @@ -100,7 +100,7 @@ class AdaptiveAutomatonAddSubtypeEffect extends ContinuousEffectImpl { Permanent permanent = game.getPermanent(source.getSourceId()); if (permanent != null) { SubType subtype = (SubType) game.getState().getValue(permanent.getId() + "_type"); - if (subtype != null && !permanent.getSubtype(game).contains(subtype)) { + if (subtype != null && !permanent.hasSubtype(subtype, game)) { permanent.getSubtype(game).add(subtype); } } diff --git a/Mage.Sets/src/mage/cards/a/AdmiralBeckettBrass.java b/Mage.Sets/src/mage/cards/a/AdmiralBeckettBrass.java index 6e97c7ab134..ad910cbd04a 100644 --- a/Mage.Sets/src/mage/cards/a/AdmiralBeckettBrass.java +++ b/Mage.Sets/src/mage/cards/a/AdmiralBeckettBrass.java @@ -27,11 +27,6 @@ */ package mage.cards.a; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; @@ -40,13 +35,7 @@ import mage.abilities.effects.common.continuous.BoostAllEffect; import mage.abilities.effects.common.continuous.GainControlTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SubType; -import mage.constants.SuperType; -import mage.constants.TargetController; -import mage.constants.WatcherScope; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.Predicate; @@ -59,6 +48,8 @@ import mage.game.permanent.Permanent; import mage.target.common.TargetNonlandPermanent; import mage.watchers.Watcher; +import java.util.*; + /** * * @author TheElk801 @@ -129,11 +120,11 @@ class DamagedByPiratesWatcher extends Watcher { if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER) { if (((DamagedPlayerEvent) event).isCombatDamage()) { Permanent creature = game.getPermanentOrLKIBattlefield(event.getSourceId()); - if (creature != null && creature.getSubtype(game).contains(SubType.PIRATE)) { + if (creature != null && creature.hasSubtype(SubType.PIRATE, game)) { if (damageSourceIds.keySet().contains(event.getTargetId())) { damageSourceIds.get(event.getTargetId()).add(creature.getId()); } else { - Set creatureSet = new HashSet(); + Set creatureSet = new HashSet<>(); creatureSet.add(creature.getId()); damageSourceIds.put(event.getTargetId(), creatureSet); } diff --git a/Mage.Sets/src/mage/cards/a/AjanisChosen.java b/Mage.Sets/src/mage/cards/a/AjanisChosen.java index 6fbd79e5c5d..56cdd436249 100644 --- a/Mage.Sets/src/mage/cards/a/AjanisChosen.java +++ b/Mage.Sets/src/mage/cards/a/AjanisChosen.java @@ -27,7 +27,6 @@ */ package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; @@ -42,6 +41,8 @@ import mage.game.permanent.token.CatToken; import mage.game.permanent.token.Token; import mage.players.Player; +import java.util.UUID; + /** * * @author Plopman @@ -95,7 +96,7 @@ class AjanisChosenEffect extends OneShotEffect { Token token = new CatToken(); if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) { Permanent enchantment = game.getPermanent(this.getTargetPointer().getFirst(game, source)); - if (enchantment != null && enchantment.getSubtype(game).contains(SubType.AURA)) { + if (enchantment != null && enchantment.hasSubtype(SubType.AURA, game)) { for (UUID tokenId : token.getLastAddedTokenIds()) { Permanent tokenPermanent = game.getPermanent(tokenId); if (tokenPermanent != null) { diff --git a/Mage.Sets/src/mage/cards/a/AnZerrinRuins.java b/Mage.Sets/src/mage/cards/a/AnZerrinRuins.java index b7a26eccdc4..d37541c5084 100644 --- a/Mage.Sets/src/mage/cards/a/AnZerrinRuins.java +++ b/Mage.Sets/src/mage/cards/a/AnZerrinRuins.java @@ -27,7 +27,6 @@ */ package mage.cards.a; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.common.AsEntersBattlefieldAbility; @@ -36,17 +35,14 @@ import mage.abilities.effects.common.ChooseCreatureTypeEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * * @author TheElk801 @@ -95,7 +91,7 @@ class AnZerrinRuinsDontUntapEffect extends DontUntapInControllersUntapStepAllEff Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && sourcePerm != null) { SubType subtype = (SubType) game.getState().getValue(sourcePerm.getId() + "_type"); - if (permanent.getSubtype(game).contains(subtype)) { + if (permanent.hasSubtype(subtype, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/a/ArcaneAdaptation.java b/Mage.Sets/src/mage/cards/a/ArcaneAdaptation.java index 30c2064f2f4..eb8174ae8df 100644 --- a/Mage.Sets/src/mage/cards/a/ArcaneAdaptation.java +++ b/Mage.Sets/src/mage/cards/a/ArcaneAdaptation.java @@ -27,9 +27,6 @@ */ package mage.cards.a; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; @@ -38,13 +35,7 @@ import mage.abilities.effects.common.ChooseCreatureTypeEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; -import mage.constants.SubType; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterControlledCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; @@ -52,6 +43,10 @@ import mage.game.stack.Spell; import mage.game.stack.StackObject; import mage.players.Player; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; + /** * * @author TheElk801 @@ -102,7 +97,7 @@ class ConspyEffect extends ContinuousEffectImpl { // in graveyard for (UUID cardId : controller.getGraveyard()) { Card card = game.getCard(cardId); - if (card.isCreature() && !card.getSubtype(game).contains(choice)) { + if (card.isCreature() && !card.hasSubtype(choice, game)) { for (SubType s : card.getSubtype(game)) { game.getState().getCreateCardAttribute(card).getSubtype().add(s); } @@ -112,7 +107,7 @@ class ConspyEffect extends ContinuousEffectImpl { // on Hand for (UUID cardId : controller.getHand()) { Card card = game.getCard(cardId); - if (card.isCreature() && !card.getSubtype(game).contains(choice)) { + if (card.isCreature() && !card.hasSubtype(choice, game)) { for (SubType s : card.getSubtype(game)) { game.getState().getCreateCardAttribute(card).getSubtype().add(s); } @@ -121,7 +116,7 @@ class ConspyEffect extends ContinuousEffectImpl { } // in Exile for (Card card : game.getState().getExile().getAllCards(game)) { - if (card.isCreature() && !card.getSubtype(game).contains(choice)) { + if (card.isCreature() && !card.hasSubtype(choice, game)) { for (SubType s : card.getSubtype(game)) { game.getState().getCreateCardAttribute(card).getSubtype().add(s); } @@ -130,7 +125,7 @@ class ConspyEffect extends ContinuousEffectImpl { } // in Library (e.g. for Mystical Teachings) for (Card card : controller.getLibrary().getCards(game)) { - if (card.getOwnerId().equals(controller.getId()) && card.isCreature() && !card.getSubtype(game).contains(choice)) { + if (card.getOwnerId().equals(controller.getId()) && card.isCreature() && !card.hasSubtype(choice, game)) { for (SubType s : card.getSubtype(game)) { game.getState().getCreateCardAttribute(card).getSubtype().add(s); } @@ -141,7 +136,7 @@ class ConspyEffect extends ContinuousEffectImpl { for (UUID commanderId : controller.getCommandersIds()) { if (game.getState().getZone(commanderId) == Zone.COMMAND) { Card card = game.getCard(commanderId); - if (card.isCreature() && !card.getSubtype(game).contains(choice)) { + if (card.isCreature() && !card.hasSubtype(choice, game)) { for (SubType s : card.getSubtype(game)) { game.getState().getCreateCardAttribute(card).getSubtype().add(s); } @@ -155,7 +150,7 @@ class ConspyEffect extends ContinuousEffectImpl { if (stackObject instanceof Spell && stackObject.getControllerId().equals(source.getControllerId()) && stackObject.isCreature() - && !stackObject.getSubtype(game).contains(choice)) { + && !stackObject.hasSubtype(choice, game)) { Card card = ((Spell) stackObject).getCard(); for (SubType s : card.getSubtype(game)) { game.getState().getCreateCardAttribute(card).getSubtype().add(s); @@ -167,7 +162,7 @@ class ConspyEffect extends ContinuousEffectImpl { List creatures = game.getBattlefield().getAllActivePermanents( new FilterControlledCreaturePermanent(), source.getControllerId(), game); for (Permanent creature : creatures) { - if (creature != null && !creature.getSubtype(game).contains(choice)) { + if (creature != null && !creature.hasSubtype(choice, game)) { creature.getSubtype(game).add(choice); } } diff --git a/Mage.Sets/src/mage/cards/a/ArmamentMaster.java b/Mage.Sets/src/mage/cards/a/ArmamentMaster.java index 9d4151670b0..aef4031ef5f 100644 --- a/Mage.Sets/src/mage/cards/a/ArmamentMaster.java +++ b/Mage.Sets/src/mage/cards/a/ArmamentMaster.java @@ -27,8 +27,6 @@ */ package mage.cards.a; -import java.util.List; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; @@ -41,6 +39,9 @@ import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.List; +import java.util.UUID; + /** * * @author North @@ -116,7 +117,7 @@ class ArmamentMasterEffect extends ContinuousEffectImpl { List attachments = p.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attached != null && attached.hasSubtype(SubType.EQUIPMENT, game)) { count++; } } diff --git a/Mage.Sets/src/mage/cards/a/AshesOfTheFallen.java b/Mage.Sets/src/mage/cards/a/AshesOfTheFallen.java index c4246477754..843ff159380 100644 --- a/Mage.Sets/src/mage/cards/a/AshesOfTheFallen.java +++ b/Mage.Sets/src/mage/cards/a/AshesOfTheFallen.java @@ -87,7 +87,7 @@ class AshesOfTheFallenEffect extends ContinuousEffectImpl { SubType subtype = (SubType) game.getState().getValue(permanent.getId() + "_type"); for (UUID cardId : controller.getGraveyard()) { Card card = game.getCard(cardId); - if (card != null && card.isCreature() && !card.getSubtype(game).contains(subtype)) { + if (card != null && card.isCreature() && !card.hasSubtype(subtype, game)) { game.getState().getCreateCardAttribute(card).getSubtype().add(subtype); } } diff --git a/Mage.Sets/src/mage/cards/a/AuramancersGuise.java b/Mage.Sets/src/mage/cards/a/AuramancersGuise.java index fb9bc68a8ae..7ccaf66d283 100644 --- a/Mage.Sets/src/mage/cards/a/AuramancersGuise.java +++ b/Mage.Sets/src/mage/cards/a/AuramancersGuise.java @@ -27,8 +27,6 @@ */ package mage.cards.a; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.DynamicValue; @@ -46,6 +44,9 @@ import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import java.util.List; +import java.util.UUID; + /** * * @author spjspj @@ -101,7 +102,7 @@ class EnchantedCreatureAurasCount implements DynamicValue { List attachments = permanent.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype(game).contains(SubType.AURA)) { + if (attached != null && attached.hasSubtype(SubType.AURA, game)) { count++; } diff --git a/Mage.Sets/src/mage/cards/b/BartelRuneaxe.java b/Mage.Sets/src/mage/cards/b/BartelRuneaxe.java index 6db21c27a6f..bc03f9f2a50 100644 --- a/Mage.Sets/src/mage/cards/b/BartelRuneaxe.java +++ b/Mage.Sets/src/mage/cards/b/BartelRuneaxe.java @@ -109,7 +109,7 @@ class BartelRuneaxeEffect extends ContinuousRuleModifyingEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { StackObject stackObject = (StackObject) game.getStack().getStackObject(event.getSourceId()); if (stackObject != null && event.getTargetId().equals(source.getSourceId())) { - if (stackObject.getSubtype(game).contains(SubType.AURA)) { + if (stackObject.hasSubtype(SubType.AURA, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/b/BlastfireBolt.java b/Mage.Sets/src/mage/cards/b/BlastfireBolt.java index 327a631c746..e6ac583f52d 100644 --- a/Mage.Sets/src/mage/cards/b/BlastfireBolt.java +++ b/Mage.Sets/src/mage/cards/b/BlastfireBolt.java @@ -95,7 +95,7 @@ class DestroyAllAttachedEquipmentEffect extends OneShotEffect { List attachments = new ArrayList<>(target.getAttachments()); for (UUID attachmentId : attachments) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attachment != null && attachment.hasSubtype(SubType.EQUIPMENT, game)) { attachment.destroy(source.getSourceId(), game, false); } } diff --git a/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java b/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java index bd48a4c2fa0..9cbfc70cc39 100644 --- a/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java +++ b/Mage.Sets/src/mage/cards/b/BriarbridgePatrol.java @@ -27,8 +27,6 @@ */ package mage.cards.b; -import java.util.List; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BeginningOfEndStepTriggeredAbility; @@ -47,6 +45,9 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.watchers.common.PermanentsSacrificedWatcher; +import java.util.List; +import java.util.UUID; + /** * @author LevelX2 */ @@ -88,7 +89,7 @@ enum BriarbridgePatrolCondition implements Condition { if (sacrificedPermanents != null && !sacrificedPermanents.isEmpty()) { int amountOfClues = 0; for (Permanent permanent : sacrificedPermanents) { - if (permanent.getSubtype(game).contains(SubType.CLUE)) { + if (permanent.hasSubtype(SubType.CLUE, game)) { amountOfClues++; } } diff --git a/Mage.Sets/src/mage/cards/c/CopyEnchantment.java b/Mage.Sets/src/mage/cards/c/CopyEnchantment.java index 24761d4680f..cf9968c1395 100644 --- a/Mage.Sets/src/mage/cards/c/CopyEnchantment.java +++ b/Mage.Sets/src/mage/cards/c/CopyEnchantment.java @@ -88,7 +88,7 @@ class CopyEnchantmentEffect extends CopyPermanentEffect { if (super.apply(game, source)) { Permanent permanentToCopy = getBluePrintPermanent(); if (permanentToCopy != null) { - if (permanentToCopy.getSubtype(game).contains(SubType.AURA)) { + if (permanentToCopy.hasSubtype(SubType.AURA, game)) { Target target = getBluePrintPermanent().getSpellAbility().getTargets().get(0); Outcome auraOutcome = Outcome.BoostCreature; Ability: diff --git a/Mage.Sets/src/mage/cards/c/CrypticGateway.java b/Mage.Sets/src/mage/cards/c/CrypticGateway.java index 8c17e28e5d1..9821618bf7c 100644 --- a/Mage.Sets/src/mage/cards/c/CrypticGateway.java +++ b/Mage.Sets/src/mage/cards/c/CrypticGateway.java @@ -203,14 +203,14 @@ class CrypticGatewayEffect extends OneShotEffect { List subtypes = new ArrayList<>(); for (SubType subtype : creature.getSubtype(game)) { - if (creature2.getSubtype(game).contains(subtype) || changeling2) { + if (creature2.hasSubtype(subtype, game) || changeling2) { subtypes.add(new SubtypePredicate(subtype)); commonSubType = true; } } for (SubType subtype : creature2.getSubtype(game)) { - if (creature.getSubtype(game).contains(subtype) || changeling) { + if (creature.hasSubtype(subtype, game) || changeling) { subtypes.add(new SubtypePredicate(subtype)); commonSubType = true; } diff --git a/Mage.Sets/src/mage/cards/c/CurseOfMisfortunes.java b/Mage.Sets/src/mage/cards/c/CurseOfMisfortunes.java index 12c2c2dd7fd..ea26695acdf 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfMisfortunes.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfMisfortunes.java @@ -27,7 +27,6 @@ */ package mage.cards.c; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.OnEventTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -52,6 +51,8 @@ import mage.target.TargetPlayer; import mage.target.common.TargetCardInLibrary; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author BetaSteward @@ -107,7 +108,7 @@ class CurseOfMisfortunesEffect extends OneShotEffect { // get the names of attached Curses for (UUID attachmentId: targetPlayer.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype(game).contains(SubType.CURSE)) { + if (attachment != null && attachment.hasSubtype(SubType.CURSE, game)) { filter.add(Predicates.not(new NamePredicate(attachment.getName()))); } } diff --git a/Mage.Sets/src/mage/cards/c/CurseOfThirst.java b/Mage.Sets/src/mage/cards/c/CurseOfThirst.java index 7824f0e2ffc..99ee2c1c204 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfThirst.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfThirst.java @@ -136,7 +136,7 @@ class CursesAttachedCount implements DynamicValue { if (player != null) { for (UUID attachmentId: player.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype(game).contains(SubType.CURSE)) + if (attachment != null && attachment.hasSubtype(SubType.CURSE, game)) count++; } } diff --git a/Mage.Sets/src/mage/cards/d/DaringSleuth.java b/Mage.Sets/src/mage/cards/d/DaringSleuth.java index 417ac40ae3c..de3b79f7d2b 100644 --- a/Mage.Sets/src/mage/cards/d/DaringSleuth.java +++ b/Mage.Sets/src/mage/cards/d/DaringSleuth.java @@ -27,7 +27,6 @@ */ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.common.TransformSourceEffect; @@ -42,6 +41,8 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; +import java.util.UUID; + /** * * @author fireshoes @@ -96,7 +97,7 @@ class DaringSleuthTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains(SubType.CLUE); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).hasSubtype(SubType.CLUE, game); } @Override diff --git a/Mage.Sets/src/mage/cards/d/DauntingDefender.java b/Mage.Sets/src/mage/cards/d/DauntingDefender.java index 8eef9e3c72e..3e4e96f8ace 100644 --- a/Mage.Sets/src/mage/cards/d/DauntingDefender.java +++ b/Mage.Sets/src/mage/cards/d/DauntingDefender.java @@ -27,7 +27,6 @@ */ package mage.cards.d; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; @@ -42,6 +41,8 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * * @author TheElk801 @@ -90,7 +91,7 @@ class DauntingDefenderEffect extends PreventionEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { if (event.getType() == GameEvent.EventType.DAMAGE_CREATURE) { Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getControllerId().equals(source.getControllerId()) && permanent.getSubtype(game).contains(SubType.CLERIC)) { + if (permanent != null && permanent.getControllerId().equals(source.getControllerId()) && permanent.hasSubtype(SubType.CLERIC, game)) { return super.applies(event, source, game); } } diff --git a/Mage.Sets/src/mage/cards/d/DaybreakCoronet.java b/Mage.Sets/src/mage/cards/d/DaybreakCoronet.java index e95b1b081f5..086d0dd58f5 100644 --- a/Mage.Sets/src/mage/cards/d/DaybreakCoronet.java +++ b/Mage.Sets/src/mage/cards/d/DaybreakCoronet.java @@ -110,7 +110,7 @@ class AuraAttachedPredicate implements Predicate { if (!uuid.equals(ownId)) { Permanent attachment = game.getPermanent(uuid); if (attachment != null - && attachment.getSubtype(game).contains(SubType.AURA)) { + && attachment.hasSubtype(SubType.AURA, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/e/EmeriaShepherd.java b/Mage.Sets/src/mage/cards/e/EmeriaShepherd.java index c0867898a8f..b0173b92a79 100644 --- a/Mage.Sets/src/mage/cards/e/EmeriaShepherd.java +++ b/Mage.Sets/src/mage/cards/e/EmeriaShepherd.java @@ -27,7 +27,6 @@ */ package mage.cards.e; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.LandfallAbility; @@ -37,8 +36,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.Predicates; @@ -48,6 +47,8 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** * * @author LevelX2 @@ -109,7 +110,7 @@ class EmeriaShepherdReturnToHandTargetEffect extends OneShotEffect { return false; } Zone toZone = Zone.HAND; - if (triggeringLand.getSubtype(game).contains(SubType.PLAINS) + if (triggeringLand.hasSubtype(SubType.PLAINS, game) && controller.chooseUse(Outcome.PutCardInPlay, "Put the card to battlefield instead?", source, game)) { toZone = Zone.BATTLEFIELD; } diff --git a/Mage.Sets/src/mage/cards/e/EverflameEidolon.java b/Mage.Sets/src/mage/cards/e/EverflameEidolon.java index cd976d672e3..978b5ca8bb1 100644 --- a/Mage.Sets/src/mage/cards/e/EverflameEidolon.java +++ b/Mage.Sets/src/mage/cards/e/EverflameEidolon.java @@ -27,7 +27,6 @@ */ package mage.cards.e; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -39,14 +38,12 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.keyword.BestowAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * * @author Quercitron @@ -98,7 +95,7 @@ class EverflameEidolonEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent sourceObject = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (sourceObject != null) { - if (sourceObject.getSubtype(game).contains(SubType.AURA)) { + if (sourceObject.hasSubtype(SubType.AURA, game)) { game.addEffect(new BoostEnchantedEffect(1, 0, Duration.EndOfTurn), source); } else { game.addEffect(new BoostSourceEffect(1, 0, Duration.EndOfTurn), source); diff --git a/Mage.Sets/src/mage/cards/f/FleetingMemories.java b/Mage.Sets/src/mage/cards/f/FleetingMemories.java index c02a3e51e35..47577f15e7f 100644 --- a/Mage.Sets/src/mage/cards/f/FleetingMemories.java +++ b/Mage.Sets/src/mage/cards/f/FleetingMemories.java @@ -103,7 +103,7 @@ class FleetingMemoriesTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains(SubType.CLUE); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).hasSubtype(SubType.CLUE, game); } @Override diff --git a/Mage.Sets/src/mage/cards/g/GoblinBrawler.java b/Mage.Sets/src/mage/cards/g/GoblinBrawler.java index 40ecab1bbe4..299548a83ac 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinBrawler.java +++ b/Mage.Sets/src/mage/cards/g/GoblinBrawler.java @@ -99,7 +99,7 @@ class CantBeEquippedSourceEffect extends ContinuousRuleModifyingEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { if (event.getTargetId().equals(source.getSourceId())) { Permanent permanent = game.getPermanent(event.getSourceId()); - if (permanent != null && permanent.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (permanent != null && permanent.hasSubtype(SubType.EQUIPMENT, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/g/GoblinCharbelcher.java b/Mage.Sets/src/mage/cards/g/GoblinCharbelcher.java index b2201c3a1f1..beb3cd4068a 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinCharbelcher.java +++ b/Mage.Sets/src/mage/cards/g/GoblinCharbelcher.java @@ -27,7 +27,6 @@ */ package mage.cards.g; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -36,14 +35,16 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.cards.*; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreatureOrPlayer; +import java.util.UUID; + /** * * @author Plopman @@ -102,7 +103,7 @@ class GoblinCharbelcherEffect extends OneShotEffect { cards.add(card); if (card.isLand()){ landFound = true; - if(card.getSubtype(game).contains(SubType.MOUNTAIN)){ + if(card.hasSubtype(SubType.MOUNTAIN, game)){ isMountain = true; } break; @@ -117,7 +118,7 @@ class GoblinCharbelcherEffect extends OneShotEffect { if (landFound) { damage--; } - if(isMountain == true){ + if(isMountain){ damage *= 2; } diff --git a/Mage.Sets/src/mage/cards/g/GolemSkinGauntlets.java b/Mage.Sets/src/mage/cards/g/GolemSkinGauntlets.java index f640905ac1d..8dbcccd31d1 100644 --- a/Mage.Sets/src/mage/cards/g/GolemSkinGauntlets.java +++ b/Mage.Sets/src/mage/cards/g/GolemSkinGauntlets.java @@ -91,7 +91,7 @@ class GolemSkinGauntletsAttachedCount implements DynamicValue { List attachments = permanent.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attached != null && attached.hasSubtype(SubType.EQUIPMENT, game)) { count++; } } diff --git a/Mage.Sets/src/mage/cards/g/GrafMole.java b/Mage.Sets/src/mage/cards/g/GrafMole.java index 814cbd73a90..90acdffb6da 100644 --- a/Mage.Sets/src/mage/cards/g/GrafMole.java +++ b/Mage.Sets/src/mage/cards/g/GrafMole.java @@ -91,7 +91,7 @@ class GrafMoleTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains(SubType.CLUE); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).hasSubtype(SubType.CLUE, game); } @Override diff --git a/Mage.Sets/src/mage/cards/g/GuardianBeast.java b/Mage.Sets/src/mage/cards/g/GuardianBeast.java index eb53911dbcf..72c83b96544 100644 --- a/Mage.Sets/src/mage/cards/g/GuardianBeast.java +++ b/Mage.Sets/src/mage/cards/g/GuardianBeast.java @@ -142,7 +142,7 @@ class GuardianBeastConditionalEffect extends ContinuousRuleModifyingEffectImpl { } StackObject spell = game.getStack().getStackObject(event.getSourceId()); - if (event.getType() == EventType.LOSE_CONTROL || event.getType() == EventType.ATTACH || event.getType() == EventType.TARGET && spell != null && spell.isEnchantment() && spell.getSubtype(game).contains(SubType.AURA)) { + if (event.getType() == EventType.LOSE_CONTROL || event.getType() == EventType.ATTACH || event.getType() == EventType.TARGET && spell != null && spell.isEnchantment() && spell.hasSubtype(SubType.AURA, game)) { for (Permanent perm : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) { if (perm != null && Objects.equals(perm.getId(), targetPermanent.getId()) && !perm.isCreature()) { return true; diff --git a/Mage.Sets/src/mage/cards/g/GuulDrazOverseer.java b/Mage.Sets/src/mage/cards/g/GuulDrazOverseer.java index bb5a97d3d60..19d3ebb4994 100644 --- a/Mage.Sets/src/mage/cards/g/GuulDrazOverseer.java +++ b/Mage.Sets/src/mage/cards/g/GuulDrazOverseer.java @@ -27,7 +27,6 @@ */ package mage.cards.g; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.LandfallAbility; @@ -41,6 +40,8 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import java.util.UUID; + /** * * @author LevelX2 @@ -91,7 +92,7 @@ class GuulDrazOverseerEffect extends OneShotEffect { Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); if (controller != null && land != null) { int boost = 1; - if (land.getSubtype(game).contains(SubType.SWAMP)) { + if (land.hasSubtype(SubType.SWAMP, game)) { boost = 2; } game.addEffect(new BoostControlledEffect(boost, 0, Duration.EndOfTurn, true), source); diff --git a/Mage.Sets/src/mage/cards/h/HavenOfTheSpiritDragon.java b/Mage.Sets/src/mage/cards/h/HavenOfTheSpiritDragon.java index b0c11712659..a5b164951fe 100644 --- a/Mage.Sets/src/mage/cards/h/HavenOfTheSpiritDragon.java +++ b/Mage.Sets/src/mage/cards/h/HavenOfTheSpiritDragon.java @@ -27,7 +27,6 @@ */ package mage.cards.h; -import java.util.UUID; import mage.ConditionalMana; import mage.MageObject; import mage.Mana; @@ -54,6 +53,8 @@ import mage.filter.predicate.Predicates; import mage.game.Game; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** * * @author jeffwadsworth @@ -158,7 +159,7 @@ class UginPlaneswalkerCardPredicate implements Predicate { @Override public boolean apply(Card input, Game game) { return input.isPlaneswalker() - && input.getSubtype(game).contains(SubType.UGIN); + && input.hasSubtype(SubType.UGIN, game); } @Override diff --git a/Mage.Sets/src/mage/cards/j/Jokulmorder.java b/Mage.Sets/src/mage/cards/j/Jokulmorder.java index 3b7c1480069..87ce51cb027 100644 --- a/Mage.Sets/src/mage/cards/j/Jokulmorder.java +++ b/Mage.Sets/src/mage/cards/j/Jokulmorder.java @@ -27,7 +27,6 @@ */ package mage.cards.j; -import java.util.UUID; import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTappedAbility; @@ -51,6 +50,8 @@ import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.target.common.TargetControlledPermanent; +import java.util.UUID; + /** * * @author fireshoes @@ -110,7 +111,7 @@ class JokulmorderTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { Permanent land = game.getPermanent(event.getTargetId()); - return land.getSubtype(game).contains(SubType.ISLAND) + return land.hasSubtype(SubType.ISLAND, game) && land.getControllerId().equals(this.controllerId); } diff --git a/Mage.Sets/src/mage/cards/k/KarnLiberated.java b/Mage.Sets/src/mage/cards/k/KarnLiberated.java index 8d474da8d6d..3f5b40282d9 100644 --- a/Mage.Sets/src/mage/cards/k/KarnLiberated.java +++ b/Mage.Sets/src/mage/cards/k/KarnLiberated.java @@ -123,7 +123,7 @@ class KarnLiberatedEffect extends OneShotEffect { for (ExileZone zone : game.getExile().getExileZones()) { if (zone.getId().equals(exileId)) { for (Card card : zone.getCards(game)) { - if (!card.getSubtype(game).contains(SubType.AURA) && card.isPermanent()) { + if (!card.hasSubtype(SubType.AURA, game) && card.isPermanent()) { cards.add(card); } } @@ -155,7 +155,7 @@ class KarnLiberatedEffect extends OneShotEffect { } for (Card card : cards) { game.getState().setZone(card.getId(), Zone.EXILED); - if (card.isPermanent() && !card.getSubtype(game).contains(SubType.AURA)) { + if (card.isPermanent() && !card.hasSubtype(SubType.AURA, game)) { game.getExile().add(exileId, sourceObject.getIdName(), card); } } diff --git a/Mage.Sets/src/mage/cards/k/KorDuelist.java b/Mage.Sets/src/mage/cards/k/KorDuelist.java index 5cbbcfead5c..3dad3f3d16a 100644 --- a/Mage.Sets/src/mage/cards/k/KorDuelist.java +++ b/Mage.Sets/src/mage/cards/k/KorDuelist.java @@ -84,7 +84,7 @@ class SourceIsEquiped implements Condition { for (UUID attachmentUUID : attachments) { Permanent attachment = game.getPermanent(attachmentUUID); if (attachment != null) { - if (attachment.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attachment.hasSubtype(SubType.EQUIPMENT, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java b/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java index 63c9bf294c3..1cfc9355155 100644 --- a/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java +++ b/Mage.Sets/src/mage/cards/l/LifecraftAwakening.java @@ -27,7 +27,6 @@ */ package mage.cards.l; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.ManacostVariableValue; @@ -37,11 +36,7 @@ import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.TargetController; +import mage.constants.*; import mage.counters.CounterType; import mage.filter.common.FilterArtifactPermanent; import mage.filter.predicate.permanent.ControllerPredicate; @@ -51,6 +46,8 @@ import mage.game.permanent.token.Token; import mage.target.common.TargetArtifactPermanent; import mage.target.targetpointer.FixedTarget; +import java.util.UUID; + /** * * @author fireshoes @@ -101,8 +98,8 @@ class LifecraftAwakeningEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = (Permanent) game.getPermanent(source.getTargets().getFirstTarget()); - if (!permanent.isCreature() && !permanent.getSubtype(game).contains(SubType.VEHICLE)) { + Permanent permanent = game.getPermanent(source.getTargets().getFirstTarget()); + if (!permanent.isCreature() && !permanent.hasSubtype(SubType.VEHICLE, game)) { ContinuousEffect continuousEffect = new BecomesCreatureTargetEffect(new LifecraftAwakeningToken(), false, true, Duration.Custom); continuousEffect.setTargetPointer(new FixedTarget(permanent, game)); game.addEffect(continuousEffect, source); diff --git a/Mage.Sets/src/mage/cards/l/Lightsaber.java b/Mage.Sets/src/mage/cards/l/Lightsaber.java index c820ad153b9..210cb571292 100644 --- a/Mage.Sets/src/mage/cards/l/Lightsaber.java +++ b/Mage.Sets/src/mage/cards/l/Lightsaber.java @@ -27,7 +27,6 @@ */ package mage.cards.l; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.GenericManaCost; @@ -38,15 +37,13 @@ import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.FirstStrikeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AttachmentType; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; import mage.util.CardUtil; +import java.util.UUID; + /** * * @author Styxo @@ -73,7 +70,7 @@ public class Lightsaber extends CardImpl { public void adjustCosts(Ability ability, Game game) { if (ability instanceof EquipAbility) { Permanent targetCreature = game.getPermanent(ability.getTargets().getFirstTarget()); - if (targetCreature != null && (targetCreature.getSubtype(game).contains(SubType.SITH) || targetCreature.getSubtype(game).contains(SubType.JEDI))) { + if (targetCreature != null && (targetCreature.hasSubtype(SubType.SITH, game) || targetCreature.hasSubtype(SubType.JEDI, game))) { CardUtil.increaseCost(ability, 1 - ability.getManaCostsToPay().convertedManaCost()); } } diff --git a/Mage.Sets/src/mage/cards/l/LilianasDefeat.java b/Mage.Sets/src/mage/cards/l/LilianasDefeat.java index 072a84ea987..081350eade2 100644 --- a/Mage.Sets/src/mage/cards/l/LilianasDefeat.java +++ b/Mage.Sets/src/mage/cards/l/LilianasDefeat.java @@ -27,7 +27,6 @@ */ package mage.cards.l; -import java.util.UUID; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -44,6 +43,8 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -93,7 +94,7 @@ class LilianasDefeatEffect extends OneShotEffect { if (player != null && permanent != null) { permanent.destroy(source.getSourceId(), game, true); game.applyEffects(); - if (permanent.isPlaneswalker() && permanent.getSubtype(game).contains(SubType.LILIANA)) { + if (permanent.isPlaneswalker() && permanent.hasSubtype(SubType.LILIANA, game)) { Player permanentController = game.getPlayer(permanent.getControllerId()); if (permanentController != null) { permanentController.loseLife(3, game, false); diff --git a/Mage.Sets/src/mage/cards/l/LostInTheWoods.java b/Mage.Sets/src/mage/cards/l/LostInTheWoods.java index e248d911dba..849c4c7c98e 100644 --- a/Mage.Sets/src/mage/cards/l/LostInTheWoods.java +++ b/Mage.Sets/src/mage/cards/l/LostInTheWoods.java @@ -27,26 +27,19 @@ */ package mage.cards.l; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.AttacksAllTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.cards.Cards; -import mage.cards.CardsImpl; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Outcome; -import mage.constants.SetTargetPointer; -import mage.constants.Zone; +import mage.cards.*; +import mage.constants.*; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import java.util.UUID; + /** * * @author BetaSteward @@ -95,7 +88,7 @@ class LostInTheWoodsEffect extends OneShotEffect { controller.revealCards(sourceObject.getName(), cards, game); if (card != null) { - if (card.getSubtype(game).contains(SubType.FOREST)) { + if (card.hasSubtype(SubType.FOREST, game)) { Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source)); if (permanent != null) { permanent.removeFromCombat(game); diff --git a/Mage.Sets/src/mage/cards/m/MarkOfEviction.java b/Mage.Sets/src/mage/cards/m/MarkOfEviction.java index 335f8b2d78a..3cae0645893 100644 --- a/Mage.Sets/src/mage/cards/m/MarkOfEviction.java +++ b/Mage.Sets/src/mage/cards/m/MarkOfEviction.java @@ -108,7 +108,7 @@ class MarkOfEvictionEffect extends OneShotEffect { toHand.add(enchanted); for (UUID attachmentId : enchanted.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype(game).contains(SubType.AURA)) { + if (attachment != null && attachment.hasSubtype(SubType.AURA, game)) { toHand.add(attachment); } } diff --git a/Mage.Sets/src/mage/cards/m/MurderousSpoils.java b/Mage.Sets/src/mage/cards/m/MurderousSpoils.java index c8f15e89491..42a7abd4d22 100644 --- a/Mage.Sets/src/mage/cards/m/MurderousSpoils.java +++ b/Mage.Sets/src/mage/cards/m/MurderousSpoils.java @@ -98,7 +98,7 @@ class MurderousSpoilsEffect extends OneShotEffect { List attachments = new ArrayList<>(); for (UUID uuid : target.getAttachments()) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attached.hasSubtype(SubType.EQUIPMENT, game)) { attachments.add(attached); } } diff --git a/Mage.Sets/src/mage/cards/m/MyriadLandscape.java b/Mage.Sets/src/mage/cards/m/MyriadLandscape.java index 84f26a0a748..3a2c36827db 100644 --- a/Mage.Sets/src/mage/cards/m/MyriadLandscape.java +++ b/Mage.Sets/src/mage/cards/m/MyriadLandscape.java @@ -110,7 +110,7 @@ class TargetCardInLibrarySharingLandType extends TargetCardInLibrary { if (landTypes.isEmpty()) { landTypes.addAll(landCard.getSubtype(game)); } else { - landTypes.removeIf(next -> !landCard.getSubtype(game).contains(next)); + landTypes.removeIf(next -> !landCard.hasSubtype(next, game)); } } } @@ -118,7 +118,7 @@ class TargetCardInLibrarySharingLandType extends TargetCardInLibrary { if (card != null && !landTypes.isEmpty()) { for (Iterator iterator = landTypes.iterator(); iterator.hasNext();) { SubType next = iterator.next(); - if (card.getSubtype(game).contains(next)) { + if (card.hasSubtype(next, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/n/NecromancersMagemark.java b/Mage.Sets/src/mage/cards/n/NecromancersMagemark.java index 3bc661f5e2b..222513369a9 100644 --- a/Mage.Sets/src/mage/cards/n/NecromancersMagemark.java +++ b/Mage.Sets/src/mage/cards/n/NecromancersMagemark.java @@ -142,7 +142,7 @@ class NecromancersMagemarkEffect extends ReplacementEffectImpl { if (permanent != null && permanent.getControllerId().equals(source.getControllerId())) { for (UUID attachmentId : permanent.getAttachments()) { Permanent attachment = game.getPermanentOrLKIBattlefield(attachmentId); - if (attachment != null && attachment.getSubtype(game).contains(SubType.AURA)) { + if (attachment != null && attachment.hasSubtype(SubType.AURA, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/n/Necromancy.java b/Mage.Sets/src/mage/cards/n/Necromancy.java index 6dd2ab4f61e..504c61abba5 100644 --- a/Mage.Sets/src/mage/cards/n/Necromancy.java +++ b/Mage.Sets/src/mage/cards/n/Necromancy.java @@ -204,7 +204,7 @@ class NecromancyChangeAbilityEffect extends ContinuousEffectImpl implements Sour switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - if (!permanent.getSubtype(game).contains(SubType.AURA)) { + if (!permanent.hasSubtype(SubType.AURA, game)) { permanent.getSubtype(game).add(SubType.AURA); } } diff --git a/Mage.Sets/src/mage/cards/n/NewBlood.java b/Mage.Sets/src/mage/cards/n/NewBlood.java index abef9e8c1d6..cd2c534219a 100644 --- a/Mage.Sets/src/mage/cards/n/NewBlood.java +++ b/Mage.Sets/src/mage/cards/n/NewBlood.java @@ -27,9 +27,6 @@ */ package mage.cards.n; -import java.util.LinkedHashSet; -import java.util.UUID; -import java.util.stream.Collectors; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; @@ -43,12 +40,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.Choice; import mage.choices.ChoiceImpl; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; -import mage.constants.SubType; +import mage.constants.*; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.TextPartSubtypePredicate; @@ -60,6 +52,10 @@ import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; +import java.util.LinkedHashSet; +import java.util.UUID; +import java.util.stream.Collectors; + /** * * @author LevelX2 @@ -187,9 +183,9 @@ class ChangeCreatureTypeTargetEffect extends ContinuousEffectImpl { break; case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - if (targetObject.getSubtype(game).contains(fromSubType)) { + if (targetObject.hasSubtype(fromSubType, game)) { targetObject.getSubtype(game).remove(fromSubType); - if (!targetObject.getSubtype(game).contains(toSubType)) { + if (!targetObject.hasSubtype(toSubType, game)) { targetObject.getSubtype(game).add(toSubType); } } diff --git a/Mage.Sets/src/mage/cards/n/NyleasPresence.java b/Mage.Sets/src/mage/cards/n/NyleasPresence.java index c6c1e9cc9e0..a56ede95586 100644 --- a/Mage.Sets/src/mage/cards/n/NyleasPresence.java +++ b/Mage.Sets/src/mage/cards/n/NyleasPresence.java @@ -141,7 +141,7 @@ class NyleasPresenceLandTypeEffect extends ContinuousEffectImpl { break; case TypeChangingEffects_4: for (SubType subtype : landTypes) { - if (!land.getSubtype(game).contains(subtype)) { + if (!land.hasSubtype(subtype, game)) { land.getSubtype(game).add(subtype); } } diff --git a/Mage.Sets/src/mage/cards/o/OrzhovCharm.java b/Mage.Sets/src/mage/cards/o/OrzhovCharm.java index 512a8098e56..d6c41b44c50 100644 --- a/Mage.Sets/src/mage/cards/o/OrzhovCharm.java +++ b/Mage.Sets/src/mage/cards/o/OrzhovCharm.java @@ -119,7 +119,7 @@ class OrzhovCharmReturnToHandEffect extends OneShotEffect { for (UUID attachmentId : attachments) { Permanent attachment = game.getPermanent(attachmentId); if (attachment != null && attachment.getControllerId().equals(source.getControllerId()) - && attachment.getSubtype(game).contains(SubType.AURA)) { + && attachment.hasSubtype(SubType.AURA, game)) { attachment.moveToZone(Zone.HAND, source.getSourceId(), game, false); } } diff --git a/Mage.Sets/src/mage/cards/p/PathOfAncestry.java b/Mage.Sets/src/mage/cards/p/PathOfAncestry.java index b0226c0aeb4..8973e87ab87 100644 --- a/Mage.Sets/src/mage/cards/p/PathOfAncestry.java +++ b/Mage.Sets/src/mage/cards/p/PathOfAncestry.java @@ -27,8 +27,6 @@ */ package mage.cards.p; -import java.util.Iterator; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; @@ -47,6 +45,9 @@ import mage.game.events.GameEvent; import mage.game.stack.Spell; import mage.players.Player; +import java.util.Iterator; +import java.util.UUID; + /** * * @author TheElk801 @@ -115,7 +116,7 @@ class PathOfAncestryTriggeredAbility extends TriggeredAbilityImpl { if (sType.getSubTypeSet() == SubTypeSet.CreatureType) { for (UUID cmdr : controller.getCommandersIds()) { MageObject commander = game.getObject(cmdr); - if (commander != null && commander.getSubtype(game).contains(sType)) { + if (commander != null && commander.hasSubtype(sType, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/p/PrecipiceOfMortis.java b/Mage.Sets/src/mage/cards/p/PrecipiceOfMortis.java index a595c4d194d..cad4f3e7fbd 100644 --- a/Mage.Sets/src/mage/cards/p/PrecipiceOfMortis.java +++ b/Mage.Sets/src/mage/cards/p/PrecipiceOfMortis.java @@ -27,17 +27,12 @@ */ package mage.cards.p; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.events.EntersTheBattlefieldEvent; import mage.game.events.GameEvent; @@ -45,6 +40,8 @@ import mage.game.events.GameEvent.EventType; import mage.game.events.NumberOfTriggersEvent; import mage.game.events.ZoneChangeEvent; +import java.util.UUID; + /** * * @author Styxo @@ -101,7 +98,7 @@ class PrecipiceOfMortisEffect extends ReplacementEffectImpl { if (sourceEvent.getType() == EventType.ENTERS_THE_BATTLEFIELD && sourceEvent instanceof EntersTheBattlefieldEvent) { EntersTheBattlefieldEvent entersTheBattlefieldEvent = (EntersTheBattlefieldEvent) sourceEvent; // Only for entering Jedis - if (entersTheBattlefieldEvent.getTarget().getSubtype(game).contains(SubType.JEDI)) { + if (entersTheBattlefieldEvent.getTarget().hasSubtype(SubType.JEDI, game)) { // Only for triggers of permanents if (game.getPermanent(numberOfTriggersEvent.getSourceId()) != null) { return true; @@ -113,7 +110,7 @@ class PrecipiceOfMortisEffect extends ReplacementEffectImpl { ZoneChangeEvent leavesTheBattlefieldEvent = (ZoneChangeEvent) sourceEvent; if (leavesTheBattlefieldEvent.getFromZone() == Zone.BATTLEFIELD) { // Only for leaving Jedis - if (leavesTheBattlefieldEvent.getTarget().getSubtype(game).contains(SubType.JEDI)) { + if (leavesTheBattlefieldEvent.getTarget().hasSubtype(SubType.JEDI, game)) { // Only for triggers of permanents if (game.getPermanent(numberOfTriggersEvent.getSourceId()) != null) { return true; diff --git a/Mage.Sets/src/mage/cards/p/PrismaticOmen.java b/Mage.Sets/src/mage/cards/p/PrismaticOmen.java index a3b9fc199cc..57fdb7f16db 100644 --- a/Mage.Sets/src/mage/cards/p/PrismaticOmen.java +++ b/Mage.Sets/src/mage/cards/p/PrismaticOmen.java @@ -123,7 +123,7 @@ class BecomesBasicLandTypeAllEffect extends ContinuousEffectImpl { break; case TypeChangingEffects_4: for (SubType subtype : landTypes) { - if (!land.getSubtype(game).contains(subtype)) { + if (!land.hasSubtype(subtype, game)) { land.getSubtype(game).add(subtype); } } diff --git a/Mage.Sets/src/mage/cards/r/Realmwright.java b/Mage.Sets/src/mage/cards/r/Realmwright.java index af22570bc88..ae20d46c867 100644 --- a/Mage.Sets/src/mage/cards/r/Realmwright.java +++ b/Mage.Sets/src/mage/cards/r/Realmwright.java @@ -111,7 +111,7 @@ class RealmwrightEffect2 extends ContinuousEffectImpl { if (land != null) { switch (layer) { case TypeChangingEffects_4: - if (sublayer == SubLayer.NA && !land.getSubtype(game).contains(choice)) { + if (sublayer == SubLayer.NA && !land.hasSubtype(choice, game)) { land.getSubtype(game).add(choice); } break; diff --git a/Mage.Sets/src/mage/cards/r/RiptideShapeshifter.java b/Mage.Sets/src/mage/cards/r/RiptideShapeshifter.java index 7628920a92c..5a5d21a2b94 100644 --- a/Mage.Sets/src/mage/cards/r/RiptideShapeshifter.java +++ b/Mage.Sets/src/mage/cards/r/RiptideShapeshifter.java @@ -105,7 +105,7 @@ class RiptideShapeshifterEffect extends OneShotEffect { Cards revealedCards = new CardsImpl(); while (controller.getLibrary().hasCards()) { Card card = controller.getLibrary().removeFromTop(game); - if (card.isCreature() && card.getSubtype(game).contains(SubType.byDescription(choice.getChoice()))) { + if (card.isCreature() && card.hasSubtype(SubType.byDescription(choice.getChoice()), game)) { controller.moveCards(card, Zone.BATTLEFIELD, source, game); break; } diff --git a/Mage.Sets/src/mage/cards/s/SealockMonster.java b/Mage.Sets/src/mage/cards/s/SealockMonster.java index 310375ecc07..4132bf08ba4 100644 --- a/Mage.Sets/src/mage/cards/s/SealockMonster.java +++ b/Mage.Sets/src/mage/cards/s/SealockMonster.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.BecomesMonstrousSourceTriggeredAbility; @@ -45,6 +44,8 @@ import mage.game.permanent.Permanent; import mage.target.Target; import mage.target.common.TargetLandPermanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -116,7 +117,7 @@ class SealockMonsterBecomesIslandTargetEffect extends ContinuousEffectImpl { } break; case TypeChangingEffects_4: - if (!land.getSubtype(game).contains(SubType.ISLAND)) { + if (!land.hasSubtype(SubType.ISLAND, game)) { land.getSubtype(game).add(SubType.ISLAND); } break; diff --git a/Mage.Sets/src/mage/cards/s/SilenceTheBelievers.java b/Mage.Sets/src/mage/cards/s/SilenceTheBelievers.java index d67051f38cb..e7e06d14aba 100644 --- a/Mage.Sets/src/mage/cards/s/SilenceTheBelievers.java +++ b/Mage.Sets/src/mage/cards/s/SilenceTheBelievers.java @@ -101,7 +101,7 @@ class SilenceTheBelieversExileEffect extends OneShotEffect { List attachments = new ArrayList<>(creature.getAttachments()); for (UUID attachmentId: attachments) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype(game).contains(SubType.AURA)) { + if (attachment != null && attachment.hasSubtype(SubType.AURA, game)) { controller.moveCardToExileWithInfo(attachment, null, null, source.getSourceId(), game, Zone.BATTLEFIELD, true); } } diff --git a/Mage.Sets/src/mage/cards/s/SirensRuse.java b/Mage.Sets/src/mage/cards/s/SirensRuse.java index c6acf46fed6..58ec90f304c 100644 --- a/Mage.Sets/src/mage/cards/s/SirensRuse.java +++ b/Mage.Sets/src/mage/cards/s/SirensRuse.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.common.ExileTargetForSourceEffect; import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; @@ -40,6 +39,8 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; +import java.util.UUID; + /** * * @author TheElk801 @@ -85,7 +86,7 @@ class SirensRuseEffect extends ExileTargetForSourceEffect { boolean isPirate = false; Player player = game.getPlayer(source.getControllerId()); Permanent permanent = game.getPermanent(source.getFirstTarget()); - if (permanent != null && permanent.getSubtype(game).contains(SubType.PIRATE)) { + if (permanent != null && permanent.hasSubtype(SubType.PIRATE, game)) { isPirate = true; } if (super.apply(game, source)) { diff --git a/Mage.Sets/src/mage/cards/s/SoulExchange.java b/Mage.Sets/src/mage/cards/s/SoulExchange.java index 08f28b85876..995a4241dd2 100644 --- a/Mage.Sets/src/mage/cards/s/SoulExchange.java +++ b/Mage.Sets/src/mage/cards/s/SoulExchange.java @@ -27,7 +27,6 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.costs.Cost; import mage.abilities.costs.common.ExileTargetCost; @@ -36,8 +35,8 @@ import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffec import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.common.FilterCreatureCard; import mage.game.Game; @@ -45,22 +44,23 @@ import mage.game.permanent.Permanent; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetControlledCreaturePermanent; +import java.util.UUID; + /** - * * @author MarcoMarin */ public class SoulExchange extends CardImpl { public SoulExchange(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}{B}"); // As an additional cost to cast Soul Exchange, exile a creature you control. Cost cost = new ExileTargetCost(new TargetControlledCreaturePermanent()); this.getSpellAbility().addCost(cost); // Return target creature card from your graveyard to the battlefield. Put a +2/+2 counter on that creature if the exiled creature was a Thrull. - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); - this.getSpellAbility().addEffect(new SoulExchangeEffect()); - + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard("creature card from your graveyard"))); + this.getSpellAbility().addEffect(new SoulExchangeEffect()); + } public SoulExchange(final SoulExchange card) { @@ -73,17 +73,17 @@ public class SoulExchange extends CardImpl { } } -class SoulExchangeEffect extends OneShotEffect{ - +class SoulExchangeEffect extends OneShotEffect { + public SoulExchangeEffect() { super(Outcome.Benefit); this.setText("Return target creature card from your graveyard to the battlefield. Put a +2/+2 counter on that creature if the exiled creature was a Thrull."); } - + public SoulExchangeEffect(final SoulExchangeEffect effect) { super(effect); } - + @Override public SoulExchangeEffect copy() { return new SoulExchangeEffect(this); @@ -93,22 +93,22 @@ class SoulExchangeEffect extends OneShotEffect{ public boolean apply(Game game, Ability source) { ReturnFromGraveyardToBattlefieldTargetEffect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); if (!effect.apply(game, source)) return false; - - for (Cost c : source.getCosts()){ + + for (Cost c : source.getCosts()) { /* if (!c.getTargets().isEmpty()){ UUID t = c.getTargets().getFirstTarget(); Permanent exiled = game.getPermanentOrLKIBattlefield(t);*/ if (c.isPaid() && c instanceof ExileTargetCost) { for (Permanent exiled : ((ExileTargetCost) c).getPermanents()) { - if (exiled != null){ - if(exiled.getSubtype(game).contains(SubType.THRULL)){ - game.getPermanent(source.getFirstTarget()).addCounters(CounterType.P2P2.createInstance(), source, game); - return true; + if (exiled != null) { + if (exiled.hasSubtype(SubType.THRULL, game)) { + game.getPermanent(source.getFirstTarget()).addCounters(CounterType.P2P2.createInstance(), source, game); + return true; } - } else return false; - } + } else return false; + } } - } - return true; + } + return true; } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/StartYourEngines.java b/Mage.Sets/src/mage/cards/s/StartYourEngines.java index 631bb9eb514..4cc5a1ad2eb 100644 --- a/Mage.Sets/src/mage/cards/s/StartYourEngines.java +++ b/Mage.Sets/src/mage/cards/s/StartYourEngines.java @@ -27,22 +27,18 @@ */ package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; +import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -90,7 +86,7 @@ class StartYourEnginesEffect extends ContinuousEffectImpl { @Override public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents(source.getControllerId())) { - if (permanent != null && permanent.getSubtype(game).contains(SubType.VEHICLE)) { + if (permanent != null && permanent.hasSubtype(SubType.VEHICLE, game)) { if (sublayer == SubLayer.NA) { permanent.addCardType(CardType.ARTIFACT); permanent.addCardType(CardType.CREATURE);// TODO: Chcek if giving CREATURE Type is correct diff --git a/Mage.Sets/src/mage/cards/s/StormtideLeviathan.java b/Mage.Sets/src/mage/cards/s/StormtideLeviathan.java index 8adbc93f231..86bbf54402c 100644 --- a/Mage.Sets/src/mage/cards/s/StormtideLeviathan.java +++ b/Mage.Sets/src/mage/cards/s/StormtideLeviathan.java @@ -114,7 +114,7 @@ class StormtideLeviathanEffect extends ContinuousEffectImpl { for (Permanent land : game.getBattlefield().getActivePermanents(new FilterLandPermanent(), source.getControllerId(), game)) { switch (layer) { case TypeChangingEffects_4: - if (!land.getSubtype(game).contains(SubType.ISLAND)) { + if (!land.hasSubtype(SubType.ISLAND, game)) { land.getSubtype(game).add(SubType.ISLAND); } break; diff --git a/Mage.Sets/src/mage/cards/s/StreetSweeper.java b/Mage.Sets/src/mage/cards/s/StreetSweeper.java index 55d0237f945..3a62f39c723 100644 --- a/Mage.Sets/src/mage/cards/s/StreetSweeper.java +++ b/Mage.Sets/src/mage/cards/s/StreetSweeper.java @@ -108,7 +108,7 @@ class StreetSweeperDestroyEffect extends OneShotEffect { for(UUID uuid : attachments) { Permanent aura = game.getPermanent(uuid); - if(aura != null && aura.getSubtype(game).contains(SubType.AURA)) + if(aura != null && aura.hasSubtype(SubType.AURA, game)) { aura.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/cards/t/TetsuoUmezawa.java b/Mage.Sets/src/mage/cards/t/TetsuoUmezawa.java index c8db2f395a0..067764fbacd 100644 --- a/Mage.Sets/src/mage/cards/t/TetsuoUmezawa.java +++ b/Mage.Sets/src/mage/cards/t/TetsuoUmezawa.java @@ -27,7 +27,6 @@ */ package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -49,6 +48,8 @@ import mage.game.permanent.Permanent; import mage.game.stack.StackObject; import mage.target.common.TargetCreaturePermanent; +import java.util.UUID; + /** * * @author JRHerlehy @@ -127,9 +128,9 @@ class TetsuoUmezawaEffect extends ContinuousRuleModifyingEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { - StackObject stackObject = (StackObject) game.getStack().getStackObject(event.getSourceId()); + StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); if (stackObject != null && event.getTargetId().equals(source.getSourceId())) { - if (stackObject.getSubtype(game).contains(SubType.AURA)) { + if (stackObject.hasSubtype(SubType.AURA, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/t/TheUrDragon.java b/Mage.Sets/src/mage/cards/t/TheUrDragon.java index f0a501a17a8..2e8cbf0e4a1 100644 --- a/Mage.Sets/src/mage/cards/t/TheUrDragon.java +++ b/Mage.Sets/src/mage/cards/t/TheUrDragon.java @@ -27,9 +27,6 @@ */ package mage.cards.t; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.MageInt; import mage.MageObjectReference; import mage.abilities.Ability; @@ -42,13 +39,7 @@ import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AbilityWord; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.SuperType; -import mage.constants.WatcherScope; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; @@ -57,6 +48,10 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.watchers.Watcher; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + /** * * @author TheElk801 @@ -125,7 +120,7 @@ class DragonsAttackedWatcher extends Watcher { this.attackedThisTurnCreatures.clear(); } if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED) { - if (game.getPermanent(event.getSourceId()).getSubtype(game).contains(SubType.DRAGON)) { + if (game.getPermanent(event.getSourceId()).hasSubtype(SubType.DRAGON, game)) { this.attackedThisTurnCreatures.add(new MageObjectReference(event.getSourceId(), game)); } } @@ -166,7 +161,7 @@ class TheUrDragonTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { for (UUID attacker : game.getCombat().getAttackers()) { Permanent creature = game.getPermanent(attacker); - if (creature != null && creature.getControllerId() == this.getControllerId() && creature.getSubtype(game).contains(SubType.DRAGON)) { + if (creature != null && creature.getControllerId() == this.getControllerId() && creature.hasSubtype(SubType.DRAGON, game)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/t/TirelessTracker.java b/Mage.Sets/src/mage/cards/t/TirelessTracker.java index 790f2081e0a..63f62539fd2 100644 --- a/Mage.Sets/src/mage/cards/t/TirelessTracker.java +++ b/Mage.Sets/src/mage/cards/t/TirelessTracker.java @@ -106,7 +106,7 @@ class TirelessTrackerTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains(SubType.CLUE); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).hasSubtype(SubType.CLUE, game); } @Override diff --git a/Mage.Sets/src/mage/cards/t/TrainingDrone.java b/Mage.Sets/src/mage/cards/t/TrainingDrone.java index 930d3cc932a..d2e58a3b9df 100644 --- a/Mage.Sets/src/mage/cards/t/TrainingDrone.java +++ b/Mage.Sets/src/mage/cards/t/TrainingDrone.java @@ -86,7 +86,7 @@ class TrainingDroneEffect extends RestrictionEffect { List attachments = permanent.getAttachments(); for (UUID uuid : attachments) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attached.hasSubtype(SubType.EQUIPMENT, game)) { return false; } } diff --git a/Mage.Sets/src/mage/cards/t/TreefolkMystic.java b/Mage.Sets/src/mage/cards/t/TreefolkMystic.java index e1b40c9020a..3b29abd1b4d 100644 --- a/Mage.Sets/src/mage/cards/t/TreefolkMystic.java +++ b/Mage.Sets/src/mage/cards/t/TreefolkMystic.java @@ -92,7 +92,7 @@ class TreefolkMysticEffect extends OneShotEffect { attachments.addAll(permanent.getAttachments()); for (UUID uuid : attachments) { Permanent aura = game.getPermanent(uuid); - if (aura != null && aura.getSubtype(game).contains(SubType.AURA)) { + if (aura != null && aura.hasSubtype(SubType.AURA, game)) { aura.destroy(source.getSourceId(), game, false); } } diff --git a/Mage.Sets/src/mage/cards/t/TurnToSlag.java b/Mage.Sets/src/mage/cards/t/TurnToSlag.java index baa52c6d217..ed122abdb8d 100644 --- a/Mage.Sets/src/mage/cards/t/TurnToSlag.java +++ b/Mage.Sets/src/mage/cards/t/TurnToSlag.java @@ -83,7 +83,7 @@ class TurnToSlagEffect extends OneShotEffect { List attachments = new ArrayList<>(); for (UUID uuid : target.getAttachments()) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attached.hasSubtype(SubType.EQUIPMENT, game)) { attachments.add(attached); } } diff --git a/Mage.Sets/src/mage/cards/u/UlvenwaldMysteries.java b/Mage.Sets/src/mage/cards/u/UlvenwaldMysteries.java index cdfaacb3746..23cd488c182 100644 --- a/Mage.Sets/src/mage/cards/u/UlvenwaldMysteries.java +++ b/Mage.Sets/src/mage/cards/u/UlvenwaldMysteries.java @@ -108,7 +108,7 @@ class UlvenwaldMysteriesTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getPlayerId().equals(this.getControllerId()) - && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getSubtype(game).contains(SubType.CLUE); + && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).hasSubtype(SubType.CLUE, game); } @Override diff --git a/Mage.Sets/src/mage/cards/v/VolrathsShapeshifter.java b/Mage.Sets/src/mage/cards/v/VolrathsShapeshifter.java index 914bf30b6af..d2b980a0ec0 100644 --- a/Mage.Sets/src/mage/cards/v/VolrathsShapeshifter.java +++ b/Mage.Sets/src/mage/cards/v/VolrathsShapeshifter.java @@ -27,7 +27,6 @@ */ package mage.cards.v; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -42,6 +41,8 @@ import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * @author ImperatorPrime */ @@ -108,7 +109,7 @@ class VolrathsShapeshifterEffect extends ContinuousEffectImpl { permanent.getSubtype(game).clear(); for (SubType type : card.getSubtype(game)) { - if (!permanent.getSubtype(game).contains(type)) { + if (!permanent.hasSubtype(type, game)) { permanent.getSubtype(game).add(type); } } diff --git a/Mage.Sets/src/mage/cards/w/WitchbaneOrb.java b/Mage.Sets/src/mage/cards/w/WitchbaneOrb.java index ecd73bbb804..6e6e7ba2003 100644 --- a/Mage.Sets/src/mage/cards/w/WitchbaneOrb.java +++ b/Mage.Sets/src/mage/cards/w/WitchbaneOrb.java @@ -92,7 +92,7 @@ class WitchbaneOrbEffect extends OneShotEffect { List toDestroy = new ArrayList<>(); for (UUID attachmentId : controller.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype(game).contains(SubType.CURSE)) { + if (attachment != null && attachment.hasSubtype(SubType.CURSE, game)) { toDestroy.add(attachment); } } diff --git a/Mage.Sets/src/mage/cards/x/Xenograft.java b/Mage.Sets/src/mage/cards/x/Xenograft.java index 7014fb30010..49ca70239b1 100644 --- a/Mage.Sets/src/mage/cards/x/Xenograft.java +++ b/Mage.Sets/src/mage/cards/x/Xenograft.java @@ -84,7 +84,7 @@ class XenograftAddSubtypeEffect extends ContinuousEffectImpl { if (subtype != null) { List permanents = game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, source.getControllerId(), game); for (Permanent permanent : permanents) { - if (permanent != null && !permanent.getSubtype(game).contains(subtype)) { + if (permanent != null && !permanent.hasSubtype(subtype, game)) { permanent.getSubtype(game).add(subtype); } } diff --git a/Mage/src/main/java/mage/MageObject.java b/Mage/src/main/java/mage/MageObject.java index 2569ca1acfd..131dbe8efac 100644 --- a/Mage/src/main/java/mage/MageObject.java +++ b/Mage/src/main/java/mage/MageObject.java @@ -1,9 +1,5 @@ package mage; -import java.io.Serializable; -import java.util.EnumSet; -import java.util.List; -import java.util.UUID; import mage.abilities.Abilities; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCost; @@ -19,6 +15,11 @@ import mage.game.Game; import mage.game.events.ZoneChangeEvent; import mage.util.SubTypeList; +import java.io.Serializable; +import java.util.EnumSet; +import java.util.List; +import java.util.UUID; + public interface MageObject extends MageItem, Serializable { String getName(); @@ -177,7 +178,7 @@ public interface MageObject extends MageItem, Serializable { } } for (SubType subtype : this.getSubtype(game)) { - if (otherCard.getSubtype(game).contains(subtype)) { + if (otherCard.hasSubtype(subtype, game)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/common/AuraAttachedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AuraAttachedTriggeredAbility.java index 375aa2ccda6..54937ec3331 100644 --- a/Mage/src/main/java/mage/abilities/common/AuraAttachedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AuraAttachedTriggeredAbility.java @@ -58,7 +58,7 @@ public class AuraAttachedTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getTargetId().equals(this.getSourceId())) { Permanent attachment = game.getPermanent(event.getSourceId()); - if (attachment != null && attachment.getSubtype(game).contains(SubType.AURA)) { + if (attachment != null && attachment.hasSubtype(SubType.AURA, game)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/condition/common/EquippedMultipleSourceCondition.java b/Mage/src/main/java/mage/abilities/condition/common/EquippedMultipleSourceCondition.java index 5cf42544ead..1d4da7cf8a8 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/EquippedMultipleSourceCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/EquippedMultipleSourceCondition.java @@ -29,11 +29,11 @@ package mage.abilities.condition.common; import mage.abilities.Ability; import mage.abilities.condition.Condition; +import mage.constants.SubType; import mage.game.Game; import mage.game.permanent.Permanent; import java.util.UUID; -import mage.constants.SubType; /** * Describes condition when creature is equipped with more than one Equipment. @@ -51,7 +51,7 @@ public enum EquippedMultipleSourceCondition implements Condition { if (permanent != null) { for (UUID uuid : permanent.getAttachments()) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached != null && attached.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attached != null && attached.hasSubtype(SubType.EQUIPMENT, game)) { countEquipped++; if (countEquipped >= 2) { return true; diff --git a/Mage/src/main/java/mage/abilities/condition/common/EquippedSourceCondition.java b/Mage/src/main/java/mage/abilities/condition/common/EquippedSourceCondition.java index 645ade621c8..c311bc24cec 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/EquippedSourceCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/EquippedSourceCondition.java @@ -50,7 +50,7 @@ public enum EquippedSourceCondition implements Condition { if (permanent != null) { for (UUID uuid : permanent.getAttachments()) { Permanent attached = game.getBattlefield().getPermanent(uuid); - if (attached != null && attached.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attached != null && attached.hasSubtype(SubType.EQUIPMENT, game)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/AuraAttachedCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/AuraAttachedCount.java index 2bf48de780f..b537a92bd9c 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/AuraAttachedCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/AuraAttachedCount.java @@ -64,7 +64,7 @@ public class AuraAttachedCount implements DynamicValue { List attachments = p.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype(game).contains(SubType.AURA)) { + if (attached != null && attached.hasSubtype(SubType.AURA, game)) { count++; } } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/DomainValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/DomainValue.java index d6ae575e810..61ae15257dd 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/DomainValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/DomainValue.java @@ -1,14 +1,14 @@ package mage.abilities.dynamicvalue.common; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; -import mage.constants.CardType; import mage.constants.SubType; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * @author Loki */ @@ -63,19 +63,19 @@ public class DomainValue implements DynamicValue { } for (Permanent p : game.getBattlefield().getAllActivePermanents(targetPlayer)) { if (p.isLand()) { - if (havePlains == 0 && p.getSubtype(game).contains(SubType.PLAINS)) { + if (havePlains == 0 && p.hasSubtype(SubType.PLAINS, game)) { havePlains = 1; } - if (haveIslands == 0 && p.getSubtype(game).contains(SubType.ISLAND)) { + if (haveIslands == 0 && p.hasSubtype(SubType.ISLAND, game)) { haveIslands = 1; } - if (haveMountains == 0 && p.getSubtype(game).contains(SubType.MOUNTAIN)) { + if (haveMountains == 0 && p.hasSubtype(SubType.MOUNTAIN, game)) { haveMountains = 1; } - if (haveSwamps == 0 && p.getSubtype(game).contains(SubType.SWAMP)) { + if (haveSwamps == 0 && p.hasSubtype(SubType.SWAMP, game)) { haveSwamps = 1; } - if (haveForests == 0 && p.getSubtype(game).contains(SubType.FOREST)) { + if (haveForests == 0 && p.hasSubtype(SubType.FOREST, game)) { haveForests = 1; } } diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java index d9c75166377..15c87cfaba5 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/EquipmentAttachedCount.java @@ -27,8 +27,6 @@ */ package mage.abilities.dynamicvalue.common; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; @@ -36,6 +34,9 @@ import mage.constants.SubType; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.List; +import java.util.UUID; + /** * * @author North, noxx @@ -64,7 +65,7 @@ public class EquipmentAttachedCount implements DynamicValue { List attachments = permanent.getAttachments(); for (UUID attachmentId : attachments) { Permanent attached = game.getPermanent(attachmentId); - if (attached != null && attached.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attached != null && attached.hasSubtype(SubType.EQUIPMENT, game)) { count++; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java index 88cddba4603..746ca3f4eff 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java @@ -27,9 +27,6 @@ */ package mage.abilities.effects.common; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; import mage.MageObject; import mage.ObjectColor; import mage.abilities.Ability; @@ -51,6 +48,10 @@ import mage.util.CardUtil; import mage.util.functions.ApplyToPermanent; import mage.util.functions.EmptyApplyToPermanent; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + /** * * @author LevelX2 @@ -237,10 +238,10 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { if (tokenToughness != Integer.MIN_VALUE) { token.getToughness().modifyBaseValue(tokenToughness); } - if (additionalSubType != null && !token.getSubtype(game).contains(additionalSubType)) { + if (additionalSubType != null && !token.hasSubtype(additionalSubType, game)) { token.getSubtype(game).add(additionalSubType); } - if (onlySubType != null && !token.getSubtype(game).contains(onlySubType)) { + if (onlySubType != null && !token.hasSubtype(onlySubType, game)) { token.getSubtype(game).clear(); token.getSubtype(game).add(onlySubType); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java index e4ca7328352..67aad3e4cbd 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAllEffect.java @@ -59,7 +59,7 @@ public class AddCardSubtypeAllEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { for (Permanent perm : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { - if (perm != null && !perm.getSubtype(game).contains(addedSubtype)) { + if (perm != null && !perm.hasSubtype(addedSubtype, game)) { perm.getSubtype(game).add(addedSubtype); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAttachedEffect.java index 76aefcab8ae..e7f41ef0507 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCardSubtypeAttachedEffect.java @@ -59,7 +59,7 @@ public class AddCardSubtypeAttachedEffect extends ContinuousEffectImpl { Permanent equipment = game.getPermanent(source.getSourceId()); if (equipment != null && equipment.getAttachedTo() != null) { Permanent target = game.getPermanent(equipment.getAttachedTo()); - if (target != null && !target.getSubtype(game).contains(addedSubtype)) + if (target != null && !target.hasSubtype(addedSubtype, game)) target.getSubtype(game).add(addedSubtype); } return true; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAuraSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAuraSourceEffect.java index 00763a38314..010cf646b3f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAuraSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAuraSourceEffect.java @@ -84,7 +84,7 @@ public class BecomesAuraSourceEffect extends ContinuousEffectImpl implements Sou switch (layer) { case TypeChangingEffects_4: if (sublayer == SubLayer.NA) { - if (!permanent.getSubtype(game).contains(SubType.AURA)) { + if (!permanent.hasSubtype(SubType.AURA, game)) { permanent.getSubtype(game).add(SubType.AURA); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java index a8007645ecb..0db8746d069 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandEnchantedEffect.java @@ -75,27 +75,27 @@ public class BecomesBasicLandEnchantedEffect extends ContinuousEffectImpl { for (SubType landType : landTypes) { switch (landType) { case SWAMP: - if (permanent.getSubtype(game).contains(SubType.SWAMP)) { // type can be removed by other effect with newer timestamp, so no ability adding + if (permanent.hasSubtype(SubType.SWAMP, game)) { // type can be removed by other effect with newer timestamp, so no ability adding permanent.addAbility(new BlackManaAbility(), source.getSourceId(), game); } break; case MOUNTAIN: - if (permanent.getSubtype(game).contains(SubType.MOUNTAIN)) { + if (permanent.hasSubtype(SubType.MOUNTAIN, game)) { permanent.addAbility(new RedManaAbility(), source.getSourceId(), game); } break; case FOREST: - if (permanent.getSubtype(game).contains(SubType.FOREST)) { + if (permanent.hasSubtype(SubType.FOREST, game)) { permanent.addAbility(new GreenManaAbility(), source.getSourceId(), game); } break; case ISLAND: - if (permanent.getSubtype(game).contains(SubType.ISLAND)) { + if (permanent.hasSubtype(SubType.ISLAND, game)) { permanent.addAbility(new BlueManaAbility(), source.getSourceId(), game); } break; case PLAINS: - if (permanent.getSubtype(game).contains(SubType.PLAINS)) { + if (permanent.hasSubtype(SubType.PLAINS, game)) { permanent.addAbility(new WhiteManaAbility(), source.getSourceId(), game); } break; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java index 845dba88961..e8430823051 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesBasicLandTargetEffect.java @@ -149,7 +149,7 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl { } else { landTypesToAdd.clear(); for (SubType subtype : landTypes) { - if (!land.getSubtype(game).contains(subtype)) { + if (!land.hasSubtype(subtype, game)) { land.getSubtype(game).add(subtype); landTypesToAdd.add(subtype); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java index 6310cc71155..da2e7b4a5e1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java @@ -104,7 +104,7 @@ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { break; } for (SubType t : token.getSubtype(game)) { - if (!permanent.getSubtype(game).contains(t)) { + if (!permanent.hasSubtype(t, game)) { permanent.getSubtype(game).add(t); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect.java index 5e2f4087535..9b62e1e9335 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect.java @@ -120,7 +120,7 @@ public class BecomesCreatureAttachedWithActivatedAbilityOrSpellEffect extends Co break; } for (SubType subType : token.getSubtype(game)) { - if (!permanentAttachedTo.getSubtype(game).contains(subType)) { + if (!permanentAttachedTo.hasSubtype(subType, game)) { permanentAttachedTo.getSubtype(game).add(subType); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureIfVehicleEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureIfVehicleEffect.java index 2964330d10f..43915d9ac74 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureIfVehicleEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureIfVehicleEffect.java @@ -27,7 +27,7 @@ public class BecomesCreatureIfVehicleEffect extends ContinuousEffectImpl { Permanent aura = game.getPermanent(source.getSourceId()); if (aura != null && aura.getAttachedTo() != null) { Permanent enchanted = game.getPermanent(aura.getAttachedTo()); - if (enchanted != null && enchanted.getSubtype(game).contains(SubType.VEHICLE)) { + if (enchanted != null && enchanted.hasSubtype(SubType.VEHICLE, game)) { enchanted.addCardType(addedType); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTargetEffect.java index 0872acbf64b..b95e5b79e5f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTargetEffect.java @@ -89,7 +89,7 @@ public class BecomesCreatureTargetEffect extends ContinuousEffectImpl { } else { if (!token.getSubtype(game).isEmpty()) { for (SubType subtype : token.getSubtype(game)) { - if (!permanent.getSubtype(game).contains(subtype)) { + if (!permanent.hasSubtype(subtype, game)) { permanent.getSubtype(game).add(subtype); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTypeTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTypeTargetEffect.java index 04702ba86ba..e5a140ff81f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTypeTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureTypeTargetEffect.java @@ -77,7 +77,7 @@ public class BecomesCreatureTypeTargetEffect extends ContinuousEffectImpl { permanent.getSubtype(game).addAll(subtypes); } else { for (SubType subtype : subtypes) { - if (!permanent.getSubtype(game).contains(subtype)) { + if (!permanent.hasSubtype(subtype, game)) { permanent.getSubtype(game).add(subtype); } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java index 0758cd85194..3bc5c7a936e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesSubtypeAllEffect.java @@ -74,7 +74,7 @@ public class BecomesSubtypeAllEffect extends ContinuousEffectImpl { permanent.getSubtype(game).addAll(subtypes); } else { for (SubType subtype : subtypes) { - if (!permanent.getSubtype(game).contains(subtype)) { + if (!permanent.hasSubtype(subtype, game)) { permanent.getSubtype(game).add(subtype); } } diff --git a/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java b/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java index c623bc59666..b662a749115 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AuraSwapAbility.java @@ -94,7 +94,7 @@ class AuraSwapEffect extends OneShotEffect { if (controller != null) { Permanent auraSourcePermanent = game.getPermanent(source.getSourceId()); if (auraSourcePermanent != null - && auraSourcePermanent.getSubtype(game).contains(SubType.AURA) + && auraSourcePermanent.hasSubtype(SubType.AURA, game) && auraSourcePermanent.getOwnerId().equals(source.getControllerId())) { Permanent enchantedPermanent = game.getPermanent(auraSourcePermanent.getAttachedTo()); filterCardToCheck.add(new AuraCardCanAttachToPermanentId(enchantedPermanent.getId())); diff --git a/Mage/src/main/java/mage/abilities/keyword/BestowAbility.java b/Mage/src/main/java/mage/abilities/keyword/BestowAbility.java index c7f041a633f..0aab88b1f3c 100644 --- a/Mage/src/main/java/mage/abilities/keyword/BestowAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/BestowAbility.java @@ -188,7 +188,7 @@ class BestowEntersBattlefieldEffect extends ReplacementEffectImpl { public boolean replaceEvent(GameEvent event, Ability source, Game game) { Permanent bestowPermanent = game.getPermanentEntering(source.getSourceId()); if (bestowPermanent != null) { - if (bestowPermanent.getSubtype(game).contains(SubType.AURA)) { + if (bestowPermanent.hasSubtype(SubType.AURA, game)) { MageObject basicObject = bestowPermanent.getBasicMageObject(game); basicObject.getSubtype(null).add(SubType.AURA); basicObject.getCardType().remove(CardType.CREATURE); diff --git a/Mage/src/main/java/mage/abilities/keyword/EmbalmAbility.java b/Mage/src/main/java/mage/abilities/keyword/EmbalmAbility.java index 2e54362a8d1..c8a4aefa48e 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EmbalmAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EmbalmAbility.java @@ -110,7 +110,7 @@ class EmbalmEffect extends OneShotEffect { EmptyToken token = new EmptyToken(); CardUtil.copyTo(token).from(card); // needed so that entersBattlefied triggered abilities see the attributes (e.g. Master Biomancer) token.getColor(game).setColor(ObjectColor.WHITE); - if (!token.getSubtype(game).contains(SubType.ZOMBIE)) { + if (!token.hasSubtype(SubType.ZOMBIE, game)) { token.getSubtype(game).add(0, SubType.ZOMBIE); } token.getManaCost().clear(); diff --git a/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java b/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java index 10260b59d66..e7ae5d52aff 100644 --- a/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/EternalizeAbility.java @@ -115,7 +115,7 @@ class EternalizeEffect extends OneShotEffect { EmptyToken token = new EmptyToken(); CardUtil.copyTo(token).from(card); // needed so that entersBattlefied triggered abilities see the attributes (e.g. Master Biomancer) token.getColor(game).setColor(ObjectColor.BLACK); - if (!token.getSubtype(game).contains(SubType.ZOMBIE)) { + if (!token.hasSubtype(SubType.ZOMBIE, game)) { token.getSubtype(game).add(0, SubType.ZOMBIE); } token.getManaCost().clear(); diff --git a/Mage/src/main/java/mage/abilities/keyword/SpliceOntoArcaneAbility.java b/Mage/src/main/java/mage/abilities/keyword/SpliceOntoArcaneAbility.java index 4926f258ff1..b21ebe7d896 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SpliceOntoArcaneAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SpliceOntoArcaneAbility.java @@ -27,7 +27,6 @@ */ package mage.abilities.keyword; -import java.util.Iterator; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.SpellAbility; @@ -38,15 +37,13 @@ import mage.abilities.costs.CostsImpl; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.SpliceCardEffectImpl; import mage.cards.Card; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.SpellAbilityType; -import mage.constants.SubType; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.stack.Spell; import mage.players.Player; +import java.util.Iterator; + /** * 702.45. Splice @@ -183,7 +180,7 @@ class SpliceOntoArcaneEffect extends SpliceCardEffectImpl { @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { MageObject object = game.getObject(abilityToModify.getSourceId()); - if (object != null && object.getSubtype(game).contains(SubType.ARCANE)) { + if (object != null && object.hasSubtype(SubType.ARCANE, game)) { return spliceSpellCanBeActivated(source, game); } return false; diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/EquippedPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/EquippedPredicate.java index c88f12c831a..87ca0911f69 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/EquippedPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/EquippedPredicate.java @@ -21,7 +21,7 @@ public class EquippedPredicate implements Predicate { public boolean apply(Permanent input, Game game) { for (UUID attachmentId : input.getAttachments()) { Permanent attachment = game.getPermanent(attachmentId); - if (attachment != null && attachment.getSubtype(game).contains(SubType.EQUIPMENT)) { + if (attachment != null && attachment.hasSubtype(SubType.EQUIPMENT, game)) { return true; } } diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 56dd77e9167..18babecc50b 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -929,7 +929,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { @Override public boolean cantBeAttachedBy(MageObject source, Game game) { for (ProtectionAbility ability : this.getAbilities(game).getProtectionAbilities()) { - if (!(source.getSubtype(game).contains(SubType.AURA) + if (!(source.hasSubtype(SubType.AURA, game) && !ability.removesAuras()) && !source.getId().equals(ability.getAuraIdNotToBeRemoved()) && !ability.canTarget(source, game)) { diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 391939efdda..38d664896e3 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -27,10 +27,6 @@ */ package mage.game.stack; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.Mana; @@ -64,6 +60,11 @@ import mage.players.Player; import mage.util.GameLog; import mage.util.SubTypeList; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -245,7 +246,7 @@ public class Spell extends StackObjImpl implements Card { } counter(null, game); return false; - } else if (this.isEnchantment() && this.getSubtype(game).contains(SubType.AURA)) { + } else if (this.isEnchantment() && this.hasSubtype(SubType.AURA, game)) { if (ability.getTargets().stillLegal(ability, game)) { updateOptionalCosts(0); boolean bestow = ability instanceof BestowAbility; diff --git a/Mage/src/main/java/mage/util/SubTypeList.java b/Mage/src/main/java/mage/util/SubTypeList.java index 08fc2575ba0..cf6fd8ef9e8 100644 --- a/Mage/src/main/java/mage/util/SubTypeList.java +++ b/Mage/src/main/java/mage/util/SubTypeList.java @@ -1,14 +1,17 @@ package mage.util; +import mage.constants.SubType; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import mage.constants.SubType; public class SubTypeList extends ArrayList { + + @Deprecated public boolean addAll(List subtypes) { return addAll(subtypes.stream() diff --git a/Mage/src/main/java/mage/util/functions/AddSubtypeApplier.java b/Mage/src/main/java/mage/util/functions/AddSubtypeApplier.java index 9ba53f17582..6f5c35e93dd 100644 --- a/Mage/src/main/java/mage/util/functions/AddSubtypeApplier.java +++ b/Mage/src/main/java/mage/util/functions/AddSubtypeApplier.java @@ -5,13 +5,14 @@ */ package mage.util.functions; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.constants.SubType; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.UUID; + /** * * @author LevelX2 @@ -26,7 +27,7 @@ public class AddSubtypeApplier extends ApplyToPermanent { @Override public boolean apply(Game game, Permanent permanent, Ability source, UUID copyToObjectId) { - if (!permanent.getSubtype(game).contains(subtype)) { + if (!permanent.hasSubtype(subtype, game)) { permanent.getSubtype(game).add(subtype); } return true; @@ -34,7 +35,7 @@ public class AddSubtypeApplier extends ApplyToPermanent { @Override public boolean apply(Game game, MageObject mageObject, Ability source, UUID copyToObjectId) { - if (!mageObject.getSubtype(game).contains(subtype)) { + if (!mageObject.hasSubtype(subtype, game)) { mageObject.getSubtype(game).add(subtype); } return true; From 58ea795e3cf549b9f4f5a0da4d11c2e805d2a0bc Mon Sep 17 00:00:00 2001 From: igoudt Date: Mon, 25 Sep 2017 22:53:26 +0200 Subject: [PATCH 02/15] fix object reference --- Mage.Sets/src/mage/cards/t/TheUrDragon.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/t/TheUrDragon.java b/Mage.Sets/src/mage/cards/t/TheUrDragon.java index 2e8cbf0e4a1..bf3283104f7 100644 --- a/Mage.Sets/src/mage/cards/t/TheUrDragon.java +++ b/Mage.Sets/src/mage/cards/t/TheUrDragon.java @@ -53,7 +53,6 @@ import java.util.Set; import java.util.UUID; /** - * * @author TheElk801 */ public class TheUrDragon extends CardImpl { @@ -161,7 +160,10 @@ class TheUrDragonTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { for (UUID attacker : game.getCombat().getAttackers()) { Permanent creature = game.getPermanent(attacker); - if (creature != null && creature.getControllerId() == this.getControllerId() && creature.hasSubtype(SubType.DRAGON, game)) { + if (creature != null + && creature.getControllerId() != null + && creature.getControllerId().equals(this.getControllerId()) + && creature.hasSubtype(SubType.DRAGON, game)) { return true; } } From 70c50656dd5038c913f704735f01d09190bbc99b Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 10:00:50 -0400 Subject: [PATCH 03/15] fixed Blood Oath not having targets --- Mage.Sets/src/mage/cards/b/BloodOath.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BloodOath.java b/Mage.Sets/src/mage/cards/b/BloodOath.java index d90fc318075..8557e046d67 100644 --- a/Mage.Sets/src/mage/cards/b/BloodOath.java +++ b/Mage.Sets/src/mage/cards/b/BloodOath.java @@ -43,6 +43,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; +import mage.target.common.TargetOpponent; /** * @@ -55,6 +56,7 @@ public class BloodOath extends CardImpl { // Choose a card type. Target opponent reveals his or her hand. Blood Oath deals 3 damage to that player for each card of the chosen type revealed this way. this.getSpellAbility().addEffect(new BloodOathEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); } public BloodOath(final BloodOath card) { @@ -130,13 +132,14 @@ class BloodOathEffect extends OneShotEffect { Cards hand = opponent.getHand(); opponent.revealCards(sourceObject.getIdName(), hand, game); Set cards = hand.getCards(game); - int count = 0; + int damageToDeal = 0; for (Card card : cards) { if (card != null && card.getCardType().contains(type)) { - count += 1; + damageToDeal += 3; } } - opponent.damage(count * 3, source.getSourceId(), game, false, true); + game.informPlayers(sourceObject.getLogName() + " deals " + (damageToDeal == 0 ? "no" : "" + damageToDeal) + " damage to " + opponent.getLogName()); + opponent.damage(damageToDeal, source.getSourceId(), game, false, true); return true; } } From 954ebd165276ac4a6c8f0c6d59b7e03986a82328 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 10:10:00 -0400 Subject: [PATCH 04/15] fixed Ongoing Investigation trigger (#4052) --- .../mage/cards/o/OngoingInvestigation.java | 48 +++++++------------ .../src/mage/cards/t/ThopterSpyNetwork.java | 4 +- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/Mage.Sets/src/mage/cards/o/OngoingInvestigation.java b/Mage.Sets/src/mage/cards/o/OngoingInvestigation.java index ed841828b0b..1dd5bef22fa 100644 --- a/Mage.Sets/src/mage/cards/o/OngoingInvestigation.java +++ b/Mage.Sets/src/mage/cards/o/OngoingInvestigation.java @@ -27,15 +27,14 @@ */ package mage.cards.o; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ExileFromGraveCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.keyword.InvestigateEffect; import mage.cards.CardImpl; @@ -46,7 +45,6 @@ import mage.filter.common.FilterCreatureCard; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.target.common.TargetCardInYourGraveyard; @@ -57,11 +55,11 @@ import mage.target.common.TargetCardInYourGraveyard; public class OngoingInvestigation extends CardImpl { public OngoingInvestigation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); // Whenever one or more creatures you control deal combat damage to a player, investigate. this.addAbility(new OngoingInvestigationTriggeredAbility()); - + // {1}{G}, Exile a creature card from your graveyard: Investigate. You gain 2 life. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new InvestigateEffect(), new ManaCostsImpl("{1}{G}")); ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(new FilterCreatureCard("a creature card from your graveyard")))); @@ -81,8 +79,7 @@ public class OngoingInvestigation extends CardImpl { class OngoingInvestigationTriggeredAbility extends TriggeredAbilityImpl { - private boolean madeDamage = false; - private Set damagedPlayers = new HashSet<>(); + List damagedPlayerIds = new ArrayList<>(); public OngoingInvestigationTriggeredAbility() { super(Zone.BATTLEFIELD, new InvestigateEffect(), false); @@ -90,9 +87,6 @@ class OngoingInvestigationTriggeredAbility extends TriggeredAbilityImpl { public OngoingInvestigationTriggeredAbility(final OngoingInvestigationTriggeredAbility ability) { super(ability); - this.madeDamage = ability.madeDamage; - this.damagedPlayers = new HashSet<>(); - this.damagedPlayers.addAll(ability.damagedPlayers); } @Override @@ -102,36 +96,30 @@ class OngoingInvestigationTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DAMAGED_PLAYER || event.getType() == EventType.COMBAT_DAMAGE_STEP_POST; + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER + || event.getType() == GameEvent.EventType.END_COMBAT_STEP_POST; } @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == EventType.DAMAGED_PLAYER) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; - Permanent p = game.getPermanent(event.getSourceId()); - if (damageEvent.isCombatDamage() && p != null && p.getControllerId().equals(this.getControllerId())) { - madeDamage = true; - damagedPlayers.add(event.getPlayerId()); + if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER) { + if (((DamagedPlayerEvent) event).isCombatDamage()) { + Permanent creature = game.getPermanent(event.getSourceId()); + if (creature != null && creature.getControllerId().equals(controllerId) + && !damagedPlayerIds.contains(event.getTargetId())) { + damagedPlayerIds.add(event.getTargetId()); + return true; + } } } - if (event.getType() == EventType.COMBAT_DAMAGE_STEP_POST) { - if (madeDamage) { - Set damagedPlayersCopy = new HashSet<>(); - damagedPlayersCopy.addAll(damagedPlayers); - for(Effect effect: this.getEffects()) { - effect.setValue("damagedPlayers", damagedPlayersCopy); - } - damagedPlayers.clear(); - madeDamage = false; - return true; - } + if (event.getType() == GameEvent.EventType.END_COMBAT_STEP_POST) { + damagedPlayerIds.clear(); } return false; } @Override public String getRule() { - return "Whenever one or more creatures you control deal combat damage to a player, " + super.getRule(); + return "Whenever one or more creatures you control deal combat damage to a player, investigate"; } } diff --git a/Mage.Sets/src/mage/cards/t/ThopterSpyNetwork.java b/Mage.Sets/src/mage/cards/t/ThopterSpyNetwork.java index a901bc64e0e..c18c86b22b2 100644 --- a/Mage.Sets/src/mage/cards/t/ThopterSpyNetwork.java +++ b/Mage.Sets/src/mage/cards/t/ThopterSpyNetwork.java @@ -51,7 +51,7 @@ import mage.game.permanent.token.ThopterColorlessToken; public class ThopterSpyNetwork extends CardImpl { public ThopterSpyNetwork(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}"); // At the beginning of your upkeep, if you control an artifact, create a 1/1 colorless Thopter artifact creature token with flying. this.addAbility(new ThopterSpyNetworkUpkeepTriggeredAbility()); @@ -149,6 +149,6 @@ class ThopterSpyNetworkDamageTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "Whenever one or more artifact creatures you control deals combat damage to a player, draw a card"; + return "Whenever one or more artifact creatures you control deal combat damage to a player, draw a card"; } } From d46f6f4e45b799f46cfe22bcef703d25a4d0aeef Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 16:29:04 -0400 Subject: [PATCH 05/15] nonfunctional rules text update to Alchemist's Refuge and Winding Canyons (does not fix a reported bug) --- Mage.Sets/src/mage/cards/a/AlchemistsRefuge.java | 11 ++++++----- Mage.Sets/src/mage/cards/w/WindingCanyons.java | 8 ++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AlchemistsRefuge.java b/Mage.Sets/src/mage/cards/a/AlchemistsRefuge.java index a9d1d402846..fdba19d8480 100644 --- a/Mage.Sets/src/mage/cards/a/AlchemistsRefuge.java +++ b/Mage.Sets/src/mage/cards/a/AlchemistsRefuge.java @@ -47,23 +47,24 @@ import mage.filter.predicate.mageobject.CardTypePredicate; /** * * @author noxx - + * */ public class AlchemistsRefuge extends CardImpl { - private static final FilterCard filter = new FilterCard("nonland cards"); + private static final FilterCard filter = new FilterCard("spells"); + static { filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); } public AlchemistsRefuge(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // {tap}: Add {C} to your mana pool. this.addAbility(new ColorlessManaAbility()); - // {G}{U}, {tap}: You may cast nonland cards this turn as though they had flash. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, + // {G}{U}, {tap}: You may cast spells this turn as though they had flash. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddContinuousEffectToGame(new CastAsThoughItHadFlashAllEffect(Duration.EndOfTurn, filter)), new CompositeCost(new ManaCostsImpl("{G}{U}"), new TapSourceCost(), "{G}{U}, {T}"))); } diff --git a/Mage.Sets/src/mage/cards/w/WindingCanyons.java b/Mage.Sets/src/mage/cards/w/WindingCanyons.java index a9edf4795b5..22003869914 100644 --- a/Mage.Sets/src/mage/cards/w/WindingCanyons.java +++ b/Mage.Sets/src/mage/cards/w/WindingCanyons.java @@ -50,14 +50,14 @@ import mage.filter.common.FilterCreatureCard; public class WindingCanyons extends CardImpl { public WindingCanyons(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.LAND},""); + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); // {tap}: Add {C} to your mana pool. this.addAbility(new ColorlessManaAbility()); - - // {2}, {tap}: Until end of turn, you may play creature cards as though they had flash. + + // {2}, {tap}: Until end of turn, you may cast creature spells as though they had flash. Effect effect = new AddContinuousEffectToGame(new CastAsThoughItHadFlashAllEffect(Duration.EndOfTurn, new FilterCreatureCard())); - effect.setText("Until end of turn, you may play creature cards as though they had flash"); + effect.setText("Until end of turn, you may cast creature spells as though they had flash."); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new GenericManaCost(2)); ability.addCost(new TapSourceCost()); this.addAbility(ability); From 66ff9c43c1cbd83aebab52f498a46edf88016301 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 16:48:02 -0400 Subject: [PATCH 06/15] fixed not being able to cast face-down creatures at instant speed with effects like Winding Canyons and Teferi, Mage of Zhalfir --- Mage/src/main/java/mage/abilities/keyword/MorphAbility.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java index 555fb72c33c..557236e5ca5 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java @@ -194,8 +194,7 @@ public class MorphAbility extends StaticAbility implements AlternativeSourceCost @Override public boolean isAvailable(Ability source, Game game) { - return game.isMainPhase() && game.getActivePlayerId().equals(source.getControllerId()) - && (game.getStack().isEmpty() || (game.getStack().size() == 1 && game.getStack().getFirst().getSourceId().equals(source.getSourceId()))); + return true; } @Override From f7ba5716e93bda22d03a9cdb772ca1d29d96b70e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 20:14:46 -0400 Subject: [PATCH 07/15] fixed player becoming monarch incorrectly triggering things when they're already the monarch fixes #3527 --- Mage/src/main/java/mage/game/GameImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index bf310a6d29c..816d04b42d2 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -2938,6 +2938,9 @@ public abstract class GameImpl implements Game, Serializable { @Override public void setMonarchId(Ability source, UUID monarchId) { + if (monarchId == getMonarchId()) { // Nothing happens if you're already the monarch + return; + } Player newMonarch = getPlayer(monarchId); if (getMonarchId() == null) { getState().addDesignation(new Monarch(), this, monarchId); From 8b0979c108add96fd88a5e6f1066f5d39de5de5e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 21:01:51 -0400 Subject: [PATCH 08/15] Implemented Spectral Cloak --- Mage.Sets/src/mage/cards/s/SpectralCloak.java | 87 +++++++++++++++++++ Mage.Sets/src/mage/sets/Legends.java | 1 + 2 files changed, 88 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SpectralCloak.java diff --git a/Mage.Sets/src/mage/cards/s/SpectralCloak.java b/Mage.Sets/src/mage/cards/s/SpectralCloak.java new file mode 100644 index 00000000000..3a2d6238ae4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpectralCloak.java @@ -0,0 +1,87 @@ +/* + * 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 mage.cards.s; + +import java.util.UUID; +import mage.constants.SubType; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.InvertCondition; +import mage.abilities.condition.common.AttachedToTappedCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.ShroudAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public class SpectralCloak extends CardImpl { + + public SpectralCloak(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}{U}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature has shroud as long as it's untapped. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new GainAbilityAttachedEffect(ShroudAbility.getInstance(), AttachmentType.AURA), + new InvertCondition(AttachedToTappedCondition.instance), + "Enchanted creature has shroud as long as it's untapped." + ) + )); + } + + public SpectralCloak(final SpectralCloak card) { + super(card); + } + + @Override + public SpectralCloak copy() { + return new SpectralCloak(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Legends.java b/Mage.Sets/src/mage/sets/Legends.java index 4be3a031cbb..cb8c55d55f1 100644 --- a/Mage.Sets/src/mage/sets/Legends.java +++ b/Mage.Sets/src/mage/sets/Legends.java @@ -220,6 +220,7 @@ public class Legends extends ExpansionSet { cards.add(new SetCardInfo("Sir Shandlar of Eberyn", 297, Rarity.UNCOMMON, mage.cards.s.SirShandlarOfEberyn.class)); cards.add(new SetCardInfo("Sivitri Scarzam", 298, Rarity.UNCOMMON, mage.cards.s.SivitriScarzam.class)); cards.add(new SetCardInfo("Sol'kanar the Swamp King", 299, Rarity.RARE, mage.cards.s.SolkanarTheSwampKing.class)); + cards.add(new SetCardInfo("Spectral Cloak", 78, Rarity.UNCOMMON, mage.cards.s.SpectralCloak.class)); cards.add(new SetCardInfo("Spinal Villain", 161, Rarity.RARE, mage.cards.s.SpinalVillain.class)); cards.add(new SetCardInfo("Spirit Link", 206, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); cards.add(new SetCardInfo("Spirit Shackle", 31, Rarity.COMMON, mage.cards.s.SpiritShackle.class)); From 05e8173193584ea39623d6a3db0dbf0ac19c1079 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 21:20:33 -0400 Subject: [PATCH 09/15] Implemented Phyrexian Boon --- Mage.Sets/src/mage/cards/p/PhyrexianBoon.java | 86 +++++++++++++++++++ Mage.Sets/src/mage/sets/Alliances.java | 1 + Mage.Sets/src/mage/sets/MastersEdition.java | 1 + 3 files changed, 88 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PhyrexianBoon.java diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianBoon.java b/Mage.Sets/src/mage/cards/p/PhyrexianBoon.java new file mode 100644 index 00000000000..d5348966acf --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PhyrexianBoon.java @@ -0,0 +1,86 @@ +/* + * 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 mage.cards.p; + +import java.util.UUID; +import mage.ObjectColor; +import mage.constants.SubType; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.EnchantedCreatureColorCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public class PhyrexianBoon extends CardImpl { + + public PhyrexianBoon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +2/+1 as long as it's black. Otherwise, it gets -1/-2. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new BoostEnchantedEffect(2, 1), + new BoostEnchantedEffect(-1, -2), + new EnchantedCreatureColorCondition(ObjectColor.BLACK), + "Enchanted creature gets +2/+1 as long as it's black. Otherwise, it gets -1/-2." + ) + )); + } + + public PhyrexianBoon(final PhyrexianBoon card) { + super(card); + } + + @Override + public PhyrexianBoon copy() { + return new PhyrexianBoon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Alliances.java b/Mage.Sets/src/mage/sets/Alliances.java index b143d7f4a4c..3535b033d77 100644 --- a/Mage.Sets/src/mage/sets/Alliances.java +++ b/Mage.Sets/src/mage/sets/Alliances.java @@ -110,6 +110,7 @@ public class Alliances extends ExpansionSet { cards.add(new SetCardInfo("Noble Steeds", 140, Rarity.COMMON, mage.cards.n.NobleSteeds.class)); cards.add(new SetCardInfo("Phantasmal Fiend", 20, Rarity.COMMON, mage.cards.p.PhantasmalFiend.class)); cards.add(new SetCardInfo("Phelddagrif", 196, Rarity.RARE, mage.cards.p.Phelddagrif.class)); + cards.add(new SetCardInfo("Phyrexian Boon", 22, Rarity.COMMON, mage.cards.p.PhyrexianBoon.class)); cards.add(new SetCardInfo("Phyrexian Devourer", 167, Rarity.RARE, mage.cards.p.PhyrexianDevourer.class)); cards.add(new SetCardInfo("Phyrexian War Beast", 169, Rarity.COMMON, PhyrexianWarBeast.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Phyrexian War Beast", 170, Rarity.COMMON, PhyrexianWarBeast.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/MastersEdition.java b/Mage.Sets/src/mage/sets/MastersEdition.java index 0b627070ff2..686f03adbc8 100644 --- a/Mage.Sets/src/mage/sets/MastersEdition.java +++ b/Mage.Sets/src/mage/sets/MastersEdition.java @@ -184,6 +184,7 @@ public class MastersEdition extends ExpansionSet { cards.add(new SetCardInfo("Paralyze", 80, Rarity.COMMON, mage.cards.p.Paralyze.class)); cards.add(new SetCardInfo("Phantom Monster", 43, Rarity.COMMON, mage.cards.p.PhantomMonster.class)); cards.add(new SetCardInfo("Phelddagrif", 150, Rarity.RARE, mage.cards.p.Phelddagrif.class)); + cards.add(new SetCardInfo("Phyrexian Boon", 81, Rarity.COMMON, mage.cards.p.PhyrexianBoon.class)); cards.add(new SetCardInfo("Phyrexian War Beast", 162, Rarity.UNCOMMON, PhyrexianWarBeast.class)); cards.add(new SetCardInfo("Plains", 181, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 182, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); From b7f03dd264d30fd5a4c2a955942c87201b2e3ec0 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 21:30:10 -0400 Subject: [PATCH 10/15] Implemented Fyndhorn Pollen --- .../src/mage/cards/f/FyndhornPollen.java | 72 +++++++++++++++++++ Mage.Sets/src/mage/sets/IceAge.java | 1 + Mage.Sets/src/mage/sets/MastersEditionII.java | 1 + 3 files changed, 74 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FyndhornPollen.java diff --git a/Mage.Sets/src/mage/cards/f/FyndhornPollen.java b/Mage.Sets/src/mage/cards/f/FyndhornPollen.java new file mode 100644 index 00000000000..df43a5cd5c1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FyndhornPollen.java @@ -0,0 +1,72 @@ +/* + * 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 mage.cards.f; + +import java.util.UUID; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.abilities.keyword.CumulativeUpkeepAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class FyndhornPollen extends CardImpl { + + private static FilterCreaturePermanent filter = new FilterCreaturePermanent("All creatures"); + + public FyndhornPollen(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); + + // Cumulative upkeep {1} + this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{1}"))); + + // All creatures get -1/-0. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(-1, 0, Duration.WhileOnBattlefield, filter, false))); + + // {1}{G}: All creatures get -1/-0 until end of turn. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostAllEffect(-1, 0, Duration.EndOfTurn, filter, false), new ManaCostsImpl("{1}{G}"))); + } + + public FyndhornPollen(final FyndhornPollen card) { + super(card); + } + + @Override + public FyndhornPollen copy() { + return new FyndhornPollen(this); + } +} diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index dca007b32a3..e7c04b5eed7 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -135,6 +135,7 @@ public class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Fyndhorn Brownie", 130, Rarity.COMMON, mage.cards.f.FyndhornBrownie.class)); cards.add(new SetCardInfo("Fyndhorn Elder", 131, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class)); cards.add(new SetCardInfo("Fyndhorn Elves", 132, Rarity.COMMON, mage.cards.f.FyndhornElves.class)); + cards.add(new SetCardInfo("Fyndhorn Pollen", 133, Rarity.RARE, mage.cards.f.FyndhornPollen.class)); cards.add(new SetCardInfo("Game of Chaos", 186, Rarity.RARE, mage.cards.g.GameOfChaos.class)); cards.add(new SetCardInfo("Gangrenous Zombies", 15, Rarity.COMMON, mage.cards.g.GangrenousZombies.class)); cards.add(new SetCardInfo("Giant Growth", 134, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); diff --git a/Mage.Sets/src/mage/sets/MastersEditionII.java b/Mage.Sets/src/mage/sets/MastersEditionII.java index 30f8408026c..d59211cf3f2 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionII.java +++ b/Mage.Sets/src/mage/sets/MastersEditionII.java @@ -131,6 +131,7 @@ public class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Foul Familiar", 90, Rarity.COMMON, mage.cards.f.FoulFamiliar.class)); cards.add(new SetCardInfo("Fumarole", 194, Rarity.UNCOMMON, mage.cards.f.Fumarole.class)); cards.add(new SetCardInfo("Fungal Bloom", 165, Rarity.RARE, mage.cards.f.FungalBloom.class)); + cards.add(new SetCardInfo("Fyndhorn Pollen", 166, Rarity.RARE, mage.cards.f.FyndhornPollen.class)); cards.add(new SetCardInfo("Gangrenous Zombies", 92, Rarity.COMMON, mage.cards.g.GangrenousZombies.class)); cards.add(new SetCardInfo("Giant Growth", 167, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); cards.add(new SetCardInfo("Giant Trap Door Spider", 195, Rarity.UNCOMMON, mage.cards.g.GiantTrapDoorSpider.class)); From 2b83fc5e20354c9a4eee3cd714a474e7dba2e68f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 21:39:06 -0400 Subject: [PATCH 11/15] Implemented Miracle Worker --- Mage.Sets/src/mage/cards/m/MiracleWorker.java | 81 +++++++++++++++++++ Mage.Sets/src/mage/sets/TheDark.java | 1 + 2 files changed, 82 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MiracleWorker.java diff --git a/Mage.Sets/src/mage/cards/m/MiracleWorker.java b/Mage.Sets/src/mage/cards/m/MiracleWorker.java new file mode 100644 index 00000000000..260ea0cb900 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MiracleWorker.java @@ -0,0 +1,81 @@ +/* + * 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 mage.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.AttachedToPredicate; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public class MiracleWorker extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("Aura attached to a creature you control"); + + static { + filter.add(new AttachedToPredicate(new FilterControlledCreaturePermanent())); + filter.add(new SubtypePredicate(SubType.AURA)); + } + + public MiracleWorker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {tap}: Destroy target Aura attached to a creature you control. + Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect(), new TapSourceCost()); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public MiracleWorker(final MiracleWorker card) { + super(card); + } + + @Override + public MiracleWorker copy() { + return new MiracleWorker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/TheDark.java b/Mage.Sets/src/mage/sets/TheDark.java index 293189e1d4c..d3c8c60614c 100644 --- a/Mage.Sets/src/mage/sets/TheDark.java +++ b/Mage.Sets/src/mage/sets/TheDark.java @@ -106,6 +106,7 @@ public class TheDark extends ExpansionSet { cards.add(new SetCardInfo("Maze of Ith", 114, Rarity.UNCOMMON, mage.cards.m.MazeOfIth.class)); cards.add(new SetCardInfo("Merfolk Assassin", 31, Rarity.UNCOMMON, mage.cards.m.MerfolkAssassin.class)); cards.add(new SetCardInfo("Mind Bomb", 32, Rarity.RARE, mage.cards.m.MindBomb.class)); + cards.add(new SetCardInfo("Miracle Worker", 86, Rarity.COMMON, mage.cards.m.MiracleWorker.class)); cards.add(new SetCardInfo("Morale", 87, Rarity.COMMON, mage.cards.m.Morale.class)); cards.add(new SetCardInfo("Murk Dwellers", 11, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); cards.add(new SetCardInfo("Niall Silvain", 45, Rarity.RARE, mage.cards.n.NiallSilvain.class)); From 074a23df4a8cfc13de06ec26431635731e59860a Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 21:49:52 -0400 Subject: [PATCH 12/15] Implemented Flowstone Strike --- .../src/mage/cards/f/FlowstoneStrike.java | 68 +++++++++++++++++++ Mage.Sets/src/mage/sets/Nemesis.java | 1 + 2 files changed, 69 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FlowstoneStrike.java diff --git a/Mage.Sets/src/mage/cards/f/FlowstoneStrike.java b/Mage.Sets/src/mage/cards/f/FlowstoneStrike.java new file mode 100644 index 00000000000..3e0b8f605c7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlowstoneStrike.java @@ -0,0 +1,68 @@ +/* + * 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 mage.cards.f; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class FlowstoneStrike extends CardImpl { + + public FlowstoneStrike(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); + + // Target creature gets +1/-1 and gains haste until end of turn. + Effect effect = new BoostTargetEffect(1, -1, Duration.EndOfTurn); + effect.setText("Target creature gets +1/-1"); + this.getSpellAbility().addEffect(effect); + effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); + effect.setText("and gains haste until end of turn"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public FlowstoneStrike(final FlowstoneStrike card) { + super(card); + } + + @Override + public FlowstoneStrike copy() { + return new FlowstoneStrike(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Nemesis.java b/Mage.Sets/src/mage/sets/Nemesis.java index 3179cb63315..79ff819d9c9 100644 --- a/Mage.Sets/src/mage/sets/Nemesis.java +++ b/Mage.Sets/src/mage/sets/Nemesis.java @@ -91,6 +91,7 @@ public class Nemesis extends ExpansionSet { cards.add(new SetCardInfo("Flowstone Crusher", 81, Rarity.COMMON, mage.cards.f.FlowstoneCrusher.class)); cards.add(new SetCardInfo("Flowstone Overseer", 82, Rarity.RARE, mage.cards.f.FlowstoneOverseer.class)); cards.add(new SetCardInfo("Flowstone Slide", 83, Rarity.RARE, mage.cards.f.FlowstoneSlide.class)); + cards.add(new SetCardInfo("Flowstone Strike", 84, Rarity.COMMON, mage.cards.f.FlowstoneStrike.class)); cards.add(new SetCardInfo("Flowstone Surge", 85, Rarity.UNCOMMON, mage.cards.f.FlowstoneSurge.class)); cards.add(new SetCardInfo("Flowstone Thopter", 132, Rarity.UNCOMMON, mage.cards.f.FlowstoneThopter.class)); cards.add(new SetCardInfo("Flowstone Wall", 86, Rarity.COMMON, mage.cards.f.FlowstoneWall.class)); From cae879784b2c43e3ee12062904fff61b2ce31fb0 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 21:52:34 -0400 Subject: [PATCH 13/15] Implemented Trailblazer --- Mage.Sets/src/mage/cards/t/Trailblazer.java | 59 +++++++++++++++++++++ Mage.Sets/src/mage/sets/IceAge.java | 1 + 2 files changed, 60 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/Trailblazer.java diff --git a/Mage.Sets/src/mage/cards/t/Trailblazer.java b/Mage.Sets/src/mage/cards/t/Trailblazer.java new file mode 100644 index 00000000000..871286f0bae --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/Trailblazer.java @@ -0,0 +1,59 @@ +/* + * 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 mage.cards.t; + +import java.util.UUID; +import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public class Trailblazer extends CardImpl { + + public Trailblazer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}{G}"); + + // Target creature is unblockable this turn. + this.getSpellAbility().addEffect(new CantBeBlockedTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public Trailblazer(final Trailblazer card) { + super(card); + } + + @Override + public Trailblazer copy() { + return new Trailblazer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index e7c04b5eed7..dd4bdf59403 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -299,6 +299,7 @@ public class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Tinder Wall", 158, Rarity.COMMON, mage.cards.t.TinderWall.class)); cards.add(new SetCardInfo("Tor Giant", 220, Rarity.COMMON, mage.cards.t.TorGiant.class)); cards.add(new SetCardInfo("Touch of Death", 55, Rarity.COMMON, mage.cards.t.TouchOfDeath.class)); + cards.add(new SetCardInfo("Trailblazer", 160, Rarity.RARE, mage.cards.t.Trailblazer.class)); cards.add(new SetCardInfo("Underground River", 357, Rarity.RARE, mage.cards.u.UndergroundRiver.class)); cards.add(new SetCardInfo("Updraft", 105, Rarity.UNCOMMON, mage.cards.u.Updraft.class)); cards.add(new SetCardInfo("Urza's Bauble", 318, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class)); From 859fa03f6b8c595a2ef2ceaa2a6e26208fc4f974 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 25 Sep 2017 22:07:33 -0400 Subject: [PATCH 14/15] Implemented Steamclaw --- .../src/mage/cards/s/ScrabblingClaws.java | 9 ++- Mage.Sets/src/mage/cards/s/Steamclaw.java | 73 +++++++++++++++++++ Mage.Sets/src/mage/sets/Odyssey.java | 1 + 3 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/s/Steamclaw.java diff --git a/Mage.Sets/src/mage/cards/s/ScrabblingClaws.java b/Mage.Sets/src/mage/cards/s/ScrabblingClaws.java index 8afd1c67deb..efbc9d4f53e 100644 --- a/Mage.Sets/src/mage/cards/s/ScrabblingClaws.java +++ b/Mage.Sets/src/mage/cards/s/ScrabblingClaws.java @@ -35,6 +35,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ExileTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -55,18 +56,18 @@ import mage.target.common.TargetCardInGraveyard; public class ScrabblingClaws extends CardImpl { public ScrabblingClaws(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{1}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); // {tap}: Target player exiles a card from his or her graveyard. Ability firstAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ScrabblingClawsEffect(), new TapSourceCost()); firstAbility.addTarget(new TargetPlayer()); this.addAbility(firstAbility); // {1}, Sacrifice Scrabbling Claws: Exile target card from a graveyard. Draw a card. - SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new mage.abilities.effects.common.ExileTargetEffect(), new SacrificeSourceCost()); + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new SacrificeSourceCost()); ability.addCost(new GenericManaCost(1)); ability.addTarget(new TargetCardInGraveyard()); - this.addAbility(ability); ability.addEffect(new DrawCardSourceControllerEffect(1)); + this.addAbility(ability); } public ScrabblingClaws(final ScrabblingClaws card) { @@ -112,4 +113,4 @@ class ScrabblingClawsEffect extends OneShotEffect { } return false; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/s/Steamclaw.java b/Mage.Sets/src/mage/cards/s/Steamclaw.java new file mode 100644 index 00000000000..7a84e5b533b --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/Steamclaw.java @@ -0,0 +1,73 @@ +/* + * 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 mage.cards.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author TheElk801 + */ +public class Steamclaw extends CardImpl { + + public Steamclaw(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + // {3}, {tap}: Exile target card from a graveyard. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new TapSourceCost()); + ability.addCost(new GenericManaCost(3)); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + + // {1}, Sacrifice Steamclaw: Exile target card from a graveyard. + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ExileTargetEffect(), new GenericManaCost(1)); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + } + + public Steamclaw(final Steamclaw card) { + super(card); + } + + @Override + public Steamclaw copy() { + return new Steamclaw(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Odyssey.java b/Mage.Sets/src/mage/sets/Odyssey.java index e35dbac6d45..958d25dd907 100644 --- a/Mage.Sets/src/mage/sets/Odyssey.java +++ b/Mage.Sets/src/mage/sets/Odyssey.java @@ -324,6 +324,7 @@ public class Odyssey extends ExpansionSet { cards.add(new SetCardInfo("Squirrel Nest", 274, Rarity.UNCOMMON, mage.cards.s.SquirrelNest.class)); cards.add(new SetCardInfo("Stalking Bloodsucker", 163, Rarity.RARE, mage.cards.s.StalkingBloodsucker.class)); cards.add(new SetCardInfo("Standstill", 102, Rarity.UNCOMMON, mage.cards.s.Standstill.class)); + cards.add(new SetCardInfo("Steamclaw", 310, Rarity.UNCOMMON, mage.cards.s.Steamclaw.class)); cards.add(new SetCardInfo("Still Life", 275, Rarity.UNCOMMON, mage.cards.s.StillLife.class)); cards.add(new SetCardInfo("Stone-Tongue Basilisk", 276, Rarity.RARE, mage.cards.s.StoneTongueBasilisk.class)); cards.add(new SetCardInfo("Sungrass Egg", 311, Rarity.UNCOMMON, mage.cards.s.SungrassEgg.class)); From ad4223a21cfa82815ad31716f077ad0acc9c75c4 Mon Sep 17 00:00:00 2001 From: igoudt Date: Tue, 26 Sep 2017 13:14:23 +0200 Subject: [PATCH 15/15] fix casting cost for Hakim Loreweaver and Recantation --- Mage.Sets/src/mage/cards/h/HakimLoreweaver.java | 13 ++++--------- Mage.Sets/src/mage/cards/r/Recantation.java | 5 +++-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Mage.Sets/src/mage/cards/h/HakimLoreweaver.java b/Mage.Sets/src/mage/cards/h/HakimLoreweaver.java index ba3efa7f1d3..348472d02ab 100644 --- a/Mage.Sets/src/mage/cards/h/HakimLoreweaver.java +++ b/Mage.Sets/src/mage/cards/h/HakimLoreweaver.java @@ -27,7 +27,6 @@ */ package mage.cards.h; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; @@ -41,13 +40,7 @@ import mage.abilities.keyword.FlyingAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.PhaseStep; -import mage.constants.SubType; -import mage.constants.SuperType; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.CardIdPredicate; @@ -62,6 +55,8 @@ import mage.players.Player; import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** * * @author jeffwadsworth, TheElk801 @@ -77,7 +72,7 @@ public class HakimLoreweaver extends CardImpl { } public HakimLoreweaver(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); diff --git a/Mage.Sets/src/mage/cards/r/Recantation.java b/Mage.Sets/src/mage/cards/r/Recantation.java index e2f9cad9543..209601c92da 100644 --- a/Mage.Sets/src/mage/cards/r/Recantation.java +++ b/Mage.Sets/src/mage/cards/r/Recantation.java @@ -27,7 +27,6 @@ */ package mage.cards.r; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -46,6 +45,8 @@ import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.target.TargetPermanent; +import java.util.UUID; + /** * * @author TheElk801 @@ -53,7 +54,7 @@ import mage.target.TargetPermanent; public class Recantation extends CardImpl { public Recantation(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}{U}"); // At the beginning of your upkeep, you may put a verse counter on Recantation. this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD,