diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form index 9bc0fefed70..fee373f4c1a 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form @@ -851,7 +851,6 @@ - diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java index 6d1292bb4e3..9d406fa78e0 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java @@ -51,13 +51,13 @@ import mage.client.MageFrame; import mage.client.cards.*; import mage.client.constants.Constants.SortBy; import mage.client.deckeditor.table.TableModel; +import mage.client.dialog.CheckBoxList; import static mage.client.dialog.PreferencesDialog.KEY_DECK_EDITOR_SEARCH_NAMES; import static mage.client.dialog.PreferencesDialog.KEY_DECK_EDITOR_SEARCH_RULES; import static mage.client.dialog.PreferencesDialog.KEY_DECK_EDITOR_SEARCH_TYPES; import static mage.client.dialog.PreferencesDialog.KEY_DECK_EDITOR_SEARCH_UNIQUE; import mage.client.util.GUISizeHelper; import mage.client.util.gui.FastSearchUtil; -import mage.client.dialog.CheckBoxList; import mage.client.util.sets.ConstructedFormats; import mage.constants.CardType; import mage.constants.Rarity; @@ -85,7 +85,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene private final SortSetting sortSetting; private static final Map pdAllowed = new HashMap<>(); - private final String TEST_MULTI_SET="Multiple Sets selected"; + private final String TEST_MULTI_SET = "Multiple Sets selected"; private final ActionListener searchAction = evt -> jButtonSearchActionPerformed(evt); @@ -100,22 +100,20 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene initListViewComponents(); setGUISize(); currentView = mainModel; // by default we use List View - - listCodeSelected = new CheckBoxList(); + + listCodeSelected = new CheckBoxList(); // remove the all option - boolean is_removeFinish=false; - - String[] setCodes = ConstructedFormats.getTypes(); - java.util.List result = new ArrayList<>(); - - for(int i=0; (i result = new ArrayList<>(); + + for (int i = 0; (i < setCodes.length) && (!is_removeFinish); i++) { String item = setCodes[i]; - if(!item.equals(ConstructedFormats.ALL)) - { + if (!item.equals(ConstructedFormats.ALL)) { result.add(item); } - } + } listCodeSelected.setListData(result.toArray()); } @@ -377,33 +375,29 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene criteria.rarities(Rarity.BONUS); } if (this.cbExpansionSet.isVisible()) { - if(listCodeSelected.getCheckedIndices().length <= 1) - { - String expansionSelection = this.cbExpansionSet.getSelectedItem().toString(); - if (!expansionSelection.equals("- All Sets")) { - java.util.List setCodes = ConstructedFormats.getSetsByFormat(expansionSelection); - criteria.setCodes(setCodes.toArray(new String[0])); - } - } - else - { - java.util.List setCodes = new ArrayList<>() ; - //java.util.List listReceived=new ArrayList<>() ; + if (listCodeSelected.getCheckedIndices().length <= 1) { + String expansionSelection = this.cbExpansionSet.getSelectedItem().toString(); + if (!expansionSelection.equals("- All Sets")) { + java.util.List setCodes = ConstructedFormats.getSetsByFormat(expansionSelection); + criteria.setCodes(setCodes.toArray(new String[0])); + } + } else { + java.util.List setCodes = new ArrayList<>(); + //java.util.List listReceived=new ArrayList<>() ; - int[] choiseValue=listCodeSelected.getCheckedIndices(); - ListModel x= listCodeSelected.getModel(); + int[] choiseValue = listCodeSelected.getCheckedIndices(); + ListModel x = listCodeSelected.getModel(); - for(int itemIndex: choiseValue){ - - java.util.List listReceived=ConstructedFormats.getSetsByFormat(x.getElementAt(itemIndex).toString()); - listReceived.stream().filter((item) -> (setCodes.contains(item)==false)).forEachOrdered((item) -> { - setCodes.add(item); - }); - } - criteria.setCodes(setCodes.toArray(new String[0])); - } - } + for (int itemIndex : choiseValue) { + java.util.List listReceived = ConstructedFormats.getSetsByFormat(x.getElementAt(itemIndex).toString()); + listReceived.stream().filter((item) -> (setCodes.contains(item) == false)).forEachOrdered((item) -> { + setCodes.add(item); + }); + } + criteria.setCodes(setCodes.toArray(new String[0])); + } + } return criteria; } @@ -1234,22 +1228,19 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene }// //GEN-END:initComponents private void cbExpansionSetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbExpansionSetActionPerformed - if(!cbExpansionSet.getSelectedItem().toString().contains(TEST_MULTI_SET)) - { - int index=cbExpansionSet.getSelectedIndex(); - if(cbExpansionSet.getItemAt(0).contains(TEST_MULTI_SET)) - { + if (!cbExpansionSet.getSelectedItem().toString().contains(TEST_MULTI_SET)) { + int index = cbExpansionSet.getSelectedIndex(); + if (cbExpansionSet.getItemAt(0).contains(TEST_MULTI_SET)) { cbExpansionSet.removeItemAt(0); index--; } - listCodeSelected.uncheckAll(); - if(index > 0) - { + listCodeSelected.uncheckAll(); + if (index > 0) { //ofset because all sets is removed from the list - listCodeSelected.setChecked(index-1, true); + listCodeSelected.setChecked(index - 1, true); } } - + filterCards(); }//GEN-LAST:event_cbExpansionSetActionPerformed @@ -1422,62 +1413,53 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene // TODO add your handling code here: }//GEN-LAST:event_chkTypesActionPerformed - private void chkRulesActionPerformed(java.awt.event.ActionEvent evt) { + private void chkRulesActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: - } + } private void chkUniqueActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkRulesActionPerformed // TODO add your handling code here: }//GEN-LAST:event_chkRulesActionPerformed private void btnExpansionSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExpansionSearchActionPerformed - FastSearchUtil.showFastSearchForStringComboBox(listCodeSelected, FastSearchUtil.DEFAULT_EXPANSION_SEARCH_MESSAGE); + FastSearchUtil.showFastSearchForStringComboBox(listCodeSelected, FastSearchUtil.DEFAULT_EXPANSION_SEARCH_MESSAGE); // - int[] choiseValue=listCodeSelected.getCheckedIndices(); - ListModel x= listCodeSelected.getModel(); - - if(choiseValue.length==0)//none + int[] choiseValue = listCodeSelected.getCheckedIndices(); + ListModel x = listCodeSelected.getModel(); + + if (choiseValue.length == 0)//none { - cbExpansionSet.setSelectedIndex(0); - } - else if(choiseValue.length==1)//one + cbExpansionSet.setSelectedIndex(0); + } else if (choiseValue.length == 1)//one { - String itemSelected=listCodeSelected.getModel().getElementAt(choiseValue[0]).toString(); - for(int index=0;index < cbExpansionSet.getItemCount();index++) - { - if(cbExpansionSet.getItemAt(index).equals(itemSelected)) - { + String itemSelected = listCodeSelected.getModel().getElementAt(choiseValue[0]).toString(); + for (int index = 0; index < cbExpansionSet.getItemCount(); index++) { + if (cbExpansionSet.getItemAt(index).equals(itemSelected)) { cbExpansionSet.setSelectedIndex(index); } } - - } - else//many + + } else//many { - String message=String.format("%s:%d",TEST_MULTI_SET,choiseValue.length); - - - + String message = String.format("%s:%d", TEST_MULTI_SET, choiseValue.length); + cbExpansionSet.insertItemAt(message, 0); cbExpansionSet.setSelectedIndex(0); - - if(cbExpansionSet.getItemAt(1).contains(TEST_MULTI_SET)) - { - cbExpansionSet.removeItemAt(1); + + if (cbExpansionSet.getItemAt(1).contains(TEST_MULTI_SET)) { + cbExpansionSet.removeItemAt(1); } - - + //listCodeSelected.setChecked(index-1, true); - //cbExpansionSet. + //cbExpansionSet. } - - /*for(int itemIndex: choiseValue){ + + /*for(int itemIndex: choiseValue){ // LogLog.warn(String.format("%d:%s",itemIndex,x.getElementAt(itemIndex).toString())); } - */ + */ // - - filterCards(); + filterCards(); }//GEN-LAST:event_btnExpansionSearchActionPerformed private void tbCommonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tbCommonActionPerformed @@ -1537,8 +1519,8 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene private TableModel mainModel; private JTable mainTable; private ICardGrid currentView; - - private CheckBoxList listCodeSelected; + + private final CheckBoxList listCodeSelected; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup bgView; diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 6464095de5f..4275592c565 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -100,7 +100,7 @@ public class TableController { } else { controllerName = "System"; } - table = new Table(roomId, options.getGameType(), options.getName(), controllerName, DeckValidatorFactory.instance.createDeckValidator(options.getDeckType()), + table = new Table(roomId, options.getGameType(), options.getName(), controllerName, DeckValidatorFactory.instance.createDeckValidator(options.getDeckType()), options.getPlayerTypes(), TableRecorderImpl.instance, match, options.getBannedUsers(), options.isPlaneChase()); chatId = ChatManager.instance.createChatSession("Match Table " + table.getId()); init(); @@ -120,7 +120,7 @@ public class TableController { } else { controllerName = "System"; } - table = new Table(roomId, options.getTournamentType(), options.getName(), controllerName, DeckValidatorFactory.instance.createDeckValidator(options.getMatchOptions().getDeckType()), + table = new Table(roomId, options.getTournamentType(), options.getName(), controllerName, DeckValidatorFactory.instance.createDeckValidator(options.getMatchOptions().getDeckType()), options.getPlayerTypes(), TableRecorderImpl.instance, tournament, options.getMatchOptions().getBannedUsers(), options.isPlaneChase()); chatId = ChatManager.instance.createChatSession("Tourn. table " + table.getId()); } @@ -486,7 +486,11 @@ public class TableController { if (userPlayerMap.get(userId) != null) { return false; } - return UserManager.instance.getUser(userId).get().ccWatchGame(match.getGame().getId()); + Optional _user = UserManager.instance.getUser(userId); + if (!_user.isPresent()) { + return false; + } + return _user.get().ccWatchGame(match.getGame().getId()); } } diff --git a/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java b/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java index 7fa4894f670..ef43f7e358a 100644 --- a/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java +++ b/Mage.Sets/src/mage/cards/c/CorrosiveOoze.java @@ -182,7 +182,7 @@ class CorrosiveOozeCombatWatcher extends Watcher { if (event.getType() == GameEvent.EventType.BLOCKER_DECLARED) { Permanent attacker = game.getPermanent(event.getTargetId()); Permanent blocker = game.getPermanent(event.getSourceId()); - if (attacker != null && attacker.getName().equals("Corrosive Ooze")) { + if (attacker != null && attacker.getName().equals("Corrosive Ooze")) { // To check for name is not working if Ooze is copied but name changed if (blocker != null && hasAttachedEquipment(game, blocker)) { MageObjectReference oozeMor = new MageObjectReference(attacker, game); HashSet relatedCreatures = oozeBlocksOrBlocked.getOrDefault(oozeMor, new HashSet<>()); diff --git a/Mage.Sets/src/mage/cards/j/JinxedIdol.java b/Mage.Sets/src/mage/cards/j/JinxedIdol.java index a2448b980a7..a722c825f02 100644 --- a/Mage.Sets/src/mage/cards/j/JinxedIdol.java +++ b/Mage.Sets/src/mage/cards/j/JinxedIdol.java @@ -92,7 +92,7 @@ class JinxedIdolEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = (Permanent) source.getSourceObjectIfItStillExists(game); + Permanent permanent = source.getSourcePermanentIfItStillExists(game); if (permanent != null) { return permanent.changeControllerId(source.getFirstTarget(), game); } else { diff --git a/Mage.Sets/src/mage/cards/m/MutagenicGrowth.java b/Mage.Sets/src/mage/cards/m/MutagenicGrowth.java index 213fc1c79b4..c3244f56e66 100644 --- a/Mage.Sets/src/mage/cards/m/MutagenicGrowth.java +++ b/Mage.Sets/src/mage/cards/m/MutagenicGrowth.java @@ -25,7 +25,6 @@ * 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; @@ -42,14 +41,16 @@ import mage.target.common.TargetCreaturePermanent; */ public class MutagenicGrowth extends CardImpl { - public MutagenicGrowth (UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G/P}"); + public MutagenicGrowth(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G/P}"); + // ({GP} can be paid with either {G} or 2 life.) + // Target creature gets +2/+2 until end of turn. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2, Duration.EndOfTurn)); } - public MutagenicGrowth (final MutagenicGrowth card) { + public MutagenicGrowth(final MutagenicGrowth card) { super(card); } diff --git a/Mage.Sets/src/mage/cards/p/Paralyze.java b/Mage.Sets/src/mage/cards/p/Paralyze.java index 19f3a57a751..73351e3d6e4 100644 --- a/Mage.Sets/src/mage/cards/p/Paralyze.java +++ b/Mage.Sets/src/mage/cards/p/Paralyze.java @@ -52,10 +52,9 @@ import mage.target.common.TargetCreaturePermanent; public class Paralyze extends CardImpl { public Paralyze(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{B}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{B}"); this.subtype.add(SubType.AURA); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); @@ -96,14 +95,18 @@ class ParalyzeEffect extends DoIfCostPaid { @Override protected Player getPayingPlayer(Game game, Ability source) { - Permanent attachment = game.getPermanent(source.getSourceId()); - Permanent attachedTo = game.getPermanent(attachment.getAttachedTo()); - return game.getPlayer(attachedTo.getControllerId()); + Permanent attachment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (attachment != null && attachment.getAttachedTo() != null) { + Permanent attachedTo = game.getPermanent(attachment.getAttachedTo()); + if (attachedTo != null) { + return game.getPlayer(attachedTo.getControllerId()); + } + } + return null; } @Override public String getText(Mode mode) { - return new StringBuilder("that player may ").append(getCostText()) - .append(". If he or she does, ").append(executingEffects.getText(mode)).toString(); + return "that player may " + getCostText() + ". If he or she does, " + executingEffects.getText(mode); } -} \ No newline at end of file +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ConstellationTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ConstellationTest.java index 22755f1ac7d..a7c55a1cae0 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ConstellationTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ConstellationTest.java @@ -6,7 +6,6 @@ import mage.constants.CardType; import mage.constants.PhaseStep; import mage.constants.SubType; import mage.constants.Zone; -import mage.util.functions.Function; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; @@ -16,11 +15,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class ConstellationTest extends CardTestPlayerBase { /** - * Daxos's Torment {3}{B} - * Constellation — Whenever Daxos’s Torment or another enchantment enters the battlefield under your control, - * Daxos’s Torment becomes a 5/5 Demon creature with flying and haste in addition to its other types until end of turn. + * Daxos's Torment {3}{B} Constellation — Whenever Daxos’s Torment or + * another enchantment enters the battlefield under your control, Daxos’s + * Torment becomes a 5/5 Demon creature with flying and haste in addition to + * its other types until end of turn. */ - private final String daxosCard = "Daxos's Torment"; private void assertDaxosBoost(boolean mustHave) { @@ -150,7 +149,7 @@ public class ConstellationTest extends CardTestPlayerBase { assertHandCount(playerA, daxosCard, 0); assertPermanentCount(playerA, daxosCard, 1); - assertHandCount(playerA, "Gravity Sphere", 0); + assertHandCount(playerA, "Gravity Sphere", 0); // Possible problem : this is sometimes 1 assertPermanentCount(playerA, "Gravity Sphere", 1); assertPowerToughness(playerA, daxosCard, 5, 5); @@ -227,5 +226,3 @@ public class ConstellationTest extends CardTestPlayerBase { playDaxosAndVampire(true); } } - - diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SuspendTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SuspendTest.java index d8836b3dba5..401cbb6dd75 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SuspendTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SuspendTest.java @@ -185,4 +185,44 @@ public class SuspendTest extends CardTestPlayerBase { assertHandCount(playerA, "Rift Bolt", 0); } + + /** + * Cards cast from other zones that aren't the hand should not trigger + * Knowledge Pool, as it states that only cards cast from the hand should be + * exiled afterwards. + * + * Example: cards coming off suspend shouldn't trigger Knowledge Pool. + * + */ + @Test + public void testThatNotCastFromHand() { + + // Rift Bolt deals 3 damage to any target. + // Suspend 1-{R} + addCard(Zone.HAND, playerA, "Rift Bolt", 1); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); + addCard(Zone.LIBRARY, playerA, "Silvercoat Lion", 3); + // Imprint - When Knowledge Pool enters the battlefield, each player exiles the top three cards of their library + // Whenever a player casts a spell from their hand, that player exiles it. If the player does, he or she may cast another nonland card + // exiled with Knowledge Pool without paying that card's mana cost. + addCard(Zone.HAND, playerB, "Knowledge Pool", 1); + addCard(Zone.BATTLEFIELD, playerB, "Plains", 6); + addCard(Zone.LIBRARY, playerB, "Silvercoat Lion", 3); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Suspend"); + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Knowledge Pool"); + + addTarget(playerA, playerB); + + setStopAt(3, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerB, "Knowledge Pool", 1); + assertHandCount(playerA, "Rift Bolt", 0); + assertGraveyardCount(playerA, "Rift Bolt", 1); + assertLife(playerB, 17); + assertPermanentCount(playerA, "Silvercoat Lion", 0); + + } } diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java index 90306488a3c..cadb4707614 100644 --- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java @@ -347,7 +347,8 @@ public class ContinuousEffects implements Serializable { } // boolean checkLKI = event.getType().equals(EventType.ZONE_CHANGE) || event.getType().equals(EventType.DESTROYED_PERMANENT); //get all applicable transient Replacement effects - for (ReplacementEffect effect : replacementEffects) { + for (Iterator iterator = replacementEffects.iterator(); iterator.hasNext();) { + ReplacementEffect effect = iterator.next(); if (!effect.checksEventType(event, game)) { continue; } @@ -378,7 +379,8 @@ public class ContinuousEffects implements Serializable { replaceEffects.put(effect, applicableAbilities); } } - for (PreventionEffect effect : preventionEffects) { + for (Iterator iterator = preventionEffects.iterator(); iterator.hasNext();) { + PreventionEffect effect = iterator.next(); if (!effect.checksEventType(event, game)) { continue; } @@ -932,8 +934,7 @@ public class ContinuousEffects implements Serializable { System.out.println(game.getTurn() + ", " + game.getPhase() + ": " + "need apply " + layer.stream() .map((eff) -> {return eff.getClass().getName().replaceAll(".+\\.(.+)", "$1");}) .collect(Collectors.joining(", "))); - */ - + */ for (ContinuousEffect effect : layer) { if (activeLayerEffects.contains(effect) && !appliedEffects.contains(effect.getId())) { // Effect does still exist and was not applied yet Set dependentTo = effect.isDependentTo(layer); diff --git a/Mage/src/main/java/mage/abilities/keyword/KickerAbility.java b/Mage/src/main/java/mage/abilities/keyword/KickerAbility.java index 10f5565cea7..d75c6651a0e 100644 --- a/Mage/src/main/java/mage/abilities/keyword/KickerAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/KickerAbility.java @@ -27,6 +27,7 @@ */ package mage.abilities.keyword; +import java.util.*; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.StaticAbility; @@ -41,8 +42,6 @@ import mage.constants.Zone; import mage.game.Game; import mage.players.Player; -import java.util.*; - /** * 20121001 702.31. Kicker 702.31a Kicker is a static ability that functions * while the spell with kicker is on the stack. "Kicker [cost]" means "You may @@ -134,7 +133,8 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo cost.reset(); } String key = getActivationKey(source, "", game); - for (String activationKey : activations.keySet()) { + for (Iterator iterator = activations.keySet().iterator(); iterator.hasNext();) { + String activationKey = iterator.next(); if (activationKey.startsWith(key) && activations.get(activationKey) > 0) { activations.put(key, 0); } @@ -212,10 +212,10 @@ public class KickerAbility extends StaticAbility implements OptionalAdditionalSo && player.chooseUse(Outcome.Benefit, "Pay " + times + kickerCost.getText(false) + " ?", ability, game)) { this.activateKicker(kickerCost, ability, game); if (kickerCost instanceof Costs) { - for (Iterator itKickerCost = ((Costs) kickerCost).iterator(); itKickerCost.hasNext(); ) { + for (Iterator itKickerCost = ((Costs) kickerCost).iterator(); itKickerCost.hasNext();) { Object kickerCostObject = itKickerCost.next(); if ((kickerCostObject instanceof Costs) || (kickerCostObject instanceof CostsImpl)) { - for (@SuppressWarnings("unchecked") Iterator itDetails = ((Costs) kickerCostObject).iterator(); itDetails.hasNext(); ) { + for (@SuppressWarnings("unchecked") Iterator itDetails = ((Costs) kickerCostObject).iterator(); itDetails.hasNext();) { addKickerCostsToAbility(itDetails.next(), ability, game); } } else { diff --git a/Mage/src/main/java/mage/cards/decks/Deck.java b/Mage/src/main/java/mage/cards/decks/Deck.java index 57c6a1e96f2..b0bb5fe48b5 100644 --- a/Mage/src/main/java/mage/cards/decks/Deck.java +++ b/Mage/src/main/java/mage/cards/decks/Deck.java @@ -142,7 +142,7 @@ public class Deck implements Serializable { cardInfo = CardRepository.instance.findCard("Silvercoat Lion"); Logger.getLogger(Deck.class).error("Tried to restart the DB: " + (cardInfo == null ? "not successful" : "successful")); } - return new GameException("Card not found - " + deckCardInfo.getCardName() + " - " + deckCardInfo.getSetCode() + " for deck - " + deckName + '\n' + return new GameException("Card not found - " + deckCardInfo.getCardName() + " - " + deckCardInfo.getSetCode() + "/" + deckCardInfo.getCardNum() + " for deck - " + deckName + '\n' + "Possible reason is, that you use cards in your deck, that are only supported in newer versions of the server.\n" + "So it can help to use the same card from another set, that's already supported from this server."); diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index e1f003e1d87..0fe5834ac9e 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -29,7 +29,6 @@ package mage.game.combat; import java.io.Serializable; import java.util.*; - import mage.abilities.common.ControllerAssignCombatDamageToBlockersAbility; import mage.abilities.common.ControllerDivideCombatDamageAbility; import mage.abilities.common.DamageAsThoughNotBlockedAbility; @@ -178,7 +177,7 @@ public class CombatGroup implements Serializable, Copyable { } if (attackers.size() != 1) { multiAttackerDamage(first, game); - // } else { + // } else { // singleAttackerDamage(first, game); } } @@ -334,7 +333,7 @@ public class CombatGroup implements Serializable, Copyable { defenderDamage(attacker, damage, game); } else if (!blockerOrder.isEmpty()) { // Assign the damage left to first blocker - assigned.put(blockerOrder.get(0), assigned.get(blockerOrder.get(0)) + damage); + assigned.put(blockerOrder.get(0), assigned.get(blockerOrder.get(0)) == null ? 0 : assigned.get(blockerOrder.get(0)) + damage); } } for (UUID blockerId : blockerOrder) { @@ -430,7 +429,7 @@ public class CombatGroup implements Serializable, Copyable { } } - public boolean checkSoleBlockerAfter (Permanent blocker, Game game) { + public boolean checkSoleBlockerAfter(Permanent blocker, Game game) { // this solves some corner cases (involving banding) when finding out whether a blocker is blocking alone or not if (blocker.getBlocking() == 1) { if (game.getCombat().blockingGroups.get(blocker.getId()) == null) { @@ -454,9 +453,9 @@ public class CombatGroup implements Serializable, Copyable { * {@link #singleBlockerDamage}. * * Handles abilities like "{this} an block any number of creatures.". - * - * Blocker damage for blockers blocking single creatures is handled in - * the single/multi blocker methods, so this shouldn't be used anymore. + * + * Blocker damage for blockers blocking single creatures is handled in the + * single/multi blocker methods, so this shouldn't be used anymore. * * @param first * @param game @@ -782,7 +781,7 @@ public class CombatGroup implements Serializable, Copyable { /** * There are effects, that set an attacker to be blocked. Therefore this * setter can be used. - * + * * This method lacks a band check, use setBlocked(blocked, game) instead. * * @param blocked @@ -870,8 +869,8 @@ public class CombatGroup implements Serializable, Copyable { } /** - * Decides damage distribution for blocking creatures with banding or - * if defending player controls the Defensive Formation enchantment. + * Decides damage distribution for blocking creatures with banding or if + * defending player controls the Defensive Formation enchantment. * * @param game */