diff --git a/Mage.Sets/src/mage/cards/a/Abeyance.java b/Mage.Sets/src/mage/cards/a/Abeyance.java index 2ca6d881a13..a2a4402eb19 100644 --- a/Mage.Sets/src/mage/cards/a/Abeyance.java +++ b/Mage.Sets/src/mage/cards/a/Abeyance.java @@ -41,6 +41,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.target.TargetPlayer; +import java.util.Optional; import java.util.UUID; /** @@ -110,8 +111,8 @@ class AbeyanceEffect extends ContinuousRuleModifyingEffectImpl { } } if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { - Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DampingMatrix.java b/Mage.Sets/src/mage/cards/d/DampingMatrix.java index a148069ac6b..393114e6338 100644 --- a/Mage.Sets/src/mage/cards/d/DampingMatrix.java +++ b/Mage.Sets/src/mage/cards/d/DampingMatrix.java @@ -46,6 +46,7 @@ import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; +import java.util.Optional; import java.util.UUID; /** @@ -108,8 +109,8 @@ class DampingMatrixEffect extends ReplacementEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { MageObject object = game.getObject(event.getSourceId()); if (object instanceof Permanent && filter.match((Permanent)object, game)) { - Ability ability = object.getAbilities().get(event.getTargetId()); - if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { + Optional ability = object.getAbilities().get(event.getTargetId()); + if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/f/FaithsFetters.java b/Mage.Sets/src/mage/cards/f/FaithsFetters.java index 6e0713642d4..0dda3904ce7 100644 --- a/Mage.Sets/src/mage/cards/f/FaithsFetters.java +++ b/Mage.Sets/src/mage/cards/f/FaithsFetters.java @@ -44,16 +44,16 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; +import java.util.Optional; import java.util.UUID; /** - * * @author LevelX2 */ public class FaithsFetters extends CardImpl { public FaithsFetters(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); this.subtype.add("Aura"); // Enchant permanent @@ -114,12 +114,11 @@ class FaithsFettersEffect extends ContinuousRuleModifyingEffectImpl { public boolean applies(GameEvent event, Ability source, Game game) { Permanent enchantment = game.getPermanent(source.getSourceId()); if (enchantment != null && enchantment.getAttachedTo().equals(event.getSourceId())) { - Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null) { - if (ability.getAbilityType() != AbilityType.MANA) { - return true; - } + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability.isPresent() && ability.get().getAbilityType() != AbilityType.MANA) { + return true; } + } return false; } diff --git a/Mage.Sets/src/mage/cards/h/HandToHand.java b/Mage.Sets/src/mage/cards/h/HandToHand.java index 25470bd8db8..cd1ca19333c 100644 --- a/Mage.Sets/src/mage/cards/h/HandToHand.java +++ b/Mage.Sets/src/mage/cards/h/HandToHand.java @@ -27,7 +27,6 @@ */ package mage.cards.h; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; @@ -35,14 +34,13 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.mana.ActivatedManaAbilityImpl; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.TurnPhase; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; +import java.util.Optional; +import java.util.UUID; + /** * * @author fireshoes @@ -106,8 +104,8 @@ class HandToHandEffect extends ContinuousRuleModifyingEffectImpl { } } if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { - Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/m/MoltenDisaster.java b/Mage.Sets/src/mage/cards/m/MoltenDisaster.java index b8da4da2a71..c923173de3a 100644 --- a/Mage.Sets/src/mage/cards/m/MoltenDisaster.java +++ b/Mage.Sets/src/mage/cards/m/MoltenDisaster.java @@ -27,7 +27,6 @@ */ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.KickedCondition; @@ -50,6 +49,9 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; +import java.util.Optional; +import java.util.UUID; + /** * * @author LevelX2 @@ -109,8 +111,8 @@ class MoltenDisasterSplitSecondEffect extends ContinuousRuleModifyingEffectImpl } } if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { - Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability.isPresent() && !(ability.get() instanceof ActivatedManaAbilityImpl)) { if (KickedCondition.instance.apply(game, source)) { return true; } diff --git a/Mage.Sets/src/mage/cards/p/PithingNeedle.java b/Mage.Sets/src/mage/cards/p/PithingNeedle.java index 7846dfbc157..7999199577f 100644 --- a/Mage.Sets/src/mage/cards/p/PithingNeedle.java +++ b/Mage.Sets/src/mage/cards/p/PithingNeedle.java @@ -27,7 +27,6 @@ */ package mage.cards.p; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.AsEntersBattlefieldAbility; @@ -36,14 +35,13 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.common.NameACardEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AbilityType; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; +import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; +import java.util.Optional; +import java.util.UUID; + /** * * @author jeffwadsworth, nox @@ -99,9 +97,9 @@ class PithingNeedleEffect extends ContinuousRuleModifyingEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { MageObject object = game.getObject(event.getSourceId()); - Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && object != null) { - if (ability.getAbilityType() != AbilityType.MANA + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability.isPresent() && object != null) { + if (ability.get().getAbilityType() != AbilityType.MANA && object.getName().equals(game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY))) { return true; } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/watchers/KiraGreatGlassSpinnerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/watchers/KiraGreatGlassSpinnerTest.java new file mode 100644 index 00000000000..4c9ffeefc61 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/watchers/KiraGreatGlassSpinnerTest.java @@ -0,0 +1,37 @@ +package org.mage.test.cards.watchers; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.permanent.Permanent; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * Created by IGOUDT on 30-3-2017. + */ +public class KiraGreatGlassSpinnerTest extends CardTestPlayerBase { + private final String kira = "Kira, Great Glass-Spinner"; + private final String shock = "Shock"; + + @Test + public void counterFirst(){ + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + addCard(Zone.BATTLEFIELD, playerA, "Ugin, the Spirit Dragon"); // starts with 7 Loyality counters + + addCard(Zone.BATTLEFIELD, playerA, kira); + addCard(Zone.HAND, playerA, shock); + addCard(Zone.HAND, playerA, shock); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: {source} deals 3 damage to target creature or player.", kira); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + + execute(); + + Permanent _kira = getPermanent(kira, playerA.getId()); + Assert.assertNotNull(_kira); + + + } +} diff --git a/Mage/src/main/java/mage/abilities/Abilities.java b/Mage/src/main/java/mage/abilities/Abilities.java index d6d007f3c00..2e4c629a2cc 100644 --- a/Mage/src/main/java/mage/abilities/Abilities.java +++ b/Mage/src/main/java/mage/abilities/Abilities.java @@ -29,6 +29,7 @@ package mage.abilities; import java.io.Serializable; import java.util.List; +import java.util.Optional; import java.util.UUID; import mage.abilities.keyword.ProtectionAbility; import mage.abilities.mana.ActivatedManaAbilityImpl; @@ -245,7 +246,7 @@ public interface Abilities extends List, Serializable { * @param abilityId * @return */ - T get(UUID abilityId); + Optional get(UUID abilityId); /** * TODO The usage of this method seems redundant to that of diff --git a/Mage/src/main/java/mage/abilities/AbilitiesImpl.java b/Mage/src/main/java/mage/abilities/AbilitiesImpl.java index 8c9cd7348e4..3e54960d5b3 100644 --- a/Mage/src/main/java/mage/abilities/AbilitiesImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilitiesImpl.java @@ -27,13 +27,6 @@ */ package mage.abilities; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - import mage.abilities.common.ZoneChangeTriggeredAbility; import mage.abilities.costs.Cost; import mage.abilities.keyword.ProtectionAbility; @@ -44,6 +37,8 @@ import mage.game.Game; import mage.util.ThreadLocalStringBuilder; import org.apache.log4j.Logger; +import java.util.*; + /** * @param * @author BetaSteward_at_googlemail.com @@ -277,12 +272,7 @@ public class AbilitiesImpl extends ArrayList implements Ab @Override public boolean containsRule(T ability) { - for (T test : this) { - if (ability.getRule().equals(test.getRule())) { - return true; - } - } - return false; + return stream().anyMatch(rule -> rule.getRule().equals(ability.getRule())); } @Override @@ -301,32 +291,16 @@ public class AbilitiesImpl extends ArrayList implements Ab @Override public boolean containsKey(UUID abilityId) { - for (T ability : this) { - if (ability.getId().equals(abilityId)) { - return true; - } - } - return false; + return stream().anyMatch(ability -> ability.getId().equals(abilityId)); } @Override public boolean containsClass(Class classObject) { - for (T ability : this) { - if (ability.getClass().equals(classObject)) { - return true; - } - } - return false; + return stream().anyMatch(ability -> ability.getClass().equals(classObject)); } - @Override - public T get(UUID abilityId) { - for (T ability : this) { - if (ability.getId().equals(abilityId)) { - return ability; - } - } - return null; + public Optional get(UUID abilityId) { + return stream().filter(ability -> ability.getId().equals(abilityId)).findFirst(); } @Override diff --git a/Mage/src/main/java/mage/abilities/Ability.java b/Mage/src/main/java/mage/abilities/Ability.java index 6592de44e72..9d10f099ba4 100644 --- a/Mage/src/main/java/mage/abilities/Ability.java +++ b/Mage/src/main/java/mage/abilities/Ability.java @@ -27,9 +27,6 @@ */ package mage.abilities; -import java.io.Serializable; -import java.util.List; -import java.util.UUID; import mage.MageObject; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; @@ -49,6 +46,11 @@ import mage.target.Target; import mage.target.Targets; import mage.watchers.Watcher; +import java.io.Serializable; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + /** * Practically everything in the game is started from an Ability. This interface * describes what an Ability is composed of at the highest level. diff --git a/Mage/src/main/java/mage/abilities/DelayedTriggeredAbilities.java b/Mage/src/main/java/mage/abilities/DelayedTriggeredAbilities.java index f98551cb414..12402295a52 100644 --- a/Mage/src/main/java/mage/abilities/DelayedTriggeredAbilities.java +++ b/Mage/src/main/java/mage/abilities/DelayedTriggeredAbilities.java @@ -28,20 +28,21 @@ package mage.abilities; -import java.util.Iterator; import mage.constants.Duration; import mage.game.Game; import mage.game.events.GameEvent; +import java.util.Iterator; + /** - * * @author BetaSteward_at_googlemail.com */ - public class DelayedTriggeredAbilities extends AbilitiesImpl { +public class DelayedTriggeredAbilities extends AbilitiesImpl { - public DelayedTriggeredAbilities() {} + public DelayedTriggeredAbilities() { + } - public DelayedTriggeredAbilities(final DelayedTriggeredAbilities abilities) { + public DelayedTriggeredAbilities(final DelayedTriggeredAbilities abilities) { super(abilities); } @@ -52,9 +53,9 @@ import mage.game.events.GameEvent; public void checkTriggers(GameEvent event, Game game) { if (this.size() > 0) { - for (Iterator it = this.iterator();it.hasNext();) { + for (Iterator it = this.iterator(); it.hasNext(); ) { DelayedTriggeredAbility ability = it.next(); - if (ability.getDuration()== Duration.Custom){ + if (ability.getDuration() == Duration.Custom) { if (ability.isInactive(game)) { it.remove(); continue; diff --git a/Mage/src/main/java/mage/abilities/keyword/SplitSecondAbility.java b/Mage/src/main/java/mage/abilities/keyword/SplitSecondAbility.java index 806f71a3099..aebf6928c8b 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SplitSecondAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SplitSecondAbility.java @@ -10,6 +10,8 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; +import java.util.Optional; + /** * Split Second * @@ -66,8 +68,8 @@ class SplitSecondEffect extends ContinuousRuleModifyingEffectImpl { return true; } if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { - Ability ability = game.getAbility(event.getTargetId(), event.getSourceId()); - if (ability != null && !(ability instanceof ActivatedManaAbilityImpl)) { + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + if (ability != null && !(ability.get() instanceof ActivatedManaAbilityImpl)) { return true; } } diff --git a/Mage/src/main/java/mage/cards/CardsImpl.java b/Mage/src/main/java/mage/cards/CardsImpl.java index 56eb56a16e8..dfe5f117df0 100644 --- a/Mage/src/main/java/mage/cards/CardsImpl.java +++ b/Mage/src/main/java/mage/cards/CardsImpl.java @@ -34,6 +34,7 @@ import mage.util.ThreadLocalStringBuilder; import java.io.Serializable; import java.util.*; +import java.util.stream.Collectors; /** * @author BetaSteward_at_googlemail.com @@ -109,13 +110,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public int count(FilterCard filter, Game game) { - int result = 0; - for (UUID cardId : this) { - if (filter.match(game.getCard(cardId), game)) { - result++; - } - } - return result; + return (int) stream().filter(cardId -> filter.match(game.getCard(cardId), game)).count(); } @Override @@ -150,14 +145,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl @Override public Set getCards(FilterCard filter, Game game) { - Set cards = new LinkedHashSet<>(); - for (UUID card : this) { - boolean match = filter.match(game.getCard(card), game); - if (match) { - cards.add(game.getCard(card)); - } - } - return cards; + return stream().map(game::getCard).filter(card -> filter.match(card, game)).collect(Collectors.toSet()); } @Override diff --git a/Mage/src/main/java/mage/cards/ExpansionSet.java b/Mage/src/main/java/mage/cards/ExpansionSet.java index a16ab16f41c..04931d7ee83 100644 --- a/Mage/src/main/java/mage/cards/ExpansionSet.java +++ b/Mage/src/main/java/mage/cards/ExpansionSet.java @@ -36,6 +36,7 @@ import mage.util.RandomUtil; import java.io.Serializable; import java.util.*; +import java.util.stream.Collectors; /** * @author BetaSteward_at_googlemail.com @@ -160,13 +161,7 @@ public abstract class ExpansionSet implements Serializable { } public List findCardInfoByClass(Class clazz) { - ArrayList result = new ArrayList<>(); - for (SetCardInfo info : cards) { - if (info.getCardClass().equals(clazz)) { - result.add(info); - } - } - return result; + return cards.stream().filter(info -> info.getCardClass().equals(clazz)).collect(Collectors.toList()); } public List create15CardBooster() { diff --git a/Mage/src/main/java/mage/counters/Counters.java b/Mage/src/main/java/mage/counters/Counters.java index 93667bcb350..d946b49669a 100644 --- a/Mage/src/main/java/mage/counters/Counters.java +++ b/Mage/src/main/java/mage/counters/Counters.java @@ -28,10 +28,10 @@ package mage.counters; import java.io.Serializable; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @author BetaSteward_at_googlemail.com @@ -122,12 +122,9 @@ public class Counters extends HashMap implements Serializable { } public List getBoostCounters() { - List boosters = new ArrayList<>(); - for (Counter counter : this.values()) { - if (counter instanceof BoostCounter) { - boosters.add((BoostCounter) counter); - } - } - return boosters; + return values().stream(). + filter(counter -> counter instanceof BoostCounter). + map(counter -> (BoostCounter) counter). + collect(Collectors.toList()); } } diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index e813e7becdd..2b838202683 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -27,14 +27,6 @@ */ package mage.game; -import java.io.Serializable; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; import mage.MageItem; import mage.MageObject; import mage.abilities.Ability; @@ -50,11 +42,7 @@ import mage.cards.Cards; import mage.cards.MeldCard; import mage.cards.decks.Deck; import mage.choices.Choice; -import mage.constants.Duration; -import mage.constants.MultiplayerAttackOption; -import mage.constants.PlayerAction; -import mage.constants.RangeOfInfluence; -import mage.constants.Zone; +import mage.constants.*; import mage.counters.Counters; import mage.game.combat.Combat; import mage.game.command.Commander; @@ -77,6 +65,9 @@ import mage.players.Players; import mage.util.MessageToClient; import mage.util.functions.ApplyToPermanent; +import java.io.Serializable; +import java.util.*; + public interface Game extends MageItem, Serializable { MatchType getGameType(); @@ -128,7 +119,7 @@ public interface Game extends MageItem, Serializable { Card getCard(UUID cardId); - Ability getAbility(UUID abilityId, UUID sourceId); + Optional getAbility(UUID abilityId, UUID sourceId); void setZone(UUID objectId, Zone zone); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 9db038eb1fb..eb74a20cee0 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -503,12 +503,12 @@ public abstract class GameImpl implements Game, Serializable { } @Override - public Ability getAbility(UUID abilityId, UUID sourceId) { + public Optional getAbility(UUID abilityId, UUID sourceId) { MageObject object = getObject(sourceId); if (object != null) { return object.getAbilities().get(abilityId); } - return null; + return Optional.empty(); } // @Override @@ -2336,10 +2336,10 @@ public abstract class GameImpl implements Game, Serializable { } } - Iterator it = gameCards.entrySet().iterator(); + Iterator> it = gameCards.entrySet().iterator(); while (it.hasNext()) { - Entry entry = (Entry) it.next(); + Entry entry = it.next(); Card card = entry.getValue(); if (card.getOwnerId().equals(playerId)) { it.remove(); diff --git a/Mage/src/main/java/mage/game/command/Commander.java b/Mage/src/main/java/mage/game/command/Commander.java index e267302b3dc..ae95ae00be7 100644 --- a/Mage/src/main/java/mage/game/command/Commander.java +++ b/Mage/src/main/java/mage/game/command/Commander.java @@ -27,10 +27,6 @@ */ package mage.game.command; -import java.util.EnumSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; import mage.MageInt; import mage.ObjectColor; import mage.abilities.Abilities; @@ -48,18 +44,22 @@ import mage.game.Game; import mage.game.events.ZoneChangeEvent; import mage.util.GameLog; +import java.util.EnumSet; +import java.util.List; +import java.util.UUID; + public class Commander implements CommandObject { private final Card sourceObject; - private final Abilities abilites = new AbilitiesImpl<>(); + private final Abilities abilities = new AbilitiesImpl<>(); public Commander(Card card) { this.sourceObject = card; - abilites.add(new CastCommanderAbility(card)); + abilities.add(new CastCommanderAbility(card)); for (Ability ability : card.getAbilities()) { if (!(ability instanceof SpellAbility)) { Ability newAbility = ability.copy(); - abilites.add(newAbility); + abilities.add(newAbility); } } } @@ -134,7 +134,7 @@ public class Commander implements CommandObject { @Override public Abilities getAbilities() { - return abilites; + return abilities; } @Override diff --git a/Mage/src/main/java/mage/game/command/Emblem.java b/Mage/src/main/java/mage/game/command/Emblem.java index 997cfa291d4..599fb8efcff 100644 --- a/Mage/src/main/java/mage/game/command/Emblem.java +++ b/Mage/src/main/java/mage/game/command/Emblem.java @@ -27,8 +27,6 @@ */ package mage.game.command; -import java.util.*; - import mage.MageInt; import mage.MageObject; import mage.ObjectColor; @@ -46,6 +44,11 @@ import mage.game.Game; import mage.game.events.ZoneChangeEvent; import mage.util.GameLog; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.UUID; + /** * @author nantuko */ @@ -92,7 +95,7 @@ public class Emblem implements CommandObject { this.sourceObject = sourceObject; if (sourceObject instanceof Card) { if (name.isEmpty()) { - name = ((Card) sourceObject).getSubtype(null).toString(); + name = sourceObject.getSubtype(null).toString(); } if (expansionSetCodeForImage.isEmpty()) { expansionSetCodeForImage = ((Card) sourceObject).getExpansionSetCode(); diff --git a/Mage/src/main/java/mage/game/permanent/Battlefield.java b/Mage/src/main/java/mage/game/permanent/Battlefield.java index a58b5b71ff6..6ca92d1d063 100644 --- a/Mage/src/main/java/mage/game/permanent/Battlefield.java +++ b/Mage/src/main/java/mage/game/permanent/Battlefield.java @@ -103,22 +103,20 @@ public class Battlefield implements Serializable { * @return count */ public int count(FilterPermanent filter, UUID sourceId, UUID sourcePlayerId, Game game) { - int count; if (game.getRangeOfInfluence() == RangeOfInfluence.ALL) { - count = (int) field.values() + return (int) field.values() .stream() .filter(permanent -> filter.match(permanent, sourceId, sourcePlayerId, game) && permanent.isPhasedIn()) .count(); } else { Set range = game.getPlayer(sourcePlayerId).getInRange(); - count = (int) field.values() + return (int) field.values() .stream() .filter(permanent -> range.contains(permanent.getControllerId()) && filter.match(permanent, sourceId, sourcePlayerId, game) && permanent.isPhasedIn()).count(); } - return count; } /** @@ -319,20 +317,18 @@ public class Battlefield implements Serializable { * @see Permanent */ public List getActivePermanents(FilterPermanent filter, UUID sourcePlayerId, UUID sourceId, Game game) { - List active = new ArrayList<>(); if (game.getRangeOfInfluence() == RangeOfInfluence.ALL) { - active = field.values() + return field.values() .stream() .filter(perm -> perm.isPhasedIn() && filter.match(perm, sourceId, sourcePlayerId, game)) .collect(Collectors.toList()); } else { Set range = game.getPlayer(sourcePlayerId).getInRange(); - active = field.values() + return field.values() .stream() .filter(perm -> perm.isPhasedIn() && range.contains(perm.getControllerId()) && filter.match(perm, sourceId, sourcePlayerId, game)).collect(Collectors.toList()); } - return active; } /** diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 777bc0a9adc..b85adf00c44 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -27,8 +27,6 @@ */ package mage.game.stack; -import java.util.*; - import mage.MageInt; import mage.MageObject; import mage.Mana; @@ -60,6 +58,11 @@ import mage.game.permanent.PermanentCard; import mage.players.Player; import mage.util.GameLog; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -331,8 +334,8 @@ public class Spell extends StackObjImpl implements Card { * determine whether card was kicked or not. E.g. Desolation Angel */ private void updateOptionalCosts(int index) { - Ability abilityOrig = spellCards.get(index).getAbilities().get(spellAbilities.get(index).getId()); - if (abilityOrig != null) { + spellCards.get(index).getAbilities().get(spellAbilities.get(index).getId()).ifPresent(abilityOrig -> + { for (Object object : spellAbilities.get(index).getOptionalCosts()) { Cost cost = (Cost) object; for (Cost costOrig : abilityOrig.getOptionalCosts()) { @@ -346,7 +349,7 @@ public class Spell extends StackObjImpl implements Card { } } } - } + }); } @Override diff --git a/Mage/src/main/java/mage/players/Library.java b/Mage/src/main/java/mage/players/Library.java index 9b4a8adc8f5..65fab4a09e9 100644 --- a/Mage/src/main/java/mage/players/Library.java +++ b/Mage/src/main/java/mage/players/Library.java @@ -27,26 +27,16 @@ */ package mage.players; -import java.io.Serializable; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Deque; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - import mage.cards.Card; import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.Game; import mage.util.RandomUtil; +import java.io.Serializable; +import java.util.*; +import java.util.stream.Collectors; + /** * @author BetaSteward_at_googlemail.com */ @@ -182,11 +172,7 @@ public class Library implements Serializable { } public List getCards(Game game) { - List cards = new ArrayList<>(); - for (UUID cardId : library) { - cards.add(game.getCard(cardId)); - } - return cards; + return library.stream().map(game::getCard).collect(Collectors.toList()); } public Set getTopCards(Game game, int amount) { @@ -214,13 +200,7 @@ public class Library implements Serializable { } public int count(FilterCard filter, Game game) { - int result = 0; - for (UUID card : library) { - if (filter.match(game.getCard(card), game)) { - result++; - } - } - return result; + return (int) library.stream().filter(cardId -> filter.match(game.getCard(cardId), game)).count(); } public boolean isEmptyDraw() { diff --git a/Mage/src/main/java/mage/target/TargetAmount.java b/Mage/src/main/java/mage/target/TargetAmount.java index b9f8f5fabf2..4e6fe35fcfc 100644 --- a/Mage/src/main/java/mage/target/TargetAmount.java +++ b/Mage/src/main/java/mage/target/TargetAmount.java @@ -34,6 +34,7 @@ import mage.abilities.dynamicvalue.common.StaticValue; import mage.constants.Outcome; import mage.game.Game; import java.util.*; +import java.util.stream.Collectors; /** * @@ -142,12 +143,7 @@ public abstract class TargetAmount extends TargetImpl { t.addTarget(targetId, n, source, game, true); if (t.remainingAmount > 0) { if (targets.size() > 1) { - Set newTargets = new HashSet<>(); - for (UUID newTarget: targets) { - if (!newTarget.equals(targetId)) { - newTargets.add(newTarget); - } - } + Set newTargets = targets.stream().filter(newTarget -> !newTarget.equals(targetId)).collect(Collectors.toSet()); addTargets(t, newTargets, options, source, game); } } diff --git a/Mage/src/main/java/mage/target/TargetCard.java b/Mage/src/main/java/mage/target/TargetCard.java index 87b26a64e46..9103309c21c 100644 --- a/Mage/src/main/java/mage/target/TargetCard.java +++ b/Mage/src/main/java/mage/target/TargetCard.java @@ -27,9 +27,7 @@ */ package mage.target; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import mage.MageItem; import mage.cards.Card; import mage.cards.Cards; import mage.constants.Zone; @@ -38,6 +36,11 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.players.Player; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + /** * * @author BetaSteward_at_googlemail.com @@ -200,11 +203,7 @@ public class TargetCard extends TargetObject { } public Set possibleTargets(UUID sourceControllerId, Cards cards, Game game) { - Set possibleTargets = new HashSet<>(); - for (Card card : cards.getCards(filter, game)) { - possibleTargets.add(card.getId()); - } - return possibleTargets; + return cards.getCards(filter,game).stream().map(MageItem::getId).collect(Collectors.toSet()); } @Override diff --git a/Mage/src/main/java/mage/target/TargetPlayer.java b/Mage/src/main/java/mage/target/TargetPlayer.java index d70085d98a8..af3fab1ad08 100644 --- a/Mage/src/main/java/mage/target/TargetPlayer.java +++ b/Mage/src/main/java/mage/target/TargetPlayer.java @@ -27,15 +27,16 @@ */ package mage.target; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.filter.FilterPlayer; import mage.game.Game; import mage.players.Player; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -158,12 +159,7 @@ public class TargetPlayer extends TargetImpl { if (getNumberOfTargets() == 0 && targets.isEmpty()) { return true; // 0 targets selected is valid } - for (UUID playerId : targets.keySet()) { - if (canTarget(playerId, source, game)) { - return true; - } - } - return false; + return targets.keySet().stream().anyMatch(playerId -> canTarget(playerId, source, game)); } @Override diff --git a/Mage/src/main/java/mage/target/TargetSpell.java b/Mage/src/main/java/mage/target/TargetSpell.java index 408e277bf93..9495b4dbec4 100644 --- a/Mage/src/main/java/mage/target/TargetSpell.java +++ b/Mage/src/main/java/mage/target/TargetSpell.java @@ -27,9 +27,6 @@ */ package mage.target; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.abilities.Ability; import mage.constants.Zone; import mage.filter.FilterSpell; @@ -37,6 +34,11 @@ import mage.game.Game; import mage.game.stack.Spell; import mage.game.stack.StackObject; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + /** * * @author BetaSteward_at_googlemail.com @@ -112,13 +114,10 @@ public class TargetSpell extends TargetObject { @Override public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { - Set possibleTargets = new HashSet<>(); - for (StackObject stackObject : game.getStack()) { - if (canBeChosen(stackObject, sourceId, sourceControllerId, game)) { - possibleTargets.add(stackObject.getId()); - } - } - return possibleTargets; + return game.getStack().stream() + .filter(stackObject -> canBeChosen(stackObject, sourceId, sourceControllerId, game)) + .map(StackObject::getId) + .collect(Collectors.toSet()); } @Override diff --git a/Mage/src/main/java/mage/target/Targets.java b/Mage/src/main/java/mage/target/Targets.java index f0565aa76f5..43ed15e295a 100644 --- a/Mage/src/main/java/mage/target/Targets.java +++ b/Mage/src/main/java/mage/target/Targets.java @@ -27,14 +27,16 @@ */ package mage.target; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; import mage.abilities.Ability; import mage.constants.Outcome; import mage.game.Game; import mage.game.events.GameEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + /** * * @author BetaSteward_at_googlemail.com @@ -51,13 +53,7 @@ public class Targets extends ArrayList { } public List getUnchosen() { - List unchosen = new ArrayList<>(); - for (Target target : this) { - if (!target.isChosen()) { - unchosen.add(target); - } - } - return unchosen; + return stream().filter(target -> !target.isChosen()).collect(Collectors.toList()); } public void clearChosen() { @@ -67,12 +63,7 @@ public class Targets extends ArrayList { } public boolean isChosen() { - for (Target target : this) { - if (!target.isChosen()) { - return false; - } - } - return true; + return stream().allMatch(Target::isChosen); } public boolean choose(Outcome outcome, UUID playerId, UUID sourceId, Game game) { @@ -122,12 +113,8 @@ public class Targets extends ArrayList { public boolean stillLegal(Ability source, Game game) { // 608.2 // The spell or ability is countered if all its targets, for every instance of the word "target," are now illegal - int illegalCount = 0; - for (Target target : this) { - if (!target.isLegal(source, game)) { - illegalCount++; - } - } + int illegalCount = (int) stream().filter(target -> !target.isLegal(source, game)).count(); + // it is legal when either there is no target or not all targets are illegal return this.isEmpty() || this.size() != illegalCount; } @@ -142,12 +129,7 @@ public class Targets extends ArrayList { * @return - true if enough valid targets exist */ public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { - for (Target target : this) { - if (!target.canChoose(sourceId, sourceControllerId, game)) { - return false; - } - } - return true; + return stream().allMatch(target -> target.canChoose(sourceId, sourceControllerId, game)); } /** @@ -160,12 +142,7 @@ public class Targets extends ArrayList { * @return - true if enough valid objects exist */ public boolean canChoose(UUID sourceControllerId, Game game) { - for (Target target : this) { - if (!target.canChoose(sourceControllerId, game)) { - return false; - } - } - return true; + return stream().allMatch(target -> target.canChoose(sourceControllerId, game)); } public UUID getFirstTarget() { @@ -174,7 +151,6 @@ public class Targets extends ArrayList { } return null; } - public Targets copy() { return new Targets(this); } diff --git a/Mage/src/main/java/mage/target/common/TargetActivatedOrTriggeredAbility.java b/Mage/src/main/java/mage/target/common/TargetActivatedOrTriggeredAbility.java index c9d116bd969..9b472017ed3 100644 --- a/Mage/src/main/java/mage/target/common/TargetActivatedOrTriggeredAbility.java +++ b/Mage/src/main/java/mage/target/common/TargetActivatedOrTriggeredAbility.java @@ -28,27 +28,27 @@ package mage.target.common; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import mage.constants.Zone; import mage.abilities.Ability; import mage.constants.AbilityType; +import mage.constants.Zone; import mage.filter.Filter; import mage.filter.FilterAbility; import mage.game.Game; import mage.game.stack.StackObject; import mage.target.TargetObject; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + /** - * * @author LevelX2 */ public class TargetActivatedOrTriggeredAbility extends TargetObject { - public TargetActivatedOrTriggeredAbility() { + public TargetActivatedOrTriggeredAbility() { this.minNumberOfTargets = 1; this.maxNumberOfTargets = 1; this.zone = Zone.STACK; @@ -78,12 +78,9 @@ public class TargetActivatedOrTriggeredAbility extends TargetObject { @Override public boolean canChoose(UUID sourceControllerId, Game game) { - for (StackObject stackObject : game.getStack()) { - if (isActivatedOrTriggeredAbility(stackObject)) { - return true; - } - } - return false; + return game.getStack() + .stream() + .anyMatch(TargetActivatedOrTriggeredAbility::isActivatedOrTriggeredAbility); } @Override @@ -93,13 +90,10 @@ public class TargetActivatedOrTriggeredAbility extends TargetObject { @Override public Set possibleTargets(UUID sourceControllerId, Game game) { - Set possibleTargets = new HashSet<>(); - for (StackObject stackObject : game.getStack()) { - if (isActivatedOrTriggeredAbility(stackObject)) { - possibleTargets.add(stackObject.getStackAbility().getId()); - } - } - return possibleTargets; + return game.getStack().stream() + .filter(TargetActivatedOrTriggeredAbility::isActivatedOrTriggeredAbility) + .map(stackObject -> stackObject.getStackAbility().getId()) + .collect(Collectors.toSet()); } @Override @@ -117,9 +111,9 @@ public class TargetActivatedOrTriggeredAbility extends TargetObject { return false; } if (stackObject instanceof Ability) { - Ability ability = (Ability)stackObject; + Ability ability = (Ability) stackObject; return ability.getAbilityType() == AbilityType.TRIGGERED - || ability.getAbilityType() == AbilityType.ACTIVATED; + || ability.getAbilityType() == AbilityType.ACTIVATED; } return false; } diff --git a/Mage/src/main/java/mage/target/common/TargetCardInGraveyardOrBattlefield.java b/Mage/src/main/java/mage/target/common/TargetCardInGraveyardOrBattlefield.java index e6ccb15a7e2..337b2711526 100644 --- a/Mage/src/main/java/mage/target/common/TargetCardInGraveyardOrBattlefield.java +++ b/Mage/src/main/java/mage/target/common/TargetCardInGraveyardOrBattlefield.java @@ -27,8 +27,6 @@ */ package mage.target.common; -import java.util.Set; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.cards.Card; @@ -39,8 +37,10 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetCard; +import java.util.Set; +import java.util.UUID; + /** - * * @author LevelX2 */ public class TargetCardInGraveyardOrBattlefield extends TargetCard { @@ -82,8 +82,7 @@ public class TargetCardInGraveyardOrBattlefield extends TargetCard { } @Override - public boolean canTarget(UUID id, Ability source, Game game - ) { + public boolean canTarget(UUID id, Ability source, Game game) { Permanent permanent = game.getPermanent(id); if (permanent != null) { return filter.match(permanent, game); @@ -93,8 +92,7 @@ public class TargetCardInGraveyardOrBattlefield extends TargetCard { } @Override - public Set possibleTargets(UUID sourceControllerId, Game game - ) { + public Set possibleTargets(UUID sourceControllerId, Game game) { //return super.possibleTargets(sourceControllerId, game); //To change body of generated methods, choose Tools | Templates. Set possibleTargets = super.possibleTargets(sourceControllerId, game); for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterPermanent(), sourceControllerId, game)) { @@ -106,8 +104,7 @@ public class TargetCardInGraveyardOrBattlefield extends TargetCard { } @Override - public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game - ) { + public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { Set possibleTargets = super.possibleTargets(sourceId, sourceControllerId, game); MageObject targetSource = game.getObject(sourceId); for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterPermanent(), sourceControllerId, game)) {